sdc_client 0.158.9 → 0.160.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/LICENSE +21 -0
- package/dist/index.js +23 -13
- package/dist/ugly.index.js +2 -1
- package/dist/ugly.index.js.LICENSE.txt +1 -8
- package/gulp/gulp.jsx +11 -36
- package/package.json +23 -12
- package/src/index.js +31 -7
- package/src/simpleDomControl/AbstractSDC.js +15 -11
- package/src/simpleDomControl/sdc_controller.js +3 -3
- package/src/simpleDomControl/sdc_dom_events.js +5 -10
- package/src/simpleDomControl/sdc_events.js +3 -3
- package/src/simpleDomControl/sdc_main.js +34 -13
- package/src/simpleDomControl/sdc_model.js +225 -92
- package/src/simpleDomControl/sdc_params.js +0 -3
- package/src/simpleDomControl/sdc_server_call.js +21 -4
- package/src/simpleDomControl/sdc_test_utils.js +0 -1
- package/src/simpleDomControl/sdc_utils.js +59 -7
- package/src/simpleDomControl/sdc_view.js +16 -1
- package/.github/workflows/node.js.yml +0 -38
- package/.idea/inspectionProfiles/Project_Default.xml +0 -17
- package/.idea/jsLibraryMappings.xml +0 -6
- package/.idea/misc.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/vcs.xml +0 -6
- package/.idea/workspace.xml +0 -403
- package/.readthedocs.yaml +0 -13
- package/.tool-versions +0 -1
- package/SimpleDomControlClient.iml +0 -12
- package/docs/api-reference.rst +0 -225
- package/docs/conf.py +0 -11
- package/docs/controllers.rst +0 -228
- package/docs/events-and-dom.rst +0 -120
- package/docs/getting-started.rst +0 -143
- package/docs/index.rst +0 -22
- package/docs/models.rst +0 -351
- package/docs/overview.rst +0 -66
- package/docs/requirements.txt +0 -1
- package/eslint.config.js +0 -43
- package/gulpfile.cjs +0 -30
- package/jest.config.mjs +0 -197
- package/test/controller.test.js +0 -93
- package/test/dist.test.js +0 -127
- package/test/model.test.js +0 -330
- package/test/models/Author.js +0 -145
- package/test/models/Book.js +0 -112
- package/test/models/BookContent.js +0 -114
- package/test/models/SdcUser.js +0 -75
- package/test/models/src.js +0 -8
- package/test/sdc_model_dates.ai.test.js +0 -57
- package/test/sdc_server_call.ai.test.js +0 -267
- package/test/utils.js +0 -88
- package/test/view.test.js +0 -159
- package/test-setup.js +0 -4
- package/webpack.config/webpack.default.config.cjs +0 -14
- package/webpack.config/webpack.development.config.cjs +0 -14
- package/webpack.config/webpack.production.config.cjs +0 -11
package/dist/index.js
CHANGED
|
@@ -8,13 +8,23 @@
|
|
|
8
8
|
*/
|
|
9
9
|
/******/ var __webpack_modules__ = ({
|
|
10
10
|
|
|
11
|
+
/***/ "./node_modules/js-cookie/dist/js.cookie.mjs"
|
|
12
|
+
/*!***************************************************!*\
|
|
13
|
+
!*** ./node_modules/js-cookie/dist/js.cookie.mjs ***!
|
|
14
|
+
\***************************************************/
|
|
15
|
+
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
16
|
+
|
|
17
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ api)\n/* harmony export */ });\n/*! js-cookie v3.0.8 | MIT */\nfunction assign (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (key === '__proto__') continue\n target[key] = source[key];\n }\n }\n return target\n}\n\nvar defaultConverter = {\n read: function (value) {\n if (value[0] === '\"') {\n value = value.slice(1, -1);\n }\n return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent)\n },\n write: function (value) {\n return encodeURIComponent(value).replace(\n /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\n decodeURIComponent\n )\n }\n};\n\nfunction init(converter, defaultAttributes) {\n function set(name, value, attributes) {\n if (typeof document === 'undefined') {\n return\n }\n\n attributes = assign({}, defaultAttributes, attributes);\n\n if (typeof attributes.expires === 'number') {\n attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n }\n if (attributes.expires) {\n attributes.expires = attributes.expires.toUTCString();\n }\n\n name = encodeURIComponent(name)\n .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n .replace(/[()]/g, escape);\n\n var stringifiedAttributes = '';\n for (var attributeName in attributes) {\n if (!attributes[attributeName]) {\n continue\n }\n\n stringifiedAttributes += '; ' + attributeName;\n\n if (attributes[attributeName] === true) {\n continue\n }\n\n // Considers RFC 6265 section 5.2:\n // ...\n // 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n // character:\n // Consume the characters of the unparsed-attributes up to,\n // not including, the first %x3B (\";\") character.\n // ...\n stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n }\n\n return (document.cookie =\n name + '=' + converter.write(value, name) + stringifiedAttributes)\n }\n\n function get(name) {\n if (typeof document === 'undefined' || (arguments.length && !name)) {\n return\n }\n\n // To prevent the for loop in the first place assign an empty array\n // in case there are no cookies at all.\n var cookies = document.cookie ? document.cookie.split('; ') : [];\n var jar = {};\n for (var i = 0; i < cookies.length; i++) {\n var parts = cookies[i].split('=');\n var value = parts.slice(1).join('=');\n\n try {\n var found = decodeURIComponent(parts[0]);\n if (!(found in jar)) jar[found] = converter.read(value, found);\n if (name === found) {\n break\n }\n } catch (_e) {\n // Do nothing...\n }\n }\n\n return name ? jar[name] : jar\n }\n\n return Object.create(\n {\n set: set,\n get: get,\n remove: function (name, attributes) {\n set(\n name,\n '',\n assign({}, attributes, {\n expires: -1\n })\n );\n },\n withAttributes: function (attributes) {\n return init(this.converter, assign({}, this.attributes, attributes))\n },\n withConverter: function (converter) {\n return init(assign({}, this.converter, converter), this.attributes)\n }\n },\n {\n attributes: { value: Object.freeze(defaultAttributes) },\n converter: { value: Object.freeze(converter) }\n }\n )\n}\n\nvar api = init(defaultConverter, { path: '/' });\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvanMtY29va2llL2Rpc3QvanMuY29va2llLm1qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBLGtCQUFrQixzQkFBc0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLEVBQUU7QUFDdEMsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMEJBQTBCOztBQUUxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0NBQWtDOztBQUVsQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFFQUFxRTtBQUNyRTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0EsdUVBQXVFO0FBQ3ZFOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNkRBQTZEO0FBQzdEO0FBQ0Esb0JBQW9CLG9CQUFvQjtBQUN4QztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsV0FBVztBQUNYO0FBQ0EsT0FBTztBQUNQO0FBQ0EsNkNBQTZDO0FBQzdDLE9BQU87QUFDUDtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBLEtBQUs7QUFDTDtBQUNBLG9CQUFvQix5Q0FBeUM7QUFDN0QsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTs7QUFFQSxtQ0FBbUMsV0FBVzs7QUFFcEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vbm9kZV9tb2R1bGVzL2pzLWNvb2tpZS9kaXN0L2pzLmNvb2tpZS5tanM/MDlkYiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiEganMtY29va2llIHYzLjAuOCB8IE1JVCAqL1xuZnVuY3Rpb24gYXNzaWduICh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nKSBjb250aW51ZVxuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldFxufVxuXG52YXIgZGVmYXVsdENvbnZlcnRlciA9IHtcbiAgcmVhZDogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlWzBdID09PSAnXCInKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyglW1xcZEEtRl17Mn0pKy9naSwgZGVjb2RlVVJJQ29tcG9uZW50KVxuICB9LFxuICB3cml0ZTogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSkucmVwbGFjZShcbiAgICAgIC8lKDJbMzQ2QkZdfDNbQUMtRl18NDB8NVtCREVdfDYwfDdbQkNEXSkvZyxcbiAgICAgIGRlY29kZVVSSUNvbXBvbmVudFxuICAgIClcbiAgfVxufTtcblxuZnVuY3Rpb24gaW5pdChjb252ZXJ0ZXIsIGRlZmF1bHRBdHRyaWJ1dGVzKSB7XG4gIGZ1bmN0aW9uIHNldChuYW1lLCB2YWx1ZSwgYXR0cmlidXRlcykge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHt9LCBkZWZhdWx0QXR0cmlidXRlcywgYXR0cmlidXRlcyk7XG5cbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZXhwaXJlcyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IG5ldyBEYXRlKERhdGUubm93KCkgKyBhdHRyaWJ1dGVzLmV4cGlyZXMgKiA4NjRlNSk7XG4gICAgfVxuICAgIGlmIChhdHRyaWJ1dGVzLmV4cGlyZXMpIHtcbiAgICAgIGF0dHJpYnV0ZXMuZXhwaXJlcyA9IGF0dHJpYnV0ZXMuZXhwaXJlcy50b1VUQ1N0cmluZygpO1xuICAgIH1cblxuICAgIG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSlcbiAgICAgIC5yZXBsYWNlKC8lKDJbMzQ2Ql18NUV8NjB8N0MpL2csIGRlY29kZVVSSUNvbXBvbmVudClcbiAgICAgIC5yZXBsYWNlKC9bKCldL2csIGVzY2FwZSk7XG5cbiAgICB2YXIgc3RyaW5naWZpZWRBdHRyaWJ1dGVzID0gJyc7XG4gICAgZm9yICh2YXIgYXR0cmlidXRlTmFtZSBpbiBhdHRyaWJ1dGVzKSB7XG4gICAgICBpZiAoIWF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgc3RyaW5naWZpZWRBdHRyaWJ1dGVzICs9ICc7ICcgKyBhdHRyaWJ1dGVOYW1lO1xuXG4gICAgICBpZiAoYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSA9PT0gdHJ1ZSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBDb25zaWRlcnMgUkZDIDYyNjUgc2VjdGlvbiA1LjI6XG4gICAgICAvLyAuLi5cbiAgICAgIC8vIDMuICBJZiB0aGUgcmVtYWluaW5nIHVucGFyc2VkLWF0dHJpYnV0ZXMgY29udGFpbnMgYSAleDNCIChcIjtcIilcbiAgICAgIC8vICAgICBjaGFyYWN0ZXI6XG4gICAgICAvLyBDb25zdW1lIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bnBhcnNlZC1hdHRyaWJ1dGVzIHVwIHRvLFxuICAgICAgLy8gbm90IGluY2x1ZGluZywgdGhlIGZpcnN0ICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXIuXG4gICAgICAvLyAuLi5cbiAgICAgIHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnPScgKyBhdHRyaWJ1dGVzW2F0dHJpYnV0ZU5hbWVdLnNwbGl0KCc7JylbMF07XG4gICAgfVxuXG4gICAgcmV0dXJuIChkb2N1bWVudC5jb29raWUgPVxuICAgICAgbmFtZSArICc9JyArIGNvbnZlcnRlci53cml0ZSh2YWx1ZSwgbmFtZSkgKyBzdHJpbmdpZmllZEF0dHJpYnV0ZXMpXG4gIH1cblxuICBmdW5jdGlvbiBnZXQobmFtZSkge1xuICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IChhcmd1bWVudHMubGVuZ3RoICYmICFuYW1lKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gVG8gcHJldmVudCB0aGUgZm9yIGxvb3AgaW4gdGhlIGZpcnN0IHBsYWNlIGFzc2lnbiBhbiBlbXB0eSBhcnJheVxuICAgIC8vIGluIGNhc2UgdGhlcmUgYXJlIG5vIGNvb2tpZXMgYXQgYWxsLlxuICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW107XG4gICAgdmFyIGphciA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcnRzID0gY29va2llc1tpXS5zcGxpdCgnPScpO1xuICAgICAgdmFyIHZhbHVlID0gcGFydHMuc2xpY2UoMSkuam9pbignPScpO1xuXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgZm91bmQgPSBkZWNvZGVVUklDb21wb25lbnQocGFydHNbMF0pO1xuICAgICAgICBpZiAoIShmb3VuZCBpbiBqYXIpKSBqYXJbZm91bmRdID0gY29udmVydGVyLnJlYWQodmFsdWUsIGZvdW5kKTtcbiAgICAgICAgaWYgKG5hbWUgPT09IGZvdW5kKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgICAgLy8gRG8gbm90aGluZy4uLlxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuYW1lID8gamFyW25hbWVdIDogamFyXG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmNyZWF0ZShcbiAgICB7XG4gICAgICBzZXQ6IHNldCxcbiAgICAgIGdldDogZ2V0LFxuICAgICAgcmVtb3ZlOiBmdW5jdGlvbiAobmFtZSwgYXR0cmlidXRlcykge1xuICAgICAgICBzZXQoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBhc3NpZ24oe30sIGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIGV4cGlyZXM6IC0xXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICB3aXRoQXR0cmlidXRlczogZnVuY3Rpb24gKGF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuIGluaXQodGhpcy5jb252ZXJ0ZXIsIGFzc2lnbih7fSwgdGhpcy5hdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzKSlcbiAgICAgIH0sXG4gICAgICB3aXRoQ29udmVydGVyOiBmdW5jdGlvbiAoY29udmVydGVyKSB7XG4gICAgICAgIHJldHVybiBpbml0KGFzc2lnbih7fSwgdGhpcy5jb252ZXJ0ZXIsIGNvbnZlcnRlciksIHRoaXMuYXR0cmlidXRlcylcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGF0dHJpYnV0ZXM6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoZGVmYXVsdEF0dHJpYnV0ZXMpIH0sXG4gICAgICBjb252ZXJ0ZXI6IHsgdmFsdWU6IE9iamVjdC5mcmVlemUoY29udmVydGVyKSB9XG4gICAgfVxuICApXG59XG5cbnZhciBhcGkgPSBpbml0KGRlZmF1bHRDb252ZXJ0ZXIsIHsgcGF0aDogJy8nIH0pO1xuXG5leHBvcnQgeyBhcGkgYXMgZGVmYXVsdCB9O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/js-cookie/dist/js.cookie.mjs\n\n}");
|
|
18
|
+
|
|
19
|
+
/***/ },
|
|
20
|
+
|
|
11
21
|
/***/ "./src/index.js"
|
|
12
22
|
/*!**********************!*\
|
|
13
23
|
!*** ./src/index.js ***!
|
|
14
24
|
\**********************/
|
|
15
25
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
16
26
|
|
|
17
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbstractSDC: () => (/* reexport safe */ _simpleDomControl_AbstractSDC_js__WEBPACK_IMPORTED_MODULE_1__.AbstractSDC),\n/* harmony export */ SdcModel: () => (/* reexport safe */ _simpleDomControl_sdc_model_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ SdcQuerySet: () => (/* reexport safe */ _simpleDomControl_sdc_model_js__WEBPACK_IMPORTED_MODULE_2__.SdcQuerySet),\n/* harmony export */ allOff: () => (/* reexport safe */
|
|
27
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbstractSDC: () => (/* reexport safe */ _simpleDomControl_AbstractSDC_js__WEBPACK_IMPORTED_MODULE_1__.AbstractSDC),\n/* harmony export */ SdcModel: () => (/* reexport safe */ _simpleDomControl_sdc_model_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */ SdcQuerySet: () => (/* reexport safe */ _simpleDomControl_sdc_model_js__WEBPACK_IMPORTED_MODULE_2__.SdcQuerySet),\n/* harmony export */ allOff: () => (/* reexport safe */ _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.allOff),\n/* harmony export */ app: () => (/* reexport safe */ _simpleDomControl_sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app),\n/* harmony export */ checkIfParamNumberBoolOrString: () => (/* reexport safe */ _simpleDomControl_sdc_utils_js__WEBPACK_IMPORTED_MODULE_6__.checkIfParamNumberBoolOrString),\n/* harmony export */ clearErrorsInForm: () => (/* reexport safe */ _simpleDomControl_sdc_utils_js__WEBPACK_IMPORTED_MODULE_6__.clearErrorsInForm),\n/* harmony export */ controllerFactory: () => (/* reexport safe */ _simpleDomControl_sdc_controller_js__WEBPACK_IMPORTED_MODULE_7__.controllerFactory),\n/* harmony export */ on: () => (/* reexport safe */ _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.on),\n/* harmony export */ registerModel: () => (/* reexport safe */ _simpleDomControl_sdc_socket_js__WEBPACK_IMPORTED_MODULE_3__.registerModel),\n/* harmony export */ runControlFlowFunctions: () => (/* reexport safe */ _simpleDomControl_sdc_controller_js__WEBPACK_IMPORTED_MODULE_7__.runControlFlowFunctions),\n/* harmony export */ setErrorsInForm: () => (/* reexport safe */ _simpleDomControl_sdc_utils_js__WEBPACK_IMPORTED_MODULE_6__.setErrorsInForm),\n/* harmony export */ setEvent: () => (/* reexport safe */ _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.setEvent),\n/* harmony export */ socketReconnect: () => (/* binding */ socketReconnect),\n/* harmony export */ test_utils: () => (/* binding */ test_utils),\n/* harmony export */ trigger: () => (/* reexport safe */ _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.trigger)\n/* harmony export */ });\n/* harmony import */ var _simpleDomControl_sdc_main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./simpleDomControl/sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _simpleDomControl_AbstractSDC_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./simpleDomControl/AbstractSDC.js */ \"./src/simpleDomControl/AbstractSDC.js\");\n/* harmony import */ var _simpleDomControl_sdc_model_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./simpleDomControl/sdc_model.js */ \"./src/simpleDomControl/sdc_model.js\");\n/* harmony import */ var _simpleDomControl_sdc_socket_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./simpleDomControl/sdc_socket.js */ \"./src/simpleDomControl/sdc_socket.js\");\n/* harmony import */ var js_cookie__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! js-cookie */ \"./node_modules/js-cookie/dist/js.cookie.mjs\");\n/* harmony import */ var _simpleDomControl_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./simpleDomControl/sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _simpleDomControl_sdc_utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./simpleDomControl/sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _simpleDomControl_sdc_controller_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./simpleDomControl/sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _simpleDomControl_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./simpleDomControl/sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n/* harmony import */ var _simpleDomControl_sdc_test_utils_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./simpleDomControl/sdc_test_utils.js */ \"./src/simpleDomControl/sdc_test_utils.js\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst socketReconnect = _simpleDomControl_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_8__.close;\nconst test_utils = {\n get_controller: _simpleDomControl_sdc_test_utils_js__WEBPACK_IMPORTED_MODULE_9__.get_controller,\n getCsrfToken: _simpleDomControl_sdc_test_utils_js__WEBPACK_IMPORTED_MODULE_9__.getCsrfToken,\n controllerFromTestHtml: _simpleDomControl_sdc_test_utils_js__WEBPACK_IMPORTED_MODULE_9__.controllerFromTestHtml,\n logout: () => {\n js_cookie__WEBPACK_IMPORTED_MODULE_4__[\"default\"].remove(\"sessionid\");\n console.log(\"Logged out\");\n },\n login: (user) => {\n const sessionId = globalThis.SDC_TEST_USER?.[user];\n if (!sessionId) {\n js_cookie__WEBPACK_IMPORTED_MODULE_4__[\"default\"].remove(\"sessionid\");\n console.warn(`Unknown test user: ${user}`);\n return false;\n }\n js_cookie__WEBPACK_IMPORTED_MODULE_4__[\"default\"].set(\"sessionid\", sessionId);\n console.log(`Logged in as ${user}`);\n return true;\n },\n};\n\nif(window) {\n window.sdcApp = _simpleDomControl_sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app;\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBcUQ7QUFDVztBQUNRO0FBQ1A7QUFDakM7QUFNVTs7QUFNRDtBQUlLO0FBQ2dCO0FBS2hCOztBQUU5Qyx3QkFBd0IsdUVBQUs7QUFDN0I7QUFDQSxnQkFBZ0I7QUFDaEIsY0FBYztBQUNkLHdCQUF3QjtBQUN4QjtBQUNBLElBQUksaURBQU87QUFDWDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxNQUFNLGlEQUFPO0FBQ2IseUNBQXlDLEtBQUs7QUFDOUM7QUFDQTtBQUNBLElBQUksaURBQU87QUFDWCxnQ0FBZ0MsS0FBSztBQUNyQztBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBLGtCQUFrQiw4REFBRztBQUNyQjs7QUFtQkUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL2luZGV4LmpzP2U1ZjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXBwIH0gZnJvbSBcIi4vc2ltcGxlRG9tQ29udHJvbC9zZGNfbWFpbi5qc1wiO1xuaW1wb3J0IHsgQWJzdHJhY3RTREMgfSBmcm9tIFwiLi9zaW1wbGVEb21Db250cm9sL0Fic3RyYWN0U0RDLmpzXCI7XG5pbXBvcnQgU2RjTW9kZWwsIHsgU2RjUXVlcnlTZXQgfSBmcm9tIFwiLi9zaW1wbGVEb21Db250cm9sL3NkY19tb2RlbC5qc1wiO1xuaW1wb3J0IHsgcmVnaXN0ZXJNb2RlbCB9IGZyb20gXCIuL3NpbXBsZURvbUNvbnRyb2wvc2RjX3NvY2tldC5qc1wiO1xuaW1wb3J0IENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xuaW1wb3J0IHtcbiAgb24sXG4gIHRyaWdnZXIsXG4gIGFsbE9mZixcbiAgc2V0RXZlbnQsXG59IGZyb20gXCIuL3NpbXBsZURvbUNvbnRyb2wvc2RjX2V2ZW50cy5qc1wiO1xuXG5pbXBvcnQge1xuICBjbGVhckVycm9yc0luRm9ybSxcbiAgc2V0RXJyb3JzSW5Gb3JtLFxuICBjaGVja0lmUGFyYW1OdW1iZXJCb29sT3JTdHJpbmcsXG59IGZyb20gXCIuL3NpbXBsZURvbUNvbnRyb2wvc2RjX3V0aWxzLmpzXCI7XG5pbXBvcnQge1xuICBjb250cm9sbGVyRmFjdG9yeSxcbiAgcnVuQ29udHJvbEZsb3dGdW5jdGlvbnMsXG59IGZyb20gXCIuL3NpbXBsZURvbUNvbnRyb2wvc2RjX2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB7IGNsb3NlIH0gZnJvbSBcIi4vc2ltcGxlRG9tQ29udHJvbC9zZGNfc2VydmVyX2NhbGwuanNcIjtcbmltcG9ydCB7XG4gIGdldF9jb250cm9sbGVyLFxuICBnZXRDc3JmVG9rZW4sXG4gIGNvbnRyb2xsZXJGcm9tVGVzdEh0bWwsXG59IGZyb20gXCIuL3NpbXBsZURvbUNvbnRyb2wvc2RjX3Rlc3RfdXRpbHMuanNcIjtcblxuY29uc3Qgc29ja2V0UmVjb25uZWN0ID0gY2xvc2U7XG5jb25zdCB0ZXN0X3V0aWxzID0ge1xuICBnZXRfY29udHJvbGxlcixcbiAgZ2V0Q3NyZlRva2VuLFxuICBjb250cm9sbGVyRnJvbVRlc3RIdG1sLFxuICBsb2dvdXQ6ICgpID0+IHtcbiAgICBDb29raWVzLnJlbW92ZShcInNlc3Npb25pZFwiKTtcbiAgICBjb25zb2xlLmxvZyhcIkxvZ2dlZCBvdXRcIik7XG4gIH0sXG4gIGxvZ2luOiAodXNlcikgPT4ge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IGdsb2JhbFRoaXMuU0RDX1RFU1RfVVNFUj8uW3VzZXJdO1xuICAgIGlmICghc2Vzc2lvbklkKSB7XG4gICAgICBDb29raWVzLnJlbW92ZShcInNlc3Npb25pZFwiKTtcbiAgICAgIGNvbnNvbGUud2FybihgVW5rbm93biB0ZXN0IHVzZXI6ICR7dXNlcn1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgQ29va2llcy5zZXQoXCJzZXNzaW9uaWRcIiwgc2Vzc2lvbklkKTtcbiAgICBjb25zb2xlLmxvZyhgTG9nZ2VkIGluIGFzICR7dXNlcn1gKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSxcbn07XG5cbmlmKHdpbmRvdykge1xuICB3aW5kb3cuc2RjQXBwID0gYXBwO1xufVxuXG5leHBvcnQge1xuICBhcHAsXG4gIEFic3RyYWN0U0RDLFxuICBvbixcbiAgdHJpZ2dlcixcbiAgYWxsT2ZmLFxuICBzZXRFdmVudCxcbiAgY2xlYXJFcnJvcnNJbkZvcm0sXG4gIHNldEVycm9yc0luRm9ybSxcbiAgY2hlY2tJZlBhcmFtTnVtYmVyQm9vbE9yU3RyaW5nLFxuICBjb250cm9sbGVyRmFjdG9yeSxcbiAgcnVuQ29udHJvbEZsb3dGdW5jdGlvbnMsXG4gIHNvY2tldFJlY29ubmVjdCxcbiAgdGVzdF91dGlscyxcbiAgU2RjTW9kZWwsXG4gIFNkY1F1ZXJ5U2V0LFxuICByZWdpc3Rlck1vZGVsLFxufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/index.js\n\n}");
|
|
18
28
|
|
|
19
29
|
/***/ },
|
|
20
30
|
|
|
@@ -24,7 +34,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
24
34
|
\*********************************************/
|
|
25
35
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
26
36
|
|
|
27
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbstractSDC: () => (/* binding */ AbstractSDC)\n/* harmony export */ });\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_model_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_model.js */ \"./src/simpleDomControl/sdc_model.js\");\n/* harmony import */ var _sdc_server_call_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n\n\n\n\n\n\nclass AbstractSDC {\n constructor() {\n this._uuid = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.uuidv4)();\n this.contentUrl = \"\";\n this.contentReload = false;\n this.parsedContentUrl = null;\n this.events = [];\n this.load_async = false;\n this._isEventsSet = false;\n this._allEvents = null;\n this._autoRedirect = null;\n this._params = {};\n\n this._urlParams = [];\n this._models = [];\n\n // ------------------ Old deprecated properties ----------------------\n this._cssUrls = [];\n this.afterShow = () => {\n console.warn(\"afterShow is deprecated!!\");\n };\n // -------------- End old deprecated properties ----------------------\n\n /**\n *\n * @type {{string: AbstractSDC}}\n */\n this._mixins = {};\n\n /**\n * @type {string}\n */\n this._tagName = Object.getPrototypeOf(this)._tagName ?? \"\";\n\n /**\n * @type {{string:AbstractSDC}}\n */\n this._childController = {};\n\n /**\n * @type {AbstractSDC}\n */\n this._parentController = null;\n\n /**\n * @type {boolean}\n */\n this._onLoadDone = false;\n\n /**\n * @type {jquery}\n */\n this.$container = null;\n\n /**\n *\n * @type {boolean}\n */\n this._isMixin = false;\n }\n\n get params() {\n return this._params;\n }\n\n set params(params) {\n this._params = params;\n }\n\n /**\n *\n * @param {string} method must be in {}\n * @param {Array} args in arguments of\n *\n */\n _runLifecycle(method, args) {\n if (_sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.DEBUG && !this._isMixin) {\n console.debug(method, this._tagName);\n }\n\n let returnPromisses = [];\n if (this._isMixin) {\n return;\n }\n this._isMixin = true;\n for (let mixinKey in this._mixins) {\n let mixin = this._mixins[mixinKey];\n if (typeof mixin[method] === \"function\") {\n returnPromisses.push(mixin[method].apply(this, args));\n }\n }\n\n return Promise.all(returnPromisses).then(() => {\n this._isMixin = false;\n });\n }\n\n /**\n *\n * @return {Promise<*>|*}\n */\n onInit() {\n if (_sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.DEBUG && !this._isMixin) {\n console.debug(Array.apply(null, arguments), this._tagName);\n }\n }\n\n set autoRedirect(url){\n this._autoRedirect = url;\n }\n\n get autoRedirect() {\n return this._autoRedirect;\n }\n\n get parentController() {\n return this._parentController;\n }\n\n get childController() {\n return this._childController;\n }\n\n onLoad() {\n return this._runLifecycle(\"onLoad\", arguments);\n }\n\n willShow() {\n return this._runLifecycle(\"willShow\", arguments);\n }\n\n onRefresh() {\n return this._runLifecycle(\"onRefresh\", arguments);\n }\n\n onRemove() {\n this._runLifecycle(\"onRemove\", arguments);\n return true;\n }\n\n noOpenModelRequests() {\n return Promise.all(this._models.map((x) => x.noOpenRequests()));\n }\n\n remove() {\n for (const model of this._models) {\n model.close();\n }\n let _childController = this._childController;\n for (let i in _childController) {\n if (_childController.hasOwnProperty(i)) {\n for (let cc of _childController[i]) {\n if (!cc.remove()) {\n return false;\n }\n }\n }\n }\n\n if (!this.onRemove || this.onRemove()) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_0__.allOff)(this);\n const c_name = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.tagNameToCamelCase)(this._tagName);\n if (this._parentController._childController[c_name]) {\n let arr = this._parentController._childController[c_name];\n for (let i = 0; i < arr.length; i++) {\n if (arr[i] === this) {\n arr.splice(i, 1);\n }\n }\n }\n\n this.$container.remove();\n delete this;\n return true;\n }\n\n return false;\n }\n\n controller_name() {\n return (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.tagNameToReadableName)(this._tagName);\n }\n\n addEvent(event, selector, handler) {\n this.getEvents();\n this._allEvents[event] = this._allEvents[event] || {};\n this._allEvents[event][selector] = handler;\n }\n\n getEvents() {\n if (this._allEvents) return this._allEvents;\n let allEvents = [];\n allEvents = allEvents.concat(this.events);\n for (let mixinKey in this._mixins) {\n let mixin = this._mixins[mixinKey];\n if (Array.isArray(mixin.events)) {\n allEvents = allEvents.concat(mixin.events);\n }\n }\n\n return (this._allEvents = _.merge(...allEvents));\n }\n\n post(url, args) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.post(this, url, args);\n }\n\n get(url, args) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.get(this, url, args);\n }\n\n submitForm(form, url, method) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.submitFormAndUpdateView(this, form, url, method);\n }\n\n serverCall(methode, args) {\n let re = /sdc_view\\/([^/]+)/i;\n let app = this.contentUrl.match(re);\n if (!app || app.length < 2) {\n console.error(\n \"To use the serverCall function the contentUrl must be set: \" +\n this.name,\n );\n return;\n }\n\n return (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_3__.callServer)(\n app[1],\n this._tagName,\n this.parsedContentUrl ?? this.contentUrl,\n methode,\n args,\n );\n }\n\n /**\n *\n * @param {string} modelName\n * @param {object?} modelQuery\n * @returns {SdcQuerySet}\n */\n querySet(modelName, modelQuery = {}) {\n const newQuerySet = new _sdc_model_js__WEBPACK_IMPORTED_MODULE_2__.SdcQuerySet(modelName, modelQuery);\n this._models.push(newQuerySet);\n return newQuerySet;\n }\n\n newModel(modelName, modelQuery = {}) {\n console.warn(\"newModel is deprecated and will soon be removed. Please use this.querySet(modelName, modelQuery)\");\n return this.querySet(modelName, modelQuery);\n }\n\n /**\n * Adapter to this.$container.find\n * @param {string} domSelector\n */\n find(domSelector) {\n return this.$container.find(domSelector);\n }\n\n refresh() {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.refresh(this.$container, this);\n }\n\n reload() {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.reloadController(this);\n }\n\n reconcile($virtualNode, $realNode = null) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.reconcile(this, $virtualNode, $realNode);\n }\n\n submitModelFormDistributor($form, e) {\n if (typeof this._submitModelForm === \"function\") {\n return this._submitModelForm($form, e);\n }\n if (typeof this.submitModelForm === \"function\") {\n return this.submitModelForm($form, e);\n }\n return this.defaultSubmitModelForm($form, e);\n }\n\n iterateAllChildren() {\n let _childController = this._childController;\n let res = [];\n for (let i in _childController) {\n if (_childController.hasOwnProperty(i)) {\n for (let cc of _childController[i]) {\n res.push(cc);\n res.push(...cc.iterateAllChildren());\n }\n }\n }\n return res;\n }\n\n /**\n * Model Form Events\n */\n defaultSubmitModelForm($form, e) {\n if (!this._isMixin) {\n e.stopPropagation();\n e.preventDefault();\n let {model, form_name} = $form.data();\n let data = model.syncForm($form);\n return new Promise((resolve, reject) => {\n let prom;\n if (model.id !== null && model.id >= 0) {\n prom = model.save({formName: form_name, data});\n } else {\n prom = model.create({data});\n }\n\n prom\n .then((res) => {\n ;(0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.clearErrorsInForm)($form);\n this.submit_model_form_success &&\n this.submit_model_form_success(res[0]);\n for (const controller of this.iterateAllChildren()) {\n controller.submit_model_form_success &&\n controller.submit_model_form_success(res[0]);\n }\n\n resolve(res);\n })\n .catch((data) => {\n this.reconcile(\n $(`<div class=\"container-fluid\">${data.html}</div>`),\n $form.find(\".container-fluid\").first(),\n );\n this.submit_model_form_error &&\n this.submit_model_form_error(data);\n for (const controller of this.iterateAllChildren()) {\n controller.submit_model_form_error &&\n controller.submit_model_form_error(data);\n }\n\n reject(data);\n });\n });\n }\n\n return Promise.resolve();\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9BYnN0cmFjdFNEQy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBdUM7QUFDTDtBQUNTO0FBQ0s7QUFNeEI7O0FBRWpCO0FBQ1A7QUFDQSxpQkFBaUIscURBQU07QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQSxRQUFRLDZDQUFHO0FBQ1g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0EsUUFBUSw2Q0FBRztBQUNYO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLHNEQUFNO0FBQ1oscUJBQXFCLGlFQUFrQjtBQUN2QztBQUNBO0FBQ0Esd0JBQXdCLGdCQUFnQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLG9FQUFxQjtBQUNoQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLDZDQUFHO0FBQ2Q7O0FBRUE7QUFDQSxXQUFXLDZDQUFHO0FBQ2Q7O0FBRUE7QUFDQSxXQUFXLDZDQUFHO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsV0FBVywrREFBVTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCLGNBQWMsU0FBUztBQUN2QixlQUFlO0FBQ2Y7QUFDQSxxQ0FBcUM7QUFDckMsNEJBQTRCLHNEQUFXO0FBQ3ZDO0FBQ0E7QUFDQTs7QUFFQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLDZDQUFHO0FBQ2Q7O0FBRUE7QUFDQSxXQUFXLDZDQUFHO0FBQ2Q7O0FBRUE7QUFDQSxXQUFXLDZDQUFHO0FBQ2Q7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrQkFBa0I7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsMEJBQTBCO0FBQ3ZELFVBQVU7QUFDViwrQkFBK0IsS0FBSztBQUNwQzs7QUFFQTtBQUNBO0FBQ0EsWUFBWSxpRUFBaUI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxnREFBZ0QsVUFBVTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVztBQUNYLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvQWJzdHJhY3RTREMuanM/ZjU3YSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FsbE9mZn0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuaW1wb3J0IHthcHB9IGZyb20gXCIuL3NkY19tYWluLmpzXCI7XG5pbXBvcnQge1NkY1F1ZXJ5U2V0fSBmcm9tIFwiLi9zZGNfbW9kZWwuanNcIjtcbmltcG9ydCB7Y2FsbFNlcnZlcn0gZnJvbSBcIi4vc2RjX3NlcnZlcl9jYWxsLmpzXCI7XG5pbXBvcnQge1xuICB1dWlkdjQsXG4gIGNsZWFyRXJyb3JzSW5Gb3JtLFxuICB0YWdOYW1lVG9DYW1lbENhc2UsXG4gIHRhZ05hbWVUb1JlYWRhYmxlTmFtZSxcbn0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBBYnN0cmFjdFNEQyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3V1aWQgPSB1dWlkdjQoKTtcbiAgICB0aGlzLmNvbnRlbnRVcmwgPSBcIlwiO1xuICAgIHRoaXMuY29udGVudFJlbG9hZCA9IGZhbHNlO1xuICAgIHRoaXMucGFyc2VkQ29udGVudFVybCA9IG51bGw7XG4gICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICB0aGlzLmxvYWRfYXN5bmMgPSBmYWxzZTtcbiAgICB0aGlzLl9pc0V2ZW50c1NldCA9IGZhbHNlO1xuICAgIHRoaXMuX2FsbEV2ZW50cyA9IG51bGw7XG4gICAgdGhpcy5fYXV0b1JlZGlyZWN0ID0gbnVsbDtcbiAgICB0aGlzLl9wYXJhbXMgPSB7fTtcblxuICAgIHRoaXMuX3VybFBhcmFtcyA9IFtdO1xuICAgIHRoaXMuX21vZGVscyA9IFtdO1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tIE9sZCBkZXByZWNhdGVkIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHRoaXMuX2Nzc1VybHMgPSBbXTtcbiAgICB0aGlzLmFmdGVyU2hvdyA9ICgpID0+IHtcbiAgICAgIGNvbnNvbGUud2FybihcImFmdGVyU2hvdyBpcyBkZXByZWNhdGVkISFcIik7XG4gICAgfTtcbiAgICAvLyAtLS0tLS0tLS0tLS0tLSBFbmQgb2xkIGRlcHJlY2F0ZWQgcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEB0eXBlIHt7c3RyaW5nOiBBYnN0cmFjdFNEQ319XG4gICAgICovXG4gICAgdGhpcy5fbWl4aW5zID0ge307XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIHRoaXMuX3RhZ05hbWUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX3RhZ05hbWUgPz8gXCJcIjtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHt7c3RyaW5nOkFic3RyYWN0U0RDfX1cbiAgICAgKi9cbiAgICB0aGlzLl9jaGlsZENvbnRyb2xsZXIgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtBYnN0cmFjdFNEQ31cbiAgICAgKi9cbiAgICB0aGlzLl9wYXJlbnRDb250cm9sbGVyID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuX29uTG9hZERvbmUgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtqcXVlcnl9XG4gICAgICovXG4gICAgdGhpcy4kY29udGFpbmVyID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgdGhpcy5faXNNaXhpbiA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHBhcmFtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1zO1xuICB9XG5cbiAgc2V0IHBhcmFtcyhwYXJhbXMpIHtcbiAgICB0aGlzLl9wYXJhbXMgPSBwYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZCBtdXN0IGJlIGluIHt9XG4gICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgaW4gYXJndW1lbnRzIG9mXG4gICAqXG4gICAqL1xuICBfcnVuTGlmZWN5Y2xlKG1ldGhvZCwgYXJncykge1xuICAgIGlmIChhcHAuREVCVUcgJiYgIXRoaXMuX2lzTWl4aW4pIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobWV0aG9kLCB0aGlzLl90YWdOYW1lKTtcbiAgICB9XG5cbiAgICBsZXQgcmV0dXJuUHJvbWlzc2VzID0gW107XG4gICAgaWYgKHRoaXMuX2lzTWl4aW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5faXNNaXhpbiA9IHRydWU7XG4gICAgZm9yIChsZXQgbWl4aW5LZXkgaW4gdGhpcy5fbWl4aW5zKSB7XG4gICAgICBsZXQgbWl4aW4gPSB0aGlzLl9taXhpbnNbbWl4aW5LZXldO1xuICAgICAgaWYgKHR5cGVvZiBtaXhpblttZXRob2RdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuUHJvbWlzc2VzLnB1c2gobWl4aW5bbWV0aG9kXS5hcHBseSh0aGlzLCBhcmdzKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHJldHVyblByb21pc3NlcykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLl9pc01peGluID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZTwqPnwqfVxuICAgKi9cbiAgb25Jbml0KCkge1xuICAgIGlmIChhcHAuREVCVUcgJiYgIXRoaXMuX2lzTWl4aW4pIHtcbiAgICAgIGNvbnNvbGUuZGVidWcoQXJyYXkuYXBwbHkobnVsbCwgYXJndW1lbnRzKSwgdGhpcy5fdGFnTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0IGF1dG9SZWRpcmVjdCh1cmwpe1xuICAgIHRoaXMuX2F1dG9SZWRpcmVjdCA9IHVybDtcbiAgfVxuXG4gIGdldCBhdXRvUmVkaXJlY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dG9SZWRpcmVjdDtcbiAgfVxuXG4gIGdldCBwYXJlbnRDb250cm9sbGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRDb250cm9sbGVyO1xuICB9XG5cbiAgZ2V0IGNoaWxkQ29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRDb250cm9sbGVyO1xuICB9XG5cbiAgb25Mb2FkKCkge1xuICAgIHJldHVybiB0aGlzLl9ydW5MaWZlY3ljbGUoXCJvbkxvYWRcIiwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHdpbGxTaG93KCkge1xuICAgIHJldHVybiB0aGlzLl9ydW5MaWZlY3ljbGUoXCJ3aWxsU2hvd1wiLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgb25SZWZyZXNoKCkge1xuICAgIHJldHVybiB0aGlzLl9ydW5MaWZlY3ljbGUoXCJvblJlZnJlc2hcIiwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIG9uUmVtb3ZlKCkge1xuICAgIHRoaXMuX3J1bkxpZmVjeWNsZShcIm9uUmVtb3ZlXCIsIGFyZ3VtZW50cyk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBub09wZW5Nb2RlbFJlcXVlc3RzKCkge1xuICAgIHJldHVybiBQcm9taXNlLmFsbCh0aGlzLl9tb2RlbHMubWFwKCh4KSA9PiB4Lm5vT3BlblJlcXVlc3RzKCkpKTtcbiAgfVxuXG4gIHJlbW92ZSgpIHtcbiAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHRoaXMuX21vZGVscykge1xuICAgICAgbW9kZWwuY2xvc2UoKTtcbiAgICB9XG4gICAgbGV0IF9jaGlsZENvbnRyb2xsZXIgPSB0aGlzLl9jaGlsZENvbnRyb2xsZXI7XG4gICAgZm9yIChsZXQgaSBpbiBfY2hpbGRDb250cm9sbGVyKSB7XG4gICAgICBpZiAoX2NoaWxkQ29udHJvbGxlci5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICBmb3IgKGxldCBjYyBvZiBfY2hpbGRDb250cm9sbGVyW2ldKSB7XG4gICAgICAgICAgaWYgKCFjYy5yZW1vdmUoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5vblJlbW92ZSB8fCB0aGlzLm9uUmVtb3ZlKCkpIHtcbiAgICAgIGFsbE9mZih0aGlzKTtcbiAgICAgIGNvbnN0IGNfbmFtZSA9IHRhZ05hbWVUb0NhbWVsQ2FzZSh0aGlzLl90YWdOYW1lKTtcbiAgICAgIGlmICh0aGlzLl9wYXJlbnRDb250cm9sbGVyLl9jaGlsZENvbnRyb2xsZXJbY19uYW1lXSkge1xuICAgICAgICBsZXQgYXJyID0gdGhpcy5fcGFyZW50Q29udHJvbGxlci5fY2hpbGRDb250cm9sbGVyW2NfbmFtZV07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGFycltpXSA9PT0gdGhpcykge1xuICAgICAgICAgICAgYXJyLnNwbGljZShpLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy4kY29udGFpbmVyLnJlbW92ZSgpO1xuICAgICAgZGVsZXRlIHRoaXM7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb250cm9sbGVyX25hbWUoKSB7XG4gICAgcmV0dXJuIHRhZ05hbWVUb1JlYWRhYmxlTmFtZSh0aGlzLl90YWdOYW1lKTtcbiAgfVxuXG4gIGFkZEV2ZW50KGV2ZW50LCBzZWxlY3RvciwgaGFuZGxlcikge1xuICAgIHRoaXMuZ2V0RXZlbnRzKCk7XG4gICAgdGhpcy5fYWxsRXZlbnRzW2V2ZW50XSA9IHRoaXMuX2FsbEV2ZW50c1tldmVudF0gfHwge307XG4gICAgdGhpcy5fYWxsRXZlbnRzW2V2ZW50XVtzZWxlY3Rvcl0gPSBoYW5kbGVyO1xuICB9XG5cbiAgZ2V0RXZlbnRzKCkge1xuICAgIGlmICh0aGlzLl9hbGxFdmVudHMpIHJldHVybiB0aGlzLl9hbGxFdmVudHM7XG4gICAgbGV0IGFsbEV2ZW50cyA9IFtdO1xuICAgIGFsbEV2ZW50cyA9IGFsbEV2ZW50cy5jb25jYXQodGhpcy5ldmVudHMpO1xuICAgIGZvciAobGV0IG1peGluS2V5IGluIHRoaXMuX21peGlucykge1xuICAgICAgbGV0IG1peGluID0gdGhpcy5fbWl4aW5zW21peGluS2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1peGluLmV2ZW50cykpIHtcbiAgICAgICAgYWxsRXZlbnRzID0gYWxsRXZlbnRzLmNvbmNhdChtaXhpbi5ldmVudHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAodGhpcy5fYWxsRXZlbnRzID0gXy5tZXJnZSguLi5hbGxFdmVudHMpKTtcbiAgfVxuXG4gIHBvc3QodXJsLCBhcmdzKSB7XG4gICAgcmV0dXJuIGFwcC5wb3N0KHRoaXMsIHVybCwgYXJncyk7XG4gIH1cblxuICBnZXQodXJsLCBhcmdzKSB7XG4gICAgcmV0dXJuIGFwcC5nZXQodGhpcywgdXJsLCBhcmdzKTtcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZm9ybSwgdXJsLCBtZXRob2QpIHtcbiAgICByZXR1cm4gYXBwLnN1Ym1pdEZvcm1BbmRVcGRhdGVWaWV3KHRoaXMsIGZvcm0sIHVybCwgbWV0aG9kKTtcbiAgfVxuXG4gIHNlcnZlckNhbGwobWV0aG9kZSwgYXJncykge1xuICAgIGxldCByZSA9IC9zZGNfdmlld1xcLyhbXi9dKykvaTtcbiAgICBsZXQgYXBwID0gdGhpcy5jb250ZW50VXJsLm1hdGNoKHJlKTtcbiAgICBpZiAoIWFwcCB8fCBhcHAubGVuZ3RoIDwgMikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCJUbyB1c2UgdGhlIHNlcnZlckNhbGwgZnVuY3Rpb24gdGhlIGNvbnRlbnRVcmwgbXVzdCBiZSBzZXQ6IFwiICtcbiAgICAgICAgdGhpcy5uYW1lLFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FsbFNlcnZlcihcbiAgICAgIGFwcFsxXSxcbiAgICAgIHRoaXMuX3RhZ05hbWUsXG4gICAgICB0aGlzLnBhcnNlZENvbnRlbnRVcmwgPz8gdGhpcy5jb250ZW50VXJsLFxuICAgICAgbWV0aG9kZSxcbiAgICAgIGFyZ3MsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gICAqIEBwYXJhbSAge29iamVjdD99IG1vZGVsUXVlcnlcbiAgICogQHJldHVybnMge1NkY1F1ZXJ5U2V0fVxuICAgKi9cbiAgcXVlcnlTZXQobW9kZWxOYW1lLCBtb2RlbFF1ZXJ5ID0ge30pIHtcbiAgICBjb25zdCBuZXdRdWVyeVNldCA9IG5ldyBTZGNRdWVyeVNldChtb2RlbE5hbWUsIG1vZGVsUXVlcnkpO1xuICAgIHRoaXMuX21vZGVscy5wdXNoKG5ld1F1ZXJ5U2V0KTtcbiAgICByZXR1cm4gbmV3UXVlcnlTZXQ7XG4gIH1cblxuICBuZXdNb2RlbChtb2RlbE5hbWUsIG1vZGVsUXVlcnkgPSB7fSkge1xuICAgIGNvbnNvbGUud2FybihcIm5ld01vZGVsIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgc29vbiBiZSByZW1vdmVkLiBQbGVhc2UgdXNlIHRoaXMucXVlcnlTZXQobW9kZWxOYW1lLCBtb2RlbFF1ZXJ5KVwiKTtcbiAgICByZXR1cm4gdGhpcy5xdWVyeVNldChtb2RlbE5hbWUsIG1vZGVsUXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkYXB0ZXIgdG8gdGhpcy4kY29udGFpbmVyLmZpbmRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGRvbVNlbGVjdG9yXG4gICAqL1xuICBmaW5kKGRvbVNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIHRoaXMuJGNvbnRhaW5lci5maW5kKGRvbVNlbGVjdG9yKTtcbiAgfVxuXG4gIHJlZnJlc2goKSB7XG4gICAgcmV0dXJuIGFwcC5yZWZyZXNoKHRoaXMuJGNvbnRhaW5lciwgdGhpcyk7XG4gIH1cblxuICByZWxvYWQoKSB7XG4gICAgcmV0dXJuIGFwcC5yZWxvYWRDb250cm9sbGVyKHRoaXMpO1xuICB9XG5cbiAgcmVjb25jaWxlKCR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlID0gbnVsbCkge1xuICAgIHJldHVybiBhcHAucmVjb25jaWxlKHRoaXMsICR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlKTtcbiAgfVxuXG4gIHN1Ym1pdE1vZGVsRm9ybURpc3RyaWJ1dG9yKCRmb3JtLCBlKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9zdWJtaXRNb2RlbEZvcm0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRoaXMuX3N1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdGhpcy5zdWJtaXRNb2RlbEZvcm0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIHRoaXMuc3VibWl0TW9kZWxGb3JtKCRmb3JtLCBlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZGVmYXVsdFN1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSk7XG4gIH1cblxuICBpdGVyYXRlQWxsQ2hpbGRyZW4oKSB7XG4gICAgbGV0IF9jaGlsZENvbnRyb2xsZXIgPSB0aGlzLl9jaGlsZENvbnRyb2xsZXI7XG4gICAgbGV0IHJlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgaW4gX2NoaWxkQ29udHJvbGxlcikge1xuICAgICAgaWYgKF9jaGlsZENvbnRyb2xsZXIuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgZm9yIChsZXQgY2Mgb2YgX2NoaWxkQ29udHJvbGxlcltpXSkge1xuICAgICAgICAgIHJlcy5wdXNoKGNjKTtcbiAgICAgICAgICByZXMucHVzaCguLi5jYy5pdGVyYXRlQWxsQ2hpbGRyZW4oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBGb3JtIEV2ZW50c1xuICAgKi9cbiAgZGVmYXVsdFN1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSkge1xuICAgIGlmICghdGhpcy5faXNNaXhpbikge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGxldCB7bW9kZWwsIGZvcm1fbmFtZX0gPSAkZm9ybS5kYXRhKCk7XG4gICAgICBsZXQgZGF0YSA9IG1vZGVsLnN5bmNGb3JtKCRmb3JtKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBwcm9tO1xuICAgICAgICBpZiAobW9kZWwuaWQgIT09IG51bGwgJiYgbW9kZWwuaWQgPj0gMCkge1xuICAgICAgICAgIHByb20gPSBtb2RlbC5zYXZlKHtmb3JtTmFtZTogZm9ybV9uYW1lLCBkYXRhfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvbSA9IG1vZGVsLmNyZWF0ZSh7ZGF0YX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbVxuICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIGNsZWFyRXJyb3JzSW5Gb3JtKCRmb3JtKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0X21vZGVsX2Zvcm1fc3VjY2VzcyAmJlxuICAgICAgICAgICAgdGhpcy5zdWJtaXRfbW9kZWxfZm9ybV9zdWNjZXNzKHJlc1swXSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2YgdGhpcy5pdGVyYXRlQWxsQ2hpbGRyZW4oKSkge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLnN1Ym1pdF9tb2RlbF9mb3JtX3N1Y2Nlc3MgJiZcbiAgICAgICAgICAgICAgY29udHJvbGxlci5zdWJtaXRfbW9kZWxfZm9ybV9zdWNjZXNzKHJlc1swXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5yZWNvbmNpbGUoXG4gICAgICAgICAgICAgICQoYDxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4ke2RhdGEuaHRtbH08L2Rpdj5gKSxcbiAgICAgICAgICAgICAgJGZvcm0uZmluZChcIi5jb250YWluZXItZmx1aWRcIikuZmlyc3QoKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdF9tb2RlbF9mb3JtX2Vycm9yICYmXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdF9tb2RlbF9mb3JtX2Vycm9yKGRhdGEpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sbGVyIG9mIHRoaXMuaXRlcmF0ZUFsbENoaWxkcmVuKCkpIHtcbiAgICAgICAgICAgICAgY29udHJvbGxlci5zdWJtaXRfbW9kZWxfZm9ybV9lcnJvciAmJlxuICAgICAgICAgICAgICBjb250cm9sbGVyLnN1Ym1pdF9tb2RlbF9mb3JtX2Vycm9yKGRhdGEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWplY3QoZGF0YSk7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/AbstractSDC.js\n\n}");
|
|
37
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ AbstractSDC: () => (/* binding */ AbstractSDC)\n/* harmony export */ });\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_model_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_model.js */ \"./src/simpleDomControl/sdc_model.js\");\n/* harmony import */ var _sdc_server_call_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n\n\n\n\n\n\nclass AbstractSDC {\n constructor() {\n this._uuid = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.uuidv4)();\n this.contentUrl = \"\";\n this.contentReload = false;\n this.parsedContentUrl = null;\n this.events = [];\n this.load_async = false;\n this._allEvents = null;\n this._autoRedirect = null;\n this._params = {};\n\n this._urlParams = [];\n this._models = [];\n\n // ------------------ Old deprecated properties ----------------------\n this._cssUrls = [];\n this.afterShow = () => {\n console.warn(\"afterShow is deprecated!!\");\n };\n // -------------- End old deprecated properties ----------------------\n\n /**\n *\n * @type {{string: AbstractSDC}}\n */\n this._mixins = {};\n\n /**\n * @type {string}\n */\n this._tagName = Object.getPrototypeOf(this)._tagName ?? \"\";\n\n /**\n * @type {{string:AbstractSDC}}\n */\n this._childController = {};\n\n /**\n * @type {AbstractSDC}\n */\n this._parentController = null;\n\n /**\n * @type {boolean}\n */\n this._onLoadDone = false;\n\n /**\n * @type {jquery}\n */\n this.$container = null;\n\n /**\n *\n * @type {boolean}\n */\n this._isMixin = false;\n }\n\n get params() {\n return this._params;\n }\n\n set params(params) {\n this._params = params;\n }\n\n /**\n *\n * @param {string} method must be in {}\n * @param {Array} args in arguments of\n *\n */\n _runLifecycle(method, args) {\n if (_sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.DEBUG && !this._isMixin) {\n console.debug(method, this._tagName);\n }\n\n let returnPromisses = [];\n if (this._isMixin) {\n return;\n }\n this._isMixin = true;\n for (let mixinKey in this._mixins) {\n let mixin = this._mixins[mixinKey];\n if (typeof mixin[method] === \"function\") {\n returnPromisses.push(mixin[method].apply(this, args));\n }\n }\n\n return Promise.all(returnPromisses).then(() => {\n this._isMixin = false;\n });\n }\n\n /**\n * @deprecated Not called by the runtime since 0.158.7. Read the data-*\n * attributes from ``this.params`` in ``onLoad()`` instead.\n *\n * @return {Promise<*>|*}\n */\n onInit() {\n if (_sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.DEBUG && !this._isMixin) {\n console.debug(Array.apply(null, arguments), this._tagName);\n }\n }\n\n set autoRedirect(url){\n this._autoRedirect = url;\n }\n\n get autoRedirect() {\n return this._autoRedirect;\n }\n\n get parentController() {\n return this._parentController;\n }\n\n get childController() {\n return this._childController;\n }\n\n onLoad() {\n return this._runLifecycle(\"onLoad\", arguments);\n }\n\n willShow() {\n return this._runLifecycle(\"willShow\", arguments);\n }\n\n onRefresh() {\n return this._runLifecycle(\"onRefresh\", arguments);\n }\n\n onRemove() {\n this._runLifecycle(\"onRemove\", arguments);\n return true;\n }\n\n noOpenModelRequests() {\n return Promise.all(this._models.map((x) => x.noOpenRequests()));\n }\n\n remove() {\n for (const model of this._models) {\n model.close();\n }\n const { _childController } = this;\n for (let i in _childController) {\n if (Object.hasOwn(_childController, i)) {\n for (let cc of _childController[i]) {\n if (!cc.remove()) {\n return false;\n }\n }\n }\n }\n\n if (!this.onRemove || this.onRemove()) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_0__.allOff)(this);\n const c_name = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.tagNameToCamelCase)(this._tagName);\n if (this._parentController._childController[c_name]) {\n let arr = this._parentController._childController[c_name];\n for (let i = 0; i < arr.length; i++) {\n if (arr[i] === this) {\n arr.splice(i, 1);\n }\n }\n }\n\n this.$container.remove();\n return true;\n }\n\n return false;\n }\n\n controller_name() {\n return (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.tagNameToReadableName)(this._tagName);\n }\n\n addEvent(event, selector, handler) {\n this.getEvents();\n this._allEvents[event] = this._allEvents[event] || {};\n this._allEvents[event][selector] = handler;\n }\n\n getEvents() {\n if (this._allEvents) return this._allEvents;\n let allEvents = [];\n allEvents = allEvents.concat(this.events);\n for (let mixinKey in this._mixins) {\n let mixin = this._mixins[mixinKey];\n if (Array.isArray(mixin.events)) {\n allEvents = allEvents.concat(mixin.events);\n }\n }\n\n // Merge into a new object: the event maps of the controller and its mixins\n // may be shared between instances and must not be changed.\n return (this._allEvents = _.merge({}, ...allEvents));\n }\n\n post(url, args) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.post(this, url, args);\n }\n\n get(url, args) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.get(this, url, args);\n }\n\n submitForm(form, url, method) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.submitFormAndUpdateView(this, form, url, method);\n }\n\n serverCall(methode, args) {\n let re = /sdc_view\\/([^/]+)/i;\n let app = this.contentUrl.match(re);\n if (!app || app.length < 2) {\n console.error(\n \"To use the serverCall function the contentUrl must contain sdc_view/<app>: \" +\n this._tagName,\n );\n return;\n }\n\n return (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_3__.callServer)(\n app[1],\n this._tagName,\n this.parsedContentUrl ?? this.contentUrl,\n methode,\n args,\n );\n }\n\n /**\n *\n * @param {string} modelName\n * @param {object?} modelQuery\n * @returns {SdcQuerySet}\n */\n querySet(modelName, modelQuery = {}) {\n const newQuerySet = new _sdc_model_js__WEBPACK_IMPORTED_MODULE_2__.SdcQuerySet(modelName, modelQuery);\n this._models.push(newQuerySet);\n return newQuerySet;\n }\n\n newModel(modelName, modelQuery = {}) {\n console.warn(\"newModel is deprecated and will soon be removed. Please use this.querySet(modelName, modelQuery)\");\n return this.querySet(modelName, modelQuery);\n }\n\n /**\n * Adapter to this.$container.find\n * @param {string} domSelector\n */\n find(domSelector) {\n return this.$container.find(domSelector);\n }\n\n refresh() {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.refresh(this.$container, this);\n }\n\n reload() {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.reloadController(this);\n }\n\n reconcile($virtualNode, $realNode = null) {\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_1__.app.reconcile(this, $virtualNode, $realNode);\n }\n\n submitModelFormDistributor($form, e) {\n if (typeof this._submitModelForm === \"function\") {\n return this._submitModelForm($form, e);\n }\n if (typeof this.submitModelForm === \"function\") {\n return this.submitModelForm($form, e);\n }\n return this.defaultSubmitModelForm($form, e);\n }\n\n iterateAllChildren() {\n const { _childController } = this;\n let res = [];\n for (let i in _childController) {\n if (Object.hasOwn(_childController, i)) {\n for (let cc of _childController[i]) {\n res.push(cc);\n res.push(...cc.iterateAllChildren());\n }\n }\n }\n return res;\n }\n\n /**\n * Model Form Events\n */\n defaultSubmitModelForm($form, e) {\n if (!this._isMixin) {\n e.stopPropagation();\n e.preventDefault();\n let {model, form_name} = $form.data();\n let data = model.syncForm($form);\n return new Promise((resolve, reject) => {\n let prom;\n if (model.id !== null && model.id >= 0) {\n prom = model.save({formName: form_name, data});\n } else {\n prom = model.create({data});\n }\n\n prom\n .then((res) => {\n ;(0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_4__.clearErrorsInForm)($form);\n // save() resolves with a list of responses, create() with one response.\n const response = Array.isArray(res) ? res[0] : res;\n this.submit_model_form_success &&\n this.submit_model_form_success(response);\n for (const controller of this.iterateAllChildren()) {\n controller.submit_model_form_success &&\n controller.submit_model_form_success(response);\n }\n\n resolve(res);\n })\n .catch((data) => {\n this.reconcile(\n $(`<div class=\"container-fluid\">${data.html}</div>`),\n $form.find(\".container-fluid\").first(),\n );\n this.submit_model_form_error &&\n this.submit_model_form_error(data);\n for (const controller of this.iterateAllChildren()) {\n controller.submit_model_form_error &&\n controller.submit_model_form_error(data);\n }\n\n reject(data);\n });\n });\n }\n\n return Promise.resolve();\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9BYnN0cmFjdFNEQy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBdUM7QUFDTDtBQUNTO0FBQ0s7QUFNeEI7O0FBRWpCO0FBQ1A7QUFDQSxpQkFBaUIscURBQU07QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBLGVBQWU7QUFDZjtBQUNBOztBQUVBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7O0FBRUE7QUFDQSxjQUFjO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLE9BQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0EsUUFBUSw2Q0FBRztBQUNYO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQSxRQUFRLDZDQUFHO0FBQ1g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLG1CQUFtQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxNQUFNLHNEQUFNO0FBQ1oscUJBQXFCLGlFQUFrQjtBQUN2QztBQUNBO0FBQ0Esd0JBQXdCLGdCQUFnQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxvRUFBcUI7QUFDaEM7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDOztBQUVBO0FBQ0EsV0FBVyw2Q0FBRztBQUNkOztBQUVBO0FBQ0EsV0FBVyw2Q0FBRztBQUNkOztBQUVBO0FBQ0EsV0FBVyw2Q0FBRztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVcsK0RBQVU7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixjQUFjLFNBQVM7QUFDdkIsZUFBZTtBQUNmO0FBQ0EscUNBQXFDO0FBQ3JDLDRCQUE0QixzREFBVztBQUN2QztBQUNBO0FBQ0E7O0FBRUEscUNBQXFDO0FBQ3JDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyw2Q0FBRztBQUNkOztBQUVBO0FBQ0EsV0FBVyw2Q0FBRztBQUNkOztBQUVBO0FBQ0EsV0FBVyw2Q0FBRztBQUNkOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVksbUJBQW1CO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGtCQUFrQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QiwwQkFBMEI7QUFDdkQsVUFBVTtBQUNWLCtCQUErQixLQUFLO0FBQ3BDOztBQUVBO0FBQ0E7QUFDQSxZQUFZLGlFQUFpQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxnREFBZ0QsVUFBVTtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVztBQUNYLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvQWJzdHJhY3RTREMuanM/ZjU3YSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FsbE9mZn0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuaW1wb3J0IHthcHB9IGZyb20gXCIuL3NkY19tYWluLmpzXCI7XG5pbXBvcnQge1NkY1F1ZXJ5U2V0fSBmcm9tIFwiLi9zZGNfbW9kZWwuanNcIjtcbmltcG9ydCB7Y2FsbFNlcnZlcn0gZnJvbSBcIi4vc2RjX3NlcnZlcl9jYWxsLmpzXCI7XG5pbXBvcnQge1xuICB1dWlkdjQsXG4gIGNsZWFyRXJyb3JzSW5Gb3JtLFxuICB0YWdOYW1lVG9DYW1lbENhc2UsXG4gIHRhZ05hbWVUb1JlYWRhYmxlTmFtZSxcbn0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBBYnN0cmFjdFNEQyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuX3V1aWQgPSB1dWlkdjQoKTtcbiAgICB0aGlzLmNvbnRlbnRVcmwgPSBcIlwiO1xuICAgIHRoaXMuY29udGVudFJlbG9hZCA9IGZhbHNlO1xuICAgIHRoaXMucGFyc2VkQ29udGVudFVybCA9IG51bGw7XG4gICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICB0aGlzLmxvYWRfYXN5bmMgPSBmYWxzZTtcbiAgICB0aGlzLl9hbGxFdmVudHMgPSBudWxsO1xuICAgIHRoaXMuX2F1dG9SZWRpcmVjdCA9IG51bGw7XG4gICAgdGhpcy5fcGFyYW1zID0ge307XG5cbiAgICB0aGlzLl91cmxQYXJhbXMgPSBbXTtcbiAgICB0aGlzLl9tb2RlbHMgPSBbXTtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLSBPbGQgZGVwcmVjYXRlZCBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICB0aGlzLl9jc3NVcmxzID0gW107XG4gICAgdGhpcy5hZnRlclNob3cgPSAoKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oXCJhZnRlclNob3cgaXMgZGVwcmVjYXRlZCEhXCIpO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0gRW5kIG9sZCBkZXByZWNhdGVkIHByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAdHlwZSB7e3N0cmluZzogQWJzdHJhY3RTREN9fVxuICAgICAqL1xuICAgIHRoaXMuX21peGlucyA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICB0aGlzLl90YWdOYW1lID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl90YWdOYW1lID8/IFwiXCI7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7e3N0cmluZzpBYnN0cmFjdFNEQ319XG4gICAgICovXG4gICAgdGhpcy5fY2hpbGRDb250cm9sbGVyID0ge307XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7QWJzdHJhY3RTREN9XG4gICAgICovXG4gICAgdGhpcy5fcGFyZW50Q29udHJvbGxlciA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICB0aGlzLl9vbkxvYWREb25lID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7anF1ZXJ5fVxuICAgICAqL1xuICAgIHRoaXMuJGNvbnRhaW5lciA9IG51bGw7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqL1xuICAgIHRoaXMuX2lzTWl4aW4gPSBmYWxzZTtcbiAgfVxuXG4gIGdldCBwYXJhbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmFtcztcbiAgfVxuXG4gIHNldCBwYXJhbXMocGFyYW1zKSB7XG4gICAgdGhpcy5fcGFyYW1zID0gcGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2QgbXVzdCBiZSBpbiB7fVxuICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIGluIGFyZ3VtZW50cyBvZlxuICAgKlxuICAgKi9cbiAgX3J1bkxpZmVjeWNsZShtZXRob2QsIGFyZ3MpIHtcbiAgICBpZiAoYXBwLkRFQlVHICYmICF0aGlzLl9pc01peGluKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKG1ldGhvZCwgdGhpcy5fdGFnTmFtZSk7XG4gICAgfVxuXG4gICAgbGV0IHJldHVyblByb21pc3NlcyA9IFtdO1xuICAgIGlmICh0aGlzLl9pc01peGluKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX2lzTWl4aW4gPSB0cnVlO1xuICAgIGZvciAobGV0IG1peGluS2V5IGluIHRoaXMuX21peGlucykge1xuICAgICAgbGV0IG1peGluID0gdGhpcy5fbWl4aW5zW21peGluS2V5XTtcbiAgICAgIGlmICh0eXBlb2YgbWl4aW5bbWV0aG9kXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVyblByb21pc3Nlcy5wdXNoKG1peGluW21ldGhvZF0uYXBwbHkodGhpcywgYXJncykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLmFsbChyZXR1cm5Qcm9taXNzZXMpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5faXNNaXhpbiA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIE5vdCBjYWxsZWQgYnkgdGhlIHJ1bnRpbWUgc2luY2UgMC4xNTguNy4gUmVhZCB0aGUgZGF0YS0qXG4gICAqIGF0dHJpYnV0ZXMgZnJvbSBgYHRoaXMucGFyYW1zYGAgaW4gYGBvbkxvYWQoKWBgIGluc3RlYWQuXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Kj58Kn1cbiAgICovXG4gIG9uSW5pdCgpIHtcbiAgICBpZiAoYXBwLkRFQlVHICYmICF0aGlzLl9pc01peGluKSB7XG4gICAgICBjb25zb2xlLmRlYnVnKEFycmF5LmFwcGx5KG51bGwsIGFyZ3VtZW50cyksIHRoaXMuX3RhZ05hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHNldCBhdXRvUmVkaXJlY3QodXJsKXtcbiAgICB0aGlzLl9hdXRvUmVkaXJlY3QgPSB1cmw7XG4gIH1cblxuICBnZXQgYXV0b1JlZGlyZWN0KCkge1xuICAgIHJldHVybiB0aGlzLl9hdXRvUmVkaXJlY3Q7XG4gIH1cblxuICBnZXQgcGFyZW50Q29udHJvbGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50Q29udHJvbGxlcjtcbiAgfVxuXG4gIGdldCBjaGlsZENvbnRyb2xsZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkQ29udHJvbGxlcjtcbiAgfVxuXG4gIG9uTG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKFwib25Mb2FkXCIsIGFyZ3VtZW50cyk7XG4gIH1cblxuICB3aWxsU2hvdygpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKFwid2lsbFNob3dcIiwgYXJndW1lbnRzKTtcbiAgfVxuXG4gIG9uUmVmcmVzaCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVuTGlmZWN5Y2xlKFwib25SZWZyZXNoXCIsIGFyZ3VtZW50cyk7XG4gIH1cblxuICBvblJlbW92ZSgpIHtcbiAgICB0aGlzLl9ydW5MaWZlY3ljbGUoXCJvblJlbW92ZVwiLCBhcmd1bWVudHMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgbm9PcGVuTW9kZWxSZXF1ZXN0cygpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5fbW9kZWxzLm1hcCgoeCkgPT4geC5ub09wZW5SZXF1ZXN0cygpKSk7XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgZm9yIChjb25zdCBtb2RlbCBvZiB0aGlzLl9tb2RlbHMpIHtcbiAgICAgIG1vZGVsLmNsb3NlKCk7XG4gICAgfVxuICAgIGNvbnN0IHsgX2NoaWxkQ29udHJvbGxlciB9ID0gdGhpcztcbiAgICBmb3IgKGxldCBpIGluIF9jaGlsZENvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChPYmplY3QuaGFzT3duKF9jaGlsZENvbnRyb2xsZXIsIGkpKSB7XG4gICAgICAgIGZvciAobGV0IGNjIG9mIF9jaGlsZENvbnRyb2xsZXJbaV0pIHtcbiAgICAgICAgICBpZiAoIWNjLnJlbW92ZSgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLm9uUmVtb3ZlIHx8IHRoaXMub25SZW1vdmUoKSkge1xuICAgICAgYWxsT2ZmKHRoaXMpO1xuICAgICAgY29uc3QgY19uYW1lID0gdGFnTmFtZVRvQ2FtZWxDYXNlKHRoaXMuX3RhZ05hbWUpO1xuICAgICAgaWYgKHRoaXMuX3BhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjX25hbWVdKSB7XG4gICAgICAgIGxldCBhcnIgPSB0aGlzLl9wYXJlbnRDb250cm9sbGVyLl9jaGlsZENvbnRyb2xsZXJbY19uYW1lXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoYXJyW2ldID09PSB0aGlzKSB7XG4gICAgICAgICAgICBhcnIuc3BsaWNlKGksIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLiRjb250YWluZXIucmVtb3ZlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb250cm9sbGVyX25hbWUoKSB7XG4gICAgcmV0dXJuIHRhZ05hbWVUb1JlYWRhYmxlTmFtZSh0aGlzLl90YWdOYW1lKTtcbiAgfVxuXG4gIGFkZEV2ZW50KGV2ZW50LCBzZWxlY3RvciwgaGFuZGxlcikge1xuICAgIHRoaXMuZ2V0RXZlbnRzKCk7XG4gICAgdGhpcy5fYWxsRXZlbnRzW2V2ZW50XSA9IHRoaXMuX2FsbEV2ZW50c1tldmVudF0gfHwge307XG4gICAgdGhpcy5fYWxsRXZlbnRzW2V2ZW50XVtzZWxlY3Rvcl0gPSBoYW5kbGVyO1xuICB9XG5cbiAgZ2V0RXZlbnRzKCkge1xuICAgIGlmICh0aGlzLl9hbGxFdmVudHMpIHJldHVybiB0aGlzLl9hbGxFdmVudHM7XG4gICAgbGV0IGFsbEV2ZW50cyA9IFtdO1xuICAgIGFsbEV2ZW50cyA9IGFsbEV2ZW50cy5jb25jYXQodGhpcy5ldmVudHMpO1xuICAgIGZvciAobGV0IG1peGluS2V5IGluIHRoaXMuX21peGlucykge1xuICAgICAgbGV0IG1peGluID0gdGhpcy5fbWl4aW5zW21peGluS2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1peGluLmV2ZW50cykpIHtcbiAgICAgICAgYWxsRXZlbnRzID0gYWxsRXZlbnRzLmNvbmNhdChtaXhpbi5ldmVudHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1lcmdlIGludG8gYSBuZXcgb2JqZWN0OiB0aGUgZXZlbnQgbWFwcyBvZiB0aGUgY29udHJvbGxlciBhbmQgaXRzIG1peGluc1xuICAgIC8vIG1heSBiZSBzaGFyZWQgYmV0d2VlbiBpbnN0YW5jZXMgYW5kIG11c3Qgbm90IGJlIGNoYW5nZWQuXG4gICAgcmV0dXJuICh0aGlzLl9hbGxFdmVudHMgPSBfLm1lcmdlKHt9LCAuLi5hbGxFdmVudHMpKTtcbiAgfVxuXG4gIHBvc3QodXJsLCBhcmdzKSB7XG4gICAgcmV0dXJuIGFwcC5wb3N0KHRoaXMsIHVybCwgYXJncyk7XG4gIH1cblxuICBnZXQodXJsLCBhcmdzKSB7XG4gICAgcmV0dXJuIGFwcC5nZXQodGhpcywgdXJsLCBhcmdzKTtcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZm9ybSwgdXJsLCBtZXRob2QpIHtcbiAgICByZXR1cm4gYXBwLnN1Ym1pdEZvcm1BbmRVcGRhdGVWaWV3KHRoaXMsIGZvcm0sIHVybCwgbWV0aG9kKTtcbiAgfVxuXG4gIHNlcnZlckNhbGwobWV0aG9kZSwgYXJncykge1xuICAgIGxldCByZSA9IC9zZGNfdmlld1xcLyhbXi9dKykvaTtcbiAgICBsZXQgYXBwID0gdGhpcy5jb250ZW50VXJsLm1hdGNoKHJlKTtcbiAgICBpZiAoIWFwcCB8fCBhcHAubGVuZ3RoIDwgMikge1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgXCJUbyB1c2UgdGhlIHNlcnZlckNhbGwgZnVuY3Rpb24gdGhlIGNvbnRlbnRVcmwgbXVzdCBjb250YWluIHNkY192aWV3LzxhcHA+OiBcIiArXG4gICAgICAgIHRoaXMuX3RhZ05hbWUsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBjYWxsU2VydmVyKFxuICAgICAgYXBwWzFdLFxuICAgICAgdGhpcy5fdGFnTmFtZSxcbiAgICAgIHRoaXMucGFyc2VkQ29udGVudFVybCA/PyB0aGlzLmNvbnRlbnRVcmwsXG4gICAgICBtZXRob2RlLFxuICAgICAgYXJncyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAgICogQHBhcmFtICB7b2JqZWN0P30gbW9kZWxRdWVyeVxuICAgKiBAcmV0dXJucyB7U2RjUXVlcnlTZXR9XG4gICAqL1xuICBxdWVyeVNldChtb2RlbE5hbWUsIG1vZGVsUXVlcnkgPSB7fSkge1xuICAgIGNvbnN0IG5ld1F1ZXJ5U2V0ID0gbmV3IFNkY1F1ZXJ5U2V0KG1vZGVsTmFtZSwgbW9kZWxRdWVyeSk7XG4gICAgdGhpcy5fbW9kZWxzLnB1c2gobmV3UXVlcnlTZXQpO1xuICAgIHJldHVybiBuZXdRdWVyeVNldDtcbiAgfVxuXG4gIG5ld01vZGVsKG1vZGVsTmFtZSwgbW9kZWxRdWVyeSA9IHt9KSB7XG4gICAgY29uc29sZS53YXJuKFwibmV3TW9kZWwgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBzb29uIGJlIHJlbW92ZWQuIFBsZWFzZSB1c2UgdGhpcy5xdWVyeVNldChtb2RlbE5hbWUsIG1vZGVsUXVlcnkpXCIpO1xuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2V0KG1vZGVsTmFtZSwgbW9kZWxRdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogQWRhcHRlciB0byB0aGlzLiRjb250YWluZXIuZmluZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gZG9tU2VsZWN0b3JcbiAgICovXG4gIGZpbmQoZG9tU2VsZWN0b3IpIHtcbiAgICByZXR1cm4gdGhpcy4kY29udGFpbmVyLmZpbmQoZG9tU2VsZWN0b3IpO1xuICB9XG5cbiAgcmVmcmVzaCgpIHtcbiAgICByZXR1cm4gYXBwLnJlZnJlc2godGhpcy4kY29udGFpbmVyLCB0aGlzKTtcbiAgfVxuXG4gIHJlbG9hZCgpIHtcbiAgICByZXR1cm4gYXBwLnJlbG9hZENvbnRyb2xsZXIodGhpcyk7XG4gIH1cblxuICByZWNvbmNpbGUoJHZpcnR1YWxOb2RlLCAkcmVhbE5vZGUgPSBudWxsKSB7XG4gICAgcmV0dXJuIGFwcC5yZWNvbmNpbGUodGhpcywgJHZpcnR1YWxOb2RlLCAkcmVhbE5vZGUpO1xuICB9XG5cbiAgc3VibWl0TW9kZWxGb3JtRGlzdHJpYnV0b3IoJGZvcm0sIGUpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuX3N1Ym1pdE1vZGVsRm9ybSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3VibWl0TW9kZWxGb3JtKCRmb3JtLCBlKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLnN1Ym1pdE1vZGVsRm9ybSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdWJtaXRNb2RlbEZvcm0oJGZvcm0sIGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0U3VibWl0TW9kZWxGb3JtKCRmb3JtLCBlKTtcbiAgfVxuXG4gIGl0ZXJhdGVBbGxDaGlsZHJlbigpIHtcbiAgICBjb25zdCB7IF9jaGlsZENvbnRyb2xsZXIgfSA9IHRoaXM7XG4gICAgbGV0IHJlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgaW4gX2NoaWxkQ29udHJvbGxlcikge1xuICAgICAgaWYgKE9iamVjdC5oYXNPd24oX2NoaWxkQ29udHJvbGxlciwgaSkpIHtcbiAgICAgICAgZm9yIChsZXQgY2Mgb2YgX2NoaWxkQ29udHJvbGxlcltpXSkge1xuICAgICAgICAgIHJlcy5wdXNoKGNjKTtcbiAgICAgICAgICByZXMucHVzaCguLi5jYy5pdGVyYXRlQWxsQ2hpbGRyZW4oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBNb2RlbCBGb3JtIEV2ZW50c1xuICAgKi9cbiAgZGVmYXVsdFN1Ym1pdE1vZGVsRm9ybSgkZm9ybSwgZSkge1xuICAgIGlmICghdGhpcy5faXNNaXhpbikge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGxldCB7bW9kZWwsIGZvcm1fbmFtZX0gPSAkZm9ybS5kYXRhKCk7XG4gICAgICBsZXQgZGF0YSA9IG1vZGVsLnN5bmNGb3JtKCRmb3JtKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBwcm9tO1xuICAgICAgICBpZiAobW9kZWwuaWQgIT09IG51bGwgJiYgbW9kZWwuaWQgPj0gMCkge1xuICAgICAgICAgIHByb20gPSBtb2RlbC5zYXZlKHtmb3JtTmFtZTogZm9ybV9uYW1lLCBkYXRhfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvbSA9IG1vZGVsLmNyZWF0ZSh7ZGF0YX0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvbVxuICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgIGNsZWFyRXJyb3JzSW5Gb3JtKCRmb3JtKTtcbiAgICAgICAgICAgIC8vIHNhdmUoKSByZXNvbHZlcyB3aXRoIGEgbGlzdCBvZiByZXNwb25zZXMsIGNyZWF0ZSgpIHdpdGggb25lIHJlc3BvbnNlLlxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBBcnJheS5pc0FycmF5KHJlcykgPyByZXNbMF0gOiByZXM7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdF9tb2RlbF9mb3JtX3N1Y2Nlc3MgJiZcbiAgICAgICAgICAgIHRoaXMuc3VibWl0X21vZGVsX2Zvcm1fc3VjY2VzcyhyZXNwb25zZSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2YgdGhpcy5pdGVyYXRlQWxsQ2hpbGRyZW4oKSkge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLnN1Ym1pdF9tb2RlbF9mb3JtX3N1Y2Nlc3MgJiZcbiAgICAgICAgICAgICAgY29udHJvbGxlci5zdWJtaXRfbW9kZWxfZm9ybV9zdWNjZXNzKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChkYXRhKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlY29uY2lsZShcbiAgICAgICAgICAgICAgJChgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPiR7ZGF0YS5odG1sfTwvZGl2PmApLFxuICAgICAgICAgICAgICAkZm9ybS5maW5kKFwiLmNvbnRhaW5lci1mbHVpZFwiKS5maXJzdCgpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0X21vZGVsX2Zvcm1fZXJyb3IgJiZcbiAgICAgICAgICAgIHRoaXMuc3VibWl0X21vZGVsX2Zvcm1fZXJyb3IoZGF0YSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbnRyb2xsZXIgb2YgdGhpcy5pdGVyYXRlQWxsQ2hpbGRyZW4oKSkge1xuICAgICAgICAgICAgICBjb250cm9sbGVyLnN1Ym1pdF9tb2RlbF9mb3JtX2Vycm9yICYmXG4gICAgICAgICAgICAgIGNvbnRyb2xsZXIuc3VibWl0X21vZGVsX2Zvcm1fZXJyb3IoZGF0YSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlamVjdChkYXRhKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/AbstractSDC.js\n\n}");
|
|
28
38
|
|
|
29
39
|
/***/ },
|
|
30
40
|
|
|
@@ -34,7 +44,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
34
44
|
\************************************************/
|
|
35
45
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
36
46
|
|
|
37
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Global: () => (/* binding */ Global),\n/* harmony export */ controllerFactory: () => (/* binding */ controllerFactory),\n/* harmony export */ controllerList: () => (/* binding */ controllerList),\n/* harmony export */ prepareRefreshProcess: () => (/* binding */ prepareRefreshProcess),\n/* harmony export */ resetChildren: () => (/* binding */ resetChildren),\n/* harmony export */ runControlFlowFunctions: () => (/* binding */ runControlFlowFunctions),\n/* harmony export */ runRefresh: () => (/* binding */ runRefresh),\n/* harmony export */ tagList: () => (/* binding */ tagList),\n/* harmony export */ updateEventAndTriggerOnRefresh: () => (/* binding */ updateEventAndTriggerOnRefresh)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n/* harmony import */ var _sdc_params_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_params.js */ \"./src/simpleDomControl/sdc_params.js\");\n/* harmony import */ var _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_dom_events.js */ \"./src/simpleDomControl/sdc_dom_events.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n\n\n\n\n\n\n\nlet Global = [];\nlet controllerList = {};\n\nfunction tagList() {\n return Object.keys(controllerList);\n}\n\nfunction prepareMixins(superTagNameList, tagName) {\n superTagNameList = superTagNameList.concat(controllerList[tagName][1]);\n superTagNameList = superTagNameList.filter((value, index, self) => {\n return self.indexOf(value) === index;\n });\n let hasAdded = true;\n while (hasAdded) {\n hasAdded = false;\n for (let tag of superTagNameList) {\n for (let newTag of controllerList[tag][1]) {\n if (!superTagNameList.includes(newTag)) {\n superTagNameList.push(newTag);\n hasAdded = true;\n }\n }\n }\n }\n return superTagNameList;\n}\n\n/**\n * setParentController sets the parent controller as property: 'parentController'\n * to the child controller. Also, it adds the child controller to the property list:\n * 'parentController' to the parent controller\n *\n * @param {AbstractSDC} parentController - js controller instance, controller of the parent DOM of the controllers DOM\n * @param {AbstractSDC} controller - js controller instance\n * @return {AbstractSDC} - parentController\n */\nfunction setParentController(parentController, controller) {\n if (parentController) {\n let controllerName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.tagNameToCamelCase)(controller._tagName);\n if (!parentController._childController[controllerName]) {\n parentController._childController[controllerName] = [];\n }\n\n parentController._childController[controllerName].push(controller);\n }\n\n return (controller._parentController = parentController);\n}\n\n/**\n * resetChildren resets all children of a controller.\n *\n * @param {AbstractSDC} parentController\n */\nfunction resetChildren(parentController) {\n parentController._childController = {};\n parentController.find(`.${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS}`).each(function () {\n const $this = $(this);\n const cController = (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($this);\n if (cController === parentController) {\n setParentController(parentController, cController);\n }\n });\n}\n\n/**\n * controllerFactoryInstance it generates a controller instance\n * depending if the controller is registered as a global controller. It sets the\n * $container object to the jQuery representation of the tag.\n *\n * It handles the init parameter by the data values of the DOM.\n *\n * It handles the super extensions.\n *\n * @param {AbstractSDC} parentController - Controller of the parent DOM\n * @param {jquery} $element - The current DOM jQuery\n * @param {string} tagName - the registered tag name of the current DOM\n * @param {Array<string>} superTagNameList - tag names of super controller\n * @return {AbstractSDC} - new Controller\n */\nfunction controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n) {\n let mixinControllerClass = [];\n superTagNameList = prepareMixins(superTagNameList, tagName);\n for (let superTagName of superTagNameList) {\n mixinControllerClass.push(controllerList[superTagName][0]);\n }\n\n let controllerClass = controllerList[tagName][0];\n let controller = new ((0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.agileAggregation)(\n controllerClass,\n ...mixinControllerClass,\n ))();\n controller._tagName = tagName;\n\n setParentController(parentController, controller);\n controller.$container = $element;\n (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_2__.runOnInitWithParameter)($element, controller);\n\n return controller;\n}\n\n/**\n * controllerFactory it either generates a controller or takes a globe instance\n * depending if the controller is registered as a global controller. It sets the\n * $container object to the jQuery representation of the tag.\n *\n * Remember Global controller can not have a super controller!\n *\n * @param {AbstractSDC} parentController - Controller of the parent DOM\n * @param {jquery} $element - The current DOM jQuery\n * @param {string} tagName - the registered tag name of the current DOM\n * @param {Array<string>} superTagNameList - tag names of super controller\n * @return {AbstractSDC} - new Controller\n */\nfunction controllerFactory(\n parentController,\n $element,\n tagName,\n superTagNameList,\n) {\n if (Global.includes(tagName)) {\n let gTagName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.tagNameToCamelCase)(tagName);\n if (!window[gTagName]) {\n window[gTagName] = controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\n }\n\n window[gTagName].$container = $element;\n return window[gTagName];\n }\n\n return controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\n}\n\n/**\n * runControllerShow first runs onLoad and fill content for all sub\n * controller. Only if all the sub controller are loaded the willShow\n * control flow function gets called.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @param {jquery} $html - jQuery loaded content\n * @return {Promise<*>} - return of the onLoad function\n */\nfunction runControllerShow(controller, $html) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.runControllerFillContent)(controller, $html).then(function (args) {\n args = args || true;\n if (controller.willShow) {\n let loadPromiseOrContent = controller.willShow();\n if (loadPromiseOrContent instanceof Promise) {\n return loadPromiseOrContent.then(function () {\n return args;\n });\n }\n }\n\n return args;\n });\n}\n\n/**\n * runControllerLoad Calls the onLoad function of the controller.\n * This function is called before the HTML is set to the page.\n * The parameter is a list of children of the tag and the registered tag.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @return {Promise<*>} - return of the onLoad function\n */\nfunction runControllerLoad(controller) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.loadFilesFromController)(controller).then((html) => {\n if (!controller.onLoad || controller._onLoadDone) {\n return html;\n }\n\n controller._onLoadDone = true;\n let loadPromise = controller.onLoad(html);\n return (loadPromise || (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.promiseDummyFactory)()).then(() => {\n return html;\n });\n });\n}\n\n/**\n * runControlFlowFunctions runs the control flow functions:\n * 1. onLoad()\n * 2. fill content\n * 3. willShow(dom parameter)\n * 4. refresh()\n *\n * @param controller\n * @param {Object} process - Process object containing the refresh process\n */\nfunction runControlFlowFunctions(controller, process) {\n const prom_controller = runControllerLoad(controller)\n .then(function ($html) {\n return runControllerShow(controller, $html);\n })\n .then(() => {\n return runRefresh(controller, process);\n })\n .catch(function ($html) {\n if (typeof $html === 'string' || $html instanceof $) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.runControllerFillContent)(controller, $html);\n }\n throw $html;\n });\n\n if (controller.load_async) {\n return Promise.resolve();\n }\n\n return prom_controller;\n}\n\n/**\n *\n * @param {AbstractSDC} controller\n * @param {Object} process - Process object containing the refresh process\n */\nfunction runRefresh(controller, process) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)(null, controller, process);\n}\n\nfunction getParentList(controller) {\n let controllerList = [];\n while (controller) {\n controller._isEventsSet = false;\n controllerList.unshift(controller);\n controller = controller._parentController;\n }\n return controllerList;\n}\n\n/**\n *\n * @param {Object} process - Process object containing the refresh process\n */\nfunction updateEventAndTriggerOnRefresh(process) {\n const parentList = getParentList(process.controller[0]);\n const controllerList = parentList.concat(process.controller.slice(1));\n\n for (let con of controllerList) {\n (0,_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_3__.setControllerEvents)(con);\n con.onRefresh(process.controller[0]);\n }\n}\n\nfunction prepareRefreshProcess(refreshProcess, controller) {\n let isRunningProcess = Boolean(refreshProcess);\n\n if (!isRunningProcess) {\n refreshProcess = {\n uuids: new Set([controller._uuid]),\n controller: [controller],\n };\n } else if (!refreshProcess.uuids.has(controller._uuid)) {\n refreshProcess.uuids.add(controller._uuid);\n refreshProcess.controller.push(controller);\n }\n\n return { isRunningProcess, refreshProcess };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfY29udHJvbGxlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUl3QjtBQU9EOztBQUVrQztBQUNDO0FBQ3RCOztBQUU3QjtBQUNBOztBQUVBO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsaUVBQWtCO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCO0FBQ087QUFDUDtBQUNBLDRCQUE0QiwwREFBZ0IsQ0FBQztBQUM3QztBQUNBLHdCQUF3QiwyREFBYTtBQUNyQztBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkIsV0FBVyxlQUFlO0FBQzFCLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0IsK0RBQWdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxFQUFFLHNFQUFzQjs7QUFFeEI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsZUFBZTtBQUMxQixZQUFZLGFBQWE7QUFDekI7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixpRUFBa0I7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLFFBQVE7QUFDbkIsWUFBWSxZQUFZO0FBQ3hCO0FBQ0E7QUFDQSxTQUFTLHNFQUF3QjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFlBQVksWUFBWTtBQUN4QjtBQUNBO0FBQ0EsU0FBUyxxRUFBdUI7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwyQkFBMkIsa0VBQW1CO0FBQzlDO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsZUFBZSxzRUFBd0I7QUFDdkM7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLFFBQVE7QUFDbkI7QUFDTztBQUNQLFNBQVMscURBQU87QUFDaEI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDTztBQUNQO0FBQ0E7O0FBRUE7QUFDQSxJQUFJLHVFQUFtQjtBQUN2QjtBQUNBO0FBQ0E7O0FBRU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX2NvbnRyb2xsZXIuanM/NDM4MSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBwcm9taXNlRHVtbXlGYWN0b3J5LFxuICB0YWdOYW1lVG9DYW1lbENhc2UsXG4gIGFnaWxlQWdncmVnYXRpb24sXG59IGZyb20gXCIuL3NkY191dGlscy5qc1wiO1xuaW1wb3J0IHtcbiAgQ09OVFJPTExFUl9DTEFTUyxcbiAgZ2V0Q29udHJvbGxlcixcbiAgbG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIsXG4gIHJlZnJlc2gsXG4gIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudCxcbn0gZnJvbSBcIi4vc2RjX3ZpZXcuanNcIjtcblxuaW1wb3J0IHsgcnVuT25Jbml0V2l0aFBhcmFtZXRlciB9IGZyb20gXCIuL3NkY19wYXJhbXMuanNcIjtcbmltcG9ydCB7IHNldENvbnRyb2xsZXJFdmVudHMgfSBmcm9tIFwiLi9zZGNfZG9tX2V2ZW50cy5qc1wiO1xuaW1wb3J0IHsgYXBwIH0gZnJvbSBcIi4vc2RjX21haW4uanNcIjtcblxuZXhwb3J0IGxldCBHbG9iYWwgPSBbXTtcbmV4cG9ydCBsZXQgY29udHJvbGxlckxpc3QgPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRhZ0xpc3QoKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhjb250cm9sbGVyTGlzdCk7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVNaXhpbnMoc3VwZXJUYWdOYW1lTGlzdCwgdGFnTmFtZSkge1xuICBzdXBlclRhZ05hbWVMaXN0ID0gc3VwZXJUYWdOYW1lTGlzdC5jb25jYXQoY29udHJvbGxlckxpc3RbdGFnTmFtZV1bMV0pO1xuICBzdXBlclRhZ05hbWVMaXN0ID0gc3VwZXJUYWdOYW1lTGlzdC5maWx0ZXIoKHZhbHVlLCBpbmRleCwgc2VsZikgPT4ge1xuICAgIHJldHVybiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleDtcbiAgfSk7XG4gIGxldCBoYXNBZGRlZCA9IHRydWU7XG4gIHdoaWxlIChoYXNBZGRlZCkge1xuICAgIGhhc0FkZGVkID0gZmFsc2U7XG4gICAgZm9yIChsZXQgdGFnIG9mIHN1cGVyVGFnTmFtZUxpc3QpIHtcbiAgICAgIGZvciAobGV0IG5ld1RhZyBvZiBjb250cm9sbGVyTGlzdFt0YWddWzFdKSB7XG4gICAgICAgIGlmICghc3VwZXJUYWdOYW1lTGlzdC5pbmNsdWRlcyhuZXdUYWcpKSB7XG4gICAgICAgICAgc3VwZXJUYWdOYW1lTGlzdC5wdXNoKG5ld1RhZyk7XG4gICAgICAgICAgaGFzQWRkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzdXBlclRhZ05hbWVMaXN0O1xufVxuXG4vKipcbiAqIHNldFBhcmVudENvbnRyb2xsZXIgc2V0cyB0aGUgcGFyZW50IGNvbnRyb2xsZXIgYXMgcHJvcGVydHk6ICdwYXJlbnRDb250cm9sbGVyJ1xuICogdG8gdGhlIGNoaWxkIGNvbnRyb2xsZXIuIEFsc28sIGl0IGFkZHMgdGhlIGNoaWxkIGNvbnRyb2xsZXIgdG8gdGhlIHByb3BlcnR5IGxpc3Q6XG4gKiAncGFyZW50Q29udHJvbGxlcicgdG8gdGhlIHBhcmVudCBjb250cm9sbGVyXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIGpzIGNvbnRyb2xsZXIgaW5zdGFuY2UsIGNvbnRyb2xsZXIgb2YgdGhlIHBhcmVudCBET00gb2YgdGhlIGNvbnRyb2xsZXJzIERPTVxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGpzIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIEByZXR1cm4ge0Fic3RyYWN0U0RDfSAtIHBhcmVudENvbnRyb2xsZXJcbiAqL1xuZnVuY3Rpb24gc2V0UGFyZW50Q29udHJvbGxlcihwYXJlbnRDb250cm9sbGVyLCBjb250cm9sbGVyKSB7XG4gIGlmIChwYXJlbnRDb250cm9sbGVyKSB7XG4gICAgbGV0IGNvbnRyb2xsZXJOYW1lID0gdGFnTmFtZVRvQ2FtZWxDYXNlKGNvbnRyb2xsZXIuX3RhZ05hbWUpO1xuICAgIGlmICghcGFyZW50Q29udHJvbGxlci5fY2hpbGRDb250cm9sbGVyW2NvbnRyb2xsZXJOYW1lXSkge1xuICAgICAgcGFyZW50Q29udHJvbGxlci5fY2hpbGRDb250cm9sbGVyW2NvbnRyb2xsZXJOYW1lXSA9IFtdO1xuICAgIH1cblxuICAgIHBhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjb250cm9sbGVyTmFtZV0ucHVzaChjb250cm9sbGVyKTtcbiAgfVxuXG4gIHJldHVybiAoY29udHJvbGxlci5fcGFyZW50Q29udHJvbGxlciA9IHBhcmVudENvbnRyb2xsZXIpO1xufVxuXG4vKipcbiAqIHJlc2V0Q2hpbGRyZW4gcmVzZXRzIGFsbCBjaGlsZHJlbiBvZiBhIGNvbnRyb2xsZXIuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRDaGlsZHJlbihwYXJlbnRDb250cm9sbGVyKSB7XG4gIHBhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlciA9IHt9O1xuICBwYXJlbnRDb250cm9sbGVyLmZpbmQoYC4ke0NPTlRST0xMRVJfQ0xBU1N9YCkuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgJHRoaXMgPSAkKHRoaXMpO1xuICAgIGNvbnN0IGNDb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigkdGhpcyk7XG4gICAgaWYgKGNDb250cm9sbGVyID09PSBwYXJlbnRDb250cm9sbGVyKSB7XG4gICAgICBzZXRQYXJlbnRDb250cm9sbGVyKHBhcmVudENvbnRyb2xsZXIsIGNDb250cm9sbGVyKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIGNvbnRyb2xsZXJGYWN0b3J5SW5zdGFuY2UgaXQgZ2VuZXJhdGVzIGEgY29udHJvbGxlciBpbnN0YW5jZVxuICogZGVwZW5kaW5nIGlmIHRoZSBjb250cm9sbGVyIGlzIHJlZ2lzdGVyZWQgYXMgYSBnbG9iYWwgY29udHJvbGxlci4gSXQgc2V0cyB0aGVcbiAqICRjb250YWluZXIgb2JqZWN0IHRvIHRoZSBqUXVlcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRhZy5cbiAqXG4gKiBJdCBoYW5kbGVzIHRoZSBpbml0IHBhcmFtZXRlciBieSB0aGUgZGF0YSB2YWx1ZXMgb2YgdGhlIERPTS5cbiAqXG4gKiBJdCBoYW5kbGVzIHRoZSBzdXBlciBleHRlbnNpb25zLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBDb250cm9sbGVyIG9mIHRoZSBwYXJlbnQgRE9NXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGVsZW1lbnQgLSBUaGUgY3VycmVudCBET00galF1ZXJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZSAtIHRoZSByZWdpc3RlcmVkIHRhZyBuYW1lIG9mIHRoZSBjdXJyZW50IERPTVxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzdXBlclRhZ05hbWVMaXN0IC0gdGFnIG5hbWVzIG9mIHN1cGVyIGNvbnRyb2xsZXJcbiAqIEByZXR1cm4ge0Fic3RyYWN0U0RDfSAtICBuZXcgQ29udHJvbGxlclxuICovXG5mdW5jdGlvbiBjb250cm9sbGVyRmFjdG9yeUluc3RhbmNlKFxuICBwYXJlbnRDb250cm9sbGVyLFxuICAkZWxlbWVudCxcbiAgdGFnTmFtZSxcbiAgc3VwZXJUYWdOYW1lTGlzdCxcbikge1xuICBsZXQgbWl4aW5Db250cm9sbGVyQ2xhc3MgPSBbXTtcbiAgc3VwZXJUYWdOYW1lTGlzdCA9IHByZXBhcmVNaXhpbnMoc3VwZXJUYWdOYW1lTGlzdCwgdGFnTmFtZSk7XG4gIGZvciAobGV0IHN1cGVyVGFnTmFtZSBvZiBzdXBlclRhZ05hbWVMaXN0KSB7XG4gICAgbWl4aW5Db250cm9sbGVyQ2xhc3MucHVzaChjb250cm9sbGVyTGlzdFtzdXBlclRhZ05hbWVdWzBdKTtcbiAgfVxuXG4gIGxldCBjb250cm9sbGVyQ2xhc3MgPSBjb250cm9sbGVyTGlzdFt0YWdOYW1lXVswXTtcbiAgbGV0IGNvbnRyb2xsZXIgPSBuZXcgKGFnaWxlQWdncmVnYXRpb24oXG4gICAgY29udHJvbGxlckNsYXNzLFxuICAgIC4uLm1peGluQ29udHJvbGxlckNsYXNzLFxuICApKSgpO1xuICBjb250cm9sbGVyLl90YWdOYW1lID0gdGFnTmFtZTtcblxuICBzZXRQYXJlbnRDb250cm9sbGVyKHBhcmVudENvbnRyb2xsZXIsIGNvbnRyb2xsZXIpO1xuICBjb250cm9sbGVyLiRjb250YWluZXIgPSAkZWxlbWVudDtcbiAgcnVuT25Jbml0V2l0aFBhcmFtZXRlcigkZWxlbWVudCwgY29udHJvbGxlcik7XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXI7XG59XG5cbi8qKlxuICogY29udHJvbGxlckZhY3RvcnkgaXQgZWl0aGVyIGdlbmVyYXRlcyBhIGNvbnRyb2xsZXIgb3IgdGFrZXMgYSBnbG9iZSBpbnN0YW5jZVxuICogZGVwZW5kaW5nIGlmIHRoZSBjb250cm9sbGVyIGlzIHJlZ2lzdGVyZWQgYXMgYSBnbG9iYWwgY29udHJvbGxlci4gSXQgc2V0cyB0aGVcbiAqICRjb250YWluZXIgb2JqZWN0IHRvIHRoZSBqUXVlcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRhZy5cbiAqXG4gKiBSZW1lbWJlciBHbG9iYWwgY29udHJvbGxlciBjYW4gbm90IGhhdmUgYSBzdXBlciBjb250cm9sbGVyIVxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBDb250cm9sbGVyIG9mIHRoZSBwYXJlbnQgRE9NXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGVsZW1lbnQgLSBUaGUgY3VycmVudCBET00galF1ZXJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZSAtIHRoZSByZWdpc3RlcmVkIHRhZyBuYW1lIG9mIHRoZSBjdXJyZW50IERPTVxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzdXBlclRhZ05hbWVMaXN0IC0gdGFnIG5hbWVzIG9mIHN1cGVyIGNvbnRyb2xsZXJcbiAqIEByZXR1cm4ge0Fic3RyYWN0U0RDfSAtICBuZXcgQ29udHJvbGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udHJvbGxlckZhY3RvcnkoXG4gIHBhcmVudENvbnRyb2xsZXIsXG4gICRlbGVtZW50LFxuICB0YWdOYW1lLFxuICBzdXBlclRhZ05hbWVMaXN0LFxuKSB7XG4gIGlmIChHbG9iYWwuaW5jbHVkZXModGFnTmFtZSkpIHtcbiAgICBsZXQgZ1RhZ05hbWUgPSB0YWdOYW1lVG9DYW1lbENhc2UodGFnTmFtZSk7XG4gICAgaWYgKCF3aW5kb3dbZ1RhZ05hbWVdKSB7XG4gICAgICB3aW5kb3dbZ1RhZ05hbWVdID0gY29udHJvbGxlckZhY3RvcnlJbnN0YW5jZShcbiAgICAgICAgcGFyZW50Q29udHJvbGxlcixcbiAgICAgICAgJGVsZW1lbnQsXG4gICAgICAgIHRhZ05hbWUsXG4gICAgICAgIHN1cGVyVGFnTmFtZUxpc3QsXG4gICAgICApO1xuICAgIH1cblxuICAgIHdpbmRvd1tnVGFnTmFtZV0uJGNvbnRhaW5lciA9ICRlbGVtZW50O1xuICAgIHJldHVybiB3aW5kb3dbZ1RhZ05hbWVdO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXJGYWN0b3J5SW5zdGFuY2UoXG4gICAgcGFyZW50Q29udHJvbGxlcixcbiAgICAkZWxlbWVudCxcbiAgICB0YWdOYW1lLFxuICAgIHN1cGVyVGFnTmFtZUxpc3QsXG4gICk7XG59XG5cbi8qKlxuICogcnVuQ29udHJvbGxlclNob3cgZmlyc3QgcnVucyBvbkxvYWQgYW5kIGZpbGwgY29udGVudCBmb3IgYWxsIHN1YlxuICogY29udHJvbGxlci4gT25seSBpZiBhbGwgdGhlIHN1YiBjb250cm9sbGVyIGFyZSBsb2FkZWQgdGhlIHdpbGxTaG93XG4gKiBjb250cm9sIGZsb3cgZnVuY3Rpb24gZ2V0cyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGpzIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkaHRtbCAtIGpRdWVyeSBsb2FkZWQgY29udGVudFxuICogQHJldHVybiB7UHJvbWlzZTwqPn0gLSByZXR1cm4gb2YgdGhlIG9uTG9hZCBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBydW5Db250cm9sbGVyU2hvdyhjb250cm9sbGVyLCAkaHRtbCkge1xuICByZXR1cm4gcnVuQ29udHJvbGxlckZpbGxDb250ZW50KGNvbnRyb2xsZXIsICRodG1sKS50aGVuKGZ1bmN0aW9uIChhcmdzKSB7XG4gICAgYXJncyA9IGFyZ3MgfHwgdHJ1ZTtcbiAgICBpZiAoY29udHJvbGxlci53aWxsU2hvdykge1xuICAgICAgbGV0IGxvYWRQcm9taXNlT3JDb250ZW50ID0gY29udHJvbGxlci53aWxsU2hvdygpO1xuICAgICAgaWYgKGxvYWRQcm9taXNlT3JDb250ZW50IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gbG9hZFByb21pc2VPckNvbnRlbnQudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGFyZ3M7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBhcmdzO1xuICB9KTtcbn1cblxuLyoqXG4gKiBydW5Db250cm9sbGVyTG9hZCBDYWxscyB0aGUgb25Mb2FkIGZ1bmN0aW9uIG9mIHRoZSBjb250cm9sbGVyLlxuICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYmVmb3JlIHRoZSBIVE1MIGlzIHNldCB0byB0aGUgcGFnZS5cbiAqIFRoZSBwYXJhbWV0ZXIgaXMgYSBsaXN0IG9mIGNoaWxkcmVuIG9mIHRoZSB0YWcgYW5kIHRoZSByZWdpc3RlcmVkIHRhZy5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0ganMgY29udHJvbGxlciBpbnN0YW5jZVxuICogQHJldHVybiB7UHJvbWlzZTwqPn0gLSByZXR1cm4gb2YgdGhlIG9uTG9hZCBmdW5jdGlvblxuICovXG5mdW5jdGlvbiBydW5Db250cm9sbGVyTG9hZChjb250cm9sbGVyKSB7XG4gIHJldHVybiBsb2FkRmlsZXNGcm9tQ29udHJvbGxlcihjb250cm9sbGVyKS50aGVuKChodG1sKSA9PiB7XG4gICAgaWYgKCFjb250cm9sbGVyLm9uTG9hZCB8fCBjb250cm9sbGVyLl9vbkxvYWREb25lKSB7XG4gICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG5cbiAgICBjb250cm9sbGVyLl9vbkxvYWREb25lID0gdHJ1ZTtcbiAgICBsZXQgbG9hZFByb21pc2UgPSBjb250cm9sbGVyLm9uTG9hZChodG1sKTtcbiAgICByZXR1cm4gKGxvYWRQcm9taXNlIHx8IHByb21pc2VEdW1teUZhY3RvcnkoKSkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gaHRtbDtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogcnVuQ29udHJvbEZsb3dGdW5jdGlvbnMgcnVucyB0aGUgY29udHJvbCBmbG93IGZ1bmN0aW9uczpcbiAqIDEuIG9uTG9hZCgpXG4gKiAyLiBmaWxsIGNvbnRlbnRcbiAqIDMuIHdpbGxTaG93KGRvbSBwYXJhbWV0ZXIpXG4gKiA0LiByZWZyZXNoKClcbiAqXG4gKiBAcGFyYW0gY29udHJvbGxlclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zKGNvbnRyb2xsZXIsIHByb2Nlc3MpIHtcbiAgY29uc3QgcHJvbV9jb250cm9sbGVyID0gcnVuQ29udHJvbGxlckxvYWQoY29udHJvbGxlcilcbiAgICAudGhlbihmdW5jdGlvbiAoJGh0bWwpIHtcbiAgICAgIHJldHVybiBydW5Db250cm9sbGVyU2hvdyhjb250cm9sbGVyLCAkaHRtbCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gcnVuUmVmcmVzaChjb250cm9sbGVyLCBwcm9jZXNzKTtcbiAgICB9KVxuICAgIC5jYXRjaChmdW5jdGlvbiAoJGh0bWwpIHtcbiAgICAgIGlmICh0eXBlb2YgJGh0bWwgPT09ICdzdHJpbmcnIHx8ICRodG1sIGluc3RhbmNlb2YgJCkge1xuICAgICAgICByZXR1cm4gcnVuQ29udHJvbGxlckZpbGxDb250ZW50KGNvbnRyb2xsZXIsICRodG1sKTtcbiAgICAgIH1cbiAgICAgIHRocm93ICRodG1sO1xuICAgIH0pO1xuXG4gIGlmIChjb250cm9sbGVyLmxvYWRfYXN5bmMpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICByZXR1cm4gcHJvbV9jb250cm9sbGVyO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuUmVmcmVzaChjb250cm9sbGVyLCBwcm9jZXNzKSB7XG4gIHJldHVybiByZWZyZXNoKG51bGwsIGNvbnRyb2xsZXIsIHByb2Nlc3MpO1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnRMaXN0KGNvbnRyb2xsZXIpIHtcbiAgbGV0IGNvbnRyb2xsZXJMaXN0ID0gW107XG4gIHdoaWxlIChjb250cm9sbGVyKSB7XG4gICAgY29udHJvbGxlci5faXNFdmVudHNTZXQgPSBmYWxzZTtcbiAgICBjb250cm9sbGVyTGlzdC51bnNoaWZ0KGNvbnRyb2xsZXIpO1xuICAgIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyLl9wYXJlbnRDb250cm9sbGVyO1xuICB9XG4gIHJldHVybiBjb250cm9sbGVyTGlzdDtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaChwcm9jZXNzKSB7XG4gIGNvbnN0IHBhcmVudExpc3QgPSBnZXRQYXJlbnRMaXN0KHByb2Nlc3MuY29udHJvbGxlclswXSk7XG4gIGNvbnN0IGNvbnRyb2xsZXJMaXN0ID0gcGFyZW50TGlzdC5jb25jYXQocHJvY2Vzcy5jb250cm9sbGVyLnNsaWNlKDEpKTtcblxuICBmb3IgKGxldCBjb24gb2YgY29udHJvbGxlckxpc3QpIHtcbiAgICBzZXRDb250cm9sbGVyRXZlbnRzKGNvbik7XG4gICAgY29uLm9uUmVmcmVzaChwcm9jZXNzLmNvbnRyb2xsZXJbMF0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlUmVmcmVzaFByb2Nlc3MocmVmcmVzaFByb2Nlc3MsIGNvbnRyb2xsZXIpIHtcbiAgbGV0IGlzUnVubmluZ1Byb2Nlc3MgPSBCb29sZWFuKHJlZnJlc2hQcm9jZXNzKTtcblxuICBpZiAoIWlzUnVubmluZ1Byb2Nlc3MpIHtcbiAgICByZWZyZXNoUHJvY2VzcyA9IHtcbiAgICAgIHV1aWRzOiBuZXcgU2V0KFtjb250cm9sbGVyLl91dWlkXSksXG4gICAgICBjb250cm9sbGVyOiBbY29udHJvbGxlcl0sXG4gICAgfTtcbiAgfSBlbHNlIGlmICghcmVmcmVzaFByb2Nlc3MudXVpZHMuaGFzKGNvbnRyb2xsZXIuX3V1aWQpKSB7XG4gICAgcmVmcmVzaFByb2Nlc3MudXVpZHMuYWRkKGNvbnRyb2xsZXIuX3V1aWQpO1xuICAgIHJlZnJlc2hQcm9jZXNzLmNvbnRyb2xsZXIucHVzaChjb250cm9sbGVyKTtcbiAgfVxuXG4gIHJldHVybiB7IGlzUnVubmluZ1Byb2Nlc3MsIHJlZnJlc2hQcm9jZXNzIH07XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_controller.js\n\n}");
|
|
47
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ Global: () => (/* binding */ Global),\n/* harmony export */ controllerFactory: () => (/* binding */ controllerFactory),\n/* harmony export */ controllerList: () => (/* binding */ controllerList),\n/* harmony export */ prepareRefreshProcess: () => (/* binding */ prepareRefreshProcess),\n/* harmony export */ resetChildren: () => (/* binding */ resetChildren),\n/* harmony export */ runControlFlowFunctions: () => (/* binding */ runControlFlowFunctions),\n/* harmony export */ runRefresh: () => (/* binding */ runRefresh),\n/* harmony export */ tagList: () => (/* binding */ tagList),\n/* harmony export */ updateEventAndTriggerOnRefresh: () => (/* binding */ updateEventAndTriggerOnRefresh)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n/* harmony import */ var _sdc_params_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_params.js */ \"./src/simpleDomControl/sdc_params.js\");\n/* harmony import */ var _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_dom_events.js */ \"./src/simpleDomControl/sdc_dom_events.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n\n\n\n\n\n\n\nlet Global = [];\nlet controllerList = {};\n\nfunction tagList() {\n return Object.keys(controllerList);\n}\n\nfunction prepareMixins(superTagNameList, tagName) {\n superTagNameList = superTagNameList.concat(controllerList[tagName][1]);\n superTagNameList = superTagNameList.filter((value, index, self) => {\n return self.indexOf(value) === index;\n });\n let hasAdded = true;\n while (hasAdded) {\n hasAdded = false;\n for (let tag of superTagNameList) {\n for (let newTag of controllerList[tag][1]) {\n if (!superTagNameList.includes(newTag)) {\n superTagNameList.push(newTag);\n hasAdded = true;\n }\n }\n }\n }\n return superTagNameList;\n}\n\n/**\n * setParentController sets the parent controller as property: 'parentController'\n * to the child controller. Also, it adds the child controller to the property list:\n * 'parentController' to the parent controller\n *\n * @param {AbstractSDC} parentController - js controller instance, controller of the parent DOM of the controllers DOM\n * @param {AbstractSDC} controller - js controller instance\n * @return {AbstractSDC} - parentController\n */\nfunction setParentController(parentController, controller) {\n if (parentController) {\n let controllerName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.tagNameToCamelCase)(controller._tagName);\n if (!parentController._childController[controllerName]) {\n parentController._childController[controllerName] = [];\n }\n\n parentController._childController[controllerName].push(controller);\n }\n\n return (controller._parentController = parentController);\n}\n\n/**\n * resetChildren resets all children of a controller.\n *\n * @param {AbstractSDC} parentController\n */\nfunction resetChildren(parentController) {\n parentController._childController = {};\n parentController.find(`.${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS}`).each(function () {\n const $this = $(this);\n const cController = (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($this);\n // Direct children only: the closest controller around the child element is the parent.\n if (cController && (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($this.parent()) === parentController) {\n setParentController(parentController, cController);\n }\n });\n}\n\n/**\n * controllerFactoryInstance it generates a controller instance\n * depending if the controller is registered as a global controller. It sets the\n * $container object to the jQuery representation of the tag.\n *\n * It handles the init parameter by the data values of the DOM.\n *\n * It handles the super extensions.\n *\n * @param {AbstractSDC} parentController - Controller of the parent DOM\n * @param {jquery} $element - The current DOM jQuery\n * @param {string} tagName - the registered tag name of the current DOM\n * @param {Array<string>} superTagNameList - tag names of super controller\n * @return {AbstractSDC} - new Controller\n */\nfunction controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n) {\n let mixinControllerClass = [];\n superTagNameList = prepareMixins(superTagNameList, tagName);\n for (let superTagName of superTagNameList) {\n mixinControllerClass.push(controllerList[superTagName][0]);\n }\n\n let controllerClass = controllerList[tagName][0];\n let controller = new ((0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.agileAggregation)(\n controllerClass,\n ...mixinControllerClass,\n ))();\n controller._tagName = tagName;\n\n setParentController(parentController, controller);\n controller.$container = $element;\n (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_2__.runOnInitWithParameter)($element, controller);\n\n return controller;\n}\n\n/**\n * controllerFactory it either generates a controller or takes a globe instance\n * depending if the controller is registered as a global controller. It sets the\n * $container object to the jQuery representation of the tag.\n *\n * Remember Global controller can not have a super controller!\n *\n * @param {AbstractSDC} parentController - Controller of the parent DOM\n * @param {jquery} $element - The current DOM jQuery\n * @param {string} tagName - the registered tag name of the current DOM\n * @param {Array<string>} superTagNameList - tag names of super controller\n * @return {AbstractSDC} - new Controller\n */\nfunction controllerFactory(\n parentController,\n $element,\n tagName,\n superTagNameList,\n) {\n if (Global.includes(tagName)) {\n let gTagName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.tagNameToCamelCase)(tagName);\n if (!window[gTagName]) {\n window[gTagName] = controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\n }\n\n window[gTagName].$container = $element;\n return window[gTagName];\n }\n\n return controllerFactoryInstance(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\n}\n\n/**\n * runControllerShow first runs onLoad and fill content for all sub\n * controller. Only if all the sub controller are loaded the willShow\n * control flow function gets called.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @param {jquery} $html - jQuery loaded content\n * @return {Promise<*>} - return of the onLoad function\n */\nfunction runControllerShow(controller, $html) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.runControllerFillContent)(controller, $html).then(function (args) {\n args = args || true;\n if (controller.willShow) {\n let loadPromiseOrContent = controller.willShow();\n if (loadPromiseOrContent instanceof Promise) {\n return loadPromiseOrContent.then(function () {\n return args;\n });\n }\n }\n\n return args;\n });\n}\n\n/**\n * runControllerLoad Calls the onLoad function of the controller.\n * This function is called before the HTML is set to the page.\n * The parameter is a list of children of the tag and the registered tag.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @return {Promise<*>} - return of the onLoad function\n */\nfunction runControllerLoad(controller) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.loadFilesFromController)(controller).then((html) => {\n if (!controller.onLoad || controller._onLoadDone) {\n return html;\n }\n\n controller._onLoadDone = true;\n let loadPromise = controller.onLoad(html);\n return (loadPromise || (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.promiseDummyFactory)()).then(() => {\n return html;\n });\n });\n}\n\n/**\n * runControlFlowFunctions runs the control flow functions:\n * 1. onLoad()\n * 2. fill content\n * 3. willShow(dom parameter)\n * 4. refresh()\n *\n * @param controller\n * @param {Object} process - Process object containing the refresh process\n */\nfunction runControlFlowFunctions(controller, process) {\n const prom_controller = runControllerLoad(controller)\n .then(function ($html) {\n return runControllerShow(controller, $html);\n })\n .then(() => {\n return runRefresh(controller, process);\n })\n .catch(function ($html) {\n if (typeof $html === 'string' || $html instanceof $) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.runControllerFillContent)(controller, $html);\n }\n throw $html;\n });\n\n if (controller.load_async) {\n return Promise.resolve();\n }\n\n return prom_controller;\n}\n\n/**\n *\n * @param {AbstractSDC} controller\n * @param {Object} process - Process object containing the refresh process\n */\nfunction runRefresh(controller, process) {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)(null, controller, process);\n}\n\nfunction getParentList(controller) {\n let controllerList = [];\n while (controller) {\n controllerList.unshift(controller);\n controller = controller._parentController;\n }\n return controllerList;\n}\n\n/**\n *\n * @param {Object} process - Process object containing the refresh process\n */\nfunction updateEventAndTriggerOnRefresh(process) {\n const parentList = getParentList(process.controller[0]);\n const controllerList = parentList.concat(process.controller.slice(1));\n\n for (let con of controllerList) {\n (0,_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_3__.setControllerEvents)(con);\n con.onRefresh(process.controller[0]);\n }\n}\n\nfunction prepareRefreshProcess(refreshProcess, controller) {\n let isRunningProcess = Boolean(refreshProcess);\n\n if (!isRunningProcess) {\n refreshProcess = {\n uuids: new Set([controller._uuid]),\n controller: [controller],\n };\n } else if (!refreshProcess.uuids.has(controller._uuid)) {\n refreshProcess.uuids.add(controller._uuid);\n refreshProcess.controller.push(controller);\n }\n\n return { isRunningProcess, refreshProcess };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfY29udHJvbGxlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUl3QjtBQU9EOztBQUVrQztBQUNDO0FBQ25DOztBQUVoQjtBQUNBOztBQUVBO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxhQUFhO0FBQ3hCLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsaUVBQWtCO0FBQzNDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCO0FBQ087QUFDUDtBQUNBLDRCQUE0QiwwREFBZ0IsQ0FBQztBQUM3QztBQUNBLHdCQUF3QiwyREFBYTtBQUNyQztBQUNBLHVCQUF1QiwyREFBYTtBQUNwQztBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsZUFBZTtBQUMxQixZQUFZLGFBQWE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esd0JBQXdCLCtEQUFnQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsRUFBRSxzRUFBc0I7O0FBRXhCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixXQUFXLGVBQWU7QUFDMUIsWUFBWSxhQUFhO0FBQ3pCO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsaUVBQWtCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CLFlBQVksWUFBWTtBQUN4QjtBQUNBO0FBQ0EsU0FBUyxzRUFBd0I7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QixZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBLFNBQVMscUVBQXVCO0FBQ2hDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsMkJBQTJCLGtFQUFtQjtBQUM5QztBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGVBQWUsc0VBQXdCO0FBQ3ZDO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CO0FBQ087QUFDUCxTQUFTLHFEQUFPO0FBQ2hCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLElBQUksdUVBQW1CO0FBQ3ZCO0FBQ0E7QUFDQTs7QUFFTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLFdBQVc7QUFDWCIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfY29udHJvbGxlci5qcz80MzgxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHByb21pc2VEdW1teUZhY3RvcnksXG4gIHRhZ05hbWVUb0NhbWVsQ2FzZSxcbiAgYWdpbGVBZ2dyZWdhdGlvbixcbn0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5pbXBvcnQge1xuICBDT05UUk9MTEVSX0NMQVNTLFxuICBnZXRDb250cm9sbGVyLFxuICBsb2FkRmlsZXNGcm9tQ29udHJvbGxlcixcbiAgcmVmcmVzaCxcbiAgcnVuQ29udHJvbGxlckZpbGxDb250ZW50LFxufSBmcm9tIFwiLi9zZGNfdmlldy5qc1wiO1xuXG5pbXBvcnQgeyBydW5PbkluaXRXaXRoUGFyYW1ldGVyIH0gZnJvbSBcIi4vc2RjX3BhcmFtcy5qc1wiO1xuaW1wb3J0IHsgc2V0Q29udHJvbGxlckV2ZW50cyB9IGZyb20gXCIuL3NkY19kb21fZXZlbnRzLmpzXCI7XG5pbXBvcnQgXCIuL3NkY19tYWluLmpzXCI7XG5cbmV4cG9ydCBsZXQgR2xvYmFsID0gW107XG5leHBvcnQgbGV0IGNvbnRyb2xsZXJMaXN0ID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWdMaXN0KCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMoY29udHJvbGxlckxpc3QpO1xufVxuXG5mdW5jdGlvbiBwcmVwYXJlTWl4aW5zKHN1cGVyVGFnTmFtZUxpc3QsIHRhZ05hbWUpIHtcbiAgc3VwZXJUYWdOYW1lTGlzdCA9IHN1cGVyVGFnTmFtZUxpc3QuY29uY2F0KGNvbnRyb2xsZXJMaXN0W3RhZ05hbWVdWzFdKTtcbiAgc3VwZXJUYWdOYW1lTGlzdCA9IHN1cGVyVGFnTmFtZUxpc3QuZmlsdGVyKCh2YWx1ZSwgaW5kZXgsIHNlbGYpID0+IHtcbiAgICByZXR1cm4gc2VsZi5pbmRleE9mKHZhbHVlKSA9PT0gaW5kZXg7XG4gIH0pO1xuICBsZXQgaGFzQWRkZWQgPSB0cnVlO1xuICB3aGlsZSAoaGFzQWRkZWQpIHtcbiAgICBoYXNBZGRlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IHRhZyBvZiBzdXBlclRhZ05hbWVMaXN0KSB7XG4gICAgICBmb3IgKGxldCBuZXdUYWcgb2YgY29udHJvbGxlckxpc3RbdGFnXVsxXSkge1xuICAgICAgICBpZiAoIXN1cGVyVGFnTmFtZUxpc3QuaW5jbHVkZXMobmV3VGFnKSkge1xuICAgICAgICAgIHN1cGVyVGFnTmFtZUxpc3QucHVzaChuZXdUYWcpO1xuICAgICAgICAgIGhhc0FkZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc3VwZXJUYWdOYW1lTGlzdDtcbn1cblxuLyoqXG4gKiBzZXRQYXJlbnRDb250cm9sbGVyIHNldHMgdGhlIHBhcmVudCBjb250cm9sbGVyIGFzIHByb3BlcnR5OiAncGFyZW50Q29udHJvbGxlcidcbiAqIHRvIHRoZSBjaGlsZCBjb250cm9sbGVyLiBBbHNvLCBpdCBhZGRzIHRoZSBjaGlsZCBjb250cm9sbGVyIHRvIHRoZSBwcm9wZXJ0eSBsaXN0OlxuICogJ3BhcmVudENvbnRyb2xsZXInIHRvIHRoZSBwYXJlbnQgY29udHJvbGxlclxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlLCBjb250cm9sbGVyIG9mIHRoZSBwYXJlbnQgRE9NIG9mIHRoZSBjb250cm9sbGVycyBET01cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ30gLSBwYXJlbnRDb250cm9sbGVyXG4gKi9cbmZ1bmN0aW9uIHNldFBhcmVudENvbnRyb2xsZXIocGFyZW50Q29udHJvbGxlciwgY29udHJvbGxlcikge1xuICBpZiAocGFyZW50Q29udHJvbGxlcikge1xuICAgIGxldCBjb250cm9sbGVyTmFtZSA9IHRhZ05hbWVUb0NhbWVsQ2FzZShjb250cm9sbGVyLl90YWdOYW1lKTtcbiAgICBpZiAoIXBhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjb250cm9sbGVyTmFtZV0pIHtcbiAgICAgIHBhcmVudENvbnRyb2xsZXIuX2NoaWxkQ29udHJvbGxlcltjb250cm9sbGVyTmFtZV0gPSBbXTtcbiAgICB9XG5cbiAgICBwYXJlbnRDb250cm9sbGVyLl9jaGlsZENvbnRyb2xsZXJbY29udHJvbGxlck5hbWVdLnB1c2goY29udHJvbGxlcik7XG4gIH1cblxuICByZXR1cm4gKGNvbnRyb2xsZXIuX3BhcmVudENvbnRyb2xsZXIgPSBwYXJlbnRDb250cm9sbGVyKTtcbn1cblxuLyoqXG4gKiByZXNldENoaWxkcmVuIHJlc2V0cyBhbGwgY2hpbGRyZW4gb2YgYSBjb250cm9sbGVyLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0Q2hpbGRyZW4ocGFyZW50Q29udHJvbGxlcikge1xuICBwYXJlbnRDb250cm9sbGVyLl9jaGlsZENvbnRyb2xsZXIgPSB7fTtcbiAgcGFyZW50Q29udHJvbGxlci5maW5kKGAuJHtDT05UUk9MTEVSX0NMQVNTfWApLmVhY2goZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0ICR0aGlzID0gJCh0aGlzKTtcbiAgICBjb25zdCBjQ29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoJHRoaXMpO1xuICAgIC8vIERpcmVjdCBjaGlsZHJlbiBvbmx5OiB0aGUgY2xvc2VzdCBjb250cm9sbGVyIGFyb3VuZCB0aGUgY2hpbGQgZWxlbWVudCBpcyB0aGUgcGFyZW50LlxuICAgIGlmIChjQ29udHJvbGxlciAmJiBnZXRDb250cm9sbGVyKCR0aGlzLnBhcmVudCgpKSA9PT0gcGFyZW50Q29udHJvbGxlcikge1xuICAgICAgc2V0UGFyZW50Q29udHJvbGxlcihwYXJlbnRDb250cm9sbGVyLCBjQ29udHJvbGxlcik7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBjb250cm9sbGVyRmFjdG9yeUluc3RhbmNlIGl0IGdlbmVyYXRlcyBhIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIGRlcGVuZGluZyBpZiB0aGUgY29udHJvbGxlciBpcyByZWdpc3RlcmVkIGFzIGEgZ2xvYmFsIGNvbnRyb2xsZXIuIEl0IHNldHMgdGhlXG4gKiAkY29udGFpbmVyIG9iamVjdCB0byB0aGUgalF1ZXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0YWcuXG4gKlxuICogSXQgaGFuZGxlcyB0aGUgaW5pdCBwYXJhbWV0ZXIgYnkgdGhlIGRhdGEgdmFsdWVzIG9mIHRoZSBET00uXG4gKlxuICogSXQgaGFuZGxlcyB0aGUgc3VwZXIgZXh0ZW5zaW9ucy5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gQ29udHJvbGxlciBvZiB0aGUgcGFyZW50IERPTVxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50IC0gVGhlIGN1cnJlbnQgRE9NIGpRdWVyeVxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgLSB0aGUgcmVnaXN0ZXJlZCB0YWcgbmFtZSBvZiB0aGUgY3VycmVudCBET01cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc3VwZXJUYWdOYW1lTGlzdCAtIHRhZyBuYW1lcyBvZiBzdXBlciBjb250cm9sbGVyXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ30gLSAgbmV3IENvbnRyb2xsZXJcbiAqL1xuZnVuY3Rpb24gY29udHJvbGxlckZhY3RvcnlJbnN0YW5jZShcbiAgcGFyZW50Q29udHJvbGxlcixcbiAgJGVsZW1lbnQsXG4gIHRhZ05hbWUsXG4gIHN1cGVyVGFnTmFtZUxpc3QsXG4pIHtcbiAgbGV0IG1peGluQ29udHJvbGxlckNsYXNzID0gW107XG4gIHN1cGVyVGFnTmFtZUxpc3QgPSBwcmVwYXJlTWl4aW5zKHN1cGVyVGFnTmFtZUxpc3QsIHRhZ05hbWUpO1xuICBmb3IgKGxldCBzdXBlclRhZ05hbWUgb2Ygc3VwZXJUYWdOYW1lTGlzdCkge1xuICAgIG1peGluQ29udHJvbGxlckNsYXNzLnB1c2goY29udHJvbGxlckxpc3Rbc3VwZXJUYWdOYW1lXVswXSk7XG4gIH1cblxuICBsZXQgY29udHJvbGxlckNsYXNzID0gY29udHJvbGxlckxpc3RbdGFnTmFtZV1bMF07XG4gIGxldCBjb250cm9sbGVyID0gbmV3IChhZ2lsZUFnZ3JlZ2F0aW9uKFxuICAgIGNvbnRyb2xsZXJDbGFzcyxcbiAgICAuLi5taXhpbkNvbnRyb2xsZXJDbGFzcyxcbiAgKSkoKTtcbiAgY29udHJvbGxlci5fdGFnTmFtZSA9IHRhZ05hbWU7XG5cbiAgc2V0UGFyZW50Q29udHJvbGxlcihwYXJlbnRDb250cm9sbGVyLCBjb250cm9sbGVyKTtcbiAgY29udHJvbGxlci4kY29udGFpbmVyID0gJGVsZW1lbnQ7XG4gIHJ1bk9uSW5pdFdpdGhQYXJhbWV0ZXIoJGVsZW1lbnQsIGNvbnRyb2xsZXIpO1xuXG4gIHJldHVybiBjb250cm9sbGVyO1xufVxuXG4vKipcbiAqIGNvbnRyb2xsZXJGYWN0b3J5IGl0IGVpdGhlciBnZW5lcmF0ZXMgYSBjb250cm9sbGVyIG9yIHRha2VzIGEgZ2xvYmUgaW5zdGFuY2VcbiAqIGRlcGVuZGluZyBpZiB0aGUgY29udHJvbGxlciBpcyByZWdpc3RlcmVkIGFzIGEgZ2xvYmFsIGNvbnRyb2xsZXIuIEl0IHNldHMgdGhlXG4gKiAkY29udGFpbmVyIG9iamVjdCB0byB0aGUgalF1ZXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0YWcuXG4gKlxuICogUmVtZW1iZXIgR2xvYmFsIGNvbnRyb2xsZXIgY2FuIG5vdCBoYXZlIGEgc3VwZXIgY29udHJvbGxlciFcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gQ29udHJvbGxlciBvZiB0aGUgcGFyZW50IERPTVxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50IC0gVGhlIGN1cnJlbnQgRE9NIGpRdWVyeVxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWUgLSB0aGUgcmVnaXN0ZXJlZCB0YWcgbmFtZSBvZiB0aGUgY3VycmVudCBET01cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc3VwZXJUYWdOYW1lTGlzdCAtIHRhZyBuYW1lcyBvZiBzdXBlciBjb250cm9sbGVyXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ30gLSAgbmV3IENvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRyb2xsZXJGYWN0b3J5KFxuICBwYXJlbnRDb250cm9sbGVyLFxuICAkZWxlbWVudCxcbiAgdGFnTmFtZSxcbiAgc3VwZXJUYWdOYW1lTGlzdCxcbikge1xuICBpZiAoR2xvYmFsLmluY2x1ZGVzKHRhZ05hbWUpKSB7XG4gICAgbGV0IGdUYWdOYW1lID0gdGFnTmFtZVRvQ2FtZWxDYXNlKHRhZ05hbWUpO1xuICAgIGlmICghd2luZG93W2dUYWdOYW1lXSkge1xuICAgICAgd2luZG93W2dUYWdOYW1lXSA9IGNvbnRyb2xsZXJGYWN0b3J5SW5zdGFuY2UoXG4gICAgICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgICAgICRlbGVtZW50LFxuICAgICAgICB0YWdOYW1lLFxuICAgICAgICBzdXBlclRhZ05hbWVMaXN0LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB3aW5kb3dbZ1RhZ05hbWVdLiRjb250YWluZXIgPSAkZWxlbWVudDtcbiAgICByZXR1cm4gd2luZG93W2dUYWdOYW1lXTtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sbGVyRmFjdG9yeUluc3RhbmNlKFxuICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgJGVsZW1lbnQsXG4gICAgdGFnTmFtZSxcbiAgICBzdXBlclRhZ05hbWVMaXN0LFxuICApO1xufVxuXG4vKipcbiAqIHJ1bkNvbnRyb2xsZXJTaG93IGZpcnN0IHJ1bnMgb25Mb2FkIGFuZCBmaWxsIGNvbnRlbnQgZm9yIGFsbCBzdWJcbiAqIGNvbnRyb2xsZXIuIE9ubHkgaWYgYWxsIHRoZSBzdWIgY29udHJvbGxlciBhcmUgbG9hZGVkIHRoZSB3aWxsU2hvd1xuICogY29udHJvbCBmbG93IGZ1bmN0aW9uIGdldHMgY2FsbGVkLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGh0bWwgLSBqUXVlcnkgbG9hZGVkIGNvbnRlbnRcbiAqIEByZXR1cm4ge1Byb21pc2U8Kj59IC0gcmV0dXJuIG9mIHRoZSBvbkxvYWQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcnVuQ29udHJvbGxlclNob3coY29udHJvbGxlciwgJGh0bWwpIHtcbiAgcmV0dXJuIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudChjb250cm9sbGVyLCAkaHRtbCkudGhlbihmdW5jdGlvbiAoYXJncykge1xuICAgIGFyZ3MgPSBhcmdzIHx8IHRydWU7XG4gICAgaWYgKGNvbnRyb2xsZXIud2lsbFNob3cpIHtcbiAgICAgIGxldCBsb2FkUHJvbWlzZU9yQ29udGVudCA9IGNvbnRyb2xsZXIud2lsbFNob3coKTtcbiAgICAgIGlmIChsb2FkUHJvbWlzZU9yQ29udGVudCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIGxvYWRQcm9taXNlT3JDb250ZW50LnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBhcmdzO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYXJncztcbiAgfSk7XG59XG5cbi8qKlxuICogcnVuQ29udHJvbGxlckxvYWQgQ2FsbHMgdGhlIG9uTG9hZCBmdW5jdGlvbiBvZiB0aGUgY29udHJvbGxlci5cbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSB0aGUgSFRNTCBpcyBzZXQgdG8gdGhlIHBhZ2UuXG4gKiBUaGUgcGFyYW1ldGVyIGlzIGEgbGlzdCBvZiBjaGlsZHJlbiBvZiB0aGUgdGFnIGFuZCB0aGUgcmVnaXN0ZXJlZCB0YWcuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGpzIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIEByZXR1cm4ge1Byb21pc2U8Kj59IC0gcmV0dXJuIG9mIHRoZSBvbkxvYWQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcnVuQ29udHJvbGxlckxvYWQoY29udHJvbGxlcikge1xuICByZXR1cm4gbG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIoY29udHJvbGxlcikudGhlbigoaHRtbCkgPT4ge1xuICAgIGlmICghY29udHJvbGxlci5vbkxvYWQgfHwgY29udHJvbGxlci5fb25Mb2FkRG9uZSkge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuXG4gICAgY29udHJvbGxlci5fb25Mb2FkRG9uZSA9IHRydWU7XG4gICAgbGV0IGxvYWRQcm9taXNlID0gY29udHJvbGxlci5vbkxvYWQoaHRtbCk7XG4gICAgcmV0dXJuIChsb2FkUHJvbWlzZSB8fCBwcm9taXNlRHVtbXlGYWN0b3J5KCkpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zIHJ1bnMgdGhlIGNvbnRyb2wgZmxvdyBmdW5jdGlvbnM6XG4gKiAxLiBvbkxvYWQoKVxuICogMi4gZmlsbCBjb250ZW50XG4gKiAzLiB3aWxsU2hvdyhkb20gcGFyYW1ldGVyKVxuICogNC4gcmVmcmVzaCgpXG4gKlxuICogQHBhcmFtIGNvbnRyb2xsZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyhjb250cm9sbGVyLCBwcm9jZXNzKSB7XG4gIGNvbnN0IHByb21fY29udHJvbGxlciA9IHJ1bkNvbnRyb2xsZXJMb2FkKGNvbnRyb2xsZXIpXG4gICAgLnRoZW4oZnVuY3Rpb24gKCRodG1sKSB7XG4gICAgICByZXR1cm4gcnVuQ29udHJvbGxlclNob3coY29udHJvbGxlciwgJGh0bWwpO1xuICAgIH0pXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIHJ1blJlZnJlc2goY29udHJvbGxlciwgcHJvY2Vzcyk7XG4gICAgfSlcbiAgICAuY2F0Y2goZnVuY3Rpb24gKCRodG1sKSB7XG4gICAgICBpZiAodHlwZW9mICRodG1sID09PSAnc3RyaW5nJyB8fCAkaHRtbCBpbnN0YW5jZW9mICQpIHtcbiAgICAgICAgcmV0dXJuIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudChjb250cm9sbGVyLCAkaHRtbCk7XG4gICAgICB9XG4gICAgICB0aHJvdyAkaHRtbDtcbiAgICB9KTtcblxuICBpZiAoY29udHJvbGxlci5sb2FkX2FzeW5jKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgcmV0dXJuIHByb21fY29udHJvbGxlcjtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1blJlZnJlc2goY29udHJvbGxlciwgcHJvY2Vzcykge1xuICByZXR1cm4gcmVmcmVzaChudWxsLCBjb250cm9sbGVyLCBwcm9jZXNzKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50TGlzdChjb250cm9sbGVyKSB7XG4gIGxldCBjb250cm9sbGVyTGlzdCA9IFtdO1xuICB3aGlsZSAoY29udHJvbGxlcikge1xuICAgIGNvbnRyb2xsZXJMaXN0LnVuc2hpZnQoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlciA9IGNvbnRyb2xsZXIuX3BhcmVudENvbnRyb2xsZXI7XG4gIH1cbiAgcmV0dXJuIGNvbnRyb2xsZXJMaXN0O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHByb2Nlc3MpIHtcbiAgY29uc3QgcGFyZW50TGlzdCA9IGdldFBhcmVudExpc3QocHJvY2Vzcy5jb250cm9sbGVyWzBdKTtcbiAgY29uc3QgY29udHJvbGxlckxpc3QgPSBwYXJlbnRMaXN0LmNvbmNhdChwcm9jZXNzLmNvbnRyb2xsZXIuc2xpY2UoMSkpO1xuXG4gIGZvciAobGV0IGNvbiBvZiBjb250cm9sbGVyTGlzdCkge1xuICAgIHNldENvbnRyb2xsZXJFdmVudHMoY29uKTtcbiAgICBjb24ub25SZWZyZXNoKHByb2Nlc3MuY29udHJvbGxlclswXSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVSZWZyZXNoUHJvY2VzcyhyZWZyZXNoUHJvY2VzcywgY29udHJvbGxlcikge1xuICBsZXQgaXNSdW5uaW5nUHJvY2VzcyA9IEJvb2xlYW4ocmVmcmVzaFByb2Nlc3MpO1xuXG4gIGlmICghaXNSdW5uaW5nUHJvY2Vzcykge1xuICAgIHJlZnJlc2hQcm9jZXNzID0ge1xuICAgICAgdXVpZHM6IG5ldyBTZXQoW2NvbnRyb2xsZXIuX3V1aWRdKSxcbiAgICAgIGNvbnRyb2xsZXI6IFtjb250cm9sbGVyXSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKCFyZWZyZXNoUHJvY2Vzcy51dWlkcy5oYXMoY29udHJvbGxlci5fdXVpZCkpIHtcbiAgICByZWZyZXNoUHJvY2Vzcy51dWlkcy5hZGQoY29udHJvbGxlci5fdXVpZCk7XG4gICAgcmVmcmVzaFByb2Nlc3MuY29udHJvbGxlci5wdXNoKGNvbnRyb2xsZXIpO1xuICB9XG5cbiAgcmV0dXJuIHsgaXNSdW5uaW5nUHJvY2VzcywgcmVmcmVzaFByb2Nlc3MgfTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_controller.js\n\n}");
|
|
38
48
|
|
|
39
49
|
/***/ },
|
|
40
50
|
|
|
@@ -44,7 +54,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
44
54
|
\************************************************/
|
|
45
55
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
46
56
|
|
|
47
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ STD_EVENT_BLACK_LIST: () => (/* binding */ STD_EVENT_BLACK_LIST),\n/* harmony export */ STD_EVENT_LIST: () => (/* binding */ STD_EVENT_LIST),\n/* harmony export */ initEvents: () => (/* binding */ initEvents),\n/* harmony export */ setControllerEvents: () => (/* binding */ setControllerEvents),\n/* harmony export */ windowEventHandler: () => (/* binding */ windowEventHandler)\n/* harmony export */ });\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n\n\nconst STD_EVENT_BLACK_LIST = [\"onbeforeunload\", \"onunload\"];\nconst STD_EVENT_LIST = Object.keys(window)\n .filter((key) => /^on/.test(key) && !STD_EVENT_BLACK_LIST.includes(key))\n .map((x) => x.slice(2));\n\nfunction checkIfEventFits(ev_type, e, target) {\n let elementUnderMouse;\n switch (ev_type) {\n case \"mouseleave\":\n case \"mouseout\":\n elementUnderMouse = document.elementFromPoint(e.clientX, e.clientY);\n return (\n target !== elementUnderMouse && !target.contains(elementUnderMouse)\n );\n case \"mouseenter\":\n case \"mousein\":\n elementUnderMouse = document.elementFromPoint(e.clientX, e.clientY);\n return (\n target !== elementUnderMouse && !target.contains(elementUnderMouse)\n );\n default:\n return true;\n }\n}\n\nfunction windowEventHandler(event) {\n let ev_type = event.type;\n if (\n event.hasOwnProperty(\"namespace\") &&\n event.namespace &&\n event.namespace.length\n )\n ev_type += `.${event.namespace}`;\n\n let $elm = $(event.target);\n let controller = null;\n let is_done = false;\n let is_last_elem = false;\n event.stopImmediatePropagation = () => (is_last_elem = true);\n event.stopPropagation = () => (is_last_elem = is_done = true);\n while ($elm.length) {\n let attrs = $elm.attr(`sdc_${ev_type}`);\n if (attrs && checkIfEventFits(ev_type, event, $elm[0])) {\n if (!controller) {\n controller = (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_0__.getController)($elm);\n if (!controller) return;\n }\n while (controller) {\n attrs.split(\" \").forEach((attr) => {\n if (is_done) return;\n let handler = null;\n if (typeof attr === \"function\") {\n handler = attr;\n } else if (typeof controller[attr] === \"function\") {\n handler = controller[attr];\n } else if (\n typeof attr === \"string\" &&\n attr.startsWith(\"this.event_\")\n ) {\n handler = controller.getEvents()[ev_type];\n if (!handler) {\n return;\n }\n handler = handler[attr.slice(\"this.event_\".length)];\n if (!handler) {\n return;\n }\n }\n\n handler && handler.call(controller, $elm, event);\n });\n if (is_last_elem) return;\n controller = controller._parentController;\n }\n }\n if (is_done) return;\n $elm = $elm.parent();\n }\n\n return { res: true };\n}\n\n/**\n *\n */\nfunction initEvents() {\n const $window = $(window);\n STD_EVENT_LIST.forEach((ev_type) => {\n $window.off(ev_type).on(ev_type, windowEventHandler);\n });\n}\n\n/**\n *\n * @param {AbstractSDC} controller\n */\nfunction setControllerEvents(controller) {\n if (controller._isEventsSet) {\n return;\n }\n\n const events = controller.getEvents();\n for (let ev_type in events) {\n if (events.hasOwnProperty(ev_type)) {\n let eventList = events[ev_type];\n for (let domSelector in eventList) {\n if (eventList.hasOwnProperty(domSelector)) {\n controller.find(domSelector).each(function () {\n let $elements = $(this);\n let event_list = $elements.attr(`sdc_${ev_type}`) || null;\n if (!event_list) event_list = [];\n else event_list = event_list.split(\" \");\n const new_key = `this.event_${domSelector}`;\n if (event_list.indexOf(new_key) === -1) {\n event_list.push(new_key);\n $elements.attr(`sdc_${ev_type}`, event_list.join(\" \"));\n }\n });\n }\n }\n }\n }\n // TODO: Is it needed\n //controller._isEventsSet = true;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfZG9tX2V2ZW50cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBOEM7O0FBRXZDO0FBQ0E7QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjs7QUFFbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsUUFBUTtBQUN6QztBQUNBO0FBQ0EscUJBQXFCLDJEQUFhO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxRQUFRO0FBQzNEO0FBQ0E7QUFDQSwwQ0FBMEMsWUFBWTtBQUN0RDtBQUNBO0FBQ0Esb0NBQW9DLFFBQVE7QUFDNUM7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX2RvbV9ldmVudHMuanM/YzdmZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRDb250cm9sbGVyIH0gZnJvbSBcIi4vc2RjX3ZpZXcuanNcIjtcblxuZXhwb3J0IGNvbnN0IFNURF9FVkVOVF9CTEFDS19MSVNUID0gW1wib25iZWZvcmV1bmxvYWRcIiwgXCJvbnVubG9hZFwiXTtcbmV4cG9ydCBjb25zdCBTVERfRVZFTlRfTElTVCA9IE9iamVjdC5rZXlzKHdpbmRvdylcbiAgLmZpbHRlcigoa2V5KSA9PiAvXm9uLy50ZXN0KGtleSkgJiYgIVNURF9FVkVOVF9CTEFDS19MSVNULmluY2x1ZGVzKGtleSkpXG4gIC5tYXAoKHgpID0+IHguc2xpY2UoMikpO1xuXG5mdW5jdGlvbiBjaGVja0lmRXZlbnRGaXRzKGV2X3R5cGUsIGUsIHRhcmdldCkge1xuICBsZXQgZWxlbWVudFVuZGVyTW91c2U7XG4gIHN3aXRjaCAoZXZfdHlwZSkge1xuICAgIGNhc2UgXCJtb3VzZWxlYXZlXCI6XG4gICAgY2FzZSBcIm1vdXNlb3V0XCI6XG4gICAgICBlbGVtZW50VW5kZXJNb3VzZSA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGFyZ2V0ICE9PSBlbGVtZW50VW5kZXJNb3VzZSAmJiAhdGFyZ2V0LmNvbnRhaW5zKGVsZW1lbnRVbmRlck1vdXNlKVxuICAgICAgKTtcbiAgICBjYXNlIFwibW91c2VlbnRlclwiOlxuICAgIGNhc2UgXCJtb3VzZWluXCI6XG4gICAgICBlbGVtZW50VW5kZXJNb3VzZSA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGFyZ2V0ICE9PSBlbGVtZW50VW5kZXJNb3VzZSAmJiAhdGFyZ2V0LmNvbnRhaW5zKGVsZW1lbnRVbmRlck1vdXNlKVxuICAgICAgKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpbmRvd0V2ZW50SGFuZGxlcihldmVudCkge1xuICBsZXQgZXZfdHlwZSA9IGV2ZW50LnR5cGU7XG4gIGlmIChcbiAgICBldmVudC5oYXNPd25Qcm9wZXJ0eShcIm5hbWVzcGFjZVwiKSAmJlxuICAgIGV2ZW50Lm5hbWVzcGFjZSAmJlxuICAgIGV2ZW50Lm5hbWVzcGFjZS5sZW5ndGhcbiAgKVxuICAgIGV2X3R5cGUgKz0gYC4ke2V2ZW50Lm5hbWVzcGFjZX1gO1xuXG4gIGxldCAkZWxtID0gJChldmVudC50YXJnZXQpO1xuICBsZXQgY29udHJvbGxlciA9IG51bGw7XG4gIGxldCBpc19kb25lID0gZmFsc2U7XG4gIGxldCBpc19sYXN0X2VsZW0gPSBmYWxzZTtcbiAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uID0gKCkgPT4gKGlzX2xhc3RfZWxlbSA9IHRydWUpO1xuICBldmVudC5zdG9wUHJvcGFnYXRpb24gPSAoKSA9PiAoaXNfbGFzdF9lbGVtID0gaXNfZG9uZSA9IHRydWUpO1xuICB3aGlsZSAoJGVsbS5sZW5ndGgpIHtcbiAgICBsZXQgYXR0cnMgPSAkZWxtLmF0dHIoYHNkY18ke2V2X3R5cGV9YCk7XG4gICAgaWYgKGF0dHJzICYmIGNoZWNrSWZFdmVudEZpdHMoZXZfdHlwZSwgZXZlbnQsICRlbG1bMF0pKSB7XG4gICAgICBpZiAoIWNvbnRyb2xsZXIpIHtcbiAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoJGVsbSk7XG4gICAgICAgIGlmICghY29udHJvbGxlcikgcmV0dXJuO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGNvbnRyb2xsZXIpIHtcbiAgICAgICAgYXR0cnMuc3BsaXQoXCIgXCIpLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICAgICAgICBpZiAoaXNfZG9uZSkgcmV0dXJuO1xuICAgICAgICAgIGxldCBoYW5kbGVyID0gbnVsbDtcbiAgICAgICAgICBpZiAodHlwZW9mIGF0dHIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgaGFuZGxlciA9IGF0dHI7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29udHJvbGxlclthdHRyXSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBoYW5kbGVyID0gY29udHJvbGxlclthdHRyXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGF0dHIgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgIGF0dHIuc3RhcnRzV2l0aChcInRoaXMuZXZlbnRfXCIpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBoYW5kbGVyID0gY29udHJvbGxlci5nZXRFdmVudHMoKVtldl90eXBlXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoYW5kbGVyID0gaGFuZGxlclthdHRyLnNsaWNlKFwidGhpcy5ldmVudF9cIi5sZW5ndGgpXTtcbiAgICAgICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaGFuZGxlciAmJiBoYW5kbGVyLmNhbGwoY29udHJvbGxlciwgJGVsbSwgZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlzX2xhc3RfZWxlbSkgcmV0dXJuO1xuICAgICAgICBjb250cm9sbGVyID0gY29udHJvbGxlci5fcGFyZW50Q29udHJvbGxlcjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzX2RvbmUpIHJldHVybjtcbiAgICAkZWxtID0gJGVsbS5wYXJlbnQoKTtcbiAgfVxuXG4gIHJldHVybiB7IHJlczogdHJ1ZSB9O1xufVxuXG4vKipcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0RXZlbnRzKCkge1xuICBjb25zdCAkd2luZG93ID0gJCh3aW5kb3cpO1xuICBTVERfRVZFTlRfTElTVC5mb3JFYWNoKChldl90eXBlKSA9PiB7XG4gICAgJHdpbmRvdy5vZmYoZXZfdHlwZSkub24oZXZfdHlwZSwgd2luZG93RXZlbnRIYW5kbGVyKTtcbiAgfSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldENvbnRyb2xsZXJFdmVudHMoY29udHJvbGxlcikge1xuICBpZiAoY29udHJvbGxlci5faXNFdmVudHNTZXQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBldmVudHMgPSBjb250cm9sbGVyLmdldEV2ZW50cygpO1xuICBmb3IgKGxldCBldl90eXBlIGluIGV2ZW50cykge1xuICAgIGlmIChldmVudHMuaGFzT3duUHJvcGVydHkoZXZfdHlwZSkpIHtcbiAgICAgIGxldCBldmVudExpc3QgPSBldmVudHNbZXZfdHlwZV07XG4gICAgICBmb3IgKGxldCBkb21TZWxlY3RvciBpbiBldmVudExpc3QpIHtcbiAgICAgICAgaWYgKGV2ZW50TGlzdC5oYXNPd25Qcm9wZXJ0eShkb21TZWxlY3RvcikpIHtcbiAgICAgICAgICBjb250cm9sbGVyLmZpbmQoZG9tU2VsZWN0b3IpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0ICRlbGVtZW50cyA9ICQodGhpcyk7XG4gICAgICAgICAgICBsZXQgZXZlbnRfbGlzdCA9ICRlbGVtZW50cy5hdHRyKGBzZGNfJHtldl90eXBlfWApIHx8IG51bGw7XG4gICAgICAgICAgICBpZiAoIWV2ZW50X2xpc3QpIGV2ZW50X2xpc3QgPSBbXTtcbiAgICAgICAgICAgIGVsc2UgZXZlbnRfbGlzdCA9IGV2ZW50X2xpc3Quc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgY29uc3QgbmV3X2tleSA9IGB0aGlzLmV2ZW50XyR7ZG9tU2VsZWN0b3J9YDtcbiAgICAgICAgICAgIGlmIChldmVudF9saXN0LmluZGV4T2YobmV3X2tleSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIGV2ZW50X2xpc3QucHVzaChuZXdfa2V5KTtcbiAgICAgICAgICAgICAgJGVsZW1lbnRzLmF0dHIoYHNkY18ke2V2X3R5cGV9YCwgZXZlbnRfbGlzdC5qb2luKFwiIFwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gVE9ETzogSXMgaXQgbmVlZGVkXG4gIC8vY29udHJvbGxlci5faXNFdmVudHNTZXQgPSB0cnVlO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_dom_events.js\n\n}");
|
|
57
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ STD_EVENT_BLACK_LIST: () => (/* binding */ STD_EVENT_BLACK_LIST),\n/* harmony export */ STD_EVENT_LIST: () => (/* binding */ STD_EVENT_LIST),\n/* harmony export */ initEvents: () => (/* binding */ initEvents),\n/* harmony export */ setControllerEvents: () => (/* binding */ setControllerEvents),\n/* harmony export */ windowEventHandler: () => (/* binding */ windowEventHandler)\n/* harmony export */ });\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n\n\nconst STD_EVENT_BLACK_LIST = [\"onbeforeunload\", \"onunload\"];\nconst STD_EVENT_LIST = Object.keys(window)\n .filter((key) => /^on/.test(key) && !STD_EVENT_BLACK_LIST.includes(key))\n .map((x) => x.slice(2));\n\nfunction checkIfEventFits(ev_type, e, target) {\n let elementUnderMouse;\n switch (ev_type) {\n case \"mouseleave\":\n case \"mouseout\":\n elementUnderMouse = document.elementFromPoint(e.clientX, e.clientY);\n return (\n target !== elementUnderMouse && !target.contains(elementUnderMouse)\n );\n case \"mouseenter\":\n elementUnderMouse = document.elementFromPoint(e.clientX, e.clientY);\n return (\n target !== elementUnderMouse && !target.contains(elementUnderMouse)\n );\n default:\n return true;\n }\n}\n\nfunction windowEventHandler(event) {\n let ev_type = event.type;\n if (\n Object.hasOwn(event, \"namespace\") &&\n event.namespace &&\n event.namespace.length\n )\n ev_type += `.${event.namespace}`;\n\n let $elm = $(event.target);\n let controller = null;\n let is_done = false;\n let is_last_elem = false;\n event.stopImmediatePropagation = () => (is_last_elem = true);\n event.stopPropagation = () => (is_last_elem = is_done = true);\n while ($elm.length) {\n let attrs = $elm.attr(`sdc_${ev_type}`);\n if (attrs && checkIfEventFits(ev_type, event, $elm[0])) {\n if (!controller) {\n controller = (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_0__.getController)($elm);\n if (!controller) return;\n }\n while (controller) {\n attrs.split(\" \").forEach((attr) => {\n if (is_done) return;\n let handler = null;\n if (typeof attr === \"function\") {\n handler = attr;\n } else if (typeof controller[attr] === \"function\") {\n handler = controller[attr];\n } else if (\n typeof attr === \"string\" &&\n attr.startsWith(\"this.event_\")\n ) {\n handler = controller.getEvents()[ev_type];\n if (!handler) {\n return;\n }\n handler = handler[attr.slice(\"this.event_\".length)];\n if (!handler) {\n return;\n }\n }\n\n handler && handler.call(controller, $elm, event);\n });\n if (is_last_elem) return;\n controller = controller._parentController;\n }\n }\n if (is_done) return;\n $elm = $elm.parent();\n }\n\n return { res: true };\n}\n\n/**\n *\n */\nfunction initEvents() {\n const $window = $(window);\n STD_EVENT_LIST.forEach((ev_type) => {\n $window.off(ev_type).on(ev_type, windowEventHandler);\n });\n}\n\n/**\n *\n * @param {AbstractSDC} controller\n */\nfunction setControllerEvents(controller) {\n const events = controller.getEvents();\n for (let ev_type in events) {\n if (Object.hasOwn(events, ev_type)) {\n let eventList = events[ev_type];\n for (let domSelector in eventList) {\n if (Object.hasOwn(eventList, domSelector)) {\n controller.find(domSelector).each(function () {\n let $elements = $(this);\n let event_list = $elements.attr(`sdc_${ev_type}`) || null;\n if (!event_list) event_list = [];\n else event_list = event_list.split(\" \");\n const new_key = `this.event_${domSelector}`;\n if (event_list.indexOf(new_key) === -1) {\n event_list.push(new_key);\n $elements.attr(`sdc_${ev_type}`, event_list.join(\" \"));\n }\n });\n }\n }\n }\n }\n // Not cached on purpose: a refresh can add new elements that match the selectors,\n // so the attributes are set again on every refresh (existing entries are skipped).\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfZG9tX2V2ZW50cy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBOEM7O0FBRXZDO0FBQ0E7QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixnQkFBZ0I7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFFBQVE7QUFDekM7QUFDQTtBQUNBLHFCQUFxQiwyREFBYTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLFdBQVcsYUFBYTtBQUN4QjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxRQUFRO0FBQzNEO0FBQ0E7QUFDQSwwQ0FBMEMsWUFBWTtBQUN0RDtBQUNBO0FBQ0Esb0NBQW9DLFFBQVE7QUFDNUM7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX2RvbV9ldmVudHMuanM/YzdmZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRDb250cm9sbGVyIH0gZnJvbSBcIi4vc2RjX3ZpZXcuanNcIjtcblxuZXhwb3J0IGNvbnN0IFNURF9FVkVOVF9CTEFDS19MSVNUID0gW1wib25iZWZvcmV1bmxvYWRcIiwgXCJvbnVubG9hZFwiXTtcbmV4cG9ydCBjb25zdCBTVERfRVZFTlRfTElTVCA9IE9iamVjdC5rZXlzKHdpbmRvdylcbiAgLmZpbHRlcigoa2V5KSA9PiAvXm9uLy50ZXN0KGtleSkgJiYgIVNURF9FVkVOVF9CTEFDS19MSVNULmluY2x1ZGVzKGtleSkpXG4gIC5tYXAoKHgpID0+IHguc2xpY2UoMikpO1xuXG5mdW5jdGlvbiBjaGVja0lmRXZlbnRGaXRzKGV2X3R5cGUsIGUsIHRhcmdldCkge1xuICBsZXQgZWxlbWVudFVuZGVyTW91c2U7XG4gIHN3aXRjaCAoZXZfdHlwZSkge1xuICAgIGNhc2UgXCJtb3VzZWxlYXZlXCI6XG4gICAgY2FzZSBcIm1vdXNlb3V0XCI6XG4gICAgICBlbGVtZW50VW5kZXJNb3VzZSA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdGFyZ2V0ICE9PSBlbGVtZW50VW5kZXJNb3VzZSAmJiAhdGFyZ2V0LmNvbnRhaW5zKGVsZW1lbnRVbmRlck1vdXNlKVxuICAgICAgKTtcbiAgICBjYXNlIFwibW91c2VlbnRlclwiOlxuICAgICAgZWxlbWVudFVuZGVyTW91c2UgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRhcmdldCAhPT0gZWxlbWVudFVuZGVyTW91c2UgJiYgIXRhcmdldC5jb250YWlucyhlbGVtZW50VW5kZXJNb3VzZSlcbiAgICAgICk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aW5kb3dFdmVudEhhbmRsZXIoZXZlbnQpIHtcbiAgbGV0IGV2X3R5cGUgPSBldmVudC50eXBlO1xuICBpZiAoXG4gICAgT2JqZWN0Lmhhc093bihldmVudCwgXCJuYW1lc3BhY2VcIikgJiZcbiAgICBldmVudC5uYW1lc3BhY2UgJiZcbiAgICBldmVudC5uYW1lc3BhY2UubGVuZ3RoXG4gIClcbiAgICBldl90eXBlICs9IGAuJHtldmVudC5uYW1lc3BhY2V9YDtcblxuICBsZXQgJGVsbSA9ICQoZXZlbnQudGFyZ2V0KTtcbiAgbGV0IGNvbnRyb2xsZXIgPSBudWxsO1xuICBsZXQgaXNfZG9uZSA9IGZhbHNlO1xuICBsZXQgaXNfbGFzdF9lbGVtID0gZmFsc2U7XG4gIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9ICgpID0+IChpc19sYXN0X2VsZW0gPSB0cnVlKTtcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uID0gKCkgPT4gKGlzX2xhc3RfZWxlbSA9IGlzX2RvbmUgPSB0cnVlKTtcbiAgd2hpbGUgKCRlbG0ubGVuZ3RoKSB7XG4gICAgbGV0IGF0dHJzID0gJGVsbS5hdHRyKGBzZGNfJHtldl90eXBlfWApO1xuICAgIGlmIChhdHRycyAmJiBjaGVja0lmRXZlbnRGaXRzKGV2X3R5cGUsIGV2ZW50LCAkZWxtWzBdKSkge1xuICAgICAgaWYgKCFjb250cm9sbGVyKSB7XG4gICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCRlbG0pO1xuICAgICAgICBpZiAoIWNvbnRyb2xsZXIpIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChjb250cm9sbGVyKSB7XG4gICAgICAgIGF0dHJzLnNwbGl0KFwiIFwiKS5mb3JFYWNoKChhdHRyKSA9PiB7XG4gICAgICAgICAgaWYgKGlzX2RvbmUpIHJldHVybjtcbiAgICAgICAgICBsZXQgaGFuZGxlciA9IG51bGw7XG4gICAgICAgICAgaWYgKHR5cGVvZiBhdHRyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGhhbmRsZXIgPSBhdHRyO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbnRyb2xsZXJbYXR0cl0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgaGFuZGxlciA9IGNvbnRyb2xsZXJbYXR0cl07XG4gICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBhdHRyID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICBhdHRyLnN0YXJ0c1dpdGgoXCJ0aGlzLmV2ZW50X1wiKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgaGFuZGxlciA9IGNvbnRyb2xsZXIuZ2V0RXZlbnRzKClbZXZfdHlwZV07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGFuZGxlciA9IGhhbmRsZXJbYXR0ci5zbGljZShcInRoaXMuZXZlbnRfXCIubGVuZ3RoKV07XG4gICAgICAgICAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGhhbmRsZXIgJiYgaGFuZGxlci5jYWxsKGNvbnRyb2xsZXIsICRlbG0sIGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc19sYXN0X2VsZW0pIHJldHVybjtcbiAgICAgICAgY29udHJvbGxlciA9IGNvbnRyb2xsZXIuX3BhcmVudENvbnRyb2xsZXI7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc19kb25lKSByZXR1cm47XG4gICAgJGVsbSA9ICRlbG0ucGFyZW50KCk7XG4gIH1cblxuICByZXR1cm4geyByZXM6IHRydWUgfTtcbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdEV2ZW50cygpIHtcbiAgY29uc3QgJHdpbmRvdyA9ICQod2luZG93KTtcbiAgU1REX0VWRU5UX0xJU1QuZm9yRWFjaCgoZXZfdHlwZSkgPT4ge1xuICAgICR3aW5kb3cub2ZmKGV2X3R5cGUpLm9uKGV2X3R5cGUsIHdpbmRvd0V2ZW50SGFuZGxlcik7XG4gIH0pO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb250cm9sbGVyRXZlbnRzKGNvbnRyb2xsZXIpIHtcbiAgY29uc3QgZXZlbnRzID0gY29udHJvbGxlci5nZXRFdmVudHMoKTtcbiAgZm9yIChsZXQgZXZfdHlwZSBpbiBldmVudHMpIHtcbiAgICBpZiAoT2JqZWN0Lmhhc093bihldmVudHMsIGV2X3R5cGUpKSB7XG4gICAgICBsZXQgZXZlbnRMaXN0ID0gZXZlbnRzW2V2X3R5cGVdO1xuICAgICAgZm9yIChsZXQgZG9tU2VsZWN0b3IgaW4gZXZlbnRMaXN0KSB7XG4gICAgICAgIGlmIChPYmplY3QuaGFzT3duKGV2ZW50TGlzdCwgZG9tU2VsZWN0b3IpKSB7XG4gICAgICAgICAgY29udHJvbGxlci5maW5kKGRvbVNlbGVjdG9yKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCAkZWxlbWVudHMgPSAkKHRoaXMpO1xuICAgICAgICAgICAgbGV0IGV2ZW50X2xpc3QgPSAkZWxlbWVudHMuYXR0cihgc2RjXyR7ZXZfdHlwZX1gKSB8fCBudWxsO1xuICAgICAgICAgICAgaWYgKCFldmVudF9saXN0KSBldmVudF9saXN0ID0gW107XG4gICAgICAgICAgICBlbHNlIGV2ZW50X2xpc3QgPSBldmVudF9saXN0LnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGNvbnN0IG5ld19rZXkgPSBgdGhpcy5ldmVudF8ke2RvbVNlbGVjdG9yfWA7XG4gICAgICAgICAgICBpZiAoZXZlbnRfbGlzdC5pbmRleE9mKG5ld19rZXkpID09PSAtMSkge1xuICAgICAgICAgICAgICBldmVudF9saXN0LnB1c2gobmV3X2tleSk7XG4gICAgICAgICAgICAgICRlbGVtZW50cy5hdHRyKGBzZGNfJHtldl90eXBlfWAsIGV2ZW50X2xpc3Quam9pbihcIiBcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIE5vdCBjYWNoZWQgb24gcHVycG9zZTogYSByZWZyZXNoIGNhbiBhZGQgbmV3IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9ycyxcbiAgLy8gc28gdGhlIGF0dHJpYnV0ZXMgYXJlIHNldCBhZ2FpbiBvbiBldmVyeSByZWZyZXNoIChleGlzdGluZyBlbnRyaWVzIGFyZSBza2lwcGVkKS5cbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_dom_events.js\n\n}");
|
|
48
58
|
|
|
49
59
|
/***/ },
|
|
50
60
|
|
|
@@ -54,7 +64,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
54
64
|
\********************************************/
|
|
55
65
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
56
66
|
|
|
57
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ allOff: () => (/* binding */ allOff),\n/* harmony export */ on: () => (/* binding */ on),\n/* harmony export */ setEvent: () => (/* binding */ setEvent),\n/* harmony export */ trigger: () => (/* binding */ trigger)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n\n\n/**\n * A list of handler (controller) for the registered events.\n * @type {{}}\n */\nlet handlerList = {};\n\n/**\n * eventList is a map connection the event to a responsing function name.\n * @type {{}}\n */\nlet eventList = {};\n\n/**\n * on is a function to register a controller to a event. The controller has to\n * implement the the handler function. The handler functions by default has the same\n * name as the event. You can use the app.events.setEvent function to register a\n * event with a different named function.\n *\n * @param {string} name - the event name String\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n */\nfunction on(name, controller) {\n setEvent(name);\n if (!
|
|
67
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ allOff: () => (/* binding */ allOff),\n/* harmony export */ on: () => (/* binding */ on),\n/* harmony export */ setEvent: () => (/* binding */ setEvent),\n/* harmony export */ trigger: () => (/* binding */ trigger)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n\n\n/**\n * A list of handler (controller) for the registered events.\n * @type {{}}\n */\nlet handlerList = {};\n\n/**\n * eventList is a map connection the event to a responsing function name.\n * @type {{}}\n */\nlet eventList = {};\n\n/**\n * on is a function to register a controller to a event. The controller has to\n * implement the the handler function. The handler functions by default has the same\n * name as the event. You can use the app.events.setEvent function to register a\n * event with a different named function.\n *\n * @param {string} name - the event name String\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n */\nfunction on(name, controller) {\n setEvent(name);\n if (!Object.hasOwn(eventList, name)) {\n return console.log(\"No event: \" + name, controller);\n }\n\n let funcName = eventList[name];\n if (!controller[funcName]) {\n return console.log(\"No event handler: \" + name, controller);\n }\n\n handlerList[name].push(controller);\n}\n\n/**\n * setEvent allows you to register a event with a function with a different\n * name as the event.\n *\n * @param {string} name - event name\n * @param {string} functionName - function name\n */\nfunction setEvent(name, functionName) {\n if (!functionName) {\n functionName = name;\n }\n\n if (!eventList[name]) {\n eventList[name] = functionName;\n handlerList[name] = [];\n }\n}\n\n/**\n * allOff is to remove all events of the controller instance\n * ! important before destroying the instance.\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n */\nfunction allOff(controller) {\n for (let eventName in handlerList) {\n if (Object.hasOwn(handlerList, eventName)) {\n for (let i = handlerList[eventName].length - 1; i >= 0; i--) {\n if (controller === handlerList[eventName][i]) {\n handlerList[eventName].splice(i, 1);\n }\n }\n }\n }\n}\n\n/**\n * trigger triggers the event. The handler function of all registered\n * controller gets called. The returned Promise returns a list with all\n * returned values.\n *\n * @param {string} name - event name\n * @returns {Promise<object>} - waits to return all return values of the handler\n */\nfunction trigger(name) {\n let args = Array.apply(null, arguments);\n name = args.shift();\n if (!Object.hasOwn(handlerList, name) || !Object.hasOwn(eventList, name)) {\n return (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.promiseDummyFactory)();\n }\n let handler = handlerList[name];\n let funcName = eventList[name];\n\n let list = [];\n\n for (let i = 0; i < handler.length; i++) {\n let return_val = handler[i][funcName].apply(handler[i], args);\n if (typeof return_val !== \"undefined\") {\n list.push(return_val);\n }\n }\n\n return Promise.all(list);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfZXZlbnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQXFEOztBQUVyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsYUFBYTtBQUN4QjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLFFBQVE7QUFDbkI7QUFDTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCO0FBQ087QUFDUDtBQUNBO0FBQ0Esc0RBQXNELFFBQVE7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixhQUFhLGlCQUFpQjtBQUM5QjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrRUFBbUI7QUFDOUI7QUFDQTtBQUNBOztBQUVBOztBQUVBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19ldmVudHMuanM/NjEzZiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwcm9taXNlRHVtbXlGYWN0b3J5IH0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5cbi8qKlxuICogQSBsaXN0IG9mIGhhbmRsZXIgKGNvbnRyb2xsZXIpIGZvciB0aGUgcmVnaXN0ZXJlZCBldmVudHMuXG4gKiBAdHlwZSB7e319XG4gKi9cbmxldCBoYW5kbGVyTGlzdCA9IHt9O1xuXG4vKipcbiAqIGV2ZW50TGlzdCBpcyBhIG1hcCBjb25uZWN0aW9uIHRoZSBldmVudCB0byBhIHJlc3BvbnNpbmcgZnVuY3Rpb24gbmFtZS5cbiAqIEB0eXBlIHt7fX1cbiAqL1xubGV0IGV2ZW50TGlzdCA9IHt9O1xuXG4vKipcbiAqIG9uIGlzIGEgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgYSBjb250cm9sbGVyIHRvIGEgZXZlbnQuIFRoZSBjb250cm9sbGVyIGhhcyB0b1xuICogaW1wbGVtZW50IHRoZSB0aGUgaGFuZGxlciBmdW5jdGlvbi4gVGhlIGhhbmRsZXIgZnVuY3Rpb25zIGJ5IGRlZmF1bHQgaGFzIHRoZSBzYW1lXG4gKiBuYW1lIGFzIHRoZSBldmVudC4gWW91IGNhbiB1c2UgdGhlIGFwcC5ldmVudHMuc2V0RXZlbnQgZnVuY3Rpb24gdG8gcmVnaXN0ZXIgYVxuICogZXZlbnQgd2l0aCBhIGRpZmZlcmVudCBuYW1lZCBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIHRoZSBldmVudCBuYW1lIFN0cmluZ1xuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtICBhIGluc3RhbmNlIG9mIGEgSmF2YVNjcmlwdCBjb250cm9sbGVyIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uKG5hbWUsIGNvbnRyb2xsZXIpIHtcbiAgc2V0RXZlbnQobmFtZSk7XG4gIGlmICghT2JqZWN0Lmhhc093bihldmVudExpc3QsIG5hbWUpKSB7XG4gICAgcmV0dXJuIGNvbnNvbGUubG9nKFwiTm8gZXZlbnQ6IFwiICsgbmFtZSwgY29udHJvbGxlcik7XG4gIH1cblxuICBsZXQgZnVuY05hbWUgPSBldmVudExpc3RbbmFtZV07XG4gIGlmICghY29udHJvbGxlcltmdW5jTmFtZV0pIHtcbiAgICByZXR1cm4gY29uc29sZS5sb2coXCJObyBldmVudCBoYW5kbGVyOiBcIiArIG5hbWUsIGNvbnRyb2xsZXIpO1xuICB9XG5cbiAgaGFuZGxlckxpc3RbbmFtZV0ucHVzaChjb250cm9sbGVyKTtcbn1cblxuLyoqXG4gKiBzZXRFdmVudCBhbGxvd3MgeW91IHRvIHJlZ2lzdGVyIGEgZXZlbnQgd2l0aCBhIGZ1bmN0aW9uIHdpdGggYSBkaWZmZXJlbnRcbiAqIG5hbWUgYXMgdGhlIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gZXZlbnQgbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGZ1bmN0aW9uTmFtZSAtIGZ1bmN0aW9uIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEV2ZW50KG5hbWUsIGZ1bmN0aW9uTmFtZSkge1xuICBpZiAoIWZ1bmN0aW9uTmFtZSkge1xuICAgIGZ1bmN0aW9uTmFtZSA9IG5hbWU7XG4gIH1cblxuICBpZiAoIWV2ZW50TGlzdFtuYW1lXSkge1xuICAgIGV2ZW50TGlzdFtuYW1lXSA9IGZ1bmN0aW9uTmFtZTtcbiAgICBoYW5kbGVyTGlzdFtuYW1lXSA9IFtdO1xuICB9XG59XG5cbi8qKlxuICogYWxsT2ZmIGlzIHRvIHJlbW92ZSBhbGwgZXZlbnRzIG9mIHRoZSBjb250cm9sbGVyIGluc3RhbmNlXG4gKiAhIGltcG9ydGFudCBiZWZvcmUgZGVzdHJveWluZyB0aGUgaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGEgaW5zdGFuY2Ugb2YgYSBKYXZhU2NyaXB0IGNvbnRyb2xsZXIgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWxsT2ZmKGNvbnRyb2xsZXIpIHtcbiAgZm9yIChsZXQgZXZlbnROYW1lIGluIGhhbmRsZXJMaXN0KSB7XG4gICAgaWYgKE9iamVjdC5oYXNPd24oaGFuZGxlckxpc3QsIGV2ZW50TmFtZSkpIHtcbiAgICAgIGZvciAobGV0IGkgPSBoYW5kbGVyTGlzdFtldmVudE5hbWVdLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGlmIChjb250cm9sbGVyID09PSBoYW5kbGVyTGlzdFtldmVudE5hbWVdW2ldKSB7XG4gICAgICAgICAgaGFuZGxlckxpc3RbZXZlbnROYW1lXS5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiB0cmlnZ2VyIHRyaWdnZXJzIHRoZSBldmVudC4gVGhlIGhhbmRsZXIgZnVuY3Rpb24gb2YgYWxsIHJlZ2lzdGVyZWRcbiAqIGNvbnRyb2xsZXIgZ2V0cyBjYWxsZWQuIFRoZSByZXR1cm5lZCBQcm9taXNlIHJldHVybnMgYSBsaXN0IHdpdGggYWxsXG4gKiByZXR1cm5lZCB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBldmVudCBuYW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fSAtIHdhaXRzIHRvIHJldHVybiBhbGwgcmV0dXJuIHZhbHVlcyBvZiB0aGUgaGFuZGxlclxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpZ2dlcihuYW1lKSB7XG4gIGxldCBhcmdzID0gQXJyYXkuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgbmFtZSA9IGFyZ3Muc2hpZnQoKTtcbiAgaWYgKCFPYmplY3QuaGFzT3duKGhhbmRsZXJMaXN0LCBuYW1lKSB8fCAhT2JqZWN0Lmhhc093bihldmVudExpc3QsIG5hbWUpKSB7XG4gICAgcmV0dXJuIHByb21pc2VEdW1teUZhY3RvcnkoKTtcbiAgfVxuICBsZXQgaGFuZGxlciA9IGhhbmRsZXJMaXN0W25hbWVdO1xuICBsZXQgZnVuY05hbWUgPSBldmVudExpc3RbbmFtZV07XG5cbiAgbGV0IGxpc3QgPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGhhbmRsZXIubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgcmV0dXJuX3ZhbCA9IGhhbmRsZXJbaV1bZnVuY05hbWVdLmFwcGx5KGhhbmRsZXJbaV0sIGFyZ3MpO1xuICAgIGlmICh0eXBlb2YgcmV0dXJuX3ZhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgbGlzdC5wdXNoKHJldHVybl92YWwpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLmFsbChsaXN0KTtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_events.js\n\n}");
|
|
58
68
|
|
|
59
69
|
/***/ },
|
|
60
70
|
|
|
@@ -64,7 +74,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
64
74
|
\******************************************/
|
|
65
75
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
66
76
|
|
|
67
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ app: () => (/* binding */ app)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n/* harmony import */ var _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractSDC.js */ \"./src/simpleDomControl/AbstractSDC.js\");\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_dom_events.js */ \"./src/simpleDomControl/sdc_dom_events.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n\n\n\n\n\n\n\n\n\nconst PROPERTIES_UPDATE = { classname: \"class\" };\n\nlet sdcDomFragment = function (element, props) {\n let $new_elem,\n is_self = false;\n if (typeof element === \"string\") {\n $new_elem = $(document.createElement(element));\n } else {\n const tagName = `this.${element.name}`;\n $new_elem = $(document.createElement(tagName));\n $new_elem.data(\"handler\", element);\n is_self = true;\n }\n\n if (props) {\n Object.entries(props).forEach(([k, v]) => {\n if (k.startsWith(\"on\")) {\n $new_elem[0].addEventListener(k.substring(2).toLowerCase(), v);\n } else {\n if (PROPERTIES_UPDATE[k.toLowerCase()]) {\n k = PROPERTIES_UPDATE[k.toLowerCase()];\n }\n $new_elem[0].setAttribute(k, v);\n }\n });\n }\n\n if (is_self) {\n $new_elem.addClass(\"_bind_to_update_handler _with_handler\");\n }\n\n return $new_elem;\n};\n\nwindow.sdcDom = function (tagName, props, ...children) {\n if (!tagName) {\n return \"\";\n }\n const $new_elem = sdcDomFragment(tagName, props);\n for (const c of children) {\n $new_elem.append(c);\n }\n return $new_elem;\n};\n\nlet app = {\n CSRF_TOKEN: window.CSRF_TOKEN || \"\",\n LANGUAGE_CODE: window.LANGUAGE_CODE || \"en\",\n DEBUG: window.DEBUG || false,\n VERSION: window.VERSION || \"0.0\",\n tagNames: [],\n Global: _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global,\n rootController: null,\n globalRootController: null,\n _isInit: false,\n _origin_trigger: null,\n _globalControllerClasses: [],\n\n init_sdc: () => {\n if (!app._isInit) {\n app._isInit = true;\n if (!app._origin_trigger) {\n app._origin_trigger = $.fn.trigger;\n $.fn.trigger = function (event) {\n const ev_type = {}.hasOwnProperty.call(event, \"type\")\n ? event.type\n : event;\n if (!_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.includes(ev_type)) {\n _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.push(ev_type);\n $(window).on(ev_type, _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.windowEventHandler);\n }\n return app._origin_trigger.call(this, event);\n };\n\n app.updateJquery();\n } else {\n (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.close)();\n }\n\n ;(0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.isConnected)();\n\n (0,_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.initEvents)();\n\n app.rootController = app.rootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n app.globalRootController = app.globalRootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n }\n\n app.tagNames = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.tagList)();\n\n const $globalDiv = $(\"<div></div>\");\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.forEach((tagName) => {\n const ControllerClass = _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][0];\n $globalDiv.append(\n `<${ControllerClass.prototype._tagName}></${ControllerClass.prototype._tagName}>`,\n );\n });\n\n const { refreshProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(null, app.rootController);\n\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(\n app.tagNames,\n $globalDiv,\n app.globalRootController,\n refreshProcess,\n ).then(() => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(\n app.tagNames,\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBody)(),\n app.rootController,\n refreshProcess,\n ).then((res) => {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n return res;\n });\n });\n },\n\n updateJquery: () => {\n $.fn.safeReplace = function ($elem) {\n return app.safeReplace($(this), $elem);\n };\n $.fn.safeEmpty = function () {\n return app.safeEmpty($(this));\n };\n $.fn.safeRemove = function () {\n return app.safeRemove($(this));\n };\n },\n\n controllerToTag: (Controller) => {\n let tagName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(Controller.name);\n return tagName.replace(/-controller$/, \"\");\n },\n\n /**\n *\n * @param {AbstractSDC} Controller\n */\n registerGlobal: (Controller) => {\n app.register(Controller);\n let tagName = Controller.prototype._tagName;\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.push(tagName);\n },\n\n cleanCache: () => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.cleanCache)();\n },\n\n /**\n *\n * @param {AbstractSDC} Controller\n * @param overwrite\n */\n register: (Controller, overwrite = false) => {\n let tagName = app.controllerToTag(Controller);\n if (!_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] || overwrite) {\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] = [Controller, []];\n Controller.prototype._tagName = tagName;\n\n return {\n /**\n *\n * @param {Array<string>} mixins Controller tag names\n */\n addMixin: (...mixins) => {\n for (let mixin of mixins) {\n let mixinName;\n if (typeof mixin === \"string\") {\n mixinName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(mixin);\n } else if (mixin) {\n mixinName = app.controllerToTag(mixin);\n }\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][1].push(mixinName);\n }\n },\n };\n }\n return {\n addMixin: (...mixins) => {},\n };\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n post: (controller, url, args) => {\n if (!args) {\n args = {};\n }\n\n args.CSRF_TOKEN = app.CSRF_TOKEN;\n return app.ajax(controller, url, args, $.post);\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n get: (controller, url, args) => {\n return app.ajax(controller, url, args, $.get);\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @param {function} method $.get or $.post\n * @return {Promise}\n */\n ajax: (controller, url, args, method) => {\n if (!args) {\n args = {};\n }\n\n args.VERSION = app.VERSION;\n args._method = args._method || \"api\";\n\n const p = new Promise((resolve, reject) => {\n return method(url, args)\n .then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === \"redirect\") {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.trigger)(\"onNavLink\", a[\"url-link\"]);\n } else {\n p.then(() => {\n app.refresh(controller.$container);\n });\n }\n })\n .catch(reject);\n });\n\n return p;\n },\n\n submitFormAndUpdateView: (controller, form, url, method) => {\n let formData = new FormData(form);\n const redirector = (a) => {\n if (a[\"url-link\"]) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.trigger)(\"onNavLink\", a[\"url-link\"]);\n } else {\n window.location.href = a[\"url\"];\n }\n };\n\n const p = new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method)\n .then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === \"redirect\") {\n redirector(a);\n } else {\n p.then(() => {\n app.refresh(controller.$container, controller);\n });\n }\n })\n .catch((a, b, c) => {\n if (a.status === 301) {\n a = a.responseJSON;\n redirector(a);\n resolve(a, b, c);\n } else {\n reject(a, b, c);\n }\n });\n });\n\n return p;\n },\n\n submitForm: (form, url, method) => {\n let formData = new FormData(form);\n return new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method)\n .then(resolve)\n .catch(reject);\n });\n },\n\n /**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\n getController: ($elem) => (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($elem),\n\n /**\n * safeEmpty removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM container to be emptyed\n */\n safeEmpty: ($elem) => {\n let $children = $elem.children();\n $children.each(function (_, element) {\n let $element = $(element);\n app.safeRemove($element);\n });\n\n return $elem;\n },\n\n /**\n * safeReplace removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM to be repleaced\n * @param $new - jQuery new DOM container\n */\n safeReplace: ($elem, $new) => {\n $new.insertBefore($elem);\n return app.safeRemove($elem);\n },\n\n /**\n * safeRemove removes a dom and deletes all child controller safely.\n *\n * @param $elem - jQuery Dom\n */\n safeRemove: ($elem) => {\n $elem.each(function () {\n let $this = $(this);\n if ($this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`)) {\n $this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`).remove();\n }\n });\n\n $elem.find(`.${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS}`).each(function () {\n const controller = $(this).data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`);\n controller && controller.remove();\n });\n\n return $elem.remove();\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @return {Promise<jQuery>}\n */\n reloadController: (controller) => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reloadHTMLController)(controller).then((html) => {\n let $html = $(html);\n return app.reconcile(controller, $html);\n });\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {jquery} $virtualNode\n * @param {jquery} $realNode\n * @param {Object} process - Process object containing the refresh process\n */\n reconcile: (controller, $virtualNode, $realNode = null, process = null) => {\n if (!$realNode) {\n let $temp = controller.$container.clone().empty();\n $temp.data(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY, null);\n $temp.removeClass(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS);\n $temp.append($virtualNode);\n $virtualNode = $temp;\n }\n\n $realNode = $realNode ?? controller.$container;\n\n const { refreshProcess, isRunningProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(\n process,\n controller,\n );\n\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($virtualNode, controller, refreshProcess).then(() => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reconcile)($virtualNode, $realNode);\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.resetChildren)(controller);\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n return controller;\n });\n },\n\n /**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @return {Promise<void>}\n */\n refresh: ($dom, leafController = null) => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($dom, leafController);\n },\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiw2REFBbUI7QUFDcEMsd0JBQXdCLDBEQUFnQjtBQUN4QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsWUFBWSxtQ0FBbUMsRUFBRSx5RUFBcUI7QUFDdEU7QUFDQTtBQUNBOztBQUVBLFdBQVcscURBQU87QUFDbEIsTUFBTSx1REFBUztBQUNmLE1BQU0saUVBQWE7QUFDbkI7QUFDQSxRQUFRLGtGQUE4QjtBQUN0QztBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7O0FBRUg7QUFDQTtBQUNBLGFBQWEsUUFBUTtBQUNyQixhQUFhLGFBQWE7QUFDMUIsY0FBYztBQUNkO0FBQ0E7QUFDQSxXQUFXLHFEQUFPO0FBQ2xCLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfbWFpbi5qcz8xNzgzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNhbWVsQ2FzZVRvVGFnTmFtZSxcbiAgZ2V0Qm9keSxcbiAgdXBsb2FkRmlsZUZvcm1EYXRhLFxufSBmcm9tIFwiLi9zZGNfdXRpbHMuanNcIjtcbmltcG9ydCB7XG4gIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyLFxuICByZWxvYWRIVE1MQ29udHJvbGxlcixcbiAgREFUQV9DT05UUk9MTEVSX0tFWSxcbiAgQ09OVFJPTExFUl9DTEFTUyxcbiAgZ2V0Q29udHJvbGxlcixcbiAgY2xlYW5DYWNoZSxcbiAgcmVmcmVzaCxcbn0gZnJvbSBcIi4vc2RjX3ZpZXcuanNcIjtcbmltcG9ydCB7IEFic3RyYWN0U0RDIH0gZnJvbSBcIi4vQWJzdHJhY3RTREMuanNcIjtcbmltcG9ydCB7XG4gIEdsb2JhbCxcbiAgY29udHJvbGxlckxpc3QsXG4gIHRhZ0xpc3QsXG4gIHJlc2V0Q2hpbGRyZW4sXG4gIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaCxcbiAgcHJlcGFyZVJlZnJlc2hQcm9jZXNzLFxufSBmcm9tIFwiLi9zZGNfY29udHJvbGxlci5qc1wiO1xuaW1wb3J0IHtcbiAgaW5pdEV2ZW50cyxcbiAgU1REX0VWRU5UX0xJU1QsXG4gIHdpbmRvd0V2ZW50SGFuZGxlcixcbn0gZnJvbSBcIi4vc2RjX2RvbV9ldmVudHMuanNcIjtcbmltcG9ydCB7IHJlY29uY2lsZSB9IGZyb20gXCIuL3NkY192aWV3LmpzXCI7XG5pbXBvcnQgeyB0cmlnZ2VyIH0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuaW1wb3J0IHsgaXNDb25uZWN0ZWQsIGNsb3NlIH0gZnJvbSBcIi4vc2RjX3NlcnZlcl9jYWxsLmpzXCI7XG5cbmNvbnN0IFBST1BFUlRJRVNfVVBEQVRFID0geyBjbGFzc25hbWU6IFwiY2xhc3NcIiB9O1xuXG5sZXQgc2RjRG9tRnJhZ21lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgcHJvcHMpIHtcbiAgbGV0ICRuZXdfZWxlbSxcbiAgICBpc19zZWxmID0gZmFsc2U7XG4gIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICRuZXdfZWxlbSA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlbGVtZW50KSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdGFnTmFtZSA9IGB0aGlzLiR7ZWxlbWVudC5uYW1lfWA7XG4gICAgJG5ld19lbGVtID0gJChkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpKTtcbiAgICAkbmV3X2VsZW0uZGF0YShcImhhbmRsZXJcIiwgZWxlbWVudCk7XG4gICAgaXNfc2VsZiA9IHRydWU7XG4gIH1cblxuICBpZiAocHJvcHMpIHtcbiAgICBPYmplY3QuZW50cmllcyhwcm9wcykuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICBpZiAoay5zdGFydHNXaXRoKFwib25cIikpIHtcbiAgICAgICAgJG5ld19lbGVtWzBdLmFkZEV2ZW50TGlzdGVuZXIoay5zdWJzdHJpbmcoMikudG9Mb3dlckNhc2UoKSwgdik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoUFJPUEVSVElFU19VUERBVEVbay50b0xvd2VyQ2FzZSgpXSkge1xuICAgICAgICAgIGsgPSBQUk9QRVJUSUVTX1VQREFURVtrLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICB9XG4gICAgICAgICRuZXdfZWxlbVswXS5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXNfc2VsZikge1xuICAgICRuZXdfZWxlbS5hZGRDbGFzcyhcIl9iaW5kX3RvX3VwZGF0ZV9oYW5kbGVyIF93aXRoX2hhbmRsZXJcIik7XG4gIH1cblxuICByZXR1cm4gJG5ld19lbGVtO1xufTtcblxud2luZG93LnNkY0RvbSA9IGZ1bmN0aW9uICh0YWdOYW1lLCBwcm9wcywgLi4uY2hpbGRyZW4pIHtcbiAgaWYgKCF0YWdOYW1lKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgY29uc3QgJG5ld19lbGVtID0gc2RjRG9tRnJhZ21lbnQodGFnTmFtZSwgcHJvcHMpO1xuICBmb3IgKGNvbnN0IGMgb2YgY2hpbGRyZW4pIHtcbiAgICAkbmV3X2VsZW0uYXBwZW5kKGMpO1xuICB9XG4gIHJldHVybiAkbmV3X2VsZW07XG59O1xuXG5leHBvcnQgbGV0IGFwcCA9IHtcbiAgQ1NSRl9UT0tFTjogd2luZG93LkNTUkZfVE9LRU4gfHwgXCJcIixcbiAgTEFOR1VBR0VfQ09ERTogd2luZG93LkxBTkdVQUdFX0NPREUgfHwgXCJlblwiLFxuICBERUJVRzogd2luZG93LkRFQlVHIHx8IGZhbHNlLFxuICBWRVJTSU9OOiB3aW5kb3cuVkVSU0lPTiB8fCBcIjAuMFwiLFxuICB0YWdOYW1lczogW10sXG4gIEdsb2JhbDogR2xvYmFsLFxuICByb290Q29udHJvbGxlcjogbnVsbCxcbiAgZ2xvYmFsUm9vdENvbnRyb2xsZXI6IG51bGwsXG4gIF9pc0luaXQ6IGZhbHNlLFxuICBfb3JpZ2luX3RyaWdnZXI6IG51bGwsXG4gIF9nbG9iYWxDb250cm9sbGVyQ2xhc3NlczogW10sXG5cbiAgaW5pdF9zZGM6ICgpID0+IHtcbiAgICBpZiAoIWFwcC5faXNJbml0KSB7XG4gICAgICBhcHAuX2lzSW5pdCA9IHRydWU7XG4gICAgICBpZiAoIWFwcC5fb3JpZ2luX3RyaWdnZXIpIHtcbiAgICAgICAgYXBwLl9vcmlnaW5fdHJpZ2dlciA9ICQuZm4udHJpZ2dlcjtcbiAgICAgICAgJC5mbi50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgY29uc3QgZXZfdHlwZSA9IHt9Lmhhc093blByb3BlcnR5LmNhbGwoZXZlbnQsIFwidHlwZVwiKVxuICAgICAgICAgICAgPyBldmVudC50eXBlXG4gICAgICAgICAgICA6IGV2ZW50O1xuICAgICAgICAgIGlmICghU1REX0VWRU5UX0xJU1QuaW5jbHVkZXMoZXZfdHlwZSkpIHtcbiAgICAgICAgICAgIFNURF9FVkVOVF9MSVNULnB1c2goZXZfdHlwZSk7XG4gICAgICAgICAgICAkKHdpbmRvdykub24oZXZfdHlwZSwgd2luZG93RXZlbnRIYW5kbGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFwcC5fb3JpZ2luX3RyaWdnZXIuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgYXBwLnVwZGF0ZUpxdWVyeSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xvc2UoKTtcbiAgICAgIH1cblxuICAgICAgaXNDb25uZWN0ZWQoKTtcblxuICAgICAgaW5pdEV2ZW50cygpO1xuXG4gICAgICBhcHAucm9vdENvbnRyb2xsZXIgPSBhcHAucm9vdENvbnRyb2xsZXIgfHwgbmV3IEFic3RyYWN0U0RDKCk7XG4gICAgICBhcHAuZ2xvYmFsUm9vdENvbnRyb2xsZXIgPSBhcHAuZ2xvYmFsUm9vdENvbnRyb2xsZXIgfHwgbmV3IEFic3RyYWN0U0RDKCk7XG4gICAgfVxuXG4gICAgYXBwLnRhZ05hbWVzID0gdGFnTGlzdCgpO1xuXG4gICAgY29uc3QgJGdsb2JhbERpdiA9ICQoXCI8ZGl2PjwvZGl2PlwiKTtcbiAgICBHbG9iYWwuZm9yRWFjaCgodGFnTmFtZSkgPT4ge1xuICAgICAgY29uc3QgQ29udHJvbGxlckNsYXNzID0gY29udHJvbGxlckxpc3RbdGFnTmFtZV1bMF07XG4gICAgICAkZ2xvYmFsRGl2LmFwcGVuZChcbiAgICAgICAgYDwke0NvbnRyb2xsZXJDbGFzcy5wcm90b3R5cGUuX3RhZ05hbWV9PjwvJHtDb250cm9sbGVyQ2xhc3MucHJvdG90eXBlLl90YWdOYW1lfT5gLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcmVmcmVzaFByb2Nlc3MgfSA9IHByZXBhcmVSZWZyZXNoUHJvY2VzcyhudWxsLCBhcHAucm9vdENvbnRyb2xsZXIpO1xuXG4gICAgcmV0dXJuIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAgICAgYXBwLnRhZ05hbWVzLFxuICAgICAgJGdsb2JhbERpdixcbiAgICAgIGFwcC5nbG9iYWxSb290Q29udHJvbGxlcixcbiAgICAgIHJlZnJlc2hQcm9jZXNzLFxuICAgICkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICAgICAgIGFwcC50YWdOYW1lcyxcbiAgICAgICAgZ2V0Qm9keSgpLFxuICAgICAgICBhcHAucm9vdENvbnRyb2xsZXIsXG4gICAgICAgIHJlZnJlc2hQcm9jZXNzLFxuICAgICAgKS50aGVuKChyZXMpID0+IHtcbiAgICAgICAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHJlZnJlc2hQcm9jZXNzKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9LFxuXG4gIHVwZGF0ZUpxdWVyeTogKCkgPT4ge1xuICAgICQuZm4uc2FmZVJlcGxhY2UgPSBmdW5jdGlvbiAoJGVsZW0pIHtcbiAgICAgIHJldHVybiBhcHAuc2FmZVJlcGxhY2UoJCh0aGlzKSwgJGVsZW0pO1xuICAgIH07XG4gICAgJC5mbi5zYWZlRW1wdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gYXBwLnNhZmVFbXB0eSgkKHRoaXMpKTtcbiAgICB9O1xuICAgICQuZm4uc2FmZVJlbW92ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhcHAuc2FmZVJlbW92ZSgkKHRoaXMpKTtcbiAgICB9O1xuICB9LFxuXG4gIGNvbnRyb2xsZXJUb1RhZzogKENvbnRyb2xsZXIpID0+IHtcbiAgICBsZXQgdGFnTmFtZSA9IGNhbWVsQ2FzZVRvVGFnTmFtZShDb250cm9sbGVyLm5hbWUpO1xuICAgIHJldHVybiB0YWdOYW1lLnJlcGxhY2UoLy1jb250cm9sbGVyJC8sIFwiXCIpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBDb250cm9sbGVyXG4gICAqL1xuICByZWdpc3Rlckdsb2JhbDogKENvbnRyb2xsZXIpID0+IHtcbiAgICBhcHAucmVnaXN0ZXIoQ29udHJvbGxlcik7XG4gICAgbGV0IHRhZ05hbWUgPSBDb250cm9sbGVyLnByb3RvdHlwZS5fdGFnTmFtZTtcbiAgICBHbG9iYWwucHVzaCh0YWdOYW1lKTtcbiAgfSxcblxuICBjbGVhbkNhY2hlOiAoKSA9PiB7XG4gICAgY2xlYW5DYWNoZSgpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBDb250cm9sbGVyXG4gICAqIEBwYXJhbSBvdmVyd3JpdGVcbiAgICovXG4gIHJlZ2lzdGVyOiAoQ29udHJvbGxlciwgb3ZlcndyaXRlID0gZmFsc2UpID0+IHtcbiAgICBsZXQgdGFnTmFtZSA9IGFwcC5jb250cm9sbGVyVG9UYWcoQ29udHJvbGxlcik7XG4gICAgaWYgKCFjb250cm9sbGVyTGlzdFt0YWdOYW1lXSB8fCBvdmVyd3JpdGUpIHtcbiAgICAgIGNvbnRyb2xsZXJMaXN0W3RhZ05hbWVdID0gW0NvbnRyb2xsZXIsIFtdXTtcbiAgICAgIENvbnRyb2xsZXIucHJvdG90eXBlLl90YWdOYW1lID0gdGFnTmFtZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gbWl4aW5zIENvbnRyb2xsZXIgdGFnIG5hbWVzXG4gICAgICAgICAqL1xuICAgICAgICBhZGRNaXhpbjogKC4uLm1peGlucykgPT4ge1xuICAgICAgICAgIGZvciAobGV0IG1peGluIG9mIG1peGlucykge1xuICAgICAgICAgICAgbGV0IG1peGluTmFtZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWl4aW4gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgbWl4aW5OYW1lID0gY2FtZWxDYXNlVG9UYWdOYW1lKG1peGluKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWl4aW4pIHtcbiAgICAgICAgICAgICAgbWl4aW5OYW1lID0gYXBwLmNvbnRyb2xsZXJUb1RhZyhtaXhpbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250cm9sbGVyTGlzdFt0YWdOYW1lXVsxXS5wdXNoKG1peGluTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZE1peGluOiAoLi4ubWl4aW5zKSA9PiB7fSxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIHBvc3Q6IChjb250cm9sbGVyLCB1cmwsIGFyZ3MpID0+IHtcbiAgICBpZiAoIWFyZ3MpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG5cbiAgICBhcmdzLkNTUkZfVE9LRU4gPSBhcHAuQ1NSRl9UT0tFTjtcbiAgICByZXR1cm4gYXBwLmFqYXgoY29udHJvbGxlciwgdXJsLCBhcmdzLCAkLnBvc3QpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIGdldDogKGNvbnRyb2xsZXIsIHVybCwgYXJncykgPT4ge1xuICAgIHJldHVybiBhcHAuYWpheChjb250cm9sbGVyLCB1cmwsIGFyZ3MsICQuZ2V0KTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZCAkLmdldCBvciAkLnBvc3RcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIGFqYXg6IChjb250cm9sbGVyLCB1cmwsIGFyZ3MsIG1ldGhvZCkgPT4ge1xuICAgIGlmICghYXJncykge1xuICAgICAgYXJncyA9IHt9O1xuICAgIH1cblxuICAgIGFyZ3MuVkVSU0lPTiA9IGFwcC5WRVJTSU9OO1xuICAgIGFyZ3MuX21ldGhvZCA9IGFyZ3MuX21ldGhvZCB8fCBcImFwaVwiO1xuXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJldHVybiBtZXRob2QodXJsLCBhcmdzKVxuICAgICAgICAudGhlbigoYSwgYiwgYykgPT4ge1xuICAgICAgICAgIHJlc29sdmUoYSwgYiwgYyk7XG4gICAgICAgICAgaWYgKGEuc3RhdHVzID09PSBcInJlZGlyZWN0XCIpIHtcbiAgICAgICAgICAgIHRyaWdnZXIoXCJvbk5hdkxpbmtcIiwgYVtcInVybC1saW5rXCJdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgYXBwLnJlZnJlc2goY29udHJvbGxlci4kY29udGFpbmVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcDtcbiAgfSxcblxuICBzdWJtaXRGb3JtQW5kVXBkYXRlVmlldzogKGNvbnRyb2xsZXIsIGZvcm0sIHVybCwgbWV0aG9kKSA9PiB7XG4gICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGZvcm0pO1xuICAgIGNvbnN0IHJlZGlyZWN0b3IgPSAoYSkgPT4ge1xuICAgICAgaWYgKGFbXCJ1cmwtbGlua1wiXSkge1xuICAgICAgICB0cmlnZ2VyKFwib25OYXZMaW5rXCIsIGFbXCJ1cmwtbGlua1wiXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGFbXCJ1cmxcIl07XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHAgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB1cGxvYWRGaWxlRm9ybURhdGEoZm9ybURhdGEsIHVybCB8fCBmb3JtLmFjdGlvbiwgbWV0aG9kIHx8IGZvcm0ubWV0aG9kKVxuICAgICAgICAudGhlbigoYSwgYiwgYykgPT4ge1xuICAgICAgICAgIHJlc29sdmUoYSwgYiwgYyk7XG4gICAgICAgICAgaWYgKGEuc3RhdHVzID09PSBcInJlZGlyZWN0XCIpIHtcbiAgICAgICAgICAgIHJlZGlyZWN0b3IoYSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGFwcC5yZWZyZXNoKGNvbnRyb2xsZXIuJGNvbnRhaW5lciwgY29udHJvbGxlcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoYSwgYiwgYykgPT4ge1xuICAgICAgICAgIGlmIChhLnN0YXR1cyA9PT0gMzAxKSB7XG4gICAgICAgICAgICBhID0gYS5yZXNwb25zZUpTT047XG4gICAgICAgICAgICByZWRpcmVjdG9yKGEpO1xuICAgICAgICAgICAgcmVzb2x2ZShhLCBiLCBjKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KGEsIGIsIGMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcDtcbiAgfSxcblxuICBzdWJtaXRGb3JtOiAoZm9ybSwgdXJsLCBtZXRob2QpID0+IHtcbiAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVwbG9hZEZpbGVGb3JtRGF0YShmb3JtRGF0YSwgdXJsIHx8IGZvcm0uYWN0aW9uLCBtZXRob2QgfHwgZm9ybS5tZXRob2QpXG4gICAgICAgIC50aGVuKHJlc29sdmUpXG4gICAgICAgIC5jYXRjaChyZWplY3QpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2pxdWVyeX0gJGVsZW1cbiAgICogQHJldHVybiB7QWJzdHJhY3RTREN9XG4gICAqL1xuICBnZXRDb250cm9sbGVyOiAoJGVsZW0pID0+IGdldENvbnRyb2xsZXIoJGVsZW0pLFxuXG4gIC8qKlxuICAgKiBzYWZlRW1wdHkgcmVtb3ZlcyBhbGwgY29udGVudCBvZiBhIGRvbVxuICAgKiBhbmQgZGVsZXRlcyBhbGwgY2hpbGQgY29udHJvbGxlciBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSAkZWxlbSAtIGpRdWVyeSBET00gY29udGFpbmVyIHRvIGJlIGVtcHR5ZWRcbiAgICovXG4gIHNhZmVFbXB0eTogKCRlbGVtKSA9PiB7XG4gICAgbGV0ICRjaGlsZHJlbiA9ICRlbGVtLmNoaWxkcmVuKCk7XG4gICAgJGNoaWxkcmVuLmVhY2goZnVuY3Rpb24gKF8sIGVsZW1lbnQpIHtcbiAgICAgIGxldCAkZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICBhcHAuc2FmZVJlbW92ZSgkZWxlbWVudCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGVsZW07XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNhZmVSZXBsYWNlIHJlbW92ZXMgYWxsIGNvbnRlbnQgb2YgYSBkb21cbiAgICogYW5kIGRlbGV0ZXMgYWxsIGNoaWxkIGNvbnRyb2xsZXIgc2FmZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gJGVsZW0gLSBqUXVlcnkgRE9NIHRvIGJlIHJlcGxlYWNlZFxuICAgKiBAcGFyYW0gJG5ldyAtIGpRdWVyeSBuZXcgRE9NIGNvbnRhaW5lclxuICAgKi9cbiAgc2FmZVJlcGxhY2U6ICgkZWxlbSwgJG5ldykgPT4ge1xuICAgICRuZXcuaW5zZXJ0QmVmb3JlKCRlbGVtKTtcbiAgICByZXR1cm4gYXBwLnNhZmVSZW1vdmUoJGVsZW0pO1xuICB9LFxuXG4gIC8qKlxuICAgKiBzYWZlUmVtb3ZlIHJlbW92ZXMgYSBkb20gYW5kIGRlbGV0ZXMgYWxsIGNoaWxkIGNvbnRyb2xsZXIgc2FmZWx5LlxuICAgKlxuICAgKiBAcGFyYW0gJGVsZW0gLSBqUXVlcnkgRG9tXG4gICAqL1xuICBzYWZlUmVtb3ZlOiAoJGVsZW0pID0+IHtcbiAgICAkZWxlbS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGxldCAkdGhpcyA9ICQodGhpcyk7XG4gICAgICBpZiAoJHRoaXMuZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApKSB7XG4gICAgICAgICR0aGlzLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKS5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgICRlbGVtLmZpbmQoYC4ke0NPTlRST0xMRVJfQ0xBU1N9YCkuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gJCh0aGlzKS5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCk7XG4gICAgICBjb250cm9sbGVyICYmIGNvbnRyb2xsZXIucmVtb3ZlKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGVsZW0ucmVtb3ZlKCk7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxqUXVlcnk+fVxuICAgKi9cbiAgcmVsb2FkQ29udHJvbGxlcjogKGNvbnRyb2xsZXIpID0+IHtcbiAgICByZXR1cm4gcmVsb2FkSFRNTENvbnRyb2xsZXIoY29udHJvbGxlcikudGhlbigoaHRtbCkgPT4ge1xuICAgICAgbGV0ICRodG1sID0gJChodG1sKTtcbiAgICAgIHJldHVybiBhcHAucmVjb25jaWxlKGNvbnRyb2xsZXIsICRodG1sKTtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcGFyYW0ge2pxdWVyeX0gJHZpcnR1YWxOb2RlXG4gICAqIEBwYXJhbSB7anF1ZXJ5fSAkcmVhbE5vZGVcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAgICovXG4gIHJlY29uY2lsZTogKGNvbnRyb2xsZXIsICR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlID0gbnVsbCwgcHJvY2VzcyA9IG51bGwpID0+IHtcbiAgICBpZiAoISRyZWFsTm9kZSkge1xuICAgICAgbGV0ICR0ZW1wID0gY29udHJvbGxlci4kY29udGFpbmVyLmNsb25lKCkuZW1wdHkoKTtcbiAgICAgICR0ZW1wLmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSwgbnVsbCk7XG4gICAgICAkdGVtcC5yZW1vdmVDbGFzcyhDT05UUk9MTEVSX0NMQVNTKTtcbiAgICAgICR0ZW1wLmFwcGVuZCgkdmlydHVhbE5vZGUpO1xuICAgICAgJHZpcnR1YWxOb2RlID0gJHRlbXA7XG4gICAgfVxuXG4gICAgJHJlYWxOb2RlID0gJHJlYWxOb2RlID8/IGNvbnRyb2xsZXIuJGNvbnRhaW5lcjtcblxuICAgIGNvbnN0IHsgcmVmcmVzaFByb2Nlc3MsIGlzUnVubmluZ1Byb2Nlc3MgfSA9IHByZXBhcmVSZWZyZXNoUHJvY2VzcyhcbiAgICAgIHByb2Nlc3MsXG4gICAgICBjb250cm9sbGVyLFxuICAgICk7XG5cbiAgICByZXR1cm4gcmVmcmVzaCgkdmlydHVhbE5vZGUsIGNvbnRyb2xsZXIsIHJlZnJlc2hQcm9jZXNzKS50aGVuKCgpID0+IHtcbiAgICAgIHJlY29uY2lsZSgkdmlydHVhbE5vZGUsICRyZWFsTm9kZSk7XG4gICAgICByZXNldENoaWxkcmVuKGNvbnRyb2xsZXIpO1xuICAgICAgaWYgKCFpc1J1bm5pbmdQcm9jZXNzKSB7XG4gICAgICAgIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaChyZWZyZXNoUHJvY2Vzcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY29udHJvbGxlcjtcbiAgICB9KTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtqcXVlcnl9ICRkb21cbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gbGVhZkNvbnRyb2xsZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHJlZnJlc2g6ICgkZG9tLCBsZWFmQ29udHJvbGxlciA9IG51bGwpID0+IHtcbiAgICByZXR1cm4gcmVmcmVzaCgkZG9tLCBsZWFmQ29udHJvbGxlcik7XG4gIH0sXG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_main.js\n\n}");
|
|
77
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ app: () => (/* binding */ app)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n/* harmony import */ var _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./AbstractSDC.js */ \"./src/simpleDomControl/AbstractSDC.js\");\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./sdc_dom_events.js */ \"./src/simpleDomControl/sdc_dom_events.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n/* harmony import */ var _sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./sdc_server_call.js */ \"./src/simpleDomControl/sdc_server_call.js\");\n\n\n\n\n\n\n\n\n\nconst PROPERTIES_UPDATE = { classname: \"class\" };\n\nlet sdcDomFragment = function (element, props) {\n let $new_elem,\n is_self = false;\n if (typeof element === \"string\") {\n $new_elem = $(document.createElement(element));\n } else {\n const tagName = `this.${element.name}`;\n $new_elem = $(document.createElement(tagName));\n $new_elem.data(\"handler\", element);\n is_self = true;\n }\n\n if (props) {\n Object.entries(props).forEach(([k, v]) => {\n if (k.startsWith(\"on\")) {\n const type = k.substring(2).toLowerCase();\n $new_elem[0].addEventListener(type, v);\n // Remembered so reconcile() can move the listeners to a node it keeps.\n ($new_elem[0]._sdcListeners ??= []).push([type, v]);\n } else {\n if (PROPERTIES_UPDATE[k.toLowerCase()]) {\n k = PROPERTIES_UPDATE[k.toLowerCase()];\n }\n $new_elem[0].setAttribute(k, v);\n }\n });\n }\n\n if (is_self) {\n $new_elem.addClass(\"_bind_to_update_handler _with_handler\");\n }\n\n return $new_elem;\n};\n\nwindow.sdcDom = function (tagName, props, ...children) {\n if (!tagName) {\n return \"\";\n }\n const $new_elem = sdcDomFragment(tagName, props);\n for (const c of children) {\n $new_elem.append(c);\n }\n return $new_elem;\n};\n\nconst redirector = (a) => {\n if (a[\"url-link\"]) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_5__.trigger)(\"onNavLink\", a[\"url-link\"]);\n } else {\n window.location.href = a[\"url\"];\n }\n};\n\nlet app = {\n CSRF_TOKEN: window.CSRF_TOKEN || \"\",\n LANGUAGE_CODE: window.LANGUAGE_CODE || \"en\",\n DEBUG: window.DEBUG || false,\n VERSION: window.VERSION || \"0.0\",\n tagNames: [],\n Global: _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global,\n rootController: null,\n globalRootController: null,\n _isInit: false,\n _origin_trigger: null,\n _globalControllerClasses: [],\n _createdGlobals: [],\n\n init_sdc: () => {\n if (!app._isInit) {\n app._isInit = true;\n if (!app._origin_trigger) {\n app._origin_trigger = $.fn.trigger;\n $.fn.trigger = function (event) {\n const ev_type = {}.hasOwnProperty.call(event, \"type\")\n ? event.type\n : event;\n if (!_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.includes(ev_type)) {\n _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.STD_EVENT_LIST.push(ev_type);\n $(window).on(ev_type, _sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.windowEventHandler);\n }\n return app._origin_trigger.call(this, event);\n };\n\n app.updateJquery();\n } else {\n (0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.close)();\n }\n\n ;(0,_sdc_server_call_js__WEBPACK_IMPORTED_MODULE_6__.isConnected)();\n\n (0,_sdc_dom_events_js__WEBPACK_IMPORTED_MODULE_4__.initEvents)();\n\n app.rootController = app.rootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n app.globalRootController = app.globalRootController || new _AbstractSDC_js__WEBPACK_IMPORTED_MODULE_2__.AbstractSDC();\n }\n\n app.tagNames = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.tagList)();\n\n // Global controllers are created only once, even if init_sdc() is called again.\n const newGlobals = _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.filter((tagName) => !app._createdGlobals.includes(tagName));\n app._createdGlobals.push(...newGlobals);\n\n const $globalDiv = $(\"<div></div>\");\n newGlobals.forEach((tagName) => {\n const ControllerClass = _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][0];\n $globalDiv.append(\n `<${ControllerClass.prototype._tagName}></${ControllerClass.prototype._tagName}>`,\n );\n });\n\n const { refreshProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(null, app.rootController);\n\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(\n app.tagNames,\n $globalDiv,\n app.globalRootController,\n refreshProcess,\n ).then(() => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.replaceTagElementsInContainer)(\n app.tagNames,\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getBody)(),\n app.rootController,\n refreshProcess,\n ).then((res) => {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n return res;\n });\n });\n },\n\n updateJquery: () => {\n $.fn.safeReplace = function ($elem) {\n return app.safeReplace($(this), $elem);\n };\n $.fn.safeEmpty = function () {\n return app.safeEmpty($(this));\n };\n $.fn.safeRemove = function () {\n return app.safeRemove($(this));\n };\n },\n\n controllerToTag: (Controller) => {\n let tagName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(Controller.name);\n return tagName.replace(/-controller$/, \"\");\n },\n\n /**\n *\n * @param {AbstractSDC} Controller\n */\n registerGlobal: (Controller) => {\n const registration = app.register(Controller);\n let tagName = Controller.prototype._tagName;\n if (!_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.includes(tagName)) {\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.Global.push(tagName);\n }\n return registration;\n },\n\n cleanCache: () => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.cleanCache)();\n },\n\n /**\n *\n * @param {AbstractSDC} Controller\n * @param overwrite\n */\n register: (Controller, overwrite = false) => {\n let tagName = app.controllerToTag(Controller);\n if (!_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] || overwrite) {\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName] = [Controller, []];\n Controller.prototype._tagName = tagName;\n\n return {\n /**\n *\n * @param {Array<string>} mixins Controller tag names\n */\n addMixin: (...mixins) => {\n for (let mixin of mixins) {\n let mixinName;\n if (typeof mixin === \"string\") {\n mixinName = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.camelCaseToTagName)(mixin);\n } else if (mixin) {\n mixinName = app.controllerToTag(mixin);\n }\n _sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.controllerList[tagName][1].push(mixinName);\n }\n },\n };\n }\n return {\n addMixin: (...mixins) => {},\n };\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n post: (controller, url, args) => {\n if (!args) {\n args = {};\n }\n\n args.CSRF_TOKEN = app.CSRF_TOKEN;\n return app.ajax(controller, url, args, $.post);\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @return {Promise}\n */\n get: (controller, url, args) => {\n return app.ajax(controller, url, args, $.get);\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {string} url\n * @param {object} args\n * @param {function} method $.get or $.post\n * @return {Promise}\n */\n ajax: (controller, url, args, method) => {\n if (!args) {\n args = {};\n }\n\n args.VERSION = app.VERSION;\n args._method = args._method || \"api\";\n\n const p = new Promise((resolve, reject) => {\n return method(url, args)\n .then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === \"redirect\") {\n redirector(a);\n } else {\n p.then(() => {\n app.refresh(controller.$container);\n });\n }\n })\n .catch((a, b, c) => {\n // send_redirect() answers with HTTP 301 and the redirect in the JSON body.\n if (a.status === 301 && a.responseJSON) {\n a = a.responseJSON;\n redirector(a);\n resolve(a, b, c);\n } else {\n reject(a, b, c);\n }\n });\n });\n\n return p;\n },\n\n submitFormAndUpdateView: (controller, form, url, method) => {\n let formData = new FormData(form);\n\n const p = new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method)\n .then((a, b, c) => {\n resolve(a, b, c);\n if (a.status === \"redirect\") {\n redirector(a);\n } else {\n p.then(() => {\n app.refresh(controller.$container, controller);\n });\n }\n })\n .catch((a, b, c) => {\n if (a.status === 301) {\n a = a.responseJSON;\n redirector(a);\n resolve(a, b, c);\n } else {\n reject(a, b, c);\n }\n });\n });\n\n return p;\n },\n\n submitForm: (form, url, method) => {\n let formData = new FormData(form);\n return new Promise((resolve, reject) => {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uploadFileFormData)(formData, url || form.action, method || form.method)\n .then(resolve)\n .catch(reject);\n });\n },\n\n /**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\n getController: ($elem) => (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.getController)($elem),\n\n /**\n * safeEmpty removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM container to be emptyed\n */\n safeEmpty: ($elem) => {\n let $children = $elem.children();\n $children.each(function (_, element) {\n let $element = $(element);\n app.safeRemove($element);\n });\n\n return $elem;\n },\n\n /**\n * safeReplace removes all content of a dom\n * and deletes all child controller safely.\n *\n * @param $elem - jQuery DOM to be repleaced\n * @param $new - jQuery new DOM container\n */\n safeReplace: ($elem, $new) => {\n $new.insertBefore($elem);\n return app.safeRemove($elem);\n },\n\n /**\n * safeRemove removes a dom and deletes all child controller safely.\n *\n * @param $elem - jQuery Dom\n */\n safeRemove: ($elem) => {\n $elem.each(function () {\n let $this = $(this);\n if ($this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`)) {\n $this.data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`).remove();\n }\n });\n\n $elem.find(`.${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS}`).each(function () {\n const controller = $(this).data(`${_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY}`);\n controller && controller.remove();\n });\n\n return $elem.remove();\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @return {Promise<jQuery>}\n */\n reloadController: (controller) => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reloadHTMLController)(controller).then((html) => {\n let $html = $(html);\n return app.reconcile(controller, $html);\n });\n },\n\n /**\n *\n * @param {AbstractSDC} controller\n * @param {jquery} $virtualNode\n * @param {jquery} $realNode\n * @param {Object} process - Process object containing the refresh process\n */\n reconcile: (controller, $virtualNode, $realNode = null, process = null) => {\n if (!$realNode) {\n let $temp = controller.$container.clone().empty();\n $temp.data(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY, null);\n $temp.removeClass(_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.CONTROLLER_CLASS);\n $temp.append($virtualNode);\n $virtualNode = $temp;\n }\n\n $realNode = $realNode ?? controller.$container;\n\n const { refreshProcess, isRunningProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.prepareRefreshProcess)(\n process,\n controller,\n );\n\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($virtualNode, controller, refreshProcess).then(() => {\n (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.reconcile)($virtualNode, $realNode);\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.resetChildren)(controller);\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_3__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n return controller;\n });\n },\n\n /**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @return {Promise<void>}\n */\n refresh: ($dom, leafController = null) => {\n return (0,_sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.refresh)($dom, leafController);\n },\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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YSxhQUFhO0FBQzFCLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVyxrRUFBb0I7QUFDL0I7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQSxhQUFhLGFBQWE7QUFDMUIsYUFBYSxRQUFRO0FBQ3JCLGFBQWEsUUFBUTtBQUNyQixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsNkRBQW1CO0FBQ3BDLHdCQUF3QiwwREFBZ0I7QUFDeEM7QUFDQTtBQUNBOztBQUVBOztBQUVBLFlBQVksbUNBQW1DLEVBQUUseUVBQXFCO0FBQ3RFO0FBQ0E7QUFDQTs7QUFFQSxXQUFXLHFEQUFPO0FBQ2xCLE1BQU0sdURBQVM7QUFDZixNQUFNLGlFQUFhO0FBQ25CO0FBQ0EsUUFBUSxrRkFBOEI7QUFDdEM7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHOztBQUVIO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxhQUFhO0FBQzFCLGNBQWM7QUFDZDtBQUNBO0FBQ0EsV0FBVyxxREFBTztBQUNsQixHQUFHO0FBQ0giLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX21haW4uanM/MTc4MyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjYW1lbENhc2VUb1RhZ05hbWUsXG4gIGdldEJvZHksXG4gIHVwbG9hZEZpbGVGb3JtRGF0YSxcbn0gZnJvbSBcIi4vc2RjX3V0aWxzLmpzXCI7XG5pbXBvcnQge1xuICByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcixcbiAgcmVsb2FkSFRNTENvbnRyb2xsZXIsXG4gIERBVEFfQ09OVFJPTExFUl9LRVksXG4gIENPTlRST0xMRVJfQ0xBU1MsXG4gIGdldENvbnRyb2xsZXIsXG4gIGNsZWFuQ2FjaGUsXG4gIHJlZnJlc2gsXG59IGZyb20gXCIuL3NkY192aWV3LmpzXCI7XG5pbXBvcnQgeyBBYnN0cmFjdFNEQyB9IGZyb20gXCIuL0Fic3RyYWN0U0RDLmpzXCI7XG5pbXBvcnQge1xuICBHbG9iYWwsXG4gIGNvbnRyb2xsZXJMaXN0LFxuICB0YWdMaXN0LFxuICByZXNldENoaWxkcmVuLFxuICB1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2gsXG4gIHByZXBhcmVSZWZyZXNoUHJvY2Vzcyxcbn0gZnJvbSBcIi4vc2RjX2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB7XG4gIGluaXRFdmVudHMsXG4gIFNURF9FVkVOVF9MSVNULFxuICB3aW5kb3dFdmVudEhhbmRsZXIsXG59IGZyb20gXCIuL3NkY19kb21fZXZlbnRzLmpzXCI7XG5pbXBvcnQgeyByZWNvbmNpbGUgfSBmcm9tIFwiLi9zZGNfdmlldy5qc1wiO1xuaW1wb3J0IHsgdHJpZ2dlciB9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcbmltcG9ydCB7IGlzQ29ubmVjdGVkLCBjbG9zZSB9IGZyb20gXCIuL3NkY19zZXJ2ZXJfY2FsbC5qc1wiO1xuXG5jb25zdCBQUk9QRVJUSUVTX1VQREFURSA9IHsgY2xhc3NuYW1lOiBcImNsYXNzXCIgfTtcblxubGV0IHNkY0RvbUZyYWdtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIHByb3BzKSB7XG4gIGxldCAkbmV3X2VsZW0sXG4gICAgaXNfc2VsZiA9IGZhbHNlO1xuICBpZiAodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAkbmV3X2VsZW0gPSAkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZWxlbWVudCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHRhZ05hbWUgPSBgdGhpcy4ke2VsZW1lbnQubmFtZX1gO1xuICAgICRuZXdfZWxlbSA9ICQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKSk7XG4gICAgJG5ld19lbGVtLmRhdGEoXCJoYW5kbGVyXCIsIGVsZW1lbnQpO1xuICAgIGlzX3NlbGYgPSB0cnVlO1xuICB9XG5cbiAgaWYgKHByb3BzKSB7XG4gICAgT2JqZWN0LmVudHJpZXMocHJvcHMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgaWYgKGsuc3RhcnRzV2l0aChcIm9uXCIpKSB7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBrLnN1YnN0cmluZygyKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAkbmV3X2VsZW1bMF0uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCB2KTtcbiAgICAgICAgLy8gUmVtZW1iZXJlZCBzbyByZWNvbmNpbGUoKSBjYW4gbW92ZSB0aGUgbGlzdGVuZXJzIHRvIGEgbm9kZSBpdCBrZWVwcy5cbiAgICAgICAgKCRuZXdfZWxlbVswXS5fc2RjTGlzdGVuZXJzID8/PSBbXSkucHVzaChbdHlwZSwgdl0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFBST1BFUlRJRVNfVVBEQVRFW2sudG9Mb3dlckNhc2UoKV0pIHtcbiAgICAgICAgICBrID0gUFJPUEVSVElFU19VUERBVEVbay50b0xvd2VyQ2FzZSgpXTtcbiAgICAgICAgfVxuICAgICAgICAkbmV3X2VsZW1bMF0uc2V0QXR0cmlidXRlKGssIHYpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGlzX3NlbGYpIHtcbiAgICAkbmV3X2VsZW0uYWRkQ2xhc3MoXCJfYmluZF90b191cGRhdGVfaGFuZGxlciBfd2l0aF9oYW5kbGVyXCIpO1xuICB9XG5cbiAgcmV0dXJuICRuZXdfZWxlbTtcbn07XG5cbndpbmRvdy5zZGNEb20gPSBmdW5jdGlvbiAodGFnTmFtZSwgcHJvcHMsIC4uLmNoaWxkcmVuKSB7XG4gIGlmICghdGFnTmFtZSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIGNvbnN0ICRuZXdfZWxlbSA9IHNkY0RvbUZyYWdtZW50KHRhZ05hbWUsIHByb3BzKTtcbiAgZm9yIChjb25zdCBjIG9mIGNoaWxkcmVuKSB7XG4gICAgJG5ld19lbGVtLmFwcGVuZChjKTtcbiAgfVxuICByZXR1cm4gJG5ld19lbGVtO1xufTtcblxuY29uc3QgcmVkaXJlY3RvciA9IChhKSA9PiB7XG4gIGlmIChhW1widXJsLWxpbmtcIl0pIHtcbiAgICB0cmlnZ2VyKFwib25OYXZMaW5rXCIsIGFbXCJ1cmwtbGlua1wiXSk7XG4gIH0gZWxzZSB7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBhW1widXJsXCJdO1xuICB9XG59O1xuXG5leHBvcnQgbGV0IGFwcCA9IHtcbiAgQ1NSRl9UT0tFTjogd2luZG93LkNTUkZfVE9LRU4gfHwgXCJcIixcbiAgTEFOR1VBR0VfQ09ERTogd2luZG93LkxBTkdVQUdFX0NPREUgfHwgXCJlblwiLFxuICBERUJVRzogd2luZG93LkRFQlVHIHx8IGZhbHNlLFxuICBWRVJTSU9OOiB3aW5kb3cuVkVSU0lPTiB8fCBcIjAuMFwiLFxuICB0YWdOYW1lczogW10sXG4gIEdsb2JhbDogR2xvYmFsLFxuICByb290Q29udHJvbGxlcjogbnVsbCxcbiAgZ2xvYmFsUm9vdENvbnRyb2xsZXI6IG51bGwsXG4gIF9pc0luaXQ6IGZhbHNlLFxuICBfb3JpZ2luX3RyaWdnZXI6IG51bGwsXG4gIF9nbG9iYWxDb250cm9sbGVyQ2xhc3NlczogW10sXG4gIF9jcmVhdGVkR2xvYmFsczogW10sXG5cbiAgaW5pdF9zZGM6ICgpID0+IHtcbiAgICBpZiAoIWFwcC5faXNJbml0KSB7XG4gICAgICBhcHAuX2lzSW5pdCA9IHRydWU7XG4gICAgICBpZiAoIWFwcC5fb3JpZ2luX3RyaWdnZXIpIHtcbiAgICAgICAgYXBwLl9vcmlnaW5fdHJpZ2dlciA9ICQuZm4udHJpZ2dlcjtcbiAgICAgICAgJC5mbi50cmlnZ2VyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgY29uc3QgZXZfdHlwZSA9IHt9Lmhhc093blByb3BlcnR5LmNhbGwoZXZlbnQsIFwidHlwZVwiKVxuICAgICAgICAgICAgPyBldmVudC50eXBlXG4gICAgICAgICAgICA6IGV2ZW50O1xuICAgICAgICAgIGlmICghU1REX0VWRU5UX0xJU1QuaW5jbHVkZXMoZXZfdHlwZSkpIHtcbiAgICAgICAgICAgIFNURF9FVkVOVF9MSVNULnB1c2goZXZfdHlwZSk7XG4gICAgICAgICAgICAkKHdpbmRvdykub24oZXZfdHlwZSwgd2luZG93RXZlbnRIYW5kbGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFwcC5fb3JpZ2luX3RyaWdnZXIuY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgYXBwLnVwZGF0ZUpxdWVyeSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xvc2UoKTtcbiAgICAgIH1cblxuICAgICAgaXNDb25uZWN0ZWQoKTtcblxuICAgICAgaW5pdEV2ZW50cygpO1xuXG4gICAgICBhcHAucm9vdENvbnRyb2xsZXIgPSBhcHAucm9vdENvbnRyb2xsZXIgfHwgbmV3IEFic3RyYWN0U0RDKCk7XG4gICAgICBhcHAuZ2xvYmFsUm9vdENvbnRyb2xsZXIgPSBhcHAuZ2xvYmFsUm9vdENvbnRyb2xsZXIgfHwgbmV3IEFic3RyYWN0U0RDKCk7XG4gICAgfVxuXG4gICAgYXBwLnRhZ05hbWVzID0gdGFnTGlzdCgpO1xuXG4gICAgLy8gR2xvYmFsIGNvbnRyb2xsZXJzIGFyZSBjcmVhdGVkIG9ubHkgb25jZSwgZXZlbiBpZiBpbml0X3NkYygpIGlzIGNhbGxlZCBhZ2Fpbi5cbiAgICBjb25zdCBuZXdHbG9iYWxzID0gR2xvYmFsLmZpbHRlcigodGFnTmFtZSkgPT4gIWFwcC5fY3JlYXRlZEdsb2JhbHMuaW5jbHVkZXModGFnTmFtZSkpO1xuICAgIGFwcC5fY3JlYXRlZEdsb2JhbHMucHVzaCguLi5uZXdHbG9iYWxzKTtcblxuICAgIGNvbnN0ICRnbG9iYWxEaXYgPSAkKFwiPGRpdj48L2Rpdj5cIik7XG4gICAgbmV3R2xvYmFscy5mb3JFYWNoKCh0YWdOYW1lKSA9PiB7XG4gICAgICBjb25zdCBDb250cm9sbGVyQ2xhc3MgPSBjb250cm9sbGVyTGlzdFt0YWdOYW1lXVswXTtcbiAgICAgICRnbG9iYWxEaXYuYXBwZW5kKFxuICAgICAgICBgPCR7Q29udHJvbGxlckNsYXNzLnByb3RvdHlwZS5fdGFnTmFtZX0+PC8ke0NvbnRyb2xsZXJDbGFzcy5wcm90b3R5cGUuX3RhZ05hbWV9PmAsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyByZWZyZXNoUHJvY2VzcyB9ID0gcHJlcGFyZVJlZnJlc2hQcm9jZXNzKG51bGwsIGFwcC5yb290Q29udHJvbGxlcik7XG5cbiAgICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICAgICBhcHAudGFnTmFtZXMsXG4gICAgICAkZ2xvYmFsRGl2LFxuICAgICAgYXBwLmdsb2JhbFJvb3RDb250cm9sbGVyLFxuICAgICAgcmVmcmVzaFByb2Nlc3MsXG4gICAgKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICAgICAgYXBwLnRhZ05hbWVzLFxuICAgICAgICBnZXRCb2R5KCksXG4gICAgICAgIGFwcC5yb290Q29udHJvbGxlcixcbiAgICAgICAgcmVmcmVzaFByb2Nlc3MsXG4gICAgICApLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICB1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2gocmVmcmVzaFByb2Nlc3MpO1xuICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0sXG5cbiAgdXBkYXRlSnF1ZXJ5OiAoKSA9PiB7XG4gICAgJC5mbi5zYWZlUmVwbGFjZSA9IGZ1bmN0aW9uICgkZWxlbSkge1xuICAgICAgcmV0dXJuIGFwcC5zYWZlUmVwbGFjZSgkKHRoaXMpLCAkZWxlbSk7XG4gICAgfTtcbiAgICAkLmZuLnNhZmVFbXB0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBhcHAuc2FmZUVtcHR5KCQodGhpcykpO1xuICAgIH07XG4gICAgJC5mbi5zYWZlUmVtb3ZlID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGFwcC5zYWZlUmVtb3ZlKCQodGhpcykpO1xuICAgIH07XG4gIH0sXG5cbiAgY29udHJvbGxlclRvVGFnOiAoQ29udHJvbGxlcikgPT4ge1xuICAgIGxldCB0YWdOYW1lID0gY2FtZWxDYXNlVG9UYWdOYW1lKENvbnRyb2xsZXIubmFtZSk7XG4gICAgcmV0dXJuIHRhZ05hbWUucmVwbGFjZSgvLWNvbnRyb2xsZXIkLywgXCJcIik7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IENvbnRyb2xsZXJcbiAgICovXG4gIHJlZ2lzdGVyR2xvYmFsOiAoQ29udHJvbGxlcikgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IGFwcC5yZWdpc3RlcihDb250cm9sbGVyKTtcbiAgICBsZXQgdGFnTmFtZSA9IENvbnRyb2xsZXIucHJvdG90eXBlLl90YWdOYW1lO1xuICAgIGlmICghR2xvYmFsLmluY2x1ZGVzKHRhZ05hbWUpKSB7XG4gICAgICBHbG9iYWwucHVzaCh0YWdOYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJhdGlvbjtcbiAgfSxcblxuICBjbGVhbkNhY2hlOiAoKSA9PiB7XG4gICAgY2xlYW5DYWNoZSgpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBDb250cm9sbGVyXG4gICAqIEBwYXJhbSBvdmVyd3JpdGVcbiAgICovXG4gIHJlZ2lzdGVyOiAoQ29udHJvbGxlciwgb3ZlcndyaXRlID0gZmFsc2UpID0+IHtcbiAgICBsZXQgdGFnTmFtZSA9IGFwcC5jb250cm9sbGVyVG9UYWcoQ29udHJvbGxlcik7XG4gICAgaWYgKCFjb250cm9sbGVyTGlzdFt0YWdOYW1lXSB8fCBvdmVyd3JpdGUpIHtcbiAgICAgIGNvbnRyb2xsZXJMaXN0W3RhZ05hbWVdID0gW0NvbnRyb2xsZXIsIFtdXTtcbiAgICAgIENvbnRyb2xsZXIucHJvdG90eXBlLl90YWdOYW1lID0gdGFnTmFtZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gbWl4aW5zIENvbnRyb2xsZXIgdGFnIG5hbWVzXG4gICAgICAgICAqL1xuICAgICAgICBhZGRNaXhpbjogKC4uLm1peGlucykgPT4ge1xuICAgICAgICAgIGZvciAobGV0IG1peGluIG9mIG1peGlucykge1xuICAgICAgICAgICAgbGV0IG1peGluTmFtZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWl4aW4gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgbWl4aW5OYW1lID0gY2FtZWxDYXNlVG9UYWdOYW1lKG1peGluKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobWl4aW4pIHtcbiAgICAgICAgICAgICAgbWl4aW5OYW1lID0gYXBwLmNvbnRyb2xsZXJUb1RhZyhtaXhpbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250cm9sbGVyTGlzdFt0YWdOYW1lXVsxXS5wdXNoKG1peGluTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFkZE1peGluOiAoLi4ubWl4aW5zKSA9PiB7fSxcbiAgICB9O1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIHBvc3Q6IChjb250cm9sbGVyLCB1cmwsIGFyZ3MpID0+IHtcbiAgICBpZiAoIWFyZ3MpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG5cbiAgICBhcmdzLkNTUkZfVE9LRU4gPSBhcHAuQ1NSRl9UT0tFTjtcbiAgICByZXR1cm4gYXBwLmFqYXgoY29udHJvbGxlciwgdXJsLCBhcmdzLCAkLnBvc3QpO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3NcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIGdldDogKGNvbnRyb2xsZXIsIHVybCwgYXJncykgPT4ge1xuICAgIHJldHVybiBhcHAuYWpheChjb250cm9sbGVyLCB1cmwsIGFyZ3MsICQuZ2V0KTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb259IG1ldGhvZCAkLmdldCBvciAkLnBvc3RcbiAgICogQHJldHVybiB7UHJvbWlzZX1cbiAgICovXG4gIGFqYXg6IChjb250cm9sbGVyLCB1cmwsIGFyZ3MsIG1ldGhvZCkgPT4ge1xuICAgIGlmICghYXJncykge1xuICAgICAgYXJncyA9IHt9O1xuICAgIH1cblxuICAgIGFyZ3MuVkVSU0lPTiA9IGFwcC5WRVJTSU9OO1xuICAgIGFyZ3MuX21ldGhvZCA9IGFyZ3MuX21ldGhvZCB8fCBcImFwaVwiO1xuXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJldHVybiBtZXRob2QodXJsLCBhcmdzKVxuICAgICAgICAudGhlbigoYSwgYiwgYykgPT4ge1xuICAgICAgICAgIHJlc29sdmUoYSwgYiwgYyk7XG4gICAgICAgICAgaWYgKGEuc3RhdHVzID09PSBcInJlZGlyZWN0XCIpIHtcbiAgICAgICAgICAgIHJlZGlyZWN0b3IoYSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGFwcC5yZWZyZXNoKGNvbnRyb2xsZXIuJGNvbnRhaW5lcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoYSwgYiwgYykgPT4ge1xuICAgICAgICAgIC8vIHNlbmRfcmVkaXJlY3QoKSBhbnN3ZXJzIHdpdGggSFRUUCAzMDEgYW5kIHRoZSByZWRpcmVjdCBpbiB0aGUgSlNPTiBib2R5LlxuICAgICAgICAgIGlmIChhLnN0YXR1cyA9PT0gMzAxICYmIGEucmVzcG9uc2VKU09OKSB7XG4gICAgICAgICAgICBhID0gYS5yZXNwb25zZUpTT047XG4gICAgICAgICAgICByZWRpcmVjdG9yKGEpO1xuICAgICAgICAgICAgcmVzb2x2ZShhLCBiLCBjKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KGEsIGIsIGMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcDtcbiAgfSxcblxuICBzdWJtaXRGb3JtQW5kVXBkYXRlVmlldzogKGNvbnRyb2xsZXIsIGZvcm0sIHVybCwgbWV0aG9kKSA9PiB7XG4gICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGZvcm0pO1xuXG4gICAgY29uc3QgcCA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVwbG9hZEZpbGVGb3JtRGF0YShmb3JtRGF0YSwgdXJsIHx8IGZvcm0uYWN0aW9uLCBtZXRob2QgfHwgZm9ybS5tZXRob2QpXG4gICAgICAgIC50aGVuKChhLCBiLCBjKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZShhLCBiLCBjKTtcbiAgICAgICAgICBpZiAoYS5zdGF0dXMgPT09IFwicmVkaXJlY3RcIikge1xuICAgICAgICAgICAgcmVkaXJlY3RvcihhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgYXBwLnJlZnJlc2goY29udHJvbGxlci4kY29udGFpbmVyLCBjb250cm9sbGVyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChhLCBiLCBjKSA9PiB7XG4gICAgICAgICAgaWYgKGEuc3RhdHVzID09PSAzMDEpIHtcbiAgICAgICAgICAgIGEgPSBhLnJlc3BvbnNlSlNPTjtcbiAgICAgICAgICAgIHJlZGlyZWN0b3IoYSk7XG4gICAgICAgICAgICByZXNvbHZlKGEsIGIsIGMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QoYSwgYiwgYyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwO1xuICB9LFxuXG4gIHN1Ym1pdEZvcm06IChmb3JtLCB1cmwsIG1ldGhvZCkgPT4ge1xuICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShmb3JtKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdXBsb2FkRmlsZUZvcm1EYXRhKGZvcm1EYXRhLCB1cmwgfHwgZm9ybS5hY3Rpb24sIG1ldGhvZCB8fCBmb3JtLm1ldGhvZClcbiAgICAgICAgLnRoZW4ocmVzb2x2ZSlcbiAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbVxuICAgKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ31cbiAgICovXG4gIGdldENvbnRyb2xsZXI6ICgkZWxlbSkgPT4gZ2V0Q29udHJvbGxlcigkZWxlbSksXG5cbiAgLyoqXG4gICAqIHNhZmVFbXB0eSByZW1vdmVzIGFsbCBjb250ZW50IG9mIGEgZG9tXG4gICAqIGFuZCBkZWxldGVzIGFsbCBjaGlsZCBjb250cm9sbGVyIHNhZmVseS5cbiAgICpcbiAgICogQHBhcmFtICRlbGVtIC0galF1ZXJ5IERPTSBjb250YWluZXIgdG8gYmUgZW1wdHllZFxuICAgKi9cbiAgc2FmZUVtcHR5OiAoJGVsZW0pID0+IHtcbiAgICBsZXQgJGNoaWxkcmVuID0gJGVsZW0uY2hpbGRyZW4oKTtcbiAgICAkY2hpbGRyZW4uZWFjaChmdW5jdGlvbiAoXywgZWxlbWVudCkge1xuICAgICAgbGV0ICRlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICAgIGFwcC5zYWZlUmVtb3ZlKCRlbGVtZW50KTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZWxlbTtcbiAgfSxcblxuICAvKipcbiAgICogc2FmZVJlcGxhY2UgcmVtb3ZlcyBhbGwgY29udGVudCBvZiBhIGRvbVxuICAgKiBhbmQgZGVsZXRlcyBhbGwgY2hpbGQgY29udHJvbGxlciBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSAkZWxlbSAtIGpRdWVyeSBET00gdG8gYmUgcmVwbGVhY2VkXG4gICAqIEBwYXJhbSAkbmV3IC0galF1ZXJ5IG5ldyBET00gY29udGFpbmVyXG4gICAqL1xuICBzYWZlUmVwbGFjZTogKCRlbGVtLCAkbmV3KSA9PiB7XG4gICAgJG5ldy5pbnNlcnRCZWZvcmUoJGVsZW0pO1xuICAgIHJldHVybiBhcHAuc2FmZVJlbW92ZSgkZWxlbSk7XG4gIH0sXG5cbiAgLyoqXG4gICAqIHNhZmVSZW1vdmUgcmVtb3ZlcyBhIGRvbSBhbmQgZGVsZXRlcyBhbGwgY2hpbGQgY29udHJvbGxlciBzYWZlbHkuXG4gICAqXG4gICAqIEBwYXJhbSAkZWxlbSAtIGpRdWVyeSBEb21cbiAgICovXG4gIHNhZmVSZW1vdmU6ICgkZWxlbSkgPT4ge1xuICAgICRlbGVtLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgbGV0ICR0aGlzID0gJCh0aGlzKTtcbiAgICAgIGlmICgkdGhpcy5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCkpIHtcbiAgICAgICAgJHRoaXMuZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApLnJlbW92ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgJGVsZW0uZmluZChgLiR7Q09OVFJPTExFUl9DTEFTU31gKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSAkKHRoaXMpLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKTtcbiAgICAgIGNvbnRyb2xsZXIgJiYgY29udHJvbGxlci5yZW1vdmUoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZWxlbS5yZW1vdmUoKTtcbiAgfSxcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPGpRdWVyeT59XG4gICAqL1xuICByZWxvYWRDb250cm9sbGVyOiAoY29udHJvbGxlcikgPT4ge1xuICAgIHJldHVybiByZWxvYWRIVE1MQ29udHJvbGxlcihjb250cm9sbGVyKS50aGVuKChodG1sKSA9PiB7XG4gICAgICBsZXQgJGh0bWwgPSAkKGh0bWwpO1xuICAgICAgcmV0dXJuIGFwcC5yZWNvbmNpbGUoY29udHJvbGxlciwgJGh0bWwpO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyXG4gICAqIEBwYXJhbSB7anF1ZXJ5fSAkdmlydHVhbE5vZGVcbiAgICogQHBhcmFtIHtqcXVlcnl9ICRyZWFsTm9kZVxuICAgKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICAgKi9cbiAgcmVjb25jaWxlOiAoY29udHJvbGxlciwgJHZpcnR1YWxOb2RlLCAkcmVhbE5vZGUgPSBudWxsLCBwcm9jZXNzID0gbnVsbCkgPT4ge1xuICAgIGlmICghJHJlYWxOb2RlKSB7XG4gICAgICBsZXQgJHRlbXAgPSBjb250cm9sbGVyLiRjb250YWluZXIuY2xvbmUoKS5lbXB0eSgpO1xuICAgICAgJHRlbXAuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZLCBudWxsKTtcbiAgICAgICR0ZW1wLnJlbW92ZUNsYXNzKENPTlRST0xMRVJfQ0xBU1MpO1xuICAgICAgJHRlbXAuYXBwZW5kKCR2aXJ0dWFsTm9kZSk7XG4gICAgICAkdmlydHVhbE5vZGUgPSAkdGVtcDtcbiAgICB9XG5cbiAgICAkcmVhbE5vZGUgPSAkcmVhbE5vZGUgPz8gY29udHJvbGxlci4kY29udGFpbmVyO1xuXG4gICAgY29uc3QgeyByZWZyZXNoUHJvY2VzcywgaXNSdW5uaW5nUHJvY2VzcyB9ID0gcHJlcGFyZVJlZnJlc2hQcm9jZXNzKFxuICAgICAgcHJvY2VzcyxcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgKTtcblxuICAgIHJldHVybiByZWZyZXNoKCR2aXJ0dWFsTm9kZSwgY29udHJvbGxlciwgcmVmcmVzaFByb2Nlc3MpLnRoZW4oKCkgPT4ge1xuICAgICAgcmVjb25jaWxlKCR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlKTtcbiAgICAgIHJlc2V0Q2hpbGRyZW4oY29udHJvbGxlcik7XG4gICAgICBpZiAoIWlzUnVubmluZ1Byb2Nlc3MpIHtcbiAgICAgICAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHJlZnJlc2hQcm9jZXNzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb250cm9sbGVyO1xuICAgIH0pO1xuICB9LFxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge2pxdWVyeX0gJGRvbVxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBsZWFmQ29udHJvbGxlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgcmVmcmVzaDogKCRkb20sIGxlYWZDb250cm9sbGVyID0gbnVsbCkgPT4ge1xuICAgIHJldHVybiByZWZyZXNoKCRkb20sIGxlYWZDb250cm9sbGVyKTtcbiAgfSxcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_main.js\n\n}");
|
|
68
78
|
|
|
69
79
|
/***/ },
|
|
70
80
|
|
|
@@ -74,7 +84,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
74
84
|
\*******************************************/
|
|
75
85
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
76
86
|
|
|
77
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SdcQuerySet: () => (/* binding */ SdcQuerySet),\n/* harmony export */ \"default\": () => (/* binding */ SdcModel)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_socket.js */ \"./src/simpleDomControl/sdc_socket.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\n\n\nconst MAX_FILE_UPLOAD = 25000;\nconst CONNECTING_REQUEST_ID = \"_connecting_process\";\n\nconst cloneObject = (original) => {\n return Object.assign(\n Object.create(Object.getPrototypeOf(original)),\n structuredClone(original)\n );\n}\n\nclass SdcModelError extends Error {\n constructor(props) {\n if (typeof props === 'string') {\n props = {\n msg: props,\n is_error: true,\n header: 'Error'\n }\n }\n super(props.msg)\n this.msg = props.msg;\n this.header = props.header;\n this.is_error = props.is_error;\n this.html = props.html;\n }\n}\n\nclass FileLoaded {\n constructor({ name, url }) {\n this.name = name;\n this.url = url;\n this.content = null;\n }\n\n async load(force = false) {\n if (force || !this.content) {\n this.content = await new Promise((resolve, reject) => {\n $.get(this.url).then(resolve).catch(\n () => {\n resolve('');\n }\n );\n });\n }\n\n return this.content;\n }\n\n async text() {\n return this.load();\n }\n\n static isValid(value) {\n return (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n !(value instanceof File) &&\n typeof value.url === \"string\" &&\n typeof value.name === \"string\"\n );\n }\n\n\n}\n\n/**\n * Normalize an incoming primary key value.\n *\n * `-1` is used throughout this module as the sentinel for \"new object / no pk\".\n *\n * @param {*} pk\n * @returns {number}\n */\nfunction normalizePk(pk) {\n const normalizedPk = parseInt(pk ?? -1, 10);\n return Number.isNaN(normalizedPk) ? -1 : normalizedPk;\n}\n\nclass SdcQuerySet {\n /**\n * Lightweight client-side collection wrapper around the SDC model websocket.\n *\n * The queryset exposes array-like access through a proxy while also keeping\n * track of socket state and outstanding requests for that model.\n *\n * @param {string} modelName\n * @param {object} modelQuery\n */\n constructor(modelName, modelQuery = {}) {\n this.valuesList = [];\n this.loaded = false;\n this.modelName = modelName;\n this.modelQuery = modelQuery ?? {};\n this._onNoOpenRequests = [];\n this._isConnected = false;\n this._isConnectingProcess = false;\n this._autoReconnect = true;\n this.socket = null;\n // Request resolvers are stored by websocket event id until the server responds.\n this.openRequest = {};\n this.modelId = 0;\n this.onUpdate = () => {\n };\n this.onCreate = () => {\n };\n\n return new Proxy(this, {\n get(target, prop) {\n if (typeof prop !== \"symbol\" && !isNaN(prop)) {\n return target.valuesList[prop];\n }\n return target[prop];\n },\n\n set(target, prop, value) {\n if (!isNaN(prop)) {\n target.valuesList[prop] = value;\n return true;\n }\n target[prop] = value;\n return true;\n }\n });\n }\n\n [Symbol.iterator]() {\n let idx = -1;\n return {\n next: () => {\n ++idx;\n if (idx < this.valuesList.length) {\n return { value: this.valuesList[idx], done: false };\n }\n return { value: null, done: true };\n },\n };\n }\n\n set on_create(handler) {\n this.onCreate = handler;\n }\n\n set on_update(handler) {\n this.onUpdate = handler;\n }\n\n /**\n *\n *\n * @param {Array<integr|string>|integer|SdcModel|SdcQuerySet|string} ids\n */\n setIds(ids) {\n const vl = this._setIds(ids);\n const filter = {\n id__in: vl.map((x) => x.id)\n }\n\n this.setFilter(filter);\n return vl;\n }\n\n /**\n *\n *\n * @param {Array<integr|string>|integer|SdcModel|SdcQuerySet|string} ids\n */cloneObject\n _setIds(ids) {\n\n if (ids === null || ids === \"\" || Array.isArray(ids) && ids.length === 0) {\n this.valuesList = [];\n return this.valuesList;\n } else if (ids instanceof SdcQuerySet) {\n this.valuesList = ids.valuesList.map(cloneObject);\n this.valuesList.forEach(value => value._setQuerySet(this, true));\n return this.valuesList;\n } else if (ids instanceof SdcModel) {\n this.valuesList = [cloneObject(ids)];\n this.valuesList.forEach(value => value._setQuerySet(this, true));\n return this.valuesList;\n }\n\n let numList, numId = Number.NaN;\n if (Number.isInteger(ids)) {\n numId = ids;\n } else if (ids instanceof Array) {\n const tempNumList = ids.map((x) => parseInt(x));\n if (!tempNumList.some(Number.isNaN)) {\n numList = tempNumList;\n }\n } else if (typeof ids === \"string\") {\n const tempNumList = ids.split(',').map((x) => parseInt(x));\n if (!tempNumList.some(Number.isNaN)) {\n numList = tempNumList\n } else {\n numId = parseInt(ids);\n }\n }\n\n if (!Number.isNaN(numId)) {\n this.valuesList = this.valuesList.filter((item) => numId === item.id);\n if (this.valuesList.length === 0) {\n const newModel = this.new();\n newModel.id = numId;\n }\n } else if (numList) {\n this.valuesList = this.valuesList.filter((item) => numList.includes(item.id));\n const valueIds = this.getIds();\n numList.filter(x => !valueIds.includes(x)).forEach((id) => {\n this.valuesList.push(new ((0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName))({ id }));\n });\n }\n return this.valuesList;\n }\n\n getIds() {\n return this.valuesList.map(x => x.id);\n }\n\n /**\n * Number of model instances currently present in the queryset cache.\n *\n * @returns {number}\n */\n get length() {\n return this.valuesList.length;\n }\n\n /**\n * Resolve a model instance by id, loading the queryset first if needed.\n *\n * @param {*} id\n * @returns {SdcModel|null}\n */\n byId(id) {\n if (id !== null) {\n const normalizedId = normalizePk(id);\n return this.valuesList.find((elm) => elm.id === normalizedId) ?? null;\n }\n\n return null;\n }\n\n /**\n * Merge additional query constraints into the current queryset.\n *\n * @param {object} modelQuery\n * @returns {SdcQuerySet}\n */\n setFilter(modelQuery) {\n this.modelQuery = modelQuery;\n return this;\n }\n\n addFilter(modelQuery) {\n this.modelQuery = Object.assign({}, this.modelQuery, modelQuery);\n return this;\n }\n\n /**\n * @param {?object} values\n * @returns {SdcModel}\n */\n new(values = {}) {\n const newModel = new ((0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName))(values);\n newModel._setQuerySet(this, false);\n this.valuesList.push(newModel);\n return newModel;\n }\n\n /**\n * Load model instances matching the current query into the queryset cache.\n *\n * @param {?object} modelQuery\n * @returns {Promise<SdcQuerySet>}\n */\n load(modelQuery = null) {\n this.valuesList = [];\n this.modelQuery = modelQuery ?? this.modelQuery;\n return this._sendLoad();\n }\n\n /**\n * Load model instances matching the current query into the queryset cache.\n *\n * @param {?object} modelQuery\n * @param {?SdcModel} item\n * @returns {Promise<SdcQuerySet>}\n */\n update({ modelQuery = null, item = null }) {\n this.modelQuery = modelQuery ?? this.modelQuery;\n let loadQuery = item ? { id: item.id } : this.modelQuery;\n return this._sendLoad(loadQuery);\n }\n\n /**\n *\n * @param pk {integr}\n * @param elem {SdcModel}\n * @returns {Promise<unknown>}\n */\n delete({ pk = null, id = null, elem = null }) {\n pk ??= id;\n pk = !elem ? pk : elem.id;\n if (pk === null) {\n throw new Error(\"pk or elem must be set\");\n }\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: \"delete\",\n event_id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n id: pk,\n pk\n },\n }),\n );\n\n this.openRequest[event_id] = [resolve, reject];\n });\n });\n }\n\n /**\n * Request the server-side queryset data over the model websocket.\n *\n * @returns {Promise<*>}\n */\n _sendLoad(loadQuery = null) {\n return this.isConnected().then(() => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: \"load\",\n event_id,\n args: {\n model_name: this.modelName,\n model_query: loadQuery ?? this.modelQuery,\n },\n }),\n );\n\n this.openRequest[event_id] = [(data) => {\n this.loaded = true;\n resolve(data);\n }, reject];\n });\n });\n }\n\n /**\n * Render the list-view endpoint for the current model.\n *\n * @param {object} options\n * @returns {*}\n */\n _sendListView({\n modelQuery = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {},\n }) {\n return this.view({\n modelQuery,\n cbResolve,\n cbReject,\n templateContext,\n eventType: \"list_view\",\n });\n }\n\n /**\n * Render a named model view and append its HTML to a container element.\n *\n * @param {object} options\n * @returns {*}\n */\n view({\n viewName = \"html_list_template\",\n modelQuery = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {},\n eventType = \"named_view\",\n }) {\n let $divList = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: eventType,\n event_id,\n args: {\n view_name: viewName,\n model_name: this.modelName,\n model_query: modelQuery,\n template_context: templateContext,\n },\n }),\n );\n\n this.openRequest[event_id] = [\n (data) => {\n $divList.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divList);\n cbResolve && cbResolve(data);\n },\n (res) => {\n cbReject && cbReject(res);\n },\n ];\n });\n\n return $divList;\n }\n\n /**\n * Render the detail-view endpoint for a single model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _sendDetailView({\n pk = null,\n id = null,\n cbResolve = null,\n cbReject = null,\n templateContext = {},\n }) {\n pk ??= id;\n pk = normalizePk(pk);\n let $divList = $('<div class=\"container-fluid\">');\n\n this.isConnected().then(() => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: \"detail_view\",\n event_id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n id: pk,\n pk,\n template_context: templateContext,\n },\n }),\n );\n\n this.openRequest[event_id] = [\n (data) => {\n $divList.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divList);\n cbResolve && cbResolve(data);\n },\n (res) => {\n cbReject && cbReject(res);\n },\n ];\n });\n\n return $divList;\n }\n\n /**\n * Fetch a model form fragment and attach the SDC form metadata expected by\n * the rest of the client.\n *\n * @param {string} eventType\n * @param {SdcModel} modelObj\n * @param formName\n * @param $divForm\n * @param cbResolve\n * @param cbReject\n * @param formId\n */\n getForm({ modelObj, eventType, formName, $divForm, cbResolve, cbReject, formId }) {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n const pk = modelObj.id ?? -1;\n this.isConnected().then(() => {\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: eventType,\n event_id,\n args: {\n model_name: this.modelName,\n id: pk,\n pk,\n form_name: formName,\n },\n }),\n );\n });\n\n const className = pk === null || pk === -1 ? \"create\" : \"edit\";\n\n this.openRequest[event_id] = [\n (data) => {\n $divForm.append(data.html);\n let $form = $divForm\n .closest(\"form\")\n .addClass(\n `sdc-model-${className}-form sdc-model-form ${formId}`,\n )\n .data(\"model\", modelObj)\n .data(\"model_pk\", pk)\n .data(\"form_name\", formName);\n modelObj.addForm($form);\n if ($form.length > 0 && !$form[0].hasAttribute(\"sdc_submit\")) {\n $form.attr(\"sdc_submit\", \"submitModelFormDistributor\");\n }\n\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divForm).then(() => null);\n cbResolve && cbResolve(data);\n },\n (res) => {\n cbReject && cbReject(res);\n },\n ];\n }\n\n /**\n * Fetch a single model instance matching the current query.\n *\n * @param {?object} modelQuery\n * @param {?boolean} doNotLoad true if modelQuery contains id or pk and object does not need to be loaded.\n * @returns {Promise<SdcModel>}\n */\n async get(modelQuery = null, doNotLoad = false) {\n if (doNotLoad) {\n const id = modelQuery?.id ?? this.modelQuery?.id;\n if(modelQuery) {\n this.setFilter(modelQuery);\n }\n return this.byId(id) ?? this.new(modelQuery || this.modelQuery);\n }\n await this.load(modelQuery);\n if (this.length !== 1) {\n throw new Error(`model query returns ${this.length} but only 1 expected.`);\n }\n\n this.addFilter({ id: this.valuesList[0].id });\n\n return this.valuesList[0];\n }\n\n detailView({ pk, cbResolve = null, cbReject = null, templateContext = {} }) {\n return this._sendDetailView({\n id: pk,\n cbResolve,\n cbReject,\n templateContext,\n });\n }\n\n listView({ modelQuery = {}, searchValues = {}, cbResolve = null, cbReject = null, templateContext = {} }) {\n return this._sendListView({\n modelQuery: Object.assign({}, this.modelQuery, modelQuery, { '__search_values': searchValues }),\n cbResolve,\n cbReject,\n templateContext,\n });\n }\n\n save({ pk = null, id = null, formName = \"edit_form\", data = null } = {}) {\n pk ??= id;\n const normPk = normalizePk(pk);\n return this.isConnected().then(() => {\n let elemList;\n if (normPk > -1) {\n const elem = this.byId(normPk);\n if (!elem) {\n return Promise.reject(new SdcModelError(`Element not found with ID: ${normPk}`));\n }\n elemList = [elem];\n } else {\n elemList = this.valuesList;\n }\n let pList = [];\n elemList.forEach((elem) => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n pList.push(\n new Promise((resolve, reject) => {\n this._readFiles(elem).then((files) => {\n const sendData = data ? { ...data } : elem.serialize();\n sendData.id = elem.id;\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: \"save\",\n event_id,\n args: {\n form_name: formName,\n model_name: this.modelName,\n model_query: this.modelQuery,\n data: sendData,\n id: sendData.id,\n pk: sendData.id,\n files: files,\n },\n }),\n );\n\n this.openRequest[event_id] = [\n (res) => {\n let data =\n typeof res.data.instance === \"string\"\n ? JSON.parse(res.data.instance)\n : res.data.instance;\n res.data.instance = this._parseServerRes(data);\n resolve(res);\n },\n reject,\n ];\n });\n }),\n );\n });\n\n return Promise.all(pList);\n });\n }\n\n /**\n *\n * @param elem {?SdcModel}\n * @param data {?object}\n * @returns {Promise<unknown>}\n */\n create({ elem = null, data = null } = {}) {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n if (!elem) {\n elem = this.new(data);\n }\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this._readFiles(elem).then((files) => {\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: \"create\",\n event_id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n data: data ?? elem?.serialize() ?? {},\n files: files,\n },\n }),\n );\n\n this.openRequest[event_id] = [\n (res) => {\n let data =\n typeof res.data.instance === \"string\"\n ? JSON.parse(res.data.instance)\n : res.data.instance;\n if (elem) {\n elem.id = data[0]?.id || data[0]?.pk;\n }\n res.data.instance = this._parseServerRes(data)[0];\n resolve(res);\n },\n reject,\n ];\n });\n });\n });\n }\n\n /**\n * Ensure the websocket is open and has completed the server-side connect\n * handshake before issuing model requests.\n *\n * Multiple callers can arrive while a connection attempt is already in\n * progress. In that case they are queued behind the same synthetic request id.\n *\n * @returns {Promise<void>}\n */\n isConnected() {\n return new Promise((resolve, reject) => {\n if (this._isConnected) {\n resolve();\n } else if (\n !this._isConnectingProcess ||\n !this.openRequest[CONNECTING_REQUEST_ID]\n ) {\n this._isConnectingProcess = true;\n this.openRequest[CONNECTING_REQUEST_ID] = [() => {\n }, () => {\n }];\n this._connectToServer().then(() => {\n resolve(this._checkConnection());\n });\n } else {\n const [resolveOrigin, rejectOrigin] =\n this.openRequest[CONNECTING_REQUEST_ID];\n this.openRequest[CONNECTING_REQUEST_ID] = [\n () => {\n resolveOrigin();\n resolve();\n },\n () => {\n rejectOrigin();\n reject();\n },\n ];\n }\n });\n }\n\n /**\n * Close the websocket and disable automatic reconnect for this queryset.\n */\n close() {\n if (this.socket) {\n this._autoReconnect = false;\n this.socket.onclose = () => {\n };\n this.socket.close();\n delete this[\"socket\"];\n }\n\n this.valuesList.forEach((elem) => {\n elem._onClose()\n });\n }\n\n /**\n * Upload attached `File` values in fixed-size chunks before save/create calls.\n *\n * @param {SdcModel} elem\n * @returns {Promise<object>}\n */\n _readFiles(elem) {\n let toSolve = [];\n let files = {};\n if (!elem) {\n return Promise.resolve(files);\n }\n Object.keys(elem.constructor.fields).forEach((key) => {\n const value = elem[key];\n if (value instanceof File) {\n toSolve.push(\n new Promise(async (resolve, reject) => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.openRequest[event_id] = [resolve, reject];\n\n const buffer = await value.arrayBuffer();\n let result = new Uint8Array(buffer);\n let numberOfChunks = Math.ceil(result.length / MAX_FILE_UPLOAD);\n files[key] = {\n id: event_id,\n file_name: value.name,\n field_name: key,\n content_length: value.size,\n };\n for (let i = 0; i < numberOfChunks; ++i) {\n const chunk = Array.from(result.slice(\n MAX_FILE_UPLOAD * i,\n MAX_FILE_UPLOAD * (i + 1),\n ));\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: \"upload\",\n event_id,\n args: {\n chunk,\n idx: i,\n number_of_chunks: numberOfChunks,\n file_name: value.name,\n field_name: key,\n content_length: value.size,\n content_type: value.type,\n model_name: this.modelName,\n model_query: this.modelQuery,\n },\n }),\n );\n }\n }),\n );\n }\n });\n\n return Promise.all(toSolve).then(() => {\n return files;\n });\n }\n\n /**\n * Route websocket responses to the matching pending request and update local\n * state when the server sends model payloads.\n *\n * @param {MessageEvent} e\n */\n async _onMessage(e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (this.openRequest.hasOwnProperty(data.event_id)) {\n this.openRequest[data.event_id][1](new SdcModelError(data));\n this._closeOpenRequest(data.event_id);\n }\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"pushErrorMsg\", data.header || \"\", data.msg || \"\");\n }\n\n if (data.type === \"connect\") {\n this.openRequest[CONNECTING_REQUEST_ID][1](new SdcModelError(data));\n this._closeOpenRequest(CONNECTING_REQUEST_ID);\n this._autoReconnect = false;\n this.socket.close();\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"pushMsg\", data.header || \"\", data.msg || \"\");\n }\n\n if (data.type === \"connect\") {\n this._isConnected = true;\n this._isConnectingProcess = false;\n this.openRequest[CONNECTING_REQUEST_ID][0](data);\n this._closeOpenRequest(CONNECTING_REQUEST_ID);\n } else if ([\"load\", \"named_view\", \"detail_view\"].includes(data.type)) {\n const jsonRes = JSON.parse(data.args.data);\n data.args.data = await this._parseServerRes(jsonRes);\n } else if (data.type === \"on_update\" || data.type === \"on_create\") {\n const jsonRes = JSON.parse(data.args.data);\n\n let obj = await this._parseServerRes(jsonRes);\n let cb;\n\n if (data.type === \"on_create\") {\n cb = this.onCreate;\n } else {\n cb = this.onUpdate;\n }\n\n cb(obj);\n data.args.data = obj;\n }\n\n let instance = data.data?.instance;\n if (instance) {\n data.data.instance = JSON.parse(data.data.instance);\n }\n\n if (this.openRequest.hasOwnProperty(data.event_id)) {\n this.openRequest[data.event_id][0](data);\n this._closeOpenRequest(data.event_id);\n }\n }\n }\n\n /**\n * Wait until all in-flight websocket requests for this queryset are resolved.\n *\n * @returns {Promise<void>}\n */\n noOpenRequests() {\n return new Promise((resolve) => {\n if (Object.keys(this.openRequest).length === 0) {\n return resolve();\n }\n\n this._onNoOpenRequests.push(resolve);\n });\n }\n\n /**\n * Remove a completed request and wake any `noOpenRequests()` waiters when the\n * request map becomes empty.\n *\n * @param {string} eventId\n */\n _closeOpenRequest(eventId) {\n delete this.openRequest[eventId];\n if (Object.keys(this.openRequest).length === 0) {\n this._onNoOpenRequests.forEach((x) => x());\n this._onNoOpenRequests = [];\n }\n }\n\n /**\n * Establish the raw websocket connection for this queryset.\n *\n * @returns {Promise<void>}\n */\n _connectToServer() {\n return new Promise((resolve) => {\n const modelIdentifier =\n `${this.modelName}` + (this.modelId > 0 ? `/${this.modelId}` : \"\");\n if (window.location.protocol === \"https:\") {\n this.socket = new WebSocket(\n `wss://${window.location.host}/sdc_ws/model/${modelIdentifier}`,\n );\n } else {\n this.socket = new WebSocket(\n `ws://${window.location.host}/sdc_ws/model/${modelIdentifier}`,\n );\n }\n\n this.socket.onmessage = this._onMessage.bind(this);\n\n this.socket.onclose = (e) => {\n console.error(\n `SDC Model (${this.modelName}, ${this.modelId}) Socket closed unexpectedly`,\n );\n this._isConnected = false;\n for (const [_key, value] of Object.entries(this.openRequest)) {\n value[1](e);\n }\n this.openRequest = {};\n\n setTimeout(() => {\n if (this._autoReconnect) {\n this._connectToServer().then(() => {\n });\n }\n }, 1000);\n };\n\n this.socket.onerror = (err) => {\n console.error(`Model Socket encountered error: ${err} Closing socket`);\n if (this._isConnected) {\n try {\n this.socket.close();\n } catch (e) {\n }\n }\n };\n\n this.socket.onopen = () => {\n resolve();\n };\n });\n }\n\n /**\n * Perform the application-level connect handshake once the websocket opens.\n *\n * @returns {Promise<*>}\n */\n _checkConnection() {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: \"connect\",\n event_id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n },\n }),\n );\n\n this.openRequest[event_id] = [resolve, reject];\n });\n }\n\n /**\n * Convert the backend model payload into locally tracked model objects.\n *\n * @param {Array<object>} results\n */\n _parseServerRes(results) {\n const newModels = []\n for (const x of results) {\n const ModelClass = (0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName);\n if (!ModelClass) {\n throw new Error(`${this.modelName} is no SdcModel. mybe the models ar not importad.`);\n }\n const newModel = new ModelClass({ 'id': x.id ?? x.pk, ...x.fields });\n const currentModel = this.byId(newModel.id);\n if (currentModel) {\n currentModel.setValues(newModel);\n newModels.push(currentModel);\n } else {\n this.valuesList.push(newModel);\n newModel._setQuerySet(this, true);\n newModels.push(newModel);\n }\n }\n this.valuesList.sort((a, b) => a._id - b._id);\n return newModels;\n }\n}\n\nclass SdcModel {\n static fields = {};\n\n /**\n * Base model wrapper used by SDC model registrations.\n *\n * @param {string} modelName\n */\n constructor(modelName) {\n this._id = null;\n this._forms = [];\n this.loaded = false;\n this.formId = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.modelName = modelName;\n }\n\n /**\n *\n * @param {object?} modelQuerySet\n * @param {AbstractSDC} parent\n * @returns {SdcQuerySet}\n */\n static querySet(modelQuerySet = null, parent = null) {\n if (!parent) {\n return new SdcQuerySet(this.modeName, modelQuerySet);\n }\n\n return parent.querySet(this.modeName, modelQuerySet);\n }\n\n addForm($form) {\n // Remove old listeners if form already set\n const onChange = this._onChange.bind(this);\n\n this._forms.push($form);\n\n if ($form) {\n // Attach delegated event handler to all inputs\n $form.on(\n \"input.formWatcher change.formWatcher\",\n \"input, select, textarea\",\n onChange\n );\n }\n }\n\n _onChange(event) {\n const { name } = event.target;\n if (this.constructor.fields[name]) {\n this[`set${name}`]((0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValueFromField)(event.target));\n }\n }\n\n _updateForm(fieldName) {\n const self = this;\n this._forms.forEach(($form) => {\n $form.find(`[name=\"${fieldName}\"]`).each(function () {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.setValueInField)(this, self[fieldName])\n });\n });\n }\n\n setValues(data = {}) {\n throw new Error(\"setValues() must be implemented by subclass\");\n }\n\n /**\n * Attach the queryset that owns this model instance.\n *\n * @param {SdcQuerySet} querySet\n * @param {boolean} isLoaded\n */\n _setQuerySet(querySet, isLoaded) {\n this._querySet = new WeakRef(querySet);\n this.loaded = isLoaded;\n }\n\n get querySet() {\n return this._querySet.deref();\n }\n\n save({ formName = \"edit_form\", data = null } = {}) {\n return this._querySet.deref().save({ pk: this.id, formName, data });\n }\n\n create({ data = null } = {}) {\n return this._querySet.deref().create({ elem: this, data });\n }\n\n delete() {\n return this._querySet.deref().delete({ elem: this });\n }\n\n load() {\n return this._querySet.deref().update({ item: this });\n }\n\n update() {\n return this.load();\n }\n\n get id() {\n return this._id;\n }\n\n set id(data) {\n this._id = data;\n }\n\n set pk(data) {\n this.id = data;\n }\n\n get pk() {\n return this._id;\n }\n\n close() {\n return this._querySet.deref().close();\n }\n\n _onClose() {\n Object.keys(this.constructor.fields)\n .filter((x) => this[`_${x}`] instanceof SdcQuerySet)\n .forEach((x) => this[`_${x}`].close());\n }\n\n /**\n * Request the server-rendered detail view for this model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n detailView({ cbResolve = null, cbReject = null, templateContext = {} }) {\n return this._querySet.deref().detailView({ pk: this.id, cbResolve, cbReject, templateContext });\n }\n\n serialize() {\n return Object.entries(this.constructor.fields).reduce((acc, [key, val]) => {\n const value = this[key];\n if (value instanceof SdcQuerySet) {\n if (val.many_to_many || val.one_to_many) {\n acc[key] = value.getIds();\n } else {\n const allIds = value.getIds();\n if (allIds.length > 0) {\n acc[key] = allIds[0];\n } else {\n acc[key] = null;\n }\n\n }\n } else if (val.is_relation && value instanceof SdcModel) {\n acc[key] = value.id ?? null;\n } else {\n acc[key] = value;\n }\n\n return acc\n }, {});\n }\n\n toJson() {\n const res = {}\n for (let key in this.constructor.fields) {\n const value = this[key];\n\n if (value instanceof File) {\n res[key] = value.name;\n } else if (value instanceof SdcModel) {\n res[key] = value.id;\n } else if (value instanceof SdcQuerySet) {\n res[key] = value.getIds();\n } else {\n res[key] = value;\n }\n }\n\n return res;\n }\n\n /**\n * Backwards-compatible alias for syncing values from a form into the model.\n *\n * @param {*} $forms\n * @returns {*}\n */\n syncFormToModel($forms) {\n return this.syncForm($forms);\n }\n\n /**\n * Resolve the form collection associated with this model instance.\n *\n * @param {*} $forms\n * @returns {*}\n */\n _resolveForms($forms) {\n if (!$forms || !$forms.hasClass(this.formId)) {\n return $(`.${this.formId}`);\n }\n\n return $forms;\n }\n\n /**\n * Copy the current model state into matching form fields.\n *\n * @param {*} $forms\n */\n syncModelToForm($forms) {\n $forms = this._resolveForms($forms);\n\n const self = this;\n const fields = this.constructor.fields;\n $forms.each(function () {\n const pk = normalizePk($(this).data(\"model_pk\"));\n if (self.id !== pk) {\n return;\n }\n\n for (let formItem of this.elements) {\n let name = formItem.name;\n if (name && name !== \"\" && !!fields[name]) {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.setValueInField)(formItem, self[name])\n }\n }\n });\n }\n\n /**\n * Copy matching form values back onto the current model instance.\n *\n * Hidden inputs are parsed to their original primitive type when possible.\n *\n * @param {*} $forms\n * @returns {*}\n */\n syncForm($forms) {\n $forms = this._resolveForms($forms);\n\n const self = this;\n const fields = this.constructor.fields;\n const returnValue = {}\n\n function setValueInForm(name, value) {\n if (!!fields[name]) {\n self[name] = value;\n }\n returnValue[name] = value;\n }\n\n $forms.each(function () {\n const pk = normalizePk($(this).data(\"model_pk\"));\n if (self.id !== pk && (self.id !== null || pk !== -1)) {\n return;\n }\n\n for (let formItem of this.elements) {\n setValueInForm(formItem.name, (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValueFromField)(formItem));\n }\n\n return self;\n });\n\n return returnValue;\n }\n\n /**\n * Render the correct server-side form for this model state.\n *\n * @param {object} options\n * @returns {*}\n */\n form({ cbResolve = null, cbReject = null } = {}) {\n if (this.id === null || this.id === -1) {\n return this._createForm({ cbReject, cbResolve });\n }\n return this._editForm({ cbReject, cbResolve });\n }\n\n /**\n * Render the create form for a new model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _createForm({ cbResolve = null, cbReject = null }) {\n let $divForm = $(\"<div>\");\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"create_form\",\n formName: null,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId,\n });\n\n return $divForm;\n }\n\n /**\n * Render the edit form for an existing model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _editForm({ cbResolve = null, cbReject = null }) {\n let $divForm = $(\"<div>\");\n\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"edit_form\",\n formName: null,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId,\n });\n\n return $divForm;\n }\n\n /**\n * Render a named server-side form for this model.\n *\n * @param {object} options\n * @returns {*}\n */\n namedForm({ formName, cbResolve = null, cbReject = null }) {\n let $divForm = $('<div class=\"container-fluid\">');\n\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"named_form\",\n formName,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId,\n });\n\n return $divForm;\n }\n\n /**\n * Validate a field value using the supplied field config.\n *\n * @param {*} value\n * @param {object} config\n */\n validate(value, config) {\n const err = validateField(value, config);\n if (err) throw new Error(err);\n }\n\n /**\n * Convert a raw input value into the shape expected by the field config.\n *\n * @param {*} value\n * @param {object} config\n * @returns {*}\n */\n parseValue(value, config) {\n const {\n type,\n many_to_many: manyToMany,\n one_to_many: oneToMany,\n many_to_one: manyToOne,\n one_to_one: oneToOne,\n } = config;\n if (value === null) {\n return null;\n }\n\n if ((manyToMany || oneToMany || manyToOne || oneToOne) && value && typeof value === 'string') {\n return JSON.parse(value);\n }\n\n switch (type) {\n case \"CharField\":\n case \"TeextField\":\n case \"UUIDField\":\n case \"EmailField\":\n return `${value}`;\n\n case \"IntegerField\":\n case \"AutoField\":\n case \"BigIntegerField\":\n return parseInt(value, 10);\n\n case \"FloatField\":\n case \"DecimalField\":\n return parseFloat(value);\n\n case \"BooleanField\":\n return !!value;\n\n case \"DateField\":\n case \"DateTimeField\":\n return Date.parse(value);\n\n case \"URLField\":\n return new URL(value);\n\n case \"FileField\":\n if (value == null) {\n return null;\n }\n\n if (typeof value === \"string\") {\n return null;\n }\n\n if (FileLoaded.isValid(value)) {\n return new FileLoaded(value);\n }\n\n if (value instanceof FileLoaded) {\n return new FileLoaded(value);\n }\n\n if (typeof File !== \"undefined\" && value instanceof File) {\n if (config.max_size && value.size > config.max_size) {\n return `File too large (max ${config.max_size} bytes)`;\n }\n\n if (config.allowed_types && !config.allowed_types.includes(value.type)) {\n return `Invalid file type (${value.type})`;\n }\n\n return value;\n }\n break;\n\n case \"JSONField\":\n if (typeof value === \"object\") {\n return value;\n }\n if (typeof value === \"string\") {\n return JSON.parse(value);\n }\n break;\n\n default:\n break;\n }\n\n return value;\n }\n}\n\n/**\n * Validate a field value against the field metadata received from the backend.\n *\n * @param {*} value\n * @param {object} config\n * @returns {?string}\n */\nfunction validateField(value, config) {\n const {\n type,\n required,\n max_length: maxLength,\n is_relation: isRelation,\n many_to_many: manyToMany,\n one_to_many: oneToMany,\n many_to_one: manyToOne,\n one_to_one: oneToOne,\n related_model: relatedModel,\n } = config;\n\n void isRelation;\n\n if (required) {\n if (value === null || value === undefined || value === \"\") {\n return \"This field is required\";\n }\n }\n\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n\n if (manyToMany || oneToMany || manyToOne || oneToOne) {\n if (!(value instanceof SdcQuerySet) || value.modelName !== relatedModel) {\n if(typeof value === 'string') {\n value = JSON.parse(value);\n }\n\n if ((manyToMany || manyToOne) && Array.isArray(value) && value.some((x) => !Number.isNaN(parseInt(x)))) {\n return null;\n }\n if (typeof value !== \"object\" && Number.isNaN(parseInt(value))) {\n return \"Must be object or ID\";\n }\n return null;\n }\n }\n\n switch (type) {\n case \"CharField\":\n case \"TextField\":\n if (typeof value !== \"string\") {\n return \"Must be a string\";\n }\n if (maxLength && value.length > maxLength) {\n return `Max length is ${maxLength}`;\n }\n break;\n\n case \"IntegerField\":\n case \"AutoField\":\n case \"BigIntegerField\":\n if (!isFinite(parseInt(value))) {\n return \"Must be an integer\";\n }\n break;\n\n case \"FloatField\":\n case \"DecimalField\":\n if (!isFinite(parseFloat(value))) {\n return \"Must be a number\";\n }\n break;\n\n case \"BooleanField\":\n if (typeof value !== \"boolean\") {\n return \"Must be a boolean\";\n }\n break;\n\n case \"DateField\":\n case \"DateTimeField\":\n if (isNaN(Date.parse(value))) {\n return \"Must be a valid date\";\n }\n break;\n\n case \"EmailField\":\n if (typeof value !== \"string\" || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n return \"Invalid email\";\n }\n break;\n\n case \"URLField\":\n try {\n new URL(value);\n } catch {\n return \"Invalid URL\";\n }\n break;\n\n case \"UUIDField\":\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(value)) {\n return \"Invalid UUID\";\n }\n break;\n\n case \"JSONField\":\n if (typeof value !== \"object\") {\n return \"Must be JSON object\";\n }\n break;\n case \"FileField\":\n if (!FileLoaded.isValid(value) && !(value instanceof File) && !(value instanceof FileLoaded)) {\n return \"Must be a valid file\";\n }\n break;\n default:\n break;\n }\n\n return null;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfbW9kZWwuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQTRFO0FBQ2xDO0FBQ047QUFDTTs7QUFFMUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQkFBZ0IsV0FBVztBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2QsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFFBQVE7QUFDckIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87O0FBRVA7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQSxpQkFBaUI7QUFDakIsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLDBEQUEwRDtBQUN2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QUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEdBQUc7QUFDZCxXQUFXLFFBQVE7QUFDbkIsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQ0FBZ0MsVUFBVTtBQUMxQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxzQkFBc0IsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsR0FBRztBQUNwRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfbW9kZWwuanM/OTkxYiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRWYWx1ZUZyb21GaWVsZCwgc2V0VmFsdWVJbkZpZWxkLCB1dWlkdjQgfSBmcm9tIFwiLi9zZGNfdXRpbHMuanNcIjtcbmltcG9ydCB7IGdldE1vZGVsIH0gZnJvbSBcIi4vc2RjX3NvY2tldC5qc1wiXG5pbXBvcnQgeyBhcHAgfSBmcm9tIFwiLi9zZGNfbWFpbi5qc1wiO1xuaW1wb3J0IHsgdHJpZ2dlciB9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcblxuY29uc3QgTUFYX0ZJTEVfVVBMT0FEID0gMjUwMDA7XG5jb25zdCBDT05ORUNUSU5HX1JFUVVFU1RfSUQgPSBcIl9jb25uZWN0aW5nX3Byb2Nlc3NcIjtcblxuY29uc3QgY2xvbmVPYmplY3QgPSAob3JpZ2luYWwpID0+IHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpKSxcbiAgICBzdHJ1Y3R1cmVkQ2xvbmUob3JpZ2luYWwpXG4gICk7XG59XG5cbmNsYXNzIFNkY01vZGVsRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHByb3BzID0ge1xuICAgICAgICBtc2c6IHByb3BzLFxuICAgICAgICBpc19lcnJvcjogdHJ1ZSxcbiAgICAgICAgaGVhZGVyOiAnRXJyb3InXG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyKHByb3BzLm1zZylcbiAgICB0aGlzLm1zZyA9IHByb3BzLm1zZztcbiAgICB0aGlzLmhlYWRlciA9IHByb3BzLmhlYWRlcjtcbiAgICB0aGlzLmlzX2Vycm9yID0gcHJvcHMuaXNfZXJyb3I7XG4gICAgdGhpcy5odG1sID0gcHJvcHMuaHRtbDtcbiAgfVxufVxuXG5jbGFzcyBGaWxlTG9hZGVkIHtcbiAgY29uc3RydWN0b3IoeyBuYW1lLCB1cmwgfSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy51cmwgPSB1cmw7XG4gICAgdGhpcy5jb250ZW50ID0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGxvYWQoZm9yY2UgPSBmYWxzZSkge1xuICAgIGlmIChmb3JjZSB8fCAhdGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmNvbnRlbnQgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICQuZ2V0KHRoaXMudXJsKS50aGVuKHJlc29sdmUpLmNhdGNoKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbnRlbnQ7XG4gIH1cblxuICBhc3luYyB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIHN0YXRpYyBpc1ZhbGlkKHZhbHVlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpICYmXG4gICAgICB0eXBlb2YgdmFsdWUudXJsID09PSBcInN0cmluZ1wiICYmXG4gICAgICB0eXBlb2YgdmFsdWUubmFtZSA9PT0gXCJzdHJpbmdcIlxuICAgICk7XG4gIH1cblxuXG59XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIGluY29taW5nIHByaW1hcnkga2V5IHZhbHVlLlxuICpcbiAqIGAtMWAgaXMgdXNlZCB0aHJvdWdob3V0IHRoaXMgbW9kdWxlIGFzIHRoZSBzZW50aW5lbCBmb3IgXCJuZXcgb2JqZWN0IC8gbm8gcGtcIi5cbiAqXG4gKiBAcGFyYW0geyp9IHBrXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQayhwaykge1xuICBjb25zdCBub3JtYWxpemVkUGsgPSBwYXJzZUludChwayA/PyAtMSwgMTApO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKG5vcm1hbGl6ZWRQaykgPyAtMSA6IG5vcm1hbGl6ZWRQaztcbn1cblxuZXhwb3J0IGNsYXNzIFNkY1F1ZXJ5U2V0IHtcbiAgLyoqXG4gICAqIExpZ2h0d2VpZ2h0IGNsaWVudC1zaWRlIGNvbGxlY3Rpb24gd3JhcHBlciBhcm91bmQgdGhlIFNEQyBtb2RlbCB3ZWJzb2NrZXQuXG4gICAqXG4gICAqIFRoZSBxdWVyeXNldCBleHBvc2VzIGFycmF5LWxpa2UgYWNjZXNzIHRocm91Z2ggYSBwcm94eSB3aGlsZSBhbHNvIGtlZXBpbmdcbiAgICogdHJhY2sgb2Ygc29ja2V0IHN0YXRlIGFuZCBvdXRzdGFuZGluZyByZXF1ZXN0cyBmb3IgdGhhdCBtb2RlbC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICAgKiBAcGFyYW0ge29iamVjdH0gbW9kZWxRdWVyeVxuICAgKi9cbiAgY29uc3RydWN0b3IobW9kZWxOYW1lLCBtb2RlbFF1ZXJ5ID0ge30pIHtcbiAgICB0aGlzLnZhbHVlc0xpc3QgPSBbXTtcbiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMubW9kZWxOYW1lID0gbW9kZWxOYW1lO1xuICAgIHRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnkgPz8ge307XG4gICAgdGhpcy5fb25Ob09wZW5SZXF1ZXN0cyA9IFtdO1xuICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gZmFsc2U7XG4gICAgdGhpcy5faXNDb25uZWN0aW5nUHJvY2VzcyA9IGZhbHNlO1xuICAgIHRoaXMuX2F1dG9SZWNvbm5lY3QgPSB0cnVlO1xuICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICAvLyBSZXF1ZXN0IHJlc29sdmVycyBhcmUgc3RvcmVkIGJ5IHdlYnNvY2tldCBldmVudCBpZCB1bnRpbCB0aGUgc2VydmVyIHJlc3BvbmRzLlxuICAgIHRoaXMub3BlblJlcXVlc3QgPSB7fTtcbiAgICB0aGlzLm1vZGVsSWQgPSAwO1xuICAgIHRoaXMub25VcGRhdGUgPSAoKSA9PiB7XG4gICAgfTtcbiAgICB0aGlzLm9uQ3JlYXRlID0gKCkgPT4ge1xuICAgIH07XG5cbiAgICByZXR1cm4gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSBcInN5bWJvbFwiICYmICFpc05hTihwcm9wKSkge1xuICAgICAgICAgIHJldHVybiB0YXJnZXQudmFsdWVzTGlzdFtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICAgICAgfSxcblxuICAgICAgc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCFpc05hTihwcm9wKSkge1xuICAgICAgICAgIHRhcmdldC52YWx1ZXNMaXN0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7XG4gICAgbGV0IGlkeCA9IC0xO1xuICAgIHJldHVybiB7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICsraWR4O1xuICAgICAgICBpZiAoaWR4IDwgdGhpcy52YWx1ZXNMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB0aGlzLnZhbHVlc0xpc3RbaWR4XSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2YWx1ZTogbnVsbCwgZG9uZTogdHJ1ZSB9O1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgc2V0IG9uX2NyZWF0ZShoYW5kbGVyKSB7XG4gICAgdGhpcy5vbkNyZWF0ZSA9IGhhbmRsZXI7XG4gIH1cblxuICBzZXQgb25fdXBkYXRlKGhhbmRsZXIpIHtcbiAgICB0aGlzLm9uVXBkYXRlID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PGludGVncnxzdHJpbmc+fGludGVnZXJ8U2RjTW9kZWx8U2RjUXVlcnlTZXR8c3RyaW5nfSBpZHNcbiAgICovXG4gIHNldElkcyhpZHMpIHtcbiAgICBjb25zdCB2bCA9IHRoaXMuX3NldElkcyhpZHMpO1xuICAgIGNvbnN0IGZpbHRlciA9IHtcbiAgICAgIGlkX19pbjogdmwubWFwKCh4KSA9PiB4LmlkKVxuICAgIH1cblxuICAgIHRoaXMuc2V0RmlsdGVyKGZpbHRlcik7XG4gICAgcmV0dXJuIHZsO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8aW50ZWdyfHN0cmluZz58aW50ZWdlcnxTZGNNb2RlbHxTZGNRdWVyeVNldHxzdHJpbmd9IGlkc1xuICAgKi9jbG9uZU9iamVjdFxuICBfc2V0SWRzKGlkcykge1xuXG4gICAgaWYgKGlkcyA9PT0gbnVsbCB8fCBpZHMgPT09IFwiXCIgfHwgQXJyYXkuaXNBcnJheShpZHMpICYmIGlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IFtdO1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdDtcbiAgICB9IGVsc2UgaWYgKGlkcyBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB7XG4gICAgICB0aGlzLnZhbHVlc0xpc3QgPSBpZHMudmFsdWVzTGlzdC5tYXAoY2xvbmVPYmplY3QpO1xuICAgICAgdGhpcy52YWx1ZXNMaXN0LmZvckVhY2godmFsdWUgPT4gdmFsdWUuX3NldFF1ZXJ5U2V0KHRoaXMsIHRydWUpKTtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3Q7XG4gICAgfSBlbHNlIGlmIChpZHMgaW5zdGFuY2VvZiBTZGNNb2RlbCkge1xuICAgICAgdGhpcy52YWx1ZXNMaXN0ID0gW2Nsb25lT2JqZWN0KGlkcyldO1xuICAgICAgdGhpcy52YWx1ZXNMaXN0LmZvckVhY2godmFsdWUgPT4gdmFsdWUuX3NldFF1ZXJ5U2V0KHRoaXMsIHRydWUpKTtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3Q7XG4gICAgfVxuXG4gICAgbGV0IG51bUxpc3QsIG51bUlkID0gTnVtYmVyLk5hTjtcbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpZHMpKSB7XG4gICAgICBudW1JZCA9IGlkcztcbiAgICB9IGVsc2UgaWYgKGlkcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBjb25zdCB0ZW1wTnVtTGlzdCA9IGlkcy5tYXAoKHgpID0+IHBhcnNlSW50KHgpKTtcbiAgICAgIGlmICghdGVtcE51bUxpc3Quc29tZShOdW1iZXIuaXNOYU4pKSB7XG4gICAgICAgIG51bUxpc3QgPSB0ZW1wTnVtTGlzdDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHRlbXBOdW1MaXN0ID0gaWRzLnNwbGl0KCcsJykubWFwKCh4KSA9PiBwYXJzZUludCh4KSk7XG4gICAgICBpZiAoIXRlbXBOdW1MaXN0LnNvbWUoTnVtYmVyLmlzTmFOKSkge1xuICAgICAgICBudW1MaXN0ID0gdGVtcE51bUxpc3RcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG51bUlkID0gcGFyc2VJbnQoaWRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihudW1JZCkpIHtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IHRoaXMudmFsdWVzTGlzdC5maWx0ZXIoKGl0ZW0pID0+IG51bUlkID09PSBpdGVtLmlkKTtcbiAgICAgIGlmICh0aGlzLnZhbHVlc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnN0IG5ld01vZGVsID0gdGhpcy5uZXcoKTtcbiAgICAgICAgbmV3TW9kZWwuaWQgPSBudW1JZDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG51bUxpc3QpIHtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IHRoaXMudmFsdWVzTGlzdC5maWx0ZXIoKGl0ZW0pID0+IG51bUxpc3QuaW5jbHVkZXMoaXRlbS5pZCkpO1xuICAgICAgY29uc3QgdmFsdWVJZHMgPSB0aGlzLmdldElkcygpO1xuICAgICAgbnVtTGlzdC5maWx0ZXIoeCA9PiAhdmFsdWVJZHMuaW5jbHVkZXMoeCkpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgIHRoaXMudmFsdWVzTGlzdC5wdXNoKG5ldyAoZ2V0TW9kZWwodGhpcy5tb2RlbE5hbWUpKSh7IGlkIH0pKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0O1xuICB9XG5cbiAgZ2V0SWRzKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3QubWFwKHggPT4geC5pZCk7XG4gIH1cblxuICAvKipcbiAgICogTnVtYmVyIG9mIG1vZGVsIGluc3RhbmNlcyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgcXVlcnlzZXQgY2FjaGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3QubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBtb2RlbCBpbnN0YW5jZSBieSBpZCwgbG9hZGluZyB0aGUgcXVlcnlzZXQgZmlyc3QgaWYgbmVlZGVkLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGlkXG4gICAqIEByZXR1cm5zIHtTZGNNb2RlbHxudWxsfVxuICAgKi9cbiAgYnlJZChpZCkge1xuICAgIGlmIChpZCAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gbm9ybWFsaXplUGsoaWQpO1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdC5maW5kKChlbG0pID0+IGVsbS5pZCA9PT0gbm9ybWFsaXplZElkKSA/PyBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIGFkZGl0aW9uYWwgcXVlcnkgY29uc3RyYWludHMgaW50byB0aGUgY3VycmVudCBxdWVyeXNldC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG1vZGVsUXVlcnlcbiAgICogQHJldHVybnMge1NkY1F1ZXJ5U2V0fVxuICAgKi9cbiAgc2V0RmlsdGVyKG1vZGVsUXVlcnkpIHtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkRmlsdGVyKG1vZGVsUXVlcnkpIHtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm1vZGVsUXVlcnksIG1vZGVsUXVlcnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHtTZGNNb2RlbH1cbiAgICovXG4gIG5ldyh2YWx1ZXMgPSB7fSkge1xuICAgIGNvbnN0IG5ld01vZGVsID0gbmV3IChnZXRNb2RlbCh0aGlzLm1vZGVsTmFtZSkpKHZhbHVlcyk7XG4gICAgbmV3TW9kZWwuX3NldFF1ZXJ5U2V0KHRoaXMsIGZhbHNlKTtcbiAgICB0aGlzLnZhbHVlc0xpc3QucHVzaChuZXdNb2RlbCk7XG4gICAgcmV0dXJuIG5ld01vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbW9kZWwgaW5zdGFuY2VzIG1hdGNoaW5nIHRoZSBjdXJyZW50IHF1ZXJ5IGludG8gdGhlIHF1ZXJ5c2V0IGNhY2hlLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1vZGVsUXVlcnlcbiAgICogQHJldHVybnMge1Byb21pc2U8U2RjUXVlcnlTZXQ+fVxuICAgKi9cbiAgbG9hZChtb2RlbFF1ZXJ5ID0gbnVsbCkge1xuICAgIHRoaXMudmFsdWVzTGlzdCA9IFtdO1xuICAgIHRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnkgPz8gdGhpcy5tb2RlbFF1ZXJ5O1xuICAgIHJldHVybiB0aGlzLl9zZW5kTG9hZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbW9kZWwgaW5zdGFuY2VzIG1hdGNoaW5nIHRoZSBjdXJyZW50IHF1ZXJ5IGludG8gdGhlIHF1ZXJ5c2V0IGNhY2hlLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1vZGVsUXVlcnlcbiAgICogQHBhcmFtIHs/U2RjTW9kZWx9IGl0ZW1cbiAgICogQHJldHVybnMge1Byb21pc2U8U2RjUXVlcnlTZXQ+fVxuICAgKi9cbiAgdXBkYXRlKHsgbW9kZWxRdWVyeSA9IG51bGwsIGl0ZW0gPSBudWxsIH0pIHtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5ID8/IHRoaXMubW9kZWxRdWVyeTtcbiAgICBsZXQgbG9hZFF1ZXJ5ID0gaXRlbSA/IHsgaWQ6IGl0ZW0uaWQgfSA6IHRoaXMubW9kZWxRdWVyeTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZExvYWQobG9hZFF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcGsge2ludGVncn1cbiAgICogQHBhcmFtIGVsZW0ge1NkY01vZGVsfVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICovXG4gIGRlbGV0ZSh7IHBrID0gbnVsbCwgaWQgPSBudWxsLCBlbGVtID0gbnVsbCB9KSB7XG4gICAgcGsgPz89IGlkO1xuICAgIHBrID0gIWVsZW0gPyBwayA6IGVsZW0uaWQ7XG4gICAgaWYgKHBrID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwayBvciBlbGVtIG11c3QgYmUgc2V0XCIpO1xuICAgIH1cbiAgICBjb25zdCBldmVudF9pZCA9IHV1aWR2NCgpO1xuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICBldmVudF90eXBlOiBcImRlbGV0ZVwiLFxuICAgICAgICAgICAgZXZlbnRfaWQsXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgICBpZDogcGssXG4gICAgICAgICAgICAgIHBrXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRoZSBzZXJ2ZXItc2lkZSBxdWVyeXNldCBkYXRhIG92ZXIgdGhlIG1vZGVsIHdlYnNvY2tldC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Kj59XG4gICAqL1xuICBfc2VuZExvYWQobG9hZFF1ZXJ5ID0gbnVsbCkge1xuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBldmVudF9pZCA9IHV1aWR2NCgpO1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgICAgZXZlbnRfdHlwZTogXCJsb2FkXCIsXG4gICAgICAgICAgICBldmVudF9pZCxcbiAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiBsb2FkUXVlcnkgPz8gdGhpcy5tb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W2V2ZW50X2lkXSA9IFsoZGF0YSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICB9LCByZWplY3RdO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBsaXN0LXZpZXcgZW5kcG9pbnQgZm9yIHRoZSBjdXJyZW50IG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIF9zZW5kTGlzdFZpZXcoe1xuICAgICAgICAgICAgICAgICAgbW9kZWxRdWVyeSA9IHt9LFxuICAgICAgICAgICAgICAgICAgY2JSZXNvbHZlID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgIGNiUmVqZWN0ID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29udGV4dCA9IHt9LFxuICAgICAgICAgICAgICAgIH0pIHtcbiAgICByZXR1cm4gdGhpcy52aWV3KHtcbiAgICAgIG1vZGVsUXVlcnksXG4gICAgICBjYlJlc29sdmUsXG4gICAgICBjYlJlamVjdCxcbiAgICAgIHRlbXBsYXRlQ29udGV4dCxcbiAgICAgIGV2ZW50VHlwZTogXCJsaXN0X3ZpZXdcIixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYSBuYW1lZCBtb2RlbCB2aWV3IGFuZCBhcHBlbmQgaXRzIEhUTUwgdG8gYSBjb250YWluZXIgZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICB2aWV3KHtcbiAgICAgICAgIHZpZXdOYW1lID0gXCJodG1sX2xpc3RfdGVtcGxhdGVcIixcbiAgICAgICAgIG1vZGVsUXVlcnkgPSB7fSxcbiAgICAgICAgIGNiUmVzb2x2ZSA9IG51bGwsXG4gICAgICAgICBjYlJlamVjdCA9IG51bGwsXG4gICAgICAgICB0ZW1wbGF0ZUNvbnRleHQgPSB7fSxcbiAgICAgICAgIGV2ZW50VHlwZSA9IFwibmFtZWRfdmlld1wiLFxuICAgICAgIH0pIHtcbiAgICBsZXQgJGRpdkxpc3QgPSAkKCc8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnRfaWQgPSB1dWlkdjQoKTtcbiAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgIGV2ZW50X3R5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgICBldmVudF9pZCxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICB2aWV3X25hbWU6IHZpZXdOYW1lLFxuICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICBtb2RlbF9xdWVyeTogbW9kZWxRdWVyeSxcbiAgICAgICAgICAgIHRlbXBsYXRlX2NvbnRleHQ6IHRlbXBsYXRlQ29udGV4dCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gW1xuICAgICAgICAoZGF0YSkgPT4ge1xuICAgICAgICAgICRkaXZMaXN0LmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICAgIGFwcC5yZWZyZXNoKCRkaXZMaXN0KTtcbiAgICAgICAgICBjYlJlc29sdmUgJiYgY2JSZXNvbHZlKGRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgY2JSZWplY3QgJiYgY2JSZWplY3QocmVzKTtcbiAgICAgICAgfSxcbiAgICAgIF07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gJGRpdkxpc3Q7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIHRoZSBkZXRhaWwtdmlldyBlbmRwb2ludCBmb3IgYSBzaW5nbGUgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgX3NlbmREZXRhaWxWaWV3KHtcbiAgICAgICAgICAgICAgICAgICAgcGsgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICBpZCA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNiUmVzb2x2ZSA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNiUmVqZWN0ID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVDb250ZXh0ID0ge30sXG4gICAgICAgICAgICAgICAgICB9KSB7XG4gICAgcGsgPz89IGlkO1xuICAgIHBrID0gbm9ybWFsaXplUGsocGspO1xuICAgIGxldCAkZGl2TGlzdCA9ICQoJzxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcblxuICAgIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50X2lkID0gdXVpZHY0KCk7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICBldmVudF90eXBlOiBcImRldGFpbF92aWV3XCIsXG4gICAgICAgICAgZXZlbnRfaWQsXG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgaWQ6IHBrLFxuICAgICAgICAgICAgcGssXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jb250ZXh0OiB0ZW1wbGF0ZUNvbnRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICB0aGlzLm9wZW5SZXF1ZXN0W2V2ZW50X2lkXSA9IFtcbiAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAkZGl2TGlzdC5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgICAgICBhcHAucmVmcmVzaCgkZGl2TGlzdCk7XG4gICAgICAgICAgY2JSZXNvbHZlICYmIGNiUmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgIGNiUmVqZWN0ICYmIGNiUmVqZWN0KHJlcyk7XG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZMaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgbW9kZWwgZm9ybSBmcmFnbWVudCBhbmQgYXR0YWNoIHRoZSBTREMgZm9ybSBtZXRhZGF0YSBleHBlY3RlZCBieVxuICAgKiB0aGUgcmVzdCBvZiB0aGUgY2xpZW50LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRUeXBlXG4gICAqIEBwYXJhbSB7U2RjTW9kZWx9IG1vZGVsT2JqXG4gICAqIEBwYXJhbSBmb3JtTmFtZVxuICAgKiBAcGFyYW0gJGRpdkZvcm1cbiAgICogQHBhcmFtIGNiUmVzb2x2ZVxuICAgKiBAcGFyYW0gY2JSZWplY3RcbiAgICogQHBhcmFtIGZvcm1JZFxuICAgKi9cbiAgZ2V0Rm9ybSh7IG1vZGVsT2JqLCBldmVudFR5cGUsIGZvcm1OYW1lLCAkZGl2Rm9ybSwgY2JSZXNvbHZlLCBjYlJlamVjdCwgZm9ybUlkIH0pIHtcbiAgICBjb25zdCBldmVudF9pZCA9IHV1aWR2NCgpO1xuICAgIGNvbnN0IHBrID0gbW9kZWxPYmouaWQgPz8gLTE7XG4gICAgdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgZXZlbnRfdHlwZTogZXZlbnRUeXBlLFxuICAgICAgICAgIGV2ZW50X2lkLFxuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgaWQ6IHBrLFxuICAgICAgICAgICAgcGssXG4gICAgICAgICAgICBmb3JtX25hbWU6IGZvcm1OYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNsYXNzTmFtZSA9IHBrID09PSBudWxsIHx8IHBrID09PSAtMSA/IFwiY3JlYXRlXCIgOiBcImVkaXRcIjtcblxuICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gW1xuICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgJGRpdkZvcm0uYXBwZW5kKGRhdGEuaHRtbCk7XG4gICAgICAgIGxldCAkZm9ybSA9ICRkaXZGb3JtXG4gICAgICAgICAgLmNsb3Nlc3QoXCJmb3JtXCIpXG4gICAgICAgICAgLmFkZENsYXNzKFxuICAgICAgICAgICAgYHNkYy1tb2RlbC0ke2NsYXNzTmFtZX0tZm9ybSBzZGMtbW9kZWwtZm9ybSAke2Zvcm1JZH1gLFxuICAgICAgICAgIClcbiAgICAgICAgICAuZGF0YShcIm1vZGVsXCIsIG1vZGVsT2JqKVxuICAgICAgICAgIC5kYXRhKFwibW9kZWxfcGtcIiwgcGspXG4gICAgICAgICAgLmRhdGEoXCJmb3JtX25hbWVcIiwgZm9ybU5hbWUpO1xuICAgICAgICBtb2RlbE9iai5hZGRGb3JtKCRmb3JtKTtcbiAgICAgICAgaWYgKCRmb3JtLmxlbmd0aCA+IDAgJiYgISRmb3JtWzBdLmhhc0F0dHJpYnV0ZShcInNkY19zdWJtaXRcIikpIHtcbiAgICAgICAgICAkZm9ybS5hdHRyKFwic2RjX3N1Ym1pdFwiLCBcInN1Ym1pdE1vZGVsRm9ybURpc3RyaWJ1dG9yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXBwLnJlZnJlc2goJGRpdkZvcm0pLnRoZW4oKCkgPT4gbnVsbCk7XG4gICAgICAgIGNiUmVzb2x2ZSAmJiBjYlJlc29sdmUoZGF0YSk7XG4gICAgICB9LFxuICAgICAgKHJlcykgPT4ge1xuICAgICAgICBjYlJlamVjdCAmJiBjYlJlamVjdChyZXMpO1xuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgc2luZ2xlIG1vZGVsIGluc3RhbmNlIG1hdGNoaW5nIHRoZSBjdXJyZW50IHF1ZXJ5LlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1vZGVsUXVlcnlcbiAgICogQHBhcmFtIHs/Ym9vbGVhbn0gZG9Ob3RMb2FkIHRydWUgaWYgbW9kZWxRdWVyeSBjb250YWlucyBpZCBvciBwayBhbmQgb2JqZWN0IGRvZXMgbm90IG5lZWQgdG8gYmUgbG9hZGVkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZGNNb2RlbD59XG4gICAqL1xuICBhc3luYyBnZXQobW9kZWxRdWVyeSA9IG51bGwsIGRvTm90TG9hZCA9IGZhbHNlKSB7XG4gICAgaWYgKGRvTm90TG9hZCkge1xuICAgICAgY29uc3QgaWQgPSBtb2RlbFF1ZXJ5Py5pZCA/PyB0aGlzLm1vZGVsUXVlcnk/LmlkO1xuICAgICAgaWYobW9kZWxRdWVyeSkge1xuICAgICAgICB0aGlzLnNldEZpbHRlcihtb2RlbFF1ZXJ5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmJ5SWQoaWQpID8/IHRoaXMubmV3KG1vZGVsUXVlcnkgfHwgdGhpcy5tb2RlbFF1ZXJ5KTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5sb2FkKG1vZGVsUXVlcnkpO1xuICAgIGlmICh0aGlzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtb2RlbCBxdWVyeSByZXR1cm5zICR7dGhpcy5sZW5ndGh9IGJ1dCBvbmx5IDEgZXhwZWN0ZWQuYCk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRGaWx0ZXIoeyBpZDogdGhpcy52YWx1ZXNMaXN0WzBdLmlkIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdFswXTtcbiAgfVxuXG4gIGRldGFpbFZpZXcoeyBwaywgY2JSZXNvbHZlID0gbnVsbCwgY2JSZWplY3QgPSBudWxsLCB0ZW1wbGF0ZUNvbnRleHQgPSB7fSB9KSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmREZXRhaWxWaWV3KHtcbiAgICAgIGlkOiBwayxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgdGVtcGxhdGVDb250ZXh0LFxuICAgIH0pO1xuICB9XG5cbiAgbGlzdFZpZXcoeyBtb2RlbFF1ZXJ5ID0ge30sIHNlYXJjaFZhbHVlcyA9IHt9LCBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwsIHRlbXBsYXRlQ29udGV4dCA9IHt9IH0pIHtcbiAgICByZXR1cm4gdGhpcy5fc2VuZExpc3RWaWV3KHtcbiAgICAgIG1vZGVsUXVlcnk6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMubW9kZWxRdWVyeSwgbW9kZWxRdWVyeSwgeyAnX19zZWFyY2hfdmFsdWVzJzogc2VhcmNoVmFsdWVzIH0pLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICB0ZW1wbGF0ZUNvbnRleHQsXG4gICAgfSk7XG4gIH1cblxuICBzYXZlKHsgcGsgPSBudWxsLCBpZCA9IG51bGwsIGZvcm1OYW1lID0gXCJlZGl0X2Zvcm1cIiwgZGF0YSA9IG51bGwgfSA9IHt9KSB7XG4gICAgcGsgPz89IGlkO1xuICAgIGNvbnN0IG5vcm1QayA9IG5vcm1hbGl6ZVBrKHBrKTtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgbGV0IGVsZW1MaXN0O1xuICAgICAgaWYgKG5vcm1QayA+IC0xKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLmJ5SWQobm9ybVBrKTtcbiAgICAgICAgaWYgKCFlbGVtKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBTZGNNb2RlbEVycm9yKGBFbGVtZW50IG5vdCBmb3VuZCB3aXRoIElEOiAke25vcm1Qa31gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbUxpc3QgPSBbZWxlbV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtTGlzdCA9IHRoaXMudmFsdWVzTGlzdDtcbiAgICAgIH1cbiAgICAgIGxldCBwTGlzdCA9IFtdO1xuICAgICAgZWxlbUxpc3QuZm9yRWFjaCgoZWxlbSkgPT4ge1xuICAgICAgICBjb25zdCBldmVudF9pZCA9IHV1aWR2NCgpO1xuICAgICAgICBwTGlzdC5wdXNoKFxuICAgICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3JlYWRGaWxlcyhlbGVtKS50aGVuKChmaWxlcykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBzZW5kRGF0YSA9IGRhdGEgPyB7IC4uLmRhdGEgfSA6IGVsZW0uc2VyaWFsaXplKCk7XG4gICAgICAgICAgICAgIHNlbmREYXRhLmlkID0gZWxlbS5pZDtcbiAgICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgICAgICAgICAgZXZlbnRfdHlwZTogXCJzYXZlXCIsXG4gICAgICAgICAgICAgICAgICBldmVudF9pZCxcbiAgICAgICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybV9uYW1lOiBmb3JtTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHNlbmREYXRhLFxuICAgICAgICAgICAgICAgICAgICBpZDogc2VuZERhdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgIHBrOiBzZW5kRGF0YS5pZCxcbiAgICAgICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W2V2ZW50X2lkXSA9IFtcbiAgICAgICAgICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiByZXMuZGF0YS5pbnN0YW5jZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgID8gSlNPTi5wYXJzZShyZXMuZGF0YS5pbnN0YW5jZSlcbiAgICAgICAgICAgICAgICAgICAgICA6IHJlcy5kYXRhLmluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgcmVzLmRhdGEuaW5zdGFuY2UgPSB0aGlzLl9wYXJzZVNlcnZlclJlcyhkYXRhKTtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChwTGlzdCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGVsZW0gez9TZGNNb2RlbH1cbiAgICogQHBhcmFtIGRhdGEgez9vYmplY3R9XG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHVua25vd24+fVxuICAgKi9cbiAgY3JlYXRlKHsgZWxlbSA9IG51bGwsIGRhdGEgPSBudWxsIH0gPSB7fSkge1xuICAgIGNvbnN0IGV2ZW50X2lkID0gdXVpZHY0KCk7XG4gICAgaWYgKCFlbGVtKSB7XG4gICAgICBlbGVtID0gdGhpcy5uZXcoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLl9yZWFkRmlsZXMoZWxlbSkudGhlbigoZmlsZXMpID0+IHtcbiAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgICAgICBldmVudF90eXBlOiBcImNyZWF0ZVwiLFxuICAgICAgICAgICAgICBldmVudF9pZCxcbiAgICAgICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YSA/PyBlbGVtPy5zZXJpYWxpemUoKSA/PyB7fSxcbiAgICAgICAgICAgICAgICBmaWxlczogZmlsZXMsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtldmVudF9pZF0gPSBbXG4gICAgICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBkYXRhID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgcmVzLmRhdGEuaW5zdGFuY2UgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgID8gSlNPTi5wYXJzZShyZXMuZGF0YS5pbnN0YW5jZSlcbiAgICAgICAgICAgICAgICAgIDogcmVzLmRhdGEuaW5zdGFuY2U7XG4gICAgICAgICAgICAgIGlmIChlbGVtKSB7XG4gICAgICAgICAgICAgICAgZWxlbS5pZCA9IGRhdGFbMF0/LmlkIHx8IGRhdGFbMF0/LnBrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcy5kYXRhLmluc3RhbmNlID0gdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoZGF0YSlbMF07XG4gICAgICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgXTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgdGhlIHdlYnNvY2tldCBpcyBvcGVuIGFuZCBoYXMgY29tcGxldGVkIHRoZSBzZXJ2ZXItc2lkZSBjb25uZWN0XG4gICAqIGhhbmRzaGFrZSBiZWZvcmUgaXNzdWluZyBtb2RlbCByZXF1ZXN0cy5cbiAgICpcbiAgICogTXVsdGlwbGUgY2FsbGVycyBjYW4gYXJyaXZlIHdoaWxlIGEgY29ubmVjdGlvbiBhdHRlbXB0IGlzIGFscmVhZHkgaW5cbiAgICogcHJvZ3Jlc3MuIEluIHRoYXQgY2FzZSB0aGV5IGFyZSBxdWV1ZWQgYmVoaW5kIHRoZSBzYW1lIHN5bnRoZXRpYyByZXF1ZXN0IGlkLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGlzQ29ubmVjdGVkKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5faXNDb25uZWN0ZWQpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgIXRoaXMuX2lzQ29ubmVjdGluZ1Byb2Nlc3MgfHxcbiAgICAgICAgIXRoaXMub3BlblJlcXVlc3RbQ09OTkVDVElOR19SRVFVRVNUX0lEXVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuX2lzQ29ubmVjdGluZ1Byb2Nlc3MgPSB0cnVlO1xuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W0NPTk5FQ1RJTkdfUkVRVUVTVF9JRF0gPSBbKCkgPT4ge1xuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH1dO1xuICAgICAgICB0aGlzLl9jb25uZWN0VG9TZXJ2ZXIoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKHRoaXMuX2NoZWNrQ29ubmVjdGlvbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBbcmVzb2x2ZU9yaWdpbiwgcmVqZWN0T3JpZ2luXSA9XG4gICAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtDT05ORUNUSU5HX1JFUVVFU1RfSURdO1xuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W0NPTk5FQ1RJTkdfUkVRVUVTVF9JRF0gPSBbXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZU9yaWdpbigpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVqZWN0T3JpZ2luKCk7XG4gICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSB3ZWJzb2NrZXQgYW5kIGRpc2FibGUgYXV0b21hdGljIHJlY29ubmVjdCBmb3IgdGhpcyBxdWVyeXNldC5cbiAgICovXG4gIGNsb3NlKCkge1xuICAgIGlmICh0aGlzLnNvY2tldCkge1xuICAgICAgdGhpcy5fYXV0b1JlY29ubmVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9ICgpID0+IHtcbiAgICAgIH07XG4gICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgZGVsZXRlIHRoaXNbXCJzb2NrZXRcIl07XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZXNMaXN0LmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgIGVsZW0uX29uQ2xvc2UoKVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZCBhdHRhY2hlZCBgRmlsZWAgdmFsdWVzIGluIGZpeGVkLXNpemUgY2h1bmtzIGJlZm9yZSBzYXZlL2NyZWF0ZSBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHtTZGNNb2RlbH0gZWxlbVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fVxuICAgKi9cbiAgX3JlYWRGaWxlcyhlbGVtKSB7XG4gICAgbGV0IHRvU29sdmUgPSBbXTtcbiAgICBsZXQgZmlsZXMgPSB7fTtcbiAgICBpZiAoIWVsZW0pIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmlsZXMpO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyhlbGVtLmNvbnN0cnVjdG9yLmZpZWxkcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGVsZW1ba2V5XTtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgdG9Tb2x2ZS5wdXNoKFxuICAgICAgICAgIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50X2lkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W2V2ZW50X2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuXG4gICAgICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCB2YWx1ZS5hcnJheUJ1ZmZlcigpO1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgICAgICBsZXQgbnVtYmVyT2ZDaHVua3MgPSBNYXRoLmNlaWwocmVzdWx0Lmxlbmd0aCAvIE1BWF9GSUxFX1VQTE9BRCk7XG4gICAgICAgICAgICBmaWxlc1trZXldID0ge1xuICAgICAgICAgICAgICBpZDogZXZlbnRfaWQsXG4gICAgICAgICAgICAgIGZpbGVfbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgZmllbGRfbmFtZToga2V5LFxuICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aDogdmFsdWUuc2l6ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bWJlck9mQ2h1bmtzOyArK2kpIHtcbiAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBBcnJheS5mcm9tKHJlc3VsdC5zbGljZShcbiAgICAgICAgICAgICAgICBNQVhfRklMRV9VUExPQUQgKiBpLFxuICAgICAgICAgICAgICAgIE1BWF9GSUxFX1VQTE9BRCAqIChpICsgMSksXG4gICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICBldmVudF90eXBlOiBcInVwbG9hZFwiLFxuICAgICAgICAgICAgICAgICAgZXZlbnRfaWQsXG4gICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIGNodW5rLFxuICAgICAgICAgICAgICAgICAgICBpZHg6IGksXG4gICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9jaHVua3M6IG51bWJlck9mQ2h1bmtzLFxuICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWU6IHZhbHVlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkX25hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudF9sZW5ndGg6IHZhbHVlLnNpemUsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZTogdmFsdWUudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgbW9kZWxfbmFtZTogdGhpcy5tb2RlbE5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHRvU29sdmUpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlIHdlYnNvY2tldCByZXNwb25zZXMgdG8gdGhlIG1hdGNoaW5nIHBlbmRpbmcgcmVxdWVzdCBhbmQgdXBkYXRlIGxvY2FsXG4gICAqIHN0YXRlIHdoZW4gdGhlIHNlcnZlciBzZW5kcyBtb2RlbCBwYXlsb2Fkcy5cbiAgICpcbiAgICogQHBhcmFtIHtNZXNzYWdlRXZlbnR9IGVcbiAgICovXG4gIGFzeW5jIF9vbk1lc3NhZ2UoZSkge1xuICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgIGlmIChkYXRhLmlzX2Vycm9yKSB7XG4gICAgICBpZiAodGhpcy5vcGVuUmVxdWVzdC5oYXNPd25Qcm9wZXJ0eShkYXRhLmV2ZW50X2lkKSkge1xuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W2RhdGEuZXZlbnRfaWRdWzFdKG5ldyBTZGNNb2RlbEVycm9yKGRhdGEpKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdChkYXRhLmV2ZW50X2lkKTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICB0cmlnZ2VyKFwicHVzaEVycm9yTXNnXCIsIGRhdGEuaGVhZGVyIHx8IFwiXCIsIGRhdGEubXNnIHx8IFwiXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS50eXBlID09PSBcImNvbm5lY3RcIikge1xuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W0NPTk5FQ1RJTkdfUkVRVUVTVF9JRF1bMV0obmV3IFNkY01vZGVsRXJyb3IoZGF0YSkpO1xuICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KENPTk5FQ1RJTkdfUkVRVUVTVF9JRCk7XG4gICAgICAgIHRoaXMuX2F1dG9SZWNvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICAgIHRyaWdnZXIoXCJwdXNoTXNnXCIsIGRhdGEuaGVhZGVyIHx8IFwiXCIsIGRhdGEubXNnIHx8IFwiXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS50eXBlID09PSBcImNvbm5lY3RcIikge1xuICAgICAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2lzQ29ubmVjdGluZ1Byb2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtDT05ORUNUSU5HX1JFUVVFU1RfSURdWzBdKGRhdGEpO1xuICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KENPTk5FQ1RJTkdfUkVRVUVTVF9JRCk7XG4gICAgICB9IGVsc2UgaWYgKFtcImxvYWRcIiwgXCJuYW1lZF92aWV3XCIsIFwiZGV0YWlsX3ZpZXdcIl0uaW5jbHVkZXMoZGF0YS50eXBlKSkge1xuICAgICAgICBjb25zdCBqc29uUmVzID0gSlNPTi5wYXJzZShkYXRhLmFyZ3MuZGF0YSk7XG4gICAgICAgIGRhdGEuYXJncy5kYXRhID0gYXdhaXQgdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoanNvblJlcyk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gXCJvbl91cGRhdGVcIiB8fCBkYXRhLnR5cGUgPT09IFwib25fY3JlYXRlXCIpIHtcbiAgICAgICAgY29uc3QganNvblJlcyA9IEpTT04ucGFyc2UoZGF0YS5hcmdzLmRhdGEpO1xuXG4gICAgICAgIGxldCBvYmogPSBhd2FpdCB0aGlzLl9wYXJzZVNlcnZlclJlcyhqc29uUmVzKTtcbiAgICAgICAgbGV0IGNiO1xuXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09IFwib25fY3JlYXRlXCIpIHtcbiAgICAgICAgICBjYiA9IHRoaXMub25DcmVhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2IgPSB0aGlzLm9uVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2Iob2JqKTtcbiAgICAgICAgZGF0YS5hcmdzLmRhdGEgPSBvYmo7XG4gICAgICB9XG5cbiAgICAgIGxldCBpbnN0YW5jZSA9IGRhdGEuZGF0YT8uaW5zdGFuY2U7XG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgZGF0YS5kYXRhLmluc3RhbmNlID0gSlNPTi5wYXJzZShkYXRhLmRhdGEuaW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vcGVuUmVxdWVzdC5oYXNPd25Qcm9wZXJ0eShkYXRhLmV2ZW50X2lkKSkge1xuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W2RhdGEuZXZlbnRfaWRdWzBdKGRhdGEpO1xuICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KGRhdGEuZXZlbnRfaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0IHVudGlsIGFsbCBpbi1mbGlnaHQgd2Vic29ja2V0IHJlcXVlc3RzIGZvciB0aGlzIHF1ZXJ5c2V0IGFyZSByZXNvbHZlZC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBub09wZW5SZXF1ZXN0cygpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm9wZW5SZXF1ZXN0KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb25Ob09wZW5SZXF1ZXN0cy5wdXNoKHJlc29sdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGNvbXBsZXRlZCByZXF1ZXN0IGFuZCB3YWtlIGFueSBgbm9PcGVuUmVxdWVzdHMoKWAgd2FpdGVycyB3aGVuIHRoZVxuICAgKiByZXF1ZXN0IG1hcCBiZWNvbWVzIGVtcHR5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRJZFxuICAgKi9cbiAgX2Nsb3NlT3BlblJlcXVlc3QoZXZlbnRJZCkge1xuICAgIGRlbGV0ZSB0aGlzLm9wZW5SZXF1ZXN0W2V2ZW50SWRdO1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm9wZW5SZXF1ZXN0KS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMuZm9yRWFjaCgoeCkgPT4geCgpKTtcbiAgICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMgPSBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXN0YWJsaXNoIHRoZSByYXcgd2Vic29ja2V0IGNvbm5lY3Rpb24gZm9yIHRoaXMgcXVlcnlzZXQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgX2Nvbm5lY3RUb1NlcnZlcigpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsSWRlbnRpZmllciA9XG4gICAgICAgIGAke3RoaXMubW9kZWxOYW1lfWAgKyAodGhpcy5tb2RlbElkID4gMCA/IGAvJHt0aGlzLm1vZGVsSWR9YCA6IFwiXCIpO1xuICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gXCJodHRwczpcIikge1xuICAgICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQoXG4gICAgICAgICAgYHdzczovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy9tb2RlbC8ke21vZGVsSWRlbnRpZmllcn1gLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KFxuICAgICAgICAgIGB3czovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy9tb2RlbC8ke21vZGVsSWRlbnRpZmllcn1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLl9vbk1lc3NhZ2UuYmluZCh0aGlzKTtcblxuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFNEQyBNb2RlbCAoJHt0aGlzLm1vZGVsTmFtZX0sICR7dGhpcy5tb2RlbElkfSkgU29ja2V0IGNsb3NlZCB1bmV4cGVjdGVkbHlgLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IFtfa2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5vcGVuUmVxdWVzdCkpIHtcbiAgICAgICAgICB2YWx1ZVsxXShlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0ID0ge307XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2F1dG9SZWNvbm5lY3QpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RUb1NlcnZlcigpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDAwKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9uZXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYE1vZGVsIFNvY2tldCBlbmNvdW50ZXJlZCBlcnJvcjogJHtlcnJ9IENsb3Npbmcgc29ja2V0YCk7XG4gICAgICAgIGlmICh0aGlzLl9pc0Nvbm5lY3RlZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIHRoZSBhcHBsaWNhdGlvbi1sZXZlbCBjb25uZWN0IGhhbmRzaGFrZSBvbmNlIHRoZSB3ZWJzb2NrZXQgb3BlbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICAgKi9cbiAgX2NoZWNrQ29ubmVjdGlvbigpIHtcbiAgICBjb25zdCBldmVudF9pZCA9IHV1aWR2NCgpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICBldmVudF90eXBlOiBcImNvbm5lY3RcIixcbiAgICAgICAgICBldmVudF9pZCxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICB0aGlzLm9wZW5SZXF1ZXN0W2V2ZW50X2lkXSA9IFtyZXNvbHZlLCByZWplY3RdO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgdGhlIGJhY2tlbmQgbW9kZWwgcGF5bG9hZCBpbnRvIGxvY2FsbHkgdHJhY2tlZCBtb2RlbCBvYmplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PG9iamVjdD59IHJlc3VsdHNcbiAgICovXG4gIF9wYXJzZVNlcnZlclJlcyhyZXN1bHRzKSB7XG4gICAgY29uc3QgbmV3TW9kZWxzID0gW11cbiAgICBmb3IgKGNvbnN0IHggb2YgcmVzdWx0cykge1xuICAgICAgY29uc3QgTW9kZWxDbGFzcyA9IGdldE1vZGVsKHRoaXMubW9kZWxOYW1lKTtcbiAgICAgIGlmICghTW9kZWxDbGFzcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5tb2RlbE5hbWV9IGlzIG5vIFNkY01vZGVsLiBteWJlIHRoZSBtb2RlbHMgYXIgbm90IGltcG9ydGFkLmApO1xuICAgICAgfVxuICAgICAgY29uc3QgbmV3TW9kZWwgPSBuZXcgTW9kZWxDbGFzcyh7ICdpZCc6IHguaWQgPz8geC5waywgLi4ueC5maWVsZHMgfSk7XG4gICAgICBjb25zdCBjdXJyZW50TW9kZWwgPSB0aGlzLmJ5SWQobmV3TW9kZWwuaWQpO1xuICAgICAgaWYgKGN1cnJlbnRNb2RlbCkge1xuICAgICAgICBjdXJyZW50TW9kZWwuc2V0VmFsdWVzKG5ld01vZGVsKTtcbiAgICAgICAgbmV3TW9kZWxzLnB1c2goY3VycmVudE1vZGVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudmFsdWVzTGlzdC5wdXNoKG5ld01vZGVsKTtcbiAgICAgICAgbmV3TW9kZWwuX3NldFF1ZXJ5U2V0KHRoaXMsIHRydWUpO1xuICAgICAgICBuZXdNb2RlbHMucHVzaChuZXdNb2RlbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudmFsdWVzTGlzdC5zb3J0KChhLCBiKSA9PiBhLl9pZCAtIGIuX2lkKTtcbiAgICByZXR1cm4gbmV3TW9kZWxzO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNkY01vZGVsIHtcbiAgc3RhdGljIGZpZWxkcyA9IHt9O1xuXG4gIC8qKlxuICAgKiBCYXNlIG1vZGVsIHdyYXBwZXIgdXNlZCBieSBTREMgbW9kZWwgcmVnaXN0cmF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZGVsTmFtZVxuICAgKi9cbiAgY29uc3RydWN0b3IobW9kZWxOYW1lKSB7XG4gICAgdGhpcy5faWQgPSBudWxsO1xuICAgIHRoaXMuX2Zvcm1zID0gW107XG4gICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLmZvcm1JZCA9IHV1aWR2NCgpO1xuICAgIHRoaXMubW9kZWxOYW1lID0gbW9kZWxOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0P30gbW9kZWxRdWVyeVNldFxuICAgKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRcbiAgICogQHJldHVybnMge1NkY1F1ZXJ5U2V0fVxuICAgKi9cbiAgc3RhdGljIHF1ZXJ5U2V0KG1vZGVsUXVlcnlTZXQgPSBudWxsLCBwYXJlbnQgPSBudWxsKSB7XG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJldHVybiBuZXcgU2RjUXVlcnlTZXQodGhpcy5tb2RlTmFtZSwgbW9kZWxRdWVyeVNldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudC5xdWVyeVNldCh0aGlzLm1vZGVOYW1lLCBtb2RlbFF1ZXJ5U2V0KTtcbiAgfVxuXG4gIGFkZEZvcm0oJGZvcm0pIHtcbiAgICAvLyBSZW1vdmUgb2xkIGxpc3RlbmVycyBpZiBmb3JtIGFscmVhZHkgc2V0XG4gICAgY29uc3Qgb25DaGFuZ2UgPSB0aGlzLl9vbkNoYW5nZS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5fZm9ybXMucHVzaCgkZm9ybSk7XG5cbiAgICBpZiAoJGZvcm0pIHtcbiAgICAgIC8vIEF0dGFjaCBkZWxlZ2F0ZWQgZXZlbnQgaGFuZGxlciB0byBhbGwgaW5wdXRzXG4gICAgICAkZm9ybS5vbihcbiAgICAgICAgXCJpbnB1dC5mb3JtV2F0Y2hlciBjaGFuZ2UuZm9ybVdhdGNoZXJcIixcbiAgICAgICAgXCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYVwiLFxuICAgICAgICBvbkNoYW5nZVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBfb25DaGFuZ2UoZXZlbnQpIHtcbiAgICBjb25zdCB7IG5hbWUgfSA9IGV2ZW50LnRhcmdldDtcbiAgICBpZiAodGhpcy5jb25zdHJ1Y3Rvci5maWVsZHNbbmFtZV0pIHtcbiAgICAgIHRoaXNbYHNldCR7bmFtZX1gXShnZXRWYWx1ZUZyb21GaWVsZChldmVudC50YXJnZXQpKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlRm9ybShmaWVsZE5hbWUpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9mb3Jtcy5mb3JFYWNoKCgkZm9ybSkgPT4ge1xuICAgICAgJGZvcm0uZmluZChgW25hbWU9XCIke2ZpZWxkTmFtZX1cIl1gKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2V0VmFsdWVJbkZpZWxkKHRoaXMsIHNlbGZbZmllbGROYW1lXSlcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgc2V0VmFsdWVzKGRhdGEgPSB7fSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInNldFZhbHVlcygpIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NcIik7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIHRoZSBxdWVyeXNldCB0aGF0IG93bnMgdGhpcyBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtTZGNRdWVyeVNldH0gcXVlcnlTZXRcbiAgICogQHBhcmFtIHtib29sZWFufSBpc0xvYWRlZFxuICAgKi9cbiAgX3NldFF1ZXJ5U2V0KHF1ZXJ5U2V0LCBpc0xvYWRlZCkge1xuICAgIHRoaXMuX3F1ZXJ5U2V0ID0gbmV3IFdlYWtSZWYocXVlcnlTZXQpO1xuICAgIHRoaXMubG9hZGVkID0gaXNMb2FkZWQ7XG4gIH1cblxuICBnZXQgcXVlcnlTZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCk7XG4gIH1cblxuICBzYXZlKHsgZm9ybU5hbWUgPSBcImVkaXRfZm9ybVwiLCBkYXRhID0gbnVsbCB9ID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5zYXZlKHsgcGs6IHRoaXMuaWQsIGZvcm1OYW1lLCBkYXRhIH0pO1xuICB9XG5cbiAgY3JlYXRlKHsgZGF0YSA9IG51bGwgfSA9IHt9KSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuY3JlYXRlKHsgZWxlbTogdGhpcywgZGF0YSB9KTtcbiAgfVxuXG4gIGRlbGV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5kZWxldGUoeyBlbGVtOiB0aGlzIH0pO1xuICB9XG5cbiAgbG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS51cGRhdGUoeyBpdGVtOiB0aGlzIH0pO1xuICB9XG5cbiAgdXBkYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICBzZXQgaWQoZGF0YSkge1xuICAgIHRoaXMuX2lkID0gZGF0YTtcbiAgfVxuXG4gIHNldCBwayhkYXRhKSB7XG4gICAgdGhpcy5pZCA9IGRhdGE7XG4gIH1cblxuICBnZXQgcGsoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuY2xvc2UoKTtcbiAgfVxuXG4gIF9vbkNsb3NlKCkge1xuICAgIE9iamVjdC5rZXlzKHRoaXMuY29uc3RydWN0b3IuZmllbGRzKVxuICAgICAgLmZpbHRlcigoeCkgPT4gdGhpc1tgXyR7eH1gXSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KVxuICAgICAgLmZvckVhY2goKHgpID0+IHRoaXNbYF8ke3h9YF0uY2xvc2UoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB0aGUgc2VydmVyLXJlbmRlcmVkIGRldGFpbCB2aWV3IGZvciB0aGlzIG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGRldGFpbFZpZXcoeyBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwsIHRlbXBsYXRlQ29udGV4dCA9IHt9IH0pIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5kZXRhaWxWaWV3KHsgcGs6IHRoaXMuaWQsIGNiUmVzb2x2ZSwgY2JSZWplY3QsIHRlbXBsYXRlQ29udGV4dCB9KTtcbiAgfVxuXG4gIHNlcmlhbGl6ZSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5jb25zdHJ1Y3Rvci5maWVsZHMpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXNba2V5XTtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB7XG4gICAgICAgIGlmICh2YWwubWFueV90b19tYW55IHx8IHZhbC5vbmVfdG9fbWFueSkge1xuICAgICAgICAgIGFjY1trZXldID0gdmFsdWUuZ2V0SWRzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgYWxsSWRzID0gdmFsdWUuZ2V0SWRzKCk7XG4gICAgICAgICAgaWYgKGFsbElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IGFsbElkc1swXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWNjW2tleV0gPSBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHZhbC5pc19yZWxhdGlvbiAmJiB2YWx1ZSBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWUuaWQgPz8gbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2NcbiAgICB9LCB7fSk7XG4gIH1cblxuICB0b0pzb24oKSB7XG4gICAgY29uc3QgcmVzID0ge31cbiAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5jb25zdHJ1Y3Rvci5maWVsZHMpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuXG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWUubmFtZTtcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZGNNb2RlbCkge1xuICAgICAgICByZXNba2V5XSA9IHZhbHVlLmlkO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWUuZ2V0SWRzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogQmFja3dhcmRzLWNvbXBhdGlibGUgYWxpYXMgZm9yIHN5bmNpbmcgdmFsdWVzIGZyb20gYSBmb3JtIGludG8gdGhlIG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0geyp9ICRmb3Jtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHN5bmNGb3JtVG9Nb2RlbCgkZm9ybXMpIHtcbiAgICByZXR1cm4gdGhpcy5zeW5jRm9ybSgkZm9ybXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgdGhlIGZvcm0gY29sbGVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHsqfSAkZm9ybXNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBfcmVzb2x2ZUZvcm1zKCRmb3Jtcykge1xuICAgIGlmICghJGZvcm1zIHx8ICEkZm9ybXMuaGFzQ2xhc3ModGhpcy5mb3JtSWQpKSB7XG4gICAgICByZXR1cm4gJChgLiR7dGhpcy5mb3JtSWR9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICRmb3JtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IHRoZSBjdXJyZW50IG1vZGVsIHN0YXRlIGludG8gbWF0Y2hpbmcgZm9ybSBmaWVsZHMuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gJGZvcm1zXG4gICAqL1xuICBzeW5jTW9kZWxUb0Zvcm0oJGZvcm1zKSB7XG4gICAgJGZvcm1zID0gdGhpcy5fcmVzb2x2ZUZvcm1zKCRmb3Jtcyk7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmNvbnN0cnVjdG9yLmZpZWxkcztcbiAgICAkZm9ybXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwayA9IG5vcm1hbGl6ZVBrKCQodGhpcykuZGF0YShcIm1vZGVsX3BrXCIpKTtcbiAgICAgIGlmIChzZWxmLmlkICE9PSBwaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGZvcm1JdGVtIG9mIHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgbGV0IG5hbWUgPSBmb3JtSXRlbS5uYW1lO1xuICAgICAgICBpZiAobmFtZSAmJiBuYW1lICE9PSBcIlwiICYmICEhZmllbGRzW25hbWVdKSB7XG4gICAgICAgICAgc2V0VmFsdWVJbkZpZWxkKGZvcm1JdGVtLCBzZWxmW25hbWVdKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29weSBtYXRjaGluZyBmb3JtIHZhbHVlcyBiYWNrIG9udG8gdGhlIGN1cnJlbnQgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEhpZGRlbiBpbnB1dHMgYXJlIHBhcnNlZCB0byB0aGVpciBvcmlnaW5hbCBwcmltaXRpdmUgdHlwZSB3aGVuIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAcGFyYW0geyp9ICRmb3Jtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHN5bmNGb3JtKCRmb3Jtcykge1xuICAgICRmb3JtcyA9IHRoaXMuX3Jlc29sdmVGb3JtcygkZm9ybXMpO1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5jb25zdHJ1Y3Rvci5maWVsZHM7XG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSB7fVxuXG4gICAgZnVuY3Rpb24gc2V0VmFsdWVJbkZvcm0obmFtZSwgdmFsdWUpIHtcbiAgICAgIGlmICghIWZpZWxkc1tuYW1lXSkge1xuICAgICAgICBzZWxmW25hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm5WYWx1ZVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgICRmb3Jtcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBrID0gbm9ybWFsaXplUGsoJCh0aGlzKS5kYXRhKFwibW9kZWxfcGtcIikpO1xuICAgICAgaWYgKHNlbGYuaWQgIT09IHBrICYmIChzZWxmLmlkICE9PSBudWxsIHx8IHBrICE9PSAtMSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBmb3JtSXRlbSBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgIHNldFZhbHVlSW5Gb3JtKGZvcm1JdGVtLm5hbWUsIGdldFZhbHVlRnJvbUZpZWxkKGZvcm1JdGVtKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgY29ycmVjdCBzZXJ2ZXItc2lkZSBmb3JtIGZvciB0aGlzIG1vZGVsIHN0YXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGZvcm0oeyBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaWQgPT09IG51bGwgfHwgdGhpcy5pZCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVGb3JtKHsgY2JSZWplY3QsIGNiUmVzb2x2ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRGb3JtKHsgY2JSZWplY3QsIGNiUmVzb2x2ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNyZWF0ZSBmb3JtIGZvciBhIG5ldyBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBfY3JlYXRlRm9ybSh7IGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCB9KSB7XG4gICAgbGV0ICRkaXZGb3JtID0gJChcIjxkaXY+XCIpO1xuICAgIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuZ2V0Rm9ybSh7XG4gICAgICBtb2RlbE9iajogdGhpcyxcbiAgICAgIGV2ZW50VHlwZTogXCJjcmVhdGVfZm9ybVwiLFxuICAgICAgZm9ybU5hbWU6IG51bGwsXG4gICAgICAkZGl2Rm9ybSxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgZm9ybUlkOiB0aGlzLmZvcm1JZCxcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2Rm9ybTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGVkaXQgZm9ybSBmb3IgYW4gZXhpc3RpbmcgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgX2VkaXRGb3JtKHsgY2JSZXNvbHZlID0gbnVsbCwgY2JSZWplY3QgPSBudWxsIH0pIHtcbiAgICBsZXQgJGRpdkZvcm0gPSAkKFwiPGRpdj5cIik7XG5cbiAgICB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmdldEZvcm0oe1xuICAgICAgbW9kZWxPYmo6IHRoaXMsXG4gICAgICBldmVudFR5cGU6IFwiZWRpdF9mb3JtXCIsXG4gICAgICBmb3JtTmFtZTogbnVsbCxcbiAgICAgICRkaXZGb3JtLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICBmb3JtSWQ6IHRoaXMuZm9ybUlkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZGb3JtO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIG5hbWVkIHNlcnZlci1zaWRlIGZvcm0gZm9yIHRoaXMgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgbmFtZWRGb3JtKHsgZm9ybU5hbWUsIGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCB9KSB7XG4gICAgbGV0ICRkaXZGb3JtID0gJCgnPGRpdiAgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcblxuICAgIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuZ2V0Rm9ybSh7XG4gICAgICBtb2RlbE9iajogdGhpcyxcbiAgICAgIGV2ZW50VHlwZTogXCJuYW1lZF9mb3JtXCIsXG4gICAgICBmb3JtTmFtZSxcbiAgICAgICRkaXZGb3JtLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICBmb3JtSWQ6IHRoaXMuZm9ybUlkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZGb3JtO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgZmllbGQgdmFsdWUgdXNpbmcgdGhlIHN1cHBsaWVkIGZpZWxkIGNvbmZpZy5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnXG4gICAqL1xuICB2YWxpZGF0ZSh2YWx1ZSwgY29uZmlnKSB7XG4gICAgY29uc3QgZXJyID0gdmFsaWRhdGVGaWVsZCh2YWx1ZSwgY29uZmlnKTtcbiAgICBpZiAoZXJyKSB0aHJvdyBuZXcgRXJyb3IoZXJyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgcmF3IGlucHV0IHZhbHVlIGludG8gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IHRoZSBmaWVsZCBjb25maWcuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHBhcnNlVmFsdWUodmFsdWUsIGNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGUsXG4gICAgICBtYW55X3RvX21hbnk6IG1hbnlUb01hbnksXG4gICAgICBvbmVfdG9fbWFueTogb25lVG9NYW55LFxuICAgICAgbWFueV90b19vbmU6IG1hbnlUb09uZSxcbiAgICAgIG9uZV90b19vbmU6IG9uZVRvT25lLFxuICAgIH0gPSBjb25maWc7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoKG1hbnlUb01hbnkgfHwgb25lVG9NYW55IHx8IG1hbnlUb09uZSB8fCBvbmVUb09uZSkgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIkNoYXJGaWVsZFwiOlxuICAgICAgY2FzZSBcIlRlZXh0RmllbGRcIjpcbiAgICAgIGNhc2UgXCJVVUlERmllbGRcIjpcbiAgICAgIGNhc2UgXCJFbWFpbEZpZWxkXCI6XG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuXG4gICAgICBjYXNlIFwiSW50ZWdlckZpZWxkXCI6XG4gICAgICBjYXNlIFwiQXV0b0ZpZWxkXCI6XG4gICAgICBjYXNlIFwiQmlnSW50ZWdlckZpZWxkXCI6XG4gICAgICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSwgMTApO1xuXG4gICAgICBjYXNlIFwiRmxvYXRGaWVsZFwiOlxuICAgICAgY2FzZSBcIkRlY2ltYWxGaWVsZFwiOlxuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSk7XG5cbiAgICAgIGNhc2UgXCJCb29sZWFuRmllbGRcIjpcbiAgICAgICAgcmV0dXJuICEhdmFsdWU7XG5cbiAgICAgIGNhc2UgXCJEYXRlRmllbGRcIjpcbiAgICAgIGNhc2UgXCJEYXRlVGltZUZpZWxkXCI6XG4gICAgICAgIHJldHVybiBEYXRlLnBhcnNlKHZhbHVlKTtcblxuICAgICAgY2FzZSBcIlVSTEZpZWxkXCI6XG4gICAgICAgIHJldHVybiBuZXcgVVJMKHZhbHVlKTtcblxuICAgICAgY2FzZSBcIkZpbGVGaWVsZFwiOlxuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEZpbGVMb2FkZWQuaXNWYWxpZCh2YWx1ZSkpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZpbGVMb2FkZWQodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZUxvYWRlZCkge1xuICAgICAgICAgIHJldHVybiBuZXcgRmlsZUxvYWRlZCh2YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIEZpbGUgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgICAgaWYgKGNvbmZpZy5tYXhfc2l6ZSAmJiB2YWx1ZS5zaXplID4gY29uZmlnLm1heF9zaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gYEZpbGUgdG9vIGxhcmdlIChtYXggJHtjb25maWcubWF4X3NpemV9IGJ5dGVzKWA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvbmZpZy5hbGxvd2VkX3R5cGVzICYmICFjb25maWcuYWxsb3dlZF90eXBlcy5pbmNsdWRlcyh2YWx1ZS50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBJbnZhbGlkIGZpbGUgdHlwZSAoJHt2YWx1ZS50eXBlfSlgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBcIkpTT05GaWVsZFwiOlxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGEgZmllbGQgdmFsdWUgYWdhaW5zdCB0aGUgZmllbGQgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgYmFja2VuZC5cbiAqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnXG4gKiBAcmV0dXJucyB7P3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVGaWVsZCh2YWx1ZSwgY29uZmlnKSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIHJlcXVpcmVkLFxuICAgIG1heF9sZW5ndGg6IG1heExlbmd0aCxcbiAgICBpc19yZWxhdGlvbjogaXNSZWxhdGlvbixcbiAgICBtYW55X3RvX21hbnk6IG1hbnlUb01hbnksXG4gICAgb25lX3RvX21hbnk6IG9uZVRvTWFueSxcbiAgICBtYW55X3RvX29uZTogbWFueVRvT25lLFxuICAgIG9uZV90b19vbmU6IG9uZVRvT25lLFxuICAgIHJlbGF0ZWRfbW9kZWw6IHJlbGF0ZWRNb2RlbCxcbiAgfSA9IGNvbmZpZztcblxuICB2b2lkIGlzUmVsYXRpb247XG5cbiAgaWYgKHJlcXVpcmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiBcIlRoaXMgZmllbGQgaXMgcmVxdWlyZWRcIjtcbiAgICB9XG4gIH1cblxuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gXCJcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKG1hbnlUb01hbnkgfHwgb25lVG9NYW55IHx8IG1hbnlUb09uZSB8fCBvbmVUb09uZSkge1xuICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgU2RjUXVlcnlTZXQpIHx8IHZhbHVlLm1vZGVsTmFtZSAhPT0gcmVsYXRlZE1vZGVsKSB7XG4gICAgICBpZih0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHZhbHVlID0gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICgobWFueVRvTWFueSB8fCBtYW55VG9PbmUpICYmIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLnNvbWUoKHgpID0+ICFOdW1iZXIuaXNOYU4ocGFyc2VJbnQoeCkpKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgTnVtYmVyLmlzTmFOKHBhcnNlSW50KHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBvYmplY3Qgb3IgSURcIjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgXCJDaGFyRmllbGRcIjpcbiAgICBjYXNlIFwiVGV4dEZpZWxkXCI6XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgYSBzdHJpbmdcIjtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhMZW5ndGggJiYgdmFsdWUubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBgTWF4IGxlbmd0aCBpcyAke21heExlbmd0aH1gO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiSW50ZWdlckZpZWxkXCI6XG4gICAgY2FzZSBcIkF1dG9GaWVsZFwiOlxuICAgIGNhc2UgXCJCaWdJbnRlZ2VyRmllbGRcIjpcbiAgICAgIGlmICghaXNGaW5pdGUocGFyc2VJbnQodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIGFuIGludGVnZXJcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkZsb2F0RmllbGRcIjpcbiAgICBjYXNlIFwiRGVjaW1hbEZpZWxkXCI6XG4gICAgICBpZiAoIWlzRmluaXRlKHBhcnNlRmxvYXQodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIGEgbnVtYmVyXCI7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJCb29sZWFuRmllbGRcIjpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgYSBib29sZWFuXCI7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJEYXRlRmllbGRcIjpcbiAgICBjYXNlIFwiRGF0ZVRpbWVGaWVsZFwiOlxuICAgICAgaWYgKGlzTmFOKERhdGUucGFyc2UodmFsdWUpKSkge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIGEgdmFsaWQgZGF0ZVwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiRW1haWxGaWVsZFwiOlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIiB8fCAhL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC8udGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIFwiSW52YWxpZCBlbWFpbFwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiVVJMRmllbGRcIjpcbiAgICAgIHRyeSB7XG4gICAgICAgIG5ldyBVUkwodmFsdWUpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBcIkludmFsaWQgVVJMXCI7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJVVUlERmllbGRcIjpcbiAgICAgIGlmICghL15bMC05YS1mXXs4fS1bMC05YS1mXXs0fS1bMS01XVswLTlhLWZdezN9LVs4OWFiXVswLTlhLWZdezN9LVswLTlhLWZdezEyfSQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBcIkludmFsaWQgVVVJRFwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiSlNPTkZpZWxkXCI6XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgSlNPTiBvYmplY3RcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJGaWxlRmllbGRcIjpcbiAgICAgIGlmICghRmlsZUxvYWRlZC5pc1ZhbGlkKHZhbHVlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEZpbGVMb2FkZWQpKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgYSB2YWxpZCBmaWxlXCI7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_model.js\n\n}");
|
|
87
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ SdcQuerySet: () => (/* binding */ SdcQuerySet),\n/* harmony export */ \"default\": () => (/* binding */ SdcModel)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_socket.js */ \"./src/simpleDomControl/sdc_socket.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\n\n\nconst MAX_FILE_UPLOAD = 25000;\nconst CONNECTING_REQUEST_ID = \"_connecting_process\";\n\n/**\n * Copy a model instance for another queryset. A new instance of the same class is\n * created from the serialized field values (structuredClone cannot copy the\n * WeakRef/Proxy members of a model).\n */\nconst cloneModel = (original) => {\n const copy = new original.constructor({});\n copy.setValues(original.serialize());\n return copy;\n}\n\nclass SdcModelError extends Error {\n constructor(props) {\n if (typeof props === 'string') {\n props = {\n msg: props,\n is_error: true,\n header: 'Error'\n }\n }\n super(props.msg)\n this.msg = props.msg;\n this.header = props.header;\n this.is_error = props.is_error;\n this.html = props.html;\n }\n}\n\nclass FileLoaded {\n constructor({ name, url }) {\n this.name = name;\n this.url = url;\n this.content = null;\n }\n\n async load(force = false) {\n if (force || !this.content) {\n this.content = await new Promise((resolve, reject) => {\n $.get(this.url).then(resolve).catch(\n () => {\n resolve('');\n }\n );\n });\n }\n\n return this.content;\n }\n\n async text() {\n return this.load();\n }\n\n static isValid(value) {\n return (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n !(value instanceof File) &&\n typeof value.url === \"string\" &&\n typeof value.name === \"string\"\n );\n }\n\n\n}\n\n/**\n * Normalize an incoming primary key value.\n *\n * `-1` is used throughout this module as the sentinel for \"new object / no pk\".\n *\n * @param {*} pk\n * @returns {number}\n */\nfunction normalizePk(pk) {\n const normalizedPk = parseInt(pk ?? -1, 10);\n return Number.isNaN(normalizedPk) ? -1 : normalizedPk;\n}\n\n/**\n * Decide whether an argument of `create()` is an options object\n * (`{elem, data}`) or the data itself. It is treated as options if it is\n * a non-empty plain object whose keys are only `elem` and/or `data`, and\n * `elem` (if present) is an SdcModel.\n *\n * @param {*} arg\n * @returns {boolean}\n */\nfunction isCreateOptions(arg) {\n if (!arg || typeof arg !== \"object\" || arg instanceof SdcModel) {\n return false;\n }\n const keys = Object.keys(arg);\n if (keys.length === 0 || !keys.every((k) => k === \"elem\" || k === \"data\")) {\n return false;\n }\n if (\"elem\" in arg && arg.elem !== null && !(arg.elem instanceof SdcModel)) {\n return false;\n }\n return !(\"data\" in arg) || arg.data === null || typeof arg.data === \"object\";\n}\n\nclass SdcQuerySet {\n /**\n * Lightweight client-side collection wrapper around the SDC model websocket.\n *\n * The queryset exposes array-like access through a proxy while also keeping\n * track of socket state and outstanding requests for that model.\n *\n * @param {string} modelName\n * @param {object} modelQuery\n */\n constructor(modelName, modelQuery = {}) {\n this.valuesList = [];\n this.loaded = false;\n this.modelName = modelName;\n this.modelQuery = modelQuery ?? {};\n this._onNoOpenRequests = [];\n this._isConnected = false;\n this._isConnectingProcess = false;\n this._autoReconnect = true;\n this.socket = null;\n // Request resolvers are stored by websocket event id until the server responds.\n this.openRequest = {};\n this.modelId = 0;\n this.onUpdate = () => {\n };\n this.onCreate = () => {\n };\n // Called with the removed models when rows of this queryset are deleted on the\n // server. If not set, onUpdate is called instead.\n this.onDelete = null;\n\n return new Proxy(this, {\n get(target, prop) {\n if (typeof prop !== \"symbol\" && !isNaN(prop)) {\n return target.valuesList[prop];\n }\n return target[prop];\n },\n\n set(target, prop, value) {\n if (!isNaN(prop)) {\n target.valuesList[prop] = value;\n return true;\n }\n target[prop] = value;\n return true;\n }\n });\n }\n\n [Symbol.iterator]() {\n let idx = -1;\n return {\n next: () => {\n ++idx;\n if (idx < this.valuesList.length) {\n return { value: this.valuesList[idx], done: false };\n }\n return { value: null, done: true };\n },\n };\n }\n\n set on_create(handler) {\n this.onCreate = handler;\n }\n\n set on_update(handler) {\n this.onUpdate = handler;\n }\n\n set on_delete(handler) {\n this.onDelete = handler;\n }\n\n /**\n * Remove the models with the given ids from the local list.\n *\n * @param {Array<number>} ids\n * @returns {Array<SdcModel>} the removed models\n */\n _removeIds(ids) {\n const removed = this.valuesList.filter((item) => ids.includes(item.id));\n this.valuesList = this.valuesList.filter((item) => !ids.includes(item.id));\n return removed;\n }\n\n /**\n *\n *\n * @param {Array<integr|string>|integer|SdcModel|SdcQuerySet|string} ids\n */\n setIds(ids) {\n const vl = this._setIds(ids);\n const filter = {\n id__in: vl.map((x) => x.id)\n }\n\n this.setFilter(filter);\n return vl;\n }\n\n /**\n *\n *\n * @param {Array<integr|string>|integer|SdcModel|SdcQuerySet|string} ids\n */\n _setIds(ids) {\n\n if (ids === null || ids === \"\" || Array.isArray(ids) && ids.length === 0) {\n this.valuesList = [];\n return this.valuesList;\n } else if (ids instanceof SdcQuerySet || ids instanceof SdcModel) {\n // Models already in this queryset are kept (so references to them stay valid);\n // other models are copied into it.\n const sources = ids instanceof SdcModel ? [ids] : ids.valuesList;\n this.valuesList = sources.map((source) => {\n const existing = source.id !== null ? this.byId(source.id) : null;\n if (existing) {\n return existing;\n }\n const copy = cloneModel(source);\n copy._setQuerySet(this, true);\n return copy;\n });\n return this.valuesList;\n }\n\n let numList, numId = Number.NaN;\n if (Number.isInteger(ids)) {\n numId = ids;\n } else if (ids instanceof Array) {\n const tempNumList = ids.map((x) => parseInt(x));\n if (!tempNumList.some(Number.isNaN)) {\n numList = tempNumList;\n }\n } else if (typeof ids === \"string\") {\n const tempNumList = ids.split(',').map((x) => parseInt(x));\n if (!tempNumList.some(Number.isNaN)) {\n numList = tempNumList\n } else {\n numId = parseInt(ids);\n }\n }\n\n if (!Number.isNaN(numId)) {\n this.valuesList = this.valuesList.filter((item) => numId === item.id);\n if (this.valuesList.length === 0) {\n const newModel = this.new();\n newModel.id = numId;\n }\n } else if (numList) {\n this.valuesList = this.valuesList.filter((item) => numList.includes(item.id));\n const valueIds = this.getIds();\n numList.filter(x => !valueIds.includes(x)).forEach((id) => {\n this.valuesList.push(new ((0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName))({ id }));\n });\n }\n return this.valuesList;\n }\n\n getIds() {\n return this.valuesList.map(x => x.id);\n }\n\n /**\n * Number of model instances currently present in the queryset cache.\n *\n * @returns {number}\n */\n get length() {\n return this.valuesList.length;\n }\n\n /**\n * Resolve a model instance by id, loading the queryset first if needed.\n *\n * @param {*} id\n * @returns {SdcModel|null}\n */\n byId(id) {\n if (id !== null) {\n const normalizedId = normalizePk(id);\n return this.valuesList.find((elm) => elm.id === normalizedId) ?? null;\n }\n\n return null;\n }\n\n /**\n * Merge additional query constraints into the current queryset.\n *\n * @param {object} modelQuery\n * @returns {SdcQuerySet}\n */\n setFilter(modelQuery) {\n this.modelQuery = modelQuery;\n return this;\n }\n\n addFilter(modelQuery) {\n this.modelQuery = Object.assign({}, this.modelQuery, modelQuery);\n return this;\n }\n\n /**\n * @param {?object} values\n * @returns {SdcModel}\n */\n new(values = {}) {\n const newModel = new ((0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName))(values);\n newModel._setQuerySet(this, false);\n this.valuesList.push(newModel);\n return newModel;\n }\n\n /**\n * Load model instances matching the current query into the queryset cache.\n *\n * @param {?object} modelQuery\n * @param {object} [options]\n * @param {?number} [options.limit] load at most this many instances (the server slices the query)\n * @returns {Promise<SdcQuerySet>}\n */\n load(modelQuery = null, { limit = null } = {}) {\n this.valuesList = [];\n this.modelQuery = modelQuery ?? this.modelQuery;\n return this._sendLoad(null, limit);\n }\n\n /**\n * Load model instances matching the current query into the queryset cache.\n *\n * @param {?object} modelQuery\n * @param {?SdcModel} item\n * @returns {Promise<SdcQuerySet>}\n */\n update({ modelQuery = null, item = null }) {\n this.modelQuery = modelQuery ?? this.modelQuery;\n let loadQuery = item ? { id: item.id } : this.modelQuery;\n return this._sendLoad(loadQuery);\n }\n\n /**\n *\n * @param pk {integr}\n * @param elem {SdcModel}\n * @returns {Promise<unknown>}\n */\n delete({ pk = null, id = null, elem = null }) {\n pk ??= id;\n pk = !elem ? pk : elem.id;\n if (pk === null) {\n throw new Error(\"pk or elem must be set\");\n }\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: \"delete\",\n event_id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n id: pk,\n pk\n },\n }),\n );\n\n this.openRequest[event_id] = [(res) => {\n this._removeIds([normalizePk(pk)]);\n resolve(res);\n }, reject];\n });\n });\n }\n\n /**\n * Request the server-side queryset data over the model websocket.\n *\n * @returns {Promise<*>}\n */\n _sendLoad(loadQuery = null, limit = null) {\n return this.isConnected().then(() => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n const args = {\n model_name: this.modelName,\n model_query: loadQuery ?? this.modelQuery,\n };\n if (limit !== null) {\n args.limit = limit;\n }\n return new Promise((resolve, reject) => {\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: \"load\",\n event_id,\n args,\n }),\n );\n\n this.openRequest[event_id] = [(data) => {\n this.loaded = true;\n resolve(data);\n }, reject];\n });\n });\n }\n\n /**\n * Render the list-view endpoint for the current model.\n *\n * @param {object} options\n * @returns {*}\n */\n _sendListView({\n modelQuery = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {},\n }) {\n return this.view({\n modelQuery,\n cbResolve,\n cbReject,\n templateContext,\n eventType: \"list_view\",\n });\n }\n\n /**\n * Render a named model view and append its HTML to a container element.\n *\n * @param {object} options\n * @returns {*}\n */\n view({\n viewName = \"html_list_template\",\n modelQuery = {},\n cbResolve = null,\n cbReject = null,\n templateContext = {},\n eventType = \"named_view\",\n }) {\n let $divList = $('<div class=\"container-fluid\">');\n this.isConnected().then(() => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: eventType,\n event_id,\n args: {\n view_name: viewName,\n model_name: this.modelName,\n model_query: modelQuery,\n template_context: templateContext,\n },\n }),\n );\n\n this.openRequest[event_id] = [\n (data) => {\n $divList.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divList);\n cbResolve && cbResolve(data);\n },\n (res) => {\n cbReject && cbReject(res);\n },\n ];\n });\n\n return $divList;\n }\n\n /**\n * Render the detail-view endpoint for a single model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _sendDetailView({\n pk = null,\n id = null,\n cbResolve = null,\n cbReject = null,\n templateContext = {},\n }) {\n pk ??= id;\n pk = normalizePk(pk);\n let $divList = $('<div class=\"container-fluid\">');\n\n this.isConnected().then(() => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: \"detail_view\",\n event_id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n id: pk,\n pk,\n template_context: templateContext,\n },\n }),\n );\n\n this.openRequest[event_id] = [\n (data) => {\n $divList.append(data.html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divList);\n cbResolve && cbResolve(data);\n },\n (res) => {\n cbReject && cbReject(res);\n },\n ];\n });\n\n return $divList;\n }\n\n /**\n * Fetch a model form fragment and attach the SDC form metadata expected by\n * the rest of the client.\n *\n * @param {string} eventType\n * @param {SdcModel} modelObj\n * @param formName\n * @param $divForm\n * @param cbResolve\n * @param cbReject\n * @param formId\n */\n getForm({ modelObj, eventType, formName, $divForm, cbResolve, cbReject, formId }) {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n const pk = modelObj.id ?? -1;\n this.isConnected().then(() => {\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: eventType,\n event_id,\n args: {\n model_name: this.modelName,\n id: pk,\n pk,\n form_name: formName,\n },\n }),\n );\n });\n\n const className = pk === null || pk === -1 ? \"create\" : \"edit\";\n\n this.openRequest[event_id] = [\n (data) => {\n $divForm.append(data.html);\n let $form = $divForm\n .closest(\"form\")\n .addClass(\n `sdc-model-${className}-form sdc-model-form ${formId}`,\n )\n .data(\"model\", modelObj)\n .data(\"model_pk\", pk)\n .data(\"form_name\", formName)\n .attr('SdcModelName', this.modelName)\n .attr('SdcModelPK', pk);\n modelObj.addForm($form);\n if ($form.length > 0 && !$form[0].hasAttribute(\"sdc_submit\")) {\n $form.attr(\"sdc_submit\", \"submitModelFormDistributor\");\n }\n\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.refresh($divForm).then(() => null);\n cbResolve && cbResolve(data);\n },\n (res) => {\n cbReject && cbReject(res);\n },\n ];\n }\n\n /**\n * Fetch a single model instance matching the current query.\n *\n * @param {?object} modelQuery\n * @param {?boolean} doNotLoad true if modelQuery contains id or pk and object does not need to be loaded.\n * @returns {Promise<SdcModel>}\n */\n async get(modelQuery = null, doNotLoad = false) {\n if (doNotLoad) {\n const id = modelQuery?.id ?? this.modelQuery?.id;\n if(modelQuery) {\n this.setFilter(modelQuery);\n }\n return this.byId(id) ?? this.new(modelQuery || this.modelQuery);\n }\n await this.load(modelQuery);\n if (this.length !== 1) {\n throw new Error(`model query returns ${this.length} but only 1 expected.`);\n }\n\n this.addFilter({ id: this.valuesList[0].id });\n\n return this.valuesList[0];\n }\n\n detailView({ pk, cbResolve = null, cbReject = null, templateContext = {} }) {\n return this._sendDetailView({\n id: pk,\n cbResolve,\n cbReject,\n templateContext,\n });\n }\n\n listView({ modelQuery = {}, searchValues = {}, cbResolve = null, cbReject = null, templateContext = {} }) {\n return this._sendListView({\n modelQuery: Object.assign({}, this.modelQuery, modelQuery, { '__search_values': searchValues }),\n cbResolve,\n cbReject,\n templateContext,\n });\n }\n\n save({ pk = null, id = null, formName = \"edit_form\", data = null } = {}) {\n pk ??= id;\n const normPk = normalizePk(pk);\n return this.isConnected().then(() => {\n let elemList;\n if (normPk > -1) {\n const elem = this.byId(normPk);\n if (!elem) {\n return Promise.reject(new SdcModelError(`Element not found with ID: ${normPk}`));\n }\n elemList = [elem];\n } else {\n elemList = this.valuesList;\n }\n let pList = [];\n elemList.forEach((elem) => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n pList.push(\n new Promise((resolve, reject) => {\n this._readFiles(elem).then((files) => {\n const sendData = data ? { ...data } : elem.serialize();\n sendData.id = elem.id;\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: \"save\",\n event_id,\n args: {\n form_name: formName,\n model_name: this.modelName,\n model_query: this.modelQuery,\n data: sendData,\n id: sendData.id,\n pk: sendData.id,\n files: files,\n },\n }),\n );\n\n this.openRequest[event_id] = [\n (res) => {\n let data =\n typeof res.data.instance === \"string\"\n ? JSON.parse(res.data.instance)\n : res.data.instance;\n res.data.instance = this._parseServerRes(data);\n resolve(res);\n },\n reject,\n ];\n });\n }),\n );\n });\n\n return Promise.all(pList);\n });\n }\n\n /**\n * Create a new instance in the DB.\n *\n * @param {{elem?: SdcModel, data?: object} | object} arg\n * Either an options object containing `elem` and/or `data`,\n * or `data` directly.\n *\n * @example\n * create({ elem, data });\n * create({ elem });\n * create(data);\n * @returns {Promise<unknown>}\n */\n create(arg = null) {\n let { elem = null, data = null } = isCreateOptions(arg) ? arg : { data: arg };\n if (data && typeof data === \"object\" && Object.keys(data).length === 0) {\n data = null;\n }\n\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n if (!elem) {\n elem = this.new(data);\n }\n return this.isConnected().then(() => {\n return new Promise((resolve, reject) => {\n this._readFiles(elem).then((files) => {\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: \"create\",\n event_id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n data: data ?? elem?.serialize() ?? {},\n files: files,\n },\n }),\n );\n\n this.openRequest[event_id] = [\n (res) => {\n let data =\n typeof res.data.instance === \"string\"\n ? JSON.parse(res.data.instance)\n : res.data.instance;\n if (elem) {\n elem.id = data[0]?.id || data[0]?.pk;\n }\n res.data.instance = this._parseServerRes(data)[0];\n resolve(res);\n },\n reject,\n ];\n });\n });\n });\n }\n\n /**\n * Ensure the websocket is open and has completed the server-side connect\n * handshake before issuing model requests.\n *\n * Multiple callers can arrive while a connection attempt is already in\n * progress. In that case they are queued behind the same synthetic request id.\n *\n * @returns {Promise<void>}\n */\n isConnected() {\n return new Promise((resolve, reject) => {\n if (this._isConnected) {\n resolve();\n } else if (\n !this._isConnectingProcess ||\n !this.openRequest[CONNECTING_REQUEST_ID]\n ) {\n this._isConnectingProcess = true;\n this.openRequest[CONNECTING_REQUEST_ID] = [() => {\n }, () => {\n }];\n this._connectToServer().then(() => {\n resolve(this._checkConnection());\n });\n } else {\n const [resolveOrigin, rejectOrigin] =\n this.openRequest[CONNECTING_REQUEST_ID];\n this.openRequest[CONNECTING_REQUEST_ID] = [\n () => {\n resolveOrigin();\n resolve();\n },\n () => {\n rejectOrigin();\n reject();\n },\n ];\n }\n });\n }\n\n /**\n * Close the websocket and disable automatic reconnect for this queryset.\n */\n close() {\n if (this.socket) {\n this._autoReconnect = false;\n this.socket.onclose = () => {\n };\n this.socket.close();\n delete this[\"socket\"];\n }\n\n this.valuesList.forEach((elem) => {\n elem._onClose()\n });\n }\n\n /**\n * Upload attached `File` values in fixed-size chunks before save/create calls.\n *\n * @param {SdcModel} elem\n * @returns {Promise<object>}\n */\n _readFiles(elem) {\n let toSolve = [];\n let files = {};\n if (!elem) {\n return Promise.resolve(files);\n }\n Object.keys(elem.constructor.fields).forEach((key) => {\n const value = elem[key];\n if (value instanceof File) {\n toSolve.push(\n new Promise((resolve, reject) => {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.openRequest[event_id] = [resolve, reject];\n\n value.arrayBuffer().then((buffer) => {\n let result = new Uint8Array(buffer);\n let numberOfChunks = Math.ceil(result.length / MAX_FILE_UPLOAD);\n files[key] = {\n id: event_id,\n file_name: value.name,\n field_name: key,\n content_length: value.size,\n };\n for (let i = 0; i < numberOfChunks; ++i) {\n const chunk = Array.from(result.slice(\n MAX_FILE_UPLOAD * i,\n MAX_FILE_UPLOAD * (i + 1),\n ));\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: \"upload\",\n event_id,\n args: {\n chunk,\n idx: i,\n number_of_chunks: numberOfChunks,\n file_name: value.name,\n field_name: key,\n content_length: value.size,\n content_type: value.type,\n model_name: this.modelName,\n model_query: this.modelQuery,\n },\n }),\n );\n }\n }).catch((err) => {\n this._closeOpenRequest(event_id);\n reject(err);\n });\n }),\n );\n }\n });\n\n return Promise.all(toSolve).then(() => {\n return files;\n });\n }\n\n /**\n * Route websocket responses to the matching pending request and update local\n * state when the server sends model payloads.\n *\n * @param {MessageEvent} e\n */\n async _onMessage(e) {\n let data = JSON.parse(e.data);\n if (data.is_error) {\n if (Object.hasOwn(this.openRequest, data.event_id)) {\n this.openRequest[data.event_id][1](new SdcModelError(data));\n this._closeOpenRequest(data.event_id);\n }\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"pushErrorMsg\", data.header || \"\", data.msg || \"\");\n }\n\n if (data.type === \"connect\") {\n this.openRequest[CONNECTING_REQUEST_ID][1](new SdcModelError(data));\n this._closeOpenRequest(CONNECTING_REQUEST_ID);\n this._autoReconnect = false;\n this.socket.close();\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"pushMsg\", data.header || \"\", data.msg || \"\");\n }\n\n if (data.type === \"connect\") {\n this._isConnected = true;\n this._isConnectingProcess = false;\n this.openRequest[CONNECTING_REQUEST_ID][0](data);\n this._closeOpenRequest(CONNECTING_REQUEST_ID);\n } else if ([\"load\", \"list_view\", \"named_view\", \"detail_view\"].includes(data.type)) {\n const jsonRes = JSON.parse(data.args.data);\n data.args.data = await this._parseServerRes(jsonRes);\n } else if (data.type === \"on_update\" || data.type === \"on_create\") {\n const jsonRes = JSON.parse(data.args.data);\n\n let obj = await this._parseServerRes(jsonRes);\n let cb;\n\n if (data.type === \"on_create\") {\n cb = this.onCreate;\n } else {\n cb = this.onUpdate;\n }\n\n cb(obj);\n data.args.data = obj;\n } else if (data.type === \"on_delete\") {\n const ids = JSON.parse(data.args.data).map((x) => normalizePk(x.id ?? x.pk));\n const removed = this._removeIds(ids);\n (this.onDelete ?? this.onUpdate)(removed);\n data.args.data = removed;\n }\n\n let instance = data.data?.instance;\n if (instance) {\n data.data.instance = JSON.parse(data.data.instance);\n }\n\n if (Object.hasOwn(this.openRequest, data.event_id)) {\n this.openRequest[data.event_id][0](data);\n this._closeOpenRequest(data.event_id);\n }\n }\n }\n\n /**\n * Wait until all in-flight websocket requests for this queryset are resolved.\n *\n * @returns {Promise<void>}\n */\n noOpenRequests() {\n return new Promise((resolve) => {\n if (Object.keys(this.openRequest).length === 0) {\n return resolve();\n }\n\n this._onNoOpenRequests.push(resolve);\n });\n }\n\n /**\n * Remove a completed request and wake any `noOpenRequests()` waiters when the\n * request map becomes empty.\n *\n * @param {string} eventId\n */\n _closeOpenRequest(eventId) {\n delete this.openRequest[eventId];\n if (Object.keys(this.openRequest).length === 0) {\n this._onNoOpenRequests.forEach((x) => x());\n this._onNoOpenRequests = [];\n }\n }\n\n /**\n * Establish the raw websocket connection for this queryset.\n *\n * @returns {Promise<void>}\n */\n _connectToServer() {\n return new Promise((resolve) => {\n const modelIdentifier =\n `${this.modelName}` + (this.modelId > 0 ? `/${this.modelId}` : \"\");\n if (window.location.protocol === \"https:\") {\n this.socket = new WebSocket(\n `wss://${window.location.host}/sdc_ws/model/${modelIdentifier}`,\n );\n } else {\n this.socket = new WebSocket(\n `ws://${window.location.host}/sdc_ws/model/${modelIdentifier}`,\n );\n }\n\n this.socket.onmessage = this._onMessage.bind(this);\n\n this.socket.onclose = (e) => {\n console.error(\n `SDC Model (${this.modelName}, ${this.modelId}) Socket closed unexpectedly`,\n );\n this._isConnected = false;\n for (const value of Object.values(this.openRequest)) {\n value[1](e);\n }\n this.openRequest = {};\n\n this._isConnectingProcess = false;\n setTimeout(() => {\n if (this._autoReconnect && !this._isConnected) {\n // isConnected() opens the socket and sends the connect handshake, so\n // live updates work again and later requests reuse this connection.\n this.isConnected().catch(() => {\n });\n }\n }, 1000);\n };\n\n this.socket.onerror = (err) => {\n console.error(`Model Socket encountered error: ${err} Closing socket`);\n if (this._isConnected) {\n try {\n this.socket.close();\n } catch (e) {\n }\n }\n };\n\n this.socket.onopen = () => {\n resolve();\n };\n });\n }\n\n /**\n * Perform the application-level connect handshake once the websocket opens.\n *\n * @returns {Promise<*>}\n */\n _checkConnection() {\n const event_id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n return new Promise((resolve, reject) => {\n this.socket.send(\n JSON.stringify({\n event: \"model\",\n event_type: \"connect\",\n event_id,\n args: {\n model_name: this.modelName,\n model_query: this.modelQuery,\n },\n }),\n );\n\n this.openRequest[event_id] = [resolve, reject];\n });\n }\n\n /**\n * Convert the backend model payload into locally tracked model objects.\n *\n * @param {Array<object>} results\n */\n _parseServerRes(results) {\n const newModels = []\n for (const x of results) {\n const ModelClass = (0,_sdc_socket_js__WEBPACK_IMPORTED_MODULE_1__.getModel)(this.modelName);\n if (!ModelClass) {\n throw new Error(`${this.modelName} is no SdcModel. mybe the models ar not importad.`);\n }\n const newModel = new ModelClass({ 'id': x.id ?? x.pk, ...x.fields });\n const currentModel = this.byId(newModel.id);\n if (currentModel) {\n currentModel.setValues(newModel);\n newModels.push(currentModel);\n } else {\n this.valuesList.push(newModel);\n newModel._setQuerySet(this, true);\n newModels.push(newModel);\n }\n }\n this.valuesList.sort((a, b) => a._id - b._id);\n return newModels;\n }\n}\n\nclass SdcModel {\n static fields = {};\n\n /**\n * Base model wrapper used by SDC model registrations.\n *\n * @param {string} modelName\n */\n constructor(modelName) {\n this._id = null;\n this._forms = [];\n this.loaded = false;\n this.formId = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n this.modelName = modelName;\n }\n\n /**\n *\n * @param {object?} modelQuerySet\n * @param {AbstractSDC} parent\n * @returns {SdcQuerySet}\n */\n static querySet(modelQuerySet = null, parent = null) {\n const { modelName } = new this({});\n if (!parent) {\n return new SdcQuerySet(modelName, modelQuerySet);\n }\n\n return parent.querySet(modelName, modelQuerySet);\n }\n\n addForm($form) {\n // Remove old listeners if form already set\n const onChange = this._onChange.bind(this);\n\n this._forms.push($form);\n\n if ($form) {\n // Attach delegated event handler to all inputs\n $form.on(\n \"input.formWatcher change.formWatcher\",\n \"input, select, textarea\",\n onChange\n );\n }\n }\n\n _onChange(event) {\n const { name } = event.target;\n if (this.constructor.fields[name]) {\n try {\n this[`set${name}`]((0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValueFromField)(event.target));\n } catch {\n // Invalid input (e.g. an empty required field) is kept in the form and\n // validated by the server on submit.\n return;\n }\n // Show the new value in the other forms of this model, not in the input being edited.\n this._updateForm(name, event.target);\n }\n }\n\n _updateForm(fieldName, skipElement = null) {\n const self = this;\n this._forms.forEach(($form) => {\n $form.find(`[name=\"${fieldName}\"]`).each(function () {\n if (this !== skipElement) {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.setValueInField)(this, self[fieldName]);\n }\n });\n });\n }\n\n setValues(data = {}) {\n throw new Error(\"setValues() must be implemented by subclass\");\n }\n\n /**\n * Attach the queryset that owns this model instance.\n *\n * @param {SdcQuerySet} querySet\n * @param {boolean} isLoaded\n */\n _setQuerySet(querySet, isLoaded) {\n this._querySet = new WeakRef(querySet);\n this.loaded = isLoaded;\n }\n\n get querySet() {\n return this._querySet.deref();\n }\n\n save({ formName = \"edit_form\", data = null } = {}) {\n return this._querySet.deref().save({ pk: this.id, formName, data });\n }\n\n /**\n * Create this instance in the DB.\n *\n * @param {{data?: object} | object | null} values\n * Either `{ data }` or `data` directly.\n * @returns {Promise<unknown>}\n */\n create(values = null) {\n const data = isCreateOptions(values) ? (values.data ?? null) : values;\n return this._querySet.deref().create({ elem: this, data });\n }\n\n delete() {\n return this._querySet.deref().delete({ elem: this });\n }\n\n load() {\n return this._querySet.deref().update({ item: this });\n }\n\n update() {\n return this.load();\n }\n\n get id() {\n return this._id;\n }\n\n set id(data) {\n this._id = data;\n }\n\n set pk(data) {\n this.id = data;\n }\n\n get pk() {\n return this._id;\n }\n\n close() {\n return this._querySet.deref().close();\n }\n\n _onClose() {\n Object.keys(this.constructor.fields)\n .filter((x) => this[`_${x}`] instanceof SdcQuerySet)\n .forEach((x) => this[`_${x}`].close());\n }\n\n /**\n * Request the server-rendered detail view for this model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n detailView({ cbResolve = null, cbReject = null, templateContext = {} }) {\n return this._querySet.deref().detailView({ pk: this.id, cbResolve, cbReject, templateContext });\n }\n\n serialize() {\n return Object.entries(this.constructor.fields).reduce((acc, [key, val]) => {\n const value = this[key];\n if (value instanceof SdcQuerySet) {\n if (val.many_to_many || val.one_to_many) {\n acc[key] = value.getIds();\n } else {\n const allIds = value.getIds();\n if (allIds.length > 0) {\n acc[key] = allIds[0];\n } else {\n acc[key] = null;\n }\n\n }\n } else if (val.is_relation && value instanceof SdcModel) {\n acc[key] = value.id ?? null;\n } else if (value instanceof Date) {\n // Django's DateField does not accept a full ISO datetime.\n acc[key] = val.type === \"DateField\" ? (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.formatDate)(value) : value.toISOString();\n } else {\n acc[key] = value;\n }\n\n return acc\n }, {});\n }\n\n toJson() {\n const res = {}\n for (let key in this.constructor.fields) {\n const value = this[key];\n\n if (value instanceof File) {\n res[key] = value.name;\n } else if (value instanceof SdcModel) {\n res[key] = value.id;\n } else if (value instanceof SdcQuerySet) {\n res[key] = value.getIds();\n } else {\n res[key] = value;\n }\n }\n\n return res;\n }\n\n /**\n * Backwards-compatible alias for syncing values from a form into the model.\n *\n * @param {*} $forms\n * @returns {*}\n */\n syncFormToModel($forms) {\n return this.syncForm($forms);\n }\n\n /**\n * Resolve the form collection associated with this model instance.\n *\n * @param {*} $forms\n * @returns {*}\n */\n _resolveForms($forms) {\n if (!$forms || !$forms.hasClass(this.formId)) {\n return $(`.${this.formId}`);\n }\n\n return $forms;\n }\n\n /**\n * Copy the current model state into matching form fields.\n *\n * @param {*} $forms\n */\n syncModelToForm($forms) {\n $forms = this._resolveForms($forms);\n\n const self = this;\n const { fields } = this.constructor;\n $forms.each(function () {\n const pk = normalizePk($(this).data(\"model_pk\"));\n // Create forms carry model_pk -1 while the new model's id is still null.\n if (normalizePk(self.id) !== pk) {\n return;\n }\n\n for (let formItem of this.elements) {\n let { name } = formItem;\n if (name && name !== \"\" && !!fields[name]) {\n (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.setValueInField)(formItem, self[name])\n }\n }\n });\n }\n\n /**\n * Copy matching form values back onto the current model instance.\n *\n * Hidden inputs are parsed to their original primitive type when possible.\n *\n * @param {*} $forms\n * @returns {*}\n */\n syncForm($forms) {\n $forms = this._resolveForms($forms);\n\n const self = this;\n const { fields } = this.constructor;\n const returnValue = {}\n\n function setValueInForm(name, value) {\n if (fields[name]) {\n try {\n self[name] = value;\n } catch {\n // Invalid values are still sent to the server, which returns the form\n // errors; the model keeps its last valid value.\n }\n }\n returnValue[name] = value;\n }\n\n $forms.each(function () {\n const pk = normalizePk($(this).data(\"model_pk\"));\n if (self.id !== pk && (self.id !== null || pk !== -1)) {\n return;\n }\n\n for (let formItem of this.elements) {\n setValueInForm(formItem.name, (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.getValueFromField)(formItem));\n }\n\n return self;\n });\n\n return returnValue;\n }\n\n /**\n * Render the correct server-side form for this model state.\n *\n * @param {object} options\n * @returns {*}\n */\n form({ cbResolve = null, cbReject = null } = {}) {\n if (this.id === null || this.id === -1) {\n return this._createForm({ cbReject, cbResolve });\n }\n return this._editForm({ cbReject, cbResolve });\n }\n\n /**\n * Render the create form for a new model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _createForm({ cbResolve = null, cbReject = null }) {\n let $divForm = $(\"<div>\");\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"create_form\",\n formName: null,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId,\n });\n\n return $divForm;\n }\n\n /**\n * Render the edit form for an existing model instance.\n *\n * @param {object} options\n * @returns {*}\n */\n _editForm({ cbResolve = null, cbReject = null }) {\n let $divForm = $(\"<div>\");\n\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"edit_form\",\n formName: null,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId,\n });\n\n return $divForm;\n }\n\n /**\n * Render a named server-side form for this model.\n *\n * @param {object} options\n * @returns {*}\n */\n namedForm({ formName, cbResolve = null, cbReject = null }) {\n let $divForm = $('<div class=\"container-fluid\">');\n\n this._querySet.deref().getForm({\n modelObj: this,\n eventType: \"named_form\",\n formName,\n $divForm,\n cbResolve,\n cbReject,\n formId: this.formId,\n });\n\n return $divForm;\n }\n\n /**\n * Validate a field value using the supplied field config.\n *\n * @param {*} value\n * @param {object} config\n */\n validate(value, config) {\n const err = validateField(value, config);\n if (err) throw new Error(err);\n }\n\n /**\n * Convert a raw input value into the shape expected by the field config.\n *\n * @param {*} value\n * @param {object} config\n * @returns {*}\n */\n parseValue(value, config) {\n const {\n type,\n many_to_many: manyToMany,\n one_to_many: oneToMany,\n many_to_one: manyToOne,\n one_to_one: oneToOne,\n } = config;\n if (value === null) {\n return null;\n }\n\n if ((manyToMany || oneToMany || manyToOne || oneToOne) && value && typeof value === 'string') {\n return JSON.parse(value);\n }\n\n switch (type) {\n case \"CharField\":\n case \"TextField\":\n case \"SlugField\":\n case \"UUIDField\":\n case \"EmailField\":\n return `${value}`;\n\n case \"IntegerField\":\n case \"SmallIntegerField\":\n case \"BigIntegerField\":\n case \"PositiveIntegerField\":\n case \"PositiveSmallIntegerField\":\n case \"PositiveBigIntegerField\":\n case \"AutoField\":\n case \"SmallAutoField\":\n case \"BigAutoField\":\n return parseInt(value, 10);\n\n case \"FloatField\":\n case \"DecimalField\":\n return parseFloat(value);\n\n case \"BooleanField\":\n return !!value;\n\n case \"DateField\":\n case \"DateTimeField\":\n return (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.toDate)(value);\n\n case \"URLField\":\n return new URL(value);\n\n case \"FileField\":\n if (value == null) {\n return null;\n }\n\n if (typeof value === \"string\") {\n return null;\n }\n\n if (FileLoaded.isValid(value)) {\n return new FileLoaded(value);\n }\n\n if (value instanceof FileLoaded) {\n return new FileLoaded(value);\n }\n\n if (typeof File !== \"undefined\" && value instanceof File) {\n // Size and type are checked in validate().\n return value;\n }\n break;\n\n case \"JSONField\":\n if (typeof value === \"object\") {\n return value;\n }\n if (typeof value === \"string\") {\n return JSON.parse(value);\n }\n break;\n\n default:\n break;\n }\n\n return value;\n }\n}\n\n/**\n * Validate a field value against the field metadata received from the backend.\n *\n * @param {*} value\n * @param {object} config\n * @returns {?string}\n */\nfunction validateField(value, config) {\n const {\n type,\n required,\n max_length: maxLength,\n is_relation: isRelation,\n many_to_many: manyToMany,\n one_to_many: oneToMany,\n many_to_one: manyToOne,\n one_to_one: oneToOne,\n related_model: relatedModel,\n } = config;\n\n void isRelation;\n\n if (required) {\n if (value === null || value === undefined || value === \"\") {\n return \"This field is required\";\n }\n }\n\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n\n if (manyToMany || oneToMany || manyToOne || oneToOne) {\n if (!(value instanceof SdcQuerySet) || value.modelName !== relatedModel) {\n if(typeof value === 'string') {\n value = JSON.parse(value);\n }\n\n if ((manyToMany || manyToOne) && Array.isArray(value) && value.some((x) => !Number.isNaN(parseInt(x)))) {\n return null;\n }\n if (typeof value !== \"object\" && Number.isNaN(parseInt(value))) {\n return \"Must be object or ID\";\n }\n return null;\n }\n }\n\n switch (type) {\n case \"CharField\":\n case \"TextField\":\n if (typeof value !== \"string\") {\n return \"Must be a string\";\n }\n if (maxLength && value.length > maxLength) {\n return `Max length is ${maxLength}`;\n }\n break;\n\n case \"IntegerField\":\n case \"SmallIntegerField\":\n case \"BigIntegerField\":\n case \"PositiveIntegerField\":\n case \"PositiveSmallIntegerField\":\n case \"PositiveBigIntegerField\":\n case \"AutoField\":\n case \"SmallAutoField\":\n case \"BigAutoField\":\n if (!isFinite(parseInt(value))) {\n return \"Must be an integer\";\n }\n break;\n\n case \"FloatField\":\n case \"DecimalField\":\n if (!isFinite(parseFloat(value))) {\n return \"Must be a number\";\n }\n break;\n\n case \"BooleanField\":\n if (typeof value !== \"boolean\") {\n return \"Must be a boolean\";\n }\n break;\n\n case \"DateField\":\n case \"DateTimeField\":\n if (isNaN(Date.parse(value))) {\n return \"Must be a valid date\";\n }\n break;\n\n case \"EmailField\":\n if (typeof value !== \"string\" || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)) {\n return \"Invalid email\";\n }\n break;\n\n case \"URLField\":\n try {\n new URL(value);\n } catch {\n return \"Invalid URL\";\n }\n break;\n\n case \"UUIDField\":\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/.test(value)) {\n return \"Invalid UUID\";\n }\n break;\n\n case \"JSONField\":\n if (typeof value === \"string\") {\n try {\n JSON.parse(value);\n } catch {\n return \"Must be valid JSON\";\n }\n }\n break;\n case \"FileField\":\n if (!FileLoaded.isValid(value) && !(value instanceof File) && !(value instanceof FileLoaded)) {\n return \"Must be a valid file\";\n }\n if (typeof File !== \"undefined\" && value instanceof File) {\n if (config.max_size && value.size > config.max_size) {\n return `File too large (max ${config.max_size} bytes)`;\n }\n if (config.allowed_types && !config.allowed_types.includes(value.type)) {\n return `Invalid file type (${value.type})`;\n }\n }\n break;\n default:\n break;\n }\n\n return null;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLFVBQVU7QUFDMUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxVQUFVLEdBQUc7QUFDcEY7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLGlCQUFpQjtBQUN6RDtBQUNBO0FBQ0EsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX21vZGVsLmpzPzk5MWIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ybWF0RGF0ZSwgZ2V0VmFsdWVGcm9tRmllbGQsIHNldFZhbHVlSW5GaWVsZCwgdG9EYXRlLCB1dWlkdjQgfSBmcm9tIFwiLi9zZGNfdXRpbHMuanNcIjtcbmltcG9ydCB7IGdldE1vZGVsIH0gZnJvbSBcIi4vc2RjX3NvY2tldC5qc1wiXG5pbXBvcnQgeyBhcHAgfSBmcm9tIFwiLi9zZGNfbWFpbi5qc1wiO1xuaW1wb3J0IHsgdHJpZ2dlciB9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcblxuY29uc3QgTUFYX0ZJTEVfVVBMT0FEID0gMjUwMDA7XG5jb25zdCBDT05ORUNUSU5HX1JFUVVFU1RfSUQgPSBcIl9jb25uZWN0aW5nX3Byb2Nlc3NcIjtcblxuLyoqXG4gKiBDb3B5IGEgbW9kZWwgaW5zdGFuY2UgZm9yIGFub3RoZXIgcXVlcnlzZXQuIEEgbmV3IGluc3RhbmNlIG9mIHRoZSBzYW1lIGNsYXNzIGlzXG4gKiBjcmVhdGVkIGZyb20gdGhlIHNlcmlhbGl6ZWQgZmllbGQgdmFsdWVzIChzdHJ1Y3R1cmVkQ2xvbmUgY2Fubm90IGNvcHkgdGhlXG4gKiBXZWFrUmVmL1Byb3h5IG1lbWJlcnMgb2YgYSBtb2RlbCkuXG4gKi9cbmNvbnN0IGNsb25lTW9kZWwgPSAob3JpZ2luYWwpID0+IHtcbiAgY29uc3QgY29weSA9IG5ldyBvcmlnaW5hbC5jb25zdHJ1Y3Rvcih7fSk7XG4gIGNvcHkuc2V0VmFsdWVzKG9yaWdpbmFsLnNlcmlhbGl6ZSgpKTtcbiAgcmV0dXJuIGNvcHk7XG59XG5cbmNsYXNzIFNkY01vZGVsRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHByb3BzID0ge1xuICAgICAgICBtc2c6IHByb3BzLFxuICAgICAgICBpc19lcnJvcjogdHJ1ZSxcbiAgICAgICAgaGVhZGVyOiAnRXJyb3InXG4gICAgICB9XG4gICAgfVxuICAgIHN1cGVyKHByb3BzLm1zZylcbiAgICB0aGlzLm1zZyA9IHByb3BzLm1zZztcbiAgICB0aGlzLmhlYWRlciA9IHByb3BzLmhlYWRlcjtcbiAgICB0aGlzLmlzX2Vycm9yID0gcHJvcHMuaXNfZXJyb3I7XG4gICAgdGhpcy5odG1sID0gcHJvcHMuaHRtbDtcbiAgfVxufVxuXG5jbGFzcyBGaWxlTG9hZGVkIHtcbiAgY29uc3RydWN0b3IoeyBuYW1lLCB1cmwgfSkge1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy51cmwgPSB1cmw7XG4gICAgdGhpcy5jb250ZW50ID0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGxvYWQoZm9yY2UgPSBmYWxzZSkge1xuICAgIGlmIChmb3JjZSB8fCAhdGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmNvbnRlbnQgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICQuZ2V0KHRoaXMudXJsKS50aGVuKHJlc29sdmUpLmNhdGNoKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNvbnRlbnQ7XG4gIH1cblxuICBhc3luYyB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIHN0YXRpYyBpc1ZhbGlkKHZhbHVlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpICYmXG4gICAgICB0eXBlb2YgdmFsdWUudXJsID09PSBcInN0cmluZ1wiICYmXG4gICAgICB0eXBlb2YgdmFsdWUubmFtZSA9PT0gXCJzdHJpbmdcIlxuICAgICk7XG4gIH1cblxuXG59XG5cbi8qKlxuICogTm9ybWFsaXplIGFuIGluY29taW5nIHByaW1hcnkga2V5IHZhbHVlLlxuICpcbiAqIGAtMWAgaXMgdXNlZCB0aHJvdWdob3V0IHRoaXMgbW9kdWxlIGFzIHRoZSBzZW50aW5lbCBmb3IgXCJuZXcgb2JqZWN0IC8gbm8gcGtcIi5cbiAqXG4gKiBAcGFyYW0geyp9IHBrXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQayhwaykge1xuICBjb25zdCBub3JtYWxpemVkUGsgPSBwYXJzZUludChwayA/PyAtMSwgMTApO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKG5vcm1hbGl6ZWRQaykgPyAtMSA6IG5vcm1hbGl6ZWRQaztcbn1cblxuLyoqXG4gKiBEZWNpZGUgd2hldGhlciBhbiBhcmd1bWVudCBvZiBgY3JlYXRlKClgIGlzIGFuIG9wdGlvbnMgb2JqZWN0XG4gKiAoYHtlbGVtLCBkYXRhfWApIG9yIHRoZSBkYXRhIGl0c2VsZi4gSXQgaXMgdHJlYXRlZCBhcyBvcHRpb25zIGlmIGl0IGlzXG4gKiBhIG5vbi1lbXB0eSBwbGFpbiBvYmplY3Qgd2hvc2Uga2V5cyBhcmUgb25seSBgZWxlbWAgYW5kL29yIGBkYXRhYCwgYW5kXG4gKiBgZWxlbWAgKGlmIHByZXNlbnQpIGlzIGFuIFNkY01vZGVsLlxuICpcbiAqIEBwYXJhbSB7Kn0gYXJnXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNDcmVhdGVPcHRpb25zKGFyZykge1xuICBpZiAoIWFyZyB8fCB0eXBlb2YgYXJnICE9PSBcIm9iamVjdFwiIHx8IGFyZyBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhhcmcpO1xuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgfHwgIWtleXMuZXZlcnkoKGspID0+IGsgPT09IFwiZWxlbVwiIHx8IGsgPT09IFwiZGF0YVwiKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoXCJlbGVtXCIgaW4gYXJnICYmIGFyZy5lbGVtICE9PSBudWxsICYmICEoYXJnLmVsZW0gaW5zdGFuY2VvZiBTZGNNb2RlbCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuICEoXCJkYXRhXCIgaW4gYXJnKSB8fCBhcmcuZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgYXJnLmRhdGEgPT09IFwib2JqZWN0XCI7XG59XG5cbmV4cG9ydCBjbGFzcyBTZGNRdWVyeVNldCB7XG4gIC8qKlxuICAgKiBMaWdodHdlaWdodCBjbGllbnQtc2lkZSBjb2xsZWN0aW9uIHdyYXBwZXIgYXJvdW5kIHRoZSBTREMgbW9kZWwgd2Vic29ja2V0LlxuICAgKlxuICAgKiBUaGUgcXVlcnlzZXQgZXhwb3NlcyBhcnJheS1saWtlIGFjY2VzcyB0aHJvdWdoIGEgcHJveHkgd2hpbGUgYWxzbyBrZWVwaW5nXG4gICAqIHRyYWNrIG9mIHNvY2tldCBzdGF0ZSBhbmQgb3V0c3RhbmRpbmcgcmVxdWVzdHMgZm9yIHRoYXQgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtb2RlbE5hbWVcbiAgICogQHBhcmFtIHtvYmplY3R9IG1vZGVsUXVlcnlcbiAgICovXG4gIGNvbnN0cnVjdG9yKG1vZGVsTmFtZSwgbW9kZWxRdWVyeSA9IHt9KSB7XG4gICAgdGhpcy52YWx1ZXNMaXN0ID0gW107XG4gICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm1vZGVsTmFtZSA9IG1vZGVsTmFtZTtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5ID8/IHt9O1xuICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMgPSBbXTtcbiAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2lzQ29ubmVjdGluZ1Byb2Nlc3MgPSBmYWxzZTtcbiAgICB0aGlzLl9hdXRvUmVjb25uZWN0ID0gdHJ1ZTtcbiAgICB0aGlzLnNvY2tldCA9IG51bGw7XG4gICAgLy8gUmVxdWVzdCByZXNvbHZlcnMgYXJlIHN0b3JlZCBieSB3ZWJzb2NrZXQgZXZlbnQgaWQgdW50aWwgdGhlIHNlcnZlciByZXNwb25kcy5cbiAgICB0aGlzLm9wZW5SZXF1ZXN0ID0ge307XG4gICAgdGhpcy5tb2RlbElkID0gMDtcbiAgICB0aGlzLm9uVXBkYXRlID0gKCkgPT4ge1xuICAgIH07XG4gICAgdGhpcy5vbkNyZWF0ZSA9ICgpID0+IHtcbiAgICB9O1xuICAgIC8vIENhbGxlZCB3aXRoIHRoZSByZW1vdmVkIG1vZGVscyB3aGVuIHJvd3Mgb2YgdGhpcyBxdWVyeXNldCBhcmUgZGVsZXRlZCBvbiB0aGVcbiAgICAvLyBzZXJ2ZXIuIElmIG5vdCBzZXQsIG9uVXBkYXRlIGlzIGNhbGxlZCBpbnN0ZWFkLlxuICAgIHRoaXMub25EZWxldGUgPSBudWxsO1xuXG4gICAgcmV0dXJuIG5ldyBQcm94eSh0aGlzLCB7XG4gICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcCAhPT0gXCJzeW1ib2xcIiAmJiAhaXNOYU4ocHJvcCkpIHtcbiAgICAgICAgICByZXR1cm4gdGFyZ2V0LnZhbHVlc0xpc3RbcHJvcF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgIH0sXG5cbiAgICAgIHNldCh0YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICAgIGlmICghaXNOYU4ocHJvcCkpIHtcbiAgICAgICAgICB0YXJnZXQudmFsdWVzTGlzdFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCkge1xuICAgIGxldCBpZHggPSAtMTtcbiAgICByZXR1cm4ge1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICArK2lkeDtcbiAgICAgICAgaWYgKGlkeCA8IHRoaXMudmFsdWVzTGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdGhpcy52YWx1ZXNMaXN0W2lkeF0sIGRvbmU6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG51bGwsIGRvbmU6IHRydWUgfTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHNldCBvbl9jcmVhdGUoaGFuZGxlcikge1xuICAgIHRoaXMub25DcmVhdGUgPSBoYW5kbGVyO1xuICB9XG5cbiAgc2V0IG9uX3VwZGF0ZShoYW5kbGVyKSB7XG4gICAgdGhpcy5vblVwZGF0ZSA9IGhhbmRsZXI7XG4gIH1cblxuICBzZXQgb25fZGVsZXRlKGhhbmRsZXIpIHtcbiAgICB0aGlzLm9uRGVsZXRlID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIG1vZGVscyB3aXRoIHRoZSBnaXZlbiBpZHMgZnJvbSB0aGUgbG9jYWwgbGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSBpZHNcbiAgICogQHJldHVybnMge0FycmF5PFNkY01vZGVsPn0gdGhlIHJlbW92ZWQgbW9kZWxzXG4gICAqL1xuICBfcmVtb3ZlSWRzKGlkcykge1xuICAgIGNvbnN0IHJlbW92ZWQgPSB0aGlzLnZhbHVlc0xpc3QuZmlsdGVyKChpdGVtKSA9PiBpZHMuaW5jbHVkZXMoaXRlbS5pZCkpO1xuICAgIHRoaXMudmFsdWVzTGlzdCA9IHRoaXMudmFsdWVzTGlzdC5maWx0ZXIoKGl0ZW0pID0+ICFpZHMuaW5jbHVkZXMoaXRlbS5pZCkpO1xuICAgIHJldHVybiByZW1vdmVkO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8aW50ZWdyfHN0cmluZz58aW50ZWdlcnxTZGNNb2RlbHxTZGNRdWVyeVNldHxzdHJpbmd9IGlkc1xuICAgKi9cbiAgc2V0SWRzKGlkcykge1xuICAgIGNvbnN0IHZsID0gdGhpcy5fc2V0SWRzKGlkcyk7XG4gICAgY29uc3QgZmlsdGVyID0ge1xuICAgICAgaWRfX2luOiB2bC5tYXAoKHgpID0+IHguaWQpXG4gICAgfVxuXG4gICAgdGhpcy5zZXRGaWx0ZXIoZmlsdGVyKTtcbiAgICByZXR1cm4gdmw7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxpbnRlZ3J8c3RyaW5nPnxpbnRlZ2VyfFNkY01vZGVsfFNkY1F1ZXJ5U2V0fHN0cmluZ30gaWRzXG4gICAqL1xuICBfc2V0SWRzKGlkcykge1xuXG4gICAgaWYgKGlkcyA9PT0gbnVsbCB8fCBpZHMgPT09IFwiXCIgfHwgQXJyYXkuaXNBcnJheShpZHMpICYmIGlkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IFtdO1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdDtcbiAgICB9IGVsc2UgaWYgKGlkcyBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0IHx8IGlkcyBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgICAvLyBNb2RlbHMgYWxyZWFkeSBpbiB0aGlzIHF1ZXJ5c2V0IGFyZSBrZXB0IChzbyByZWZlcmVuY2VzIHRvIHRoZW0gc3RheSB2YWxpZCk7XG4gICAgICAvLyBvdGhlciBtb2RlbHMgYXJlIGNvcGllZCBpbnRvIGl0LlxuICAgICAgY29uc3Qgc291cmNlcyA9IGlkcyBpbnN0YW5jZW9mIFNkY01vZGVsID8gW2lkc10gOiBpZHMudmFsdWVzTGlzdDtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IHNvdXJjZXMubWFwKChzb3VyY2UpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBzb3VyY2UuaWQgIT09IG51bGwgPyB0aGlzLmJ5SWQoc291cmNlLmlkKSA6IG51bGw7XG4gICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgIHJldHVybiBleGlzdGluZztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb3B5ID0gY2xvbmVNb2RlbChzb3VyY2UpO1xuICAgICAgICBjb3B5Ll9zZXRRdWVyeVNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIGNvcHk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3Q7XG4gICAgfVxuXG4gICAgbGV0IG51bUxpc3QsIG51bUlkID0gTnVtYmVyLk5hTjtcbiAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihpZHMpKSB7XG4gICAgICBudW1JZCA9IGlkcztcbiAgICB9IGVsc2UgaWYgKGlkcyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICBjb25zdCB0ZW1wTnVtTGlzdCA9IGlkcy5tYXAoKHgpID0+IHBhcnNlSW50KHgpKTtcbiAgICAgIGlmICghdGVtcE51bUxpc3Quc29tZShOdW1iZXIuaXNOYU4pKSB7XG4gICAgICAgIG51bUxpc3QgPSB0ZW1wTnVtTGlzdDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBpZHMgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHRlbXBOdW1MaXN0ID0gaWRzLnNwbGl0KCcsJykubWFwKCh4KSA9PiBwYXJzZUludCh4KSk7XG4gICAgICBpZiAoIXRlbXBOdW1MaXN0LnNvbWUoTnVtYmVyLmlzTmFOKSkge1xuICAgICAgICBudW1MaXN0ID0gdGVtcE51bUxpc3RcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG51bUlkID0gcGFyc2VJbnQoaWRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIU51bWJlci5pc05hTihudW1JZCkpIHtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IHRoaXMudmFsdWVzTGlzdC5maWx0ZXIoKGl0ZW0pID0+IG51bUlkID09PSBpdGVtLmlkKTtcbiAgICAgIGlmICh0aGlzLnZhbHVlc0xpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnN0IG5ld01vZGVsID0gdGhpcy5uZXcoKTtcbiAgICAgICAgbmV3TW9kZWwuaWQgPSBudW1JZDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG51bUxpc3QpIHtcbiAgICAgIHRoaXMudmFsdWVzTGlzdCA9IHRoaXMudmFsdWVzTGlzdC5maWx0ZXIoKGl0ZW0pID0+IG51bUxpc3QuaW5jbHVkZXMoaXRlbS5pZCkpO1xuICAgICAgY29uc3QgdmFsdWVJZHMgPSB0aGlzLmdldElkcygpO1xuICAgICAgbnVtTGlzdC5maWx0ZXIoeCA9PiAhdmFsdWVJZHMuaW5jbHVkZXMoeCkpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgIHRoaXMudmFsdWVzTGlzdC5wdXNoKG5ldyAoZ2V0TW9kZWwodGhpcy5tb2RlbE5hbWUpKSh7IGlkIH0pKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy52YWx1ZXNMaXN0O1xuICB9XG5cbiAgZ2V0SWRzKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3QubWFwKHggPT4geC5pZCk7XG4gIH1cblxuICAvKipcbiAgICogTnVtYmVyIG9mIG1vZGVsIGluc3RhbmNlcyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgcXVlcnlzZXQgY2FjaGUuXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3QubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSBtb2RlbCBpbnN0YW5jZSBieSBpZCwgbG9hZGluZyB0aGUgcXVlcnlzZXQgZmlyc3QgaWYgbmVlZGVkLlxuICAgKlxuICAgKiBAcGFyYW0geyp9IGlkXG4gICAqIEByZXR1cm5zIHtTZGNNb2RlbHxudWxsfVxuICAgKi9cbiAgYnlJZChpZCkge1xuICAgIGlmIChpZCAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZElkID0gbm9ybWFsaXplUGsoaWQpO1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWVzTGlzdC5maW5kKChlbG0pID0+IGVsbS5pZCA9PT0gbm9ybWFsaXplZElkKSA/PyBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1lcmdlIGFkZGl0aW9uYWwgcXVlcnkgY29uc3RyYWludHMgaW50byB0aGUgY3VycmVudCBxdWVyeXNldC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG1vZGVsUXVlcnlcbiAgICogQHJldHVybnMge1NkY1F1ZXJ5U2V0fVxuICAgKi9cbiAgc2V0RmlsdGVyKG1vZGVsUXVlcnkpIHtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgYWRkRmlsdGVyKG1vZGVsUXVlcnkpIHtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm1vZGVsUXVlcnksIG1vZGVsUXVlcnkpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7P29iamVjdH0gdmFsdWVzXG4gICAqIEByZXR1cm5zIHtTZGNNb2RlbH1cbiAgICovXG4gIG5ldyh2YWx1ZXMgPSB7fSkge1xuICAgIGNvbnN0IG5ld01vZGVsID0gbmV3IChnZXRNb2RlbCh0aGlzLm1vZGVsTmFtZSkpKHZhbHVlcyk7XG4gICAgbmV3TW9kZWwuX3NldFF1ZXJ5U2V0KHRoaXMsIGZhbHNlKTtcbiAgICB0aGlzLnZhbHVlc0xpc3QucHVzaChuZXdNb2RlbCk7XG4gICAgcmV0dXJuIG5ld01vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbW9kZWwgaW5zdGFuY2VzIG1hdGNoaW5nIHRoZSBjdXJyZW50IHF1ZXJ5IGludG8gdGhlIHF1ZXJ5c2V0IGNhY2hlLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1vZGVsUXVlcnlcbiAgICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICAgKiBAcGFyYW0gez9udW1iZXJ9IFtvcHRpb25zLmxpbWl0XSBsb2FkIGF0IG1vc3QgdGhpcyBtYW55IGluc3RhbmNlcyAodGhlIHNlcnZlciBzbGljZXMgdGhlIHF1ZXJ5KVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTZGNRdWVyeVNldD59XG4gICAqL1xuICBsb2FkKG1vZGVsUXVlcnkgPSBudWxsLCB7IGxpbWl0ID0gbnVsbCB9ID0ge30pIHtcbiAgICB0aGlzLnZhbHVlc0xpc3QgPSBbXTtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5ID8/IHRoaXMubW9kZWxRdWVyeTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZExvYWQobnVsbCwgbGltaXQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbW9kZWwgaW5zdGFuY2VzIG1hdGNoaW5nIHRoZSBjdXJyZW50IHF1ZXJ5IGludG8gdGhlIHF1ZXJ5c2V0IGNhY2hlLlxuICAgKlxuICAgKiBAcGFyYW0gez9vYmplY3R9IG1vZGVsUXVlcnlcbiAgICogQHBhcmFtIHs/U2RjTW9kZWx9IGl0ZW1cbiAgICogQHJldHVybnMge1Byb21pc2U8U2RjUXVlcnlTZXQ+fVxuICAgKi9cbiAgdXBkYXRlKHsgbW9kZWxRdWVyeSA9IG51bGwsIGl0ZW0gPSBudWxsIH0pIHtcbiAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5ID8/IHRoaXMubW9kZWxRdWVyeTtcbiAgICBsZXQgbG9hZFF1ZXJ5ID0gaXRlbSA/IHsgaWQ6IGl0ZW0uaWQgfSA6IHRoaXMubW9kZWxRdWVyeTtcbiAgICByZXR1cm4gdGhpcy5fc2VuZExvYWQobG9hZFF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcGsge2ludGVncn1cbiAgICogQHBhcmFtIGVsZW0ge1NkY01vZGVsfVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICovXG4gIGRlbGV0ZSh7IHBrID0gbnVsbCwgaWQgPSBudWxsLCBlbGVtID0gbnVsbCB9KSB7XG4gICAgcGsgPz89IGlkO1xuICAgIHBrID0gIWVsZW0gPyBwayA6IGVsZW0uaWQ7XG4gICAgaWYgKHBrID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwayBvciBlbGVtIG11c3QgYmUgc2V0XCIpO1xuICAgIH1cbiAgICBjb25zdCBldmVudF9pZCA9IHV1aWR2NCgpO1xuICAgIHJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICBldmVudF90eXBlOiBcImRlbGV0ZVwiLFxuICAgICAgICAgICAgZXZlbnRfaWQsXG4gICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgICBpZDogcGssXG4gICAgICAgICAgICAgIHBrXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gWyhyZXMpID0+IHtcbiAgICAgICAgICB0aGlzLl9yZW1vdmVJZHMoW25vcm1hbGl6ZVBrKHBrKV0pO1xuICAgICAgICAgIHJlc29sdmUocmVzKTtcbiAgICAgICAgfSwgcmVqZWN0XTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcXVlc3QgdGhlIHNlcnZlci1zaWRlIHF1ZXJ5c2V0IGRhdGEgb3ZlciB0aGUgbW9kZWwgd2Vic29ja2V0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTwqPn1cbiAgICovXG4gIF9zZW5kTG9hZChsb2FkUXVlcnkgPSBudWxsLCBsaW1pdCA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgY29uc3QgZXZlbnRfaWQgPSB1dWlkdjQoKTtcbiAgICAgIGNvbnN0IGFyZ3MgPSB7XG4gICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICBtb2RlbF9xdWVyeTogbG9hZFF1ZXJ5ID8/IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgIH07XG4gICAgICBpZiAobGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgYXJncy5saW1pdCA9IGxpbWl0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgICAgZXZlbnRfdHlwZTogXCJsb2FkXCIsXG4gICAgICAgICAgICBldmVudF9pZCxcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtldmVudF9pZF0gPSBbKGRhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfSwgcmVqZWN0XTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgbGlzdC12aWV3IGVuZHBvaW50IGZvciB0aGUgY3VycmVudCBtb2RlbC5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBfc2VuZExpc3RWaWV3KHtcbiAgICAgICAgICAgICAgICAgIG1vZGVsUXVlcnkgPSB7fSxcbiAgICAgICAgICAgICAgICAgIGNiUmVzb2x2ZSA9IG51bGwsXG4gICAgICAgICAgICAgICAgICBjYlJlamVjdCA9IG51bGwsXG4gICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUNvbnRleHQgPSB7fSxcbiAgICAgICAgICAgICAgICB9KSB7XG4gICAgcmV0dXJuIHRoaXMudmlldyh7XG4gICAgICBtb2RlbFF1ZXJ5LFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICB0ZW1wbGF0ZUNvbnRleHQsXG4gICAgICBldmVudFR5cGU6IFwibGlzdF92aWV3XCIsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVyIGEgbmFtZWQgbW9kZWwgdmlldyBhbmQgYXBwZW5kIGl0cyBIVE1MIHRvIGEgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgdmlldyh7XG4gICAgICAgICB2aWV3TmFtZSA9IFwiaHRtbF9saXN0X3RlbXBsYXRlXCIsXG4gICAgICAgICBtb2RlbFF1ZXJ5ID0ge30sXG4gICAgICAgICBjYlJlc29sdmUgPSBudWxsLFxuICAgICAgICAgY2JSZWplY3QgPSBudWxsLFxuICAgICAgICAgdGVtcGxhdGVDb250ZXh0ID0ge30sXG4gICAgICAgICBldmVudFR5cGUgPSBcIm5hbWVkX3ZpZXdcIixcbiAgICAgICB9KSB7XG4gICAgbGV0ICRkaXZMaXN0ID0gJCgnPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPicpO1xuICAgIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50X2lkID0gdXVpZHY0KCk7XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKFxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICBldmVudF90eXBlOiBldmVudFR5cGUsXG4gICAgICAgICAgZXZlbnRfaWQsXG4gICAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgdmlld19uYW1lOiB2aWV3TmFtZSxcbiAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgbW9kZWxfcXVlcnk6IG1vZGVsUXVlcnksXG4gICAgICAgICAgICB0ZW1wbGF0ZV9jb250ZXh0OiB0ZW1wbGF0ZUNvbnRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICB0aGlzLm9wZW5SZXF1ZXN0W2V2ZW50X2lkXSA9IFtcbiAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAkZGl2TGlzdC5hcHBlbmQoZGF0YS5odG1sKTtcbiAgICAgICAgICBhcHAucmVmcmVzaCgkZGl2TGlzdCk7XG4gICAgICAgICAgY2JSZXNvbHZlICYmIGNiUmVzb2x2ZShkYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgIGNiUmVqZWN0ICYmIGNiUmVqZWN0KHJlcyk7XG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZMaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgZGV0YWlsLXZpZXcgZW5kcG9pbnQgZm9yIGEgc2luZ2xlIG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIF9zZW5kRGV0YWlsVmlldyh7XG4gICAgICAgICAgICAgICAgICAgIHBrID0gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaWQgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjYlJlc29sdmUgPSBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjYlJlamVjdCA9IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29udGV4dCA9IHt9LFxuICAgICAgICAgICAgICAgICAgfSkge1xuICAgIHBrID8/PSBpZDtcbiAgICBwayA9IG5vcm1hbGl6ZVBrKHBrKTtcbiAgICBsZXQgJGRpdkxpc3QgPSAkKCc8ZGl2IGNsYXNzPVwiY29udGFpbmVyLWZsdWlkXCI+Jyk7XG5cbiAgICB0aGlzLmlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBldmVudF9pZCA9IHV1aWR2NCgpO1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgZXZlbnRfdHlwZTogXCJkZXRhaWxfdmlld1wiLFxuICAgICAgICAgIGV2ZW50X2lkLFxuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICAgIGlkOiBwayxcbiAgICAgICAgICAgIHBrLFxuICAgICAgICAgICAgdGVtcGxhdGVfY29udGV4dDogdGVtcGxhdGVDb250ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5vcGVuUmVxdWVzdFtldmVudF9pZF0gPSBbXG4gICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgJGRpdkxpc3QuYXBwZW5kKGRhdGEuaHRtbCk7XG4gICAgICAgICAgYXBwLnJlZnJlc2goJGRpdkxpc3QpO1xuICAgICAgICAgIGNiUmVzb2x2ZSAmJiBjYlJlc29sdmUoZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIChyZXMpID0+IHtcbiAgICAgICAgICBjYlJlamVjdCAmJiBjYlJlamVjdChyZXMpO1xuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2TGlzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIG1vZGVsIGZvcm0gZnJhZ21lbnQgYW5kIGF0dGFjaCB0aGUgU0RDIGZvcm0gbWV0YWRhdGEgZXhwZWN0ZWQgYnlcbiAgICogdGhlIHJlc3Qgb2YgdGhlIGNsaWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50VHlwZVxuICAgKiBAcGFyYW0ge1NkY01vZGVsfSBtb2RlbE9ialxuICAgKiBAcGFyYW0gZm9ybU5hbWVcbiAgICogQHBhcmFtICRkaXZGb3JtXG4gICAqIEBwYXJhbSBjYlJlc29sdmVcbiAgICogQHBhcmFtIGNiUmVqZWN0XG4gICAqIEBwYXJhbSBmb3JtSWRcbiAgICovXG4gIGdldEZvcm0oeyBtb2RlbE9iaiwgZXZlbnRUeXBlLCBmb3JtTmFtZSwgJGRpdkZvcm0sIGNiUmVzb2x2ZSwgY2JSZWplY3QsIGZvcm1JZCB9KSB7XG4gICAgY29uc3QgZXZlbnRfaWQgPSB1dWlkdjQoKTtcbiAgICBjb25zdCBwayA9IG1vZGVsT2JqLmlkID8/IC0xO1xuICAgIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgIGV2ZW50X3R5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgICBldmVudF9pZCxcbiAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgIGlkOiBwayxcbiAgICAgICAgICAgIHBrLFxuICAgICAgICAgICAgZm9ybV9uYW1lOiBmb3JtTmFtZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBjbGFzc05hbWUgPSBwayA9PT0gbnVsbCB8fCBwayA9PT0gLTEgPyBcImNyZWF0ZVwiIDogXCJlZGl0XCI7XG5cbiAgICB0aGlzLm9wZW5SZXF1ZXN0W2V2ZW50X2lkXSA9IFtcbiAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICRkaXZGb3JtLmFwcGVuZChkYXRhLmh0bWwpO1xuICAgICAgICBsZXQgJGZvcm0gPSAkZGl2Rm9ybVxuICAgICAgICAgIC5jbG9zZXN0KFwiZm9ybVwiKVxuICAgICAgICAgIC5hZGRDbGFzcyhcbiAgICAgICAgICAgIGBzZGMtbW9kZWwtJHtjbGFzc05hbWV9LWZvcm0gc2RjLW1vZGVsLWZvcm0gJHtmb3JtSWR9YCxcbiAgICAgICAgICApXG4gICAgICAgICAgLmRhdGEoXCJtb2RlbFwiLCBtb2RlbE9iailcbiAgICAgICAgICAuZGF0YShcIm1vZGVsX3BrXCIsIHBrKVxuICAgICAgICAgIC5kYXRhKFwiZm9ybV9uYW1lXCIsIGZvcm1OYW1lKVxuICAgICAgICAgIC5hdHRyKCdTZGNNb2RlbE5hbWUnLCB0aGlzLm1vZGVsTmFtZSlcbiAgICAgICAgICAuYXR0cignU2RjTW9kZWxQSycsIHBrKTtcbiAgICAgICAgbW9kZWxPYmouYWRkRm9ybSgkZm9ybSk7XG4gICAgICAgIGlmICgkZm9ybS5sZW5ndGggPiAwICYmICEkZm9ybVswXS5oYXNBdHRyaWJ1dGUoXCJzZGNfc3VibWl0XCIpKSB7XG4gICAgICAgICAgJGZvcm0uYXR0cihcInNkY19zdWJtaXRcIiwgXCJzdWJtaXRNb2RlbEZvcm1EaXN0cmlidXRvclwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFwcC5yZWZyZXNoKCRkaXZGb3JtKS50aGVuKCgpID0+IG51bGwpO1xuICAgICAgICBjYlJlc29sdmUgJiYgY2JSZXNvbHZlKGRhdGEpO1xuICAgICAgfSxcbiAgICAgIChyZXMpID0+IHtcbiAgICAgICAgY2JSZWplY3QgJiYgY2JSZWplY3QocmVzKTtcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIHNpbmdsZSBtb2RlbCBpbnN0YW5jZSBtYXRjaGluZyB0aGUgY3VycmVudCBxdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIHs/b2JqZWN0fSBtb2RlbFF1ZXJ5XG4gICAqIEBwYXJhbSB7P2Jvb2xlYW59IGRvTm90TG9hZCB0cnVlIGlmIG1vZGVsUXVlcnkgY29udGFpbnMgaWQgb3IgcGsgYW5kIG9iamVjdCBkb2VzIG5vdCBuZWVkIHRvIGJlIGxvYWRlZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U2RjTW9kZWw+fVxuICAgKi9cbiAgYXN5bmMgZ2V0KG1vZGVsUXVlcnkgPSBudWxsLCBkb05vdExvYWQgPSBmYWxzZSkge1xuICAgIGlmIChkb05vdExvYWQpIHtcbiAgICAgIGNvbnN0IGlkID0gbW9kZWxRdWVyeT8uaWQgPz8gdGhpcy5tb2RlbFF1ZXJ5Py5pZDtcbiAgICAgIGlmKG1vZGVsUXVlcnkpIHtcbiAgICAgICAgdGhpcy5zZXRGaWx0ZXIobW9kZWxRdWVyeSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5ieUlkKGlkKSA/PyB0aGlzLm5ldyhtb2RlbFF1ZXJ5IHx8IHRoaXMubW9kZWxRdWVyeSk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMubG9hZChtb2RlbFF1ZXJ5KTtcbiAgICBpZiAodGhpcy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbW9kZWwgcXVlcnkgcmV0dXJucyAke3RoaXMubGVuZ3RofSBidXQgb25seSAxIGV4cGVjdGVkLmApO1xuICAgIH1cblxuICAgIHRoaXMuYWRkRmlsdGVyKHsgaWQ6IHRoaXMudmFsdWVzTGlzdFswXS5pZCB9KTtcblxuICAgIHJldHVybiB0aGlzLnZhbHVlc0xpc3RbMF07XG4gIH1cblxuICBkZXRhaWxWaWV3KHsgcGssIGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCwgdGVtcGxhdGVDb250ZXh0ID0ge30gfSkge1xuICAgIHJldHVybiB0aGlzLl9zZW5kRGV0YWlsVmlldyh7XG4gICAgICBpZDogcGssXG4gICAgICBjYlJlc29sdmUsXG4gICAgICBjYlJlamVjdCxcbiAgICAgIHRlbXBsYXRlQ29udGV4dCxcbiAgICB9KTtcbiAgfVxuXG4gIGxpc3RWaWV3KHsgbW9kZWxRdWVyeSA9IHt9LCBzZWFyY2hWYWx1ZXMgPSB7fSwgY2JSZXNvbHZlID0gbnVsbCwgY2JSZWplY3QgPSBudWxsLCB0ZW1wbGF0ZUNvbnRleHQgPSB7fSB9KSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbmRMaXN0Vmlldyh7XG4gICAgICBtb2RlbFF1ZXJ5OiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm1vZGVsUXVlcnksIG1vZGVsUXVlcnksIHsgJ19fc2VhcmNoX3ZhbHVlcyc6IHNlYXJjaFZhbHVlcyB9KSxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgdGVtcGxhdGVDb250ZXh0LFxuICAgIH0pO1xuICB9XG5cbiAgc2F2ZSh7IHBrID0gbnVsbCwgaWQgPSBudWxsLCBmb3JtTmFtZSA9IFwiZWRpdF9mb3JtXCIsIGRhdGEgPSBudWxsIH0gPSB7fSkge1xuICAgIHBrID8/PSBpZDtcbiAgICBjb25zdCBub3JtUGsgPSBub3JtYWxpemVQayhwayk7XG4gICAgcmV0dXJuIHRoaXMuaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgIGxldCBlbGVtTGlzdDtcbiAgICAgIGlmIChub3JtUGsgPiAtMSkge1xuICAgICAgICBjb25zdCBlbGVtID0gdGhpcy5ieUlkKG5vcm1Qayk7XG4gICAgICAgIGlmICghZWxlbSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgU2RjTW9kZWxFcnJvcihgRWxlbWVudCBub3QgZm91bmQgd2l0aCBJRDogJHtub3JtUGt9YCkpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1MaXN0ID0gW2VsZW1dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbUxpc3QgPSB0aGlzLnZhbHVlc0xpc3Q7XG4gICAgICB9XG4gICAgICBsZXQgcExpc3QgPSBbXTtcbiAgICAgIGVsZW1MaXN0LmZvckVhY2goKGVsZW0pID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnRfaWQgPSB1dWlkdjQoKTtcbiAgICAgICAgcExpc3QucHVzaChcbiAgICAgICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZWFkRmlsZXMoZWxlbSkudGhlbigoZmlsZXMpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc2VuZERhdGEgPSBkYXRhID8geyAuLi5kYXRhIH0gOiBlbGVtLnNlcmlhbGl6ZSgpO1xuICAgICAgICAgICAgICBzZW5kRGF0YS5pZCA9IGVsZW0uaWQ7XG4gICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6IFwic2F2ZVwiLFxuICAgICAgICAgICAgICAgICAgZXZlbnRfaWQsXG4gICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1fbmFtZTogZm9ybU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBzZW5kRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHNlbmREYXRhLmlkLFxuICAgICAgICAgICAgICAgICAgICBwazogc2VuZERhdGEuaWQsXG4gICAgICAgICAgICAgICAgICAgIGZpbGVzOiBmaWxlcyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtldmVudF9pZF0gPSBbXG4gICAgICAgICAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPVxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzLmRhdGEuaW5zdGFuY2UgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IEpTT04ucGFyc2UocmVzLmRhdGEuaW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgICAgICAgOiByZXMuZGF0YS5pbnN0YW5jZTtcbiAgICAgICAgICAgICAgICAgIHJlcy5kYXRhLmluc3RhbmNlID0gdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoZGF0YSk7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwocExpc3QpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBpbiB0aGUgREIuXG4gICAqXG4gICAqIEBwYXJhbSB7e2VsZW0/OiBTZGNNb2RlbCwgZGF0YT86IG9iamVjdH0gfCBvYmplY3R9IGFyZ1xuICAgKiAgIEVpdGhlciBhbiBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIGBlbGVtYCBhbmQvb3IgYGRhdGFgLFxuICAgKiAgIG9yIGBkYXRhYCBkaXJlY3RseS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY3JlYXRlKHsgZWxlbSwgZGF0YSB9KTtcbiAgICogY3JlYXRlKHsgZWxlbSB9KTtcbiAgICogY3JlYXRlKGRhdGEpO1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx1bmtub3duPn1cbiAgICovXG4gIGNyZWF0ZShhcmcgPSBudWxsKSB7XG4gICAgbGV0IHsgZWxlbSA9IG51bGwsIGRhdGEgPSBudWxsIH0gPSBpc0NyZWF0ZU9wdGlvbnMoYXJnKSA/IGFyZyA6IHsgZGF0YTogYXJnIH07XG4gICAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBkYXRhID0gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBldmVudF9pZCA9IHV1aWR2NCgpO1xuICAgIGlmICghZWxlbSkge1xuICAgICAgZWxlbSA9IHRoaXMubmV3KGRhdGEpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fcmVhZEZpbGVzKGVsZW0pLnRoZW4oKGZpbGVzKSA9PiB7XG4gICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChcbiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgZXZlbnQ6IFwibW9kZWxcIixcbiAgICAgICAgICAgICAgZXZlbnRfdHlwZTogXCJjcmVhdGVcIixcbiAgICAgICAgICAgICAgZXZlbnRfaWQsXG4gICAgICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgICAgICBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsTmFtZSxcbiAgICAgICAgICAgICAgICBtb2RlbF9xdWVyeTogdGhpcy5tb2RlbFF1ZXJ5LFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEgPz8gZWxlbT8uc2VyaWFsaXplKCkgPz8ge30sXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gW1xuICAgICAgICAgICAgKHJlcykgPT4ge1xuICAgICAgICAgICAgICBsZXQgZGF0YSA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIHJlcy5kYXRhLmluc3RhbmNlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICA/IEpTT04ucGFyc2UocmVzLmRhdGEuaW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgICA6IHJlcy5kYXRhLmluc3RhbmNlO1xuICAgICAgICAgICAgICBpZiAoZWxlbSkge1xuICAgICAgICAgICAgICAgIGVsZW0uaWQgPSBkYXRhWzBdPy5pZCB8fCBkYXRhWzBdPy5waztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXMuZGF0YS5pbnN0YW5jZSA9IHRoaXMuX3BhcnNlU2VydmVyUmVzKGRhdGEpWzBdO1xuICAgICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVqZWN0LFxuICAgICAgICAgIF07XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIHRoZSB3ZWJzb2NrZXQgaXMgb3BlbiBhbmQgaGFzIGNvbXBsZXRlZCB0aGUgc2VydmVyLXNpZGUgY29ubmVjdFxuICAgKiBoYW5kc2hha2UgYmVmb3JlIGlzc3VpbmcgbW9kZWwgcmVxdWVzdHMuXG4gICAqXG4gICAqIE11bHRpcGxlIGNhbGxlcnMgY2FuIGFycml2ZSB3aGlsZSBhIGNvbm5lY3Rpb24gYXR0ZW1wdCBpcyBhbHJlYWR5IGluXG4gICAqIHByb2dyZXNzLiBJbiB0aGF0IGNhc2UgdGhleSBhcmUgcXVldWVkIGJlaGluZCB0aGUgc2FtZSBzeW50aGV0aWMgcmVxdWVzdCBpZC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBpc0Nvbm5lY3RlZCgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lzQ29ubmVjdGVkKSB7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICF0aGlzLl9pc0Nvbm5lY3RpbmdQcm9jZXNzIHx8XG4gICAgICAgICF0aGlzLm9wZW5SZXF1ZXN0W0NPTk5FQ1RJTkdfUkVRVUVTVF9JRF1cbiAgICAgICkge1xuICAgICAgICB0aGlzLl9pc0Nvbm5lY3RpbmdQcm9jZXNzID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtDT05ORUNUSU5HX1JFUVVFU1RfSURdID0gWygpID0+IHtcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICB9XTtcbiAgICAgICAgdGhpcy5fY29ubmVjdFRvU2VydmVyKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSh0aGlzLl9jaGVja0Nvbm5lY3Rpb24oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgW3Jlc29sdmVPcmlnaW4sIHJlamVjdE9yaWdpbl0gPVxuICAgICAgICAgIHRoaXMub3BlblJlcXVlc3RbQ09OTkVDVElOR19SRVFVRVNUX0lEXTtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtDT05ORUNUSU5HX1JFUVVFU1RfSURdID0gW1xuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmVPcmlnaW4oKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlamVjdE9yaWdpbigpO1xuICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZSB0aGUgd2Vic29ja2V0IGFuZCBkaXNhYmxlIGF1dG9tYXRpYyByZWNvbm5lY3QgZm9yIHRoaXMgcXVlcnlzZXQuXG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuX2F1dG9SZWNvbm5lY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuc29ja2V0Lm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICB9O1xuICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgIGRlbGV0ZSB0aGlzW1wic29ja2V0XCJdO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWVzTGlzdC5mb3JFYWNoKChlbGVtKSA9PiB7XG4gICAgICBlbGVtLl9vbkNsb3NlKClcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWQgYXR0YWNoZWQgYEZpbGVgIHZhbHVlcyBpbiBmaXhlZC1zaXplIGNodW5rcyBiZWZvcmUgc2F2ZS9jcmVhdGUgY2FsbHMuXG4gICAqXG4gICAqIEBwYXJhbSB7U2RjTW9kZWx9IGVsZW1cbiAgICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn1cbiAgICovXG4gIF9yZWFkRmlsZXMoZWxlbSkge1xuICAgIGxldCB0b1NvbHZlID0gW107XG4gICAgbGV0IGZpbGVzID0ge307XG4gICAgaWYgKCFlbGVtKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZpbGVzKTtcbiAgICB9XG4gICAgT2JqZWN0LmtleXMoZWxlbS5jb25zdHJ1Y3Rvci5maWVsZHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBlbGVtW2tleV07XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgIHRvU29sdmUucHVzaChcbiAgICAgICAgICBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBldmVudF9pZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtldmVudF9pZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcblxuICAgICAgICAgICAgdmFsdWUuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgICAgICAgICAgIGxldCBudW1iZXJPZkNodW5rcyA9IE1hdGguY2VpbChyZXN1bHQubGVuZ3RoIC8gTUFYX0ZJTEVfVVBMT0FEKTtcbiAgICAgICAgICAgICAgZmlsZXNba2V5XSA9IHtcbiAgICAgICAgICAgICAgICBpZDogZXZlbnRfaWQsXG4gICAgICAgICAgICAgICAgZmlsZV9uYW1lOiB2YWx1ZS5uYW1lLFxuICAgICAgICAgICAgICAgIGZpZWxkX25hbWU6IGtleSxcbiAgICAgICAgICAgICAgICBjb250ZW50X2xlbmd0aDogdmFsdWUuc2l6ZSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1iZXJPZkNodW5rczsgKytpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBBcnJheS5mcm9tKHJlc3VsdC5zbGljZShcbiAgICAgICAgICAgICAgICAgIE1BWF9GSUxFX1VQTE9BRCAqIGksXG4gICAgICAgICAgICAgICAgICBNQVhfRklMRV9VUExPQUQgKiAoaSArIDEpLFxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50OiBcIm1vZGVsXCIsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X3R5cGU6IFwidXBsb2FkXCIsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50X2lkLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgY2h1bmssXG4gICAgICAgICAgICAgICAgICAgICAgaWR4OiBpLFxuICAgICAgICAgICAgICAgICAgICAgIG51bWJlcl9vZl9jaHVua3M6IG51bWJlck9mQ2h1bmtzLFxuICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudF9sZW5ndGg6IHZhbHVlLnNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlOiB2YWx1ZS50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3F1ZXJ5OiB0aGlzLm1vZGVsUXVlcnksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuX2Nsb3NlT3BlblJlcXVlc3QoZXZlbnRfaWQpO1xuICAgICAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHRvU29sdmUpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlIHdlYnNvY2tldCByZXNwb25zZXMgdG8gdGhlIG1hdGNoaW5nIHBlbmRpbmcgcmVxdWVzdCBhbmQgdXBkYXRlIGxvY2FsXG4gICAqIHN0YXRlIHdoZW4gdGhlIHNlcnZlciBzZW5kcyBtb2RlbCBwYXlsb2Fkcy5cbiAgICpcbiAgICogQHBhcmFtIHtNZXNzYWdlRXZlbnR9IGVcbiAgICovXG4gIGFzeW5jIF9vbk1lc3NhZ2UoZSkge1xuICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgIGlmIChkYXRhLmlzX2Vycm9yKSB7XG4gICAgICBpZiAoT2JqZWN0Lmhhc093bih0aGlzLm9wZW5SZXF1ZXN0LCBkYXRhLmV2ZW50X2lkKSkge1xuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W2RhdGEuZXZlbnRfaWRdWzFdKG5ldyBTZGNNb2RlbEVycm9yKGRhdGEpKTtcbiAgICAgICAgdGhpcy5fY2xvc2VPcGVuUmVxdWVzdChkYXRhLmV2ZW50X2lkKTtcbiAgICAgIH1cbiAgICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgICB0cmlnZ2VyKFwicHVzaEVycm9yTXNnXCIsIGRhdGEuaGVhZGVyIHx8IFwiXCIsIGRhdGEubXNnIHx8IFwiXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS50eXBlID09PSBcImNvbm5lY3RcIikge1xuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W0NPTk5FQ1RJTkdfUkVRVUVTVF9JRF1bMV0obmV3IFNkY01vZGVsRXJyb3IoZGF0YSkpO1xuICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KENPTk5FQ1RJTkdfUkVRVUVTVF9JRCk7XG4gICAgICAgIHRoaXMuX2F1dG9SZWNvbm5lY3QgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICAgIHRyaWdnZXIoXCJwdXNoTXNnXCIsIGRhdGEuaGVhZGVyIHx8IFwiXCIsIGRhdGEubXNnIHx8IFwiXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF0YS50eXBlID09PSBcImNvbm5lY3RcIikge1xuICAgICAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2lzQ29ubmVjdGluZ1Byb2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5vcGVuUmVxdWVzdFtDT05ORUNUSU5HX1JFUVVFU1RfSURdWzBdKGRhdGEpO1xuICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KENPTk5FQ1RJTkdfUkVRVUVTVF9JRCk7XG4gICAgICB9IGVsc2UgaWYgKFtcImxvYWRcIiwgXCJsaXN0X3ZpZXdcIiwgXCJuYW1lZF92aWV3XCIsIFwiZGV0YWlsX3ZpZXdcIl0uaW5jbHVkZXMoZGF0YS50eXBlKSkge1xuICAgICAgICBjb25zdCBqc29uUmVzID0gSlNPTi5wYXJzZShkYXRhLmFyZ3MuZGF0YSk7XG4gICAgICAgIGRhdGEuYXJncy5kYXRhID0gYXdhaXQgdGhpcy5fcGFyc2VTZXJ2ZXJSZXMoanNvblJlcyk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gXCJvbl91cGRhdGVcIiB8fCBkYXRhLnR5cGUgPT09IFwib25fY3JlYXRlXCIpIHtcbiAgICAgICAgY29uc3QganNvblJlcyA9IEpTT04ucGFyc2UoZGF0YS5hcmdzLmRhdGEpO1xuXG4gICAgICAgIGxldCBvYmogPSBhd2FpdCB0aGlzLl9wYXJzZVNlcnZlclJlcyhqc29uUmVzKTtcbiAgICAgICAgbGV0IGNiO1xuXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09IFwib25fY3JlYXRlXCIpIHtcbiAgICAgICAgICBjYiA9IHRoaXMub25DcmVhdGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2IgPSB0aGlzLm9uVXBkYXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgY2Iob2JqKTtcbiAgICAgICAgZGF0YS5hcmdzLmRhdGEgPSBvYmo7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gXCJvbl9kZWxldGVcIikge1xuICAgICAgICBjb25zdCBpZHMgPSBKU09OLnBhcnNlKGRhdGEuYXJncy5kYXRhKS5tYXAoKHgpID0+IG5vcm1hbGl6ZVBrKHguaWQgPz8geC5waykpO1xuICAgICAgICBjb25zdCByZW1vdmVkID0gdGhpcy5fcmVtb3ZlSWRzKGlkcyk7XG4gICAgICAgICh0aGlzLm9uRGVsZXRlID8/IHRoaXMub25VcGRhdGUpKHJlbW92ZWQpO1xuICAgICAgICBkYXRhLmFyZ3MuZGF0YSA9IHJlbW92ZWQ7XG4gICAgICB9XG5cbiAgICAgIGxldCBpbnN0YW5jZSA9IGRhdGEuZGF0YT8uaW5zdGFuY2U7XG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgZGF0YS5kYXRhLmluc3RhbmNlID0gSlNPTi5wYXJzZShkYXRhLmRhdGEuaW5zdGFuY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAoT2JqZWN0Lmhhc093bih0aGlzLm9wZW5SZXF1ZXN0LCBkYXRhLmV2ZW50X2lkKSkge1xuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0W2RhdGEuZXZlbnRfaWRdWzBdKGRhdGEpO1xuICAgICAgICB0aGlzLl9jbG9zZU9wZW5SZXF1ZXN0KGRhdGEuZXZlbnRfaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0IHVudGlsIGFsbCBpbi1mbGlnaHQgd2Vic29ja2V0IHJlcXVlc3RzIGZvciB0aGlzIHF1ZXJ5c2V0IGFyZSByZXNvbHZlZC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBub09wZW5SZXF1ZXN0cygpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm9wZW5SZXF1ZXN0KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fb25Ob09wZW5SZXF1ZXN0cy5wdXNoKHJlc29sdmUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGNvbXBsZXRlZCByZXF1ZXN0IGFuZCB3YWtlIGFueSBgbm9PcGVuUmVxdWVzdHMoKWAgd2FpdGVycyB3aGVuIHRoZVxuICAgKiByZXF1ZXN0IG1hcCBiZWNvbWVzIGVtcHR5LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRJZFxuICAgKi9cbiAgX2Nsb3NlT3BlblJlcXVlc3QoZXZlbnRJZCkge1xuICAgIGRlbGV0ZSB0aGlzLm9wZW5SZXF1ZXN0W2V2ZW50SWRdO1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLm9wZW5SZXF1ZXN0KS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMuZm9yRWFjaCgoeCkgPT4geCgpKTtcbiAgICAgIHRoaXMuX29uTm9PcGVuUmVxdWVzdHMgPSBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXN0YWJsaXNoIHRoZSByYXcgd2Vic29ja2V0IGNvbm5lY3Rpb24gZm9yIHRoaXMgcXVlcnlzZXQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgX2Nvbm5lY3RUb1NlcnZlcigpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IG1vZGVsSWRlbnRpZmllciA9XG4gICAgICAgIGAke3RoaXMubW9kZWxOYW1lfWAgKyAodGhpcy5tb2RlbElkID4gMCA/IGAvJHt0aGlzLm1vZGVsSWR9YCA6IFwiXCIpO1xuICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gXCJodHRwczpcIikge1xuICAgICAgICB0aGlzLnNvY2tldCA9IG5ldyBXZWJTb2NrZXQoXG4gICAgICAgICAgYHdzczovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy9tb2RlbC8ke21vZGVsSWRlbnRpZmllcn1gLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBuZXcgV2ViU29ja2V0KFxuICAgICAgICAgIGB3czovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy9tb2RlbC8ke21vZGVsSWRlbnRpZmllcn1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNvY2tldC5vbm1lc3NhZ2UgPSB0aGlzLl9vbk1lc3NhZ2UuYmluZCh0aGlzKTtcblxuICAgICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFNEQyBNb2RlbCAoJHt0aGlzLm1vZGVsTmFtZX0sICR7dGhpcy5tb2RlbElkfSkgU29ja2V0IGNsb3NlZCB1bmV4cGVjdGVkbHlgLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXModGhpcy5vcGVuUmVxdWVzdCkpIHtcbiAgICAgICAgICB2YWx1ZVsxXShlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5SZXF1ZXN0ID0ge307XG5cbiAgICAgICAgdGhpcy5faXNDb25uZWN0aW5nUHJvY2VzcyA9IGZhbHNlO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5fYXV0b1JlY29ubmVjdCAmJiAhdGhpcy5faXNDb25uZWN0ZWQpIHtcbiAgICAgICAgICAgIC8vIGlzQ29ubmVjdGVkKCkgb3BlbnMgdGhlIHNvY2tldCBhbmQgc2VuZHMgdGhlIGNvbm5lY3QgaGFuZHNoYWtlLCBzb1xuICAgICAgICAgICAgLy8gbGl2ZSB1cGRhdGVzIHdvcmsgYWdhaW4gYW5kIGxhdGVyIHJlcXVlc3RzIHJldXNlIHRoaXMgY29ubmVjdGlvbi5cbiAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0ZWQoKS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5zb2NrZXQub25lcnJvciA9IChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgTW9kZWwgU29ja2V0IGVuY291bnRlcmVkIGVycm9yOiAke2Vycn0gQ2xvc2luZyBzb2NrZXRgKTtcbiAgICAgICAgaWYgKHRoaXMuX2lzQ29ubmVjdGVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LmNsb3NlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdGhpcy5zb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gdGhlIGFwcGxpY2F0aW9uLWxldmVsIGNvbm5lY3QgaGFuZHNoYWtlIG9uY2UgdGhlIHdlYnNvY2tldCBvcGVucy5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8Kj59XG4gICAqL1xuICBfY2hlY2tDb25uZWN0aW9uKCkge1xuICAgIGNvbnN0IGV2ZW50X2lkID0gdXVpZHY0KCk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuc29ja2V0LnNlbmQoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudDogXCJtb2RlbFwiLFxuICAgICAgICAgIGV2ZW50X3R5cGU6IFwiY29ubmVjdFwiLFxuICAgICAgICAgIGV2ZW50X2lkLFxuICAgICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIG1vZGVsX25hbWU6IHRoaXMubW9kZWxOYW1lLFxuICAgICAgICAgICAgbW9kZWxfcXVlcnk6IHRoaXMubW9kZWxRdWVyeSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIHRoaXMub3BlblJlcXVlc3RbZXZlbnRfaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGUgYmFja2VuZCBtb2RlbCBwYXlsb2FkIGludG8gbG9jYWxseSB0cmFja2VkIG1vZGVsIG9iamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8b2JqZWN0Pn0gcmVzdWx0c1xuICAgKi9cbiAgX3BhcnNlU2VydmVyUmVzKHJlc3VsdHMpIHtcbiAgICBjb25zdCBuZXdNb2RlbHMgPSBbXVxuICAgIGZvciAoY29uc3QgeCBvZiByZXN1bHRzKSB7XG4gICAgICBjb25zdCBNb2RlbENsYXNzID0gZ2V0TW9kZWwodGhpcy5tb2RlbE5hbWUpO1xuICAgICAgaWYgKCFNb2RlbENsYXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm1vZGVsTmFtZX0gaXMgbm8gU2RjTW9kZWwuIG15YmUgdGhlIG1vZGVscyBhciBub3QgaW1wb3J0YWQuYCk7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdNb2RlbCA9IG5ldyBNb2RlbENsYXNzKHsgJ2lkJzogeC5pZCA/PyB4LnBrLCAuLi54LmZpZWxkcyB9KTtcbiAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHRoaXMuYnlJZChuZXdNb2RlbC5pZCk7XG4gICAgICBpZiAoY3VycmVudE1vZGVsKSB7XG4gICAgICAgIGN1cnJlbnRNb2RlbC5zZXRWYWx1ZXMobmV3TW9kZWwpO1xuICAgICAgICBuZXdNb2RlbHMucHVzaChjdXJyZW50TW9kZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy52YWx1ZXNMaXN0LnB1c2gobmV3TW9kZWwpO1xuICAgICAgICBuZXdNb2RlbC5fc2V0UXVlcnlTZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIG5ld01vZGVscy5wdXNoKG5ld01vZGVsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy52YWx1ZXNMaXN0LnNvcnQoKGEsIGIpID0+IGEuX2lkIC0gYi5faWQpO1xuICAgIHJldHVybiBuZXdNb2RlbHM7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2RjTW9kZWwge1xuICBzdGF0aWMgZmllbGRzID0ge307XG5cbiAgLyoqXG4gICAqIEJhc2UgbW9kZWwgd3JhcHBlciB1c2VkIGJ5IFNEQyBtb2RlbCByZWdpc3RyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZWxOYW1lXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtb2RlbE5hbWUpIHtcbiAgICB0aGlzLl9pZCA9IG51bGw7XG4gICAgdGhpcy5fZm9ybXMgPSBbXTtcbiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuZm9ybUlkID0gdXVpZHY0KCk7XG4gICAgdGhpcy5tb2RlbE5hbWUgPSBtb2RlbE5hbWU7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3Q/fSBtb2RlbFF1ZXJ5U2V0XG4gICAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudFxuICAgKiBAcmV0dXJucyB7U2RjUXVlcnlTZXR9XG4gICAqL1xuICBzdGF0aWMgcXVlcnlTZXQobW9kZWxRdWVyeVNldCA9IG51bGwsIHBhcmVudCA9IG51bGwpIHtcbiAgICBjb25zdCB7IG1vZGVsTmFtZSB9ID0gbmV3IHRoaXMoe30pO1xuICAgIGlmICghcGFyZW50KSB7XG4gICAgICByZXR1cm4gbmV3IFNkY1F1ZXJ5U2V0KG1vZGVsTmFtZSwgbW9kZWxRdWVyeVNldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmVudC5xdWVyeVNldChtb2RlbE5hbWUsIG1vZGVsUXVlcnlTZXQpO1xuICB9XG5cbiAgYWRkRm9ybSgkZm9ybSkge1xuICAgIC8vIFJlbW92ZSBvbGQgbGlzdGVuZXJzIGlmIGZvcm0gYWxyZWFkeSBzZXRcbiAgICBjb25zdCBvbkNoYW5nZSA9IHRoaXMuX29uQ2hhbmdlLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLl9mb3Jtcy5wdXNoKCRmb3JtKTtcblxuICAgIGlmICgkZm9ybSkge1xuICAgICAgLy8gQXR0YWNoIGRlbGVnYXRlZCBldmVudCBoYW5kbGVyIHRvIGFsbCBpbnB1dHNcbiAgICAgICRmb3JtLm9uKFxuICAgICAgICBcImlucHV0LmZvcm1XYXRjaGVyIGNoYW5nZS5mb3JtV2F0Y2hlclwiLFxuICAgICAgICBcImlucHV0LCBzZWxlY3QsIHRleHRhcmVhXCIsXG4gICAgICAgIG9uQ2hhbmdlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIF9vbkNoYW5nZShldmVudCkge1xuICAgIGNvbnN0IHsgbmFtZSB9ID0gZXZlbnQudGFyZ2V0O1xuICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLmZpZWxkc1tuYW1lXSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpc1tgc2V0JHtuYW1lfWBdKGdldFZhbHVlRnJvbUZpZWxkKGV2ZW50LnRhcmdldCkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIEludmFsaWQgaW5wdXQgKGUuZy4gYW4gZW1wdHkgcmVxdWlyZWQgZmllbGQpIGlzIGtlcHQgaW4gdGhlIGZvcm0gYW5kXG4gICAgICAgIC8vIHZhbGlkYXRlZCBieSB0aGUgc2VydmVyIG9uIHN1Ym1pdC5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gU2hvdyB0aGUgbmV3IHZhbHVlIGluIHRoZSBvdGhlciBmb3JtcyBvZiB0aGlzIG1vZGVsLCBub3QgaW4gdGhlIGlucHV0IGJlaW5nIGVkaXRlZC5cbiAgICAgIHRoaXMuX3VwZGF0ZUZvcm0obmFtZSwgZXZlbnQudGFyZ2V0KTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlRm9ybShmaWVsZE5hbWUsIHNraXBFbGVtZW50ID0gbnVsbCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX2Zvcm1zLmZvckVhY2goKCRmb3JtKSA9PiB7XG4gICAgICAkZm9ybS5maW5kKGBbbmFtZT1cIiR7ZmllbGROYW1lfVwiXWApLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcyAhPT0gc2tpcEVsZW1lbnQpIHtcbiAgICAgICAgICBzZXRWYWx1ZUluRmllbGQodGhpcywgc2VsZltmaWVsZE5hbWVdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzZXRWYWx1ZXMoZGF0YSA9IHt9KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwic2V0VmFsdWVzKCkgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc1wiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggdGhlIHF1ZXJ5c2V0IHRoYXQgb3ducyB0aGlzIG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0ge1NkY1F1ZXJ5U2V0fSBxdWVyeVNldFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzTG9hZGVkXG4gICAqL1xuICBfc2V0UXVlcnlTZXQocXVlcnlTZXQsIGlzTG9hZGVkKSB7XG4gICAgdGhpcy5fcXVlcnlTZXQgPSBuZXcgV2Vha1JlZihxdWVyeVNldCk7XG4gICAgdGhpcy5sb2FkZWQgPSBpc0xvYWRlZDtcbiAgfVxuXG4gIGdldCBxdWVyeVNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKTtcbiAgfVxuXG4gIHNhdmUoeyBmb3JtTmFtZSA9IFwiZWRpdF9mb3JtXCIsIGRhdGEgPSBudWxsIH0gPSB7fSkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLnNhdmUoeyBwazogdGhpcy5pZCwgZm9ybU5hbWUsIGRhdGEgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoaXMgaW5zdGFuY2UgaW4gdGhlIERCLlxuICAgKlxuICAgKiBAcGFyYW0ge3tkYXRhPzogb2JqZWN0fSB8IG9iamVjdCB8IG51bGx9IHZhbHVlc1xuICAgKiAgIEVpdGhlciBgeyBkYXRhIH1gIG9yIGBkYXRhYCBkaXJlY3RseS5cbiAgICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gICAqL1xuICBjcmVhdGUodmFsdWVzID0gbnVsbCkge1xuICAgIGNvbnN0IGRhdGEgPSBpc0NyZWF0ZU9wdGlvbnModmFsdWVzKSA/ICh2YWx1ZXMuZGF0YSA/PyBudWxsKSA6IHZhbHVlcztcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5jcmVhdGUoeyBlbGVtOiB0aGlzLCBkYXRhIH0pO1xuICB9XG5cbiAgZGVsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmRlbGV0ZSh7IGVsZW06IHRoaXMgfSk7XG4gIH1cblxuICBsb2FkKCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLnVwZGF0ZSh7IGl0ZW06IHRoaXMgfSk7XG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZCgpO1xuICB9XG5cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIHNldCBpZChkYXRhKSB7XG4gICAgdGhpcy5faWQgPSBkYXRhO1xuICB9XG5cbiAgc2V0IHBrKGRhdGEpIHtcbiAgICB0aGlzLmlkID0gZGF0YTtcbiAgfVxuXG4gIGdldCBwaygpIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnlTZXQuZGVyZWYoKS5jbG9zZSgpO1xuICB9XG5cbiAgX29uQ2xvc2UoKSB7XG4gICAgT2JqZWN0LmtleXModGhpcy5jb25zdHJ1Y3Rvci5maWVsZHMpXG4gICAgICAuZmlsdGVyKCh4KSA9PiB0aGlzW2BfJHt4fWBdIGluc3RhbmNlb2YgU2RjUXVlcnlTZXQpXG4gICAgICAuZm9yRWFjaCgoeCkgPT4gdGhpc1tgXyR7eH1gXS5jbG9zZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1ZXN0IHRoZSBzZXJ2ZXItcmVuZGVyZWQgZGV0YWlsIHZpZXcgZm9yIHRoaXMgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgZGV0YWlsVmlldyh7IGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCwgdGVtcGxhdGVDb250ZXh0ID0ge30gfSkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmRldGFpbFZpZXcoeyBwazogdGhpcy5pZCwgY2JSZXNvbHZlLCBjYlJlamVjdCwgdGVtcGxhdGVDb250ZXh0IH0pO1xuICB9XG5cbiAgc2VyaWFsaXplKCkge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLmNvbnN0cnVjdG9yLmZpZWxkcykucmVkdWNlKChhY2MsIFtrZXksIHZhbF0pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpc1trZXldO1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2RjUXVlcnlTZXQpIHtcbiAgICAgICAgaWYgKHZhbC5tYW55X3RvX21hbnkgfHwgdmFsLm9uZV90b19tYW55KSB7XG4gICAgICAgICAgYWNjW2tleV0gPSB2YWx1ZS5nZXRJZHMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBhbGxJZHMgPSB2YWx1ZS5nZXRJZHMoKTtcbiAgICAgICAgICBpZiAoYWxsSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gYWxsSWRzWzBdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2Nba2V5XSA9IG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodmFsLmlzX3JlbGF0aW9uICYmIHZhbHVlIGluc3RhbmNlb2YgU2RjTW9kZWwpIHtcbiAgICAgICAgYWNjW2tleV0gPSB2YWx1ZS5pZCA/PyBudWxsO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgLy8gRGphbmdvJ3MgRGF0ZUZpZWxkIGRvZXMgbm90IGFjY2VwdCBhIGZ1bGwgSVNPIGRhdGV0aW1lLlxuICAgICAgICBhY2Nba2V5XSA9IHZhbC50eXBlID09PSBcIkRhdGVGaWVsZFwiID8gZm9ybWF0RGF0ZSh2YWx1ZSkgOiB2YWx1ZS50b0lTT1N0cmluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHRvSnNvbigpIHtcbiAgICBjb25zdCByZXMgPSB7fVxuICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmNvbnN0cnVjdG9yLmZpZWxkcykge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzW2tleV07XG5cbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgcmVzW2tleV0gPSB2YWx1ZS5uYW1lO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWUuaWQ7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2RjUXVlcnlTZXQpIHtcbiAgICAgICAgcmVzW2tleV0gPSB2YWx1ZS5nZXRJZHMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCYWNrd2FyZHMtY29tcGF0aWJsZSBhbGlhcyBmb3Igc3luY2luZyB2YWx1ZXMgZnJvbSBhIGZvcm0gaW50byB0aGUgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gJGZvcm1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgc3luY0Zvcm1Ub01vZGVsKCRmb3Jtcykge1xuICAgIHJldHVybiB0aGlzLnN5bmNGb3JtKCRmb3Jtcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZSB0aGUgZm9ybSBjb2xsZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1vZGVsIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0geyp9ICRmb3Jtc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIF9yZXNvbHZlRm9ybXMoJGZvcm1zKSB7XG4gICAgaWYgKCEkZm9ybXMgfHwgISRmb3Jtcy5oYXNDbGFzcyh0aGlzLmZvcm1JZCkpIHtcbiAgICAgIHJldHVybiAkKGAuJHt0aGlzLmZvcm1JZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gJGZvcm1zO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIGN1cnJlbnQgbW9kZWwgc3RhdGUgaW50byBtYXRjaGluZyBmb3JtIGZpZWxkcy5cbiAgICpcbiAgICogQHBhcmFtIHsqfSAkZm9ybXNcbiAgICovXG4gIHN5bmNNb2RlbFRvRm9ybSgkZm9ybXMpIHtcbiAgICAkZm9ybXMgPSB0aGlzLl9yZXNvbHZlRm9ybXMoJGZvcm1zKTtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IHsgZmllbGRzIH0gPSB0aGlzLmNvbnN0cnVjdG9yO1xuICAgICRmb3Jtcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBrID0gbm9ybWFsaXplUGsoJCh0aGlzKS5kYXRhKFwibW9kZWxfcGtcIikpO1xuICAgICAgLy8gQ3JlYXRlIGZvcm1zIGNhcnJ5IG1vZGVsX3BrIC0xIHdoaWxlIHRoZSBuZXcgbW9kZWwncyBpZCBpcyBzdGlsbCBudWxsLlxuICAgICAgaWYgKG5vcm1hbGl6ZVBrKHNlbGYuaWQpICE9PSBwaykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZvciAobGV0IGZvcm1JdGVtIG9mIHRoaXMuZWxlbWVudHMpIHtcbiAgICAgICAgbGV0IHsgbmFtZSB9ID0gZm9ybUl0ZW07XG4gICAgICAgIGlmIChuYW1lICYmIG5hbWUgIT09IFwiXCIgJiYgISFmaWVsZHNbbmFtZV0pIHtcbiAgICAgICAgICBzZXRWYWx1ZUluRmllbGQoZm9ybUl0ZW0sIHNlbGZbbmFtZV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5IG1hdGNoaW5nIGZvcm0gdmFsdWVzIGJhY2sgb250byB0aGUgY3VycmVudCBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogSGlkZGVuIGlucHV0cyBhcmUgcGFyc2VkIHRvIHRoZWlyIG9yaWdpbmFsIHByaW1pdGl2ZSB0eXBlIHdoZW4gcG9zc2libGUuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gJGZvcm1zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgc3luY0Zvcm0oJGZvcm1zKSB7XG4gICAgJGZvcm1zID0gdGhpcy5fcmVzb2x2ZUZvcm1zKCRmb3Jtcyk7XG5cbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCB7IGZpZWxkcyB9ID0gdGhpcy5jb25zdHJ1Y3RvcjtcbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IHt9XG5cbiAgICBmdW5jdGlvbiBzZXRWYWx1ZUluRm9ybShuYW1lLCB2YWx1ZSkge1xuICAgICAgaWYgKGZpZWxkc1tuYW1lXSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNlbGZbbmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gSW52YWxpZCB2YWx1ZXMgYXJlIHN0aWxsIHNlbnQgdG8gdGhlIHNlcnZlciwgd2hpY2ggcmV0dXJucyB0aGUgZm9ybVxuICAgICAgICAgIC8vIGVycm9yczsgdGhlIG1vZGVsIGtlZXBzIGl0cyBsYXN0IHZhbGlkIHZhbHVlLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm5WYWx1ZVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cblxuICAgICRmb3Jtcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBrID0gbm9ybWFsaXplUGsoJCh0aGlzKS5kYXRhKFwibW9kZWxfcGtcIikpO1xuICAgICAgaWYgKHNlbGYuaWQgIT09IHBrICYmIChzZWxmLmlkICE9PSBudWxsIHx8IHBrICE9PSAtMSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGxldCBmb3JtSXRlbSBvZiB0aGlzLmVsZW1lbnRzKSB7XG4gICAgICAgIHNldFZhbHVlSW5Gb3JtKGZvcm1JdGVtLm5hbWUsIGdldFZhbHVlRnJvbUZpZWxkKGZvcm1JdGVtKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciB0aGUgY29ycmVjdCBzZXJ2ZXItc2lkZSBmb3JtIGZvciB0aGlzIG1vZGVsIHN0YXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGZvcm0oeyBjYlJlc29sdmUgPSBudWxsLCBjYlJlamVjdCA9IG51bGwgfSA9IHt9KSB7XG4gICAgaWYgKHRoaXMuaWQgPT09IG51bGwgfHwgdGhpcy5pZCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jcmVhdGVGb3JtKHsgY2JSZWplY3QsIGNiUmVzb2x2ZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRGb3JtKHsgY2JSZWplY3QsIGNiUmVzb2x2ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGNyZWF0ZSBmb3JtIGZvciBhIG5ldyBtb2RlbCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBfY3JlYXRlRm9ybSh7IGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCB9KSB7XG4gICAgbGV0ICRkaXZGb3JtID0gJChcIjxkaXY+XCIpO1xuICAgIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuZ2V0Rm9ybSh7XG4gICAgICBtb2RlbE9iajogdGhpcyxcbiAgICAgIGV2ZW50VHlwZTogXCJjcmVhdGVfZm9ybVwiLFxuICAgICAgZm9ybU5hbWU6IG51bGwsXG4gICAgICAkZGl2Rm9ybSxcbiAgICAgIGNiUmVzb2x2ZSxcbiAgICAgIGNiUmVqZWN0LFxuICAgICAgZm9ybUlkOiB0aGlzLmZvcm1JZCxcbiAgICB9KTtcblxuICAgIHJldHVybiAkZGl2Rm9ybTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgdGhlIGVkaXQgZm9ybSBmb3IgYW4gZXhpc3RpbmcgbW9kZWwgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgX2VkaXRGb3JtKHsgY2JSZXNvbHZlID0gbnVsbCwgY2JSZWplY3QgPSBudWxsIH0pIHtcbiAgICBsZXQgJGRpdkZvcm0gPSAkKFwiPGRpdj5cIik7XG5cbiAgICB0aGlzLl9xdWVyeVNldC5kZXJlZigpLmdldEZvcm0oe1xuICAgICAgbW9kZWxPYmo6IHRoaXMsXG4gICAgICBldmVudFR5cGU6IFwiZWRpdF9mb3JtXCIsXG4gICAgICBmb3JtTmFtZTogbnVsbCxcbiAgICAgICRkaXZGb3JtLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICBmb3JtSWQ6IHRoaXMuZm9ybUlkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZGb3JtO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlciBhIG5hbWVkIHNlcnZlci1zaWRlIGZvcm0gZm9yIHRoaXMgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgbmFtZWRGb3JtKHsgZm9ybU5hbWUsIGNiUmVzb2x2ZSA9IG51bGwsIGNiUmVqZWN0ID0gbnVsbCB9KSB7XG4gICAgbGV0ICRkaXZGb3JtID0gJCgnPGRpdiAgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj4nKTtcblxuICAgIHRoaXMuX3F1ZXJ5U2V0LmRlcmVmKCkuZ2V0Rm9ybSh7XG4gICAgICBtb2RlbE9iajogdGhpcyxcbiAgICAgIGV2ZW50VHlwZTogXCJuYW1lZF9mb3JtXCIsXG4gICAgICBmb3JtTmFtZSxcbiAgICAgICRkaXZGb3JtLFxuICAgICAgY2JSZXNvbHZlLFxuICAgICAgY2JSZWplY3QsXG4gICAgICBmb3JtSWQ6IHRoaXMuZm9ybUlkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuICRkaXZGb3JtO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIGEgZmllbGQgdmFsdWUgdXNpbmcgdGhlIHN1cHBsaWVkIGZpZWxkIGNvbmZpZy5cbiAgICpcbiAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgKiBAcGFyYW0ge29iamVjdH0gY29uZmlnXG4gICAqL1xuICB2YWxpZGF0ZSh2YWx1ZSwgY29uZmlnKSB7XG4gICAgY29uc3QgZXJyID0gdmFsaWRhdGVGaWVsZCh2YWx1ZSwgY29uZmlnKTtcbiAgICBpZiAoZXJyKSB0aHJvdyBuZXcgRXJyb3IoZXJyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGEgcmF3IGlucHV0IHZhbHVlIGludG8gdGhlIHNoYXBlIGV4cGVjdGVkIGJ5IHRoZSBmaWVsZCBjb25maWcuXG4gICAqXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHBhcnNlVmFsdWUodmFsdWUsIGNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGUsXG4gICAgICBtYW55X3RvX21hbnk6IG1hbnlUb01hbnksXG4gICAgICBvbmVfdG9fbWFueTogb25lVG9NYW55LFxuICAgICAgbWFueV90b19vbmU6IG1hbnlUb09uZSxcbiAgICAgIG9uZV90b19vbmU6IG9uZVRvT25lLFxuICAgIH0gPSBjb25maWc7XG4gICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoKG1hbnlUb01hbnkgfHwgb25lVG9NYW55IHx8IG1hbnlUb09uZSB8fCBvbmVUb09uZSkgJiYgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcIkNoYXJGaWVsZFwiOlxuICAgICAgY2FzZSBcIlRleHRGaWVsZFwiOlxuICAgICAgY2FzZSBcIlNsdWdGaWVsZFwiOlxuICAgICAgY2FzZSBcIlVVSURGaWVsZFwiOlxuICAgICAgY2FzZSBcIkVtYWlsRmllbGRcIjpcbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG5cbiAgICAgIGNhc2UgXCJJbnRlZ2VyRmllbGRcIjpcbiAgICAgIGNhc2UgXCJTbWFsbEludGVnZXJGaWVsZFwiOlxuICAgICAgY2FzZSBcIkJpZ0ludGVnZXJGaWVsZFwiOlxuICAgICAgY2FzZSBcIlBvc2l0aXZlSW50ZWdlckZpZWxkXCI6XG4gICAgICBjYXNlIFwiUG9zaXRpdmVTbWFsbEludGVnZXJGaWVsZFwiOlxuICAgICAgY2FzZSBcIlBvc2l0aXZlQmlnSW50ZWdlckZpZWxkXCI6XG4gICAgICBjYXNlIFwiQXV0b0ZpZWxkXCI6XG4gICAgICBjYXNlIFwiU21hbGxBdXRvRmllbGRcIjpcbiAgICAgIGNhc2UgXCJCaWdBdXRvRmllbGRcIjpcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHZhbHVlLCAxMCk7XG5cbiAgICAgIGNhc2UgXCJGbG9hdEZpZWxkXCI6XG4gICAgICBjYXNlIFwiRGVjaW1hbEZpZWxkXCI6XG4gICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgICAgY2FzZSBcIkJvb2xlYW5GaWVsZFwiOlxuICAgICAgICByZXR1cm4gISF2YWx1ZTtcblxuICAgICAgY2FzZSBcIkRhdGVGaWVsZFwiOlxuICAgICAgY2FzZSBcIkRhdGVUaW1lRmllbGRcIjpcbiAgICAgICAgcmV0dXJuIHRvRGF0ZSh2YWx1ZSk7XG5cbiAgICAgIGNhc2UgXCJVUkxGaWVsZFwiOlxuICAgICAgICByZXR1cm4gbmV3IFVSTCh2YWx1ZSk7XG5cbiAgICAgIGNhc2UgXCJGaWxlRmllbGRcIjpcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChGaWxlTG9hZGVkLmlzVmFsaWQodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBGaWxlTG9hZGVkKHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGVMb2FkZWQpIHtcbiAgICAgICAgICByZXR1cm4gbmV3IEZpbGVMb2FkZWQodmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBGaWxlICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgIC8vIFNpemUgYW5kIHR5cGUgYXJlIGNoZWNrZWQgaW4gdmFsaWRhdGUoKS5cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJKU09ORmllbGRcIjpcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhIGZpZWxkIHZhbHVlIGFnYWluc3QgdGhlIGZpZWxkIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGJhY2tlbmQuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZ1xuICogQHJldHVybnMgez9zdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlRmllbGQodmFsdWUsIGNvbmZpZykge1xuICBjb25zdCB7XG4gICAgdHlwZSxcbiAgICByZXF1aXJlZCxcbiAgICBtYXhfbGVuZ3RoOiBtYXhMZW5ndGgsXG4gICAgaXNfcmVsYXRpb246IGlzUmVsYXRpb24sXG4gICAgbWFueV90b19tYW55OiBtYW55VG9NYW55LFxuICAgIG9uZV90b19tYW55OiBvbmVUb01hbnksXG4gICAgbWFueV90b19vbmU6IG1hbnlUb09uZSxcbiAgICBvbmVfdG9fb25lOiBvbmVUb09uZSxcbiAgICByZWxhdGVkX21vZGVsOiByZWxhdGVkTW9kZWwsXG4gIH0gPSBjb25maWc7XG5cbiAgdm9pZCBpc1JlbGF0aW9uO1xuXG4gIGlmIChyZXF1aXJlZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gXCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkXCI7XG4gICAgfVxuICB9XG5cbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChtYW55VG9NYW55IHx8IG9uZVRvTWFueSB8fCBtYW55VG9PbmUgfHwgb25lVG9PbmUpIHtcbiAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB8fCB2YWx1ZS5tb2RlbE5hbWUgIT09IHJlbGF0ZWRNb2RlbCkge1xuICAgICAgaWYodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YWx1ZSA9IEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoKG1hbnlUb01hbnkgfHwgbWFueVRvT25lKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5zb21lKCh4KSA9PiAhTnVtYmVyLmlzTmFOKHBhcnNlSW50KHgpKSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIE51bWJlci5pc05hTihwYXJzZUludCh2YWx1ZSkpKSB7XG4gICAgICAgIHJldHVybiBcIk11c3QgYmUgb2JqZWN0IG9yIElEXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIFwiQ2hhckZpZWxkXCI6XG4gICAgY2FzZSBcIlRleHRGaWVsZFwiOlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIGEgc3RyaW5nXCI7XG4gICAgICB9XG4gICAgICBpZiAobWF4TGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA+IG1heExlbmd0aCkge1xuICAgICAgICByZXR1cm4gYE1heCBsZW5ndGggaXMgJHttYXhMZW5ndGh9YDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkludGVnZXJGaWVsZFwiOlxuICAgIGNhc2UgXCJTbWFsbEludGVnZXJGaWVsZFwiOlxuICAgIGNhc2UgXCJCaWdJbnRlZ2VyRmllbGRcIjpcbiAgICBjYXNlIFwiUG9zaXRpdmVJbnRlZ2VyRmllbGRcIjpcbiAgICBjYXNlIFwiUG9zaXRpdmVTbWFsbEludGVnZXJGaWVsZFwiOlxuICAgIGNhc2UgXCJQb3NpdGl2ZUJpZ0ludGVnZXJGaWVsZFwiOlxuICAgIGNhc2UgXCJBdXRvRmllbGRcIjpcbiAgICBjYXNlIFwiU21hbGxBdXRvRmllbGRcIjpcbiAgICBjYXNlIFwiQmlnQXV0b0ZpZWxkXCI6XG4gICAgICBpZiAoIWlzRmluaXRlKHBhcnNlSW50KHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhbiBpbnRlZ2VyXCI7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgXCJGbG9hdEZpZWxkXCI6XG4gICAgY2FzZSBcIkRlY2ltYWxGaWVsZFwiOlxuICAgICAgaWYgKCFpc0Zpbml0ZShwYXJzZUZsb2F0KHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIG51bWJlclwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiQm9vbGVhbkZpZWxkXCI6XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcImJvb2xlYW5cIikge1xuICAgICAgICByZXR1cm4gXCJNdXN0IGJlIGEgYm9vbGVhblwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiRGF0ZUZpZWxkXCI6XG4gICAgY2FzZSBcIkRhdGVUaW1lRmllbGRcIjpcbiAgICAgIGlmIChpc05hTihEYXRlLnBhcnNlKHZhbHVlKSkpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIHZhbGlkIGRhdGVcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkVtYWlsRmllbGRcIjpcbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIgfHwgIS9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvLnRlc3QodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBcIkludmFsaWQgZW1haWxcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIlVSTEZpZWxkXCI6XG4gICAgICB0cnkge1xuICAgICAgICBuZXcgVVJMKHZhbHVlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gXCJJbnZhbGlkIFVSTFwiO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFwiVVVJREZpZWxkXCI6XG4gICAgICBpZiAoIS9eWzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn0kLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gXCJJbnZhbGlkIFVVSURcIjtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBcIkpTT05GaWVsZFwiOlxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEpTT04ucGFyc2UodmFsdWUpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gXCJNdXN0IGJlIHZhbGlkIEpTT05cIjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIkZpbGVGaWVsZFwiOlxuICAgICAgaWYgKCFGaWxlTG9hZGVkLmlzVmFsaWQodmFsdWUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBGaWxlKSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgRmlsZUxvYWRlZCkpIHtcbiAgICAgICAgcmV0dXJuIFwiTXVzdCBiZSBhIHZhbGlkIGZpbGVcIjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgRmlsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5tYXhfc2l6ZSAmJiB2YWx1ZS5zaXplID4gY29uZmlnLm1heF9zaXplKSB7XG4gICAgICAgICAgcmV0dXJuIGBGaWxlIHRvbyBsYXJnZSAobWF4ICR7Y29uZmlnLm1heF9zaXplfSBieXRlcylgO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuYWxsb3dlZF90eXBlcyAmJiAhY29uZmlnLmFsbG93ZWRfdHlwZXMuaW5jbHVkZXModmFsdWUudHlwZSkpIHtcbiAgICAgICAgICByZXR1cm4gYEludmFsaWQgZmlsZSB0eXBlICgke3ZhbHVlLnR5cGV9KWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_model.js\n\n}");
|
|
78
88
|
|
|
79
89
|
/***/ },
|
|
80
90
|
|
|
@@ -84,7 +94,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
84
94
|
\********************************************/
|
|
85
95
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
86
96
|
|
|
87
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getUrlParam: () => (/* binding */ getUrlParam),\n/* harmony export */ prepareData: () => (/* binding */ prepareData),\n/* harmony export */ runOnInitWithParameter: () => (/* binding */ runOnInitWithParameter)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n\n\n\nfunction prepareData(data, controller = null) {\n const data_json_key = \"SDC_JSON_MODEL=[\";\n return Object.fromEntries(\n Object.entries(data)\n .filter(([key, element]) => {\n return key !== _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY;\n })\n .map(([key, element]) => {\n if (typeof element === \"string\" && element.startsWith(data_json_key)) {\n try {\n const { pk, fields } = JSON.parse(\n element.slice(data_json_key.length, -1),\n );\n return [\n key,\n {\n ...fields,\n id: pk,\n
|
|
97
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ getUrlParam: () => (/* binding */ getUrlParam),\n/* harmony export */ prepareData: () => (/* binding */ prepareData),\n/* harmony export */ runOnInitWithParameter: () => (/* binding */ runOnInitWithParameter)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_view.js */ \"./src/simpleDomControl/sdc_view.js\");\n\n\n\nfunction prepareData(data, controller = null) {\n const data_json_key = \"SDC_JSON_MODEL=[\";\n return Object.fromEntries(\n Object.entries(data)\n .filter(([key, element]) => {\n return key !== _sdc_view_js__WEBPACK_IMPORTED_MODULE_1__.DATA_CONTROLLER_KEY;\n })\n .map(([key, element]) => {\n if (typeof element === \"string\" && element.startsWith(data_json_key)) {\n try {\n const { pk, fields } = JSON.parse(\n element.slice(data_json_key.length, -1),\n );\n return [\n key,\n {\n ...fields,\n id: pk,\n },\n ];\n } catch {\n }\n }\n return [key, (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.checkIfParamNumberBoolOrString)(element, controller)];\n }),\n );\n}\n\n\nfunction getDomTagParamsWithList($element, controller = null) {\n return prepareData($element.data(), controller);\n}\n\n/**\n *\n * @param {AbstractSDC} controller\n * @param {jquery} $element\n * @param applyController\n * @returns {boolean}\n */\nfunction reg_runOnInitWithParameter(controller, $element, applyController) {\n if (!controller) {\n return false;\n }\n\n controller.params = getDomTagParamsWithList(\n $element,\n applyController._parentController,\n );\n}\n\nfunction runOnInitWithParameter($element, controller) {\n reg_runOnInitWithParameter(controller, $element, controller);\n}\n\nfunction getUrlParam(controller, $element) {\n const values = getDomTagParamsWithList($element, controller);\n const [params, args] = Object.entries(values).reduce(([params, args], [k, v]) => {\n if (controller._urlParams.includes(k)) {\n params[k] = v;\n } else {\n args[k] = v;\n }\n return [params, args]\n }, [{}, {}]);\n\n return { params, args };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfcGFyYW1zLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBRXdCO0FBQzRCOztBQUU3QztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDZEQUFtQjtBQUMxQyxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGFBQWE7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLHFCQUFxQiw2RUFBOEI7QUFDbkQsT0FBTztBQUNQO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxhQUFhO0FBQ3hCLFdBQVcsUUFBUTtBQUNuQjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsR0FBRyxLQUFLLElBQUk7O0FBRVosV0FBVztBQUNYIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19wYXJhbXMuanM/ZDM0YyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjaGVja0lmUGFyYW1OdW1iZXJCb29sT3JTdHJpbmcsXG59IGZyb20gXCIuL3NkY191dGlscy5qc1wiO1xuaW1wb3J0IHsgREFUQV9DT05UUk9MTEVSX0tFWSB9IGZyb20gXCIuL3NkY192aWV3LmpzXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVwYXJlRGF0YShkYXRhLCBjb250cm9sbGVyID0gbnVsbCkge1xuICBjb25zdCBkYXRhX2pzb25fa2V5ID0gXCJTRENfSlNPTl9NT0RFTD1bXCI7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoZGF0YSlcbiAgICAgIC5maWx0ZXIoKFtrZXksIGVsZW1lbnRdKSA9PiB7XG4gICAgICAgIHJldHVybiBrZXkgIT09IERBVEFfQ09OVFJPTExFUl9LRVk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoW2tleSwgZWxlbWVudF0pID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiICYmIGVsZW1lbnQuc3RhcnRzV2l0aChkYXRhX2pzb25fa2V5KSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB7IHBrLCBmaWVsZHMgfSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgIGVsZW1lbnQuc2xpY2UoZGF0YV9qc29uX2tleS5sZW5ndGgsIC0xKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5maWVsZHMsXG4gICAgICAgICAgICAgICAgaWQ6IHBrLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrZXksIGNoZWNrSWZQYXJhbU51bWJlckJvb2xPclN0cmluZyhlbGVtZW50LCBjb250cm9sbGVyKV07XG4gICAgICB9KSxcbiAgKTtcbn1cblxuXG5mdW5jdGlvbiBnZXREb21UYWdQYXJhbXNXaXRoTGlzdCgkZWxlbWVudCwgY29udHJvbGxlciA9IG51bGwpIHtcbiAgcmV0dXJuIHByZXBhcmVEYXRhKCRlbGVtZW50LmRhdGEoKSwgY29udHJvbGxlcik7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXJcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbWVudFxuICogQHBhcmFtIGFwcGx5Q29udHJvbGxlclxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIHJlZ19ydW5PbkluaXRXaXRoUGFyYW1ldGVyKGNvbnRyb2xsZXIsICRlbGVtZW50LCBhcHBseUNvbnRyb2xsZXIpIHtcbiAgaWYgKCFjb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29udHJvbGxlci5wYXJhbXMgPSBnZXREb21UYWdQYXJhbXNXaXRoTGlzdChcbiAgICAkZWxlbWVudCxcbiAgICBhcHBseUNvbnRyb2xsZXIuX3BhcmVudENvbnRyb2xsZXIsXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5PbkluaXRXaXRoUGFyYW1ldGVyKCRlbGVtZW50LCBjb250cm9sbGVyKSB7XG4gIHJlZ19ydW5PbkluaXRXaXRoUGFyYW1ldGVyKGNvbnRyb2xsZXIsICRlbGVtZW50LCBjb250cm9sbGVyKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVybFBhcmFtKGNvbnRyb2xsZXIsICRlbGVtZW50KSB7XG4gIGNvbnN0IHZhbHVlcyA9IGdldERvbVRhZ1BhcmFtc1dpdGhMaXN0KCRlbGVtZW50LCBjb250cm9sbGVyKTtcbiAgY29uc3QgW3BhcmFtcywgYXJnc10gPSBPYmplY3QuZW50cmllcyh2YWx1ZXMpLnJlZHVjZSgoW3BhcmFtcywgYXJnc10sIFtrLCB2XSkgPT4ge1xuICAgIGlmIChjb250cm9sbGVyLl91cmxQYXJhbXMuaW5jbHVkZXMoaykpIHtcbiAgICAgIHBhcmFtc1trXSA9IHY7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3Nba10gPSB2O1xuICAgIH1cbiAgICByZXR1cm4gW3BhcmFtcywgYXJnc11cbiAgfSwgW3t9LCB7fV0pO1xuXG4gIHJldHVybiB7IHBhcmFtcywgYXJncyB9O1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_params.js\n\n}");
|
|
88
98
|
|
|
89
99
|
/***/ },
|
|
90
100
|
|
|
@@ -94,7 +104,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
94
104
|
\*************************************************/
|
|
95
105
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
96
106
|
|
|
97
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ callServer: () => (/* binding */ callServer),\n/* harmony export */ close: () => (/* binding */ close),\n/* harmony export */ isConnected: () => (/* binding */ isConnected)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\nlet IS_CONNECTED = false;\nlet IS_CONNECTING = false;\nlet SDC_SOCKET = null;\nlet OPEN_REQUESTS = {};\n\nfunction callServer(app, controller, parsedContentUrl, funcName, args) {\n if (window.SERVER_CALL_VIA_WEB_SOCKET) {\n return socketCallServer(app, controller, funcName, args);\n } else {\n return postCallServer(parsedContentUrl, funcName, args);\n }\n}\n\nfunction isConnected() {\n if (window.SERVER_CALL_VIA_WEB_SOCKET) {\n return socketIsConnected();\n } else {\n return Promise.resolve(true);\n }\n}\n\nfunction close() {\n if (window.SERVER_CALL_VIA_WEB_SOCKET) {\n socketClose();\n }\n}\n\nfunction postCallServer(parsedContentUrl, funcName, args) {\n if (typeof args !== \"object\" && Array.isArray(args) && args === null) {\n args = { arg0: args };\n }\n args = {\n data: JSON.stringify(args),\n _sdc_func_name: funcName,\n _method: \"sdc_server_call\",\n };\n return $.post({\n url: parsedContentUrl,\n data: args,\n beforeSend: function (xhr, settings) {\n xhr.setRequestHeader(\"X-CSRFToken\", window.CSRF_TOKEN);\n },\n })\n .then((res) => {\n const data = res[\"_return_data\"];\n _handle_response(data);\n return data;\n })\n .catch((res) => {\n const data = res.responseJSON || {};\n data.is_error = true;\n _handle_response(data);\n throw res;\n });\n}\n\nfunction socketCallServer(app, controller, funcName, args) {\n let id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n isConnected().then(() => {\n SDC_SOCKET.send(\n JSON.stringify({\n event: \"sdc_call\",\n id: id,\n controller: controller,\n app: app,\n function: funcName,\n args: args,\n }),\n );\n });\n\n return new Promise((resolve, reject) => {\n OPEN_REQUESTS[id] = [resolve, reject];\n });\n}\n\nfunction _connect() {\n IS_CONNECTING = true;\n return new Promise((resolve) => {\n if (window.location.protocol === \"https:\") {\n SDC_SOCKET = new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`);\n } else {\n SDC_SOCKET = new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`);\n }\n\n SDC_SOCKET.onmessage = function (e) {\n let data = JSON.parse(e.data);\n _handle_response(data);\n };\n\n SDC_SOCKET.onclose = function () {\n if (IS_CONNECTED) {\n console.error(\"SDC Socket closed unexpectedly\");\n }\n IS_CONNECTED = false;\n for (const [key, value] of Object.entries(OPEN_REQUESTS)) {\n value[1]({});\n delete OPEN_REQUESTS[key];\n }\n\n setTimeout(() => {\n _connect();\n }, 1000);\n };\n\n SDC_SOCKET.onerror = function (err) {\n console.error(\n \"Socket encountered error: \",\n err.message,\n \"Closing socket\",\n );\n if (IS_CONNECTED) {\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n };\n\n SDC_SOCKET.onopen = function () {\n IS_CONNECTED = true;\n IS_CONNECTING = false;\n resolve();\n };\n });\n}\n\nfunction _handle_response(data) {\n if (!data) {\n data = {};\n }\n if (data.is_error) {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(\"pushErrorMsg\", data.header || \"\", data.msg || \"\");\n }\n if (data.id && OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][1](data.data || null);\n delete OPEN_REQUESTS[data.id];\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(\"pushMsg\", data.header || \"\", data.msg || \"\");\n }\n\n if (data.type && data.type === \"sdc_recall\") {\n if (data.id && OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][0](data.data);\n delete OPEN_REQUESTS[data.id];\n }\n } else if (data.type && data.type === \"sdc_event\") {\n let event = data.event;\n if (event) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(event, data.payload);\n }\n } else if (data.type && data.type === \"sdc_redirect\") {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(\"onNavLink\", data.link);\n }\n }\n}\n\nfunction socketClose() {\n if (IS_CONNECTED) {\n IS_CONNECTED = false;\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n}\n\nfunction socketIsConnected() {\n return new Promise((resolve) => {\n if (IS_CONNECTED) {\n return resolve();\n } else if (IS_CONNECTING) {\n setTimeout(() => {\n isConnected().then(() => {\n resolve();\n });\n }, 200);\n } else {\n return resolve(_connect());\n }\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc2VydmVyX2NhbGwuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBd0M7QUFDRTs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0EsV0FBVyxxREFBTTtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMscUJBQXFCO0FBQy9ELE1BQU07QUFDTix5Q0FBeUMscUJBQXFCO0FBQzlEOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLHVEQUFPO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLE1BQU0sdURBQU87QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxRQUFRLHVEQUFPO0FBQ2Y7QUFDQSxNQUFNO0FBQ04sTUFBTSx1REFBTztBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc2VydmVyX2NhbGwuanM/ZDI0YiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1dWlkdjQgfSBmcm9tIFwiLi9zZGNfdXRpbHMuanNcIjtcbmltcG9ydCB7IHRyaWdnZXIgfSBmcm9tIFwiLi9zZGNfZXZlbnRzLmpzXCI7XG5cbmxldCBJU19DT05ORUNURUQgPSBmYWxzZTtcbmxldCBJU19DT05ORUNUSU5HID0gZmFsc2U7XG5sZXQgU0RDX1NPQ0tFVCA9IG51bGw7XG5sZXQgT1BFTl9SRVFVRVNUUyA9IHt9O1xuXG5leHBvcnQgZnVuY3Rpb24gY2FsbFNlcnZlcihhcHAsIGNvbnRyb2xsZXIsIHBhcnNlZENvbnRlbnRVcmwsIGZ1bmNOYW1lLCBhcmdzKSB7XG4gIGlmICh3aW5kb3cuU0VSVkVSX0NBTExfVklBX1dFQl9TT0NLRVQpIHtcbiAgICByZXR1cm4gc29ja2V0Q2FsbFNlcnZlcihhcHAsIGNvbnRyb2xsZXIsIGZ1bmNOYW1lLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcG9zdENhbGxTZXJ2ZXIocGFyc2VkQ29udGVudFVybCwgZnVuY05hbWUsIGFyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Nvbm5lY3RlZCgpIHtcbiAgaWYgKHdpbmRvdy5TRVJWRVJfQ0FMTF9WSUFfV0VCX1NPQ0tFVCkge1xuICAgIHJldHVybiBzb2NrZXRJc0Nvbm5lY3RlZCgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlKCkge1xuICBpZiAod2luZG93LlNFUlZFUl9DQUxMX1ZJQV9XRUJfU09DS0VUKSB7XG4gICAgc29ja2V0Q2xvc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3N0Q2FsbFNlcnZlcihwYXJzZWRDb250ZW50VXJsLCBmdW5jTmFtZSwgYXJncykge1xuICBpZiAodHlwZW9mIGFyZ3MgIT09IFwib2JqZWN0XCIgJiYgQXJyYXkuaXNBcnJheShhcmdzKSAmJiBhcmdzID09PSBudWxsKSB7XG4gICAgYXJncyA9IHsgYXJnMDogYXJncyB9O1xuICB9XG4gIGFyZ3MgPSB7XG4gICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoYXJncyksXG4gICAgX3NkY19mdW5jX25hbWU6IGZ1bmNOYW1lLFxuICAgIF9tZXRob2Q6IFwic2RjX3NlcnZlcl9jYWxsXCIsXG4gIH07XG4gIHJldHVybiAkLnBvc3Qoe1xuICAgIHVybDogcGFyc2VkQ29udGVudFVybCxcbiAgICBkYXRhOiBhcmdzLFxuICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uICh4aHIsIHNldHRpbmdzKSB7XG4gICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQ1NSRlRva2VuXCIsIHdpbmRvdy5DU1JGX1RPS0VOKTtcbiAgICB9LFxuICB9KVxuICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSByZXNbXCJfcmV0dXJuX2RhdGFcIl07XG4gICAgICBfaGFuZGxlX3Jlc3BvbnNlKGRhdGEpO1xuICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfSlcbiAgICAuY2F0Y2goKHJlcykgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHJlcy5yZXNwb25zZUpTT04gfHwge307XG4gICAgICBkYXRhLmlzX2Vycm9yID0gdHJ1ZTtcbiAgICAgIF9oYW5kbGVfcmVzcG9uc2UoZGF0YSk7XG4gICAgICB0aHJvdyByZXM7XG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIHNvY2tldENhbGxTZXJ2ZXIoYXBwLCBjb250cm9sbGVyLCBmdW5jTmFtZSwgYXJncykge1xuICBsZXQgaWQgPSB1dWlkdjQoKTtcbiAgaXNDb25uZWN0ZWQoKS50aGVuKCgpID0+IHtcbiAgICBTRENfU09DS0VULnNlbmQoXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGV2ZW50OiBcInNkY19jYWxsXCIsXG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY29udHJvbGxlcjogY29udHJvbGxlcixcbiAgICAgICAgYXBwOiBhcHAsXG4gICAgICAgIGZ1bmN0aW9uOiBmdW5jTmFtZSxcbiAgICAgICAgYXJnczogYXJncyxcbiAgICAgIH0pLFxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgT1BFTl9SRVFVRVNUU1tpZF0gPSBbcmVzb2x2ZSwgcmVqZWN0XTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9jb25uZWN0KCkge1xuICBJU19DT05ORUNUSU5HID0gdHJ1ZTtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gXCJodHRwczpcIikge1xuICAgICAgU0RDX1NPQ0tFVCA9IG5ldyBXZWJTb2NrZXQoYHdzczovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy93cy9gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgU0RDX1NPQ0tFVCA9IG5ldyBXZWJTb2NrZXQoYHdzOi8vJHt3aW5kb3cubG9jYXRpb24uaG9zdH0vc2RjX3dzL3dzL2ApO1xuICAgIH1cblxuICAgIFNEQ19TT0NLRVQub25tZXNzYWdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIGxldCBkYXRhID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgX2hhbmRsZV9yZXNwb25zZShkYXRhKTtcbiAgICB9O1xuXG4gICAgU0RDX1NPQ0tFVC5vbmNsb3NlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiU0RDIFNvY2tldCBjbG9zZWQgdW5leHBlY3RlZGx5XCIpO1xuICAgICAgfVxuICAgICAgSVNfQ09OTkVDVEVEID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhPUEVOX1JFUVVFU1RTKSkge1xuICAgICAgICB2YWx1ZVsxXSh7fSk7XG4gICAgICAgIGRlbGV0ZSBPUEVOX1JFUVVFU1RTW2tleV07XG4gICAgICB9XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBfY29ubmVjdCgpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfTtcblxuICAgIFNEQ19TT0NLRVQub25lcnJvciA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIFwiU29ja2V0IGVuY291bnRlcmVkIGVycm9yOiBcIixcbiAgICAgICAgZXJyLm1lc3NhZ2UsXG4gICAgICAgIFwiQ2xvc2luZyBzb2NrZXRcIixcbiAgICAgICk7XG4gICAgICBpZiAoSVNfQ09OTkVDVEVEKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgU0RDX1NPQ0tFVC5jbG9zZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH07XG5cbiAgICBTRENfU09DS0VULm9ub3BlbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIElTX0NPTk5FQ1RFRCA9IHRydWU7XG4gICAgICBJU19DT05ORUNUSU5HID0gZmFsc2U7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIF9oYW5kbGVfcmVzcG9uc2UoZGF0YSkge1xuICBpZiAoIWRhdGEpIHtcbiAgICBkYXRhID0ge307XG4gIH1cbiAgaWYgKGRhdGEuaXNfZXJyb3IpIHtcbiAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgIHRyaWdnZXIoXCJwdXNoRXJyb3JNc2dcIiwgZGF0YS5oZWFkZXIgfHwgXCJcIiwgZGF0YS5tc2cgfHwgXCJcIik7XG4gICAgfVxuICAgIGlmIChkYXRhLmlkICYmIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF0pIHtcbiAgICAgIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF1bMV0oZGF0YS5kYXRhIHx8IG51bGwpO1xuICAgICAgZGVsZXRlIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkYXRhLm1zZyB8fCBkYXRhLmhlYWRlcikge1xuICAgICAgdHJpZ2dlcihcInB1c2hNc2dcIiwgZGF0YS5oZWFkZXIgfHwgXCJcIiwgZGF0YS5tc2cgfHwgXCJcIik7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEudHlwZSAmJiBkYXRhLnR5cGUgPT09IFwic2RjX3JlY2FsbFwiKSB7XG4gICAgICBpZiAoZGF0YS5pZCAmJiBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdKSB7XG4gICAgICAgIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF1bMF0oZGF0YS5kYXRhKTtcbiAgICAgICAgZGVsZXRlIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgJiYgZGF0YS50eXBlID09PSBcInNkY19ldmVudFwiKSB7XG4gICAgICBsZXQgZXZlbnQgPSBkYXRhLmV2ZW50O1xuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIHRyaWdnZXIoZXZlbnQsIGRhdGEucGF5bG9hZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgJiYgZGF0YS50eXBlID09PSBcInNkY19yZWRpcmVjdFwiKSB7XG4gICAgICB0cmlnZ2VyKFwib25OYXZMaW5rXCIsIGRhdGEubGluayk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHNvY2tldENsb3NlKCkge1xuICBpZiAoSVNfQ09OTkVDVEVEKSB7XG4gICAgSVNfQ09OTkVDVEVEID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIFNEQ19TT0NLRVQuY2xvc2UoKTtcbiAgICB9IGNhdGNoIChlKSB7fVxuICB9XG59XG5cbmZ1bmN0aW9uIHNvY2tldElzQ29ubmVjdGVkKCkge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBpZiAoSVNfQ09OTkVDVEVEKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgIH0gZWxzZSBpZiAoSVNfQ09OTkVDVElORykge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByZXNvbHZlKF9jb25uZWN0KCkpO1xuICAgIH1cbiAgfSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_server_call.js\n\n}");
|
|
107
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ callServer: () => (/* binding */ callServer),\n/* harmony export */ close: () => (/* binding */ close),\n/* harmony export */ isConnected: () => (/* binding */ isConnected)\n/* harmony export */ });\n/* harmony import */ var _sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_utils.js */ \"./src/simpleDomControl/sdc_utils.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\nlet IS_CONNECTED = false;\nlet IS_CONNECTING = false;\nlet SDC_SOCKET = null;\nlet OPEN_REQUESTS = {};\n\n/**\n * Server methods receive the arguments as keyword arguments, so they must be an\n * object. Other values are passed as ``arg0``.\n */\nfunction normalizeArgs(args) {\n if (args === undefined || args === null) {\n return {};\n }\n if (typeof args !== \"object\" || Array.isArray(args)) {\n return { arg0: args };\n }\n return args;\n}\n\nfunction callServer(app, controller, parsedContentUrl, funcName, args) {\n args = normalizeArgs(args);\n if (window.SERVER_CALL_VIA_WEB_SOCKET) {\n return socketCallServer(app, controller, funcName, args);\n } else {\n return postCallServer(parsedContentUrl, funcName, args);\n }\n}\n\nfunction isConnected() {\n if (window.SERVER_CALL_VIA_WEB_SOCKET) {\n return socketIsConnected();\n } else {\n return Promise.resolve(true);\n }\n}\n\nfunction close() {\n if (window.SERVER_CALL_VIA_WEB_SOCKET) {\n socketClose();\n }\n}\n\nfunction postCallServer(parsedContentUrl, funcName, args) {\n args = {\n data: JSON.stringify(args),\n _sdc_func_name: funcName,\n _method: \"sdc_server_call\",\n };\n return $.post({\n url: parsedContentUrl,\n data: args,\n beforeSend: function (xhr, settings) {\n xhr.setRequestHeader(\"X-CSRFToken\", window.CSRF_TOKEN);\n },\n })\n .then((res) => {\n const data = res[\"_return_data\"];\n _handle_response(data);\n return data;\n })\n .catch((res) => {\n const data = res.responseJSON || {};\n data.is_error = true;\n _handle_response(data);\n throw res;\n });\n}\n\nfunction socketCallServer(app, controller, funcName, args) {\n let id = (0,_sdc_utils_js__WEBPACK_IMPORTED_MODULE_0__.uuidv4)();\n isConnected().then(() => {\n SDC_SOCKET.send(\n JSON.stringify({\n event: \"sdc_call\",\n id: id,\n controller: controller,\n app: app,\n function: funcName,\n args: args,\n }),\n );\n });\n\n return new Promise((resolve, reject) => {\n OPEN_REQUESTS[id] = [resolve, reject];\n });\n}\n\nfunction _connect() {\n IS_CONNECTING = true;\n return new Promise((resolve) => {\n if (window.location.protocol === \"https:\") {\n SDC_SOCKET = new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`);\n } else {\n SDC_SOCKET = new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`);\n }\n\n SDC_SOCKET.onmessage = function (e) {\n let data = JSON.parse(e.data);\n _handle_response(data);\n };\n\n SDC_SOCKET.onclose = function () {\n if (IS_CONNECTED) {\n console.error(\"SDC Socket closed unexpectedly\");\n }\n IS_CONNECTED = false;\n for (const [key, value] of Object.entries(OPEN_REQUESTS)) {\n value[1]({});\n delete OPEN_REQUESTS[key];\n }\n\n setTimeout(() => {\n _connect();\n }, 1000);\n };\n\n SDC_SOCKET.onerror = function (err) {\n console.error(\n \"Socket encountered error: \",\n err.message,\n \"Closing socket\",\n );\n if (IS_CONNECTED) {\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n };\n\n SDC_SOCKET.onopen = function () {\n IS_CONNECTED = true;\n IS_CONNECTING = false;\n resolve();\n };\n });\n}\n\nfunction _handle_response(data) {\n if (!data) {\n data = {};\n }\n if (data.is_error) {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(\"pushErrorMsg\", data.header || \"\", data.msg || \"\");\n }\n if (data.id && OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][1](data.data || null);\n delete OPEN_REQUESTS[data.id];\n }\n } else {\n if (data.msg || data.header) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(\"pushMsg\", data.header || \"\", data.msg || \"\");\n }\n\n if (data.type && data.type === \"sdc_recall\") {\n // Like over HTTP: msg/header in the return value of the server method show a message.\n const { data: returnData } = data;\n if (returnData && typeof returnData === \"object\" && (returnData.msg || returnData.header)) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(\"pushMsg\", returnData.header || \"\", returnData.msg || \"\");\n }\n if (data.id && OPEN_REQUESTS[data.id]) {\n OPEN_REQUESTS[data.id][0](data.data);\n delete OPEN_REQUESTS[data.id];\n }\n } else if (data.type && data.type === \"sdc_event\") {\n let { event } = data;\n if (event) {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(event, data.payload);\n }\n } else if (data.type && data.type === \"sdc_redirect\") {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_1__.trigger)(\"onNavLink\", data.link);\n }\n }\n}\n\nfunction socketClose() {\n if (IS_CONNECTED) {\n IS_CONNECTED = false;\n try {\n SDC_SOCKET.close();\n } catch (e) {}\n }\n}\n\nfunction socketIsConnected() {\n return new Promise((resolve) => {\n if (IS_CONNECTED) {\n return resolve();\n } else if (IS_CONNECTING) {\n setTimeout(() => {\n isConnected().then(() => {\n resolve();\n });\n }, 200);\n } else {\n return resolve(_connect());\n }\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfc2VydmVyX2NhbGwuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBd0M7QUFDRTs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQSxXQUFXLHFEQUFNO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxxQkFBcUI7QUFDL0QsTUFBTTtBQUNOLHlDQUF5QyxxQkFBcUI7QUFDOUQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sdURBQU87QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsTUFBTSx1REFBTztBQUNiOztBQUVBO0FBQ0E7QUFDQSxjQUFjLG1CQUFtQjtBQUNqQztBQUNBLFFBQVEsdURBQU87QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLFlBQVksUUFBUTtBQUNwQjtBQUNBLFFBQVEsdURBQU87QUFDZjtBQUNBLE1BQU07QUFDTixNQUFNLHVEQUFPO0FBQ2I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY19zZXJ2ZXJfY2FsbC5qcz9kMjRiIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuL3NkY191dGlscy5qc1wiO1xuaW1wb3J0IHsgdHJpZ2dlciB9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcblxubGV0IElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xubGV0IElTX0NPTk5FQ1RJTkcgPSBmYWxzZTtcbmxldCBTRENfU09DS0VUID0gbnVsbDtcbmxldCBPUEVOX1JFUVVFU1RTID0ge307XG5cbi8qKlxuICogU2VydmVyIG1ldGhvZHMgcmVjZWl2ZSB0aGUgYXJndW1lbnRzIGFzIGtleXdvcmQgYXJndW1lbnRzLCBzbyB0aGV5IG11c3QgYmUgYW5cbiAqIG9iamVjdC4gT3RoZXIgdmFsdWVzIGFyZSBwYXNzZWQgYXMgYGBhcmcwYGAuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUFyZ3MoYXJncykge1xuICBpZiAoYXJncyA9PT0gdW5kZWZpbmVkIHx8IGFyZ3MgPT09IG51bGwpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgaWYgKHR5cGVvZiBhcmdzICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoYXJncykpIHtcbiAgICByZXR1cm4geyBhcmcwOiBhcmdzIH07XG4gIH1cbiAgcmV0dXJuIGFyZ3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxsU2VydmVyKGFwcCwgY29udHJvbGxlciwgcGFyc2VkQ29udGVudFVybCwgZnVuY05hbWUsIGFyZ3MpIHtcbiAgYXJncyA9IG5vcm1hbGl6ZUFyZ3MoYXJncyk7XG4gIGlmICh3aW5kb3cuU0VSVkVSX0NBTExfVklBX1dFQl9TT0NLRVQpIHtcbiAgICByZXR1cm4gc29ja2V0Q2FsbFNlcnZlcihhcHAsIGNvbnRyb2xsZXIsIGZ1bmNOYW1lLCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcG9zdENhbGxTZXJ2ZXIocGFyc2VkQ29udGVudFVybCwgZnVuY05hbWUsIGFyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0Nvbm5lY3RlZCgpIHtcbiAgaWYgKHdpbmRvdy5TRVJWRVJfQ0FMTF9WSUFfV0VCX1NPQ0tFVCkge1xuICAgIHJldHVybiBzb2NrZXRJc0Nvbm5lY3RlZCgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3NlKCkge1xuICBpZiAod2luZG93LlNFUlZFUl9DQUxMX1ZJQV9XRUJfU09DS0VUKSB7XG4gICAgc29ja2V0Q2xvc2UoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwb3N0Q2FsbFNlcnZlcihwYXJzZWRDb250ZW50VXJsLCBmdW5jTmFtZSwgYXJncykge1xuICBhcmdzID0ge1xuICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KGFyZ3MpLFxuICAgIF9zZGNfZnVuY19uYW1lOiBmdW5jTmFtZSxcbiAgICBfbWV0aG9kOiBcInNkY19zZXJ2ZXJfY2FsbFwiLFxuICB9O1xuICByZXR1cm4gJC5wb3N0KHtcbiAgICB1cmw6IHBhcnNlZENvbnRlbnRVcmwsXG4gICAgZGF0YTogYXJncyxcbiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoeGhyLCBzZXR0aW5ncykge1xuICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoXCJYLUNTUkZUb2tlblwiLCB3aW5kb3cuQ1NSRl9UT0tFTik7XG4gICAgfSxcbiAgfSlcbiAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICBjb25zdCBkYXRhID0gcmVzW1wiX3JldHVybl9kYXRhXCJdO1xuICAgICAgX2hhbmRsZV9yZXNwb25zZShkYXRhKTtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0pXG4gICAgLmNhdGNoKChyZXMpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSByZXMucmVzcG9uc2VKU09OIHx8IHt9O1xuICAgICAgZGF0YS5pc19lcnJvciA9IHRydWU7XG4gICAgICBfaGFuZGxlX3Jlc3BvbnNlKGRhdGEpO1xuICAgICAgdGhyb3cgcmVzO1xuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBzb2NrZXRDYWxsU2VydmVyKGFwcCwgY29udHJvbGxlciwgZnVuY05hbWUsIGFyZ3MpIHtcbiAgbGV0IGlkID0gdXVpZHY0KCk7XG4gIGlzQ29ubmVjdGVkKCkudGhlbigoKSA9PiB7XG4gICAgU0RDX1NPQ0tFVC5zZW5kKFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBldmVudDogXCJzZGNfY2FsbFwiLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNvbnRyb2xsZXI6IGNvbnRyb2xsZXIsXG4gICAgICAgIGFwcDogYXBwLFxuICAgICAgICBmdW5jdGlvbjogZnVuY05hbWUsXG4gICAgICAgIGFyZ3M6IGFyZ3MsXG4gICAgICB9KSxcbiAgICApO1xuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIE9QRU5fUkVRVUVTVFNbaWRdID0gW3Jlc29sdmUsIHJlamVjdF07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfY29ubmVjdCgpIHtcbiAgSVNfQ09OTkVDVElORyA9IHRydWU7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGlmICh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgPT09IFwiaHR0cHM6XCIpIHtcbiAgICAgIFNEQ19TT0NLRVQgPSBuZXcgV2ViU29ja2V0KGB3c3M6Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fS9zZGNfd3Mvd3MvYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIFNEQ19TT0NLRVQgPSBuZXcgV2ViU29ja2V0KGB3czovLyR7d2luZG93LmxvY2F0aW9uLmhvc3R9L3NkY193cy93cy9gKTtcbiAgICB9XG5cbiAgICBTRENfU09DS0VULm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgIF9oYW5kbGVfcmVzcG9uc2UoZGF0YSk7XG4gICAgfTtcblxuICAgIFNEQ19TT0NLRVQub25jbG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChJU19DT05ORUNURUQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIlNEQyBTb2NrZXQgY2xvc2VkIHVuZXhwZWN0ZWRseVwiKTtcbiAgICAgIH1cbiAgICAgIElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoT1BFTl9SRVFVRVNUUykpIHtcbiAgICAgICAgdmFsdWVbMV0oe30pO1xuICAgICAgICBkZWxldGUgT1BFTl9SRVFVRVNUU1trZXldO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgX2Nvbm5lY3QoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH07XG5cbiAgICBTRENfU09DS0VULm9uZXJyb3IgPSBmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcIlNvY2tldCBlbmNvdW50ZXJlZCBlcnJvcjogXCIsXG4gICAgICAgIGVyci5tZXNzYWdlLFxuICAgICAgICBcIkNsb3Npbmcgc29ja2V0XCIsXG4gICAgICApO1xuICAgICAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIFNEQ19TT0NLRVQuY2xvc2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgU0RDX1NPQ0tFVC5vbm9wZW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBJU19DT05ORUNURUQgPSB0cnVlO1xuICAgICAgSVNfQ09OTkVDVElORyA9IGZhbHNlO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBfaGFuZGxlX3Jlc3BvbnNlKGRhdGEpIHtcbiAgaWYgKCFkYXRhKSB7XG4gICAgZGF0YSA9IHt9O1xuICB9XG4gIGlmIChkYXRhLmlzX2Vycm9yKSB7XG4gICAgaWYgKGRhdGEubXNnIHx8IGRhdGEuaGVhZGVyKSB7XG4gICAgICB0cmlnZ2VyKFwicHVzaEVycm9yTXNnXCIsIGRhdGEuaGVhZGVyIHx8IFwiXCIsIGRhdGEubXNnIHx8IFwiXCIpO1xuICAgIH1cbiAgICBpZiAoZGF0YS5pZCAmJiBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdKSB7XG4gICAgICBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdWzFdKGRhdGEuZGF0YSB8fCBudWxsKTtcbiAgICAgIGRlbGV0ZSBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGF0YS5tc2cgfHwgZGF0YS5oZWFkZXIpIHtcbiAgICAgIHRyaWdnZXIoXCJwdXNoTXNnXCIsIGRhdGEuaGVhZGVyIHx8IFwiXCIsIGRhdGEubXNnIHx8IFwiXCIpO1xuICAgIH1cblxuICAgIGlmIChkYXRhLnR5cGUgJiYgZGF0YS50eXBlID09PSBcInNkY19yZWNhbGxcIikge1xuICAgICAgLy8gTGlrZSBvdmVyIEhUVFA6IG1zZy9oZWFkZXIgaW4gdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgc2VydmVyIG1ldGhvZCBzaG93IGEgbWVzc2FnZS5cbiAgICAgIGNvbnN0IHsgZGF0YTogcmV0dXJuRGF0YSB9ID0gZGF0YTtcbiAgICAgIGlmIChyZXR1cm5EYXRhICYmIHR5cGVvZiByZXR1cm5EYXRhID09PSBcIm9iamVjdFwiICYmIChyZXR1cm5EYXRhLm1zZyB8fCByZXR1cm5EYXRhLmhlYWRlcikpIHtcbiAgICAgICAgdHJpZ2dlcihcInB1c2hNc2dcIiwgcmV0dXJuRGF0YS5oZWFkZXIgfHwgXCJcIiwgcmV0dXJuRGF0YS5tc2cgfHwgXCJcIik7XG4gICAgICB9XG4gICAgICBpZiAoZGF0YS5pZCAmJiBPUEVOX1JFUVVFU1RTW2RhdGEuaWRdKSB7XG4gICAgICAgIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF1bMF0oZGF0YS5kYXRhKTtcbiAgICAgICAgZGVsZXRlIE9QRU5fUkVRVUVTVFNbZGF0YS5pZF07XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgJiYgZGF0YS50eXBlID09PSBcInNkY19ldmVudFwiKSB7XG4gICAgICBsZXQgeyBldmVudCB9ID0gZGF0YTtcbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICB0cmlnZ2VyKGV2ZW50LCBkYXRhLnBheWxvYWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlICYmIGRhdGEudHlwZSA9PT0gXCJzZGNfcmVkaXJlY3RcIikge1xuICAgICAgdHJpZ2dlcihcIm9uTmF2TGlua1wiLCBkYXRhLmxpbmspO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzb2NrZXRDbG9zZSgpIHtcbiAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgIElTX0NPTk5FQ1RFRCA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBTRENfU09DS0VULmNsb3NlKCk7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxufVxuXG5mdW5jdGlvbiBzb2NrZXRJc0Nvbm5lY3RlZCgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgaWYgKElTX0NPTk5FQ1RFRCkge1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9IGVsc2UgaWYgKElTX0NPTk5FQ1RJTkcpIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpc0Nvbm5lY3RlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LCAyMDApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShfY29ubmVjdCgpKTtcbiAgICB9XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_server_call.js\n\n}");
|
|
98
108
|
|
|
99
109
|
/***/ },
|
|
100
110
|
|
|
@@ -114,7 +124,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
114
124
|
\************************************************/
|
|
115
125
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
116
126
|
|
|
117
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ controllerFromTestHtml: () => (/* binding */ controllerFromTestHtml),\n/* harmony export */ getCsrfToken: () => (/* binding */ getCsrfToken),\n/* harmony export */ get_controller: () => (/* binding */ get_controller)\n/* harmony export */ });\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/**\n * @jest-environment jsdom\n */\n\n\nlet spy = [],\n _originAjax;\n\nfunction setDefaults() {\n if (!jest) throw new Error(\"JEST is not defined\");\n if (spy.length === 0) {\n _originAjax = $.ajax.bind($);\n\n spy.push(jest.spyOn($, \"ajax\"));\n spy[0].mockImplementation(function (a) {\n return _originAjax(a)\n .then((html) => {\n return html;\n })\n .catch((html) => {\n return html;\n });\n });\n }\n}\n\nfunction getCookie(name) {\n
|
|
127
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ controllerFromTestHtml: () => (/* binding */ controllerFromTestHtml),\n/* harmony export */ getCsrfToken: () => (/* binding */ getCsrfToken),\n/* harmony export */ get_controller: () => (/* binding */ get_controller)\n/* harmony export */ });\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/**\n * @jest-environment jsdom\n */\n\n\nlet spy = [],\n _originAjax;\n\nfunction setDefaults() {\n if (!jest) throw new Error(\"JEST is not defined\");\n if (spy.length === 0) {\n _originAjax = $.ajax.bind($);\n\n spy.push(jest.spyOn($, \"ajax\"));\n spy[0].mockImplementation(function (a) {\n return _originAjax(a)\n .then((html) => {\n return html;\n })\n .catch((html) => {\n return html;\n });\n });\n }\n}\n\nfunction getCookie(name) {\n if (document.cookie && document.cookie !== \"\") {\n const cookies = document.cookie.split(\";\");\n for (let i = 0; i < cookies.length; i++) {\n const cookie = cookies[i].trim();\n // Does this cookie string begin with the name we want?\n if (cookie.substring(0, name.length + 1) === name + \"=\") {\n return decodeURIComponent(cookie.substring(name.length + 1));\n }\n }\n }\n return \"\";\n}\n\n/**\n * Returns the CSRF token\n */\nfunction getCsrfToken() {\n return getCookie(\"csrftoken\");\n}\n\n/**\n *\n * @param html{string} HTML: .\n * @param afterLifecycle{bool} Lifecycle Methode -> Reruns the controller after the root controller has run the \"onRefresh\" methode. This is optional.\n * @returns {Promise<Array<{AbstractSDC}>>}\n */\nasync function controllerFromTestHtml(html, afterLifecycle = null) {\n setDefaults();\n const $body = $(\"body\");\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.updateJquery();\n $body.safeEmpty().append(html);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app._isInit = false;\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.cleanCache();\n await _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.init_sdc();\n\n let children = _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.rootController.iterateAllChildren();\n\n if (!afterLifecycle) {\n return children;\n }\n\n const origenRefresh = children[0].onRefresh;\n\n const refreshSpy = jest.spyOn(children[0], \"onRefresh\");\n\n return new Promise((resolve) => {\n refreshSpy.mockImplementation(function () {\n refreshSpy.mockRestore();\n const res = origenRefresh.apply(children[0], arguments);\n resolve(children);\n return res;\n });\n });\n}\n\n/**\n * Returns a controller. This controller has been created by the using the normal SDC life cycle.\n *\n * @param tag_name{string} Controller tag name (snake-case)\n * @param init_arguments{object} object: Mockeds the tag data arguments.\n * @param origen_html{string} HTML: Mocked content of the content in your target HTML container.\n * @returns {Promise<{AbstractSDC}>}\n */\nasync function get_controller(\n tag_name,\n init_arguments = {},\n origen_html = \"\",\n) {\n setDefaults();\n const $body = $(\"body\");\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.updateJquery();\n\n $body.safeEmpty();\n\n const $controller = $(`<${tag_name}>${origen_html}</${tag_name}>`);\n for (const [key, value] of Object.entries(init_arguments)) {\n $controller.data(key, value);\n }\n const $divContainer = $(\"<div></div>\").append($controller)\n\n $body.append($divContainer);\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app._isInit = false;\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.cleanCache();\n await _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.init_sdc();\n const controller = _sdc_main_js__WEBPACK_IMPORTED_MODULE_0__.app.getController($controller);\n controller.navControllerPath = [tag_name]\n return controller;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdGVzdF91dGlscy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ29DOztBQUVwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsNENBQTRDO0FBQzVDLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCLHlCQUF5QixNQUFNO0FBQy9CLGFBQWEsZUFBZSxZQUFZO0FBQ3hDO0FBQ087QUFDUDtBQUNBO0FBQ0EsRUFBRSw2Q0FBRztBQUNMO0FBQ0EsRUFBRSw2Q0FBRztBQUNMLEVBQUUsNkNBQUc7QUFDTCxRQUFRLDZDQUFHOztBQUVYLGlCQUFpQiw2Q0FBRzs7QUFFcEI7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFFBQVE7QUFDM0IseUJBQXlCLFFBQVE7QUFDakMsc0JBQXNCLFFBQVE7QUFDOUIsYUFBYSxTQUFTLFlBQVk7QUFDbEM7QUFDTztBQUNQO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsRUFBRSw2Q0FBRzs7QUFFTDs7QUFFQSw0QkFBNEIsU0FBUyxHQUFHLFlBQVksSUFBSSxTQUFTO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsRUFBRSw2Q0FBRztBQUNMLEVBQUUsNkNBQUc7QUFDTCxRQUFRLDZDQUFHO0FBQ1gscUJBQXFCLDZDQUFHO0FBQ3hCO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdGVzdF91dGlscy5qcz81ZmJiIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGplc3QtZW52aXJvbm1lbnQganNkb21cbiAqL1xuaW1wb3J0IHsgYXBwIH0gZnJvbSBcIi4vc2RjX21haW4uanNcIjtcblxubGV0IHNweSA9IFtdLFxuICBfb3JpZ2luQWpheDtcblxuZnVuY3Rpb24gc2V0RGVmYXVsdHMoKSB7XG4gIGlmICghamVzdCkgdGhyb3cgbmV3IEVycm9yKFwiSkVTVCBpcyBub3QgZGVmaW5lZFwiKTtcbiAgaWYgKHNweS5sZW5ndGggPT09IDApIHtcbiAgICBfb3JpZ2luQWpheCA9ICQuYWpheC5iaW5kKCQpO1xuXG4gICAgc3B5LnB1c2goamVzdC5zcHlPbigkLCBcImFqYXhcIikpO1xuICAgIHNweVswXS5tb2NrSW1wbGVtZW50YXRpb24oZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBfb3JpZ2luQWpheChhKVxuICAgICAgICAudGhlbigoaHRtbCkgPT4ge1xuICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGh0bWwpID0+IHtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q29va2llKG5hbWUpIHtcbiAgaWYgKGRvY3VtZW50LmNvb2tpZSAmJiBkb2N1bWVudC5jb29raWUgIT09IFwiXCIpIHtcbiAgICBjb25zdCBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KFwiO1wiKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvb2tpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvb2tpZSA9IGNvb2tpZXNbaV0udHJpbSgpO1xuICAgICAgLy8gRG9lcyB0aGlzIGNvb2tpZSBzdHJpbmcgYmVnaW4gd2l0aCB0aGUgbmFtZSB3ZSB3YW50P1xuICAgICAgaWYgKGNvb2tpZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGggKyAxKSA9PT0gbmFtZSArIFwiPVwiKSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoY29va2llLnN1YnN0cmluZyhuYW1lLmxlbmd0aCArIDEpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgQ1NSRiB0b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q3NyZlRva2VuKCkge1xuICByZXR1cm4gZ2V0Q29va2llKFwiY3NyZnRva2VuXCIpO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gaHRtbHtzdHJpbmd9IEhUTUw6IC5cbiAqIEBwYXJhbSBhZnRlckxpZmVjeWNsZXtib29sfSBMaWZlY3ljbGUgTWV0aG9kZSAtPiBSZXJ1bnMgdGhlIGNvbnRyb2xsZXIgYWZ0ZXIgdGhlIHJvb3QgY29udHJvbGxlciBoYXMgcnVuIHRoZSBcIm9uUmVmcmVzaFwiIG1ldGhvZGUuIFRoaXMgaXMgb3B0aW9uYWwuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTx7QWJzdHJhY3RTREN9Pj59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb250cm9sbGVyRnJvbVRlc3RIdG1sKGh0bWwsIGFmdGVyTGlmZWN5Y2xlID0gbnVsbCkge1xuICBzZXREZWZhdWx0cygpO1xuICBjb25zdCAkYm9keSA9ICQoXCJib2R5XCIpO1xuICBhcHAudXBkYXRlSnF1ZXJ5KCk7XG4gICRib2R5LnNhZmVFbXB0eSgpLmFwcGVuZChodG1sKTtcbiAgYXBwLl9pc0luaXQgPSBmYWxzZTtcbiAgYXBwLmNsZWFuQ2FjaGUoKTtcbiAgYXdhaXQgYXBwLmluaXRfc2RjKCk7XG5cbiAgbGV0IGNoaWxkcmVuID0gYXBwLnJvb3RDb250cm9sbGVyLml0ZXJhdGVBbGxDaGlsZHJlbigpO1xuXG4gIGlmICghYWZ0ZXJMaWZlY3ljbGUpIHtcbiAgICByZXR1cm4gY2hpbGRyZW47XG4gIH1cblxuICBjb25zdCBvcmlnZW5SZWZyZXNoID0gY2hpbGRyZW5bMF0ub25SZWZyZXNoO1xuXG4gIGNvbnN0IHJlZnJlc2hTcHkgPSBqZXN0LnNweU9uKGNoaWxkcmVuWzBdLCBcIm9uUmVmcmVzaFwiKTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICByZWZyZXNoU3B5Lm1vY2tJbXBsZW1lbnRhdGlvbihmdW5jdGlvbiAoKSB7XG4gICAgICByZWZyZXNoU3B5Lm1vY2tSZXN0b3JlKCk7XG4gICAgICBjb25zdCByZXMgPSBvcmlnZW5SZWZyZXNoLmFwcGx5KGNoaWxkcmVuWzBdLCBhcmd1bWVudHMpO1xuICAgICAgcmVzb2x2ZShjaGlsZHJlbik7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY29udHJvbGxlci4gVGhpcyBjb250cm9sbGVyIGhhcyBiZWVuIGNyZWF0ZWQgYnkgdGhlIHVzaW5nIHRoZSBub3JtYWwgU0RDIGxpZmUgY3ljbGUuXG4gKlxuICogQHBhcmFtIHRhZ19uYW1le3N0cmluZ30gQ29udHJvbGxlciB0YWcgbmFtZSAoc25ha2UtY2FzZSlcbiAqIEBwYXJhbSBpbml0X2FyZ3VtZW50c3tvYmplY3R9IG9iamVjdDogTW9ja2VkcyB0aGUgdGFnIGRhdGEgYXJndW1lbnRzLlxuICogQHBhcmFtIG9yaWdlbl9odG1se3N0cmluZ30gSFRNTDogTW9ja2VkIGNvbnRlbnQgb2YgdGhlIGNvbnRlbnQgaW4geW91ciB0YXJnZXQgSFRNTCBjb250YWluZXIuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7QWJzdHJhY3RTREN9Pn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldF9jb250cm9sbGVyKFxuICB0YWdfbmFtZSxcbiAgaW5pdF9hcmd1bWVudHMgPSB7fSxcbiAgb3JpZ2VuX2h0bWwgPSBcIlwiLFxuKSB7XG4gIHNldERlZmF1bHRzKCk7XG4gIGNvbnN0ICRib2R5ID0gJChcImJvZHlcIik7XG4gIGFwcC51cGRhdGVKcXVlcnkoKTtcblxuICAkYm9keS5zYWZlRW1wdHkoKTtcblxuICBjb25zdCAkY29udHJvbGxlciA9ICQoYDwke3RhZ19uYW1lfT4ke29yaWdlbl9odG1sfTwvJHt0YWdfbmFtZX0+YCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRfYXJndW1lbnRzKSkge1xuICAgICRjb250cm9sbGVyLmRhdGEoa2V5LCB2YWx1ZSk7XG4gIH1cbiAgY29uc3QgJGRpdkNvbnRhaW5lciA9ICQoXCI8ZGl2PjwvZGl2PlwiKS5hcHBlbmQoJGNvbnRyb2xsZXIpXG5cbiAgJGJvZHkuYXBwZW5kKCRkaXZDb250YWluZXIpO1xuICBhcHAuX2lzSW5pdCA9IGZhbHNlO1xuICBhcHAuY2xlYW5DYWNoZSgpO1xuICBhd2FpdCBhcHAuaW5pdF9zZGMoKTtcbiAgY29uc3QgY29udHJvbGxlciA9IGFwcC5nZXRDb250cm9sbGVyKCRjb250cm9sbGVyKTtcbiAgY29udHJvbGxlci5uYXZDb250cm9sbGVyUGF0aCA9IFt0YWdfbmFtZV1cbiAgcmV0dXJuIGNvbnRyb2xsZXI7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_test_utils.js\n\n}");
|
|
118
128
|
|
|
119
129
|
/***/ },
|
|
120
130
|
|
|
@@ -124,7 +134,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
124
134
|
\*******************************************/
|
|
125
135
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
126
136
|
|
|
127
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ agileAggregation: () => (/* binding */ agileAggregation),\n/* harmony export */ camelCaseToTagName: () => (/* binding */ camelCaseToTagName),\n/* harmony export */ checkIfParamNumberBoolOrString: () => (/* binding */ checkIfParamNumberBoolOrString),\n/* harmony export */ clearErrorsInForm: () => (/* binding */ clearErrorsInForm),\n/* harmony export */ getBody: () => (/* binding */ getBody),\n/* harmony export */ getParamsNameOfFunction: () => (/* binding */ getParamsNameOfFunction),\n/* harmony export */ getValueFromField: () => (/* binding */ getValueFromField),\n/* harmony export */ jqueryInsertAt: () => (/* binding */ jqueryInsertAt),\n/* harmony export */ promiseDummyFactory: () => (/* binding */ promiseDummyFactory),\n/* harmony export */ setErrorsInForm: () => (/* binding */ setErrorsInForm),\n/* harmony export */ setValueInField: () => (/* binding */ setValueInField),\n/* harmony export */ tagNameToCamelCase: () => (/* binding */ tagNameToCamelCase),\n/* harmony export */ tagNameToReadableName: () => (/* binding */ tagNameToReadableName),\n/* harmony export */ uploadFileFormData: () => (/* binding */ uploadFileFormData),\n/* harmony export */ uuidv4: () => (/* binding */ uuidv4)\n/* harmony export */ });\n/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../index.js */ \"./src/index.js\");\n\n\n/**\n * Reference to the HTML body.\n * @type {*|jQuery|HTMLElement}\n * @private\n */\nlet _$body;\nconst arg_names_reg = /(?<=^|,\\s?)[^=\\s,]+/g;\nconst commend_reg = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\n/**\n * getBody returns the $body jQuery object.\n *\n * @returns {*|jQuery|HTMLElement} - body reference.\n */\nfunction getBody() {\n if (!_$body) {\n _$body = $(\"body\");\n }\n\n return _$body;\n}\n\n/**\n *\n * @param {function} func\n * @returns {RegExpMatchArray|*[]}\n */\nfunction getParamsNameOfFunction(func) {\n var fnstr = func.toString().replace(commend_reg, \"\");\n var result = fnstr\n .slice(fnstr.indexOf(\"(\") + 1, fnstr.indexOf(\")\"))\n .match(arg_names_reg);\n if (!result) {\n return [];\n }\n\n return result;\n}\n\n/**\n * promiseDummyFactory generates a simple promise which returns instantly.\n * @return {Promise} window.utils\n */\nfunction promiseDummyFactory() {\n return new Promise(function (resolve) {\n resolve();\n });\n}\n\nfunction camelCaseToTagName(str) {\n str = str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n str = str.replace(/[0-9]+/g, (number) => `-${number}`);\n return str.replace(/^[-]/g, ``);\n}\n\nfunction tagNameToCamelCase(str) {\n str = str.replace(/-./g, (letter) => `${letter[1].toUpperCase()}`);\n return str;\n}\n\nfunction tagNameToReadableName(str) {\n str = str\n .replace(/-./g, (letter) => ` ${letter[1].toUpperCase()}`)\n .replace(/^./g, (letter) => `${letter.toUpperCase()}`);\n return str;\n}\n\nconst copyProps = (targetClass, sourceClass) => {\n let source = sourceClass;\n let propNamesTarget = Object.getOwnPropertyNames(\n targetClass.prototype,\n ).concat(Object.getOwnPropertySymbols(targetClass.prototype));\n while (source.name !== \"\") {\n Object.getOwnPropertyNames(source.prototype)\n .concat(Object.getOwnPropertySymbols(source.prototype))\n .forEach((prop) => {\n if (\n prop.match(\n /^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/,\n )\n ) {\n return;\n }\n\n if (!propNamesTarget.includes(prop)) {\n propNamesTarget.push(prop);\n Object.defineProperty(\n targetClass.prototype,\n prop,\n Object.getOwnPropertyDescriptor(source.prototype, prop),\n );\n }\n });\n source = Object.getPrototypeOf(source);\n }\n};\n\n/**\n *\n * @param {typeof AbstractSDC} baseClass\n * @param {typeof AbstractSDC} mixins\n * @returns {typeof AbstractSDC}\n */\nfunction agileAggregation(baseClass, ...mixins) {\n let base = {\n [baseClass.name]: class {\n constructor(..._args) {\n let _mixins = {};\n mixins.forEach((mixin) => {\n let newMixin;\n Object.assign(this, (newMixin = new mixin()));\n newMixin._tagName = mixin.prototype._tagName;\n newMixin._isMixin = true;\n _mixins[mixin.name] = newMixin;\n });\n\n Object.assign(this, new baseClass());\n this._mixins = _mixins;\n }\n\n static get name() {\n return baseClass.name;\n }\n\n static className() {\n return this.name;\n }\n\n get mixins() {\n return this._mixins;\n }\n },\n }[baseClass.name];\n\n copyProps(base, baseClass);\n\n mixins.forEach((mixin) => {\n copyProps(base, mixin);\n });\n\n return base;\n}\n\nfunction csrfSafeMethod(method) {\n // these HTTP methods do not require CSRF protection\n return /^(GET|HEAD|OPTIONS|TRACE)$/.test(method);\n}\n\nfunction uploadFileFormData(formData, url, method) {\n return $.ajax({\n url: url, //Server script to process data\n type: method || \"POST\",\n xhr: function () {\n // Custom XMLHttpRequest\n var myXhr = $.ajaxSettings.xhr();\n if (myXhr.upload) {\n // Check if upload property exists\n myXhr.upload.addEventListener(\n \"progress\",\n progressHandlingFunction,\n false,\n ); // For handling the progress of the upload\n }\n return myXhr;\n },\n //Form data\n data: formData,\n //Options to tell jQuery not to process data or worry about content-type.\n cache: false,\n contentType: false,\n processData: false,\n beforeSend: function (xhr, settings) {\n if (!csrfSafeMethod(settings.type) && !this.crossDomain) {\n xhr.setRequestHeader(\"X-CSRFToken\", window.CSRF_TOKEN);\n }\n },\n });\n}\n\nfunction progressHandlingFunction(e) {\n if (e.lengthComputable) {\n var percentVal = Math.round((e.loaded / e.total) * 100);\n var $progressContainer = $(\".progress-container\");\n if (percentVal === 100) {\n $progressContainer.hide();\n } else {\n $progressContainer.show();\n }\n\n percentVal += \"%\";\n\n $progressContainer\n .find(\".progress-bar\")\n .css({width: percentVal})\n .text(percentVal);\n }\n}\n\nfunction checkIfParamNumberBoolOrString(\n paramElement,\n controller = null,\n) {\n if (typeof paramElement !== \"string\") {\n return paramElement;\n }\n\n if (controller && typeof controller[paramElement] !== \"undefined\") {\n if (typeof controller[paramElement] === \"function\") {\n return controller[paramElement].bind(controller);\n }\n return controller[paramElement];\n }\n\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n\n if (paramElement.match(isBoolReg)) {\n return paramElement === \"true\";\n } else if (paramElement === \"undefined\") {\n return undefined;\n } else if (paramElement.toLowerCase() === \"none\") {\n return null;\n } else if (paramElement.match(isIntReg)) {\n return parseInt(paramElement);\n } else if (paramElement.match(isFloatReg)) {\n return parseFloat(paramElement);\n } else if (paramElement.match(isStringReg)) {\n return paramElement.substr(1, paramElement.length - 2);\n }\n\n return paramElement;\n}\n\nfunction uuidv4() {\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>\n (\n c ^\n (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))\n ).toString(16),\n );\n}\n\nfunction clearErrorsInForm($form) {\n $form\n .find(\".has-error\")\n .removeClass(\"has-error\")\n .find(\".alert-danger\")\n .remove();\n $form.find(\".non-field-errors\").remove();\n}\n\nfunction setErrorsInForm($form, $resForm) {\n $resForm = $(\"<div>\").append($resForm);\n\n $form\n .find(\".has-error\")\n .removeClass(\"has-error\")\n .find(\".alert-danger\")\n .safeRemove();\n $form.find(\".non-field-errors\").safeRemove();\n let $file_container = $resForm.find(\"input[type=file]\").parent();\n $form\n .find(\"input[type=file]\")\n .parent()\n .each(function (index) {\n $(this).replaceWith($file_container[index]);\n });\n\n let hasNoError =\n $resForm\n .find(\".non-field-errors\")\n .insertAfter($form.find(\".hidden-form-fields\")).length === 0;\n $resForm.find(\".has-error\").each(function () {\n hasNoError = false;\n let $resErrorField = $(this);\n let className = $resErrorField.data(\"auto-id\");\n let $errorField = $form.find(\".form-group.\" + className);\n $errorField.addClass(\"has-error\");\n $errorField\n .find(\".form-input-container\")\n .append($resErrorField.find(\".alert-danger\"));\n });\n\n return hasNoError;\n}\n\nfunction jqueryInsertAt($container, index, $newElement) {\n let lastIndex = $container.children().size();\n if (index < lastIndex) {\n $container.children().eq(index).before($newElement);\n } else {\n $container.append($newElement);\n }\n return this;\n}\n\n/**\n * Parse hidden input values back into the closest JavaScript primitive.\n *\n * Hidden inputs are often used to preserve values that were originally booleans,\n * numbers or quoted strings. This keeps form-to-model sync from turning\n * everything into plain strings.\n *\n * @param {string} value\n * @returns {*}\n */\nfunction parseHiddenInputs(value) {\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n\n if (value.toLowerCase().match(isBoolReg)) {\n return value.toLowerCase() === \"true\";\n } else if (value === \"undefined\") {\n return undefined;\n } else if (value.toLowerCase() === \"none\") {\n return null;\n } else if (value.match(isIntReg)) {\n return parseInt(value, 10);\n } else if (value.match(isFloatReg)) {\n return parseFloat(value);\n } else if (value.match(isStringReg)) {\n return value.substring(1, value.length - 1);\n }\n return value;\n}\n\nfunction getValueFromField(formItem) {\n let {type, name} = formItem;\n if (name && name !== \"\") {\n if (type === \"hidden\") {\n return parseHiddenInputs($(formItem).val());\n }\n\n if (type === \"checkbox\") {\n return formItem.checked;\n }\n\n if (type === \"file\") {\n return formItem.files[0];\n }\n\n return $(formItem).val();\n }\n return null;\n}\n\n\nfunction setValueInField(formItem, value) {\n let {type, name} = formItem;\n if (name && name !== \"\") {\n\n if (type === \"checkbox\") {\n formItem.checked = !!value;\n } else if (type === \"file\") {\n if (value instanceof File) {\n if (typeof DataTransfer !== \"undefined\") {\n let container = new DataTransfer();\n container.items.add(value);\n formItem.files = container;\n }\n }\n } else if (value instanceof _index_js__WEBPACK_IMPORTED_MODULE_0__.SdcModel) {\n $(formItem).val(value.id);\n } else if (value instanceof _index_js__WEBPACK_IMPORTED_MODULE_0__.SdcQuerySet) {\n $(formItem).val(`[${value.getIds().join(',')}]`);\n } else {\n if (value === null) {\n value = \"\";\n }\n $(formItem).val(value);\n }\n }\n return null;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQLE9BQU8sWUFBWTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHTztBQUNQLE9BQU8sWUFBWTtBQUNuQjs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSwwQkFBMEIsK0NBQVE7QUFDeEM7QUFDQSxNQUFNLDBCQUEwQixrREFBVztBQUMzQywwQkFBMEIseUJBQXlCO0FBQ25ELE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY191dGlscy5qcz9iZjIyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U2RjTW9kZWwsIFNkY1F1ZXJ5U2V0fSBmcm9tIFwiLi4vaW5kZXguanNcIjtcblxuLyoqXG4gKiBSZWZlcmVuY2UgdG8gdGhlIEhUTUwgYm9keS5cbiAqIEB0eXBlIHsqfGpRdWVyeXxIVE1MRWxlbWVudH1cbiAqIEBwcml2YXRlXG4gKi9cbmxldCBfJGJvZHk7XG5jb25zdCBhcmdfbmFtZXNfcmVnID0gLyg/PD1efCxcXHM/KVtePVxccyxdKy9nO1xuY29uc3QgY29tbWVuZF9yZWcgPSAvKChcXC9cXC8uKiQpfChcXC9cXCpbXFxzXFxTXSo/XFwqXFwvKSkvZ207XG5cbi8qKlxuICogZ2V0Qm9keSByZXR1cm5zIHRoZSAkYm9keSBqUXVlcnkgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIHsqfGpRdWVyeXxIVE1MRWxlbWVudH0gLSBib2R5IHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJvZHkoKSB7XG4gIGlmICghXyRib2R5KSB7XG4gICAgXyRib2R5ID0gJChcImJvZHlcIik7XG4gIH1cblxuICByZXR1cm4gXyRib2R5O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBmdW5jXG4gKiBAcmV0dXJucyB7UmVnRXhwTWF0Y2hBcnJheXwqW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJhbXNOYW1lT2ZGdW5jdGlvbihmdW5jKSB7XG4gIHZhciBmbnN0ciA9IGZ1bmMudG9TdHJpbmcoKS5yZXBsYWNlKGNvbW1lbmRfcmVnLCBcIlwiKTtcbiAgdmFyIHJlc3VsdCA9IGZuc3RyXG4gICAgLnNsaWNlKGZuc3RyLmluZGV4T2YoXCIoXCIpICsgMSwgZm5zdHIuaW5kZXhPZihcIilcIikpXG4gICAgLm1hdGNoKGFyZ19uYW1lc19yZWcpO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogcHJvbWlzZUR1bW15RmFjdG9yeSBnZW5lcmF0ZXMgYSBzaW1wbGUgcHJvbWlzZSB3aGljaCByZXR1cm5zIGluc3RhbnRseS5cbiAqIEByZXR1cm4ge1Byb21pc2V9IHdpbmRvdy51dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzZUR1bW15RmFjdG9yeSgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgcmVzb2x2ZSgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsQ2FzZVRvVGFnTmFtZShzdHIpIHtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL1tBLVpdL2csIChsZXR0ZXIpID0+IGAtJHtsZXR0ZXIudG9Mb3dlckNhc2UoKX1gKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL1swLTldKy9nLCAobnVtYmVyKSA9PiBgLSR7bnVtYmVyfWApO1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15bLV0vZywgYGApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFnTmFtZVRvQ2FtZWxDYXNlKHN0cikge1xuICBzdHIgPSBzdHIucmVwbGFjZSgvLS4vZywgKGxldHRlcikgPT4gYCR7bGV0dGVyWzFdLnRvVXBwZXJDYXNlKCl9YCk7XG4gIHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWdOYW1lVG9SZWFkYWJsZU5hbWUoc3RyKSB7XG4gIHN0ciA9IHN0clxuICAgIC5yZXBsYWNlKC8tLi9nLCAobGV0dGVyKSA9PiBgICR7bGV0dGVyWzFdLnRvVXBwZXJDYXNlKCl9YClcbiAgICAucmVwbGFjZSgvXi4vZywgKGxldHRlcikgPT4gYCR7bGV0dGVyLnRvVXBwZXJDYXNlKCl9YCk7XG4gIHJldHVybiBzdHI7XG59XG5cbmNvbnN0IGNvcHlQcm9wcyA9ICh0YXJnZXRDbGFzcywgc291cmNlQ2xhc3MpID0+IHtcbiAgbGV0IHNvdXJjZSA9IHNvdXJjZUNsYXNzO1xuICBsZXQgcHJvcE5hbWVzVGFyZ2V0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoXG4gICAgdGFyZ2V0Q2xhc3MucHJvdG90eXBlLFxuICApLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldENsYXNzLnByb3RvdHlwZSkpO1xuICB3aGlsZSAoc291cmNlLm5hbWUgIT09IFwiXCIpIHtcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2UucHJvdG90eXBlKVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZS5wcm90b3R5cGUpKVxuICAgICAgLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3AubWF0Y2goXG4gICAgICAgICAgICAvXig/OmNvbnN0cnVjdG9yfHByb3RvdHlwZXxhcmd1bWVudHN8Y2FsbGVyfG5hbWV8YmluZHxjYWxsfGFwcGx5fHRvU3RyaW5nfGxlbmd0aCkkLyxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcHJvcE5hbWVzVGFyZ2V0LmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgcHJvcE5hbWVzVGFyZ2V0LnB1c2gocHJvcCk7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgdGFyZ2V0Q2xhc3MucHJvdG90eXBlLFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLnByb3RvdHlwZSwgcHJvcCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgc291cmNlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHNvdXJjZSk7XG4gIH1cbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7dHlwZW9mIEFic3RyYWN0U0RDfSBiYXNlQ2xhc3NcbiAqIEBwYXJhbSB7dHlwZW9mIEFic3RyYWN0U0RDfSBtaXhpbnNcbiAqIEByZXR1cm5zIHt0eXBlb2YgQWJzdHJhY3RTREN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2lsZUFnZ3JlZ2F0aW9uKGJhc2VDbGFzcywgLi4ubWl4aW5zKSB7XG4gIGxldCBiYXNlID0ge1xuICAgIFtiYXNlQ2xhc3MubmFtZV06IGNsYXNzIHtcbiAgICAgIGNvbnN0cnVjdG9yKC4uLl9hcmdzKSB7XG4gICAgICAgIGxldCBfbWl4aW5zID0ge307XG4gICAgICAgIG1peGlucy5mb3JFYWNoKChtaXhpbikgPT4ge1xuICAgICAgICAgIGxldCBuZXdNaXhpbjtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIChuZXdNaXhpbiA9IG5ldyBtaXhpbigpKSk7XG4gICAgICAgICAgbmV3TWl4aW4uX3RhZ05hbWUgPSBtaXhpbi5wcm90b3R5cGUuX3RhZ05hbWU7XG4gICAgICAgICAgbmV3TWl4aW4uX2lzTWl4aW4gPSB0cnVlO1xuICAgICAgICAgIF9taXhpbnNbbWl4aW4ubmFtZV0gPSBuZXdNaXhpbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBuZXcgYmFzZUNsYXNzKCkpO1xuICAgICAgICB0aGlzLl9taXhpbnMgPSBfbWl4aW5zO1xuICAgICAgfVxuXG4gICAgICBzdGF0aWMgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBiYXNlQ2xhc3MubmFtZTtcbiAgICAgIH1cblxuICAgICAgc3RhdGljIGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICAgIH1cblxuICAgICAgZ2V0IG1peGlucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21peGlucztcbiAgICAgIH1cbiAgICB9LFxuICB9W2Jhc2VDbGFzcy5uYW1lXTtcblxuICBjb3B5UHJvcHMoYmFzZSwgYmFzZUNsYXNzKTtcblxuICBtaXhpbnMuZm9yRWFjaCgobWl4aW4pID0+IHtcbiAgICBjb3B5UHJvcHMoYmFzZSwgbWl4aW4pO1xuICB9KTtcblxuICByZXR1cm4gYmFzZTtcbn1cblxuZnVuY3Rpb24gY3NyZlNhZmVNZXRob2QobWV0aG9kKSB7XG4gIC8vIHRoZXNlIEhUVFAgbWV0aG9kcyBkbyBub3QgcmVxdWlyZSBDU1JGIHByb3RlY3Rpb25cbiAgcmV0dXJuIC9eKEdFVHxIRUFEfE9QVElPTlN8VFJBQ0UpJC8udGVzdChtZXRob2QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkRmlsZUZvcm1EYXRhKGZvcm1EYXRhLCB1cmwsIG1ldGhvZCkge1xuICByZXR1cm4gJC5hamF4KHtcbiAgICB1cmw6IHVybCwgLy9TZXJ2ZXIgc2NyaXB0IHRvIHByb2Nlc3MgZGF0YVxuICAgIHR5cGU6IG1ldGhvZCB8fCBcIlBPU1RcIixcbiAgICB4aHI6IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEN1c3RvbSBYTUxIdHRwUmVxdWVzdFxuICAgICAgdmFyIG15WGhyID0gJC5hamF4U2V0dGluZ3MueGhyKCk7XG4gICAgICBpZiAobXlYaHIudXBsb2FkKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHVwbG9hZCBwcm9wZXJ0eSBleGlzdHNcbiAgICAgICAgbXlYaHIudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJwcm9ncmVzc1wiLFxuICAgICAgICAgIHByb2dyZXNzSGFuZGxpbmdGdW5jdGlvbixcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTsgLy8gRm9yIGhhbmRsaW5nIHRoZSBwcm9ncmVzcyBvZiB0aGUgdXBsb2FkXG4gICAgICB9XG4gICAgICByZXR1cm4gbXlYaHI7XG4gICAgfSxcbiAgICAvL0Zvcm0gZGF0YVxuICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgIC8vT3B0aW9ucyB0byB0ZWxsIGpRdWVyeSBub3QgdG8gcHJvY2VzcyBkYXRhIG9yIHdvcnJ5IGFib3V0IGNvbnRlbnQtdHlwZS5cbiAgICBjYWNoZTogZmFsc2UsXG4gICAgY29udGVudFR5cGU6IGZhbHNlLFxuICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoeGhyLCBzZXR0aW5ncykge1xuICAgICAgaWYgKCFjc3JmU2FmZU1ldGhvZChzZXR0aW5ncy50eXBlKSAmJiAhdGhpcy5jcm9zc0RvbWFpbikge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQ1NSRlRva2VuXCIsIHdpbmRvdy5DU1JGX1RPS0VOKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcHJvZ3Jlc3NIYW5kbGluZ0Z1bmN0aW9uKGUpIHtcbiAgaWYgKGUubGVuZ3RoQ29tcHV0YWJsZSkge1xuICAgIHZhciBwZXJjZW50VmFsID0gTWF0aC5yb3VuZCgoZS5sb2FkZWQgLyBlLnRvdGFsKSAqIDEwMCk7XG4gICAgdmFyICRwcm9ncmVzc0NvbnRhaW5lciA9ICQoXCIucHJvZ3Jlc3MtY29udGFpbmVyXCIpO1xuICAgIGlmIChwZXJjZW50VmFsID09PSAxMDApIHtcbiAgICAgICRwcm9ncmVzc0NvbnRhaW5lci5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRwcm9ncmVzc0NvbnRhaW5lci5zaG93KCk7XG4gICAgfVxuXG4gICAgcGVyY2VudFZhbCArPSBcIiVcIjtcblxuICAgICRwcm9ncmVzc0NvbnRhaW5lclxuICAgICAgLmZpbmQoXCIucHJvZ3Jlc3MtYmFyXCIpXG4gICAgICAuY3NzKHt3aWR0aDogcGVyY2VudFZhbH0pXG4gICAgICAudGV4dChwZXJjZW50VmFsKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tJZlBhcmFtTnVtYmVyQm9vbE9yU3RyaW5nKFxuICBwYXJhbUVsZW1lbnQsXG4gIGNvbnRyb2xsZXIgPSBudWxsLFxuKSB7XG4gIGlmICh0eXBlb2YgcGFyYW1FbGVtZW50ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHBhcmFtRWxlbWVudDtcbiAgfVxuXG4gIGlmIChjb250cm9sbGVyICYmIHR5cGVvZiBjb250cm9sbGVyW3BhcmFtRWxlbWVudF0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICBpZiAodHlwZW9mIGNvbnRyb2xsZXJbcGFyYW1FbGVtZW50XSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICByZXR1cm4gY29udHJvbGxlcltwYXJhbUVsZW1lbnRdLmJpbmQoY29udHJvbGxlcik7XG4gICAgfVxuICAgIHJldHVybiBjb250cm9sbGVyW3BhcmFtRWxlbWVudF07XG4gIH1cblxuICBsZXQgaXNGbG9hdFJlZyA9IC9eLT9cXGQrXFwuP1xcZCskLztcbiAgbGV0IGlzSW50UmVnID0gL14tP1xcZCskLztcbiAgbGV0IGlzQm9vbFJlZyA9IC9eKHRydWV8ZmFsc2UpJC87XG4gIGxldCBpc1N0cmluZ1JlZyA9IC9eKFsnXVteJ10qWyddKXwoW1wiXVteXCJdKltcIl0pJC87XG5cbiAgaWYgKHBhcmFtRWxlbWVudC5tYXRjaChpc0Jvb2xSZWcpKSB7XG4gICAgcmV0dXJuIHBhcmFtRWxlbWVudCA9PT0gXCJ0cnVlXCI7XG4gIH0gZWxzZSBpZiAocGFyYW1FbGVtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQudG9Mb3dlckNhc2UoKSA9PT0gXCJub25lXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQubWF0Y2goaXNJbnRSZWcpKSB7XG4gICAgcmV0dXJuIHBhcnNlSW50KHBhcmFtRWxlbWVudCk7XG4gIH0gZWxzZSBpZiAocGFyYW1FbGVtZW50Lm1hdGNoKGlzRmxvYXRSZWcpKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQocGFyYW1FbGVtZW50KTtcbiAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQubWF0Y2goaXNTdHJpbmdSZWcpKSB7XG4gICAgcmV0dXJuIHBhcmFtRWxlbWVudC5zdWJzdHIoMSwgcGFyYW1FbGVtZW50Lmxlbmd0aCAtIDIpO1xuICB9XG5cbiAgcmV0dXJuIHBhcmFtRWxlbWVudDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCgpIHtcbiAgcmV0dXJuIChbMWU3XSArIC0xZTMgKyAtNGUzICsgLThlMyArIC0xZTExKS5yZXBsYWNlKC9bMDE4XS9nLCAoYykgPT5cbiAgICAoXG4gICAgICBjIF5cbiAgICAgIChjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmICgxNSA+PiAoYyAvIDQpKSlcbiAgICApLnRvU3RyaW5nKDE2KSxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRXJyb3JzSW5Gb3JtKCRmb3JtKSB7XG4gICRmb3JtXG4gICAgLmZpbmQoXCIuaGFzLWVycm9yXCIpXG4gICAgLnJlbW92ZUNsYXNzKFwiaGFzLWVycm9yXCIpXG4gICAgLmZpbmQoXCIuYWxlcnQtZGFuZ2VyXCIpXG4gICAgLnJlbW92ZSgpO1xuICAkZm9ybS5maW5kKFwiLm5vbi1maWVsZC1lcnJvcnNcIikucmVtb3ZlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRFcnJvcnNJbkZvcm0oJGZvcm0sICRyZXNGb3JtKSB7XG4gICRyZXNGb3JtID0gJChcIjxkaXY+XCIpLmFwcGVuZCgkcmVzRm9ybSk7XG5cbiAgJGZvcm1cbiAgICAuZmluZChcIi5oYXMtZXJyb3JcIilcbiAgICAucmVtb3ZlQ2xhc3MoXCJoYXMtZXJyb3JcIilcbiAgICAuZmluZChcIi5hbGVydC1kYW5nZXJcIilcbiAgICAuc2FmZVJlbW92ZSgpO1xuICAkZm9ybS5maW5kKFwiLm5vbi1maWVsZC1lcnJvcnNcIikuc2FmZVJlbW92ZSgpO1xuICBsZXQgJGZpbGVfY29udGFpbmVyID0gJHJlc0Zvcm0uZmluZChcImlucHV0W3R5cGU9ZmlsZV1cIikucGFyZW50KCk7XG4gICRmb3JtXG4gICAgLmZpbmQoXCJpbnB1dFt0eXBlPWZpbGVdXCIpXG4gICAgLnBhcmVudCgpXG4gICAgLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7XG4gICAgICAkKHRoaXMpLnJlcGxhY2VXaXRoKCRmaWxlX2NvbnRhaW5lcltpbmRleF0pO1xuICAgIH0pO1xuXG4gIGxldCBoYXNOb0Vycm9yID1cbiAgICAkcmVzRm9ybVxuICAgICAgLmZpbmQoXCIubm9uLWZpZWxkLWVycm9yc1wiKVxuICAgICAgLmluc2VydEFmdGVyKCRmb3JtLmZpbmQoXCIuaGlkZGVuLWZvcm0tZmllbGRzXCIpKS5sZW5ndGggPT09IDA7XG4gICRyZXNGb3JtLmZpbmQoXCIuaGFzLWVycm9yXCIpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgIGhhc05vRXJyb3IgPSBmYWxzZTtcbiAgICBsZXQgJHJlc0Vycm9yRmllbGQgPSAkKHRoaXMpO1xuICAgIGxldCBjbGFzc05hbWUgPSAkcmVzRXJyb3JGaWVsZC5kYXRhKFwiYXV0by1pZFwiKTtcbiAgICBsZXQgJGVycm9yRmllbGQgPSAkZm9ybS5maW5kKFwiLmZvcm0tZ3JvdXAuXCIgKyBjbGFzc05hbWUpO1xuICAgICRlcnJvckZpZWxkLmFkZENsYXNzKFwiaGFzLWVycm9yXCIpO1xuICAgICRlcnJvckZpZWxkXG4gICAgICAuZmluZChcIi5mb3JtLWlucHV0LWNvbnRhaW5lclwiKVxuICAgICAgLmFwcGVuZCgkcmVzRXJyb3JGaWVsZC5maW5kKFwiLmFsZXJ0LWRhbmdlclwiKSk7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNOb0Vycm9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ganF1ZXJ5SW5zZXJ0QXQoJGNvbnRhaW5lciwgaW5kZXgsICRuZXdFbGVtZW50KSB7XG4gIGxldCBsYXN0SW5kZXggPSAkY29udGFpbmVyLmNoaWxkcmVuKCkuc2l6ZSgpO1xuICBpZiAoaW5kZXggPCBsYXN0SW5kZXgpIHtcbiAgICAkY29udGFpbmVyLmNoaWxkcmVuKCkuZXEoaW5kZXgpLmJlZm9yZSgkbmV3RWxlbWVudCk7XG4gIH0gZWxzZSB7XG4gICAgJGNvbnRhaW5lci5hcHBlbmQoJG5ld0VsZW1lbnQpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufVxuXG4vKipcbiAqIFBhcnNlIGhpZGRlbiBpbnB1dCB2YWx1ZXMgYmFjayBpbnRvIHRoZSBjbG9zZXN0IEphdmFTY3JpcHQgcHJpbWl0aXZlLlxuICpcbiAqIEhpZGRlbiBpbnB1dHMgYXJlIG9mdGVuIHVzZWQgdG8gcHJlc2VydmUgdmFsdWVzIHRoYXQgd2VyZSBvcmlnaW5hbGx5IGJvb2xlYW5zLFxuICogbnVtYmVycyBvciBxdW90ZWQgc3RyaW5ncy4gVGhpcyBrZWVwcyBmb3JtLXRvLW1vZGVsIHN5bmMgZnJvbSB0dXJuaW5nXG4gKiBldmVyeXRoaW5nIGludG8gcGxhaW4gc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAqIEByZXR1cm5zIHsqfVxuICovXG5mdW5jdGlvbiBwYXJzZUhpZGRlbklucHV0cyh2YWx1ZSkge1xuICBsZXQgaXNGbG9hdFJlZyA9IC9eLT9cXGQrXFwuP1xcZCskLztcbiAgbGV0IGlzSW50UmVnID0gL14tP1xcZCskLztcbiAgbGV0IGlzQm9vbFJlZyA9IC9eKHRydWV8ZmFsc2UpJC87XG4gIGxldCBpc1N0cmluZ1JlZyA9IC9eKFsnXVteJ10qWyddKXwoW1wiXVteXCJdKltcIl0pJC87XG5cbiAgaWYgKHZhbHVlLnRvTG93ZXJDYXNlKCkubWF0Y2goaXNCb29sUmVnKSkge1xuICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIjtcbiAgfSBlbHNlIGlmICh2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH0gZWxzZSBpZiAodmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gXCJub25lXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc0ludFJlZykpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc0Zsb2F0UmVnKSkge1xuICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5tYXRjaChpc1N0cmluZ1JlZykpIHtcbiAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlRnJvbUZpZWxkKGZvcm1JdGVtKSB7XG4gIGxldCB7dHlwZSwgbmFtZX0gPSBmb3JtSXRlbTtcbiAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gXCJcIikge1xuICAgIGlmICh0eXBlID09PSBcImhpZGRlblwiKSB7XG4gICAgICByZXR1cm4gcGFyc2VIaWRkZW5JbnB1dHMoJChmb3JtSXRlbSkudmFsKCkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgIHJldHVybiBmb3JtSXRlbS5jaGVja2VkO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBcImZpbGVcIikge1xuICAgICAgcmV0dXJuIGZvcm1JdGVtLmZpbGVzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiAkKGZvcm1JdGVtKS52YWwoKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gc2V0VmFsdWVJbkZpZWxkKGZvcm1JdGVtLCB2YWx1ZSkge1xuICBsZXQge3R5cGUsIG5hbWV9ID0gZm9ybUl0ZW07XG4gIGlmIChuYW1lICYmIG5hbWUgIT09IFwiXCIpIHtcblxuICAgIGlmICh0eXBlID09PSBcImNoZWNrYm94XCIpIHtcbiAgICAgIGZvcm1JdGVtLmNoZWNrZWQgPSAhIXZhbHVlO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBEYXRhVHJhbnNmZXIgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBsZXQgY29udGFpbmVyID0gbmV3IERhdGFUcmFuc2ZlcigpO1xuICAgICAgICAgIGNvbnRhaW5lci5pdGVtcy5hZGQodmFsdWUpO1xuICAgICAgICAgIGZvcm1JdGVtLmZpbGVzID0gY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY01vZGVsKSB7XG4gICAgICAkKGZvcm1JdGVtKS52YWwodmFsdWUuaWQpO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZGNRdWVyeVNldCkge1xuICAgICAgJChmb3JtSXRlbSkudmFsKGBbJHt2YWx1ZS5nZXRJZHMoKS5qb2luKCcsJyl9XWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgdmFsdWUgPSBcIlwiO1xuICAgICAgfVxuICAgICAgJChmb3JtSXRlbSkudmFsKHZhbHVlKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_utils.js\n\n}");
|
|
137
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ agileAggregation: () => (/* binding */ agileAggregation),\n/* harmony export */ camelCaseToTagName: () => (/* binding */ camelCaseToTagName),\n/* harmony export */ checkIfParamNumberBoolOrString: () => (/* binding */ checkIfParamNumberBoolOrString),\n/* harmony export */ clearErrorsInForm: () => (/* binding */ clearErrorsInForm),\n/* harmony export */ formatDate: () => (/* binding */ formatDate),\n/* harmony export */ formatDateTimeLocal: () => (/* binding */ formatDateTimeLocal),\n/* harmony export */ getBody: () => (/* binding */ getBody),\n/* harmony export */ getParamsNameOfFunction: () => (/* binding */ getParamsNameOfFunction),\n/* harmony export */ getValueFromField: () => (/* binding */ getValueFromField),\n/* harmony export */ jqueryInsertAt: () => (/* binding */ jqueryInsertAt),\n/* harmony export */ promiseDummyFactory: () => (/* binding */ promiseDummyFactory),\n/* harmony export */ setErrorsInForm: () => (/* binding */ setErrorsInForm),\n/* harmony export */ setValueInField: () => (/* binding */ setValueInField),\n/* harmony export */ tagNameToCamelCase: () => (/* binding */ tagNameToCamelCase),\n/* harmony export */ tagNameToReadableName: () => (/* binding */ tagNameToReadableName),\n/* harmony export */ toDate: () => (/* binding */ toDate),\n/* harmony export */ uploadFileFormData: () => (/* binding */ uploadFileFormData),\n/* harmony export */ uuidv4: () => (/* binding */ uuidv4)\n/* harmony export */ });\n/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../index.js */ \"./src/index.js\");\n\n\n/**\n * Reference to the HTML body.\n * @type {*|jQuery|HTMLElement}\n * @private\n */\nlet _$body;\nconst arg_names_reg = /(?<=^|,\\s?)[^=\\s,]+/g;\nconst commend_reg = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/gm;\n\n/**\n * getBody returns the $body jQuery object.\n *\n * @returns {*|jQuery|HTMLElement} - body reference.\n */\nfunction getBody() {\n if (!_$body) {\n _$body = $(\"body\");\n }\n\n return _$body;\n}\n\n/**\n *\n * @param {function} func\n * @returns {RegExpMatchArray|*[]}\n */\nfunction getParamsNameOfFunction(func) {\n var fnstr = func.toString().replace(commend_reg, \"\");\n var result = fnstr\n .slice(fnstr.indexOf(\"(\") + 1, fnstr.indexOf(\")\"))\n .match(arg_names_reg);\n if (!result) {\n return [];\n }\n\n return result;\n}\n\n/**\n * promiseDummyFactory generates a simple promise which returns instantly.\n * @return {Promise} window.utils\n */\nfunction promiseDummyFactory() {\n return new Promise(function (resolve) {\n resolve();\n });\n}\n\nfunction camelCaseToTagName(str) {\n str = str.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n str = str.replace(/[0-9]+/g, (number) => `-${number}`);\n return str.replace(/^[-]/g, ``);\n}\n\nfunction tagNameToCamelCase(str) {\n str = str.replace(/-./g, (letter) => `${letter[1].toUpperCase()}`);\n return str;\n}\n\nfunction tagNameToReadableName(str) {\n str = str\n .replace(/-./g, (letter) => ` ${letter[1].toUpperCase()}`)\n .replace(/^./g, (letter) => `${letter.toUpperCase()}`);\n return str;\n}\n\nconst copyProps = (targetClass, sourceClass) => {\n let source = sourceClass;\n let propNamesTarget = Object.getOwnPropertyNames(\n targetClass.prototype,\n ).concat(Object.getOwnPropertySymbols(targetClass.prototype));\n while (source.name !== \"\") {\n Object.getOwnPropertyNames(source.prototype)\n .concat(Object.getOwnPropertySymbols(source.prototype))\n .forEach((prop) => {\n if (\n prop.match(\n /^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/,\n )\n ) {\n return;\n }\n\n if (!propNamesTarget.includes(prop)) {\n propNamesTarget.push(prop);\n Object.defineProperty(\n targetClass.prototype,\n prop,\n Object.getOwnPropertyDescriptor(source.prototype, prop),\n );\n }\n });\n source = Object.getPrototypeOf(source);\n }\n};\n\n/**\n *\n * @param {typeof AbstractSDC} baseClass\n * @param {typeof AbstractSDC} mixins\n * @returns {typeof AbstractSDC}\n */\nfunction agileAggregation(baseClass, ...mixins) {\n let base = {\n [baseClass.name]: class {\n constructor(..._args) {\n let _mixins = {};\n mixins.forEach((mixin) => {\n let newMixin;\n Object.assign(this, (newMixin = new mixin()));\n newMixin._tagName = mixin.prototype._tagName;\n newMixin._isMixin = true;\n _mixins[mixin.name] = newMixin;\n });\n\n Object.assign(this, new baseClass());\n this._mixins = _mixins;\n }\n\n static get name() {\n return baseClass.name;\n }\n\n static className() {\n return this.name;\n }\n\n get mixins() {\n return this._mixins;\n }\n },\n }[baseClass.name];\n\n copyProps(base, baseClass);\n\n mixins.forEach((mixin) => {\n copyProps(base, mixin);\n });\n\n return base;\n}\n\nfunction csrfSafeMethod(method) {\n // these HTTP methods do not require CSRF protection\n return /^(GET|HEAD|OPTIONS|TRACE)$/.test(method);\n}\n\nfunction uploadFileFormData(formData, url, method) {\n return $.ajax({\n url: url, //Server script to process data\n type: method || \"POST\",\n xhr: function () {\n // Custom XMLHttpRequest\n var myXhr = $.ajaxSettings.xhr();\n if (myXhr.upload) {\n // Check if upload property exists\n myXhr.upload.addEventListener(\n \"progress\",\n progressHandlingFunction,\n false,\n ); // For handling the progress of the upload\n }\n return myXhr;\n },\n //Form data\n data: formData,\n //Options to tell jQuery not to process data or worry about content-type.\n cache: false,\n contentType: false,\n processData: false,\n beforeSend: function (xhr, settings) {\n if (!csrfSafeMethod(settings.type) && !this.crossDomain) {\n xhr.setRequestHeader(\"X-CSRFToken\", window.CSRF_TOKEN);\n }\n },\n });\n}\n\nfunction progressHandlingFunction(e) {\n if (e.lengthComputable) {\n var percentVal = Math.round((e.loaded / e.total) * 100);\n var $progressContainer = $(\".progress-container\");\n if (percentVal === 100) {\n $progressContainer.hide();\n } else {\n $progressContainer.show();\n }\n\n percentVal += \"%\";\n\n $progressContainer\n .find(\".progress-bar\")\n .css({ width: percentVal })\n .text(percentVal);\n }\n}\n\nfunction checkIfParamNumberBoolOrString(\n paramElement,\n controller = null,\n) {\n if (typeof paramElement !== \"string\") {\n return paramElement;\n }\n\n if (controller && typeof controller[paramElement] !== \"undefined\") {\n if (typeof controller[paramElement] === \"function\") {\n return controller[paramElement].bind(controller);\n }\n return controller[paramElement];\n }\n\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n\n if (paramElement.match(isBoolReg)) {\n return paramElement === \"true\";\n } else if (paramElement === \"undefined\") {\n return undefined;\n } else if (paramElement.toLowerCase() === \"none\") {\n return null;\n } else if (paramElement.match(isIntReg)) {\n return parseInt(paramElement);\n } else if (paramElement.match(isFloatReg)) {\n return parseFloat(paramElement);\n } else if (paramElement.match(isStringReg)) {\n return paramElement.substr(1, paramElement.length - 2);\n }\n\n return paramElement;\n}\n\nfunction uuidv4() {\n return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>\n (\n c ^\n (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))\n ).toString(16),\n );\n}\n\nfunction clearErrorsInForm($form) {\n $form\n .find(\".has-error\")\n .removeClass(\"has-error\")\n .find(\".alert-danger\")\n .remove();\n $form.find(\".non-field-errors\").remove();\n}\n\nfunction setErrorsInForm($form, $resForm) {\n $resForm = $(\"<div>\").append($resForm);\n\n $form\n .find(\".has-error\")\n .removeClass(\"has-error\")\n .find(\".alert-danger\")\n .safeRemove();\n $form.find(\".non-field-errors\").safeRemove();\n let $file_container = $resForm.find(\"input[type=file]\").parent();\n $form\n .find(\"input[type=file]\")\n .parent()\n .each(function (index) {\n $(this).replaceWith($file_container[index]);\n });\n\n let hasNoError =\n $resForm\n .find(\".non-field-errors\")\n .insertAfter($form.find(\".hidden-form-fields\")).length === 0;\n $resForm.find(\".has-error\").each(function () {\n hasNoError = false;\n let $resErrorField = $(this);\n let className = $resErrorField.data(\"auto-id\");\n let $errorField = $form.find(\".form-group.\" + className);\n $errorField.addClass(\"has-error\");\n $errorField\n .find(\".form-input-container\")\n .append($resErrorField.find(\".alert-danger\"));\n });\n\n return hasNoError;\n}\n\nfunction jqueryInsertAt($container, index, $newElement) {\n let lastIndex = $container.children().size();\n if (index < lastIndex) {\n $container.children().eq(index).before($newElement);\n } else {\n $container.append($newElement);\n }\n return this;\n}\n\n/**\n * Parse hidden input values back into the closest JavaScript primitive.\n *\n * Hidden inputs are often used to preserve values that were originally booleans,\n * numbers or quoted strings. This keeps form-to-model sync from turning\n * everything into plain strings.\n *\n * @param {string} value\n * @returns {*}\n */\nfunction parseHiddenInputs(value) {\n let isFloatReg = /^-?\\d+\\.?\\d+$/;\n let isIntReg = /^-?\\d+$/;\n let isBoolReg = /^(true|false)$/;\n let isStringReg = /^(['][^']*['])|([\"][^\"]*[\"])$/;\n\n if (value.toLowerCase().match(isBoolReg)) {\n return value.toLowerCase() === \"true\";\n } else if (value === \"undefined\") {\n return undefined;\n } else if (value.toLowerCase() === \"none\") {\n return null;\n } else if (value.match(isIntReg)) {\n return parseInt(value, 10);\n } else if (value.match(isFloatReg)) {\n return parseFloat(value);\n } else if (value.match(isStringReg)) {\n return value.substring(1, value.length - 1);\n }\n return value;\n}\n\nfunction getValueFromField(formItem) {\n let { type, name } = formItem;\n if (name && name !== \"\") {\n if (type === \"hidden\") {\n return parseHiddenInputs($(formItem).val());\n }\n\n if (type === \"checkbox\") {\n return formItem.checked;\n }\n\n if (type === \"file\") {\n return formItem.files[0];\n }\n\n return $(formItem).val();\n }\n return null;\n}\n\nconst pad2 = (n) => String(n).padStart(2, \"0\");\n\n/**\n * Convert a Date, a date string or a timestamp into a valid Date.\n * A date-only string (\"YYYY-MM-DD\") is read as local midnight, not UTC,\n * so the day does not shift in time zones west of UTC.\n *\n * @param {*} value\n * @returns {?Date} null if the value is empty or not a valid date\n */\nfunction toDate(value) {\n if (value === null || value === undefined || value === \"\") {\n return null;\n }\n let date;\n if (value instanceof Date) {\n date = value;\n } else if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n const [y, m, d] = value.split(\"-\").map(Number);\n date = new Date(y, m - 1, d);\n } else {\n date = new Date(value);\n }\n return isNaN(date.getTime()) ? null : date;\n}\n\n/**\n * @param {*} value\n * @returns {string} \"YYYY-MM-DD\" in local time, or \"\" if not a valid date\n */\nfunction formatDate(value) {\n const date = toDate(value);\n if (!date) {\n return \"\";\n }\n return `${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())}`;\n}\n\n/**\n * @param {*} value\n * @returns {string} \"YYYY-MM-DDTHH:MM\" in local time, or \"\" if not a valid date\n */\nfunction formatDateTimeLocal(value) {\n const date = toDate(value);\n if (!date) {\n return \"\";\n }\n return `${formatDate(date)}T${pad2(date.getHours())}:${pad2(date.getMinutes())}`;\n}\n\nfunction setValueInField(formItem, value) {\n let { type, name } = formItem;\n if (name && name !== \"\") {\n if (type === \"datetime-local\") {\n formItem.value = formatDateTimeLocal(value);\n } else if (type === \"date\") {\n formItem.value = formatDate(value);\n } else if (type === \"checkbox\") {\n formItem.checked = !!value;\n } else if (type === \"file\") {\n if (value instanceof File) {\n if (typeof DataTransfer !== \"undefined\") {\n let container = new DataTransfer();\n container.items.add(value);\n formItem.files = container;\n }\n }\n } else if (value instanceof _index_js__WEBPACK_IMPORTED_MODULE_0__.SdcModel) {\n $(formItem).val(value.id);\n } else if (value instanceof _index_js__WEBPACK_IMPORTED_MODULE_0__.SdcQuerySet) {\n $(formItem).val(`[${value.getIds().join(\",\")}]`);\n } else {\n if (value === null) {\n value = \"\";\n }\n $(formItem).val(value);\n }\n }\n return null;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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dXRpbHMuanM/YmYyMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTZGNNb2RlbCwgU2RjUXVlcnlTZXQgfSBmcm9tIFwiLi4vaW5kZXguanNcIjtcblxuLyoqXG4gKiBSZWZlcmVuY2UgdG8gdGhlIEhUTUwgYm9keS5cbiAqIEB0eXBlIHsqfGpRdWVyeXxIVE1MRWxlbWVudH1cbiAqIEBwcml2YXRlXG4gKi9cbmxldCBfJGJvZHk7XG5jb25zdCBhcmdfbmFtZXNfcmVnID0gLyg/PD1efCxcXHM/KVtePVxccyxdKy9nO1xuY29uc3QgY29tbWVuZF9yZWcgPSAvKChcXC9cXC8uKiQpfChcXC9cXCpbXFxzXFxTXSo/XFwqXFwvKSkvZ207XG5cbi8qKlxuICogZ2V0Qm9keSByZXR1cm5zIHRoZSAkYm9keSBqUXVlcnkgb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIHsqfGpRdWVyeXxIVE1MRWxlbWVudH0gLSBib2R5IHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJvZHkoKSB7XG4gIGlmICghXyRib2R5KSB7XG4gICAgXyRib2R5ID0gJChcImJvZHlcIik7XG4gIH1cblxuICByZXR1cm4gXyRib2R5O1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBmdW5jXG4gKiBAcmV0dXJucyB7UmVnRXhwTWF0Y2hBcnJheXwqW119XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYXJhbXNOYW1lT2ZGdW5jdGlvbihmdW5jKSB7XG4gIHZhciBmbnN0ciA9IGZ1bmMudG9TdHJpbmcoKS5yZXBsYWNlKGNvbW1lbmRfcmVnLCBcIlwiKTtcbiAgdmFyIHJlc3VsdCA9IGZuc3RyXG4gICAgLnNsaWNlKGZuc3RyLmluZGV4T2YoXCIoXCIpICsgMSwgZm5zdHIuaW5kZXhPZihcIilcIikpXG4gICAgLm1hdGNoKGFyZ19uYW1lc19yZWcpO1xuICBpZiAoIXJlc3VsdCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogcHJvbWlzZUR1bW15RmFjdG9yeSBnZW5lcmF0ZXMgYSBzaW1wbGUgcHJvbWlzZSB3aGljaCByZXR1cm5zIGluc3RhbnRseS5cbiAqIEByZXR1cm4ge1Byb21pc2V9IHdpbmRvdy51dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzZUR1bW15RmFjdG9yeSgpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgcmVzb2x2ZSgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbWVsQ2FzZVRvVGFnTmFtZShzdHIpIHtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL1tBLVpdL2csIChsZXR0ZXIpID0+IGAtJHtsZXR0ZXIudG9Mb3dlckNhc2UoKX1gKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL1swLTldKy9nLCAobnVtYmVyKSA9PiBgLSR7bnVtYmVyfWApO1xuICByZXR1cm4gc3RyLnJlcGxhY2UoL15bLV0vZywgYGApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdGFnTmFtZVRvQ2FtZWxDYXNlKHN0cikge1xuICBzdHIgPSBzdHIucmVwbGFjZSgvLS4vZywgKGxldHRlcikgPT4gYCR7bGV0dGVyWzFdLnRvVXBwZXJDYXNlKCl9YCk7XG4gIHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YWdOYW1lVG9SZWFkYWJsZU5hbWUoc3RyKSB7XG4gIHN0ciA9IHN0clxuICAgIC5yZXBsYWNlKC8tLi9nLCAobGV0dGVyKSA9PiBgICR7bGV0dGVyWzFdLnRvVXBwZXJDYXNlKCl9YClcbiAgICAucmVwbGFjZSgvXi4vZywgKGxldHRlcikgPT4gYCR7bGV0dGVyLnRvVXBwZXJDYXNlKCl9YCk7XG4gIHJldHVybiBzdHI7XG59XG5cbmNvbnN0IGNvcHlQcm9wcyA9ICh0YXJnZXRDbGFzcywgc291cmNlQ2xhc3MpID0+IHtcbiAgbGV0IHNvdXJjZSA9IHNvdXJjZUNsYXNzO1xuICBsZXQgcHJvcE5hbWVzVGFyZ2V0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoXG4gICAgdGFyZ2V0Q2xhc3MucHJvdG90eXBlLFxuICApLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHRhcmdldENsYXNzLnByb3RvdHlwZSkpO1xuICB3aGlsZSAoc291cmNlLm5hbWUgIT09IFwiXCIpIHtcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhzb3VyY2UucHJvdG90eXBlKVxuICAgICAgLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZS5wcm90b3R5cGUpKVxuICAgICAgLmZvckVhY2goKHByb3ApID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByb3AubWF0Y2goXG4gICAgICAgICAgICAvXig/OmNvbnN0cnVjdG9yfHByb3RvdHlwZXxhcmd1bWVudHN8Y2FsbGVyfG5hbWV8YmluZHxjYWxsfGFwcGx5fHRvU3RyaW5nfGxlbmd0aCkkLyxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcHJvcE5hbWVzVGFyZ2V0LmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgcHJvcE5hbWVzVGFyZ2V0LnB1c2gocHJvcCk7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFxuICAgICAgICAgICAgdGFyZ2V0Q2xhc3MucHJvdG90eXBlLFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLnByb3RvdHlwZSwgcHJvcCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgc291cmNlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHNvdXJjZSk7XG4gIH1cbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7dHlwZW9mIEFic3RyYWN0U0RDfSBiYXNlQ2xhc3NcbiAqIEBwYXJhbSB7dHlwZW9mIEFic3RyYWN0U0RDfSBtaXhpbnNcbiAqIEByZXR1cm5zIHt0eXBlb2YgQWJzdHJhY3RTREN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2lsZUFnZ3JlZ2F0aW9uKGJhc2VDbGFzcywgLi4ubWl4aW5zKSB7XG4gIGxldCBiYXNlID0ge1xuICAgIFtiYXNlQ2xhc3MubmFtZV06IGNsYXNzIHtcbiAgICAgIGNvbnN0cnVjdG9yKC4uLl9hcmdzKSB7XG4gICAgICAgIGxldCBfbWl4aW5zID0ge307XG4gICAgICAgIG1peGlucy5mb3JFYWNoKChtaXhpbikgPT4ge1xuICAgICAgICAgIGxldCBuZXdNaXhpbjtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIChuZXdNaXhpbiA9IG5ldyBtaXhpbigpKSk7XG4gICAgICAgICAgbmV3TWl4aW4uX3RhZ05hbWUgPSBtaXhpbi5wcm90b3R5cGUuX3RhZ05hbWU7XG4gICAgICAgICAgbmV3TWl4aW4uX2lzTWl4aW4gPSB0cnVlO1xuICAgICAgICAgIF9taXhpbnNbbWl4aW4ubmFtZV0gPSBuZXdNaXhpbjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCBuZXcgYmFzZUNsYXNzKCkpO1xuICAgICAgICB0aGlzLl9taXhpbnMgPSBfbWl4aW5zO1xuICAgICAgfVxuXG4gICAgICBzdGF0aWMgZ2V0IG5hbWUoKSB7XG4gICAgICAgIHJldHVybiBiYXNlQ2xhc3MubmFtZTtcbiAgICAgIH1cblxuICAgICAgc3RhdGljIGNsYXNzTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICAgIH1cblxuICAgICAgZ2V0IG1peGlucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21peGlucztcbiAgICAgIH1cbiAgICB9LFxuICB9W2Jhc2VDbGFzcy5uYW1lXTtcblxuICBjb3B5UHJvcHMoYmFzZSwgYmFzZUNsYXNzKTtcblxuICBtaXhpbnMuZm9yRWFjaCgobWl4aW4pID0+IHtcbiAgICBjb3B5UHJvcHMoYmFzZSwgbWl4aW4pO1xuICB9KTtcblxuICByZXR1cm4gYmFzZTtcbn1cblxuZnVuY3Rpb24gY3NyZlNhZmVNZXRob2QobWV0aG9kKSB7XG4gIC8vIHRoZXNlIEhUVFAgbWV0aG9kcyBkbyBub3QgcmVxdWlyZSBDU1JGIHByb3RlY3Rpb25cbiAgcmV0dXJuIC9eKEdFVHxIRUFEfE9QVElPTlN8VFJBQ0UpJC8udGVzdChtZXRob2QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBsb2FkRmlsZUZvcm1EYXRhKGZvcm1EYXRhLCB1cmwsIG1ldGhvZCkge1xuICByZXR1cm4gJC5hamF4KHtcbiAgICB1cmw6IHVybCwgLy9TZXJ2ZXIgc2NyaXB0IHRvIHByb2Nlc3MgZGF0YVxuICAgIHR5cGU6IG1ldGhvZCB8fCBcIlBPU1RcIixcbiAgICB4aHI6IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIEN1c3RvbSBYTUxIdHRwUmVxdWVzdFxuICAgICAgdmFyIG15WGhyID0gJC5hamF4U2V0dGluZ3MueGhyKCk7XG4gICAgICBpZiAobXlYaHIudXBsb2FkKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHVwbG9hZCBwcm9wZXJ0eSBleGlzdHNcbiAgICAgICAgbXlYaHIudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgXCJwcm9ncmVzc1wiLFxuICAgICAgICAgIHByb2dyZXNzSGFuZGxpbmdGdW5jdGlvbixcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTsgLy8gRm9yIGhhbmRsaW5nIHRoZSBwcm9ncmVzcyBvZiB0aGUgdXBsb2FkXG4gICAgICB9XG4gICAgICByZXR1cm4gbXlYaHI7XG4gICAgfSxcbiAgICAvL0Zvcm0gZGF0YVxuICAgIGRhdGE6IGZvcm1EYXRhLFxuICAgIC8vT3B0aW9ucyB0byB0ZWxsIGpRdWVyeSBub3QgdG8gcHJvY2VzcyBkYXRhIG9yIHdvcnJ5IGFib3V0IGNvbnRlbnQtdHlwZS5cbiAgICBjYWNoZTogZmFsc2UsXG4gICAgY29udGVudFR5cGU6IGZhbHNlLFxuICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcbiAgICBiZWZvcmVTZW5kOiBmdW5jdGlvbiAoeGhyLCBzZXR0aW5ncykge1xuICAgICAgaWYgKCFjc3JmU2FmZU1ldGhvZChzZXR0aW5ncy50eXBlKSAmJiAhdGhpcy5jcm9zc0RvbWFpbikge1xuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihcIlgtQ1NSRlRva2VuXCIsIHdpbmRvdy5DU1JGX1RPS0VOKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gcHJvZ3Jlc3NIYW5kbGluZ0Z1bmN0aW9uKGUpIHtcbiAgaWYgKGUubGVuZ3RoQ29tcHV0YWJsZSkge1xuICAgIHZhciBwZXJjZW50VmFsID0gTWF0aC5yb3VuZCgoZS5sb2FkZWQgLyBlLnRvdGFsKSAqIDEwMCk7XG4gICAgdmFyICRwcm9ncmVzc0NvbnRhaW5lciA9ICQoXCIucHJvZ3Jlc3MtY29udGFpbmVyXCIpO1xuICAgIGlmIChwZXJjZW50VmFsID09PSAxMDApIHtcbiAgICAgICRwcm9ncmVzc0NvbnRhaW5lci5oaWRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRwcm9ncmVzc0NvbnRhaW5lci5zaG93KCk7XG4gICAgfVxuXG4gICAgcGVyY2VudFZhbCArPSBcIiVcIjtcblxuICAgICRwcm9ncmVzc0NvbnRhaW5lclxuICAgICAgLmZpbmQoXCIucHJvZ3Jlc3MtYmFyXCIpXG4gICAgICAuY3NzKHsgd2lkdGg6IHBlcmNlbnRWYWwgfSlcbiAgICAgIC50ZXh0KHBlcmNlbnRWYWwpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0lmUGFyYW1OdW1iZXJCb29sT3JTdHJpbmcoXG4gIHBhcmFtRWxlbWVudCxcbiAgY29udHJvbGxlciA9IG51bGwsXG4pIHtcbiAgaWYgKHR5cGVvZiBwYXJhbUVsZW1lbnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gcGFyYW1FbGVtZW50O1xuICB9XG5cbiAgaWYgKGNvbnRyb2xsZXIgJiYgdHlwZW9mIGNvbnRyb2xsZXJbcGFyYW1FbGVtZW50XSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGlmICh0eXBlb2YgY29udHJvbGxlcltwYXJhbUVsZW1lbnRdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHJldHVybiBjb250cm9sbGVyW3BhcmFtRWxlbWVudF0uYmluZChjb250cm9sbGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRyb2xsZXJbcGFyYW1FbGVtZW50XTtcbiAgfVxuXG4gIGxldCBpc0Zsb2F0UmVnID0gL14tP1xcZCtcXC4/XFxkKyQvO1xuICBsZXQgaXNJbnRSZWcgPSAvXi0/XFxkKyQvO1xuICBsZXQgaXNCb29sUmVnID0gL14odHJ1ZXxmYWxzZSkkLztcbiAgbGV0IGlzU3RyaW5nUmVnID0gL14oWyddW14nXSpbJ10pfChbXCJdW15cIl0qW1wiXSkkLztcblxuICBpZiAocGFyYW1FbGVtZW50Lm1hdGNoKGlzQm9vbFJlZykpIHtcbiAgICByZXR1cm4gcGFyYW1FbGVtZW50ID09PSBcInRydWVcIjtcbiAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKHBhcmFtRWxlbWVudC50b0xvd2VyQ2FzZSgpID09PSBcIm5vbmVcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKHBhcmFtRWxlbWVudC5tYXRjaChpc0ludFJlZykpIHtcbiAgICByZXR1cm4gcGFyc2VJbnQocGFyYW1FbGVtZW50KTtcbiAgfSBlbHNlIGlmIChwYXJhbUVsZW1lbnQubWF0Y2goaXNGbG9hdFJlZykpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChwYXJhbUVsZW1lbnQpO1xuICB9IGVsc2UgaWYgKHBhcmFtRWxlbWVudC5tYXRjaChpc1N0cmluZ1JlZykpIHtcbiAgICByZXR1cm4gcGFyYW1FbGVtZW50LnN1YnN0cigxLCBwYXJhbUVsZW1lbnQubGVuZ3RoIC0gMik7XG4gIH1cblxuICByZXR1cm4gcGFyYW1FbGVtZW50O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXVpZHY0KCkge1xuICByZXR1cm4gKFsxZTddICsgLTFlMyArIC00ZTMgKyAtOGUzICsgLTFlMTEpLnJlcGxhY2UoL1swMThdL2csIChjKSA9PlxuICAgIChcbiAgICAgIGMgXlxuICAgICAgKGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgKDE1ID4+IChjIC8gNCkpKVxuICAgICkudG9TdHJpbmcoMTYpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJFcnJvcnNJbkZvcm0oJGZvcm0pIHtcbiAgJGZvcm1cbiAgICAuZmluZChcIi5oYXMtZXJyb3JcIilcbiAgICAucmVtb3ZlQ2xhc3MoXCJoYXMtZXJyb3JcIilcbiAgICAuZmluZChcIi5hbGVydC1kYW5nZXJcIilcbiAgICAucmVtb3ZlKCk7XG4gICRmb3JtLmZpbmQoXCIubm9uLWZpZWxkLWVycm9yc1wiKS5yZW1vdmUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEVycm9yc0luRm9ybSgkZm9ybSwgJHJlc0Zvcm0pIHtcbiAgJHJlc0Zvcm0gPSAkKFwiPGRpdj5cIikuYXBwZW5kKCRyZXNGb3JtKTtcblxuICAkZm9ybVxuICAgIC5maW5kKFwiLmhhcy1lcnJvclwiKVxuICAgIC5yZW1vdmVDbGFzcyhcImhhcy1lcnJvclwiKVxuICAgIC5maW5kKFwiLmFsZXJ0LWRhbmdlclwiKVxuICAgIC5zYWZlUmVtb3ZlKCk7XG4gICRmb3JtLmZpbmQoXCIubm9uLWZpZWxkLWVycm9yc1wiKS5zYWZlUmVtb3ZlKCk7XG4gIGxldCAkZmlsZV9jb250YWluZXIgPSAkcmVzRm9ybS5maW5kKFwiaW5wdXRbdHlwZT1maWxlXVwiKS5wYXJlbnQoKTtcbiAgJGZvcm1cbiAgICAuZmluZChcImlucHV0W3R5cGU9ZmlsZV1cIilcbiAgICAucGFyZW50KClcbiAgICAuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICQodGhpcykucmVwbGFjZVdpdGgoJGZpbGVfY29udGFpbmVyW2luZGV4XSk7XG4gICAgfSk7XG5cbiAgbGV0IGhhc05vRXJyb3IgPVxuICAgICRyZXNGb3JtXG4gICAgICAuZmluZChcIi5ub24tZmllbGQtZXJyb3JzXCIpXG4gICAgICAuaW5zZXJ0QWZ0ZXIoJGZvcm0uZmluZChcIi5oaWRkZW4tZm9ybS1maWVsZHNcIikpLmxlbmd0aCA9PT0gMDtcbiAgJHJlc0Zvcm0uZmluZChcIi5oYXMtZXJyb3JcIikuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgaGFzTm9FcnJvciA9IGZhbHNlO1xuICAgIGxldCAkcmVzRXJyb3JGaWVsZCA9ICQodGhpcyk7XG4gICAgbGV0IGNsYXNzTmFtZSA9ICRyZXNFcnJvckZpZWxkLmRhdGEoXCJhdXRvLWlkXCIpO1xuICAgIGxldCAkZXJyb3JGaWVsZCA9ICRmb3JtLmZpbmQoXCIuZm9ybS1ncm91cC5cIiArIGNsYXNzTmFtZSk7XG4gICAgJGVycm9yRmllbGQuYWRkQ2xhc3MoXCJoYXMtZXJyb3JcIik7XG4gICAgJGVycm9yRmllbGRcbiAgICAgIC5maW5kKFwiLmZvcm0taW5wdXQtY29udGFpbmVyXCIpXG4gICAgICAuYXBwZW5kKCRyZXNFcnJvckZpZWxkLmZpbmQoXCIuYWxlcnQtZGFuZ2VyXCIpKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGhhc05vRXJyb3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqcXVlcnlJbnNlcnRBdCgkY29udGFpbmVyLCBpbmRleCwgJG5ld0VsZW1lbnQpIHtcbiAgbGV0IGxhc3RJbmRleCA9ICRjb250YWluZXIuY2hpbGRyZW4oKS5zaXplKCk7XG4gIGlmIChpbmRleCA8IGxhc3RJbmRleCkge1xuICAgICRjb250YWluZXIuY2hpbGRyZW4oKS5lcShpbmRleCkuYmVmb3JlKCRuZXdFbGVtZW50KTtcbiAgfSBlbHNlIHtcbiAgICAkY29udGFpbmVyLmFwcGVuZCgkbmV3RWxlbWVudCk7XG4gIH1cbiAgcmV0dXJuIHRoaXM7XG59XG5cbi8qKlxuICogUGFyc2UgaGlkZGVuIGlucHV0IHZhbHVlcyBiYWNrIGludG8gdGhlIGNsb3Nlc3QgSmF2YVNjcmlwdCBwcmltaXRpdmUuXG4gKlxuICogSGlkZGVuIGlucHV0cyBhcmUgb2Z0ZW4gdXNlZCB0byBwcmVzZXJ2ZSB2YWx1ZXMgdGhhdCB3ZXJlIG9yaWdpbmFsbHkgYm9vbGVhbnMsXG4gKiBudW1iZXJzIG9yIHF1b3RlZCBzdHJpbmdzLiBUaGlzIGtlZXBzIGZvcm0tdG8tbW9kZWwgc3luYyBmcm9tIHR1cm5pbmdcbiAqIGV2ZXJ5dGhpbmcgaW50byBwbGFpbiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICogQHJldHVybnMgeyp9XG4gKi9cbmZ1bmN0aW9uIHBhcnNlSGlkZGVuSW5wdXRzKHZhbHVlKSB7XG4gIGxldCBpc0Zsb2F0UmVnID0gL14tP1xcZCtcXC4/XFxkKyQvO1xuICBsZXQgaXNJbnRSZWcgPSAvXi0/XFxkKyQvO1xuICBsZXQgaXNCb29sUmVnID0gL14odHJ1ZXxmYWxzZSkkLztcbiAgbGV0IGlzU3RyaW5nUmVnID0gL14oWyddW14nXSpbJ10pfChbXCJdW15cIl0qW1wiXSkkLztcblxuICBpZiAodmFsdWUudG9Mb3dlckNhc2UoKS5tYXRjaChpc0Jvb2xSZWcpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICB9IGVsc2UgaWYgKHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSBlbHNlIGlmICh2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSBcIm5vbmVcIikge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzSW50UmVnKSkge1xuICAgIHJldHVybiBwYXJzZUludCh2YWx1ZSwgMTApO1xuICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzRmxvYXRSZWcpKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodmFsdWUpO1xuICB9IGVsc2UgaWYgKHZhbHVlLm1hdGNoKGlzU3RyaW5nUmVnKSkge1xuICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoIC0gMSk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VmFsdWVGcm9tRmllbGQoZm9ybUl0ZW0pIHtcbiAgbGV0IHsgdHlwZSwgbmFtZSB9ID0gZm9ybUl0ZW07XG4gIGlmIChuYW1lICYmIG5hbWUgIT09IFwiXCIpIHtcbiAgICBpZiAodHlwZSA9PT0gXCJoaWRkZW5cIikge1xuICAgICAgcmV0dXJuIHBhcnNlSGlkZGVuSW5wdXRzKCQoZm9ybUl0ZW0pLnZhbCgpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICByZXR1cm4gZm9ybUl0ZW0uY2hlY2tlZDtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgIHJldHVybiBmb3JtSXRlbS5maWxlc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gJChmb3JtSXRlbSkudmFsKCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmNvbnN0IHBhZDIgPSAobikgPT4gU3RyaW5nKG4pLnBhZFN0YXJ0KDIsIFwiMFwiKTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgRGF0ZSwgYSBkYXRlIHN0cmluZyBvciBhIHRpbWVzdGFtcCBpbnRvIGEgdmFsaWQgRGF0ZS5cbiAqIEEgZGF0ZS1vbmx5IHN0cmluZyAoXCJZWVlZLU1NLUREXCIpIGlzIHJlYWQgYXMgbG9jYWwgbWlkbmlnaHQsIG5vdCBVVEMsXG4gKiBzbyB0aGUgZGF5IGRvZXMgbm90IHNoaWZ0IGluIHRpbWUgem9uZXMgd2VzdCBvZiBVVEMuXG4gKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMgez9EYXRlfSBudWxsIGlmIHRoZSB2YWx1ZSBpcyBlbXB0eSBvciBub3QgYSB2YWxpZCBkYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0RhdGUodmFsdWUpIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCIpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBsZXQgZGF0ZTtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIGRhdGUgPSB2YWx1ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgL15cXGR7NH0tXFxkezJ9LVxcZHsyfSQvLnRlc3QodmFsdWUpKSB7XG4gICAgY29uc3QgW3ksIG0sIGRdID0gdmFsdWUuc3BsaXQoXCItXCIpLm1hcChOdW1iZXIpO1xuICAgIGRhdGUgPSBuZXcgRGF0ZSh5LCBtIC0gMSwgZCk7XG4gIH0gZWxzZSB7XG4gICAgZGF0ZSA9IG5ldyBEYXRlKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gbnVsbCA6IGRhdGU7XG59XG5cbi8qKlxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ30gXCJZWVlZLU1NLUREXCIgaW4gbG9jYWwgdGltZSwgb3IgXCJcIiBpZiBub3QgYSB2YWxpZCBkYXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlKHZhbHVlKSB7XG4gIGNvbnN0IGRhdGUgPSB0b0RhdGUodmFsdWUpO1xuICBpZiAoIWRhdGUpIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICByZXR1cm4gYCR7ZGF0ZS5nZXRGdWxsWWVhcigpfS0ke3BhZDIoZGF0ZS5nZXRNb250aCgpICsgMSl9LSR7cGFkMihkYXRlLmdldERhdGUoKSl9YDtcbn1cblxuLyoqXG4gKiBAcGFyYW0geyp9IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBcIllZWVktTU0tRERUSEg6TU1cIiBpbiBsb2NhbCB0aW1lLCBvciBcIlwiIGlmIG5vdCBhIHZhbGlkIGRhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lTG9jYWwodmFsdWUpIHtcbiAgY29uc3QgZGF0ZSA9IHRvRGF0ZSh2YWx1ZSk7XG4gIGlmICghZGF0ZSkge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHJldHVybiBgJHtmb3JtYXREYXRlKGRhdGUpfVQke3BhZDIoZGF0ZS5nZXRIb3VycygpKX06JHtwYWQyKGRhdGUuZ2V0TWludXRlcygpKX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0VmFsdWVJbkZpZWxkKGZvcm1JdGVtLCB2YWx1ZSkge1xuICBsZXQgeyB0eXBlLCBuYW1lIH0gPSBmb3JtSXRlbTtcbiAgaWYgKG5hbWUgJiYgbmFtZSAhPT0gXCJcIikge1xuICAgIGlmICh0eXBlID09PSBcImRhdGV0aW1lLWxvY2FsXCIpIHtcbiAgICAgIGZvcm1JdGVtLnZhbHVlID0gZm9ybWF0RGF0ZVRpbWVMb2NhbCh2YWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImRhdGVcIikge1xuICAgICAgZm9ybUl0ZW0udmFsdWUgPSBmb3JtYXREYXRlKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiY2hlY2tib3hcIikge1xuICAgICAgZm9ybUl0ZW0uY2hlY2tlZCA9ICEhdmFsdWU7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSBcImZpbGVcIikge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICBpZiAodHlwZW9mIERhdGFUcmFuc2ZlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgIGxldCBjb250YWluZXIgPSBuZXcgRGF0YVRyYW5zZmVyKCk7XG4gICAgICAgICAgY29udGFpbmVyLml0ZW1zLmFkZCh2YWx1ZSk7XG4gICAgICAgICAgZm9ybUl0ZW0uZmlsZXMgPSBjb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2RjTW9kZWwpIHtcbiAgICAgICQoZm9ybUl0ZW0pLnZhbCh2YWx1ZS5pZCk7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFNkY1F1ZXJ5U2V0KSB7XG4gICAgICAkKGZvcm1JdGVtKS52YWwoYFske3ZhbHVlLmdldElkcygpLmpvaW4oXCIsXCIpfV1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHZhbHVlID0gXCJcIjtcbiAgICAgIH1cbiAgICAgICQoZm9ybUl0ZW0pLnZhbCh2YWx1ZSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_utils.js\n\n}");
|
|
128
138
|
|
|
129
139
|
/***/ },
|
|
130
140
|
|
|
@@ -134,7 +144,7 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
134
144
|
\******************************************/
|
|
135
145
|
(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
136
146
|
|
|
137
|
-
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CONTROLLER_CLASS: () => (/* binding */ CONTROLLER_CLASS),\n/* harmony export */ DATA_CONTROLLER_KEY: () => (/* binding */ DATA_CONTROLLER_KEY),\n/* harmony export */ cleanCache: () => (/* binding */ cleanCache),\n/* harmony export */ getController: () => (/* binding */ getController),\n/* harmony export */ loadFilesFromController: () => (/* binding */ loadFilesFromController),\n/* harmony export */ reconcile: () => (/* binding */ reconcile),\n/* harmony export */ refresh: () => (/* binding */ refresh),\n/* harmony export */ reloadHTMLController: () => (/* binding */ reloadHTMLController),\n/* harmony export */ reloadMethodHTML: () => (/* binding */ reloadMethodHTML),\n/* harmony export */ replaceTagElementsInContainer: () => (/* binding */ replaceTagElementsInContainer),\n/* harmony export */ runControllerFillContent: () => (/* binding */ runControllerFillContent)\n/* harmony export */ });\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_params_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_params.js */ \"./src/simpleDomControl/sdc_params.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\n\n\n/**\n * List of HTML files.\n * @type {{}}\n */\nlet htmlFiles = {};\n\nconst DATA_CONTROLLER_KEY = \"_controller_\";\nconst CONTROLLER_CLASS = \"_sdc_controller_\";\n\nfunction cleanCache() {\n htmlFiles = {};\n}\n\n/**\n * findSdcTgs Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. It collects all those\n * doms and returns a list of objects containing also the tag name the dom and the tag\n * names of the super controller\n *\n * @param {jquery} $container - jQuery container\n * @param {Array<string>} tagNameList - a string list with tag names.\n * @param {AbstractSDC} parentController - controller in surrounding\n * @return {Array} - a array of objects with all register tags found\n */\nfunction findSdcTgs($container, tagNameList, parentController) {\n if (!$container) {\n return [];\n }\n let $children = $container.children();\n let emptyList = [];\n $children.each(function (_, element) {\n let $element = $(element);\n let tagName = $element.prop(\"tagName\").toLowerCase().split(\"_\");\n if ($.inArray(tagName[0], tagNameList) >= 0) {\n emptyList.push({\n tag: tagName[0],\n super: tagName.splice(1) || [],\n dom: $element,\n });\n } else if (tagName[0].startsWith(\"this.\")) {\n $element.addClass(\n `_bind_to_update_handler sdc_uuid_${parentController._uuid}`,\n );\n } else {\n emptyList = emptyList.concat(\n findSdcTgs($element, tagNameList, parentController),\n );\n }\n });\n\n return emptyList;\n}\n\n/**\n * replacePlaceholderController fills the parameter of the content\n * url this function uses the tag parameter\n *\n * @param controller - controller object\n * @param url - the origin content URL\n * @param urlValues - values for the url placeholder. In same order!!\n * @returns {string} - the correct URL with prefix.\n */\nfunction replacePlaceholderController(controller, url, urlValues) {\n for (let key_idx in controller._urlParams) {\n if (controller._urlParams.hasOwnProperty(key_idx)) {\n let key = controller._urlParams[key_idx];\n let re = RegExp(\"%\\\\(\" + key + \"\\\\)\\\\w\", \"gm\");\n const val = urlValues[key];\n if(!val) {\n console.warn(`${key} is not set for controller ${ controller._tagName }`);\n }\n url = url.replace(re, val);\n }\n }\n\n return url;\n}\n\n/**\n * loadHTMLFile loads the HTML content file from the server via ajax request.\n *\n * If the HTML file is loaded already the function takes no action.\n *\n * @param {AbstractSDC} controller - a content URL from the controller.\n * @param {object} args - get args.\n * @returns {Promise<jQuery|Boolean>} - waits for the file to be loaded.\n */\nfunction loadHTMLFile(controller, args) {\n const { contentUrl, _tagName, contentReload } = controller;\n if (!contentUrl) {\n return Promise.resolve(false);\n } else if (htmlFiles[_tagName]) {\n return Promise.resolve(htmlFiles[_tagName]);\n }\n\n args.VERSION = _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.VERSION;\n args._method = \"content\";\n\n return $.get(contentUrl, args)\n .then(function (data) {\n if (!contentReload) {\n htmlFiles[_tagName] = data;\n }\n\n return data;\n })\n .catch(function (err) {\n if (err.status === 301) {\n const data = err.responseJSON;\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"_RedirectOnView\", data[\"url-link\"]);\n if (!contentReload) {\n controller.autoRedirect = data[\"url-link\"];\n }\n return '<p>Redirected</p>';\n }\n controller.autoRedirect = null;\n if (typeof controller.confirmPageLoaded === \"function\") {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"navLoaded\", { controller_name: () => err.status });\n }\n\n throw `<sdc-error data-code=\"${err.status}\">${err.responseText}</sdc-error>`;\n });\n}\n\n/**\n * replaceAllTagElementsInContainer replaces all registered tags by the controller.\n * In this step the life-cycle starts.\n *\n * @param {jquery} $container - given container\n * @param {AbstractSDC} parentController - parent contoller surrounded the container\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceAllTagElementsInContainer(\n $container,\n parentController,\n process = null,\n) {\n parentController = parentController || $container.data(DATA_CONTROLLER_KEY);\n return replaceTagElementsInContainer(\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames,\n $container,\n parentController,\n process,\n );\n}\n\n/**\n * parseContentUrl uses the content URL prefix to marge the\n * correct URL. Also parses the url parameter\n *\n * @param {AbstractSDC} controller - controller object\n * @returns {{url: String, args: Array}} - the correct URL with prefix.\n */\nfunction parseContentUrl(controller) {\n let url = controller.contentUrl;\n if (controller && controller._urlParams.length === 0) {\n let re = /%\\(([^)]+)\\)\\w/gm;\n let matches;\n controller._urlParams = [];\n while ((matches = re.exec(url))) {\n controller._urlParams.push(matches[1]);\n controller.contentReload = true;\n }\n }\n\n let { args, params } = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.getUrlParam)(controller, controller.$container);\n if (controller._urlParams.length) {\n url = replacePlaceholderController(controller, url, params);\n }\n\n controller.parsedContentUrl = url;\n\n return { url: url, args };\n}\n\n/**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\nfunction getController($elem) {\n if ($elem.hasClass(CONTROLLER_CLASS)) {\n return $elem.data(`${DATA_CONTROLLER_KEY}`);\n }\n return $elem.closest(`.${CONTROLLER_CLASS}`).data(`${DATA_CONTROLLER_KEY}`);\n}\n\n/**\n * loadFilesFromController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n * The content is saved as jQuery object to the controller.$content property of\n * the controller.\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction loadFilesFromController(controller) {\n let getElements = { args: {} };\n if (controller.contentUrl) {\n getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n }\n\n return Promise.all([loadHTMLFile(controller, getElements.args)]).then(\n function (results) {\n let htmlFile = results[0];\n if (htmlFile) {\n try {\n return $(htmlFile);\n } catch {\n return $(\"<div></div>\").append(htmlFile);\n }\n }\n\n return null;\n },\n );\n}\n\n/**\n * reloadHTMLController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n *\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction reloadHTMLController(controller) {\n if (controller.contentUrl) {\n let getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n return loadHTMLFile(controller, getElements.args);\n }\n\n return new Promise((resolve) => {\n resolve($());\n });\n}\n\n/**\n *\n * @param {jquery} $element\n * @param {string} tagName\n * @param {Array<string>} superTagNameList\n * @param {AbstractSDC} parentController\n * @param {Object} process - Process object containing the refresh process\n * @returns {Promise}\n */\nfunction runReplaceTagElementsInContainer(\n $element,\n tagName,\n superTagNameList,\n parentController,\n process,\n) {\n let controller = $element.data(DATA_CONTROLLER_KEY);\n if (controller) {\n return replaceAllTagElementsInContainer($element, controller, process);\n }\n\n\n controller = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.controllerFactory)(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\n $element.data(DATA_CONTROLLER_KEY, controller);\n $element.addClass(CONTROLLER_CLASS);\n return (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.runControlFlowFunctions)(controller, process);\n}\n\n/**\n * runControllerFillContent empties the registered tag and replaces it by the controller\n * content. It sets the CSS tags for the relation with the CSS files.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @param {jquery} $html - jQuery loaded content\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise}\n */\nfunction runControllerFillContent(controller, $html, process = null) {\n if ($html && $html.length > 0) {\n controller.$container.empty();\n controller.$container.attr(controller._tagName, \"\");\n for (let mixinKey in controller._mixins) {\n controller.$container.attr(controller._mixins[mixinKey]._tagName, \"\");\n }\n controller.$container.append($html);\n }\n\n return replaceAllTagElementsInContainer(\n controller.$container,\n controller,\n process,\n );\n}\n\n/**\n * replaceTagElementsInContainer Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. For each registered tag it loads the content.\n * Afterwards it starts the life cycle of the controller. I the next step it starts the\n * procedure for the child elements of the controller tag.\n *\n * @param {Array<string>} tagList - list of all registered tags\n * @param {jquery} $container - jQuery container to find the tags\n * @param {AbstractSDC} parentController - controller in surrounding\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceTagElementsInContainer(\n tagList,\n $container,\n parentController,\n process,\n) {\n return new Promise((resolve) => {\n let tagDescriptionElements = findSdcTgs(\n $container,\n tagList,\n parentController,\n );\n let tagCount = tagDescriptionElements.length;\n\n if (tagCount === 0) {\n return resolve();\n }\n\n for (\n let elementIndex = 0;\n elementIndex < tagDescriptionElements.length;\n elementIndex++\n ) {\n runReplaceTagElementsInContainer(\n tagDescriptionElements[elementIndex].dom,\n tagDescriptionElements[elementIndex].tag,\n tagDescriptionElements[elementIndex].super,\n parentController,\n process,\n ).then(() => {\n tagCount--;\n if (tagCount === 0) {\n return resolve();\n }\n });\n }\n });\n}\n\nfunction reloadMethodHTML(controller, $container, process) {\n return _reloadMethodHTML(\n controller,\n $container ?? controller.$container,\n process,\n );\n}\n\nfunction _reloadMethodHTML(controller, $dom, process) {\n const plist = [];\n\n $dom\n .find(`._bind_to_update_handler.sdc_uuid_${controller._uuid}`)\n .each(function () {\n const $this = $(this);\n let result = undefined;\n if ($this.hasClass(`_with_handler`)) {\n result = $this.data(\"handler\");\n } else {\n let controller_handler = this.tagName\n .toLowerCase()\n .replace(/^this./, \"\");\n if (controller[controller_handler]) {\n result = controller[controller_handler];\n }\n }\n\n if (typeof result === \"function\") {\n const newData = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.prepareData)($this.data(), controller);\n result = result.bind(controller)(newData);\n }\n if (result) {\n plist.push(\n Promise.resolve(result).then((x) => {\n let $newContent = $(`<div></div>`);\n $newContent.append(x);\n\n if ($this.html() === \"\") {\n $this.append(\"<div></div>\");\n }\n\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.reconcile(\n controller,\n $newContent,\n $this.children(),\n process,\n );\n }),\n );\n }\n });\n\n return Promise.all(plist);\n}\n\nfunction getNodeKey(node) {\n if (node[0].nodeType === 3) {\n return `TEXT__${node[0].nodeValue}`;\n }\n const res = [node[0].tagName];\n if (node[0].nodeName === \"INPUT\") {\n [\n [\"name\", \"\"],\n [\"type\", \"text\"],\n [\"id\", \"\"],\n ].forEach(([key, defaultValue]) => {\n const attr = node.attr(key) ?? defaultValue;\n if (attr) {\n res.push(attr);\n }\n });\n }\n return res.join(\"__\");\n}\n\nfunction reconcileTree({ $element, id = [], parent = null }) {\n id.push(getNodeKey($element));\n const obj = {\n $element,\n id: id.join(\"::\"),\n depth: id.length,\n idx: 0,\n getRealParent: () => parent,\n getIdx: function () {\n this.idx = Math.max(\n 0,\n (this.getRealParent()?.getIdx() ?? -1) + $element.index() + 1,\n );\n return this.idx;\n },\n op: null,\n parent,\n };\n obj.getIdx.bind(obj);\n return [obj].concat(\n $element\n .contents()\n .toArray()\n .map((x) =>\n reconcileTree({\n $element: $(x),\n id: id.slice(),\n parent: obj,\n }),\n )\n .flat(),\n );\n}\n\nfunction reconcile($virtualNode, $realNode) {\n const $old = reconcileTree({ $element: $realNode });\n const $new = reconcileTree({ $element: $virtualNode });\n $old.map((x, i) => (x.idx = i));\n $new.map((x, i) => (x.idx = i));\n const depth = Math.max(...$new.concat($old).map((x) => x.depth));\n const op_steps = lcbDiff($old, $new, depth);\n let toRemove = [];\n window.MAIN = $realNode;\n window.OPS = op_steps;\n\n op_steps.forEach((op_step, i) => {\n const { op, $element, idx } = op_step;\n\n if (op.type === \"keep_counterpart\") {\n let cIdx = op.counterpart.getIdx();\n if (cIdx !== idx) {\n const elemBefore = op_step.getBefore();\n if (!elemBefore) {\n op_step.getRealParent().$element.prepend(op.counterpart.$element);\n } else {\n op.counterpart.$element.insertAfter(elemBefore.$element);\n }\n }\n\n syncAttributes(op.counterpart.$element, $element);\n if ($element.hasClass(CONTROLLER_CLASS)) {\n $element.data(DATA_CONTROLLER_KEY).$container = op.counterpart.$element;\n $element.data(DATA_CONTROLLER_KEY, null);\n }\n\n toRemove.push($element);\n } else if (op.type === \"delete\") {\n $element.safeRemove();\n } else if (op.type === \"insert\") {\n const { after, target } = op_step.op;\n if (after) {\n $element.insertAfter(after.$element);\n } else if (target) {\n target.$element.prepend($element);\n }\n }\n });\n\n toRemove.forEach(($element) => $element.safeRemove());\n}\n\nfunction syncAttributes($real, $virtual) {\n const realAttrs = $real[0].attributes ?? [];\n const virtualAttrs = $virtual[0].attributes ?? [];\n // Remove missing attrs\n [...realAttrs].forEach((attr) => {\n if (!$virtual.is(`[${attr.name}]`)) {\n $real.removeAttr(attr.name);\n }\n });\n\n // Add or update\n [...virtualAttrs].forEach((attr) => {\n if (!attr.name.startsWith(`data`) && $real.attr(attr.name) !== attr.value) {\n $real.attr(attr.name, attr.value);\n }\n });\n\n $real.removeData();\n Object.entries($virtual.data()).forEach(([key, value]) => {\n $real.data(key, value);\n });\n}\n\n/**\n * LCB (Longest Common Branch) finds matching branches and reserves them!\n *\n * @param oldNodes\n * @param newNodes\n * @param depth\n * @returns {*|*[]}\n */\nfunction lcbDiff(oldNodes, newNodes, depth) {\n newNodes\n .filter((x) => x.depth === depth && !x.op)\n .forEach((newNode) => {\n const oldNode = oldNodes.find((tempOldNode) => {\n return !tempOldNode.op && tempOldNode.id === newNode.id;\n });\n\n if (oldNode) {\n const keepTreeBranch = (oldNode, newNode) => {\n oldNode.op = { type: \"keep\", idx: newNode.idx };\n newNode.op = { type: \"keep_counterpart\", counterpart: oldNode };\n oldNode = oldNode.parent;\n newNode = newNode.parent;\n if (!oldNode || oldNode.op || newNode?.op) {\n return;\n }\n keepTreeBranch(oldNode, newNode);\n };\n keepTreeBranch(oldNode, newNode);\n }\n });\n if (depth > 1) {\n return lcbDiff(oldNodes, newNodes, depth - 1);\n }\n\n oldNodes.forEach((x, i) => {\n if (!x.op) {\n const idx = (oldNodes[i - 1]?.op.idx ?? -1) + 1;\n x.op = { type: \"delete\", idx };\n }\n });\n\n function getRealParent(element) {\n if (!element.parent) {\n return null;\n }\n return element.parent.op.type === \"keep_counterpart\"\n ? element.parent.op.counterpart\n : element.parent;\n }\n\n function getBefore(element, idx) {\n const startDepth = element.depth;\n while (idx >= 1 && element.depth >= startDepth) {\n idx -= 1;\n element = newNodes[idx];\n if (element.depth === startDepth) {\n return element.op.type === \"keep_counterpart\"\n ? element.op.counterpart\n : element;\n }\n }\n\n return null;\n }\n\n newNodes.forEach((x, i) => {\n x.getBefore = () => getBefore(x, i);\n x.getRealParent = () => getRealParent(x);\n\n if (!x.op) {\n const target = x.getRealParent();\n const type = target?.op.type === \"insert\" ? \"insert_ignore\" : \"insert\";\n x.op = { type, target, after: x.getBefore() };\n }\n });\n\n const tagged = [...oldNodes, ...newNodes];\n\n return tagged.sort((a, b) => {\n const aVal = a.op?.idx ?? a.idx;\n const bVal = b.op?.idx ?? b.idx;\n\n return aVal - bVal;\n });\n}\n\n/**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise<void>}\n */\n\nfunction refresh($dom, leafController, process = null) {\n if (!leafController) {\n leafController = getController($dom);\n }\n\n if (!leafController) {\n return Promise.resolve();\n }\n\n const { refreshProcess, isRunningProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.prepareRefreshProcess)(\n process,\n leafController,\n );\n\n $dom ??= leafController.$container;\n\n return replaceTagElementsInContainer(\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames,\n $dom,\n leafController,\n process,\n ).then(() => {\n return reloadMethodHTML(leafController, $dom, refreshProcess).then(() => {\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n });\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsR0FBRzs7QUFFSDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQixXQUFXLGFBQWE7QUFDeEIsV0FBVyxRQUFRO0FBQ25CLFlBQVk7QUFDWjs7QUFFTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsVUFBVSxtQ0FBbUMsRUFBRSx5RUFBcUI7QUFDcEU7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsSUFBSSw2Q0FBRztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsa0ZBQThCO0FBQ3RDO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovL3NkY19jbGllbnQvLi9zcmMvc2ltcGxlRG9tQ29udHJvbC9zZGNfdmlldy5qcz9jYTAwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNvbnRyb2xsZXJGYWN0b3J5LFxuICBwcmVwYXJlUmVmcmVzaFByb2Nlc3MsXG4gIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zLFxuICB1cGRhdGVFdmVudEFuZFRyaWdnZXJPblJlZnJlc2gsXG59IGZyb20gXCIuL3NkY19jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgeyBnZXRVcmxQYXJhbSwgcHJlcGFyZURhdGEgfSBmcm9tIFwiLi9zZGNfcGFyYW1zLmpzXCI7XG5pbXBvcnQgeyBhcHAgfSBmcm9tIFwiLi9zZGNfbWFpbi5qc1wiO1xuaW1wb3J0IHsgdHJpZ2dlciB9IGZyb20gXCIuL3NkY19ldmVudHMuanNcIjtcblxuLyoqXG4gKiBMaXN0IG9mIEhUTUwgZmlsZXMuXG4gKiBAdHlwZSB7e319XG4gKi9cbmxldCBodG1sRmlsZXMgPSB7fTtcblxuZXhwb3J0IGNvbnN0IERBVEFfQ09OVFJPTExFUl9LRVkgPSBcIl9jb250cm9sbGVyX1wiO1xuZXhwb3J0IGNvbnN0IENPTlRST0xMRVJfQ0xBU1MgPSBcIl9zZGNfY29udHJvbGxlcl9cIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuQ2FjaGUoKSB7XG4gIGh0bWxGaWxlcyA9IHt9O1xufVxuXG4vKipcbiAqIGZpbmRTZGNUZ3MgRmluZHMgYWxsIHJlZ2lzdGVyZWQgdGFncyBpbiBhIGNvbnRhaW5lci4gQnV0IGl0IGlnbm9yZXNcbiAqIHJlZ2lzdGVyZWQgdGFncyBpbiByZWdpc3RlcmVkIHRhZ3MuIEl0IGNvbGxlY3RzIGFsbCB0aG9zZVxuICogZG9tcyBhbmQgcmV0dXJucyBhIGxpc3Qgb2Ygb2JqZWN0cyBjb250YWluaW5nIGFsc28gdGhlIHRhZyBuYW1lIHRoZSBkb20gYW5kIHRoZSB0YWdcbiAqIG5hbWVzIG9mIHRoZSBzdXBlciBjb250cm9sbGVyXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBqUXVlcnkgY29udGFpbmVyXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHRhZ05hbWVMaXN0IC0gYSBzdHJpbmcgbGlzdCB3aXRoIHRhZyBuYW1lcy5cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBjb250cm9sbGVyIGluIHN1cnJvdW5kaW5nXG4gKiBAcmV0dXJuIHtBcnJheX0gLSBhIGFycmF5IG9mIG9iamVjdHMgd2l0aCBhbGwgcmVnaXN0ZXIgdGFncyBmb3VuZFxuICovXG5mdW5jdGlvbiBmaW5kU2RjVGdzKCRjb250YWluZXIsIHRhZ05hbWVMaXN0LCBwYXJlbnRDb250cm9sbGVyKSB7XG4gIGlmICghJGNvbnRhaW5lcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBsZXQgJGNoaWxkcmVuID0gJGNvbnRhaW5lci5jaGlsZHJlbigpO1xuICBsZXQgZW1wdHlMaXN0ID0gW107XG4gICRjaGlsZHJlbi5lYWNoKGZ1bmN0aW9uIChfLCBlbGVtZW50KSB7XG4gICAgbGV0ICRlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICBsZXQgdGFnTmFtZSA9ICRlbGVtZW50LnByb3AoXCJ0YWdOYW1lXCIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCJfXCIpO1xuICAgIGlmICgkLmluQXJyYXkodGFnTmFtZVswXSwgdGFnTmFtZUxpc3QpID49IDApIHtcbiAgICAgIGVtcHR5TGlzdC5wdXNoKHtcbiAgICAgICAgdGFnOiB0YWdOYW1lWzBdLFxuICAgICAgICBzdXBlcjogdGFnTmFtZS5zcGxpY2UoMSkgfHwgW10sXG4gICAgICAgIGRvbTogJGVsZW1lbnQsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHRhZ05hbWVbMF0uc3RhcnRzV2l0aChcInRoaXMuXCIpKSB7XG4gICAgICAkZWxlbWVudC5hZGRDbGFzcyhcbiAgICAgICAgYF9iaW5kX3RvX3VwZGF0ZV9oYW5kbGVyIHNkY191dWlkXyR7cGFyZW50Q29udHJvbGxlci5fdXVpZH1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW1wdHlMaXN0ID0gZW1wdHlMaXN0LmNvbmNhdChcbiAgICAgICAgZmluZFNkY1RncygkZWxlbWVudCwgdGFnTmFtZUxpc3QsIHBhcmVudENvbnRyb2xsZXIpLFxuICAgICAgKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBlbXB0eUxpc3Q7XG59XG5cbi8qKlxuICogcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlciBmaWxscyB0aGUgcGFyYW1ldGVyIG9mIHRoZSBjb250ZW50XG4gKiB1cmwgdGhpcyBmdW5jdGlvbiB1c2VzIHRoZSB0YWcgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIGNvbnRyb2xsZXIgLSBjb250cm9sbGVyIG9iamVjdFxuICogQHBhcmFtIHVybCAtIHRoZSBvcmlnaW4gY29udGVudCBVUkxcbiAqIEBwYXJhbSB1cmxWYWx1ZXMgLSB2YWx1ZXMgZm9yIHRoZSB1cmwgcGxhY2Vob2xkZXIuIEluIHNhbWUgb3JkZXIhIVxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgY29ycmVjdCBVUkwgd2l0aCBwcmVmaXguXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIoY29udHJvbGxlciwgdXJsLCB1cmxWYWx1ZXMpIHtcbiAgZm9yIChsZXQga2V5X2lkeCBpbiBjb250cm9sbGVyLl91cmxQYXJhbXMpIHtcbiAgICBpZiAoY29udHJvbGxlci5fdXJsUGFyYW1zLmhhc093blByb3BlcnR5KGtleV9pZHgpKSB7XG4gICAgICBsZXQga2V5ID0gY29udHJvbGxlci5fdXJsUGFyYW1zW2tleV9pZHhdO1xuICAgICAgbGV0IHJlID0gUmVnRXhwKFwiJVxcXFwoXCIgKyBrZXkgKyBcIlxcXFwpXFxcXHdcIiwgXCJnbVwiKTtcbiAgICAgIGNvbnN0IHZhbCA9IHVybFZhbHVlc1trZXldO1xuICAgICAgaWYoIXZhbCkge1xuICAgICAgICBjb25zb2xlLndhcm4oYCR7a2V5fSBpcyBub3Qgc2V0IGZvciBjb250cm9sbGVyICR7IGNvbnRyb2xsZXIuX3RhZ05hbWUgfWApO1xuICAgICAgfVxuICAgICAgdXJsID0gdXJsLnJlcGxhY2UocmUsIHZhbCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVybDtcbn1cblxuLyoqXG4gKiBsb2FkSFRNTEZpbGUgbG9hZHMgdGhlIEhUTUwgY29udGVudCBmaWxlIGZyb20gdGhlIHNlcnZlciB2aWEgYWpheCByZXF1ZXN0LlxuICpcbiAqIElmIHRoZSBIVE1MIGZpbGUgaXMgbG9hZGVkIGFscmVhZHkgdGhlIGZ1bmN0aW9uIHRha2VzIG5vIGFjdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gYSBjb250ZW50IFVSTCBmcm9tIHRoZSBjb250cm9sbGVyLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBnZXQgYXJncy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGpRdWVyeXxCb29sZWFuPn0gLSB3YWl0cyBmb3IgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLlxuICovXG5mdW5jdGlvbiBsb2FkSFRNTEZpbGUoY29udHJvbGxlciwgYXJncykge1xuICBjb25zdCB7IGNvbnRlbnRVcmwsIF90YWdOYW1lLCBjb250ZW50UmVsb2FkIH0gPSBjb250cm9sbGVyO1xuICBpZiAoIWNvbnRlbnRVcmwpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgfSBlbHNlIGlmIChodG1sRmlsZXNbX3RhZ05hbWVdKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShodG1sRmlsZXNbX3RhZ05hbWVdKTtcbiAgfVxuXG4gIGFyZ3MuVkVSU0lPTiA9IGFwcC5WRVJTSU9OO1xuICBhcmdzLl9tZXRob2QgPSBcImNvbnRlbnRcIjtcblxuICByZXR1cm4gJC5nZXQoY29udGVudFVybCwgYXJncylcbiAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgaWYgKCFjb250ZW50UmVsb2FkKSB7XG4gICAgICAgIGh0bWxGaWxlc1tfdGFnTmFtZV0gPSBkYXRhO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9KVxuICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICBpZiAoZXJyLnN0YXR1cyA9PT0gMzAxKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBlcnIucmVzcG9uc2VKU09OO1xuICAgICAgICB0cmlnZ2VyKFwiX1JlZGlyZWN0T25WaWV3XCIsIGRhdGFbXCJ1cmwtbGlua1wiXSk7XG4gICAgICAgIGlmICghY29udGVudFJlbG9hZCkge1xuICAgICAgICAgIGNvbnRyb2xsZXIuYXV0b1JlZGlyZWN0ID0gZGF0YVtcInVybC1saW5rXCJdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnPHA+UmVkaXJlY3RlZDwvcD4nO1xuICAgICAgfVxuICAgICAgY29udHJvbGxlci5hdXRvUmVkaXJlY3QgPSBudWxsO1xuICAgICAgaWYgKHR5cGVvZiBjb250cm9sbGVyLmNvbmZpcm1QYWdlTG9hZGVkID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdHJpZ2dlcihcIm5hdkxvYWRlZFwiLCB7IGNvbnRyb2xsZXJfbmFtZTogKCkgPT4gZXJyLnN0YXR1cyB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgYDxzZGMtZXJyb3IgZGF0YS1jb2RlPVwiJHtlcnIuc3RhdHVzfVwiPiR7ZXJyLnJlc3BvbnNlVGV4dH08L3NkYy1lcnJvcj5gO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyIHJlcGxhY2VzIGFsbCByZWdpc3RlcmVkIHRhZ3MgYnkgdGhlIGNvbnRyb2xsZXIuXG4gKiBJbiB0aGlzIHN0ZXAgdGhlIGxpZmUtY3ljbGUgc3RhcnRzLlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkY29udGFpbmVyIC0gZ2l2ZW4gY29udGFpbmVyXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyIC0gcGFyZW50IGNvbnRvbGxlciBzdXJyb3VuZGVkIHRoZSBjb250YWluZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAkY29udGFpbmVyLFxuICBwYXJlbnRDb250cm9sbGVyLFxuICBwcm9jZXNzID0gbnVsbCxcbikge1xuICBwYXJlbnRDb250cm9sbGVyID0gcGFyZW50Q29udHJvbGxlciB8fCAkY29udGFpbmVyLmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSk7XG4gIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICBhcHAudGFnTmFtZXMsXG4gICAgJGNvbnRhaW5lcixcbiAgICBwYXJlbnRDb250cm9sbGVyLFxuICAgIHByb2Nlc3MsXG4gICk7XG59XG5cbi8qKlxuICogcGFyc2VDb250ZW50VXJsIHVzZXMgdGhlIGNvbnRlbnQgVVJMIHByZWZpeCB0byBtYXJnZSB0aGVcbiAqIGNvcnJlY3QgVVJMLiBBbHNvIHBhcnNlcyB0aGUgdXJsIHBhcmFtZXRlclxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBjb250cm9sbGVyIG9iamVjdFxuICogQHJldHVybnMge3t1cmw6IFN0cmluZywgYXJnczogQXJyYXl9fSAtIHRoZSBjb3JyZWN0IFVSTCB3aXRoIHByZWZpeC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VDb250ZW50VXJsKGNvbnRyb2xsZXIpIHtcbiAgbGV0IHVybCA9IGNvbnRyb2xsZXIuY29udGVudFVybDtcbiAgaWYgKGNvbnRyb2xsZXIgJiYgY29udHJvbGxlci5fdXJsUGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgIGxldCByZSA9IC8lXFwoKFteKV0rKVxcKVxcdy9nbTtcbiAgICBsZXQgbWF0Y2hlcztcbiAgICBjb250cm9sbGVyLl91cmxQYXJhbXMgPSBbXTtcbiAgICB3aGlsZSAoKG1hdGNoZXMgPSByZS5leGVjKHVybCkpKSB7XG4gICAgICBjb250cm9sbGVyLl91cmxQYXJhbXMucHVzaChtYXRjaGVzWzFdKTtcbiAgICAgIGNvbnRyb2xsZXIuY29udGVudFJlbG9hZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgbGV0IHsgYXJncywgcGFyYW1zIH0gPSBnZXRVcmxQYXJhbShjb250cm9sbGVyLCBjb250cm9sbGVyLiRjb250YWluZXIpO1xuICBpZiAoY29udHJvbGxlci5fdXJsUGFyYW1zLmxlbmd0aCkge1xuICAgIHVybCA9IHJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIoY29udHJvbGxlciwgdXJsLCBwYXJhbXMpO1xuICB9XG5cbiAgY29udHJvbGxlci5wYXJzZWRDb250ZW50VXJsID0gdXJsO1xuXG4gIHJldHVybiB7IHVybDogdXJsLCBhcmdzIH07XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbVxuICogQHJldHVybiB7QWJzdHJhY3RTREN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb250cm9sbGVyKCRlbGVtKSB7XG4gIGlmICgkZWxlbS5oYXNDbGFzcyhDT05UUk9MTEVSX0NMQVNTKSkge1xuICAgIHJldHVybiAkZWxlbS5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCk7XG4gIH1cbiAgcmV0dXJuICRlbGVtLmNsb3Nlc3QoYC4ke0NPTlRST0xMRVJfQ0xBU1N9YCkuZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApO1xufVxuXG4vKipcbiAqIGxvYWRGaWxlc0Zyb21Db250cm9sbGVyIGxvYWRzIHRoZSBjb250ZW50IChIVE1MKSBvZiBhXG4gKiBDb250cm9sbGVyLiBJZiB5b3UgaGF2ZSBhbiBhbHRlcm5hdGl2ZSBjb250ZW50IFVSTCBpcyByZWdpc3RlcmVkLCBmb3IgdGhpc1xuICogY29udHJvbGxlciB0aGUgb3JpZ2luIGNvbnRlbnQgVVJMIGlzIGlnbm9yZWQuXG4gKlxuICogVGhlIGNvbnRlbnQgaXMgc2F2ZWQgYXMgalF1ZXJ5IG9iamVjdCB0byB0aGUgY29udHJvbGxlci4kY29udGVudCBwcm9wZXJ0eSBvZlxuICogdGhlIGNvbnRyb2xsZXIuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGEgaW5zdGFuY2Ugb2YgYSBKYXZhU2NyaXB0IGNvbnRyb2xsZXIgb2JqZWN0LlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5Pn0gLSB0aGUgcHJvbWlzZSB3YWl0cyB0byB0aGUgZmlsZXMgYXJlIGxvYWRlZC4gaXQgcmV0dXJucyB0aGUgalF1ZXJ5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRGaWxlc0Zyb21Db250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgbGV0IGdldEVsZW1lbnRzID0geyBhcmdzOiB7fSB9O1xuICBpZiAoY29udHJvbGxlci5jb250ZW50VXJsKSB7XG4gICAgZ2V0RWxlbWVudHMgPSBwYXJzZUNvbnRlbnRVcmwoY29udHJvbGxlcik7XG4gICAgY29udHJvbGxlci5jb250ZW50VXJsID0gZ2V0RWxlbWVudHMudXJsO1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKFtsb2FkSFRNTEZpbGUoY29udHJvbGxlciwgZ2V0RWxlbWVudHMuYXJncyldKS50aGVuKFxuICAgIGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICBsZXQgaHRtbEZpbGUgPSByZXN1bHRzWzBdO1xuICAgICAgaWYgKGh0bWxGaWxlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuICQoaHRtbEZpbGUpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gJChcIjxkaXY+PC9kaXY+XCIpLmFwcGVuZChodG1sRmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcbiAgKTtcbn1cblxuLyoqXG4gKiByZWxvYWRIVE1MQ29udHJvbGxlciBsb2FkcyB0aGUgY29udGVudCAoSFRNTCkgb2YgYVxuICogQ29udHJvbGxlci4gSWYgeW91IGhhdmUgYW4gYWx0ZXJuYXRpdmUgY29udGVudCBVUkwgaXMgcmVnaXN0ZXJlZCwgZm9yIHRoaXNcbiAqIGNvbnRyb2xsZXIgdGhlIG9yaWdpbiBjb250ZW50IFVSTCBpcyBpZ25vcmVkLlxuICpcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gYSBpbnN0YW5jZSBvZiBhIEphdmFTY3JpcHQgY29udHJvbGxlciBvYmplY3QuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5Pn0gLSB0aGUgcHJvbWlzZSB3YWl0cyB0byB0aGUgZmlsZXMgYXJlIGxvYWRlZC4gaXQgcmV0dXJucyB0aGUgalF1ZXJ5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZEhUTUxDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgaWYgKGNvbnRyb2xsZXIuY29udGVudFVybCkge1xuICAgIGxldCBnZXRFbGVtZW50cyA9IHBhcnNlQ29udGVudFVybChjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLmNvbnRlbnRVcmwgPSBnZXRFbGVtZW50cy51cmw7XG4gICAgcmV0dXJuIGxvYWRIVE1MRmlsZShjb250cm9sbGVyLCBnZXRFbGVtZW50cy5hcmdzKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHJlc29sdmUoJCgpKTtcbiAgfSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkZWxlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ05hbWVcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc3VwZXJUYWdOYW1lTGlzdFxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqIEByZXR1cm5zIHtQcm9taXNlfVxuICovXG5mdW5jdGlvbiBydW5SZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgJGVsZW1lbnQsXG4gIHRhZ05hbWUsXG4gIHN1cGVyVGFnTmFtZUxpc3QsXG4gIHBhcmVudENvbnRyb2xsZXIsXG4gIHByb2Nlc3MsXG4pIHtcbiAgbGV0IGNvbnRyb2xsZXIgPSAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpO1xuICBpZiAoY29udHJvbGxlcikge1xuICAgIHJldHVybiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcigkZWxlbWVudCwgY29udHJvbGxlciwgcHJvY2Vzcyk7XG4gIH1cblxuXG4gIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyRmFjdG9yeShcbiAgICBwYXJlbnRDb250cm9sbGVyLFxuICAgICRlbGVtZW50LFxuICAgIHRhZ05hbWUsXG4gICAgc3VwZXJUYWdOYW1lTGlzdCxcbiAgKTtcbiAgJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZLCBjb250cm9sbGVyKTtcbiAgJGVsZW1lbnQuYWRkQ2xhc3MoQ09OVFJPTExFUl9DTEFTUyk7XG4gIHJldHVybiBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyhjb250cm9sbGVyLCBwcm9jZXNzKTtcbn1cblxuLyoqXG4gKiBydW5Db250cm9sbGVyRmlsbENvbnRlbnQgZW1wdGllcyB0aGUgcmVnaXN0ZXJlZCB0YWcgYW5kIHJlcGxhY2VzIGl0IGJ5IHRoZSBjb250cm9sbGVyXG4gKiBjb250ZW50LiBJdCBzZXRzIHRoZSBDU1MgdGFncyBmb3IgdGhlIHJlbGF0aW9uIHdpdGggdGhlIENTUyBmaWxlcy5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0ganMgY29udHJvbGxlciBpbnN0YW5jZVxuICogQHBhcmFtIHtqcXVlcnl9ICRodG1sIC0galF1ZXJ5IGxvYWRlZCBjb250ZW50XG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybiB7UHJvbWlzZX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudChjb250cm9sbGVyLCAkaHRtbCwgcHJvY2VzcyA9IG51bGwpIHtcbiAgaWYgKCRodG1sICYmICRodG1sLmxlbmd0aCA+IDApIHtcbiAgICBjb250cm9sbGVyLiRjb250YWluZXIuZW1wdHkoKTtcbiAgICBjb250cm9sbGVyLiRjb250YWluZXIuYXR0cihjb250cm9sbGVyLl90YWdOYW1lLCBcIlwiKTtcbiAgICBmb3IgKGxldCBtaXhpbktleSBpbiBjb250cm9sbGVyLl9taXhpbnMpIHtcbiAgICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5hdHRyKGNvbnRyb2xsZXIuX21peGluc1ttaXhpbktleV0uX3RhZ05hbWUsIFwiXCIpO1xuICAgIH1cbiAgICBjb250cm9sbGVyLiRjb250YWluZXIuYXBwZW5kKCRodG1sKTtcbiAgfVxuXG4gIHJldHVybiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICBjb250cm9sbGVyLiRjb250YWluZXIsXG4gICAgY29udHJvbGxlcixcbiAgICBwcm9jZXNzLFxuICApO1xufVxuXG4vKipcbiAqIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyIEZpbmRzIGFsbCByZWdpc3RlcmVkIHRhZ3MgaW4gYSBjb250YWluZXIuIEJ1dCBpdCBpZ25vcmVzXG4gKiByZWdpc3RlcmVkIHRhZ3MgaW4gcmVnaXN0ZXJlZCB0YWdzLiBGb3IgZWFjaCByZWdpc3RlcmVkIHRhZyBpdCBsb2FkcyB0aGUgY29udGVudC5cbiAqIEFmdGVyd2FyZHMgaXQgc3RhcnRzIHRoZSBsaWZlIGN5Y2xlIG9mIHRoZSBjb250cm9sbGVyLiBJIHRoZSBuZXh0IHN0ZXAgaXQgc3RhcnRzIHRoZVxuICogcHJvY2VkdXJlIGZvciB0aGUgY2hpbGQgZWxlbWVudHMgb2YgdGhlIGNvbnRyb2xsZXIgdGFnLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gdGFnTGlzdCAtIGxpc3Qgb2YgYWxsIHJlZ2lzdGVyZWQgdGFnc1xuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBqUXVlcnkgY29udGFpbmVyIHRvIGZpbmQgdGhlIHRhZ3NcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBjb250cm9sbGVyIGluIHN1cnJvdW5kaW5nXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gIHRhZ0xpc3QsXG4gICRjb250YWluZXIsXG4gIHBhcmVudENvbnRyb2xsZXIsXG4gIHByb2Nlc3MsXG4pIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgbGV0IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMgPSBmaW5kU2RjVGdzKFxuICAgICAgJGNvbnRhaW5lcixcbiAgICAgIHRhZ0xpc3QsXG4gICAgICBwYXJlbnRDb250cm9sbGVyLFxuICAgICk7XG4gICAgbGV0IHRhZ0NvdW50ID0gdGFnRGVzY3JpcHRpb25FbGVtZW50cy5sZW5ndGg7XG5cbiAgICBpZiAodGFnQ291bnQgPT09IDApIHtcbiAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgZm9yIChcbiAgICAgIGxldCBlbGVtZW50SW5kZXggPSAwO1xuICAgICAgZWxlbWVudEluZGV4IDwgdGFnRGVzY3JpcHRpb25FbGVtZW50cy5sZW5ndGg7XG4gICAgICBlbGVtZW50SW5kZXgrK1xuICAgICkge1xuICAgICAgcnVuUmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICAgICAgIHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHNbZWxlbWVudEluZGV4XS5kb20sXG4gICAgICAgIHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHNbZWxlbWVudEluZGV4XS50YWcsXG4gICAgICAgIHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHNbZWxlbWVudEluZGV4XS5zdXBlcixcbiAgICAgICAgcGFyZW50Q29udHJvbGxlcixcbiAgICAgICAgcHJvY2VzcyxcbiAgICAgICkudGhlbigoKSA9PiB7XG4gICAgICAgIHRhZ0NvdW50LS07XG4gICAgICAgIGlmICh0YWdDb3VudCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxvYWRNZXRob2RIVE1MKGNvbnRyb2xsZXIsICRjb250YWluZXIsIHByb2Nlc3MpIHtcbiAgcmV0dXJuIF9yZWxvYWRNZXRob2RIVE1MKFxuICAgIGNvbnRyb2xsZXIsXG4gICAgJGNvbnRhaW5lciA/PyBjb250cm9sbGVyLiRjb250YWluZXIsXG4gICAgcHJvY2VzcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gX3JlbG9hZE1ldGhvZEhUTUwoY29udHJvbGxlciwgJGRvbSwgcHJvY2Vzcykge1xuICBjb25zdCBwbGlzdCA9IFtdO1xuXG4gICRkb21cbiAgICAuZmluZChgLl9iaW5kX3RvX3VwZGF0ZV9oYW5kbGVyLnNkY191dWlkXyR7Y29udHJvbGxlci5fdXVpZH1gKVxuICAgIC5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0ICR0aGlzID0gJCh0aGlzKTtcbiAgICAgIGxldCByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoJHRoaXMuaGFzQ2xhc3MoYF93aXRoX2hhbmRsZXJgKSkge1xuICAgICAgICByZXN1bHQgPSAkdGhpcy5kYXRhKFwiaGFuZGxlclwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBjb250cm9sbGVyX2hhbmRsZXIgPSB0aGlzLnRhZ05hbWVcbiAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgIC5yZXBsYWNlKC9edGhpcy4vLCBcIlwiKTtcbiAgICAgICAgaWYgKGNvbnRyb2xsZXJbY29udHJvbGxlcl9oYW5kbGVyXSkge1xuICAgICAgICAgIHJlc3VsdCA9IGNvbnRyb2xsZXJbY29udHJvbGxlcl9oYW5kbGVyXTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGNvbnN0IG5ld0RhdGEgPSBwcmVwYXJlRGF0YSgkdGhpcy5kYXRhKCksIGNvbnRyb2xsZXIpO1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuYmluZChjb250cm9sbGVyKShuZXdEYXRhKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgcGxpc3QucHVzaChcbiAgICAgICAgICBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKCh4KSA9PiB7XG4gICAgICAgICAgICBsZXQgJG5ld0NvbnRlbnQgPSAkKGA8ZGl2PjwvZGl2PmApO1xuICAgICAgICAgICAgJG5ld0NvbnRlbnQuYXBwZW5kKHgpO1xuXG4gICAgICAgICAgICBpZiAoJHRoaXMuaHRtbCgpID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICR0aGlzLmFwcGVuZChcIjxkaXY+PC9kaXY+XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYXBwLnJlY29uY2lsZShcbiAgICAgICAgICAgICAgY29udHJvbGxlcixcbiAgICAgICAgICAgICAgJG5ld0NvbnRlbnQsXG4gICAgICAgICAgICAgICR0aGlzLmNoaWxkcmVuKCksXG4gICAgICAgICAgICAgIHByb2Nlc3MsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHJldHVybiBQcm9taXNlLmFsbChwbGlzdCk7XG59XG5cbmZ1bmN0aW9uIGdldE5vZGVLZXkobm9kZSkge1xuICBpZiAobm9kZVswXS5ub2RlVHlwZSA9PT0gMykge1xuICAgIHJldHVybiBgVEVYVF9fJHtub2RlWzBdLm5vZGVWYWx1ZX1gO1xuICB9XG4gIGNvbnN0IHJlcyA9IFtub2RlWzBdLnRhZ05hbWVdO1xuICBpZiAobm9kZVswXS5ub2RlTmFtZSA9PT0gXCJJTlBVVFwiKSB7XG4gICAgW1xuICAgICAgW1wibmFtZVwiLCBcIlwiXSxcbiAgICAgIFtcInR5cGVcIiwgXCJ0ZXh0XCJdLFxuICAgICAgW1wiaWRcIiwgXCJcIl0sXG4gICAgXS5mb3JFYWNoKChba2V5LCBkZWZhdWx0VmFsdWVdKSA9PiB7XG4gICAgICBjb25zdCBhdHRyID0gbm9kZS5hdHRyKGtleSkgPz8gZGVmYXVsdFZhbHVlO1xuICAgICAgaWYgKGF0dHIpIHtcbiAgICAgICAgcmVzLnB1c2goYXR0cik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlcy5qb2luKFwiX19cIik7XG59XG5cbmZ1bmN0aW9uIHJlY29uY2lsZVRyZWUoeyAkZWxlbWVudCwgaWQgPSBbXSwgcGFyZW50ID0gbnVsbCB9KSB7XG4gIGlkLnB1c2goZ2V0Tm9kZUtleSgkZWxlbWVudCkpO1xuICBjb25zdCBvYmogPSB7XG4gICAgJGVsZW1lbnQsXG4gICAgaWQ6IGlkLmpvaW4oXCI6OlwiKSxcbiAgICBkZXB0aDogaWQubGVuZ3RoLFxuICAgIGlkeDogMCxcbiAgICBnZXRSZWFsUGFyZW50OiAoKSA9PiBwYXJlbnQsXG4gICAgZ2V0SWR4OiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmlkeCA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICAodGhpcy5nZXRSZWFsUGFyZW50KCk/LmdldElkeCgpID8/IC0xKSArICRlbGVtZW50LmluZGV4KCkgKyAxLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB0aGlzLmlkeDtcbiAgICB9LFxuICAgIG9wOiBudWxsLFxuICAgIHBhcmVudCxcbiAgfTtcbiAgb2JqLmdldElkeC5iaW5kKG9iaik7XG4gIHJldHVybiBbb2JqXS5jb25jYXQoXG4gICAgJGVsZW1lbnRcbiAgICAgIC5jb250ZW50cygpXG4gICAgICAudG9BcnJheSgpXG4gICAgICAubWFwKCh4KSA9PlxuICAgICAgICByZWNvbmNpbGVUcmVlKHtcbiAgICAgICAgICAkZWxlbWVudDogJCh4KSxcbiAgICAgICAgICBpZDogaWQuc2xpY2UoKSxcbiAgICAgICAgICBwYXJlbnQ6IG9iaixcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuZmxhdCgpLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVjb25jaWxlKCR2aXJ0dWFsTm9kZSwgJHJlYWxOb2RlKSB7XG4gIGNvbnN0ICRvbGQgPSByZWNvbmNpbGVUcmVlKHsgJGVsZW1lbnQ6ICRyZWFsTm9kZSB9KTtcbiAgY29uc3QgJG5ldyA9IHJlY29uY2lsZVRyZWUoeyAkZWxlbWVudDogJHZpcnR1YWxOb2RlIH0pO1xuICAkb2xkLm1hcCgoeCwgaSkgPT4gKHguaWR4ID0gaSkpO1xuICAkbmV3Lm1hcCgoeCwgaSkgPT4gKHguaWR4ID0gaSkpO1xuICBjb25zdCBkZXB0aCA9IE1hdGgubWF4KC4uLiRuZXcuY29uY2F0KCRvbGQpLm1hcCgoeCkgPT4geC5kZXB0aCkpO1xuICBjb25zdCBvcF9zdGVwcyA9IGxjYkRpZmYoJG9sZCwgJG5ldywgZGVwdGgpO1xuICBsZXQgdG9SZW1vdmUgPSBbXTtcbiAgd2luZG93Lk1BSU4gPSAkcmVhbE5vZGU7XG4gIHdpbmRvdy5PUFMgPSBvcF9zdGVwcztcblxuICBvcF9zdGVwcy5mb3JFYWNoKChvcF9zdGVwLCBpKSA9PiB7XG4gICAgY29uc3QgeyBvcCwgJGVsZW1lbnQsIGlkeCB9ID0gb3Bfc3RlcDtcblxuICAgIGlmIChvcC50eXBlID09PSBcImtlZXBfY291bnRlcnBhcnRcIikge1xuICAgICAgbGV0IGNJZHggPSBvcC5jb3VudGVycGFydC5nZXRJZHgoKTtcbiAgICAgIGlmIChjSWR4ICE9PSBpZHgpIHtcbiAgICAgICAgY29uc3QgZWxlbUJlZm9yZSA9IG9wX3N0ZXAuZ2V0QmVmb3JlKCk7XG4gICAgICAgIGlmICghZWxlbUJlZm9yZSkge1xuICAgICAgICAgIG9wX3N0ZXAuZ2V0UmVhbFBhcmVudCgpLiRlbGVtZW50LnByZXBlbmQob3AuY291bnRlcnBhcnQuJGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wLmNvdW50ZXJwYXJ0LiRlbGVtZW50Lmluc2VydEFmdGVyKGVsZW1CZWZvcmUuJGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN5bmNBdHRyaWJ1dGVzKG9wLmNvdW50ZXJwYXJ0LiRlbGVtZW50LCAkZWxlbWVudCk7XG4gICAgICBpZiAoJGVsZW1lbnQuaGFzQ2xhc3MoQ09OVFJPTExFUl9DTEFTUykpIHtcbiAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZKS4kY29udGFpbmVyID0gb3AuY291bnRlcnBhcnQuJGVsZW1lbnQ7XG4gICAgICAgICRlbGVtZW50LmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHRvUmVtb3ZlLnB1c2goJGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gXCJkZWxldGVcIikge1xuICAgICAgJGVsZW1lbnQuc2FmZVJlbW92ZSgpO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gXCJpbnNlcnRcIikge1xuICAgICAgY29uc3QgeyBhZnRlciwgdGFyZ2V0IH0gPSBvcF9zdGVwLm9wO1xuICAgICAgaWYgKGFmdGVyKSB7XG4gICAgICAgICRlbGVtZW50Lmluc2VydEFmdGVyKGFmdGVyLiRlbGVtZW50KTtcbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC4kZWxlbWVudC5wcmVwZW5kKCRlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIHRvUmVtb3ZlLmZvckVhY2goKCRlbGVtZW50KSA9PiAkZWxlbWVudC5zYWZlUmVtb3ZlKCkpO1xufVxuXG5mdW5jdGlvbiBzeW5jQXR0cmlidXRlcygkcmVhbCwgJHZpcnR1YWwpIHtcbiAgY29uc3QgcmVhbEF0dHJzID0gJHJlYWxbMF0uYXR0cmlidXRlcyA/PyBbXTtcbiAgY29uc3QgdmlydHVhbEF0dHJzID0gJHZpcnR1YWxbMF0uYXR0cmlidXRlcyA/PyBbXTtcbiAgLy8gUmVtb3ZlIG1pc3NpbmcgYXR0cnNcbiAgWy4uLnJlYWxBdHRyc10uZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgIGlmICghJHZpcnR1YWwuaXMoYFske2F0dHIubmFtZX1dYCkpIHtcbiAgICAgICRyZWFsLnJlbW92ZUF0dHIoYXR0ci5uYW1lKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFkZCBvciB1cGRhdGVcbiAgWy4uLnZpcnR1YWxBdHRyc10uZm9yRWFjaCgoYXR0cikgPT4ge1xuICAgIGlmICghYXR0ci5uYW1lLnN0YXJ0c1dpdGgoYGRhdGFgKSAmJiAkcmVhbC5hdHRyKGF0dHIubmFtZSkgIT09IGF0dHIudmFsdWUpIHtcbiAgICAgICRyZWFsLmF0dHIoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gICRyZWFsLnJlbW92ZURhdGEoKTtcbiAgT2JqZWN0LmVudHJpZXMoJHZpcnR1YWwuZGF0YSgpKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAkcmVhbC5kYXRhKGtleSwgdmFsdWUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBMQ0IgKExvbmdlc3QgQ29tbW9uIEJyYW5jaCkgZmluZHMgbWF0Y2hpbmcgYnJhbmNoZXMgYW5kIHJlc2VydmVzIHRoZW0hXG4gKlxuICogQHBhcmFtIG9sZE5vZGVzXG4gKiBAcGFyYW0gbmV3Tm9kZXNcbiAqIEBwYXJhbSBkZXB0aFxuICogQHJldHVybnMgeyp8KltdfVxuICovXG5mdW5jdGlvbiBsY2JEaWZmKG9sZE5vZGVzLCBuZXdOb2RlcywgZGVwdGgpIHtcbiAgbmV3Tm9kZXNcbiAgICAuZmlsdGVyKCh4KSA9PiB4LmRlcHRoID09PSBkZXB0aCAmJiAheC5vcClcbiAgICAuZm9yRWFjaCgobmV3Tm9kZSkgPT4ge1xuICAgICAgY29uc3Qgb2xkTm9kZSA9IG9sZE5vZGVzLmZpbmQoKHRlbXBPbGROb2RlKSA9PiB7XG4gICAgICAgIHJldHVybiAhdGVtcE9sZE5vZGUub3AgJiYgdGVtcE9sZE5vZGUuaWQgPT09IG5ld05vZGUuaWQ7XG4gICAgICB9KTtcblxuICAgICAgaWYgKG9sZE5vZGUpIHtcbiAgICAgICAgY29uc3Qga2VlcFRyZWVCcmFuY2ggPSAob2xkTm9kZSwgbmV3Tm9kZSkgPT4ge1xuICAgICAgICAgIG9sZE5vZGUub3AgPSB7IHR5cGU6IFwia2VlcFwiLCBpZHg6IG5ld05vZGUuaWR4IH07XG4gICAgICAgICAgbmV3Tm9kZS5vcCA9IHsgdHlwZTogXCJrZWVwX2NvdW50ZXJwYXJ0XCIsIGNvdW50ZXJwYXJ0OiBvbGROb2RlIH07XG4gICAgICAgICAgb2xkTm9kZSA9IG9sZE5vZGUucGFyZW50O1xuICAgICAgICAgIG5ld05vZGUgPSBuZXdOb2RlLnBhcmVudDtcbiAgICAgICAgICBpZiAoIW9sZE5vZGUgfHwgb2xkTm9kZS5vcCB8fCBuZXdOb2RlPy5vcCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBrZWVwVHJlZUJyYW5jaChvbGROb2RlLCBuZXdOb2RlKTtcbiAgICAgICAgfTtcbiAgICAgICAga2VlcFRyZWVCcmFuY2gob2xkTm9kZSwgbmV3Tm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIGlmIChkZXB0aCA+IDEpIHtcbiAgICByZXR1cm4gbGNiRGlmZihvbGROb2RlcywgbmV3Tm9kZXMsIGRlcHRoIC0gMSk7XG4gIH1cblxuICBvbGROb2Rlcy5mb3JFYWNoKCh4LCBpKSA9PiB7XG4gICAgaWYgKCF4Lm9wKSB7XG4gICAgICBjb25zdCBpZHggPSAob2xkTm9kZXNbaSAtIDFdPy5vcC5pZHggPz8gLTEpICsgMTtcbiAgICAgIHgub3AgPSB7IHR5cGU6IFwiZGVsZXRlXCIsIGlkeCB9O1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0UmVhbFBhcmVudChlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50LnBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50LnBhcmVudC5vcC50eXBlID09PSBcImtlZXBfY291bnRlcnBhcnRcIlxuICAgICAgPyBlbGVtZW50LnBhcmVudC5vcC5jb3VudGVycGFydFxuICAgICAgOiBlbGVtZW50LnBhcmVudDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJlZm9yZShlbGVtZW50LCBpZHgpIHtcbiAgICBjb25zdCBzdGFydERlcHRoID0gZWxlbWVudC5kZXB0aDtcbiAgICB3aGlsZSAoaWR4ID49IDEgJiYgZWxlbWVudC5kZXB0aCA+PSBzdGFydERlcHRoKSB7XG4gICAgICBpZHggLT0gMTtcbiAgICAgIGVsZW1lbnQgPSBuZXdOb2Rlc1tpZHhdO1xuICAgICAgaWYgKGVsZW1lbnQuZGVwdGggPT09IHN0YXJ0RGVwdGgpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub3AudHlwZSA9PT0gXCJrZWVwX2NvdW50ZXJwYXJ0XCJcbiAgICAgICAgICA/IGVsZW1lbnQub3AuY291bnRlcnBhcnRcbiAgICAgICAgICA6IGVsZW1lbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBuZXdOb2Rlcy5mb3JFYWNoKCh4LCBpKSA9PiB7XG4gICAgeC5nZXRCZWZvcmUgPSAoKSA9PiBnZXRCZWZvcmUoeCwgaSk7XG4gICAgeC5nZXRSZWFsUGFyZW50ID0gKCkgPT4gZ2V0UmVhbFBhcmVudCh4KTtcblxuICAgIGlmICgheC5vcCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0geC5nZXRSZWFsUGFyZW50KCk7XG4gICAgICBjb25zdCB0eXBlID0gdGFyZ2V0Py5vcC50eXBlID09PSBcImluc2VydFwiID8gXCJpbnNlcnRfaWdub3JlXCIgOiBcImluc2VydFwiO1xuICAgICAgeC5vcCA9IHsgdHlwZSwgdGFyZ2V0LCBhZnRlcjogeC5nZXRCZWZvcmUoKSB9O1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgdGFnZ2VkID0gWy4uLm9sZE5vZGVzLCAuLi5uZXdOb2Rlc107XG5cbiAgcmV0dXJuIHRhZ2dlZC5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgYVZhbCA9IGEub3A/LmlkeCA/PyBhLmlkeDtcbiAgICBjb25zdCBiVmFsID0gYi5vcD8uaWR4ID8/IGIuaWR4O1xuXG4gICAgcmV0dXJuIGFWYWwgLSBiVmFsO1xuICB9KTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRkb21cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGxlYWZDb250cm9sbGVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmVmcmVzaCgkZG9tLCBsZWFmQ29udHJvbGxlciwgcHJvY2VzcyA9IG51bGwpIHtcbiAgaWYgKCFsZWFmQ29udHJvbGxlcikge1xuICAgIGxlYWZDb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigkZG9tKTtcbiAgfVxuXG4gIGlmICghbGVhZkNvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBjb25zdCB7IHJlZnJlc2hQcm9jZXNzLCBpc1J1bm5pbmdQcm9jZXNzIH0gPSBwcmVwYXJlUmVmcmVzaFByb2Nlc3MoXG4gICAgcHJvY2VzcyxcbiAgICBsZWFmQ29udHJvbGxlcixcbiAgKTtcblxuICAkZG9tID8/PSBsZWFmQ29udHJvbGxlci4kY29udGFpbmVyO1xuXG4gIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICBhcHAudGFnTmFtZXMsXG4gICAgJGRvbSxcbiAgICBsZWFmQ29udHJvbGxlcixcbiAgICBwcm9jZXNzLFxuICApLnRoZW4oKCkgPT4ge1xuICAgIHJldHVybiByZWxvYWRNZXRob2RIVE1MKGxlYWZDb250cm9sbGVyLCAkZG9tLCByZWZyZXNoUHJvY2VzcykudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIWlzUnVubmluZ1Byb2Nlc3MpIHtcbiAgICAgICAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHJlZnJlc2hQcm9jZXNzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_view.js\n\n}");
|
|
147
|
+
eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CONTROLLER_CLASS: () => (/* binding */ CONTROLLER_CLASS),\n/* harmony export */ DATA_CONTROLLER_KEY: () => (/* binding */ DATA_CONTROLLER_KEY),\n/* harmony export */ cleanCache: () => (/* binding */ cleanCache),\n/* harmony export */ getController: () => (/* binding */ getController),\n/* harmony export */ loadFilesFromController: () => (/* binding */ loadFilesFromController),\n/* harmony export */ reconcile: () => (/* binding */ reconcile),\n/* harmony export */ refresh: () => (/* binding */ refresh),\n/* harmony export */ reloadHTMLController: () => (/* binding */ reloadHTMLController),\n/* harmony export */ reloadMethodHTML: () => (/* binding */ reloadMethodHTML),\n/* harmony export */ replaceTagElementsInContainer: () => (/* binding */ replaceTagElementsInContainer),\n/* harmony export */ runControllerFillContent: () => (/* binding */ runControllerFillContent)\n/* harmony export */ });\n/* harmony import */ var _sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdc_controller.js */ \"./src/simpleDomControl/sdc_controller.js\");\n/* harmony import */ var _sdc_params_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sdc_params.js */ \"./src/simpleDomControl/sdc_params.js\");\n/* harmony import */ var _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./sdc_main.js */ \"./src/simpleDomControl/sdc_main.js\");\n/* harmony import */ var _sdc_events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./sdc_events.js */ \"./src/simpleDomControl/sdc_events.js\");\n\n\n\n\n\n/**\n * List of HTML files.\n * @type {{}}\n */\nlet htmlFiles = {};\n\nconst DATA_CONTROLLER_KEY = \"_controller_\";\nconst CONTROLLER_CLASS = \"_sdc_controller_\";\n\nfunction cleanCache() {\n htmlFiles = {};\n}\n\n/**\n * findSdcTgs Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. It collects all those\n * doms and returns a list of objects containing also the tag name the dom and the tag\n * names of the super controller\n *\n * @param {jquery} $container - jQuery container\n * @param {Array<string>} tagNameList - a string list with tag names.\n * @param {AbstractSDC} parentController - controller in surrounding\n * @return {Array} - a array of objects with all register tags found\n */\nfunction findSdcTgs($container, tagNameList, parentController) {\n if (!$container) {\n return [];\n }\n let $children = $container.children();\n let emptyList = [];\n $children.each(function (_, element) {\n let $element = $(element);\n let tagName = $element.prop(\"tagName\").toLowerCase().split(\"_\");\n if ($.inArray(tagName[0], tagNameList) >= 0) {\n emptyList.push({\n tag: tagName[0],\n super: tagName.splice(1) || [],\n dom: $element,\n });\n } else if (tagName[0].startsWith(\"this.\")) {\n $element.addClass(\n `_bind_to_update_handler sdc_uuid_${parentController._uuid}`,\n );\n } else {\n emptyList = emptyList.concat(\n findSdcTgs($element, tagNameList, parentController),\n );\n }\n });\n\n return emptyList;\n}\n\n/**\n * replacePlaceholderController fills the parameter of the content\n * url this function uses the tag parameter\n *\n * @param controller - controller object\n * @param url - the origin content URL\n * @param urlValues - values for the url placeholder. In same order!!\n * @returns {string} - the correct URL with prefix.\n */\nfunction replacePlaceholderController(controller, url, urlValues) {\n for (let key_idx in controller._urlParams) {\n if (Object.hasOwn(controller._urlParams, key_idx)) {\n let key = controller._urlParams[key_idx];\n let re = RegExp(\"%\\\\(\" + key + \"\\\\)\\\\w\", \"gm\");\n const val = urlValues[key];\n if(!val) {\n console.warn(`${key} is not set for controller ${ controller._tagName }`);\n }\n url = url.replace(re, val);\n }\n }\n\n return url;\n}\n\n/**\n * loadHTMLFile loads the HTML content file from the server via ajax request.\n *\n * If the HTML file is loaded already the function takes no action.\n *\n * @param {AbstractSDC} controller - a content URL from the controller.\n * @param {object} args - get args.\n * @returns {Promise<jQuery|Boolean>} - waits for the file to be loaded.\n */\nfunction loadHTMLFile(controller, args) {\n const { contentUrl, _tagName, contentReload } = controller;\n if (!contentUrl) {\n return Promise.resolve(false);\n } else if (htmlFiles[_tagName]) {\n return Promise.resolve(htmlFiles[_tagName]);\n }\n\n args.VERSION = _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.VERSION;\n args._method = \"content\";\n\n return $.get(contentUrl, args)\n .then(function (data) {\n if (!contentReload) {\n htmlFiles[_tagName] = data;\n }\n\n return data;\n })\n .catch(function (err) {\n if (err.status === 301) {\n const data = err.responseJSON;\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"_RedirectOnView\", data[\"url-link\"]);\n if (!contentReload) {\n controller.autoRedirect = data[\"url-link\"];\n }\n return '<p>Redirected</p>';\n }\n controller.autoRedirect = null;\n if (typeof controller.confirmPageLoaded === \"function\") {\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)(\"navLoaded\", { controller_name: () => err.status });\n }\n\n throw `<sdc-error data-code=\"${err.status}\">${err.responseText}</sdc-error>`;\n });\n}\n\n/**\n * replaceAllTagElementsInContainer replaces all registered tags by the controller.\n * In this step the life-cycle starts.\n *\n * @param {jquery} $container - given container\n * @param {AbstractSDC} parentController - parent contoller surrounded the container\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceAllTagElementsInContainer(\n $container,\n parentController,\n process = null,\n) {\n parentController = parentController || $container.data(DATA_CONTROLLER_KEY);\n return replaceTagElementsInContainer(\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames,\n $container,\n parentController,\n process,\n );\n}\n\n/**\n * parseContentUrl uses the content URL prefix to marge the\n * correct URL. Also parses the url parameter\n *\n * @param {AbstractSDC} controller - controller object\n * @returns {{url: String, args: Array}} - the correct URL with prefix.\n */\nfunction parseContentUrl(controller) {\n let url = controller.contentUrl;\n if (controller && controller._urlParams.length === 0) {\n let re = /%\\(([^)]+)\\)\\w/gm;\n let matches;\n controller._urlParams = [];\n while ((matches = re.exec(url))) {\n controller._urlParams.push(matches[1]);\n controller.contentReload = true;\n }\n }\n\n let { args, params } = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.getUrlParam)(controller, controller.$container);\n if (controller._urlParams.length) {\n url = replacePlaceholderController(controller, url, params);\n }\n\n controller.parsedContentUrl = url;\n\n return { url: url, args };\n}\n\n/**\n *\n * @param {jquery} $elem\n * @return {AbstractSDC}\n */\nfunction getController($elem) {\n if ($elem.hasClass(CONTROLLER_CLASS)) {\n return $elem.data(`${DATA_CONTROLLER_KEY}`);\n }\n return $elem.closest(`.${CONTROLLER_CLASS}`).data(`${DATA_CONTROLLER_KEY}`);\n}\n\n/**\n * loadFilesFromController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n * The content is saved as jQuery object to the controller.$content property of\n * the controller.\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction loadFilesFromController(controller) {\n let getElements = { args: {} };\n if (controller.contentUrl) {\n getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n }\n\n return Promise.all([loadHTMLFile(controller, getElements.args)]).then(\n function (results) {\n let htmlFile = results[0];\n if (htmlFile) {\n try {\n return $(htmlFile);\n } catch {\n return $(\"<div></div>\").append(htmlFile);\n }\n }\n\n return null;\n },\n );\n}\n\n/**\n * reloadHTMLController loads the content (HTML) of a\n * Controller. If you have an alternative content URL is registered, for this\n * controller the origin content URL is ignored.\n *\n *\n * @param {AbstractSDC} controller - a instance of a JavaScript controller object.\n *\n * @returns {Promise<jQuery>} - the promise waits to the files are loaded. it returns the jQuery object.\n */\nfunction reloadHTMLController(controller) {\n if (controller.contentUrl) {\n let getElements = parseContentUrl(controller);\n controller.contentUrl = getElements.url;\n return loadHTMLFile(controller, getElements.args);\n }\n\n return new Promise((resolve) => {\n resolve($());\n });\n}\n\n/**\n *\n * @param {jquery} $element\n * @param {string} tagName\n * @param {Array<string>} superTagNameList\n * @param {AbstractSDC} parentController\n * @param {Object} process - Process object containing the refresh process\n * @returns {Promise}\n */\nfunction runReplaceTagElementsInContainer(\n $element,\n tagName,\n superTagNameList,\n parentController,\n process,\n) {\n let controller = $element.data(DATA_CONTROLLER_KEY);\n if (controller) {\n return replaceAllTagElementsInContainer($element, controller, process);\n }\n\n\n controller = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.controllerFactory)(\n parentController,\n $element,\n tagName,\n superTagNameList,\n );\n $element.data(DATA_CONTROLLER_KEY, controller);\n $element.addClass(CONTROLLER_CLASS);\n return (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.runControlFlowFunctions)(controller, process);\n}\n\n/**\n * runControllerFillContent empties the registered tag and replaces it by the controller\n * content. It sets the CSS tags for the relation with the CSS files.\n *\n * @param {AbstractSDC} controller - js controller instance\n * @param {jquery} $html - jQuery loaded content\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise}\n */\nfunction runControllerFillContent(controller, $html, process = null) {\n if ($html && $html.length > 0) {\n controller.$container.empty();\n controller.$container.attr(controller._tagName, \"\");\n for (let mixinKey in controller._mixins) {\n controller.$container.attr(controller._mixins[mixinKey]._tagName, \"\");\n }\n controller.$container.append($html);\n }\n\n return replaceAllTagElementsInContainer(\n controller.$container,\n controller,\n process,\n );\n}\n\n/**\n * replaceTagElementsInContainer Finds all registered tags in a container. But it ignores\n * registered tags in registered tags. For each registered tag it loads the content.\n * Afterwards it starts the life cycle of the controller. I the next step it starts the\n * procedure for the child elements of the controller tag.\n *\n * @param {Array<string>} tagList - list of all registered tags\n * @param {jquery} $container - jQuery container to find the tags\n * @param {AbstractSDC} parentController - controller in surrounding\n * @param {Object} process - Process object containing the refresh process\n */\nfunction replaceTagElementsInContainer(\n tagList,\n $container,\n parentController,\n process,\n) {\n return new Promise((resolve) => {\n let tagDescriptionElements = findSdcTgs(\n $container,\n tagList,\n parentController,\n );\n let tagCount = tagDescriptionElements.length;\n\n if (tagCount === 0) {\n return resolve();\n }\n\n for (\n let elementIndex = 0;\n elementIndex < tagDescriptionElements.length;\n elementIndex++\n ) {\n runReplaceTagElementsInContainer(\n tagDescriptionElements[elementIndex].dom,\n tagDescriptionElements[elementIndex].tag,\n tagDescriptionElements[elementIndex].super,\n parentController,\n process,\n ).then(() => {\n tagCount--;\n if (tagCount === 0) {\n return resolve();\n }\n });\n }\n });\n}\n\nfunction reloadMethodHTML(controller, $container, process) {\n return _reloadMethodHTML(\n controller,\n $container ?? controller.$container,\n process,\n );\n}\n\nfunction _reloadMethodHTML(controller, $dom, process) {\n const plist = [];\n\n $dom\n .find(`._bind_to_update_handler.sdc_uuid_${controller._uuid}`)\n .each(function () {\n const $this = $(this);\n let result = undefined;\n if ($this.hasClass(`_with_handler`)) {\n result = $this.data(\"handler\");\n } else {\n let controller_handler = this.tagName\n .toLowerCase()\n .replace(/^this./, \"\");\n if (controller[controller_handler]) {\n result = controller[controller_handler];\n }\n }\n\n if (typeof result === \"function\") {\n const newData = (0,_sdc_params_js__WEBPACK_IMPORTED_MODULE_1__.prepareData)($this.data(), controller);\n result = result.bind(controller)(newData);\n }\n if (result) {\n plist.push(\n Promise.resolve(result).then((x) => {\n let $newContent = $(`<div></div>`);\n $newContent.append(x);\n\n if ($this.html() === \"\") {\n $this.append(\"<div></div>\");\n }\n\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.reconcile(\n controller,\n $newContent,\n $this.children(),\n process,\n );\n }),\n );\n }\n });\n\n return Promise.all(plist);\n}\n\nfunction getNodeKey(node) {\n if (node[0].nodeType === 3) {\n return `TEXT__${node[0].nodeValue}`;\n }\n const res = [node[0].tagName];\n if (node[0].nodeName === \"INPUT\") {\n [\n [\"name\", \"\"],\n [\"type\", \"text\"],\n [\"id\", \"\"],\n ].forEach(([key, defaultValue]) => {\n const attr = node.attr(key) ?? defaultValue;\n if (attr) {\n res.push(attr);\n }\n });\n }\n return res.join(\"__\");\n}\n\nfunction reconcileTree({ $element, id = [], parent = null }) {\n id.push(getNodeKey($element));\n const obj = {\n $element,\n id: id.join(\"::\"),\n depth: id.length,\n idx: 0,\n getRealParent: () => parent,\n getIdx: function () {\n this.idx = Math.max(\n 0,\n (this.getRealParent()?.getIdx() ?? -1) + $element.index() + 1,\n );\n return this.idx;\n },\n op: null,\n parent,\n };\n obj.getIdx.bind(obj);\n return [obj].concat(\n $element\n .contents()\n .toArray()\n .map((x) =>\n reconcileTree({\n $element: $(x),\n id: id.slice(),\n parent: obj,\n }),\n )\n .flat(),\n );\n}\n\nfunction reconcile($virtualNode, $realNode) {\n const $old = reconcileTree({ $element: $realNode });\n const $new = reconcileTree({ $element: $virtualNode });\n $old.map((x, i) => (x.idx = i));\n $new.map((x, i) => (x.idx = i));\n const depth = Math.max(...$new.concat($old).map((x) => x.depth));\n const op_steps = lcbDiff($old, $new, depth);\n let toRemove = [];\n window.MAIN = $realNode;\n window.OPS = op_steps;\n\n op_steps.forEach((op_step, i) => {\n const { op, $element, idx } = op_step;\n\n if (op.type === \"keep_counterpart\") {\n let cIdx = op.counterpart.getIdx();\n if (cIdx !== idx) {\n const elemBefore = op_step.getBefore();\n if (!elemBefore) {\n op_step.getRealParent().$element.prepend(op.counterpart.$element);\n } else {\n op.counterpart.$element.insertAfter(elemBefore.$element);\n }\n }\n\n syncAttributes(op.counterpart.$element, $element);\n if ($element.hasClass(CONTROLLER_CLASS)) {\n $element.data(DATA_CONTROLLER_KEY).$container = op.counterpart.$element;\n $element.data(DATA_CONTROLLER_KEY, null);\n }\n\n toRemove.push($element);\n } else if (op.type === \"delete\") {\n $element.safeRemove();\n } else if (op.type === \"insert\") {\n const { after, target } = op_step.op;\n if (after) {\n $element.insertAfter(after.$element);\n } else if (target) {\n target.$element.prepend($element);\n }\n }\n });\n\n toRemove.forEach(($element) => $element.safeRemove());\n}\n\n/**\n * Replace the event listeners added by sdcDom (JSX on* props) on a kept node\n * with the listeners of its new virtual counterpart.\n */\nfunction syncListeners(real, virtual) {\n if (!real || !virtual || (!real._sdcListeners && !virtual._sdcListeners)) {\n return;\n }\n (real._sdcListeners ?? []).forEach(([type, fn]) => real.removeEventListener(type, fn));\n const listeners = virtual._sdcListeners ?? [];\n listeners.forEach(([type, fn]) => real.addEventListener(type, fn));\n real._sdcListeners = listeners;\n}\n\nfunction syncAttributes($real, $virtual) {\n syncListeners($real[0], $virtual[0]);\n const realAttrs = $real[0].attributes ?? [];\n const virtualAttrs = $virtual[0].attributes ?? [];\n // Remove missing attrs\n [...realAttrs].forEach((attr) => {\n if (!$virtual.is(`[${attr.name}]`)) {\n $real.removeAttr(attr.name);\n }\n });\n\n // Add or update\n [...virtualAttrs].forEach((attr) => {\n if (!attr.name.startsWith(`data`) && $real.attr(attr.name) !== attr.value) {\n $real.attr(attr.name, attr.value);\n }\n });\n\n $real.removeData();\n Object.entries($virtual.data()).forEach(([key, value]) => {\n $real.data(key, value);\n });\n}\n\n/**\n * LCB (Longest Common Branch) finds matching branches and reserves them!\n *\n * @param oldNodes\n * @param newNodes\n * @param depth\n * @returns {*|*[]}\n */\nfunction lcbDiff(oldNodes, newNodes, depth) {\n newNodes\n .filter((x) => x.depth === depth && !x.op)\n .forEach((newNode) => {\n const oldNode = oldNodes.find((tempOldNode) => {\n return !tempOldNode.op && tempOldNode.id === newNode.id;\n });\n\n if (oldNode) {\n const keepTreeBranch = (oldNode, newNode) => {\n oldNode.op = { type: \"keep\", idx: newNode.idx };\n newNode.op = { type: \"keep_counterpart\", counterpart: oldNode };\n oldNode = oldNode.parent;\n newNode = newNode.parent;\n if (!oldNode || oldNode.op || newNode?.op) {\n return;\n }\n keepTreeBranch(oldNode, newNode);\n };\n keepTreeBranch(oldNode, newNode);\n }\n });\n if (depth > 1) {\n return lcbDiff(oldNodes, newNodes, depth - 1);\n }\n\n oldNodes.forEach((x, i) => {\n if (!x.op) {\n const idx = (oldNodes[i - 1]?.op.idx ?? -1) + 1;\n x.op = { type: \"delete\", idx };\n }\n });\n\n function getRealParent(element) {\n if (!element.parent) {\n return null;\n }\n return element.parent.op.type === \"keep_counterpart\"\n ? element.parent.op.counterpart\n : element.parent;\n }\n\n function getBefore(element, idx) {\n const startDepth = element.depth;\n while (idx >= 1 && element.depth >= startDepth) {\n idx -= 1;\n element = newNodes[idx];\n if (element.depth === startDepth) {\n return element.op.type === \"keep_counterpart\"\n ? element.op.counterpart\n : element;\n }\n }\n\n return null;\n }\n\n newNodes.forEach((x, i) => {\n x.getBefore = () => getBefore(x, i);\n x.getRealParent = () => getRealParent(x);\n\n if (!x.op) {\n const target = x.getRealParent();\n const type = target?.op.type === \"insert\" ? \"insert_ignore\" : \"insert\";\n x.op = { type, target, after: x.getBefore() };\n }\n });\n\n const tagged = [...oldNodes, ...newNodes];\n\n return tagged.sort((a, b) => {\n const aVal = a.op?.idx ?? a.idx;\n const bVal = b.op?.idx ?? b.idx;\n\n return aVal - bVal;\n });\n}\n\n/**\n *\n * @param {jquery} $dom\n * @param {AbstractSDC} leafController\n * @param {Object} process - Process object containing the refresh process\n * @return {Promise<void>}\n */\n\nfunction refresh($dom, leafController, process = null) {\n if (!leafController) {\n leafController = getController($dom);\n }\n\n if (!leafController) {\n return Promise.resolve();\n }\n\n const { refreshProcess, isRunningProcess } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.prepareRefreshProcess)(\n process,\n leafController,\n );\n\n $dom ??= leafController.$container;\n\n return replaceTagElementsInContainer(\n _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames,\n $dom,\n leafController,\n process,\n ).then(() => {\n return reloadMethodHTML(leafController, $dom, refreshProcess).then(() => {\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n });\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RVA7QUFDQTtBQUNBLHlCQUF5QjtBQUN6Qix5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQSxHQUFHOztBQUVIOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFdBQVcsYUFBYTtBQUN4QixXQUFXLFFBQVE7QUFDbkIsWUFBWTtBQUNaOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxVQUFVLG1DQUFtQyxFQUFFLHlFQUFxQjtBQUNwRTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSxJQUFJLDZDQUFHO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxrRkFBOEI7QUFDdEM7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2RjX2NsaWVudC8uL3NyYy9zaW1wbGVEb21Db250cm9sL3NkY192aWV3LmpzP2NhMDAiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY29udHJvbGxlckZhY3RvcnksXG4gIHByZXBhcmVSZWZyZXNoUHJvY2VzcyxcbiAgcnVuQ29udHJvbEZsb3dGdW5jdGlvbnMsXG4gIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaCxcbn0gZnJvbSBcIi4vc2RjX2NvbnRyb2xsZXIuanNcIjtcbmltcG9ydCB7IGdldFVybFBhcmFtLCBwcmVwYXJlRGF0YSB9IGZyb20gXCIuL3NkY19wYXJhbXMuanNcIjtcbmltcG9ydCB7IGFwcCB9IGZyb20gXCIuL3NkY19tYWluLmpzXCI7XG5pbXBvcnQgeyB0cmlnZ2VyIH0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuXG4vKipcbiAqIExpc3Qgb2YgSFRNTCBmaWxlcy5cbiAqIEB0eXBlIHt7fX1cbiAqL1xubGV0IGh0bWxGaWxlcyA9IHt9O1xuXG5leHBvcnQgY29uc3QgREFUQV9DT05UUk9MTEVSX0tFWSA9IFwiX2NvbnRyb2xsZXJfXCI7XG5leHBvcnQgY29uc3QgQ09OVFJPTExFUl9DTEFTUyA9IFwiX3NkY19jb250cm9sbGVyX1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5DYWNoZSgpIHtcbiAgaHRtbEZpbGVzID0ge307XG59XG5cbi8qKlxuICogZmluZFNkY1RncyBGaW5kcyBhbGwgcmVnaXN0ZXJlZCB0YWdzIGluIGEgY29udGFpbmVyLiBCdXQgaXQgaWdub3Jlc1xuICogcmVnaXN0ZXJlZCB0YWdzIGluIHJlZ2lzdGVyZWQgdGFncy4gSXQgY29sbGVjdHMgYWxsIHRob3NlXG4gKiBkb21zIGFuZCByZXR1cm5zIGEgbGlzdCBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYWxzbyB0aGUgdGFnIG5hbWUgdGhlIGRvbSBhbmQgdGhlIHRhZ1xuICogbmFtZXMgb2YgdGhlIHN1cGVyIGNvbnRyb2xsZXJcbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGNvbnRhaW5lciAtIGpRdWVyeSBjb250YWluZXJcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gdGFnTmFtZUxpc3QgLSBhIHN0cmluZyBsaXN0IHdpdGggdGFnIG5hbWVzLlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIGNvbnRyb2xsZXIgaW4gc3Vycm91bmRpbmdcbiAqIEByZXR1cm4ge0FycmF5fSAtIGEgYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGFsbCByZWdpc3RlciB0YWdzIGZvdW5kXG4gKi9cbmZ1bmN0aW9uIGZpbmRTZGNUZ3MoJGNvbnRhaW5lciwgdGFnTmFtZUxpc3QsIHBhcmVudENvbnRyb2xsZXIpIHtcbiAgaWYgKCEkY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGxldCAkY2hpbGRyZW4gPSAkY29udGFpbmVyLmNoaWxkcmVuKCk7XG4gIGxldCBlbXB0eUxpc3QgPSBbXTtcbiAgJGNoaWxkcmVuLmVhY2goZnVuY3Rpb24gKF8sIGVsZW1lbnQpIHtcbiAgICBsZXQgJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgIGxldCB0YWdOYW1lID0gJGVsZW1lbnQucHJvcChcInRhZ05hbWVcIikudG9Mb3dlckNhc2UoKS5zcGxpdChcIl9cIik7XG4gICAgaWYgKCQuaW5BcnJheSh0YWdOYW1lWzBdLCB0YWdOYW1lTGlzdCkgPj0gMCkge1xuICAgICAgZW1wdHlMaXN0LnB1c2goe1xuICAgICAgICB0YWc6IHRhZ05hbWVbMF0sXG4gICAgICAgIHN1cGVyOiB0YWdOYW1lLnNwbGljZSgxKSB8fCBbXSxcbiAgICAgICAgZG9tOiAkZWxlbWVudCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodGFnTmFtZVswXS5zdGFydHNXaXRoKFwidGhpcy5cIikpIHtcbiAgICAgICRlbGVtZW50LmFkZENsYXNzKFxuICAgICAgICBgX2JpbmRfdG9fdXBkYXRlX2hhbmRsZXIgc2RjX3V1aWRfJHtwYXJlbnRDb250cm9sbGVyLl91dWlkfWAsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbXB0eUxpc3QgPSBlbXB0eUxpc3QuY29uY2F0KFxuICAgICAgICBmaW5kU2RjVGdzKCRlbGVtZW50LCB0YWdOYW1lTGlzdCwgcGFyZW50Q29udHJvbGxlciksXG4gICAgICApO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGVtcHR5TGlzdDtcbn1cblxuLyoqXG4gKiByZXBsYWNlUGxhY2Vob2xkZXJDb250cm9sbGVyIGZpbGxzIHRoZSBwYXJhbWV0ZXIgb2YgdGhlIGNvbnRlbnRcbiAqIHVybCB0aGlzIGZ1bmN0aW9uIHVzZXMgdGhlIHRhZyBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0gY29udHJvbGxlciAtIGNvbnRyb2xsZXIgb2JqZWN0XG4gKiBAcGFyYW0gdXJsIC0gdGhlIG9yaWdpbiBjb250ZW50IFVSTFxuICogQHBhcmFtIHVybFZhbHVlcyAtIHZhbHVlcyBmb3IgdGhlIHVybCBwbGFjZWhvbGRlci4gSW4gc2FtZSBvcmRlciEhXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBjb3JyZWN0IFVSTCB3aXRoIHByZWZpeC5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlcihjb250cm9sbGVyLCB1cmwsIHVybFZhbHVlcykge1xuICBmb3IgKGxldCBrZXlfaWR4IGluIGNvbnRyb2xsZXIuX3VybFBhcmFtcykge1xuICAgIGlmIChPYmplY3QuaGFzT3duKGNvbnRyb2xsZXIuX3VybFBhcmFtcywga2V5X2lkeCkpIHtcbiAgICAgIGxldCBrZXkgPSBjb250cm9sbGVyLl91cmxQYXJhbXNba2V5X2lkeF07XG4gICAgICBsZXQgcmUgPSBSZWdFeHAoXCIlXFxcXChcIiArIGtleSArIFwiXFxcXClcXFxcd1wiLCBcImdtXCIpO1xuICAgICAgY29uc3QgdmFsID0gdXJsVmFsdWVzW2tleV07XG4gICAgICBpZighdmFsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgJHtrZXl9IGlzIG5vdCBzZXQgZm9yIGNvbnRyb2xsZXIgJHsgY29udHJvbGxlci5fdGFnTmFtZSB9YCk7XG4gICAgICB9XG4gICAgICB1cmwgPSB1cmwucmVwbGFjZShyZSwgdmFsKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdXJsO1xufVxuXG4vKipcbiAqIGxvYWRIVE1MRmlsZSBsb2FkcyB0aGUgSFRNTCBjb250ZW50IGZpbGUgZnJvbSB0aGUgc2VydmVyIHZpYSBhamF4IHJlcXVlc3QuXG4gKlxuICogSWYgdGhlIEhUTUwgZmlsZSBpcyBsb2FkZWQgYWxyZWFkeSB0aGUgZnVuY3Rpb24gdGFrZXMgbm8gYWN0aW9uLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBhIGNvbnRlbnQgVVJMIGZyb20gdGhlIGNvbnRyb2xsZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGdldCBhcmdzLlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5fEJvb2xlYW4+fSAtIHdhaXRzIGZvciB0aGUgZmlsZSB0byBiZSBsb2FkZWQuXG4gKi9cbmZ1bmN0aW9uIGxvYWRIVE1MRmlsZShjb250cm9sbGVyLCBhcmdzKSB7XG4gIGNvbnN0IHsgY29udGVudFVybCwgX3RhZ05hbWUsIGNvbnRlbnRSZWxvYWQgfSA9IGNvbnRyb2xsZXI7XG4gIGlmICghY29udGVudFVybCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICB9IGVsc2UgaWYgKGh0bWxGaWxlc1tfdGFnTmFtZV0pIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGh0bWxGaWxlc1tfdGFnTmFtZV0pO1xuICB9XG5cbiAgYXJncy5WRVJTSU9OID0gYXBwLlZFUlNJT047XG4gIGFyZ3MuX21ldGhvZCA9IFwiY29udGVudFwiO1xuXG4gIHJldHVybiAkLmdldChjb250ZW50VXJsLCBhcmdzKVxuICAgIC50aGVuKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICBpZiAoIWNvbnRlbnRSZWxvYWQpIHtcbiAgICAgICAgaHRtbEZpbGVzW190YWdOYW1lXSA9IGRhdGE7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH0pXG4gICAgLmNhdGNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChlcnIuc3RhdHVzID09PSAzMDEpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGVyci5yZXNwb25zZUpTT047XG4gICAgICAgIHRyaWdnZXIoXCJfUmVkaXJlY3RPblZpZXdcIiwgZGF0YVtcInVybC1saW5rXCJdKTtcbiAgICAgICAgaWYgKCFjb250ZW50UmVsb2FkKSB7XG4gICAgICAgICAgY29udHJvbGxlci5hdXRvUmVkaXJlY3QgPSBkYXRhW1widXJsLWxpbmtcIl07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICc8cD5SZWRpcmVjdGVkPC9wPic7XG4gICAgICB9XG4gICAgICBjb250cm9sbGVyLmF1dG9SZWRpcmVjdCA9IG51bGw7XG4gICAgICBpZiAodHlwZW9mIGNvbnRyb2xsZXIuY29uZmlybVBhZ2VMb2FkZWQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0cmlnZ2VyKFwibmF2TG9hZGVkXCIsIHsgY29udHJvbGxlcl9uYW1lOiAoKSA9PiBlcnIuc3RhdHVzIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBgPHNkYy1lcnJvciBkYXRhLWNvZGU9XCIke2Vyci5zdGF0dXN9XCI+JHtlcnIucmVzcG9uc2VUZXh0fTwvc2RjLWVycm9yPmA7XG4gICAgfSk7XG59XG5cbi8qKlxuICogcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIgcmVwbGFjZXMgYWxsIHJlZ2lzdGVyZWQgdGFncyBieSB0aGUgY29udHJvbGxlci5cbiAqIEluIHRoaXMgc3RlcCB0aGUgbGlmZS1jeWNsZSBzdGFydHMuXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBnaXZlbiBjb250YWluZXJcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBwYXJlbnQgY29udG9sbGVyIHN1cnJvdW5kZWQgdGhlIGNvbnRhaW5lclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICRjb250YWluZXIsXG4gIHBhcmVudENvbnRyb2xsZXIsXG4gIHByb2Nlc3MgPSBudWxsLFxuKSB7XG4gIHBhcmVudENvbnRyb2xsZXIgPSBwYXJlbnRDb250cm9sbGVyIHx8ICRjb250YWluZXIuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZKTtcbiAgcmV0dXJuIHJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAgIGFwcC50YWdOYW1lcyxcbiAgICAkY29udGFpbmVyLFxuICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgcHJvY2VzcyxcbiAgKTtcbn1cblxuLyoqXG4gKiBwYXJzZUNvbnRlbnRVcmwgdXNlcyB0aGUgY29udGVudCBVUkwgcHJlZml4IHRvIG1hcmdlIHRoZVxuICogY29ycmVjdCBVUkwuIEFsc28gcGFyc2VzIHRoZSB1cmwgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGNvbnRyb2xsZXIgb2JqZWN0XG4gKiBAcmV0dXJucyB7e3VybDogU3RyaW5nLCBhcmdzOiBBcnJheX19IC0gdGhlIGNvcnJlY3QgVVJMIHdpdGggcHJlZml4LlxuICovXG5mdW5jdGlvbiBwYXJzZUNvbnRlbnRVcmwoY29udHJvbGxlcikge1xuICBsZXQgdXJsID0gY29udHJvbGxlci5jb250ZW50VXJsO1xuICBpZiAoY29udHJvbGxlciAmJiBjb250cm9sbGVyLl91cmxQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgbGV0IHJlID0gLyVcXCgoW14pXSspXFwpXFx3L2dtO1xuICAgIGxldCBtYXRjaGVzO1xuICAgIGNvbnRyb2xsZXIuX3VybFBhcmFtcyA9IFtdO1xuICAgIHdoaWxlICgobWF0Y2hlcyA9IHJlLmV4ZWModXJsKSkpIHtcbiAgICAgIGNvbnRyb2xsZXIuX3VybFBhcmFtcy5wdXNoKG1hdGNoZXNbMV0pO1xuICAgICAgY29udHJvbGxlci5jb250ZW50UmVsb2FkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBsZXQgeyBhcmdzLCBwYXJhbXMgfSA9IGdldFVybFBhcmFtKGNvbnRyb2xsZXIsIGNvbnRyb2xsZXIuJGNvbnRhaW5lcik7XG4gIGlmIChjb250cm9sbGVyLl91cmxQYXJhbXMubGVuZ3RoKSB7XG4gICAgdXJsID0gcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlcihjb250cm9sbGVyLCB1cmwsIHBhcmFtcyk7XG4gIH1cblxuICBjb250cm9sbGVyLnBhcnNlZENvbnRlbnRVcmwgPSB1cmw7XG5cbiAgcmV0dXJuIHsgdXJsOiB1cmwsIGFyZ3MgfTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtXG4gKiBAcmV0dXJuIHtBYnN0cmFjdFNEQ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnRyb2xsZXIoJGVsZW0pIHtcbiAgaWYgKCRlbGVtLmhhc0NsYXNzKENPTlRST0xMRVJfQ0xBU1MpKSB7XG4gICAgcmV0dXJuICRlbGVtLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKTtcbiAgfVxuICByZXR1cm4gJGVsZW0uY2xvc2VzdChgLiR7Q09OVFJPTExFUl9DTEFTU31gKS5kYXRhKGAke0RBVEFfQ09OVFJPTExFUl9LRVl9YCk7XG59XG5cbi8qKlxuICogbG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIgbG9hZHMgdGhlIGNvbnRlbnQgKEhUTUwpIG9mIGFcbiAqIENvbnRyb2xsZXIuIElmIHlvdSBoYXZlIGFuIGFsdGVybmF0aXZlIGNvbnRlbnQgVVJMIGlzIHJlZ2lzdGVyZWQsIGZvciB0aGlzXG4gKiBjb250cm9sbGVyIHRoZSBvcmlnaW4gY29udGVudCBVUkwgaXMgaWdub3JlZC5cbiAqXG4gKiBUaGUgY29udGVudCBpcyBzYXZlZCBhcyBqUXVlcnkgb2JqZWN0IHRvIHRoZSBjb250cm9sbGVyLiRjb250ZW50IHByb3BlcnR5IG9mXG4gKiB0aGUgY29udHJvbGxlci5cbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gYSBpbnN0YW5jZSBvZiBhIEphdmFTY3JpcHQgY29udHJvbGxlciBvYmplY3QuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxqUXVlcnk+fSAtIHRoZSBwcm9taXNlIHdhaXRzIHRvIHRoZSBmaWxlcyBhcmUgbG9hZGVkLiBpdCByZXR1cm5zIHRoZSBqUXVlcnkgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICBsZXQgZ2V0RWxlbWVudHMgPSB7IGFyZ3M6IHt9IH07XG4gIGlmIChjb250cm9sbGVyLmNvbnRlbnRVcmwpIHtcbiAgICBnZXRFbGVtZW50cyA9IHBhcnNlQ29udGVudFVybChjb250cm9sbGVyKTtcbiAgICBjb250cm9sbGVyLmNvbnRlbnRVcmwgPSBnZXRFbGVtZW50cy51cmw7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwoW2xvYWRIVE1MRmlsZShjb250cm9sbGVyLCBnZXRFbGVtZW50cy5hcmdzKV0pLnRoZW4oXG4gICAgZnVuY3Rpb24gKHJlc3VsdHMpIHtcbiAgICAgIGxldCBodG1sRmlsZSA9IHJlc3VsdHNbMF07XG4gICAgICBpZiAoaHRtbEZpbGUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gJChodG1sRmlsZSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiAkKFwiPGRpdj48L2Rpdj5cIikuYXBwZW5kKGh0bWxGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuICApO1xufVxuXG4vKipcbiAqIHJlbG9hZEhUTUxDb250cm9sbGVyIGxvYWRzIHRoZSBjb250ZW50IChIVE1MKSBvZiBhXG4gKiBDb250cm9sbGVyLiBJZiB5b3UgaGF2ZSBhbiBhbHRlcm5hdGl2ZSBjb250ZW50IFVSTCBpcyByZWdpc3RlcmVkLCBmb3IgdGhpc1xuICogY29udHJvbGxlciB0aGUgb3JpZ2luIGNvbnRlbnQgVVJMIGlzIGlnbm9yZWQuXG4gKlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBhIGluc3RhbmNlIG9mIGEgSmF2YVNjcmlwdCBjb250cm9sbGVyIG9iamVjdC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxqUXVlcnk+fSAtIHRoZSBwcm9taXNlIHdhaXRzIHRvIHRoZSBmaWxlcyBhcmUgbG9hZGVkLiBpdCByZXR1cm5zIHRoZSBqUXVlcnkgb2JqZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVsb2FkSFRNTENvbnRyb2xsZXIoY29udHJvbGxlcikge1xuICBpZiAoY29udHJvbGxlci5jb250ZW50VXJsKSB7XG4gICAgbGV0IGdldEVsZW1lbnRzID0gcGFyc2VDb250ZW50VXJsKGNvbnRyb2xsZXIpO1xuICAgIGNvbnRyb2xsZXIuY29udGVudFVybCA9IGdldEVsZW1lbnRzLnVybDtcbiAgICByZXR1cm4gbG9hZEhUTUxGaWxlKGNvbnRyb2xsZXIsIGdldEVsZW1lbnRzLmFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmVzb2x2ZSgkKCkpO1xuICB9KTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRlbGVtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZVxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzdXBlclRhZ05hbWVMaXN0XG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBwYXJlbnRDb250cm9sbGVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybnMge1Byb21pc2V9XG4gKi9cbmZ1bmN0aW9uIHJ1blJlcGxhY2VUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAkZWxlbWVudCxcbiAgdGFnTmFtZSxcbiAgc3VwZXJUYWdOYW1lTGlzdCxcbiAgcGFyZW50Q29udHJvbGxlcixcbiAgcHJvY2Vzcyxcbikge1xuICBsZXQgY29udHJvbGxlciA9ICRlbGVtZW50LmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSk7XG4gIGlmIChjb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyKCRlbGVtZW50LCBjb250cm9sbGVyLCBwcm9jZXNzKTtcbiAgfVxuXG5cbiAgY29udHJvbGxlciA9IGNvbnRyb2xsZXJGYWN0b3J5KFxuICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgJGVsZW1lbnQsXG4gICAgdGFnTmFtZSxcbiAgICBzdXBlclRhZ05hbWVMaXN0LFxuICApO1xuICAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVksIGNvbnRyb2xsZXIpO1xuICAkZWxlbWVudC5hZGRDbGFzcyhDT05UUk9MTEVSX0NMQVNTKTtcbiAgcmV0dXJuIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zKGNvbnRyb2xsZXIsIHByb2Nlc3MpO1xufVxuXG4vKipcbiAqIHJ1bkNvbnRyb2xsZXJGaWxsQ29udGVudCBlbXB0aWVzIHRoZSByZWdpc3RlcmVkIHRhZyBhbmQgcmVwbGFjZXMgaXQgYnkgdGhlIGNvbnRyb2xsZXJcbiAqIGNvbnRlbnQuIEl0IHNldHMgdGhlIENTUyB0YWdzIGZvciB0aGUgcmVsYXRpb24gd2l0aCB0aGUgQ1NTIGZpbGVzLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBqcyBjb250cm9sbGVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGh0bWwgLSBqUXVlcnkgbG9hZGVkIGNvbnRlbnRcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKiBAcmV0dXJuIHtQcm9taXNlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29udHJvbGxlckZpbGxDb250ZW50KGNvbnRyb2xsZXIsICRodG1sLCBwcm9jZXNzID0gbnVsbCkge1xuICBpZiAoJGh0bWwgJiYgJGh0bWwubGVuZ3RoID4gMCkge1xuICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5lbXB0eSgpO1xuICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5hdHRyKGNvbnRyb2xsZXIuX3RhZ05hbWUsIFwiXCIpO1xuICAgIGZvciAobGV0IG1peGluS2V5IGluIGNvbnRyb2xsZXIuX21peGlucykge1xuICAgICAgY29udHJvbGxlci4kY29udGFpbmVyLmF0dHIoY29udHJvbGxlci5fbWl4aW5zW21peGluS2V5XS5fdGFnTmFtZSwgXCJcIik7XG4gICAgfVxuICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lci5hcHBlbmQoJGh0bWwpO1xuICB9XG5cbiAgcmV0dXJuIHJlcGxhY2VBbGxUYWdFbGVtZW50c0luQ29udGFpbmVyKFxuICAgIGNvbnRyb2xsZXIuJGNvbnRhaW5lcixcbiAgICBjb250cm9sbGVyLFxuICAgIHByb2Nlc3MsXG4gICk7XG59XG5cbi8qKlxuICogcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIgRmluZHMgYWxsIHJlZ2lzdGVyZWQgdGFncyBpbiBhIGNvbnRhaW5lci4gQnV0IGl0IGlnbm9yZXNcbiAqIHJlZ2lzdGVyZWQgdGFncyBpbiByZWdpc3RlcmVkIHRhZ3MuIEZvciBlYWNoIHJlZ2lzdGVyZWQgdGFnIGl0IGxvYWRzIHRoZSBjb250ZW50LlxuICogQWZ0ZXJ3YXJkcyBpdCBzdGFydHMgdGhlIGxpZmUgY3ljbGUgb2YgdGhlIGNvbnRyb2xsZXIuIEkgdGhlIG5leHQgc3RlcCBpdCBzdGFydHMgdGhlXG4gKiBwcm9jZWR1cmUgZm9yIHRoZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgY29udHJvbGxlciB0YWcuXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSB0YWdMaXN0IC0gbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCB0YWdzXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGNvbnRhaW5lciAtIGpRdWVyeSBjb250YWluZXIgdG8gZmluZCB0aGUgdGFnc1xuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIGNvbnRyb2xsZXIgaW4gc3Vycm91bmRpbmdcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgdGFnTGlzdCxcbiAgJGNvbnRhaW5lcixcbiAgcGFyZW50Q29udHJvbGxlcixcbiAgcHJvY2Vzcyxcbikge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBsZXQgdGFnRGVzY3JpcHRpb25FbGVtZW50cyA9IGZpbmRTZGNUZ3MoXG4gICAgICAkY29udGFpbmVyLFxuICAgICAgdGFnTGlzdCxcbiAgICAgIHBhcmVudENvbnRyb2xsZXIsXG4gICAgKTtcbiAgICBsZXQgdGFnQ291bnQgPSB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzLmxlbmd0aDtcblxuICAgIGlmICh0YWdDb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBmb3IgKFxuICAgICAgbGV0IGVsZW1lbnRJbmRleCA9IDA7XG4gICAgICBlbGVtZW50SW5kZXggPCB0YWdEZXNjcmlwdGlvbkVsZW1lbnRzLmxlbmd0aDtcbiAgICAgIGVsZW1lbnRJbmRleCsrXG4gICAgKSB7XG4gICAgICBydW5SZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLmRvbSxcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLnRhZyxcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLnN1cGVyLFxuICAgICAgICBwYXJlbnRDb250cm9sbGVyLFxuICAgICAgICBwcm9jZXNzLFxuICAgICAgKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGFnQ291bnQtLTtcbiAgICAgICAgaWYgKHRhZ0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZE1ldGhvZEhUTUwoY29udHJvbGxlciwgJGNvbnRhaW5lciwgcHJvY2Vzcykge1xuICByZXR1cm4gX3JlbG9hZE1ldGhvZEhUTUwoXG4gICAgY29udHJvbGxlcixcbiAgICAkY29udGFpbmVyID8/IGNvbnRyb2xsZXIuJGNvbnRhaW5lcixcbiAgICBwcm9jZXNzLFxuICApO1xufVxuXG5mdW5jdGlvbiBfcmVsb2FkTWV0aG9kSFRNTChjb250cm9sbGVyLCAkZG9tLCBwcm9jZXNzKSB7XG4gIGNvbnN0IHBsaXN0ID0gW107XG5cbiAgJGRvbVxuICAgIC5maW5kKGAuX2JpbmRfdG9fdXBkYXRlX2hhbmRsZXIuc2RjX3V1aWRfJHtjb250cm9sbGVyLl91dWlkfWApXG4gICAgLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgJHRoaXMgPSAkKHRoaXMpO1xuICAgICAgbGV0IHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIGlmICgkdGhpcy5oYXNDbGFzcyhgX3dpdGhfaGFuZGxlcmApKSB7XG4gICAgICAgIHJlc3VsdCA9ICR0aGlzLmRhdGEoXCJoYW5kbGVyXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGNvbnRyb2xsZXJfaGFuZGxlciA9IHRoaXMudGFnTmFtZVxuICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgLnJlcGxhY2UoL150aGlzLi8sIFwiXCIpO1xuICAgICAgICBpZiAoY29udHJvbGxlcltjb250cm9sbGVyX2hhbmRsZXJdKSB7XG4gICAgICAgICAgcmVzdWx0ID0gY29udHJvbGxlcltjb250cm9sbGVyX2hhbmRsZXJdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29uc3QgbmV3RGF0YSA9IHByZXBhcmVEYXRhKCR0aGlzLmRhdGEoKSwgY29udHJvbGxlcik7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5iaW5kKGNvbnRyb2xsZXIpKG5ld0RhdGEpO1xuICAgICAgfVxuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICBwbGlzdC5wdXNoKFxuICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLnRoZW4oKHgpID0+IHtcbiAgICAgICAgICAgIGxldCAkbmV3Q29udGVudCA9ICQoYDxkaXY+PC9kaXY+YCk7XG4gICAgICAgICAgICAkbmV3Q29udGVudC5hcHBlbmQoeCk7XG5cbiAgICAgICAgICAgIGlmICgkdGhpcy5odG1sKCkgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgJHRoaXMuYXBwZW5kKFwiPGRpdj48L2Rpdj5cIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBhcHAucmVjb25jaWxlKFxuICAgICAgICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAkbmV3Q29udGVudCxcbiAgICAgICAgICAgICAgJHRoaXMuY2hpbGRyZW4oKSxcbiAgICAgICAgICAgICAgcHJvY2VzcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKHBsaXN0KTtcbn1cblxuZnVuY3Rpb24gZ2V0Tm9kZUtleShub2RlKSB7XG4gIGlmIChub2RlWzBdLm5vZGVUeXBlID09PSAzKSB7XG4gICAgcmV0dXJuIGBURVhUX18ke25vZGVbMF0ubm9kZVZhbHVlfWA7XG4gIH1cbiAgY29uc3QgcmVzID0gW25vZGVbMF0udGFnTmFtZV07XG4gIGlmIChub2RlWzBdLm5vZGVOYW1lID09PSBcIklOUFVUXCIpIHtcbiAgICBbXG4gICAgICBbXCJuYW1lXCIsIFwiXCJdLFxuICAgICAgW1widHlwZVwiLCBcInRleHRcIl0sXG4gICAgICBbXCJpZFwiLCBcIlwiXSxcbiAgICBdLmZvckVhY2goKFtrZXksIGRlZmF1bHRWYWx1ZV0pID0+IHtcbiAgICAgIGNvbnN0IGF0dHIgPSBub2RlLmF0dHIoa2V5KSA/PyBkZWZhdWx0VmFsdWU7XG4gICAgICBpZiAoYXR0cikge1xuICAgICAgICByZXMucHVzaChhdHRyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcmVzLmpvaW4oXCJfX1wiKTtcbn1cblxuZnVuY3Rpb24gcmVjb25jaWxlVHJlZSh7ICRlbGVtZW50LCBpZCA9IFtdLCBwYXJlbnQgPSBudWxsIH0pIHtcbiAgaWQucHVzaChnZXROb2RlS2V5KCRlbGVtZW50KSk7XG4gIGNvbnN0IG9iaiA9IHtcbiAgICAkZWxlbWVudCxcbiAgICBpZDogaWQuam9pbihcIjo6XCIpLFxuICAgIGRlcHRoOiBpZC5sZW5ndGgsXG4gICAgaWR4OiAwLFxuICAgIGdldFJlYWxQYXJlbnQ6ICgpID0+IHBhcmVudCxcbiAgICBnZXRJZHg6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHRoaXMuaWR4ID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgICh0aGlzLmdldFJlYWxQYXJlbnQoKT8uZ2V0SWR4KCkgPz8gLTEpICsgJGVsZW1lbnQuaW5kZXgoKSArIDEsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHRoaXMuaWR4O1xuICAgIH0sXG4gICAgb3A6IG51bGwsXG4gICAgcGFyZW50LFxuICB9O1xuICBvYmouZ2V0SWR4LmJpbmQob2JqKTtcbiAgcmV0dXJuIFtvYmpdLmNvbmNhdChcbiAgICAkZWxlbWVudFxuICAgICAgLmNvbnRlbnRzKClcbiAgICAgIC50b0FycmF5KClcbiAgICAgIC5tYXAoKHgpID0+XG4gICAgICAgIHJlY29uY2lsZVRyZWUoe1xuICAgICAgICAgICRlbGVtZW50OiAkKHgpLFxuICAgICAgICAgIGlkOiBpZC5zbGljZSgpLFxuICAgICAgICAgIHBhcmVudDogb2JqLFxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5mbGF0KCksXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvbmNpbGUoJHZpcnR1YWxOb2RlLCAkcmVhbE5vZGUpIHtcbiAgY29uc3QgJG9sZCA9IHJlY29uY2lsZVRyZWUoeyAkZWxlbWVudDogJHJlYWxOb2RlIH0pO1xuICBjb25zdCAkbmV3ID0gcmVjb25jaWxlVHJlZSh7ICRlbGVtZW50OiAkdmlydHVhbE5vZGUgfSk7XG4gICRvbGQubWFwKCh4LCBpKSA9PiAoeC5pZHggPSBpKSk7XG4gICRuZXcubWFwKCh4LCBpKSA9PiAoeC5pZHggPSBpKSk7XG4gIGNvbnN0IGRlcHRoID0gTWF0aC5tYXgoLi4uJG5ldy5jb25jYXQoJG9sZCkubWFwKCh4KSA9PiB4LmRlcHRoKSk7XG4gIGNvbnN0IG9wX3N0ZXBzID0gbGNiRGlmZigkb2xkLCAkbmV3LCBkZXB0aCk7XG4gIGxldCB0b1JlbW92ZSA9IFtdO1xuICB3aW5kb3cuTUFJTiA9ICRyZWFsTm9kZTtcbiAgd2luZG93Lk9QUyA9IG9wX3N0ZXBzO1xuXG4gIG9wX3N0ZXBzLmZvckVhY2goKG9wX3N0ZXAsIGkpID0+IHtcbiAgICBjb25zdCB7IG9wLCAkZWxlbWVudCwgaWR4IH0gPSBvcF9zdGVwO1xuXG4gICAgaWYgKG9wLnR5cGUgPT09IFwia2VlcF9jb3VudGVycGFydFwiKSB7XG4gICAgICBsZXQgY0lkeCA9IG9wLmNvdW50ZXJwYXJ0LmdldElkeCgpO1xuICAgICAgaWYgKGNJZHggIT09IGlkeCkge1xuICAgICAgICBjb25zdCBlbGVtQmVmb3JlID0gb3Bfc3RlcC5nZXRCZWZvcmUoKTtcbiAgICAgICAgaWYgKCFlbGVtQmVmb3JlKSB7XG4gICAgICAgICAgb3Bfc3RlcC5nZXRSZWFsUGFyZW50KCkuJGVsZW1lbnQucHJlcGVuZChvcC5jb3VudGVycGFydC4kZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3AuY291bnRlcnBhcnQuJGVsZW1lbnQuaW5zZXJ0QWZ0ZXIoZWxlbUJlZm9yZS4kZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3luY0F0dHJpYnV0ZXMob3AuY291bnRlcnBhcnQuJGVsZW1lbnQsICRlbGVtZW50KTtcbiAgICAgIGlmICgkZWxlbWVudC5oYXNDbGFzcyhDT05UUk9MTEVSX0NMQVNTKSkge1xuICAgICAgICAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpLiRjb250YWluZXIgPSBvcC5jb3VudGVycGFydC4kZWxlbWVudDtcbiAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdG9SZW1vdmUucHVzaCgkZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChvcC50eXBlID09PSBcImRlbGV0ZVwiKSB7XG4gICAgICAkZWxlbWVudC5zYWZlUmVtb3ZlKCk7XG4gICAgfSBlbHNlIGlmIChvcC50eXBlID09PSBcImluc2VydFwiKSB7XG4gICAgICBjb25zdCB7IGFmdGVyLCB0YXJnZXQgfSA9IG9wX3N0ZXAub3A7XG4gICAgICBpZiAoYWZ0ZXIpIHtcbiAgICAgICAgJGVsZW1lbnQuaW5zZXJ0QWZ0ZXIoYWZ0ZXIuJGVsZW1lbnQpO1xuICAgICAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LiRlbGVtZW50LnByZXBlbmQoJGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgdG9SZW1vdmUuZm9yRWFjaCgoJGVsZW1lbnQpID0+ICRlbGVtZW50LnNhZmVSZW1vdmUoKSk7XG59XG5cbi8qKlxuICogUmVwbGFjZSB0aGUgZXZlbnQgbGlzdGVuZXJzIGFkZGVkIGJ5IHNkY0RvbSAoSlNYIG9uKiBwcm9wcykgb24gYSBrZXB0IG5vZGVcbiAqIHdpdGggdGhlIGxpc3RlbmVycyBvZiBpdHMgbmV3IHZpcnR1YWwgY291bnRlcnBhcnQuXG4gKi9cbmZ1bmN0aW9uIHN5bmNMaXN0ZW5lcnMocmVhbCwgdmlydHVhbCkge1xuICBpZiAoIXJlYWwgfHwgIXZpcnR1YWwgfHwgKCFyZWFsLl9zZGNMaXN0ZW5lcnMgJiYgIXZpcnR1YWwuX3NkY0xpc3RlbmVycykpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgKHJlYWwuX3NkY0xpc3RlbmVycyA/PyBbXSkuZm9yRWFjaCgoW3R5cGUsIGZuXSkgPT4gcmVhbC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGZuKSk7XG4gIGNvbnN0IGxpc3RlbmVycyA9IHZpcnR1YWwuX3NkY0xpc3RlbmVycyA/PyBbXTtcbiAgbGlzdGVuZXJzLmZvckVhY2goKFt0eXBlLCBmbl0pID0+IHJlYWwuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBmbikpO1xuICByZWFsLl9zZGNMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7XG59XG5cbmZ1bmN0aW9uIHN5bmNBdHRyaWJ1dGVzKCRyZWFsLCAkdmlydHVhbCkge1xuICBzeW5jTGlzdGVuZXJzKCRyZWFsWzBdLCAkdmlydHVhbFswXSk7XG4gIGNvbnN0IHJlYWxBdHRycyA9ICRyZWFsWzBdLmF0dHJpYnV0ZXMgPz8gW107XG4gIGNvbnN0IHZpcnR1YWxBdHRycyA9ICR2aXJ0dWFsWzBdLmF0dHJpYnV0ZXMgPz8gW107XG4gIC8vIFJlbW92ZSBtaXNzaW5nIGF0dHJzXG4gIFsuLi5yZWFsQXR0cnNdLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICBpZiAoISR2aXJ0dWFsLmlzKGBbJHthdHRyLm5hbWV9XWApKSB7XG4gICAgICAkcmVhbC5yZW1vdmVBdHRyKGF0dHIubmFtZSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBBZGQgb3IgdXBkYXRlXG4gIFsuLi52aXJ0dWFsQXR0cnNdLmZvckVhY2goKGF0dHIpID0+IHtcbiAgICBpZiAoIWF0dHIubmFtZS5zdGFydHNXaXRoKGBkYXRhYCkgJiYgJHJlYWwuYXR0cihhdHRyLm5hbWUpICE9PSBhdHRyLnZhbHVlKSB7XG4gICAgICAkcmVhbC5hdHRyKGF0dHIubmFtZSwgYXR0ci52YWx1ZSk7XG4gICAgfVxuICB9KTtcblxuICAkcmVhbC5yZW1vdmVEYXRhKCk7XG4gIE9iamVjdC5lbnRyaWVzKCR2aXJ0dWFsLmRhdGEoKSkuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgJHJlYWwuZGF0YShrZXksIHZhbHVlKTtcbiAgfSk7XG59XG5cbi8qKlxuICogTENCIChMb25nZXN0IENvbW1vbiBCcmFuY2gpIGZpbmRzIG1hdGNoaW5nIGJyYW5jaGVzIGFuZCByZXNlcnZlcyB0aGVtIVxuICpcbiAqIEBwYXJhbSBvbGROb2Rlc1xuICogQHBhcmFtIG5ld05vZGVzXG4gKiBAcGFyYW0gZGVwdGhcbiAqIEByZXR1cm5zIHsqfCpbXX1cbiAqL1xuZnVuY3Rpb24gbGNiRGlmZihvbGROb2RlcywgbmV3Tm9kZXMsIGRlcHRoKSB7XG4gIG5ld05vZGVzXG4gICAgLmZpbHRlcigoeCkgPT4geC5kZXB0aCA9PT0gZGVwdGggJiYgIXgub3ApXG4gICAgLmZvckVhY2goKG5ld05vZGUpID0+IHtcbiAgICAgIGNvbnN0IG9sZE5vZGUgPSBvbGROb2Rlcy5maW5kKCh0ZW1wT2xkTm9kZSkgPT4ge1xuICAgICAgICByZXR1cm4gIXRlbXBPbGROb2RlLm9wICYmIHRlbXBPbGROb2RlLmlkID09PSBuZXdOb2RlLmlkO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChvbGROb2RlKSB7XG4gICAgICAgIGNvbnN0IGtlZXBUcmVlQnJhbmNoID0gKG9sZE5vZGUsIG5ld05vZGUpID0+IHtcbiAgICAgICAgICBvbGROb2RlLm9wID0geyB0eXBlOiBcImtlZXBcIiwgaWR4OiBuZXdOb2RlLmlkeCB9O1xuICAgICAgICAgIG5ld05vZGUub3AgPSB7IHR5cGU6IFwia2VlcF9jb3VudGVycGFydFwiLCBjb3VudGVycGFydDogb2xkTm9kZSB9O1xuICAgICAgICAgIG9sZE5vZGUgPSBvbGROb2RlLnBhcmVudDtcbiAgICAgICAgICBuZXdOb2RlID0gbmV3Tm9kZS5wYXJlbnQ7XG4gICAgICAgICAgaWYgKCFvbGROb2RlIHx8IG9sZE5vZGUub3AgfHwgbmV3Tm9kZT8ub3ApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAga2VlcFRyZWVCcmFuY2gob2xkTm9kZSwgbmV3Tm9kZSk7XG4gICAgICAgIH07XG4gICAgICAgIGtlZXBUcmVlQnJhbmNoKG9sZE5vZGUsIG5ld05vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICBpZiAoZGVwdGggPiAxKSB7XG4gICAgcmV0dXJuIGxjYkRpZmYob2xkTm9kZXMsIG5ld05vZGVzLCBkZXB0aCAtIDEpO1xuICB9XG5cbiAgb2xkTm9kZXMuZm9yRWFjaCgoeCwgaSkgPT4ge1xuICAgIGlmICgheC5vcCkge1xuICAgICAgY29uc3QgaWR4ID0gKG9sZE5vZGVzW2kgLSAxXT8ub3AuaWR4ID8/IC0xKSArIDE7XG4gICAgICB4Lm9wID0geyB0eXBlOiBcImRlbGV0ZVwiLCBpZHggfTtcbiAgICB9XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFJlYWxQYXJlbnQoZWxlbWVudCkge1xuICAgIGlmICghZWxlbWVudC5wYXJlbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudC5wYXJlbnQub3AudHlwZSA9PT0gXCJrZWVwX2NvdW50ZXJwYXJ0XCJcbiAgICAgID8gZWxlbWVudC5wYXJlbnQub3AuY291bnRlcnBhcnRcbiAgICAgIDogZWxlbWVudC5wYXJlbnQ7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRCZWZvcmUoZWxlbWVudCwgaWR4KSB7XG4gICAgY29uc3Qgc3RhcnREZXB0aCA9IGVsZW1lbnQuZGVwdGg7XG4gICAgd2hpbGUgKGlkeCA+PSAxICYmIGVsZW1lbnQuZGVwdGggPj0gc3RhcnREZXB0aCkge1xuICAgICAgaWR4IC09IDE7XG4gICAgICBlbGVtZW50ID0gbmV3Tm9kZXNbaWR4XTtcbiAgICAgIGlmIChlbGVtZW50LmRlcHRoID09PSBzdGFydERlcHRoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9wLnR5cGUgPT09IFwia2VlcF9jb3VudGVycGFydFwiXG4gICAgICAgICAgPyBlbGVtZW50Lm9wLmNvdW50ZXJwYXJ0XG4gICAgICAgICAgOiBlbGVtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbmV3Tm9kZXMuZm9yRWFjaCgoeCwgaSkgPT4ge1xuICAgIHguZ2V0QmVmb3JlID0gKCkgPT4gZ2V0QmVmb3JlKHgsIGkpO1xuICAgIHguZ2V0UmVhbFBhcmVudCA9ICgpID0+IGdldFJlYWxQYXJlbnQoeCk7XG5cbiAgICBpZiAoIXgub3ApIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHguZ2V0UmVhbFBhcmVudCgpO1xuICAgICAgY29uc3QgdHlwZSA9IHRhcmdldD8ub3AudHlwZSA9PT0gXCJpbnNlcnRcIiA/IFwiaW5zZXJ0X2lnbm9yZVwiIDogXCJpbnNlcnRcIjtcbiAgICAgIHgub3AgPSB7IHR5cGUsIHRhcmdldCwgYWZ0ZXI6IHguZ2V0QmVmb3JlKCkgfTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHRhZ2dlZCA9IFsuLi5vbGROb2RlcywgLi4ubmV3Tm9kZXNdO1xuXG4gIHJldHVybiB0YWdnZWQuc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IGFWYWwgPSBhLm9wPy5pZHggPz8gYS5pZHg7XG4gICAgY29uc3QgYlZhbCA9IGIub3A/LmlkeCA/PyBiLmlkeDtcblxuICAgIHJldHVybiBhVmFsIC0gYlZhbDtcbiAgfSk7XG59XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkZG9tXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBsZWFmQ29udHJvbGxlclxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59XG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZnJlc2goJGRvbSwgbGVhZkNvbnRyb2xsZXIsIHByb2Nlc3MgPSBudWxsKSB7XG4gIGlmICghbGVhZkNvbnRyb2xsZXIpIHtcbiAgICBsZWFmQ29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoJGRvbSk7XG4gIH1cblxuICBpZiAoIWxlYWZDb250cm9sbGVyKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgY29uc3QgeyByZWZyZXNoUHJvY2VzcywgaXNSdW5uaW5nUHJvY2VzcyB9ID0gcHJlcGFyZVJlZnJlc2hQcm9jZXNzKFxuICAgIHByb2Nlc3MsXG4gICAgbGVhZkNvbnRyb2xsZXIsXG4gICk7XG5cbiAgJGRvbSA/Pz0gbGVhZkNvbnRyb2xsZXIuJGNvbnRhaW5lcjtcblxuICByZXR1cm4gcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoXG4gICAgYXBwLnRhZ05hbWVzLFxuICAgICRkb20sXG4gICAgbGVhZkNvbnRyb2xsZXIsXG4gICAgcHJvY2VzcyxcbiAgKS50aGVuKCgpID0+IHtcbiAgICByZXR1cm4gcmVsb2FkTWV0aG9kSFRNTChsZWFmQ29udHJvbGxlciwgJGRvbSwgcmVmcmVzaFByb2Nlc3MpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKCFpc1J1bm5pbmdQcm9jZXNzKSB7XG4gICAgICAgIHVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaChyZWZyZXNoUHJvY2Vzcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_view.js\n\n}");
|
|
138
148
|
|
|
139
149
|
/***/ }
|
|
140
150
|
|
|
@@ -239,4 +249,4 @@ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpa
|
|
|
239
249
|
/******/ export { __webpack_exports__AbstractSDC as AbstractSDC, __webpack_exports__SdcModel as SdcModel, __webpack_exports__SdcQuerySet as SdcQuerySet, __webpack_exports__allOff as allOff, __webpack_exports__app as app, __webpack_exports__checkIfParamNumberBoolOrString as checkIfParamNumberBoolOrString, __webpack_exports__clearErrorsInForm as clearErrorsInForm, __webpack_exports__controllerFactory as controllerFactory, __webpack_exports__on as on, __webpack_exports__registerModel as registerModel, __webpack_exports__runControlFlowFunctions as runControlFlowFunctions, __webpack_exports__setErrorsInForm as setErrorsInForm, __webpack_exports__setEvent as setEvent, __webpack_exports__socketReconnect as socketReconnect, __webpack_exports__test_utils as test_utils, __webpack_exports__trigger as trigger };
|
|
240
250
|
/******/
|
|
241
251
|
|
|
242
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
252
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7U0FBQTtTQUNBOztTQUVBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBOztTQUVBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7U0FDQTtTQUNBO1NBQ0E7O1NBRUE7U0FDQTtTQUNBOzs7OztVQzVCQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQSwyQ0FBMkMsMENBQTBDO1VBQ3JGLE1BQU07VUFDTiwyQ0FBMkMsZ0NBQWdDO1VBQzNFO1VBQ0EsS0FBSyx5QkFBeUI7VUFDOUI7VUFDQSxHQUFHO1VBQ0g7VUFDQTtVQUNBLDBDQUEwQyx3Q0FBd0M7VUFDbEY7VUFDQTtVQUNBO1VBQ0EsRTs7Ozs7VUN0QkEsd0Y7Ozs7O1VDQUE7VUFDQTtVQUNBO1VBQ0EsdURBQXVELGlCQUFpQjtVQUN4RTtVQUNBLGdEQUFnRCxhQUFhO1VBQzdELEU7Ozs7O1NFTkE7U0FDQTtTQUNBO1NBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly8vd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly8vd2VicGFjay9iZWZvcmUtc3RhcnR1cCIsIndlYnBhY2s6Ly8vd2VicGFjay9zdGFydHVwIiwid2VicGFjazovLy93ZWJwYWNrL2FmdGVyLXN0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhlIG1vZHVsZSBjYWNoZVxuY29uc3QgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHRjb25zdCBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0Y29uc3QgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRpZiAoIShtb2R1bGVJZCBpbiBfX3dlYnBhY2tfbW9kdWxlc19fKSkge1xuXHRcdGRlbGV0ZSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRcdGNvbnN0IGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbW9kdWxlSWQgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyL3ZhbHVlIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRpZihBcnJheS5pc0FycmF5KGRlZmluaXRpb24pKSB7XG5cdFx0dmFyIGkgPSAwO1xuXHRcdHdoaWxlKGkgPCBkZWZpbml0aW9uLmxlbmd0aCkge1xuXHRcdFx0dmFyIGtleSA9IGRlZmluaXRpb25baSsrXTtcblx0XHRcdHZhciBiaW5kaW5nID0gZGVmaW5pdGlvbltpKytdO1xuXHRcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRcdGlmKGJpbmRpbmcgPT09IDApIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiBkZWZpbml0aW9uW2krK10gfSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGJpbmRpbmcgfSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZihiaW5kaW5nID09PSAwKSB7IGkrKzsgfVxuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIiIsIi8vIHN0YXJ0dXBcbi8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLy8gVGhpcyBlbnRyeSBtb2R1bGUgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBtb2R1bGVzIHNvIGl0IGNhbid0IGJlIGlubGluZWRcbmxldCBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXyhcIi4vc3JjL2luZGV4LmpzXCIpO1xuIiwiIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|