sdc_client 0.57.14 → 0.57.15

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/dist/index.js CHANGED
@@ -124,7 +124,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
124
124
  \******************************************/
125
125
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
126
126
 
127
- 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 = {};\nconst DATA_CONTROLLER_KEY = '_controller_';\nconst CONTROLLER_CLASS = '_sdc_controller_';\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(`_bind_to_update_handler sdc_uuid_${parentController._uuid}`);\n } else {\n emptyList = emptyList.concat(findSdcTgs($element, tagNameList, parentController));\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 url = url.replace(re, \"\" + urlValues.shift());\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 path - a content URL from the controller.\n * @param {object} args - get args.\n * @param tag - a normalized tag-name as string.\n * @param hardReload - true if the file has to be reloaded every time.\n * @returns {Promise<Boolean>} - waits for the file to be loaded.\n */\nfunction loadHTMLFile(path, args, tag, hardReload) {\n if (!path) {\n return Promise.resolve(false);\n } else if (htmlFiles[tag]) {\n return Promise.resolve(htmlFiles[tag]);\n }\n args.VERSION = _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.VERSION;\n args._method = 'content';\n return $.get(path, args).then(function (data) {\n if (!hardReload) {\n htmlFiles[tag] = data;\n }\n return data;\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 }\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)('navLoaded', {\n 'controller_name': () => err.status\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($container, parentController, process = null) {\n parentController = parentController || $container.data(DATA_CONTROLLER_KEY);\n return replaceTagElementsInContainer(_sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames, $container, parentController, process);\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 {string} - 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 let 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 controller.parsedContentUrl = url;\n return {\n url: url,\n args: params[params.length - 1]\n };\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 = {\n args: {}\n };\n if (controller.contentUrl) {\n getElements = parseContentUrl(controller, controller.contentUrl);\n controller.contentUrl = getElements.url;\n }\n return Promise.all([loadHTMLFile(controller.contentUrl, getElements.args, controller._tagName, controller.contentReload)]).then(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 return null;\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, controller.contentUrl);\n controller.contentUrl = getElements.url;\n return loadHTMLFile(controller.contentUrl, getElements.args, controller._tagName, controller.contentReload);\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($element, tagName, superTagNameList, parentController, process) {\n let controller = $element.data(DATA_CONTROLLER_KEY);\n if (controller) {\n return replaceAllTagElementsInContainer($element, controller, process);\n }\n controller = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.controllerFactory)(parentController, $element, tagName, superTagNameList);\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 return replaceAllTagElementsInContainer(controller.$container, controller, process);\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(tagList, $container, parentController, process) {\n return new Promise(resolve => {\n let tagDescriptionElements = findSdcTgs($container, tagList, parentController);\n let tagCount = tagDescriptionElements.length;\n if (tagCount === 0) {\n return resolve();\n }\n for (let elementIndex = 0; elementIndex < tagDescriptionElements.length; elementIndex++) {\n runReplaceTagElementsInContainer(tagDescriptionElements[elementIndex].dom, tagDescriptionElements[elementIndex].tag, tagDescriptionElements[elementIndex].super, parentController, process).then(() => {\n tagCount--;\n if (tagCount === 0) {\n return resolve();\n }\n });\n }\n });\n}\nfunction reloadMethodHTML(controller, $container, process) {\n return _reloadMethodHTML(controller, $container ?? controller.$container, process);\n}\nfunction _reloadMethodHTML(controller, $dom, process) {\n const plist = [];\n $dom.find(`._bind_to_update_handler.sdc_uuid_${controller._uuid}`).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.toLowerCase().replace(/^this./, '');\n if (controller[controller_handler]) {\n result = controller[controller_handler];\n }\n }\n if (typeof result === 'function') {\n result = result.bind(controller)($this.data());\n }\n if (result !== undefined) {\n plist.push(Promise.resolve(result).then(x => {\n let $newContent = $(`<div></div>`);\n $newContent.append(x);\n $newContent = $this.clone().empty().append($newContent);\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.reconcile(controller, $newContent, $this, process);\n }));\n }\n });\n return Promise.all(plist);\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 [['name', ''], ['type', 'text'], ['id', '']].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}\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 = (this.getRealParent()?.getIdx() ?? -1) + $element.index() + 1;\n return this.idx;\n },\n op: null,\n parent\n };\n obj.getIdx.bind(obj);\n return [obj].concat($element.contents().toArray().map(x => reconcileTree($(x), id.slice(), obj)).flat());\n}\nfunction reconcile($virtualNode, $realNode) {\n const $old = reconcileTree($realNode);\n const $new = reconcileTree($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 op_steps.forEach((op_step, i) => {\n const {\n op,\n $element,\n idx\n } = op_step;\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 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 toRemove.push($element);\n } else if (op.type === 'delete') {\n $element.safeRemove();\n } else if (op.type === 'insert') {\n const {\n after,\n target\n } = op_step.op;\n if (after) {\n $element.insertAfter(after.$element);\n } else if (target) {\n target.$element.prepend($element);\n }\n }\n });\n toRemove.forEach($element => $element.safeRemove());\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 $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.filter(x => x.depth === depth && !x.op).forEach(newNode => {\n const oldNode = oldNodes.find(tempOldNode => {\n return !tempOldNode.op && tempOldNode.id === newNode.id;\n });\n if (oldNode) {\n const keepTreeBranch = (oldNode, newNode) => {\n oldNode.op = {\n type: 'keep',\n idx: newNode.idx\n };\n newNode.op = {\n type: 'keep_counterpart',\n counterpart: oldNode\n };\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 oldNodes.forEach((x, i) => {\n if (!x.op) {\n const idx = (oldNodes[i - 1]?.op.idx ?? -1) + 1;\n x.op = {\n type: 'delete',\n idx\n };\n }\n });\n function getRealParent(element) {\n if (!element.parent) {\n return null;\n }\n return element.parent.op.type === 'keep_counterpart' ? element.parent.op.counterpart : element.parent;\n }\n function getBefore(element, idx) {\n const startDepth = element.depth;\n while (idx >= 0 && element.depth >= startDepth) {\n idx -= 1;\n element = newNodes[idx];\n if (element.depth === startDepth) {\n return element.op.type === 'keep_counterpart' ? element.op.counterpart : element;\n }\n }\n return null;\n }\n newNodes.forEach((x, i) => {\n x.getBefore = () => getBefore(x, i);\n x.getRealParent = () => getRealParent(x);\n if (!x.op) {\n const target = x.getRealParent();\n const type = target?.op.type === 'insert' ? 'insert_ignore' : 'insert';\n x.op = {\n type,\n target,\n after: x.getBefore()\n };\n }\n });\n const tagged = [...oldNodes, ...newNodes];\n return tagged.sort((a, b) => {\n const aVal = a.op?.idx ?? a.idx;\n const bVal = b.op?.idx ?? b.idx;\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 if (!leafController) {\n return Promise.resolve();\n }\n const {\n refreshProcess,\n isRunningProcess\n } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.prepareRefreshProcess)(process, leafController);\n $dom ??= leafController.$container;\n return replaceTagElementsInContainer(_sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames, $dom, leafController, process).then(() => {\n reloadMethodHTML(leafController, $dom, refreshProcess).then(() => {\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n });\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LENBQUMsQ0FBQ3RELEVBQUUsRUFBRUosR0FBRyxJQUFJMEQsQ0FBQyxDQUFDMUQsR0FBRztJQUUvQixPQUFPMkQsSUFBSSxHQUFHQyxJQUFJO0VBQ3BCLENBQUMsQ0FBQztBQUNKOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPLFNBQVNDLE9BQU9BLENBQUN2RixJQUFJLEVBQUV3RixjQUFjLEVBQUU3SCxPQUFPLEdBQUcsSUFBSSxFQUFFO0VBQzVELElBQUksQ0FBQzZILGNBQWMsRUFBRTtJQUNuQkEsY0FBYyxHQUFHbEgsYUFBYSxDQUFDMEIsSUFBSSxDQUFDO0VBQ3RDO0VBRUEsSUFBSSxDQUFDd0YsY0FBYyxFQUFFO0lBQ25CLE9BQU8zSSxPQUFPLENBQUNDLE9BQU8sQ0FBQyxDQUFDO0VBQzFCO0VBRUEsTUFBTTtJQUFDMkksY0FBYztJQUFFQztFQUFnQixDQUFDLEdBQUdqTSx5RUFBcUIsQ0FBQ2tFLE9BQU8sRUFBRTZILGNBQWMsQ0FBQztFQUV6RnhGLElBQUksS0FBS3dGLGNBQWMsQ0FBQ3BMLFVBQVU7RUFFbEMsT0FBT3dELDZCQUE2QixDQUFDL0QsNkNBQUcsQ0FBQ2dFLFFBQVEsRUFBRW1DLElBQUksRUFBRXdGLGNBQWMsRUFBRTdILE9BQU8sQ0FBQyxDQUFDVCxJQUFJLENBQUMsTUFBTTtJQUMzRjRDLGdCQUFnQixDQUFDMEYsY0FBYyxFQUFFeEYsSUFBSSxFQUFFeUYsY0FBYyxDQUFDLENBQUN2SSxJQUFJLENBQUMsTUFBTTtNQUNoRSxJQUFJLENBQUN3SSxnQkFBZ0IsRUFBRTtRQUNyQi9MLGtGQUE4QixDQUFDOEwsY0FBYyxDQUFDO01BQ2hEO0lBQ0YsQ0FBQyxDQUFDO0VBRUosQ0FBQyxDQUFDO0FBQ0oiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX3ZpZXcuanM/MjRiNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb250cm9sbGVyRmFjdG9yeSxcbiAgcHJlcGFyZVJlZnJlc2hQcm9jZXNzLFxuICBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyxcbiAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoXG59IGZyb20gXCIuL3NkY19jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQge2dldFVybFBhcmFtfSBmcm9tIFwiLi9zZGNfcGFyYW1zLmpzXCI7XG5pbXBvcnQge2FwcH0gZnJvbSBcIi4vc2RjX21haW4uanNcIjtcbmltcG9ydCB7dHJpZ2dlcn0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuXG4vKipcbiAqIExpc3Qgb2YgSFRNTCBmaWxlcy5cbiAqIEB0eXBlIHt7fX1cbiAqL1xubGV0IGh0bWxGaWxlcyA9IHt9O1xuXG5leHBvcnQgY29uc3QgREFUQV9DT05UUk9MTEVSX0tFWSA9ICdfY29udHJvbGxlcl8nO1xuZXhwb3J0IGNvbnN0IENPTlRST0xMRVJfQ0xBU1MgPSAnX3NkY19jb250cm9sbGVyXyc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuQ2FjaGUoKSB7XG4gIGh0bWxGaWxlcyA9IHt9O1xufVxuXG4vKipcbiAqIGZpbmRTZGNUZ3MgRmluZHMgYWxsIHJlZ2lzdGVyZWQgdGFncyBpbiBhIGNvbnRhaW5lci4gQnV0IGl0IGlnbm9yZXNcbiAqIHJlZ2lzdGVyZWQgdGFncyBpbiByZWdpc3RlcmVkIHRhZ3MuIEl0IGNvbGxlY3RzIGFsbCB0aG9zZVxuICogZG9tcyBhbmQgcmV0dXJucyBhIGxpc3Qgb2Ygb2JqZWN0cyBjb250YWluaW5nIGFsc28gdGhlIHRhZyBuYW1lIHRoZSBkb20gYW5kIHRoZSB0YWdcbiAqIG5hbWVzIG9mIHRoZSBzdXBlciBjb250cm9sbGVyXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBqUXVlcnkgY29udGFpbmVyXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHRhZ05hbWVMaXN0IC0gYSBzdHJpbmcgbGlzdCB3aXRoIHRhZyBuYW1lcy5cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBjb250cm9sbGVyIGluIHN1cnJvdW5kaW5nXG4gKiBAcmV0dXJuIHtBcnJheX0gLSBhIGFycmF5IG9mIG9iamVjdHMgd2l0aCBhbGwgcmVnaXN0ZXIgdGFncyBmb3VuZFxuICovXG5mdW5jdGlvbiBmaW5kU2RjVGdzKCRjb250YWluZXIsIHRhZ05hbWVMaXN0LCBwYXJlbnRDb250cm9sbGVyKSB7XG4gIGlmICghJGNvbnRhaW5lcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBsZXQgJGNoaWxkcmVuID0gJGNvbnRhaW5lci5jaGlsZHJlbigpO1xuICBsZXQgZW1wdHlMaXN0ID0gW107XG4gICRjaGlsZHJlbi5lYWNoKGZ1bmN0aW9uIChfLCBlbGVtZW50KSB7XG4gICAgbGV0ICRlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICBsZXQgdGFnTmFtZSA9ICRlbGVtZW50LnByb3AoJ3RhZ05hbWUnKS50b0xvd2VyQ2FzZSgpLnNwbGl0KCdfJyk7XG4gICAgaWYgKCQuaW5BcnJheSh0YWdOYW1lWzBdLCB0YWdOYW1lTGlzdCkgPj0gMCkge1xuICAgICAgZW1wdHlMaXN0LnB1c2goe1xuICAgICAgICB0YWc6IHRhZ05hbWVbMF0sXG4gICAgICAgIHN1cGVyOiB0YWdOYW1lLnNwbGljZSgxKSB8fCBbXSxcbiAgICAgICAgZG9tOiAkZWxlbWVudFxuICAgICAgfSk7XG5cbiAgICB9IGVsc2UgaWYgKHRhZ05hbWVbMF0uc3RhcnRzV2l0aCgndGhpcy4nKSkge1xuICAgICAgJGVsZW1lbnQuYWRkQ2xhc3MoYF9iaW5kX3RvX3VwZGF0ZV9oYW5kbGVyIHNkY191dWlkXyR7cGFyZW50Q29udHJvbGxlci5fdXVpZH1gKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbXB0eUxpc3QgPSBlbXB0eUxpc3QuY29uY2F0KGZpbmRTZGNUZ3MoJGVsZW1lbnQsIHRhZ05hbWVMaXN0LCBwYXJlbnRDb250cm9sbGVyKSlcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBlbXB0eUxpc3Q7XG59XG5cbi8qKlxuICogcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlciBmaWxscyB0aGUgcGFyYW1ldGVyIG9mIHRoZSBjb250ZW50XG4gKiB1cmwgdGhpcyBmdW5jdGlvbiB1c2VzIHRoZSB0YWcgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIGNvbnRyb2xsZXIgLSBjb250cm9sbGVyIG9iamVjdFxuICogQHBhcmFtIHVybCAtIHRoZSBvcmlnaW4gY29udGVudCBVUkxcbiAqIEBwYXJhbSB1cmxWYWx1ZXMgLSB2YWx1ZXMgZm9yIHRoZSB1cmwgcGxhY2Vob2xkZXIuIEluIHNhbWUgb3JkZXIhIVxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgY29ycmVjdCBVUkwgd2l0aCBwcmVmaXguXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIoY29udHJvbGxlciwgdXJsLCB1cmxWYWx1ZXMpIHtcbiAgZm9yIChsZXQga2V5X2lkeCBpbiBjb250cm9sbGVyLl91cmxQYXJhbXMpIHtcbiAgICBpZiAoY29udHJvbGxlci5fdXJsUGFyYW1zLmhhc093blByb3BlcnR5KGtleV9pZHgpKSB7XG4gICAgICBsZXQga2V5ID0gY29udHJvbGxlci5fdXJsUGFyYW1zW2tleV9pZHhdO1xuICAgICAgbGV0IHJlID0gUmVnRXhwKFwiJVxcXFwoXCIgKyBrZXkgKyBcIlxcXFwpXFxcXHdcIiwgXCJnbVwiKTtcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKHJlLCBcIlwiICsgdXJsVmFsdWVzLnNoaWZ0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cmw7XG59XG5cbi8qKlxuICogbG9hZEhUTUxGaWxlIGxvYWRzIHRoZSBIVE1MIGNvbnRlbnQgZmlsZSBmcm9tIHRoZSBzZXJ2ZXIgdmlhIGFqYXggcmVxdWVzdC5cbiAqXG4gKiBJZiB0aGUgSFRNTCBmaWxlIGlzIGxvYWRlZCBhbHJlYWR5IHRoZSBmdW5jdGlvbiB0YWtlcyBubyBhY3Rpb24uXG4gKlxuICogQHBhcmFtIHBhdGggLSBhIGNvbnRlbnQgVVJMIGZyb20gdGhlIGNvbnRyb2xsZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGdldCBhcmdzLlxuICogQHBhcmFtIHRhZyAtIGEgbm9ybWFsaXplZCB0YWctbmFtZSBhcyBzdHJpbmcuXG4gKiBAcGFyYW0gaGFyZFJlbG9hZCAtIHRydWUgaWYgdGhlIGZpbGUgaGFzIHRvIGJlIHJlbG9hZGVkIGV2ZXJ5IHRpbWUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gLSB3YWl0cyBmb3IgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLlxuICovXG5mdW5jdGlvbiBsb2FkSFRNTEZpbGUocGF0aCwgYXJncywgdGFnLCBoYXJkUmVsb2FkKSB7XG4gIGlmICghcGF0aCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICB9IGVsc2UgaWYgKGh0bWxGaWxlc1t0YWddKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShodG1sRmlsZXNbdGFnXSlcbiAgfVxuXG4gIGFyZ3MuVkVSU0lPTiA9IGFwcC5WRVJTSU9OO1xuICBhcmdzLl9tZXRob2QgPSAnY29udGVudCc7XG5cbiAgcmV0dXJuICQuZ2V0KHBhdGgsIGFyZ3MpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZiAoIWhhcmRSZWxvYWQpIHtcbiAgICAgIGh0bWxGaWxlc1t0YWddID0gZGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIuc3RhdHVzID09PSAzMDEpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBlcnIucmVzcG9uc2VKU09OO1xuICAgICAgdHJpZ2dlcignX1JlZGlyZWN0T25WaWV3JywgZGF0YVsndXJsLWxpbmsnXSk7XG4gICAgfVxuICAgIHRyaWdnZXIoJ25hdkxvYWRlZCcsIHsnY29udHJvbGxlcl9uYW1lJzogKCkgPT4gZXJyLnN0YXR1c30pO1xuXG4gICAgdGhyb3cgYDxzZGMtZXJyb3IgZGF0YS1jb2RlPVwiJHtlcnIuc3RhdHVzfVwiPiR7ZXJyLnJlc3BvbnNlVGV4dH08L3NkYy1lcnJvcj5gO1xuICB9KTtcbn1cblxuLyoqXG4gKiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lciByZXBsYWNlcyBhbGwgcmVnaXN0ZXJlZCB0YWdzIGJ5IHRoZSBjb250cm9sbGVyLlxuICogSW4gdGhpcyBzdGVwIHRoZSBsaWZlLWN5Y2xlIHN0YXJ0cy5cbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGNvbnRhaW5lciAtIGdpdmVuIGNvbnRhaW5lclxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIHBhcmVudCBjb250b2xsZXIgc3Vycm91bmRlZCB0aGUgY29udGFpbmVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICovXG5mdW5jdGlvbiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcigkY29udGFpbmVyLCBwYXJlbnRDb250cm9sbGVyLCBwcm9jZXNzID0gbnVsbCkge1xuICBwYXJlbnRDb250cm9sbGVyID0gcGFyZW50Q29udHJvbGxlciB8fCAkY29udGFpbmVyLmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSk7XG4gIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihhcHAudGFnTmFtZXMsICRjb250YWluZXIsIHBhcmVudENvbnRyb2xsZXIsIHByb2Nlc3MpO1xufVxuXG4vKipcbiAqIHBhcnNlQ29udGVudFVybCB1c2VzIHRoZSBjb250ZW50IFVSTCBwcmVmaXggdG8gbWFyZ2UgdGhlXG4gKiBjb3JyZWN0IFVSTC4gQWxzbyBwYXJzZXMgdGhlIHVybCBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gY29udHJvbGxlciBvYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGNvcnJlY3QgVVJMIHdpdGggcHJlZml4LlxuICovXG5mdW5jdGlvbiBwYXJzZUNvbnRlbnRVcmwoY29udHJvbGxlcikge1xuICBsZXQgdXJsID0gY29udHJvbGxlci5jb250ZW50VXJsO1xuICBpZiAoY29udHJvbGxlciAmJiBjb250cm9sbGVyLl91cmxQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgbGV0IHJlID0gLyVcXCgoW14pXSspXFwpXFx3L2dtO1xuICAgIGxldCBtYXRjaGVzO1xuICAgIGNvbnRyb2xsZXIuX3VybFBhcmFtcyA9IFtdO1xuICAgIHdoaWxlICgobWF0Y2hlcyA9IHJlLmV4ZWModXJsKSkpIHtcbiAgICAgIGNvbnRyb2xsZXIuX3VybFBhcmFtcy5wdXNoKG1hdGNoZXNbMV0pO1xuICAgICAgY29udHJvbGxlci5jb250ZW50UmVsb2FkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBsZXQgcGFyYW1zID0gZ2V0VXJsUGFyYW0oY29udHJvbGxlciwgY29udHJvbGxlci4kY29udGFpbmVyKTtcbiAgaWYgKGNvbnRyb2xsZXIuX3VybFBhcmFtcy5sZW5ndGgpIHtcbiAgICB1cmwgPSByZXBsYWNlUGxhY2Vob2xkZXJDb250cm9sbGVyKGNvbnRyb2xsZXIsIHVybCwgcGFyYW1zKTtcbiAgfVxuXG4gIGNvbnRyb2xsZXIucGFyc2VkQ29udGVudFVybCA9IHVybDtcblxuICByZXR1cm4ge3VybDogdXJsLCBhcmdzOiBwYXJhbXNbcGFyYW1zLmxlbmd0aCAtIDFdfTtcbn1cblxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGVsZW1cbiAqIEByZXR1cm4ge0Fic3RyYWN0U0RDfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udHJvbGxlcigkZWxlbSkge1xuICBpZiAoJGVsZW0uaGFzQ2xhc3MoQ09OVFJPTExFUl9DTEFTUykpIHtcbiAgICByZXR1cm4gJGVsZW0uZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApO1xuICB9XG4gIHJldHVybiAkZWxlbS5jbG9zZXN0KGAuJHtDT05UUk9MTEVSX0NMQVNTfWApLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKTtcbn1cblxuLyoqXG4gKiBsb2FkRmlsZXNGcm9tQ29udHJvbGxlciBsb2FkcyB0aGUgY29udGVudCAoSFRNTCkgb2YgYVxuICogQ29udHJvbGxlci4gSWYgeW91IGhhdmUgYW4gYWx0ZXJuYXRpdmUgY29udGVudCBVUkwgaXMgcmVnaXN0ZXJlZCwgZm9yIHRoaXNcbiAqIGNvbnRyb2xsZXIgdGhlIG9yaWdpbiBjb250ZW50IFVSTCBpcyBpZ25vcmVkLlxuICpcbiAqIFRoZSBjb250ZW50IGlzIHNhdmVkIGFzIGpRdWVyeSBvYmplY3QgdG8gdGhlIGNvbnRyb2xsZXIuJGNvbnRlbnQgcHJvcGVydHkgb2ZcbiAqIHRoZSBjb250cm9sbGVyLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBhIGluc3RhbmNlIG9mIGEgSmF2YVNjcmlwdCBjb250cm9sbGVyIG9iamVjdC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGpRdWVyeT59IC0gdGhlIHByb21pc2Ugd2FpdHMgdG8gdGhlIGZpbGVzIGFyZSBsb2FkZWQuIGl0IHJldHVybnMgdGhlIGpRdWVyeSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRmlsZXNGcm9tQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gIGxldCBnZXRFbGVtZW50cyA9IHthcmdzOiB7fX07XG4gIGlmIChjb250cm9sbGVyLmNvbnRlbnRVcmwpIHtcbiAgICBnZXRFbGVtZW50cyA9IHBhcnNlQ29udGVudFVybChjb250cm9sbGVyLCBjb250cm9sbGVyLmNvbnRlbnRVcmwpO1xuICAgIGNvbnRyb2xsZXIuY29udGVudFVybCA9IGdldEVsZW1lbnRzLnVybDtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgbG9hZEhUTUxGaWxlKGNvbnRyb2xsZXIuY29udGVudFVybCwgZ2V0RWxlbWVudHMuYXJncywgY29udHJvbGxlci5fdGFnTmFtZSwgY29udHJvbGxlci5jb250ZW50UmVsb2FkKVxuICBdKS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgbGV0IGh0bWxGaWxlID0gcmVzdWx0c1swXTtcbiAgICBpZiAoaHRtbEZpbGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAkKGh0bWxGaWxlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gJCgnPGRpdj48L2Rpdj4nKS5hcHBlbmQoaHRtbEZpbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9KTtcbn1cblxuLyoqXG4gKiByZWxvYWRIVE1MQ29udHJvbGxlciBsb2FkcyB0aGUgY29udGVudCAoSFRNTCkgb2YgYVxuICogQ29udHJvbGxlci4gSWYgeW91IGhhdmUgYW4gYWx0ZXJuYXRpdmUgY29udGVudCBVUkwgaXMgcmVnaXN0ZXJlZCwgZm9yIHRoaXNcbiAqIGNvbnRyb2xsZXIgdGhlIG9yaWdpbiBjb250ZW50IFVSTCBpcyBpZ25vcmVkLlxuICpcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gYSBpbnN0YW5jZSBvZiBhIEphdmFTY3JpcHQgY29udHJvbGxlciBvYmplY3QuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5Pn0gLSB0aGUgcHJvbWlzZSB3YWl0cyB0byB0aGUgZmlsZXMgYXJlIGxvYWRlZC4gaXQgcmV0dXJucyB0aGUgalF1ZXJ5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZEhUTUxDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgaWYgKGNvbnRyb2xsZXIuY29udGVudFVybCkge1xuICAgIGxldCBnZXRFbGVtZW50cyA9IHBhcnNlQ29udGVudFVybChjb250cm9sbGVyLCBjb250cm9sbGVyLmNvbnRlbnRVcmwpO1xuICAgIGNvbnRyb2xsZXIuY29udGVudFVybCA9IGdldEVsZW1lbnRzLnVybDtcbiAgICByZXR1cm4gbG9hZEhUTUxGaWxlKGNvbnRyb2xsZXIuY29udGVudFVybCwgZ2V0RWxlbWVudHMuYXJncywgY29udHJvbGxlci5fdGFnTmFtZSwgY29udHJvbGxlci5jb250ZW50UmVsb2FkKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICByZXNvbHZlKCQoKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHN1cGVyVGFnTmFtZUxpc3RcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqL1xuZnVuY3Rpb24gcnVuUmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoJGVsZW1lbnQsIHRhZ05hbWUsIHN1cGVyVGFnTmFtZUxpc3QsIHBhcmVudENvbnRyb2xsZXIsIHByb2Nlc3MpIHtcbiAgbGV0IGNvbnRyb2xsZXIgPSAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpO1xuICBpZiAoY29udHJvbGxlcikge1xuICAgIHJldHVybiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcigkZWxlbWVudCwgY29udHJvbGxlciwgcHJvY2Vzcyk7XG4gIH1cblxuICBjb250cm9sbGVyID0gY29udHJvbGxlckZhY3RvcnkocGFyZW50Q29udHJvbGxlciwgJGVsZW1lbnQsIHRhZ05hbWUsIHN1cGVyVGFnTmFtZUxpc3QpO1xuICAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVksIGNvbnRyb2xsZXIpO1xuICAkZWxlbWVudC5hZGRDbGFzcyhDT05UUk9MTEVSX0NMQVNTKTtcbiAgcmV0dXJuIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zKGNvbnRyb2xsZXIsIHByb2Nlc3MpO1xufVxuXG5cbi8qKlxuICogcnVuQ29udHJvbGxlckZpbGxDb250ZW50IGVtcHRpZXMgdGhlIHJlZ2lzdGVyZWQgdGFnIGFuZCByZXBsYWNlcyBpdCBieSB0aGUgY29udHJvbGxlclxuICogY29udGVudC4gSXQgc2V0cyB0aGUgQ1NTIHRhZ3MgZm9yIHRoZSByZWxhdGlvbiB3aXRoIHRoZSBDU1MgZmlsZXMuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGpzIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkaHRtbCAtIGpRdWVyeSBsb2FkZWQgY29udGVudFxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Db250cm9sbGVyRmlsbENvbnRlbnQoY29udHJvbGxlciwgJGh0bWwsIHByb2Nlc3MgPSBudWxsKSB7XG4gIGlmICgkaHRtbCAmJiAkaHRtbC5sZW5ndGggPiAwKSB7XG4gICAgY29udHJvbGxlci4kY29udGFpbmVyLmVtcHR5KCk7XG4gICAgY29udHJvbGxlci4kY29udGFpbmVyLmF0dHIoY29udHJvbGxlci5fdGFnTmFtZSwgJycpO1xuICAgIGZvciAobGV0IG1peGluS2V5IGluIGNvbnRyb2xsZXIuX21peGlucykge1xuICAgICAgY29udHJvbGxlci4kY29udGFpbmVyLmF0dHIoY29udHJvbGxlci5fbWl4aW5zW21peGluS2V5XS5fdGFnTmFtZSwgJycpO1xuICAgIH1cbiAgICBjb250cm9sbGVyLiRjb250YWluZXIuYXBwZW5kKCRodG1sKTtcbiAgfVxuXG4gIHJldHVybiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcihjb250cm9sbGVyLiRjb250YWluZXIsIGNvbnRyb2xsZXIsIHByb2Nlc3MpO1xufVxuXG5cbi8qKlxuICogcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIgRmluZHMgYWxsIHJlZ2lzdGVyZWQgdGFncyBpbiBhIGNvbnRhaW5lci4gQnV0IGl0IGlnbm9yZXNcbiAqIHJlZ2lzdGVyZWQgdGFncyBpbiByZWdpc3RlcmVkIHRhZ3MuIEZvciBlYWNoIHJlZ2lzdGVyZWQgdGFnIGl0IGxvYWRzIHRoZSBjb250ZW50LlxuICogQWZ0ZXJ3YXJkcyBpdCBzdGFydHMgdGhlIGxpZmUgY3ljbGUgb2YgdGhlIGNvbnRyb2xsZXIuIEkgdGhlIG5leHQgc3RlcCBpdCBzdGFydHMgdGhlXG4gKiBwcm9jZWR1cmUgZm9yIHRoZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgY29udHJvbGxlciB0YWcuXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSB0YWdMaXN0IC0gbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCB0YWdzXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGNvbnRhaW5lciAtIGpRdWVyeSBjb250YWluZXIgdG8gZmluZCB0aGUgdGFnc1xuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIGNvbnRyb2xsZXIgaW4gc3Vycm91bmRpbmdcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcih0YWdMaXN0LCAkY29udGFpbmVyLCBwYXJlbnRDb250cm9sbGVyLCBwcm9jZXNzKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXG4gICAgbGV0IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMgPSBmaW5kU2RjVGdzKCRjb250YWluZXIsIHRhZ0xpc3QsIHBhcmVudENvbnRyb2xsZXIpO1xuICAgIGxldCB0YWdDb3VudCA9IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMubGVuZ3RoO1xuXG4gICAgaWYgKHRhZ0NvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGVsZW1lbnRJbmRleCA9IDA7IGVsZW1lbnRJbmRleCA8IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMubGVuZ3RoOyBlbGVtZW50SW5kZXgrKykge1xuICAgICAgcnVuUmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIodGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLmRvbSxcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLnRhZyxcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLnN1cGVyLFxuICAgICAgICBwYXJlbnRDb250cm9sbGVyLCBwcm9jZXNzKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGFnQ291bnQtLTtcbiAgICAgICAgaWYgKHRhZ0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZE1ldGhvZEhUTUwoY29udHJvbGxlciwgJGNvbnRhaW5lciwgcHJvY2Vzcykge1xuICByZXR1cm4gX3JlbG9hZE1ldGhvZEhUTUwoY29udHJvbGxlciwgJGNvbnRhaW5lciA/PyBjb250cm9sbGVyLiRjb250YWluZXIsIHByb2Nlc3MpXG59XG5cbmZ1bmN0aW9uIF9yZWxvYWRNZXRob2RIVE1MKGNvbnRyb2xsZXIsICRkb20sIHByb2Nlc3MpIHtcbiAgY29uc3QgcGxpc3QgPSBbXTtcblxuICAkZG9tLmZpbmQoYC5fYmluZF90b191cGRhdGVfaGFuZGxlci5zZGNfdXVpZF8ke2NvbnRyb2xsZXIuX3V1aWR9YCkuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgJHRoaXMgPSAkKHRoaXMpO1xuICAgIGxldCByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCR0aGlzLmhhc0NsYXNzKGBfd2l0aF9oYW5kbGVyYCkpIHtcbiAgICAgIHJlc3VsdCA9ICR0aGlzLmRhdGEoJ2hhbmRsZXInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGNvbnRyb2xsZXJfaGFuZGxlciA9IHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL150aGlzLi8sICcnKTtcbiAgICAgIGlmIChjb250cm9sbGVyW2NvbnRyb2xsZXJfaGFuZGxlcl0pIHtcbiAgICAgICAgcmVzdWx0ID0gY29udHJvbGxlcltjb250cm9sbGVyX2hhbmRsZXJdO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5iaW5kKGNvbnRyb2xsZXIpKCR0aGlzLmRhdGEoKSk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGxpc3QucHVzaChQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKCh4KSA9PiB7XG4gICAgICAgIGxldCAkbmV3Q29udGVudCA9ICQoYDxkaXY+PC9kaXY+YCk7XG4gICAgICAgICRuZXdDb250ZW50LmFwcGVuZCh4KTtcbiAgICAgICAgJG5ld0NvbnRlbnQgPSAkdGhpcy5jbG9uZSgpLmVtcHR5KCkuYXBwZW5kKCRuZXdDb250ZW50KTtcbiAgICAgICAgcmV0dXJuIGFwcC5yZWNvbmNpbGUoY29udHJvbGxlciwgJG5ld0NvbnRlbnQsICR0aGlzLCBwcm9jZXNzKTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgfSk7XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKHBsaXN0KTtcbn1cblxuXG5mdW5jdGlvbiBnZXROb2RlS2V5KG5vZGUpIHtcbiAgaWYgKG5vZGVbMF0ubm9kZVR5cGUgPT09IDMpIHtcbiAgICByZXR1cm4gYFRFWFRfXyR7bm9kZVswXS5ub2RlVmFsdWV9YDtcbiAgfVxuICBjb25zdCByZXMgPSBbbm9kZVswXS50YWdOYW1lXTtcbiAgaWYgKG5vZGVbMF0ubm9kZU5hbWUgPT09ICdJTlBVVCcpIHtcbiAgICBbWyduYW1lJywgJyddLCBbJ3R5cGUnLCAndGV4dCddLCBbJ2lkJywgJyddXS5mb3JFYWNoKChba2V5LCBkZWZhdWx0VmFsdWVdKSA9PiB7XG4gICAgICBjb25zdCBhdHRyID0gbm9kZS5hdHRyKGtleSkgPz8gZGVmYXVsdFZhbHVlO1xuICAgICAgaWYgKGF0dHIpIHtcbiAgICAgICAgcmVzLnB1c2goYXR0cik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlcy5qb2luKCdfXycpO1xufVxuXG5mdW5jdGlvbiByZWNvbmNpbGVUcmVlKCRlbGVtZW50LCBpZCA9IFtdLCBwYXJlbnQgPSBudWxsKSB7XG4gIGlkLnB1c2goZ2V0Tm9kZUtleSgkZWxlbWVudCkpO1xuICBjb25zdCBvYmogPSB7XG4gICAgJGVsZW1lbnQsXG4gICAgaWQ6IGlkLmpvaW4oJzo6JyksXG4gICAgZGVwdGg6IGlkLmxlbmd0aCxcbiAgICBpZHg6IDAsXG4gICAgZ2V0UmVhbFBhcmVudDogKCkgPT4gcGFyZW50LFxuICAgIGdldElkeDogZnVuY3Rpb24gKCkge1xuICAgICAgdGhpcy5pZHggPSAodGhpcy5nZXRSZWFsUGFyZW50KCk/LmdldElkeCgpID8/IC0xKSArICRlbGVtZW50LmluZGV4KCkgKyAxO1xuICAgICAgcmV0dXJuIHRoaXMuaWR4O1xuICAgIH0sXG4gICAgb3A6IG51bGwsXG4gICAgcGFyZW50XG4gIH07XG4gIG9iai5nZXRJZHguYmluZChvYmopO1xuICByZXR1cm4gW29ial0uY29uY2F0KCRlbGVtZW50LmNvbnRlbnRzKCkudG9BcnJheSgpLm1hcCgoeCkgPT4gcmVjb25jaWxlVHJlZSgkKHgpLCBpZC5zbGljZSgpLCBvYmopKS5mbGF0KCkpO1xuXG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY29uY2lsZSgkdmlydHVhbE5vZGUsICRyZWFsTm9kZSkge1xuICBjb25zdCAkb2xkID0gcmVjb25jaWxlVHJlZSgkcmVhbE5vZGUpO1xuICBjb25zdCAkbmV3ID0gcmVjb25jaWxlVHJlZSgkdmlydHVhbE5vZGUpO1xuICAkb2xkLm1hcCgoeCwgaSkgPT4geC5pZHggPSBpKTtcbiAgJG5ldy5tYXAoKHgsIGkpID0+IHguaWR4ID0gaSk7XG4gIGNvbnN0IGRlcHRoID0gTWF0aC5tYXgoLi4uJG5ldy5jb25jYXQoJG9sZCkubWFwKHggPT4geC5kZXB0aCkpO1xuICBjb25zdCBvcF9zdGVwcyA9IGxjYkRpZmYoJG9sZCwgJG5ldywgZGVwdGgpO1xuICBsZXQgdG9SZW1vdmUgPSBbXTtcbiAgd2luZG93Lk1BSU4gPSAkcmVhbE5vZGU7XG4gIHdpbmRvdy5PUFMgPSBvcF9zdGVwcztcblxuICBvcF9zdGVwcy5mb3JFYWNoKChvcF9zdGVwLCBpKSA9PiB7XG4gICAgY29uc3Qge29wLCAkZWxlbWVudCwgaWR4fSA9IG9wX3N0ZXA7XG5cbiAgICBpZiAob3AudHlwZSA9PT0gJ2tlZXBfY291bnRlcnBhcnQnKSB7XG4gICAgICBsZXQgY0lkeCA9IG9wLmNvdW50ZXJwYXJ0LmdldElkeCgpO1xuICAgICAgaWYgKGNJZHggIT09IGlkeCkge1xuICAgICAgICBjb25zdCBlbGVtQmVmb3JlID0gb3Bfc3RlcC5nZXRCZWZvcmUoKTtcbiAgICAgICAgaWYgKCFlbGVtQmVmb3JlKSB7XG4gICAgICAgICAgb3Bfc3RlcC5nZXRSZWFsUGFyZW50KCkuJGVsZW1lbnQucHJlcGVuZChvcC5jb3VudGVycGFydC4kZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3AuY291bnRlcnBhcnQuJGVsZW1lbnQuaW5zZXJ0QWZ0ZXIoZWxlbUJlZm9yZS4kZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3luY0F0dHJpYnV0ZXMob3AuY291bnRlcnBhcnQuJGVsZW1lbnQsICRlbGVtZW50KTtcbiAgICAgIGlmICgkZWxlbWVudC5oYXNDbGFzcyhDT05UUk9MTEVSX0NMQVNTKSkge1xuICAgICAgICAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpLiRjb250YWluZXIgPSBvcC5jb3VudGVycGFydC4kZWxlbWVudDtcbiAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdG9SZW1vdmUucHVzaCgkZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChvcC50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgJGVsZW1lbnQuc2FmZVJlbW92ZSgpO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ2luc2VydCcpIHtcbiAgICAgIGNvbnN0IHthZnRlciwgdGFyZ2V0fSA9IG9wX3N0ZXAub3A7XG4gICAgICBpZiAoYWZ0ZXIpIHtcbiAgICAgICAgJGVsZW1lbnQuaW5zZXJ0QWZ0ZXIoYWZ0ZXIuJGVsZW1lbnQpO1xuICAgICAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LiRlbGVtZW50LnByZXBlbmQoJGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgfVxuICB9KTtcblxuICB0b1JlbW92ZS5mb3JFYWNoKCgkZWxlbWVudCkgPT4gJGVsZW1lbnQuc2FmZVJlbW92ZSgpKTtcbn1cblxuZnVuY3Rpb24gc3luY0F0dHJpYnV0ZXMoJHJlYWwsICR2aXJ0dWFsKSB7XG4gIGNvbnN0IHJlYWxBdHRycyA9ICRyZWFsWzBdLmF0dHJpYnV0ZXMgPz8gW107XG4gIGNvbnN0IHZpcnR1YWxBdHRycyA9ICR2aXJ0dWFsWzBdLmF0dHJpYnV0ZXMgPz8gW107XG4gIC8vIFJlbW92ZSBtaXNzaW5nIGF0dHJzXG4gIFsuLi5yZWFsQXR0cnNdLmZvckVhY2goYXR0ciA9PiB7XG4gICAgaWYgKCEkdmlydHVhbC5pcyhgWyR7YXR0ci5uYW1lfV1gKSkge1xuICAgICAgJHJlYWwucmVtb3ZlQXR0cihhdHRyLm5hbWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWRkIG9yIHVwZGF0ZVxuICBbLi4udmlydHVhbEF0dHJzXS5mb3JFYWNoKGF0dHIgPT4ge1xuICAgIGlmICghYXR0ci5uYW1lLnN0YXJ0c1dpdGgoYGRhdGFgKSAmJiAkcmVhbC5hdHRyKGF0dHIubmFtZSkgIT09IGF0dHIudmFsdWUpIHtcbiAgICAgICRyZWFsLmF0dHIoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gICRyZWFsLnJlbW92ZURhdGEoKTtcbiAgT2JqZWN0LmVudHJpZXMoJHZpcnR1YWwuZGF0YSgpKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAkcmVhbC5kYXRhKGtleSwgdmFsdWUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBMQ0IgKExvbmdlc3QgQ29tbW9uIEJyYW5jaCkgZmluZHMgbWF0Y2hpbmcgYnJhbmNoZXMgYW5kIHJlc2VydmVzIHRoZW0hXG4gKlxuICogQHBhcmFtIG9sZE5vZGVzXG4gKiBAcGFyYW0gbmV3Tm9kZXNcbiAqIEBwYXJhbSBkZXB0aFxuICogQHJldHVybnMgeyp8KltdfVxuICovXG5mdW5jdGlvbiBsY2JEaWZmKG9sZE5vZGVzLCBuZXdOb2RlcywgZGVwdGgpIHtcbiAgbmV3Tm9kZXMuZmlsdGVyKHggPT4geC5kZXB0aCA9PT0gZGVwdGggJiYgIXgub3ApLmZvckVhY2goKG5ld05vZGUpID0+IHtcbiAgICBjb25zdCBvbGROb2RlID0gb2xkTm9kZXMuZmluZCgodGVtcE9sZE5vZGUpID0+IHtcbiAgICAgIHJldHVybiAhdGVtcE9sZE5vZGUub3AgJiYgdGVtcE9sZE5vZGUuaWQgPT09IG5ld05vZGUuaWQ7XG4gICAgfSk7XG5cbiAgICBpZiAob2xkTm9kZSkge1xuICAgICAgY29uc3Qga2VlcFRyZWVCcmFuY2ggPSAob2xkTm9kZSwgbmV3Tm9kZSkgPT4ge1xuICAgICAgICBvbGROb2RlLm9wID0ge3R5cGU6ICdrZWVwJywgaWR4OiBuZXdOb2RlLmlkeH07XG4gICAgICAgIG5ld05vZGUub3AgPSB7dHlwZTogJ2tlZXBfY291bnRlcnBhcnQnLCBjb3VudGVycGFydDogb2xkTm9kZX07XG4gICAgICAgIG9sZE5vZGUgPSBvbGROb2RlLnBhcmVudDtcbiAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50O1xuICAgICAgICBpZiAoIW9sZE5vZGUgfHwgb2xkTm9kZS5vcCB8fCBuZXdOb2RlPy5vcCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBrZWVwVHJlZUJyYW5jaChvbGROb2RlLCBuZXdOb2RlKTtcblxuICAgICAgfVxuICAgICAga2VlcFRyZWVCcmFuY2gob2xkTm9kZSwgbmV3Tm9kZSk7XG4gICAgfVxuICB9KTtcbiAgaWYgKGRlcHRoID4gMSkge1xuICAgIHJldHVybiBsY2JEaWZmKG9sZE5vZGVzLCBuZXdOb2RlcywgZGVwdGggLSAxKTtcbiAgfVxuXG4gIG9sZE5vZGVzLmZvckVhY2goKHgsIGkpID0+IHtcbiAgICBpZiAoIXgub3ApIHtcbiAgICAgIGNvbnN0IGlkeCA9IChvbGROb2Rlc1tpIC0gMV0/Lm9wLmlkeCA/PyAtMSkgKyAxO1xuICAgICAgeC5vcCA9IHt0eXBlOiAnZGVsZXRlJywgaWR4fVxuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0UmVhbFBhcmVudChlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50LnBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50LnBhcmVudC5vcC50eXBlID09PSAna2VlcF9jb3VudGVycGFydCcgPyBlbGVtZW50LnBhcmVudC5vcC5jb3VudGVycGFydCA6IGVsZW1lbnQucGFyZW50O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QmVmb3JlKGVsZW1lbnQsIGlkeCkge1xuICAgIGNvbnN0IHN0YXJ0RGVwdGggPSBlbGVtZW50LmRlcHRoO1xuICAgIHdoaWxlIChpZHggPj0gMCAmJiBlbGVtZW50LmRlcHRoID49IHN0YXJ0RGVwdGgpIHtcbiAgICAgIGlkeCAtPSAxO1xuICAgICAgZWxlbWVudCA9IG5ld05vZGVzW2lkeF07XG4gICAgICBpZiAoZWxlbWVudC5kZXB0aCA9PT0gc3RhcnREZXB0aCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5vcC50eXBlID09PSAna2VlcF9jb3VudGVycGFydCcgPyBlbGVtZW50Lm9wLmNvdW50ZXJwYXJ0IDogZWxlbWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuXG4gIH1cblxuICBuZXdOb2Rlcy5mb3JFYWNoKCh4LCBpKSA9PiB7XG4gICAgeC5nZXRCZWZvcmUgPSAoKSA9PiBnZXRCZWZvcmUoeCwgaSk7XG4gICAgeC5nZXRSZWFsUGFyZW50ID0gKCkgPT4gZ2V0UmVhbFBhcmVudCh4KTtcblxuICAgIGlmICgheC5vcCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0geC5nZXRSZWFsUGFyZW50KCk7XG4gICAgICBjb25zdCB0eXBlID0gdGFyZ2V0Py5vcC50eXBlID09PSAnaW5zZXJ0JyA/ICdpbnNlcnRfaWdub3JlJyA6ICdpbnNlcnQnO1xuICAgICAgeC5vcCA9IHt0eXBlLCB0YXJnZXQsIGFmdGVyOiB4LmdldEJlZm9yZSgpfVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgdGFnZ2VkID0gW1xuICAgIC4uLm9sZE5vZGVzLFxuICAgIC4uLm5ld05vZGVzLFxuICBdO1xuXG5cbiAgcmV0dXJuIHRhZ2dlZC5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgYVZhbCA9IGEub3A/LmlkeCA/PyBhLmlkeDtcbiAgICBjb25zdCBiVmFsID0gYi5vcD8uaWR4ID8/IGIuaWR4O1xuXG4gICAgcmV0dXJuIGFWYWwgLSBiVmFsO1xuICB9KTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRkb21cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGxlYWZDb250cm9sbGVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmVmcmVzaCgkZG9tLCBsZWFmQ29udHJvbGxlciwgcHJvY2VzcyA9IG51bGwpIHtcbiAgaWYgKCFsZWFmQ29udHJvbGxlcikge1xuICAgIGxlYWZDb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigkZG9tKTtcbiAgfVxuXG4gIGlmICghbGVhZkNvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBjb25zdCB7cmVmcmVzaFByb2Nlc3MsIGlzUnVubmluZ1Byb2Nlc3N9ID0gcHJlcGFyZVJlZnJlc2hQcm9jZXNzKHByb2Nlc3MsIGxlYWZDb250cm9sbGVyKTtcblxuICAkZG9tID8/PSBsZWFmQ29udHJvbGxlci4kY29udGFpbmVyO1xuXG4gIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihhcHAudGFnTmFtZXMsICRkb20sIGxlYWZDb250cm9sbGVyLCBwcm9jZXNzKS50aGVuKCgpID0+IHtcbiAgICByZWxvYWRNZXRob2RIVE1MKGxlYWZDb250cm9sbGVyLCAkZG9tLCByZWZyZXNoUHJvY2VzcykudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIWlzUnVubmluZ1Byb2Nlc3MpIHtcbiAgICAgICAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHJlZnJlc2hQcm9jZXNzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9KTtcbn0iXSwibmFtZXMiOlsiY29udHJvbGxlckZhY3RvcnkiLCJwcmVwYXJlUmVmcmVzaFByb2Nlc3MiLCJydW5Db250cm9sRmxvd0Z1bmN0aW9ucyIsInVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaCIsImdldFVybFBhcmFtIiwiYXBwIiwidHJpZ2dlciIsImh0bWxGaWxlcyIsIkRBVEFfQ09OVFJPTExFUl9LRVkiLCJDT05UUk9MTEVSX0NMQVNTIiwiY2xlYW5DYWNoZSIsImZpbmRTZGNUZ3MiLCIkY29udGFpbmVyIiwidGFnTmFtZUxpc3QiLCJwYXJlbnRDb250cm9sbGVyIiwiJGNoaWxkcmVuIiwiY2hpbGRyZW4iLCJlbXB0eUxpc3QiLCJlYWNoIiwiXyIsImVsZW1lbnQiLCIkZWxlbWVudCIsIiQiLCJ0YWdOYW1lIiwicHJvcCIsInRvTG93ZXJDYXNlIiwic3BsaXQiLCJpbkFycmF5IiwicHVzaCIsInRhZyIsInN1cGVyIiwic3BsaWNlIiwiZG9tIiwic3RhcnRzV2l0aCIsImFkZENsYXNzIiwiX3V1aWQiLCJjb25jYXQiLCJyZXBsYWNlUGxhY2Vob2xkZXJDb250cm9sbGVyIiwiY29udHJvbGxlciIsInVybCIsInVybFZhbHVlcyIsImtleV9pZHgiLCJfdXJsUGFyYW1zIiwiaGFzT3duUHJvcGVydHkiLCJrZXkiLCJyZSIsIlJlZ0V4cCIsInJlcGxhY2UiLCJzaGlmdCIsImxvYWRIVE1MRmlsZSIsInBhdGgiLCJhcmdzIiwiaGFyZFJlbG9hZCIsIlByb21pc2UiLCJyZXNvbHZlIiwiVkVSU0lPTiIsIl9tZXRob2QiLCJnZXQiLCJ0aGVuIiwiZGF0YSIsImNhdGNoIiwiZXJyIiwic3RhdHVzIiwicmVzcG9uc2VKU09OIiwiY29udHJvbGxlcl9uYW1lIiwicmVzcG9uc2VUZXh0IiwicmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIiLCJwcm9jZXNzIiwicmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIiLCJ0YWdOYW1lcyIsInBhcnNlQ29udGVudFVybCIsImNvbnRlbnRVcmwiLCJsZW5ndGgiLCJtYXRjaGVzIiwiZXhlYyIsImNvbnRlbnRSZWxvYWQiLCJwYXJhbXMiLCJwYXJzZWRDb250ZW50VXJsIiwiZ2V0Q29udHJvbGxlciIsIiRlbGVtIiwiaGFzQ2xhc3MiLCJjbG9zZXN0IiwibG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIiLCJnZXRFbGVtZW50cyIsImFsbCIsIl90YWdOYW1lIiwicmVzdWx0cyIsImh0bWxGaWxlIiwiYXBwZW5kIiwicmVsb2FkSFRNTENvbnRyb2xsZXIiLCJydW5SZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lciIsInN1cGVyVGFnTmFtZUxpc3QiLCJydW5Db250cm9sbGVyRmlsbENvbnRlbnQiLCIkaHRtbCIsImVtcHR5IiwiYXR0ciIsIm1peGluS2V5IiwiX21peGlucyIsInRhZ0xpc3QiLCJ0YWdEZXNjcmlwdGlvbkVsZW1lbnRzIiwidGFnQ291bnQiLCJlbGVtZW50SW5kZXgiLCJyZWxvYWRNZXRob2RIVE1MIiwiX3JlbG9hZE1ldGhvZEhUTUwiLCIkZG9tIiwicGxpc3QiLCJmaW5kIiwiJHRoaXMiLCJyZXN1bHQiLCJ1bmRlZmluZWQiLCJjb250cm9sbGVyX2hhbmRsZXIiLCJiaW5kIiwieCIsIiRuZXdDb250ZW50IiwiY2xvbmUiLCJyZWNvbmNpbGUiLCJnZXROb2RlS2V5Iiwibm9kZSIsIm5vZGVUeXBlIiwibm9kZVZhbHVlIiwicmVzIiwibm9kZU5hbWUiLCJmb3JFYWNoIiwiZGVmYXVsdFZhbHVlIiwiam9pbiIsInJlY29uY2lsZVRyZWUiLCJpZCIsInBhcmVudCIsIm9iaiIsImRlcHRoIiwiaWR4IiwiZ2V0UmVhbFBhcmVudCIsImdldElkeCIsImluZGV4Iiwib3AiLCJjb250ZW50cyIsInRvQXJyYXkiLCJtYXAiLCJzbGljZSIsImZsYXQiLCIkdmlydHVhbE5vZGUiLCIkcmVhbE5vZGUiLCIkb2xkIiwiJG5ldyIsImkiLCJNYXRoIiwibWF4Iiwib3Bfc3RlcHMiLCJsY2JEaWZmIiwidG9SZW1vdmUiLCJ3aW5kb3ciLCJNQUlOIiwiT1BTIiwib3Bfc3RlcCIsInR5cGUiLCJjSWR4IiwiY291bnRlcnBhcnQiLCJlbGVtQmVmb3JlIiwiZ2V0QmVmb3JlIiwicHJlcGVuZCIsImluc2VydEFmdGVyIiwic3luY0F0dHJpYnV0ZXMiLCJzYWZlUmVtb3ZlIiwiYWZ0ZXIiLCJ0YXJnZXQiLCIkcmVhbCIsIiR2aXJ0dWFsIiwicmVhbEF0dHJzIiwiYXR0cmlidXRlcyIsInZpcnR1YWxBdHRycyIsImlzIiwibmFtZSIsInJlbW92ZUF0dHIiLCJ2YWx1ZSIsInJlbW92ZURhdGEiLCJPYmplY3QiLCJlbnRyaWVzIiwib2xkTm9kZXMiLCJuZXdOb2RlcyIsImZpbHRlciIsIm5ld05vZGUiLCJvbGROb2RlIiwidGVtcE9sZE5vZGUiLCJrZWVwVHJlZUJyYW5jaCIsInN0YXJ0RGVwdGgiLCJ0YWdnZWQiLCJzb3J0IiwiYSIsImIiLCJhVmFsIiwiYlZhbCIsInJlZnJlc2giLCJsZWFmQ29udHJvbGxlciIsInJlZnJlc2hQcm9jZXNzIiwiaXNSdW5uaW5nUHJvY2VzcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_view.js\n");
127
+ 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 = {};\nconst DATA_CONTROLLER_KEY = '_controller_';\nconst CONTROLLER_CLASS = '_sdc_controller_';\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(`_bind_to_update_handler sdc_uuid_${parentController._uuid}`);\n } else {\n emptyList = emptyList.concat(findSdcTgs($element, tagNameList, parentController));\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 url = url.replace(re, \"\" + urlValues.shift());\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 path - a content URL from the controller.\n * @param {object} args - get args.\n * @param tag - a normalized tag-name as string.\n * @param hardReload - true if the file has to be reloaded every time.\n * @returns {Promise<Boolean>} - waits for the file to be loaded.\n */\nfunction loadHTMLFile(path, args, tag, hardReload) {\n if (!path) {\n return Promise.resolve(false);\n } else if (htmlFiles[tag]) {\n return Promise.resolve(htmlFiles[tag]);\n }\n args.VERSION = _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.VERSION;\n args._method = 'content';\n return $.get(path, args).then(function (data) {\n if (!hardReload) {\n htmlFiles[tag] = data;\n }\n return data;\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 }\n (0,_sdc_events_js__WEBPACK_IMPORTED_MODULE_3__.trigger)('navLoaded', {\n 'controller_name': () => err.status\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($container, parentController, process = null) {\n parentController = parentController || $container.data(DATA_CONTROLLER_KEY);\n return replaceTagElementsInContainer(_sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames, $container, parentController, process);\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 {string} - 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 let 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 controller.parsedContentUrl = url;\n return {\n url: url,\n args: params[params.length - 1]\n };\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 = {\n args: {}\n };\n if (controller.contentUrl) {\n getElements = parseContentUrl(controller, controller.contentUrl);\n controller.contentUrl = getElements.url;\n }\n return Promise.all([loadHTMLFile(controller.contentUrl, getElements.args, controller._tagName, controller.contentReload)]).then(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 return null;\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, controller.contentUrl);\n controller.contentUrl = getElements.url;\n return loadHTMLFile(controller.contentUrl, getElements.args, controller._tagName, controller.contentReload);\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($element, tagName, superTagNameList, parentController, process) {\n let controller = $element.data(DATA_CONTROLLER_KEY);\n if (controller) {\n return replaceAllTagElementsInContainer($element, controller, process);\n }\n controller = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.controllerFactory)(parentController, $element, tagName, superTagNameList);\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 return replaceAllTagElementsInContainer(controller.$container, controller, process);\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(tagList, $container, parentController, process) {\n return new Promise(resolve => {\n let tagDescriptionElements = findSdcTgs($container, tagList, parentController);\n let tagCount = tagDescriptionElements.length;\n if (tagCount === 0) {\n return resolve();\n }\n for (let elementIndex = 0; elementIndex < tagDescriptionElements.length; elementIndex++) {\n runReplaceTagElementsInContainer(tagDescriptionElements[elementIndex].dom, tagDescriptionElements[elementIndex].tag, tagDescriptionElements[elementIndex].super, parentController, process).then(() => {\n tagCount--;\n if (tagCount === 0) {\n return resolve();\n }\n });\n }\n });\n}\nfunction reloadMethodHTML(controller, $container, process) {\n return _reloadMethodHTML(controller, $container ?? controller.$container, process);\n}\nfunction _reloadMethodHTML(controller, $dom, process) {\n const plist = [];\n $dom.find(`._bind_to_update_handler.sdc_uuid_${controller._uuid}`).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.toLowerCase().replace(/^this./, '');\n if (controller[controller_handler]) {\n result = controller[controller_handler];\n }\n }\n if (typeof result === 'function') {\n result = result.bind(controller)($this.data());\n }\n if (result !== undefined) {\n plist.push(Promise.resolve(result).then(x => {\n let $newContent = $(`<div></div>`);\n $newContent.append(x);\n if ($this.html() === '') {\n $this.append('<div></div>');\n }\n return _sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.reconcile(controller, $newContent, $this.children(), process);\n }));\n }\n });\n return Promise.all(plist);\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 [['name', ''], ['type', 'text'], ['id', '']].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}\nfunction reconcileTree({\n $element,\n id = [],\n parent = null\n}) {\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 = (this.getRealParent()?.getIdx() ?? -1) + $element.index() + 1;\n return this.idx;\n },\n op: null,\n parent\n };\n obj.getIdx.bind(obj);\n return [obj].concat($element.contents().toArray().map(x => reconcileTree({\n $element: $(x),\n id: id.slice(),\n parent: obj\n })).flat());\n}\nfunction reconcile($virtualNode, $realNode) {\n const $old = reconcileTree({\n $element: $realNode\n });\n const $new = reconcileTree({\n $element: $virtualNode\n });\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 op_steps.forEach((op_step, i) => {\n const {\n op,\n $element,\n idx\n } = op_step;\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 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 toRemove.push($element);\n } else if (op.type === 'delete') {\n $element.safeRemove();\n } else if (op.type === 'insert') {\n const {\n after,\n target\n } = op_step.op;\n if (after) {\n $element.insertAfter(after.$element);\n } else if (target) {\n target.$element.prepend($element);\n }\n }\n });\n toRemove.forEach($element => $element.safeRemove());\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 $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.filter(x => x.depth === depth && !x.op).forEach(newNode => {\n const oldNode = oldNodes.find(tempOldNode => {\n return !tempOldNode.op && tempOldNode.id === newNode.id;\n });\n if (oldNode) {\n const keepTreeBranch = (oldNode, newNode) => {\n oldNode.op = {\n type: 'keep',\n idx: newNode.idx\n };\n newNode.op = {\n type: 'keep_counterpart',\n counterpart: oldNode\n };\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 oldNodes.forEach((x, i) => {\n if (!x.op) {\n const idx = (oldNodes[i - 1]?.op.idx ?? -1) + 1;\n x.op = {\n type: 'delete',\n idx\n };\n }\n });\n function getRealParent(element) {\n if (!element.parent) {\n return null;\n }\n return element.parent.op.type === 'keep_counterpart' ? element.parent.op.counterpart : element.parent;\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' ? element.op.counterpart : element;\n }\n }\n return null;\n }\n newNodes.forEach((x, i) => {\n x.getBefore = () => getBefore(x, i);\n x.getRealParent = () => getRealParent(x);\n if (!x.op) {\n const target = x.getRealParent();\n const type = target?.op.type === 'insert' ? 'insert_ignore' : 'insert';\n x.op = {\n type,\n target,\n after: x.getBefore()\n };\n }\n });\n const tagged = [...oldNodes, ...newNodes];\n return tagged.sort((a, b) => {\n const aVal = a.op?.idx ?? a.idx;\n const bVal = b.op?.idx ?? b.idx;\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 if (!leafController) {\n return Promise.resolve();\n }\n const {\n refreshProcess,\n isRunningProcess\n } = (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.prepareRefreshProcess)(process, leafController);\n $dom ??= leafController.$container;\n return replaceTagElementsInContainer(_sdc_main_js__WEBPACK_IMPORTED_MODULE_2__.app.tagNames, $dom, leafController, process).then(() => {\n reloadMethodHTML(leafController, $dom, refreshProcess).then(() => {\n if (!isRunningProcess) {\n (0,_sdc_controller_js__WEBPACK_IMPORTED_MODULE_0__.updateEventAndTriggerOnRefresh)(refreshProcess);\n }\n });\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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YnBhY2s6Ly9zZGNfY2xpZW50Ly4vc3JjL3NpbXBsZURvbUNvbnRyb2wvc2RjX3ZpZXcuanM/MjRiNSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb250cm9sbGVyRmFjdG9yeSxcbiAgcHJlcGFyZVJlZnJlc2hQcm9jZXNzLFxuICBydW5Db250cm9sRmxvd0Z1bmN0aW9ucyxcbiAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoXG59IGZyb20gXCIuL3NkY19jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQge2dldFVybFBhcmFtfSBmcm9tIFwiLi9zZGNfcGFyYW1zLmpzXCI7XG5pbXBvcnQge2FwcH0gZnJvbSBcIi4vc2RjX21haW4uanNcIjtcbmltcG9ydCB7dHJpZ2dlcn0gZnJvbSBcIi4vc2RjX2V2ZW50cy5qc1wiO1xuXG4vKipcbiAqIExpc3Qgb2YgSFRNTCBmaWxlcy5cbiAqIEB0eXBlIHt7fX1cbiAqL1xubGV0IGh0bWxGaWxlcyA9IHt9O1xuXG5leHBvcnQgY29uc3QgREFUQV9DT05UUk9MTEVSX0tFWSA9ICdfY29udHJvbGxlcl8nO1xuZXhwb3J0IGNvbnN0IENPTlRST0xMRVJfQ0xBU1MgPSAnX3NkY19jb250cm9sbGVyXyc7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuQ2FjaGUoKSB7XG4gIGh0bWxGaWxlcyA9IHt9O1xufVxuXG4vKipcbiAqIGZpbmRTZGNUZ3MgRmluZHMgYWxsIHJlZ2lzdGVyZWQgdGFncyBpbiBhIGNvbnRhaW5lci4gQnV0IGl0IGlnbm9yZXNcbiAqIHJlZ2lzdGVyZWQgdGFncyBpbiByZWdpc3RlcmVkIHRhZ3MuIEl0IGNvbGxlY3RzIGFsbCB0aG9zZVxuICogZG9tcyBhbmQgcmV0dXJucyBhIGxpc3Qgb2Ygb2JqZWN0cyBjb250YWluaW5nIGFsc28gdGhlIHRhZyBuYW1lIHRoZSBkb20gYW5kIHRoZSB0YWdcbiAqIG5hbWVzIG9mIHRoZSBzdXBlciBjb250cm9sbGVyXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRjb250YWluZXIgLSBqUXVlcnkgY29udGFpbmVyXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHRhZ05hbWVMaXN0IC0gYSBzdHJpbmcgbGlzdCB3aXRoIHRhZyBuYW1lcy5cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXIgLSBjb250cm9sbGVyIGluIHN1cnJvdW5kaW5nXG4gKiBAcmV0dXJuIHtBcnJheX0gLSBhIGFycmF5IG9mIG9iamVjdHMgd2l0aCBhbGwgcmVnaXN0ZXIgdGFncyBmb3VuZFxuICovXG5mdW5jdGlvbiBmaW5kU2RjVGdzKCRjb250YWluZXIsIHRhZ05hbWVMaXN0LCBwYXJlbnRDb250cm9sbGVyKSB7XG4gIGlmICghJGNvbnRhaW5lcikge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBsZXQgJGNoaWxkcmVuID0gJGNvbnRhaW5lci5jaGlsZHJlbigpO1xuICBsZXQgZW1wdHlMaXN0ID0gW107XG4gICRjaGlsZHJlbi5lYWNoKGZ1bmN0aW9uIChfLCBlbGVtZW50KSB7XG4gICAgbGV0ICRlbGVtZW50ID0gJChlbGVtZW50KTtcbiAgICBsZXQgdGFnTmFtZSA9ICRlbGVtZW50LnByb3AoJ3RhZ05hbWUnKS50b0xvd2VyQ2FzZSgpLnNwbGl0KCdfJyk7XG4gICAgaWYgKCQuaW5BcnJheSh0YWdOYW1lWzBdLCB0YWdOYW1lTGlzdCkgPj0gMCkge1xuICAgICAgZW1wdHlMaXN0LnB1c2goe1xuICAgICAgICB0YWc6IHRhZ05hbWVbMF0sXG4gICAgICAgIHN1cGVyOiB0YWdOYW1lLnNwbGljZSgxKSB8fCBbXSxcbiAgICAgICAgZG9tOiAkZWxlbWVudFxuICAgICAgfSk7XG5cbiAgICB9IGVsc2UgaWYgKHRhZ05hbWVbMF0uc3RhcnRzV2l0aCgndGhpcy4nKSkge1xuICAgICAgJGVsZW1lbnQuYWRkQ2xhc3MoYF9iaW5kX3RvX3VwZGF0ZV9oYW5kbGVyIHNkY191dWlkXyR7cGFyZW50Q29udHJvbGxlci5fdXVpZH1gKVxuICAgIH0gZWxzZSB7XG4gICAgICBlbXB0eUxpc3QgPSBlbXB0eUxpc3QuY29uY2F0KGZpbmRTZGNUZ3MoJGVsZW1lbnQsIHRhZ05hbWVMaXN0LCBwYXJlbnRDb250cm9sbGVyKSlcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBlbXB0eUxpc3Q7XG59XG5cbi8qKlxuICogcmVwbGFjZVBsYWNlaG9sZGVyQ29udHJvbGxlciBmaWxscyB0aGUgcGFyYW1ldGVyIG9mIHRoZSBjb250ZW50XG4gKiB1cmwgdGhpcyBmdW5jdGlvbiB1c2VzIHRoZSB0YWcgcGFyYW1ldGVyXG4gKlxuICogQHBhcmFtIGNvbnRyb2xsZXIgLSBjb250cm9sbGVyIG9iamVjdFxuICogQHBhcmFtIHVybCAtIHRoZSBvcmlnaW4gY29udGVudCBVUkxcbiAqIEBwYXJhbSB1cmxWYWx1ZXMgLSB2YWx1ZXMgZm9yIHRoZSB1cmwgcGxhY2Vob2xkZXIuIEluIHNhbWUgb3JkZXIhIVxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgY29ycmVjdCBVUkwgd2l0aCBwcmVmaXguXG4gKi9cbmZ1bmN0aW9uIHJlcGxhY2VQbGFjZWhvbGRlckNvbnRyb2xsZXIoY29udHJvbGxlciwgdXJsLCB1cmxWYWx1ZXMpIHtcbiAgZm9yIChsZXQga2V5X2lkeCBpbiBjb250cm9sbGVyLl91cmxQYXJhbXMpIHtcbiAgICBpZiAoY29udHJvbGxlci5fdXJsUGFyYW1zLmhhc093blByb3BlcnR5KGtleV9pZHgpKSB7XG4gICAgICBsZXQga2V5ID0gY29udHJvbGxlci5fdXJsUGFyYW1zW2tleV9pZHhdO1xuICAgICAgbGV0IHJlID0gUmVnRXhwKFwiJVxcXFwoXCIgKyBrZXkgKyBcIlxcXFwpXFxcXHdcIiwgXCJnbVwiKTtcbiAgICAgIHVybCA9IHVybC5yZXBsYWNlKHJlLCBcIlwiICsgdXJsVmFsdWVzLnNoaWZ0KCkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1cmw7XG59XG5cbi8qKlxuICogbG9hZEhUTUxGaWxlIGxvYWRzIHRoZSBIVE1MIGNvbnRlbnQgZmlsZSBmcm9tIHRoZSBzZXJ2ZXIgdmlhIGFqYXggcmVxdWVzdC5cbiAqXG4gKiBJZiB0aGUgSFRNTCBmaWxlIGlzIGxvYWRlZCBhbHJlYWR5IHRoZSBmdW5jdGlvbiB0YWtlcyBubyBhY3Rpb24uXG4gKlxuICogQHBhcmFtIHBhdGggLSBhIGNvbnRlbnQgVVJMIGZyb20gdGhlIGNvbnRyb2xsZXIuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIGdldCBhcmdzLlxuICogQHBhcmFtIHRhZyAtIGEgbm9ybWFsaXplZCB0YWctbmFtZSBhcyBzdHJpbmcuXG4gKiBAcGFyYW0gaGFyZFJlbG9hZCAtIHRydWUgaWYgdGhlIGZpbGUgaGFzIHRvIGJlIHJlbG9hZGVkIGV2ZXJ5IHRpbWUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCb29sZWFuPn0gLSB3YWl0cyBmb3IgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLlxuICovXG5mdW5jdGlvbiBsb2FkSFRNTEZpbGUocGF0aCwgYXJncywgdGFnLCBoYXJkUmVsb2FkKSB7XG4gIGlmICghcGF0aCkge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xuICB9IGVsc2UgaWYgKGh0bWxGaWxlc1t0YWddKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShodG1sRmlsZXNbdGFnXSlcbiAgfVxuXG4gIGFyZ3MuVkVSU0lPTiA9IGFwcC5WRVJTSU9OO1xuICBhcmdzLl9tZXRob2QgPSAnY29udGVudCc7XG5cbiAgcmV0dXJuICQuZ2V0KHBhdGgsIGFyZ3MpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcbiAgICBpZiAoIWhhcmRSZWxvYWQpIHtcbiAgICAgIGh0bWxGaWxlc1t0YWddID0gZGF0YTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0YTtcbiAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgIGlmIChlcnIuc3RhdHVzID09PSAzMDEpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBlcnIucmVzcG9uc2VKU09OO1xuICAgICAgdHJpZ2dlcignX1JlZGlyZWN0T25WaWV3JywgZGF0YVsndXJsLWxpbmsnXSk7XG4gICAgfVxuICAgIHRyaWdnZXIoJ25hdkxvYWRlZCcsIHsnY29udHJvbGxlcl9uYW1lJzogKCkgPT4gZXJyLnN0YXR1c30pO1xuXG4gICAgdGhyb3cgYDxzZGMtZXJyb3IgZGF0YS1jb2RlPVwiJHtlcnIuc3RhdHVzfVwiPiR7ZXJyLnJlc3BvbnNlVGV4dH08L3NkYy1lcnJvcj5gO1xuICB9KTtcbn1cblxuLyoqXG4gKiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lciByZXBsYWNlcyBhbGwgcmVnaXN0ZXJlZCB0YWdzIGJ5IHRoZSBjb250cm9sbGVyLlxuICogSW4gdGhpcyBzdGVwIHRoZSBsaWZlLWN5Y2xlIHN0YXJ0cy5cbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGNvbnRhaW5lciAtIGdpdmVuIGNvbnRhaW5lclxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIHBhcmVudCBjb250b2xsZXIgc3Vycm91bmRlZCB0aGUgY29udGFpbmVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICovXG5mdW5jdGlvbiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcigkY29udGFpbmVyLCBwYXJlbnRDb250cm9sbGVyLCBwcm9jZXNzID0gbnVsbCkge1xuICBwYXJlbnRDb250cm9sbGVyID0gcGFyZW50Q29udHJvbGxlciB8fCAkY29udGFpbmVyLmRhdGEoREFUQV9DT05UUk9MTEVSX0tFWSk7XG4gIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihhcHAudGFnTmFtZXMsICRjb250YWluZXIsIHBhcmVudENvbnRyb2xsZXIsIHByb2Nlc3MpO1xufVxuXG4vKipcbiAqIHBhcnNlQ29udGVudFVybCB1c2VzIHRoZSBjb250ZW50IFVSTCBwcmVmaXggdG8gbWFyZ2UgdGhlXG4gKiBjb3JyZWN0IFVSTC4gQWxzbyBwYXJzZXMgdGhlIHVybCBwYXJhbWV0ZXJcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gY29udHJvbGxlciBvYmplY3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGNvcnJlY3QgVVJMIHdpdGggcHJlZml4LlxuICovXG5mdW5jdGlvbiBwYXJzZUNvbnRlbnRVcmwoY29udHJvbGxlcikge1xuICBsZXQgdXJsID0gY29udHJvbGxlci5jb250ZW50VXJsO1xuICBpZiAoY29udHJvbGxlciAmJiBjb250cm9sbGVyLl91cmxQYXJhbXMubGVuZ3RoID09PSAwKSB7XG4gICAgbGV0IHJlID0gLyVcXCgoW14pXSspXFwpXFx3L2dtO1xuICAgIGxldCBtYXRjaGVzO1xuICAgIGNvbnRyb2xsZXIuX3VybFBhcmFtcyA9IFtdO1xuICAgIHdoaWxlICgobWF0Y2hlcyA9IHJlLmV4ZWModXJsKSkpIHtcbiAgICAgIGNvbnRyb2xsZXIuX3VybFBhcmFtcy5wdXNoKG1hdGNoZXNbMV0pO1xuICAgICAgY29udHJvbGxlci5jb250ZW50UmVsb2FkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBsZXQgcGFyYW1zID0gZ2V0VXJsUGFyYW0oY29udHJvbGxlciwgY29udHJvbGxlci4kY29udGFpbmVyKTtcbiAgaWYgKGNvbnRyb2xsZXIuX3VybFBhcmFtcy5sZW5ndGgpIHtcbiAgICB1cmwgPSByZXBsYWNlUGxhY2Vob2xkZXJDb250cm9sbGVyKGNvbnRyb2xsZXIsIHVybCwgcGFyYW1zKTtcbiAgfVxuXG4gIGNvbnRyb2xsZXIucGFyc2VkQ29udGVudFVybCA9IHVybDtcblxuICByZXR1cm4ge3VybDogdXJsLCBhcmdzOiBwYXJhbXNbcGFyYW1zLmxlbmd0aCAtIDFdfTtcbn1cblxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGVsZW1cbiAqIEByZXR1cm4ge0Fic3RyYWN0U0RDfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29udHJvbGxlcigkZWxlbSkge1xuICBpZiAoJGVsZW0uaGFzQ2xhc3MoQ09OVFJPTExFUl9DTEFTUykpIHtcbiAgICByZXR1cm4gJGVsZW0uZGF0YShgJHtEQVRBX0NPTlRST0xMRVJfS0VZfWApO1xuICB9XG4gIHJldHVybiAkZWxlbS5jbG9zZXN0KGAuJHtDT05UUk9MTEVSX0NMQVNTfWApLmRhdGEoYCR7REFUQV9DT05UUk9MTEVSX0tFWX1gKTtcbn1cblxuLyoqXG4gKiBsb2FkRmlsZXNGcm9tQ29udHJvbGxlciBsb2FkcyB0aGUgY29udGVudCAoSFRNTCkgb2YgYVxuICogQ29udHJvbGxlci4gSWYgeW91IGhhdmUgYW4gYWx0ZXJuYXRpdmUgY29udGVudCBVUkwgaXMgcmVnaXN0ZXJlZCwgZm9yIHRoaXNcbiAqIGNvbnRyb2xsZXIgdGhlIG9yaWdpbiBjb250ZW50IFVSTCBpcyBpZ25vcmVkLlxuICpcbiAqIFRoZSBjb250ZW50IGlzIHNhdmVkIGFzIGpRdWVyeSBvYmplY3QgdG8gdGhlIGNvbnRyb2xsZXIuJGNvbnRlbnQgcHJvcGVydHkgb2ZcbiAqIHRoZSBjb250cm9sbGVyLlxuICpcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGNvbnRyb2xsZXIgLSBhIGluc3RhbmNlIG9mIGEgSmF2YVNjcmlwdCBjb250cm9sbGVyIG9iamVjdC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGpRdWVyeT59IC0gdGhlIHByb21pc2Ugd2FpdHMgdG8gdGhlIGZpbGVzIGFyZSBsb2FkZWQuIGl0IHJldHVybnMgdGhlIGpRdWVyeSBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRmlsZXNGcm9tQ29udHJvbGxlcihjb250cm9sbGVyKSB7XG4gIGxldCBnZXRFbGVtZW50cyA9IHthcmdzOiB7fX07XG4gIGlmIChjb250cm9sbGVyLmNvbnRlbnRVcmwpIHtcbiAgICBnZXRFbGVtZW50cyA9IHBhcnNlQ29udGVudFVybChjb250cm9sbGVyLCBjb250cm9sbGVyLmNvbnRlbnRVcmwpO1xuICAgIGNvbnRyb2xsZXIuY29udGVudFVybCA9IGdldEVsZW1lbnRzLnVybDtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgbG9hZEhUTUxGaWxlKGNvbnRyb2xsZXIuY29udGVudFVybCwgZ2V0RWxlbWVudHMuYXJncywgY29udHJvbGxlci5fdGFnTmFtZSwgY29udHJvbGxlci5jb250ZW50UmVsb2FkKVxuICBdKS50aGVuKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgbGV0IGh0bWxGaWxlID0gcmVzdWx0c1swXTtcbiAgICBpZiAoaHRtbEZpbGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAkKGh0bWxGaWxlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gJCgnPGRpdj48L2Rpdj4nKS5hcHBlbmQoaHRtbEZpbGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9KTtcbn1cblxuLyoqXG4gKiByZWxvYWRIVE1MQ29udHJvbGxlciBsb2FkcyB0aGUgY29udGVudCAoSFRNTCkgb2YgYVxuICogQ29udHJvbGxlci4gSWYgeW91IGhhdmUgYW4gYWx0ZXJuYXRpdmUgY29udGVudCBVUkwgaXMgcmVnaXN0ZXJlZCwgZm9yIHRoaXNcbiAqIGNvbnRyb2xsZXIgdGhlIG9yaWdpbiBjb250ZW50IFVSTCBpcyBpZ25vcmVkLlxuICpcbiAqXG4gKiBAcGFyYW0ge0Fic3RyYWN0U0RDfSBjb250cm9sbGVyIC0gYSBpbnN0YW5jZSBvZiBhIEphdmFTY3JpcHQgY29udHJvbGxlciBvYmplY3QuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8alF1ZXJ5Pn0gLSB0aGUgcHJvbWlzZSB3YWl0cyB0byB0aGUgZmlsZXMgYXJlIGxvYWRlZC4gaXQgcmV0dXJucyB0aGUgalF1ZXJ5IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZEhUTUxDb250cm9sbGVyKGNvbnRyb2xsZXIpIHtcbiAgaWYgKGNvbnRyb2xsZXIuY29udGVudFVybCkge1xuICAgIGxldCBnZXRFbGVtZW50cyA9IHBhcnNlQ29udGVudFVybChjb250cm9sbGVyLCBjb250cm9sbGVyLmNvbnRlbnRVcmwpO1xuICAgIGNvbnRyb2xsZXIuY29udGVudFVybCA9IGdldEVsZW1lbnRzLnVybDtcbiAgICByZXR1cm4gbG9hZEhUTUxGaWxlKGNvbnRyb2xsZXIuY29udGVudFVybCwgZ2V0RWxlbWVudHMuYXJncywgY29udHJvbGxlci5fdGFnTmFtZSwgY29udHJvbGxlci5jb250ZW50UmVsb2FkKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICByZXNvbHZlKCQoKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGVsZW1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdOYW1lXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHN1cGVyVGFnTmFtZUxpc3RcbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IHBhcmVudENvbnRyb2xsZXJcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqL1xuZnVuY3Rpb24gcnVuUmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIoJGVsZW1lbnQsIHRhZ05hbWUsIHN1cGVyVGFnTmFtZUxpc3QsIHBhcmVudENvbnRyb2xsZXIsIHByb2Nlc3MpIHtcbiAgbGV0IGNvbnRyb2xsZXIgPSAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpO1xuICBpZiAoY29udHJvbGxlcikge1xuICAgIHJldHVybiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcigkZWxlbWVudCwgY29udHJvbGxlciwgcHJvY2Vzcyk7XG4gIH1cblxuICBjb250cm9sbGVyID0gY29udHJvbGxlckZhY3RvcnkocGFyZW50Q29udHJvbGxlciwgJGVsZW1lbnQsIHRhZ05hbWUsIHN1cGVyVGFnTmFtZUxpc3QpO1xuICAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVksIGNvbnRyb2xsZXIpO1xuICAkZWxlbWVudC5hZGRDbGFzcyhDT05UUk9MTEVSX0NMQVNTKTtcbiAgcmV0dXJuIHJ1bkNvbnRyb2xGbG93RnVuY3Rpb25zKGNvbnRyb2xsZXIsIHByb2Nlc3MpO1xufVxuXG5cbi8qKlxuICogcnVuQ29udHJvbGxlckZpbGxDb250ZW50IGVtcHRpZXMgdGhlIHJlZ2lzdGVyZWQgdGFnIGFuZCByZXBsYWNlcyBpdCBieSB0aGUgY29udHJvbGxlclxuICogY29udGVudC4gSXQgc2V0cyB0aGUgQ1NTIHRhZ3MgZm9yIHRoZSByZWxhdGlvbiB3aXRoIHRoZSBDU1MgZmlsZXMuXG4gKlxuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gY29udHJvbGxlciAtIGpzIGNvbnRyb2xsZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7anF1ZXJ5fSAkaHRtbCAtIGpRdWVyeSBsb2FkZWQgY29udGVudFxuICogQHBhcmFtIHtPYmplY3R9IHByb2Nlc3MgLSBQcm9jZXNzIG9iamVjdCBjb250YWluaW5nIHRoZSByZWZyZXNoIHByb2Nlc3NcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW5Db250cm9sbGVyRmlsbENvbnRlbnQoY29udHJvbGxlciwgJGh0bWwsIHByb2Nlc3MgPSBudWxsKSB7XG4gIGlmICgkaHRtbCAmJiAkaHRtbC5sZW5ndGggPiAwKSB7XG4gICAgY29udHJvbGxlci4kY29udGFpbmVyLmVtcHR5KCk7XG4gICAgY29udHJvbGxlci4kY29udGFpbmVyLmF0dHIoY29udHJvbGxlci5fdGFnTmFtZSwgJycpO1xuICAgIGZvciAobGV0IG1peGluS2V5IGluIGNvbnRyb2xsZXIuX21peGlucykge1xuICAgICAgY29udHJvbGxlci4kY29udGFpbmVyLmF0dHIoY29udHJvbGxlci5fbWl4aW5zW21peGluS2V5XS5fdGFnTmFtZSwgJycpO1xuICAgIH1cbiAgICBjb250cm9sbGVyLiRjb250YWluZXIuYXBwZW5kKCRodG1sKTtcbiAgfVxuXG4gIHJldHVybiByZXBsYWNlQWxsVGFnRWxlbWVudHNJbkNvbnRhaW5lcihjb250cm9sbGVyLiRjb250YWluZXIsIGNvbnRyb2xsZXIsIHByb2Nlc3MpO1xufVxuXG5cbi8qKlxuICogcmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIgRmluZHMgYWxsIHJlZ2lzdGVyZWQgdGFncyBpbiBhIGNvbnRhaW5lci4gQnV0IGl0IGlnbm9yZXNcbiAqIHJlZ2lzdGVyZWQgdGFncyBpbiByZWdpc3RlcmVkIHRhZ3MuIEZvciBlYWNoIHJlZ2lzdGVyZWQgdGFnIGl0IGxvYWRzIHRoZSBjb250ZW50LlxuICogQWZ0ZXJ3YXJkcyBpdCBzdGFydHMgdGhlIGxpZmUgY3ljbGUgb2YgdGhlIGNvbnRyb2xsZXIuIEkgdGhlIG5leHQgc3RlcCBpdCBzdGFydHMgdGhlXG4gKiBwcm9jZWR1cmUgZm9yIHRoZSBjaGlsZCBlbGVtZW50cyBvZiB0aGUgY29udHJvbGxlciB0YWcuXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSB0YWdMaXN0IC0gbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCB0YWdzXG4gKiBAcGFyYW0ge2pxdWVyeX0gJGNvbnRhaW5lciAtIGpRdWVyeSBjb250YWluZXIgdG8gZmluZCB0aGUgdGFnc1xuICogQHBhcmFtIHtBYnN0cmFjdFNEQ30gcGFyZW50Q29udHJvbGxlciAtIGNvbnRyb2xsZXIgaW4gc3Vycm91bmRpbmdcbiAqIEBwYXJhbSB7T2JqZWN0fSBwcm9jZXNzIC0gUHJvY2VzcyBvYmplY3QgY29udGFpbmluZyB0aGUgcmVmcmVzaCBwcm9jZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcih0YWdMaXN0LCAkY29udGFpbmVyLCBwYXJlbnRDb250cm9sbGVyLCBwcm9jZXNzKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuXG4gICAgbGV0IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMgPSBmaW5kU2RjVGdzKCRjb250YWluZXIsIHRhZ0xpc3QsIHBhcmVudENvbnRyb2xsZXIpO1xuICAgIGxldCB0YWdDb3VudCA9IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMubGVuZ3RoO1xuXG4gICAgaWYgKHRhZ0NvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGZvciAobGV0IGVsZW1lbnRJbmRleCA9IDA7IGVsZW1lbnRJbmRleCA8IHRhZ0Rlc2NyaXB0aW9uRWxlbWVudHMubGVuZ3RoOyBlbGVtZW50SW5kZXgrKykge1xuICAgICAgcnVuUmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIodGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLmRvbSxcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLnRhZyxcbiAgICAgICAgdGFnRGVzY3JpcHRpb25FbGVtZW50c1tlbGVtZW50SW5kZXhdLnN1cGVyLFxuICAgICAgICBwYXJlbnRDb250cm9sbGVyLCBwcm9jZXNzKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGFnQ291bnQtLTtcbiAgICAgICAgaWYgKHRhZ0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbG9hZE1ldGhvZEhUTUwoY29udHJvbGxlciwgJGNvbnRhaW5lciwgcHJvY2Vzcykge1xuICByZXR1cm4gX3JlbG9hZE1ldGhvZEhUTUwoY29udHJvbGxlciwgJGNvbnRhaW5lciA/PyBjb250cm9sbGVyLiRjb250YWluZXIsIHByb2Nlc3MpXG59XG5cbmZ1bmN0aW9uIF9yZWxvYWRNZXRob2RIVE1MKGNvbnRyb2xsZXIsICRkb20sIHByb2Nlc3MpIHtcbiAgY29uc3QgcGxpc3QgPSBbXTtcblxuICAkZG9tLmZpbmQoYC5fYmluZF90b191cGRhdGVfaGFuZGxlci5zZGNfdXVpZF8ke2NvbnRyb2xsZXIuX3V1aWR9YCkuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgJHRoaXMgPSAkKHRoaXMpO1xuICAgIGxldCByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKCR0aGlzLmhhc0NsYXNzKGBfd2l0aF9oYW5kbGVyYCkpIHtcbiAgICAgIHJlc3VsdCA9ICR0aGlzLmRhdGEoJ2hhbmRsZXInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGNvbnRyb2xsZXJfaGFuZGxlciA9IHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL150aGlzLi8sICcnKTtcbiAgICAgIGlmIChjb250cm9sbGVyW2NvbnRyb2xsZXJfaGFuZGxlcl0pIHtcbiAgICAgICAgcmVzdWx0ID0gY29udHJvbGxlcltjb250cm9sbGVyX2hhbmRsZXJdO1xuICAgICAgfVxuICAgIH1cblxuXG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5iaW5kKGNvbnRyb2xsZXIpKCR0aGlzLmRhdGEoKSk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGxpc3QucHVzaChQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKCh4KSA9PiB7XG4gICAgICAgIGxldCAkbmV3Q29udGVudCA9ICQoYDxkaXY+PC9kaXY+YCk7XG4gICAgICAgICRuZXdDb250ZW50LmFwcGVuZCh4KTtcblxuICAgICAgICBpZiAoJHRoaXMuaHRtbCgpID09PSAnJykge1xuICAgICAgICAgICR0aGlzLmFwcGVuZCgnPGRpdj48L2Rpdj4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhcHAucmVjb25jaWxlKGNvbnRyb2xsZXIsICRuZXdDb250ZW50LCAkdGhpcy5jaGlsZHJlbigpLCBwcm9jZXNzKTtcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgfSk7XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKHBsaXN0KTtcbn1cblxuXG5mdW5jdGlvbiBnZXROb2RlS2V5KG5vZGUpIHtcbiAgaWYgKG5vZGVbMF0ubm9kZVR5cGUgPT09IDMpIHtcbiAgICByZXR1cm4gYFRFWFRfXyR7bm9kZVswXS5ub2RlVmFsdWV9YDtcbiAgfVxuICBjb25zdCByZXMgPSBbbm9kZVswXS50YWdOYW1lXTtcbiAgaWYgKG5vZGVbMF0ubm9kZU5hbWUgPT09ICdJTlBVVCcpIHtcbiAgICBbWyduYW1lJywgJyddLCBbJ3R5cGUnLCAndGV4dCddLCBbJ2lkJywgJyddXS5mb3JFYWNoKChba2V5LCBkZWZhdWx0VmFsdWVdKSA9PiB7XG4gICAgICBjb25zdCBhdHRyID0gbm9kZS5hdHRyKGtleSkgPz8gZGVmYXVsdFZhbHVlO1xuICAgICAgaWYgKGF0dHIpIHtcbiAgICAgICAgcmVzLnB1c2goYXR0cik7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJlcy5qb2luKCdfXycpO1xufVxuXG5mdW5jdGlvbiByZWNvbmNpbGVUcmVlKHskZWxlbWVudCwgaWQgPSBbXSwgcGFyZW50ID0gbnVsbH0pIHtcbiAgaWQucHVzaChnZXROb2RlS2V5KCRlbGVtZW50KSk7XG4gIGNvbnN0IG9iaiA9IHtcbiAgICAkZWxlbWVudCxcbiAgICBpZDogaWQuam9pbignOjonKSxcbiAgICBkZXB0aDogaWQubGVuZ3RoLFxuICAgIGlkeDogMCxcbiAgICBnZXRSZWFsUGFyZW50OiAoKSA9PiBwYXJlbnQsXG4gICAgZ2V0SWR4OiBmdW5jdGlvbiAoKSB7XG4gICAgICB0aGlzLmlkeCA9ICh0aGlzLmdldFJlYWxQYXJlbnQoKT8uZ2V0SWR4KCkgPz8gLTEpICsgJGVsZW1lbnQuaW5kZXgoKSArIDE7XG4gICAgICByZXR1cm4gdGhpcy5pZHg7XG4gICAgfSxcbiAgICBvcDogbnVsbCxcbiAgICBwYXJlbnRcbiAgfTtcbiAgb2JqLmdldElkeC5iaW5kKG9iaik7XG4gIHJldHVybiBbb2JqXS5jb25jYXQoJGVsZW1lbnQuY29udGVudHMoKS50b0FycmF5KCkubWFwKCh4KSA9PiByZWNvbmNpbGVUcmVlKHtcbiAgICAkZWxlbWVudDogJCh4KSxcbiAgICBpZDogaWQuc2xpY2UoKSxcbiAgICBwYXJlbnQ6IG9ialxuICB9KSkuZmxhdCgpKTtcblxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiByZWNvbmNpbGUoJHZpcnR1YWxOb2RlLCAkcmVhbE5vZGUpIHtcblxuICBjb25zdCAkb2xkID0gcmVjb25jaWxlVHJlZSh7JGVsZW1lbnQ6ICRyZWFsTm9kZX0pO1xuICBjb25zdCAkbmV3ID0gcmVjb25jaWxlVHJlZSh7JGVsZW1lbnQ6ICR2aXJ0dWFsTm9kZX0pO1xuICAkb2xkLm1hcCgoeCwgaSkgPT4geC5pZHggPSBpKTtcbiAgJG5ldy5tYXAoKHgsIGkpID0+IHguaWR4ID0gaSk7XG4gIGNvbnN0IGRlcHRoID0gTWF0aC5tYXgoLi4uJG5ldy5jb25jYXQoJG9sZCkubWFwKHggPT4geC5kZXB0aCkpO1xuICBjb25zdCBvcF9zdGVwcyA9IGxjYkRpZmYoJG9sZCwgJG5ldywgZGVwdGgpO1xuICBsZXQgdG9SZW1vdmUgPSBbXTtcbiAgd2luZG93Lk1BSU4gPSAkcmVhbE5vZGU7XG4gIHdpbmRvdy5PUFMgPSBvcF9zdGVwcztcblxuICBvcF9zdGVwcy5mb3JFYWNoKChvcF9zdGVwLCBpKSA9PiB7XG4gICAgY29uc3Qge29wLCAkZWxlbWVudCwgaWR4fSA9IG9wX3N0ZXA7XG5cbiAgICBpZiAob3AudHlwZSA9PT0gJ2tlZXBfY291bnRlcnBhcnQnKSB7XG4gICAgICBsZXQgY0lkeCA9IG9wLmNvdW50ZXJwYXJ0LmdldElkeCgpO1xuICAgICAgaWYgKGNJZHggIT09IGlkeCkge1xuICAgICAgICBjb25zdCBlbGVtQmVmb3JlID0gb3Bfc3RlcC5nZXRCZWZvcmUoKTtcbiAgICAgICAgaWYgKCFlbGVtQmVmb3JlKSB7XG4gICAgICAgICAgb3Bfc3RlcC5nZXRSZWFsUGFyZW50KCkuJGVsZW1lbnQucHJlcGVuZChvcC5jb3VudGVycGFydC4kZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3AuY291bnRlcnBhcnQuJGVsZW1lbnQuaW5zZXJ0QWZ0ZXIoZWxlbUJlZm9yZS4kZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc3luY0F0dHJpYnV0ZXMob3AuY291bnRlcnBhcnQuJGVsZW1lbnQsICRlbGVtZW50KTtcbiAgICAgIGlmICgkZWxlbWVudC5oYXNDbGFzcyhDT05UUk9MTEVSX0NMQVNTKSkge1xuICAgICAgICAkZWxlbWVudC5kYXRhKERBVEFfQ09OVFJPTExFUl9LRVkpLiRjb250YWluZXIgPSBvcC5jb3VudGVycGFydC4kZWxlbWVudDtcbiAgICAgICAgJGVsZW1lbnQuZGF0YShEQVRBX0NPTlRST0xMRVJfS0VZLCBudWxsKTtcbiAgICAgIH1cblxuICAgICAgdG9SZW1vdmUucHVzaCgkZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChvcC50eXBlID09PSAnZGVsZXRlJykge1xuICAgICAgJGVsZW1lbnQuc2FmZVJlbW92ZSgpO1xuICAgIH0gZWxzZSBpZiAob3AudHlwZSA9PT0gJ2luc2VydCcpIHtcbiAgICAgIGNvbnN0IHthZnRlciwgdGFyZ2V0fSA9IG9wX3N0ZXAub3A7XG4gICAgICBpZiAoYWZ0ZXIpIHtcbiAgICAgICAgJGVsZW1lbnQuaW5zZXJ0QWZ0ZXIoYWZ0ZXIuJGVsZW1lbnQpO1xuICAgICAgfSBlbHNlIGlmICh0YXJnZXQpIHtcbiAgICAgICAgdGFyZ2V0LiRlbGVtZW50LnByZXBlbmQoJGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgfVxuICB9KTtcblxuICB0b1JlbW92ZS5mb3JFYWNoKCgkZWxlbWVudCkgPT4gJGVsZW1lbnQuc2FmZVJlbW92ZSgpKTtcbn1cblxuZnVuY3Rpb24gc3luY0F0dHJpYnV0ZXMoJHJlYWwsICR2aXJ0dWFsKSB7XG4gIGNvbnN0IHJlYWxBdHRycyA9ICRyZWFsWzBdLmF0dHJpYnV0ZXMgPz8gW107XG4gIGNvbnN0IHZpcnR1YWxBdHRycyA9ICR2aXJ0dWFsWzBdLmF0dHJpYnV0ZXMgPz8gW107XG4gIC8vIFJlbW92ZSBtaXNzaW5nIGF0dHJzXG4gIFsuLi5yZWFsQXR0cnNdLmZvckVhY2goYXR0ciA9PiB7XG4gICAgaWYgKCEkdmlydHVhbC5pcyhgWyR7YXR0ci5uYW1lfV1gKSkge1xuICAgICAgJHJlYWwucmVtb3ZlQXR0cihhdHRyLm5hbWUpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWRkIG9yIHVwZGF0ZVxuICBbLi4udmlydHVhbEF0dHJzXS5mb3JFYWNoKGF0dHIgPT4ge1xuICAgIGlmICghYXR0ci5uYW1lLnN0YXJ0c1dpdGgoYGRhdGFgKSAmJiAkcmVhbC5hdHRyKGF0dHIubmFtZSkgIT09IGF0dHIudmFsdWUpIHtcbiAgICAgICRyZWFsLmF0dHIoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKTtcbiAgICB9XG4gIH0pO1xuXG4gICRyZWFsLnJlbW92ZURhdGEoKTtcbiAgT2JqZWN0LmVudHJpZXMoJHZpcnR1YWwuZGF0YSgpKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAkcmVhbC5kYXRhKGtleSwgdmFsdWUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBMQ0IgKExvbmdlc3QgQ29tbW9uIEJyYW5jaCkgZmluZHMgbWF0Y2hpbmcgYnJhbmNoZXMgYW5kIHJlc2VydmVzIHRoZW0hXG4gKlxuICogQHBhcmFtIG9sZE5vZGVzXG4gKiBAcGFyYW0gbmV3Tm9kZXNcbiAqIEBwYXJhbSBkZXB0aFxuICogQHJldHVybnMgeyp8KltdfVxuICovXG5mdW5jdGlvbiBsY2JEaWZmKG9sZE5vZGVzLCBuZXdOb2RlcywgZGVwdGgpIHtcbiAgbmV3Tm9kZXMuZmlsdGVyKHggPT4geC5kZXB0aCA9PT0gZGVwdGggJiYgIXgub3ApLmZvckVhY2goKG5ld05vZGUpID0+IHtcbiAgICBjb25zdCBvbGROb2RlID0gb2xkTm9kZXMuZmluZCgodGVtcE9sZE5vZGUpID0+IHtcbiAgICAgIHJldHVybiAhdGVtcE9sZE5vZGUub3AgJiYgdGVtcE9sZE5vZGUuaWQgPT09IG5ld05vZGUuaWQ7XG4gICAgfSk7XG5cbiAgICBpZiAob2xkTm9kZSkge1xuICAgICAgY29uc3Qga2VlcFRyZWVCcmFuY2ggPSAob2xkTm9kZSwgbmV3Tm9kZSkgPT4ge1xuICAgICAgICBvbGROb2RlLm9wID0ge3R5cGU6ICdrZWVwJywgaWR4OiBuZXdOb2RlLmlkeH07XG4gICAgICAgIG5ld05vZGUub3AgPSB7dHlwZTogJ2tlZXBfY291bnRlcnBhcnQnLCBjb3VudGVycGFydDogb2xkTm9kZX07XG4gICAgICAgIG9sZE5vZGUgPSBvbGROb2RlLnBhcmVudDtcbiAgICAgICAgbmV3Tm9kZSA9IG5ld05vZGUucGFyZW50O1xuICAgICAgICBpZiAoIW9sZE5vZGUgfHwgb2xkTm9kZS5vcCB8fCBuZXdOb2RlPy5vcCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBrZWVwVHJlZUJyYW5jaChvbGROb2RlLCBuZXdOb2RlKTtcblxuICAgICAgfVxuICAgICAga2VlcFRyZWVCcmFuY2gob2xkTm9kZSwgbmV3Tm9kZSk7XG4gICAgfVxuICB9KTtcbiAgaWYgKGRlcHRoID4gMSkge1xuICAgIHJldHVybiBsY2JEaWZmKG9sZE5vZGVzLCBuZXdOb2RlcywgZGVwdGggLSAxKTtcbiAgfVxuXG4gIG9sZE5vZGVzLmZvckVhY2goKHgsIGkpID0+IHtcbiAgICBpZiAoIXgub3ApIHtcbiAgICAgIGNvbnN0IGlkeCA9IChvbGROb2Rlc1tpIC0gMV0/Lm9wLmlkeCA/PyAtMSkgKyAxO1xuICAgICAgeC5vcCA9IHt0eXBlOiAnZGVsZXRlJywgaWR4fVxuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0UmVhbFBhcmVudChlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50LnBhcmVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbGVtZW50LnBhcmVudC5vcC50eXBlID09PSAna2VlcF9jb3VudGVycGFydCcgPyBlbGVtZW50LnBhcmVudC5vcC5jb3VudGVycGFydCA6IGVsZW1lbnQucGFyZW50O1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QmVmb3JlKGVsZW1lbnQsIGlkeCkge1xuICAgIGNvbnN0IHN0YXJ0RGVwdGggPSBlbGVtZW50LmRlcHRoO1xuICAgIHdoaWxlIChpZHggPj0gMSAmJiBlbGVtZW50LmRlcHRoID49IHN0YXJ0RGVwdGgpIHtcbiAgICAgIGlkeCAtPSAxO1xuICAgICAgZWxlbWVudCA9IG5ld05vZGVzW2lkeF07XG4gICAgICBpZiAoZWxlbWVudC5kZXB0aCA9PT0gc3RhcnREZXB0aCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5vcC50eXBlID09PSAna2VlcF9jb3VudGVycGFydCcgPyBlbGVtZW50Lm9wLmNvdW50ZXJwYXJ0IDogZWxlbWVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbFxuXG4gIH1cblxuICBuZXdOb2Rlcy5mb3JFYWNoKCh4LCBpKSA9PiB7XG4gICAgeC5nZXRCZWZvcmUgPSAoKSA9PiBnZXRCZWZvcmUoeCwgaSk7XG4gICAgeC5nZXRSZWFsUGFyZW50ID0gKCkgPT4gZ2V0UmVhbFBhcmVudCh4KTtcblxuICAgIGlmICgheC5vcCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0geC5nZXRSZWFsUGFyZW50KCk7XG4gICAgICBjb25zdCB0eXBlID0gdGFyZ2V0Py5vcC50eXBlID09PSAnaW5zZXJ0JyA/ICdpbnNlcnRfaWdub3JlJyA6ICdpbnNlcnQnO1xuICAgICAgeC5vcCA9IHt0eXBlLCB0YXJnZXQsIGFmdGVyOiB4LmdldEJlZm9yZSgpfVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgdGFnZ2VkID0gW1xuICAgIC4uLm9sZE5vZGVzLFxuICAgIC4uLm5ld05vZGVzLFxuICBdO1xuXG5cbiAgcmV0dXJuIHRhZ2dlZC5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3QgYVZhbCA9IGEub3A/LmlkeCA/PyBhLmlkeDtcbiAgICBjb25zdCBiVmFsID0gYi5vcD8uaWR4ID8/IGIuaWR4O1xuXG4gICAgcmV0dXJuIGFWYWwgLSBiVmFsO1xuICB9KTtcbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHtqcXVlcnl9ICRkb21cbiAqIEBwYXJhbSB7QWJzdHJhY3RTREN9IGxlYWZDb250cm9sbGVyXG4gKiBAcGFyYW0ge09iamVjdH0gcHJvY2VzcyAtIFByb2Nlc3Mgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlZnJlc2ggcHJvY2Vzc1xuICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gcmVmcmVzaCgkZG9tLCBsZWFmQ29udHJvbGxlciwgcHJvY2VzcyA9IG51bGwpIHtcbiAgaWYgKCFsZWFmQ29udHJvbGxlcikge1xuICAgIGxlYWZDb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigkZG9tKTtcbiAgfVxuXG4gIGlmICghbGVhZkNvbnRyb2xsZXIpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBjb25zdCB7cmVmcmVzaFByb2Nlc3MsIGlzUnVubmluZ1Byb2Nlc3N9ID0gcHJlcGFyZVJlZnJlc2hQcm9jZXNzKHByb2Nlc3MsIGxlYWZDb250cm9sbGVyKTtcblxuICAkZG9tID8/PSBsZWFmQ29udHJvbGxlci4kY29udGFpbmVyO1xuXG4gIHJldHVybiByZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lcihhcHAudGFnTmFtZXMsICRkb20sIGxlYWZDb250cm9sbGVyLCBwcm9jZXNzKS50aGVuKCgpID0+IHtcbiAgICByZWxvYWRNZXRob2RIVE1MKGxlYWZDb250cm9sbGVyLCAkZG9tLCByZWZyZXNoUHJvY2VzcykudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIWlzUnVubmluZ1Byb2Nlc3MpIHtcbiAgICAgICAgdXBkYXRlRXZlbnRBbmRUcmlnZ2VyT25SZWZyZXNoKHJlZnJlc2hQcm9jZXNzKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9KTtcbn0iXSwibmFtZXMiOlsiY29udHJvbGxlckZhY3RvcnkiLCJwcmVwYXJlUmVmcmVzaFByb2Nlc3MiLCJydW5Db250cm9sRmxvd0Z1bmN0aW9ucyIsInVwZGF0ZUV2ZW50QW5kVHJpZ2dlck9uUmVmcmVzaCIsImdldFVybFBhcmFtIiwiYXBwIiwidHJpZ2dlciIsImh0bWxGaWxlcyIsIkRBVEFfQ09OVFJPTExFUl9LRVkiLCJDT05UUk9MTEVSX0NMQVNTIiwiY2xlYW5DYWNoZSIsImZpbmRTZGNUZ3MiLCIkY29udGFpbmVyIiwidGFnTmFtZUxpc3QiLCJwYXJlbnRDb250cm9sbGVyIiwiJGNoaWxkcmVuIiwiY2hpbGRyZW4iLCJlbXB0eUxpc3QiLCJlYWNoIiwiXyIsImVsZW1lbnQiLCIkZWxlbWVudCIsIiQiLCJ0YWdOYW1lIiwicHJvcCIsInRvTG93ZXJDYXNlIiwic3BsaXQiLCJpbkFycmF5IiwicHVzaCIsInRhZyIsInN1cGVyIiwic3BsaWNlIiwiZG9tIiwic3RhcnRzV2l0aCIsImFkZENsYXNzIiwiX3V1aWQiLCJjb25jYXQiLCJyZXBsYWNlUGxhY2Vob2xkZXJDb250cm9sbGVyIiwiY29udHJvbGxlciIsInVybCIsInVybFZhbHVlcyIsImtleV9pZHgiLCJfdXJsUGFyYW1zIiwiaGFzT3duUHJvcGVydHkiLCJrZXkiLCJyZSIsIlJlZ0V4cCIsInJlcGxhY2UiLCJzaGlmdCIsImxvYWRIVE1MRmlsZSIsInBhdGgiLCJhcmdzIiwiaGFyZFJlbG9hZCIsIlByb21pc2UiLCJyZXNvbHZlIiwiVkVSU0lPTiIsIl9tZXRob2QiLCJnZXQiLCJ0aGVuIiwiZGF0YSIsImNhdGNoIiwiZXJyIiwic3RhdHVzIiwicmVzcG9uc2VKU09OIiwiY29udHJvbGxlcl9uYW1lIiwicmVzcG9uc2VUZXh0IiwicmVwbGFjZUFsbFRhZ0VsZW1lbnRzSW5Db250YWluZXIiLCJwcm9jZXNzIiwicmVwbGFjZVRhZ0VsZW1lbnRzSW5Db250YWluZXIiLCJ0YWdOYW1lcyIsInBhcnNlQ29udGVudFVybCIsImNvbnRlbnRVcmwiLCJsZW5ndGgiLCJtYXRjaGVzIiwiZXhlYyIsImNvbnRlbnRSZWxvYWQiLCJwYXJhbXMiLCJwYXJzZWRDb250ZW50VXJsIiwiZ2V0Q29udHJvbGxlciIsIiRlbGVtIiwiaGFzQ2xhc3MiLCJjbG9zZXN0IiwibG9hZEZpbGVzRnJvbUNvbnRyb2xsZXIiLCJnZXRFbGVtZW50cyIsImFsbCIsIl90YWdOYW1lIiwicmVzdWx0cyIsImh0bWxGaWxlIiwiYXBwZW5kIiwicmVsb2FkSFRNTENvbnRyb2xsZXIiLCJydW5SZXBsYWNlVGFnRWxlbWVudHNJbkNvbnRhaW5lciIsInN1cGVyVGFnTmFtZUxpc3QiLCJydW5Db250cm9sbGVyRmlsbENvbnRlbnQiLCIkaHRtbCIsImVtcHR5IiwiYXR0ciIsIm1peGluS2V5IiwiX21peGlucyIsInRhZ0xpc3QiLCJ0YWdEZXNjcmlwdGlvbkVsZW1lbnRzIiwidGFnQ291bnQiLCJlbGVtZW50SW5kZXgiLCJyZWxvYWRNZXRob2RIVE1MIiwiX3JlbG9hZE1ldGhvZEhUTUwiLCIkZG9tIiwicGxpc3QiLCJmaW5kIiwiJHRoaXMiLCJyZXN1bHQiLCJ1bmRlZmluZWQiLCJjb250cm9sbGVyX2hhbmRsZXIiLCJiaW5kIiwieCIsIiRuZXdDb250ZW50IiwiaHRtbCIsInJlY29uY2lsZSIsImdldE5vZGVLZXkiLCJub2RlIiwibm9kZVR5cGUiLCJub2RlVmFsdWUiLCJyZXMiLCJub2RlTmFtZSIsImZvckVhY2giLCJkZWZhdWx0VmFsdWUiLCJqb2luIiwicmVjb25jaWxlVHJlZSIsImlkIiwicGFyZW50Iiwib2JqIiwiZGVwdGgiLCJpZHgiLCJnZXRSZWFsUGFyZW50IiwiZ2V0SWR4IiwiaW5kZXgiLCJvcCIsImNvbnRlbnRzIiwidG9BcnJheSIsIm1hcCIsInNsaWNlIiwiZmxhdCIsIiR2aXJ0dWFsTm9kZSIsIiRyZWFsTm9kZSIsIiRvbGQiLCIkbmV3IiwiaSIsIk1hdGgiLCJtYXgiLCJvcF9zdGVwcyIsImxjYkRpZmYiLCJ0b1JlbW92ZSIsIndpbmRvdyIsIk1BSU4iLCJPUFMiLCJvcF9zdGVwIiwidHlwZSIsImNJZHgiLCJjb3VudGVycGFydCIsImVsZW1CZWZvcmUiLCJnZXRCZWZvcmUiLCJwcmVwZW5kIiwiaW5zZXJ0QWZ0ZXIiLCJzeW5jQXR0cmlidXRlcyIsInNhZmVSZW1vdmUiLCJhZnRlciIsInRhcmdldCIsIiRyZWFsIiwiJHZpcnR1YWwiLCJyZWFsQXR0cnMiLCJhdHRyaWJ1dGVzIiwidmlydHVhbEF0dHJzIiwiaXMiLCJuYW1lIiwicmVtb3ZlQXR0ciIsInZhbHVlIiwicmVtb3ZlRGF0YSIsIk9iamVjdCIsImVudHJpZXMiLCJvbGROb2RlcyIsIm5ld05vZGVzIiwiZmlsdGVyIiwibmV3Tm9kZSIsIm9sZE5vZGUiLCJ0ZW1wT2xkTm9kZSIsImtlZXBUcmVlQnJhbmNoIiwic3RhcnREZXB0aCIsInRhZ2dlZCIsInNvcnQiLCJhIiwiYiIsImFWYWwiLCJiVmFsIiwicmVmcmVzaCIsImxlYWZDb250cm9sbGVyIiwicmVmcmVzaFByb2Nlc3MiLCJpc1J1bm5pbmdQcm9jZXNzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/simpleDomControl/sdc_view.js\n");
128
128
 
129
129
  /***/ })
