UNPKG

surveyjs-widgets

Version:

Custom widgets for the SurveyJS library

370 lines (355 loc) 30 kB
(function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("inputmask")); else if(typeof define === 'function' && define.amd) define("widgets/inputmask", ["inputmask"], factory); else if(typeof exports === 'object') exports["widgets/inputmask"] = factory(require("inputmask")); else root["widgets/inputmask"] = factory(root["Inputmask"]); })(self, (__WEBPACK_EXTERNAL_MODULE_inputmask__) => { return /******/ (() => { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ "inputmask": /*!******************************************************************************************************!*\ !*** external {"root":"Inputmask","commonjs2":"inputmask","commonjs":"inputmask","amd":"inputmask"} ***! \******************************************************************************************************/ /***/ ((module) => { module.exports = __WEBPACK_EXTERNAL_MODULE_inputmask__; /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ (() => { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = (module) => { /******/ var getter = module && module.__esModule ? /******/ () => (module['default']) : /******/ () => (module); /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ (() => { /******/ // define __esModule on exports /******/ __webpack_require__.r = (exports) => { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ })(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. (() => { /*!**************************!*\ !*** ./src/inputmask.js ***! \**************************/ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var inputmask__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! inputmask */ "inputmask"); /* harmony import */ var inputmask__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(inputmask__WEBPACK_IMPORTED_MODULE_0__); function init(Survey) { const updateTextItemPropInfo = function (propJSON) { const name = propJSON.name; propJSON.onGetValue = (obj) => { return !!obj.editor ? obj.editor[name] : obj[name]; }; propJSON.onSetValue = (obj, val) => { if(!!obj.editor) { obj.editor[name] = val; } else { obj[name] = val; } } } const updateColumnPropInfo = function (propJSON) { const name = propJSON.name; propJSON.visibleIf = (obj) => { return obj.cellType === "text"; }; propJSON.onGetValue = (obj) => { return obj.templateQuestion[name]; }; propJSON.onSetValue = (obj, val) => { obj.templateQuestion[name] = val; } } var widget = { name: "maskedit", numericGroupSeparator: ",", numericRadixPoint: undefined, numericAutoGroup: true, numericDigits: 2, numericDigitsOptional: false, numericPlaceholder: "0", autoUnmask: true, clearIncomplete: true, showMaskOnHover: true, unmaskAsNumber: false, widgetIsLoaded: function () { return typeof (inputmask__WEBPACK_IMPORTED_MODULE_0___default()) != "undefined"; }, isFit: function (question) { if (question.getType() == "multipletext") return true; return ( question.getType() == "text" && (question.inputMask != "none" || question.inputFormat) ); }, isDefaultRender: true, activatedByChanged: function (activatedBy) { if (Survey.Serializer.findProperty("text", "inputMask")) return; var properties = [ { name: "autoUnmask", type: "boolean", category: "general", showMode: "form", default: true, }, { name: "clearIncomplete", type: "boolean", category: "general", showMode: "form", default: true, }, { name: "showMaskOnHover", type: "boolean", category: "general", showMode: "form", default: true, }, { name: "inputFormat", showMode: "form", category: "general" }, { name: "inputMask", showMode: "form", category: "general", default: "none", choices: [ "none", "datetime", "currency", "decimal", "email", "phone", "ip", ], }, { name: "numericDigits", category: "general", visible: false, }, { name: "numericGroupSeparator", category: "general", default: ",", visible: false, }, { name: "options", category: "general", visible: false, }, { name: "unmaskAsNumber:boolean", category: "general", visible: false, }, { name: "prefix", category: "general", visible: false, }, { name: "suffix", category: "general", visible: false, }, ]; Survey.Serializer.addProperties("text", properties); properties.forEach(prop => { if(prop.visible !== false) { updateTextItemPropInfo(prop); } }); Survey.Serializer.addProperties("multipletextitem", properties); properties.forEach(prop => { if(prop.visible !== false) { updateColumnPropInfo(prop); } }); }, applyInputMask: function (surveyElement, el) { var rootWidget = this; var mask = surveyElement.inputMask !== "none" ? surveyElement.inputMask : surveyElement.inputFormat; var options = {}; if (typeof surveyElement.options === "object") { for (var option in surveyElement.options) { options[option] = surveyElement.options[option]; } } options.autoUnmask = typeof surveyElement.autoUnmask !== "undefined" ? surveyElement.autoUnmask : rootWidget.autoUnmask; options.clearIncomplete = typeof surveyElement.clearIncomplete !== "undefined" ? surveyElement.clearIncomplete : rootWidget.clearIncomplete; options.showMaskOnHover = typeof surveyElement.showMaskOnHover !== "undefined" ? surveyElement.showMaskOnHover : rootWidget.showMaskOnHover; options.unmaskAsNumber = typeof surveyElement.unmaskAsNumber !== "undefined" ? surveyElement.unmaskAsNumber : rootWidget.unmaskAsNumber; if (surveyElement.inputMask !== "none") { options.inputFormat = surveyElement.inputFormat; } if ( surveyElement.inputMask === "currency" || surveyElement.inputMask === "decimal" ) { options.groupSeparator = surveyElement.numericGroupSeparator || rootWidget.numericGroupSeparator; options.radixPoint = rootWidget.numericRadixPoint; options.autoGroup = rootWidget.numericAutoGroup; options.placeholder = rootWidget.numericPlaceholder; } if (surveyElement.inputMask === "currency") { options.digits = surveyElement.numericDigits || rootWidget.numericDigits; options.digitsOptional = rootWidget.numericDigitsOptional; options.prefix = surveyElement.prefix || ""; options.suffix = surveyElement.suffix || ""; options.placeholder = rootWidget.numericPlaceholder; } // if (surveyElement.inputMask == "datetime") { // mask = surveyElement.inputFormat; // } if (surveyElement.inputMask === "phone" && !!surveyElement.inputFormat) { mask = surveyElement.inputFormat; } inputmask__WEBPACK_IMPORTED_MODULE_0___default()(mask, options).mask(el); el.onblur = function () { if (!el.inputmask) return; if (surveyElement.value === el.inputmask.getemptymask()) { surveyElement.value = ""; } }; var customWidgetData = surveyElement.getType() === "multipletextitem" ? surveyElement.editorValue.customWidgetData : surveyElement.customWidgetData; el.oninput = function () { customWidgetData.isNeedRender = true; }; var pushValueHandler = function () { if (!el.inputmask) return; if (el.inputmask.isComplete()) { surveyElement.value = options.autoUnmask ? el.inputmask.unmaskedvalue() : el.value; } else { surveyElement.value = null; } }; el.onfocusout = el.onchange = pushValueHandler; var updateHandler = function () { el.value = surveyElement.value === undefined || surveyElement.value === null ? "" : surveyElement.value; }; surveyElement.valueChangedCallback = updateHandler; updateHandler(); }, afterRender: function (question, el) { if (question.getType() != "multipletext") { var input = el.querySelector("input") || el; this.applyInputMask(question, input); } else { for (var i = 0; i < question.items.length; i++) { var item = question.items[i]; if (item.inputMask != "none" || item.inputFormat) { var input = el.querySelector("#" + item.editor.inputId); if (input) { this.applyInputMask(item, input); } } } } }, willUnmount: function (question, el) { var input = el.querySelector("input") || el; if (!!input && !!input.inputmask) { input.inputmask.remove(); } }, }; Survey.CustomWidgetCollection.Instance.addCustomWidget(widget); } if (typeof Survey !== "undefined") { init(Survey); } /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (init); })(); /******/ return __webpack_exports__; /******/ })() ; }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lkZ2V0cy9pbnB1dG1hc2suanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELE87Ozs7Ozs7Ozs7QUNWQTs7Ozs7O1VDQUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7VUFFQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTs7Ozs7V0N0QkE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGlDQUFpQyxXQUFXO1dBQzVDO1dBQ0E7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQSx5Q0FBeUMsd0NBQXdDO1dBQ2pGO1dBQ0E7V0FDQTs7Ozs7V0NQQTs7Ozs7V0NBQTtXQUNBO1dBQ0E7V0FDQSx1REFBdUQsaUJBQWlCO1dBQ3hFO1dBQ0EsZ0RBQWdELGFBQWE7V0FDN0Q7Ozs7Ozs7Ozs7Ozs7Ozs7QUNOa0M7O0FBRWxDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtEQUFTO0FBQzdCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sZ0RBQVM7O0FBRWY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLHdCQUF3QiwyQkFBMkI7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsaUVBQWUsSUFBSSxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc3VydmV5anMtd2lkZ2V0cy93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vc3VydmV5anMtd2lkZ2V0cy9leHRlcm5hbCB1bWQge1wicm9vdFwiOlwiSW5wdXRtYXNrXCIsXCJjb21tb25qczJcIjpcImlucHV0bWFza1wiLFwiY29tbW9uanNcIjpcImlucHV0bWFza1wiLFwiYW1kXCI6XCJpbnB1dG1hc2tcIn0iLCJ3ZWJwYWNrOi8vc3VydmV5anMtd2lkZ2V0cy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9zdXJ2ZXlqcy13aWRnZXRzL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL3N1cnZleWpzLXdpZGdldHMvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3N1cnZleWpzLXdpZGdldHMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9zdXJ2ZXlqcy13aWRnZXRzL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vc3VydmV5anMtd2lkZ2V0cy8uL3NyYy9pbnB1dG1hc2suanMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiaW5wdXRtYXNrXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFwid2lkZ2V0cy9pbnB1dG1hc2tcIiwgW1wiaW5wdXRtYXNrXCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIndpZGdldHMvaW5wdXRtYXNrXCJdID0gZmFjdG9yeShyZXF1aXJlKFwiaW5wdXRtYXNrXCIpKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJ3aWRnZXRzL2lucHV0bWFza1wiXSA9IGZhY3Rvcnkocm9vdFtcIklucHV0bWFza1wiXSk7XG59KShzZWxmLCAoX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9pbnB1dG1hc2tfXykgPT4ge1xucmV0dXJuICIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9pbnB1dG1hc2tfXzsiLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLy8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbl9fd2VicGFja19yZXF1aXJlX18ubiA9IChtb2R1bGUpID0+IHtcblx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG5cdFx0KCkgPT4gKG1vZHVsZVsnZGVmYXVsdCddKSA6XG5cdFx0KCkgPT4gKG1vZHVsZSk7XG5cdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsIHsgYTogZ2V0dGVyIH0pO1xuXHRyZXR1cm4gZ2V0dGVyO1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiaW1wb3J0IElucHV0bWFzayBmcm9tIFwiaW5wdXRtYXNrXCI7XG5cbmZ1bmN0aW9uIGluaXQoU3VydmV5KSB7XG4gIGNvbnN0IHVwZGF0ZVRleHRJdGVtUHJvcEluZm8gPSBmdW5jdGlvbiAocHJvcEpTT04pIHtcbiAgICBjb25zdCBuYW1lID0gcHJvcEpTT04ubmFtZTtcbiAgICBwcm9wSlNPTi5vbkdldFZhbHVlID0gKG9iaikgPT4ge1xuICAgICAgcmV0dXJuICEhb2JqLmVkaXRvciA/IG9iai5lZGl0b3JbbmFtZV0gOiBvYmpbbmFtZV07XG4gICAgfTtcbiAgICBwcm9wSlNPTi5vblNldFZhbHVlID0gKG9iaiwgdmFsKSA9PiB7XG4gICAgICBpZighIW9iai5lZGl0b3IpIHtcbiAgICAgICAgb2JqLmVkaXRvcltuYW1lXSA9IHZhbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9ialtuYW1lXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9ICAgIFxuICB9XG4gIGNvbnN0IHVwZGF0ZUNvbHVtblByb3BJbmZvID0gZnVuY3Rpb24gKHByb3BKU09OKSB7XG4gICAgY29uc3QgbmFtZSA9IHByb3BKU09OLm5hbWU7XG4gICAgcHJvcEpTT04udmlzaWJsZUlmID0gKG9iaikgPT4ge1xuICAgICAgcmV0dXJuIG9iai5jZWxsVHlwZSA9PT0gXCJ0ZXh0XCI7XG4gICAgfTtcbiAgICBwcm9wSlNPTi5vbkdldFZhbHVlID0gKG9iaikgPT4ge1xuICAgICAgcmV0dXJuIG9iai50ZW1wbGF0ZVF1ZXN0aW9uW25hbWVdO1xuICAgIH07XG4gICAgcHJvcEpTT04ub25TZXRWYWx1ZSA9IChvYmosIHZhbCkgPT4ge1xuICAgICAgb2JqLnRlbXBsYXRlUXVlc3Rpb25bbmFtZV0gPSB2YWw7XG4gICAgfSAgICBcbiAgfVxuICB2YXIgd2lkZ2V0ID0ge1xuICAgIG5hbWU6IFwibWFza2VkaXRcIixcbiAgICBudW1lcmljR3JvdXBTZXBhcmF0b3I6IFwiLFwiLFxuICAgIG51bWVyaWNSYWRpeFBvaW50OiB1bmRlZmluZWQsXG4gICAgbnVtZXJpY0F1dG9Hcm91cDogdHJ1ZSxcbiAgICBudW1lcmljRGlnaXRzOiAyLFxuICAgIG51bWVyaWNEaWdpdHNPcHRpb25hbDogZmFsc2UsXG4gICAgbnVtZXJpY1BsYWNlaG9sZGVyOiBcIjBcIixcbiAgICBhdXRvVW5tYXNrOiB0cnVlLFxuICAgIGNsZWFySW5jb21wbGV0ZTogdHJ1ZSxcbiAgICBzaG93TWFza09uSG92ZXI6IHRydWUsXG4gICAgdW5tYXNrQXNOdW1iZXI6IGZhbHNlLCAgICBcbiAgICB3aWRnZXRJc0xvYWRlZDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBJbnB1dG1hc2sgIT0gXCJ1bmRlZmluZWRcIjtcbiAgICB9LFxuICAgIGlzRml0OiBmdW5jdGlvbiAocXVlc3Rpb24pIHtcbiAgICAgIGlmIChxdWVzdGlvbi5nZXRUeXBlKCkgPT0gXCJtdWx0aXBsZXRleHRcIikgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBxdWVzdGlvbi5nZXRUeXBlKCkgPT0gXCJ0ZXh0XCIgJiZcbiAgICAgICAgKHF1ZXN0aW9uLmlucHV0TWFzayAhPSBcIm5vbmVcIiB8fCBxdWVzdGlvbi5pbnB1dEZvcm1hdClcbiAgICAgICk7XG4gICAgfSxcbiAgICBpc0RlZmF1bHRSZW5kZXI6IHRydWUsXG4gICAgYWN0aXZhdGVkQnlDaGFuZ2VkOiBmdW5jdGlvbiAoYWN0aXZhdGVkQnkpIHtcbiAgICAgIGlmIChTdXJ2ZXkuU2VyaWFsaXplci5maW5kUHJvcGVydHkoXCJ0ZXh0XCIsIFwiaW5wdXRNYXNrXCIpKSByZXR1cm47XG4gICAgICB2YXIgcHJvcGVydGllcyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiYXV0b1VubWFza1wiLFxuICAgICAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgICAgICBzaG93TW9kZTogXCJmb3JtXCIsXG4gICAgICAgICAgZGVmYXVsdDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiY2xlYXJJbmNvbXBsZXRlXCIsXG4gICAgICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgICAgIHNob3dNb2RlOiBcImZvcm1cIixcbiAgICAgICAgICBkZWZhdWx0OiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJzaG93TWFza09uSG92ZXJcIixcbiAgICAgICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICAgICAgc2hvd01vZGU6IFwiZm9ybVwiLFxuICAgICAgICAgIGRlZmF1bHQ6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICAgIHsgXG4gICAgICAgICAgbmFtZTogXCJpbnB1dEZvcm1hdFwiLCBcbiAgICAgICAgICBzaG93TW9kZTogXCJmb3JtXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcImlucHV0TWFza1wiLFxuICAgICAgICAgIHNob3dNb2RlOiBcImZvcm1cIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCJub25lXCIsXG4gICAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgXCJub25lXCIsXG4gICAgICAgICAgICBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICBcImN1cnJlbmN5XCIsXG4gICAgICAgICAgICBcImRlY2ltYWxcIixcbiAgICAgICAgICAgIFwiZW1haWxcIixcbiAgICAgICAgICAgIFwicGhvbmVcIixcbiAgICAgICAgICAgIFwiaXBcIixcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJudW1lcmljRGlnaXRzXCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogXCJudW1lcmljR3JvdXBTZXBhcmF0b3JcIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICAgICAgZGVmYXVsdDogXCIsXCIsXG4gICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcIm9wdGlvbnNcIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInVubWFza0FzTnVtYmVyOmJvb2xlYW5cIixcbiAgICAgICAgICBjYXRlZ29yeTogXCJnZW5lcmFsXCIsXG4gICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBcInByZWZpeFwiLFxuICAgICAgICAgIGNhdGVnb3J5OiBcImdlbmVyYWxcIixcbiAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwic3VmZml4XCIsXG4gICAgICAgICAgY2F0ZWdvcnk6IFwiZ2VuZXJhbFwiLFxuICAgICAgICAgIHZpc2libGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICAgIFN1cnZleS5TZXJpYWxpemVyLmFkZFByb3BlcnRpZXMoXCJ0ZXh0XCIsIHByb3BlcnRpZXMpO1xuICAgICAgcHJvcGVydGllcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICBpZihwcm9wLnZpc2libGUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgdXBkYXRlVGV4dEl0ZW1Qcm9wSW5mbyhwcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBTdXJ2ZXkuU2VyaWFsaXplci5hZGRQcm9wZXJ0aWVzKFwibXVsdGlwbGV0ZXh0aXRlbVwiLCBwcm9wZXJ0aWVzKTtcbiAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgaWYocHJvcC52aXNpYmxlICE9PSBmYWxzZSkge1xuICAgICAgICAgIHVwZGF0ZUNvbHVtblByb3BJbmZvKHByb3ApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGFwcGx5SW5wdXRNYXNrOiBmdW5jdGlvbiAoc3VydmV5RWxlbWVudCwgZWwpIHtcbiAgICAgIHZhciByb290V2lkZ2V0ID0gdGhpcztcbiAgICAgIHZhciBtYXNrID1cbiAgICAgICAgc3VydmV5RWxlbWVudC5pbnB1dE1hc2sgIT09IFwibm9uZVwiXG4gICAgICAgICAgPyBzdXJ2ZXlFbGVtZW50LmlucHV0TWFza1xuICAgICAgICAgIDogc3VydmV5RWxlbWVudC5pbnB1dEZvcm1hdDtcbiAgICAgIHZhciBvcHRpb25zID0ge307XG4gICAgICBpZiAodHlwZW9mIHN1cnZleUVsZW1lbnQub3B0aW9ucyA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBmb3IgKHZhciBvcHRpb24gaW4gc3VydmV5RWxlbWVudC5vcHRpb25zKSB7XG4gICAgICAgICAgb3B0aW9uc1tvcHRpb25dID0gc3VydmV5RWxlbWVudC5vcHRpb25zW29wdGlvbl07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9wdGlvbnMuYXV0b1VubWFzayA9IHR5cGVvZiBzdXJ2ZXlFbGVtZW50LmF1dG9Vbm1hc2sgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBzdXJ2ZXlFbGVtZW50LmF1dG9Vbm1hc2tcbiAgICAgICAgOiByb290V2lkZ2V0LmF1dG9Vbm1hc2s7XG4gICAgICBvcHRpb25zLmNsZWFySW5jb21wbGV0ZSA9IHR5cGVvZiBzdXJ2ZXlFbGVtZW50LmNsZWFySW5jb21wbGV0ZSAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IHN1cnZleUVsZW1lbnQuY2xlYXJJbmNvbXBsZXRlXG4gICAgICAgIDogcm9vdFdpZGdldC5jbGVhckluY29tcGxldGU7XG4gICAgICBvcHRpb25zLnNob3dNYXNrT25Ib3ZlciA9IHR5cGVvZiBzdXJ2ZXlFbGVtZW50LnNob3dNYXNrT25Ib3ZlciAhPT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IHN1cnZleUVsZW1lbnQuc2hvd01hc2tPbkhvdmVyXG4gICAgICAgIDogcm9vdFdpZGdldC5zaG93TWFza09uSG92ZXI7XG4gICAgICBvcHRpb25zLnVubWFza0FzTnVtYmVyID0gdHlwZW9mIHN1cnZleUVsZW1lbnQudW5tYXNrQXNOdW1iZXIgIT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgICA/IHN1cnZleUVsZW1lbnQudW5tYXNrQXNOdW1iZXJcbiAgICAgICAgICA6IHJvb3RXaWRnZXQudW5tYXNrQXNOdW1iZXI7XG4gICAgICBpZiAoc3VydmV5RWxlbWVudC5pbnB1dE1hc2sgIT09IFwibm9uZVwiKSB7XG4gICAgICAgIG9wdGlvbnMuaW5wdXRGb3JtYXQgPSBzdXJ2ZXlFbGVtZW50LmlucHV0Rm9ybWF0O1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBzdXJ2ZXlFbGVtZW50LmlucHV0TWFzayA9PT0gXCJjdXJyZW5jeVwiIHx8XG4gICAgICAgIHN1cnZleUVsZW1lbnQuaW5wdXRNYXNrID09PSBcImRlY2ltYWxcIlxuICAgICAgKSB7XG4gICAgICAgIG9wdGlvbnMuZ3JvdXBTZXBhcmF0b3IgPSBzdXJ2ZXlFbGVtZW50Lm51bWVyaWNHcm91cFNlcGFyYXRvciB8fCByb290V2lkZ2V0Lm51bWVyaWNHcm91cFNlcGFyYXRvcjtcbiAgICAgICAgb3B0aW9ucy5yYWRpeFBvaW50ID0gcm9vdFdpZGdldC5udW1lcmljUmFkaXhQb2ludDtcbiAgICAgICAgb3B0aW9ucy5hdXRvR3JvdXAgPSByb290V2lkZ2V0Lm51bWVyaWNBdXRvR3JvdXA7XG4gICAgICAgIG9wdGlvbnMucGxhY2Vob2xkZXIgPSByb290V2lkZ2V0Lm51bWVyaWNQbGFjZWhvbGRlcjsgICAgICAgIFxuICAgICAgfVxuICAgICAgaWYgKHN1cnZleUVsZW1lbnQuaW5wdXRNYXNrID09PSBcImN1cnJlbmN5XCIpIHtcbiAgICAgICAgb3B0aW9ucy5kaWdpdHMgPSBzdXJ2ZXlFbGVtZW50Lm51bWVyaWNEaWdpdHMgfHwgcm9vdFdpZGdldC5udW1lcmljRGlnaXRzO1xuICAgICAgICBvcHRpb25zLmRpZ2l0c09wdGlvbmFsID0gcm9vdFdpZGdldC5udW1lcmljRGlnaXRzT3B0aW9uYWw7XG4gICAgICAgIG9wdGlvbnMucHJlZml4ID0gc3VydmV5RWxlbWVudC5wcmVmaXggfHwgXCJcIjtcbiAgICAgICAgb3B0aW9ucy5zdWZmaXggPSBzdXJ2ZXlFbGVtZW50LnN1ZmZpeCB8fCBcIlwiO1xuICAgICAgICBvcHRpb25zLnBsYWNlaG9sZGVyID0gcm9vdFdpZGdldC5udW1lcmljUGxhY2Vob2xkZXI7ICAgICAgICBcbiAgICAgIH1cbiAgICAgIC8vIGlmIChzdXJ2ZXlFbGVtZW50LmlucHV0TWFzayA9PSBcImRhdGV0aW1lXCIpIHtcbiAgICAgIC8vICAgbWFzayA9IHN1cnZleUVsZW1lbnQuaW5wdXRGb3JtYXQ7XG4gICAgICAvLyB9XG4gICAgICBpZiAoc3VydmV5RWxlbWVudC5pbnB1dE1hc2sgPT09IFwicGhvbmVcIiAmJiAhIXN1cnZleUVsZW1lbnQuaW5wdXRGb3JtYXQpIHtcbiAgICAgICAgbWFzayA9IHN1cnZleUVsZW1lbnQuaW5wdXRGb3JtYXQ7XG4gICAgICB9XG4gICAgICBJbnB1dG1hc2sobWFzaywgb3B0aW9ucykubWFzayhlbCk7XG5cbiAgICAgIGVsLm9uYmx1ciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFlbC5pbnB1dG1hc2spIHJldHVybjtcbiAgICAgICAgaWYgKHN1cnZleUVsZW1lbnQudmFsdWUgPT09IGVsLmlucHV0bWFzay5nZXRlbXB0eW1hc2soKSkge1xuICAgICAgICAgIHN1cnZleUVsZW1lbnQudmFsdWUgPSBcIlwiO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgY3VzdG9tV2lkZ2V0RGF0YSA9XG4gICAgICAgIHN1cnZleUVsZW1lbnQuZ2V0VHlwZSgpID09PSBcIm11bHRpcGxldGV4dGl0ZW1cIlxuICAgICAgICAgID8gc3VydmV5RWxlbWVudC5lZGl0b3JWYWx1ZS5jdXN0b21XaWRnZXREYXRhXG4gICAgICAgICAgOiBzdXJ2ZXlFbGVtZW50LmN1c3RvbVdpZGdldERhdGE7XG4gICAgICBlbC5vbmlucHV0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBjdXN0b21XaWRnZXREYXRhLmlzTmVlZFJlbmRlciA9IHRydWU7XG4gICAgICB9O1xuXG4gICAgICB2YXIgcHVzaFZhbHVlSGFuZGxlciA9IGZ1bmN0aW9uICgpIHsgICAgICAgIFxuICAgICAgICBpZiAoIWVsLmlucHV0bWFzaykgcmV0dXJuO1xuICAgICAgICBpZiAoZWwuaW5wdXRtYXNrLmlzQ29tcGxldGUoKSkge1xuICAgICAgICAgIHN1cnZleUVsZW1lbnQudmFsdWUgPSBvcHRpb25zLmF1dG9Vbm1hc2tcbiAgICAgICAgICAgID8gZWwuaW5wdXRtYXNrLnVubWFza2VkdmFsdWUoKVxuICAgICAgICAgICAgOiBlbC52YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdXJ2ZXlFbGVtZW50LnZhbHVlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGVsLm9uZm9jdXNvdXQgPSBlbC5vbmNoYW5nZSA9IHB1c2hWYWx1ZUhhbmRsZXI7XG5cbiAgICAgIHZhciB1cGRhdGVIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBlbC52YWx1ZSA9XG4gICAgICAgICAgc3VydmV5RWxlbWVudC52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHN1cnZleUVsZW1lbnQudmFsdWUgPT09IG51bGxcbiAgICAgICAgICAgID8gXCJcIlxuICAgICAgICAgICAgOiBzdXJ2ZXlFbGVtZW50LnZhbHVlO1xuICAgICAgfTtcbiAgICAgIHN1cnZleUVsZW1lbnQudmFsdWVDaGFuZ2VkQ2FsbGJhY2sgPSB1cGRhdGVIYW5kbGVyO1xuICAgICAgdXBkYXRlSGFuZGxlcigpO1xuICAgIH0sXG4gICAgYWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uIChxdWVzdGlvbiwgZWwpIHsgICAgICBcbiAgICAgIGlmIChxdWVzdGlvbi5nZXRUeXBlKCkgIT0gXCJtdWx0aXBsZXRleHRcIikge1xuICAgICAgICB2YXIgaW5wdXQgPSBlbC5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikgfHwgZWw7XG4gICAgICAgIHRoaXMuYXBwbHlJbnB1dE1hc2socXVlc3Rpb24sIGlucHV0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcXVlc3Rpb24uaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgaXRlbSA9IHF1ZXN0aW9uLml0ZW1zW2ldO1xuICAgICAgICAgIGlmIChpdGVtLmlucHV0TWFzayAhPSBcIm5vbmVcIiB8fCBpdGVtLmlucHV0Rm9ybWF0KSB7XG4gICAgICAgICAgICB2YXIgaW5wdXQgPSBlbC5xdWVyeVNlbGVjdG9yKFwiI1wiICsgaXRlbS5lZGl0b3IuaW5wdXRJZCk7XG4gICAgICAgICAgICBpZiAoaW5wdXQpIHtcbiAgICAgICAgICAgICAgdGhpcy5hcHBseUlucHV0TWFzayhpdGVtLCBpbnB1dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICB3aWxsVW5tb3VudDogZnVuY3Rpb24gKHF1ZXN0aW9uLCBlbCkge1xuICAgICAgdmFyIGlucHV0ID0gZWwucXVlcnlTZWxlY3RvcihcImlucHV0XCIpIHx8IGVsO1xuICAgICAgaWYgKCEhaW5wdXQgJiYgISFpbnB1dC5pbnB1dG1hc2spIHtcbiAgICAgICAgaW5wdXQuaW5wdXRtYXNrLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0sXG4gIH07XG5cbiAgU3VydmV5LkN1c3RvbVdpZGdldENvbGxlY3Rpb24uSW5zdGFuY2UuYWRkQ3VzdG9tV2lkZ2V0KHdpZGdldCk7XG59XG5cbmlmICh0eXBlb2YgU3VydmV5ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gIGluaXQoU3VydmV5KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgaW5pdDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==