"use strict"; (self["webpackChunk_core_volunteer_app"] = self["webpackChunk_core_volunteer_app"] || []).push([["vendors-node_modules_antd_lib_style_compact-item-vertical_js-node_modules_antd_lib_style_comp-3a3284"],{ /***/ "../../../node_modules/antd/lib/style/compact-item-vertical.js": /*!*********************************************************************!*\ !*** ../../../node_modules/antd/lib/style/compact-item-vertical.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.genCompactItemVerticalStyle = genCompactItemVerticalStyle; function compactItemVerticalBorder(token, parentCls) { return { // border collapse [`&-item:not(${parentCls}-last-item)`]: { marginBottom: token.calc(token.lineWidth).mul(-1).equal() }, '&-item': { '&:hover,&:focus,&:active': { zIndex: 2 }, '&[disabled]': { zIndex: 0 } } }; } function compactItemBorderVerticalRadius(prefixCls, parentCls) { return { [`&-item:not(${parentCls}-first-item):not(${parentCls}-last-item)`]: { borderRadius: 0 }, [`&-item${parentCls}-first-item:not(${parentCls}-last-item)`]: { [`&, &${prefixCls}-sm, &${prefixCls}-lg`]: { borderEndEndRadius: 0, borderEndStartRadius: 0 } }, [`&-item${parentCls}-last-item:not(${parentCls}-first-item)`]: { [`&, &${prefixCls}-sm, &${prefixCls}-lg`]: { borderStartStartRadius: 0, borderStartEndRadius: 0 } } }; } function genCompactItemVerticalStyle(token) { const compactCls = `${token.componentCls}-compact-vertical`; return { [compactCls]: Object.assign(Object.assign({}, compactItemVerticalBorder(token, compactCls)), compactItemBorderVerticalRadius(token.componentCls, compactCls)) }; } /***/ }), /***/ "../../../node_modules/antd/lib/style/compact-item.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/style/compact-item.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.genCompactItemStyle = genCompactItemStyle; // handle border collapse function compactItemBorder(token, parentCls, options) { const { focusElCls, focus, borderElCls } = options; const childCombinator = borderElCls ? '> *' : ''; const hoverEffects = ['hover', focus ? 'focus' : null, 'active'].filter(Boolean).map(n => `&:${n} ${childCombinator}`).join(','); return { [`&-item:not(${parentCls}-last-item)`]: { marginInlineEnd: token.calc(token.lineWidth).mul(-1).equal() }, '&-item': Object.assign(Object.assign({ [hoverEffects]: { zIndex: 2 } }, focusElCls ? { [`&${focusElCls}`]: { zIndex: 2 } } : {}), { [`&[disabled] ${childCombinator}`]: { zIndex: 0 } }) }; } // handle border-radius function compactItemBorderRadius(prefixCls, parentCls, options) { const { borderElCls } = options; const childCombinator = borderElCls ? `> ${borderElCls}` : ''; return { [`&-item:not(${parentCls}-first-item):not(${parentCls}-last-item) ${childCombinator}`]: { borderRadius: 0 }, [`&-item:not(${parentCls}-last-item)${parentCls}-first-item`]: { [`& ${childCombinator}, &${prefixCls}-sm ${childCombinator}, &${prefixCls}-lg ${childCombinator}`]: { borderStartEndRadius: 0, borderEndEndRadius: 0 } }, [`&-item:not(${parentCls}-first-item)${parentCls}-last-item`]: { [`& ${childCombinator}, &${prefixCls}-sm ${childCombinator}, &${prefixCls}-lg ${childCombinator}`]: { borderStartStartRadius: 0, borderEndStartRadius: 0 } } }; } function genCompactItemStyle(token, options = { focus: true }) { const { componentCls } = token; const compactCls = `${componentCls}-compact`; return { [compactCls]: Object.assign(Object.assign({}, compactItemBorder(token, compactCls, options)), compactItemBorderRadius(componentCls, compactCls, options)) }; } /***/ }), /***/ "../../../node_modules/antd/lib/style/index.js": /*!*****************************************************!*\ !*** ../../../node_modules/antd/lib/style/index.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.textEllipsis = exports.resetIcon = exports.resetComponent = exports.operationUnit = exports.genLinkStyle = exports.genIconStyle = exports.genFocusStyle = exports.genFocusOutline = exports.genCommonStyle = exports.clearFix = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const textEllipsis = exports.textEllipsis = { overflow: 'hidden', whiteSpace: 'nowrap', textOverflow: 'ellipsis' }; const resetComponent = (token, needInheritFontFamily = false) => ({ boxSizing: 'border-box', margin: 0, padding: 0, color: token.colorText, fontSize: token.fontSize, // font-variant: @font-variant-base; lineHeight: token.lineHeight, listStyle: 'none', // font-feature-settings: @font-feature-settings-base; fontFamily: needInheritFontFamily ? 'inherit' : token.fontFamily }); exports.resetComponent = resetComponent; const resetIcon = () => ({ display: 'inline-flex', alignItems: 'center', color: 'inherit', fontStyle: 'normal', lineHeight: 0, textAlign: 'center', textTransform: 'none', // for SVG icon, see https://blog.prototypr.io/align-svg-icons-to-text-and-say-goodbye-to-font-icons-d44b3d7b26b4 verticalAlign: '-0.125em', textRendering: 'optimizeLegibility', '-webkit-font-smoothing': 'antialiased', '-moz-osx-font-smoothing': 'grayscale', '> *': { lineHeight: 1 }, svg: { display: 'inline-block' } }); exports.resetIcon = resetIcon; const clearFix = () => ({ // https://github.com/ant-design/ant-design/issues/21301#issuecomment-583955229 '&::before': { display: 'table', content: '""' }, '&::after': { // https://github.com/ant-design/ant-design/issues/21864 display: 'table', clear: 'both', content: '""' } }); exports.clearFix = clearFix; const genLinkStyle = token => ({ a: { color: token.colorLink, textDecoration: token.linkDecoration, backgroundColor: 'transparent', // remove the gray background on active links in IE 10. outline: 'none', cursor: 'pointer', transition: `color ${token.motionDurationSlow}`, '-webkit-text-decoration-skip': 'objects', // remove gaps in links underline in iOS 8+ and Safari 8+. '&:hover': { color: token.colorLinkHover }, '&:active': { color: token.colorLinkActive }, '&:active, &:hover': { textDecoration: token.linkHoverDecoration, outline: 0 }, // https://github.com/ant-design/ant-design/issues/22503 '&:focus': { textDecoration: token.linkFocusDecoration, outline: 0 }, '&[disabled]': { color: token.colorTextDisabled, cursor: 'not-allowed' } } }); exports.genLinkStyle = genLinkStyle; const genCommonStyle = (token, componentPrefixCls, rootCls, resetFont) => { const prefixSelector = `[class^="${componentPrefixCls}"], [class*=" ${componentPrefixCls}"]`; const rootPrefixSelector = rootCls ? `.${rootCls}` : prefixSelector; const resetStyle = { boxSizing: 'border-box', '&::before, &::after': { boxSizing: 'border-box' } }; let resetFontStyle = {}; if (resetFont !== false) { resetFontStyle = { fontFamily: token.fontFamily, fontSize: token.fontSize }; } return { [rootPrefixSelector]: Object.assign(Object.assign(Object.assign({}, resetFontStyle), resetStyle), { [prefixSelector]: resetStyle }) }; }; exports.genCommonStyle = genCommonStyle; const genFocusOutline = (token, offset) => ({ outline: `${(0, _cssinjs.unit)(token.lineWidthFocus)} solid ${token.colorPrimaryBorder}`, outlineOffset: offset !== null && offset !== void 0 ? offset : 1, transition: 'outline-offset 0s, outline 0s' }); exports.genFocusOutline = genFocusOutline; const genFocusStyle = (token, offset) => ({ '&:focus-visible': Object.assign({}, genFocusOutline(token, offset)) }); exports.genFocusStyle = genFocusStyle; const genIconStyle = iconPrefixCls => ({ [`.${iconPrefixCls}`]: Object.assign(Object.assign({}, resetIcon()), { [`.${iconPrefixCls} .${iconPrefixCls}-icon`]: { display: 'block' } }) }); exports.genIconStyle = genIconStyle; const operationUnit = token => Object.assign(Object.assign({ // FIXME: This use link but is a operation unit. Seems should be a colorPrimary. // And Typography use this to generate link style which should not do this. color: token.colorLink, textDecoration: token.linkDecoration, outline: 'none', cursor: 'pointer', transition: `all ${token.motionDurationSlow}`, border: 0, padding: 0, background: 'none', userSelect: 'none' }, genFocusStyle(token)), { '&:focus, &:hover': { color: token.colorLinkHover }, '&:active': { color: token.colorLinkActive } }); exports.operationUnit = operationUnit; /***/ }), /***/ "../../../node_modules/antd/lib/style/motion/collapse.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/style/motion/collapse.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const genCollapseMotion = token => ({ [token.componentCls]: { // For common/openAnimation [`${token.antCls}-motion-collapse-legacy`]: { overflow: 'hidden', '&-active': { transition: `height ${token.motionDurationMid} ${token.motionEaseInOut}, opacity ${token.motionDurationMid} ${token.motionEaseInOut} !important` } }, [`${token.antCls}-motion-collapse`]: { overflow: 'hidden', transition: `height ${token.motionDurationMid} ${token.motionEaseInOut}, opacity ${token.motionDurationMid} ${token.motionEaseInOut} !important` } } }); var _default = exports["default"] = genCollapseMotion; /***/ }), /***/ "../../../node_modules/antd/lib/style/motion/fade.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/style/motion/fade.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.initFadeMotion = exports.fadeOut = exports.fadeIn = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _motion = __webpack_require__(/*! ./motion */ "../../../node_modules/antd/lib/style/motion/motion.js"); const fadeIn = exports.fadeIn = new _cssinjs.Keyframes('antFadeIn', { '0%': { opacity: 0 }, '100%': { opacity: 1 } }); const fadeOut = exports.fadeOut = new _cssinjs.Keyframes('antFadeOut', { '0%': { opacity: 1 }, '100%': { opacity: 0 } }); const initFadeMotion = (token, sameLevel = false) => { const { antCls } = token; const motionCls = `${antCls}-fade`; const sameLevelPrefix = sameLevel ? '&' : ''; return [(0, _motion.initMotion)(motionCls, fadeIn, fadeOut, token.motionDurationMid, sameLevel), { [` ${sameLevelPrefix}${motionCls}-enter, ${sameLevelPrefix}${motionCls}-appear `]: { opacity: 0, animationTimingFunction: 'linear' }, [`${sameLevelPrefix}${motionCls}-leave`]: { animationTimingFunction: 'linear' } }]; }; exports.initFadeMotion = initFadeMotion; /***/ }), /***/ "../../../node_modules/antd/lib/style/motion/index.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/style/motion/index.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); Object.defineProperty(exports, "fadeIn", ({ enumerable: true, get: function () { return _fade.fadeIn; } })); Object.defineProperty(exports, "fadeOut", ({ enumerable: true, get: function () { return _fade.fadeOut; } })); Object.defineProperty(exports, "genCollapseMotion", ({ enumerable: true, get: function () { return _collapse.default; } })); Object.defineProperty(exports, "initFadeMotion", ({ enumerable: true, get: function () { return _fade.initFadeMotion; } })); Object.defineProperty(exports, "initMoveMotion", ({ enumerable: true, get: function () { return _move.initMoveMotion; } })); Object.defineProperty(exports, "initSlideMotion", ({ enumerable: true, get: function () { return _slide.initSlideMotion; } })); Object.defineProperty(exports, "initZoomMotion", ({ enumerable: true, get: function () { return _zoom.initZoomMotion; } })); Object.defineProperty(exports, "moveDownIn", ({ enumerable: true, get: function () { return _move.moveDownIn; } })); Object.defineProperty(exports, "moveDownOut", ({ enumerable: true, get: function () { return _move.moveDownOut; } })); Object.defineProperty(exports, "moveLeftIn", ({ enumerable: true, get: function () { return _move.moveLeftIn; } })); Object.defineProperty(exports, "moveLeftOut", ({ enumerable: true, get: function () { return _move.moveLeftOut; } })); Object.defineProperty(exports, "moveRightIn", ({ enumerable: true, get: function () { return _move.moveRightIn; } })); Object.defineProperty(exports, "moveRightOut", ({ enumerable: true, get: function () { return _move.moveRightOut; } })); Object.defineProperty(exports, "moveUpIn", ({ enumerable: true, get: function () { return _move.moveUpIn; } })); Object.defineProperty(exports, "moveUpOut", ({ enumerable: true, get: function () { return _move.moveUpOut; } })); Object.defineProperty(exports, "slideDownIn", ({ enumerable: true, get: function () { return _slide.slideDownIn; } })); Object.defineProperty(exports, "slideDownOut", ({ enumerable: true, get: function () { return _slide.slideDownOut; } })); Object.defineProperty(exports, "slideLeftIn", ({ enumerable: true, get: function () { return _slide.slideLeftIn; } })); Object.defineProperty(exports, "slideLeftOut", ({ enumerable: true, get: function () { return _slide.slideLeftOut; } })); Object.defineProperty(exports, "slideRightIn", ({ enumerable: true, get: function () { return _slide.slideRightIn; } })); Object.defineProperty(exports, "slideRightOut", ({ enumerable: true, get: function () { return _slide.slideRightOut; } })); Object.defineProperty(exports, "slideUpIn", ({ enumerable: true, get: function () { return _slide.slideUpIn; } })); Object.defineProperty(exports, "slideUpOut", ({ enumerable: true, get: function () { return _slide.slideUpOut; } })); Object.defineProperty(exports, "zoomBigIn", ({ enumerable: true, get: function () { return _zoom.zoomBigIn; } })); Object.defineProperty(exports, "zoomBigOut", ({ enumerable: true, get: function () { return _zoom.zoomBigOut; } })); Object.defineProperty(exports, "zoomDownIn", ({ enumerable: true, get: function () { return _zoom.zoomDownIn; } })); Object.defineProperty(exports, "zoomDownOut", ({ enumerable: true, get: function () { return _zoom.zoomDownOut; } })); Object.defineProperty(exports, "zoomIn", ({ enumerable: true, get: function () { return _zoom.zoomIn; } })); Object.defineProperty(exports, "zoomLeftIn", ({ enumerable: true, get: function () { return _zoom.zoomLeftIn; } })); Object.defineProperty(exports, "zoomLeftOut", ({ enumerable: true, get: function () { return _zoom.zoomLeftOut; } })); Object.defineProperty(exports, "zoomOut", ({ enumerable: true, get: function () { return _zoom.zoomOut; } })); Object.defineProperty(exports, "zoomRightIn", ({ enumerable: true, get: function () { return _zoom.zoomRightIn; } })); Object.defineProperty(exports, "zoomRightOut", ({ enumerable: true, get: function () { return _zoom.zoomRightOut; } })); Object.defineProperty(exports, "zoomUpIn", ({ enumerable: true, get: function () { return _zoom.zoomUpIn; } })); Object.defineProperty(exports, "zoomUpOut", ({ enumerable: true, get: function () { return _zoom.zoomUpOut; } })); var _collapse = _interopRequireDefault(__webpack_require__(/*! ./collapse */ "../../../node_modules/antd/lib/style/motion/collapse.js")); var _fade = __webpack_require__(/*! ./fade */ "../../../node_modules/antd/lib/style/motion/fade.js"); var _move = __webpack_require__(/*! ./move */ "../../../node_modules/antd/lib/style/motion/move.js"); var _slide = __webpack_require__(/*! ./slide */ "../../../node_modules/antd/lib/style/motion/slide.js"); var _zoom = __webpack_require__(/*! ./zoom */ "../../../node_modules/antd/lib/style/motion/zoom.js"); /***/ }), /***/ "../../../node_modules/antd/lib/style/motion/motion.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/style/motion/motion.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.initMotion = void 0; const initMotionCommon = duration => ({ animationDuration: duration, animationFillMode: 'both' }); // FIXME: origin less code seems same as initMotionCommon. Maybe we can safe remove const initMotionCommonLeave = duration => ({ animationDuration: duration, animationFillMode: 'both' }); const initMotion = (motionCls, inKeyframes, outKeyframes, duration, sameLevel = false) => { const sameLevelPrefix = sameLevel ? '&' : ''; return { [` ${sameLevelPrefix}${motionCls}-enter, ${sameLevelPrefix}${motionCls}-appear `]: Object.assign(Object.assign({}, initMotionCommon(duration)), { animationPlayState: 'paused' }), [`${sameLevelPrefix}${motionCls}-leave`]: Object.assign(Object.assign({}, initMotionCommonLeave(duration)), { animationPlayState: 'paused' }), [` ${sameLevelPrefix}${motionCls}-enter${motionCls}-enter-active, ${sameLevelPrefix}${motionCls}-appear${motionCls}-appear-active `]: { animationName: inKeyframes, animationPlayState: 'running' }, [`${sameLevelPrefix}${motionCls}-leave${motionCls}-leave-active`]: { animationName: outKeyframes, animationPlayState: 'running', pointerEvents: 'none' } }; }; exports.initMotion = initMotion; /***/ }), /***/ "../../../node_modules/antd/lib/style/motion/move.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/style/motion/move.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.moveUpOut = exports.moveUpIn = exports.moveRightOut = exports.moveRightIn = exports.moveLeftOut = exports.moveLeftIn = exports.moveDownOut = exports.moveDownIn = exports.initMoveMotion = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _motion = __webpack_require__(/*! ./motion */ "../../../node_modules/antd/lib/style/motion/motion.js"); const moveDownIn = exports.moveDownIn = new _cssinjs.Keyframes('antMoveDownIn', { '0%': { transform: 'translate3d(0, 100%, 0)', transformOrigin: '0 0', opacity: 0 }, '100%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 } }); const moveDownOut = exports.moveDownOut = new _cssinjs.Keyframes('antMoveDownOut', { '0%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 }, '100%': { transform: 'translate3d(0, 100%, 0)', transformOrigin: '0 0', opacity: 0 } }); const moveLeftIn = exports.moveLeftIn = new _cssinjs.Keyframes('antMoveLeftIn', { '0%': { transform: 'translate3d(-100%, 0, 0)', transformOrigin: '0 0', opacity: 0 }, '100%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 } }); const moveLeftOut = exports.moveLeftOut = new _cssinjs.Keyframes('antMoveLeftOut', { '0%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 }, '100%': { transform: 'translate3d(-100%, 0, 0)', transformOrigin: '0 0', opacity: 0 } }); const moveRightIn = exports.moveRightIn = new _cssinjs.Keyframes('antMoveRightIn', { '0%': { transform: 'translate3d(100%, 0, 0)', transformOrigin: '0 0', opacity: 0 }, '100%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 } }); const moveRightOut = exports.moveRightOut = new _cssinjs.Keyframes('antMoveRightOut', { '0%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 }, '100%': { transform: 'translate3d(100%, 0, 0)', transformOrigin: '0 0', opacity: 0 } }); const moveUpIn = exports.moveUpIn = new _cssinjs.Keyframes('antMoveUpIn', { '0%': { transform: 'translate3d(0, -100%, 0)', transformOrigin: '0 0', opacity: 0 }, '100%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 } }); const moveUpOut = exports.moveUpOut = new _cssinjs.Keyframes('antMoveUpOut', { '0%': { transform: 'translate3d(0, 0, 0)', transformOrigin: '0 0', opacity: 1 }, '100%': { transform: 'translate3d(0, -100%, 0)', transformOrigin: '0 0', opacity: 0 } }); const moveMotion = { 'move-up': { inKeyframes: moveUpIn, outKeyframes: moveUpOut }, 'move-down': { inKeyframes: moveDownIn, outKeyframes: moveDownOut }, 'move-left': { inKeyframes: moveLeftIn, outKeyframes: moveLeftOut }, 'move-right': { inKeyframes: moveRightIn, outKeyframes: moveRightOut } }; const initMoveMotion = (token, motionName) => { const { antCls } = token; const motionCls = `${antCls}-${motionName}`; const { inKeyframes, outKeyframes } = moveMotion[motionName]; return [(0, _motion.initMotion)(motionCls, inKeyframes, outKeyframes, token.motionDurationMid), { [` ${motionCls}-enter, ${motionCls}-appear `]: { opacity: 0, animationTimingFunction: token.motionEaseOutCirc }, [`${motionCls}-leave`]: { animationTimingFunction: token.motionEaseInOutCirc } }]; }; exports.initMoveMotion = initMoveMotion; /***/ }), /***/ "../../../node_modules/antd/lib/style/motion/slide.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/style/motion/slide.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.slideUpOut = exports.slideUpIn = exports.slideRightOut = exports.slideRightIn = exports.slideLeftOut = exports.slideLeftIn = exports.slideDownOut = exports.slideDownIn = exports.initSlideMotion = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _motion = __webpack_require__(/*! ./motion */ "../../../node_modules/antd/lib/style/motion/motion.js"); const slideUpIn = exports.slideUpIn = new _cssinjs.Keyframes('antSlideUpIn', { '0%': { transform: 'scaleY(0.8)', transformOrigin: '0% 0%', opacity: 0 }, '100%': { transform: 'scaleY(1)', transformOrigin: '0% 0%', opacity: 1 } }); const slideUpOut = exports.slideUpOut = new _cssinjs.Keyframes('antSlideUpOut', { '0%': { transform: 'scaleY(1)', transformOrigin: '0% 0%', opacity: 1 }, '100%': { transform: 'scaleY(0.8)', transformOrigin: '0% 0%', opacity: 0 } }); const slideDownIn = exports.slideDownIn = new _cssinjs.Keyframes('antSlideDownIn', { '0%': { transform: 'scaleY(0.8)', transformOrigin: '100% 100%', opacity: 0 }, '100%': { transform: 'scaleY(1)', transformOrigin: '100% 100%', opacity: 1 } }); const slideDownOut = exports.slideDownOut = new _cssinjs.Keyframes('antSlideDownOut', { '0%': { transform: 'scaleY(1)', transformOrigin: '100% 100%', opacity: 1 }, '100%': { transform: 'scaleY(0.8)', transformOrigin: '100% 100%', opacity: 0 } }); const slideLeftIn = exports.slideLeftIn = new _cssinjs.Keyframes('antSlideLeftIn', { '0%': { transform: 'scaleX(0.8)', transformOrigin: '0% 0%', opacity: 0 }, '100%': { transform: 'scaleX(1)', transformOrigin: '0% 0%', opacity: 1 } }); const slideLeftOut = exports.slideLeftOut = new _cssinjs.Keyframes('antSlideLeftOut', { '0%': { transform: 'scaleX(1)', transformOrigin: '0% 0%', opacity: 1 }, '100%': { transform: 'scaleX(0.8)', transformOrigin: '0% 0%', opacity: 0 } }); const slideRightIn = exports.slideRightIn = new _cssinjs.Keyframes('antSlideRightIn', { '0%': { transform: 'scaleX(0.8)', transformOrigin: '100% 0%', opacity: 0 }, '100%': { transform: 'scaleX(1)', transformOrigin: '100% 0%', opacity: 1 } }); const slideRightOut = exports.slideRightOut = new _cssinjs.Keyframes('antSlideRightOut', { '0%': { transform: 'scaleX(1)', transformOrigin: '100% 0%', opacity: 1 }, '100%': { transform: 'scaleX(0.8)', transformOrigin: '100% 0%', opacity: 0 } }); const slideMotion = { 'slide-up': { inKeyframes: slideUpIn, outKeyframes: slideUpOut }, 'slide-down': { inKeyframes: slideDownIn, outKeyframes: slideDownOut }, 'slide-left': { inKeyframes: slideLeftIn, outKeyframes: slideLeftOut }, 'slide-right': { inKeyframes: slideRightIn, outKeyframes: slideRightOut } }; const initSlideMotion = (token, motionName) => { const { antCls } = token; const motionCls = `${antCls}-${motionName}`; const { inKeyframes, outKeyframes } = slideMotion[motionName]; return [(0, _motion.initMotion)(motionCls, inKeyframes, outKeyframes, token.motionDurationMid), { [` ${motionCls}-enter, ${motionCls}-appear `]: { transform: 'scale(0)', transformOrigin: '0% 0%', opacity: 0, animationTimingFunction: token.motionEaseOutQuint, '&-prepare': { transform: 'scale(1)' } }, [`${motionCls}-leave`]: { animationTimingFunction: token.motionEaseInQuint } }]; }; exports.initSlideMotion = initSlideMotion; /***/ }), /***/ "../../../node_modules/antd/lib/style/motion/zoom.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/style/motion/zoom.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.zoomUpOut = exports.zoomUpIn = exports.zoomRightOut = exports.zoomRightIn = exports.zoomOut = exports.zoomLeftOut = exports.zoomLeftIn = exports.zoomIn = exports.zoomDownOut = exports.zoomDownIn = exports.zoomBigOut = exports.zoomBigIn = exports.initZoomMotion = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _motion = __webpack_require__(/*! ./motion */ "../../../node_modules/antd/lib/style/motion/motion.js"); const zoomIn = exports.zoomIn = new _cssinjs.Keyframes('antZoomIn', { '0%': { transform: 'scale(0.2)', opacity: 0 }, '100%': { transform: 'scale(1)', opacity: 1 } }); const zoomOut = exports.zoomOut = new _cssinjs.Keyframes('antZoomOut', { '0%': { transform: 'scale(1)' }, '100%': { transform: 'scale(0.2)', opacity: 0 } }); const zoomBigIn = exports.zoomBigIn = new _cssinjs.Keyframes('antZoomBigIn', { '0%': { transform: 'scale(0.8)', opacity: 0 }, '100%': { transform: 'scale(1)', opacity: 1 } }); const zoomBigOut = exports.zoomBigOut = new _cssinjs.Keyframes('antZoomBigOut', { '0%': { transform: 'scale(1)' }, '100%': { transform: 'scale(0.8)', opacity: 0 } }); const zoomUpIn = exports.zoomUpIn = new _cssinjs.Keyframes('antZoomUpIn', { '0%': { transform: 'scale(0.8)', transformOrigin: '50% 0%', opacity: 0 }, '100%': { transform: 'scale(1)', transformOrigin: '50% 0%' } }); const zoomUpOut = exports.zoomUpOut = new _cssinjs.Keyframes('antZoomUpOut', { '0%': { transform: 'scale(1)', transformOrigin: '50% 0%' }, '100%': { transform: 'scale(0.8)', transformOrigin: '50% 0%', opacity: 0 } }); const zoomLeftIn = exports.zoomLeftIn = new _cssinjs.Keyframes('antZoomLeftIn', { '0%': { transform: 'scale(0.8)', transformOrigin: '0% 50%', opacity: 0 }, '100%': { transform: 'scale(1)', transformOrigin: '0% 50%' } }); const zoomLeftOut = exports.zoomLeftOut = new _cssinjs.Keyframes('antZoomLeftOut', { '0%': { transform: 'scale(1)', transformOrigin: '0% 50%' }, '100%': { transform: 'scale(0.8)', transformOrigin: '0% 50%', opacity: 0 } }); const zoomRightIn = exports.zoomRightIn = new _cssinjs.Keyframes('antZoomRightIn', { '0%': { transform: 'scale(0.8)', transformOrigin: '100% 50%', opacity: 0 }, '100%': { transform: 'scale(1)', transformOrigin: '100% 50%' } }); const zoomRightOut = exports.zoomRightOut = new _cssinjs.Keyframes('antZoomRightOut', { '0%': { transform: 'scale(1)', transformOrigin: '100% 50%' }, '100%': { transform: 'scale(0.8)', transformOrigin: '100% 50%', opacity: 0 } }); const zoomDownIn = exports.zoomDownIn = new _cssinjs.Keyframes('antZoomDownIn', { '0%': { transform: 'scale(0.8)', transformOrigin: '50% 100%', opacity: 0 }, '100%': { transform: 'scale(1)', transformOrigin: '50% 100%' } }); const zoomDownOut = exports.zoomDownOut = new _cssinjs.Keyframes('antZoomDownOut', { '0%': { transform: 'scale(1)', transformOrigin: '50% 100%' }, '100%': { transform: 'scale(0.8)', transformOrigin: '50% 100%', opacity: 0 } }); const zoomMotion = { zoom: { inKeyframes: zoomIn, outKeyframes: zoomOut }, 'zoom-big': { inKeyframes: zoomBigIn, outKeyframes: zoomBigOut }, 'zoom-big-fast': { inKeyframes: zoomBigIn, outKeyframes: zoomBigOut }, 'zoom-left': { inKeyframes: zoomLeftIn, outKeyframes: zoomLeftOut }, 'zoom-right': { inKeyframes: zoomRightIn, outKeyframes: zoomRightOut }, 'zoom-up': { inKeyframes: zoomUpIn, outKeyframes: zoomUpOut }, 'zoom-down': { inKeyframes: zoomDownIn, outKeyframes: zoomDownOut } }; const initZoomMotion = (token, motionName) => { const { antCls } = token; const motionCls = `${antCls}-${motionName}`; const { inKeyframes, outKeyframes } = zoomMotion[motionName]; return [(0, _motion.initMotion)(motionCls, inKeyframes, outKeyframes, motionName === 'zoom-big-fast' ? token.motionDurationFast : token.motionDurationMid), { [` ${motionCls}-enter, ${motionCls}-appear `]: { transform: 'scale(0)', opacity: 0, animationTimingFunction: token.motionEaseOutCirc, '&-prepare': { transform: 'none' } }, [`${motionCls}-leave`]: { animationTimingFunction: token.motionEaseInOutCirc } }]; }; exports.initZoomMotion = initZoomMotion; /***/ }), /***/ "../../../node_modules/antd/lib/style/placementArrow.js": /*!**************************************************************!*\ !*** ../../../node_modules/antd/lib/style/placementArrow.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.MAX_VERTICAL_CONTENT_RADIUS = void 0; exports["default"] = getArrowStyle; exports.getArrowOffsetToken = getArrowOffsetToken; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _roundedArrow = __webpack_require__(/*! ./roundedArrow */ "../../../node_modules/antd/lib/style/roundedArrow.js"); const MAX_VERTICAL_CONTENT_RADIUS = exports.MAX_VERTICAL_CONTENT_RADIUS = 8; function getArrowOffsetToken(options) { const { contentRadius, limitVerticalRadius } = options; const arrowOffset = contentRadius > 12 ? contentRadius + 2 : 12; const arrowOffsetVertical = limitVerticalRadius ? MAX_VERTICAL_CONTENT_RADIUS : arrowOffset; return { arrowOffsetHorizontal: arrowOffset, arrowOffsetVertical }; } function isInject(valid, code) { if (!valid) { return {}; } return code; } function getArrowStyle(token, colorBg, options) { const { componentCls, boxShadowPopoverArrow, arrowOffsetVertical, arrowOffsetHorizontal } = token; const { arrowDistance = 0, arrowPlacement = { left: true, right: true, top: true, bottom: true } } = options || {}; return { [componentCls]: Object.assign(Object.assign(Object.assign(Object.assign({ // ============================ Basic ============================ [`${componentCls}-arrow`]: [Object.assign(Object.assign({ position: 'absolute', zIndex: 1, display: 'block' }, (0, _roundedArrow.genRoundedArrow)(token, colorBg, boxShadowPopoverArrow)), { '&:before': { background: colorBg } })] }, isInject(!!arrowPlacement.top, { [[`&-placement-top > ${componentCls}-arrow`, `&-placement-topLeft > ${componentCls}-arrow`, `&-placement-topRight > ${componentCls}-arrow`].join(',')]: { bottom: arrowDistance, transform: 'translateY(100%) rotate(180deg)' }, [`&-placement-top > ${componentCls}-arrow`]: { left: { _skip_check_: true, value: '50%' }, transform: 'translateX(-50%) translateY(100%) rotate(180deg)' }, '&-placement-topLeft': { '--arrow-offset-horizontal': arrowOffsetHorizontal, [`> ${componentCls}-arrow`]: { left: { _skip_check_: true, value: arrowOffsetHorizontal } } }, '&-placement-topRight': { '--arrow-offset-horizontal': `calc(100% - ${(0, _cssinjs.unit)(arrowOffsetHorizontal)})`, [`> ${componentCls}-arrow`]: { right: { _skip_check_: true, value: arrowOffsetHorizontal } } } })), isInject(!!arrowPlacement.bottom, { [[`&-placement-bottom > ${componentCls}-arrow`, `&-placement-bottomLeft > ${componentCls}-arrow`, `&-placement-bottomRight > ${componentCls}-arrow`].join(',')]: { top: arrowDistance, transform: `translateY(-100%)` }, [`&-placement-bottom > ${componentCls}-arrow`]: { left: { _skip_check_: true, value: '50%' }, transform: `translateX(-50%) translateY(-100%)` }, '&-placement-bottomLeft': { '--arrow-offset-horizontal': arrowOffsetHorizontal, [`> ${componentCls}-arrow`]: { left: { _skip_check_: true, value: arrowOffsetHorizontal } } }, '&-placement-bottomRight': { '--arrow-offset-horizontal': `calc(100% - ${(0, _cssinjs.unit)(arrowOffsetHorizontal)})`, [`> ${componentCls}-arrow`]: { right: { _skip_check_: true, value: arrowOffsetHorizontal } } } })), isInject(!!arrowPlacement.left, { [[`&-placement-left > ${componentCls}-arrow`, `&-placement-leftTop > ${componentCls}-arrow`, `&-placement-leftBottom > ${componentCls}-arrow`].join(',')]: { right: { _skip_check_: true, value: arrowDistance }, transform: 'translateX(100%) rotate(90deg)' }, [`&-placement-left > ${componentCls}-arrow`]: { top: { _skip_check_: true, value: '50%' }, transform: 'translateY(-50%) translateX(100%) rotate(90deg)' }, [`&-placement-leftTop > ${componentCls}-arrow`]: { top: arrowOffsetVertical }, [`&-placement-leftBottom > ${componentCls}-arrow`]: { bottom: arrowOffsetVertical } })), isInject(!!arrowPlacement.right, { [[`&-placement-right > ${componentCls}-arrow`, `&-placement-rightTop > ${componentCls}-arrow`, `&-placement-rightBottom > ${componentCls}-arrow`].join(',')]: { left: { _skip_check_: true, value: arrowDistance }, transform: 'translateX(-100%) rotate(-90deg)' }, [`&-placement-right > ${componentCls}-arrow`]: { top: { _skip_check_: true, value: '50%' }, transform: 'translateY(-50%) translateX(-100%) rotate(-90deg)' }, [`&-placement-rightTop > ${componentCls}-arrow`]: { top: arrowOffsetVertical }, [`&-placement-rightBottom > ${componentCls}-arrow`]: { bottom: arrowOffsetVertical } })) }; } /***/ }), /***/ "../../../node_modules/antd/lib/style/roundedArrow.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/style/roundedArrow.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.genRoundedArrow = void 0; exports.getArrowToken = getArrowToken; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); function getArrowToken(token) { const { sizePopupArrow, borderRadiusXS, borderRadiusOuter } = token; const unitWidth = sizePopupArrow / 2; const ax = 0; const ay = unitWidth; const bx = borderRadiusOuter * 1 / Math.sqrt(2); const by = unitWidth - borderRadiusOuter * (1 - 1 / Math.sqrt(2)); const cx = unitWidth - borderRadiusXS * (1 / Math.sqrt(2)); const cy = borderRadiusOuter * (Math.sqrt(2) - 1) + borderRadiusXS * (1 / Math.sqrt(2)); const dx = 2 * unitWidth - cx; const dy = cy; const ex = 2 * unitWidth - bx; const ey = by; const fx = 2 * unitWidth - ax; const fy = ay; const shadowWidth = unitWidth * Math.sqrt(2) + borderRadiusOuter * (Math.sqrt(2) - 2); const polygonOffset = borderRadiusOuter * (Math.sqrt(2) - 1); const arrowPolygon = `polygon(${polygonOffset}px 100%, 50% ${polygonOffset}px, ${2 * unitWidth - polygonOffset}px 100%, ${polygonOffset}px 100%)`; const arrowPath = `path('M ${ax} ${ay} A ${borderRadiusOuter} ${borderRadiusOuter} 0 0 0 ${bx} ${by} L ${cx} ${cy} A ${borderRadiusXS} ${borderRadiusXS} 0 0 1 ${dx} ${dy} L ${ex} ${ey} A ${borderRadiusOuter} ${borderRadiusOuter} 0 0 0 ${fx} ${fy} Z')`; return { arrowShadowWidth: shadowWidth, arrowPath, arrowPolygon }; } const genRoundedArrow = (token, bgColor, boxShadow) => { const { sizePopupArrow, arrowPolygon, arrowPath, arrowShadowWidth, borderRadiusXS, calc } = token; return { pointerEvents: 'none', width: sizePopupArrow, height: sizePopupArrow, overflow: 'hidden', '&::before': { position: 'absolute', bottom: 0, insetInlineStart: 0, width: sizePopupArrow, height: calc(sizePopupArrow).div(2).equal(), background: bgColor, clipPath: { _multi_value_: true, value: [arrowPolygon, arrowPath] }, content: '""' }, '&::after': { content: '""', position: 'absolute', width: arrowShadowWidth, height: arrowShadowWidth, bottom: 0, insetInline: 0, margin: 'auto', borderRadius: { _skip_check_: true, value: `0 0 ${(0, _cssinjs.unit)(borderRadiusXS)} 0` }, transform: 'translateY(50%) rotate(-135deg)', boxShadow, zIndex: 0, background: 'transparent' } }; }; exports.genRoundedArrow = genRoundedArrow; /***/ }), /***/ "../../../node_modules/antd/lib/table/Column.js": /*!******************************************************!*\ !*** ../../../node_modules/antd/lib/table/Column.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports) => { 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. */ const Column = _ => null; var _default = exports["default"] = Column; /***/ }), /***/ "../../../node_modules/antd/lib/table/ColumnGroup.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/table/ColumnGroup.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports) => { 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. */ const ColumnGroup = _ => null; var _default = exports["default"] = ColumnGroup; /***/ }), /***/ "../../../node_modules/antd/lib/table/ExpandIcon.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/table/ExpandIcon.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); function renderExpandIcon(locale) { return props => { const { prefixCls, onExpand, record, expanded, expandable } = props; const iconPrefix = `${prefixCls}-row-expand-icon`; return /*#__PURE__*/React.createElement("button", { type: "button", onClick: e => { onExpand(record, e); e.stopPropagation(); }, className: (0, _classnames.default)(iconPrefix, { [`${iconPrefix}-spaced`]: !expandable, [`${iconPrefix}-expanded`]: expandable && expanded, [`${iconPrefix}-collapsed`]: expandable && !expanded }), "aria-label": expanded ? locale.collapse : locale.expand, "aria-expanded": expanded }); }; } var _default = exports["default"] = renderExpandIcon; /***/ }), /***/ "../../../node_modules/antd/lib/table/InternalTable.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/table/InternalTable.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); var _rcTable = __webpack_require__(/*! rc-table */ "../../../node_modules/rc-table/es/index.js"); var _useColumns = __webpack_require__(/*! rc-table/lib/hooks/useColumns */ "../../../node_modules/rc-table/lib/hooks/useColumns/index.js"); var _omit = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/omit */ "../../../node_modules/rc-util/lib/omit.js")); var _useProxyImperativeHandle = _interopRequireDefault(__webpack_require__(/*! ../_util/hooks/useProxyImperativeHandle */ "../../../node_modules/antd/lib/_util/hooks/useProxyImperativeHandle.js")); var _scrollTo = _interopRequireDefault(__webpack_require__(/*! ../_util/scrollTo */ "../../../node_modules/antd/lib/_util/scrollTo.js")); var _warning = __webpack_require__(/*! ../_util/warning */ "../../../node_modules/antd/lib/_util/warning.js"); var _context = __webpack_require__(/*! ../config-provider/context */ "../../../node_modules/antd/lib/config-provider/context.js"); var _defaultRenderEmpty = _interopRequireDefault(__webpack_require__(/*! ../config-provider/defaultRenderEmpty */ "../../../node_modules/antd/lib/config-provider/defaultRenderEmpty.js")); var _useCSSVarCls = _interopRequireDefault(__webpack_require__(/*! ../config-provider/hooks/useCSSVarCls */ "../../../node_modules/antd/lib/config-provider/hooks/useCSSVarCls.js")); var _useSize = _interopRequireDefault(__webpack_require__(/*! ../config-provider/hooks/useSize */ "../../../node_modules/antd/lib/config-provider/hooks/useSize.js")); var _useBreakpoint = _interopRequireDefault(__webpack_require__(/*! ../grid/hooks/useBreakpoint */ "../../../node_modules/antd/lib/grid/hooks/useBreakpoint.js")); var _en_US = _interopRequireDefault(__webpack_require__(/*! ../locale/en_US */ "../../../node_modules/antd/lib/locale/en_US.js")); var _pagination = _interopRequireDefault(__webpack_require__(/*! ../pagination */ "../../../node_modules/antd/lib/pagination/index.js")); var _spin = _interopRequireDefault(__webpack_require__(/*! ../spin */ "../../../node_modules/antd/lib/spin/index.js")); var _internal = __webpack_require__(/*! ../theme/internal */ "../../../node_modules/antd/lib/theme/internal.js"); var _ExpandIcon = _interopRequireDefault(__webpack_require__(/*! ./ExpandIcon */ "../../../node_modules/antd/lib/table/ExpandIcon.js")); var _useContainerWidth = _interopRequireDefault(__webpack_require__(/*! ./hooks/useContainerWidth */ "../../../node_modules/antd/lib/table/hooks/useContainerWidth.js")); var _useFilter = _interopRequireWildcard(__webpack_require__(/*! ./hooks/useFilter */ "../../../node_modules/antd/lib/table/hooks/useFilter/index.js")); var _useLazyKVMap = _interopRequireDefault(__webpack_require__(/*! ./hooks/useLazyKVMap */ "../../../node_modules/antd/lib/table/hooks/useLazyKVMap.js")); var _usePagination = _interopRequireWildcard(__webpack_require__(/*! ./hooks/usePagination */ "../../../node_modules/antd/lib/table/hooks/usePagination.js")); var _useSelection = _interopRequireDefault(__webpack_require__(/*! ./hooks/useSelection */ "../../../node_modules/antd/lib/table/hooks/useSelection.js")); var _useSorter = _interopRequireWildcard(__webpack_require__(/*! ./hooks/useSorter */ "../../../node_modules/antd/lib/table/hooks/useSorter.js")); var _useTitleColumns = _interopRequireDefault(__webpack_require__(/*! ./hooks/useTitleColumns */ "../../../node_modules/antd/lib/table/hooks/useTitleColumns.js")); var _RcTable = _interopRequireDefault(__webpack_require__(/*! ./RcTable */ "../../../node_modules/antd/lib/table/RcTable/index.js")); var _VirtualTable = _interopRequireDefault(__webpack_require__(/*! ./RcTable/VirtualTable */ "../../../node_modules/antd/lib/table/RcTable/VirtualTable.js")); var _style = _interopRequireDefault(__webpack_require__(/*! ./style */ "../../../node_modules/antd/lib/table/style/index.js")); const EMPTY_LIST = []; const InternalTable = (props, ref) => { var _a, _b; const { prefixCls: customizePrefixCls, className, rootClassName, style, size: customizeSize, bordered, dropdownPrefixCls: customizeDropdownPrefixCls, dataSource, pagination, rowSelection, rowKey = 'key', rowClassName, columns, children, childrenColumnName: legacyChildrenColumnName, onChange, getPopupContainer, loading, expandIcon, expandable, expandedRowRender, expandIconColumnIndex, indentSize, scroll, sortDirections, locale, showSorterTooltip = { target: 'full-header' }, virtual } = props; const warning = (0, _warning.devUseWarning)('Table'); if (true) { true ? warning(!(typeof rowKey === 'function' && rowKey.length > 1), 'usage', '`index` parameter of `rowKey` function is deprecated. There is no guarantee that it will work as expected.') : 0; } const baseColumns = React.useMemo(() => columns || (0, _useColumns.convertChildrenToColumns)(children), [columns, children]); const needResponsive = React.useMemo(() => baseColumns.some(col => col.responsive), [baseColumns]); const screens = (0, _useBreakpoint.default)(needResponsive); const mergedColumns = React.useMemo(() => { const matched = new Set(Object.keys(screens).filter(m => screens[m])); return baseColumns.filter(c => !c.responsive || c.responsive.some(r => matched.has(r))); }, [baseColumns, screens]); const tableProps = (0, _omit.default)(props, ['className', 'style', 'columns']); const { locale: contextLocale = _en_US.default, direction, table, renderEmpty, getPrefixCls, getPopupContainer: getContextPopupContainer } = React.useContext(_context.ConfigContext); const mergedSize = (0, _useSize.default)(customizeSize); const tableLocale = Object.assign(Object.assign({}, contextLocale.Table), locale); const rawData = dataSource || EMPTY_LIST; const prefixCls = getPrefixCls('table', customizePrefixCls); const dropdownPrefixCls = getPrefixCls('dropdown', customizeDropdownPrefixCls); const [, token] = (0, _internal.useToken)(); const rootCls = (0, _useCSSVarCls.default)(prefixCls); const [wrapCSSVar, hashId, cssVarCls] = (0, _style.default)(prefixCls, rootCls); const mergedExpandable = Object.assign(Object.assign({ childrenColumnName: legacyChildrenColumnName, expandIconColumnIndex }, expandable), { expandIcon: (_a = expandable === null || expandable === void 0 ? void 0 : expandable.expandIcon) !== null && _a !== void 0 ? _a : (_b = table === null || table === void 0 ? void 0 : table.expandable) === null || _b === void 0 ? void 0 : _b.expandIcon }); const { childrenColumnName = 'children' } = mergedExpandable; const expandType = React.useMemo(() => { if (rawData.some(item => item === null || item === void 0 ? void 0 : item[childrenColumnName])) { return 'nest'; } if (expandedRowRender || (expandable === null || expandable === void 0 ? void 0 : expandable.expandedRowRender)) { return 'row'; } return null; }, [rawData]); const internalRefs = { body: React.useRef(null) }; // ============================ Width ============================= const getContainerWidth = (0, _useContainerWidth.default)(prefixCls); // ============================= Refs ============================= const rootRef = React.useRef(null); const tblRef = React.useRef(null); (0, _useProxyImperativeHandle.default)(ref, () => Object.assign(Object.assign({}, tblRef.current), { nativeElement: rootRef.current })); // ============================ RowKey ============================ const getRowKey = React.useMemo(() => { if (typeof rowKey === 'function') { return rowKey; } return record => record === null || record === void 0 ? void 0 : record[rowKey]; }, [rowKey]); const [getRecordByKey] = (0, _useLazyKVMap.default)(rawData, childrenColumnName, getRowKey); // ============================ Events ============================= const changeEventInfo = {}; const triggerOnChange = (info, action, reset = false) => { var _a, _b, _c, _d; const changeInfo = Object.assign(Object.assign({}, changeEventInfo), info); if (reset) { (_a = changeEventInfo.resetPagination) === null || _a === void 0 ? void 0 : _a.call(changeEventInfo); // Reset event param if ((_b = changeInfo.pagination) === null || _b === void 0 ? void 0 : _b.current) { changeInfo.pagination.current = 1; } // Trigger pagination events if (pagination) { (_c = pagination.onChange) === null || _c === void 0 ? void 0 : _c.call(pagination, 1, (_d = changeInfo.pagination) === null || _d === void 0 ? void 0 : _d.pageSize); } } if (scroll && scroll.scrollToFirstRowOnChange !== false && internalRefs.body.current) { (0, _scrollTo.default)(0, { getContainer: () => internalRefs.body.current }); } onChange === null || onChange === void 0 ? void 0 : onChange(changeInfo.pagination, changeInfo.filters, changeInfo.sorter, { currentDataSource: (0, _useFilter.getFilterData)((0, _useSorter.getSortData)(rawData, changeInfo.sorterStates, childrenColumnName), changeInfo.filterStates, childrenColumnName), 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 ============================= const onSorterChange = (sorter, sorterStates) => { triggerOnChange({ sorter, sorterStates }, 'sort', false); }; const [transformSorterColumns, sortStates, sorterTitleProps, getSorters] = (0, _useSorter.default)({ prefixCls, mergedColumns, onSorterChange, sortDirections: sortDirections || ['ascend', 'descend'], tableLocale, showSorterTooltip }); const sortedData = React.useMemo(() => (0, _useSorter.getSortData)(rawData, sortStates, childrenColumnName), [rawData, sortStates]); changeEventInfo.sorter = getSorters(); changeEventInfo.sorterStates = sortStates; // ============================ Filter ============================ const onFilterChange = (filters, filterStates) => { triggerOnChange({ filters, filterStates }, 'filter', true); }; const [transformFilterColumns, filterStates, filters] = (0, _useFilter.default)({ prefixCls, locale: tableLocale, dropdownPrefixCls, mergedColumns, onFilterChange, getPopupContainer: getPopupContainer || getContextPopupContainer, rootClassName: (0, _classnames.default)(rootClassName, rootCls) }); const mergedData = (0, _useFilter.getFilterData)(sortedData, filterStates, childrenColumnName); changeEventInfo.filters = filters; changeEventInfo.filterStates = filterStates; // ============================ Column ============================ const columnTitleProps = React.useMemo(() => { const mergedFilters = {}; Object.keys(filters).forEach(filterKey => { if (filters[filterKey] !== null) { mergedFilters[filterKey] = filters[filterKey]; } }); return Object.assign(Object.assign({}, sorterTitleProps), { filters: mergedFilters }); }, [sorterTitleProps, filters]); const [transformTitleColumns] = (0, _useTitleColumns.default)(columnTitleProps); // ========================== Pagination ========================== const onPaginationChange = (current, pageSize) => { triggerOnChange({ pagination: Object.assign(Object.assign({}, changeEventInfo.pagination), { current, pageSize }) }, 'paginate'); }; const [mergedPagination, resetPagination] = (0, _usePagination.default)(mergedData.length, onPaginationChange, pagination); changeEventInfo.pagination = pagination === false ? {} : (0, _usePagination.getPaginationParam)(mergedPagination, pagination); changeEventInfo.resetPagination = resetPagination; // ============================= Data ============================= const pageData = React.useMemo(() => { if (pagination === false || !mergedPagination.pageSize) { return mergedData; } const { current = 1, total, pageSize = _usePagination.DEFAULT_PAGE_SIZE } = mergedPagination; true ? warning(current > 0, 'usage', '`current` should be positive number.') : 0; // Dynamic table data if (mergedData.length < total) { if (mergedData.length > pageSize) { true ? warning(false, 'usage', '`dataSource` length is less than `pagination.total` but large than `pagination.pageSize`. Please make sure your config correct data with async mode.') : 0; return mergedData.slice((current - 1) * pageSize, current * pageSize); } return mergedData; } return mergedData.slice((current - 1) * pageSize, current * pageSize); }, [!!pagination, mergedData, mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.current, mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.pageSize, mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.total]); // ========================== Selections ========================== const [transformSelectionColumns, selectedKeySet] = (0, _useSelection.default)({ prefixCls, data: mergedData, pageData, getRowKey, getRecordByKey, expandType, childrenColumnName, locale: tableLocale, getPopupContainer: getPopupContainer || getContextPopupContainer }, rowSelection); const internalRowClassName = (record, index, indent) => { let mergedRowClassName; if (typeof rowClassName === 'function') { mergedRowClassName = (0, _classnames.default)(rowClassName(record, index, indent)); } else { mergedRowClassName = (0, _classnames.default)(rowClassName); } return (0, _classnames.default)({ [`${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 ============================ const transformColumns = React.useCallback(innerColumns => transformTitleColumns(transformSelectionColumns(transformFilterColumns(transformSorterColumns(innerColumns)))), [transformSorterColumns, transformFilterColumns, transformSelectionColumns]); let topPaginationNode; let bottomPaginationNode; if (pagination !== false && (mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.total)) { let paginationSize; if (mergedPagination.size) { paginationSize = mergedPagination.size; } else { paginationSize = mergedSize === 'small' || mergedSize === 'middle' ? 'small' : undefined; } const renderPagination = position => (/*#__PURE__*/React.createElement(_pagination.default, Object.assign({}, mergedPagination, { className: (0, _classnames.default)(`${prefixCls}-pagination ${prefixCls}-pagination-${position}`, mergedPagination.className), size: paginationSize }))); const defaultPosition = direction === 'rtl' ? 'left' : 'right'; const { position } = mergedPagination; if (position !== null && Array.isArray(position)) { const topPos = position.find(p => p.includes('top')); const bottomPos = position.find(p => p.includes('bottom')); const isDisable = position.every(p => `${p}` === 'none'); if (!topPos && !bottomPos && !isDisable) { bottomPaginationNode = renderPagination(defaultPosition); } if (topPos) { topPaginationNode = renderPagination(topPos.toLowerCase().replace('top', '')); } if (bottomPos) { bottomPaginationNode = renderPagination(bottomPos.toLowerCase().replace('bottom', '')); } } else { bottomPaginationNode = renderPagination(defaultPosition); } } // >>>>>>>>> Spinning let spinProps; if (typeof loading === 'boolean') { spinProps = { spinning: loading }; } else if (typeof loading === 'object') { spinProps = Object.assign({ spinning: true }, loading); } const wrapperClassNames = (0, _classnames.default)(cssVarCls, rootCls, `${prefixCls}-wrapper`, table === null || table === void 0 ? void 0 : table.className, { [`${prefixCls}-wrapper-rtl`]: direction === 'rtl' }, className, rootClassName, hashId); const mergedStyle = Object.assign(Object.assign({}, table === null || table === void 0 ? void 0 : table.style), style); const emptyText = typeof (locale === null || locale === void 0 ? void 0 : locale.emptyText) !== 'undefined' ? locale.emptyText : (renderEmpty === null || renderEmpty === void 0 ? void 0 : renderEmpty('Table')) || /*#__PURE__*/React.createElement(_defaultRenderEmpty.default, { componentName: "Table" }); // ========================== Render ========================== const TableComponent = virtual ? _VirtualTable.default : _RcTable.default; // >>> Virtual Table props. We set height here since it will affect height collection const virtualProps = {}; const listItemHeight = React.useMemo(() => { const { fontSize, lineHeight, lineWidth, padding, paddingXS, paddingSM } = token; const fontHeight = Math.floor(fontSize * lineHeight); switch (mergedSize) { case 'middle': return paddingSM * 2 + fontHeight + lineWidth; case 'small': return paddingXS * 2 + fontHeight + lineWidth; default: return padding * 2 + fontHeight + lineWidth; } }, [token, mergedSize]); if (virtual) { virtualProps.listItemHeight = listItemHeight; } return wrapCSSVar(/*#__PURE__*/React.createElement("div", { ref: rootRef, className: wrapperClassNames, style: mergedStyle }, /*#__PURE__*/React.createElement(_spin.default, Object.assign({ spinning: false }, spinProps), topPaginationNode, /*#__PURE__*/React.createElement(TableComponent, Object.assign({}, virtualProps, tableProps, { ref: tblRef, columns: mergedColumns, direction: direction, expandable: mergedExpandable, prefixCls: prefixCls, className: (0, _classnames.default)({ [`${prefixCls}-middle`]: mergedSize === 'middle', [`${prefixCls}-small`]: mergedSize === 'small', [`${prefixCls}-bordered`]: bordered, [`${prefixCls}-empty`]: rawData.length === 0 }, cssVarCls, rootCls, hashId), data: pageData, rowKey: getRowKey, rowClassName: internalRowClassName, emptyText: emptyText, // Internal internalHooks: _rcTable.INTERNAL_HOOKS, internalRefs: internalRefs, transformColumns: transformColumns, getContainerWidth: getContainerWidth })), bottomPaginationNode))); }; var _default = exports["default"] = /*#__PURE__*/React.forwardRef(InternalTable); /***/ }), /***/ "../../../node_modules/antd/lib/table/RcTable/VirtualTable.js": /*!********************************************************************!*\ !*** ../../../node_modules/antd/lib/table/RcTable/VirtualTable.js ***! \********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _rcTable = __webpack_require__(/*! rc-table */ "../../../node_modules/rc-table/es/index.js"); /** * Same as `rc-table` but we modify trigger children update logic instead. */ const RcVirtualTable = (0, _rcTable.genVirtualTable)((prev, next) => { const { _renderTimes: prevRenderTimes } = prev; const { _renderTimes: nextRenderTimes } = next; return prevRenderTimes !== nextRenderTimes; }); var _default = exports["default"] = RcVirtualTable; /***/ }), /***/ "../../../node_modules/antd/lib/table/RcTable/index.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/table/RcTable/index.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _rcTable = __webpack_require__(/*! rc-table */ "../../../node_modules/rc-table/es/index.js"); /** * Same as `rc-table` but we modify trigger children update logic instead. */ const RcTable = (0, _rcTable.genTable)((prev, next) => { const { _renderTimes: prevRenderTimes } = prev; const { _renderTimes: nextRenderTimes } = next; return prevRenderTimes !== nextRenderTimes; }); var _default = exports["default"] = RcTable; /***/ }), /***/ "../../../node_modules/antd/lib/table/Table.js": /*!*****************************************************!*\ !*** ../../../node_modules/antd/lib/table/Table.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _rcTable = __webpack_require__(/*! rc-table */ "../../../node_modules/rc-table/es/index.js"); var _Column = _interopRequireDefault(__webpack_require__(/*! ./Column */ "../../../node_modules/antd/lib/table/Column.js")); var _ColumnGroup = _interopRequireDefault(__webpack_require__(/*! ./ColumnGroup */ "../../../node_modules/antd/lib/table/ColumnGroup.js")); var _useSelection = __webpack_require__(/*! ./hooks/useSelection */ "../../../node_modules/antd/lib/table/hooks/useSelection.js"); var _InternalTable = _interopRequireDefault(__webpack_require__(/*! ./InternalTable */ "../../../node_modules/antd/lib/table/InternalTable.js")); const Table = (props, ref) => { const renderTimesRef = React.useRef(0); renderTimesRef.current += 1; return /*#__PURE__*/React.createElement(_InternalTable.default, Object.assign({}, props, { ref: ref, _renderTimes: renderTimesRef.current })); }; const ForwardTable = /*#__PURE__*/React.forwardRef(Table); ForwardTable.SELECTION_COLUMN = _useSelection.SELECTION_COLUMN; ForwardTable.EXPAND_COLUMN = _rcTable.EXPAND_COLUMN; ForwardTable.SELECTION_ALL = _useSelection.SELECTION_ALL; ForwardTable.SELECTION_INVERT = _useSelection.SELECTION_INVERT; ForwardTable.SELECTION_NONE = _useSelection.SELECTION_NONE; ForwardTable.Column = _Column.default; ForwardTable.ColumnGroup = _ColumnGroup.default; ForwardTable.Summary = _rcTable.Summary; if (true) { ForwardTable.displayName = 'Table'; } var _default = exports["default"] = ForwardTable; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useContainerWidth.js": /*!***********************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useContainerWidth.js ***! \***********************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = useContainerWidth; function useContainerWidth(prefixCls) { const getContainerWidth = (ele, width) => { const container = ele.querySelector(`.${prefixCls}-container`); let returnWidth = width; if (container) { const style = getComputedStyle(container); const borderLeft = parseInt(style.borderLeftWidth, 10); const borderRight = parseInt(style.borderRightWidth, 10); returnWidth = width - borderLeft - borderRight; } return returnWidth; }; return getContainerWidth; } /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useFilter/FilterDropdown.js": /*!******************************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useFilter/FilterDropdown.js ***! \******************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; exports.flattenKeys = flattenKeys; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _FilterFilled = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/FilterFilled */ "../../../node_modules/@ant-design/icons/FilterFilled.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); var _isEqual = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/isEqual */ "../../../node_modules/rc-util/lib/isEqual.js")); var _extendsObject = _interopRequireDefault(__webpack_require__(/*! ../../../_util/extendsObject */ "../../../node_modules/antd/lib/_util/extendsObject.js")); var _useSyncState = _interopRequireDefault(__webpack_require__(/*! ../../../_util/hooks/useSyncState */ "../../../node_modules/antd/lib/_util/hooks/useSyncState.js")); var _warning = __webpack_require__(/*! ../../../_util/warning */ "../../../node_modules/antd/lib/_util/warning.js"); var _button = _interopRequireDefault(__webpack_require__(/*! ../../../button */ "../../../node_modules/antd/lib/button/index.js")); var _checkbox = _interopRequireDefault(__webpack_require__(/*! ../../../checkbox */ "../../../node_modules/antd/lib/checkbox/index.js")); var _context = __webpack_require__(/*! ../../../config-provider/context */ "../../../node_modules/antd/lib/config-provider/context.js"); var _dropdown = _interopRequireDefault(__webpack_require__(/*! ../../../dropdown */ "../../../node_modules/antd/lib/dropdown/index.js")); var _empty = _interopRequireDefault(__webpack_require__(/*! ../../../empty */ "../../../node_modules/antd/lib/empty/index.js")); var _menu = _interopRequireDefault(__webpack_require__(/*! ../../../menu */ "../../../node_modules/antd/lib/menu/index.js")); var _OverrideContext = __webpack_require__(/*! ../../../menu/OverrideContext */ "../../../node_modules/antd/lib/menu/OverrideContext.js"); var _radio = _interopRequireDefault(__webpack_require__(/*! ../../../radio */ "../../../node_modules/antd/lib/radio/index.js")); var _tree = _interopRequireDefault(__webpack_require__(/*! ../../../tree */ "../../../node_modules/antd/lib/tree/index.js")); var _FilterSearch = _interopRequireDefault(__webpack_require__(/*! ./FilterSearch */ "../../../node_modules/antd/lib/table/hooks/useFilter/FilterSearch.js")); var _FilterWrapper = _interopRequireDefault(__webpack_require__(/*! ./FilterWrapper */ "../../../node_modules/antd/lib/table/hooks/useFilter/FilterWrapper.js")); function flattenKeys(filters) { let keys = []; (filters || []).forEach(({ value, children }) => { keys.push(value); if (children) { keys = [].concat((0, _toConsumableArray2.default)(keys), (0, _toConsumableArray2.default)(flattenKeys(children))); } }); return keys; } function hasSubMenu(filters) { return filters.some(({ children }) => children); } function searchValueMatched(searchValue, text) { if (typeof text === 'string' || typeof text === 'number') { return text === null || text === void 0 ? void 0 : text.toString().toLowerCase().includes(searchValue.trim().toLowerCase()); } return false; } function renderFilterItems({ filters, prefixCls, filteredKeys, filterMultiple, searchValue, filterSearch }) { return filters.map((filter, index) => { const key = String(filter.value); if (filter.children) { return { key: key || index, label: filter.text, popupClassName: `${prefixCls}-dropdown-submenu`, children: renderFilterItems({ filters: filter.children, prefixCls, filteredKeys, filterMultiple, searchValue, filterSearch }) }; } const Component = filterMultiple ? _checkbox.default : _radio.default; const item = { key: filter.value !== undefined ? key : index, label: (/*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Component, { checked: filteredKeys.includes(key) }), /*#__PURE__*/React.createElement("span", null, filter.text))) }; if (searchValue.trim()) { if (typeof filterSearch === 'function') { return filterSearch(searchValue, filter) ? item : null; } return searchValueMatched(searchValue, filter.text) ? item : null; } return item; }); } function wrapStringListType(keys) { return keys || []; } const FilterDropdown = props => { var _a, _b, _c, _d; const { tablePrefixCls, prefixCls, column, dropdownPrefixCls, columnKey, filterOnClose, filterMultiple, filterMode = 'menu', filterSearch = false, filterState, triggerFilter, locale, children, getPopupContainer, rootClassName } = props; const { filterResetToDefaultFilteredValue, defaultFilteredValue, filterDropdownProps = {}, // Deprecated filterDropdownOpen, filterDropdownVisible, onFilterDropdownVisibleChange, onFilterDropdownOpenChange } = column; const [visible, setVisible] = React.useState(false); const filtered = !!(filterState && (((_a = filterState.filteredKeys) === null || _a === void 0 ? void 0 : _a.length) || filterState.forceFiltered)); const triggerVisible = newVisible => { var _a; setVisible(newVisible); (_a = filterDropdownProps.onOpenChange) === null || _a === void 0 ? void 0 : _a.call(filterDropdownProps, newVisible); // deprecated onFilterDropdownOpenChange === null || onFilterDropdownOpenChange === void 0 ? void 0 : onFilterDropdownOpenChange(newVisible); onFilterDropdownVisibleChange === null || onFilterDropdownVisibleChange === void 0 ? void 0 : onFilterDropdownVisibleChange(newVisible); }; // =================Warning=================== if (true) { const warning = (0, _warning.devUseWarning)('Table'); const deprecatedList = [['filterDropdownOpen', 'filterDropdownProps.open'], ['filterDropdownVisible', 'filterDropdownProps.open'], ['onFilterDropdownOpenChange', 'filterDropdownProps.onOpenChange'], ['onFilterDropdownVisibleChange', 'filterDropdownProps.onOpenChange']]; deprecatedList.forEach(([deprecatedName, newName]) => { warning.deprecated(!(deprecatedName in column), deprecatedName, newName); }); warning.deprecated(!('filterCheckall' in locale), 'filterCheckall', 'locale.filterCheckAll'); } const mergedVisible = (_d = (_c = (_b = filterDropdownProps.open) !== null && _b !== void 0 ? _b : filterDropdownOpen) !== null && _c !== void 0 ? _c : filterDropdownVisible) !== null && _d !== void 0 ? _d : visible; // inner state // ===================== Select Keys ===================== const propFilteredKeys = filterState === null || filterState === void 0 ? void 0 : filterState.filteredKeys; const [getFilteredKeysSync, setFilteredKeysSync] = (0, _useSyncState.default)(wrapStringListType(propFilteredKeys)); const onSelectKeys = ({ selectedKeys }) => { setFilteredKeysSync(selectedKeys); }; const onCheck = (keys, { node, checked }) => { if (!filterMultiple) { onSelectKeys({ selectedKeys: checked && node.key ? [node.key] : [] }); } else { onSelectKeys({ selectedKeys: keys }); } }; React.useEffect(() => { if (!visible) { return; } onSelectKeys({ selectedKeys: wrapStringListType(propFilteredKeys) }); }, [propFilteredKeys]); // ====================== Open Keys ====================== const [openKeys, setOpenKeys] = React.useState([]); const onOpenChange = keys => { setOpenKeys(keys); }; // search in tree mode column filter const [searchValue, setSearchValue] = React.useState(''); const onSearch = e => { const { value } = e.target; setSearchValue(value); }; // clear search value after close filter dropdown React.useEffect(() => { if (!visible) { setSearchValue(''); } }, [visible]); // ======================= Submit ======================== const internalTriggerFilter = keys => { const mergedKeys = (keys === null || keys === void 0 ? void 0 : 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, true)) { return null; } triggerFilter({ column, key: columnKey, filteredKeys: mergedKeys }); }; const onConfirm = () => { triggerVisible(false); internalTriggerFilter(getFilteredKeysSync()); }; const onReset = ({ confirm, closeDropdown } = { confirm: false, closeDropdown: false }) => { if (confirm) { internalTriggerFilter([]); } if (closeDropdown) { triggerVisible(false); } setSearchValue(''); if (filterResetToDefaultFilteredValue) { setFilteredKeysSync((defaultFilteredValue || []).map(key => String(key))); } else { setFilteredKeysSync([]); } }; const doFilter = ({ closeDropdown } = { closeDropdown: true }) => { if (closeDropdown) { triggerVisible(false); } internalTriggerFilter(getFilteredKeysSync()); }; const onVisibleChange = (newVisible, info) => { if (info.source === 'trigger') { if (newVisible && propFilteredKeys !== undefined) { // Sync filteredKeys on appear in controlled mode (propFilteredKeys !== undefined) setFilteredKeysSync(wrapStringListType(propFilteredKeys)); } triggerVisible(newVisible); if (!newVisible && !column.filterDropdown && filterOnClose) { onConfirm(); } } }; // ======================== Style ======================== const dropdownMenuClass = (0, _classnames.default)({ [`${dropdownPrefixCls}-menu-without-submenu`]: !hasSubMenu(column.filters || []) }); const onCheckAll = e => { if (e.target.checked) { const allFilterKeys = flattenKeys(column === null || column === void 0 ? void 0 : column.filters).map(key => String(key)); setFilteredKeysSync(allFilterKeys); } else { setFilteredKeysSync([]); } }; const getTreeData = ({ filters }) => (filters || []).map((filter, index) => { const key = String(filter.value); const item = { title: filter.text, key: filter.value !== undefined ? key : String(index) }; if (filter.children) { item.children = getTreeData({ filters: filter.children }); } return item; }); const getFilterData = node => { var _a; return Object.assign(Object.assign({}, node), { text: node.title, value: node.key, children: ((_a = node.children) === null || _a === void 0 ? void 0 : _a.map(item => getFilterData(item))) || [] }); }; let dropdownContent; const { direction, renderEmpty } = React.useContext(_context.ConfigContext); if (typeof column.filterDropdown === 'function') { dropdownContent = column.filterDropdown({ prefixCls: `${dropdownPrefixCls}-custom`, setSelectedKeys: selectedKeys => onSelectKeys({ selectedKeys: selectedKeys }), selectedKeys: getFilteredKeysSync(), confirm: doFilter, clearFilters: onReset, filters: column.filters, visible: mergedVisible, close: () => { triggerVisible(false); } }); } else if (column.filterDropdown) { dropdownContent = column.filterDropdown; } else { const selectedKeys = getFilteredKeysSync() || []; const getFilterComponent = () => { var _a, _b; const empty = (_a = renderEmpty === null || renderEmpty === void 0 ? void 0 : renderEmpty('Table.filter')) !== null && _a !== void 0 ? _a : (/*#__PURE__*/React.createElement(_empty.default, { image: _empty.default.PRESENTED_IMAGE_SIMPLE, description: locale.filterEmptyText, styles: { image: { height: 24 } }, style: { margin: 0, padding: '16px 0' } })); if ((column.filters || []).length === 0) { return empty; } if (filterMode === 'tree') { return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_FilterSearch.default, { filterSearch: filterSearch, value: searchValue, onChange: onSearch, tablePrefixCls: tablePrefixCls, locale: locale }), /*#__PURE__*/React.createElement("div", { className: `${tablePrefixCls}-filter-dropdown-tree` }, filterMultiple ? (/*#__PURE__*/React.createElement(_checkbox.default, { checked: selectedKeys.length === flattenKeys(column.filters).length, indeterminate: selectedKeys.length > 0 && selectedKeys.length < flattenKeys(column.filters).length, className: `${tablePrefixCls}-filter-dropdown-checkall`, onChange: onCheckAll }, (_b = locale === null || locale === void 0 ? void 0 : locale.filterCheckall) !== null && _b !== void 0 ? _b : locale === null || locale === void 0 ? void 0 : locale.filterCheckAll)) : null, /*#__PURE__*/React.createElement(_tree.default, { checkable: true, selectable: false, blockNode: true, multiple: filterMultiple, checkStrictly: !filterMultiple, className: `${dropdownPrefixCls}-menu`, onCheck: onCheck, checkedKeys: selectedKeys, selectedKeys: selectedKeys, showIcon: false, treeData: getTreeData({ filters: column.filters }), autoExpandParent: true, defaultExpandAll: true, filterTreeNode: searchValue.trim() ? node => { if (typeof filterSearch === 'function') { return filterSearch(searchValue, getFilterData(node)); } return searchValueMatched(searchValue, node.title); } : undefined }))); } const items = renderFilterItems({ filters: column.filters || [], filterSearch, prefixCls, filteredKeys: getFilteredKeysSync(), filterMultiple, searchValue }); const isEmpty = items.every(item => item === null); return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_FilterSearch.default, { filterSearch: filterSearch, value: searchValue, onChange: onSearch, tablePrefixCls: tablePrefixCls, locale: locale }), isEmpty ? empty : (/*#__PURE__*/React.createElement(_menu.default, { selectable: true, multiple: filterMultiple, prefixCls: `${dropdownPrefixCls}-menu`, className: dropdownMenuClass, onSelect: onSelectKeys, onDeselect: onSelectKeys, selectedKeys: selectedKeys, getPopupContainer: getPopupContainer, openKeys: openKeys, onOpenChange: onOpenChange, items: items }))); }; const getResetDisabled = () => { if (filterResetToDefaultFilteredValue) { return (0, _isEqual.default)((defaultFilteredValue || []).map(key => String(key)), selectedKeys, true); } return selectedKeys.length === 0; }; dropdownContent = /*#__PURE__*/React.createElement(React.Fragment, null, getFilterComponent(), /*#__PURE__*/React.createElement("div", { className: `${prefixCls}-dropdown-btns` }, /*#__PURE__*/React.createElement(_button.default, { type: "link", size: "small", disabled: getResetDisabled(), onClick: () => onReset() }, locale.filterReset), /*#__PURE__*/React.createElement(_button.default, { type: "primary", size: "small", onClick: onConfirm }, locale.filterConfirm))); } // We should not block customize Menu with additional props if (column.filterDropdown) { dropdownContent = /*#__PURE__*/React.createElement(_OverrideContext.OverrideProvider, { selectable: undefined }, dropdownContent); } dropdownContent = /*#__PURE__*/React.createElement(_FilterWrapper.default, { className: `${prefixCls}-dropdown` }, dropdownContent); const getDropdownTrigger = () => { let 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); } return /*#__PURE__*/React.createElement("span", { role: "button", tabIndex: -1, className: (0, _classnames.default)(`${prefixCls}-trigger`, { active: filtered }), onClick: e => { e.stopPropagation(); } }, filterIcon); }; const mergedDropdownProps = (0, _extendsObject.default)({ trigger: ['click'], placement: direction === 'rtl' ? 'bottomLeft' : 'bottomRight', children: getDropdownTrigger(), getPopupContainer }, Object.assign(Object.assign({}, filterDropdownProps), { rootClassName: (0, _classnames.default)(rootClassName, filterDropdownProps.rootClassName), open: mergedVisible, onOpenChange: onVisibleChange, popupRender: () => { if (typeof (filterDropdownProps === null || filterDropdownProps === void 0 ? void 0 : filterDropdownProps.dropdownRender) === 'function') { return filterDropdownProps.dropdownRender(dropdownContent); } return dropdownContent; } })); return /*#__PURE__*/React.createElement("div", { className: `${prefixCls}-column` }, /*#__PURE__*/React.createElement("span", { className: `${tablePrefixCls}-column-title` }, children), /*#__PURE__*/React.createElement(_dropdown.default, Object.assign({}, mergedDropdownProps))); }; var _default = exports["default"] = FilterDropdown; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useFilter/FilterSearch.js": /*!****************************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useFilter/FilterSearch.js ***! \****************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _SearchOutlined = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/SearchOutlined */ "../../../node_modules/@ant-design/icons/SearchOutlined.js")); var _Input = _interopRequireDefault(__webpack_require__(/*! ../../../input/Input */ "../../../node_modules/antd/lib/input/Input.js")); const FilterSearch = props => { const { value, filterSearch, tablePrefixCls, locale, onChange } = props; if (!filterSearch) { return null; } return /*#__PURE__*/React.createElement("div", { className: `${tablePrefixCls}-filter-dropdown-search` }, /*#__PURE__*/React.createElement(_Input.default, { prefix: /*#__PURE__*/React.createElement(_SearchOutlined.default, null), placeholder: locale.filterSearchPlaceholder, onChange: onChange, value: value, // for skip min-width of input htmlSize: 1, className: `${tablePrefixCls}-filter-dropdown-search-input` })); }; var _default = exports["default"] = FilterSearch; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useFilter/FilterWrapper.js": /*!*****************************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useFilter/FilterWrapper.js ***! \*****************************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _KeyCode = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/KeyCode */ "../../../node_modules/rc-util/lib/KeyCode.js")); const onKeyDown = event => { const { keyCode } = event; if (keyCode === _KeyCode.default.ENTER) { event.stopPropagation(); } }; const FilterDropdownMenuWrapper = /*#__PURE__*/React.forwardRef((props, ref) => (/*#__PURE__*/React.createElement("div", { className: props.className, onClick: e => e.stopPropagation(), onKeyDown: onKeyDown, ref: ref }, props.children))); if (true) { FilterDropdownMenuWrapper.displayName = 'FilterDropdownMenuWrapper'; } var _default = exports["default"] = FilterDropdownMenuWrapper; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useFilter/index.js": /*!*********************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useFilter/index.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; Object.defineProperty(exports, "flattenKeys", ({ enumerable: true, get: function () { return _FilterDropdown.flattenKeys; } })); exports.getFilterData = void 0; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _warning = __webpack_require__(/*! ../../../_util/warning */ "../../../node_modules/antd/lib/_util/warning.js"); var _util = __webpack_require__(/*! ../../util */ "../../../node_modules/antd/lib/table/util.js"); var _FilterDropdown = _interopRequireWildcard(__webpack_require__(/*! ./FilterDropdown */ "../../../node_modules/antd/lib/table/hooks/useFilter/FilterDropdown.js")); const collectFilterStates = (columns, init, pos) => { let filterStates = []; (columns || []).forEach((column, index) => { var _a; const columnPos = (0, _util.getColumnPos)(index, pos); const filterDropdownIsDefined = column.filterDropdown !== undefined; if (column.filters || filterDropdownIsDefined || 'onFilter' in column) { if ('filteredValue' in column) { // Controlled let filteredValues = column.filteredValue; if (!filterDropdownIsDefined) { filteredValues = (_a = filteredValues === null || filteredValues === void 0 ? void 0 : filteredValues.map(String)) !== null && _a !== void 0 ? _a : filteredValues; } filterStates.push({ column, key: (0, _util.getColumnKey)(column, columnPos), filteredKeys: filteredValues, forceFiltered: column.filtered }); } else { // Uncontrolled filterStates.push({ column, key: (0, _util.getColumnKey)(column, columnPos), filteredKeys: init && column.defaultFilteredValue ? column.defaultFilteredValue : undefined, forceFiltered: column.filtered }); } } if ('children' in column) { filterStates = [].concat((0, _toConsumableArray2.default)(filterStates), (0, _toConsumableArray2.default)(collectFilterStates(column.children, init, columnPos))); } }); return filterStates; }; function injectFilter(prefixCls, dropdownPrefixCls, columns, filterStates, locale, triggerFilter, getPopupContainer, pos, rootClassName) { return columns.map((column, index) => { const columnPos = (0, _util.getColumnPos)(index, pos); const { filterOnClose = true, filterMultiple = true, filterMode, filterSearch } = column; let newColumn = column; if (newColumn.filters || newColumn.filterDropdown) { const columnKey = (0, _util.getColumnKey)(newColumn, columnPos); const filterState = filterStates.find(({ key }) => columnKey === key); newColumn = Object.assign(Object.assign({}, newColumn), { title: renderProps => (/*#__PURE__*/React.createElement(_FilterDropdown.default, { tablePrefixCls: prefixCls, prefixCls: `${prefixCls}-filter`, dropdownPrefixCls: dropdownPrefixCls, column: newColumn, columnKey: columnKey, filterState: filterState, filterOnClose: filterOnClose, filterMultiple: filterMultiple, filterMode: filterMode, filterSearch: filterSearch, triggerFilter: triggerFilter, locale: locale, getPopupContainer: getPopupContainer, rootClassName: rootClassName }, (0, _util.renderColumnTitle)(column.title, renderProps))) }); } if ('children' in newColumn) { newColumn = Object.assign(Object.assign({}, newColumn), { children: injectFilter(prefixCls, dropdownPrefixCls, newColumn.children, filterStates, locale, triggerFilter, getPopupContainer, columnPos, rootClassName) }); } return newColumn; }); } const generateFilterInfo = filterStates => { const currentFilters = {}; filterStates.forEach(({ key, filteredKeys, column }) => { const keyAsString = key; const { filters, filterDropdown } = column; if (filterDropdown) { currentFilters[keyAsString] = filteredKeys || null; } else if (Array.isArray(filteredKeys)) { const keys = (0, _FilterDropdown.flattenKeys)(filters); currentFilters[keyAsString] = keys.filter(originKey => filteredKeys.includes(String(originKey))); } else { currentFilters[keyAsString] = null; } }); return currentFilters; }; const getFilterData = (data, filterStates, childrenColumnName) => { const filterDatas = filterStates.reduce((currentData, filterState) => { const { column: { onFilter, filters }, filteredKeys } = filterState; if (onFilter && filteredKeys && filteredKeys.length) { return currentData // shallow copy .map(record => Object.assign({}, record)).filter(record => filteredKeys.some(key => { const keys = (0, _FilterDropdown.flattenKeys)(filters); const keyIndex = keys.findIndex(k => String(k) === String(key)); const realKey = keyIndex !== -1 ? keys[keyIndex] : key; // filter children if (record[childrenColumnName]) { record[childrenColumnName] = getFilterData(record[childrenColumnName], filterStates, childrenColumnName); } return onFilter(realKey, record); })); } return currentData; }, data); return filterDatas; }; exports.getFilterData = getFilterData; const getMergedColumns = rawMergedColumns => rawMergedColumns.flatMap(column => { if ('children' in column) { return [column].concat((0, _toConsumableArray2.default)(getMergedColumns(column.children || []))); } return [column]; }); const useFilter = props => { const { prefixCls, dropdownPrefixCls, mergedColumns: rawMergedColumns, onFilterChange, getPopupContainer, locale: tableLocale, rootClassName } = props; const warning = (0, _warning.devUseWarning)('Table'); const mergedColumns = React.useMemo(() => getMergedColumns(rawMergedColumns || []), [rawMergedColumns]); const [filterStates, setFilterStates] = React.useState(() => collectFilterStates(mergedColumns, true)); const mergedFilterStates = React.useMemo(() => { const collectedStates = collectFilterStates(mergedColumns, false); if (collectedStates.length === 0) { return collectedStates; } let filteredKeysIsAllNotControlled = true; let filteredKeysIsAllControlled = true; collectedStates.forEach(({ filteredKeys }) => { if (filteredKeys !== undefined) { filteredKeysIsAllNotControlled = false; } else { filteredKeysIsAllControlled = false; } }); // Return if not controlled if (filteredKeysIsAllNotControlled) { // Filter column may have been removed const keyList = (mergedColumns || []).map((column, index) => (0, _util.getColumnKey)(column, (0, _util.getColumnPos)(index))); return filterStates.filter(({ key }) => keyList.includes(key)).map(item => { const col = mergedColumns[keyList.findIndex(key => key === item.key)]; return Object.assign(Object.assign({}, item), { column: Object.assign(Object.assign({}, item.column), col), forceFiltered: col.filtered }); }); } true ? warning(filteredKeysIsAllControlled, 'usage', 'Columns should all contain `filteredValue` or not contain `filteredValue`.') : 0; return collectedStates; }, [mergedColumns, filterStates]); const filters = React.useMemo(() => generateFilterInfo(mergedFilterStates), [mergedFilterStates]); const triggerFilter = filterState => { const newFilterStates = mergedFilterStates.filter(({ key }) => key !== filterState.key); newFilterStates.push(filterState); setFilterStates(newFilterStates); onFilterChange(generateFilterInfo(newFilterStates), newFilterStates); }; const transformColumns = innerColumns => injectFilter(prefixCls, dropdownPrefixCls, innerColumns, mergedFilterStates, tableLocale, triggerFilter, getPopupContainer, undefined, rootClassName); return [transformColumns, mergedFilterStates, filters]; }; var _default = exports["default"] = useFilter; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useLazyKVMap.js": /*!******************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useLazyKVMap.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); const useLazyKVMap = (data, childrenColumnName, getRowKey) => { const mapCacheRef = React.useRef({}); function getRecordByKey(key) { var _a; if (!mapCacheRef.current || mapCacheRef.current.data !== data || mapCacheRef.current.childrenColumnName !== childrenColumnName || mapCacheRef.current.getRowKey !== getRowKey) { const kvMap = new Map(); function dig(records) { records.forEach((record, index) => { const rowKey = getRowKey(record, index); kvMap.set(rowKey, record); if (record && typeof record === 'object' && childrenColumnName in record) { dig(record[childrenColumnName] || []); } }); } dig(data); mapCacheRef.current = { data, childrenColumnName, kvMap, getRowKey }; } return (_a = mapCacheRef.current.kvMap) === null || _a === void 0 ? void 0 : _a.get(key); } return [getRecordByKey]; }; var _default = exports["default"] = useLazyKVMap; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/usePagination.js": /*!*******************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/usePagination.js ***! \*******************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = exports.DEFAULT_PAGE_SIZE = void 0; exports.getPaginationParam = getPaginationParam; var _react = __webpack_require__(/*! react */ "../../../node_modules/react/index.js"); var _extendsObject = _interopRequireDefault(__webpack_require__(/*! ../../_util/extendsObject */ "../../../node_modules/antd/lib/_util/extendsObject.js")); 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; }; const DEFAULT_PAGE_SIZE = exports.DEFAULT_PAGE_SIZE = 10; function getPaginationParam(mergedPagination, pagination) { const param = { current: mergedPagination.current, pageSize: mergedPagination.pageSize }; const paginationObj = pagination && typeof pagination === 'object' ? pagination : {}; Object.keys(paginationObj).forEach(pageProp => { const value = mergedPagination[pageProp]; if (typeof value !== 'function') { param[pageProp] = value; } }); return param; } function usePagination(total, onChange, pagination) { const _a = pagination && typeof pagination === 'object' ? pagination : {}, { total: paginationTotal = 0 } = _a, paginationObj = __rest(_a, ["total"]); const [innerPagination, setInnerPagination] = (0, _react.useState)(() => ({ current: 'defaultCurrent' in paginationObj ? paginationObj.defaultCurrent : 1, pageSize: 'defaultPageSize' in paginationObj ? paginationObj.defaultPageSize : DEFAULT_PAGE_SIZE })); // ============ Basic Pagination Config ============ const mergedPagination = (0, _extendsObject.default)(innerPagination, paginationObj, { total: paginationTotal > 0 ? paginationTotal : total }); // Reset `current` if data length or pageSize changed const maxPage = Math.ceil((paginationTotal || total) / mergedPagination.pageSize); if (mergedPagination.current > maxPage) { // Prevent a maximum page count of 0 mergedPagination.current = maxPage || 1; } const refreshPagination = (current, pageSize) => { setInnerPagination({ current: current !== null && current !== void 0 ? current : 1, pageSize: pageSize || mergedPagination.pageSize }); }; const onInternalChange = (current, pageSize) => { var _a; if (pagination) { (_a = pagination.onChange) === null || _a === void 0 ? void 0 : _a.call(pagination, current, pageSize); } refreshPagination(current, pageSize); onChange(current, pageSize || (mergedPagination === null || mergedPagination === void 0 ? void 0 : mergedPagination.pageSize)); }; if (pagination === false) { return [{}, () => {}]; } return [Object.assign(Object.assign({}, mergedPagination), { onChange: onInternalChange }), refreshPagination]; } var _default = exports["default"] = usePagination; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useSelection.js": /*!******************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useSelection.js ***! \******************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = exports.SELECTION_NONE = exports.SELECTION_INVERT = exports.SELECTION_COLUMN = exports.SELECTION_ALL = void 0; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var React = _react; var _DownOutlined = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/DownOutlined */ "../../../node_modules/@ant-design/icons/DownOutlined.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); var _rcTable = __webpack_require__(/*! rc-table */ "../../../node_modules/rc-table/es/index.js"); var _util = __webpack_require__(/*! rc-tree/lib/util */ "../../../node_modules/rc-tree/lib/util.js"); var _conductUtil = __webpack_require__(/*! rc-tree/lib/utils/conductUtil */ "../../../node_modules/rc-tree/lib/utils/conductUtil.js"); var _treeUtil = __webpack_require__(/*! rc-tree/lib/utils/treeUtil */ "../../../node_modules/rc-tree/lib/utils/treeUtil.js"); var _useMergedState = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/hooks/useMergedState */ "../../../node_modules/rc-util/lib/hooks/useMergedState.js")); var _useMultipleSelect = _interopRequireDefault(__webpack_require__(/*! ../../_util/hooks/useMultipleSelect */ "../../../node_modules/antd/lib/_util/hooks/useMultipleSelect.js")); var _warning = __webpack_require__(/*! ../../_util/warning */ "../../../node_modules/antd/lib/_util/warning.js"); var _checkbox = _interopRequireDefault(__webpack_require__(/*! ../../checkbox */ "../../../node_modules/antd/lib/checkbox/index.js")); var _dropdown = _interopRequireDefault(__webpack_require__(/*! ../../dropdown */ "../../../node_modules/antd/lib/dropdown/index.js")); var _radio = _interopRequireDefault(__webpack_require__(/*! ../../radio */ "../../../node_modules/antd/lib/radio/index.js")); // TODO: warning if use ajax!!! const SELECTION_COLUMN = exports.SELECTION_COLUMN = {}; const SELECTION_ALL = exports.SELECTION_ALL = 'SELECT_ALL'; const SELECTION_INVERT = exports.SELECTION_INVERT = 'SELECT_INVERT'; const SELECTION_NONE = exports.SELECTION_NONE = 'SELECT_NONE'; const EMPTY_LIST = []; const flattenData = (childrenColumnName, data, list = []) => { (data || []).forEach(record => { list.push(record); if (record && typeof record === 'object' && childrenColumnName in record) { flattenData(childrenColumnName, record[childrenColumnName], list); } }); return list; }; const useSelection = (config, rowSelection) => { const { preserveSelectedRowKeys, selectedRowKeys, defaultSelectedRowKeys, getCheckboxProps, onChange: onSelectionChange, onSelect, onSelectAll, onSelectInvert, onSelectNone, onSelectMultiple, columnWidth: selectionColWidth, type: selectionType, selections, fixed, renderCell: customizeRenderCell, hideSelectAll, checkStrictly = true } = rowSelection || {}; const { prefixCls, data, pageData, getRecordByKey, getRowKey, expandType, childrenColumnName, locale: tableLocale, getPopupContainer } = config; const warning = (0, _warning.devUseWarning)('Table'); // ========================= MultipleSelect ========================= const [multipleSelect, updatePrevSelectedIndex] = (0, _useMultipleSelect.default)(item => item); // ========================= Keys ========================= const [mergedSelectedKeys, setMergedSelectedKeys] = (0, _useMergedState.default)(selectedRowKeys || defaultSelectedRowKeys || EMPTY_LIST, { value: selectedRowKeys }); // ======================== Caches ======================== const preserveRecordsRef = React.useRef(new Map()); const updatePreserveRecordsCache = (0, _react.useCallback)(keys => { if (preserveSelectedRowKeys) { const newCache = new Map(); // Keep key if mark as preserveSelectedRowKeys keys.forEach(key => { let record = getRecordByKey(key); if (!record && preserveRecordsRef.current.has(key)) { record = preserveRecordsRef.current.get(key); } newCache.set(key, record); }); // Refresh to new cache preserveRecordsRef.current = newCache; } }, [getRecordByKey, preserveSelectedRowKeys]); // Update cache with selectedKeys React.useEffect(() => { updatePreserveRecordsCache(mergedSelectedKeys); }, [mergedSelectedKeys]); // Get flatten data const flattedData = (0, _react.useMemo)(() => flattenData(childrenColumnName, pageData), [childrenColumnName, pageData]); const { keyEntities } = (0, _react.useMemo)(() => { if (checkStrictly) { return { keyEntities: null }; } let convertData = data; if (preserveSelectedRowKeys) { // use flattedData keys const keysSet = new Set(flattedData.map((record, index) => getRowKey(record, index))); // remove preserveRecords that duplicate data const preserveRecords = Array.from(preserveRecordsRef.current).reduce((total, [key, value]) => keysSet.has(key) ? total : total.concat(value), []); convertData = [].concat((0, _toConsumableArray2.default)(convertData), (0, _toConsumableArray2.default)(preserveRecords)); } return (0, _treeUtil.convertDataToEntities)(convertData, { externalGetKey: getRowKey, childrenPropName: childrenColumnName }); }, [data, getRowKey, checkStrictly, childrenColumnName, preserveSelectedRowKeys, flattedData]); // Get all checkbox props const checkboxPropsMap = (0, _react.useMemo)(() => { const map = new Map(); flattedData.forEach((record, index) => { const key = getRowKey(record, index); const checkboxProps = (getCheckboxProps ? getCheckboxProps(record) : null) || {}; map.set(key, checkboxProps); true ? warning(!('checked' in checkboxProps || 'defaultChecked' in checkboxProps), 'usage', 'Do not set `checked` or `defaultChecked` in `getCheckboxProps`. Please use `selectedRowKeys` instead.') : 0; }); return map; }, [flattedData, getRowKey, getCheckboxProps]); const isCheckboxDisabled = (0, _react.useCallback)(r => { const rowKey = getRowKey(r); let checkboxProps; if (checkboxPropsMap.has(rowKey)) { checkboxProps = checkboxPropsMap.get(getRowKey(r)); } else { checkboxProps = getCheckboxProps ? getCheckboxProps(r) : undefined; } return !!(checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.disabled); }, [checkboxPropsMap, getRowKey]); const [derivedSelectedKeys, derivedHalfSelectedKeys] = (0, _react.useMemo)(() => { if (checkStrictly) { return [mergedSelectedKeys || [], []]; } const { checkedKeys, halfCheckedKeys } = (0, _conductUtil.conductCheck)(mergedSelectedKeys, true, keyEntities, isCheckboxDisabled); return [checkedKeys || [], halfCheckedKeys]; }, [mergedSelectedKeys, checkStrictly, keyEntities, isCheckboxDisabled]); const derivedSelectedKeySet = (0, _react.useMemo)(() => { const keys = selectionType === 'radio' ? derivedSelectedKeys.slice(0, 1) : derivedSelectedKeys; return new Set(keys); }, [derivedSelectedKeys, selectionType]); const derivedHalfSelectedKeySet = (0, _react.useMemo)(() => selectionType === 'radio' ? new Set() : new Set(derivedHalfSelectedKeys), [derivedHalfSelectedKeys, selectionType]); // Reset if rowSelection reset React.useEffect(() => { if (!rowSelection) { setMergedSelectedKeys(EMPTY_LIST); } }, [!!rowSelection]); const setSelectedKeys = (0, _react.useCallback)((keys, method) => { let availableKeys; let records; updatePreserveRecordsCache(keys); if (preserveSelectedRowKeys) { availableKeys = keys; records = keys.map(key => preserveRecordsRef.current.get(key)); } else { // Filter key which not exist in the `dataSource` availableKeys = []; records = []; keys.forEach(key => { const record = getRecordByKey(key); if (record !== undefined) { availableKeys.push(key); records.push(record); } }); } setMergedSelectedKeys(availableKeys); onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(availableKeys, records, { type: method }); }, [setMergedSelectedKeys, getRecordByKey, onSelectionChange, preserveSelectedRowKeys]); // ====================== Selections ====================== // Trigger single `onSelect` event const triggerSingleSelection = (0, _react.useCallback)((key, selected, keys, event) => { if (onSelect) { const rows = keys.map(k => getRecordByKey(k)); onSelect(getRecordByKey(key), selected, rows, event); } setSelectedKeys(keys, 'single'); }, [onSelect, getRecordByKey, setSelectedKeys]); const mergedSelections = (0, _react.useMemo)(() => { if (!selections || hideSelectAll) { return null; } const selectionList = selections === true ? [SELECTION_ALL, SELECTION_INVERT, SELECTION_NONE] : selections; return selectionList.map(selection => { if (selection === SELECTION_ALL) { return { key: 'all', text: tableLocale.selectionAll, onSelect() { setSelectedKeys(data.map((record, index) => getRowKey(record, index)).filter(key => { const checkProps = checkboxPropsMap.get(key); return !(checkProps === null || checkProps === void 0 ? void 0 : checkProps.disabled) || derivedSelectedKeySet.has(key); }), 'all'); } }; } if (selection === SELECTION_INVERT) { return { key: 'invert', text: tableLocale.selectInvert, onSelect() { const keySet = new Set(derivedSelectedKeySet); pageData.forEach((record, index) => { const key = getRowKey(record, index); const checkProps = checkboxPropsMap.get(key); if (!(checkProps === null || checkProps === void 0 ? void 0 : checkProps.disabled)) { if (keySet.has(key)) { keySet.delete(key); } else { keySet.add(key); } } }); const keys = Array.from(keySet); if (onSelectInvert) { warning.deprecated(false, 'onSelectInvert', 'onChange'); onSelectInvert(keys); } setSelectedKeys(keys, 'invert'); } }; } if (selection === SELECTION_NONE) { return { key: 'none', text: tableLocale.selectNone, onSelect() { onSelectNone === null || onSelectNone === void 0 ? void 0 : onSelectNone(); setSelectedKeys(Array.from(derivedSelectedKeySet).filter(key => { const checkProps = checkboxPropsMap.get(key); return checkProps === null || checkProps === void 0 ? void 0 : checkProps.disabled; }), 'none'); } }; } return selection; }).map(selection => Object.assign(Object.assign({}, selection), { onSelect: (...rest) => { var _a2; var _a; (_a = selection.onSelect) === null || _a === void 0 ? void 0 : (_a2 = _a).call.apply(_a2, [selection].concat(rest)); updatePrevSelectedIndex(null); } })); }, [selections, derivedSelectedKeySet, pageData, getRowKey, onSelectInvert, setSelectedKeys]); // ======================= Columns ======================== const transformColumns = (0, _react.useCallback)(columns => { var _a; // >>>>>>>>>>> Skip if not exists `rowSelection` if (!rowSelection) { true ? warning(!columns.includes(SELECTION_COLUMN), 'usage', '`rowSelection` is not config but `SELECTION_COLUMN` exists in the `columns`.') : 0; return columns.filter(col => col !== SELECTION_COLUMN); } // >>>>>>>>>>> Support selection let cloneColumns = (0, _toConsumableArray2.default)(columns); const keySet = new Set(derivedSelectedKeySet); // Record key only need check with enabled const recordKeys = flattedData.map(getRowKey).filter(key => !checkboxPropsMap.get(key).disabled); const checkedCurrentAll = recordKeys.every(key => keySet.has(key)); const checkedCurrentSome = recordKeys.some(key => keySet.has(key)); const onSelectAllChange = () => { const changeKeys = []; if (checkedCurrentAll) { recordKeys.forEach(key => { keySet.delete(key); changeKeys.push(key); }); } else { recordKeys.forEach(key => { if (!keySet.has(key)) { keySet.add(key); changeKeys.push(key); } }); } const keys = Array.from(keySet); onSelectAll === null || onSelectAll === void 0 ? void 0 : onSelectAll(!checkedCurrentAll, keys.map(k => getRecordByKey(k)), changeKeys.map(k => getRecordByKey(k))); setSelectedKeys(keys, 'all'); updatePrevSelectedIndex(null); }; // ===================== Render ===================== // Title Cell let title; let columnTitleCheckbox; if (selectionType !== 'radio') { let customizeSelections; if (mergedSelections) { const menu = { getPopupContainer, items: mergedSelections.map((selection, index) => { const { key, text, onSelect: onSelectionClick } = selection; return { key: key !== null && key !== void 0 ? key : index, onClick: () => { onSelectionClick === null || onSelectionClick === void 0 ? void 0 : onSelectionClick(recordKeys); }, label: text }; }) }; customizeSelections = /*#__PURE__*/React.createElement("div", { className: `${prefixCls}-selection-extra` }, /*#__PURE__*/React.createElement(_dropdown.default, { menu: menu, getPopupContainer: getPopupContainer }, /*#__PURE__*/React.createElement("span", null, /*#__PURE__*/React.createElement(_DownOutlined.default, null)))); } const allDisabledData = flattedData.map((record, index) => { const key = getRowKey(record, index); const checkboxProps = checkboxPropsMap.get(key) || {}; return Object.assign({ checked: keySet.has(key) }, checkboxProps); }).filter(({ disabled }) => disabled); const allDisabled = !!allDisabledData.length && allDisabledData.length === flattedData.length; const allDisabledAndChecked = allDisabled && allDisabledData.every(({ checked }) => checked); const allDisabledSomeChecked = allDisabled && allDisabledData.some(({ checked }) => checked); columnTitleCheckbox = /*#__PURE__*/React.createElement(_checkbox.default, { checked: !allDisabled ? !!flattedData.length && checkedCurrentAll : allDisabledAndChecked, indeterminate: !allDisabled ? !checkedCurrentAll && checkedCurrentSome : !allDisabledAndChecked && allDisabledSomeChecked, onChange: onSelectAllChange, disabled: flattedData.length === 0 || allDisabled, "aria-label": customizeSelections ? 'Custom selection' : 'Select all', skipGroup: true }); title = !hideSelectAll && (/*#__PURE__*/React.createElement("div", { className: `${prefixCls}-selection` }, columnTitleCheckbox, customizeSelections)); } // Body Cell let renderCell; if (selectionType === 'radio') { renderCell = (_, record, index) => { const key = getRowKey(record, index); const checked = keySet.has(key); const checkboxProps = checkboxPropsMap.get(key); return { node: (/*#__PURE__*/React.createElement(_radio.default, Object.assign({}, checkboxProps, { checked: checked, onClick: e => { var _a; e.stopPropagation(); (_a = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.onClick) === null || _a === void 0 ? void 0 : _a.call(checkboxProps, e); }, onChange: event => { var _a; if (!keySet.has(key)) { triggerSingleSelection(key, true, [key], event.nativeEvent); } (_a = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.onChange) === null || _a === void 0 ? void 0 : _a.call(checkboxProps, event); } }))), checked }; }; } else { renderCell = (_, record, index) => { var _a; const key = getRowKey(record, index); const checked = keySet.has(key); const indeterminate = derivedHalfSelectedKeySet.has(key); const checkboxProps = checkboxPropsMap.get(key); let mergedIndeterminate; if (expandType === 'nest') { mergedIndeterminate = indeterminate; true ? warning(typeof (checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.indeterminate) !== 'boolean', 'usage', 'set `indeterminate` using `rowSelection.getCheckboxProps` is not allowed with tree structured dataSource.') : 0; } 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, Object.assign({}, checkboxProps, { indeterminate: mergedIndeterminate, checked: checked, skipGroup: true, onClick: e => { var _a; e.stopPropagation(); (_a = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.onClick) === null || _a === void 0 ? void 0 : _a.call(checkboxProps, e); }, onChange: event => { var _a; const { nativeEvent } = event; const { shiftKey } = nativeEvent; const currentSelectedIndex = recordKeys.findIndex(item => item === key); const isMultiple = derivedSelectedKeys.some(item => recordKeys.includes(item)); if (shiftKey && checkStrictly && isMultiple) { const changedKeys = multipleSelect(currentSelectedIndex, recordKeys, keySet); const keys = Array.from(keySet); onSelectMultiple === null || onSelectMultiple === void 0 ? void 0 : onSelectMultiple(!checked, keys.map(recordKey => getRecordByKey(recordKey)), changedKeys.map(recordKey => getRecordByKey(recordKey))); setSelectedKeys(keys, 'multiple'); } else { // Single record selected const originCheckedKeys = derivedSelectedKeys; if (checkStrictly) { const checkedKeys = checked ? (0, _util.arrDel)(originCheckedKeys, key) : (0, _util.arrAdd)(originCheckedKeys, key); triggerSingleSelection(key, !checked, checkedKeys, nativeEvent); } else { // Always fill first const result = (0, _conductUtil.conductCheck)([].concat((0, _toConsumableArray2.default)(originCheckedKeys), [key]), true, keyEntities, isCheckboxDisabled); const { checkedKeys, halfCheckedKeys } = result; let nextCheckedKeys = checkedKeys; // If remove, we do it again to correction if (checked) { const tempKeySet = new Set(checkedKeys); tempKeySet.delete(key); nextCheckedKeys = (0, _conductUtil.conductCheck)(Array.from(tempKeySet), { checked: false, halfCheckedKeys }, keyEntities, isCheckboxDisabled).checkedKeys; } triggerSingleSelection(key, !checked, nextCheckedKeys, nativeEvent); } } if (checked) { updatePrevSelectedIndex(null); } else { updatePrevSelectedIndex(currentSelectedIndex); } (_a = checkboxProps === null || checkboxProps === void 0 ? void 0 : checkboxProps.onChange) === null || _a === void 0 ? void 0 : _a.call(checkboxProps, event); } }))), checked }; }; } const renderSelectionCell = (_, record, index) => { const { node, checked } = renderCell(_, record, index); if (customizeRenderCell) { return customizeRenderCell(checked, record, index, node); } return node; }; // Insert selection column if not exist if (!cloneColumns.includes(SELECTION_COLUMN)) { // Always after expand icon if (cloneColumns.findIndex(col => { var _a; return ((_a = col[_rcTable.INTERNAL_COL_DEFINE]) === null || _a === void 0 ? void 0 : _a.columnType) === 'EXPAND_COLUMN'; }) === 0) { const [expandColumn, ...restColumns] = cloneColumns; cloneColumns = [expandColumn, SELECTION_COLUMN].concat((0, _toConsumableArray2.default)(restColumns)); } else { // Normal insert at first column cloneColumns = [SELECTION_COLUMN].concat((0, _toConsumableArray2.default)(cloneColumns)); } } // Deduplicate selection column const selectionColumnIndex = cloneColumns.indexOf(SELECTION_COLUMN); true ? warning(cloneColumns.filter(col => col === SELECTION_COLUMN).length <= 1, 'usage', 'Multiple `SELECTION_COLUMN` exist in `columns`.') : 0; cloneColumns = cloneColumns.filter((column, index) => column !== SELECTION_COLUMN || index === selectionColumnIndex); // Fixed column logic const prevCol = cloneColumns[selectionColumnIndex - 1]; const nextCol = cloneColumns[selectionColumnIndex + 1]; let mergedFixed = fixed; if (mergedFixed === undefined) { if ((nextCol === null || nextCol === void 0 ? void 0 : nextCol.fixed) !== undefined) { mergedFixed = nextCol.fixed; } else if ((prevCol === null || prevCol === void 0 ? void 0 : prevCol.fixed) !== undefined) { mergedFixed = prevCol.fixed; } } if (mergedFixed && prevCol && ((_a = prevCol[_rcTable.INTERNAL_COL_DEFINE]) === null || _a === void 0 ? void 0 : _a.columnType) === 'EXPAND_COLUMN' && prevCol.fixed === undefined) { prevCol.fixed = mergedFixed; } const columnCls = (0, _classnames.default)(`${prefixCls}-selection-col`, { [`${prefixCls}-selection-col-with-dropdown`]: selections && selectionType === 'checkbox' }); const renderColumnTitle = () => { if (!(rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.columnTitle)) { return title; } if (typeof rowSelection.columnTitle === 'function') { return rowSelection.columnTitle(columnTitleCheckbox); } return rowSelection.columnTitle; }; // Replace with real selection column const selectionColumn = { fixed: mergedFixed, width: selectionColWidth, className: `${prefixCls}-selection-column`, title: renderColumnTitle(), render: renderSelectionCell, onCell: rowSelection.onCell, align: rowSelection.align, [_rcTable.INTERNAL_COL_DEFINE]: { className: columnCls } }; return cloneColumns.map(col => col === SELECTION_COLUMN ? selectionColumn : col); }, [getRowKey, flattedData, rowSelection, derivedSelectedKeys, derivedSelectedKeySet, derivedHalfSelectedKeySet, selectionColWidth, mergedSelections, expandType, checkboxPropsMap, onSelectMultiple, triggerSingleSelection, isCheckboxDisabled]); return [transformColumns, derivedSelectedKeySet]; }; var _default = exports["default"] = useSelection; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useSorter.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useSorter.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getSortData = exports["default"] = void 0; var _toConsumableArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../../../node_modules/@babel/runtime/helpers/toConsumableArray.js")); var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _CaretDownOutlined = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/CaretDownOutlined */ "../../../node_modules/@ant-design/icons/CaretDownOutlined.js")); var _CaretUpOutlined = _interopRequireDefault(__webpack_require__(/*! @ant-design/icons/CaretUpOutlined */ "../../../node_modules/@ant-design/icons/CaretUpOutlined.js")); var _classnames = _interopRequireDefault(__webpack_require__(/*! classnames */ "../../../node_modules/classnames/index.js")); var _KeyCode = _interopRequireDefault(__webpack_require__(/*! rc-util/lib/KeyCode */ "../../../node_modules/rc-util/lib/KeyCode.js")); var _tooltip = _interopRequireDefault(__webpack_require__(/*! ../../tooltip */ "../../../node_modules/antd/lib/tooltip/index.js")); var _util = __webpack_require__(/*! ../util */ "../../../node_modules/antd/lib/table/util.js"); const ASCEND = 'ascend'; const DESCEND = 'descend'; const getMultiplePriority = column => { if (typeof column.sorter === 'object' && typeof column.sorter.multiple === 'number') { return column.sorter.multiple; } return false; }; const getSortFunction = sorter => { if (typeof sorter === 'function') { return sorter; } if (sorter && typeof sorter === 'object' && sorter.compare) { return sorter.compare; } return false; }; const nextSortDirection = (sortDirections, current) => { if (!current) { return sortDirections[0]; } return sortDirections[sortDirections.indexOf(current) + 1]; }; const collectSortStates = (columns, init, pos) => { let sortStates = []; const pushState = (column, columnPos) => { sortStates.push({ column, key: (0, _util.getColumnKey)(column, columnPos), multiplePriority: getMultiplePriority(column), sortOrder: column.sortOrder }); }; (columns || []).forEach((column, index) => { const 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, key: (0, _util.getColumnKey)(column, columnPos), multiplePriority: getMultiplePriority(column), sortOrder: column.defaultSortOrder }); } } }); return sortStates; }; const injectSorter = (prefixCls, columns, sorterStates, triggerSorter, defaultSortDirections, tableLocale, tableShowSorterTooltip, pos) => { const finalColumns = (columns || []).map((column, index) => { const columnPos = (0, _util.getColumnPos)(index, pos); let newColumn = column; if (newColumn.sorter) { const sortDirections = newColumn.sortDirections || defaultSortDirections; const showSorterTooltip = newColumn.showSorterTooltip === undefined ? tableShowSorterTooltip : newColumn.showSorterTooltip; const columnKey = (0, _util.getColumnKey)(newColumn, columnPos); const sorterState = sorterStates.find(({ key }) => key === columnKey); const sortOrder = sorterState ? sorterState.sortOrder : null; const nextSortOrder = nextSortDirection(sortDirections, sortOrder); let sorter; if (column.sortIcon) { sorter = column.sortIcon({ sortOrder }); } else { const upNode = sortDirections.includes(ASCEND) && (/*#__PURE__*/React.createElement(_CaretUpOutlined.default, { className: (0, _classnames.default)(`${prefixCls}-column-sorter-up`, { active: sortOrder === ASCEND }) })); const downNode = sortDirections.includes(DESCEND) && (/*#__PURE__*/React.createElement(_CaretDownOutlined.default, { className: (0, _classnames.default)(`${prefixCls}-column-sorter-down`, { active: sortOrder === DESCEND }) })); sorter = /*#__PURE__*/React.createElement("span", { className: (0, _classnames.default)(`${prefixCls}-column-sorter`, { [`${prefixCls}-column-sorter-full`]: !!(upNode && downNode) }) }, /*#__PURE__*/React.createElement("span", { className: `${prefixCls}-column-sorter-inner`, "aria-hidden": "true" }, upNode, downNode)); } const { cancelSort, triggerAsc, triggerDesc } = tableLocale || {}; let sortTip = cancelSort; if (nextSortOrder === DESCEND) { sortTip = triggerDesc; } else if (nextSortOrder === ASCEND) { sortTip = triggerAsc; } const tooltipProps = typeof showSorterTooltip === 'object' ? Object.assign({ title: sortTip }, showSorterTooltip) : { title: sortTip }; newColumn = Object.assign(Object.assign({}, newColumn), { className: (0, _classnames.default)(newColumn.className, { [`${prefixCls}-column-sort`]: sortOrder }), title: renderProps => { const columnSortersClass = `${prefixCls}-column-sorters`; const renderColumnTitleWrapper = /*#__PURE__*/React.createElement("span", { className: `${prefixCls}-column-title` }, (0, _util.renderColumnTitle)(column.title, renderProps)); const renderSortTitle = /*#__PURE__*/React.createElement("div", { className: columnSortersClass }, renderColumnTitleWrapper, sorter); if (showSorterTooltip) { if (typeof showSorterTooltip !== 'boolean' && (showSorterTooltip === null || showSorterTooltip === void 0 ? void 0 : showSorterTooltip.target) === 'sorter-icon') { return /*#__PURE__*/React.createElement("div", { className: `${columnSortersClass} ${prefixCls}-column-sorters-tooltip-target-sorter` }, renderColumnTitleWrapper, /*#__PURE__*/React.createElement(_tooltip.default, Object.assign({}, tooltipProps), sorter)); } return /*#__PURE__*/React.createElement(_tooltip.default, Object.assign({}, tooltipProps), renderSortTitle); } return renderSortTitle; }, onHeaderCell: col => { var _a; const cell = ((_a = column.onHeaderCell) === null || _a === void 0 ? void 0 : _a.call(column, col)) || {}; const originOnClick = cell.onClick; const originOKeyDown = cell.onKeyDown; cell.onClick = event => { triggerSorter({ column, key: columnKey, sortOrder: nextSortOrder, multiplePriority: getMultiplePriority(column) }); originOnClick === null || originOnClick === void 0 ? void 0 : originOnClick(event); }; cell.onKeyDown = event => { if (event.keyCode === _KeyCode.default.ENTER) { triggerSorter({ column, key: columnKey, sortOrder: nextSortOrder, multiplePriority: getMultiplePriority(column) }); originOKeyDown === null || originOKeyDown === void 0 ? void 0 : originOKeyDown(event); } }; const renderTitle = (0, _util.safeColumnTitle)(column.title, {}); const displayTitle = renderTitle === null || renderTitle === void 0 ? void 0 : renderTitle.toString(); // Inform the screen-reader so it can tell the visually impaired user which column is sorted if (sortOrder) { cell['aria-sort'] = sortOrder === 'ascend' ? 'ascending' : 'descending'; } cell['aria-label'] = displayTitle || ''; cell.className = (0, _classnames.default)(cell.className, `${prefixCls}-column-has-sorters`); cell.tabIndex = 0; if (column.ellipsis) { cell.title = (renderTitle !== null && renderTitle !== void 0 ? renderTitle : '').toString(); } return cell; } }); } if ('children' in newColumn) { newColumn = Object.assign(Object.assign({}, newColumn), { children: injectSorter(prefixCls, newColumn.children, sorterStates, triggerSorter, defaultSortDirections, tableLocale, tableShowSorterTooltip, columnPos) }); } return newColumn; }); return finalColumns; }; const stateToInfo = sorterState => { const { column, sortOrder } = sorterState; return { column, order: sortOrder, field: column.dataIndex, columnKey: column.key }; }; const generateSorterInfo = sorterStates => { const activeSorters = sorterStates.filter(({ sortOrder }) => sortOrder).map(stateToInfo); // =========== Legacy compatible support =========== // https://github.com/ant-design/ant-design/pull/19226 if (activeSorters.length === 0 && sorterStates.length) { const lastIndex = sorterStates.length - 1; return Object.assign(Object.assign({}, stateToInfo(sorterStates[lastIndex])), { column: undefined, order: undefined, field: undefined, columnKey: undefined }); } if (activeSorters.length <= 1) { return activeSorters[0] || {}; } return activeSorters; }; const getSortData = (data, sortStates, childrenColumnName) => { const innerSorterStates = sortStates.slice().sort((a, b) => b.multiplePriority - a.multiplePriority); const cloneData = data.slice(); const runningSorters = innerSorterStates.filter(({ column: { sorter }, sortOrder }) => getSortFunction(sorter) && sortOrder); // Skip if no sorter needed if (!runningSorters.length) { return cloneData; } return cloneData.sort((record1, record2) => { for (let i = 0; i < runningSorters.length; i += 1) { const sorterState = runningSorters[i]; const { column: { sorter }, sortOrder } = sorterState; const compareFn = getSortFunction(sorter); if (compareFn && sortOrder) { const compareResult = compareFn(record1, record2, sortOrder); if (compareResult !== 0) { return sortOrder === ASCEND ? compareResult : -compareResult; } } } return 0; }).map(record => { const subRecords = record[childrenColumnName]; if (subRecords) { return Object.assign(Object.assign({}, record), { [childrenColumnName]: getSortData(subRecords, sortStates, childrenColumnName) }); } return record; }); }; exports.getSortData = getSortData; const useFilterSorter = props => { const { prefixCls, mergedColumns, sortDirections, tableLocale, showSorterTooltip, onSorterChange } = props; const [sortStates, setSortStates] = React.useState(() => collectSortStates(mergedColumns, true)); const getColumnKeys = (columns, pos) => { const newKeys = []; columns.forEach((item, index) => { const columnPos = (0, _util.getColumnPos)(index, pos); newKeys.push((0, _util.getColumnKey)(item, columnPos)); if (Array.isArray(item.children)) { const childKeys = getColumnKeys(item.children, columnPos); newKeys.push.apply(newKeys, (0, _toConsumableArray2.default)(childKeys)); } }); return newKeys; }; const mergedSorterStates = React.useMemo(() => { let validate = true; const collectedStates = collectSortStates(mergedColumns, false); // Return if not controlled if (!collectedStates.length) { const mergedColumnsKeys = getColumnKeys(mergedColumns); return sortStates.filter(({ key }) => mergedColumnsKeys.includes(key)); } const validateStates = []; function patchStates(state) { if (validate) { validateStates.push(state); } else { validateStates.push(Object.assign(Object.assign({}, state), { sortOrder: null })); } } let multipleMode = null; collectedStates.forEach(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 const columnTitleSorterProps = React.useMemo(() => { var _a, _b; const sortColumns = mergedSorterStates.map(({ column, sortOrder }) => ({ column, order: sortOrder })); return { sortColumns, // Legacy sortColumn: (_a = sortColumns[0]) === null || _a === void 0 ? void 0 : _a.column, sortOrder: (_b = sortColumns[0]) === null || _b === void 0 ? void 0 : _b.order }; }, [mergedSorterStates]); const triggerSorter = sortState => { let newSorterStates; if (sortState.multiplePriority === false || !mergedSorterStates.length || mergedSorterStates[0].multiplePriority === false) { newSorterStates = [sortState]; } else { newSorterStates = [].concat((0, _toConsumableArray2.default)(mergedSorterStates.filter(({ key }) => key !== sortState.key)), [sortState]); } setSortStates(newSorterStates); onSorterChange(generateSorterInfo(newSorterStates), newSorterStates); }; const transformColumns = innerColumns => injectSorter(prefixCls, innerColumns, mergedSorterStates, triggerSorter, sortDirections, tableLocale, showSorterTooltip); const getSorters = () => generateSorterInfo(mergedSorterStates); return [transformColumns, mergedSorterStates, columnTitleSorterProps, getSorters]; }; var _default = exports["default"] = useFilterSorter; /***/ }), /***/ "../../../node_modules/antd/lib/table/hooks/useTitleColumns.js": /*!*********************************************************************!*\ !*** ../../../node_modules/antd/lib/table/hooks/useTitleColumns.js ***! \*********************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireWildcard = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireWildcard */ "../../../node_modules/@babel/runtime/helpers/interopRequireWildcard.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var React = _interopRequireWildcard(__webpack_require__(/*! react */ "../../../node_modules/react/index.js")); var _util = __webpack_require__(/*! ../util */ "../../../node_modules/antd/lib/table/util.js"); const fillTitle = (columns, columnTitleProps) => { const finalColumns = columns.map(column => { const cloneColumn = Object.assign({}, column); cloneColumn.title = (0, _util.renderColumnTitle)(column.title, columnTitleProps); if ('children' in cloneColumn) { cloneColumn.children = fillTitle(cloneColumn.children, columnTitleProps); } return cloneColumn; }); return finalColumns; }; const useTitleColumns = columnTitleProps => { const filledColumns = React.useCallback(columns => fillTitle(columns, columnTitleProps), [columnTitleProps]); return [filledColumns]; }; var _default = exports["default"] = useTitleColumns; /***/ }), /***/ "../../../node_modules/antd/lib/table/index.js": /*!*****************************************************!*\ !*** ../../../node_modules/antd/lib/table/index.js ***! \*****************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { "use client"; var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _Table = _interopRequireDefault(__webpack_require__(/*! ./Table */ "../../../node_modules/antd/lib/table/Table.js")); var _default = exports["default"] = _Table.default; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/bordered.js": /*!**************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/bordered.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genBorderedStyle = token => { const { componentCls, lineWidth, lineType, tableBorderColor, tableHeaderBg, tablePaddingVertical, tablePaddingHorizontal, calc } = token; const tableBorder = `${(0, _cssinjs.unit)(lineWidth)} ${lineType} ${tableBorderColor}`; const getSizeBorderStyle = (size, paddingVertical, paddingHorizontal) => ({ [`&${componentCls}-${size}`]: { [`> ${componentCls}-container`]: { [`> ${componentCls}-content, > ${componentCls}-body`]: { [` > table > tbody > tr > th, > table > tbody > tr > td `]: { [`> ${componentCls}-expanded-row-fixed`]: { margin: `${(0, _cssinjs.unit)(calc(paddingVertical).mul(-1).equal())} ${(0, _cssinjs.unit)(calc(calc(paddingHorizontal).add(lineWidth)).mul(-1).equal())}` } } } } } }); return { [`${componentCls}-wrapper`]: { [`${componentCls}${componentCls}-bordered`]: Object.assign(Object.assign(Object.assign({ // ============================ Title ============================= [`> ${componentCls}-title`]: { border: tableBorder, borderBottom: 0 }, // ============================ Content ============================ [`> ${componentCls}-container`]: { borderInlineStart: tableBorder, borderTop: tableBorder, [` > ${componentCls}-content, > ${componentCls}-header, > ${componentCls}-body, > ${componentCls}-summary `]: { '> table': { // ============================= Cell ============================= [` > thead > tr > th, > thead > tr > td, > tbody > tr > th, > tbody > tr > td, > tfoot > tr > th, > tfoot > tr > td `]: { borderInlineEnd: tableBorder }, // ============================ Header ============================ '> thead': { '> tr:not(:last-child) > th': { borderBottom: tableBorder }, '> tr > th::before': { backgroundColor: 'transparent !important' } }, // Fixed right should provides additional border [` > thead > tr, > tbody > tr, > tfoot > tr `]: { [`> ${componentCls}-cell-fix-right-first::after`]: { borderInlineEnd: tableBorder } }, // ========================== Expandable ========================== [` > tbody > tr > th, > tbody > tr > td `]: { [`> ${componentCls}-expanded-row-fixed`]: { margin: `${(0, _cssinjs.unit)(calc(tablePaddingVertical).mul(-1).equal())} ${(0, _cssinjs.unit)(calc(calc(tablePaddingHorizontal).add(lineWidth)).mul(-1).equal())}`, '&::after': { position: 'absolute', top: 0, insetInlineEnd: lineWidth, bottom: 0, borderInlineEnd: tableBorder, content: '""' } } } } } }, // ============================ Scroll ============================ [`&${componentCls}-scroll-horizontal`]: { [`> ${componentCls}-container > ${componentCls}-body`]: { '> table > tbody': { [` > tr${componentCls}-expanded-row, > tr${componentCls}-placeholder `]: { '> th, > td': { borderInlineEnd: 0 } } } } } }, getSizeBorderStyle('middle', token.tablePaddingVerticalMiddle, token.tablePaddingHorizontalMiddle)), getSizeBorderStyle('small', token.tablePaddingVerticalSmall, token.tablePaddingHorizontalSmall)), { // ============================ Footer ============================ [`> ${componentCls}-footer`]: { border: tableBorder, borderTop: 0 } }), // ============================ Nested ============================ [`${componentCls}-cell`]: { [`${componentCls}-container:first-child`]: { // :first-child to avoid the case when bordered and title is set borderTop: 0 }, // https://github.com/ant-design/ant-design/issues/35577 '&-scrollbar:not([rowspan])': { boxShadow: `0 ${(0, _cssinjs.unit)(lineWidth)} 0 ${(0, _cssinjs.unit)(lineWidth)} ${tableHeaderBg}` } }, [`${componentCls}-bordered ${componentCls}-cell-scrollbar`]: { borderInlineEnd: tableBorder } } }; }; var _default = exports["default"] = genBorderedStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/ellipsis.js": /*!**************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/ellipsis.js ***! \**************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _style = __webpack_require__(/*! ../../style */ "../../../node_modules/antd/lib/style/index.js"); const genEllipsisStyle = token => { const { componentCls } = token; return { [`${componentCls}-wrapper`]: { [`${componentCls}-cell-ellipsis`]: Object.assign(Object.assign({}, _style.textEllipsis), { wordBreak: 'keep-all', // Fixed first or last should special process [` &${componentCls}-cell-fix-left-last, &${componentCls}-cell-fix-right-first `]: { overflow: 'visible', [`${componentCls}-cell-content`]: { display: 'block', overflow: 'hidden', textOverflow: 'ellipsis' } }, [`${componentCls}-column-title`]: { overflow: 'hidden', textOverflow: 'ellipsis', wordBreak: 'keep-all' } }) } }; }; var _default = exports["default"] = genEllipsisStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/empty.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/empty.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; // ========================= Placeholder ========================== const genEmptyStyle = token => { const { componentCls } = token; return { [`${componentCls}-wrapper`]: { [`${componentCls}-tbody > tr${componentCls}-placeholder`]: { textAlign: 'center', color: token.colorTextDisabled, [` &:hover > th, &:hover > td, `]: { background: token.colorBgContainer } } } }; }; var _default = exports["default"] = genEmptyStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/expand.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/expand.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _style = __webpack_require__(/*! ../../style */ "../../../node_modules/antd/lib/style/index.js"); const genExpandStyle = token => { const { componentCls, antCls, motionDurationSlow, lineWidth, paddingXS, lineType, tableBorderColor, tableExpandIconBg, tableExpandColumnWidth, borderRadius, tablePaddingVertical, tablePaddingHorizontal, tableExpandedRowBg, paddingXXS, expandIconMarginTop, expandIconSize, expandIconHalfInner, expandIconScale, calc } = token; const tableBorder = `${(0, _cssinjs.unit)(lineWidth)} ${lineType} ${tableBorderColor}`; const expandIconLineOffset = calc(paddingXXS).sub(lineWidth).equal(); return { [`${componentCls}-wrapper`]: { [`${componentCls}-expand-icon-col`]: { width: tableExpandColumnWidth }, [`${componentCls}-row-expand-icon-cell`]: { textAlign: 'center', [`${componentCls}-row-expand-icon`]: { display: 'inline-flex', float: 'none', verticalAlign: 'sub' } }, [`${componentCls}-row-indent`]: { height: 1, float: 'left' }, [`${componentCls}-row-expand-icon`]: Object.assign(Object.assign({}, (0, _style.operationUnit)(token)), { position: 'relative', float: 'left', width: expandIconSize, height: expandIconSize, color: 'inherit', lineHeight: (0, _cssinjs.unit)(expandIconSize), background: tableExpandIconBg, border: tableBorder, borderRadius, transform: `scale(${expandIconScale})`, '&:focus, &:hover, &:active': { borderColor: 'currentcolor' }, '&::before, &::after': { position: 'absolute', background: 'currentcolor', transition: `transform ${motionDurationSlow} ease-out`, content: '""' }, '&::before': { top: expandIconHalfInner, insetInlineEnd: expandIconLineOffset, insetInlineStart: expandIconLineOffset, height: lineWidth }, '&::after': { top: expandIconLineOffset, bottom: expandIconLineOffset, insetInlineStart: expandIconHalfInner, width: lineWidth, transform: 'rotate(90deg)' }, // Motion effect '&-collapsed::before': { transform: 'rotate(-180deg)' }, '&-collapsed::after': { transform: 'rotate(0deg)' }, '&-spaced': { '&::before, &::after': { display: 'none', content: 'none' }, background: 'transparent', border: 0, visibility: 'hidden' } }), [`${componentCls}-row-indent + ${componentCls}-row-expand-icon`]: { marginTop: expandIconMarginTop, marginInlineEnd: paddingXS }, [`tr${componentCls}-expanded-row`]: { '&, &:hover': { '> th, > td': { background: tableExpandedRowBg } }, // https://github.com/ant-design/ant-design/issues/25573 [`${antCls}-descriptions-view`]: { display: 'flex', table: { flex: 'auto', width: '100%' } } }, // With fixed [`${componentCls}-expanded-row-fixed`]: { position: 'relative', margin: `${(0, _cssinjs.unit)(calc(tablePaddingVertical).mul(-1).equal())} ${(0, _cssinjs.unit)(calc(tablePaddingHorizontal).mul(-1).equal())}`, padding: `${(0, _cssinjs.unit)(tablePaddingVertical)} ${(0, _cssinjs.unit)(tablePaddingHorizontal)}` } } }; }; var _default = exports["default"] = genExpandStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/filter.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/filter.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _style = __webpack_require__(/*! ../../style */ "../../../node_modules/antd/lib/style/index.js"); const genFilterStyle = token => { const { componentCls, antCls, iconCls, tableFilterDropdownWidth, tableFilterDropdownSearchWidth, paddingXXS, paddingXS, colorText, lineWidth, lineType, tableBorderColor, headerIconColor, fontSizeSM, tablePaddingHorizontal, borderRadius, motionDurationSlow, colorIcon, colorPrimary, tableHeaderFilterActiveBg, colorTextDisabled, tableFilterDropdownBg, tableFilterDropdownHeight, controlItemBgHover, controlItemBgActive, boxShadowSecondary, filterDropdownMenuBg, calc } = token; const dropdownPrefixCls = `${antCls}-dropdown`; const tableFilterDropdownPrefixCls = `${componentCls}-filter-dropdown`; const treePrefixCls = `${antCls}-tree`; const tableBorder = `${(0, _cssinjs.unit)(lineWidth)} ${lineType} ${tableBorderColor}`; return [{ [`${componentCls}-wrapper`]: { [`${componentCls}-filter-column`]: { display: 'flex', justifyContent: 'space-between' }, [`${componentCls}-filter-trigger`]: { position: 'relative', display: 'flex', alignItems: 'center', marginBlock: calc(paddingXXS).mul(-1).equal(), marginInline: `${(0, _cssinjs.unit)(paddingXXS)} ${(0, _cssinjs.unit)(calc(tablePaddingHorizontal).div(2).mul(-1).equal())}`, padding: `0 ${(0, _cssinjs.unit)(paddingXXS)}`, color: headerIconColor, fontSize: fontSizeSM, borderRadius, cursor: 'pointer', transition: `all ${motionDurationSlow}`, '&:hover': { color: colorIcon, background: tableHeaderFilterActiveBg }, '&.active': { color: colorPrimary } } } }, { // Dropdown [`${antCls}-dropdown`]: { [tableFilterDropdownPrefixCls]: Object.assign(Object.assign({}, (0, _style.resetComponent)(token)), { minWidth: tableFilterDropdownWidth, backgroundColor: tableFilterDropdownBg, borderRadius, boxShadow: boxShadowSecondary, overflow: 'hidden', // Reset menu [`${dropdownPrefixCls}-menu`]: { // https://github.com/ant-design/ant-design/issues/4916 // https://github.com/ant-design/ant-design/issues/19542 maxHeight: tableFilterDropdownHeight, overflowX: 'hidden', border: 0, boxShadow: 'none', borderRadius: 'unset', backgroundColor: filterDropdownMenuBg, '&:empty::after': { display: 'block', padding: `${(0, _cssinjs.unit)(paddingXS)} 0`, color: colorTextDisabled, fontSize: fontSizeSM, textAlign: 'center', content: '"Not Found"' } }, [`${tableFilterDropdownPrefixCls}-tree`]: { paddingBlock: `${(0, _cssinjs.unit)(paddingXS)} 0`, paddingInline: paddingXS, [treePrefixCls]: { padding: 0 }, [`${treePrefixCls}-treenode ${treePrefixCls}-node-content-wrapper:hover`]: { backgroundColor: controlItemBgHover }, [`${treePrefixCls}-treenode-checkbox-checked ${treePrefixCls}-node-content-wrapper`]: { '&, &:hover': { backgroundColor: controlItemBgActive } } }, [`${tableFilterDropdownPrefixCls}-search`]: { padding: paddingXS, borderBottom: tableBorder, '&-input': { input: { minWidth: tableFilterDropdownSearchWidth }, [iconCls]: { color: colorTextDisabled } } }, [`${tableFilterDropdownPrefixCls}-checkall`]: { width: '100%', marginBottom: paddingXXS, marginInlineStart: paddingXXS }, // Operation [`${tableFilterDropdownPrefixCls}-btns`]: { display: 'flex', justifyContent: 'space-between', padding: `${(0, _cssinjs.unit)(calc(paddingXS).sub(lineWidth).equal())} ${(0, _cssinjs.unit)(paddingXS)}`, overflow: 'hidden', borderTop: tableBorder } }) } }, // Dropdown Menu & SubMenu { // submenu of table filter dropdown [`${antCls}-dropdown ${tableFilterDropdownPrefixCls}, ${tableFilterDropdownPrefixCls}-submenu`]: { // Checkbox [`${antCls}-checkbox-wrapper + span`]: { paddingInlineStart: paddingXS, color: colorText }, '> ul': { maxHeight: 'calc(100vh - 130px)', overflowX: 'hidden', overflowY: 'auto' } } }]; }; var _default = exports["default"] = genFilterStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/fixed.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/fixed.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const genFixedStyle = token => { const { componentCls, lineWidth, colorSplit, motionDurationSlow, zIndexTableFixed, tableBg, zIndexTableSticky, calc } = token; const shadowColor = colorSplit; // Follow style is magic of shadow which should not follow token: return { [`${componentCls}-wrapper`]: { [` ${componentCls}-cell-fix-left, ${componentCls}-cell-fix-right `]: { position: 'sticky !important', zIndex: zIndexTableFixed, background: tableBg }, [` ${componentCls}-cell-fix-left-first::after, ${componentCls}-cell-fix-left-last::after `]: { position: 'absolute', top: 0, right: { _skip_check_: true, value: 0 }, bottom: calc(lineWidth).mul(-1).equal(), width: 30, transform: 'translateX(100%)', transition: `box-shadow ${motionDurationSlow}`, content: '""', pointerEvents: 'none' }, [`${componentCls}-cell-fix-left-all::after`]: { display: 'none' }, [` ${componentCls}-cell-fix-right-first::after, ${componentCls}-cell-fix-right-last::after `]: { position: 'absolute', top: 0, bottom: calc(lineWidth).mul(-1).equal(), left: { _skip_check_: true, value: 0 }, width: 30, transform: 'translateX(-100%)', transition: `box-shadow ${motionDurationSlow}`, content: '""', pointerEvents: 'none' }, [`${componentCls}-container`]: { position: 'relative', '&::before, &::after': { position: 'absolute', top: 0, bottom: 0, zIndex: calc(zIndexTableSticky).add(1).equal({ unit: false }), width: 30, transition: `box-shadow ${motionDurationSlow}`, content: '""', pointerEvents: 'none' }, '&::before': { insetInlineStart: 0 }, '&::after': { insetInlineEnd: 0 } }, [`${componentCls}-ping-left`]: { [`&:not(${componentCls}-has-fix-left) ${componentCls}-container::before`]: { boxShadow: `inset 10px 0 8px -8px ${shadowColor}` }, [` ${componentCls}-cell-fix-left-first::after, ${componentCls}-cell-fix-left-last::after `]: { boxShadow: `inset 10px 0 8px -8px ${shadowColor}` }, [`${componentCls}-cell-fix-left-last::before`]: { backgroundColor: 'transparent !important' } }, [`${componentCls}-ping-right`]: { [`&:not(${componentCls}-has-fix-right) ${componentCls}-container::after`]: { boxShadow: `inset -10px 0 8px -8px ${shadowColor}` }, [` ${componentCls}-cell-fix-right-first::after, ${componentCls}-cell-fix-right-last::after `]: { boxShadow: `inset -10px 0 8px -8px ${shadowColor}` } }, // Gapped fixed Columns do not show the shadow [`${componentCls}-fixed-column-gapped`]: { [` ${componentCls}-cell-fix-left-first::after, ${componentCls}-cell-fix-left-last::after, ${componentCls}-cell-fix-right-first::after, ${componentCls}-cell-fix-right-last::after `]: { boxShadow: 'none' } } } }; }; var _default = exports["default"] = genFixedStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/index.js": /*!***********************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/index.js ***! \***********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { var _interopRequireDefault = (__webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../../../node_modules/@babel/runtime/helpers/interopRequireDefault.js")["default"]); Object.defineProperty(exports, "__esModule", ({ value: true })); exports.prepareComponentToken = exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); var _fastColor = __webpack_require__(/*! @ant-design/fast-color */ "../../../node_modules/@ant-design/fast-color/es/index.js"); var _style = __webpack_require__(/*! ../../style */ "../../../node_modules/antd/lib/style/index.js"); var _internal = __webpack_require__(/*! ../../theme/internal */ "../../../node_modules/antd/lib/theme/internal.js"); var _bordered = _interopRequireDefault(__webpack_require__(/*! ./bordered */ "../../../node_modules/antd/lib/table/style/bordered.js")); var _ellipsis = _interopRequireDefault(__webpack_require__(/*! ./ellipsis */ "../../../node_modules/antd/lib/table/style/ellipsis.js")); var _empty = _interopRequireDefault(__webpack_require__(/*! ./empty */ "../../../node_modules/antd/lib/table/style/empty.js")); var _expand = _interopRequireDefault(__webpack_require__(/*! ./expand */ "../../../node_modules/antd/lib/table/style/expand.js")); var _filter = _interopRequireDefault(__webpack_require__(/*! ./filter */ "../../../node_modules/antd/lib/table/style/filter.js")); var _fixed = _interopRequireDefault(__webpack_require__(/*! ./fixed */ "../../../node_modules/antd/lib/table/style/fixed.js")); var _pagination = _interopRequireDefault(__webpack_require__(/*! ./pagination */ "../../../node_modules/antd/lib/table/style/pagination.js")); var _radius = _interopRequireDefault(__webpack_require__(/*! ./radius */ "../../../node_modules/antd/lib/table/style/radius.js")); var _rtl = _interopRequireDefault(__webpack_require__(/*! ./rtl */ "../../../node_modules/antd/lib/table/style/rtl.js")); var _selection = _interopRequireDefault(__webpack_require__(/*! ./selection */ "../../../node_modules/antd/lib/table/style/selection.js")); var _size = _interopRequireDefault(__webpack_require__(/*! ./size */ "../../../node_modules/antd/lib/table/style/size.js")); var _sorter = _interopRequireDefault(__webpack_require__(/*! ./sorter */ "../../../node_modules/antd/lib/table/style/sorter.js")); var _sticky = _interopRequireDefault(__webpack_require__(/*! ./sticky */ "../../../node_modules/antd/lib/table/style/sticky.js")); var _summary = _interopRequireDefault(__webpack_require__(/*! ./summary */ "../../../node_modules/antd/lib/table/style/summary.js")); var _virtual = _interopRequireDefault(__webpack_require__(/*! ./virtual */ "../../../node_modules/antd/lib/table/style/virtual.js")); const genTableStyle = token => { const { componentCls, fontWeightStrong, tablePaddingVertical, tablePaddingHorizontal, tableExpandColumnWidth, lineWidth, lineType, tableBorderColor, tableFontSize, tableBg, tableRadius, tableHeaderTextColor, motionDurationMid, tableHeaderBg, tableHeaderCellSplitColor, tableFooterTextColor, tableFooterBg, calc } = token; const tableBorder = `${(0, _cssinjs.unit)(lineWidth)} ${lineType} ${tableBorderColor}`; return { [`${componentCls}-wrapper`]: Object.assign(Object.assign({ clear: 'both', maxWidth: '100%', // fix https://github.com/ant-design/ant-design/issues/46177 ['--rc-virtual-list-scrollbar-bg']: token.tableScrollBg }, (0, _style.clearFix)()), { [componentCls]: Object.assign(Object.assign({}, (0, _style.resetComponent)(token)), { fontSize: tableFontSize, background: tableBg, borderRadius: `${(0, _cssinjs.unit)(tableRadius)} ${(0, _cssinjs.unit)(tableRadius)} 0 0`, // https://github.com/ant-design/ant-design/issues/47486 scrollbarColor: `${token.tableScrollThumbBg} ${token.tableScrollBg}` }), // https://github.com/ant-design/ant-design/issues/17611 table: { width: '100%', textAlign: 'start', borderRadius: `${(0, _cssinjs.unit)(tableRadius)} ${(0, _cssinjs.unit)(tableRadius)} 0 0`, borderCollapse: 'separate', borderSpacing: 0 }, // ============================= Cell ============================== [` ${componentCls}-cell, ${componentCls}-thead > tr > th, ${componentCls}-tbody > tr > th, ${componentCls}-tbody > tr > td, tfoot > tr > th, tfoot > tr > td `]: { position: 'relative', padding: `${(0, _cssinjs.unit)(tablePaddingVertical)} ${(0, _cssinjs.unit)(tablePaddingHorizontal)}`, overflowWrap: 'break-word' }, // ============================ Title ============================= [`${componentCls}-title`]: { padding: `${(0, _cssinjs.unit)(tablePaddingVertical)} ${(0, _cssinjs.unit)(tablePaddingHorizontal)}` }, // ============================ Header ============================ [`${componentCls}-thead`]: { [` > tr > th, > tr > td `]: { position: 'relative', color: tableHeaderTextColor, fontWeight: fontWeightStrong, textAlign: 'start', background: tableHeaderBg, borderBottom: tableBorder, transition: `background ${motionDurationMid} ease`, "&[colspan]:not([colspan='1'])": { textAlign: 'center' }, [`&:not(:last-child):not(${componentCls}-selection-column):not(${componentCls}-row-expand-icon-cell):not([colspan])::before`]: { position: 'absolute', top: '50%', insetInlineEnd: 0, width: 1, height: '1.6em', backgroundColor: tableHeaderCellSplitColor, transform: 'translateY(-50%)', transition: `background-color ${motionDurationMid}`, content: '""' } }, '> tr:not(:last-child) > th[colspan]': { borderBottom: 0 } }, // ============================ Body ============================ [`${componentCls}-tbody`]: { '> tr': { '> th, > td': { transition: `background ${motionDurationMid}, border-color ${motionDurationMid}`, borderBottom: tableBorder, // ========================= Nest Table =========================== [` > ${componentCls}-wrapper:only-child, > ${componentCls}-expanded-row-fixed > ${componentCls}-wrapper:only-child `]: { [componentCls]: { marginBlock: (0, _cssinjs.unit)(calc(tablePaddingVertical).mul(-1).equal()), marginInline: `${(0, _cssinjs.unit)(calc(tableExpandColumnWidth).sub(tablePaddingHorizontal).equal())} ${(0, _cssinjs.unit)(calc(tablePaddingHorizontal).mul(-1).equal())}`, [`${componentCls}-tbody > tr:last-child > td`]: { borderBottomWidth: 0, '&:first-child, &:last-child': { borderRadius: 0 } } } } }, '> th': { position: 'relative', color: tableHeaderTextColor, fontWeight: fontWeightStrong, textAlign: 'start', background: tableHeaderBg, borderBottom: tableBorder, transition: `background ${motionDurationMid} ease` } } }, // ============================ Footer ============================ [`${componentCls}-footer`]: { padding: `${(0, _cssinjs.unit)(tablePaddingVertical)} ${(0, _cssinjs.unit)(tablePaddingHorizontal)}`, color: tableFooterTextColor, background: tableFooterBg } }) }; }; const prepareComponentToken = token => { const { colorFillAlter, colorBgContainer, colorTextHeading, colorFillSecondary, colorFillContent, controlItemBgActive, controlItemBgActiveHover, padding, paddingSM, paddingXS, colorBorderSecondary, borderRadiusLG, controlHeight, colorTextPlaceholder, fontSize, fontSizeSM, lineHeight, lineWidth, colorIcon, colorIconHover, opacityLoading, controlInteractiveSize } = token; const colorFillSecondarySolid = new _fastColor.FastColor(colorFillSecondary).onBackground(colorBgContainer).toHexString(); const colorFillContentSolid = new _fastColor.FastColor(colorFillContent).onBackground(colorBgContainer).toHexString(); const colorFillAlterSolid = new _fastColor.FastColor(colorFillAlter).onBackground(colorBgContainer).toHexString(); const baseColorAction = new _fastColor.FastColor(colorIcon); const baseColorActionHover = new _fastColor.FastColor(colorIconHover); const expandIconHalfInner = controlInteractiveSize / 2 - lineWidth; const expandIconSize = expandIconHalfInner * 2 + lineWidth * 3; return { headerBg: colorFillAlterSolid, headerColor: colorTextHeading, headerSortActiveBg: colorFillSecondarySolid, headerSortHoverBg: colorFillContentSolid, bodySortBg: colorFillAlterSolid, rowHoverBg: colorFillAlterSolid, rowSelectedBg: controlItemBgActive, rowSelectedHoverBg: controlItemBgActiveHover, rowExpandedBg: colorFillAlter, cellPaddingBlock: padding, cellPaddingInline: padding, cellPaddingBlockMD: paddingSM, cellPaddingInlineMD: paddingXS, cellPaddingBlockSM: paddingXS, cellPaddingInlineSM: paddingXS, borderColor: colorBorderSecondary, headerBorderRadius: borderRadiusLG, footerBg: colorFillAlterSolid, footerColor: colorTextHeading, cellFontSize: fontSize, cellFontSizeMD: fontSize, cellFontSizeSM: fontSize, headerSplitColor: colorBorderSecondary, fixedHeaderSortActiveBg: colorFillSecondarySolid, headerFilterHoverBg: colorFillContent, filterDropdownMenuBg: colorBgContainer, filterDropdownBg: colorBgContainer, expandIconBg: colorBgContainer, selectionColumnWidth: controlHeight, stickyScrollBarBg: colorTextPlaceholder, stickyScrollBarBorderRadius: 100, expandIconMarginTop: (fontSize * lineHeight - lineWidth * 3) / 2 - Math.ceil((fontSizeSM * 1.4 - lineWidth * 3) / 2), headerIconColor: baseColorAction.clone().setA(baseColorAction.a * opacityLoading).toRgbString(), headerIconHoverColor: baseColorActionHover.clone().setA(baseColorActionHover.a * opacityLoading).toRgbString(), expandIconHalfInner, expandIconSize, expandIconScale: controlInteractiveSize / expandIconSize }; }; exports.prepareComponentToken = prepareComponentToken; const zIndexTableFixed = 2; // ============================== Export ============================== var _default = exports["default"] = (0, _internal.genStyleHooks)('Table', token => { const { colorTextHeading, colorSplit, colorBgContainer, controlInteractiveSize: checkboxSize, headerBg, headerColor, headerSortActiveBg, headerSortHoverBg, bodySortBg, rowHoverBg, rowSelectedBg, rowSelectedHoverBg, rowExpandedBg, cellPaddingBlock, cellPaddingInline, cellPaddingBlockMD, cellPaddingInlineMD, cellPaddingBlockSM, cellPaddingInlineSM, borderColor, footerBg, footerColor, headerBorderRadius, cellFontSize, cellFontSizeMD, cellFontSizeSM, headerSplitColor, fixedHeaderSortActiveBg, headerFilterHoverBg, filterDropdownBg, expandIconBg, selectionColumnWidth, stickyScrollBarBg, calc } = token; const tableToken = (0, _internal.mergeToken)(token, { tableFontSize: cellFontSize, tableBg: colorBgContainer, tableRadius: headerBorderRadius, tablePaddingVertical: cellPaddingBlock, tablePaddingHorizontal: cellPaddingInline, tablePaddingVerticalMiddle: cellPaddingBlockMD, tablePaddingHorizontalMiddle: cellPaddingInlineMD, tablePaddingVerticalSmall: cellPaddingBlockSM, tablePaddingHorizontalSmall: cellPaddingInlineSM, tableBorderColor: borderColor, tableHeaderTextColor: headerColor, tableHeaderBg: headerBg, tableFooterTextColor: footerColor, tableFooterBg: footerBg, tableHeaderCellSplitColor: headerSplitColor, tableHeaderSortBg: headerSortActiveBg, tableHeaderSortHoverBg: headerSortHoverBg, tableBodySortBg: bodySortBg, tableFixedHeaderSortActiveBg: fixedHeaderSortActiveBg, tableHeaderFilterActiveBg: headerFilterHoverBg, tableFilterDropdownBg: filterDropdownBg, tableRowHoverBg: rowHoverBg, tableSelectedRowBg: rowSelectedBg, tableSelectedRowHoverBg: rowSelectedHoverBg, zIndexTableFixed, zIndexTableSticky: calc(zIndexTableFixed).add(1).equal({ unit: false }), tableFontSizeMiddle: cellFontSizeMD, tableFontSizeSmall: cellFontSizeSM, tableSelectionColumnWidth: selectionColumnWidth, tableExpandIconBg: expandIconBg, tableExpandColumnWidth: calc(checkboxSize).add(calc(token.padding).mul(2)).equal(), tableExpandedRowBg: rowExpandedBg, // Dropdown tableFilterDropdownWidth: 120, tableFilterDropdownHeight: 264, tableFilterDropdownSearchWidth: 140, // Virtual Scroll Bar tableScrollThumbSize: 8, // Mac scroll bar size tableScrollThumbBg: stickyScrollBarBg, tableScrollThumbBgHover: colorTextHeading, tableScrollBg: colorSplit }); return [genTableStyle(tableToken), (0, _pagination.default)(tableToken), (0, _summary.default)(tableToken), (0, _sorter.default)(tableToken), (0, _filter.default)(tableToken), (0, _bordered.default)(tableToken), (0, _radius.default)(tableToken), (0, _expand.default)(tableToken), (0, _summary.default)(tableToken), (0, _empty.default)(tableToken), (0, _selection.default)(tableToken), (0, _fixed.default)(tableToken), (0, _sticky.default)(tableToken), (0, _ellipsis.default)(tableToken), (0, _size.default)(tableToken), (0, _rtl.default)(tableToken), (0, _virtual.default)(tableToken)]; }, prepareComponentToken, { unitless: { expandIconScale: true } }); /***/ }), /***/ "../../../node_modules/antd/lib/table/style/pagination.js": /*!****************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/pagination.js ***! \****************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genPaginationStyle = token => { const { componentCls, antCls, margin } = token; return { [`${componentCls}-wrapper`]: { // ========================== Pagination ========================== [`${componentCls}-pagination${antCls}-pagination`]: { margin: `${(0, _cssinjs.unit)(margin)} 0` }, [`${componentCls}-pagination`]: { display: 'flex', flexWrap: 'wrap', rowGap: token.paddingXS, '> *': { flex: 'none' }, '&-left': { justifyContent: 'flex-start' }, '&-center': { justifyContent: 'center' }, '&-right': { justifyContent: 'flex-end' } } } }; }; var _default = exports["default"] = genPaginationStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/radius.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/radius.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genRadiusStyle = token => { const { componentCls, tableRadius } = token; return { [`${componentCls}-wrapper`]: { [componentCls]: { // https://github.com/ant-design/ant-design/issues/39115#issuecomment-1362314574 [`${componentCls}-title, ${componentCls}-header`]: { borderRadius: `${(0, _cssinjs.unit)(tableRadius)} ${(0, _cssinjs.unit)(tableRadius)} 0 0` }, [`${componentCls}-title + ${componentCls}-container`]: { borderStartStartRadius: 0, borderStartEndRadius: 0, // https://github.com/ant-design/ant-design/issues/41975 [`${componentCls}-header, table`]: { borderRadius: 0 }, 'table > thead > tr:first-child': { 'th:first-child, th:last-child, td:first-child, td:last-child': { borderRadius: 0 } } }, '&-container': { borderStartStartRadius: tableRadius, borderStartEndRadius: tableRadius, 'table > thead > tr:first-child': { '> *:first-child': { borderStartStartRadius: tableRadius }, '> *:last-child': { borderStartEndRadius: tableRadius } } }, '&-footer': { borderRadius: `0 0 ${(0, _cssinjs.unit)(tableRadius)} ${(0, _cssinjs.unit)(tableRadius)}` } } } }; }; var _default = exports["default"] = genRadiusStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/rtl.js": /*!*********************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/rtl.js ***! \*********************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const genStyle = token => { const { componentCls } = token; return { [`${componentCls}-wrapper-rtl`]: { direction: 'rtl', table: { direction: 'rtl' }, [`${componentCls}-pagination-left`]: { justifyContent: 'flex-end' }, [`${componentCls}-pagination-right`]: { justifyContent: 'flex-start' }, [`${componentCls}-row-expand-icon`]: { float: 'right', '&::after': { transform: 'rotate(-90deg)' }, '&-collapsed::before': { transform: 'rotate(180deg)' }, '&-collapsed::after': { transform: 'rotate(0deg)' } }, [`${componentCls}-container`]: { '&::before': { insetInlineStart: 'unset', insetInlineEnd: 0 }, '&::after': { insetInlineStart: 0, insetInlineEnd: 'unset' }, [`${componentCls}-row-indent`]: { float: 'right' } } } }; }; var _default = exports["default"] = genStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/selection.js": /*!***************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/selection.js ***! \***************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genSelectionStyle = token => { const { componentCls, antCls, iconCls, fontSizeIcon, padding, paddingXS, headerIconColor, headerIconHoverColor, tableSelectionColumnWidth, tableSelectedRowBg, tableSelectedRowHoverBg, tableRowHoverBg, tablePaddingHorizontal, calc } = token; return { [`${componentCls}-wrapper`]: { // ========================== Selections ========================== [`${componentCls}-selection-col`]: { width: tableSelectionColumnWidth, [`&${componentCls}-selection-col-with-dropdown`]: { width: calc(tableSelectionColumnWidth).add(fontSizeIcon).add(calc(padding).div(4)).equal() } }, [`${componentCls}-bordered ${componentCls}-selection-col`]: { width: calc(tableSelectionColumnWidth).add(calc(paddingXS).mul(2)).equal(), [`&${componentCls}-selection-col-with-dropdown`]: { width: calc(tableSelectionColumnWidth).add(fontSizeIcon).add(calc(padding).div(4)).add(calc(paddingXS).mul(2)).equal() } }, [` table tr th${componentCls}-selection-column, table tr td${componentCls}-selection-column, ${componentCls}-selection-column `]: { paddingInlineEnd: token.paddingXS, paddingInlineStart: token.paddingXS, textAlign: 'center', [`${antCls}-radio-wrapper`]: { marginInlineEnd: 0 } }, [`table tr th${componentCls}-selection-column${componentCls}-cell-fix-left`]: { zIndex: calc(token.zIndexTableFixed).add(1).equal({ unit: false }) }, [`table tr th${componentCls}-selection-column::after`]: { backgroundColor: 'transparent !important' }, [`${componentCls}-selection`]: { position: 'relative', display: 'inline-flex', flexDirection: 'column' }, [`${componentCls}-selection-extra`]: { position: 'absolute', top: 0, zIndex: 1, cursor: 'pointer', transition: `all ${token.motionDurationSlow}`, marginInlineStart: '100%', paddingInlineStart: (0, _cssinjs.unit)(calc(tablePaddingHorizontal).div(4).equal()), [iconCls]: { color: headerIconColor, fontSize: fontSizeIcon, verticalAlign: 'baseline', '&:hover': { color: headerIconHoverColor } } }, // ============================= Rows ============================= [`${componentCls}-tbody`]: { [`${componentCls}-row`]: { [`&${componentCls}-row-selected`]: { [`> ${componentCls}-cell`]: { background: tableSelectedRowBg, '&-row-hover': { background: tableSelectedRowHoverBg } } }, [`> ${componentCls}-cell-row-hover`]: { background: tableRowHoverBg } } } } }; }; var _default = exports["default"] = genSelectionStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/size.js": /*!**********************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/size.js ***! \**********************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genSizeStyle = token => { const { componentCls, tableExpandColumnWidth, calc } = token; const getSizeStyle = (size, paddingVertical, paddingHorizontal, fontSize) => ({ [`${componentCls}${componentCls}-${size}`]: { fontSize, [` ${componentCls}-title, ${componentCls}-footer, ${componentCls}-cell, ${componentCls}-thead > tr > th, ${componentCls}-tbody > tr > th, ${componentCls}-tbody > tr > td, tfoot > tr > th, tfoot > tr > td `]: { padding: `${(0, _cssinjs.unit)(paddingVertical)} ${(0, _cssinjs.unit)(paddingHorizontal)}` }, [`${componentCls}-filter-trigger`]: { marginInlineEnd: (0, _cssinjs.unit)(calc(paddingHorizontal).div(2).mul(-1).equal()) }, [`${componentCls}-expanded-row-fixed`]: { margin: `${(0, _cssinjs.unit)(calc(paddingVertical).mul(-1).equal())} ${(0, _cssinjs.unit)(calc(paddingHorizontal).mul(-1).equal())}` }, [`${componentCls}-tbody`]: { // ========================= Nest Table =========================== [`${componentCls}-wrapper:only-child ${componentCls}`]: { marginBlock: (0, _cssinjs.unit)(calc(paddingVertical).mul(-1).equal()), marginInline: `${(0, _cssinjs.unit)(calc(tableExpandColumnWidth).sub(paddingHorizontal).equal())} ${(0, _cssinjs.unit)(calc(paddingHorizontal).mul(-1).equal())}` } }, // https://github.com/ant-design/ant-design/issues/35167 [`${componentCls}-selection-extra`]: { paddingInlineStart: (0, _cssinjs.unit)(calc(paddingHorizontal).div(4).equal()) } } }); return { [`${componentCls}-wrapper`]: Object.assign(Object.assign({}, getSizeStyle('middle', token.tablePaddingVerticalMiddle, token.tablePaddingHorizontalMiddle, token.tableFontSizeMiddle)), getSizeStyle('small', token.tablePaddingVerticalSmall, token.tablePaddingHorizontalSmall, token.tableFontSizeSmall)) }; }; var _default = exports["default"] = genSizeStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/sorter.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/sorter.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const genSorterStyle = token => { const { componentCls, marginXXS, fontSizeIcon, headerIconColor, headerIconHoverColor } = token; return { [`${componentCls}-wrapper`]: { [`${componentCls}-thead th${componentCls}-column-has-sorters`]: { outline: 'none', cursor: 'pointer', // why left 0s? Avoid column header move with transition when left is changed // https://github.com/ant-design/ant-design/issues/50588 transition: `all ${token.motionDurationSlow}, left 0s`, '&:hover': { background: token.tableHeaderSortHoverBg, '&::before': { backgroundColor: 'transparent !important' } }, '&:focus-visible': { color: token.colorPrimary }, // https://github.com/ant-design/ant-design/issues/30969 [` &${componentCls}-cell-fix-left:hover, &${componentCls}-cell-fix-right:hover `]: { background: token.tableFixedHeaderSortActiveBg } }, [`${componentCls}-thead th${componentCls}-column-sort`]: { background: token.tableHeaderSortBg, '&::before': { backgroundColor: 'transparent !important' } }, [`td${componentCls}-column-sort`]: { background: token.tableBodySortBg }, [`${componentCls}-column-title`]: { position: 'relative', zIndex: 1, flex: 1, minWidth: 0 }, [`${componentCls}-column-sorters`]: { display: 'flex', flex: 'auto', alignItems: 'center', justifyContent: 'space-between', '&::after': { position: 'absolute', inset: 0, width: '100%', height: '100%', content: '""' } }, [`${componentCls}-column-sorters-tooltip-target-sorter`]: { '&::after': { content: 'none' } }, [`${componentCls}-column-sorter`]: { marginInlineStart: marginXXS, color: headerIconColor, fontSize: 0, transition: `color ${token.motionDurationSlow}`, '&-inner': { display: 'inline-flex', flexDirection: 'column', alignItems: 'center' }, '&-up, &-down': { fontSize: fontSizeIcon, '&.active': { color: token.colorPrimary } }, [`${componentCls}-column-sorter-up + ${componentCls}-column-sorter-down`]: { marginTop: '-0.3em' } }, [`${componentCls}-column-sorters:hover ${componentCls}-column-sorter`]: { color: headerIconHoverColor } } }; }; var _default = exports["default"] = genSorterStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/sticky.js": /*!************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/sticky.js ***! \************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genStickyStyle = token => { const { componentCls, opacityLoading, tableScrollThumbBg, tableScrollThumbBgHover, tableScrollThumbSize, tableScrollBg, zIndexTableSticky, stickyScrollBarBorderRadius, lineWidth, lineType, tableBorderColor } = token; const tableBorder = `${(0, _cssinjs.unit)(lineWidth)} ${lineType} ${tableBorderColor}`; return { [`${componentCls}-wrapper`]: { [`${componentCls}-sticky`]: { '&-holder': { position: 'sticky', zIndex: zIndexTableSticky, background: token.colorBgContainer }, '&-scroll': { position: 'sticky', bottom: 0, height: `${(0, _cssinjs.unit)(tableScrollThumbSize)} !important`, zIndex: zIndexTableSticky, display: 'flex', alignItems: 'center', background: tableScrollBg, borderTop: tableBorder, opacity: opacityLoading, '&:hover': { transformOrigin: 'center bottom' }, // fake scrollbar style of sticky '&-bar': { height: tableScrollThumbSize, backgroundColor: tableScrollThumbBg, borderRadius: stickyScrollBarBorderRadius, transition: `all ${token.motionDurationSlow}, transform 0s`, position: 'absolute', bottom: 0, '&:hover, &-active': { backgroundColor: tableScrollThumbBgHover } } } } } }; }; var _default = exports["default"] = genStickyStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/summary.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/summary.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genSummaryStyle = token => { const { componentCls, lineWidth, tableBorderColor, calc } = token; const tableBorder = `${(0, _cssinjs.unit)(lineWidth)} ${token.lineType} ${tableBorderColor}`; return { [`${componentCls}-wrapper`]: { [`${componentCls}-summary`]: { position: 'relative', zIndex: token.zIndexTableFixed, background: token.tableBg, '> tr': { '> th, > td': { borderBottom: tableBorder } } }, [`div${componentCls}-summary`]: { boxShadow: `0 ${(0, _cssinjs.unit)(calc(lineWidth).mul(-1).equal())} 0 ${tableBorderColor}` } } }; }; var _default = exports["default"] = genSummaryStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/style/virtual.js": /*!*************************************************************!*\ !*** ../../../node_modules/antd/lib/table/style/virtual.js ***! \*************************************************************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _cssinjs = __webpack_require__(/*! @ant-design/cssinjs */ "../../../node_modules/@ant-design/cssinjs/es/index.js"); const genVirtualStyle = token => { const { componentCls, motionDurationMid, lineWidth, lineType, tableBorderColor, calc } = token; const tableBorder = `${(0, _cssinjs.unit)(lineWidth)} ${lineType} ${tableBorderColor}`; const rowCellCls = `${componentCls}-expanded-row-cell`; return { [`${componentCls}-wrapper`]: { // ========================== Row ========================== [`${componentCls}-tbody-virtual`]: { [`${componentCls}-tbody-virtual-holder-inner`]: { [` & > ${componentCls}-row, & > div:not(${componentCls}-row) > ${componentCls}-row `]: { display: 'flex', boxSizing: 'border-box', width: '100%' } }, [`${componentCls}-cell`]: { borderBottom: tableBorder, transition: `background ${motionDurationMid}` }, [`${componentCls}-expanded-row`]: { [`${rowCellCls}${rowCellCls}-fixed`]: { position: 'sticky', insetInlineStart: 0, overflow: 'hidden', width: `calc(var(--virtual-width) - ${(0, _cssinjs.unit)(lineWidth)})`, borderInlineEnd: 'none' } } }, // ======================== Border ========================= [`${componentCls}-bordered`]: { [`${componentCls}-tbody-virtual`]: { '&:after': { content: '""', insetInline: 0, bottom: 0, borderBottom: tableBorder, position: 'absolute' }, [`${componentCls}-cell`]: { borderInlineEnd: tableBorder, [`&${componentCls}-cell-fix-right-first:before`]: { content: '""', position: 'absolute', insetBlock: 0, insetInlineStart: calc(lineWidth).mul(-1).equal(), borderInlineStart: tableBorder } } }, // Empty placeholder [`&${componentCls}-virtual`]: { [`${componentCls}-placeholder ${componentCls}-cell`]: { borderInlineEnd: tableBorder, borderBottom: tableBorder } } } } }; }; var _default = exports["default"] = genVirtualStyle; /***/ }), /***/ "../../../node_modules/antd/lib/table/util.js": /*!****************************************************!*\ !*** ../../../node_modules/antd/lib/table/util.js ***! \****************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getColumnKey = void 0; exports.getColumnPos = getColumnPos; exports.safeColumnTitle = exports.renderColumnTitle = void 0; const 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; }; exports.getColumnKey = getColumnKey; function getColumnPos(index, pos) { return pos ? `${pos}-${index}` : `${index}`; } const renderColumnTitle = (title, props) => { if (typeof title === 'function') { return title(props); } return title; }; /** * Safe get column title * * Should filter [object Object] * * @param title */ exports.renderColumnTitle = renderColumnTitle; const safeColumnTitle = (title, props) => { const res = renderColumnTitle(title, props); if (Object.prototype.toString.call(res) === '[object Object]') { return ''; } return res; }; exports.safeColumnTitle = safeColumnTitle; /***/ }), /***/ "../../../node_modules/antd/lib/tabs/TabPane.js": /*!******************************************************!*\ !*** ../../../node_modules/antd/lib/tabs/TabPane.js ***! \******************************************************/ /***/ ((__unused_webpack_module, exports) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; const TabPane = () => null; if (true) { TabPane.displayName = 'DeprecatedTabPane'; } var _default = exports["default"] = TabPane; /***/ }) }]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianMvdmVuZG9ycy1ub2RlX21vZHVsZXNfYW50ZF9saWJfc3R5bGVfY29tcGFjdC1pdGVtLXZlcnRpY2FsX2pzLW5vZGVfbW9kdWxlc19hbnRkX2xpYl9zdHlsZV9jb21wLTNhMzI4NC52b2x1bnRlZXJhcGkuNzg1MzkxMWE1Zjg2ZTRhYzVmYWYuYnVuZGxlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFhOztBQUViLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQztBQUNGLG1DQUFtQztBQUNuQztBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsVUFBVTtBQUM3QjtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixVQUFVLG1CQUFtQixVQUFVO0FBQzFEO0FBQ0EsS0FBSztBQUNMLGNBQWMsVUFBVSxrQkFBa0IsVUFBVTtBQUNwRCxjQUFjLFVBQVUsUUFBUSxVQUFVO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxjQUFjLFVBQVUsaUJBQWlCLFVBQVU7QUFDbkQsY0FBYyxVQUFVLFFBQVEsVUFBVTtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixtQkFBbUI7QUFDM0M7QUFDQSxnREFBZ0Q7QUFDaEQ7QUFDQSxDOzs7Ozs7Ozs7O0FDOUNhOztBQUViLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQztBQUNGLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxpR0FBaUcsR0FBRyxFQUFFLGdCQUFnQjtBQUN0SDtBQUNBLG1CQUFtQixVQUFVO0FBQzdCO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLFdBQVcsV0FBVztBQUN0QjtBQUNBO0FBQ0EsTUFBTSxJQUFJO0FBQ1Ysc0JBQXNCLGdCQUFnQjtBQUN0QztBQUNBO0FBQ0Es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LENBQUMsRUFBQztBQUNGLGtEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGtEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLG1EQUFrRDtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGtEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLDhDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLCtDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLDhDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLCtDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLCtDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGdEQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLDRDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLDZDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLCtDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGdEQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLCtDQUE4QztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGdEQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGdEQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGlEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLDZDQUE0QztBQUM1QztBQUNBO0FB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QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQXFDLG1NQUFtTSxDQUFNO0FBQ3BQLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyxpREFBaUQ7QUFDdEQ7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsa0JBQWUsbUI7Ozs7Ozs7Ozs7QUM5RWpCOztBQUViLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQztBQUNGLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsdUJBQXVCLEdBQUcseUJBQXlCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBLGtCQUFrQixJQUFJLEdBQUcsTUFBTSxPQUFPLE1BQU07QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixtQjs7Ozs7Ozs7OztBQzFDVjs7QUFFYiw4Q0FBNkM7QUFDN0M7QUFDQSxDQUFDLEVBQUM7QUFDRixrQkFBZTtBQUNmO0FBQ0EsSUFBSSxJQUFxQztBQUN6QztBQUNBO0FBQ0EsZUFBZSxrQkFBZSxXIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvc3R5bGUvY29tcGFjdC1pdGVtLXZlcnRpY2FsLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3N0eWxlL2NvbXBhY3QtaXRlbS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9zdHlsZS9pbmRleC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi9zdHlsZS9tb3Rpb24vY29sbGFwc2UuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvc3R5bGUvbW90aW9uL2ZhZGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvc3R5bGUvbW90aW9uL2luZGV4LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3N0eWxlL21vdGlvbi9tb3Rpb24uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvc3R5bGUvbW90aW9uL21vdmUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvc3R5bGUvbW90aW9uL3NsaWRlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3N0eWxlL21vdGlvbi96b29tLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3N0eWxlL3BsYWNlbWVudEFycm93LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3N0eWxlL3JvdW5kZWRBcnJvdy5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9Db2x1bW4uanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvQ29sdW1uR3JvdXAuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvRXhwYW5kSWNvbi5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9JbnRlcm5hbFRhYmxlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL1JjVGFibGUvVmlydHVhbFRhYmxlLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL1JjVGFibGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvVGFibGUuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvaG9va3MvdXNlQ29udGFpbmVyV2lkdGguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvaG9va3MvdXNlRmlsdGVyL0ZpbHRlckRyb3Bkb3duLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL2hvb2tzL3VzZUZpbHRlci9GaWx0ZXJTZWFyY2guanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvaG9va3MvdXNlRmlsdGVyL0ZpbHRlcldyYXBwZXIuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvaG9va3MvdXNlRmlsdGVyL2luZGV4LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL2hvb2tzL3VzZUxhenlLVk1hcC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9ob29rcy91c2VQYWdpbmF0aW9uLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL2hvb2tzL3VzZVNlbGVjdGlvbi5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9ob29rcy91c2VTb3J0ZXIuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvaG9va3MvdXNlVGl0bGVDb2x1bW5zLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL2luZGV4LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL3N0eWxlL2JvcmRlcmVkLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL3N0eWxlL2VsbGlwc2lzLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL3N0eWxlL2VtcHR5LmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL3N0eWxlL2V4cGFuZC5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9zdHlsZS9maWx0ZXIuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvc3R5bGUvZml4ZWQuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvc3R5bGUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvc3R5bGUvcGFnaW5hdGlvbi5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9zdHlsZS9yYWRpdXMuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvc3R5bGUvcnRsLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL3N0eWxlL3NlbGVjdGlvbi5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9zdHlsZS9zaXplLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL3N0eWxlL3NvcnRlci5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9zdHlsZS9zdGlja3kuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFibGUvc3R5bGUvc3VtbWFyeS5qcyIsIndlYnBhY2s6Ly9AY29yZS92b2x1bnRlZXJfYXBwLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9hbnRkL2xpYi90YWJsZS9zdHlsZS92aXJ0dWFsLmpzIiwid2VicGFjazovL0Bjb3JlL3ZvbHVudGVlcl9hcHAvLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2FudGQvbGliL3RhYmxlL3V0aWwuanMiLCJ3ZWJwYWNrOi8vQGNvcmUvdm9sdW50ZWVyX2FwcC8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYW50ZC9saWIvdGFicy9UYWJQYW5lLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZW5Db21wYWN0SXRlbVZlcnRpY2FsU3R5bGUgPSBnZW5Db21wYWN0SXRlbVZlcnRpY2FsU3R5bGU7XG5mdW5jdGlvbiBjb21wYWN0SXRlbVZlcnRpY2FsQm9yZGVyKHRva2VuLCBwYXJlbnRDbHMpIHtcbiAgcmV0dXJuIHtcbiAgICAvLyBib3JkZXIgY29sbGFwc2VcbiAgICBbYCYtaXRlbTpub3QoJHtwYXJlbnRDbHN9LWxhc3QtaXRlbSlgXToge1xuICAgICAgbWFyZ2luQm90dG9tOiB0b2tlbi5jYWxjKHRva2VuLmxpbmVXaWR0aCkubXVsKC0xKS5lcXVhbCgpXG4gICAgfSxcbiAgICAnJi1pdGVtJzoge1xuICAgICAgJyY6aG92ZXIsJjpmb2N1cywmOmFjdGl2ZSc6IHtcbiAgICAgICAgekluZGV4OiAyXG4gICAgICB9LFxuICAgICAgJyZbZGlzYWJsZWRdJzoge1xuICAgICAgICB6SW5kZXg6IDBcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBjb21wYWN0SXRlbUJvcmRlclZlcnRpY2FsUmFkaXVzKHByZWZpeENscywgcGFyZW50Q2xzKSB7XG4gIHJldHVybiB7XG4gICAgW2AmLWl0ZW06bm90KCR7cGFyZW50Q2xzfS1maXJzdC1pdGVtKTpub3QoJHtwYXJlbnRDbHN9LWxhc3QtaXRlbSlgXToge1xuICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgfSxcbiAgICBbYCYtaXRlbSR7cGFyZW50Q2xzfS1maXJzdC1pdGVtOm5vdCgke3BhcmVudENsc30tbGFzdC1pdGVtKWBdOiB7XG4gICAgICBbYCYsICYke3ByZWZpeENsc30tc20sICYke3ByZWZpeENsc30tbGdgXToge1xuICAgICAgICBib3JkZXJFbmRFbmRSYWRpdXM6IDAsXG4gICAgICAgIGJvcmRlckVuZFN0YXJ0UmFkaXVzOiAwXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCYtaXRlbSR7cGFyZW50Q2xzfS1sYXN0LWl0ZW06bm90KCR7cGFyZW50Q2xzfS1maXJzdC1pdGVtKWBdOiB7XG4gICAgICBbYCYsICYke3ByZWZpeENsc30tc20sICYke3ByZWZpeENsc30tbGdgXToge1xuICAgICAgICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiAwLFxuICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogMFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGdlbkNvbXBhY3RJdGVtVmVydGljYWxTdHlsZSh0b2tlbikge1xuICBjb25zdCBjb21wYWN0Q2xzID0gYCR7dG9rZW4uY29tcG9uZW50Q2xzfS1jb21wYWN0LXZlcnRpY2FsYDtcbiAgcmV0dXJuIHtcbiAgICBbY29tcGFjdENsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29tcGFjdEl0ZW1WZXJ0aWNhbEJvcmRlcih0b2tlbiwgY29tcGFjdENscykpLCBjb21wYWN0SXRlbUJvcmRlclZlcnRpY2FsUmFkaXVzKHRva2VuLmNvbXBvbmVudENscywgY29tcGFjdENscykpXG4gIH07XG59IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdlbkNvbXBhY3RJdGVtU3R5bGUgPSBnZW5Db21wYWN0SXRlbVN0eWxlO1xuLy8gaGFuZGxlIGJvcmRlciBjb2xsYXBzZVxuZnVuY3Rpb24gY29tcGFjdEl0ZW1Cb3JkZXIodG9rZW4sIHBhcmVudENscywgb3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgZm9jdXNFbENscyxcbiAgICBmb2N1cyxcbiAgICBib3JkZXJFbENsc1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY2hpbGRDb21iaW5hdG9yID0gYm9yZGVyRWxDbHMgPyAnPiAqJyA6ICcnO1xuICBjb25zdCBob3ZlckVmZmVjdHMgPSBbJ2hvdmVyJywgZm9jdXMgPyAnZm9jdXMnIDogbnVsbCwgJ2FjdGl2ZSddLmZpbHRlcihCb29sZWFuKS5tYXAobiA9PiBgJjoke259ICR7Y2hpbGRDb21iaW5hdG9yfWApLmpvaW4oJywnKTtcbiAgcmV0dXJuIHtcbiAgICBbYCYtaXRlbTpub3QoJHtwYXJlbnRDbHN9LWxhc3QtaXRlbSlgXToge1xuICAgICAgbWFyZ2luSW5saW5lRW5kOiB0b2tlbi5jYWxjKHRva2VuLmxpbmVXaWR0aCkubXVsKC0xKS5lcXVhbCgpXG4gICAgfSxcbiAgICAnJi1pdGVtJzogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgIFtob3ZlckVmZmVjdHNdOiB7XG4gICAgICAgIHpJbmRleDogMlxuICAgICAgfVxuICAgIH0sIGZvY3VzRWxDbHMgPyB7XG4gICAgICBbYCYke2ZvY3VzRWxDbHN9YF06IHtcbiAgICAgICAgekluZGV4OiAyXG4gICAgICB9XG4gICAgfSA6IHt9KSwge1xuICAgICAgW2AmW2Rpc2FibGVkXSAke2NoaWxkQ29tYmluYXRvcn1gXToge1xuICAgICAgICB6SW5kZXg6IDBcbiAgICAgIH1cbiAgICB9KVxuICB9O1xufVxuLy8gaGFuZGxlIGJvcmRlci1yYWRpdXNcbmZ1bmN0aW9uIGNvbXBhY3RJdGVtQm9yZGVyUmFkaXVzKHByZWZpeENscywgcGFyZW50Q2xzLCBvcHRpb25zKSB7XG4gIGNvbnN0IHtcbiAgICBib3JkZXJFbENsc1xuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY2hpbGRDb21iaW5hdG9yID0gYm9yZGVyRWxDbHMgPyBgPiAke2JvcmRlckVsQ2xzfWAgOiAnJztcbiAgcmV0dXJuIHtcbiAgICBbYCYtaXRlbTpub3QoJHtwYXJlbnRDbHN9LWZpcnN0LWl0ZW0pOm5vdCgke3BhcmVudENsc30tbGFzdC1pdGVtKSAke2NoaWxkQ29tYmluYXRvcn1gXToge1xuICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgfSxcbiAgICBbYCYtaXRlbTpub3QoJHtwYXJlbnRDbHN9LWxhc3QtaXRlbSkke3BhcmVudENsc30tZmlyc3QtaXRlbWBdOiB7XG4gICAgICBbYCYgJHtjaGlsZENvbWJpbmF0b3J9LCAmJHtwcmVmaXhDbHN9LXNtICR7Y2hpbGRDb21iaW5hdG9yfSwgJiR7cHJlZml4Q2xzfS1sZyAke2NoaWxkQ29tYmluYXRvcn1gXToge1xuICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogMCxcbiAgICAgICAgYm9yZGVyRW5kRW5kUmFkaXVzOiAwXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCYtaXRlbTpub3QoJHtwYXJlbnRDbHN9LWZpcnN0LWl0ZW0pJHtwYXJlbnRDbHN9LWxhc3QtaXRlbWBdOiB7XG4gICAgICBbYCYgJHtjaGlsZENvbWJpbmF0b3J9LCAmJHtwcmVmaXhDbHN9LXNtICR7Y2hpbGRDb21iaW5hdG9yfSwgJiR7cHJlZml4Q2xzfS1sZyAke2NoaWxkQ29tYmluYXRvcn1gXToge1xuICAgICAgICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiAwLFxuICAgICAgICBib3JkZXJFbmRTdGFydFJhZGl1czogMFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGdlbkNvbXBhY3RJdGVtU3R5bGUodG9rZW4sIG9wdGlvbnMgPSB7XG4gIGZvY3VzOiB0cnVlXG59KSB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBjb21wYWN0Q2xzID0gYCR7Y29tcG9uZW50Q2xzfS1jb21wYWN0YDtcbiAgcmV0dXJuIHtcbiAgICBbY29tcGFjdENsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29tcGFjdEl0ZW1Cb3JkZXIodG9rZW4sIGNvbXBhY3RDbHMsIG9wdGlvbnMpKSwgY29tcGFjdEl0ZW1Cb3JkZXJSYWRpdXMoY29tcG9uZW50Q2xzLCBjb21wYWN0Q2xzLCBvcHRpb25zKSlcbiAgfTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblwidXNlIGNsaWVudFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy50ZXh0RWxsaXBzaXMgPSBleHBvcnRzLnJlc2V0SWNvbiA9IGV4cG9ydHMucmVzZXRDb21wb25lbnQgPSBleHBvcnRzLm9wZXJhdGlvblVuaXQgPSBleHBvcnRzLmdlbkxpbmtTdHlsZSA9IGV4cG9ydHMuZ2VuSWNvblN0eWxlID0gZXhwb3J0cy5nZW5Gb2N1c1N0eWxlID0gZXhwb3J0cy5nZW5Gb2N1c091dGxpbmUgPSBleHBvcnRzLmdlbkNvbW1vblN0eWxlID0gZXhwb3J0cy5jbGVhckZpeCA9IHZvaWQgMDtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xuY29uc3QgdGV4dEVsbGlwc2lzID0gZXhwb3J0cy50ZXh0RWxsaXBzaXMgPSB7XG4gIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgd2hpdGVTcGFjZTogJ25vd3JhcCcsXG4gIHRleHRPdmVyZmxvdzogJ2VsbGlwc2lzJ1xufTtcbmNvbnN0IHJlc2V0Q29tcG9uZW50ID0gKHRva2VuLCBuZWVkSW5oZXJpdEZvbnRGYW1pbHkgPSBmYWxzZSkgPT4gKHtcbiAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gIG1hcmdpbjogMCxcbiAgcGFkZGluZzogMCxcbiAgY29sb3I6IHRva2VuLmNvbG9yVGV4dCxcbiAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplLFxuICAvLyBmb250LXZhcmlhbnQ6IEBmb250LXZhcmlhbnQtYmFzZTtcbiAgbGluZUhlaWdodDogdG9rZW4ubGluZUhlaWdodCxcbiAgbGlzdFN0eWxlOiAnbm9uZScsXG4gIC8vIGZvbnQtZmVhdHVyZS1zZXR0aW5nczogQGZvbnQtZmVhdHVyZS1zZXR0aW5ncy1iYXNlO1xuICBmb250RmFtaWx5OiBuZWVkSW5oZXJpdEZvbnRGYW1pbHkgPyAnaW5oZXJpdCcgOiB0b2tlbi5mb250RmFtaWx5XG59KTtcbmV4cG9ydHMucmVzZXRDb21wb25lbnQgPSByZXNldENvbXBvbmVudDtcbmNvbnN0IHJlc2V0SWNvbiA9ICgpID0+ICh7XG4gIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICBjb2xvcjogJ2luaGVyaXQnLFxuICBmb250U3R5bGU6ICdub3JtYWwnLFxuICBsaW5lSGVpZ2h0OiAwLFxuICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICB0ZXh0VHJhbnNmb3JtOiAnbm9uZScsXG4gIC8vIGZvciBTVkcgaWNvbiwgc2VlIGh0dHBzOi8vYmxvZy5wcm90b3R5cHIuaW8vYWxpZ24tc3ZnLWljb25zLXRvLXRleHQtYW5kLXNheS1nb29kYnllLXRvLWZvbnQtaWNvbnMtZDQ0YjNkN2IyNmI0XG4gIHZlcnRpY2FsQWxpZ246ICctMC4xMjVlbScsXG4gIHRleHRSZW5kZXJpbmc6ICdvcHRpbWl6ZUxlZ2liaWxpdHknLFxuICAnLXdlYmtpdC1mb250LXNtb290aGluZyc6ICdhbnRpYWxpYXNlZCcsXG4gICctbW96LW9zeC1mb250LXNtb290aGluZyc6ICdncmF5c2NhbGUnLFxuICAnPiAqJzoge1xuICAgIGxpbmVIZWlnaHQ6IDFcbiAgfSxcbiAgc3ZnOiB7XG4gICAgZGlzcGxheTogJ2lubGluZS1ibG9jaydcbiAgfVxufSk7XG5leHBvcnRzLnJlc2V0SWNvbiA9IHJlc2V0SWNvbjtcbmNvbnN0IGNsZWFyRml4ID0gKCkgPT4gKHtcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjEzMDEjaXNzdWVjb21tZW50LTU4Mzk1NTIyOVxuICAnJjo6YmVmb3JlJzoge1xuICAgIGRpc3BsYXk6ICd0YWJsZScsXG4gICAgY29udGVudDogJ1wiXCInXG4gIH0sXG4gICcmOjphZnRlcic6IHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy8yMTg2NFxuICAgIGRpc3BsYXk6ICd0YWJsZScsXG4gICAgY2xlYXI6ICdib3RoJyxcbiAgICBjb250ZW50OiAnXCJcIidcbiAgfVxufSk7XG5leHBvcnRzLmNsZWFyRml4ID0gY2xlYXJGaXg7XG5jb25zdCBnZW5MaW5rU3R5bGUgPSB0b2tlbiA9PiAoe1xuICBhOiB7XG4gICAgY29sb3I6IHRva2VuLmNvbG9yTGluayxcbiAgICB0ZXh0RGVjb3JhdGlvbjogdG9rZW4ubGlua0RlY29yYXRpb24sXG4gICAgYmFja2dyb3VuZENvbG9yOiAndHJhbnNwYXJlbnQnLFxuICAgIC8vIHJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIG9uIGFjdGl2ZSBsaW5rcyBpbiBJRSAxMC5cbiAgICBvdXRsaW5lOiAnbm9uZScsXG4gICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgdHJhbnNpdGlvbjogYGNvbG9yICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgJy13ZWJraXQtdGV4dC1kZWNvcmF0aW9uLXNraXAnOiAnb2JqZWN0cycsXG4gICAgLy8gcmVtb3ZlIGdhcHMgaW4gbGlua3MgdW5kZXJsaW5lIGluIGlPUyA4KyBhbmQgU2FmYXJpIDgrLlxuICAgICcmOmhvdmVyJzoge1xuICAgICAgY29sb3I6IHRva2VuLmNvbG9yTGlua0hvdmVyXG4gICAgfSxcbiAgICAnJjphY3RpdmUnOiB7XG4gICAgICBjb2xvcjogdG9rZW4uY29sb3JMaW5rQWN0aXZlXG4gICAgfSxcbiAgICAnJjphY3RpdmUsICY6aG92ZXInOiB7XG4gICAgICB0ZXh0RGVjb3JhdGlvbjogdG9rZW4ubGlua0hvdmVyRGVjb3JhdGlvbixcbiAgICAgIG91dGxpbmU6IDBcbiAgICB9LFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzIyNTAzXG4gICAgJyY6Zm9jdXMnOiB7XG4gICAgICB0ZXh0RGVjb3JhdGlvbjogdG9rZW4ubGlua0ZvY3VzRGVjb3JhdGlvbixcbiAgICAgIG91dGxpbmU6IDBcbiAgICB9LFxuICAgICcmW2Rpc2FibGVkXSc6IHtcbiAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREaXNhYmxlZCxcbiAgICAgIGN1cnNvcjogJ25vdC1hbGxvd2VkJ1xuICAgIH1cbiAgfVxufSk7XG5leHBvcnRzLmdlbkxpbmtTdHlsZSA9IGdlbkxpbmtTdHlsZTtcbmNvbnN0IGdlbkNvbW1vblN0eWxlID0gKHRva2VuLCBjb21wb25lbnRQcmVmaXhDbHMsIHJvb3RDbHMsIHJlc2V0Rm9udCkgPT4ge1xuICBjb25zdCBwcmVmaXhTZWxlY3RvciA9IGBbY2xhc3NePVwiJHtjb21wb25lbnRQcmVmaXhDbHN9XCJdLCBbY2xhc3MqPVwiICR7Y29tcG9uZW50UHJlZml4Q2xzfVwiXWA7XG4gIGNvbnN0IHJvb3RQcmVmaXhTZWxlY3RvciA9IHJvb3RDbHMgPyBgLiR7cm9vdENsc31gIDogcHJlZml4U2VsZWN0b3I7XG4gIGNvbnN0IHJlc2V0U3R5bGUgPSB7XG4gICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgJyY6OmJlZm9yZSwgJjo6YWZ0ZXInOiB7XG4gICAgICBib3hTaXppbmc6ICdib3JkZXItYm94J1xuICAgIH1cbiAgfTtcbiAgbGV0IHJlc2V0Rm9udFN0eWxlID0ge307XG4gIGlmIChyZXNldEZvbnQgIT09IGZhbHNlKSB7XG4gICAgcmVzZXRGb250U3R5bGUgPSB7XG4gICAgICBmb250RmFtaWx5OiB0b2tlbi5mb250RmFtaWx5LFxuICAgICAgZm9udFNpemU6IHRva2VuLmZvbnRTaXplXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIFtyb290UHJlZml4U2VsZWN0b3JdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzZXRGb250U3R5bGUpLCByZXNldFN0eWxlKSwge1xuICAgICAgW3ByZWZpeFNlbGVjdG9yXTogcmVzZXRTdHlsZVxuICAgIH0pXG4gIH07XG59O1xuZXhwb3J0cy5nZW5Db21tb25TdHlsZSA9IGdlbkNvbW1vblN0eWxlO1xuY29uc3QgZ2VuRm9jdXNPdXRsaW5lID0gKHRva2VuLCBvZmZzZXQpID0+ICh7XG4gIG91dGxpbmU6IGAkeygwLCBfY3NzaW5qcy51bml0KSh0b2tlbi5saW5lV2lkdGhGb2N1cyl9IHNvbGlkICR7dG9rZW4uY29sb3JQcmltYXJ5Qm9yZGVyfWAsXG4gIG91dGxpbmVPZmZzZXQ6IG9mZnNldCAhPT0gbnVsbCAmJiBvZmZzZXQgIT09IHZvaWQgMCA/IG9mZnNldCA6IDEsXG4gIHRyYW5zaXRpb246ICdvdXRsaW5lLW9mZnNldCAwcywgb3V0bGluZSAwcydcbn0pO1xuZXhwb3J0cy5nZW5Gb2N1c091dGxpbmUgPSBnZW5Gb2N1c091dGxpbmU7XG5jb25zdCBnZW5Gb2N1c1N0eWxlID0gKHRva2VuLCBvZmZzZXQpID0+ICh7XG4gICcmOmZvY3VzLXZpc2libGUnOiBPYmplY3QuYXNzaWduKHt9LCBnZW5Gb2N1c091dGxpbmUodG9rZW4sIG9mZnNldCkpXG59KTtcbmV4cG9ydHMuZ2VuRm9jdXNTdHlsZSA9IGdlbkZvY3VzU3R5bGU7XG5jb25zdCBnZW5JY29uU3R5bGUgPSBpY29uUHJlZml4Q2xzID0+ICh7XG4gIFtgLiR7aWNvblByZWZpeENsc31gXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXNldEljb24oKSksIHtcbiAgICBbYC4ke2ljb25QcmVmaXhDbHN9IC4ke2ljb25QcmVmaXhDbHN9LWljb25gXToge1xuICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgIH1cbiAgfSlcbn0pO1xuZXhwb3J0cy5nZW5JY29uU3R5bGUgPSBnZW5JY29uU3R5bGU7XG5jb25zdCBvcGVyYXRpb25Vbml0ID0gdG9rZW4gPT4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgLy8gRklYTUU6IFRoaXMgdXNlIGxpbmsgYnV0IGlzIGEgb3BlcmF0aW9uIHVuaXQuIFNlZW1zIHNob3VsZCBiZSBhIGNvbG9yUHJpbWFyeS5cbiAgLy8gQW5kIFR5cG9ncmFwaHkgdXNlIHRoaXMgdG8gZ2VuZXJhdGUgbGluayBzdHlsZSB3aGljaCBzaG91bGQgbm90IGRvIHRoaXMuXG4gIGNvbG9yOiB0b2tlbi5jb2xvckxpbmssXG4gIHRleHREZWNvcmF0aW9uOiB0b2tlbi5saW5rRGVjb3JhdGlvbixcbiAgb3V0bGluZTogJ25vbmUnLFxuICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd31gLFxuICBib3JkZXI6IDAsXG4gIHBhZGRpbmc6IDAsXG4gIGJhY2tncm91bmQ6ICdub25lJyxcbiAgdXNlclNlbGVjdDogJ25vbmUnXG59LCBnZW5Gb2N1c1N0eWxlKHRva2VuKSksIHtcbiAgJyY6Zm9jdXMsICY6aG92ZXInOiB7XG4gICAgY29sb3I6IHRva2VuLmNvbG9yTGlua0hvdmVyXG4gIH0sXG4gICcmOmFjdGl2ZSc6IHtcbiAgICBjb2xvcjogdG9rZW4uY29sb3JMaW5rQWN0aXZlXG4gIH1cbn0pO1xuZXhwb3J0cy5vcGVyYXRpb25Vbml0ID0gb3BlcmF0aW9uVW5pdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbmNvbnN0IGdlbkNvbGxhcHNlTW90aW9uID0gdG9rZW4gPT4gKHtcbiAgW3Rva2VuLmNvbXBvbmVudENsc106IHtcbiAgICAvLyBGb3IgY29tbW9uL29wZW5BbmltYXRpb25cbiAgICBbYCR7dG9rZW4uYW50Q2xzfS1tb3Rpb24tY29sbGFwc2UtbGVnYWN5YF06IHtcbiAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICcmLWFjdGl2ZSc6IHtcbiAgICAgICAgdHJhbnNpdGlvbjogYGhlaWdodCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uTWlkfSAke3Rva2VuLm1vdGlvbkVhc2VJbk91dH0sXG4gICAgICAgIG9wYWNpdHkgJHt0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZH0gJHt0b2tlbi5tb3Rpb25FYXNlSW5PdXR9ICFpbXBvcnRhbnRgXG4gICAgICB9XG4gICAgfSxcbiAgICBbYCR7dG9rZW4uYW50Q2xzfS1tb3Rpb24tY29sbGFwc2VgXToge1xuICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgdHJhbnNpdGlvbjogYGhlaWdodCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uTWlkfSAke3Rva2VuLm1vdGlvbkVhc2VJbk91dH0sXG4gICAgICAgIG9wYWNpdHkgJHt0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZH0gJHt0b2tlbi5tb3Rpb25FYXNlSW5PdXR9ICFpbXBvcnRhbnRgXG4gICAgfVxuICB9XG59KTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGdlbkNvbGxhcHNlTW90aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5pbml0RmFkZU1vdGlvbiA9IGV4cG9ydHMuZmFkZU91dCA9IGV4cG9ydHMuZmFkZUluID0gdm9pZCAwO1xudmFyIF9jc3NpbmpzID0gcmVxdWlyZShcIkBhbnQtZGVzaWduL2Nzc2luanNcIik7XG52YXIgX21vdGlvbiA9IHJlcXVpcmUoXCIuL21vdGlvblwiKTtcbmNvbnN0IGZhZGVJbiA9IGV4cG9ydHMuZmFkZUluID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50RmFkZUluJywge1xuICAnMCUnOiB7XG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuY29uc3QgZmFkZU91dCA9IGV4cG9ydHMuZmFkZU91dCA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudEZhZGVPdXQnLCB7XG4gICcwJSc6IHtcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5jb25zdCBpbml0RmFkZU1vdGlvbiA9ICh0b2tlbiwgc2FtZUxldmVsID0gZmFsc2UpID0+IHtcbiAgY29uc3Qge1xuICAgIGFudENsc1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IG1vdGlvbkNscyA9IGAke2FudENsc30tZmFkZWA7XG4gIGNvbnN0IHNhbWVMZXZlbFByZWZpeCA9IHNhbWVMZXZlbCA/ICcmJyA6ICcnO1xuICByZXR1cm4gWygwLCBfbW90aW9uLmluaXRNb3Rpb24pKG1vdGlvbkNscywgZmFkZUluLCBmYWRlT3V0LCB0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZCwgc2FtZUxldmVsKSwge1xuICAgIFtgXG4gICAgICAgICR7c2FtZUxldmVsUHJlZml4fSR7bW90aW9uQ2xzfS1lbnRlcixcbiAgICAgICAgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWFwcGVhclxuICAgICAgYF06IHtcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogJ2xpbmVhcidcbiAgICB9LFxuICAgIFtgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWxlYXZlYF06IHtcbiAgICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiAnbGluZWFyJ1xuICAgIH1cbiAgfV07XG59O1xuZXhwb3J0cy5pbml0RmFkZU1vdGlvbiA9IGluaXRGYWRlTW90aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlRGVmYXVsdCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlRGVmYXVsdFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImZhZGVJblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfZmFkZS5mYWRlSW47XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZmFkZU91dFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfZmFkZS5mYWRlT3V0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImdlbkNvbGxhcHNlTW90aW9uXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9jb2xsYXBzZS5kZWZhdWx0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImluaXRGYWRlTW90aW9uXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9mYWRlLmluaXRGYWRlTW90aW9uO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImluaXRNb3ZlTW90aW9uXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9tb3ZlLmluaXRNb3ZlTW90aW9uO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImluaXRTbGlkZU1vdGlvblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfc2xpZGUuaW5pdFNsaWRlTW90aW9uO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcImluaXRab29tTW90aW9uXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF96b29tLmluaXRab29tTW90aW9uO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm1vdmVEb3duSW5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX21vdmUubW92ZURvd25JbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJtb3ZlRG93bk91dFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfbW92ZS5tb3ZlRG93bk91dDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJtb3ZlTGVmdEluXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9tb3ZlLm1vdmVMZWZ0SW47XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibW92ZUxlZnRPdXRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX21vdmUubW92ZUxlZnRPdXQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibW92ZVJpZ2h0SW5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX21vdmUubW92ZVJpZ2h0SW47XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwibW92ZVJpZ2h0T3V0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9tb3ZlLm1vdmVSaWdodE91dDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJtb3ZlVXBJblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfbW92ZS5tb3ZlVXBJbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJtb3ZlVXBPdXRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX21vdmUubW92ZVVwT3V0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInNsaWRlRG93bkluXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9zbGlkZS5zbGlkZURvd25JbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzbGlkZURvd25PdXRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3NsaWRlLnNsaWRlRG93bk91dDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzbGlkZUxlZnRJblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfc2xpZGUuc2xpZGVMZWZ0SW47XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic2xpZGVMZWZ0T3V0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9zbGlkZS5zbGlkZUxlZnRPdXQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic2xpZGVSaWdodEluXCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9zbGlkZS5zbGlkZVJpZ2h0SW47XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwic2xpZGVSaWdodE91dFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfc2xpZGUuc2xpZGVSaWdodE91dDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzbGlkZVVwSW5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3NsaWRlLnNsaWRlVXBJbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJzbGlkZVVwT3V0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF9zbGlkZS5zbGlkZVVwT3V0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInpvb21CaWdJblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfem9vbS56b29tQmlnSW47XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiem9vbUJpZ091dFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfem9vbS56b29tQmlnT3V0O1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInpvb21Eb3duSW5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3pvb20uem9vbURvd25JbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ6b29tRG93bk91dFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfem9vbS56b29tRG93bk91dDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ6b29tSW5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3pvb20uem9vbUluO1xuICB9XG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInpvb21MZWZ0SW5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3pvb20uem9vbUxlZnRJbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ6b29tTGVmdE91dFwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfem9vbS56b29tTGVmdE91dDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ6b29tT3V0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF96b29tLnpvb21PdXQ7XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiem9vbVJpZ2h0SW5cIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3pvb20uem9vbVJpZ2h0SW47XG4gIH1cbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiem9vbVJpZ2h0T3V0XCIsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF96b29tLnpvb21SaWdodE91dDtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ6b29tVXBJblwiLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfem9vbS56b29tVXBJbjtcbiAgfVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJ6b29tVXBPdXRcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX3pvb20uem9vbVVwT3V0O1xuICB9XG59KTtcbnZhciBfY29sbGFwc2UgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2NvbGxhcHNlXCIpKTtcbnZhciBfZmFkZSA9IHJlcXVpcmUoXCIuL2ZhZGVcIik7XG52YXIgX21vdmUgPSByZXF1aXJlKFwiLi9tb3ZlXCIpO1xudmFyIF9zbGlkZSA9IHJlcXVpcmUoXCIuL3NsaWRlXCIpO1xudmFyIF96b29tID0gcmVxdWlyZShcIi4vem9vbVwiKTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuaW5pdE1vdGlvbiA9IHZvaWQgMDtcbmNvbnN0IGluaXRNb3Rpb25Db21tb24gPSBkdXJhdGlvbiA9PiAoe1xuICBhbmltYXRpb25EdXJhdGlvbjogZHVyYXRpb24sXG4gIGFuaW1hdGlvbkZpbGxNb2RlOiAnYm90aCdcbn0pO1xuLy8gRklYTUU6IG9yaWdpbiBsZXNzIGNvZGUgc2VlbXMgc2FtZSBhcyBpbml0TW90aW9uQ29tbW9uLiBNYXliZSB3ZSBjYW4gc2FmZSByZW1vdmVcbmNvbnN0IGluaXRNb3Rpb25Db21tb25MZWF2ZSA9IGR1cmF0aW9uID0+ICh7XG4gIGFuaW1hdGlvbkR1cmF0aW9uOiBkdXJhdGlvbixcbiAgYW5pbWF0aW9uRmlsbE1vZGU6ICdib3RoJ1xufSk7XG5jb25zdCBpbml0TW90aW9uID0gKG1vdGlvbkNscywgaW5LZXlmcmFtZXMsIG91dEtleWZyYW1lcywgZHVyYXRpb24sIHNhbWVMZXZlbCA9IGZhbHNlKSA9PiB7XG4gIGNvbnN0IHNhbWVMZXZlbFByZWZpeCA9IHNhbWVMZXZlbCA/ICcmJyA6ICcnO1xuICByZXR1cm4ge1xuICAgIFtgXG4gICAgICAke3NhbWVMZXZlbFByZWZpeH0ke21vdGlvbkNsc30tZW50ZXIsXG4gICAgICAke3NhbWVMZXZlbFByZWZpeH0ke21vdGlvbkNsc30tYXBwZWFyXG4gICAgYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgaW5pdE1vdGlvbkNvbW1vbihkdXJhdGlvbikpLCB7XG4gICAgICBhbmltYXRpb25QbGF5U3RhdGU6ICdwYXVzZWQnXG4gICAgfSksXG4gICAgW2Ake3NhbWVMZXZlbFByZWZpeH0ke21vdGlvbkNsc30tbGVhdmVgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpbml0TW90aW9uQ29tbW9uTGVhdmUoZHVyYXRpb24pKSwge1xuICAgICAgYW5pbWF0aW9uUGxheVN0YXRlOiAncGF1c2VkJ1xuICAgIH0pLFxuICAgIFtgXG4gICAgICAke3NhbWVMZXZlbFByZWZpeH0ke21vdGlvbkNsc30tZW50ZXIke21vdGlvbkNsc30tZW50ZXItYWN0aXZlLFxuICAgICAgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWFwcGVhciR7bW90aW9uQ2xzfS1hcHBlYXItYWN0aXZlXG4gICAgYF06IHtcbiAgICAgIGFuaW1hdGlvbk5hbWU6IGluS2V5ZnJhbWVzLFxuICAgICAgYW5pbWF0aW9uUGxheVN0YXRlOiAncnVubmluZydcbiAgICB9LFxuICAgIFtgJHtzYW1lTGV2ZWxQcmVmaXh9JHttb3Rpb25DbHN9LWxlYXZlJHttb3Rpb25DbHN9LWxlYXZlLWFjdGl2ZWBdOiB7XG4gICAgICBhbmltYXRpb25OYW1lOiBvdXRLZXlmcmFtZXMsXG4gICAgICBhbmltYXRpb25QbGF5U3RhdGU6ICdydW5uaW5nJyxcbiAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgIH1cbiAgfTtcbn07XG5leHBvcnRzLmluaXRNb3Rpb24gPSBpbml0TW90aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5tb3ZlVXBPdXQgPSBleHBvcnRzLm1vdmVVcEluID0gZXhwb3J0cy5tb3ZlUmlnaHRPdXQgPSBleHBvcnRzLm1vdmVSaWdodEluID0gZXhwb3J0cy5tb3ZlTGVmdE91dCA9IGV4cG9ydHMubW92ZUxlZnRJbiA9IGV4cG9ydHMubW92ZURvd25PdXQgPSBleHBvcnRzLm1vdmVEb3duSW4gPSBleHBvcnRzLmluaXRNb3ZlTW90aW9uID0gdm9pZCAwO1xudmFyIF9jc3NpbmpzID0gcmVxdWlyZShcIkBhbnQtZGVzaWduL2Nzc2luanNcIik7XG52YXIgX21vdGlvbiA9IHJlcXVpcmUoXCIuL21vdGlvblwiKTtcbmNvbnN0IG1vdmVEb3duSW4gPSBleHBvcnRzLm1vdmVEb3duSW4gPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRNb3ZlRG93bkluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMTAwJSwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuY29uc3QgbW92ZURvd25PdXQgPSBleHBvcnRzLm1vdmVEb3duT3V0ID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50TW92ZURvd25PdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDEwMCUsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5jb25zdCBtb3ZlTGVmdEluID0gZXhwb3J0cy5tb3ZlTGVmdEluID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50TW92ZUxlZnRJbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5jb25zdCBtb3ZlTGVmdE91dCA9IGV4cG9ydHMubW92ZUxlZnRPdXQgPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRNb3ZlTGVmdE91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDFcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5jb25zdCBtb3ZlUmlnaHRJbiA9IGV4cG9ydHMubW92ZVJpZ2h0SW4gPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRNb3ZlUmlnaHRJbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDEwMCUsIDAsIDApJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwIDAnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMVxuICB9XG59KTtcbmNvbnN0IG1vdmVSaWdodE91dCA9IGV4cG9ydHMubW92ZVJpZ2h0T3V0ID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50TW92ZVJpZ2h0T3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoMCwgMCwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMVxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3QgbW92ZVVwSW4gPSBleHBvcnRzLm1vdmVVcEluID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50TW92ZVVwSW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAtMTAwJSwgMCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAgMCcsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuY29uc3QgbW92ZVVwT3V0ID0gZXhwb3J0cy5tb3ZlVXBPdXQgPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRNb3ZlVXBPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgwLCAwLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsIC0xMDAlLCAwKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCAwJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3QgbW92ZU1vdGlvbiA9IHtcbiAgJ21vdmUtdXAnOiB7XG4gICAgaW5LZXlmcmFtZXM6IG1vdmVVcEluLFxuICAgIG91dEtleWZyYW1lczogbW92ZVVwT3V0XG4gIH0sXG4gICdtb3ZlLWRvd24nOiB7XG4gICAgaW5LZXlmcmFtZXM6IG1vdmVEb3duSW4sXG4gICAgb3V0S2V5ZnJhbWVzOiBtb3ZlRG93bk91dFxuICB9LFxuICAnbW92ZS1sZWZ0Jzoge1xuICAgIGluS2V5ZnJhbWVzOiBtb3ZlTGVmdEluLFxuICAgIG91dEtleWZyYW1lczogbW92ZUxlZnRPdXRcbiAgfSxcbiAgJ21vdmUtcmlnaHQnOiB7XG4gICAgaW5LZXlmcmFtZXM6IG1vdmVSaWdodEluLFxuICAgIG91dEtleWZyYW1lczogbW92ZVJpZ2h0T3V0XG4gIH1cbn07XG5jb25zdCBpbml0TW92ZU1vdGlvbiA9ICh0b2tlbiwgbW90aW9uTmFtZSkgPT4ge1xuICBjb25zdCB7XG4gICAgYW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgbW90aW9uQ2xzID0gYCR7YW50Q2xzfS0ke21vdGlvbk5hbWV9YDtcbiAgY29uc3Qge1xuICAgIGluS2V5ZnJhbWVzLFxuICAgIG91dEtleWZyYW1lc1xuICB9ID0gbW92ZU1vdGlvblttb3Rpb25OYW1lXTtcbiAgcmV0dXJuIFsoMCwgX21vdGlvbi5pbml0TW90aW9uKShtb3Rpb25DbHMsIGluS2V5ZnJhbWVzLCBvdXRLZXlmcmFtZXMsIHRva2VuLm1vdGlvbkR1cmF0aW9uTWlkKSwge1xuICAgIFtgXG4gICAgICAgICR7bW90aW9uQ2xzfS1lbnRlcixcbiAgICAgICAgJHttb3Rpb25DbHN9LWFwcGVhclxuICAgICAgYF06IHtcbiAgICAgIG9wYWNpdHk6IDAsXG4gICAgICBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjogdG9rZW4ubW90aW9uRWFzZU91dENpcmNcbiAgICB9LFxuICAgIFtgJHttb3Rpb25DbHN9LWxlYXZlYF06IHtcbiAgICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiB0b2tlbi5tb3Rpb25FYXNlSW5PdXRDaXJjXG4gICAgfVxuICB9XTtcbn07XG5leHBvcnRzLmluaXRNb3ZlTW90aW9uID0gaW5pdE1vdmVNb3Rpb247IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnNsaWRlVXBPdXQgPSBleHBvcnRzLnNsaWRlVXBJbiA9IGV4cG9ydHMuc2xpZGVSaWdodE91dCA9IGV4cG9ydHMuc2xpZGVSaWdodEluID0gZXhwb3J0cy5zbGlkZUxlZnRPdXQgPSBleHBvcnRzLnNsaWRlTGVmdEluID0gZXhwb3J0cy5zbGlkZURvd25PdXQgPSBleHBvcnRzLnNsaWRlRG93bkluID0gZXhwb3J0cy5pbml0U2xpZGVNb3Rpb24gPSB2b2lkIDA7XG52YXIgX2Nzc2luanMgPSByZXF1aXJlKFwiQGFudC1kZXNpZ24vY3NzaW5qc1wiKTtcbnZhciBfbW90aW9uID0gcmVxdWlyZShcIi4vbW90aW9uXCIpO1xuY29uc3Qgc2xpZGVVcEluID0gZXhwb3J0cy5zbGlkZVVwSW4gPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRTbGlkZVVwSW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVkoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVZKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJScsXG4gICAgb3BhY2l0eTogMVxuICB9XG59KTtcbmNvbnN0IHNsaWRlVXBPdXQgPSBleHBvcnRzLnNsaWRlVXBPdXQgPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRTbGlkZVVwT3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVZKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJScsXG4gICAgb3BhY2l0eTogMVxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVkoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5jb25zdCBzbGlkZURvd25JbiA9IGV4cG9ydHMuc2xpZGVEb3duSW4gPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRTbGlkZURvd25JbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDEwMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVZKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDEwMCUnLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5jb25zdCBzbGlkZURvd25PdXQgPSBleHBvcnRzLnNsaWRlRG93bk91dCA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudFNsaWRlRG93bk91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSAxMDAlJyxcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDEwMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5jb25zdCBzbGlkZUxlZnRJbiA9IGV4cG9ydHMuc2xpZGVMZWZ0SW4gPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRTbGlkZUxlZnRJbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWCgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJScsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVgoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJyxcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuY29uc3Qgc2xpZGVMZWZ0T3V0ID0gZXhwb3J0cy5zbGlkZUxlZnRPdXQgPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRTbGlkZUxlZnRPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVgoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzAlIDAlJyxcbiAgICBvcGFjaXR5OiAxXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlWCgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSAwJScsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmNvbnN0IHNsaWRlUmlnaHRJbiA9IGV4cG9ydHMuc2xpZGVSaWdodEluID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50U2xpZGVSaWdodEluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVYKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVYKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDAlJyxcbiAgICBvcGFjaXR5OiAxXG4gIH1cbn0pO1xuY29uc3Qgc2xpZGVSaWdodE91dCA9IGV4cG9ydHMuc2xpZGVSaWdodE91dCA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudFNsaWRlUmlnaHRPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZVgoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgMCUnLFxuICAgIG9wYWNpdHk6IDFcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGVYKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5jb25zdCBzbGlkZU1vdGlvbiA9IHtcbiAgJ3NsaWRlLXVwJzoge1xuICAgIGluS2V5ZnJhbWVzOiBzbGlkZVVwSW4sXG4gICAgb3V0S2V5ZnJhbWVzOiBzbGlkZVVwT3V0XG4gIH0sXG4gICdzbGlkZS1kb3duJzoge1xuICAgIGluS2V5ZnJhbWVzOiBzbGlkZURvd25JbixcbiAgICBvdXRLZXlmcmFtZXM6IHNsaWRlRG93bk91dFxuICB9LFxuICAnc2xpZGUtbGVmdCc6IHtcbiAgICBpbktleWZyYW1lczogc2xpZGVMZWZ0SW4sXG4gICAgb3V0S2V5ZnJhbWVzOiBzbGlkZUxlZnRPdXRcbiAgfSxcbiAgJ3NsaWRlLXJpZ2h0Jzoge1xuICAgIGluS2V5ZnJhbWVzOiBzbGlkZVJpZ2h0SW4sXG4gICAgb3V0S2V5ZnJhbWVzOiBzbGlkZVJpZ2h0T3V0XG4gIH1cbn07XG5jb25zdCBpbml0U2xpZGVNb3Rpb24gPSAodG9rZW4sIG1vdGlvbk5hbWUpID0+IHtcbiAgY29uc3Qge1xuICAgIGFudENsc1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IG1vdGlvbkNscyA9IGAke2FudENsc30tJHttb3Rpb25OYW1lfWA7XG4gIGNvbnN0IHtcbiAgICBpbktleWZyYW1lcyxcbiAgICBvdXRLZXlmcmFtZXNcbiAgfSA9IHNsaWRlTW90aW9uW21vdGlvbk5hbWVdO1xuICByZXR1cm4gWygwLCBfbW90aW9uLmluaXRNb3Rpb24pKG1vdGlvbkNscywgaW5LZXlmcmFtZXMsIG91dEtleWZyYW1lcywgdG9rZW4ubW90aW9uRHVyYXRpb25NaWQpLCB7XG4gICAgW2BcbiAgICAgICR7bW90aW9uQ2xzfS1lbnRlcixcbiAgICAgICR7bW90aW9uQ2xzfS1hcHBlYXJcbiAgICBgXToge1xuICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMCknLFxuICAgICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgMCUnLFxuICAgICAgb3BhY2l0eTogMCxcbiAgICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiB0b2tlbi5tb3Rpb25FYXNlT3V0UXVpbnQsXG4gICAgICAnJi1wcmVwYXJlJzoge1xuICAgICAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKSdcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgJHttb3Rpb25DbHN9LWxlYXZlYF06IHtcbiAgICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiB0b2tlbi5tb3Rpb25FYXNlSW5RdWludFxuICAgIH1cbiAgfV07XG59O1xuZXhwb3J0cy5pbml0U2xpZGVNb3Rpb24gPSBpbml0U2xpZGVNb3Rpb247IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnpvb21VcE91dCA9IGV4cG9ydHMuem9vbVVwSW4gPSBleHBvcnRzLnpvb21SaWdodE91dCA9IGV4cG9ydHMuem9vbVJpZ2h0SW4gPSBleHBvcnRzLnpvb21PdXQgPSBleHBvcnRzLnpvb21MZWZ0T3V0ID0gZXhwb3J0cy56b29tTGVmdEluID0gZXhwb3J0cy56b29tSW4gPSBleHBvcnRzLnpvb21Eb3duT3V0ID0gZXhwb3J0cy56b29tRG93bkluID0gZXhwb3J0cy56b29tQmlnT3V0ID0gZXhwb3J0cy56b29tQmlnSW4gPSBleHBvcnRzLmluaXRab29tTW90aW9uID0gdm9pZCAwO1xudmFyIF9jc3NpbmpzID0gcmVxdWlyZShcIkBhbnQtZGVzaWduL2Nzc2luanNcIik7XG52YXIgX21vdGlvbiA9IHJlcXVpcmUoXCIuL21vdGlvblwiKTtcbmNvbnN0IHpvb21JbiA9IGV4cG9ydHMuem9vbUluID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50Wm9vbUluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC4yKScsXG4gICAgb3BhY2l0eTogMFxuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgb3BhY2l0eTogMVxuICB9XG59KTtcbmNvbnN0IHpvb21PdXQgPSBleHBvcnRzLnpvb21PdXQgPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRab29tT3V0Jywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuMiknLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5jb25zdCB6b29tQmlnSW4gPSBleHBvcnRzLnpvb21CaWdJbiA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudFpvb21CaWdJbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknLFxuICAgIG9wYWNpdHk6IDFcbiAgfVxufSk7XG5jb25zdCB6b29tQmlnT3V0ID0gZXhwb3J0cy56b29tQmlnT3V0ID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50Wm9vbUJpZ091dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJ1xuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjgpJyxcbiAgICBvcGFjaXR5OiAwXG4gIH1cbn0pO1xuY29uc3Qgem9vbVVwSW4gPSBleHBvcnRzLnpvb21VcEluID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50Wm9vbVVwSW4nLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICc1MCUgMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzUwJSAwJSdcbiAgfVxufSk7XG5jb25zdCB6b29tVXBPdXQgPSBleHBvcnRzLnpvb21VcE91dCA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudFpvb21VcE91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICc1MCUgMCUnXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzUwJSAwJScsXG4gICAgb3BhY2l0eTogMFxuICB9XG59KTtcbmNvbnN0IHpvb21MZWZ0SW4gPSBleHBvcnRzLnpvb21MZWZ0SW4gPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRab29tTGVmdEluJywge1xuICAnMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgNTAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSA1MCUnXG4gIH1cbn0pO1xuY29uc3Qgem9vbUxlZnRPdXQgPSBleHBvcnRzLnpvb21MZWZ0T3V0ID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50Wm9vbUxlZnRPdXQnLCB7XG4gICcwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgxKScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMCUgNTAlJ1xuICB9LFxuICAnMTAwJSc6IHtcbiAgICB0cmFuc2Zvcm06ICdzY2FsZSgwLjgpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcwJSA1MCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5jb25zdCB6b29tUmlnaHRJbiA9IGV4cG9ydHMuem9vbVJpZ2h0SW4gPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRab29tUmlnaHRJbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzEwMCUgNTAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDUwJSdcbiAgfVxufSk7XG5jb25zdCB6b29tUmlnaHRPdXQgPSBleHBvcnRzLnpvb21SaWdodE91dCA9IG5ldyBfY3NzaW5qcy5LZXlmcmFtZXMoJ2FudFpvb21SaWdodE91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICcxMDAlIDUwJSdcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnMTAwJSA1MCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5jb25zdCB6b29tRG93bkluID0gZXhwb3J0cy56b29tRG93bkluID0gbmV3IF9jc3NpbmpzLktleWZyYW1lcygnYW50Wm9vbURvd25JbicsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknLFxuICAgIHRyYW5zZm9ybU9yaWdpbjogJzUwJSAxMDAlJyxcbiAgICBvcGFjaXR5OiAwXG4gIH0sXG4gICcxMDAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICc1MCUgMTAwJSdcbiAgfVxufSk7XG5jb25zdCB6b29tRG93bk91dCA9IGV4cG9ydHMuem9vbURvd25PdXQgPSBuZXcgX2Nzc2luanMuS2V5ZnJhbWVzKCdhbnRab29tRG93bk91dCcsIHtcbiAgJzAlJzoge1xuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJyxcbiAgICB0cmFuc2Zvcm1PcmlnaW46ICc1MCUgMTAwJSdcbiAgfSxcbiAgJzEwMCUnOiB7XG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC44KScsXG4gICAgdHJhbnNmb3JtT3JpZ2luOiAnNTAlIDEwMCUnLFxuICAgIG9wYWNpdHk6IDBcbiAgfVxufSk7XG5jb25zdCB6b29tTW90aW9uID0ge1xuICB6b29tOiB7XG4gICAgaW5LZXlmcmFtZXM6IHpvb21JbixcbiAgICBvdXRLZXlmcmFtZXM6IHpvb21PdXRcbiAgfSxcbiAgJ3pvb20tYmlnJzoge1xuICAgIGluS2V5ZnJhbWVzOiB6b29tQmlnSW4sXG4gICAgb3V0S2V5ZnJhbWVzOiB6b29tQmlnT3V0XG4gIH0sXG4gICd6b29tLWJpZy1mYXN0Jzoge1xuICAgIGluS2V5ZnJhbWVzOiB6b29tQmlnSW4sXG4gICAgb3V0S2V5ZnJhbWVzOiB6b29tQmlnT3V0XG4gIH0sXG4gICd6b29tLWxlZnQnOiB7XG4gICAgaW5LZXlmcmFtZXM6IHpvb21MZWZ0SW4sXG4gICAgb3V0S2V5ZnJhbWVzOiB6b29tTGVmdE91dFxuICB9LFxuICAnem9vbS1yaWdodCc6IHtcbiAgICBpbktleWZyYW1lczogem9vbVJpZ2h0SW4sXG4gICAgb3V0S2V5ZnJhbWVzOiB6b29tUmlnaHRPdXRcbiAgfSxcbiAgJ3pvb20tdXAnOiB7XG4gICAgaW5LZXlmcmFtZXM6IHpvb21VcEluLFxuICAgIG91dEtleWZyYW1lczogem9vbVVwT3V0XG4gIH0sXG4gICd6b29tLWRvd24nOiB7XG4gICAgaW5LZXlmcmFtZXM6IHpvb21Eb3duSW4sXG4gICAgb3V0S2V5ZnJhbWVzOiB6b29tRG93bk91dFxuICB9XG59O1xuY29uc3QgaW5pdFpvb21Nb3Rpb24gPSAodG9rZW4sIG1vdGlvbk5hbWUpID0+IHtcbiAgY29uc3Qge1xuICAgIGFudENsc1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IG1vdGlvbkNscyA9IGAke2FudENsc30tJHttb3Rpb25OYW1lfWA7XG4gIGNvbnN0IHtcbiAgICBpbktleWZyYW1lcyxcbiAgICBvdXRLZXlmcmFtZXNcbiAgfSA9IHpvb21Nb3Rpb25bbW90aW9uTmFtZV07XG4gIHJldHVybiBbKDAsIF9tb3Rpb24uaW5pdE1vdGlvbikobW90aW9uQ2xzLCBpbktleWZyYW1lcywgb3V0S2V5ZnJhbWVzLCBtb3Rpb25OYW1lID09PSAnem9vbS1iaWctZmFzdCcgPyB0b2tlbi5tb3Rpb25EdXJhdGlvbkZhc3QgOiB0b2tlbi5tb3Rpb25EdXJhdGlvbk1pZCksIHtcbiAgICBbYFxuICAgICAgICAke21vdGlvbkNsc30tZW50ZXIsXG4gICAgICAgICR7bW90aW9uQ2xzfS1hcHBlYXJcbiAgICAgIGBdOiB7XG4gICAgICB0cmFuc2Zvcm06ICdzY2FsZSgwKScsXG4gICAgICBvcGFjaXR5OiAwLFxuICAgICAgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb246IHRva2VuLm1vdGlvbkVhc2VPdXRDaXJjLFxuICAgICAgJyYtcHJlcGFyZSc6IHtcbiAgICAgICAgdHJhbnNmb3JtOiAnbm9uZSdcbiAgICAgIH1cbiAgICB9LFxuICAgIFtgJHttb3Rpb25DbHN9LWxlYXZlYF06IHtcbiAgICAgIGFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uOiB0b2tlbi5tb3Rpb25FYXNlSW5PdXRDaXJjXG4gICAgfVxuICB9XTtcbn07XG5leHBvcnRzLmluaXRab29tTW90aW9uID0gaW5pdFpvb21Nb3Rpb247IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLk1BWF9WRVJUSUNBTF9DT05URU5UX1JBRElVUyA9IHZvaWQgMDtcbmV4cG9ydHMuZGVmYXVsdCA9IGdldEFycm93U3R5bGU7XG5leHBvcnRzLmdldEFycm93T2Zmc2V0VG9rZW4gPSBnZXRBcnJvd09mZnNldFRva2VuO1xudmFyIF9jc3NpbmpzID0gcmVxdWlyZShcIkBhbnQtZGVzaWduL2Nzc2luanNcIik7XG52YXIgX3JvdW5kZWRBcnJvdyA9IHJlcXVpcmUoXCIuL3JvdW5kZWRBcnJvd1wiKTtcbmNvbnN0IE1BWF9WRVJUSUNBTF9DT05URU5UX1JBRElVUyA9IGV4cG9ydHMuTUFYX1ZFUlRJQ0FMX0NPTlRFTlRfUkFESVVTID0gODtcbmZ1bmN0aW9uIGdldEFycm93T2Zmc2V0VG9rZW4ob3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgY29udGVudFJhZGl1cyxcbiAgICBsaW1pdFZlcnRpY2FsUmFkaXVzXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBhcnJvd09mZnNldCA9IGNvbnRlbnRSYWRpdXMgPiAxMiA/IGNvbnRlbnRSYWRpdXMgKyAyIDogMTI7XG4gIGNvbnN0IGFycm93T2Zmc2V0VmVydGljYWwgPSBsaW1pdFZlcnRpY2FsUmFkaXVzID8gTUFYX1ZFUlRJQ0FMX0NPTlRFTlRfUkFESVVTIDogYXJyb3dPZmZzZXQ7XG4gIHJldHVybiB7XG4gICAgYXJyb3dPZmZzZXRIb3Jpem9udGFsOiBhcnJvd09mZnNldCxcbiAgICBhcnJvd09mZnNldFZlcnRpY2FsXG4gIH07XG59XG5mdW5jdGlvbiBpc0luamVjdCh2YWxpZCwgY29kZSkge1xuICBpZiAoIXZhbGlkKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIHJldHVybiBjb2RlO1xufVxuZnVuY3Rpb24gZ2V0QXJyb3dTdHlsZSh0b2tlbiwgY29sb3JCZywgb3B0aW9ucykge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGJveFNoYWRvd1BvcG92ZXJBcnJvdyxcbiAgICBhcnJvd09mZnNldFZlcnRpY2FsLFxuICAgIGFycm93T2Zmc2V0SG9yaXpvbnRhbFxuICB9ID0gdG9rZW47XG4gIGNvbnN0IHtcbiAgICBhcnJvd0Rpc3RhbmNlID0gMCxcbiAgICBhcnJvd1BsYWNlbWVudCA9IHtcbiAgICAgIGxlZnQ6IHRydWUsXG4gICAgICByaWdodDogdHJ1ZSxcbiAgICAgIHRvcDogdHJ1ZSxcbiAgICAgIGJvdHRvbTogdHJ1ZVxuICAgIH1cbiAgfSA9IG9wdGlvbnMgfHwge307XG4gIHJldHVybiB7XG4gICAgW2NvbXBvbmVudENsc106IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe1xuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBCYXNpYyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdOiBbT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgZGlzcGxheTogJ2Jsb2NrJ1xuICAgICAgfSwgKDAsIF9yb3VuZGVkQXJyb3cuZ2VuUm91bmRlZEFycm93KSh0b2tlbiwgY29sb3JCZywgYm94U2hhZG93UG9wb3ZlckFycm93KSksIHtcbiAgICAgICAgJyY6YmVmb3JlJzoge1xuICAgICAgICAgIGJhY2tncm91bmQ6IGNvbG9yQmdcbiAgICAgICAgfVxuICAgICAgfSldXG4gICAgfSwgaXNJbmplY3QoISFhcnJvd1BsYWNlbWVudC50b3AsIHtcbiAgICAgIFtbYCYtcGxhY2VtZW50LXRvcCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2AsIGAmLXBsYWNlbWVudC10b3BMZWZ0ID4gJHtjb21wb25lbnRDbHN9LWFycm93YCwgYCYtcGxhY2VtZW50LXRvcFJpZ2h0ID4gJHtjb21wb25lbnRDbHN9LWFycm93YF0uam9pbignLCcpXToge1xuICAgICAgICBib3R0b206IGFycm93RGlzdGFuY2UsXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMTAwJSkgcm90YXRlKDE4MGRlZyknXG4gICAgICB9LFxuICAgICAgW2AmLXBsYWNlbWVudC10b3AgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICBsZWZ0OiB7XG4gICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiAnNTAlJ1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKC01MCUpIHRyYW5zbGF0ZVkoMTAwJSkgcm90YXRlKDE4MGRlZyknXG4gICAgICB9LFxuICAgICAgJyYtcGxhY2VtZW50LXRvcExlZnQnOiB7XG4gICAgICAgICctLWFycm93LW9mZnNldC1ob3Jpem9udGFsJzogYXJyb3dPZmZzZXRIb3Jpem9udGFsLFxuICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgICBsZWZ0OiB7XG4gICAgICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogYXJyb3dPZmZzZXRIb3Jpem9udGFsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgJyYtcGxhY2VtZW50LXRvcFJpZ2h0Jzoge1xuICAgICAgICAnLS1hcnJvdy1vZmZzZXQtaG9yaXpvbnRhbCc6IGBjYWxjKDEwMCUgLSAkeygwLCBfY3NzaW5qcy51bml0KShhcnJvd09mZnNldEhvcml6b250YWwpfSlgLFxuICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgICByaWdodDoge1xuICAgICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IGFycm93T2Zmc2V0SG9yaXpvbnRhbFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKSwgaXNJbmplY3QoISFhcnJvd1BsYWNlbWVudC5ib3R0b20sIHtcbiAgICAgIFtbYCYtcGxhY2VtZW50LWJvdHRvbSA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2AsIGAmLXBsYWNlbWVudC1ib3R0b21MZWZ0ID4gJHtjb21wb25lbnRDbHN9LWFycm93YCwgYCYtcGxhY2VtZW50LWJvdHRvbVJpZ2h0ID4gJHtjb21wb25lbnRDbHN9LWFycm93YF0uam9pbignLCcpXToge1xuICAgICAgICB0b3A6IGFycm93RGlzdGFuY2UsXG4gICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZVkoLTEwMCUpYFxuICAgICAgfSxcbiAgICAgIFtgJi1wbGFjZW1lbnQtYm90dG9tID4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgbGVmdDoge1xuICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogJzUwJSdcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlWCgtNTAlKSB0cmFuc2xhdGVZKC0xMDAlKWBcbiAgICAgIH0sXG4gICAgICAnJi1wbGFjZW1lbnQtYm90dG9tTGVmdCc6IHtcbiAgICAgICAgJy0tYXJyb3ctb2Zmc2V0LWhvcml6b250YWwnOiBhcnJvd09mZnNldEhvcml6b250YWwsXG4gICAgICAgIFtgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICAgIGxlZnQ6IHtcbiAgICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBhcnJvd09mZnNldEhvcml6b250YWxcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnJi1wbGFjZW1lbnQtYm90dG9tUmlnaHQnOiB7XG4gICAgICAgICctLWFycm93LW9mZnNldC1ob3Jpem9udGFsJzogYGNhbGMoMTAwJSAtICR7KDAsIF9jc3NpbmpzLnVuaXQpKGFycm93T2Zmc2V0SG9yaXpvbnRhbCl9KWAsXG4gICAgICAgIFtgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICAgIHJpZ2h0OiB7XG4gICAgICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogYXJyb3dPZmZzZXRIb3Jpem9udGFsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkpLCBpc0luamVjdCghIWFycm93UGxhY2VtZW50LmxlZnQsIHtcbiAgICAgIFtbYCYtcGxhY2VtZW50LWxlZnQgPiAke2NvbXBvbmVudENsc30tYXJyb3dgLCBgJi1wbGFjZW1lbnQtbGVmdFRvcCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2AsIGAmLXBsYWNlbWVudC1sZWZ0Qm90dG9tID4gJHtjb21wb25lbnRDbHN9LWFycm93YF0uam9pbignLCcpXToge1xuICAgICAgICByaWdodDoge1xuICAgICAgICAgIF9za2lwX2NoZWNrXzogdHJ1ZSxcbiAgICAgICAgICB2YWx1ZTogYXJyb3dEaXN0YW5jZVxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDEwMCUpIHJvdGF0ZSg5MGRlZyknXG4gICAgICB9LFxuICAgICAgW2AmLXBsYWNlbWVudC1sZWZ0ID4gJHtjb21wb25lbnRDbHN9LWFycm93YF06IHtcbiAgICAgICAgdG9wOiB7XG4gICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiAnNTAlJ1xuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC01MCUpIHRyYW5zbGF0ZVgoMTAwJSkgcm90YXRlKDkwZGVnKSdcbiAgICAgIH0sXG4gICAgICBbYCYtcGxhY2VtZW50LWxlZnRUb3AgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICB0b3A6IGFycm93T2Zmc2V0VmVydGljYWxcbiAgICAgIH0sXG4gICAgICBbYCYtcGxhY2VtZW50LWxlZnRCb3R0b20gPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICBib3R0b206IGFycm93T2Zmc2V0VmVydGljYWxcbiAgICAgIH1cbiAgICB9KSksIGlzSW5qZWN0KCEhYXJyb3dQbGFjZW1lbnQucmlnaHQsIHtcbiAgICAgIFtbYCYtcGxhY2VtZW50LXJpZ2h0ID4gJHtjb21wb25lbnRDbHN9LWFycm93YCwgYCYtcGxhY2VtZW50LXJpZ2h0VG9wID4gJHtjb21wb25lbnRDbHN9LWFycm93YCwgYCYtcGxhY2VtZW50LXJpZ2h0Qm90dG9tID4gJHtjb21wb25lbnRDbHN9LWFycm93YF0uam9pbignLCcpXToge1xuICAgICAgICBsZWZ0OiB7XG4gICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiBhcnJvd0Rpc3RhbmNlXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTEwMCUpIHJvdGF0ZSgtOTBkZWcpJ1xuICAgICAgfSxcbiAgICAgIFtgJi1wbGFjZW1lbnQtcmlnaHQgPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICB0b3A6IHtcbiAgICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgICAgdmFsdWU6ICc1MCUnXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTUwJSkgdHJhbnNsYXRlWCgtMTAwJSkgcm90YXRlKC05MGRlZyknXG4gICAgICB9LFxuICAgICAgW2AmLXBsYWNlbWVudC1yaWdodFRvcCA+ICR7Y29tcG9uZW50Q2xzfS1hcnJvd2BdOiB7XG4gICAgICAgIHRvcDogYXJyb3dPZmZzZXRWZXJ0aWNhbFxuICAgICAgfSxcbiAgICAgIFtgJi1wbGFjZW1lbnQtcmlnaHRCb3R0b20gPiAke2NvbXBvbmVudENsc30tYXJyb3dgXToge1xuICAgICAgICBib3R0b206IGFycm93T2Zmc2V0VmVydGljYWxcbiAgICAgIH1cbiAgICB9KSlcbiAgfTtcbn0iLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZ2VuUm91bmRlZEFycm93ID0gdm9pZCAwO1xuZXhwb3J0cy5nZXRBcnJvd1Rva2VuID0gZ2V0QXJyb3dUb2tlbjtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xuZnVuY3Rpb24gZ2V0QXJyb3dUb2tlbih0b2tlbikge1xuICBjb25zdCB7XG4gICAgc2l6ZVBvcHVwQXJyb3csXG4gICAgYm9yZGVyUmFkaXVzWFMsXG4gICAgYm9yZGVyUmFkaXVzT3V0ZXJcbiAgfSA9IHRva2VuO1xuICBjb25zdCB1bml0V2lkdGggPSBzaXplUG9wdXBBcnJvdyAvIDI7XG4gIGNvbnN0IGF4ID0gMDtcbiAgY29uc3QgYXkgPSB1bml0V2lkdGg7XG4gIGNvbnN0IGJ4ID0gYm9yZGVyUmFkaXVzT3V0ZXIgKiAxIC8gTWF0aC5zcXJ0KDIpO1xuICBjb25zdCBieSA9IHVuaXRXaWR0aCAtIGJvcmRlclJhZGl1c091dGVyICogKDEgLSAxIC8gTWF0aC5zcXJ0KDIpKTtcbiAgY29uc3QgY3ggPSB1bml0V2lkdGggLSBib3JkZXJSYWRpdXNYUyAqICgxIC8gTWF0aC5zcXJ0KDIpKTtcbiAgY29uc3QgY3kgPSBib3JkZXJSYWRpdXNPdXRlciAqIChNYXRoLnNxcnQoMikgLSAxKSArIGJvcmRlclJhZGl1c1hTICogKDEgLyBNYXRoLnNxcnQoMikpO1xuICBjb25zdCBkeCA9IDIgKiB1bml0V2lkdGggLSBjeDtcbiAgY29uc3QgZHkgPSBjeTtcbiAgY29uc3QgZXggPSAyICogdW5pdFdpZHRoIC0gYng7XG4gIGNvbnN0IGV5ID0gYnk7XG4gIGNvbnN0IGZ4ID0gMiAqIHVuaXRXaWR0aCAtIGF4O1xuICBjb25zdCBmeSA9IGF5O1xuICBjb25zdCBzaGFkb3dXaWR0aCA9IHVuaXRXaWR0aCAqIE1hdGguc3FydCgyKSArIGJvcmRlclJhZGl1c091dGVyICogKE1hdGguc3FydCgyKSAtIDIpO1xuICBjb25zdCBwb2x5Z29uT2Zmc2V0ID0gYm9yZGVyUmFkaXVzT3V0ZXIgKiAoTWF0aC5zcXJ0KDIpIC0gMSk7XG4gIGNvbnN0IGFycm93UG9seWdvbiA9IGBwb2x5Z29uKCR7cG9seWdvbk9mZnNldH1weCAxMDAlLCA1MCUgJHtwb2x5Z29uT2Zmc2V0fXB4LCAkezIgKiB1bml0V2lkdGggLSBwb2x5Z29uT2Zmc2V0fXB4IDEwMCUsICR7cG9seWdvbk9mZnNldH1weCAxMDAlKWA7XG4gIGNvbnN0IGFycm93UGF0aCA9IGBwYXRoKCdNICR7YXh9ICR7YXl9IEEgJHtib3JkZXJSYWRpdXNPdXRlcn0gJHtib3JkZXJSYWRpdXNPdXRlcn0gMCAwIDAgJHtieH0gJHtieX0gTCAke2N4fSAke2N5fSBBICR7Ym9yZGVyUmFkaXVzWFN9ICR7Ym9yZGVyUmFkaXVzWFN9IDAgMCAxICR7ZHh9ICR7ZHl9IEwgJHtleH0gJHtleX0gQSAke2JvcmRlclJhZGl1c091dGVyfSAke2JvcmRlclJhZGl1c091dGVyfSAwIDAgMCAke2Z4fSAke2Z5fSBaJylgO1xuICByZXR1cm4ge1xuICAgIGFycm93U2hhZG93V2lkdGg6IHNoYWRvd1dpZHRoLFxuICAgIGFycm93UGF0aCxcbiAgICBhcnJvd1BvbHlnb25cbiAgfTtcbn1cbmNvbnN0IGdlblJvdW5kZWRBcnJvdyA9ICh0b2tlbiwgYmdDb2xvciwgYm94U2hhZG93KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBzaXplUG9wdXBBcnJvdyxcbiAgICBhcnJvd1BvbHlnb24sXG4gICAgYXJyb3dQYXRoLFxuICAgIGFycm93U2hhZG93V2lkdGgsXG4gICAgYm9yZGVyUmFkaXVzWFMsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgIHdpZHRoOiBzaXplUG9wdXBBcnJvdyxcbiAgICBoZWlnaHQ6IHNpemVQb3B1cEFycm93LFxuICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAnJjo6YmVmb3JlJzoge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBib3R0b206IDAsXG4gICAgICBpbnNldElubGluZVN0YXJ0OiAwLFxuICAgICAgd2lkdGg6IHNpemVQb3B1cEFycm93LFxuICAgICAgaGVpZ2h0OiBjYWxjKHNpemVQb3B1cEFycm93KS5kaXYoMikuZXF1YWwoKSxcbiAgICAgIGJhY2tncm91bmQ6IGJnQ29sb3IsXG4gICAgICBjbGlwUGF0aDoge1xuICAgICAgICBfbXVsdGlfdmFsdWVfOiB0cnVlLFxuICAgICAgICB2YWx1ZTogW2Fycm93UG9seWdvbiwgYXJyb3dQYXRoXVxuICAgICAgfSxcbiAgICAgIGNvbnRlbnQ6ICdcIlwiJ1xuICAgIH0sXG4gICAgJyY6OmFmdGVyJzoge1xuICAgICAgY29udGVudDogJ1wiXCInLFxuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICB3aWR0aDogYXJyb3dTaGFkb3dXaWR0aCxcbiAgICAgIGhlaWdodDogYXJyb3dTaGFkb3dXaWR0aCxcbiAgICAgIGJvdHRvbTogMCxcbiAgICAgIGluc2V0SW5saW5lOiAwLFxuICAgICAgbWFyZ2luOiAnYXV0bycsXG4gICAgICBib3JkZXJSYWRpdXM6IHtcbiAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICB2YWx1ZTogYDAgMCAkeygwLCBfY3NzaW5qcy51bml0KShib3JkZXJSYWRpdXNYUyl9IDBgXG4gICAgICB9LFxuICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSg1MCUpIHJvdGF0ZSgtMTM1ZGVnKScsXG4gICAgICBib3hTaGFkb3csXG4gICAgICB6SW5kZXg6IDAsXG4gICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnXG4gICAgfVxuICB9O1xufTtcbmV4cG9ydHMuZ2VuUm91bmRlZEFycm93ID0gZ2VuUm91bmRlZEFycm93OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbi8qKiBUaGlzIGlzIGEgc3ludGFjdGljIHN1Z2FyIGZvciBgY29sdW1uc2AgcHJvcC4gU28gSE9DIHdpbGwgbm90IHdvcmsgb24gdGhpcy4gKi9cbmNvbnN0IENvbHVtbiA9IF8gPT4gbnVsbDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IENvbHVtbjsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4vKiogVGhpcyBpcyBhIHN5bnRhY3RpYyBzdWdhciBmb3IgYGNvbHVtbnNgIHByb3AuIFNvIEhPQyB3aWxsIG5vdCB3b3JrIG9uIHRoaXMuICovXG5jb25zdCBDb2x1bW5Hcm91cCA9IF8gPT4gbnVsbDtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IENvbHVtbkdyb3VwOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xuZnVuY3Rpb24gcmVuZGVyRXhwYW5kSWNvbihsb2NhbGUpIHtcbiAgcmV0dXJuIHByb3BzID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBwcmVmaXhDbHMsXG4gICAgICBvbkV4cGFuZCxcbiAgICAgIHJlY29yZCxcbiAgICAgIGV4cGFuZGVkLFxuICAgICAgZXhwYW5kYWJsZVxuICAgIH0gPSBwcm9wcztcbiAgICBjb25zdCBpY29uUHJlZml4ID0gYCR7cHJlZml4Q2xzfS1yb3ctZXhwYW5kLWljb25gO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7XG4gICAgICB0eXBlOiBcImJ1dHRvblwiLFxuICAgICAgb25DbGljazogZSA9PiB7XG4gICAgICAgIG9uRXhwYW5kKHJlY29yZCwgZSk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9LFxuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoaWNvblByZWZpeCwge1xuICAgICAgICBbYCR7aWNvblByZWZpeH0tc3BhY2VkYF06ICFleHBhbmRhYmxlLFxuICAgICAgICBbYCR7aWNvblByZWZpeH0tZXhwYW5kZWRgXTogZXhwYW5kYWJsZSAmJiBleHBhbmRlZCxcbiAgICAgICAgW2Ake2ljb25QcmVmaXh9LWNvbGxhcHNlZGBdOiBleHBhbmRhYmxlICYmICFleHBhbmRlZFxuICAgICAgfSksXG4gICAgICBcImFyaWEtbGFiZWxcIjogZXhwYW5kZWQgPyBsb2NhbGUuY29sbGFwc2UgOiBsb2NhbGUuZXhwYW5kLFxuICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IGV4cGFuZGVkXG4gICAgfSk7XG4gIH07XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSByZW5kZXJFeHBhbmRJY29uOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xudmFyIF9yY1RhYmxlID0gcmVxdWlyZShcInJjLXRhYmxlXCIpO1xudmFyIF91c2VDb2x1bW5zID0gcmVxdWlyZShcInJjLXRhYmxlL2xpYi9ob29rcy91c2VDb2x1bW5zXCIpO1xudmFyIF9vbWl0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvb21pdFwiKSk7XG52YXIgX3VzZVByb3h5SW1wZXJhdGl2ZUhhbmRsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL191dGlsL2hvb2tzL3VzZVByb3h5SW1wZXJhdGl2ZUhhbmRsZVwiKSk7XG52YXIgX3Njcm9sbFRvID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vX3V0aWwvc2Nyb2xsVG9cIikpO1xudmFyIF93YXJuaW5nID0gcmVxdWlyZShcIi4uL191dGlsL3dhcm5pbmdcIik7XG52YXIgX2NvbnRleHQgPSByZXF1aXJlKFwiLi4vY29uZmlnLXByb3ZpZGVyL2NvbnRleHRcIik7XG52YXIgX2RlZmF1bHRSZW5kZXJFbXB0eSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlci9kZWZhdWx0UmVuZGVyRW1wdHlcIikpO1xudmFyIF91c2VDU1NWYXJDbHMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi9jb25maWctcHJvdmlkZXIvaG9va3MvdXNlQ1NTVmFyQ2xzXCIpKTtcbnZhciBfdXNlU2l6ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2NvbmZpZy1wcm92aWRlci9ob29rcy91c2VTaXplXCIpKTtcbnZhciBfdXNlQnJlYWtwb2ludCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL2dyaWQvaG9va3MvdXNlQnJlYWtwb2ludFwiKSk7XG52YXIgX2VuX1VTID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vbG9jYWxlL2VuX1VTXCIpKTtcbnZhciBfcGFnaW5hdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uL3BhZ2luYXRpb25cIikpO1xudmFyIF9zcGluID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vc3BpblwiKSk7XG52YXIgX2ludGVybmFsID0gcmVxdWlyZShcIi4uL3RoZW1lL2ludGVybmFsXCIpO1xudmFyIF9FeHBhbmRJY29uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9FeHBhbmRJY29uXCIpKTtcbnZhciBfdXNlQ29udGFpbmVyV2lkdGggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2hvb2tzL3VzZUNvbnRhaW5lcldpZHRoXCIpKTtcbnZhciBfdXNlRmlsdGVyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vaG9va3MvdXNlRmlsdGVyXCIpKTtcbnZhciBfdXNlTGF6eUtWTWFwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VMYXp5S1ZNYXBcIikpO1xudmFyIF91c2VQYWdpbmF0aW9uID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vaG9va3MvdXNlUGFnaW5hdGlvblwiKSk7XG52YXIgX3VzZVNlbGVjdGlvbiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vaG9va3MvdXNlU2VsZWN0aW9uXCIpKTtcbnZhciBfdXNlU29ydGVyID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcIi4vaG9va3MvdXNlU29ydGVyXCIpKTtcbnZhciBfdXNlVGl0bGVDb2x1bW5zID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9ob29rcy91c2VUaXRsZUNvbHVtbnNcIikpO1xudmFyIF9SY1RhYmxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9SY1RhYmxlXCIpKTtcbnZhciBfVmlydHVhbFRhYmxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9SY1RhYmxlL1ZpcnR1YWxUYWJsZVwiKSk7XG52YXIgX3N0eWxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zdHlsZVwiKSk7XG5jb25zdCBFTVBUWV9MSVNUID0gW107XG5jb25zdCBJbnRlcm5hbFRhYmxlID0gKHByb3BzLCByZWYpID0+IHtcbiAgdmFyIF9hLCBfYjtcbiAgY29uc3Qge1xuICAgIHByZWZpeENsczogY3VzdG9taXplUHJlZml4Q2xzLFxuICAgIGNsYXNzTmFtZSxcbiAgICByb290Q2xhc3NOYW1lLFxuICAgIHN0eWxlLFxuICAgIHNpemU6IGN1c3RvbWl6ZVNpemUsXG4gICAgYm9yZGVyZWQsXG4gICAgZHJvcGRvd25QcmVmaXhDbHM6IGN1c3RvbWl6ZURyb3Bkb3duUHJlZml4Q2xzLFxuICAgIGRhdGFTb3VyY2UsXG4gICAgcGFnaW5hdGlvbixcbiAgICByb3dTZWxlY3Rpb24sXG4gICAgcm93S2V5ID0gJ2tleScsXG4gICAgcm93Q2xhc3NOYW1lLFxuICAgIGNvbHVtbnMsXG4gICAgY2hpbGRyZW4sXG4gICAgY2hpbGRyZW5Db2x1bW5OYW1lOiBsZWdhY3lDaGlsZHJlbkNvbHVtbk5hbWUsXG4gICAgb25DaGFuZ2UsXG4gICAgZ2V0UG9wdXBDb250YWluZXIsXG4gICAgbG9hZGluZyxcbiAgICBleHBhbmRJY29uLFxuICAgIGV4cGFuZGFibGUsXG4gICAgZXhwYW5kZWRSb3dSZW5kZXIsXG4gICAgZXhwYW5kSWNvbkNvbHVtbkluZGV4LFxuICAgIGluZGVudFNpemUsXG4gICAgc2Nyb2xsLFxuICAgIHNvcnREaXJlY3Rpb25zLFxuICAgIGxvY2FsZSxcbiAgICBzaG93U29ydGVyVG9vbHRpcCA9IHtcbiAgICAgIHRhcmdldDogJ2Z1bGwtaGVhZGVyJ1xuICAgIH0sXG4gICAgdmlydHVhbFxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHdhcm5pbmcgPSAoMCwgX3dhcm5pbmcuZGV2VXNlV2FybmluZykoJ1RhYmxlJyk7XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyghKHR5cGVvZiByb3dLZXkgPT09ICdmdW5jdGlvbicgJiYgcm93S2V5Lmxlbmd0aCA+IDEpLCAndXNhZ2UnLCAnYGluZGV4YCBwYXJhbWV0ZXIgb2YgYHJvd0tleWAgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZC4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgaXQgd2lsbCB3b3JrIGFzIGV4cGVjdGVkLicpIDogdm9pZCAwO1xuICB9XG4gIGNvbnN0IGJhc2VDb2x1bW5zID0gUmVhY3QudXNlTWVtbygoKSA9PiBjb2x1bW5zIHx8ICgwLCBfdXNlQ29sdW1ucy5jb252ZXJ0Q2hpbGRyZW5Ub0NvbHVtbnMpKGNoaWxkcmVuKSwgW2NvbHVtbnMsIGNoaWxkcmVuXSk7XG4gIGNvbnN0IG5lZWRSZXNwb25zaXZlID0gUmVhY3QudXNlTWVtbygoKSA9PiBiYXNlQ29sdW1ucy5zb21lKGNvbCA9PiBjb2wucmVzcG9uc2l2ZSksIFtiYXNlQ29sdW1uc10pO1xuICBjb25zdCBzY3JlZW5zID0gKDAsIF91c2VCcmVha3BvaW50LmRlZmF1bHQpKG5lZWRSZXNwb25zaXZlKTtcbiAgY29uc3QgbWVyZ2VkQ29sdW1ucyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IG1hdGNoZWQgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHNjcmVlbnMpLmZpbHRlcihtID0+IHNjcmVlbnNbbV0pKTtcbiAgICByZXR1cm4gYmFzZUNvbHVtbnMuZmlsdGVyKGMgPT4gIWMucmVzcG9uc2l2ZSB8fCBjLnJlc3BvbnNpdmUuc29tZShyID0+IG1hdGNoZWQuaGFzKHIpKSk7XG4gIH0sIFtiYXNlQ29sdW1ucywgc2NyZWVuc10pO1xuICBjb25zdCB0YWJsZVByb3BzID0gKDAsIF9vbWl0LmRlZmF1bHQpKHByb3BzLCBbJ2NsYXNzTmFtZScsICdzdHlsZScsICdjb2x1bW5zJ10pO1xuICBjb25zdCB7XG4gICAgbG9jYWxlOiBjb250ZXh0TG9jYWxlID0gX2VuX1VTLmRlZmF1bHQsXG4gICAgZGlyZWN0aW9uLFxuICAgIHRhYmxlLFxuICAgIHJlbmRlckVtcHR5LFxuICAgIGdldFByZWZpeENscyxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyXG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KF9jb250ZXh0LkNvbmZpZ0NvbnRleHQpO1xuICBjb25zdCBtZXJnZWRTaXplID0gKDAsIF91c2VTaXplLmRlZmF1bHQpKGN1c3RvbWl6ZVNpemUpO1xuICBjb25zdCB0YWJsZUxvY2FsZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29udGV4dExvY2FsZS5UYWJsZSksIGxvY2FsZSk7XG4gIGNvbnN0IHJhd0RhdGEgPSBkYXRhU291cmNlIHx8IEVNUFRZX0xJU1Q7XG4gIGNvbnN0IHByZWZpeENscyA9IGdldFByZWZpeENscygndGFibGUnLCBjdXN0b21pemVQcmVmaXhDbHMpO1xuICBjb25zdCBkcm9wZG93blByZWZpeENscyA9IGdldFByZWZpeENscygnZHJvcGRvd24nLCBjdXN0b21pemVEcm9wZG93blByZWZpeENscyk7XG4gIGNvbnN0IFssIHRva2VuXSA9ICgwLCBfaW50ZXJuYWwudXNlVG9rZW4pKCk7XG4gIGNvbnN0IHJvb3RDbHMgPSAoMCwgX3VzZUNTU1ZhckNscy5kZWZhdWx0KShwcmVmaXhDbHMpO1xuICBjb25zdCBbd3JhcENTU1ZhciwgaGFzaElkLCBjc3NWYXJDbHNdID0gKDAsIF9zdHlsZS5kZWZhdWx0KShwcmVmaXhDbHMsIHJvb3RDbHMpO1xuICBjb25zdCBtZXJnZWRFeHBhbmRhYmxlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHtcbiAgICBjaGlsZHJlbkNvbHVtbk5hbWU6IGxlZ2FjeUNoaWxkcmVuQ29sdW1uTmFtZSxcbiAgICBleHBhbmRJY29uQ29sdW1uSW5kZXhcbiAgfSwgZXhwYW5kYWJsZSksIHtcbiAgICBleHBhbmRJY29uOiAoX2EgPSBleHBhbmRhYmxlID09PSBudWxsIHx8IGV4cGFuZGFibGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV4cGFuZGFibGUuZXhwYW5kSWNvbikgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogKF9iID0gdGFibGUgPT09IG51bGwgfHwgdGFibGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhYmxlLmV4cGFuZGFibGUpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5leHBhbmRJY29uXG4gIH0pO1xuICBjb25zdCB7XG4gICAgY2hpbGRyZW5Db2x1bW5OYW1lID0gJ2NoaWxkcmVuJ1xuICB9ID0gbWVyZ2VkRXhwYW5kYWJsZTtcbiAgY29uc3QgZXhwYW5kVHlwZSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChyYXdEYXRhLnNvbWUoaXRlbSA9PiBpdGVtID09PSBudWxsIHx8IGl0ZW0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGl0ZW1bY2hpbGRyZW5Db2x1bW5OYW1lXSkpIHtcbiAgICAgIHJldHVybiAnbmVzdCc7XG4gICAgfVxuICAgIGlmIChleHBhbmRlZFJvd1JlbmRlciB8fCAoZXhwYW5kYWJsZSA9PT0gbnVsbCB8fCBleHBhbmRhYmxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBleHBhbmRhYmxlLmV4cGFuZGVkUm93UmVuZGVyKSkge1xuICAgICAgcmV0dXJuICdyb3cnO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSwgW3Jhd0RhdGFdKTtcbiAgY29uc3QgaW50ZXJuYWxSZWZzID0ge1xuICAgIGJvZHk6IFJlYWN0LnVzZVJlZihudWxsKVxuICB9O1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFdpZHRoID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGdldENvbnRhaW5lcldpZHRoID0gKDAsIF91c2VDb250YWluZXJXaWR0aC5kZWZhdWx0KShwcmVmaXhDbHMpO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZWZzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHJvb3RSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gIGNvbnN0IHRibFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgKDAsIF91c2VQcm94eUltcGVyYXRpdmVIYW5kbGUuZGVmYXVsdCkocmVmLCAoKSA9PiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRibFJlZi5jdXJyZW50KSwge1xuICAgIG5hdGl2ZUVsZW1lbnQ6IHJvb3RSZWYuY3VycmVudFxuICB9KSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gUm93S2V5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgZ2V0Um93S2V5ID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiByb3dLZXkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiByb3dLZXk7XG4gICAgfVxuICAgIHJldHVybiByZWNvcmQgPT4gcmVjb3JkID09PSBudWxsIHx8IHJlY29yZCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVjb3JkW3Jvd0tleV07XG4gIH0sIFtyb3dLZXldKTtcbiAgY29uc3QgW2dldFJlY29yZEJ5S2V5XSA9ICgwLCBfdXNlTGF6eUtWTWFwLmRlZmF1bHQpKHJhd0RhdGEsIGNoaWxkcmVuQ29sdW1uTmFtZSwgZ2V0Um93S2V5KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFdmVudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgY2hhbmdlRXZlbnRJbmZvID0ge307XG4gIGNvbnN0IHRyaWdnZXJPbkNoYW5nZSA9IChpbmZvLCBhY3Rpb24sIHJlc2V0ID0gZmFsc2UpID0+IHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgY29uc3QgY2hhbmdlSW5mbyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY2hhbmdlRXZlbnRJbmZvKSwgaW5mbyk7XG4gICAgaWYgKHJlc2V0KSB7XG4gICAgICAoX2EgPSBjaGFuZ2VFdmVudEluZm8ucmVzZXRQYWdpbmF0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChjaGFuZ2VFdmVudEluZm8pO1xuICAgICAgLy8gUmVzZXQgZXZlbnQgcGFyYW1cbiAgICAgIGlmICgoX2IgPSBjaGFuZ2VJbmZvLnBhZ2luYXRpb24pID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5jdXJyZW50KSB7XG4gICAgICAgIGNoYW5nZUluZm8ucGFnaW5hdGlvbi5jdXJyZW50ID0gMTtcbiAgICAgIH1cbiAgICAgIC8vIFRyaWdnZXIgcGFnaW5hdGlvbiBldmVudHNcbiAgICAgIGlmIChwYWdpbmF0aW9uKSB7XG4gICAgICAgIChfYyA9IHBhZ2luYXRpb24ub25DaGFuZ2UpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5jYWxsKHBhZ2luYXRpb24sIDEsIChfZCA9IGNoYW5nZUluZm8ucGFnaW5hdGlvbikgPT09IG51bGwgfHwgX2QgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9kLnBhZ2VTaXplKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNjcm9sbCAmJiBzY3JvbGwuc2Nyb2xsVG9GaXJzdFJvd09uQ2hhbmdlICE9PSBmYWxzZSAmJiBpbnRlcm5hbFJlZnMuYm9keS5jdXJyZW50KSB7XG4gICAgICAoMCwgX3Njcm9sbFRvLmRlZmF1bHQpKDAsIHtcbiAgICAgICAgZ2V0Q29udGFpbmVyOiAoKSA9PiBpbnRlcm5hbFJlZnMuYm9keS5jdXJyZW50XG4gICAgICB9KTtcbiAgICB9XG4gICAgb25DaGFuZ2UgPT09IG51bGwgfHwgb25DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uQ2hhbmdlKGNoYW5nZUluZm8ucGFnaW5hdGlvbiwgY2hhbmdlSW5mby5maWx0ZXJzLCBjaGFuZ2VJbmZvLnNvcnRlciwge1xuICAgICAgY3VycmVudERhdGFTb3VyY2U6ICgwLCBfdXNlRmlsdGVyLmdldEZpbHRlckRhdGEpKCgwLCBfdXNlU29ydGVyLmdldFNvcnREYXRhKShyYXdEYXRhLCBjaGFuZ2VJbmZvLnNvcnRlclN0YXRlcywgY2hpbGRyZW5Db2x1bW5OYW1lKSwgY2hhbmdlSW5mby5maWx0ZXJTdGF0ZXMsIGNoaWxkcmVuQ29sdW1uTmFtZSksXG4gICAgICBhY3Rpb25cbiAgICB9KTtcbiAgfTtcbiAgLyoqXG4gICAqIENvbnRyb2xsZWQgc3RhdGUgaW4gYGNvbHVtbnNgIGlzIG5vdCBhIGdvb2QgaWRlYSB0aGF0IG1ha2VzIHRvbyBtYW55IGNvZGUgKDEwMDArIGxpbmU/KSB0byByZWFkXG4gICAqIHN0YXRlIG91dCBhbmQgdGhlbiBwdXQgaXQgYmFjayB0byB0aXRsZSByZW5kZXIuIE1vdmUgdGhlc2UgY29kZSBpbnRvIGBob29rc2AgYnV0IHN0aWxsIHRvb1xuICAgKiBjb21wbGV4LiBXZSBzaG91bGQgcHJvdmlkZXMgVGFibGUgcHJvcHMgbGlrZSBgc29ydGVyYCAmIGBmaWx0ZXJgIHRvIGhhbmRsZSBjb250cm9sIGluIG5leHQgYmlnXG4gICAqIHZlcnNpb24uXG4gICAqL1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFNvcnRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBvblNvcnRlckNoYW5nZSA9IChzb3J0ZXIsIHNvcnRlclN0YXRlcykgPT4ge1xuICAgIHRyaWdnZXJPbkNoYW5nZSh7XG4gICAgICBzb3J0ZXIsXG4gICAgICBzb3J0ZXJTdGF0ZXNcbiAgICB9LCAnc29ydCcsIGZhbHNlKTtcbiAgfTtcbiAgY29uc3QgW3RyYW5zZm9ybVNvcnRlckNvbHVtbnMsIHNvcnRTdGF0ZXMsIHNvcnRlclRpdGxlUHJvcHMsIGdldFNvcnRlcnNdID0gKDAsIF91c2VTb3J0ZXIuZGVmYXVsdCkoe1xuICAgIHByZWZpeENscyxcbiAgICBtZXJnZWRDb2x1bW5zLFxuICAgIG9uU29ydGVyQ2hhbmdlLFxuICAgIHNvcnREaXJlY3Rpb25zOiBzb3J0RGlyZWN0aW9ucyB8fCBbJ2FzY2VuZCcsICdkZXNjZW5kJ10sXG4gICAgdGFibGVMb2NhbGUsXG4gICAgc2hvd1NvcnRlclRvb2x0aXBcbiAgfSk7XG4gIGNvbnN0IHNvcnRlZERhdGEgPSBSZWFjdC51c2VNZW1vKCgpID0+ICgwLCBfdXNlU29ydGVyLmdldFNvcnREYXRhKShyYXdEYXRhLCBzb3J0U3RhdGVzLCBjaGlsZHJlbkNvbHVtbk5hbWUpLCBbcmF3RGF0YSwgc29ydFN0YXRlc10pO1xuICBjaGFuZ2VFdmVudEluZm8uc29ydGVyID0gZ2V0U29ydGVycygpO1xuICBjaGFuZ2VFdmVudEluZm8uc29ydGVyU3RhdGVzID0gc29ydFN0YXRlcztcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBGaWx0ZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBvbkZpbHRlckNoYW5nZSA9IChmaWx0ZXJzLCBmaWx0ZXJTdGF0ZXMpID0+IHtcbiAgICB0cmlnZ2VyT25DaGFuZ2Uoe1xuICAgICAgZmlsdGVycyxcbiAgICAgIGZpbHRlclN0YXRlc1xuICAgIH0sICdmaWx0ZXInLCB0cnVlKTtcbiAgfTtcbiAgY29uc3QgW3RyYW5zZm9ybUZpbHRlckNvbHVtbnMsIGZpbHRlclN0YXRlcywgZmlsdGVyc10gPSAoMCwgX3VzZUZpbHRlci5kZWZhdWx0KSh7XG4gICAgcHJlZml4Q2xzLFxuICAgIGxvY2FsZTogdGFibGVMb2NhbGUsXG4gICAgZHJvcGRvd25QcmVmaXhDbHMsXG4gICAgbWVyZ2VkQ29sdW1ucyxcbiAgICBvbkZpbHRlckNoYW5nZSxcbiAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIgfHwgZ2V0Q29udGV4dFBvcHVwQ29udGFpbmVyLFxuICAgIHJvb3RDbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShyb290Q2xhc3NOYW1lLCByb290Q2xzKVxuICB9KTtcbiAgY29uc3QgbWVyZ2VkRGF0YSA9ICgwLCBfdXNlRmlsdGVyLmdldEZpbHRlckRhdGEpKHNvcnRlZERhdGEsIGZpbHRlclN0YXRlcywgY2hpbGRyZW5Db2x1bW5OYW1lKTtcbiAgY2hhbmdlRXZlbnRJbmZvLmZpbHRlcnMgPSBmaWx0ZXJzO1xuICBjaGFuZ2VFdmVudEluZm8uZmlsdGVyU3RhdGVzID0gZmlsdGVyU3RhdGVzO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbHVtbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IGNvbHVtblRpdGxlUHJvcHMgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBtZXJnZWRGaWx0ZXJzID0ge307XG4gICAgT2JqZWN0LmtleXMoZmlsdGVycykuZm9yRWFjaChmaWx0ZXJLZXkgPT4ge1xuICAgICAgaWYgKGZpbHRlcnNbZmlsdGVyS2V5XSAhPT0gbnVsbCkge1xuICAgICAgICBtZXJnZWRGaWx0ZXJzW2ZpbHRlcktleV0gPSBmaWx0ZXJzW2ZpbHRlcktleV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc29ydGVyVGl0bGVQcm9wcyksIHtcbiAgICAgIGZpbHRlcnM6IG1lcmdlZEZpbHRlcnNcbiAgICB9KTtcbiAgfSwgW3NvcnRlclRpdGxlUHJvcHMsIGZpbHRlcnNdKTtcbiAgY29uc3QgW3RyYW5zZm9ybVRpdGxlQ29sdW1uc10gPSAoMCwgX3VzZVRpdGxlQ29sdW1ucy5kZWZhdWx0KShjb2x1bW5UaXRsZVByb3BzKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gUGFnaW5hdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBvblBhZ2luYXRpb25DaGFuZ2UgPSAoY3VycmVudCwgcGFnZVNpemUpID0+IHtcbiAgICB0cmlnZ2VyT25DaGFuZ2Uoe1xuICAgICAgcGFnaW5hdGlvbjogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjaGFuZ2VFdmVudEluZm8ucGFnaW5hdGlvbiksIHtcbiAgICAgICAgY3VycmVudCxcbiAgICAgICAgcGFnZVNpemVcbiAgICAgIH0pXG4gICAgfSwgJ3BhZ2luYXRlJyk7XG4gIH07XG4gIGNvbnN0IFttZXJnZWRQYWdpbmF0aW9uLCByZXNldFBhZ2luYXRpb25dID0gKDAsIF91c2VQYWdpbmF0aW9uLmRlZmF1bHQpKG1lcmdlZERhdGEubGVuZ3RoLCBvblBhZ2luYXRpb25DaGFuZ2UsIHBhZ2luYXRpb24pO1xuICBjaGFuZ2VFdmVudEluZm8ucGFnaW5hdGlvbiA9IHBhZ2luYXRpb24gPT09IGZhbHNlID8ge30gOiAoMCwgX3VzZVBhZ2luYXRpb24uZ2V0UGFnaW5hdGlvblBhcmFtKShtZXJnZWRQYWdpbmF0aW9uLCBwYWdpbmF0aW9uKTtcbiAgY2hhbmdlRXZlbnRJbmZvLnJlc2V0UGFnaW5hdGlvbiA9IHJlc2V0UGFnaW5hdGlvbjtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRGF0YSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBwYWdlRGF0YSA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGlmIChwYWdpbmF0aW9uID09PSBmYWxzZSB8fCAhbWVyZ2VkUGFnaW5hdGlvbi5wYWdlU2l6ZSkge1xuICAgICAgcmV0dXJuIG1lcmdlZERhdGE7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGN1cnJlbnQgPSAxLFxuICAgICAgdG90YWwsXG4gICAgICBwYWdlU2l6ZSA9IF91c2VQYWdpbmF0aW9uLkRFRkFVTFRfUEFHRV9TSVpFXG4gICAgfSA9IG1lcmdlZFBhZ2luYXRpb247XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhjdXJyZW50ID4gMCwgJ3VzYWdlJywgJ2BjdXJyZW50YCBzaG91bGQgYmUgcG9zaXRpdmUgbnVtYmVyLicpIDogdm9pZCAwO1xuICAgIC8vIER5bmFtaWMgdGFibGUgZGF0YVxuICAgIGlmIChtZXJnZWREYXRhLmxlbmd0aCA8IHRvdGFsKSB7XG4gICAgICBpZiAobWVyZ2VkRGF0YS5sZW5ndGggPiBwYWdlU2l6ZSkge1xuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGZhbHNlLCAndXNhZ2UnLCAnYGRhdGFTb3VyY2VgIGxlbmd0aCBpcyBsZXNzIHRoYW4gYHBhZ2luYXRpb24udG90YWxgIGJ1dCBsYXJnZSB0aGFuIGBwYWdpbmF0aW9uLnBhZ2VTaXplYC4gUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGNvbmZpZyBjb3JyZWN0IGRhdGEgd2l0aCBhc3luYyBtb2RlLicpIDogdm9pZCAwO1xuICAgICAgICByZXR1cm4gbWVyZ2VkRGF0YS5zbGljZSgoY3VycmVudCAtIDEpICogcGFnZVNpemUsIGN1cnJlbnQgKiBwYWdlU2l6ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVyZ2VkRGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZERhdGEuc2xpY2UoKGN1cnJlbnQgLSAxKSAqIHBhZ2VTaXplLCBjdXJyZW50ICogcGFnZVNpemUpO1xuICB9LCBbISFwYWdpbmF0aW9uLCBtZXJnZWREYXRhLCBtZXJnZWRQYWdpbmF0aW9uID09PSBudWxsIHx8IG1lcmdlZFBhZ2luYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lcmdlZFBhZ2luYXRpb24uY3VycmVudCwgbWVyZ2VkUGFnaW5hdGlvbiA9PT0gbnVsbCB8fCBtZXJnZWRQYWdpbmF0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtZXJnZWRQYWdpbmF0aW9uLnBhZ2VTaXplLCBtZXJnZWRQYWdpbmF0aW9uID09PSBudWxsIHx8IG1lcmdlZFBhZ2luYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lcmdlZFBhZ2luYXRpb24udG90YWxdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBbdHJhbnNmb3JtU2VsZWN0aW9uQ29sdW1ucywgc2VsZWN0ZWRLZXlTZXRdID0gKDAsIF91c2VTZWxlY3Rpb24uZGVmYXVsdCkoe1xuICAgIHByZWZpeENscyxcbiAgICBkYXRhOiBtZXJnZWREYXRhLFxuICAgIHBhZ2VEYXRhLFxuICAgIGdldFJvd0tleSxcbiAgICBnZXRSZWNvcmRCeUtleSxcbiAgICBleHBhbmRUeXBlLFxuICAgIGNoaWxkcmVuQ29sdW1uTmFtZSxcbiAgICBsb2NhbGU6IHRhYmxlTG9jYWxlLFxuICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lciB8fCBnZXRDb250ZXh0UG9wdXBDb250YWluZXJcbiAgfSwgcm93U2VsZWN0aW9uKTtcbiAgY29uc3QgaW50ZXJuYWxSb3dDbGFzc05hbWUgPSAocmVjb3JkLCBpbmRleCwgaW5kZW50KSA9PiB7XG4gICAgbGV0IG1lcmdlZFJvd0NsYXNzTmFtZTtcbiAgICBpZiAodHlwZW9mIHJvd0NsYXNzTmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbWVyZ2VkUm93Q2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHJvd0NsYXNzTmFtZShyZWNvcmQsIGluZGV4LCBpbmRlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVyZ2VkUm93Q2xhc3NOYW1lID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKHJvd0NsYXNzTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoe1xuICAgICAgW2Ake3ByZWZpeENsc30tcm93LXNlbGVjdGVkYF06IHNlbGVjdGVkS2V5U2V0LmhhcyhnZXRSb3dLZXkocmVjb3JkLCBpbmRleCkpXG4gICAgfSwgbWVyZ2VkUm93Q2xhc3NOYW1lKTtcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gRXhwYW5kYWJsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQYXNzIG9yaWdpbiByZW5kZXIgc3RhdHVzIGludG8gYHJjLXRhYmxlYCwgdGhpcyBjYW4gYmUgcmVtb3ZlZCB3aGVuIHJlZmFjdG9yIHdpdGggYHJjLXRhYmxlYFxuICBtZXJnZWRFeHBhbmRhYmxlLl9fUEFSRU5UX1JFTkRFUl9JQ09OX18gPSBtZXJnZWRFeHBhbmRhYmxlLmV4cGFuZEljb247XG4gIC8vIEN1c3RvbWl6ZSBleHBhbmRhYmxlIGljb25cbiAgbWVyZ2VkRXhwYW5kYWJsZS5leHBhbmRJY29uID0gbWVyZ2VkRXhwYW5kYWJsZS5leHBhbmRJY29uIHx8IGV4cGFuZEljb24gfHwgKDAsIF9FeHBhbmRJY29uLmRlZmF1bHQpKHRhYmxlTG9jYWxlKTtcbiAgLy8gQWRqdXN0IGV4cGFuZCBpY29uIGluZGV4LCBubyBvdmVyd3JpdGUgZXhwYW5kSWNvbkNvbHVtbkluZGV4IGlmIHNldC5cbiAgaWYgKGV4cGFuZFR5cGUgPT09ICduZXN0JyAmJiBtZXJnZWRFeHBhbmRhYmxlLmV4cGFuZEljb25Db2x1bW5JbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbWVyZ2VkRXhwYW5kYWJsZS5leHBhbmRJY29uQ29sdW1uSW5kZXggPSByb3dTZWxlY3Rpb24gPyAxIDogMDtcbiAgfSBlbHNlIGlmIChtZXJnZWRFeHBhbmRhYmxlLmV4cGFuZEljb25Db2x1bW5JbmRleCA+IDAgJiYgcm93U2VsZWN0aW9uKSB7XG4gICAgbWVyZ2VkRXhwYW5kYWJsZS5leHBhbmRJY29uQ29sdW1uSW5kZXggLT0gMTtcbiAgfVxuICAvLyBJbmRlbnQgc2l6ZVxuICBpZiAodHlwZW9mIG1lcmdlZEV4cGFuZGFibGUuaW5kZW50U2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICBtZXJnZWRFeHBhbmRhYmxlLmluZGVudFNpemUgPSB0eXBlb2YgaW5kZW50U2l6ZSA9PT0gJ251bWJlcicgPyBpbmRlbnRTaXplIDogMTU7XG4gIH1cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCB0cmFuc2Zvcm1Db2x1bW5zID0gUmVhY3QudXNlQ2FsbGJhY2soaW5uZXJDb2x1bW5zID0+IHRyYW5zZm9ybVRpdGxlQ29sdW1ucyh0cmFuc2Zvcm1TZWxlY3Rpb25Db2x1bW5zKHRyYW5zZm9ybUZpbHRlckNvbHVtbnModHJhbnNmb3JtU29ydGVyQ29sdW1ucyhpbm5lckNvbHVtbnMpKSkpLCBbdHJhbnNmb3JtU29ydGVyQ29sdW1ucywgdHJhbnNmb3JtRmlsdGVyQ29sdW1ucywgdHJhbnNmb3JtU2VsZWN0aW9uQ29sdW1uc10pO1xuICBsZXQgdG9wUGFnaW5hdGlvbk5vZGU7XG4gIGxldCBib3R0b21QYWdpbmF0aW9uTm9kZTtcbiAgaWYgKHBhZ2luYXRpb24gIT09IGZhbHNlICYmIChtZXJnZWRQYWdpbmF0aW9uID09PSBudWxsIHx8IG1lcmdlZFBhZ2luYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lcmdlZFBhZ2luYXRpb24udG90YWwpKSB7XG4gICAgbGV0IHBhZ2luYXRpb25TaXplO1xuICAgIGlmIChtZXJnZWRQYWdpbmF0aW9uLnNpemUpIHtcbiAgICAgIHBhZ2luYXRpb25TaXplID0gbWVyZ2VkUGFnaW5hdGlvbi5zaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYWdpbmF0aW9uU2l6ZSA9IG1lcmdlZFNpemUgPT09ICdzbWFsbCcgfHwgbWVyZ2VkU2l6ZSA9PT0gJ21pZGRsZScgPyAnc21hbGwnIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCByZW5kZXJQYWdpbmF0aW9uID0gcG9zaXRpb24gPT4gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9wYWdpbmF0aW9uLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIG1lcmdlZFBhZ2luYXRpb24sIHtcbiAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGAke3ByZWZpeENsc30tcGFnaW5hdGlvbiAke3ByZWZpeENsc30tcGFnaW5hdGlvbi0ke3Bvc2l0aW9ufWAsIG1lcmdlZFBhZ2luYXRpb24uY2xhc3NOYW1lKSxcbiAgICAgIHNpemU6IHBhZ2luYXRpb25TaXplXG4gICAgfSkpKTtcbiAgICBjb25zdCBkZWZhdWx0UG9zaXRpb24gPSBkaXJlY3Rpb24gPT09ICdydGwnID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICBjb25zdCB7XG4gICAgICBwb3NpdGlvblxuICAgIH0gPSBtZXJnZWRQYWdpbmF0aW9uO1xuICAgIGlmIChwb3NpdGlvbiAhPT0gbnVsbCAmJiBBcnJheS5pc0FycmF5KHBvc2l0aW9uKSkge1xuICAgICAgY29uc3QgdG9wUG9zID0gcG9zaXRpb24uZmluZChwID0+IHAuaW5jbHVkZXMoJ3RvcCcpKTtcbiAgICAgIGNvbnN0IGJvdHRvbVBvcyA9IHBvc2l0aW9uLmZpbmQocCA9PiBwLmluY2x1ZGVzKCdib3R0b20nKSk7XG4gICAgICBjb25zdCBpc0Rpc2FibGUgPSBwb3NpdGlvbi5ldmVyeShwID0+IGAke3B9YCA9PT0gJ25vbmUnKTtcbiAgICAgIGlmICghdG9wUG9zICYmICFib3R0b21Qb3MgJiYgIWlzRGlzYWJsZSkge1xuICAgICAgICBib3R0b21QYWdpbmF0aW9uTm9kZSA9IHJlbmRlclBhZ2luYXRpb24oZGVmYXVsdFBvc2l0aW9uKTtcbiAgICAgIH1cbiAgICAgIGlmICh0b3BQb3MpIHtcbiAgICAgICAgdG9wUGFnaW5hdGlvbk5vZGUgPSByZW5kZXJQYWdpbmF0aW9uKHRvcFBvcy50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoJ3RvcCcsICcnKSk7XG4gICAgICB9XG4gICAgICBpZiAoYm90dG9tUG9zKSB7XG4gICAgICAgIGJvdHRvbVBhZ2luYXRpb25Ob2RlID0gcmVuZGVyUGFnaW5hdGlvbihib3R0b21Qb3MudG9Mb3dlckNhc2UoKS5yZXBsYWNlKCdib3R0b20nLCAnJykpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBib3R0b21QYWdpbmF0aW9uTm9kZSA9IHJlbmRlclBhZ2luYXRpb24oZGVmYXVsdFBvc2l0aW9uKTtcbiAgICB9XG4gIH1cbiAgLy8gPj4+Pj4+Pj4+IFNwaW5uaW5nXG4gIGxldCBzcGluUHJvcHM7XG4gIGlmICh0eXBlb2YgbG9hZGluZyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgc3BpblByb3BzID0ge1xuICAgICAgc3Bpbm5pbmc6IGxvYWRpbmdcbiAgICB9O1xuICB9IGVsc2UgaWYgKHR5cGVvZiBsb2FkaW5nID09PSAnb2JqZWN0Jykge1xuICAgIHNwaW5Qcm9wcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgc3Bpbm5pbmc6IHRydWVcbiAgICB9LCBsb2FkaW5nKTtcbiAgfVxuICBjb25zdCB3cmFwcGVyQ2xhc3NOYW1lcyA9ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShjc3NWYXJDbHMsIHJvb3RDbHMsIGAke3ByZWZpeENsc30td3JhcHBlcmAsIHRhYmxlID09PSBudWxsIHx8IHRhYmxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YWJsZS5jbGFzc05hbWUsIHtcbiAgICBbYCR7cHJlZml4Q2xzfS13cmFwcGVyLXJ0bGBdOiBkaXJlY3Rpb24gPT09ICdydGwnXG4gIH0sIGNsYXNzTmFtZSwgcm9vdENsYXNzTmFtZSwgaGFzaElkKTtcbiAgY29uc3QgbWVyZ2VkU3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhYmxlID09PSBudWxsIHx8IHRhYmxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiB0YWJsZS5zdHlsZSksIHN0eWxlKTtcbiAgY29uc3QgZW1wdHlUZXh0ID0gdHlwZW9mIChsb2NhbGUgPT09IG51bGwgfHwgbG9jYWxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBsb2NhbGUuZW1wdHlUZXh0KSAhPT0gJ3VuZGVmaW5lZCcgPyBsb2NhbGUuZW1wdHlUZXh0IDogKHJlbmRlckVtcHR5ID09PSBudWxsIHx8IHJlbmRlckVtcHR5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZW5kZXJFbXB0eSgnVGFibGUnKSkgfHwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2RlZmF1bHRSZW5kZXJFbXB0eS5kZWZhdWx0LCB7XG4gICAgY29tcG9uZW50TmFtZTogXCJUYWJsZVwiXG4gIH0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBSZW5kZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgVGFibGVDb21wb25lbnQgPSB2aXJ0dWFsID8gX1ZpcnR1YWxUYWJsZS5kZWZhdWx0IDogX1JjVGFibGUuZGVmYXVsdDtcbiAgLy8gPj4+IFZpcnR1YWwgVGFibGUgcHJvcHMuIFdlIHNldCBoZWlnaHQgaGVyZSBzaW5jZSBpdCB3aWxsIGFmZmVjdCBoZWlnaHQgY29sbGVjdGlvblxuICBjb25zdCB2aXJ0dWFsUHJvcHMgPSB7fTtcbiAgY29uc3QgbGlzdEl0ZW1IZWlnaHQgPSBSZWFjdC51c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBmb250U2l6ZSxcbiAgICAgIGxpbmVIZWlnaHQsXG4gICAgICBsaW5lV2lkdGgsXG4gICAgICBwYWRkaW5nLFxuICAgICAgcGFkZGluZ1hTLFxuICAgICAgcGFkZGluZ1NNXG4gICAgfSA9IHRva2VuO1xuICAgIGNvbnN0IGZvbnRIZWlnaHQgPSBNYXRoLmZsb29yKGZvbnRTaXplICogbGluZUhlaWdodCk7XG4gICAgc3dpdGNoIChtZXJnZWRTaXplKSB7XG4gICAgICBjYXNlICdtaWRkbGUnOlxuICAgICAgICByZXR1cm4gcGFkZGluZ1NNICogMiArIGZvbnRIZWlnaHQgKyBsaW5lV2lkdGg7XG4gICAgICBjYXNlICdzbWFsbCc6XG4gICAgICAgIHJldHVybiBwYWRkaW5nWFMgKiAyICsgZm9udEhlaWdodCArIGxpbmVXaWR0aDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBwYWRkaW5nICogMiArIGZvbnRIZWlnaHQgKyBsaW5lV2lkdGg7XG4gICAgfVxuICB9LCBbdG9rZW4sIG1lcmdlZFNpemVdKTtcbiAgaWYgKHZpcnR1YWwpIHtcbiAgICB2aXJ0dWFsUHJvcHMubGlzdEl0ZW1IZWlnaHQgPSBsaXN0SXRlbUhlaWdodDtcbiAgfVxuICByZXR1cm4gd3JhcENTU1ZhcigvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgcmVmOiByb290UmVmLFxuICAgIGNsYXNzTmFtZTogd3JhcHBlckNsYXNzTmFtZXMsXG4gICAgc3R5bGU6IG1lcmdlZFN0eWxlXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9zcGluLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe1xuICAgIHNwaW5uaW5nOiBmYWxzZVxuICB9LCBzcGluUHJvcHMpLCB0b3BQYWdpbmF0aW9uTm9kZSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoVGFibGVDb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHZpcnR1YWxQcm9wcywgdGFibGVQcm9wcywge1xuICAgIHJlZjogdGJsUmVmLFxuICAgIGNvbHVtbnM6IG1lcmdlZENvbHVtbnMsXG4gICAgZGlyZWN0aW9uOiBkaXJlY3Rpb24sXG4gICAgZXhwYW5kYWJsZTogbWVyZ2VkRXhwYW5kYWJsZSxcbiAgICBwcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KSh7XG4gICAgICBbYCR7cHJlZml4Q2xzfS1taWRkbGVgXTogbWVyZ2VkU2l6ZSA9PT0gJ21pZGRsZScsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1zbWFsbGBdOiBtZXJnZWRTaXplID09PSAnc21hbGwnLFxuICAgICAgW2Ake3ByZWZpeENsc30tYm9yZGVyZWRgXTogYm9yZGVyZWQsXG4gICAgICBbYCR7cHJlZml4Q2xzfS1lbXB0eWBdOiByYXdEYXRhLmxlbmd0aCA9PT0gMFxuICAgIH0sIGNzc1ZhckNscywgcm9vdENscywgaGFzaElkKSxcbiAgICBkYXRhOiBwYWdlRGF0YSxcbiAgICByb3dLZXk6IGdldFJvd0tleSxcbiAgICByb3dDbGFzc05hbWU6IGludGVybmFsUm93Q2xhc3NOYW1lLFxuICAgIGVtcHR5VGV4dDogZW1wdHlUZXh0LFxuICAgIC8vIEludGVybmFsXG4gICAgaW50ZXJuYWxIb29rczogX3JjVGFibGUuSU5URVJOQUxfSE9PS1MsXG4gICAgaW50ZXJuYWxSZWZzOiBpbnRlcm5hbFJlZnMsXG4gICAgdHJhbnNmb3JtQ29sdW1uczogdHJhbnNmb3JtQ29sdW1ucyxcbiAgICBnZXRDb250YWluZXJXaWR0aDogZ2V0Q29udGFpbmVyV2lkdGhcbiAgfSkpLCBib3R0b21QYWdpbmF0aW9uTm9kZSkpKTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZihJbnRlcm5hbFRhYmxlKTsiLCJcInVzZSBzdHJpY3RcIjtcblwidXNlIGNsaWVudFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9yY1RhYmxlID0gcmVxdWlyZShcInJjLXRhYmxlXCIpO1xuLyoqXG4gKiBTYW1lIGFzIGByYy10YWJsZWAgYnV0IHdlIG1vZGlmeSB0cmlnZ2VyIGNoaWxkcmVuIHVwZGF0ZSBsb2dpYyBpbnN0ZWFkLlxuICovXG5jb25zdCBSY1ZpcnR1YWxUYWJsZSA9ICgwLCBfcmNUYWJsZS5nZW5WaXJ0dWFsVGFibGUpKChwcmV2LCBuZXh0KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBfcmVuZGVyVGltZXM6IHByZXZSZW5kZXJUaW1lc1xuICB9ID0gcHJldjtcbiAgY29uc3Qge1xuICAgIF9yZW5kZXJUaW1lczogbmV4dFJlbmRlclRpbWVzXG4gIH0gPSBuZXh0O1xuICByZXR1cm4gcHJldlJlbmRlclRpbWVzICE9PSBuZXh0UmVuZGVyVGltZXM7XG59KTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFJjVmlydHVhbFRhYmxlOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX3JjVGFibGUgPSByZXF1aXJlKFwicmMtdGFibGVcIik7XG4vKipcbiAqIFNhbWUgYXMgYHJjLXRhYmxlYCBidXQgd2UgbW9kaWZ5IHRyaWdnZXIgY2hpbGRyZW4gdXBkYXRlIGxvZ2ljIGluc3RlYWQuXG4gKi9cbmNvbnN0IFJjVGFibGUgPSAoMCwgX3JjVGFibGUuZ2VuVGFibGUpKChwcmV2LCBuZXh0KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBfcmVuZGVyVGltZXM6IHByZXZSZW5kZXJUaW1lc1xuICB9ID0gcHJldjtcbiAgY29uc3Qge1xuICAgIF9yZW5kZXJUaW1lczogbmV4dFJlbmRlclRpbWVzXG4gIH0gPSBuZXh0O1xuICByZXR1cm4gcHJldlJlbmRlclRpbWVzICE9PSBuZXh0UmVuZGVyVGltZXM7XG59KTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFJjVGFibGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cInVzZSBjbGllbnRcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9yY1RhYmxlID0gcmVxdWlyZShcInJjLXRhYmxlXCIpO1xudmFyIF9Db2x1bW4gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL0NvbHVtblwiKSk7XG52YXIgX0NvbHVtbkdyb3VwID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9Db2x1bW5Hcm91cFwiKSk7XG52YXIgX3VzZVNlbGVjdGlvbiA9IHJlcXVpcmUoXCIuL2hvb2tzL3VzZVNlbGVjdGlvblwiKTtcbnZhciBfSW50ZXJuYWxUYWJsZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vSW50ZXJuYWxUYWJsZVwiKSk7XG5jb25zdCBUYWJsZSA9IChwcm9wcywgcmVmKSA9PiB7XG4gIGNvbnN0IHJlbmRlclRpbWVzUmVmID0gUmVhY3QudXNlUmVmKDApO1xuICByZW5kZXJUaW1lc1JlZi5jdXJyZW50ICs9IDE7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfSW50ZXJuYWxUYWJsZS5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywge1xuICAgIHJlZjogcmVmLFxuICAgIF9yZW5kZXJUaW1lczogcmVuZGVyVGltZXNSZWYuY3VycmVudFxuICB9KSk7XG59O1xuY29uc3QgRm9yd2FyZFRhYmxlID0gLyojX19QVVJFX18qL1JlYWN0LmZvcndhcmRSZWYoVGFibGUpO1xuRm9yd2FyZFRhYmxlLlNFTEVDVElPTl9DT0xVTU4gPSBfdXNlU2VsZWN0aW9uLlNFTEVDVElPTl9DT0xVTU47XG5Gb3J3YXJkVGFibGUuRVhQQU5EX0NPTFVNTiA9IF9yY1RhYmxlLkVYUEFORF9DT0xVTU47XG5Gb3J3YXJkVGFibGUuU0VMRUNUSU9OX0FMTCA9IF91c2VTZWxlY3Rpb24uU0VMRUNUSU9OX0FMTDtcbkZvcndhcmRUYWJsZS5TRUxFQ1RJT05fSU5WRVJUID0gX3VzZVNlbGVjdGlvbi5TRUxFQ1RJT05fSU5WRVJUO1xuRm9yd2FyZFRhYmxlLlNFTEVDVElPTl9OT05FID0gX3VzZVNlbGVjdGlvbi5TRUxFQ1RJT05fTk9ORTtcbkZvcndhcmRUYWJsZS5Db2x1bW4gPSBfQ29sdW1uLmRlZmF1bHQ7XG5Gb3J3YXJkVGFibGUuQ29sdW1uR3JvdXAgPSBfQ29sdW1uR3JvdXAuZGVmYXVsdDtcbkZvcndhcmRUYWJsZS5TdW1tYXJ5ID0gX3JjVGFibGUuU3VtbWFyeTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEZvcndhcmRUYWJsZS5kaXNwbGF5TmFtZSA9ICdUYWJsZSc7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBGb3J3YXJkVGFibGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB1c2VDb250YWluZXJXaWR0aDtcbmZ1bmN0aW9uIHVzZUNvbnRhaW5lcldpZHRoKHByZWZpeENscykge1xuICBjb25zdCBnZXRDb250YWluZXJXaWR0aCA9IChlbGUsIHdpZHRoKSA9PiB7XG4gICAgY29uc3QgY29udGFpbmVyID0gZWxlLnF1ZXJ5U2VsZWN0b3IoYC4ke3ByZWZpeENsc30tY29udGFpbmVyYCk7XG4gICAgbGV0IHJldHVybldpZHRoID0gd2lkdGg7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcik7XG4gICAgICBjb25zdCBib3JkZXJMZWZ0ID0gcGFyc2VJbnQoc3R5bGUuYm9yZGVyTGVmdFdpZHRoLCAxMCk7XG4gICAgICBjb25zdCBib3JkZXJSaWdodCA9IHBhcnNlSW50KHN0eWxlLmJvcmRlclJpZ2h0V2lkdGgsIDEwKTtcbiAgICAgIHJldHVybldpZHRoID0gd2lkdGggLSBib3JkZXJMZWZ0IC0gYm9yZGVyUmlnaHQ7XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5XaWR0aDtcbiAgfTtcbiAgcmV0dXJuIGdldENvbnRhaW5lcldpZHRoO1xufSIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuZXhwb3J0cy5mbGF0dGVuS2V5cyA9IGZsYXR0ZW5LZXlzO1xudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX0ZpbHRlckZpbGxlZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL0ZpbHRlckZpbGxlZFwiKSk7XG52YXIgX2NsYXNzbmFtZXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJjbGFzc25hbWVzXCIpKTtcbnZhciBfaXNFcXVhbCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcInJjLXV0aWwvbGliL2lzRXF1YWxcIikpO1xudmFyIF9leHRlbmRzT2JqZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vLi4vX3V0aWwvZXh0ZW5kc09iamVjdFwiKSk7XG52YXIgX3VzZVN5bmNTdGF0ZSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL191dGlsL2hvb2tzL3VzZVN5bmNTdGF0ZVwiKSk7XG52YXIgX3dhcm5pbmcgPSByZXF1aXJlKFwiLi4vLi4vLi4vX3V0aWwvd2FybmluZ1wiKTtcbnZhciBfYnV0dG9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vLi4vYnV0dG9uXCIpKTtcbnZhciBfY2hlY2tib3ggPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi8uLi9jaGVja2JveFwiKSk7XG52YXIgX2NvbnRleHQgPSByZXF1aXJlKFwiLi4vLi4vLi4vY29uZmlnLXByb3ZpZGVyL2NvbnRleHRcIik7XG52YXIgX2Ryb3Bkb3duID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vLi4vZHJvcGRvd25cIikpO1xudmFyIF9lbXB0eSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL2VtcHR5XCIpKTtcbnZhciBfbWVudSA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uLy4uL21lbnVcIikpO1xudmFyIF9PdmVycmlkZUNvbnRleHQgPSByZXF1aXJlKFwiLi4vLi4vLi4vbWVudS9PdmVycmlkZUNvbnRleHRcIik7XG52YXIgX3JhZGlvID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vLi4vcmFkaW9cIikpO1xudmFyIF90cmVlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vLi4vdHJlZVwiKSk7XG52YXIgX0ZpbHRlclNlYXJjaCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRmlsdGVyU2VhcmNoXCIpKTtcbnZhciBfRmlsdGVyV3JhcHBlciA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vRmlsdGVyV3JhcHBlclwiKSk7XG5mdW5jdGlvbiBmbGF0dGVuS2V5cyhmaWx0ZXJzKSB7XG4gIGxldCBrZXlzID0gW107XG4gIChmaWx0ZXJzIHx8IFtdKS5mb3JFYWNoKCh7XG4gICAgdmFsdWUsXG4gICAgY2hpbGRyZW5cbiAgfSkgPT4ge1xuICAgIGtleXMucHVzaCh2YWx1ZSk7XG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBrZXlzID0gW10uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGtleXMpLCAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShmbGF0dGVuS2V5cyhjaGlsZHJlbikpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4ga2V5cztcbn1cbmZ1bmN0aW9uIGhhc1N1Yk1lbnUoZmlsdGVycykge1xuICByZXR1cm4gZmlsdGVycy5zb21lKCh7XG4gICAgY2hpbGRyZW5cbiAgfSkgPT4gY2hpbGRyZW4pO1xufVxuZnVuY3Rpb24gc2VhcmNoVmFsdWVNYXRjaGVkKHNlYXJjaFZhbHVlLCB0ZXh0KSB7XG4gIGlmICh0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHRleHQgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIHRleHQgPT09IG51bGwgfHwgdGV4dCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGV4dC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIHJlbmRlckZpbHRlckl0ZW1zKHtcbiAgZmlsdGVycyxcbiAgcHJlZml4Q2xzLFxuICBmaWx0ZXJlZEtleXMsXG4gIGZpbHRlck11bHRpcGxlLFxuICBzZWFyY2hWYWx1ZSxcbiAgZmlsdGVyU2VhcmNoXG59KSB7XG4gIHJldHVybiBmaWx0ZXJzLm1hcCgoZmlsdGVyLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IFN0cmluZyhmaWx0ZXIudmFsdWUpO1xuICAgIGlmIChmaWx0ZXIuY2hpbGRyZW4pIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleToga2V5IHx8IGluZGV4LFxuICAgICAgICBsYWJlbDogZmlsdGVyLnRleHQsXG4gICAgICAgIHBvcHVwQ2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWRyb3Bkb3duLXN1Ym1lbnVgLFxuICAgICAgICBjaGlsZHJlbjogcmVuZGVyRmlsdGVySXRlbXMoe1xuICAgICAgICAgIGZpbHRlcnM6IGZpbHRlci5jaGlsZHJlbixcbiAgICAgICAgICBwcmVmaXhDbHMsXG4gICAgICAgICAgZmlsdGVyZWRLZXlzLFxuICAgICAgICAgIGZpbHRlck11bHRpcGxlLFxuICAgICAgICAgIHNlYXJjaFZhbHVlLFxuICAgICAgICAgIGZpbHRlclNlYXJjaFxuICAgICAgICB9KVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgQ29tcG9uZW50ID0gZmlsdGVyTXVsdGlwbGUgPyBfY2hlY2tib3guZGVmYXVsdCA6IF9yYWRpby5kZWZhdWx0O1xuICAgIGNvbnN0IGl0ZW0gPSB7XG4gICAgICBrZXk6IGZpbHRlci52YWx1ZSAhPT0gdW5kZWZpbmVkID8ga2V5IDogaW5kZXgsXG4gICAgICBsYWJlbDogKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFJlYWN0LkZyYWdtZW50LCBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChDb21wb25lbnQsIHtcbiAgICAgICAgY2hlY2tlZDogZmlsdGVyZWRLZXlzLmluY2x1ZGVzKGtleSlcbiAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgZmlsdGVyLnRleHQpKSlcbiAgICB9O1xuICAgIGlmIChzZWFyY2hWYWx1ZS50cmltKCkpIHtcbiAgICAgIGlmICh0eXBlb2YgZmlsdGVyU2VhcmNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBmaWx0ZXJTZWFyY2goc2VhcmNoVmFsdWUsIGZpbHRlcikgPyBpdGVtIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWFyY2hWYWx1ZU1hdGNoZWQoc2VhcmNoVmFsdWUsIGZpbHRlci50ZXh0KSA/IGl0ZW0gOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaXRlbTtcbiAgfSk7XG59XG5mdW5jdGlvbiB3cmFwU3RyaW5nTGlzdFR5cGUoa2V5cykge1xuICByZXR1cm4ga2V5cyB8fCBbXTtcbn1cbmNvbnN0IEZpbHRlckRyb3Bkb3duID0gcHJvcHMgPT4ge1xuICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gIGNvbnN0IHtcbiAgICB0YWJsZVByZWZpeENscyxcbiAgICBwcmVmaXhDbHMsXG4gICAgY29sdW1uLFxuICAgIGRyb3Bkb3duUHJlZml4Q2xzLFxuICAgIGNvbHVtbktleSxcbiAgICBmaWx0ZXJPbkNsb3NlLFxuICAgIGZpbHRlck11bHRpcGxlLFxuICAgIGZpbHRlck1vZGUgPSAnbWVudScsXG4gICAgZmlsdGVyU2VhcmNoID0gZmFsc2UsXG4gICAgZmlsdGVyU3RhdGUsXG4gICAgdHJpZ2dlckZpbHRlcixcbiAgICBsb2NhbGUsXG4gICAgY2hpbGRyZW4sXG4gICAgZ2V0UG9wdXBDb250YWluZXIsXG4gICAgcm9vdENsYXNzTmFtZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHtcbiAgICBmaWx0ZXJSZXNldFRvRGVmYXVsdEZpbHRlcmVkVmFsdWUsXG4gICAgZGVmYXVsdEZpbHRlcmVkVmFsdWUsXG4gICAgZmlsdGVyRHJvcGRvd25Qcm9wcyA9IHt9LFxuICAgIC8vIERlcHJlY2F0ZWRcbiAgICBmaWx0ZXJEcm9wZG93bk9wZW4sXG4gICAgZmlsdGVyRHJvcGRvd25WaXNpYmxlLFxuICAgIG9uRmlsdGVyRHJvcGRvd25WaXNpYmxlQ2hhbmdlLFxuICAgIG9uRmlsdGVyRHJvcGRvd25PcGVuQ2hhbmdlXG4gIH0gPSBjb2x1bW47XG4gIGNvbnN0IFt2aXNpYmxlLCBzZXRWaXNpYmxlXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgZmlsdGVyZWQgPSAhIShmaWx0ZXJTdGF0ZSAmJiAoKChfYSA9IGZpbHRlclN0YXRlLmZpbHRlcmVkS2V5cykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxlbmd0aCkgfHwgZmlsdGVyU3RhdGUuZm9yY2VGaWx0ZXJlZCkpO1xuICBjb25zdCB0cmlnZ2VyVmlzaWJsZSA9IG5ld1Zpc2libGUgPT4ge1xuICAgIHZhciBfYTtcbiAgICBzZXRWaXNpYmxlKG5ld1Zpc2libGUpO1xuICAgIChfYSA9IGZpbHRlckRyb3Bkb3duUHJvcHMub25PcGVuQ2hhbmdlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChmaWx0ZXJEcm9wZG93blByb3BzLCBuZXdWaXNpYmxlKTtcbiAgICAvLyBkZXByZWNhdGVkXG4gICAgb25GaWx0ZXJEcm9wZG93bk9wZW5DaGFuZ2UgPT09IG51bGwgfHwgb25GaWx0ZXJEcm9wZG93bk9wZW5DaGFuZ2UgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uRmlsdGVyRHJvcGRvd25PcGVuQ2hhbmdlKG5ld1Zpc2libGUpO1xuICAgIG9uRmlsdGVyRHJvcGRvd25WaXNpYmxlQ2hhbmdlID09PSBudWxsIHx8IG9uRmlsdGVyRHJvcGRvd25WaXNpYmxlQ2hhbmdlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvbkZpbHRlckRyb3Bkb3duVmlzaWJsZUNoYW5nZShuZXdWaXNpYmxlKTtcbiAgfTtcbiAgLy8gPT09PT09PT09PT09PT09PT1XYXJuaW5nPT09PT09PT09PT09PT09PT09PVxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgIGNvbnN0IHdhcm5pbmcgPSAoMCwgX3dhcm5pbmcuZGV2VXNlV2FybmluZykoJ1RhYmxlJyk7XG4gICAgY29uc3QgZGVwcmVjYXRlZExpc3QgPSBbWydmaWx0ZXJEcm9wZG93bk9wZW4nLCAnZmlsdGVyRHJvcGRvd25Qcm9wcy5vcGVuJ10sIFsnZmlsdGVyRHJvcGRvd25WaXNpYmxlJywgJ2ZpbHRlckRyb3Bkb3duUHJvcHMub3BlbiddLCBbJ29uRmlsdGVyRHJvcGRvd25PcGVuQ2hhbmdlJywgJ2ZpbHRlckRyb3Bkb3duUHJvcHMub25PcGVuQ2hhbmdlJ10sIFsnb25GaWx0ZXJEcm9wZG93blZpc2libGVDaGFuZ2UnLCAnZmlsdGVyRHJvcGRvd25Qcm9wcy5vbk9wZW5DaGFuZ2UnXV07XG4gICAgZGVwcmVjYXRlZExpc3QuZm9yRWFjaCgoW2RlcHJlY2F0ZWROYW1lLCBuZXdOYW1lXSkgPT4ge1xuICAgICAgd2FybmluZy5kZXByZWNhdGVkKCEoZGVwcmVjYXRlZE5hbWUgaW4gY29sdW1uKSwgZGVwcmVjYXRlZE5hbWUsIG5ld05hbWUpO1xuICAgIH0pO1xuICAgIHdhcm5pbmcuZGVwcmVjYXRlZCghKCdmaWx0ZXJDaGVja2FsbCcgaW4gbG9jYWxlKSwgJ2ZpbHRlckNoZWNrYWxsJywgJ2xvY2FsZS5maWx0ZXJDaGVja0FsbCcpO1xuICB9XG4gIGNvbnN0IG1lcmdlZFZpc2libGUgPSAoX2QgPSAoX2MgPSAoX2IgPSBmaWx0ZXJEcm9wZG93blByb3BzLm9wZW4pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZpbHRlckRyb3Bkb3duT3BlbikgIT09IG51bGwgJiYgX2MgIT09IHZvaWQgMCA/IF9jIDogZmlsdGVyRHJvcGRvd25WaXNpYmxlKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiB2aXNpYmxlOyAvLyBpbm5lciBzdGF0ZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT0gU2VsZWN0IEtleXMgPT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IHByb3BGaWx0ZXJlZEtleXMgPSBmaWx0ZXJTdGF0ZSA9PT0gbnVsbCB8fCBmaWx0ZXJTdGF0ZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmlsdGVyU3RhdGUuZmlsdGVyZWRLZXlzO1xuICBjb25zdCBbZ2V0RmlsdGVyZWRLZXlzU3luYywgc2V0RmlsdGVyZWRLZXlzU3luY10gPSAoMCwgX3VzZVN5bmNTdGF0ZS5kZWZhdWx0KSh3cmFwU3RyaW5nTGlzdFR5cGUocHJvcEZpbHRlcmVkS2V5cykpO1xuICBjb25zdCBvblNlbGVjdEtleXMgPSAoe1xuICAgIHNlbGVjdGVkS2V5c1xuICB9KSA9PiB7XG4gICAgc2V0RmlsdGVyZWRLZXlzU3luYyhzZWxlY3RlZEtleXMpO1xuICB9O1xuICBjb25zdCBvbkNoZWNrID0gKGtleXMsIHtcbiAgICBub2RlLFxuICAgIGNoZWNrZWRcbiAgfSkgPT4ge1xuICAgIGlmICghZmlsdGVyTXVsdGlwbGUpIHtcbiAgICAgIG9uU2VsZWN0S2V5cyh7XG4gICAgICAgIHNlbGVjdGVkS2V5czogY2hlY2tlZCAmJiBub2RlLmtleSA/IFtub2RlLmtleV0gOiBbXVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9uU2VsZWN0S2V5cyh7XG4gICAgICAgIHNlbGVjdGVkS2V5czoga2V5c1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBSZWFjdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghdmlzaWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBvblNlbGVjdEtleXMoe1xuICAgICAgc2VsZWN0ZWRLZXlzOiB3cmFwU3RyaW5nTGlzdFR5cGUocHJvcEZpbHRlcmVkS2V5cylcbiAgICB9KTtcbiAgfSwgW3Byb3BGaWx0ZXJlZEtleXNdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBPcGVuIEtleXMgPT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBbb3BlbktleXMsIHNldE9wZW5LZXlzXSA9IFJlYWN0LnVzZVN0YXRlKFtdKTtcbiAgY29uc3Qgb25PcGVuQ2hhbmdlID0ga2V5cyA9PiB7XG4gICAgc2V0T3BlbktleXMoa2V5cyk7XG4gIH07XG4gIC8vIHNlYXJjaCBpbiB0cmVlIG1vZGUgY29sdW1uIGZpbHRlclxuICBjb25zdCBbc2VhcmNoVmFsdWUsIHNldFNlYXJjaFZhbHVlXSA9IFJlYWN0LnVzZVN0YXRlKCcnKTtcbiAgY29uc3Qgb25TZWFyY2ggPSBlID0+IHtcbiAgICBjb25zdCB7XG4gICAgICB2YWx1ZVxuICAgIH0gPSBlLnRhcmdldDtcbiAgICBzZXRTZWFyY2hWYWx1ZSh2YWx1ZSk7XG4gIH07XG4gIC8vIGNsZWFyIHNlYXJjaCB2YWx1ZSBhZnRlciBjbG9zZSBmaWx0ZXIgZHJvcGRvd25cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXZpc2libGUpIHtcbiAgICAgIHNldFNlYXJjaFZhbHVlKCcnKTtcbiAgICB9XG4gIH0sIFt2aXNpYmxlXSk7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09IFN1Ym1pdCA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgaW50ZXJuYWxUcmlnZ2VyRmlsdGVyID0ga2V5cyA9PiB7XG4gICAgY29uc3QgbWVyZ2VkS2V5cyA9IChrZXlzID09PSBudWxsIHx8IGtleXMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGtleXMubGVuZ3RoKSA/IGtleXMgOiBudWxsO1xuICAgIGlmIChtZXJnZWRLZXlzID09PSBudWxsICYmICghZmlsdGVyU3RhdGUgfHwgIWZpbHRlclN0YXRlLmZpbHRlcmVkS2V5cykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoKDAsIF9pc0VxdWFsLmRlZmF1bHQpKG1lcmdlZEtleXMsIGZpbHRlclN0YXRlID09PSBudWxsIHx8IGZpbHRlclN0YXRlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBmaWx0ZXJTdGF0ZS5maWx0ZXJlZEtleXMsIHRydWUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgdHJpZ2dlckZpbHRlcih7XG4gICAgICBjb2x1bW4sXG4gICAgICBrZXk6IGNvbHVtbktleSxcbiAgICAgIGZpbHRlcmVkS2V5czogbWVyZ2VkS2V5c1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBvbkNvbmZpcm0gPSAoKSA9PiB7XG4gICAgdHJpZ2dlclZpc2libGUoZmFsc2UpO1xuICAgIGludGVybmFsVHJpZ2dlckZpbHRlcihnZXRGaWx0ZXJlZEtleXNTeW5jKCkpO1xuICB9O1xuICBjb25zdCBvblJlc2V0ID0gKHtcbiAgICBjb25maXJtLFxuICAgIGNsb3NlRHJvcGRvd25cbiAgfSA9IHtcbiAgICBjb25maXJtOiBmYWxzZSxcbiAgICBjbG9zZURyb3Bkb3duOiBmYWxzZVxuICB9KSA9PiB7XG4gICAgaWYgKGNvbmZpcm0pIHtcbiAgICAgIGludGVybmFsVHJpZ2dlckZpbHRlcihbXSk7XG4gICAgfVxuICAgIGlmIChjbG9zZURyb3Bkb3duKSB7XG4gICAgICB0cmlnZ2VyVmlzaWJsZShmYWxzZSk7XG4gICAgfVxuICAgIHNldFNlYXJjaFZhbHVlKCcnKTtcbiAgICBpZiAoZmlsdGVyUmVzZXRUb0RlZmF1bHRGaWx0ZXJlZFZhbHVlKSB7XG4gICAgICBzZXRGaWx0ZXJlZEtleXNTeW5jKChkZWZhdWx0RmlsdGVyZWRWYWx1ZSB8fCBbXSkubWFwKGtleSA9PiBTdHJpbmcoa2V5KSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRGaWx0ZXJlZEtleXNTeW5jKFtdKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGRvRmlsdGVyID0gKHtcbiAgICBjbG9zZURyb3Bkb3duXG4gIH0gPSB7XG4gICAgY2xvc2VEcm9wZG93bjogdHJ1ZVxuICB9KSA9PiB7XG4gICAgaWYgKGNsb3NlRHJvcGRvd24pIHtcbiAgICAgIHRyaWdnZXJWaXNpYmxlKGZhbHNlKTtcbiAgICB9XG4gICAgaW50ZXJuYWxUcmlnZ2VyRmlsdGVyKGdldEZpbHRlcmVkS2V5c1N5bmMoKSk7XG4gIH07XG4gIGNvbnN0IG9uVmlzaWJsZUNoYW5nZSA9IChuZXdWaXNpYmxlLCBpbmZvKSA9PiB7XG4gICAgaWYgKGluZm8uc291cmNlID09PSAndHJpZ2dlcicpIHtcbiAgICAgIGlmIChuZXdWaXNpYmxlICYmIHByb3BGaWx0ZXJlZEtleXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBTeW5jIGZpbHRlcmVkS2V5cyBvbiBhcHBlYXIgaW4gY29udHJvbGxlZCBtb2RlIChwcm9wRmlsdGVyZWRLZXlzICE9PSB1bmRlZmluZWQpXG4gICAgICAgIHNldEZpbHRlcmVkS2V5c1N5bmMod3JhcFN0cmluZ0xpc3RUeXBlKHByb3BGaWx0ZXJlZEtleXMpKTtcbiAgICAgIH1cbiAgICAgIHRyaWdnZXJWaXNpYmxlKG5ld1Zpc2libGUpO1xuICAgICAgaWYgKCFuZXdWaXNpYmxlICYmICFjb2x1bW4uZmlsdGVyRHJvcGRvd24gJiYgZmlsdGVyT25DbG9zZSkge1xuICAgICAgICBvbkNvbmZpcm0oKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBTdHlsZSA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgZHJvcGRvd25NZW51Q2xhc3MgPSAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoe1xuICAgIFtgJHtkcm9wZG93blByZWZpeENsc30tbWVudS13aXRob3V0LXN1Ym1lbnVgXTogIWhhc1N1Yk1lbnUoY29sdW1uLmZpbHRlcnMgfHwgW10pXG4gIH0pO1xuICBjb25zdCBvbkNoZWNrQWxsID0gZSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgIGNvbnN0IGFsbEZpbHRlcktleXMgPSBmbGF0dGVuS2V5cyhjb2x1bW4gPT09IG51bGwgfHwgY29sdW1uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb2x1bW4uZmlsdGVycykubWFwKGtleSA9PiBTdHJpbmcoa2V5KSk7XG4gICAgICBzZXRGaWx0ZXJlZEtleXNTeW5jKGFsbEZpbHRlcktleXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRGaWx0ZXJlZEtleXNTeW5jKFtdKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGdldFRyZWVEYXRhID0gKHtcbiAgICBmaWx0ZXJzXG4gIH0pID0+IChmaWx0ZXJzIHx8IFtdKS5tYXAoKGZpbHRlciwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBrZXkgPSBTdHJpbmcoZmlsdGVyLnZhbHVlKTtcbiAgICBjb25zdCBpdGVtID0ge1xuICAgICAgdGl0bGU6IGZpbHRlci50ZXh0LFxuICAgICAga2V5OiBmaWx0ZXIudmFsdWUgIT09IHVuZGVmaW5lZCA/IGtleSA6IFN0cmluZyhpbmRleClcbiAgICB9O1xuICAgIGlmIChmaWx0ZXIuY2hpbGRyZW4pIHtcbiAgICAgIGl0ZW0uY2hpbGRyZW4gPSBnZXRUcmVlRGF0YSh7XG4gICAgICAgIGZpbHRlcnM6IGZpbHRlci5jaGlsZHJlblxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBpdGVtO1xuICB9KTtcbiAgY29uc3QgZ2V0RmlsdGVyRGF0YSA9IG5vZGUgPT4ge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBub2RlKSwge1xuICAgICAgdGV4dDogbm9kZS50aXRsZSxcbiAgICAgIHZhbHVlOiBub2RlLmtleSxcbiAgICAgIGNoaWxkcmVuOiAoKF9hID0gbm9kZS5jaGlsZHJlbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm1hcChpdGVtID0+IGdldEZpbHRlckRhdGEoaXRlbSkpKSB8fCBbXVxuICAgIH0pO1xuICB9O1xuICBsZXQgZHJvcGRvd25Db250ZW50O1xuICBjb25zdCB7XG4gICAgZGlyZWN0aW9uLFxuICAgIHJlbmRlckVtcHR5XG4gIH0gPSBSZWFjdC51c2VDb250ZXh0KF9jb250ZXh0LkNvbmZpZ0NvbnRleHQpO1xuICBpZiAodHlwZW9mIGNvbHVtbi5maWx0ZXJEcm9wZG93biA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGRyb3Bkb3duQ29udGVudCA9IGNvbHVtbi5maWx0ZXJEcm9wZG93bih7XG4gICAgICBwcmVmaXhDbHM6IGAke2Ryb3Bkb3duUHJlZml4Q2xzfS1jdXN0b21gLFxuICAgICAgc2V0U2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXMgPT4gb25TZWxlY3RLZXlzKHtcbiAgICAgICAgc2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXNcbiAgICAgIH0pLFxuICAgICAgc2VsZWN0ZWRLZXlzOiBnZXRGaWx0ZXJlZEtleXNTeW5jKCksXG4gICAgICBjb25maXJtOiBkb0ZpbHRlcixcbiAgICAgIGNsZWFyRmlsdGVyczogb25SZXNldCxcbiAgICAgIGZpbHRlcnM6IGNvbHVtbi5maWx0ZXJzLFxuICAgICAgdmlzaWJsZTogbWVyZ2VkVmlzaWJsZSxcbiAgICAgIGNsb3NlOiAoKSA9PiB7XG4gICAgICAgIHRyaWdnZXJWaXNpYmxlKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIGlmIChjb2x1bW4uZmlsdGVyRHJvcGRvd24pIHtcbiAgICBkcm9wZG93bkNvbnRlbnQgPSBjb2x1bW4uZmlsdGVyRHJvcGRvd247XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRLZXlzID0gZ2V0RmlsdGVyZWRLZXlzU3luYygpIHx8IFtdO1xuICAgIGNvbnN0IGdldEZpbHRlckNvbXBvbmVudCA9ICgpID0+IHtcbiAgICAgIHZhciBfYSwgX2I7XG4gICAgICBjb25zdCBlbXB0eSA9IChfYSA9IHJlbmRlckVtcHR5ID09PSBudWxsIHx8IHJlbmRlckVtcHR5ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZW5kZXJFbXB0eSgnVGFibGUuZmlsdGVyJykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfZW1wdHkuZGVmYXVsdCwge1xuICAgICAgICBpbWFnZTogX2VtcHR5LmRlZmF1bHQuUFJFU0VOVEVEX0lNQUdFX1NJTVBMRSxcbiAgICAgICAgZGVzY3JpcHRpb246IGxvY2FsZS5maWx0ZXJFbXB0eVRleHQsXG4gICAgICAgIHN0eWxlczoge1xuICAgICAgICAgIGltYWdlOiB7XG4gICAgICAgICAgICBoZWlnaHQ6IDI0XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICBwYWRkaW5nOiAnMTZweCAwJ1xuICAgICAgICB9XG4gICAgICB9KSk7XG4gICAgICBpZiAoKGNvbHVtbi5maWx0ZXJzIHx8IFtdKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGVtcHR5O1xuICAgICAgfVxuICAgICAgaWYgKGZpbHRlck1vZGUgPT09ICd0cmVlJykge1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoUmVhY3QuRnJhZ21lbnQsIG51bGwsIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9GaWx0ZXJTZWFyY2guZGVmYXVsdCwge1xuICAgICAgICAgIGZpbHRlclNlYXJjaDogZmlsdGVyU2VhcmNoLFxuICAgICAgICAgIHZhbHVlOiBzZWFyY2hWYWx1ZSxcbiAgICAgICAgICBvbkNoYW5nZTogb25TZWFyY2gsXG4gICAgICAgICAgdGFibGVQcmVmaXhDbHM6IHRhYmxlUHJlZml4Q2xzLFxuICAgICAgICAgIGxvY2FsZTogbG9jYWxlXG4gICAgICAgIH0pLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBgJHt0YWJsZVByZWZpeENsc30tZmlsdGVyLWRyb3Bkb3duLXRyZWVgXG4gICAgICAgIH0sIGZpbHRlck11bHRpcGxlID8gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jaGVja2JveC5kZWZhdWx0LCB7XG4gICAgICAgICAgY2hlY2tlZDogc2VsZWN0ZWRLZXlzLmxlbmd0aCA9PT0gZmxhdHRlbktleXMoY29sdW1uLmZpbHRlcnMpLmxlbmd0aCxcbiAgICAgICAgICBpbmRldGVybWluYXRlOiBzZWxlY3RlZEtleXMubGVuZ3RoID4gMCAmJiBzZWxlY3RlZEtleXMubGVuZ3RoIDwgZmxhdHRlbktleXMoY29sdW1uLmZpbHRlcnMpLmxlbmd0aCxcbiAgICAgICAgICBjbGFzc05hbWU6IGAke3RhYmxlUHJlZml4Q2xzfS1maWx0ZXItZHJvcGRvd24tY2hlY2thbGxgLFxuICAgICAgICAgIG9uQ2hhbmdlOiBvbkNoZWNrQWxsXG4gICAgICAgIH0sIChfYiA9IGxvY2FsZSA9PT0gbnVsbCB8fCBsb2NhbGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxvY2FsZS5maWx0ZXJDaGVja2FsbCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbG9jYWxlID09PSBudWxsIHx8IGxvY2FsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogbG9jYWxlLmZpbHRlckNoZWNrQWxsKSkgOiBudWxsLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfdHJlZS5kZWZhdWx0LCB7XG4gICAgICAgICAgY2hlY2thYmxlOiB0cnVlLFxuICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgIGJsb2NrTm9kZTogdHJ1ZSxcbiAgICAgICAgICBtdWx0aXBsZTogZmlsdGVyTXVsdGlwbGUsXG4gICAgICAgICAgY2hlY2tTdHJpY3RseTogIWZpbHRlck11bHRpcGxlLFxuICAgICAgICAgIGNsYXNzTmFtZTogYCR7ZHJvcGRvd25QcmVmaXhDbHN9LW1lbnVgLFxuICAgICAgICAgIG9uQ2hlY2s6IG9uQ2hlY2ssXG4gICAgICAgICAgY2hlY2tlZEtleXM6IHNlbGVjdGVkS2V5cyxcbiAgICAgICAgICBzZWxlY3RlZEtleXM6IHNlbGVjdGVkS2V5cyxcbiAgICAgICAgICBzaG93SWNvbjogZmFsc2UsXG4gICAgICAgICAgdHJlZURhdGE6IGdldFRyZWVEYXRhKHtcbiAgICAgICAgICAgIGZpbHRlcnM6IGNvbHVtbi5maWx0ZXJzXG4gICAgICAgICAgfSksXG4gICAgICAgICAgYXV0b0V4cGFuZFBhcmVudDogdHJ1ZSxcbiAgICAgICAgICBkZWZhdWx0RXhwYW5kQWxsOiB0cnVlLFxuICAgICAgICAgIGZpbHRlclRyZWVOb2RlOiBzZWFyY2hWYWx1ZS50cmltKCkgPyBub2RlID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsdGVyU2VhcmNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJTZWFyY2goc2VhcmNoVmFsdWUsIGdldEZpbHRlckRhdGEobm9kZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNlYXJjaFZhbHVlTWF0Y2hlZChzZWFyY2hWYWx1ZSwgbm9kZS50aXRsZSk7XG4gICAgICAgICAgfSA6IHVuZGVmaW5lZFxuICAgICAgICB9KSkpO1xuICAgICAgfVxuICAgICAgY29uc3QgaXRlbXMgPSByZW5kZXJGaWx0ZXJJdGVtcyh7XG4gICAgICAgIGZpbHRlcnM6IGNvbHVtbi5maWx0ZXJzIHx8IFtdLFxuICAgICAgICBmaWx0ZXJTZWFyY2gsXG4gICAgICAgIHByZWZpeENscyxcbiAgICAgICAgZmlsdGVyZWRLZXlzOiBnZXRGaWx0ZXJlZEtleXNTeW5jKCksXG4gICAgICAgIGZpbHRlck11bHRpcGxlLFxuICAgICAgICBzZWFyY2hWYWx1ZVxuICAgICAgfSk7XG4gICAgICBjb25zdCBpc0VtcHR5ID0gaXRlbXMuZXZlcnkoaXRlbSA9PiBpdGVtID09PSBudWxsKTtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0ZpbHRlclNlYXJjaC5kZWZhdWx0LCB7XG4gICAgICAgIGZpbHRlclNlYXJjaDogZmlsdGVyU2VhcmNoLFxuICAgICAgICB2YWx1ZTogc2VhcmNoVmFsdWUsXG4gICAgICAgIG9uQ2hhbmdlOiBvblNlYXJjaCxcbiAgICAgICAgdGFibGVQcmVmaXhDbHM6IHRhYmxlUHJlZml4Q2xzLFxuICAgICAgICBsb2NhbGU6IGxvY2FsZVxuICAgICAgfSksIGlzRW1wdHkgPyBlbXB0eSA6ICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfbWVudS5kZWZhdWx0LCB7XG4gICAgICAgIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICAgIG11bHRpcGxlOiBmaWx0ZXJNdWx0aXBsZSxcbiAgICAgICAgcHJlZml4Q2xzOiBgJHtkcm9wZG93blByZWZpeENsc30tbWVudWAsXG4gICAgICAgIGNsYXNzTmFtZTogZHJvcGRvd25NZW51Q2xhc3MsXG4gICAgICAgIG9uU2VsZWN0OiBvblNlbGVjdEtleXMsXG4gICAgICAgIG9uRGVzZWxlY3Q6IG9uU2VsZWN0S2V5cyxcbiAgICAgICAgc2VsZWN0ZWRLZXlzOiBzZWxlY3RlZEtleXMsXG4gICAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgb3BlbktleXM6IG9wZW5LZXlzLFxuICAgICAgICBvbk9wZW5DaGFuZ2U6IG9uT3BlbkNoYW5nZSxcbiAgICAgICAgaXRlbXM6IGl0ZW1zXG4gICAgICB9KSkpO1xuICAgIH07XG4gICAgY29uc3QgZ2V0UmVzZXREaXNhYmxlZCA9ICgpID0+IHtcbiAgICAgIGlmIChmaWx0ZXJSZXNldFRvRGVmYXVsdEZpbHRlcmVkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuICgwLCBfaXNFcXVhbC5kZWZhdWx0KSgoZGVmYXVsdEZpbHRlcmVkVmFsdWUgfHwgW10pLm1hcChrZXkgPT4gU3RyaW5nKGtleSkpLCBzZWxlY3RlZEtleXMsIHRydWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlbGVjdGVkS2V5cy5sZW5ndGggPT09IDA7XG4gICAgfTtcbiAgICBkcm9wZG93bkNvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgZ2V0RmlsdGVyQ29tcG9uZW50KCksIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1kcm9wZG93bi1idG5zYFxuICAgIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9idXR0b24uZGVmYXVsdCwge1xuICAgICAgdHlwZTogXCJsaW5rXCIsXG4gICAgICBzaXplOiBcInNtYWxsXCIsXG4gICAgICBkaXNhYmxlZDogZ2V0UmVzZXREaXNhYmxlZCgpLFxuICAgICAgb25DbGljazogKCkgPT4gb25SZXNldCgpXG4gICAgfSwgbG9jYWxlLmZpbHRlclJlc2V0KSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2J1dHRvbi5kZWZhdWx0LCB7XG4gICAgICB0eXBlOiBcInByaW1hcnlcIixcbiAgICAgIHNpemU6IFwic21hbGxcIixcbiAgICAgIG9uQ2xpY2s6IG9uQ29uZmlybVxuICAgIH0sIGxvY2FsZS5maWx0ZXJDb25maXJtKSkpO1xuICB9XG4gIC8vIFdlIHNob3VsZCBub3QgYmxvY2sgY3VzdG9taXplIE1lbnUgd2l0aCBhZGRpdGlvbmFsIHByb3BzXG4gIGlmIChjb2x1bW4uZmlsdGVyRHJvcGRvd24pIHtcbiAgICBkcm9wZG93bkNvbnRlbnQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfT3ZlcnJpZGVDb250ZXh0Lk92ZXJyaWRlUHJvdmlkZXIsIHtcbiAgICAgIHNlbGVjdGFibGU6IHVuZGVmaW5lZFxuICAgIH0sIGRyb3Bkb3duQ29udGVudCk7XG4gIH1cbiAgZHJvcGRvd25Db250ZW50ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0ZpbHRlcldyYXBwZXIuZGVmYXVsdCwge1xuICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1kcm9wZG93bmBcbiAgfSwgZHJvcGRvd25Db250ZW50KTtcbiAgY29uc3QgZ2V0RHJvcGRvd25UcmlnZ2VyID0gKCkgPT4ge1xuICAgIGxldCBmaWx0ZXJJY29uO1xuICAgIGlmICh0eXBlb2YgY29sdW1uLmZpbHRlckljb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGZpbHRlckljb24gPSBjb2x1bW4uZmlsdGVySWNvbihmaWx0ZXJlZCk7XG4gICAgfSBlbHNlIGlmIChjb2x1bW4uZmlsdGVySWNvbikge1xuICAgICAgZmlsdGVySWNvbiA9IGNvbHVtbi5maWx0ZXJJY29uO1xuICAgIH0gZWxzZSB7XG4gICAgICBmaWx0ZXJJY29uID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0ZpbHRlckZpbGxlZC5kZWZhdWx0LCBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XG4gICAgICByb2xlOiBcImJ1dHRvblwiLFxuICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoYCR7cHJlZml4Q2xzfS10cmlnZ2VyYCwge1xuICAgICAgICBhY3RpdmU6IGZpbHRlcmVkXG4gICAgICB9KSxcbiAgICAgIG9uQ2xpY2s6IGUgPT4ge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgIH0sIGZpbHRlckljb24pO1xuICB9O1xuICBjb25zdCBtZXJnZWREcm9wZG93blByb3BzID0gKDAsIF9leHRlbmRzT2JqZWN0LmRlZmF1bHQpKHtcbiAgICB0cmlnZ2VyOiBbJ2NsaWNrJ10sXG4gICAgcGxhY2VtZW50OiBkaXJlY3Rpb24gPT09ICdydGwnID8gJ2JvdHRvbUxlZnQnIDogJ2JvdHRvbVJpZ2h0JyxcbiAgICBjaGlsZHJlbjogZ2V0RHJvcGRvd25UcmlnZ2VyKCksXG4gICAgZ2V0UG9wdXBDb250YWluZXJcbiAgfSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBmaWx0ZXJEcm9wZG93blByb3BzKSwge1xuICAgIHJvb3RDbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShyb290Q2xhc3NOYW1lLCBmaWx0ZXJEcm9wZG93blByb3BzLnJvb3RDbGFzc05hbWUpLFxuICAgIG9wZW46IG1lcmdlZFZpc2libGUsXG4gICAgb25PcGVuQ2hhbmdlOiBvblZpc2libGVDaGFuZ2UsXG4gICAgcG9wdXBSZW5kZXI6ICgpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgKGZpbHRlckRyb3Bkb3duUHJvcHMgPT09IG51bGwgfHwgZmlsdGVyRHJvcGRvd25Qcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmlsdGVyRHJvcGRvd25Qcm9wcy5kcm9wZG93blJlbmRlcikgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGZpbHRlckRyb3Bkb3duUHJvcHMuZHJvcGRvd25SZW5kZXIoZHJvcGRvd25Db250ZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkcm9wZG93bkNvbnRlbnQ7XG4gICAgfVxuICB9KSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWNvbHVtbmBcbiAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICBjbGFzc05hbWU6IGAke3RhYmxlUHJlZml4Q2xzfS1jb2x1bW4tdGl0bGVgXG4gIH0sIGNoaWxkcmVuKSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2Ryb3Bkb3duLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIG1lcmdlZERyb3Bkb3duUHJvcHMpKSk7XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gRmlsdGVyRHJvcGRvd247IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cInVzZSBjbGllbnRcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9TZWFyY2hPdXRsaW5lZCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIkBhbnQtZGVzaWduL2ljb25zL1NlYXJjaE91dGxpbmVkXCIpKTtcbnZhciBfSW5wdXQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi8uLi9pbnB1dC9JbnB1dFwiKSk7XG5jb25zdCBGaWx0ZXJTZWFyY2ggPSBwcm9wcyA9PiB7XG4gIGNvbnN0IHtcbiAgICB2YWx1ZSxcbiAgICBmaWx0ZXJTZWFyY2gsXG4gICAgdGFibGVQcmVmaXhDbHMsXG4gICAgbG9jYWxlLFxuICAgIG9uQ2hhbmdlXG4gIH0gPSBwcm9wcztcbiAgaWYgKCFmaWx0ZXJTZWFyY2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogYCR7dGFibGVQcmVmaXhDbHN9LWZpbHRlci1kcm9wZG93bi1zZWFyY2hgXG4gIH0sIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9JbnB1dC5kZWZhdWx0LCB7XG4gICAgcHJlZml4OiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfU2VhcmNoT3V0bGluZWQuZGVmYXVsdCwgbnVsbCksXG4gICAgcGxhY2Vob2xkZXI6IGxvY2FsZS5maWx0ZXJTZWFyY2hQbGFjZWhvbGRlcixcbiAgICBvbkNoYW5nZTogb25DaGFuZ2UsXG4gICAgdmFsdWU6IHZhbHVlLFxuICAgIC8vIGZvciBza2lwIG1pbi13aWR0aCBvZiBpbnB1dFxuICAgIGh0bWxTaXplOiAxLFxuICAgIGNsYXNzTmFtZTogYCR7dGFibGVQcmVmaXhDbHN9LWZpbHRlci1kcm9wZG93bi1zZWFyY2gtaW5wdXRgXG4gIH0pKTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBGaWx0ZXJTZWFyY2g7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cInVzZSBjbGllbnRcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF9LZXlDb2RlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwicmMtdXRpbC9saWIvS2V5Q29kZVwiKSk7XG5jb25zdCBvbktleURvd24gPSBldmVudCA9PiB7XG4gIGNvbnN0IHtcbiAgICBrZXlDb2RlXG4gIH0gPSBldmVudDtcbiAgaWYgKGtleUNvZGUgPT09IF9LZXlDb2RlLmRlZmF1bHQuRU5URVIpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxufTtcbmNvbnN0IEZpbHRlckRyb3Bkb3duTWVudVdyYXBwZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuZm9yd2FyZFJlZigocHJvcHMsIHJlZikgPT4gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgY2xhc3NOYW1lOiBwcm9wcy5jbGFzc05hbWUsXG4gIG9uQ2xpY2s6IGUgPT4gZS5zdG9wUHJvcGFnYXRpb24oKSxcbiAgb25LZXlEb3duOiBvbktleURvd24sXG4gIHJlZjogcmVmXG59LCBwcm9wcy5jaGlsZHJlbikpKTtcbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIEZpbHRlckRyb3Bkb3duTWVudVdyYXBwZXIuZGlzcGxheU5hbWUgPSAnRmlsdGVyRHJvcGRvd25NZW51V3JhcHBlcic7XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBGaWx0ZXJEcm9wZG93bk1lbnVXcmFwcGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiZmxhdHRlbktleXNcIiwge1xuICBlbnVtZXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gX0ZpbHRlckRyb3Bkb3duLmZsYXR0ZW5LZXlzO1xuICB9XG59KTtcbmV4cG9ydHMuZ2V0RmlsdGVyRGF0YSA9IHZvaWQgMDtcbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG52YXIgUmVhY3QgPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwicmVhY3RcIikpO1xudmFyIF93YXJuaW5nID0gcmVxdWlyZShcIi4uLy4uLy4uL191dGlsL3dhcm5pbmdcIik7XG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi4vLi4vdXRpbFwiKTtcbnZhciBfRmlsdGVyRHJvcGRvd24gPSBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChyZXF1aXJlKFwiLi9GaWx0ZXJEcm9wZG93blwiKSk7XG5jb25zdCBjb2xsZWN0RmlsdGVyU3RhdGVzID0gKGNvbHVtbnMsIGluaXQsIHBvcykgPT4ge1xuICBsZXQgZmlsdGVyU3RhdGVzID0gW107XG4gIChjb2x1bW5zIHx8IFtdKS5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IGNvbHVtblBvcyA9ICgwLCBfdXRpbC5nZXRDb2x1bW5Qb3MpKGluZGV4LCBwb3MpO1xuICAgIGNvbnN0IGZpbHRlckRyb3Bkb3duSXNEZWZpbmVkID0gY29sdW1uLmZpbHRlckRyb3Bkb3duICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKGNvbHVtbi5maWx0ZXJzIHx8IGZpbHRlckRyb3Bkb3duSXNEZWZpbmVkIHx8ICdvbkZpbHRlcicgaW4gY29sdW1uKSB7XG4gICAgICBpZiAoJ2ZpbHRlcmVkVmFsdWUnIGluIGNvbHVtbikge1xuICAgICAgICAvLyBDb250cm9sbGVkXG4gICAgICAgIGxldCBmaWx0ZXJlZFZhbHVlcyA9IGNvbHVtbi5maWx0ZXJlZFZhbHVlO1xuICAgICAgICBpZiAoIWZpbHRlckRyb3Bkb3duSXNEZWZpbmVkKSB7XG4gICAgICAgICAgZmlsdGVyZWRWYWx1ZXMgPSAoX2EgPSBmaWx0ZXJlZFZhbHVlcyA9PT0gbnVsbCB8fCBmaWx0ZXJlZFZhbHVlcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZmlsdGVyZWRWYWx1ZXMubWFwKFN0cmluZykpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IGZpbHRlcmVkVmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIGZpbHRlclN0YXRlcy5wdXNoKHtcbiAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAga2V5OiAoMCwgX3V0aWwuZ2V0Q29sdW1uS2V5KShjb2x1bW4sIGNvbHVtblBvcyksXG4gICAgICAgICAgZmlsdGVyZWRLZXlzOiBmaWx0ZXJlZFZhbHVlcyxcbiAgICAgICAgICBmb3JjZUZpbHRlcmVkOiBjb2x1bW4uZmlsdGVyZWRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVbmNvbnRyb2xsZWRcbiAgICAgICAgZmlsdGVyU3RhdGVzLnB1c2goe1xuICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICBrZXk6ICgwLCBfdXRpbC5nZXRDb2x1bW5LZXkpKGNvbHVtbiwgY29sdW1uUG9zKSxcbiAgICAgICAgICBmaWx0ZXJlZEtleXM6IGluaXQgJiYgY29sdW1uLmRlZmF1bHRGaWx0ZXJlZFZhbHVlID8gY29sdW1uLmRlZmF1bHRGaWx0ZXJlZFZhbHVlIDogdW5kZWZpbmVkLFxuICAgICAgICAgIGZvcmNlRmlsdGVyZWQ6IGNvbHVtbi5maWx0ZXJlZFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCdjaGlsZHJlbicgaW4gY29sdW1uKSB7XG4gICAgICBmaWx0ZXJTdGF0ZXMgPSBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoZmlsdGVyU3RhdGVzKSwgKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoY29sbGVjdEZpbHRlclN0YXRlcyhjb2x1bW4uY2hpbGRyZW4sIGluaXQsIGNvbHVtblBvcykpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZmlsdGVyU3RhdGVzO1xufTtcbmZ1bmN0aW9uIGluamVjdEZpbHRlcihwcmVmaXhDbHMsIGRyb3Bkb3duUHJlZml4Q2xzLCBjb2x1bW5zLCBmaWx0ZXJTdGF0ZXMsIGxvY2FsZSwgdHJpZ2dlckZpbHRlciwgZ2V0UG9wdXBDb250YWluZXIsIHBvcywgcm9vdENsYXNzTmFtZSkge1xuICByZXR1cm4gY29sdW1ucy5tYXAoKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBjb2x1bW5Qb3MgPSAoMCwgX3V0aWwuZ2V0Q29sdW1uUG9zKShpbmRleCwgcG9zKTtcbiAgICBjb25zdCB7XG4gICAgICBmaWx0ZXJPbkNsb3NlID0gdHJ1ZSxcbiAgICAgIGZpbHRlck11bHRpcGxlID0gdHJ1ZSxcbiAgICAgIGZpbHRlck1vZGUsXG4gICAgICBmaWx0ZXJTZWFyY2hcbiAgICB9ID0gY29sdW1uO1xuICAgIGxldCBuZXdDb2x1bW4gPSBjb2x1bW47XG4gICAgaWYgKG5ld0NvbHVtbi5maWx0ZXJzIHx8IG5ld0NvbHVtbi5maWx0ZXJEcm9wZG93bikge1xuICAgICAgY29uc3QgY29sdW1uS2V5ID0gKDAsIF91dGlsLmdldENvbHVtbktleSkobmV3Q29sdW1uLCBjb2x1bW5Qb3MpO1xuICAgICAgY29uc3QgZmlsdGVyU3RhdGUgPSBmaWx0ZXJTdGF0ZXMuZmluZCgoe1xuICAgICAgICBrZXlcbiAgICAgIH0pID0+IGNvbHVtbktleSA9PT0ga2V5KTtcbiAgICAgIG5ld0NvbHVtbiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbmV3Q29sdW1uKSwge1xuICAgICAgICB0aXRsZTogcmVuZGVyUHJvcHMgPT4gKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9GaWx0ZXJEcm9wZG93bi5kZWZhdWx0LCB7XG4gICAgICAgICAgdGFibGVQcmVmaXhDbHM6IHByZWZpeENscyxcbiAgICAgICAgICBwcmVmaXhDbHM6IGAke3ByZWZpeENsc30tZmlsdGVyYCxcbiAgICAgICAgICBkcm9wZG93blByZWZpeENsczogZHJvcGRvd25QcmVmaXhDbHMsXG4gICAgICAgICAgY29sdW1uOiBuZXdDb2x1bW4sXG4gICAgICAgICAgY29sdW1uS2V5OiBjb2x1bW5LZXksXG4gICAgICAgICAgZmlsdGVyU3RhdGU6IGZpbHRlclN0YXRlLFxuICAgICAgICAgIGZpbHRlck9uQ2xvc2U6IGZpbHRlck9uQ2xvc2UsXG4gICAgICAgICAgZmlsdGVyTXVsdGlwbGU6IGZpbHRlck11bHRpcGxlLFxuICAgICAgICAgIGZpbHRlck1vZGU6IGZpbHRlck1vZGUsXG4gICAgICAgICAgZmlsdGVyU2VhcmNoOiBmaWx0ZXJTZWFyY2gsXG4gICAgICAgICAgdHJpZ2dlckZpbHRlcjogdHJpZ2dlckZpbHRlcixcbiAgICAgICAgICBsb2NhbGU6IGxvY2FsZSxcbiAgICAgICAgICBnZXRQb3B1cENvbnRhaW5lcjogZ2V0UG9wdXBDb250YWluZXIsXG4gICAgICAgICAgcm9vdENsYXNzTmFtZTogcm9vdENsYXNzTmFtZVxuICAgICAgICB9LCAoMCwgX3V0aWwucmVuZGVyQ29sdW1uVGl0bGUpKGNvbHVtbi50aXRsZSwgcmVuZGVyUHJvcHMpKSlcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoJ2NoaWxkcmVuJyBpbiBuZXdDb2x1bW4pIHtcbiAgICAgIG5ld0NvbHVtbiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbmV3Q29sdW1uKSwge1xuICAgICAgICBjaGlsZHJlbjogaW5qZWN0RmlsdGVyKHByZWZpeENscywgZHJvcGRvd25QcmVmaXhDbHMsIG5ld0NvbHVtbi5jaGlsZHJlbiwgZmlsdGVyU3RhdGVzLCBsb2NhbGUsIHRyaWdnZXJGaWx0ZXIsIGdldFBvcHVwQ29udGFpbmVyLCBjb2x1bW5Qb3MsIHJvb3RDbGFzc05hbWUpXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0NvbHVtbjtcbiAgfSk7XG59XG5jb25zdCBnZW5lcmF0ZUZpbHRlckluZm8gPSBmaWx0ZXJTdGF0ZXMgPT4ge1xuICBjb25zdCBjdXJyZW50RmlsdGVycyA9IHt9O1xuICBmaWx0ZXJTdGF0ZXMuZm9yRWFjaCgoe1xuICAgIGtleSxcbiAgICBmaWx0ZXJlZEtleXMsXG4gICAgY29sdW1uXG4gIH0pID0+IHtcbiAgICBjb25zdCBrZXlBc1N0cmluZyA9IGtleTtcbiAgICBjb25zdCB7XG4gICAgICBmaWx0ZXJzLFxuICAgICAgZmlsdGVyRHJvcGRvd25cbiAgICB9ID0gY29sdW1uO1xuICAgIGlmIChmaWx0ZXJEcm9wZG93bikge1xuICAgICAgY3VycmVudEZpbHRlcnNba2V5QXNTdHJpbmddID0gZmlsdGVyZWRLZXlzIHx8IG51bGw7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcmVkS2V5cykpIHtcbiAgICAgIGNvbnN0IGtleXMgPSAoMCwgX0ZpbHRlckRyb3Bkb3duLmZsYXR0ZW5LZXlzKShmaWx0ZXJzKTtcbiAgICAgIGN1cnJlbnRGaWx0ZXJzW2tleUFzU3RyaW5nXSA9IGtleXMuZmlsdGVyKG9yaWdpbktleSA9PiBmaWx0ZXJlZEtleXMuaW5jbHVkZXMoU3RyaW5nKG9yaWdpbktleSkpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudEZpbHRlcnNba2V5QXNTdHJpbmddID0gbnVsbDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gY3VycmVudEZpbHRlcnM7XG59O1xuY29uc3QgZ2V0RmlsdGVyRGF0YSA9IChkYXRhLCBmaWx0ZXJTdGF0ZXMsIGNoaWxkcmVuQ29sdW1uTmFtZSkgPT4ge1xuICBjb25zdCBmaWx0ZXJEYXRhcyA9IGZpbHRlclN0YXRlcy5yZWR1Y2UoKGN1cnJlbnREYXRhLCBmaWx0ZXJTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbHVtbjoge1xuICAgICAgICBvbkZpbHRlcixcbiAgICAgICAgZmlsdGVyc1xuICAgICAgfSxcbiAgICAgIGZpbHRlcmVkS2V5c1xuICAgIH0gPSBmaWx0ZXJTdGF0ZTtcbiAgICBpZiAob25GaWx0ZXIgJiYgZmlsdGVyZWRLZXlzICYmIGZpbHRlcmVkS2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50RGF0YVxuICAgICAgLy8gc2hhbGxvdyBjb3B5XG4gICAgICAubWFwKHJlY29yZCA9PiBPYmplY3QuYXNzaWduKHt9LCByZWNvcmQpKS5maWx0ZXIocmVjb3JkID0+IGZpbHRlcmVkS2V5cy5zb21lKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IGtleXMgPSAoMCwgX0ZpbHRlckRyb3Bkb3duLmZsYXR0ZW5LZXlzKShmaWx0ZXJzKTtcbiAgICAgICAgY29uc3Qga2V5SW5kZXggPSBrZXlzLmZpbmRJbmRleChrID0+IFN0cmluZyhrKSA9PT0gU3RyaW5nKGtleSkpO1xuICAgICAgICBjb25zdCByZWFsS2V5ID0ga2V5SW5kZXggIT09IC0xID8ga2V5c1trZXlJbmRleF0gOiBrZXk7XG4gICAgICAgIC8vIGZpbHRlciBjaGlsZHJlblxuICAgICAgICBpZiAocmVjb3JkW2NoaWxkcmVuQ29sdW1uTmFtZV0pIHtcbiAgICAgICAgICByZWNvcmRbY2hpbGRyZW5Db2x1bW5OYW1lXSA9IGdldEZpbHRlckRhdGEocmVjb3JkW2NoaWxkcmVuQ29sdW1uTmFtZV0sIGZpbHRlclN0YXRlcywgY2hpbGRyZW5Db2x1bW5OYW1lKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb25GaWx0ZXIocmVhbEtleSwgcmVjb3JkKTtcbiAgICAgIH0pKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnREYXRhO1xuICB9LCBkYXRhKTtcbiAgcmV0dXJuIGZpbHRlckRhdGFzO1xufTtcbmV4cG9ydHMuZ2V0RmlsdGVyRGF0YSA9IGdldEZpbHRlckRhdGE7XG5jb25zdCBnZXRNZXJnZWRDb2x1bW5zID0gcmF3TWVyZ2VkQ29sdW1ucyA9PiByYXdNZXJnZWRDb2x1bW5zLmZsYXRNYXAoY29sdW1uID0+IHtcbiAgaWYgKCdjaGlsZHJlbicgaW4gY29sdW1uKSB7XG4gICAgcmV0dXJuIFtjb2x1bW5dLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShnZXRNZXJnZWRDb2x1bW5zKGNvbHVtbi5jaGlsZHJlbiB8fCBbXSkpKTtcbiAgfVxuICByZXR1cm4gW2NvbHVtbl07XG59KTtcbmNvbnN0IHVzZUZpbHRlciA9IHByb3BzID0+IHtcbiAgY29uc3Qge1xuICAgIHByZWZpeENscyxcbiAgICBkcm9wZG93blByZWZpeENscyxcbiAgICBtZXJnZWRDb2x1bW5zOiByYXdNZXJnZWRDb2x1bW5zLFxuICAgIG9uRmlsdGVyQ2hhbmdlLFxuICAgIGdldFBvcHVwQ29udGFpbmVyLFxuICAgIGxvY2FsZTogdGFibGVMb2NhbGUsXG4gICAgcm9vdENsYXNzTmFtZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IHdhcm5pbmcgPSAoMCwgX3dhcm5pbmcuZGV2VXNlV2FybmluZykoJ1RhYmxlJyk7XG4gIGNvbnN0IG1lcmdlZENvbHVtbnMgPSBSZWFjdC51c2VNZW1vKCgpID0+IGdldE1lcmdlZENvbHVtbnMocmF3TWVyZ2VkQ29sdW1ucyB8fCBbXSksIFtyYXdNZXJnZWRDb2x1bW5zXSk7XG4gIGNvbnN0IFtmaWx0ZXJTdGF0ZXMsIHNldEZpbHRlclN0YXRlc10gPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiBjb2xsZWN0RmlsdGVyU3RhdGVzKG1lcmdlZENvbHVtbnMsIHRydWUpKTtcbiAgY29uc3QgbWVyZ2VkRmlsdGVyU3RhdGVzID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgY29sbGVjdGVkU3RhdGVzID0gY29sbGVjdEZpbHRlclN0YXRlcyhtZXJnZWRDb2x1bW5zLCBmYWxzZSk7XG4gICAgaWYgKGNvbGxlY3RlZFN0YXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjb2xsZWN0ZWRTdGF0ZXM7XG4gICAgfVxuICAgIGxldCBmaWx0ZXJlZEtleXNJc0FsbE5vdENvbnRyb2xsZWQgPSB0cnVlO1xuICAgIGxldCBmaWx0ZXJlZEtleXNJc0FsbENvbnRyb2xsZWQgPSB0cnVlO1xuICAgIGNvbGxlY3RlZFN0YXRlcy5mb3JFYWNoKCh7XG4gICAgICBmaWx0ZXJlZEtleXNcbiAgICB9KSA9PiB7XG4gICAgICBpZiAoZmlsdGVyZWRLZXlzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZmlsdGVyZWRLZXlzSXNBbGxOb3RDb250cm9sbGVkID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWx0ZXJlZEtleXNJc0FsbENvbnRyb2xsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBSZXR1cm4gaWYgbm90IGNvbnRyb2xsZWRcbiAgICBpZiAoZmlsdGVyZWRLZXlzSXNBbGxOb3RDb250cm9sbGVkKSB7XG4gICAgICAvLyBGaWx0ZXIgY29sdW1uIG1heSBoYXZlIGJlZW4gcmVtb3ZlZFxuICAgICAgY29uc3Qga2V5TGlzdCA9IChtZXJnZWRDb2x1bW5zIHx8IFtdKS5tYXAoKGNvbHVtbiwgaW5kZXgpID0+ICgwLCBfdXRpbC5nZXRDb2x1bW5LZXkpKGNvbHVtbiwgKDAsIF91dGlsLmdldENvbHVtblBvcykoaW5kZXgpKSk7XG4gICAgICByZXR1cm4gZmlsdGVyU3RhdGVzLmZpbHRlcigoe1xuICAgICAgICBrZXlcbiAgICAgIH0pID0+IGtleUxpc3QuaW5jbHVkZXMoa2V5KSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCBjb2wgPSBtZXJnZWRDb2x1bW5zW2tleUxpc3QuZmluZEluZGV4KGtleSA9PiBrZXkgPT09IGl0ZW0ua2V5KV07XG4gICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGl0ZW0pLCB7XG4gICAgICAgICAgY29sdW1uOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGl0ZW0uY29sdW1uKSwgY29sKSxcbiAgICAgICAgICBmb3JjZUZpbHRlcmVkOiBjb2wuZmlsdGVyZWRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyhmaWx0ZXJlZEtleXNJc0FsbENvbnRyb2xsZWQsICd1c2FnZScsICdDb2x1bW5zIHNob3VsZCBhbGwgY29udGFpbiBgZmlsdGVyZWRWYWx1ZWAgb3Igbm90IGNvbnRhaW4gYGZpbHRlcmVkVmFsdWVgLicpIDogdm9pZCAwO1xuICAgIHJldHVybiBjb2xsZWN0ZWRTdGF0ZXM7XG4gIH0sIFttZXJnZWRDb2x1bW5zLCBmaWx0ZXJTdGF0ZXNdKTtcbiAgY29uc3QgZmlsdGVycyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gZ2VuZXJhdGVGaWx0ZXJJbmZvKG1lcmdlZEZpbHRlclN0YXRlcyksIFttZXJnZWRGaWx0ZXJTdGF0ZXNdKTtcbiAgY29uc3QgdHJpZ2dlckZpbHRlciA9IGZpbHRlclN0YXRlID0+IHtcbiAgICBjb25zdCBuZXdGaWx0ZXJTdGF0ZXMgPSBtZXJnZWRGaWx0ZXJTdGF0ZXMuZmlsdGVyKCh7XG4gICAgICBrZXlcbiAgICB9KSA9PiBrZXkgIT09IGZpbHRlclN0YXRlLmtleSk7XG4gICAgbmV3RmlsdGVyU3RhdGVzLnB1c2goZmlsdGVyU3RhdGUpO1xuICAgIHNldEZpbHRlclN0YXRlcyhuZXdGaWx0ZXJTdGF0ZXMpO1xuICAgIG9uRmlsdGVyQ2hhbmdlKGdlbmVyYXRlRmlsdGVySW5mbyhuZXdGaWx0ZXJTdGF0ZXMpLCBuZXdGaWx0ZXJTdGF0ZXMpO1xuICB9O1xuICBjb25zdCB0cmFuc2Zvcm1Db2x1bW5zID0gaW5uZXJDb2x1bW5zID0+IGluamVjdEZpbHRlcihwcmVmaXhDbHMsIGRyb3Bkb3duUHJlZml4Q2xzLCBpbm5lckNvbHVtbnMsIG1lcmdlZEZpbHRlclN0YXRlcywgdGFibGVMb2NhbGUsIHRyaWdnZXJGaWx0ZXIsIGdldFBvcHVwQ29udGFpbmVyLCB1bmRlZmluZWQsIHJvb3RDbGFzc05hbWUpO1xuICByZXR1cm4gW3RyYW5zZm9ybUNvbHVtbnMsIG1lcmdlZEZpbHRlclN0YXRlcywgZmlsdGVyc107XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gdXNlRmlsdGVyOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkXCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIFJlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbmNvbnN0IHVzZUxhenlLVk1hcCA9IChkYXRhLCBjaGlsZHJlbkNvbHVtbk5hbWUsIGdldFJvd0tleSkgPT4ge1xuICBjb25zdCBtYXBDYWNoZVJlZiA9IFJlYWN0LnVzZVJlZih7fSk7XG4gIGZ1bmN0aW9uIGdldFJlY29yZEJ5S2V5KGtleSkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoIW1hcENhY2hlUmVmLmN1cnJlbnQgfHwgbWFwQ2FjaGVSZWYuY3VycmVudC5kYXRhICE9PSBkYXRhIHx8IG1hcENhY2hlUmVmLmN1cnJlbnQuY2hpbGRyZW5Db2x1bW5OYW1lICE9PSBjaGlsZHJlbkNvbHVtbk5hbWUgfHwgbWFwQ2FjaGVSZWYuY3VycmVudC5nZXRSb3dLZXkgIT09IGdldFJvd0tleSkge1xuICAgICAgY29uc3Qga3ZNYXAgPSBuZXcgTWFwKCk7XG4gICAgICBmdW5jdGlvbiBkaWcocmVjb3Jkcykge1xuICAgICAgICByZWNvcmRzLmZvckVhY2goKHJlY29yZCwgaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCByb3dLZXkgPSBnZXRSb3dLZXkocmVjb3JkLCBpbmRleCk7XG4gICAgICAgICAga3ZNYXAuc2V0KHJvd0tleSwgcmVjb3JkKTtcbiAgICAgICAgICBpZiAocmVjb3JkICYmIHR5cGVvZiByZWNvcmQgPT09ICdvYmplY3QnICYmIGNoaWxkcmVuQ29sdW1uTmFtZSBpbiByZWNvcmQpIHtcbiAgICAgICAgICAgIGRpZyhyZWNvcmRbY2hpbGRyZW5Db2x1bW5OYW1lXSB8fCBbXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGRpZyhkYXRhKTtcbiAgICAgIG1hcENhY2hlUmVmLmN1cnJlbnQgPSB7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIGNoaWxkcmVuQ29sdW1uTmFtZSxcbiAgICAgICAga3ZNYXAsXG4gICAgICAgIGdldFJvd0tleVxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIChfYSA9IG1hcENhY2hlUmVmLmN1cnJlbnQua3ZNYXApID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5nZXQoa2V5KTtcbiAgfVxuICByZXR1cm4gW2dldFJlY29yZEJ5S2V5XTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB1c2VMYXp5S1ZNYXA7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5ERUZBVUxUX1BBR0VfU0laRSA9IHZvaWQgMDtcbmV4cG9ydHMuZ2V0UGFnaW5hdGlvblBhcmFtID0gZ2V0UGFnaW5hdGlvblBhcmFtO1xudmFyIF9yZWFjdCA9IHJlcXVpcmUoXCJyZWFjdFwiKTtcbnZhciBfZXh0ZW5kc09iamVjdCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL191dGlsL2V4dGVuZHNPYmplY3RcIikpO1xudmFyIF9fcmVzdCA9IHZvaWQgMCAmJiAodm9pZCAwKS5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpIGZvciAodmFyIGkgPSAwLCBwID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzKTsgaSA8IHAubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpIHRbcFtpXV0gPSBzW3BbaV1dO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmNvbnN0IERFRkFVTFRfUEFHRV9TSVpFID0gZXhwb3J0cy5ERUZBVUxUX1BBR0VfU0laRSA9IDEwO1xuZnVuY3Rpb24gZ2V0UGFnaW5hdGlvblBhcmFtKG1lcmdlZFBhZ2luYXRpb24sIHBhZ2luYXRpb24pIHtcbiAgY29uc3QgcGFyYW0gPSB7XG4gICAgY3VycmVudDogbWVyZ2VkUGFnaW5hdGlvbi5jdXJyZW50LFxuICAgIHBhZ2VTaXplOiBtZXJnZWRQYWdpbmF0aW9uLnBhZ2VTaXplXG4gIH07XG4gIGNvbnN0IHBhZ2luYXRpb25PYmogPSBwYWdpbmF0aW9uICYmIHR5cGVvZiBwYWdpbmF0aW9uID09PSAnb2JqZWN0JyA/IHBhZ2luYXRpb24gOiB7fTtcbiAgT2JqZWN0LmtleXMocGFnaW5hdGlvbk9iaikuZm9yRWFjaChwYWdlUHJvcCA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBtZXJnZWRQYWdpbmF0aW9uW3BhZ2VQcm9wXTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwYXJhbVtwYWdlUHJvcF0gPSB2YWx1ZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcGFyYW07XG59XG5mdW5jdGlvbiB1c2VQYWdpbmF0aW9uKHRvdGFsLCBvbkNoYW5nZSwgcGFnaW5hdGlvbikge1xuICBjb25zdCBfYSA9IHBhZ2luYXRpb24gJiYgdHlwZW9mIHBhZ2luYXRpb24gPT09ICdvYmplY3QnID8gcGFnaW5hdGlvbiA6IHt9LFxuICAgIHtcbiAgICAgIHRvdGFsOiBwYWdpbmF0aW9uVG90YWwgPSAwXG4gICAgfSA9IF9hLFxuICAgIHBhZ2luYXRpb25PYmogPSBfX3Jlc3QoX2EsIFtcInRvdGFsXCJdKTtcbiAgY29uc3QgW2lubmVyUGFnaW5hdGlvbiwgc2V0SW5uZXJQYWdpbmF0aW9uXSA9ICgwLCBfcmVhY3QudXNlU3RhdGUpKCgpID0+ICh7XG4gICAgY3VycmVudDogJ2RlZmF1bHRDdXJyZW50JyBpbiBwYWdpbmF0aW9uT2JqID8gcGFnaW5hdGlvbk9iai5kZWZhdWx0Q3VycmVudCA6IDEsXG4gICAgcGFnZVNpemU6ICdkZWZhdWx0UGFnZVNpemUnIGluIHBhZ2luYXRpb25PYmogPyBwYWdpbmF0aW9uT2JqLmRlZmF1bHRQYWdlU2l6ZSA6IERFRkFVTFRfUEFHRV9TSVpFXG4gIH0pKTtcbiAgLy8gPT09PT09PT09PT09IEJhc2ljIFBhZ2luYXRpb24gQ29uZmlnID09PT09PT09PT09PVxuICBjb25zdCBtZXJnZWRQYWdpbmF0aW9uID0gKDAsIF9leHRlbmRzT2JqZWN0LmRlZmF1bHQpKGlubmVyUGFnaW5hdGlvbiwgcGFnaW5hdGlvbk9iaiwge1xuICAgIHRvdGFsOiBwYWdpbmF0aW9uVG90YWwgPiAwID8gcGFnaW5hdGlvblRvdGFsIDogdG90YWxcbiAgfSk7XG4gIC8vIFJlc2V0IGBjdXJyZW50YCBpZiBkYXRhIGxlbmd0aCBvciBwYWdlU2l6ZSBjaGFuZ2VkXG4gIGNvbnN0IG1heFBhZ2UgPSBNYXRoLmNlaWwoKHBhZ2luYXRpb25Ub3RhbCB8fCB0b3RhbCkgLyBtZXJnZWRQYWdpbmF0aW9uLnBhZ2VTaXplKTtcbiAgaWYgKG1lcmdlZFBhZ2luYXRpb24uY3VycmVudCA+IG1heFBhZ2UpIHtcbiAgICAvLyBQcmV2ZW50IGEgbWF4aW11bSBwYWdlIGNvdW50IG9mIDBcbiAgICBtZXJnZWRQYWdpbmF0aW9uLmN1cnJlbnQgPSBtYXhQYWdlIHx8IDE7XG4gIH1cbiAgY29uc3QgcmVmcmVzaFBhZ2luYXRpb24gPSAoY3VycmVudCwgcGFnZVNpemUpID0+IHtcbiAgICBzZXRJbm5lclBhZ2luYXRpb24oe1xuICAgICAgY3VycmVudDogY3VycmVudCAhPT0gbnVsbCAmJiBjdXJyZW50ICE9PSB2b2lkIDAgPyBjdXJyZW50IDogMSxcbiAgICAgIHBhZ2VTaXplOiBwYWdlU2l6ZSB8fCBtZXJnZWRQYWdpbmF0aW9uLnBhZ2VTaXplXG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IG9uSW50ZXJuYWxDaGFuZ2UgPSAoY3VycmVudCwgcGFnZVNpemUpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgaWYgKHBhZ2luYXRpb24pIHtcbiAgICAgIChfYSA9IHBhZ2luYXRpb24ub25DaGFuZ2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHBhZ2luYXRpb24sIGN1cnJlbnQsIHBhZ2VTaXplKTtcbiAgICB9XG4gICAgcmVmcmVzaFBhZ2luYXRpb24oY3VycmVudCwgcGFnZVNpemUpO1xuICAgIG9uQ2hhbmdlKGN1cnJlbnQsIHBhZ2VTaXplIHx8IChtZXJnZWRQYWdpbmF0aW9uID09PSBudWxsIHx8IG1lcmdlZFBhZ2luYXRpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1lcmdlZFBhZ2luYXRpb24ucGFnZVNpemUpKTtcbiAgfTtcbiAgaWYgKHBhZ2luYXRpb24gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIFt7fSwgKCkgPT4ge31dO1xuICB9XG4gIHJldHVybiBbT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBtZXJnZWRQYWdpbmF0aW9uKSwge1xuICAgIG9uQ2hhbmdlOiBvbkludGVybmFsQ2hhbmdlXG4gIH0pLCByZWZyZXNoUGFnaW5hdGlvbl07XG59XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB1c2VQYWdpbmF0aW9uOyIsIlwidXNlIHN0cmljdFwiO1xuXCJ1c2UgY2xpZW50XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCA9IHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2ludGVyb3BSZXF1aXJlV2lsZGNhcmRcIikuZGVmYXVsdDtcbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5TRUxFQ1RJT05fTk9ORSA9IGV4cG9ydHMuU0VMRUNUSU9OX0lOVkVSVCA9IGV4cG9ydHMuU0VMRUNUSU9OX0NPTFVNTiA9IGV4cG9ydHMuU0VMRUNUSU9OX0FMTCA9IHZvaWQgMDtcbnZhciBfdG9Db25zdW1hYmxlQXJyYXkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy90b0NvbnN1bWFibGVBcnJheVwiKSk7XG52YXIgX3JlYWN0ID0gX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQocmVxdWlyZShcInJlYWN0XCIpKTtcbnZhciBSZWFjdCA9IF9yZWFjdDtcbnZhciBfRG93bk91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvRG93bk91dGxpbmVkXCIpKTtcbnZhciBfY2xhc3NuYW1lcyA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcImNsYXNzbmFtZXNcIikpO1xudmFyIF9yY1RhYmxlID0gcmVxdWlyZShcInJjLXRhYmxlXCIpO1xudmFyIF91dGlsID0gcmVxdWlyZShcInJjLXRyZWUvbGliL3V0aWxcIik7XG52YXIgX2NvbmR1Y3RVdGlsID0gcmVxdWlyZShcInJjLXRyZWUvbGliL3V0aWxzL2NvbmR1Y3RVdGlsXCIpO1xudmFyIF90cmVlVXRpbCA9IHJlcXVpcmUoXCJyYy10cmVlL2xpYi91dGlscy90cmVlVXRpbFwiKTtcbnZhciBfdXNlTWVyZ2VkU3RhdGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9ob29rcy91c2VNZXJnZWRTdGF0ZVwiKSk7XG52YXIgX3VzZU11bHRpcGxlU2VsZWN0ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vX3V0aWwvaG9va3MvdXNlTXVsdGlwbGVTZWxlY3RcIikpO1xudmFyIF93YXJuaW5nID0gcmVxdWlyZShcIi4uLy4uL191dGlsL3dhcm5pbmdcIik7XG52YXIgX2NoZWNrYm94ID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi4vLi4vY2hlY2tib3hcIikpO1xudmFyIF9kcm9wZG93biA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL2Ryb3Bkb3duXCIpKTtcbnZhciBfcmFkaW8gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuLi8uLi9yYWRpb1wiKSk7XG4vLyBUT0RPOiB3YXJuaW5nIGlmIHVzZSBhamF4ISEhXG5jb25zdCBTRUxFQ1RJT05fQ09MVU1OID0gZXhwb3J0cy5TRUxFQ1RJT05fQ09MVU1OID0ge307XG5jb25zdCBTRUxFQ1RJT05fQUxMID0gZXhwb3J0cy5TRUxFQ1RJT05fQUxMID0gJ1NFTEVDVF9BTEwnO1xuY29uc3QgU0VMRUNUSU9OX0lOVkVSVCA9IGV4cG9ydHMuU0VMRUNUSU9OX0lOVkVSVCA9ICdTRUxFQ1RfSU5WRVJUJztcbmNvbnN0IFNFTEVDVElPTl9OT05FID0gZXhwb3J0cy5TRUxFQ1RJT05fTk9ORSA9ICdTRUxFQ1RfTk9ORSc7XG5jb25zdCBFTVBUWV9MSVNUID0gW107XG5jb25zdCBmbGF0dGVuRGF0YSA9IChjaGlsZHJlbkNvbHVtbk5hbWUsIGRhdGEsIGxpc3QgPSBbXSkgPT4ge1xuICAoZGF0YSB8fCBbXSkuZm9yRWFjaChyZWNvcmQgPT4ge1xuICAgIGxpc3QucHVzaChyZWNvcmQpO1xuICAgIGlmIChyZWNvcmQgJiYgdHlwZW9mIHJlY29yZCA9PT0gJ29iamVjdCcgJiYgY2hpbGRyZW5Db2x1bW5OYW1lIGluIHJlY29yZCkge1xuICAgICAgZmxhdHRlbkRhdGEoY2hpbGRyZW5Db2x1bW5OYW1lLCByZWNvcmRbY2hpbGRyZW5Db2x1bW5OYW1lXSwgbGlzdCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxpc3Q7XG59O1xuY29uc3QgdXNlU2VsZWN0aW9uID0gKGNvbmZpZywgcm93U2VsZWN0aW9uKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBwcmVzZXJ2ZVNlbGVjdGVkUm93S2V5cyxcbiAgICBzZWxlY3RlZFJvd0tleXMsXG4gICAgZGVmYXVsdFNlbGVjdGVkUm93S2V5cyxcbiAgICBnZXRDaGVja2JveFByb3BzLFxuICAgIG9uQ2hhbmdlOiBvblNlbGVjdGlvbkNoYW5nZSxcbiAgICBvblNlbGVjdCxcbiAgICBvblNlbGVjdEFsbCxcbiAgICBvblNlbGVjdEludmVydCxcbiAgICBvblNlbGVjdE5vbmUsXG4gICAgb25TZWxlY3RNdWx0aXBsZSxcbiAgICBjb2x1bW5XaWR0aDogc2VsZWN0aW9uQ29sV2lkdGgsXG4gICAgdHlwZTogc2VsZWN0aW9uVHlwZSxcbiAgICBzZWxlY3Rpb25zLFxuICAgIGZpeGVkLFxuICAgIHJlbmRlckNlbGw6IGN1c3RvbWl6ZVJlbmRlckNlbGwsXG4gICAgaGlkZVNlbGVjdEFsbCxcbiAgICBjaGVja1N0cmljdGx5ID0gdHJ1ZVxuICB9ID0gcm93U2VsZWN0aW9uIHx8IHt9O1xuICBjb25zdCB7XG4gICAgcHJlZml4Q2xzLFxuICAgIGRhdGEsXG4gICAgcGFnZURhdGEsXG4gICAgZ2V0UmVjb3JkQnlLZXksXG4gICAgZ2V0Um93S2V5LFxuICAgIGV4cGFuZFR5cGUsXG4gICAgY2hpbGRyZW5Db2x1bW5OYW1lLFxuICAgIGxvY2FsZTogdGFibGVMb2NhbGUsXG4gICAgZ2V0UG9wdXBDb250YWluZXJcbiAgfSA9IGNvbmZpZztcbiAgY29uc3Qgd2FybmluZyA9ICgwLCBfd2FybmluZy5kZXZVc2VXYXJuaW5nKSgnVGFibGUnKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PSBNdWx0aXBsZVNlbGVjdCA9PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGNvbnN0IFttdWx0aXBsZVNlbGVjdCwgdXBkYXRlUHJldlNlbGVjdGVkSW5kZXhdID0gKDAsIF91c2VNdWx0aXBsZVNlbGVjdC5kZWZhdWx0KShpdGVtID0+IGl0ZW0pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IEtleXMgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCBbbWVyZ2VkU2VsZWN0ZWRLZXlzLCBzZXRNZXJnZWRTZWxlY3RlZEtleXNdID0gKDAsIF91c2VNZXJnZWRTdGF0ZS5kZWZhdWx0KShzZWxlY3RlZFJvd0tleXMgfHwgZGVmYXVsdFNlbGVjdGVkUm93S2V5cyB8fCBFTVBUWV9MSVNULCB7XG4gICAgdmFsdWU6IHNlbGVjdGVkUm93S2V5c1xuICB9KTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09IENhY2hlcyA9PT09PT09PT09PT09PT09PT09PT09PT1cbiAgY29uc3QgcHJlc2VydmVSZWNvcmRzUmVmID0gUmVhY3QudXNlUmVmKG5ldyBNYXAoKSk7XG4gIGNvbnN0IHVwZGF0ZVByZXNlcnZlUmVjb3Jkc0NhY2hlID0gKDAsIF9yZWFjdC51c2VDYWxsYmFjaykoa2V5cyA9PiB7XG4gICAgaWYgKHByZXNlcnZlU2VsZWN0ZWRSb3dLZXlzKSB7XG4gICAgICBjb25zdCBuZXdDYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgIC8vIEtlZXAga2V5IGlmIG1hcmsgYXMgcHJlc2VydmVTZWxlY3RlZFJvd0tleXNcbiAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBsZXQgcmVjb3JkID0gZ2V0UmVjb3JkQnlLZXkoa2V5KTtcbiAgICAgICAgaWYgKCFyZWNvcmQgJiYgcHJlc2VydmVSZWNvcmRzUmVmLmN1cnJlbnQuaGFzKGtleSkpIHtcbiAgICAgICAgICByZWNvcmQgPSBwcmVzZXJ2ZVJlY29yZHNSZWYuY3VycmVudC5nZXQoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBuZXdDYWNoZS5zZXQoa2V5LCByZWNvcmQpO1xuICAgICAgfSk7XG4gICAgICAvLyBSZWZyZXNoIHRvIG5ldyBjYWNoZVxuICAgICAgcHJlc2VydmVSZWNvcmRzUmVmLmN1cnJlbnQgPSBuZXdDYWNoZTtcbiAgICB9XG4gIH0sIFtnZXRSZWNvcmRCeUtleSwgcHJlc2VydmVTZWxlY3RlZFJvd0tleXNdKTtcbiAgLy8gVXBkYXRlIGNhY2hlIHdpdGggc2VsZWN0ZWRLZXlzXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgdXBkYXRlUHJlc2VydmVSZWNvcmRzQ2FjaGUobWVyZ2VkU2VsZWN0ZWRLZXlzKTtcbiAgfSwgW21lcmdlZFNlbGVjdGVkS2V5c10pO1xuICAvLyBHZXQgZmxhdHRlbiBkYXRhXG4gIGNvbnN0IGZsYXR0ZWREYXRhID0gKDAsIF9yZWFjdC51c2VNZW1vKSgoKSA9PiBmbGF0dGVuRGF0YShjaGlsZHJlbkNvbHVtbk5hbWUsIHBhZ2VEYXRhKSwgW2NoaWxkcmVuQ29sdW1uTmFtZSwgcGFnZURhdGFdKTtcbiAgY29uc3Qge1xuICAgIGtleUVudGl0aWVzXG4gIH0gPSAoMCwgX3JlYWN0LnVzZU1lbW8pKCgpID0+IHtcbiAgICBpZiAoY2hlY2tTdHJpY3RseSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5RW50aXRpZXM6IG51bGxcbiAgICAgIH07XG4gICAgfVxuICAgIGxldCBjb252ZXJ0RGF0YSA9IGRhdGE7XG4gICAgaWYgKHByZXNlcnZlU2VsZWN0ZWRSb3dLZXlzKSB7XG4gICAgICAvLyB1c2UgZmxhdHRlZERhdGEga2V5c1xuICAgICAgY29uc3Qga2V5c1NldCA9IG5ldyBTZXQoZmxhdHRlZERhdGEubWFwKChyZWNvcmQsIGluZGV4KSA9PiBnZXRSb3dLZXkocmVjb3JkLCBpbmRleCkpKTtcbiAgICAgIC8vIHJlbW92ZSBwcmVzZXJ2ZVJlY29yZHMgdGhhdCBkdXBsaWNhdGUgZGF0YVxuICAgICAgY29uc3QgcHJlc2VydmVSZWNvcmRzID0gQXJyYXkuZnJvbShwcmVzZXJ2ZVJlY29yZHNSZWYuY3VycmVudCkucmVkdWNlKCh0b3RhbCwgW2tleSwgdmFsdWVdKSA9PiBrZXlzU2V0LmhhcyhrZXkpID8gdG90YWwgOiB0b3RhbC5jb25jYXQodmFsdWUpLCBbXSk7XG4gICAgICBjb252ZXJ0RGF0YSA9IFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShjb252ZXJ0RGF0YSksICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKHByZXNlcnZlUmVjb3JkcykpO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIF90cmVlVXRpbC5jb252ZXJ0RGF0YVRvRW50aXRpZXMpKGNvbnZlcnREYXRhLCB7XG4gICAgICBleHRlcm5hbEdldEtleTogZ2V0Um93S2V5LFxuICAgICAgY2hpbGRyZW5Qcm9wTmFtZTogY2hpbGRyZW5Db2x1bW5OYW1lXG4gICAgfSk7XG4gIH0sIFtkYXRhLCBnZXRSb3dLZXksIGNoZWNrU3RyaWN0bHksIGNoaWxkcmVuQ29sdW1uTmFtZSwgcHJlc2VydmVTZWxlY3RlZFJvd0tleXMsIGZsYXR0ZWREYXRhXSk7XG4gIC8vIEdldCBhbGwgY2hlY2tib3ggcHJvcHNcbiAgY29uc3QgY2hlY2tib3hQcm9wc01hcCA9ICgwLCBfcmVhY3QudXNlTWVtbykoKCkgPT4ge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTtcbiAgICBmbGF0dGVkRGF0YS5mb3JFYWNoKChyZWNvcmQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBnZXRSb3dLZXkocmVjb3JkLCBpbmRleCk7XG4gICAgICBjb25zdCBjaGVja2JveFByb3BzID0gKGdldENoZWNrYm94UHJvcHMgPyBnZXRDaGVja2JveFByb3BzKHJlY29yZCkgOiBudWxsKSB8fCB7fTtcbiAgICAgIG1hcC5zZXQoa2V5LCBjaGVja2JveFByb3BzKTtcbiAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiA/IHdhcm5pbmcoISgnY2hlY2tlZCcgaW4gY2hlY2tib3hQcm9wcyB8fCAnZGVmYXVsdENoZWNrZWQnIGluIGNoZWNrYm94UHJvcHMpLCAndXNhZ2UnLCAnRG8gbm90IHNldCBgY2hlY2tlZGAgb3IgYGRlZmF1bHRDaGVja2VkYCBpbiBgZ2V0Q2hlY2tib3hQcm9wc2AuIFBsZWFzZSB1c2UgYHNlbGVjdGVkUm93S2V5c2AgaW5zdGVhZC4nKSA6IHZvaWQgMDtcbiAgICB9KTtcbiAgICByZXR1cm4gbWFwO1xuICB9LCBbZmxhdHRlZERhdGEsIGdldFJvd0tleSwgZ2V0Q2hlY2tib3hQcm9wc10pO1xuICBjb25zdCBpc0NoZWNrYm94RGlzYWJsZWQgPSAoMCwgX3JlYWN0LnVzZUNhbGxiYWNrKShyID0+IHtcbiAgICBjb25zdCByb3dLZXkgPSBnZXRSb3dLZXkocik7XG4gICAgbGV0IGNoZWNrYm94UHJvcHM7XG4gICAgaWYgKGNoZWNrYm94UHJvcHNNYXAuaGFzKHJvd0tleSkpIHtcbiAgICAgIGNoZWNrYm94UHJvcHMgPSBjaGVja2JveFByb3BzTWFwLmdldChnZXRSb3dLZXkocikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGVja2JveFByb3BzID0gZ2V0Q2hlY2tib3hQcm9wcyA/IGdldENoZWNrYm94UHJvcHMocikgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiAhIShjaGVja2JveFByb3BzID09PSBudWxsIHx8IGNoZWNrYm94UHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94UHJvcHMuZGlzYWJsZWQpO1xuICB9LCBbY2hlY2tib3hQcm9wc01hcCwgZ2V0Um93S2V5XSk7XG4gIGNvbnN0IFtkZXJpdmVkU2VsZWN0ZWRLZXlzLCBkZXJpdmVkSGFsZlNlbGVjdGVkS2V5c10gPSAoMCwgX3JlYWN0LnVzZU1lbW8pKCgpID0+IHtcbiAgICBpZiAoY2hlY2tTdHJpY3RseSkge1xuICAgICAgcmV0dXJuIFttZXJnZWRTZWxlY3RlZEtleXMgfHwgW10sIFtdXTtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgY2hlY2tlZEtleXMsXG4gICAgICBoYWxmQ2hlY2tlZEtleXNcbiAgICB9ID0gKDAsIF9jb25kdWN0VXRpbC5jb25kdWN0Q2hlY2spKG1lcmdlZFNlbGVjdGVkS2V5cywgdHJ1ZSwga2V5RW50aXRpZXMsIGlzQ2hlY2tib3hEaXNhYmxlZCk7XG4gICAgcmV0dXJuIFtjaGVja2VkS2V5cyB8fCBbXSwgaGFsZkNoZWNrZWRLZXlzXTtcbiAgfSwgW21lcmdlZFNlbGVjdGVkS2V5cywgY2hlY2tTdHJpY3RseSwga2V5RW50aXRpZXMsIGlzQ2hlY2tib3hEaXNhYmxlZF0pO1xuICBjb25zdCBkZXJpdmVkU2VsZWN0ZWRLZXlTZXQgPSAoMCwgX3JlYWN0LnVzZU1lbW8pKCgpID0+IHtcbiAgICBjb25zdCBrZXlzID0gc2VsZWN0aW9uVHlwZSA9PT0gJ3JhZGlvJyA/IGRlcml2ZWRTZWxlY3RlZEtleXMuc2xpY2UoMCwgMSkgOiBkZXJpdmVkU2VsZWN0ZWRLZXlzO1xuICAgIHJldHVybiBuZXcgU2V0KGtleXMpO1xuICB9LCBbZGVyaXZlZFNlbGVjdGVkS2V5cywgc2VsZWN0aW9uVHlwZV0pO1xuICBjb25zdCBkZXJpdmVkSGFsZlNlbGVjdGVkS2V5U2V0ID0gKDAsIF9yZWFjdC51c2VNZW1vKSgoKSA9PiBzZWxlY3Rpb25UeXBlID09PSAncmFkaW8nID8gbmV3IFNldCgpIDogbmV3IFNldChkZXJpdmVkSGFsZlNlbGVjdGVkS2V5cyksIFtkZXJpdmVkSGFsZlNlbGVjdGVkS2V5cywgc2VsZWN0aW9uVHlwZV0pO1xuICAvLyBSZXNldCBpZiByb3dTZWxlY3Rpb24gcmVzZXRcbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXJvd1NlbGVjdGlvbikge1xuICAgICAgc2V0TWVyZ2VkU2VsZWN0ZWRLZXlzKEVNUFRZX0xJU1QpO1xuICAgIH1cbiAgfSwgWyEhcm93U2VsZWN0aW9uXSk7XG4gIGNvbnN0IHNldFNlbGVjdGVkS2V5cyA9ICgwLCBfcmVhY3QudXNlQ2FsbGJhY2spKChrZXlzLCBtZXRob2QpID0+IHtcbiAgICBsZXQgYXZhaWxhYmxlS2V5cztcbiAgICBsZXQgcmVjb3JkcztcbiAgICB1cGRhdGVQcmVzZXJ2ZVJlY29yZHNDYWNoZShrZXlzKTtcbiAgICBpZiAocHJlc2VydmVTZWxlY3RlZFJvd0tleXMpIHtcbiAgICAgIGF2YWlsYWJsZUtleXMgPSBrZXlzO1xuICAgICAgcmVjb3JkcyA9IGtleXMubWFwKGtleSA9PiBwcmVzZXJ2ZVJlY29yZHNSZWYuY3VycmVudC5nZXQoa2V5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZpbHRlciBrZXkgd2hpY2ggbm90IGV4aXN0IGluIHRoZSBgZGF0YVNvdXJjZWBcbiAgICAgIGF2YWlsYWJsZUtleXMgPSBbXTtcbiAgICAgIHJlY29yZHMgPSBbXTtcbiAgICAgIGtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBjb25zdCByZWNvcmQgPSBnZXRSZWNvcmRCeUtleShrZXkpO1xuICAgICAgICBpZiAocmVjb3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhdmFpbGFibGVLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICByZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIHNldE1lcmdlZFNlbGVjdGVkS2V5cyhhdmFpbGFibGVLZXlzKTtcbiAgICBvblNlbGVjdGlvbkNoYW5nZSA9PT0gbnVsbCB8fCBvblNlbGVjdGlvbkNoYW5nZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TZWxlY3Rpb25DaGFuZ2UoYXZhaWxhYmxlS2V5cywgcmVjb3Jkcywge1xuICAgICAgdHlwZTogbWV0aG9kXG4gICAgfSk7XG4gIH0sIFtzZXRNZXJnZWRTZWxlY3RlZEtleXMsIGdldFJlY29yZEJ5S2V5LCBvblNlbGVjdGlvbkNoYW5nZSwgcHJlc2VydmVTZWxlY3RlZFJvd0tleXNdKTtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PSBTZWxlY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gVHJpZ2dlciBzaW5nbGUgYG9uU2VsZWN0YCBldmVudFxuICBjb25zdCB0cmlnZ2VyU2luZ2xlU2VsZWN0aW9uID0gKDAsIF9yZWFjdC51c2VDYWxsYmFjaykoKGtleSwgc2VsZWN0ZWQsIGtleXMsIGV2ZW50KSA9PiB7XG4gICAgaWYgKG9uU2VsZWN0KSB7XG4gICAgICBjb25zdCByb3dzID0ga2V5cy5tYXAoayA9PiBnZXRSZWNvcmRCeUtleShrKSk7XG4gICAgICBvblNlbGVjdChnZXRSZWNvcmRCeUtleShrZXkpLCBzZWxlY3RlZCwgcm93cywgZXZlbnQpO1xuICAgIH1cbiAgICBzZXRTZWxlY3RlZEtleXMoa2V5cywgJ3NpbmdsZScpO1xuICB9LCBbb25TZWxlY3QsIGdldFJlY29yZEJ5S2V5LCBzZXRTZWxlY3RlZEtleXNdKTtcbiAgY29uc3QgbWVyZ2VkU2VsZWN0aW9ucyA9ICgwLCBfcmVhY3QudXNlTWVtbykoKCkgPT4ge1xuICAgIGlmICghc2VsZWN0aW9ucyB8fCBoaWRlU2VsZWN0QWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgc2VsZWN0aW9uTGlzdCA9IHNlbGVjdGlvbnMgPT09IHRydWUgPyBbU0VMRUNUSU9OX0FMTCwgU0VMRUNUSU9OX0lOVkVSVCwgU0VMRUNUSU9OX05PTkVdIDogc2VsZWN0aW9ucztcbiAgICByZXR1cm4gc2VsZWN0aW9uTGlzdC5tYXAoc2VsZWN0aW9uID0+IHtcbiAgICAgIGlmIChzZWxlY3Rpb24gPT09IFNFTEVDVElPTl9BTEwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXk6ICdhbGwnLFxuICAgICAgICAgIHRleHQ6IHRhYmxlTG9jYWxlLnNlbGVjdGlvbkFsbCxcbiAgICAgICAgICBvblNlbGVjdCgpIHtcbiAgICAgICAgICAgIHNldFNlbGVjdGVkS2V5cyhkYXRhLm1hcCgocmVjb3JkLCBpbmRleCkgPT4gZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpKS5maWx0ZXIoa2V5ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tQcm9wcyA9IGNoZWNrYm94UHJvcHNNYXAuZ2V0KGtleSk7XG4gICAgICAgICAgICAgIHJldHVybiAhKGNoZWNrUHJvcHMgPT09IG51bGwgfHwgY2hlY2tQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tQcm9wcy5kaXNhYmxlZCkgfHwgZGVyaXZlZFNlbGVjdGVkS2V5U2V0LmhhcyhrZXkpO1xuICAgICAgICAgICAgfSksICdhbGwnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoc2VsZWN0aW9uID09PSBTRUxFQ1RJT05fSU5WRVJUKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAga2V5OiAnaW52ZXJ0JyxcbiAgICAgICAgICB0ZXh0OiB0YWJsZUxvY2FsZS5zZWxlY3RJbnZlcnQsXG4gICAgICAgICAgb25TZWxlY3QoKSB7XG4gICAgICAgICAgICBjb25zdCBrZXlTZXQgPSBuZXcgU2V0KGRlcml2ZWRTZWxlY3RlZEtleVNldCk7XG4gICAgICAgICAgICBwYWdlRGF0YS5mb3JFYWNoKChyZWNvcmQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGtleSA9IGdldFJvd0tleShyZWNvcmQsIGluZGV4KTtcbiAgICAgICAgICAgICAgY29uc3QgY2hlY2tQcm9wcyA9IGNoZWNrYm94UHJvcHNNYXAuZ2V0KGtleSk7XG4gICAgICAgICAgICAgIGlmICghKGNoZWNrUHJvcHMgPT09IG51bGwgfHwgY2hlY2tQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tQcm9wcy5kaXNhYmxlZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5U2V0LmhhcyhrZXkpKSB7XG4gICAgICAgICAgICAgICAgICBrZXlTZXQuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGtleVNldC5hZGQoa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qga2V5cyA9IEFycmF5LmZyb20oa2V5U2V0KTtcbiAgICAgICAgICAgIGlmIChvblNlbGVjdEludmVydCkge1xuICAgICAgICAgICAgICB3YXJuaW5nLmRlcHJlY2F0ZWQoZmFsc2UsICdvblNlbGVjdEludmVydCcsICdvbkNoYW5nZScpO1xuICAgICAgICAgICAgICBvblNlbGVjdEludmVydChrZXlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldFNlbGVjdGVkS2V5cyhrZXlzLCAnaW52ZXJ0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKHNlbGVjdGlvbiA9PT0gU0VMRUNUSU9OX05PTkUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBrZXk6ICdub25lJyxcbiAgICAgICAgICB0ZXh0OiB0YWJsZUxvY2FsZS5zZWxlY3ROb25lLFxuICAgICAgICAgIG9uU2VsZWN0KCkge1xuICAgICAgICAgICAgb25TZWxlY3ROb25lID09PSBudWxsIHx8IG9uU2VsZWN0Tm9uZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogb25TZWxlY3ROb25lKCk7XG4gICAgICAgICAgICBzZXRTZWxlY3RlZEtleXMoQXJyYXkuZnJvbShkZXJpdmVkU2VsZWN0ZWRLZXlTZXQpLmZpbHRlcihrZXkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjaGVja1Byb3BzID0gY2hlY2tib3hQcm9wc01hcC5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgcmV0dXJuIGNoZWNrUHJvcHMgPT09IG51bGwgfHwgY2hlY2tQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tQcm9wcy5kaXNhYmxlZDtcbiAgICAgICAgICAgIH0pLCAnbm9uZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzZWxlY3Rpb247XG4gICAgfSkubWFwKHNlbGVjdGlvbiA9PiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdGlvbiksIHtcbiAgICAgIG9uU2VsZWN0OiAoLi4ucmVzdCkgPT4ge1xuICAgICAgICB2YXIgX2EyO1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIChfYSA9IHNlbGVjdGlvbi5vblNlbGVjdCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IChfYTIgPSBfYSkuY2FsbC5hcHBseShfYTIsIFtzZWxlY3Rpb25dLmNvbmNhdChyZXN0KSk7XG4gICAgICAgIHVwZGF0ZVByZXZTZWxlY3RlZEluZGV4KG51bGwpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfSwgW3NlbGVjdGlvbnMsIGRlcml2ZWRTZWxlY3RlZEtleVNldCwgcGFnZURhdGEsIGdldFJvd0tleSwgb25TZWxlY3RJbnZlcnQsIHNldFNlbGVjdGVkS2V5c10pO1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PSBDb2x1bW5zID09PT09PT09PT09PT09PT09PT09PT09PVxuICBjb25zdCB0cmFuc2Zvcm1Db2x1bW5zID0gKDAsIF9yZWFjdC51c2VDYWxsYmFjaykoY29sdW1ucyA9PiB7XG4gICAgdmFyIF9hO1xuICAgIC8vID4+Pj4+Pj4+Pj4+IFNraXAgaWYgbm90IGV4aXN0cyBgcm93U2VsZWN0aW9uYFxuICAgIGlmICghcm93U2VsZWN0aW9uKSB7XG4gICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKCFjb2x1bW5zLmluY2x1ZGVzKFNFTEVDVElPTl9DT0xVTU4pLCAndXNhZ2UnLCAnYHJvd1NlbGVjdGlvbmAgaXMgbm90IGNvbmZpZyBidXQgYFNFTEVDVElPTl9DT0xVTU5gIGV4aXN0cyBpbiB0aGUgYGNvbHVtbnNgLicpIDogdm9pZCAwO1xuICAgICAgcmV0dXJuIGNvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wgIT09IFNFTEVDVElPTl9DT0xVTU4pO1xuICAgIH1cbiAgICAvLyA+Pj4+Pj4+Pj4+PiBTdXBwb3J0IHNlbGVjdGlvblxuICAgIGxldCBjbG9uZUNvbHVtbnMgPSAoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShjb2x1bW5zKTtcbiAgICBjb25zdCBrZXlTZXQgPSBuZXcgU2V0KGRlcml2ZWRTZWxlY3RlZEtleVNldCk7XG4gICAgLy8gUmVjb3JkIGtleSBvbmx5IG5lZWQgY2hlY2sgd2l0aCBlbmFibGVkXG4gICAgY29uc3QgcmVjb3JkS2V5cyA9IGZsYXR0ZWREYXRhLm1hcChnZXRSb3dLZXkpLmZpbHRlcihrZXkgPT4gIWNoZWNrYm94UHJvcHNNYXAuZ2V0KGtleSkuZGlzYWJsZWQpO1xuICAgIGNvbnN0IGNoZWNrZWRDdXJyZW50QWxsID0gcmVjb3JkS2V5cy5ldmVyeShrZXkgPT4ga2V5U2V0LmhhcyhrZXkpKTtcbiAgICBjb25zdCBjaGVja2VkQ3VycmVudFNvbWUgPSByZWNvcmRLZXlzLnNvbWUoa2V5ID0+IGtleVNldC5oYXMoa2V5KSk7XG4gICAgY29uc3Qgb25TZWxlY3RBbGxDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBjb25zdCBjaGFuZ2VLZXlzID0gW107XG4gICAgICBpZiAoY2hlY2tlZEN1cnJlbnRBbGwpIHtcbiAgICAgICAgcmVjb3JkS2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAga2V5U2V0LmRlbGV0ZShrZXkpO1xuICAgICAgICAgIGNoYW5nZUtleXMucHVzaChrZXkpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlY29yZEtleXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgIGlmICgha2V5U2V0LmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBrZXlTZXQuYWRkKGtleSk7XG4gICAgICAgICAgICBjaGFuZ2VLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qga2V5cyA9IEFycmF5LmZyb20oa2V5U2V0KTtcbiAgICAgIG9uU2VsZWN0QWxsID09PSBudWxsIHx8IG9uU2VsZWN0QWxsID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblNlbGVjdEFsbCghY2hlY2tlZEN1cnJlbnRBbGwsIGtleXMubWFwKGsgPT4gZ2V0UmVjb3JkQnlLZXkoaykpLCBjaGFuZ2VLZXlzLm1hcChrID0+IGdldFJlY29yZEJ5S2V5KGspKSk7XG4gICAgICBzZXRTZWxlY3RlZEtleXMoa2V5cywgJ2FsbCcpO1xuICAgICAgdXBkYXRlUHJldlNlbGVjdGVkSW5kZXgobnVsbCk7XG4gICAgfTtcbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT0gUmVuZGVyID09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFRpdGxlIENlbGxcbiAgICBsZXQgdGl0bGU7XG4gICAgbGV0IGNvbHVtblRpdGxlQ2hlY2tib3g7XG4gICAgaWYgKHNlbGVjdGlvblR5cGUgIT09ICdyYWRpbycpIHtcbiAgICAgIGxldCBjdXN0b21pemVTZWxlY3Rpb25zO1xuICAgICAgaWYgKG1lcmdlZFNlbGVjdGlvbnMpIHtcbiAgICAgICAgY29uc3QgbWVudSA9IHtcbiAgICAgICAgICBnZXRQb3B1cENvbnRhaW5lcixcbiAgICAgICAgICBpdGVtczogbWVyZ2VkU2VsZWN0aW9ucy5tYXAoKHNlbGVjdGlvbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICBvblNlbGVjdDogb25TZWxlY3Rpb25DbGlja1xuICAgICAgICAgICAgfSA9IHNlbGVjdGlvbjtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGtleToga2V5ICE9PSBudWxsICYmIGtleSAhPT0gdm9pZCAwID8ga2V5IDogaW5kZXgsXG4gICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBvblNlbGVjdGlvbkNsaWNrID09PSBudWxsIHx8IG9uU2VsZWN0aW9uQ2xpY2sgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9uU2VsZWN0aW9uQ2xpY2socmVjb3JkS2V5cyk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGxhYmVsOiB0ZXh0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICAgIGN1c3RvbWl6ZVNlbGVjdGlvbnMgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LXNlbGVjdGlvbi1leHRyYWBcbiAgICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2Ryb3Bkb3duLmRlZmF1bHQsIHtcbiAgICAgICAgICBtZW51OiBtZW51LFxuICAgICAgICAgIGdldFBvcHVwQ29udGFpbmVyOiBnZXRQb3B1cENvbnRhaW5lclxuICAgICAgICB9LCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0Rvd25PdXRsaW5lZC5kZWZhdWx0LCBudWxsKSkpKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFsbERpc2FibGVkRGF0YSA9IGZsYXR0ZWREYXRhLm1hcCgocmVjb3JkLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBrZXkgPSBnZXRSb3dLZXkocmVjb3JkLCBpbmRleCk7XG4gICAgICAgIGNvbnN0IGNoZWNrYm94UHJvcHMgPSBjaGVja2JveFByb3BzTWFwLmdldChrZXkpIHx8IHt9O1xuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICAgY2hlY2tlZDoga2V5U2V0LmhhcyhrZXkpXG4gICAgICAgIH0sIGNoZWNrYm94UHJvcHMpO1xuICAgICAgfSkuZmlsdGVyKCh7XG4gICAgICAgIGRpc2FibGVkXG4gICAgICB9KSA9PiBkaXNhYmxlZCk7XG4gICAgICBjb25zdCBhbGxEaXNhYmxlZCA9ICEhYWxsRGlzYWJsZWREYXRhLmxlbmd0aCAmJiBhbGxEaXNhYmxlZERhdGEubGVuZ3RoID09PSBmbGF0dGVkRGF0YS5sZW5ndGg7XG4gICAgICBjb25zdCBhbGxEaXNhYmxlZEFuZENoZWNrZWQgPSBhbGxEaXNhYmxlZCAmJiBhbGxEaXNhYmxlZERhdGEuZXZlcnkoKHtcbiAgICAgICAgY2hlY2tlZFxuICAgICAgfSkgPT4gY2hlY2tlZCk7XG4gICAgICBjb25zdCBhbGxEaXNhYmxlZFNvbWVDaGVja2VkID0gYWxsRGlzYWJsZWQgJiYgYWxsRGlzYWJsZWREYXRhLnNvbWUoKHtcbiAgICAgICAgY2hlY2tlZFxuICAgICAgfSkgPT4gY2hlY2tlZCk7XG4gICAgICBjb2x1bW5UaXRsZUNoZWNrYm94ID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX2NoZWNrYm94LmRlZmF1bHQsIHtcbiAgICAgICAgY2hlY2tlZDogIWFsbERpc2FibGVkID8gISFmbGF0dGVkRGF0YS5sZW5ndGggJiYgY2hlY2tlZEN1cnJlbnRBbGwgOiBhbGxEaXNhYmxlZEFuZENoZWNrZWQsXG4gICAgICAgIGluZGV0ZXJtaW5hdGU6ICFhbGxEaXNhYmxlZCA/ICFjaGVja2VkQ3VycmVudEFsbCAmJiBjaGVja2VkQ3VycmVudFNvbWUgOiAhYWxsRGlzYWJsZWRBbmRDaGVja2VkICYmIGFsbERpc2FibGVkU29tZUNoZWNrZWQsXG4gICAgICAgIG9uQ2hhbmdlOiBvblNlbGVjdEFsbENoYW5nZSxcbiAgICAgICAgZGlzYWJsZWQ6IGZsYXR0ZWREYXRhLmxlbmd0aCA9PT0gMCB8fCBhbGxEaXNhYmxlZCxcbiAgICAgICAgXCJhcmlhLWxhYmVsXCI6IGN1c3RvbWl6ZVNlbGVjdGlvbnMgPyAnQ3VzdG9tIHNlbGVjdGlvbicgOiAnU2VsZWN0IGFsbCcsXG4gICAgICAgIHNraXBHcm91cDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICB0aXRsZSA9ICFoaWRlU2VsZWN0QWxsICYmICgvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogYCR7cHJlZml4Q2xzfS1zZWxlY3Rpb25gXG4gICAgICB9LCBjb2x1bW5UaXRsZUNoZWNrYm94LCBjdXN0b21pemVTZWxlY3Rpb25zKSk7XG4gICAgfVxuICAgIC8vIEJvZHkgQ2VsbFxuICAgIGxldCByZW5kZXJDZWxsO1xuICAgIGlmIChzZWxlY3Rpb25UeXBlID09PSAncmFkaW8nKSB7XG4gICAgICByZW5kZXJDZWxsID0gKF8sIHJlY29yZCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpO1xuICAgICAgICBjb25zdCBjaGVja2VkID0ga2V5U2V0LmhhcyhrZXkpO1xuICAgICAgICBjb25zdCBjaGVja2JveFByb3BzID0gY2hlY2tib3hQcm9wc01hcC5nZXQoa2V5KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBub2RlOiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX3JhZGlvLmRlZmF1bHQsIE9iamVjdC5hc3NpZ24oe30sIGNoZWNrYm94UHJvcHMsIHtcbiAgICAgICAgICAgIGNoZWNrZWQ6IGNoZWNrZWQsXG4gICAgICAgICAgICBvbkNsaWNrOiBlID0+IHtcbiAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAoX2EgPSBjaGVja2JveFByb3BzID09PSBudWxsIHx8IGNoZWNrYm94UHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94UHJvcHMub25DbGljaykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY2hlY2tib3hQcm9wcywgZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25DaGFuZ2U6IGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgICAgICBpZiAoIWtleVNldC5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgIHRyaWdnZXJTaW5nbGVTZWxlY3Rpb24oa2V5LCB0cnVlLCBba2V5XSwgZXZlbnQubmF0aXZlRXZlbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIChfYSA9IGNoZWNrYm94UHJvcHMgPT09IG51bGwgfHwgY2hlY2tib3hQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3hQcm9wcy5vbkNoYW5nZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY2hlY2tib3hQcm9wcywgZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKSksXG4gICAgICAgICAgY2hlY2tlZFxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVuZGVyQ2VsbCA9IChfLCByZWNvcmQsIGluZGV4KSA9PiB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgY29uc3Qga2V5ID0gZ2V0Um93S2V5KHJlY29yZCwgaW5kZXgpO1xuICAgICAgICBjb25zdCBjaGVja2VkID0ga2V5U2V0LmhhcyhrZXkpO1xuICAgICAgICBjb25zdCBpbmRldGVybWluYXRlID0gZGVyaXZlZEhhbGZTZWxlY3RlZEtleVNldC5oYXMoa2V5KTtcbiAgICAgICAgY29uc3QgY2hlY2tib3hQcm9wcyA9IGNoZWNrYm94UHJvcHNNYXAuZ2V0KGtleSk7XG4gICAgICAgIGxldCBtZXJnZWRJbmRldGVybWluYXRlO1xuICAgICAgICBpZiAoZXhwYW5kVHlwZSA9PT0gJ25lc3QnKSB7XG4gICAgICAgICAgbWVyZ2VkSW5kZXRlcm1pbmF0ZSA9IGluZGV0ZXJtaW5hdGU7XG4gICAgICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiID8gd2FybmluZyh0eXBlb2YgKGNoZWNrYm94UHJvcHMgPT09IG51bGwgfHwgY2hlY2tib3hQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3hQcm9wcy5pbmRldGVybWluYXRlKSAhPT0gJ2Jvb2xlYW4nLCAndXNhZ2UnLCAnc2V0IGBpbmRldGVybWluYXRlYCB1c2luZyBgcm93U2VsZWN0aW9uLmdldENoZWNrYm94UHJvcHNgIGlzIG5vdCBhbGxvd2VkIHdpdGggdHJlZSBzdHJ1Y3R1cmVkIGRhdGFTb3VyY2UuJykgOiB2b2lkIDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWVyZ2VkSW5kZXRlcm1pbmF0ZSA9IChfYSA9IGNoZWNrYm94UHJvcHMgPT09IG51bGwgfHwgY2hlY2tib3hQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3hQcm9wcy5pbmRldGVybWluYXRlKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBpbmRldGVybWluYXRlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlY29yZCBjaGVja2VkXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbm9kZTogKC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KF9jaGVja2JveC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCBjaGVja2JveFByb3BzLCB7XG4gICAgICAgICAgICBpbmRldGVybWluYXRlOiBtZXJnZWRJbmRldGVybWluYXRlLFxuICAgICAgICAgICAgY2hlY2tlZDogY2hlY2tlZCxcbiAgICAgICAgICAgIHNraXBHcm91cDogdHJ1ZSxcbiAgICAgICAgICAgIG9uQ2xpY2s6IGUgPT4ge1xuICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgIChfYSA9IGNoZWNrYm94UHJvcHMgPT09IG51bGwgfHwgY2hlY2tib3hQcm9wcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY2hlY2tib3hQcm9wcy5vbkNsaWNrKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbChjaGVja2JveFByb3BzLCBlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkNoYW5nZTogZXZlbnQgPT4ge1xuICAgICAgICAgICAgICB2YXIgX2E7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBuYXRpdmVFdmVudFxuICAgICAgICAgICAgICB9ID0gZXZlbnQ7XG4gICAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBzaGlmdEtleVxuICAgICAgICAgICAgICB9ID0gbmF0aXZlRXZlbnQ7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RlZEluZGV4ID0gcmVjb3JkS2V5cy5maW5kSW5kZXgoaXRlbSA9PiBpdGVtID09PSBrZXkpO1xuICAgICAgICAgICAgICBjb25zdCBpc011bHRpcGxlID0gZGVyaXZlZFNlbGVjdGVkS2V5cy5zb21lKGl0ZW0gPT4gcmVjb3JkS2V5cy5pbmNsdWRlcyhpdGVtKSk7XG4gICAgICAgICAgICAgIGlmIChzaGlmdEtleSAmJiBjaGVja1N0cmljdGx5ICYmIGlzTXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VkS2V5cyA9IG11bHRpcGxlU2VsZWN0KGN1cnJlbnRTZWxlY3RlZEluZGV4LCByZWNvcmRLZXlzLCBrZXlTZXQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBBcnJheS5mcm9tKGtleVNldCk7XG4gICAgICAgICAgICAgICAgb25TZWxlY3RNdWx0aXBsZSA9PT0gbnVsbCB8fCBvblNlbGVjdE11bHRpcGxlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvblNlbGVjdE11bHRpcGxlKCFjaGVja2VkLCBrZXlzLm1hcChyZWNvcmRLZXkgPT4gZ2V0UmVjb3JkQnlLZXkocmVjb3JkS2V5KSksIGNoYW5nZWRLZXlzLm1hcChyZWNvcmRLZXkgPT4gZ2V0UmVjb3JkQnlLZXkocmVjb3JkS2V5KSkpO1xuICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkS2V5cyhrZXlzLCAnbXVsdGlwbGUnKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBTaW5nbGUgcmVjb3JkIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luQ2hlY2tlZEtleXMgPSBkZXJpdmVkU2VsZWN0ZWRLZXlzO1xuICAgICAgICAgICAgICAgIGlmIChjaGVja1N0cmljdGx5KSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGVja2VkS2V5cyA9IGNoZWNrZWQgPyAoMCwgX3V0aWwuYXJyRGVsKShvcmlnaW5DaGVja2VkS2V5cywga2V5KSA6ICgwLCBfdXRpbC5hcnJBZGQpKG9yaWdpbkNoZWNrZWRLZXlzLCBrZXkpO1xuICAgICAgICAgICAgICAgICAgdHJpZ2dlclNpbmdsZVNlbGVjdGlvbihrZXksICFjaGVja2VkLCBjaGVja2VkS2V5cywgbmF0aXZlRXZlbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBBbHdheXMgZmlsbCBmaXJzdFxuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gKDAsIF9jb25kdWN0VXRpbC5jb25kdWN0Q2hlY2spKFtdLmNvbmNhdCgoMCwgX3RvQ29uc3VtYWJsZUFycmF5Mi5kZWZhdWx0KShvcmlnaW5DaGVja2VkS2V5cyksIFtrZXldKSwgdHJ1ZSwga2V5RW50aXRpZXMsIGlzQ2hlY2tib3hEaXNhYmxlZCk7XG4gICAgICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrZWRLZXlzLFxuICAgICAgICAgICAgICAgICAgICBoYWxmQ2hlY2tlZEtleXNcbiAgICAgICAgICAgICAgICAgIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICBsZXQgbmV4dENoZWNrZWRLZXlzID0gY2hlY2tlZEtleXM7XG4gICAgICAgICAgICAgICAgICAvLyBJZiByZW1vdmUsIHdlIGRvIGl0IGFnYWluIHRvIGNvcnJlY3Rpb25cbiAgICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBLZXlTZXQgPSBuZXcgU2V0KGNoZWNrZWRLZXlzKTtcbiAgICAgICAgICAgICAgICAgICAgdGVtcEtleVNldC5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dENoZWNrZWRLZXlzID0gKDAsIF9jb25kdWN0VXRpbC5jb25kdWN0Q2hlY2spKEFycmF5LmZyb20odGVtcEtleVNldCksIHtcbiAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICBoYWxmQ2hlY2tlZEtleXNcbiAgICAgICAgICAgICAgICAgICAgfSwga2V5RW50aXRpZXMsIGlzQ2hlY2tib3hEaXNhYmxlZCkuY2hlY2tlZEtleXM7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB0cmlnZ2VyU2luZ2xlU2VsZWN0aW9uKGtleSwgIWNoZWNrZWQsIG5leHRDaGVja2VkS2V5cywgbmF0aXZlRXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVByZXZTZWxlY3RlZEluZGV4KG51bGwpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHVwZGF0ZVByZXZTZWxlY3RlZEluZGV4KGN1cnJlbnRTZWxlY3RlZEluZGV4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAoX2EgPSBjaGVja2JveFByb3BzID09PSBudWxsIHx8IGNoZWNrYm94UHJvcHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNoZWNrYm94UHJvcHMub25DaGFuZ2UpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKGNoZWNrYm94UHJvcHMsIGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSkpLFxuICAgICAgICAgIGNoZWNrZWRcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlbmRlclNlbGVjdGlvbkNlbGwgPSAoXywgcmVjb3JkLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBub2RlLFxuICAgICAgICBjaGVja2VkXG4gICAgICB9ID0gcmVuZGVyQ2VsbChfLCByZWNvcmQsIGluZGV4KTtcbiAgICAgIGlmIChjdXN0b21pemVSZW5kZXJDZWxsKSB7XG4gICAgICAgIHJldHVybiBjdXN0b21pemVSZW5kZXJDZWxsKGNoZWNrZWQsIHJlY29yZCwgaW5kZXgsIG5vZGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfTtcbiAgICAvLyBJbnNlcnQgc2VsZWN0aW9uIGNvbHVtbiBpZiBub3QgZXhpc3RcbiAgICBpZiAoIWNsb25lQ29sdW1ucy5pbmNsdWRlcyhTRUxFQ1RJT05fQ09MVU1OKSkge1xuICAgICAgLy8gQWx3YXlzIGFmdGVyIGV4cGFuZCBpY29uXG4gICAgICBpZiAoY2xvbmVDb2x1bW5zLmZpbmRJbmRleChjb2wgPT4ge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHJldHVybiAoKF9hID0gY29sW19yY1RhYmxlLklOVEVSTkFMX0NPTF9ERUZJTkVdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29sdW1uVHlwZSkgPT09ICdFWFBBTkRfQ09MVU1OJztcbiAgICAgIH0pID09PSAwKSB7XG4gICAgICAgIGNvbnN0IFtleHBhbmRDb2x1bW4sIC4uLnJlc3RDb2x1bW5zXSA9IGNsb25lQ29sdW1ucztcbiAgICAgICAgY2xvbmVDb2x1bW5zID0gW2V4cGFuZENvbHVtbiwgU0VMRUNUSU9OX0NPTFVNTl0uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKHJlc3RDb2x1bW5zKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBOb3JtYWwgaW5zZXJ0IGF0IGZpcnN0IGNvbHVtblxuICAgICAgICBjbG9uZUNvbHVtbnMgPSBbU0VMRUNUSU9OX0NPTFVNTl0uY29uY2F0KCgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGNsb25lQ29sdW1ucykpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBEZWR1cGxpY2F0ZSBzZWxlY3Rpb24gY29sdW1uXG4gICAgY29uc3Qgc2VsZWN0aW9uQ29sdW1uSW5kZXggPSBjbG9uZUNvbHVtbnMuaW5kZXhPZihTRUxFQ1RJT05fQ09MVU1OKTtcbiAgICBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgPyB3YXJuaW5nKGNsb25lQ29sdW1ucy5maWx0ZXIoY29sID0+IGNvbCA9PT0gU0VMRUNUSU9OX0NPTFVNTikubGVuZ3RoIDw9IDEsICd1c2FnZScsICdNdWx0aXBsZSBgU0VMRUNUSU9OX0NPTFVNTmAgZXhpc3QgaW4gYGNvbHVtbnNgLicpIDogdm9pZCAwO1xuICAgIGNsb25lQ29sdW1ucyA9IGNsb25lQ29sdW1ucy5maWx0ZXIoKGNvbHVtbiwgaW5kZXgpID0+IGNvbHVtbiAhPT0gU0VMRUNUSU9OX0NPTFVNTiB8fCBpbmRleCA9PT0gc2VsZWN0aW9uQ29sdW1uSW5kZXgpO1xuICAgIC8vIEZpeGVkIGNvbHVtbiBsb2dpY1xuICAgIGNvbnN0IHByZXZDb2wgPSBjbG9uZUNvbHVtbnNbc2VsZWN0aW9uQ29sdW1uSW5kZXggLSAxXTtcbiAgICBjb25zdCBuZXh0Q29sID0gY2xvbmVDb2x1bW5zW3NlbGVjdGlvbkNvbHVtbkluZGV4ICsgMV07XG4gICAgbGV0IG1lcmdlZEZpeGVkID0gZml4ZWQ7XG4gICAgaWYgKG1lcmdlZEZpeGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICgobmV4dENvbCA9PT0gbnVsbCB8fCBuZXh0Q29sID09PSB2b2lkIDAgPyB2b2lkIDAgOiBuZXh0Q29sLmZpeGVkKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG1lcmdlZEZpeGVkID0gbmV4dENvbC5maXhlZDtcbiAgICAgIH0gZWxzZSBpZiAoKHByZXZDb2wgPT09IG51bGwgfHwgcHJldkNvbCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcHJldkNvbC5maXhlZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBtZXJnZWRGaXhlZCA9IHByZXZDb2wuZml4ZWQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtZXJnZWRGaXhlZCAmJiBwcmV2Q29sICYmICgoX2EgPSBwcmV2Q29sW19yY1RhYmxlLklOVEVSTkFMX0NPTF9ERUZJTkVdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY29sdW1uVHlwZSkgPT09ICdFWFBBTkRfQ09MVU1OJyAmJiBwcmV2Q29sLmZpeGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHByZXZDb2wuZml4ZWQgPSBtZXJnZWRGaXhlZDtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uQ2xzID0gKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGAke3ByZWZpeENsc30tc2VsZWN0aW9uLWNvbGAsIHtcbiAgICAgIFtgJHtwcmVmaXhDbHN9LXNlbGVjdGlvbi1jb2wtd2l0aC1kcm9wZG93bmBdOiBzZWxlY3Rpb25zICYmIHNlbGVjdGlvblR5cGUgPT09ICdjaGVja2JveCdcbiAgICB9KTtcbiAgICBjb25zdCByZW5kZXJDb2x1bW5UaXRsZSA9ICgpID0+IHtcbiAgICAgIGlmICghKHJvd1NlbGVjdGlvbiA9PT0gbnVsbCB8fCByb3dTZWxlY3Rpb24gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHJvd1NlbGVjdGlvbi5jb2x1bW5UaXRsZSkpIHtcbiAgICAgICAgcmV0dXJuIHRpdGxlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiByb3dTZWxlY3Rpb24uY29sdW1uVGl0bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIHJvd1NlbGVjdGlvbi5jb2x1bW5UaXRsZShjb2x1bW5UaXRsZUNoZWNrYm94KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByb3dTZWxlY3Rpb24uY29sdW1uVGl0bGU7XG4gICAgfTtcbiAgICAvLyBSZXBsYWNlIHdpdGggcmVhbCBzZWxlY3Rpb24gY29sdW1uXG4gICAgY29uc3Qgc2VsZWN0aW9uQ29sdW1uID0ge1xuICAgICAgZml4ZWQ6IG1lcmdlZEZpeGVkLFxuICAgICAgd2lkdGg6IHNlbGVjdGlvbkNvbFdpZHRoLFxuICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LXNlbGVjdGlvbi1jb2x1bW5gLFxuICAgICAgdGl0bGU6IHJlbmRlckNvbHVtblRpdGxlKCksXG4gICAgICByZW5kZXI6IHJlbmRlclNlbGVjdGlvbkNlbGwsXG4gICAgICBvbkNlbGw6IHJvd1NlbGVjdGlvbi5vbkNlbGwsXG4gICAgICBhbGlnbjogcm93U2VsZWN0aW9uLmFsaWduLFxuICAgICAgW19yY1RhYmxlLklOVEVSTkFMX0NPTF9ERUZJTkVdOiB7XG4gICAgICAgIGNsYXNzTmFtZTogY29sdW1uQ2xzXG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gY2xvbmVDb2x1bW5zLm1hcChjb2wgPT4gY29sID09PSBTRUxFQ1RJT05fQ09MVU1OID8gc2VsZWN0aW9uQ29sdW1uIDogY29sKTtcbiAgfSwgW2dldFJvd0tleSwgZmxhdHRlZERhdGEsIHJvd1NlbGVjdGlvbiwgZGVyaXZlZFNlbGVjdGVkS2V5cywgZGVyaXZlZFNlbGVjdGVkS2V5U2V0LCBkZXJpdmVkSGFsZlNlbGVjdGVkS2V5U2V0LCBzZWxlY3Rpb25Db2xXaWR0aCwgbWVyZ2VkU2VsZWN0aW9ucywgZXhwYW5kVHlwZSwgY2hlY2tib3hQcm9wc01hcCwgb25TZWxlY3RNdWx0aXBsZSwgdHJpZ2dlclNpbmdsZVNlbGVjdGlvbiwgaXNDaGVja2JveERpc2FibGVkXSk7XG4gIHJldHVybiBbdHJhbnNmb3JtQ29sdW1ucywgZGVyaXZlZFNlbGVjdGVkS2V5U2V0XTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB1c2VTZWxlY3Rpb247IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cInVzZSBjbGllbnRcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKS5kZWZhdWx0O1xudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmdldFNvcnREYXRhID0gZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF90b0NvbnN1bWFibGVBcnJheTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL3RvQ29uc3VtYWJsZUFycmF5XCIpKTtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX0NhcmV0RG93bk91dGxpbmVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiQGFudC1kZXNpZ24vaWNvbnMvQ2FyZXREb3duT3V0bGluZWRcIikpO1xudmFyIF9DYXJldFVwT3V0bGluZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJAYW50LWRlc2lnbi9pY29ucy9DYXJldFVwT3V0bGluZWRcIikpO1xudmFyIF9jbGFzc25hbWVzID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiY2xhc3NuYW1lc1wiKSk7XG52YXIgX0tleUNvZGUgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCJyYy11dGlsL2xpYi9LZXlDb2RlXCIpKTtcbnZhciBfdG9vbHRpcCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4uLy4uL3Rvb2x0aXBcIikpO1xudmFyIF91dGlsID0gcmVxdWlyZShcIi4uL3V0aWxcIik7XG5jb25zdCBBU0NFTkQgPSAnYXNjZW5kJztcbmNvbnN0IERFU0NFTkQgPSAnZGVzY2VuZCc7XG5jb25zdCBnZXRNdWx0aXBsZVByaW9yaXR5ID0gY29sdW1uID0+IHtcbiAgaWYgKHR5cGVvZiBjb2x1bW4uc29ydGVyID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgY29sdW1uLnNvcnRlci5tdWx0aXBsZSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gY29sdW1uLnNvcnRlci5tdWx0aXBsZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuY29uc3QgZ2V0U29ydEZ1bmN0aW9uID0gc29ydGVyID0+IHtcbiAgaWYgKHR5cGVvZiBzb3J0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc29ydGVyO1xuICB9XG4gIGlmIChzb3J0ZXIgJiYgdHlwZW9mIHNvcnRlciA9PT0gJ29iamVjdCcgJiYgc29ydGVyLmNvbXBhcmUpIHtcbiAgICByZXR1cm4gc29ydGVyLmNvbXBhcmU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcbmNvbnN0IG5leHRTb3J0RGlyZWN0aW9uID0gKHNvcnREaXJlY3Rpb25zLCBjdXJyZW50KSA9PiB7XG4gIGlmICghY3VycmVudCkge1xuICAgIHJldHVybiBzb3J0RGlyZWN0aW9uc1swXTtcbiAgfVxuICByZXR1cm4gc29ydERpcmVjdGlvbnNbc29ydERpcmVjdGlvbnMuaW5kZXhPZihjdXJyZW50KSArIDFdO1xufTtcbmNvbnN0IGNvbGxlY3RTb3J0U3RhdGVzID0gKGNvbHVtbnMsIGluaXQsIHBvcykgPT4ge1xuICBsZXQgc29ydFN0YXRlcyA9IFtdO1xuICBjb25zdCBwdXNoU3RhdGUgPSAoY29sdW1uLCBjb2x1bW5Qb3MpID0+IHtcbiAgICBzb3J0U3RhdGVzLnB1c2goe1xuICAgICAgY29sdW1uLFxuICAgICAga2V5OiAoMCwgX3V0aWwuZ2V0Q29sdW1uS2V5KShjb2x1bW4sIGNvbHVtblBvcyksXG4gICAgICBtdWx0aXBsZVByaW9yaXR5OiBnZXRNdWx0aXBsZVByaW9yaXR5KGNvbHVtbiksXG4gICAgICBzb3J0T3JkZXI6IGNvbHVtbi5zb3J0T3JkZXJcbiAgICB9KTtcbiAgfTtcbiAgKGNvbHVtbnMgfHwgW10pLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICBjb25zdCBjb2x1bW5Qb3MgPSAoMCwgX3V0aWwuZ2V0Q29sdW1uUG9zKShpbmRleCwgcG9zKTtcbiAgICBpZiAoY29sdW1uLmNoaWxkcmVuKSB7XG4gICAgICBpZiAoJ3NvcnRPcmRlcicgaW4gY29sdW1uKSB7XG4gICAgICAgIC8vIENvbnRyb2xsZWRcbiAgICAgICAgcHVzaFN0YXRlKGNvbHVtbiwgY29sdW1uUG9zKTtcbiAgICAgIH1cbiAgICAgIHNvcnRTdGF0ZXMgPSBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoc29ydFN0YXRlcyksICgwLCBfdG9Db25zdW1hYmxlQXJyYXkyLmRlZmF1bHQpKGNvbGxlY3RTb3J0U3RhdGVzKGNvbHVtbi5jaGlsZHJlbiwgaW5pdCwgY29sdW1uUG9zKSkpO1xuICAgIH0gZWxzZSBpZiAoY29sdW1uLnNvcnRlcikge1xuICAgICAgaWYgKCdzb3J0T3JkZXInIGluIGNvbHVtbikge1xuICAgICAgICAvLyBDb250cm9sbGVkXG4gICAgICAgIHB1c2hTdGF0ZShjb2x1bW4sIGNvbHVtblBvcyk7XG4gICAgICB9IGVsc2UgaWYgKGluaXQgJiYgY29sdW1uLmRlZmF1bHRTb3J0T3JkZXIpIHtcbiAgICAgICAgLy8gRGVmYXVsdCBzb3J0ZXJcbiAgICAgICAgc29ydFN0YXRlcy5wdXNoKHtcbiAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAga2V5OiAoMCwgX3V0aWwuZ2V0Q29sdW1uS2V5KShjb2x1bW4sIGNvbHVtblBvcyksXG4gICAgICAgICAgbXVsdGlwbGVQcmlvcml0eTogZ2V0TXVsdGlwbGVQcmlvcml0eShjb2x1bW4pLFxuICAgICAgICAgIHNvcnRPcmRlcjogY29sdW1uLmRlZmF1bHRTb3J0T3JkZXJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHNvcnRTdGF0ZXM7XG59O1xuY29uc3QgaW5qZWN0U29ydGVyID0gKHByZWZpeENscywgY29sdW1ucywgc29ydGVyU3RhdGVzLCB0cmlnZ2VyU29ydGVyLCBkZWZhdWx0U29ydERpcmVjdGlvbnMsIHRhYmxlTG9jYWxlLCB0YWJsZVNob3dTb3J0ZXJUb29sdGlwLCBwb3MpID0+IHtcbiAgY29uc3QgZmluYWxDb2x1bW5zID0gKGNvbHVtbnMgfHwgW10pLm1hcCgoY29sdW1uLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGNvbHVtblBvcyA9ICgwLCBfdXRpbC5nZXRDb2x1bW5Qb3MpKGluZGV4LCBwb3MpO1xuICAgIGxldCBuZXdDb2x1bW4gPSBjb2x1bW47XG4gICAgaWYgKG5ld0NvbHVtbi5zb3J0ZXIpIHtcbiAgICAgIGNvbnN0IHNvcnREaXJlY3Rpb25zID0gbmV3Q29sdW1uLnNvcnREaXJlY3Rpb25zIHx8IGRlZmF1bHRTb3J0RGlyZWN0aW9ucztcbiAgICAgIGNvbnN0IHNob3dTb3J0ZXJUb29sdGlwID0gbmV3Q29sdW1uLnNob3dTb3J0ZXJUb29sdGlwID09PSB1bmRlZmluZWQgPyB0YWJsZVNob3dTb3J0ZXJUb29sdGlwIDogbmV3Q29sdW1uLnNob3dTb3J0ZXJUb29sdGlwO1xuICAgICAgY29uc3QgY29sdW1uS2V5ID0gKDAsIF91dGlsLmdldENvbHVtbktleSkobmV3Q29sdW1uLCBjb2x1bW5Qb3MpO1xuICAgICAgY29uc3Qgc29ydGVyU3RhdGUgPSBzb3J0ZXJTdGF0ZXMuZmluZCgoe1xuICAgICAgICBrZXlcbiAgICAgIH0pID0+IGtleSA9PT0gY29sdW1uS2V5KTtcbiAgICAgIGNvbnN0IHNvcnRPcmRlciA9IHNvcnRlclN0YXRlID8gc29ydGVyU3RhdGUuc29ydE9yZGVyIDogbnVsbDtcbiAgICAgIGNvbnN0IG5leHRTb3J0T3JkZXIgPSBuZXh0U29ydERpcmVjdGlvbihzb3J0RGlyZWN0aW9ucywgc29ydE9yZGVyKTtcbiAgICAgIGxldCBzb3J0ZXI7XG4gICAgICBpZiAoY29sdW1uLnNvcnRJY29uKSB7XG4gICAgICAgIHNvcnRlciA9IGNvbHVtbi5zb3J0SWNvbih7XG4gICAgICAgICAgc29ydE9yZGVyXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdXBOb2RlID0gc29ydERpcmVjdGlvbnMuaW5jbHVkZXMoQVNDRU5EKSAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0NhcmV0VXBPdXRsaW5lZC5kZWZhdWx0LCB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoYCR7cHJlZml4Q2xzfS1jb2x1bW4tc29ydGVyLXVwYCwge1xuICAgICAgICAgICAgYWN0aXZlOiBzb3J0T3JkZXIgPT09IEFTQ0VORFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pKTtcbiAgICAgICAgY29uc3QgZG93bk5vZGUgPSBzb3J0RGlyZWN0aW9ucy5pbmNsdWRlcyhERVNDRU5EKSAmJiAoLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoX0NhcmV0RG93bk91dGxpbmVkLmRlZmF1bHQsIHtcbiAgICAgICAgICBjbGFzc05hbWU6ICgwLCBfY2xhc3NuYW1lcy5kZWZhdWx0KShgJHtwcmVmaXhDbHN9LWNvbHVtbi1zb3J0ZXItZG93bmAsIHtcbiAgICAgICAgICAgIGFjdGl2ZTogc29ydE9yZGVyID09PSBERVNDRU5EXG4gICAgICAgICAgfSlcbiAgICAgICAgfSkpO1xuICAgICAgICBzb3J0ZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgIGNsYXNzTmFtZTogKDAsIF9jbGFzc25hbWVzLmRlZmF1bHQpKGAke3ByZWZpeENsc30tY29sdW1uLXNvcnRlcmAsIHtcbiAgICAgICAgICAgIFtgJHtwcmVmaXhDbHN9LWNvbHVtbi1zb3J0ZXItZnVsbGBdOiAhISh1cE5vZGUgJiYgZG93bk5vZGUpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSwgLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IGAke3ByZWZpeENsc30tY29sdW1uLXNvcnRlci1pbm5lcmAsXG4gICAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcInRydWVcIlxuICAgICAgICB9LCB1cE5vZGUsIGRvd25Ob2RlKSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNhbmNlbFNvcnQsXG4gICAgICAgIHRyaWdnZXJBc2MsXG4gICAgICAgIHRyaWdnZXJEZXNjXG4gICAgICB9ID0gdGFibGVMb2NhbGUgfHwge307XG4gICAgICBsZXQgc29ydFRpcCA9IGNhbmNlbFNvcnQ7XG4gICAgICBpZiAobmV4dFNvcnRPcmRlciA9PT0gREVTQ0VORCkge1xuICAgICAgICBzb3J0VGlwID0gdHJpZ2dlckRlc2M7XG4gICAgICB9IGVsc2UgaWYgKG5leHRTb3J0T3JkZXIgPT09IEFTQ0VORCkge1xuICAgICAgICBzb3J0VGlwID0gdHJpZ2dlckFzYztcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRvb2x0aXBQcm9wcyA9IHR5cGVvZiBzaG93U29ydGVyVG9vbHRpcCA9PT0gJ29iamVjdCcgPyBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgdGl0bGU6IHNvcnRUaXBcbiAgICAgIH0sIHNob3dTb3J0ZXJUb29sdGlwKSA6IHtcbiAgICAgICAgdGl0bGU6IHNvcnRUaXBcbiAgICAgIH07XG4gICAgICBuZXdDb2x1bW4gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG5ld0NvbHVtbiksIHtcbiAgICAgICAgY2xhc3NOYW1lOiAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkobmV3Q29sdW1uLmNsYXNzTmFtZSwge1xuICAgICAgICAgIFtgJHtwcmVmaXhDbHN9LWNvbHVtbi1zb3J0YF06IHNvcnRPcmRlclxuICAgICAgICB9KSxcbiAgICAgICAgdGl0bGU6IHJlbmRlclByb3BzID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x1bW5Tb3J0ZXJzQ2xhc3MgPSBgJHtwcmVmaXhDbHN9LWNvbHVtbi1zb3J0ZXJzYDtcbiAgICAgICAgICBjb25zdCByZW5kZXJDb2x1bW5UaXRsZVdyYXBwZXIgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBgJHtwcmVmaXhDbHN9LWNvbHVtbi10aXRsZWBcbiAgICAgICAgICB9LCAoMCwgX3V0aWwucmVuZGVyQ29sdW1uVGl0bGUpKGNvbHVtbi50aXRsZSwgcmVuZGVyUHJvcHMpKTtcbiAgICAgICAgICBjb25zdCByZW5kZXJTb3J0VGl0bGUgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGNvbHVtblNvcnRlcnNDbGFzc1xuICAgICAgICAgIH0sIHJlbmRlckNvbHVtblRpdGxlV3JhcHBlciwgc29ydGVyKTtcbiAgICAgICAgICBpZiAoc2hvd1NvcnRlclRvb2x0aXApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2hvd1NvcnRlclRvb2x0aXAgIT09ICdib29sZWFuJyAmJiAoc2hvd1NvcnRlclRvb2x0aXAgPT09IG51bGwgfHwgc2hvd1NvcnRlclRvb2x0aXAgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNob3dTb3J0ZXJUb29sdGlwLnRhcmdldCkgPT09ICdzb3J0ZXItaWNvbicpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGAke2NvbHVtblNvcnRlcnNDbGFzc30gJHtwcmVmaXhDbHN9LWNvbHVtbi1zb3J0ZXJzLXRvb2x0aXAtdGFyZ2V0LXNvcnRlcmBcbiAgICAgICAgICAgICAgfSwgcmVuZGVyQ29sdW1uVGl0bGVXcmFwcGVyLCAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfdG9vbHRpcC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCB0b29sdGlwUHJvcHMpLCBzb3J0ZXIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlRWxlbWVudChfdG9vbHRpcC5kZWZhdWx0LCBPYmplY3QuYXNzaWduKHt9LCB0b29sdGlwUHJvcHMpLCByZW5kZXJTb3J0VGl0bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVuZGVyU29ydFRpdGxlO1xuICAgICAgICB9LFxuICAgICAgICBvbkhlYWRlckNlbGw6IGNvbCA9PiB7XG4gICAgICAgICAgdmFyIF9hO1xuICAgICAgICAgIGNvbnN0IGNlbGwgPSAoKF9hID0gY29sdW1uLm9uSGVhZGVyQ2VsbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwoY29sdW1uLCBjb2wpKSB8fCB7fTtcbiAgICAgICAgICBjb25zdCBvcmlnaW5PbkNsaWNrID0gY2VsbC5vbkNsaWNrO1xuICAgICAgICAgIGNvbnN0IG9yaWdpbk9LZXlEb3duID0gY2VsbC5vbktleURvd247XG4gICAgICAgICAgY2VsbC5vbkNsaWNrID0gZXZlbnQgPT4ge1xuICAgICAgICAgICAgdHJpZ2dlclNvcnRlcih7XG4gICAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgICAga2V5OiBjb2x1bW5LZXksXG4gICAgICAgICAgICAgIHNvcnRPcmRlcjogbmV4dFNvcnRPcmRlcixcbiAgICAgICAgICAgICAgbXVsdGlwbGVQcmlvcml0eTogZ2V0TXVsdGlwbGVQcmlvcml0eShjb2x1bW4pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9yaWdpbk9uQ2xpY2sgPT09IG51bGwgfHwgb3JpZ2luT25DbGljayA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luT25DbGljayhldmVudCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBjZWxsLm9uS2V5RG93biA9IGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBfS2V5Q29kZS5kZWZhdWx0LkVOVEVSKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTb3J0ZXIoe1xuICAgICAgICAgICAgICAgIGNvbHVtbixcbiAgICAgICAgICAgICAgICBrZXk6IGNvbHVtbktleSxcbiAgICAgICAgICAgICAgICBzb3J0T3JkZXI6IG5leHRTb3J0T3JkZXIsXG4gICAgICAgICAgICAgICAgbXVsdGlwbGVQcmlvcml0eTogZ2V0TXVsdGlwbGVQcmlvcml0eShjb2x1bW4pXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBvcmlnaW5PS2V5RG93biA9PT0gbnVsbCB8fCBvcmlnaW5PS2V5RG93biA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3JpZ2luT0tleURvd24oZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgcmVuZGVyVGl0bGUgPSAoMCwgX3V0aWwuc2FmZUNvbHVtblRpdGxlKShjb2x1bW4udGl0bGUsIHt9KTtcbiAgICAgICAgICBjb25zdCBkaXNwbGF5VGl0bGUgPSByZW5kZXJUaXRsZSA9PT0gbnVsbCB8fCByZW5kZXJUaXRsZSA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVuZGVyVGl0bGUudG9TdHJpbmcoKTtcbiAgICAgICAgICAvLyBJbmZvcm0gdGhlIHNjcmVlbi1yZWFkZXIgc28gaXQgY2FuIHRlbGwgdGhlIHZpc3VhbGx5IGltcGFpcmVkIHVzZXIgd2hpY2ggY29sdW1uIGlzIHNvcnRlZFxuICAgICAgICAgIGlmIChzb3J0T3JkZXIpIHtcbiAgICAgICAgICAgIGNlbGxbJ2FyaWEtc29ydCddID0gc29ydE9yZGVyID09PSAnYXNjZW5kJyA/ICdhc2NlbmRpbmcnIDogJ2Rlc2NlbmRpbmcnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjZWxsWydhcmlhLWxhYmVsJ10gPSBkaXNwbGF5VGl0bGUgfHwgJyc7XG4gICAgICAgICAgY2VsbC5jbGFzc05hbWUgPSAoMCwgX2NsYXNzbmFtZXMuZGVmYXVsdCkoY2VsbC5jbGFzc05hbWUsIGAke3ByZWZpeENsc30tY29sdW1uLWhhcy1zb3J0ZXJzYCk7XG4gICAgICAgICAgY2VsbC50YWJJbmRleCA9IDA7XG4gICAgICAgICAgaWYgKGNvbHVtbi5lbGxpcHNpcykge1xuICAgICAgICAgICAgY2VsbC50aXRsZSA9IChyZW5kZXJUaXRsZSAhPT0gbnVsbCAmJiByZW5kZXJUaXRsZSAhPT0gdm9pZCAwID8gcmVuZGVyVGl0bGUgOiAnJykudG9TdHJpbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNlbGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoJ2NoaWxkcmVuJyBpbiBuZXdDb2x1bW4pIHtcbiAgICAgIG5ld0NvbHVtbiA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbmV3Q29sdW1uKSwge1xuICAgICAgICBjaGlsZHJlbjogaW5qZWN0U29ydGVyKHByZWZpeENscywgbmV3Q29sdW1uLmNoaWxkcmVuLCBzb3J0ZXJTdGF0ZXMsIHRyaWdnZXJTb3J0ZXIsIGRlZmF1bHRTb3J0RGlyZWN0aW9ucywgdGFibGVMb2NhbGUsIHRhYmxlU2hvd1NvcnRlclRvb2x0aXAsIGNvbHVtblBvcylcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3Q29sdW1uO1xuICB9KTtcbiAgcmV0dXJuIGZpbmFsQ29sdW1ucztcbn07XG5jb25zdCBzdGF0ZVRvSW5mbyA9IHNvcnRlclN0YXRlID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbHVtbixcbiAgICBzb3J0T3JkZXJcbiAgfSA9IHNvcnRlclN0YXRlO1xuICByZXR1cm4ge1xuICAgIGNvbHVtbixcbiAgICBvcmRlcjogc29ydE9yZGVyLFxuICAgIGZpZWxkOiBjb2x1bW4uZGF0YUluZGV4LFxuICAgIGNvbHVtbktleTogY29sdW1uLmtleVxuICB9O1xufTtcbmNvbnN0IGdlbmVyYXRlU29ydGVySW5mbyA9IHNvcnRlclN0YXRlcyA9PiB7XG4gIGNvbnN0IGFjdGl2ZVNvcnRlcnMgPSBzb3J0ZXJTdGF0ZXMuZmlsdGVyKCh7XG4gICAgc29ydE9yZGVyXG4gIH0pID0+IHNvcnRPcmRlcikubWFwKHN0YXRlVG9JbmZvKTtcbiAgLy8gPT09PT09PT09PT0gTGVnYWN5IGNvbXBhdGlibGUgc3VwcG9ydCA9PT09PT09PT09PVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL3B1bGwvMTkyMjZcbiAgaWYgKGFjdGl2ZVNvcnRlcnMubGVuZ3RoID09PSAwICYmIHNvcnRlclN0YXRlcy5sZW5ndGgpIHtcbiAgICBjb25zdCBsYXN0SW5kZXggPSBzb3J0ZXJTdGF0ZXMubGVuZ3RoIC0gMTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZVRvSW5mbyhzb3J0ZXJTdGF0ZXNbbGFzdEluZGV4XSkpLCB7XG4gICAgICBjb2x1bW46IHVuZGVmaW5lZCxcbiAgICAgIG9yZGVyOiB1bmRlZmluZWQsXG4gICAgICBmaWVsZDogdW5kZWZpbmVkLFxuICAgICAgY29sdW1uS2V5OiB1bmRlZmluZWRcbiAgICB9KTtcbiAgfVxuICBpZiAoYWN0aXZlU29ydGVycy5sZW5ndGggPD0gMSkge1xuICAgIHJldHVybiBhY3RpdmVTb3J0ZXJzWzBdIHx8IHt9O1xuICB9XG4gIHJldHVybiBhY3RpdmVTb3J0ZXJzO1xufTtcbmNvbnN0IGdldFNvcnREYXRhID0gKGRhdGEsIHNvcnRTdGF0ZXMsIGNoaWxkcmVuQ29sdW1uTmFtZSkgPT4ge1xuICBjb25zdCBpbm5lclNvcnRlclN0YXRlcyA9IHNvcnRTdGF0ZXMuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiBiLm11bHRpcGxlUHJpb3JpdHkgLSBhLm11bHRpcGxlUHJpb3JpdHkpO1xuICBjb25zdCBjbG9uZURhdGEgPSBkYXRhLnNsaWNlKCk7XG4gIGNvbnN0IHJ1bm5pbmdTb3J0ZXJzID0gaW5uZXJTb3J0ZXJTdGF0ZXMuZmlsdGVyKCh7XG4gICAgY29sdW1uOiB7XG4gICAgICBzb3J0ZXJcbiAgICB9LFxuICAgIHNvcnRPcmRlclxuICB9KSA9PiBnZXRTb3J0RnVuY3Rpb24oc29ydGVyKSAmJiBzb3J0T3JkZXIpO1xuICAvLyBTa2lwIGlmIG5vIHNvcnRlciBuZWVkZWRcbiAgaWYgKCFydW5uaW5nU29ydGVycy5sZW5ndGgpIHtcbiAgICByZXR1cm4gY2xvbmVEYXRhO1xuICB9XG4gIHJldHVybiBjbG9uZURhdGEuc29ydCgocmVjb3JkMSwgcmVjb3JkMikgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVubmluZ1NvcnRlcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IHNvcnRlclN0YXRlID0gcnVubmluZ1NvcnRlcnNbaV07XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNvbHVtbjoge1xuICAgICAgICAgIHNvcnRlclxuICAgICAgICB9LFxuICAgICAgICBzb3J0T3JkZXJcbiAgICAgIH0gPSBzb3J0ZXJTdGF0ZTtcbiAgICAgIGNvbnN0IGNvbXBhcmVGbiA9IGdldFNvcnRGdW5jdGlvbihzb3J0ZXIpO1xuICAgICAgaWYgKGNvbXBhcmVGbiAmJiBzb3J0T3JkZXIpIHtcbiAgICAgICAgY29uc3QgY29tcGFyZVJlc3VsdCA9IGNvbXBhcmVGbihyZWNvcmQxLCByZWNvcmQyLCBzb3J0T3JkZXIpO1xuICAgICAgICBpZiAoY29tcGFyZVJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiBzb3J0T3JkZXIgPT09IEFTQ0VORCA/IGNvbXBhcmVSZXN1bHQgOiAtY29tcGFyZVJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSkubWFwKHJlY29yZCA9PiB7XG4gICAgY29uc3Qgc3ViUmVjb3JkcyA9IHJlY29yZFtjaGlsZHJlbkNvbHVtbk5hbWVdO1xuICAgIGlmIChzdWJSZWNvcmRzKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZWNvcmQpLCB7XG4gICAgICAgIFtjaGlsZHJlbkNvbHVtbk5hbWVdOiBnZXRTb3J0RGF0YShzdWJSZWNvcmRzLCBzb3J0U3RhdGVzLCBjaGlsZHJlbkNvbHVtbk5hbWUpXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlY29yZDtcbiAgfSk7XG59O1xuZXhwb3J0cy5nZXRTb3J0RGF0YSA9IGdldFNvcnREYXRhO1xuY29uc3QgdXNlRmlsdGVyU29ydGVyID0gcHJvcHMgPT4ge1xuICBjb25zdCB7XG4gICAgcHJlZml4Q2xzLFxuICAgIG1lcmdlZENvbHVtbnMsXG4gICAgc29ydERpcmVjdGlvbnMsXG4gICAgdGFibGVMb2NhbGUsXG4gICAgc2hvd1NvcnRlclRvb2x0aXAsXG4gICAgb25Tb3J0ZXJDaGFuZ2VcbiAgfSA9IHByb3BzO1xuICBjb25zdCBbc29ydFN0YXRlcywgc2V0U29ydFN0YXRlc10gPSBSZWFjdC51c2VTdGF0ZSgoKSA9PiBjb2xsZWN0U29ydFN0YXRlcyhtZXJnZWRDb2x1bW5zLCB0cnVlKSk7XG4gIGNvbnN0IGdldENvbHVtbktleXMgPSAoY29sdW1ucywgcG9zKSA9PiB7XG4gICAgY29uc3QgbmV3S2V5cyA9IFtdO1xuICAgIGNvbHVtbnMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNvbHVtblBvcyA9ICgwLCBfdXRpbC5nZXRDb2x1bW5Qb3MpKGluZGV4LCBwb3MpO1xuICAgICAgbmV3S2V5cy5wdXNoKCgwLCBfdXRpbC5nZXRDb2x1bW5LZXkpKGl0ZW0sIGNvbHVtblBvcykpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbS5jaGlsZHJlbikpIHtcbiAgICAgICAgY29uc3QgY2hpbGRLZXlzID0gZ2V0Q29sdW1uS2V5cyhpdGVtLmNoaWxkcmVuLCBjb2x1bW5Qb3MpO1xuICAgICAgICBuZXdLZXlzLnB1c2guYXBwbHkobmV3S2V5cywgKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkoY2hpbGRLZXlzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ld0tleXM7XG4gIH07XG4gIGNvbnN0IG1lcmdlZFNvcnRlclN0YXRlcyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4ge1xuICAgIGxldCB2YWxpZGF0ZSA9IHRydWU7XG4gICAgY29uc3QgY29sbGVjdGVkU3RhdGVzID0gY29sbGVjdFNvcnRTdGF0ZXMobWVyZ2VkQ29sdW1ucywgZmFsc2UpO1xuICAgIC8vIFJldHVybiBpZiBub3QgY29udHJvbGxlZFxuICAgIGlmICghY29sbGVjdGVkU3RhdGVzLmxlbmd0aCkge1xuICAgICAgY29uc3QgbWVyZ2VkQ29sdW1uc0tleXMgPSBnZXRDb2x1bW5LZXlzKG1lcmdlZENvbHVtbnMpO1xuICAgICAgcmV0dXJuIHNvcnRTdGF0ZXMuZmlsdGVyKCh7XG4gICAgICAgIGtleVxuICAgICAgfSkgPT4gbWVyZ2VkQ29sdW1uc0tleXMuaW5jbHVkZXMoa2V5KSk7XG4gICAgfVxuICAgIGNvbnN0IHZhbGlkYXRlU3RhdGVzID0gW107XG4gICAgZnVuY3Rpb24gcGF0Y2hTdGF0ZXMoc3RhdGUpIHtcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZVN0YXRlcy5wdXNoKHN0YXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRlU3RhdGVzLnB1c2goT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHtcbiAgICAgICAgICBzb3J0T3JkZXI6IG51bGxcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgbXVsdGlwbGVNb2RlID0gbnVsbDtcbiAgICBjb2xsZWN0ZWRTdGF0ZXMuZm9yRWFjaChzdGF0ZSA9PiB7XG4gICAgICBpZiAobXVsdGlwbGVNb2RlID09PSBudWxsKSB7XG4gICAgICAgIHBhdGNoU3RhdGVzKHN0YXRlKTtcbiAgICAgICAgaWYgKHN0YXRlLnNvcnRPcmRlcikge1xuICAgICAgICAgIGlmIChzdGF0ZS5tdWx0aXBsZVByaW9yaXR5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdmFsaWRhdGUgPSBmYWxzZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbXVsdGlwbGVNb2RlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAobXVsdGlwbGVNb2RlICYmIHN0YXRlLm11bHRpcGxlUHJpb3JpdHkgIT09IGZhbHNlKSB7XG4gICAgICAgIHBhdGNoU3RhdGVzKHN0YXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbGlkYXRlID0gZmFsc2U7XG4gICAgICAgIHBhdGNoU3RhdGVzKHN0YXRlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gdmFsaWRhdGVTdGF0ZXM7XG4gIH0sIFttZXJnZWRDb2x1bW5zLCBzb3J0U3RhdGVzXSk7XG4gIC8vIEdldCByZW5kZXIgY29sdW1ucyB0aXRsZSByZXF1aXJlZCBwcm9wc1xuICBjb25zdCBjb2x1bW5UaXRsZVNvcnRlclByb3BzID0gUmVhY3QudXNlTWVtbygoKSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBjb25zdCBzb3J0Q29sdW1ucyA9IG1lcmdlZFNvcnRlclN0YXRlcy5tYXAoKHtcbiAgICAgIGNvbHVtbixcbiAgICAgIHNvcnRPcmRlclxuICAgIH0pID0+ICh7XG4gICAgICBjb2x1bW4sXG4gICAgICBvcmRlcjogc29ydE9yZGVyXG4gICAgfSkpO1xuICAgIHJldHVybiB7XG4gICAgICBzb3J0Q29sdW1ucyxcbiAgICAgIC8vIExlZ2FjeVxuICAgICAgc29ydENvbHVtbjogKF9hID0gc29ydENvbHVtbnNbMF0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jb2x1bW4sXG4gICAgICBzb3J0T3JkZXI6IChfYiA9IHNvcnRDb2x1bW5zWzBdKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Iub3JkZXJcbiAgICB9O1xuICB9LCBbbWVyZ2VkU29ydGVyU3RhdGVzXSk7XG4gIGNvbnN0IHRyaWdnZXJTb3J0ZXIgPSBzb3J0U3RhdGUgPT4ge1xuICAgIGxldCBuZXdTb3J0ZXJTdGF0ZXM7XG4gICAgaWYgKHNvcnRTdGF0ZS5tdWx0aXBsZVByaW9yaXR5ID09PSBmYWxzZSB8fCAhbWVyZ2VkU29ydGVyU3RhdGVzLmxlbmd0aCB8fCBtZXJnZWRTb3J0ZXJTdGF0ZXNbMF0ubXVsdGlwbGVQcmlvcml0eSA9PT0gZmFsc2UpIHtcbiAgICAgIG5ld1NvcnRlclN0YXRlcyA9IFtzb3J0U3RhdGVdO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTb3J0ZXJTdGF0ZXMgPSBbXS5jb25jYXQoKDAsIF90b0NvbnN1bWFibGVBcnJheTIuZGVmYXVsdCkobWVyZ2VkU29ydGVyU3RhdGVzLmZpbHRlcigoe1xuICAgICAgICBrZXlcbiAgICAgIH0pID0+IGtleSAhPT0gc29ydFN0YXRlLmtleSkpLCBbc29ydFN0YXRlXSk7XG4gICAgfVxuICAgIHNldFNvcnRTdGF0ZXMobmV3U29ydGVyU3RhdGVzKTtcbiAgICBvblNvcnRlckNoYW5nZShnZW5lcmF0ZVNvcnRlckluZm8obmV3U29ydGVyU3RhdGVzKSwgbmV3U29ydGVyU3RhdGVzKTtcbiAgfTtcbiAgY29uc3QgdHJhbnNmb3JtQ29sdW1ucyA9IGlubmVyQ29sdW1ucyA9PiBpbmplY3RTb3J0ZXIocHJlZml4Q2xzLCBpbm5lckNvbHVtbnMsIG1lcmdlZFNvcnRlclN0YXRlcywgdHJpZ2dlclNvcnRlciwgc29ydERpcmVjdGlvbnMsIHRhYmxlTG9jYWxlLCBzaG93U29ydGVyVG9vbHRpcCk7XG4gIGNvbnN0IGdldFNvcnRlcnMgPSAoKSA9PiBnZW5lcmF0ZVNvcnRlckluZm8obWVyZ2VkU29ydGVyU3RhdGVzKTtcbiAgcmV0dXJuIFt0cmFuc2Zvcm1Db2x1bW5zLCBtZXJnZWRTb3J0ZXJTdGF0ZXMsIGNvbHVtblRpdGxlU29ydGVyUHJvcHMsIGdldFNvcnRlcnNdO1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IHVzZUZpbHRlclNvcnRlcjsiLCJcInVzZSBzdHJpY3RcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVXaWxkY2FyZFwiKS5kZWZhdWx0O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBSZWFjdCA9IF9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkKHJlcXVpcmUoXCJyZWFjdFwiKSk7XG52YXIgX3V0aWwgPSByZXF1aXJlKFwiLi4vdXRpbFwiKTtcbmNvbnN0IGZpbGxUaXRsZSA9IChjb2x1bW5zLCBjb2x1bW5UaXRsZVByb3BzKSA9PiB7XG4gIGNvbnN0IGZpbmFsQ29sdW1ucyA9IGNvbHVtbnMubWFwKGNvbHVtbiA9PiB7XG4gICAgY29uc3QgY2xvbmVDb2x1bW4gPSBPYmplY3QuYXNzaWduKHt9LCBjb2x1bW4pO1xuICAgIGNsb25lQ29sdW1uLnRpdGxlID0gKDAsIF91dGlsLnJlbmRlckNvbHVtblRpdGxlKShjb2x1bW4udGl0bGUsIGNvbHVtblRpdGxlUHJvcHMpO1xuICAgIGlmICgnY2hpbGRyZW4nIGluIGNsb25lQ29sdW1uKSB7XG4gICAgICBjbG9uZUNvbHVtbi5jaGlsZHJlbiA9IGZpbGxUaXRsZShjbG9uZUNvbHVtbi5jaGlsZHJlbiwgY29sdW1uVGl0bGVQcm9wcyk7XG4gICAgfVxuICAgIHJldHVybiBjbG9uZUNvbHVtbjtcbiAgfSk7XG4gIHJldHVybiBmaW5hbENvbHVtbnM7XG59O1xuY29uc3QgdXNlVGl0bGVDb2x1bW5zID0gY29sdW1uVGl0bGVQcm9wcyA9PiB7XG4gIGNvbnN0IGZpbGxlZENvbHVtbnMgPSBSZWFjdC51c2VDYWxsYmFjayhjb2x1bW5zID0+IGZpbGxUaXRsZShjb2x1bW5zLCBjb2x1bW5UaXRsZVByb3BzKSwgW2NvbHVtblRpdGxlUHJvcHNdKTtcbiAgcmV0dXJuIFtmaWxsZWRDb2x1bW5zXTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSB1c2VUaXRsZUNvbHVtbnM7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cInVzZSBjbGllbnRcIjtcblxudmFyIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgPSByZXF1aXJlKFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9pbnRlcm9wUmVxdWlyZURlZmF1bHRcIikuZGVmYXVsdDtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX1RhYmxlID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9UYWJsZVwiKSk7XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBfVGFibGUuZGVmYXVsdDsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xuY29uc3QgZ2VuQm9yZGVyZWRTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBsaW5lV2lkdGgsXG4gICAgbGluZVR5cGUsXG4gICAgdGFibGVCb3JkZXJDb2xvcixcbiAgICB0YWJsZUhlYWRlckJnLFxuICAgIHRhYmxlUGFkZGluZ1ZlcnRpY2FsLFxuICAgIHRhYmxlUGFkZGluZ0hvcml6b250YWwsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IHRhYmxlQm9yZGVyID0gYCR7KDAsIF9jc3NpbmpzLnVuaXQpKGxpbmVXaWR0aCl9ICR7bGluZVR5cGV9ICR7dGFibGVCb3JkZXJDb2xvcn1gO1xuICBjb25zdCBnZXRTaXplQm9yZGVyU3R5bGUgPSAoc2l6ZSwgcGFkZGluZ1ZlcnRpY2FsLCBwYWRkaW5nSG9yaXpvbnRhbCkgPT4gKHtcbiAgICBbYCYke2NvbXBvbmVudENsc30tJHtzaXplfWBdOiB7XG4gICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWNvbnRhaW5lcmBdOiB7XG4gICAgICAgIFtgPiAke2NvbXBvbmVudENsc30tY29udGVudCwgPiAke2NvbXBvbmVudENsc30tYm9keWBdOiB7XG4gICAgICAgICAgW2BcbiAgICAgICAgICAgID4gdGFibGUgPiB0Ym9keSA+IHRyID4gdGgsXG4gICAgICAgICAgICA+IHRhYmxlID4gdGJvZHkgPiB0ciA+IHRkXG4gICAgICAgICAgYF06IHtcbiAgICAgICAgICAgIFtgPiAke2NvbXBvbmVudENsc30tZXhwYW5kZWQtcm93LWZpeGVkYF06IHtcbiAgICAgICAgICAgICAgbWFyZ2luOiBgJHsoMCwgX2Nzc2luanMudW5pdCkoY2FsYyhwYWRkaW5nVmVydGljYWwpLm11bCgtMSkuZXF1YWwoKSl9XG4gICAgICAgICAgICAgICR7KDAsIF9jc3NpbmpzLnVuaXQpKGNhbGMoY2FsYyhwYWRkaW5nSG9yaXpvbnRhbCkuYWRkKGxpbmVXaWR0aCkpLm11bCgtMSkuZXF1YWwoKSl9YFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30td3JhcHBlcmBdOiB7XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfSR7Y29tcG9uZW50Q2xzfS1ib3JkZXJlZGBdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVGl0bGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfS10aXRsZWBdOiB7XG4gICAgICAgICAgYm9yZGVyOiB0YWJsZUJvcmRlcixcbiAgICAgICAgICBib3JkZXJCb3R0b206IDBcbiAgICAgICAgfSxcbiAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb250ZW50ID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgW2A+ICR7Y29tcG9uZW50Q2xzfS1jb250YWluZXJgXToge1xuICAgICAgICAgIGJvcmRlcklubGluZVN0YXJ0OiB0YWJsZUJvcmRlcixcbiAgICAgICAgICBib3JkZXJUb3A6IHRhYmxlQm9yZGVyLFxuICAgICAgICAgIFtgXG4gICAgICAgICAgICA+ICR7Y29tcG9uZW50Q2xzfS1jb250ZW50LFxuICAgICAgICAgICAgPiAke2NvbXBvbmVudENsc30taGVhZGVyLFxuICAgICAgICAgICAgPiAke2NvbXBvbmVudENsc30tYm9keSxcbiAgICAgICAgICAgID4gJHtjb21wb25lbnRDbHN9LXN1bW1hcnlcbiAgICAgICAgICBgXToge1xuICAgICAgICAgICAgJz4gdGFibGUnOiB7XG4gICAgICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENlbGwgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgICAgICAgW2BcbiAgICAgICAgICAgICAgICA+IHRoZWFkID4gdHIgPiB0aCxcbiAgICAgICAgICAgICAgICA+IHRoZWFkID4gdHIgPiB0ZCxcbiAgICAgICAgICAgICAgICA+IHRib2R5ID4gdHIgPiB0aCxcbiAgICAgICAgICAgICAgICA+IHRib2R5ID4gdHIgPiB0ZCxcbiAgICAgICAgICAgICAgICA+IHRmb290ID4gdHIgPiB0aCxcbiAgICAgICAgICAgICAgICA+IHRmb290ID4gdHIgPiB0ZFxuICAgICAgICAgICAgICBgXToge1xuICAgICAgICAgICAgICAgIGJvcmRlcklubGluZUVuZDogdGFibGVCb3JkZXJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSBIZWFkZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgICAgICAgICAnPiB0aGVhZCc6IHtcbiAgICAgICAgICAgICAgICAnPiB0cjpub3QoOmxhc3QtY2hpbGQpID4gdGgnOiB7XG4gICAgICAgICAgICAgICAgICBib3JkZXJCb3R0b206IHRhYmxlQm9yZGVyXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnPiB0ciA+IHRoOjpiZWZvcmUnOiB7XG4gICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCAhaW1wb3J0YW50J1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgLy8gRml4ZWQgcmlnaHQgc2hvdWxkIHByb3ZpZGVzIGFkZGl0aW9uYWwgYm9yZGVyXG4gICAgICAgICAgICAgIFtgXG4gICAgICAgICAgICAgICAgPiB0aGVhZCA+IHRyLFxuICAgICAgICAgICAgICAgID4gdGJvZHkgPiB0cixcbiAgICAgICAgICAgICAgICA+IHRmb290ID4gdHJcbiAgICAgICAgICAgICAgYF06IHtcbiAgICAgICAgICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWNlbGwtZml4LXJpZ2h0LWZpcnN0OjphZnRlcmBdOiB7XG4gICAgICAgICAgICAgICAgICBib3JkZXJJbmxpbmVFbmQ6IHRhYmxlQm9yZGVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBhbmRhYmxlID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgICAgICAgIFtgXG4gICAgICAgICAgICAgICAgPiB0Ym9keSA+IHRyID4gdGgsXG4gICAgICAgICAgICAgICAgPiB0Ym9keSA+IHRyID4gdGRcbiAgICAgICAgICAgICAgYF06IHtcbiAgICAgICAgICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWV4cGFuZGVkLXJvdy1maXhlZGBdOiB7XG4gICAgICAgICAgICAgICAgICBtYXJnaW46IGAkeygwLCBfY3NzaW5qcy51bml0KShjYWxjKHRhYmxlUGFkZGluZ1ZlcnRpY2FsKS5tdWwoLTEpLmVxdWFsKCkpfSAkeygwLCBfY3NzaW5qcy51bml0KShjYWxjKGNhbGModGFibGVQYWRkaW5nSG9yaXpvbnRhbCkuYWRkKGxpbmVXaWR0aCkpLm11bCgtMSkuZXF1YWwoKSl9YCxcbiAgICAgICAgICAgICAgICAgICcmOjphZnRlcic6IHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICAgICAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IGxpbmVXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXJJbmxpbmVFbmQ6IHRhYmxlQm9yZGVyLFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiAnXCJcIidcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2Nyb2xsID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LXNjcm9sbC1ob3Jpem9udGFsYF06IHtcbiAgICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWNvbnRhaW5lciA+ICR7Y29tcG9uZW50Q2xzfS1ib2R5YF06IHtcbiAgICAgICAgICAgICc+IHRhYmxlID4gdGJvZHknOiB7XG4gICAgICAgICAgICAgIFtgXG4gICAgICAgICAgICAgICAgPiB0ciR7Y29tcG9uZW50Q2xzfS1leHBhbmRlZC1yb3csXG4gICAgICAgICAgICAgICAgPiB0ciR7Y29tcG9uZW50Q2xzfS1wbGFjZWhvbGRlclxuICAgICAgICAgICAgICBgXToge1xuICAgICAgICAgICAgICAgICc+IHRoLCA+IHRkJzoge1xuICAgICAgICAgICAgICAgICAgYm9yZGVySW5saW5lRW5kOiAwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBnZXRTaXplQm9yZGVyU3R5bGUoJ21pZGRsZScsIHRva2VuLnRhYmxlUGFkZGluZ1ZlcnRpY2FsTWlkZGxlLCB0b2tlbi50YWJsZVBhZGRpbmdIb3Jpem9udGFsTWlkZGxlKSksIGdldFNpemVCb3JkZXJTdHlsZSgnc21hbGwnLCB0b2tlbi50YWJsZVBhZGRpbmdWZXJ0aWNhbFNtYWxsLCB0b2tlbi50YWJsZVBhZGRpbmdIb3Jpem9udGFsU21hbGwpKSwge1xuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEZvb3RlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIFtgPiAke2NvbXBvbmVudENsc30tZm9vdGVyYF06IHtcbiAgICAgICAgICBib3JkZXI6IHRhYmxlQm9yZGVyLFxuICAgICAgICAgIGJvcmRlclRvcDogMFxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gTmVzdGVkID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNlbGxgXToge1xuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jb250YWluZXI6Zmlyc3QtY2hpbGRgXToge1xuICAgICAgICAgIC8vIDpmaXJzdC1jaGlsZCB0byBhdm9pZCB0aGUgY2FzZSB3aGVuIGJvcmRlcmVkIGFuZCB0aXRsZSBpcyBzZXRcbiAgICAgICAgICBib3JkZXJUb3A6IDBcbiAgICAgICAgfSxcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMzU1NzdcbiAgICAgICAgJyYtc2Nyb2xsYmFyOm5vdChbcm93c3Bhbl0pJzoge1xuICAgICAgICAgIGJveFNoYWRvdzogYDAgJHsoMCwgX2Nzc2luanMudW5pdCkobGluZVdpZHRoKX0gMCAkeygwLCBfY3NzaW5qcy51bml0KShsaW5lV2lkdGgpfSAke3RhYmxlSGVhZGVyQmd9YFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tYm9yZGVyZWQgJHtjb21wb25lbnRDbHN9LWNlbGwtc2Nyb2xsYmFyYF06IHtcbiAgICAgICAgYm9yZGVySW5saW5lRW5kOiB0YWJsZUJvcmRlclxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZW5Cb3JkZXJlZFN0eWxlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9zdHlsZSA9IHJlcXVpcmUoXCIuLi8uLi9zdHlsZVwiKTtcbmNvbnN0IGdlbkVsbGlwc2lzU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30tY2VsbC1lbGxpcHNpc2BdOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIF9zdHlsZS50ZXh0RWxsaXBzaXMpLCB7XG4gICAgICAgIHdvcmRCcmVhazogJ2tlZXAtYWxsJyxcbiAgICAgICAgLy8gRml4ZWQgZmlyc3Qgb3IgbGFzdCBzaG91bGQgc3BlY2lhbCBwcm9jZXNzXG4gICAgICAgIFtgXG4gICAgICAgICAgJiR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1sZWZ0LWxhc3QsXG4gICAgICAgICAgJiR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1yaWdodC1maXJzdFxuICAgICAgICBgXToge1xuICAgICAgICAgIG92ZXJmbG93OiAndmlzaWJsZScsXG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tY2VsbC1jb250ZW50YF06IHtcbiAgICAgICAgICAgIGRpc3BsYXk6ICdibG9jaycsXG4gICAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgICAgICB0ZXh0T3ZlcmZsb3c6ICdlbGxpcHNpcydcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNvbHVtbi10aXRsZWBdOiB7XG4gICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgIHRleHRPdmVyZmxvdzogJ2VsbGlwc2lzJyxcbiAgICAgICAgICB3b3JkQnJlYWs6ICdrZWVwLWFsbCdcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH07XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gZ2VuRWxsaXBzaXNTdHlsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT0gUGxhY2Vob2xkZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbmNvbnN0IGdlbkVtcHR5U3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30tdGJvZHkgPiB0ciR7Y29tcG9uZW50Q2xzfS1wbGFjZWhvbGRlcmBdOiB7XG4gICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgIGNvbG9yOiB0b2tlbi5jb2xvclRleHREaXNhYmxlZCxcbiAgICAgICAgW2BcbiAgICAgICAgICAmOmhvdmVyID4gdGgsXG4gICAgICAgICAgJjpob3ZlciA+IHRkLFxuICAgICAgICBgXToge1xuICAgICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yQmdDb250YWluZXJcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZW5FbXB0eVN0eWxlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9jc3NpbmpzID0gcmVxdWlyZShcIkBhbnQtZGVzaWduL2Nzc2luanNcIik7XG52YXIgX3N0eWxlID0gcmVxdWlyZShcIi4uLy4uL3N0eWxlXCIpO1xuY29uc3QgZ2VuRXhwYW5kU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgYW50Q2xzLFxuICAgIG1vdGlvbkR1cmF0aW9uU2xvdyxcbiAgICBsaW5lV2lkdGgsXG4gICAgcGFkZGluZ1hTLFxuICAgIGxpbmVUeXBlLFxuICAgIHRhYmxlQm9yZGVyQ29sb3IsXG4gICAgdGFibGVFeHBhbmRJY29uQmcsXG4gICAgdGFibGVFeHBhbmRDb2x1bW5XaWR0aCxcbiAgICBib3JkZXJSYWRpdXMsXG4gICAgdGFibGVQYWRkaW5nVmVydGljYWwsXG4gICAgdGFibGVQYWRkaW5nSG9yaXpvbnRhbCxcbiAgICB0YWJsZUV4cGFuZGVkUm93QmcsXG4gICAgcGFkZGluZ1hYUyxcbiAgICBleHBhbmRJY29uTWFyZ2luVG9wLFxuICAgIGV4cGFuZEljb25TaXplLFxuICAgIGV4cGFuZEljb25IYWxmSW5uZXIsXG4gICAgZXhwYW5kSWNvblNjYWxlLFxuICAgIGNhbGNcbiAgfSA9IHRva2VuO1xuICBjb25zdCB0YWJsZUJvcmRlciA9IGAkeygwLCBfY3NzaW5qcy51bml0KShsaW5lV2lkdGgpfSAke2xpbmVUeXBlfSAke3RhYmxlQm9yZGVyQ29sb3J9YDtcbiAgY29uc3QgZXhwYW5kSWNvbkxpbmVPZmZzZXQgPSBjYWxjKHBhZGRpbmdYWFMpLnN1YihsaW5lV2lkdGgpLmVxdWFsKCk7XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30td3JhcHBlcmBdOiB7XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1leHBhbmQtaWNvbi1jb2xgXToge1xuICAgICAgICB3aWR0aDogdGFibGVFeHBhbmRDb2x1bW5XaWR0aFxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXJvdy1leHBhbmQtaWNvbi1jZWxsYF06IHtcbiAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tcm93LWV4cGFuZC1pY29uYF06IHtcbiAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgICAgICAgIGZsb2F0OiAnbm9uZScsXG4gICAgICAgICAgdmVydGljYWxBbGlnbjogJ3N1YidcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXJvdy1pbmRlbnRgXToge1xuICAgICAgICBoZWlnaHQ6IDEsXG4gICAgICAgIGZsb2F0OiAnbGVmdCdcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1yb3ctZXhwYW5kLWljb25gXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoMCwgX3N0eWxlLm9wZXJhdGlvblVuaXQpKHRva2VuKSksIHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgIGZsb2F0OiAnbGVmdCcsXG4gICAgICAgIHdpZHRoOiBleHBhbmRJY29uU2l6ZSxcbiAgICAgICAgaGVpZ2h0OiBleHBhbmRJY29uU2l6ZSxcbiAgICAgICAgY29sb3I6ICdpbmhlcml0JyxcbiAgICAgICAgbGluZUhlaWdodDogKDAsIF9jc3NpbmpzLnVuaXQpKGV4cGFuZEljb25TaXplKSxcbiAgICAgICAgYmFja2dyb3VuZDogdGFibGVFeHBhbmRJY29uQmcsXG4gICAgICAgIGJvcmRlcjogdGFibGVCb3JkZXIsXG4gICAgICAgIGJvcmRlclJhZGl1cyxcbiAgICAgICAgdHJhbnNmb3JtOiBgc2NhbGUoJHtleHBhbmRJY29uU2NhbGV9KWAsXG4gICAgICAgICcmOmZvY3VzLCAmOmhvdmVyLCAmOmFjdGl2ZSc6IHtcbiAgICAgICAgICBib3JkZXJDb2xvcjogJ2N1cnJlbnRjb2xvcidcbiAgICAgICAgfSxcbiAgICAgICAgJyY6OmJlZm9yZSwgJjo6YWZ0ZXInOiB7XG4gICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgYmFja2dyb3VuZDogJ2N1cnJlbnRjb2xvcicsXG4gICAgICAgICAgdHJhbnNpdGlvbjogYHRyYW5zZm9ybSAke21vdGlvbkR1cmF0aW9uU2xvd30gZWFzZS1vdXRgLFxuICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJ1xuICAgICAgICB9LFxuICAgICAgICAnJjo6YmVmb3JlJzoge1xuICAgICAgICAgIHRvcDogZXhwYW5kSWNvbkhhbGZJbm5lcixcbiAgICAgICAgICBpbnNldElubGluZUVuZDogZXhwYW5kSWNvbkxpbmVPZmZzZXQsXG4gICAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogZXhwYW5kSWNvbkxpbmVPZmZzZXQsXG4gICAgICAgICAgaGVpZ2h0OiBsaW5lV2lkdGhcbiAgICAgICAgfSxcbiAgICAgICAgJyY6OmFmdGVyJzoge1xuICAgICAgICAgIHRvcDogZXhwYW5kSWNvbkxpbmVPZmZzZXQsXG4gICAgICAgICAgYm90dG9tOiBleHBhbmRJY29uTGluZU9mZnNldCxcbiAgICAgICAgICBpbnNldElubGluZVN0YXJ0OiBleHBhbmRJY29uSGFsZklubmVyLFxuICAgICAgICAgIHdpZHRoOiBsaW5lV2lkdGgsXG4gICAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKDkwZGVnKSdcbiAgICAgICAgfSxcbiAgICAgICAgLy8gTW90aW9uIGVmZmVjdFxuICAgICAgICAnJi1jb2xsYXBzZWQ6OmJlZm9yZSc6IHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoLTE4MGRlZyknXG4gICAgICAgIH0sXG4gICAgICAgICcmLWNvbGxhcHNlZDo6YWZ0ZXInOiB7XG4gICAgICAgICAgdHJhbnNmb3JtOiAncm90YXRlKDBkZWcpJ1xuICAgICAgICB9LFxuICAgICAgICAnJi1zcGFjZWQnOiB7XG4gICAgICAgICAgJyY6OmJlZm9yZSwgJjo6YWZ0ZXInOiB7XG4gICAgICAgICAgICBkaXNwbGF5OiAnbm9uZScsXG4gICAgICAgICAgICBjb250ZW50OiAnbm9uZSdcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgYm9yZGVyOiAwLFxuICAgICAgICAgIHZpc2liaWxpdHk6ICdoaWRkZW4nXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tcm93LWluZGVudCArICR7Y29tcG9uZW50Q2xzfS1yb3ctZXhwYW5kLWljb25gXToge1xuICAgICAgICBtYXJnaW5Ub3A6IGV4cGFuZEljb25NYXJnaW5Ub3AsXG4gICAgICAgIG1hcmdpbklubGluZUVuZDogcGFkZGluZ1hTXG4gICAgICB9LFxuICAgICAgW2B0ciR7Y29tcG9uZW50Q2xzfS1leHBhbmRlZC1yb3dgXToge1xuICAgICAgICAnJiwgJjpob3Zlcic6IHtcbiAgICAgICAgICAnPiB0aCwgPiB0ZCc6IHtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IHRhYmxlRXhwYW5kZWRSb3dCZ1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMjU1NzNcbiAgICAgICAgW2Ake2FudENsc30tZGVzY3JpcHRpb25zLXZpZXdgXToge1xuICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICB0YWJsZToge1xuICAgICAgICAgICAgZmxleDogJ2F1dG8nLFxuICAgICAgICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIFdpdGggZml4ZWRcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWV4cGFuZGVkLXJvdy1maXhlZGBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICBtYXJnaW46IGAkeygwLCBfY3NzaW5qcy51bml0KShjYWxjKHRhYmxlUGFkZGluZ1ZlcnRpY2FsKS5tdWwoLTEpLmVxdWFsKCkpfSAkeygwLCBfY3NzaW5qcy51bml0KShjYWxjKHRhYmxlUGFkZGluZ0hvcml6b250YWwpLm11bCgtMSkuZXF1YWwoKSl9YCxcbiAgICAgICAgcGFkZGluZzogYCR7KDAsIF9jc3NpbmpzLnVuaXQpKHRhYmxlUGFkZGluZ1ZlcnRpY2FsKX0gJHsoMCwgX2Nzc2luanMudW5pdCkodGFibGVQYWRkaW5nSG9yaXpvbnRhbCl9YFxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZW5FeHBhbmRTdHlsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xudmFyIF9zdHlsZSA9IHJlcXVpcmUoXCIuLi8uLi9zdHlsZVwiKTtcbmNvbnN0IGdlbkZpbHRlclN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIGFudENscyxcbiAgICBpY29uQ2xzLFxuICAgIHRhYmxlRmlsdGVyRHJvcGRvd25XaWR0aCxcbiAgICB0YWJsZUZpbHRlckRyb3Bkb3duU2VhcmNoV2lkdGgsXG4gICAgcGFkZGluZ1hYUyxcbiAgICBwYWRkaW5nWFMsXG4gICAgY29sb3JUZXh0LFxuICAgIGxpbmVXaWR0aCxcbiAgICBsaW5lVHlwZSxcbiAgICB0YWJsZUJvcmRlckNvbG9yLFxuICAgIGhlYWRlckljb25Db2xvcixcbiAgICBmb250U2l6ZVNNLFxuICAgIHRhYmxlUGFkZGluZ0hvcml6b250YWwsXG4gICAgYm9yZGVyUmFkaXVzLFxuICAgIG1vdGlvbkR1cmF0aW9uU2xvdyxcbiAgICBjb2xvckljb24sXG4gICAgY29sb3JQcmltYXJ5LFxuICAgIHRhYmxlSGVhZGVyRmlsdGVyQWN0aXZlQmcsXG4gICAgY29sb3JUZXh0RGlzYWJsZWQsXG4gICAgdGFibGVGaWx0ZXJEcm9wZG93bkJnLFxuICAgIHRhYmxlRmlsdGVyRHJvcGRvd25IZWlnaHQsXG4gICAgY29udHJvbEl0ZW1CZ0hvdmVyLFxuICAgIGNvbnRyb2xJdGVtQmdBY3RpdmUsXG4gICAgYm94U2hhZG93U2Vjb25kYXJ5LFxuICAgIGZpbHRlckRyb3Bkb3duTWVudUJnLFxuICAgIGNhbGNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBkcm9wZG93blByZWZpeENscyA9IGAke2FudENsc30tZHJvcGRvd25gO1xuICBjb25zdCB0YWJsZUZpbHRlckRyb3Bkb3duUHJlZml4Q2xzID0gYCR7Y29tcG9uZW50Q2xzfS1maWx0ZXItZHJvcGRvd25gO1xuICBjb25zdCB0cmVlUHJlZml4Q2xzID0gYCR7YW50Q2xzfS10cmVlYDtcbiAgY29uc3QgdGFibGVCb3JkZXIgPSBgJHsoMCwgX2Nzc2luanMudW5pdCkobGluZVdpZHRoKX0gJHtsaW5lVHlwZX0gJHt0YWJsZUJvcmRlckNvbG9yfWA7XG4gIHJldHVybiBbe1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30tZmlsdGVyLWNvbHVtbmBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWZpbHRlci10cmlnZ2VyYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgIG1hcmdpbkJsb2NrOiBjYWxjKHBhZGRpbmdYWFMpLm11bCgtMSkuZXF1YWwoKSxcbiAgICAgICAgbWFyZ2luSW5saW5lOiBgJHsoMCwgX2Nzc2luanMudW5pdCkocGFkZGluZ1hYUyl9ICR7KDAsIF9jc3NpbmpzLnVuaXQpKGNhbGModGFibGVQYWRkaW5nSG9yaXpvbnRhbCkuZGl2KDIpLm11bCgtMSkuZXF1YWwoKSl9YCxcbiAgICAgICAgcGFkZGluZzogYDAgJHsoMCwgX2Nzc2luanMudW5pdCkocGFkZGluZ1hYUyl9YCxcbiAgICAgICAgY29sb3I6IGhlYWRlckljb25Db2xvcixcbiAgICAgICAgZm9udFNpemU6IGZvbnRTaXplU00sXG4gICAgICAgIGJvcmRlclJhZGl1cyxcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgIHRyYW5zaXRpb246IGBhbGwgJHttb3Rpb25EdXJhdGlvblNsb3d9YCxcbiAgICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgICAgY29sb3I6IGNvbG9ySWNvbixcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB0YWJsZUhlYWRlckZpbHRlckFjdGl2ZUJnXG4gICAgICAgIH0sXG4gICAgICAgICcmLmFjdGl2ZSc6IHtcbiAgICAgICAgICBjb2xvcjogY29sb3JQcmltYXJ5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICAvLyBEcm9wZG93blxuICAgIFtgJHthbnRDbHN9LWRyb3Bkb3duYF06IHtcbiAgICAgIFt0YWJsZUZpbHRlckRyb3Bkb3duUHJlZml4Q2xzXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoMCwgX3N0eWxlLnJlc2V0Q29tcG9uZW50KSh0b2tlbikpLCB7XG4gICAgICAgIG1pbldpZHRoOiB0YWJsZUZpbHRlckRyb3Bkb3duV2lkdGgsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogdGFibGVGaWx0ZXJEcm9wZG93bkJnLFxuICAgICAgICBib3JkZXJSYWRpdXMsXG4gICAgICAgIGJveFNoYWRvdzogYm94U2hhZG93U2Vjb25kYXJ5LFxuICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICAgIC8vIFJlc2V0IG1lbnVcbiAgICAgICAgW2Ake2Ryb3Bkb3duUHJlZml4Q2xzfS1tZW51YF06IHtcbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80OTE2XG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTk1NDJcbiAgICAgICAgICBtYXhIZWlnaHQ6IHRhYmxlRmlsdGVyRHJvcGRvd25IZWlnaHQsXG4gICAgICAgICAgb3ZlcmZsb3dYOiAnaGlkZGVuJyxcbiAgICAgICAgICBib3JkZXI6IDAsXG4gICAgICAgICAgYm94U2hhZG93OiAnbm9uZScsXG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiAndW5zZXQnLFxuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogZmlsdGVyRHJvcGRvd25NZW51QmcsXG4gICAgICAgICAgJyY6ZW1wdHk6OmFmdGVyJzoge1xuICAgICAgICAgICAgZGlzcGxheTogJ2Jsb2NrJyxcbiAgICAgICAgICAgIHBhZGRpbmc6IGAkeygwLCBfY3NzaW5qcy51bml0KShwYWRkaW5nWFMpfSAwYCxcbiAgICAgICAgICAgIGNvbG9yOiBjb2xvclRleHREaXNhYmxlZCxcbiAgICAgICAgICAgIGZvbnRTaXplOiBmb250U2l6ZVNNLFxuICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGNvbnRlbnQ6ICdcIk5vdCBGb3VuZFwiJ1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW2Ake3RhYmxlRmlsdGVyRHJvcGRvd25QcmVmaXhDbHN9LXRyZWVgXToge1xuICAgICAgICAgIHBhZGRpbmdCbG9jazogYCR7KDAsIF9jc3NpbmpzLnVuaXQpKHBhZGRpbmdYUyl9IDBgLFxuICAgICAgICAgIHBhZGRpbmdJbmxpbmU6IHBhZGRpbmdYUyxcbiAgICAgICAgICBbdHJlZVByZWZpeENsc106IHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIFtgJHt0cmVlUHJlZml4Q2xzfS10cmVlbm9kZSAke3RyZWVQcmVmaXhDbHN9LW5vZGUtY29udGVudC13cmFwcGVyOmhvdmVyYF06IHtcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogY29udHJvbEl0ZW1CZ0hvdmVyXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYCR7dHJlZVByZWZpeENsc30tdHJlZW5vZGUtY2hlY2tib3gtY2hlY2tlZCAke3RyZWVQcmVmaXhDbHN9LW5vZGUtY29udGVudC13cmFwcGVyYF06IHtcbiAgICAgICAgICAgICcmLCAmOmhvdmVyJzoge1xuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IGNvbnRyb2xJdGVtQmdBY3RpdmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgJHt0YWJsZUZpbHRlckRyb3Bkb3duUHJlZml4Q2xzfS1zZWFyY2hgXToge1xuICAgICAgICAgIHBhZGRpbmc6IHBhZGRpbmdYUyxcbiAgICAgICAgICBib3JkZXJCb3R0b206IHRhYmxlQm9yZGVyLFxuICAgICAgICAgICcmLWlucHV0Jzoge1xuICAgICAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAgICAgbWluV2lkdGg6IHRhYmxlRmlsdGVyRHJvcGRvd25TZWFyY2hXaWR0aFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtpY29uQ2xzXToge1xuICAgICAgICAgICAgICBjb2xvcjogY29sb3JUZXh0RGlzYWJsZWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFtgJHt0YWJsZUZpbHRlckRyb3Bkb3duUHJlZml4Q2xzfS1jaGVja2FsbGBdOiB7XG4gICAgICAgICAgd2lkdGg6ICcxMDAlJyxcbiAgICAgICAgICBtYXJnaW5Cb3R0b206IHBhZGRpbmdYWFMsXG4gICAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IHBhZGRpbmdYWFNcbiAgICAgICAgfSxcbiAgICAgICAgLy8gT3BlcmF0aW9uXG4gICAgICAgIFtgJHt0YWJsZUZpbHRlckRyb3Bkb3duUHJlZml4Q2xzfS1idG5zYF06IHtcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJyxcbiAgICAgICAgICBwYWRkaW5nOiBgJHsoMCwgX2Nzc2luanMudW5pdCkoY2FsYyhwYWRkaW5nWFMpLnN1YihsaW5lV2lkdGgpLmVxdWFsKCkpfSAkeygwLCBfY3NzaW5qcy51bml0KShwYWRkaW5nWFMpfWAsXG4gICAgICAgICAgb3ZlcmZsb3c6ICdoaWRkZW4nLFxuICAgICAgICAgIGJvcmRlclRvcDogdGFibGVCb3JkZXJcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH0sXG4gIC8vIERyb3Bkb3duIE1lbnUgJiBTdWJNZW51XG4gIHtcbiAgICAvLyBzdWJtZW51IG9mIHRhYmxlIGZpbHRlciBkcm9wZG93blxuICAgIFtgJHthbnRDbHN9LWRyb3Bkb3duICR7dGFibGVGaWx0ZXJEcm9wZG93blByZWZpeENsc30sICR7dGFibGVGaWx0ZXJEcm9wZG93blByZWZpeENsc30tc3VibWVudWBdOiB7XG4gICAgICAvLyBDaGVja2JveFxuICAgICAgW2Ake2FudENsc30tY2hlY2tib3gtd3JhcHBlciArIHNwYW5gXToge1xuICAgICAgICBwYWRkaW5nSW5saW5lU3RhcnQ6IHBhZGRpbmdYUyxcbiAgICAgICAgY29sb3I6IGNvbG9yVGV4dFxuICAgICAgfSxcbiAgICAgICc+IHVsJzoge1xuICAgICAgICBtYXhIZWlnaHQ6ICdjYWxjKDEwMHZoIC0gMTMwcHgpJyxcbiAgICAgICAgb3ZlcmZsb3dYOiAnaGlkZGVuJyxcbiAgICAgICAgb3ZlcmZsb3dZOiAnYXV0bydcbiAgICAgIH1cbiAgICB9XG4gIH1dO1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGdlbkZpbHRlclN0eWxlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuY29uc3QgZ2VuRml4ZWRTdHlsZSA9IHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbXBvbmVudENscyxcbiAgICBsaW5lV2lkdGgsXG4gICAgY29sb3JTcGxpdCxcbiAgICBtb3Rpb25EdXJhdGlvblNsb3csXG4gICAgekluZGV4VGFibGVGaXhlZCxcbiAgICB0YWJsZUJnLFxuICAgIHpJbmRleFRhYmxlU3RpY2t5LFxuICAgIGNhbGNcbiAgfSA9IHRva2VuO1xuICBjb25zdCBzaGFkb3dDb2xvciA9IGNvbG9yU3BsaXQ7XG4gIC8vIEZvbGxvdyBzdHlsZSBpcyBtYWdpYyBvZiBzaGFkb3cgd2hpY2ggc2hvdWxkIG5vdCBmb2xsb3cgdG9rZW46XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30td3JhcHBlcmBdOiB7XG4gICAgICBbYFxuICAgICAgICAke2NvbXBvbmVudENsc30tY2VsbC1maXgtbGVmdCxcbiAgICAgICAgJHtjb21wb25lbnRDbHN9LWNlbGwtZml4LXJpZ2h0XG4gICAgICBgXToge1xuICAgICAgICBwb3NpdGlvbjogJ3N0aWNreSAhaW1wb3J0YW50JyxcbiAgICAgICAgekluZGV4OiB6SW5kZXhUYWJsZUZpeGVkLFxuICAgICAgICBiYWNrZ3JvdW5kOiB0YWJsZUJnXG4gICAgICB9LFxuICAgICAgW2BcbiAgICAgICAgJHtjb21wb25lbnRDbHN9LWNlbGwtZml4LWxlZnQtZmlyc3Q6OmFmdGVyLFxuICAgICAgICAke2NvbXBvbmVudENsc30tY2VsbC1maXgtbGVmdC1sYXN0OjphZnRlclxuICAgICAgYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgcmlnaHQ6IHtcbiAgICAgICAgICBfc2tpcF9jaGVja186IHRydWUsXG4gICAgICAgICAgdmFsdWU6IDBcbiAgICAgICAgfSxcbiAgICAgICAgYm90dG9tOiBjYWxjKGxpbmVXaWR0aCkubXVsKC0xKS5lcXVhbCgpLFxuICAgICAgICB3aWR0aDogMzAsXG4gICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMTAwJSknLFxuICAgICAgICB0cmFuc2l0aW9uOiBgYm94LXNoYWRvdyAke21vdGlvbkR1cmF0aW9uU2xvd31gLFxuICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNlbGwtZml4LWxlZnQtYWxsOjphZnRlcmBdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIFtgXG4gICAgICAgICR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1yaWdodC1maXJzdDo6YWZ0ZXIsXG4gICAgICAgICR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1yaWdodC1sYXN0OjphZnRlclxuICAgICAgYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgYm90dG9tOiBjYWxjKGxpbmVXaWR0aCkubXVsKC0xKS5lcXVhbCgpLFxuICAgICAgICBsZWZ0OiB7XG4gICAgICAgICAgX3NraXBfY2hlY2tfOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiAwXG4gICAgICAgIH0sXG4gICAgICAgIHdpZHRoOiAzMCxcbiAgICAgICAgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtMTAwJSknLFxuICAgICAgICB0cmFuc2l0aW9uOiBgYm94LXNoYWRvdyAke21vdGlvbkR1cmF0aW9uU2xvd31gLFxuICAgICAgICBjb250ZW50OiAnXCJcIicsXG4gICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWNvbnRhaW5lcmBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAnJjo6YmVmb3JlLCAmOjphZnRlcic6IHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICB0b3A6IDAsXG4gICAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAgIHpJbmRleDogY2FsYyh6SW5kZXhUYWJsZVN0aWNreSkuYWRkKDEpLmVxdWFsKHtcbiAgICAgICAgICAgIHVuaXQ6IGZhbHNlXG4gICAgICAgICAgfSksXG4gICAgICAgICAgd2lkdGg6IDMwLFxuICAgICAgICAgIHRyYW5zaXRpb246IGBib3gtc2hhZG93ICR7bW90aW9uRHVyYXRpb25TbG93fWAsXG4gICAgICAgICAgY29udGVudDogJ1wiXCInLFxuICAgICAgICAgIHBvaW50ZXJFdmVudHM6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICAnJjo6YmVmb3JlJzoge1xuICAgICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IDBcbiAgICAgICAgfSxcbiAgICAgICAgJyY6OmFmdGVyJzoge1xuICAgICAgICAgIGluc2V0SW5saW5lRW5kOiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1waW5nLWxlZnRgXToge1xuICAgICAgICBbYCY6bm90KCR7Y29tcG9uZW50Q2xzfS1oYXMtZml4LWxlZnQpICR7Y29tcG9uZW50Q2xzfS1jb250YWluZXI6OmJlZm9yZWBdOiB7XG4gICAgICAgICAgYm94U2hhZG93OiBgaW5zZXQgMTBweCAwIDhweCAtOHB4ICR7c2hhZG93Q29sb3J9YFxuICAgICAgICB9LFxuICAgICAgICBbYFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1sZWZ0LWZpcnN0OjphZnRlcixcbiAgICAgICAgICAke2NvbXBvbmVudENsc30tY2VsbC1maXgtbGVmdC1sYXN0OjphZnRlclxuICAgICAgICBgXToge1xuICAgICAgICAgIGJveFNoYWRvdzogYGluc2V0IDEwcHggMCA4cHggLThweCAke3NoYWRvd0NvbG9yfWBcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tY2VsbC1maXgtbGVmdC1sYXN0OjpiZWZvcmVgXToge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50ICFpbXBvcnRhbnQnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1waW5nLXJpZ2h0YF06IHtcbiAgICAgICAgW2AmOm5vdCgke2NvbXBvbmVudENsc30taGFzLWZpeC1yaWdodCkgJHtjb21wb25lbnRDbHN9LWNvbnRhaW5lcjo6YWZ0ZXJgXToge1xuICAgICAgICAgIGJveFNoYWRvdzogYGluc2V0IC0xMHB4IDAgOHB4IC04cHggJHtzaGFkb3dDb2xvcn1gXG4gICAgICAgIH0sXG4gICAgICAgIFtgXG4gICAgICAgICAgJHtjb21wb25lbnRDbHN9LWNlbGwtZml4LXJpZ2h0LWZpcnN0OjphZnRlcixcbiAgICAgICAgICAke2NvbXBvbmVudENsc30tY2VsbC1maXgtcmlnaHQtbGFzdDo6YWZ0ZXJcbiAgICAgICAgYF06IHtcbiAgICAgICAgICBib3hTaGFkb3c6IGBpbnNldCAtMTBweCAwIDhweCAtOHB4ICR7c2hhZG93Q29sb3J9YFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gR2FwcGVkIGZpeGVkIENvbHVtbnMgZG8gbm90IHNob3cgdGhlIHNoYWRvd1xuICAgICAgW2Ake2NvbXBvbmVudENsc30tZml4ZWQtY29sdW1uLWdhcHBlZGBdOiB7XG4gICAgICAgIFtgXG4gICAgICAgICR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1sZWZ0LWZpcnN0OjphZnRlcixcbiAgICAgICAgJHtjb21wb25lbnRDbHN9LWNlbGwtZml4LWxlZnQtbGFzdDo6YWZ0ZXIsXG4gICAgICAgICR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1yaWdodC1maXJzdDo6YWZ0ZXIsXG4gICAgICAgICR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1yaWdodC1sYXN0OjphZnRlclxuICAgICAgYF06IHtcbiAgICAgICAgICBib3hTaGFkb3c6ICdub25lJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGdlbkZpeGVkU3R5bGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0ID0gcmVxdWlyZShcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvaW50ZXJvcFJlcXVpcmVEZWZhdWx0XCIpLmRlZmF1bHQ7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5wcmVwYXJlQ29tcG9uZW50VG9rZW4gPSBleHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2Nzc2luanMgPSByZXF1aXJlKFwiQGFudC1kZXNpZ24vY3NzaW5qc1wiKTtcbnZhciBfZmFzdENvbG9yID0gcmVxdWlyZShcIkBhbnQtZGVzaWduL2Zhc3QtY29sb3JcIik7XG52YXIgX3N0eWxlID0gcmVxdWlyZShcIi4uLy4uL3N0eWxlXCIpO1xudmFyIF9pbnRlcm5hbCA9IHJlcXVpcmUoXCIuLi8uLi90aGVtZS9pbnRlcm5hbFwiKTtcbnZhciBfYm9yZGVyZWQgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2JvcmRlcmVkXCIpKTtcbnZhciBfZWxsaXBzaXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VsbGlwc2lzXCIpKTtcbnZhciBfZW1wdHkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2VtcHR5XCIpKTtcbnZhciBfZXhwYW5kID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9leHBhbmRcIikpO1xudmFyIF9maWx0ZXIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL2ZpbHRlclwiKSk7XG52YXIgX2ZpeGVkID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9maXhlZFwiKSk7XG52YXIgX3BhZ2luYXRpb24gPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3BhZ2luYXRpb25cIikpO1xudmFyIF9yYWRpdXMgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3JhZGl1c1wiKSk7XG52YXIgX3J0bCA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQocmVxdWlyZShcIi4vcnRsXCIpKTtcbnZhciBfc2VsZWN0aW9uID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zZWxlY3Rpb25cIikpO1xudmFyIF9zaXplID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zaXplXCIpKTtcbnZhciBfc29ydGVyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi9zb3J0ZXJcIikpO1xudmFyIF9zdGlja3kgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3N0aWNreVwiKSk7XG52YXIgX3N1bW1hcnkgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KHJlcXVpcmUoXCIuL3N1bW1hcnlcIikpO1xudmFyIF92aXJ0dWFsID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChyZXF1aXJlKFwiLi92aXJ0dWFsXCIpKTtcbmNvbnN0IGdlblRhYmxlU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgZm9udFdlaWdodFN0cm9uZyxcbiAgICB0YWJsZVBhZGRpbmdWZXJ0aWNhbCxcbiAgICB0YWJsZVBhZGRpbmdIb3Jpem9udGFsLFxuICAgIHRhYmxlRXhwYW5kQ29sdW1uV2lkdGgsXG4gICAgbGluZVdpZHRoLFxuICAgIGxpbmVUeXBlLFxuICAgIHRhYmxlQm9yZGVyQ29sb3IsXG4gICAgdGFibGVGb250U2l6ZSxcbiAgICB0YWJsZUJnLFxuICAgIHRhYmxlUmFkaXVzLFxuICAgIHRhYmxlSGVhZGVyVGV4dENvbG9yLFxuICAgIG1vdGlvbkR1cmF0aW9uTWlkLFxuICAgIHRhYmxlSGVhZGVyQmcsXG4gICAgdGFibGVIZWFkZXJDZWxsU3BsaXRDb2xvcixcbiAgICB0YWJsZUZvb3RlclRleHRDb2xvcixcbiAgICB0YWJsZUZvb3RlckJnLFxuICAgIGNhbGNcbiAgfSA9IHRva2VuO1xuICBjb25zdCB0YWJsZUJvcmRlciA9IGAkeygwLCBfY3NzaW5qcy51bml0KShsaW5lV2lkdGgpfSAke2xpbmVUeXBlfSAke3RhYmxlQm9yZGVyQ29sb3J9YDtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7XG4gICAgICBjbGVhcjogJ2JvdGgnLFxuICAgICAgbWF4V2lkdGg6ICcxMDAlJyxcbiAgICAgIC8vIGZpeCBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80NjE3N1xuICAgICAgWyctLXJjLXZpcnR1YWwtbGlzdC1zY3JvbGxiYXItYmcnXTogdG9rZW4udGFibGVTY3JvbGxCZ1xuICAgIH0sICgwLCBfc3R5bGUuY2xlYXJGaXgpKCkpLCB7XG4gICAgICBbY29tcG9uZW50Q2xzXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoMCwgX3N0eWxlLnJlc2V0Q29tcG9uZW50KSh0b2tlbikpLCB7XG4gICAgICAgIGZvbnRTaXplOiB0YWJsZUZvbnRTaXplLFxuICAgICAgICBiYWNrZ3JvdW5kOiB0YWJsZUJnLFxuICAgICAgICBib3JkZXJSYWRpdXM6IGAkeygwLCBfY3NzaW5qcy51bml0KSh0YWJsZVJhZGl1cyl9ICR7KDAsIF9jc3NpbmpzLnVuaXQpKHRhYmxlUmFkaXVzKX0gMCAwYCxcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNDc0ODZcbiAgICAgICAgc2Nyb2xsYmFyQ29sb3I6IGAke3Rva2VuLnRhYmxlU2Nyb2xsVGh1bWJCZ30gJHt0b2tlbi50YWJsZVNjcm9sbEJnfWBcbiAgICAgIH0pLFxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMTc2MTFcbiAgICAgIHRhYmxlOiB7XG4gICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgIHRleHRBbGlnbjogJ3N0YXJ0JyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiBgJHsoMCwgX2Nzc2luanMudW5pdCkodGFibGVSYWRpdXMpfSAkeygwLCBfY3NzaW5qcy51bml0KSh0YWJsZVJhZGl1cyl9IDAgMGAsXG4gICAgICAgIGJvcmRlckNvbGxhcHNlOiAnc2VwYXJhdGUnLFxuICAgICAgICBib3JkZXJTcGFjaW5nOiAwXG4gICAgICB9LFxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ2VsbCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgXG4gICAgICAgICAgJHtjb21wb25lbnRDbHN9LWNlbGwsXG4gICAgICAgICAgJHtjb21wb25lbnRDbHN9LXRoZWFkID4gdHIgPiB0aCxcbiAgICAgICAgICAke2NvbXBvbmVudENsc30tdGJvZHkgPiB0ciA+IHRoLFxuICAgICAgICAgICR7Y29tcG9uZW50Q2xzfS10Ym9keSA+IHRyID4gdGQsXG4gICAgICAgICAgdGZvb3QgPiB0ciA+IHRoLFxuICAgICAgICAgIHRmb290ID4gdHIgPiB0ZFxuICAgICAgICBgXToge1xuICAgICAgICBwb3NpdGlvbjogJ3JlbGF0aXZlJyxcbiAgICAgICAgcGFkZGluZzogYCR7KDAsIF9jc3NpbmpzLnVuaXQpKHRhYmxlUGFkZGluZ1ZlcnRpY2FsKX0gJHsoMCwgX2Nzc2luanMudW5pdCkodGFibGVQYWRkaW5nSG9yaXpvbnRhbCl9YCxcbiAgICAgICAgb3ZlcmZsb3dXcmFwOiAnYnJlYWstd29yZCdcbiAgICAgIH0sXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IFRpdGxlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS10aXRsZWBdOiB7XG4gICAgICAgIHBhZGRpbmc6IGAkeygwLCBfY3NzaW5qcy51bml0KSh0YWJsZVBhZGRpbmdWZXJ0aWNhbCl9ICR7KDAsIF9jc3NpbmpzLnVuaXQpKHRhYmxlUGFkZGluZ0hvcml6b250YWwpfWBcbiAgICAgIH0sXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEhlYWRlciA9PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS10aGVhZGBdOiB7XG4gICAgICAgIFtgXG4gICAgICAgICAgPiB0ciA+IHRoLFxuICAgICAgICAgID4gdHIgPiB0ZFxuICAgICAgICBgXToge1xuICAgICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICAgIGNvbG9yOiB0YWJsZUhlYWRlclRleHRDb2xvcixcbiAgICAgICAgICBmb250V2VpZ2h0OiBmb250V2VpZ2h0U3Ryb25nLFxuICAgICAgICAgIHRleHRBbGlnbjogJ3N0YXJ0JyxcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB0YWJsZUhlYWRlckJnLFxuICAgICAgICAgIGJvcmRlckJvdHRvbTogdGFibGVCb3JkZXIsXG4gICAgICAgICAgdHJhbnNpdGlvbjogYGJhY2tncm91bmQgJHttb3Rpb25EdXJhdGlvbk1pZH0gZWFzZWAsXG4gICAgICAgICAgXCImW2NvbHNwYW5dOm5vdChbY29sc3Bhbj0nMSddKVwiOiB7XG4gICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYCY6bm90KDpsYXN0LWNoaWxkKTpub3QoJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1jb2x1bW4pOm5vdCgke2NvbXBvbmVudENsc30tcm93LWV4cGFuZC1pY29uLWNlbGwpOm5vdChbY29sc3Bhbl0pOjpiZWZvcmVgXToge1xuICAgICAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICB0b3A6ICc1MCUnLFxuICAgICAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IDAsXG4gICAgICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgICAgIGhlaWdodDogJzEuNmVtJyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGFibGVIZWFkZXJDZWxsU3BsaXRDb2xvcixcbiAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTUwJSknLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogYGJhY2tncm91bmQtY29sb3IgJHttb3Rpb25EdXJhdGlvbk1pZH1gLFxuICAgICAgICAgICAgY29udGVudDogJ1wiXCInXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnPiB0cjpub3QoOmxhc3QtY2hpbGQpID4gdGhbY29sc3Bhbl0nOiB7XG4gICAgICAgICAgYm9yZGVyQm90dG9tOiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IEJvZHkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tdGJvZHlgXToge1xuICAgICAgICAnPiB0cic6IHtcbiAgICAgICAgICAnPiB0aCwgPiB0ZCc6IHtcbiAgICAgICAgICAgIHRyYW5zaXRpb246IGBiYWNrZ3JvdW5kICR7bW90aW9uRHVyYXRpb25NaWR9LCBib3JkZXItY29sb3IgJHttb3Rpb25EdXJhdGlvbk1pZH1gLFxuICAgICAgICAgICAgYm9yZGVyQm90dG9tOiB0YWJsZUJvcmRlcixcbiAgICAgICAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT0gTmVzdCBUYWJsZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgICAgICAgIFtgXG4gICAgICAgICAgICAgID4gJHtjb21wb25lbnRDbHN9LXdyYXBwZXI6b25seS1jaGlsZCxcbiAgICAgICAgICAgICAgPiAke2NvbXBvbmVudENsc30tZXhwYW5kZWQtcm93LWZpeGVkID4gJHtjb21wb25lbnRDbHN9LXdyYXBwZXI6b25seS1jaGlsZFxuICAgICAgICAgICAgYF06IHtcbiAgICAgICAgICAgICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgICAgICAgICAgICBtYXJnaW5CbG9jazogKDAsIF9jc3NpbmpzLnVuaXQpKGNhbGModGFibGVQYWRkaW5nVmVydGljYWwpLm11bCgtMSkuZXF1YWwoKSksXG4gICAgICAgICAgICAgICAgbWFyZ2luSW5saW5lOiBgJHsoMCwgX2Nzc2luanMudW5pdCkoY2FsYyh0YWJsZUV4cGFuZENvbHVtbldpZHRoKS5zdWIodGFibGVQYWRkaW5nSG9yaXpvbnRhbCkuZXF1YWwoKSl9XG4gICAgICAgICAgICAgICAgJHsoMCwgX2Nzc2luanMudW5pdCkoY2FsYyh0YWJsZVBhZGRpbmdIb3Jpem9udGFsKS5tdWwoLTEpLmVxdWFsKCkpfWAsXG4gICAgICAgICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tdGJvZHkgPiB0cjpsYXN0LWNoaWxkID4gdGRgXToge1xuICAgICAgICAgICAgICAgICAgYm9yZGVyQm90dG9tV2lkdGg6IDAsXG4gICAgICAgICAgICAgICAgICAnJjpmaXJzdC1jaGlsZCwgJjpsYXN0LWNoaWxkJzoge1xuICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IDBcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICc+IHRoJzoge1xuICAgICAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgICAgICBjb2xvcjogdGFibGVIZWFkZXJUZXh0Q29sb3IsXG4gICAgICAgICAgICBmb250V2VpZ2h0OiBmb250V2VpZ2h0U3Ryb25nLFxuICAgICAgICAgICAgdGV4dEFsaWduOiAnc3RhcnQnLFxuICAgICAgICAgICAgYmFja2dyb3VuZDogdGFibGVIZWFkZXJCZyxcbiAgICAgICAgICAgIGJvcmRlckJvdHRvbTogdGFibGVCb3JkZXIsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBgYmFja2dyb3VuZCAke21vdGlvbkR1cmF0aW9uTWlkfSBlYXNlYFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT0gRm9vdGVyID09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWZvb3RlcmBdOiB7XG4gICAgICAgIHBhZGRpbmc6IGAkeygwLCBfY3NzaW5qcy51bml0KSh0YWJsZVBhZGRpbmdWZXJ0aWNhbCl9ICR7KDAsIF9jc3NpbmpzLnVuaXQpKHRhYmxlUGFkZGluZ0hvcml6b250YWwpfWAsXG4gICAgICAgIGNvbG9yOiB0YWJsZUZvb3RlclRleHRDb2xvcixcbiAgICAgICAgYmFja2dyb3VuZDogdGFibGVGb290ZXJCZ1xuICAgICAgfVxuICAgIH0pXG4gIH07XG59O1xuY29uc3QgcHJlcGFyZUNvbXBvbmVudFRva2VuID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29sb3JGaWxsQWx0ZXIsXG4gICAgY29sb3JCZ0NvbnRhaW5lcixcbiAgICBjb2xvclRleHRIZWFkaW5nLFxuICAgIGNvbG9yRmlsbFNlY29uZGFyeSxcbiAgICBjb2xvckZpbGxDb250ZW50LFxuICAgIGNvbnRyb2xJdGVtQmdBY3RpdmUsXG4gICAgY29udHJvbEl0ZW1CZ0FjdGl2ZUhvdmVyLFxuICAgIHBhZGRpbmcsXG4gICAgcGFkZGluZ1NNLFxuICAgIHBhZGRpbmdYUyxcbiAgICBjb2xvckJvcmRlclNlY29uZGFyeSxcbiAgICBib3JkZXJSYWRpdXNMRyxcbiAgICBjb250cm9sSGVpZ2h0LFxuICAgIGNvbG9yVGV4dFBsYWNlaG9sZGVyLFxuICAgIGZvbnRTaXplLFxuICAgIGZvbnRTaXplU00sXG4gICAgbGluZUhlaWdodCxcbiAgICBsaW5lV2lkdGgsXG4gICAgY29sb3JJY29uLFxuICAgIGNvbG9ySWNvbkhvdmVyLFxuICAgIG9wYWNpdHlMb2FkaW5nLFxuICAgIGNvbnRyb2xJbnRlcmFjdGl2ZVNpemVcbiAgfSA9IHRva2VuO1xuICBjb25zdCBjb2xvckZpbGxTZWNvbmRhcnlTb2xpZCA9IG5ldyBfZmFzdENvbG9yLkZhc3RDb2xvcihjb2xvckZpbGxTZWNvbmRhcnkpLm9uQmFja2dyb3VuZChjb2xvckJnQ29udGFpbmVyKS50b0hleFN0cmluZygpO1xuICBjb25zdCBjb2xvckZpbGxDb250ZW50U29saWQgPSBuZXcgX2Zhc3RDb2xvci5GYXN0Q29sb3IoY29sb3JGaWxsQ29udGVudCkub25CYWNrZ3JvdW5kKGNvbG9yQmdDb250YWluZXIpLnRvSGV4U3RyaW5nKCk7XG4gIGNvbnN0IGNvbG9yRmlsbEFsdGVyU29saWQgPSBuZXcgX2Zhc3RDb2xvci5GYXN0Q29sb3IoY29sb3JGaWxsQWx0ZXIpLm9uQmFja2dyb3VuZChjb2xvckJnQ29udGFpbmVyKS50b0hleFN0cmluZygpO1xuICBjb25zdCBiYXNlQ29sb3JBY3Rpb24gPSBuZXcgX2Zhc3RDb2xvci5GYXN0Q29sb3IoY29sb3JJY29uKTtcbiAgY29uc3QgYmFzZUNvbG9yQWN0aW9uSG92ZXIgPSBuZXcgX2Zhc3RDb2xvci5GYXN0Q29sb3IoY29sb3JJY29uSG92ZXIpO1xuICBjb25zdCBleHBhbmRJY29uSGFsZklubmVyID0gY29udHJvbEludGVyYWN0aXZlU2l6ZSAvIDIgLSBsaW5lV2lkdGg7XG4gIGNvbnN0IGV4cGFuZEljb25TaXplID0gZXhwYW5kSWNvbkhhbGZJbm5lciAqIDIgKyBsaW5lV2lkdGggKiAzO1xuICByZXR1cm4ge1xuICAgIGhlYWRlckJnOiBjb2xvckZpbGxBbHRlclNvbGlkLFxuICAgIGhlYWRlckNvbG9yOiBjb2xvclRleHRIZWFkaW5nLFxuICAgIGhlYWRlclNvcnRBY3RpdmVCZzogY29sb3JGaWxsU2Vjb25kYXJ5U29saWQsXG4gICAgaGVhZGVyU29ydEhvdmVyQmc6IGNvbG9yRmlsbENvbnRlbnRTb2xpZCxcbiAgICBib2R5U29ydEJnOiBjb2xvckZpbGxBbHRlclNvbGlkLFxuICAgIHJvd0hvdmVyQmc6IGNvbG9yRmlsbEFsdGVyU29saWQsXG4gICAgcm93U2VsZWN0ZWRCZzogY29udHJvbEl0ZW1CZ0FjdGl2ZSxcbiAgICByb3dTZWxlY3RlZEhvdmVyQmc6IGNvbnRyb2xJdGVtQmdBY3RpdmVIb3ZlcixcbiAgICByb3dFeHBhbmRlZEJnOiBjb2xvckZpbGxBbHRlcixcbiAgICBjZWxsUGFkZGluZ0Jsb2NrOiBwYWRkaW5nLFxuICAgIGNlbGxQYWRkaW5nSW5saW5lOiBwYWRkaW5nLFxuICAgIGNlbGxQYWRkaW5nQmxvY2tNRDogcGFkZGluZ1NNLFxuICAgIGNlbGxQYWRkaW5nSW5saW5lTUQ6IHBhZGRpbmdYUyxcbiAgICBjZWxsUGFkZGluZ0Jsb2NrU006IHBhZGRpbmdYUyxcbiAgICBjZWxsUGFkZGluZ0lubGluZVNNOiBwYWRkaW5nWFMsXG4gICAgYm9yZGVyQ29sb3I6IGNvbG9yQm9yZGVyU2Vjb25kYXJ5LFxuICAgIGhlYWRlckJvcmRlclJhZGl1czogYm9yZGVyUmFkaXVzTEcsXG4gICAgZm9vdGVyQmc6IGNvbG9yRmlsbEFsdGVyU29saWQsXG4gICAgZm9vdGVyQ29sb3I6IGNvbG9yVGV4dEhlYWRpbmcsXG4gICAgY2VsbEZvbnRTaXplOiBmb250U2l6ZSxcbiAgICBjZWxsRm9udFNpemVNRDogZm9udFNpemUsXG4gICAgY2VsbEZvbnRTaXplU006IGZvbnRTaXplLFxuICAgIGhlYWRlclNwbGl0Q29sb3I6IGNvbG9yQm9yZGVyU2Vjb25kYXJ5LFxuICAgIGZpeGVkSGVhZGVyU29ydEFjdGl2ZUJnOiBjb2xvckZpbGxTZWNvbmRhcnlTb2xpZCxcbiAgICBoZWFkZXJGaWx0ZXJIb3ZlckJnOiBjb2xvckZpbGxDb250ZW50LFxuICAgIGZpbHRlckRyb3Bkb3duTWVudUJnOiBjb2xvckJnQ29udGFpbmVyLFxuICAgIGZpbHRlckRyb3Bkb3duQmc6IGNvbG9yQmdDb250YWluZXIsXG4gICAgZXhwYW5kSWNvbkJnOiBjb2xvckJnQ29udGFpbmVyLFxuICAgIHNlbGVjdGlvbkNvbHVtbldpZHRoOiBjb250cm9sSGVpZ2h0LFxuICAgIHN0aWNreVNjcm9sbEJhckJnOiBjb2xvclRleHRQbGFjZWhvbGRlcixcbiAgICBzdGlja3lTY3JvbGxCYXJCb3JkZXJSYWRpdXM6IDEwMCxcbiAgICBleHBhbmRJY29uTWFyZ2luVG9wOiAoZm9udFNpemUgKiBsaW5lSGVpZ2h0IC0gbGluZVdpZHRoICogMykgLyAyIC0gTWF0aC5jZWlsKChmb250U2l6ZVNNICogMS40IC0gbGluZVdpZHRoICogMykgLyAyKSxcbiAgICBoZWFkZXJJY29uQ29sb3I6IGJhc2VDb2xvckFjdGlvbi5jbG9uZSgpLnNldEEoYmFzZUNvbG9yQWN0aW9uLmEgKiBvcGFjaXR5TG9hZGluZykudG9SZ2JTdHJpbmcoKSxcbiAgICBoZWFkZXJJY29uSG92ZXJDb2xvcjogYmFzZUNvbG9yQWN0aW9uSG92ZXIuY2xvbmUoKS5zZXRBKGJhc2VDb2xvckFjdGlvbkhvdmVyLmEgKiBvcGFjaXR5TG9hZGluZykudG9SZ2JTdHJpbmcoKSxcbiAgICBleHBhbmRJY29uSGFsZklubmVyLFxuICAgIGV4cGFuZEljb25TaXplLFxuICAgIGV4cGFuZEljb25TY2FsZTogY29udHJvbEludGVyYWN0aXZlU2l6ZSAvIGV4cGFuZEljb25TaXplXG4gIH07XG59O1xuZXhwb3J0cy5wcmVwYXJlQ29tcG9uZW50VG9rZW4gPSBwcmVwYXJlQ29tcG9uZW50VG9rZW47XG5jb25zdCB6SW5kZXhUYWJsZUZpeGVkID0gMjtcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFeHBvcnQgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSAoMCwgX2ludGVybmFsLmdlblN0eWxlSG9va3MpKCdUYWJsZScsIHRva2VuID0+IHtcbiAgY29uc3Qge1xuICAgIGNvbG9yVGV4dEhlYWRpbmcsXG4gICAgY29sb3JTcGxpdCxcbiAgICBjb2xvckJnQ29udGFpbmVyLFxuICAgIGNvbnRyb2xJbnRlcmFjdGl2ZVNpemU6IGNoZWNrYm94U2l6ZSxcbiAgICBoZWFkZXJCZyxcbiAgICBoZWFkZXJDb2xvcixcbiAgICBoZWFkZXJTb3J0QWN0aXZlQmcsXG4gICAgaGVhZGVyU29ydEhvdmVyQmcsXG4gICAgYm9keVNvcnRCZyxcbiAgICByb3dIb3ZlckJnLFxuICAgIHJvd1NlbGVjdGVkQmcsXG4gICAgcm93U2VsZWN0ZWRIb3ZlckJnLFxuICAgIHJvd0V4cGFuZGVkQmcsXG4gICAgY2VsbFBhZGRpbmdCbG9jayxcbiAgICBjZWxsUGFkZGluZ0lubGluZSxcbiAgICBjZWxsUGFkZGluZ0Jsb2NrTUQsXG4gICAgY2VsbFBhZGRpbmdJbmxpbmVNRCxcbiAgICBjZWxsUGFkZGluZ0Jsb2NrU00sXG4gICAgY2VsbFBhZGRpbmdJbmxpbmVTTSxcbiAgICBib3JkZXJDb2xvcixcbiAgICBmb290ZXJCZyxcbiAgICBmb290ZXJDb2xvcixcbiAgICBoZWFkZXJCb3JkZXJSYWRpdXMsXG4gICAgY2VsbEZvbnRTaXplLFxuICAgIGNlbGxGb250U2l6ZU1ELFxuICAgIGNlbGxGb250U2l6ZVNNLFxuICAgIGhlYWRlclNwbGl0Q29sb3IsXG4gICAgZml4ZWRIZWFkZXJTb3J0QWN0aXZlQmcsXG4gICAgaGVhZGVyRmlsdGVySG92ZXJCZyxcbiAgICBmaWx0ZXJEcm9wZG93bkJnLFxuICAgIGV4cGFuZEljb25CZyxcbiAgICBzZWxlY3Rpb25Db2x1bW5XaWR0aCxcbiAgICBzdGlja3lTY3JvbGxCYXJCZyxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgY29uc3QgdGFibGVUb2tlbiA9ICgwLCBfaW50ZXJuYWwubWVyZ2VUb2tlbikodG9rZW4sIHtcbiAgICB0YWJsZUZvbnRTaXplOiBjZWxsRm9udFNpemUsXG4gICAgdGFibGVCZzogY29sb3JCZ0NvbnRhaW5lcixcbiAgICB0YWJsZVJhZGl1czogaGVhZGVyQm9yZGVyUmFkaXVzLFxuICAgIHRhYmxlUGFkZGluZ1ZlcnRpY2FsOiBjZWxsUGFkZGluZ0Jsb2NrLFxuICAgIHRhYmxlUGFkZGluZ0hvcml6b250YWw6IGNlbGxQYWRkaW5nSW5saW5lLFxuICAgIHRhYmxlUGFkZGluZ1ZlcnRpY2FsTWlkZGxlOiBjZWxsUGFkZGluZ0Jsb2NrTUQsXG4gICAgdGFibGVQYWRkaW5nSG9yaXpvbnRhbE1pZGRsZTogY2VsbFBhZGRpbmdJbmxpbmVNRCxcbiAgICB0YWJsZVBhZGRpbmdWZXJ0aWNhbFNtYWxsOiBjZWxsUGFkZGluZ0Jsb2NrU00sXG4gICAgdGFibGVQYWRkaW5nSG9yaXpvbnRhbFNtYWxsOiBjZWxsUGFkZGluZ0lubGluZVNNLFxuICAgIHRhYmxlQm9yZGVyQ29sb3I6IGJvcmRlckNvbG9yLFxuICAgIHRhYmxlSGVhZGVyVGV4dENvbG9yOiBoZWFkZXJDb2xvcixcbiAgICB0YWJsZUhlYWRlckJnOiBoZWFkZXJCZyxcbiAgICB0YWJsZUZvb3RlclRleHRDb2xvcjogZm9vdGVyQ29sb3IsXG4gICAgdGFibGVGb290ZXJCZzogZm9vdGVyQmcsXG4gICAgdGFibGVIZWFkZXJDZWxsU3BsaXRDb2xvcjogaGVhZGVyU3BsaXRDb2xvcixcbiAgICB0YWJsZUhlYWRlclNvcnRCZzogaGVhZGVyU29ydEFjdGl2ZUJnLFxuICAgIHRhYmxlSGVhZGVyU29ydEhvdmVyQmc6IGhlYWRlclNvcnRIb3ZlckJnLFxuICAgIHRhYmxlQm9keVNvcnRCZzogYm9keVNvcnRCZyxcbiAgICB0YWJsZUZpeGVkSGVhZGVyU29ydEFjdGl2ZUJnOiBmaXhlZEhlYWRlclNvcnRBY3RpdmVCZyxcbiAgICB0YWJsZUhlYWRlckZpbHRlckFjdGl2ZUJnOiBoZWFkZXJGaWx0ZXJIb3ZlckJnLFxuICAgIHRhYmxlRmlsdGVyRHJvcGRvd25CZzogZmlsdGVyRHJvcGRvd25CZyxcbiAgICB0YWJsZVJvd0hvdmVyQmc6IHJvd0hvdmVyQmcsXG4gICAgdGFibGVTZWxlY3RlZFJvd0JnOiByb3dTZWxlY3RlZEJnLFxuICAgIHRhYmxlU2VsZWN0ZWRSb3dIb3ZlckJnOiByb3dTZWxlY3RlZEhvdmVyQmcsXG4gICAgekluZGV4VGFibGVGaXhlZCxcbiAgICB6SW5kZXhUYWJsZVN0aWNreTogY2FsYyh6SW5kZXhUYWJsZUZpeGVkKS5hZGQoMSkuZXF1YWwoe1xuICAgICAgdW5pdDogZmFsc2VcbiAgICB9KSxcbiAgICB0YWJsZUZvbnRTaXplTWlkZGxlOiBjZWxsRm9udFNpemVNRCxcbiAgICB0YWJsZUZvbnRTaXplU21hbGw6IGNlbGxGb250U2l6ZVNNLFxuICAgIHRhYmxlU2VsZWN0aW9uQ29sdW1uV2lkdGg6IHNlbGVjdGlvbkNvbHVtbldpZHRoLFxuICAgIHRhYmxlRXhwYW5kSWNvbkJnOiBleHBhbmRJY29uQmcsXG4gICAgdGFibGVFeHBhbmRDb2x1bW5XaWR0aDogY2FsYyhjaGVja2JveFNpemUpLmFkZChjYWxjKHRva2VuLnBhZGRpbmcpLm11bCgyKSkuZXF1YWwoKSxcbiAgICB0YWJsZUV4cGFuZGVkUm93Qmc6IHJvd0V4cGFuZGVkQmcsXG4gICAgLy8gRHJvcGRvd25cbiAgICB0YWJsZUZpbHRlckRyb3Bkb3duV2lkdGg6IDEyMCxcbiAgICB0YWJsZUZpbHRlckRyb3Bkb3duSGVpZ2h0OiAyNjQsXG4gICAgdGFibGVGaWx0ZXJEcm9wZG93blNlYXJjaFdpZHRoOiAxNDAsXG4gICAgLy8gVmlydHVhbCBTY3JvbGwgQmFyXG4gICAgdGFibGVTY3JvbGxUaHVtYlNpemU6IDgsXG4gICAgLy8gTWFjIHNjcm9sbCBiYXIgc2l6ZVxuICAgIHRhYmxlU2Nyb2xsVGh1bWJCZzogc3RpY2t5U2Nyb2xsQmFyQmcsXG4gICAgdGFibGVTY3JvbGxUaHVtYkJnSG92ZXI6IGNvbG9yVGV4dEhlYWRpbmcsXG4gICAgdGFibGVTY3JvbGxCZzogY29sb3JTcGxpdFxuICB9KTtcbiAgcmV0dXJuIFtnZW5UYWJsZVN0eWxlKHRhYmxlVG9rZW4pLCAoMCwgX3BhZ2luYXRpb24uZGVmYXVsdCkodGFibGVUb2tlbiksICgwLCBfc3VtbWFyeS5kZWZhdWx0KSh0YWJsZVRva2VuKSwgKDAsIF9zb3J0ZXIuZGVmYXVsdCkodGFibGVUb2tlbiksICgwLCBfZmlsdGVyLmRlZmF1bHQpKHRhYmxlVG9rZW4pLCAoMCwgX2JvcmRlcmVkLmRlZmF1bHQpKHRhYmxlVG9rZW4pLCAoMCwgX3JhZGl1cy5kZWZhdWx0KSh0YWJsZVRva2VuKSwgKDAsIF9leHBhbmQuZGVmYXVsdCkodGFibGVUb2tlbiksICgwLCBfc3VtbWFyeS5kZWZhdWx0KSh0YWJsZVRva2VuKSwgKDAsIF9lbXB0eS5kZWZhdWx0KSh0YWJsZVRva2VuKSwgKDAsIF9zZWxlY3Rpb24uZGVmYXVsdCkodGFibGVUb2tlbiksICgwLCBfZml4ZWQuZGVmYXVsdCkodGFibGVUb2tlbiksICgwLCBfc3RpY2t5LmRlZmF1bHQpKHRhYmxlVG9rZW4pLCAoMCwgX2VsbGlwc2lzLmRlZmF1bHQpKHRhYmxlVG9rZW4pLCAoMCwgX3NpemUuZGVmYXVsdCkodGFibGVUb2tlbiksICgwLCBfcnRsLmRlZmF1bHQpKHRhYmxlVG9rZW4pLCAoMCwgX3ZpcnR1YWwuZGVmYXVsdCkodGFibGVUb2tlbildO1xufSwgcHJlcGFyZUNvbXBvbmVudFRva2VuLCB7XG4gIHVuaXRsZXNzOiB7XG4gICAgZXhwYW5kSWNvblNjYWxlOiB0cnVlXG4gIH1cbn0pOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9jc3NpbmpzID0gcmVxdWlyZShcIkBhbnQtZGVzaWduL2Nzc2luanNcIik7XG5jb25zdCBnZW5QYWdpbmF0aW9uU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgYW50Q2xzLFxuICAgIG1hcmdpblxuICB9ID0gdG9rZW47XG4gIHJldHVybiB7XG4gICAgW2Ake2NvbXBvbmVudENsc30td3JhcHBlcmBdOiB7XG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PSBQYWdpbmF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1wYWdpbmF0aW9uJHthbnRDbHN9LXBhZ2luYXRpb25gXToge1xuICAgICAgICBtYXJnaW46IGAkeygwLCBfY3NzaW5qcy51bml0KShtYXJnaW4pfSAwYFxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXBhZ2luYXRpb25gXToge1xuICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgIGZsZXhXcmFwOiAnd3JhcCcsXG4gICAgICAgIHJvd0dhcDogdG9rZW4ucGFkZGluZ1hTLFxuICAgICAgICAnPiAqJzoge1xuICAgICAgICAgIGZsZXg6ICdub25lJ1xuICAgICAgICB9LFxuICAgICAgICAnJi1sZWZ0Jzoge1xuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnZmxleC1zdGFydCdcbiAgICAgICAgfSxcbiAgICAgICAgJyYtY2VudGVyJzoge1xuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJ1xuICAgICAgICB9LFxuICAgICAgICAnJi1yaWdodCc6IHtcbiAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2ZsZXgtZW5kJ1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGdlblBhZ2luYXRpb25TdHlsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xuY29uc3QgZ2VuUmFkaXVzU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgdGFibGVSYWRpdXNcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgW2NvbXBvbmVudENsc106IHtcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvMzkxMTUjaXNzdWVjb21tZW50LTEzNjIzMTQ1NzRcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tdGl0bGUsICR7Y29tcG9uZW50Q2xzfS1oZWFkZXJgXToge1xuICAgICAgICAgIGJvcmRlclJhZGl1czogYCR7KDAsIF9jc3NpbmpzLnVuaXQpKHRhYmxlUmFkaXVzKX0gJHsoMCwgX2Nzc2luanMudW5pdCkodGFibGVSYWRpdXMpfSAwIDBgXG4gICAgICAgIH0sXG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXRpdGxlICsgJHtjb21wb25lbnRDbHN9LWNvbnRhaW5lcmBdOiB7XG4gICAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogMCxcbiAgICAgICAgICBib3JkZXJTdGFydEVuZFJhZGl1czogMCxcbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9hbnQtZGVzaWduL2lzc3Vlcy80MTk3NVxuICAgICAgICAgIFtgJHtjb21wb25lbnRDbHN9LWhlYWRlciwgdGFibGVgXToge1xuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgICAgICAgfSxcbiAgICAgICAgICAndGFibGUgPiB0aGVhZCA+IHRyOmZpcnN0LWNoaWxkJzoge1xuICAgICAgICAgICAgJ3RoOmZpcnN0LWNoaWxkLCB0aDpsYXN0LWNoaWxkLCB0ZDpmaXJzdC1jaGlsZCwgdGQ6bGFzdC1jaGlsZCc6IHtcbiAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnJi1jb250YWluZXInOiB7XG4gICAgICAgICAgYm9yZGVyU3RhcnRTdGFydFJhZGl1czogdGFibGVSYWRpdXMsXG4gICAgICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IHRhYmxlUmFkaXVzLFxuICAgICAgICAgICd0YWJsZSA+IHRoZWFkID4gdHI6Zmlyc3QtY2hpbGQnOiB7XG4gICAgICAgICAgICAnPiAqOmZpcnN0LWNoaWxkJzoge1xuICAgICAgICAgICAgICBib3JkZXJTdGFydFN0YXJ0UmFkaXVzOiB0YWJsZVJhZGl1c1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICc+ICo6bGFzdC1jaGlsZCc6IHtcbiAgICAgICAgICAgICAgYm9yZGVyU3RhcnRFbmRSYWRpdXM6IHRhYmxlUmFkaXVzXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnJi1mb290ZXInOiB7XG4gICAgICAgICAgYm9yZGVyUmFkaXVzOiBgMCAwICR7KDAsIF9jc3NpbmpzLnVuaXQpKHRhYmxlUmFkaXVzKX0gJHsoMCwgX2Nzc2luanMudW5pdCkodGFibGVSYWRpdXMpfWBcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZW5SYWRpdXNTdHlsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbmNvbnN0IGdlblN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyLXJ0bGBdOiB7XG4gICAgICBkaXJlY3Rpb246ICdydGwnLFxuICAgICAgdGFibGU6IHtcbiAgICAgICAgZGlyZWN0aW9uOiAncnRsJ1xuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXBhZ2luYXRpb24tbGVmdGBdOiB7XG4gICAgICAgIGp1c3RpZnlDb250ZW50OiAnZmxleC1lbmQnXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tcGFnaW5hdGlvbi1yaWdodGBdOiB7XG4gICAgICAgIGp1c3RpZnlDb250ZW50OiAnZmxleC1zdGFydCdcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1yb3ctZXhwYW5kLWljb25gXToge1xuICAgICAgICBmbG9hdDogJ3JpZ2h0JyxcbiAgICAgICAgJyY6OmFmdGVyJzoge1xuICAgICAgICAgIHRyYW5zZm9ybTogJ3JvdGF0ZSgtOTBkZWcpJ1xuICAgICAgICB9LFxuICAgICAgICAnJi1jb2xsYXBzZWQ6OmJlZm9yZSc6IHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoMTgwZGVnKSdcbiAgICAgICAgfSxcbiAgICAgICAgJyYtY29sbGFwc2VkOjphZnRlcic6IHtcbiAgICAgICAgICB0cmFuc2Zvcm06ICdyb3RhdGUoMGRlZyknXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jb250YWluZXJgXToge1xuICAgICAgICAnJjo6YmVmb3JlJzoge1xuICAgICAgICAgIGluc2V0SW5saW5lU3RhcnQ6ICd1bnNldCcsXG4gICAgICAgICAgaW5zZXRJbmxpbmVFbmQ6IDBcbiAgICAgICAgfSxcbiAgICAgICAgJyY6OmFmdGVyJzoge1xuICAgICAgICAgIGluc2V0SW5saW5lU3RhcnQ6IDAsXG4gICAgICAgICAgaW5zZXRJbmxpbmVFbmQ6ICd1bnNldCdcbiAgICAgICAgfSxcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tcm93LWluZGVudGBdOiB7XG4gICAgICAgICAgZmxvYXQ6ICdyaWdodCdcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZW5TdHlsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xuY29uc3QgZ2VuU2VsZWN0aW9uU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgYW50Q2xzLFxuICAgIGljb25DbHMsXG4gICAgZm9udFNpemVJY29uLFxuICAgIHBhZGRpbmcsXG4gICAgcGFkZGluZ1hTLFxuICAgIGhlYWRlckljb25Db2xvcixcbiAgICBoZWFkZXJJY29uSG92ZXJDb2xvcixcbiAgICB0YWJsZVNlbGVjdGlvbkNvbHVtbldpZHRoLFxuICAgIHRhYmxlU2VsZWN0ZWRSb3dCZyxcbiAgICB0YWJsZVNlbGVjdGVkUm93SG92ZXJCZyxcbiAgICB0YWJsZVJvd0hvdmVyQmcsXG4gICAgdGFibGVQYWRkaW5nSG9yaXpvbnRhbCxcbiAgICBjYWxjXG4gIH0gPSB0b2tlbjtcbiAgcmV0dXJuIHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfS13cmFwcGVyYF06IHtcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09IFNlbGVjdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1jb2xgXToge1xuICAgICAgICB3aWR0aDogdGFibGVTZWxlY3Rpb25Db2x1bW5XaWR0aCxcbiAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1jb2wtd2l0aC1kcm9wZG93bmBdOiB7XG4gICAgICAgICAgd2lkdGg6IGNhbGModGFibGVTZWxlY3Rpb25Db2x1bW5XaWR0aCkuYWRkKGZvbnRTaXplSWNvbikuYWRkKGNhbGMocGFkZGluZykuZGl2KDQpKS5lcXVhbCgpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1ib3JkZXJlZCAke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLWNvbGBdOiB7XG4gICAgICAgIHdpZHRoOiBjYWxjKHRhYmxlU2VsZWN0aW9uQ29sdW1uV2lkdGgpLmFkZChjYWxjKHBhZGRpbmdYUykubXVsKDIpKS5lcXVhbCgpLFxuICAgICAgICBbYCYke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLWNvbC13aXRoLWRyb3Bkb3duYF06IHtcbiAgICAgICAgICB3aWR0aDogY2FsYyh0YWJsZVNlbGVjdGlvbkNvbHVtbldpZHRoKS5hZGQoZm9udFNpemVJY29uKS5hZGQoY2FsYyhwYWRkaW5nKS5kaXYoNCkpLmFkZChjYWxjKHBhZGRpbmdYUykubXVsKDIpKS5lcXVhbCgpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYFxuICAgICAgICB0YWJsZSB0ciB0aCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tY29sdW1uLFxuICAgICAgICB0YWJsZSB0ciB0ZCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tY29sdW1uLFxuICAgICAgICAke2NvbXBvbmVudENsc30tc2VsZWN0aW9uLWNvbHVtblxuICAgICAgYF06IHtcbiAgICAgICAgcGFkZGluZ0lubGluZUVuZDogdG9rZW4ucGFkZGluZ1hTLFxuICAgICAgICBwYWRkaW5nSW5saW5lU3RhcnQ6IHRva2VuLnBhZGRpbmdYUyxcbiAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgW2Ake2FudENsc30tcmFkaW8td3JhcHBlcmBdOiB7XG4gICAgICAgICAgbWFyZ2luSW5saW5lRW5kOiAwXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYHRhYmxlIHRyIHRoJHtjb21wb25lbnRDbHN9LXNlbGVjdGlvbi1jb2x1bW4ke2NvbXBvbmVudENsc30tY2VsbC1maXgtbGVmdGBdOiB7XG4gICAgICAgIHpJbmRleDogY2FsYyh0b2tlbi56SW5kZXhUYWJsZUZpeGVkKS5hZGQoMSkuZXF1YWwoe1xuICAgICAgICAgIHVuaXQ6IGZhbHNlXG4gICAgICAgIH0pXG4gICAgICB9LFxuICAgICAgW2B0YWJsZSB0ciB0aCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tY29sdW1uOjphZnRlcmBdOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50ICFpbXBvcnRhbnQnXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtZmxleCcsXG4gICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tc2VsZWN0aW9uLWV4dHJhYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgekluZGV4OiAxLFxuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd31gLFxuICAgICAgICBtYXJnaW5JbmxpbmVTdGFydDogJzEwMCUnLFxuICAgICAgICBwYWRkaW5nSW5saW5lU3RhcnQ6ICgwLCBfY3NzaW5qcy51bml0KShjYWxjKHRhYmxlUGFkZGluZ0hvcml6b250YWwpLmRpdig0KS5lcXVhbCgpKSxcbiAgICAgICAgW2ljb25DbHNdOiB7XG4gICAgICAgICAgY29sb3I6IGhlYWRlckljb25Db2xvcixcbiAgICAgICAgICBmb250U2l6ZTogZm9udFNpemVJY29uLFxuICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdiYXNlbGluZScsXG4gICAgICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgICAgICBjb2xvcjogaGVhZGVySWNvbkhvdmVyQ29sb3JcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBSb3dzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS10Ym9keWBdOiB7XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXJvd2BdOiB7XG4gICAgICAgICAgW2AmJHtjb21wb25lbnRDbHN9LXJvdy1zZWxlY3RlZGBdOiB7XG4gICAgICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWNlbGxgXToge1xuICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB0YWJsZVNlbGVjdGVkUm93QmcsXG4gICAgICAgICAgICAgICcmLXJvdy1ob3Zlcic6IHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiB0YWJsZVNlbGVjdGVkUm93SG92ZXJCZ1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYD4gJHtjb21wb25lbnRDbHN9LWNlbGwtcm93LWhvdmVyYF06IHtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IHRhYmxlUm93SG92ZXJCZ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcbn07XG52YXIgX2RlZmF1bHQgPSBleHBvcnRzLmRlZmF1bHQgPSBnZW5TZWxlY3Rpb25TdHlsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xuY29uc3QgZ2VuU2l6ZVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIHRhYmxlRXhwYW5kQ29sdW1uV2lkdGgsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IGdldFNpemVTdHlsZSA9IChzaXplLCBwYWRkaW5nVmVydGljYWwsIHBhZGRpbmdIb3Jpem9udGFsLCBmb250U2l6ZSkgPT4gKHtcbiAgICBbYCR7Y29tcG9uZW50Q2xzfSR7Y29tcG9uZW50Q2xzfS0ke3NpemV9YF06IHtcbiAgICAgIGZvbnRTaXplLFxuICAgICAgW2BcbiAgICAgICAgJHtjb21wb25lbnRDbHN9LXRpdGxlLFxuICAgICAgICAke2NvbXBvbmVudENsc30tZm9vdGVyLFxuICAgICAgICAke2NvbXBvbmVudENsc30tY2VsbCxcbiAgICAgICAgJHtjb21wb25lbnRDbHN9LXRoZWFkID4gdHIgPiB0aCxcbiAgICAgICAgJHtjb21wb25lbnRDbHN9LXRib2R5ID4gdHIgPiB0aCxcbiAgICAgICAgJHtjb21wb25lbnRDbHN9LXRib2R5ID4gdHIgPiB0ZCxcbiAgICAgICAgdGZvb3QgPiB0ciA+IHRoLFxuICAgICAgICB0Zm9vdCA+IHRyID4gdGRcbiAgICAgIGBdOiB7XG4gICAgICAgIHBhZGRpbmc6IGAkeygwLCBfY3NzaW5qcy51bml0KShwYWRkaW5nVmVydGljYWwpfSAkeygwLCBfY3NzaW5qcy51bml0KShwYWRkaW5nSG9yaXpvbnRhbCl9YFxuICAgICAgfSxcbiAgICAgIFtgJHtjb21wb25lbnRDbHN9LWZpbHRlci10cmlnZ2VyYF06IHtcbiAgICAgICAgbWFyZ2luSW5saW5lRW5kOiAoMCwgX2Nzc2luanMudW5pdCkoY2FsYyhwYWRkaW5nSG9yaXpvbnRhbCkuZGl2KDIpLm11bCgtMSkuZXF1YWwoKSlcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1leHBhbmRlZC1yb3ctZml4ZWRgXToge1xuICAgICAgICBtYXJnaW46IGAkeygwLCBfY3NzaW5qcy51bml0KShjYWxjKHBhZGRpbmdWZXJ0aWNhbCkubXVsKC0xKS5lcXVhbCgpKX0gJHsoMCwgX2Nzc2luanMudW5pdCkoY2FsYyhwYWRkaW5nSG9yaXpvbnRhbCkubXVsKC0xKS5lcXVhbCgpKX1gXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tdGJvZHlgXToge1xuICAgICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09IE5lc3QgVGFibGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXI6b25seS1jaGlsZCAke2NvbXBvbmVudENsc31gXToge1xuICAgICAgICAgIG1hcmdpbkJsb2NrOiAoMCwgX2Nzc2luanMudW5pdCkoY2FsYyhwYWRkaW5nVmVydGljYWwpLm11bCgtMSkuZXF1YWwoKSksXG4gICAgICAgICAgbWFyZ2luSW5saW5lOiBgJHsoMCwgX2Nzc2luanMudW5pdCkoY2FsYyh0YWJsZUV4cGFuZENvbHVtbldpZHRoKS5zdWIocGFkZGluZ0hvcml6b250YWwpLmVxdWFsKCkpfSAkeygwLCBfY3NzaW5qcy51bml0KShjYWxjKHBhZGRpbmdIb3Jpem9udGFsKS5tdWwoLTEpLmVxdWFsKCkpfWBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzM1MTY3XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1zZWxlY3Rpb24tZXh0cmFgXToge1xuICAgICAgICBwYWRkaW5nSW5saW5lU3RhcnQ6ICgwLCBfY3NzaW5qcy51bml0KShjYWxjKHBhZGRpbmdIb3Jpem9udGFsKS5kaXYoNCkuZXF1YWwoKSlcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZXRTaXplU3R5bGUoJ21pZGRsZScsIHRva2VuLnRhYmxlUGFkZGluZ1ZlcnRpY2FsTWlkZGxlLCB0b2tlbi50YWJsZVBhZGRpbmdIb3Jpem9udGFsTWlkZGxlLCB0b2tlbi50YWJsZUZvbnRTaXplTWlkZGxlKSksIGdldFNpemVTdHlsZSgnc21hbGwnLCB0b2tlbi50YWJsZVBhZGRpbmdWZXJ0aWNhbFNtYWxsLCB0b2tlbi50YWJsZVBhZGRpbmdIb3Jpem9udGFsU21hbGwsIHRva2VuLnRhYmxlRm9udFNpemVTbWFsbCkpXG4gIH07XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gZ2VuU2l6ZVN0eWxlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuY29uc3QgZ2VuU29ydGVyU3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgbWFyZ2luWFhTLFxuICAgIGZvbnRTaXplSWNvbixcbiAgICBoZWFkZXJJY29uQ29sb3IsXG4gICAgaGVhZGVySWNvbkhvdmVyQ29sb3JcbiAgfSA9IHRva2VuO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30tdGhlYWQgdGgke2NvbXBvbmVudENsc30tY29sdW1uLWhhcy1zb3J0ZXJzYF06IHtcbiAgICAgICAgb3V0bGluZTogJ25vbmUnLFxuICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgLy8gd2h5IGxlZnQgMHM/IEF2b2lkIGNvbHVtbiBoZWFkZXIgbW92ZSB3aXRoIHRyYW5zaXRpb24gd2hlbiBsZWZ0IGlzIGNoYW5nZWRcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vYW50LWRlc2lnbi9pc3N1ZXMvNTA1ODhcbiAgICAgICAgdHJhbnNpdGlvbjogYGFsbCAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd30sIGxlZnQgMHNgLFxuICAgICAgICAnJjpob3Zlcic6IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB0b2tlbi50YWJsZUhlYWRlclNvcnRIb3ZlckJnLFxuICAgICAgICAgICcmOjpiZWZvcmUnOiB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCAhaW1wb3J0YW50J1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgJyY6Zm9jdXMtdmlzaWJsZSc6IHtcbiAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5XG4gICAgICAgIH0sXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnQtZGVzaWduL2FudC1kZXNpZ24vaXNzdWVzLzMwOTY5XG4gICAgICAgIFtgXG4gICAgICAgICAgJiR7Y29tcG9uZW50Q2xzfS1jZWxsLWZpeC1sZWZ0OmhvdmVyLFxuICAgICAgICAgICYke2NvbXBvbmVudENsc30tY2VsbC1maXgtcmlnaHQ6aG92ZXJcbiAgICAgICAgYF06IHtcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB0b2tlbi50YWJsZUZpeGVkSGVhZGVyU29ydEFjdGl2ZUJnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS10aGVhZCB0aCR7Y29tcG9uZW50Q2xzfS1jb2x1bW4tc29ydGBdOiB7XG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLnRhYmxlSGVhZGVyU29ydEJnLFxuICAgICAgICAnJjo6YmVmb3JlJzoge1xuICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3RyYW5zcGFyZW50ICFpbXBvcnRhbnQnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYHRkJHtjb21wb25lbnRDbHN9LWNvbHVtbi1zb3J0YF06IHtcbiAgICAgICAgYmFja2dyb3VuZDogdG9rZW4udGFibGVCb2R5U29ydEJnXG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tY29sdW1uLXRpdGxlYF06IHtcbiAgICAgICAgcG9zaXRpb246ICdyZWxhdGl2ZScsXG4gICAgICAgIHpJbmRleDogMSxcbiAgICAgICAgZmxleDogMSxcbiAgICAgICAgbWluV2lkdGg6IDBcbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jb2x1bW4tc29ydGVyc2BdOiB7XG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgZmxleDogJ2F1dG8nLFxuICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdzcGFjZS1iZXR3ZWVuJyxcbiAgICAgICAgJyY6OmFmdGVyJzoge1xuICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIGluc2V0OiAwLFxuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgY29udGVudDogJ1wiXCInXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jb2x1bW4tc29ydGVycy10b29sdGlwLXRhcmdldC1zb3J0ZXJgXToge1xuICAgICAgICAnJjo6YWZ0ZXInOiB7XG4gICAgICAgICAgY29udGVudDogJ25vbmUnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jb2x1bW4tc29ydGVyYF06IHtcbiAgICAgICAgbWFyZ2luSW5saW5lU3RhcnQ6IG1hcmdpblhYUyxcbiAgICAgICAgY29sb3I6IGhlYWRlckljb25Db2xvcixcbiAgICAgICAgZm9udFNpemU6IDAsXG4gICAgICAgIHRyYW5zaXRpb246IGBjb2xvciAke3Rva2VuLm1vdGlvbkR1cmF0aW9uU2xvd31gLFxuICAgICAgICAnJi1pbm5lcic6IHtcbiAgICAgICAgICBkaXNwbGF5OiAnaW5saW5lLWZsZXgnLFxuICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInXG4gICAgICAgIH0sXG4gICAgICAgICcmLXVwLCAmLWRvd24nOiB7XG4gICAgICAgICAgZm9udFNpemU6IGZvbnRTaXplSWNvbixcbiAgICAgICAgICAnJi5hY3RpdmUnOiB7XG4gICAgICAgICAgICBjb2xvcjogdG9rZW4uY29sb3JQcmltYXJ5XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jb2x1bW4tc29ydGVyLXVwICsgJHtjb21wb25lbnRDbHN9LWNvbHVtbi1zb3J0ZXItZG93bmBdOiB7XG4gICAgICAgICAgbWFyZ2luVG9wOiAnLTAuM2VtJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgW2Ake2NvbXBvbmVudENsc30tY29sdW1uLXNvcnRlcnM6aG92ZXIgJHtjb21wb25lbnRDbHN9LWNvbHVtbi1zb3J0ZXJgXToge1xuICAgICAgICBjb2xvcjogaGVhZGVySWNvbkhvdmVyQ29sb3JcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gZ2VuU29ydGVyU3R5bGU7IiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSB2b2lkIDA7XG52YXIgX2Nzc2luanMgPSByZXF1aXJlKFwiQGFudC1kZXNpZ24vY3NzaW5qc1wiKTtcbmNvbnN0IGdlblN0aWNreVN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIG9wYWNpdHlMb2FkaW5nLFxuICAgIHRhYmxlU2Nyb2xsVGh1bWJCZyxcbiAgICB0YWJsZVNjcm9sbFRodW1iQmdIb3ZlcixcbiAgICB0YWJsZVNjcm9sbFRodW1iU2l6ZSxcbiAgICB0YWJsZVNjcm9sbEJnLFxuICAgIHpJbmRleFRhYmxlU3RpY2t5LFxuICAgIHN0aWNreVNjcm9sbEJhckJvcmRlclJhZGl1cyxcbiAgICBsaW5lV2lkdGgsXG4gICAgbGluZVR5cGUsXG4gICAgdGFibGVCb3JkZXJDb2xvclxuICB9ID0gdG9rZW47XG4gIGNvbnN0IHRhYmxlQm9yZGVyID0gYCR7KDAsIF9jc3NpbmpzLnVuaXQpKGxpbmVXaWR0aCl9ICR7bGluZVR5cGV9ICR7dGFibGVCb3JkZXJDb2xvcn1gO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30tc3RpY2t5YF06IHtcbiAgICAgICAgJyYtaG9sZGVyJzoge1xuICAgICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcbiAgICAgICAgICB6SW5kZXg6IHpJbmRleFRhYmxlU3RpY2t5LFxuICAgICAgICAgIGJhY2tncm91bmQ6IHRva2VuLmNvbG9yQmdDb250YWluZXJcbiAgICAgICAgfSxcbiAgICAgICAgJyYtc2Nyb2xsJzoge1xuICAgICAgICAgIHBvc2l0aW9uOiAnc3RpY2t5JyxcbiAgICAgICAgICBib3R0b206IDAsXG4gICAgICAgICAgaGVpZ2h0OiBgJHsoMCwgX2Nzc2luanMudW5pdCkodGFibGVTY3JvbGxUaHVtYlNpemUpfSAhaW1wb3J0YW50YCxcbiAgICAgICAgICB6SW5kZXg6IHpJbmRleFRhYmxlU3RpY2t5LFxuICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICBiYWNrZ3JvdW5kOiB0YWJsZVNjcm9sbEJnLFxuICAgICAgICAgIGJvcmRlclRvcDogdGFibGVCb3JkZXIsXG4gICAgICAgICAgb3BhY2l0eTogb3BhY2l0eUxvYWRpbmcsXG4gICAgICAgICAgJyY6aG92ZXInOiB7XG4gICAgICAgICAgICB0cmFuc2Zvcm1PcmlnaW46ICdjZW50ZXIgYm90dG9tJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgLy8gZmFrZSBzY3JvbGxiYXIgc3R5bGUgb2Ygc3RpY2t5XG4gICAgICAgICAgJyYtYmFyJzoge1xuICAgICAgICAgICAgaGVpZ2h0OiB0YWJsZVNjcm9sbFRodW1iU2l6ZSxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogdGFibGVTY3JvbGxUaHVtYkJnLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBzdGlja3lTY3JvbGxCYXJCb3JkZXJSYWRpdXMsXG4gICAgICAgICAgICB0cmFuc2l0aW9uOiBgYWxsICR7dG9rZW4ubW90aW9uRHVyYXRpb25TbG93fSwgdHJhbnNmb3JtIDBzYCxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAgICAgJyY6aG92ZXIsICYtYWN0aXZlJzoge1xuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRhYmxlU2Nyb2xsVGh1bWJCZ0hvdmVyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGdlblN0aWNreVN0eWxlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xudmFyIF9jc3NpbmpzID0gcmVxdWlyZShcIkBhbnQtZGVzaWduL2Nzc2luanNcIik7XG5jb25zdCBnZW5TdW1tYXJ5U3R5bGUgPSB0b2tlbiA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb21wb25lbnRDbHMsXG4gICAgbGluZVdpZHRoLFxuICAgIHRhYmxlQm9yZGVyQ29sb3IsXG4gICAgY2FsY1xuICB9ID0gdG9rZW47XG4gIGNvbnN0IHRhYmxlQm9yZGVyID0gYCR7KDAsIF9jc3NpbmpzLnVuaXQpKGxpbmVXaWR0aCl9ICR7dG9rZW4ubGluZVR5cGV9ICR7dGFibGVCb3JkZXJDb2xvcn1gO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgW2Ake2NvbXBvbmVudENsc30tc3VtbWFyeWBdOiB7XG4gICAgICAgIHBvc2l0aW9uOiAncmVsYXRpdmUnLFxuICAgICAgICB6SW5kZXg6IHRva2VuLnpJbmRleFRhYmxlRml4ZWQsXG4gICAgICAgIGJhY2tncm91bmQ6IHRva2VuLnRhYmxlQmcsXG4gICAgICAgICc+IHRyJzoge1xuICAgICAgICAgICc+IHRoLCA+IHRkJzoge1xuICAgICAgICAgICAgYm9yZGVyQm90dG9tOiB0YWJsZUJvcmRlclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFtgZGl2JHtjb21wb25lbnRDbHN9LXN1bW1hcnlgXToge1xuICAgICAgICBib3hTaGFkb3c6IGAwICR7KDAsIF9jc3NpbmpzLnVuaXQpKGNhbGMobGluZVdpZHRoKS5tdWwoLTEpLmVxdWFsKCkpfSAwICR7dGFibGVCb3JkZXJDb2xvcn1gXG4gICAgICB9XG4gICAgfVxuICB9O1xufTtcbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IGdlblN1bW1hcnlTdHlsZTsiLCJcInVzZSBzdHJpY3RcIjtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHZvaWQgMDtcbnZhciBfY3NzaW5qcyA9IHJlcXVpcmUoXCJAYW50LWRlc2lnbi9jc3NpbmpzXCIpO1xuY29uc3QgZ2VuVmlydHVhbFN0eWxlID0gdG9rZW4gPT4ge1xuICBjb25zdCB7XG4gICAgY29tcG9uZW50Q2xzLFxuICAgIG1vdGlvbkR1cmF0aW9uTWlkLFxuICAgIGxpbmVXaWR0aCxcbiAgICBsaW5lVHlwZSxcbiAgICB0YWJsZUJvcmRlckNvbG9yLFxuICAgIGNhbGNcbiAgfSA9IHRva2VuO1xuICBjb25zdCB0YWJsZUJvcmRlciA9IGAkeygwLCBfY3NzaW5qcy51bml0KShsaW5lV2lkdGgpfSAke2xpbmVUeXBlfSAke3RhYmxlQm9yZGVyQ29sb3J9YDtcbiAgY29uc3Qgcm93Q2VsbENscyA9IGAke2NvbXBvbmVudENsc30tZXhwYW5kZWQtcm93LWNlbGxgO1xuICByZXR1cm4ge1xuICAgIFtgJHtjb21wb25lbnRDbHN9LXdyYXBwZXJgXToge1xuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT0gUm93ID09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICBbYCR7Y29tcG9uZW50Q2xzfS10Ym9keS12aXJ0dWFsYF06IHtcbiAgICAgICAgW2Ake2NvbXBvbmVudENsc30tdGJvZHktdmlydHVhbC1ob2xkZXItaW5uZXJgXToge1xuICAgICAgICAgIFtgXG4gICAgICAgICAgICAmID4gJHtjb21wb25lbnRDbHN9LXJvdywgXG4gICAgICAgICAgICAmID4gZGl2Om5vdCgke2NvbXBvbmVudENsc30tcm93KSA+ICR7Y29tcG9uZW50Q2xzfS1yb3dcbiAgICAgICAgICBgXToge1xuICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgYm94U2l6aW5nOiAnYm9yZGVyLWJveCcsXG4gICAgICAgICAgICB3aWR0aDogJzEwMCUnXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jZWxsYF06IHtcbiAgICAgICAgICBib3JkZXJCb3R0b206IHRhYmxlQm9yZGVyLFxuICAgICAgICAgIHRyYW5zaXRpb246IGBiYWNrZ3JvdW5kICR7bW90aW9uRHVyYXRpb25NaWR9YFxuICAgICAgICB9LFxuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1leHBhbmRlZC1yb3dgXToge1xuICAgICAgICAgIFtgJHtyb3dDZWxsQ2xzfSR7cm93Q2VsbENsc30tZml4ZWRgXToge1xuICAgICAgICAgICAgcG9zaXRpb246ICdzdGlja3knLFxuICAgICAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogMCxcbiAgICAgICAgICAgIG92ZXJmbG93OiAnaGlkZGVuJyxcbiAgICAgICAgICAgIHdpZHRoOiBgY2FsYyh2YXIoLS12aXJ0dWFsLXdpZHRoKSAtICR7KDAsIF9jc3NpbmpzLnVuaXQpKGxpbmVXaWR0aCl9KWAsXG4gICAgICAgICAgICBib3JkZXJJbmxpbmVFbmQ6ICdub25lJ1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PSBCb3JkZXIgPT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgW2Ake2NvbXBvbmVudENsc30tYm9yZGVyZWRgXToge1xuICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS10Ym9keS12aXJ0dWFsYF06IHtcbiAgICAgICAgICAnJjphZnRlcic6IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6ICdcIlwiJyxcbiAgICAgICAgICAgIGluc2V0SW5saW5lOiAwLFxuICAgICAgICAgICAgYm90dG9tOiAwLFxuICAgICAgICAgICAgYm9yZGVyQm90dG9tOiB0YWJsZUJvcmRlcixcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBbYCR7Y29tcG9uZW50Q2xzfS1jZWxsYF06IHtcbiAgICAgICAgICAgIGJvcmRlcklubGluZUVuZDogdGFibGVCb3JkZXIsXG4gICAgICAgICAgICBbYCYke2NvbXBvbmVudENsc30tY2VsbC1maXgtcmlnaHQtZmlyc3Q6YmVmb3JlYF06IHtcbiAgICAgICAgICAgICAgY29udGVudDogJ1wiXCInLFxuICAgICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgICAgICAgICAgaW5zZXRCbG9jazogMCxcbiAgICAgICAgICAgICAgaW5zZXRJbmxpbmVTdGFydDogY2FsYyhsaW5lV2lkdGgpLm11bCgtMSkuZXF1YWwoKSxcbiAgICAgICAgICAgICAgYm9yZGVySW5saW5lU3RhcnQ6IHRhYmxlQm9yZGVyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyBFbXB0eSBwbGFjZWhvbGRlclxuICAgICAgICBbYCYke2NvbXBvbmVudENsc30tdmlydHVhbGBdOiB7XG4gICAgICAgICAgW2Ake2NvbXBvbmVudENsc30tcGxhY2Vob2xkZXIgJHtjb21wb25lbnRDbHN9LWNlbGxgXToge1xuICAgICAgICAgICAgYm9yZGVySW5saW5lRW5kOiB0YWJsZUJvcmRlcixcbiAgICAgICAgICAgIGJvcmRlckJvdHRvbTogdGFibGVCb3JkZXJcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xudmFyIF9kZWZhdWx0ID0gZXhwb3J0cy5kZWZhdWx0ID0gZ2VuVmlydHVhbFN0eWxlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5nZXRDb2x1bW5LZXkgPSB2b2lkIDA7XG5leHBvcnRzLmdldENvbHVtblBvcyA9IGdldENvbHVtblBvcztcbmV4cG9ydHMuc2FmZUNvbHVtblRpdGxlID0gZXhwb3J0cy5yZW5kZXJDb2x1bW5UaXRsZSA9IHZvaWQgMDtcbmNvbnN0IGdldENvbHVtbktleSA9IChjb2x1bW4sIGRlZmF1bHRLZXkpID0+IHtcbiAgaWYgKCdrZXknIGluIGNvbHVtbiAmJiBjb2x1bW4ua2V5ICE9PSB1bmRlZmluZWQgJiYgY29sdW1uLmtleSAhPT0gbnVsbCkge1xuICAgIHJldHVybiBjb2x1bW4ua2V5O1xuICB9XG4gIGlmIChjb2x1bW4uZGF0YUluZGV4KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY29sdW1uLmRhdGFJbmRleCkgPyBjb2x1bW4uZGF0YUluZGV4LmpvaW4oJy4nKSA6IGNvbHVtbi5kYXRhSW5kZXg7XG4gIH1cbiAgcmV0dXJuIGRlZmF1bHRLZXk7XG59O1xuZXhwb3J0cy5nZXRDb2x1bW5LZXkgPSBnZXRDb2x1bW5LZXk7XG5mdW5jdGlvbiBnZXRDb2x1bW5Qb3MoaW5kZXgsIHBvcykge1xuICByZXR1cm4gcG9zID8gYCR7cG9zfS0ke2luZGV4fWAgOiBgJHtpbmRleH1gO1xufVxuY29uc3QgcmVuZGVyQ29sdW1uVGl0bGUgPSAodGl0bGUsIHByb3BzKSA9PiB7XG4gIGlmICh0eXBlb2YgdGl0bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gdGl0bGUocHJvcHMpO1xuICB9XG4gIHJldHVybiB0aXRsZTtcbn07XG4vKipcbiAqIFNhZmUgZ2V0IGNvbHVtbiB0aXRsZVxuICpcbiAqIFNob3VsZCBmaWx0ZXIgW29iamVjdCBPYmplY3RdXG4gKlxuICogQHBhcmFtIHRpdGxlXG4gKi9cbmV4cG9ydHMucmVuZGVyQ29sdW1uVGl0bGUgPSByZW5kZXJDb2x1bW5UaXRsZTtcbmNvbnN0IHNhZmVDb2x1bW5UaXRsZSA9ICh0aXRsZSwgcHJvcHMpID0+IHtcbiAgY29uc3QgcmVzID0gcmVuZGVyQ29sdW1uVGl0bGUodGl0bGUsIHByb3BzKTtcbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyZXMpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgIHJldHVybiAnJztcbiAgfVxuICByZXR1cm4gcmVzO1xufTtcbmV4cG9ydHMuc2FmZUNvbHVtblRpdGxlID0gc2FmZUNvbHVtblRpdGxlOyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm9pZCAwO1xuY29uc3QgVGFiUGFuZSA9ICgpID0+IG51bGw7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICBUYWJQYW5lLmRpc3BsYXlOYW1lID0gJ0RlcHJlY2F0ZWRUYWJQYW5lJztcbn1cbnZhciBfZGVmYXVsdCA9IGV4cG9ydHMuZGVmYXVsdCA9IFRhYlBhbmU7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9