130
130
 
@@ -1 +1 @@
1
- var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};let n;e.d(t,{n$:()=>ue,du:()=>I,yA:()=>pe,g3:()=>d,u2:()=>p,n9:()=>N,on:()=>F,yy:()=>E,R6:()=>f,$n:()=>A,hA:()=>me,VB:()=>ge,hZ:()=>T});const r=/([^\s,]+)/g,o=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;function s(){return new Promise((function(e){e()}))}function i(e){return(e=(e=e.replace(/[A-Z]/g,(e=>`-${e.toLowerCase()}`))).replace(/[0-9]+/g,(e=>`-${e}`))).replace(/^[-]/g,"")}function l(e){return e.replace(/-./g,(e=>`${e[1].toUpperCase()}`))}const a=(e,t)=>{let n=t,r=Object.getOwnPropertyNames(e.prototype).concat(Object.getOwnPropertySymbols(e.prototype));for(;""!==n.name;)Object.getOwnPropertyNames(n.prototype).concat(Object.getOwnPropertySymbols(n.prototype)).forEach((t=>{t.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)||r.includes(t)||(r.push(t),Object.defineProperty(e.prototype,t,Object.getOwnPropertyDescriptor(n.prototype,t)))})),n=Object.getPrototypeOf(n)};function c(e,t,n){return $.ajax({url:t,type:n||"POST",xhr:function(){var e=$.ajaxSettings.xhr();return e.upload&&e.upload.addEventListener("progress",u,!1),e},data:e,cache:!1,contentType:!1,processData:!1,beforeSend:function(e,t){(function(e){return/^(GET|HEAD|OPTIONS|TRACE)$/.test(e)})(t.type)||this.crossDomain||e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}})}function u(e){if(e.lengthComputable){var t=Math.round(e.loaded/e.total*100),n=$(".progress-container");100===t?n.hide():n.show(),t+="%",n.find(".progress-bar").css({width:t}).text(t)}}function d(e,t=null){return"string"!=typeof e?e:t&&void 0!==t[e]?"function"==typeof t[e]?t[e].bind(t):t[e]:e.match(/^(true|false)$/)?"true"===e:"undefined"!==e?"none"===e.toLowerCase()?null:e.match(/^-?\d+$/)?parseInt(e):e.match(/^-?\d+\.?\d+$/)?parseFloat(e):e.match(/^(['][^']*['])|(["][^"]*["])$/)?e.substr(1,e.length-2):e:void 0}function h(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)))}function p(e){e.find(".has-error").removeClass("has-error").find(".alert-danger").remove(),e.find(".non-field-errors").remove()}function f(e,t){t=$("<div>").append(t),e.find(".has-error").removeClass("has-error").find(".alert-danger").safeRemove(),e.find(".non-field-errors").safeRemove();let n=t.find("input[type=file]").parent();e.find("input[type=file]").parent().each((function(e){$(this).replaceWith(n[e])}));let r=0===t.find(".non-field-errors").insertAfter(e.find(".hidden-form-fields")).length;return t.find(".has-error").each((function(){r=!1;let t=$(this),n=t.data("auto-id"),o=e.find(".form-group."+n);o.addClass("has-error"),o.find(".form-input-container").append(t.find(".alert-danger"))})),r}function m(e,t,n=null){let r=function(e,t){let n;e||(e=[]);let r=t.data(),o={};for(let t in r)r.hasOwnProperty(t)&&t!==M&&!e.includes(t)&&(o[t]=r[t]);n=[];for(let t=0;t<e.length;t++){let o=e[t];r.hasOwnProperty(o)?n.push(r[o]):n.push("undefined")}return n.push(o),n}(e,t);return function(e,t=null){let n=[];for(let r=0;r<e.length;r++){let o=d(e[r],t);n.push(o)}return n}(r,n)}function g(e,t,n){if(!e)return!1;if("function"!=typeof e.onInit)return!1;let s;var i;"function"==typeof e._on_init_params?s=e._on_init_params():s=(i=e.onInit.toString().replace(o,"")).slice(i.indexOf("(")+1,i.indexOf(")")).match(r)||[];let l=m(s,t,n._parentController);if(e.onInit.apply(n,l),n===e)for(let r in e._mixins)g(e._mixins[r],t,n)}const y=["onbeforeunload","onunload"],v=Object.keys(window).filter((e=>/^on/.test(e)&&!y.includes(e))).map((e=>e.slice(2)));function w(e){let t=e.type;e.hasOwnProperty("namespace")&&e.namespace&&e.namespace.length&&(t+=`.${e.namespace}`);let n=$(e.target),r=null,o=!1,s=!1;for(e.stopImmediatePropagation=()=>s=!0,e.stopPropagation=()=>s=o=!0;n.length;){let i=n.attr(`sdc_${t}`);if(i){if(!r&&(r=B(n),!r))return;for(;r;){if(i.split(" ").forEach((s=>{if(o)return;let i=null;if("function"==typeof s)i=s;else if("function"==typeof r[s])i=r[s];else if("string"==typeof s&&s.startsWith("this.event_")){if(i=r.getEvents()[t],!i)return;if(i=i[s.slice(11)],!i)return}i&&i.call(r,n,e)})),s)return;r=r._parentController}}if(o)return;n=n.parent()}return{res:!0}}function C(e){if(e._isEventsSet)return;const t=e.getEvents();for(let n in t)if(t.hasOwnProperty(n)){let r=t[n];for(let t in r)r.hasOwnProperty(t)&&e.find(t).each((function(){let e=$(this),r=e.attr(`sdc_${n}`)||null;r=r?r.split(" "):[];const o=`this.event_${t}`;-1===r.indexOf(o)&&(r.push(o),e.attr(`sdc_${n}`,r.join(" ")))}))}}let O=[],b={};function k(e,t){if(e){let n=l(t._tagName);e._childController[n]||(e._childController[n]=[]),e._childController[n].push(t)}return t._parentController=e}function P(e,t,n,r){let o=[];r=function(e,t){e=(e=e.concat(b[t][1])).filter(((e,t,n)=>n.indexOf(e)===t));let n=!0;for(;n;){n=!1;for(let t of e)for(let r of b[t][1])e.includes(r)||(e.push(r),n=!0)}return e}(r,n);for(let e of r)o.push(b[e][0]);let s=new(function(e,...t){let n={[e.name]:class{constructor(...n){let r={};t.forEach((e=>{let t;Object.assign(this,t=new e),t._tagName=e.prototype._tagName,t._isMixin=!0,r[e.name]=t})),Object.assign(this,new e),this._mixins=r}static get name(){return e.name}static className(){return this.name}get mixins(){return this._mixins}}}[e.name];return a(n,e),t.forEach((e=>{a(n,e)})),n}(b[n][0],...o));return s._tagName=n,k(e,s),s.$container=t,function(e,t){g(t,e,t)}(t,s),s}function N(e,t,n,r){if(O.includes(n)){let o=l(n);return window[o]||(window[o]=P(e,t,n,r)),window[o].$container=t,window[o]}return P(e,t,n,r)}function E(e,t){const n=function(e){return function(e){let t={args:{}};return e.contentUrl&&(t=V(e,e.contentUrl),e.contentUrl=t.url),Promise.all([J(e.contentUrl,t.args,e._tagName,e.contentReload)]).then((function(e){let t=e[0];if(t)try{return $(t)}catch{return $("<div></div>").append(t)}return null}))}(e).then((t=>!e.onLoad||e._onLoadDone?t:(e._onLoadDone=!0,(e.onLoad(t)||s()).then((()=>t)))))}(e).then((function(t){return function(e,t){return W(e,t).then((function(t){if(t=t||!0,e.willShow){let n=e.willShow();if(n instanceof Promise)return n.then((function(){return t}))}return t}))}(e,t)})).then((()=>function(e,t){return z(null,e,t)}(e,t))).catch((function(t){return W(e,t)}));return e.load_async?Promise.resolve():n}function S(e){const t=function(e){let t=[];for(;e;)e._isEventsSet=!1,t.unshift(e),e=e._parentController;return t}(e.controller[0]),n=t.concat(e.controller.slice(1));for(let t of n)C(t),t.onRefresh(e.controller[0])}function R(e,t){let n=Boolean(e);return n?e.uuids.has(t._uuid)||(e.uuids.add(t._uuid),e.controller.push(t)):e={uuids:new Set([t._uuid]),controller:[t]},{isRunningProcess:n,refreshProcess:e}}let x={},q={};function F(e,t){return A(e),q.hasOwnProperty(e)?t[q[e]]?void x[e].push(t):console.log("No event handler: "+e,t):console.log("No event: "+e,t)}function A(e,t){t||(t=e),q[e]||(q[e]=t,x[e]=[])}function I(e){for(let t in x)if(x.hasOwnProperty(t))for(let n=x[t].length;n>=0;n--)e===x[t][n]&&x[t].splice(n,1)}function T(e){let t=Array.apply(null,arguments);if(e=t.shift(),!x.hasOwnProperty(e)||!q.hasOwnProperty(e))return s();let n=x[e],r=q[e],o=[];for(let e=0;e<n.length;e++){let s=n[e][r].apply(n[e],t);void 0!==s&&o.push(s)}return Promise.all(o)}let j={};const M="_controller_",L="_sdc_controller_";function U(e,t,n){if(!e)return[];let r=e.children(),o=[];return r.each((function(e,r){let s=$(r),i=s.prop("tagName").toLowerCase().split("_");$.inArray(i[0],t)>=0?o.push({tag:i[0],super:i.splice(1)||[],dom:s}):i[0].startsWith("this.")?s.addClass(`_bind_to_update_handler sdc_uuid_${n._uuid}`):o=o.concat(U(s,t,n))})),o}function J(e,t,n,r){return e?j[n]?Promise.resolve(j[n]):(t.VERSION=pe.VERSION,t._method="content",$.get(e,t).then((function(e){return r||(j[n]=e),e})).catch((function(e){throw 301===e.status&&T("_RedirectOnView",e.responseJSON["url-link"]),T("navLoaded",{controller_name:()=>e.status}),`<sdc-error data-code="${e.status}">${e.responseText}</sdc-error>`}))):Promise.resolve(!1)}function D(e,t,n=null){return t=t||e.data(M),K(pe.tagNames,e,t,n)}function V(e){let t=e.contentUrl;if(e&&0===e._urlParams.length){let n,r=/%\(([^)]+)\)\w/gm;for(e._urlParams=[];n=r.exec(t);)e._urlParams.push(n[1]),e.contentReload=!0}let n=function(e,t){return m(e._urlParams,t)}(e,e.$container);return e._urlParams.length&&(t=function(e,t,n){for(let r in e._urlParams)if(e._urlParams.hasOwnProperty(r)){let o=e._urlParams[r],s=RegExp("%\\("+o+"\\)\\w","gm");t=t.replace(s,""+n.shift())}return t}(e,t,n)),e.parsedContentUrl=t,{url:t,args:n[n.length-1]}}function B(e){return e.hasClass(L)?e.data(`${M}`):e.closest(`.${L}`).data(`${M}`)}function G(e,t,n,r,o){let s=e.data(M);return s?D(e,s,o):(s=N(r,e,t,n),e.data(M,s),e.addClass(L),E(s,o))}function W(e,t,n=null){if(t&&t.length>0){e.$container.empty(),e.$container.attr(e._tagName,"");for(let t in e._mixins)e.$container.attr(e._mixins[t]._tagName,"");e.$container.append(t)}return D(e.$container,e,n)}function K(e,t,n,r){return new Promise((o=>{let s=U(t,e,n),i=s.length;if(0===i)return o();for(let e=0;e<s.length;e++)G(s[e].dom,s[e].tag,s[e].super,n,r).then((()=>{if(i--,0===i)return o()}))}))}function H(e,t=[],n=null){t.push(function(e){if(3===e[0].nodeType)return`TEXT__${e[0].nodeValue}`;const t=[e[0].tagName];return"INPUT"===e[0].nodeName&&[["name",""],["type","text"],["id",""]].forEach((([n,r])=>{const o=e.attr(n)??r;o&&t.push(o)})),t.join("__")}(e));const r={$element:e,id:t.join("::"),depth:t.length,idx:0,getRealParent:()=>n,getIdx:function(){return this.idx=(this.getRealParent()?.getIdx()??-1)+e.index()+1,this.idx},op:null,parent:n};return r.getIdx.bind(r),[r].concat(e.contents().toArray().map((e=>H($(e),t.slice(),r))).flat())}function X(e,t){const n=H(t),r=H(e);n.map(((e,t)=>e.idx=t)),r.map(((e,t)=>e.idx=t));const o=Math.max(...r.concat(n).map((e=>e.depth))),s=Z(n,r,o);let i=[];window.MAIN=t,window.OPS=s,s.forEach(((e,t)=>{const{op:n,$element:r,idx:o}=e;if("keep_counterpart"===n.type){if(n.counterpart.getIdx()!==o){const t=e.getBefore();t?n.counterpart.$element.insertAfter(t.$element):e.getRealParent().$element.prepend(n.counterpart.$element)}!function(e,t){const n=e[0].attributes??[],r=t[0].attributes??[];[...n].forEach((n=>{t.is(`[${n.name}]`)||e.removeAttr(n.name)})),[...r].forEach((t=>{t.name.startsWith("data")||e.attr(t.name)===t.value||e.attr(t.name,t.value)})),e.removeData(),Object.entries(t.data()).forEach((([t,n])=>{e.data(t,n)}))}(n.counterpart.$element,r),r.hasClass(L)&&(r.data(M).$container=n.counterpart.$element,r.data(M,null)),i.push(r)}else if("delete"===n.type)r.safeRemove();else if("insert"===n.type){const{after:t,target:n}=e.op;t?r.insertAfter(t.$element):n&&n.$element.prepend(r)}})),i.forEach((e=>e.safeRemove()))}function Z(e,t,n){return t.filter((e=>e.depth===n&&!e.op)).forEach((t=>{const n=e.find((e=>!e.op&&e.id===t.id));if(n){const e=(t,n)=>{t.op={type:"keep",idx:n.idx},n.op={type:"keep_counterpart",counterpart:t},t=t.parent,n=n.parent,!t||t.op||n?.op||e(t,n)};e(n,t)}})),n>1?Z(e,t,n-1):(e.forEach(((t,n)=>{if(!t.op){const r=(e[n-1]?.op.idx??-1)+1;t.op={type:"delete",idx:r}}})),t.forEach(((e,n)=>{if(e.getBefore=()=>function(e,n){const r=e.depth;for(;n>=0&&e.depth>=r;)if((e=t[n-=1]).depth===r)return"keep_counterpart"===e.op.type?e.op.counterpart:e;return null}(e,n),e.getRealParent=()=>{return(t=e).parent?"keep_counterpart"===t.parent.op.type?t.parent.op.counterpart:t.parent:null;var t},!e.op){const t=e.getRealParent(),n="insert"===t?.op.type?"insert_ignore":"insert";e.op={type:n,target:t,after:e.getBefore()}}})),[...e,...t].sort(((e,t)=>(e.op?.idx??e.idx)-(t.op?.idx??t.idx))))}function z(e,t,n=null){if(t||(t=B(e)),!t)return Promise.resolve();const{refreshProcess:r,isRunningProcess:o}=R(n,t);return e??=t.$container,K(pe.tagNames,e,t,n).then((()=>{(function(e,t,n){return function(e,t,n){const r=[];return t.find(`._bind_to_update_handler.sdc_uuid_${e._uuid}`).each((function(){const t=$(this);let o;if(t.hasClass("_with_handler"))o=t.data("handler");else{let t=this.tagName.toLowerCase().replace(/^this./,"");e[t]&&(o=e[t])}"function"==typeof o&&(o=o.bind(e)(t.data())),void 0!==o&&r.push(Promise.resolve(o).then((r=>{let o=$("<div></div>");return o.append(r),o=t.clone().empty().append(o),pe.reconcile(e,o,t,n)})))})),Promise.all(r)}(e,t??e.$container,n)})(t,e,r).then((()=>{o||S(r)}))}))}const Q=25e3;class Y{constructor(e,t){this.pk=e,this._model=t}set model(e){this._model=e}get model(){return this._model}load(e){if(!this._model)throw new TypeError("Model is not set!!");return e.newModel(this._model,{pk:this.pk})}}const ee={get(e,t){const n=e[t]??void 0;if(n instanceof Y){if(!n.pk&&0!==n.pk)return null;const e=new Number(n.pk);return e.load=n.load.bind(n),e}return n},set(e,t,n){if(t in e){const r=e[t];r instanceof Y?n.hasOwnProperty("pk")?r.pk=n.pk:r.pk=n:e[t]=n}else e[t]=n;return!0}};class te{constructor(e,t={}){this._onNoOpenRequests=[],this.values_list=[],this.values={},this.model_name=e,this.model_query=t,this._is_connected=!1,this._is_conneting_process=!1,this._auto_reconnect=!0,this.socket=null,this.open_request={},this.on_update=()=>{},this.on_create=()=>{},this.form_id=h()}[Symbol.iterator](){let e=-1;return{next:()=>(++e,e<this.values_list.length?{value:this.values_list[e],done:!1}:{value:null,done:!0})}}length(){return this.values_list.length}byPk(e){if(null!==e){e=parseInt(e),isNaN(e)&&(e=-1);let t=this.values_list.find((t=>t.pk===e));return t||(t=new Proxy({pk:e},ee),this.values_list.push(t)),t}return{pk:e}}filter(e){return this.model_query=Object.assign({},this.model_query,e),this}load(){return this.isConnected().then((()=>{const e=h();return new Promise(((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"load",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]}))}))}listView(e={},t=null,n=null,r={}){let o=$('<div class="container-fluid">');return this.isConnected().then((()=>{const s=h();this.socket.send(JSON.stringify({event:"model",event_type:"list_view",event_id:s,args:{model_name:this.model_name,model_query:this.model_query,filter:e,template_context:r}})),this.open_request[s]=[e=>{o.append(e.html),pe.refresh(o),t&&t(e)},e=>{n&&n(e)}]})),o}detailView(e=null,t=null,n=null,r={}){e=e??-1,e=parseInt(e),isNaN(e)&&(e=-1);let o,s=$('<div class="container-fluid">');return o=0!==this.values_list.length?this.isConnected():this.load(),o.then((()=>{-1===e&&(e=this.values_list[0].pk);const o=h();this.socket.send(JSON.stringify({event:"model",event_type:"detail_view",event_id:o,args:{model_name:this.model_name,model_query:this.model_query,pk:e,template_context:r}})),this.open_request[o]=[e=>{s.append(e.html),pe.refresh(s),t&&t(e)},e=>{n&&n(e)}]})),s}syncFormToModel(e){return this.syncForm(e)}syncModelToForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));let t=this;e.each((function(){if(!this.hasAttribute("data-model_pk"))return;let e=$(this).data("model_pk"),n=t.byPk(e);for(let e of this.elements){let t=e.name;if(t&&""!==t)if("checkbox"===e.type)e.checked=n[t];else if("file"===e.type&&n[t]instanceof File){let r=new DataTransfer;r.items.add(n[t]),e.files=r}else $(e).val(n[t])}}))}syncForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));const t=this;let n=[];return e.each((function(){let e=$(this).data("model_pk"),r=t.byPk(e);for(let e of this.elements){let t=e.name;t&&""!==t&&("hidden"===e.type?r[t]=(o=$(e).val()).toLowerCase().match(/^(true|false)$/)?"true"===o.toLowerCase():"undefined"!==o?"none"===o.toLowerCase()?null:o.match(/^-?\d+$/)?parseInt(o):o.match(/^-?\d+\.?\d+$/)?parseFloat(o):o.match(/^(['][^']*['])|(["][^"]*["])$/)?o.substring(1,o.length-1):o:void 0:"checkbox"===e.type?r[t]=e.checked:"file"===e.type?r[t]=e.files[0]:r[t]=$(e).val())}var o;return n.push(r),r})),this.values_list.length<=1&&n.length>0&&(this.values=n.at(-1)),n}createForm(e=null,t=null){let n=$('<div class="container-fluid">');return this.isConnected().then((()=>{this._getForm(null,"create_form",null,n,e,t)})),n}editForm(e=-1,t=null,n=null){let r;e=parseInt(e),isNaN(e)&&(e=-1),r=0!==this.values_list.length?this.isConnected():this.load();let o=$('<div class="container-fluid">');return r.then((()=>{e<=-1&&(e=this.values_list.at(e).pk),this._getForm(e,"edit_form",null,o,t,n)})),o}namedForm(e=-1,t,n=null,r=null){let o;e=parseInt(e),isNaN(e)&&(e=-1),o=0!==this.values_list.length?this.isConnected():this.load();let s=$('<div class="container-fluid">');return o.then((()=>{e<=-1&&(e=this.values_list.at(e).pk),this._getForm(e,"named_form",t,s,n,r)})),s}_getForm(e,t,n,r,o,s){e=parseInt(e),isNaN(e)&&(e=-1);const i=h();this.socket.send(JSON.stringify({event:"model",event_type:t,event_id:i,args:{model_name:this.model_name,model_query:this.model_query,pk:e,form_name:n}}));const l=null===e||-1===e?"create":"edit";this.open_request[i]=[t=>{r.append(t.html);let n=r.closest("form").addClass(`sdc-model-${l}-form sdc-model-form ${this.form_id}`).data("model",this).data("model_pk",e);n.length>0&&!n[0].hasAttribute("sdc_submit")&&n.attr("sdc_submit","submitModelFormDistributor"),pe.refresh(r),o&&o(t)},e=>{s&&s(e)}]}new(){return new Promise(((e,t)=>{const n=$("<form>").append(this.createForm((()=>{this.syncFormToModel(n),e()}),t))}))}save(e=-1){return e=parseInt(e),isNaN(e)&&(e=-1),this.isConnected().then((()=>{let t;t=e>-1?[this.byPk(e)]:this.values_list;let n=[];return t.forEach((e=>{const t=h();n.push(new Promise(((n,r)=>{this._readFiles(e).then((o=>{this.socket.send(JSON.stringify({event:"model",event_type:"save",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:o}})),this.open_request[t]=[e=>{let t="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;e.data.instance=this._parseServerRes(t),n(e)},r]}))})))})),Promise.all(n)}))}create(e=this.values){const t=h();return this.isConnected().then((()=>new Promise(((n,r)=>{this._readFiles(e).then((o=>{this.socket.send(JSON.stringify({event:"model",event_type:"create",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:o}})),this.open_request[t]=[e=>{let t="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;e.data.instance=this._parseServerRes(t)[0],n(e)},r]}))}))))}delete(e=-1){e=parseInt(e),isNaN(e)&&(e=-1),-1===e&&(e=this.values?.pk);const t=h();return this.isConnected().then((()=>new Promise(((n,r)=>{this.socket.send(JSON.stringify({event:"model",event_type:"delete",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[t]=[n,r]}))))}isConnected(){return new Promise(((e,t)=>{if(this._is_connected)e();else if(this._is_conneting_process){const[n,r]=this.open_request._connecting_process;this.open_request._connecting_process=[()=>{n(),e()},()=>{r(),t()}]}else this._is_conneting_process=!0,this.open_request._connecting_process=[()=>{},()=>{}],this._connectToServer().then((()=>{e(this._checkConnection())}))}))}close(){this.socket&&(this._auto_reconnect=!1,this.socket.onclose=()=>{},this.socket.close(),delete this.socket)}clean(){return this.values_list=[],this.values={},this}_readFiles(e){let t=[],n={};for(const[r,o]of Object.entries(e))o instanceof File&&t.push(new Promise(((e,t)=>{((r,o)=>{let s=new FileReader;s.onload=s=>{const i=h();this.open_request[i]=[e,t];let l=s.target.result,a=parseInt(Math.ceil(l.length/Q));n[r]={id:i,file_name:o.name,field_name:r,content_length:o.size};for(let e=0;e<a;++e)this.socket.send(JSON.stringify({event:"model",event_type:"upload",event_id:i,args:{chunk:l.slice(Q*e,Q*(e+1)),idx:e,number_of_chunks:a,file_name:o.name,field_name:r,content_length:o.size,content_type:o.type,model_name:this.model_name,model_query:this.model_query}}))},s.onerror=()=>{t()},s.readAsBinaryString(o)})(r,o)})));return Promise.all(t).then((()=>n))}_onMessage(e){let t=JSON.parse(e.data);if(t.is_error)this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][1](t),this._closeOpenRequest(t.event_id)),(t.msg||t.header)&&T("pushErrorMsg",t.header||"",t.msg||""),"connect"===t.type&&(this.open_request._connecting_process[1](t),this._closeOpenRequest("_connecting_process"),this._auto_reconnect=!1,this.socket.close());else{if((t.msg||t.header)&&T("pushMsg",t.header||"",t.msg||""),"connect"===t.type)this._is_connected=!0,this._is_conneting_process=!1,this.open_request._connecting_process[0](t),this._closeOpenRequest("_connecting_process");else if("load"===t.type){const e=JSON.parse(t.args.data);this.values_list=[],t.args.data=this._parseServerRes(e)}else if("on_update"===t.type||"on_create"===t.type){const e=JSON.parse(t.args.data);let n,r=this._parseServerRes(e);n="on_create"===t.type?this.on_create:this.on_update,n(r),t.args.data=r}let e=t.data?.instance;e&&(t.data.instance=JSON.parse(t.data.instance)),this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][0](t),this._closeOpenRequest(t.event_id))}}noOpenRequests(){return new Promise((e=>{if(0===Object.keys(this.open_request).length)return e();this._onNoOpenRequests.push(e)}))}_closeOpenRequest(e){delete this.open_request[e],0===Object.keys(this.open_request).length&&(this._onNoOpenRequests.forEach((e=>e())),this._onNoOpenRequests=[])}_connectToServer(){return new Promise((e=>{const t=`${this.model_name}`+(this.model_id>0?`/${this.model_id}`:"");"https:"===window.location.protocol?this.socket=new WebSocket(`wss://${window.location.host}/sdc_ws/model/${t}`):this.socket=new WebSocket(`ws://${window.location.host}/sdc_ws/model/${t}`),this.socket.onmessage=this._onMessage.bind(this),this.socket.onclose=e=>{console.error(`SDC Model (${this.model_name}, ${this.model_id}) Socket closed unexpectedly`),this._is_connected=!1;for(const[t,n]of Object.entries(this.open_request))n[1](e);this.open_request={},setTimeout((()=>{this._auto_reconnect&&this._connectToServer().then((()=>{}))}),1e3)},this.socket.onerror=e=>{if(console.error(`Model Socket encountered error: ${e} Closing socket`),this._is_connected)try{this.socket.close()}catch(e){}},this.socket.onopen=()=>{e()}}))}_checkConnection(){const e=h();return new Promise(((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"connect",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]}))}_parseServerRes(e){let t=[];for(let n of e){const e=n.pk,r=this.byPk(e);for(const[e,t]of Object.entries(n.fields))t&&"object"==typeof t&&t.__is_sdc_model__?r[e]=new Y(t.pk,t.model):r[e]=t;t.push(r)}return 1===this.values_list.length?this.values=this.values_list.at(-1):this.values={},t}}let ne=!1,re=!1,oe=null,se={};function ie(){return window.SERVER_CALL_VIA_WEB_SOCKET?new Promise((e=>ne?e():re?void setTimeout((()=>{ie().then((()=>{e()}))}),200):e(ae()))):Promise.resolve(!0)}function le(){window.SERVER_CALL_VIA_WEB_SOCKET&&function(){if(ne){ne=!1;try{oe.close()}catch(e){}}}()}function ae(){return re=!0,new Promise((e=>{oe="https:"===window.location.protocol?new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`):new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`),oe.onmessage=function(e){ce(JSON.parse(e.data))},oe.onclose=function(){ne&&console.error("SDC Socket closed unexpectedly"),ne=!1;for(const[e,t]of Object.entries(se))t[1]({}),delete se[e];setTimeout((()=>{ae()}),1e3)},oe.onerror=function(e){if(console.error("Socket encountered error: ",e.message,"Closing socket"),ne)try{oe.close()}catch(e){}},oe.onopen=function(){ne=!0,re=!1,e()}}))}function ce(e){if(e||(e={}),e.is_error)(e.msg||e.header)&&T("pushErrorMsg",e.header||"",e.msg||""),e.id&&se[e.id]&&(se[e.id][1](e.data||null),delete se[e.id]);else if((e.msg||e.header)&&T("pushMsg",e.header||"",e.msg||""),e.type&&"sdc_recall"===e.type)e.id&&se[e.id]&&(se[e.id][0](e.data),delete se[e.id]);else if(e.type&&"sdc_event"===e.type){let t=e.event;t&&T(t,e.payload)}else e.type&&"sdc_redirect"===e.type&&T("onNavLink",e.link)}class ue{constructor(){this._uuid=h(),this.contentUrl="",this.contentReload=!1,this.parsedContentUrl=null,this.events=[],this.load_async=!1,this._isEventsSet=!1,this._allEvents=null,this._urlParams=[],this._models=[],this._cssUrls=[],this.afterShow=()=>{console.warn("afterShow is deprecated!!")},this._mixins={},this._tagName=Object.getPrototypeOf(this)._tagName??"",this._childController={},this._parentController=null,this._onLoadDone=!1,this.$container=null,this._isMixin=!1}_runLifecycle(e,t){pe.DEBUG&&!this._isMixin&&console.debug(e,this._tagName);let n=[];if(!this._isMixin){this._isMixin=!0;for(let r in this._mixins){let o=this._mixins[r];"function"==typeof o[e]&&n.push(o[e].apply(this,t))}return Promise.all(n).then((()=>{this._isMixin=!1}))}}onInit(){pe.DEBUG&&!this._isMixin&&console.DEBUG(Array.apply(null,arguments),this._tagName)}get parentController(){return this._parentController}get childController(){return this._childController}onLoad(){return this._runLifecycle("onLoad",arguments)}willShow(){return this._runLifecycle("willShow",arguments)}onRefresh(){return this._runLifecycle("onRefresh",arguments)}onRemove(){return this._runLifecycle("onRemove",arguments),!0}noOpenModelRequests(){return Promise.all(this._models.map((e=>e.noOpenRequests())))}remove(){for(const e of this._models)e.close();let e=this._childController;for(let t in e)if(e.hasOwnProperty(t))for(let n of e[t])if(!n.remove())return!1;if(!this.onRemove||this.onRemove()){I(this);const e=l(this._tagName);if(this._parentController._childController[e]){let t=this._parentController._childController[e];for(let e=0;e<t.length;e++)t[e]===this&&t.splice(e,1)}return this.$container.remove(),!0}return!1}controller_name(){return this._tagName.replace(/-./g,(e=>` ${e[1].toUpperCase()}`)).replace(/^./g,(e=>`${e.toUpperCase()}`))}addEvent(e,t,n){this.getEvents(),this._allEvents[e]=this._allEvents[e]||{},this._allEvents[e][t]=n}getEvents(){if(this._allEvents)return this._allEvents;let e=[];e=e.concat(this.events);for(let t in this._mixins){let n=this._mixins[t];Array.isArray(n.events)&&(e=e.concat(n.events))}return this._allEvents=_.merge(...e)}post(e,t){return pe.post(this,e,t)}get(e,t){return pe.get(this,e,t)}submitForm(e,t,n){return pe.submitFormAndUpdateView(this,e,t,n)}serverCall(e,t){let n=this.contentUrl.match(/sdc_view\/([^/]+)/i);if(n&&!(n.length<2))return function(e,t,n,r,o){return window.SERVER_CALL_VIA_WEB_SOCKET?function(e,t,n,r){let o=h();return ie().then((()=>{oe.send(JSON.stringify({event:"sdc_call",id:o,controller:t,app:e,function:n,args:r}))})),new Promise(((e,t)=>{se[o]=[e,t]}))}(e,t,r,o):function(e,t,n){return"object"!=typeof n&&Array.isArray(n)&&null===n&&(n={arg0:n}),n={data:JSON.stringify(n),_sdc_func_name:t,_method:"sdc_server_call"},$.post({url:e,data:n,beforeSend:function(e,t){e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}}).then((e=>{const t=e._return_data;return ce(t),t})).catch((e=>{const t=e.responseJSON;throw t.is_error=!0,ce(t),e}))}(n,r,o)}(n[1],this._tagName,this.parsedContentUrl??this.contentUrl,e,t);console.error("To use the serverCall function the contentUrl must be set: "+this.name)}newModel(e,t={}){if(e instanceof Number&&e.hasOwnProperty("load"))return e.load(this);const n=new te(e,t);return this._models.push(n),n}updateModel(e,t={},n){let r=new te(e,t);return r.load().then((()=>{r.values|=n,r.save().then((()=>(r.close(),r.values)))}))}find(e){return this.$container.find(e)}refresh(){return pe.refresh(this.$container,this)}reload(){return pe.reloadController(this)}reconcile(e,t=null){return pe.reconcile(this,e,t)}submitModelFormDistributor(e,t){return"function"==typeof this._submitModelForm?this._submitModelForm(e,t):"function"==typeof this.submitModelForm?this.submitModelForm(e,t):this.defaultSubmitModelForm(e,t)}iterateAllChildren(){let e=this._childController,t=[];for(let n in e)if(e.hasOwnProperty(n))for(let r of e[n])t.push(r),t.push(...r.iterateAllChildren());return t}defaultSubmitModelForm(e,t){let n=[];if(!this._isMixin){t.stopPropagation(),t.preventDefault();let r=e.data("model");const o=r.syncForm(e);for(let t of o)n.push(new Promise(((n,o)=>{let s;s=null!==t.pk&&t.pk>=0?r.save(t.pk):r.create(t),s.then((t=>{p(e),this.submit_model_form_success&&this.submit_model_form_success(t[0]);for(const e of this.iterateAllChildren())e.submit_model_form_success&&e.submit_model_form_success(t[0]);n(t)})).catch((t=>{f(e,$(t.html)),this.submit_model_form_error&&this.submit_model_form_error(t);for(const e of this.iterateAllChildren())e.submit_model_form_error&&e.submit_model_form_error(t);o(t)}))})))}return Promise.all(n).then((e=>Object.assign({},...e.flat())))}}const de={classname:"class"};window.sdcDom=function(e,t,...n){if(!e)return"";const r=function(e,t){let n,r=!1;if("string"==typeof e)n=$(document.createElement(e));else{const t=`this.${e.name}`;n=$(document.createElement(t)),n.data("handler",e),r=!0}return t&&Object.entries(t).forEach((([e,t])=>{e.startsWith("on")?n[0].addEventListener(e.substring(2).toLowerCase(),t):(de[e.toLowerCase()]&&(e=de[e.toLowerCase()]),n[0].setAttribute(e,t))})),r&&n.addClass("_bind_to_update_handler _with_handler"),n}(e,t);for(const e of n)r.append(e);return r};let he,pe={CSRF_TOKEN:window.CSRF_TOKEN||"",LANGUAGE_CODE:window.LANGUAGE_CODE||"en",DEBUG:window.DEBUG||!1,VERSION:window.VERSION||"0.0",tagNames:[],Global:O,rootController:null,globalRootController:null,_isInit:!1,_origin_trigger:null,_globalControllerClasses:[],init_sdc:()=>{pe._isInit||(pe._isInit=!0,pe._origin_trigger?le():(pe._origin_trigger=$.fn.trigger,$.fn.trigger=function(e){const t={}.hasOwnProperty.call(e,"type")?e.type:e;return v.includes(t)||(v.push(t),$(window).on(t,w)),pe._origin_trigger.call(this,e)},pe.updateJquery()),ie(),function(){const e=$(window);v.forEach((t=>{e.off(t).on(t,w)}))}(),pe.rootController=pe.rootController||new ue,pe.globalRootController=pe.globalRootController||new ue),pe.tagNames=Object.keys(b);const e=$("<div></div>");O.forEach((t=>{const n=b[t][0];e.append(`<${n.prototype._tagName}></${n.prototype._tagName}>`)}));const{refreshProcess:t}=R(null,pe.rootController);return K(pe.tagNames,e,pe.globalRootController,t).then((()=>K(pe.tagNames,(n||(n=$("body")),n),pe.rootController,t).then((e=>(S(t),e)))))},updateJquery:()=>{$.fn.safeReplace=function(e){return pe.safeReplace($(this),e)},$.fn.safeEmpty=function(){return pe.safeEmpty($(this))},$.fn.safeRemove=function(){return pe.safeRemove($(this))}},controllerToTag:e=>i(e.name).replace(/-controller$/,""),registerGlobal:e=>{pe.register(e);let t=e.prototype._tagName;O.push(t)},cleanCache:()=>{j={}},register:e=>{let t=pe.controllerToTag(e);return b[t]=[e,[]],e.prototype._tagName=t,{addMixin:(...e)=>{for(let n of e){let e;"string"==typeof n?e=i(n):n&&(e=pe.controllerToTag(n)),b[t][1].push(e)}}}},post:(e,t,n)=>(n||(n={}),n.CSRF_TOKEN=pe.CSRF_TOKEN,pe.ajax(e,t,params,$.post)),get:(e,t,n)=>pe.ajax(e,t,n,$.get),ajax:(e,t,n,r)=>{n||(n={}),n.VERSION=pe.VERSION,n._method=n._method||"api";const o=new Promise(((s,i)=>r(t,n).then(((t,n,r)=>{s(t,n,r),"redirect"===t.status?T("onNavLink",t["url-link"]):o.then((()=>{pe.refresh(e.$container)}))})).catch(i)));return o},submitFormAndUpdateView:(e,t,n,r)=>{let o=new FormData(t);const s=e=>{e["url-link"]?T("onNavLink",e["url-link"]):window.location.href=e.url},i=new Promise(((l,a)=>{c(o,n||t.action,r||t.method).then(((t,n,r)=>{l(t,n,r),"redirect"===t.status?s(t):i.then((()=>{pe.refresh(e.$container,e)}))})).catch(((e,t,n)=>{301===e.status?(e=e.responseJSON,s(e),l(e,t,n)):a(e,t,n)}))}));return i},submitForm:(e,t,n)=>{let r=new FormData(e);return new Promise(((o,s)=>{c(r,t||e.action,n||e.method).then(o).catch(s)}))},getController:e=>B(e),safeEmpty:e=>(e.children().each((function(e,t){let n=$(t);pe.safeRemove(n)})),e),safeReplace:(e,t)=>(t.insertBefore(e),pe.safeRemove(e)),safeRemove:e=>(e.each((function(){let e=$(this);e.data(`${M}`)&&e.data(`${M}`).remove()})),e.find(`.${L}`).each((function(){const e=$(this).data(`${M}`);e&&e.remove()})),e.remove()),reloadController:e=>function(e){if(e.contentUrl){let t=V(e,e.contentUrl);return e.contentUrl=t.url,J(e.contentUrl,t.args,e._tagName,e.contentReload)}return new Promise((e=>{e($())}))}(e).then((t=>{let n=$(t);return pe.reconcile(e,n)})),reconcile:(e,t,n=null,r=null)=>{if(!n){let n=e.$container.clone().empty();n.data(M,null),n.removeClass(L),n.append(t),t=n}n=n??e.$container;const{refreshProcess:o,isRunningProcess:s}=R(r,e);return z(t,e,o).then((()=>{var r;return X(t,n),(r=e)._childController={},r.find(`.${L}`).each((function(){const e=B($(this));e===r&&k(r,e)})),s||S(o),e}))},refresh:(e,t)=>z(e,t)},fe=[];function _e(){if(!jest)throw new Error("JEST is not defined");0===fe.length&&(he=$.ajax.bind($),fe.push(jest.spyOn($,"ajax")),fe[0].mockImplementation((function(e){return he(e).then((e=>e)).catch((e=>e))})))}const me=le,ge={get_controller:async function(e,t={},n=""){_e();const r=$("body");pe.updateJquery(),r.safeEmpty();const o=$(`<${e}>${n}</${e}>`);for(const[e,n]of Object.entries(t))o.data(e,n);const s=$("<div></div>").append(o);return r.append(s),pe._isInit=!1,pe.cleanCache(),await pe.init_sdc(),pe.getController(o)},getCsrfToken:function(){return function(e){if(document.cookie&&""!==document.cookie){const t=document.cookie.split(";");for(let n=0;n<t.length;n++){const r=t[n].trim();if(r.substring(0,10)===e+"=")return decodeURIComponent(r.substring(10))}}return""}("csrftoken")},controllerFromTestHtml:async function(e,t=null){_e();const n=$("body");pe.updateJquery(),n.safeEmpty().append(e),pe._isInit=!1,pe.cleanCache(),await pe.init_sdc();let r=pe.rootController.iterateAllChildren();if(!t)return r;const o=r[0].onRefresh,s=jest.spyOn(r[0],"onRefresh");return new Promise((e=>{s.mockImplementation((function(){s.mockRestore();const t=o.apply(r[0],arguments);return e(r),t}))}))}};var ye=t.n$,ve=t.du,we=t.yA,$e=t.g3,Ce=t.u2,Oe=t.n9,be=t.on,ke=t.yy,Pe=t.R6,Ne=t.$n,Ee=t.hA,Se=t.VB,Re=t.hZ;export{ye as AbstractSDC,ve as allOff,we as app,$e as checkIfParamNumberBoolOrString,Ce as clearErrorsInForm,Oe as controllerFactory,be as on,ke as runControlFlowFunctions,Pe as setErrorsInForm,Ne as setEvent,Ee as socketReconnect,Se as test_utils,Re as trigger};
1
+ var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};let n;e.d(t,{n$:()=>ue,du:()=>I,yA:()=>pe,g3:()=>d,u2:()=>p,n9:()=>N,on:()=>F,yy:()=>E,R6:()=>f,$n:()=>A,hA:()=>me,VB:()=>ge,hZ:()=>T});const r=/([^\s,]+)/g,o=/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/gm;function s(){return new Promise((function(e){e()}))}function i(e){return(e=(e=e.replace(/[A-Z]/g,(e=>`-${e.toLowerCase()}`))).replace(/[0-9]+/g,(e=>`-${e}`))).replace(/^[-]/g,"")}function l(e){return e.replace(/-./g,(e=>`${e[1].toUpperCase()}`))}const a=(e,t)=>{let n=t,r=Object.getOwnPropertyNames(e.prototype).concat(Object.getOwnPropertySymbols(e.prototype));for(;""!==n.name;)Object.getOwnPropertyNames(n.prototype).concat(Object.getOwnPropertySymbols(n.prototype)).forEach((t=>{t.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)||r.includes(t)||(r.push(t),Object.defineProperty(e.prototype,t,Object.getOwnPropertyDescriptor(n.prototype,t)))})),n=Object.getPrototypeOf(n)};function c(e,t,n){return $.ajax({url:t,type:n||"POST",xhr:function(){var e=$.ajaxSettings.xhr();return e.upload&&e.upload.addEventListener("progress",u,!1),e},data:e,cache:!1,contentType:!1,processData:!1,beforeSend:function(e,t){(function(e){return/^(GET|HEAD|OPTIONS|TRACE)$/.test(e)})(t.type)||this.crossDomain||e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}})}function u(e){if(e.lengthComputable){var t=Math.round(e.loaded/e.total*100),n=$(".progress-container");100===t?n.hide():n.show(),t+="%",n.find(".progress-bar").css({width:t}).text(t)}}function d(e,t=null){return"string"!=typeof e?e:t&&void 0!==t[e]?"function"==typeof t[e]?t[e].bind(t):t[e]:e.match(/^(true|false)$/)?"true"===e:"undefined"!==e?"none"===e.toLowerCase()?null:e.match(/^-?\d+$/)?parseInt(e):e.match(/^-?\d+\.?\d+$/)?parseFloat(e):e.match(/^(['][^']*['])|(["][^"]*["])$/)?e.substr(1,e.length-2):e:void 0}function h(){return([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,(e=>(e^crypto.getRandomValues(new Uint8Array(1))[0]&15>>e/4).toString(16)))}function p(e){e.find(".has-error").removeClass("has-error").find(".alert-danger").remove(),e.find(".non-field-errors").remove()}function f(e,t){t=$("<div>").append(t),e.find(".has-error").removeClass("has-error").find(".alert-danger").safeRemove(),e.find(".non-field-errors").safeRemove();let n=t.find("input[type=file]").parent();e.find("input[type=file]").parent().each((function(e){$(this).replaceWith(n[e])}));let r=0===t.find(".non-field-errors").insertAfter(e.find(".hidden-form-fields")).length;return t.find(".has-error").each((function(){r=!1;let t=$(this),n=t.data("auto-id"),o=e.find(".form-group."+n);o.addClass("has-error"),o.find(".form-input-container").append(t.find(".alert-danger"))})),r}function m(e,t,n=null){let r=function(e,t){let n;e||(e=[]);let r=t.data(),o={};for(let t in r)r.hasOwnProperty(t)&&t!==M&&!e.includes(t)&&(o[t]=r[t]);n=[];for(let t=0;t<e.length;t++){let o=e[t];r.hasOwnProperty(o)?n.push(r[o]):n.push("undefined")}return n.push(o),n}(e,t);return function(e,t=null){let n=[];for(let r=0;r<e.length;r++){let o=d(e[r],t);n.push(o)}return n}(r,n)}function g(e,t,n){if(!e)return!1;if("function"!=typeof e.onInit)return!1;let s;var i;"function"==typeof e._on_init_params?s=e._on_init_params():s=(i=e.onInit.toString().replace(o,"")).slice(i.indexOf("(")+1,i.indexOf(")")).match(r)||[];let l=m(s,t,n._parentController);if(e.onInit.apply(n,l),n===e)for(let r in e._mixins)g(e._mixins[r],t,n)}const y=["onbeforeunload","onunload"],v=Object.keys(window).filter((e=>/^on/.test(e)&&!y.includes(e))).map((e=>e.slice(2)));function w(e){let t=e.type;e.hasOwnProperty("namespace")&&e.namespace&&e.namespace.length&&(t+=`.${e.namespace}`);let n=$(e.target),r=null,o=!1,s=!1;for(e.stopImmediatePropagation=()=>s=!0,e.stopPropagation=()=>s=o=!0;n.length;){let i=n.attr(`sdc_${t}`);if(i){if(!r&&(r=B(n),!r))return;for(;r;){if(i.split(" ").forEach((s=>{if(o)return;let i=null;if("function"==typeof s)i=s;else if("function"==typeof r[s])i=r[s];else if("string"==typeof s&&s.startsWith("this.event_")){if(i=r.getEvents()[t],!i)return;if(i=i[s.slice(11)],!i)return}i&&i.call(r,n,e)})),s)return;r=r._parentController}}if(o)return;n=n.parent()}return{res:!0}}function C(e){if(e._isEventsSet)return;const t=e.getEvents();for(let n in t)if(t.hasOwnProperty(n)){let r=t[n];for(let t in r)r.hasOwnProperty(t)&&e.find(t).each((function(){let e=$(this),r=e.attr(`sdc_${n}`)||null;r=r?r.split(" "):[];const o=`this.event_${t}`;-1===r.indexOf(o)&&(r.push(o),e.attr(`sdc_${n}`,r.join(" ")))}))}}let O=[],b={};function k(e,t){if(e){let n=l(t._tagName);e._childController[n]||(e._childController[n]=[]),e._childController[n].push(t)}return t._parentController=e}function P(e,t,n,r){let o=[];r=function(e,t){e=(e=e.concat(b[t][1])).filter(((e,t,n)=>n.indexOf(e)===t));let n=!0;for(;n;){n=!1;for(let t of e)for(let r of b[t][1])e.includes(r)||(e.push(r),n=!0)}return e}(r,n);for(let e of r)o.push(b[e][0]);let s=new(function(e,...t){let n={[e.name]:class{constructor(...n){let r={};t.forEach((e=>{let t;Object.assign(this,t=new e),t._tagName=e.prototype._tagName,t._isMixin=!0,r[e.name]=t})),Object.assign(this,new e),this._mixins=r}static get name(){return e.name}static className(){return this.name}get mixins(){return this._mixins}}}[e.name];return a(n,e),t.forEach((e=>{a(n,e)})),n}(b[n][0],...o));return s._tagName=n,k(e,s),s.$container=t,function(e,t){g(t,e,t)}(t,s),s}function N(e,t,n,r){if(O.includes(n)){let o=l(n);return window[o]||(window[o]=P(e,t,n,r)),window[o].$container=t,window[o]}return P(e,t,n,r)}function E(e,t){const n=function(e){return function(e){let t={args:{}};return e.contentUrl&&(t=V(e,e.contentUrl),e.contentUrl=t.url),Promise.all([J(e.contentUrl,t.args,e._tagName,e.contentReload)]).then((function(e){let t=e[0];if(t)try{return $(t)}catch{return $("<div></div>").append(t)}return null}))}(e).then((t=>!e.onLoad||e._onLoadDone?t:(e._onLoadDone=!0,(e.onLoad(t)||s()).then((()=>t)))))}(e).then((function(t){return function(e,t){return W(e,t).then((function(t){if(t=t||!0,e.willShow){let n=e.willShow();if(n instanceof Promise)return n.then((function(){return t}))}return t}))}(e,t)})).then((()=>function(e,t){return z(null,e,t)}(e,t))).catch((function(t){return W(e,t)}));return e.load_async?Promise.resolve():n}function S(e){const t=function(e){let t=[];for(;e;)e._isEventsSet=!1,t.unshift(e),e=e._parentController;return t}(e.controller[0]),n=t.concat(e.controller.slice(1));for(let t of n)C(t),t.onRefresh(e.controller[0])}function R(e,t){let n=Boolean(e);return n?e.uuids.has(t._uuid)||(e.uuids.add(t._uuid),e.controller.push(t)):e={uuids:new Set([t._uuid]),controller:[t]},{isRunningProcess:n,refreshProcess:e}}let x={},q={};function F(e,t){return A(e),q.hasOwnProperty(e)?t[q[e]]?void x[e].push(t):console.log("No event handler: "+e,t):console.log("No event: "+e,t)}function A(e,t){t||(t=e),q[e]||(q[e]=t,x[e]=[])}function I(e){for(let t in x)if(x.hasOwnProperty(t))for(let n=x[t].length;n>=0;n--)e===x[t][n]&&x[t].splice(n,1)}function T(e){let t=Array.apply(null,arguments);if(e=t.shift(),!x.hasOwnProperty(e)||!q.hasOwnProperty(e))return s();let n=x[e],r=q[e],o=[];for(let e=0;e<n.length;e++){let s=n[e][r].apply(n[e],t);void 0!==s&&o.push(s)}return Promise.all(o)}let j={};const M="_controller_",L="_sdc_controller_";function U(e,t,n){if(!e)return[];let r=e.children(),o=[];return r.each((function(e,r){let s=$(r),i=s.prop("tagName").toLowerCase().split("_");$.inArray(i[0],t)>=0?o.push({tag:i[0],super:i.splice(1)||[],dom:s}):i[0].startsWith("this.")?s.addClass(`_bind_to_update_handler sdc_uuid_${n._uuid}`):o=o.concat(U(s,t,n))})),o}function J(e,t,n,r){return e?j[n]?Promise.resolve(j[n]):(t.VERSION=pe.VERSION,t._method="content",$.get(e,t).then((function(e){return r||(j[n]=e),e})).catch((function(e){throw 301===e.status&&T("_RedirectOnView",e.responseJSON["url-link"]),T("navLoaded",{controller_name:()=>e.status}),`<sdc-error data-code="${e.status}">${e.responseText}</sdc-error>`}))):Promise.resolve(!1)}function D(e,t,n=null){return t=t||e.data(M),K(pe.tagNames,e,t,n)}function V(e){let t=e.contentUrl;if(e&&0===e._urlParams.length){let n,r=/%\(([^)]+)\)\w/gm;for(e._urlParams=[];n=r.exec(t);)e._urlParams.push(n[1]),e.contentReload=!0}let n=function(e,t){return m(e._urlParams,t)}(e,e.$container);return e._urlParams.length&&(t=function(e,t,n){for(let r in e._urlParams)if(e._urlParams.hasOwnProperty(r)){let o=e._urlParams[r],s=RegExp("%\\("+o+"\\)\\w","gm");t=t.replace(s,""+n.shift())}return t}(e,t,n)),e.parsedContentUrl=t,{url:t,args:n[n.length-1]}}function B(e){return e.hasClass(L)?e.data(`${M}`):e.closest(`.${L}`).data(`${M}`)}function G(e,t,n,r,o){let s=e.data(M);return s?D(e,s,o):(s=N(r,e,t,n),e.data(M,s),e.addClass(L),E(s,o))}function W(e,t,n=null){if(t&&t.length>0){e.$container.empty(),e.$container.attr(e._tagName,"");for(let t in e._mixins)e.$container.attr(e._mixins[t]._tagName,"");e.$container.append(t)}return D(e.$container,e,n)}function K(e,t,n,r){return new Promise((o=>{let s=U(t,e,n),i=s.length;if(0===i)return o();for(let e=0;e<s.length;e++)G(s[e].dom,s[e].tag,s[e].super,n,r).then((()=>{if(i--,0===i)return o()}))}))}function H({$element:e,id:t=[],parent:n=null}){t.push(function(e){if(3===e[0].nodeType)return`TEXT__${e[0].nodeValue}`;const t=[e[0].tagName];return"INPUT"===e[0].nodeName&&[["name",""],["type","text"],["id",""]].forEach((([n,r])=>{const o=e.attr(n)??r;o&&t.push(o)})),t.join("__")}(e));const r={$element:e,id:t.join("::"),depth:t.length,idx:0,getRealParent:()=>n,getIdx:function(){return this.idx=(this.getRealParent()?.getIdx()??-1)+e.index()+1,this.idx},op:null,parent:n};return r.getIdx.bind(r),[r].concat(e.contents().toArray().map((e=>H({$element:$(e),id:t.slice(),parent:r}))).flat())}function X(e,t){const n=H({$element:t}),r=H({$element:e});n.map(((e,t)=>e.idx=t)),r.map(((e,t)=>e.idx=t));const o=Math.max(...r.concat(n).map((e=>e.depth))),s=Z(n,r,o);let i=[];window.MAIN=t,window.OPS=s,s.forEach(((e,t)=>{const{op:n,$element:r,idx:o}=e;if("keep_counterpart"===n.type){if(n.counterpart.getIdx()!==o){const t=e.getBefore();t?n.counterpart.$element.insertAfter(t.$element):e.getRealParent().$element.prepend(n.counterpart.$element)}!function(e,t){const n=e[0].attributes??[],r=t[0].attributes??[];[...n].forEach((n=>{t.is(`[${n.name}]`)||e.removeAttr(n.name)})),[...r].forEach((t=>{t.name.startsWith("data")||e.attr(t.name)===t.value||e.attr(t.name,t.value)})),e.removeData(),Object.entries(t.data()).forEach((([t,n])=>{e.data(t,n)}))}(n.counterpart.$element,r),r.hasClass(L)&&(r.data(M).$container=n.counterpart.$element,r.data(M,null)),i.push(r)}else if("delete"===n.type)r.safeRemove();else if("insert"===n.type){const{after:t,target:n}=e.op;t?r.insertAfter(t.$element):n&&n.$element.prepend(r)}})),i.forEach((e=>e.safeRemove()))}function Z(e,t,n){return t.filter((e=>e.depth===n&&!e.op)).forEach((t=>{const n=e.find((e=>!e.op&&e.id===t.id));if(n){const e=(t,n)=>{t.op={type:"keep",idx:n.idx},n.op={type:"keep_counterpart",counterpart:t},t=t.parent,n=n.parent,!t||t.op||n?.op||e(t,n)};e(n,t)}})),n>1?Z(e,t,n-1):(e.forEach(((t,n)=>{if(!t.op){const r=(e[n-1]?.op.idx??-1)+1;t.op={type:"delete",idx:r}}})),t.forEach(((e,n)=>{if(e.getBefore=()=>function(e,n){const r=e.depth;for(;n>=1&&e.depth>=r;)if((e=t[n-=1]).depth===r)return"keep_counterpart"===e.op.type?e.op.counterpart:e;return null}(e,n),e.getRealParent=()=>{return(t=e).parent?"keep_counterpart"===t.parent.op.type?t.parent.op.counterpart:t.parent:null;var t},!e.op){const t=e.getRealParent(),n="insert"===t?.op.type?"insert_ignore":"insert";e.op={type:n,target:t,after:e.getBefore()}}})),[...e,...t].sort(((e,t)=>(e.op?.idx??e.idx)-(t.op?.idx??t.idx))))}function z(e,t,n=null){if(t||(t=B(e)),!t)return Promise.resolve();const{refreshProcess:r,isRunningProcess:o}=R(n,t);return e??=t.$container,K(pe.tagNames,e,t,n).then((()=>{(function(e,t,n){return function(e,t,n){const r=[];return t.find(`._bind_to_update_handler.sdc_uuid_${e._uuid}`).each((function(){const t=$(this);let o;if(t.hasClass("_with_handler"))o=t.data("handler");else{let t=this.tagName.toLowerCase().replace(/^this./,"");e[t]&&(o=e[t])}"function"==typeof o&&(o=o.bind(e)(t.data())),void 0!==o&&r.push(Promise.resolve(o).then((r=>{let o=$("<div></div>");return o.append(r),""===t.html()&&t.append("<div></div>"),pe.reconcile(e,o,t.children(),n)})))})),Promise.all(r)}(e,t??e.$container,n)})(t,e,r).then((()=>{o||S(r)}))}))}const Q=25e3;class Y{constructor(e,t){this.pk=e,this._model=t}set model(e){this._model=e}get model(){return this._model}load(e){if(!this._model)throw new TypeError("Model is not set!!");return e.newModel(this._model,{pk:this.pk})}}const ee={get(e,t){const n=e[t]??void 0;if(n instanceof Y){if(!n.pk&&0!==n.pk)return null;const e=new Number(n.pk);return e.load=n.load.bind(n),e}return n},set(e,t,n){if(t in e){const r=e[t];r instanceof Y?n.hasOwnProperty("pk")?r.pk=n.pk:r.pk=n:e[t]=n}else e[t]=n;return!0}};class te{constructor(e,t={}){this._onNoOpenRequests=[],this.values_list=[],this.values={},this.model_name=e,this.model_query=t,this._is_connected=!1,this._is_conneting_process=!1,this._auto_reconnect=!0,this.socket=null,this.open_request={},this.on_update=()=>{},this.on_create=()=>{},this.form_id=h()}[Symbol.iterator](){let e=-1;return{next:()=>(++e,e<this.values_list.length?{value:this.values_list[e],done:!1}:{value:null,done:!0})}}length(){return this.values_list.length}byPk(e){if(null!==e){e=parseInt(e),isNaN(e)&&(e=-1);let t=this.values_list.find((t=>t.pk===e));return t||(t=new Proxy({pk:e},ee),this.values_list.push(t)),t}return{pk:e}}filter(e){return this.model_query=Object.assign({},this.model_query,e),this}load(){return this.isConnected().then((()=>{const e=h();return new Promise(((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"load",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]}))}))}listView(e={},t=null,n=null,r={}){let o=$('<div class="container-fluid">');return this.isConnected().then((()=>{const s=h();this.socket.send(JSON.stringify({event:"model",event_type:"list_view",event_id:s,args:{model_name:this.model_name,model_query:this.model_query,filter:e,template_context:r}})),this.open_request[s]=[e=>{o.append(e.html),pe.refresh(o),t&&t(e)},e=>{n&&n(e)}]})),o}detailView(e=null,t=null,n=null,r={}){e=e??-1,e=parseInt(e),isNaN(e)&&(e=-1);let o,s=$('<div class="container-fluid">');return o=0!==this.values_list.length?this.isConnected():this.load(),o.then((()=>{-1===e&&(e=this.values_list[0].pk);const o=h();this.socket.send(JSON.stringify({event:"model",event_type:"detail_view",event_id:o,args:{model_name:this.model_name,model_query:this.model_query,pk:e,template_context:r}})),this.open_request[o]=[e=>{s.append(e.html),pe.refresh(s),t&&t(e)},e=>{n&&n(e)}]})),s}syncFormToModel(e){return this.syncForm(e)}syncModelToForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));let t=this;e.each((function(){if(!this.hasAttribute("data-model_pk"))return;let e=$(this).data("model_pk"),n=t.byPk(e);for(let e of this.elements){let t=e.name;if(t&&""!==t)if("checkbox"===e.type)e.checked=n[t];else if("file"===e.type&&n[t]instanceof File){let r=new DataTransfer;r.items.add(n[t]),e.files=r}else $(e).val(n[t])}}))}syncForm(e){e&&e.hasClass(this.form_id)||(e=$(`.${this.form_id}`));const t=this;let n=[];return e.each((function(){let e=$(this).data("model_pk"),r=t.byPk(e);for(let e of this.elements){let t=e.name;t&&""!==t&&("hidden"===e.type?r[t]=(o=$(e).val()).toLowerCase().match(/^(true|false)$/)?"true"===o.toLowerCase():"undefined"!==o?"none"===o.toLowerCase()?null:o.match(/^-?\d+$/)?parseInt(o):o.match(/^-?\d+\.?\d+$/)?parseFloat(o):o.match(/^(['][^']*['])|(["][^"]*["])$/)?o.substring(1,o.length-1):o:void 0:"checkbox"===e.type?r[t]=e.checked:"file"===e.type?r[t]=e.files[0]:r[t]=$(e).val())}var o;return n.push(r),r})),this.values_list.length<=1&&n.length>0&&(this.values=n.at(-1)),n}createForm(e=null,t=null){let n=$('<div class="container-fluid">');return this.isConnected().then((()=>{this._getForm(null,"create_form",null,n,e,t)})),n}editForm(e=-1,t=null,n=null){let r;e=parseInt(e),isNaN(e)&&(e=-1),r=0!==this.values_list.length?this.isConnected():this.load();let o=$('<div class="container-fluid">');return r.then((()=>{e<=-1&&(e=this.values_list.at(e).pk),this._getForm(e,"edit_form",null,o,t,n)})),o}namedForm(e=-1,t,n=null,r=null){let o;e=parseInt(e),isNaN(e)&&(e=-1),o=0!==this.values_list.length?this.isConnected():this.load();let s=$('<div class="container-fluid">');return o.then((()=>{e<=-1&&(e=this.values_list.at(e).pk),this._getForm(e,"named_form",t,s,n,r)})),s}_getForm(e,t,n,r,o,s){e=parseInt(e),isNaN(e)&&(e=-1);const i=h();this.socket.send(JSON.stringify({event:"model",event_type:t,event_id:i,args:{model_name:this.model_name,model_query:this.model_query,pk:e,form_name:n}}));const l=null===e||-1===e?"create":"edit";this.open_request[i]=[t=>{r.append(t.html);let n=r.closest("form").addClass(`sdc-model-${l}-form sdc-model-form ${this.form_id}`).data("model",this).data("model_pk",e);n.length>0&&!n[0].hasAttribute("sdc_submit")&&n.attr("sdc_submit","submitModelFormDistributor"),pe.refresh(r),o&&o(t)},e=>{s&&s(e)}]}new(){return new Promise(((e,t)=>{const n=$("<form>").append(this.createForm((()=>{this.syncFormToModel(n),e()}),t))}))}save(e=-1){return e=parseInt(e),isNaN(e)&&(e=-1),this.isConnected().then((()=>{let t;t=e>-1?[this.byPk(e)]:this.values_list;let n=[];return t.forEach((e=>{const t=h();n.push(new Promise(((n,r)=>{this._readFiles(e).then((o=>{this.socket.send(JSON.stringify({event:"model",event_type:"save",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:o}})),this.open_request[t]=[e=>{let t="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;e.data.instance=this._parseServerRes(t),n(e)},r]}))})))})),Promise.all(n)}))}create(e=this.values){const t=h();return this.isConnected().then((()=>new Promise(((n,r)=>{this._readFiles(e).then((o=>{this.socket.send(JSON.stringify({event:"model",event_type:"create",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,data:e,files:o}})),this.open_request[t]=[e=>{let t="string"==typeof e.data.instance?JSON.parse(e.data.instance):e.data.instance;e.data.instance=this._parseServerRes(t)[0],n(e)},r]}))}))))}delete(e=-1){e=parseInt(e),isNaN(e)&&(e=-1),-1===e&&(e=this.values?.pk);const t=h();return this.isConnected().then((()=>new Promise(((n,r)=>{this.socket.send(JSON.stringify({event:"model",event_type:"delete",event_id:t,args:{model_name:this.model_name,model_query:this.model_query,pk:e}})),this.open_request[t]=[n,r]}))))}isConnected(){return new Promise(((e,t)=>{if(this._is_connected)e();else if(this._is_conneting_process){const[n,r]=this.open_request._connecting_process;this.open_request._connecting_process=[()=>{n(),e()},()=>{r(),t()}]}else this._is_conneting_process=!0,this.open_request._connecting_process=[()=>{},()=>{}],this._connectToServer().then((()=>{e(this._checkConnection())}))}))}close(){this.socket&&(this._auto_reconnect=!1,this.socket.onclose=()=>{},this.socket.close(),delete this.socket)}clean(){return this.values_list=[],this.values={},this}_readFiles(e){let t=[],n={};for(const[r,o]of Object.entries(e))o instanceof File&&t.push(new Promise(((e,t)=>{((r,o)=>{let s=new FileReader;s.onload=s=>{const i=h();this.open_request[i]=[e,t];let l=s.target.result,a=parseInt(Math.ceil(l.length/Q));n[r]={id:i,file_name:o.name,field_name:r,content_length:o.size};for(let e=0;e<a;++e)this.socket.send(JSON.stringify({event:"model",event_type:"upload",event_id:i,args:{chunk:l.slice(Q*e,Q*(e+1)),idx:e,number_of_chunks:a,file_name:o.name,field_name:r,content_length:o.size,content_type:o.type,model_name:this.model_name,model_query:this.model_query}}))},s.onerror=()=>{t()},s.readAsBinaryString(o)})(r,o)})));return Promise.all(t).then((()=>n))}_onMessage(e){let t=JSON.parse(e.data);if(t.is_error)this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][1](t),this._closeOpenRequest(t.event_id)),(t.msg||t.header)&&T("pushErrorMsg",t.header||"",t.msg||""),"connect"===t.type&&(this.open_request._connecting_process[1](t),this._closeOpenRequest("_connecting_process"),this._auto_reconnect=!1,this.socket.close());else{if((t.msg||t.header)&&T("pushMsg",t.header||"",t.msg||""),"connect"===t.type)this._is_connected=!0,this._is_conneting_process=!1,this.open_request._connecting_process[0](t),this._closeOpenRequest("_connecting_process");else if("load"===t.type){const e=JSON.parse(t.args.data);this.values_list=[],t.args.data=this._parseServerRes(e)}else if("on_update"===t.type||"on_create"===t.type){const e=JSON.parse(t.args.data);let n,r=this._parseServerRes(e);n="on_create"===t.type?this.on_create:this.on_update,n(r),t.args.data=r}let e=t.data?.instance;e&&(t.data.instance=JSON.parse(t.data.instance)),this.open_request.hasOwnProperty(t.event_id)&&(this.open_request[t.event_id][0](t),this._closeOpenRequest(t.event_id))}}noOpenRequests(){return new Promise((e=>{if(0===Object.keys(this.open_request).length)return e();this._onNoOpenRequests.push(e)}))}_closeOpenRequest(e){delete this.open_request[e],0===Object.keys(this.open_request).length&&(this._onNoOpenRequests.forEach((e=>e())),this._onNoOpenRequests=[])}_connectToServer(){return new Promise((e=>{const t=`${this.model_name}`+(this.model_id>0?`/${this.model_id}`:"");"https:"===window.location.protocol?this.socket=new WebSocket(`wss://${window.location.host}/sdc_ws/model/${t}`):this.socket=new WebSocket(`ws://${window.location.host}/sdc_ws/model/${t}`),this.socket.onmessage=this._onMessage.bind(this),this.socket.onclose=e=>{console.error(`SDC Model (${this.model_name}, ${this.model_id}) Socket closed unexpectedly`),this._is_connected=!1;for(const[t,n]of Object.entries(this.open_request))n[1](e);this.open_request={},setTimeout((()=>{this._auto_reconnect&&this._connectToServer().then((()=>{}))}),1e3)},this.socket.onerror=e=>{if(console.error(`Model Socket encountered error: ${e} Closing socket`),this._is_connected)try{this.socket.close()}catch(e){}},this.socket.onopen=()=>{e()}}))}_checkConnection(){const e=h();return new Promise(((t,n)=>{this.socket.send(JSON.stringify({event:"model",event_type:"connect",event_id:e,args:{model_name:this.model_name,model_query:this.model_query}})),this.open_request[e]=[t,n]}))}_parseServerRes(e){let t=[];for(let n of e){const e=n.pk,r=this.byPk(e);for(const[e,t]of Object.entries(n.fields))t&&"object"==typeof t&&t.__is_sdc_model__?r[e]=new Y(t.pk,t.model):r[e]=t;t.push(r)}return 1===this.values_list.length?this.values=this.values_list.at(-1):this.values={},t}}let ne=!1,re=!1,oe=null,se={};function ie(){return window.SERVER_CALL_VIA_WEB_SOCKET?new Promise((e=>ne?e():re?void setTimeout((()=>{ie().then((()=>{e()}))}),200):e(ae()))):Promise.resolve(!0)}function le(){window.SERVER_CALL_VIA_WEB_SOCKET&&function(){if(ne){ne=!1;try{oe.close()}catch(e){}}}()}function ae(){return re=!0,new Promise((e=>{oe="https:"===window.location.protocol?new WebSocket(`wss://${window.location.host}/sdc_ws/ws/`):new WebSocket(`ws://${window.location.host}/sdc_ws/ws/`),oe.onmessage=function(e){ce(JSON.parse(e.data))},oe.onclose=function(){ne&&console.error("SDC Socket closed unexpectedly"),ne=!1;for(const[e,t]of Object.entries(se))t[1]({}),delete se[e];setTimeout((()=>{ae()}),1e3)},oe.onerror=function(e){if(console.error("Socket encountered error: ",e.message,"Closing socket"),ne)try{oe.close()}catch(e){}},oe.onopen=function(){ne=!0,re=!1,e()}}))}function ce(e){if(e||(e={}),e.is_error)(e.msg||e.header)&&T("pushErrorMsg",e.header||"",e.msg||""),e.id&&se[e.id]&&(se[e.id][1](e.data||null),delete se[e.id]);else if((e.msg||e.header)&&T("pushMsg",e.header||"",e.msg||""),e.type&&"sdc_recall"===e.type)e.id&&se[e.id]&&(se[e.id][0](e.data),delete se[e.id]);else if(e.type&&"sdc_event"===e.type){let t=e.event;t&&T(t,e.payload)}else e.type&&"sdc_redirect"===e.type&&T("onNavLink",e.link)}class ue{constructor(){this._uuid=h(),this.contentUrl="",this.contentReload=!1,this.parsedContentUrl=null,this.events=[],this.load_async=!1,this._isEventsSet=!1,this._allEvents=null,this._urlParams=[],this._models=[],this._cssUrls=[],this.afterShow=()=>{console.warn("afterShow is deprecated!!")},this._mixins={},this._tagName=Object.getPrototypeOf(this)._tagName??"",this._childController={},this._parentController=null,this._onLoadDone=!1,this.$container=null,this._isMixin=!1}_runLifecycle(e,t){pe.DEBUG&&!this._isMixin&&console.debug(e,this._tagName);let n=[];if(!this._isMixin){this._isMixin=!0;for(let r in this._mixins){let o=this._mixins[r];"function"==typeof o[e]&&n.push(o[e].apply(this,t))}return Promise.all(n).then((()=>{this._isMixin=!1}))}}onInit(){pe.DEBUG&&!this._isMixin&&console.DEBUG(Array.apply(null,arguments),this._tagName)}get parentController(){return this._parentController}get childController(){return this._childController}onLoad(){return this._runLifecycle("onLoad",arguments)}willShow(){return this._runLifecycle("willShow",arguments)}onRefresh(){return this._runLifecycle("onRefresh",arguments)}onRemove(){return this._runLifecycle("onRemove",arguments),!0}noOpenModelRequests(){return Promise.all(this._models.map((e=>e.noOpenRequests())))}remove(){for(const e of this._models)e.close();let e=this._childController;for(let t in e)if(e.hasOwnProperty(t))for(let n of e[t])if(!n.remove())return!1;if(!this.onRemove||this.onRemove()){I(this);const e=l(this._tagName);if(this._parentController._childController[e]){let t=this._parentController._childController[e];for(let e=0;e<t.length;e++)t[e]===this&&t.splice(e,1)}return this.$container.remove(),!0}return!1}controller_name(){return this._tagName.replace(/-./g,(e=>` ${e[1].toUpperCase()}`)).replace(/^./g,(e=>`${e.toUpperCase()}`))}addEvent(e,t,n){this.getEvents(),this._allEvents[e]=this._allEvents[e]||{},this._allEvents[e][t]=n}getEvents(){if(this._allEvents)return this._allEvents;let e=[];e=e.concat(this.events);for(let t in this._mixins){let n=this._mixins[t];Array.isArray(n.events)&&(e=e.concat(n.events))}return this._allEvents=_.merge(...e)}post(e,t){return pe.post(this,e,t)}get(e,t){return pe.get(this,e,t)}submitForm(e,t,n){return pe.submitFormAndUpdateView(this,e,t,n)}serverCall(e,t){let n=this.contentUrl.match(/sdc_view\/([^/]+)/i);if(n&&!(n.length<2))return function(e,t,n,r,o){return window.SERVER_CALL_VIA_WEB_SOCKET?function(e,t,n,r){let o=h();return ie().then((()=>{oe.send(JSON.stringify({event:"sdc_call",id:o,controller:t,app:e,function:n,args:r}))})),new Promise(((e,t)=>{se[o]=[e,t]}))}(e,t,r,o):function(e,t,n){return"object"!=typeof n&&Array.isArray(n)&&null===n&&(n={arg0:n}),n={data:JSON.stringify(n),_sdc_func_name:t,_method:"sdc_server_call"},$.post({url:e,data:n,beforeSend:function(e,t){e.setRequestHeader("X-CSRFToken",window.CSRF_TOKEN)}}).then((e=>{const t=e._return_data;return ce(t),t})).catch((e=>{const t=e.responseJSON;throw t.is_error=!0,ce(t),e}))}(n,r,o)}(n[1],this._tagName,this.parsedContentUrl??this.contentUrl,e,t);console.error("To use the serverCall function the contentUrl must be set: "+this.name)}newModel(e,t={}){if(e instanceof Number&&e.hasOwnProperty("load"))return e.load(this);const n=new te(e,t);return this._models.push(n),n}updateModel(e,t={},n){let r=new te(e,t);return r.load().then((()=>{r.values|=n,r.save().then((()=>(r.close(),r.values)))}))}find(e){return this.$container.find(e)}refresh(){return pe.refresh(this.$container,this)}reload(){return pe.reloadController(this)}reconcile(e,t=null){return pe.reconcile(this,e,t)}submitModelFormDistributor(e,t){return"function"==typeof this._submitModelForm?this._submitModelForm(e,t):"function"==typeof this.submitModelForm?this.submitModelForm(e,t):this.defaultSubmitModelForm(e,t)}iterateAllChildren(){let e=this._childController,t=[];for(let n in e)if(e.hasOwnProperty(n))for(let r of e[n])t.push(r),t.push(...r.iterateAllChildren());return t}defaultSubmitModelForm(e,t){let n=[];if(!this._isMixin){t.stopPropagation(),t.preventDefault();let r=e.data("model");const o=r.syncForm(e);for(let t of o)n.push(new Promise(((n,o)=>{let s;s=null!==t.pk&&t.pk>=0?r.save(t.pk):r.create(t),s.then((t=>{p(e),this.submit_model_form_success&&this.submit_model_form_success(t[0]);for(const e of this.iterateAllChildren())e.submit_model_form_success&&e.submit_model_form_success(t[0]);n(t)})).catch((t=>{f(e,$(t.html)),this.submit_model_form_error&&this.submit_model_form_error(t);for(const e of this.iterateAllChildren())e.submit_model_form_error&&e.submit_model_form_error(t);o(t)}))})))}return Promise.all(n).then((e=>Object.assign({},...e.flat())))}}const de={classname:"class"};window.sdcDom=function(e,t,...n){if(!e)return"";const r=function(e,t){let n,r=!1;if("string"==typeof e)n=$(document.createElement(e));else{const t=`this.${e.name}`;n=$(document.createElement(t)),n.data("handler",e),r=!0}return t&&Object.entries(t).forEach((([e,t])=>{e.startsWith("on")?n[0].addEventListener(e.substring(2).toLowerCase(),t):(de[e.toLowerCase()]&&(e=de[e.toLowerCase()]),n[0].setAttribute(e,t))})),r&&n.addClass("_bind_to_update_handler _with_handler"),n}(e,t);for(const e of n)r.append(e);return r};let he,pe={CSRF_TOKEN:window.CSRF_TOKEN||"",LANGUAGE_CODE:window.LANGUAGE_CODE||"en",DEBUG:window.DEBUG||!1,VERSION:window.VERSION||"0.0",tagNames:[],Global:O,rootController:null,globalRootController:null,_isInit:!1,_origin_trigger:null,_globalControllerClasses:[],init_sdc:()=>{pe._isInit||(pe._isInit=!0,pe._origin_trigger?le():(pe._origin_trigger=$.fn.trigger,$.fn.trigger=function(e){const t={}.hasOwnProperty.call(e,"type")?e.type:e;return v.includes(t)||(v.push(t),$(window).on(t,w)),pe._origin_trigger.call(this,e)},pe.updateJquery()),ie(),function(){const e=$(window);v.forEach((t=>{e.off(t).on(t,w)}))}(),pe.rootController=pe.rootController||new ue,pe.globalRootController=pe.globalRootController||new ue),pe.tagNames=Object.keys(b);const e=$("<div></div>");O.forEach((t=>{const n=b[t][0];e.append(`<${n.prototype._tagName}></${n.prototype._tagName}>`)}));const{refreshProcess:t}=R(null,pe.rootController);return K(pe.tagNames,e,pe.globalRootController,t).then((()=>K(pe.tagNames,(n||(n=$("body")),n),pe.rootController,t).then((e=>(S(t),e)))))},updateJquery:()=>{$.fn.safeReplace=function(e){return pe.safeReplace($(this),e)},$.fn.safeEmpty=function(){return pe.safeEmpty($(this))},$.fn.safeRemove=function(){return pe.safeRemove($(this))}},controllerToTag:e=>i(e.name).replace(/-controller$/,""),registerGlobal:e=>{pe.register(e);let t=e.prototype._tagName;O.push(t)},cleanCache:()=>{j={}},register:e=>{let t=pe.controllerToTag(e);return b[t]=[e,[]],e.prototype._tagName=t,{addMixin:(...e)=>{for(let n of e){let e;"string"==typeof n?e=i(n):n&&(e=pe.controllerToTag(n)),b[t][1].push(e)}}}},post:(e,t,n)=>(n||(n={}),n.CSRF_TOKEN=pe.CSRF_TOKEN,pe.ajax(e,t,params,$.post)),get:(e,t,n)=>pe.ajax(e,t,n,$.get),ajax:(e,t,n,r)=>{n||(n={}),n.VERSION=pe.VERSION,n._method=n._method||"api";const o=new Promise(((s,i)=>r(t,n).then(((t,n,r)=>{s(t,n,r),"redirect"===t.status?T("onNavLink",t["url-link"]):o.then((()=>{pe.refresh(e.$container)}))})).catch(i)));return o},submitFormAndUpdateView:(e,t,n,r)=>{let o=new FormData(t);const s=e=>{e["url-link"]?T("onNavLink",e["url-link"]):window.location.href=e.url},i=new Promise(((l,a)=>{c(o,n||t.action,r||t.method).then(((t,n,r)=>{l(t,n,r),"redirect"===t.status?s(t):i.then((()=>{pe.refresh(e.$container,e)}))})).catch(((e,t,n)=>{301===e.status?(e=e.responseJSON,s(e),l(e,t,n)):a(e,t,n)}))}));return i},submitForm:(e,t,n)=>{let r=new FormData(e);return new Promise(((o,s)=>{c(r,t||e.action,n||e.method).then(o).catch(s)}))},getController:e=>B(e),safeEmpty:e=>(e.children().each((function(e,t){let n=$(t);pe.safeRemove(n)})),e),safeReplace:(e,t)=>(t.insertBefore(e),pe.safeRemove(e)),safeRemove:e=>(e.each((function(){let e=$(this);e.data(`${M}`)&&e.data(`${M}`).remove()})),e.find(`.${L}`).each((function(){const e=$(this).data(`${M}`);e&&e.remove()})),e.remove()),reloadController:e=>function(e){if(e.contentUrl){let t=V(e,e.contentUrl);return e.contentUrl=t.url,J(e.contentUrl,t.args,e._tagName,e.contentReload)}return new Promise((e=>{e($())}))}(e).then((t=>{let n=$(t);return pe.reconcile(e,n)})),reconcile:(e,t,n=null,r=null)=>{if(!n){let n=e.$container.clone().empty();n.data(M,null),n.removeClass(L),n.append(t),t=n}n=n??e.$container;const{refreshProcess:o,isRunningProcess:s}=R(r,e);return z(t,e,o).then((()=>{var r;return X(t,n),(r=e)._childController={},r.find(`.${L}`).each((function(){const e=B($(this));e===r&&k(r,e)})),s||S(o),e}))},refresh:(e,t)=>z(e,t)},fe=[];function _e(){if(!jest)throw new Error("JEST is not defined");0===fe.length&&(he=$.ajax.bind($),fe.push(jest.spyOn($,"ajax")),fe[0].mockImplementation((function(e){return he(e).then((e=>e)).catch((e=>e))})))}const me=le,ge={get_controller:async function(e,t={},n=""){_e();const r=$("body");pe.updateJquery(),r.safeEmpty();const o=$(`<${e}>${n}</${e}>`);for(const[e,n]of Object.entries(t))o.data(e,n);const s=$("<div></div>").append(o);return r.append(s),pe._isInit=!1,pe.cleanCache(),await pe.init_sdc(),pe.getController(o)},getCsrfToken:function(){return function(e){if(document.cookie&&""!==document.cookie){const t=document.cookie.split(";");for(let n=0;n<t.length;n++){const r=t[n].trim();if(r.substring(0,10)===e+"=")return decodeURIComponent(r.substring(10))}}return""}("csrftoken")},controllerFromTestHtml:async function(e,t=null){_e();const n=$("body");pe.updateJquery(),n.safeEmpty().append(e),pe._isInit=!1,pe.cleanCache(),await pe.init_sdc();let r=pe.rootController.iterateAllChildren();if(!t)return r;const o=r[0].onRefresh,s=jest.spyOn(r[0],"onRefresh");return new Promise((e=>{s.mockImplementation((function(){s.mockRestore();const t=o.apply(r[0],arguments);return e(r),t}))}))}};var ye=t.n$,ve=t.du,we=t.yA,$e=t.g3,Ce=t.u2,Oe=t.n9,be=t.on,ke=t.yy,Pe=t.R6,Ne=t.$n,Ee=t.hA,Se=t.VB,Re=t.hZ;export{ye as AbstractSDC,ve as allOff,we as app,$e as checkIfParamNumberBoolOrString,Ce as clearErrorsInForm,Oe as controllerFactory,be as on,ke as runControlFlowFunctions,Pe as setErrorsInForm,Ne as setEvent,Ee as socketReconnect,Se as test_utils,Re as trigger};
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "sdc_client",
3
- "version": "0.57.14",
3
+ "version": "0.57.15",
4
4
  "description": "Simple Dom Control",
5
- "main": "dist/ugly.index.js",
5
+ "main": "src/index.js",
6
6
  "type": "module",
7
7
  "scripts": {
8
8
  "build": "gulp development & gulp build",
@@ -336,8 +336,12 @@ function _reloadMethodHTML(controller, $dom, process) {
336
336
  plist.push(Promise.resolve(result).then((x) => {
337
337
  let $newContent = $(`<div></div>`);
338
338
  $newContent.append(x);
339
- $newContent = $this.clone().empty().append($newContent);
340
- return app.reconcile(controller, $newContent, $this, process);
339
+
340
+ if ($this.html() === '') {
341
+ $this.append('<div></div>');
342
+ }
343
+
344
+ return app.reconcile(controller, $newContent, $this.children(), process);
341
345
  }));
342
346
  }
343
347
 
@@ -363,7 +367,7 @@ function getNodeKey(node) {
363
367
  return res.join('__');
364
368
  }
365
369
 
366
- function reconcileTree($element, id = [], parent = null) {
370
+ function reconcileTree({$element, id = [], parent = null}) {
367
371
  id.push(getNodeKey($element));
368
372
  const obj = {
369
373
  $element,
@@ -379,14 +383,19 @@ function reconcileTree($element, id = [], parent = null) {
379
383
  parent
380
384
  };
381
385
  obj.getIdx.bind(obj);
382
- return [obj].concat($element.contents().toArray().map((x) => reconcileTree($(x), id.slice(), obj)).flat());
386
+ return [obj].concat($element.contents().toArray().map((x) => reconcileTree({
387
+ $element: $(x),
388
+ id: id.slice(),
389
+ parent: obj
390
+ })).flat());
383
391
 
384
392
  }
385
393
 
386
394
 
387
395
  export function reconcile($virtualNode, $realNode) {
388
- const $old = reconcileTree($realNode);
389
- const $new = reconcileTree($virtualNode);
396
+
397
+ const $old = reconcileTree({$element: $realNode});
398
+ const $new = reconcileTree({$element: $virtualNode});
390
399
  $old.map((x, i) => x.idx = i);
391
400
  $new.map((x, i) => x.idx = i);
392
401
  const depth = Math.max(...$new.concat($old).map(x => x.depth));
@@ -504,7 +513,7 @@ function lcbDiff(oldNodes, newNodes, depth) {
504
513
 
505
514
  function getBefore(element, idx) {
506
515
  const startDepth = element.depth;
507
- while (idx >= 0 && element.depth >= startDepth) {
516
+ while (idx >= 1 && element.depth >= startDepth) {
508
517
  idx -= 1;
509
518
  element = newNodes[idx];
510
519
  if (element.depth === startDepth) {