{"version":3,"sources":["jsdelivr-header.js","/npm/@lemonadejs/studio@5.7.9/dist/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNA,IAAM,UAAgC,mBAAd,QACpB,IAAI,SAAW,QAAQ,eAGzB,SAAU,EAAQ,GACG,iBAAZ,SAA0C,oBAAX,OAAyB,OAAO,QAAU,IAC9D,mBAAX,QAAyB,OAAO,IAAM,OAAO,GACpD,EAAO,OAAS,GACpB,CAJC,CAIC,MAAM,WAER,IAAI,EAwlSA,OAvlSK,WACC,IAAI,EAAsB,CAE9B,GACA,SAAU,GAYJ,EAAO,QAEX,WAEJ,aAEA,MAAM,EAAU,WACZ,MAAM,EAAY,CAAC,EAGb,EAAmB,KAAK,IAAI,KAAM,EAAG,GACrC,EAAmB,KAAK,IAAI,KAAM,EAAG,IACrC,EAAqB,MAG3B,EAAU,IAAM,SAAU,GAKtB,OAHqB,KADrB,EAAQ,GAAK,GACH,SACN,EAAQ,IAAM,GAEX,CACX,EAEA,EAAU,YAAc,SAAU,GAC9B,OAAO,aAAa,OAAS,MAAM,EAAE,UACzC,EAEA,EAAU,kBAAoB,SAAS,GACnC,GAAoB,iBAAT,EAAmB,CAE1B,MAAM,EAAQ,EAAK,UAAU,EAAG,IAAI,MAAM,6BAC1C,GAAI,EAAO,CACP,MAAM,EAAO,OAAO,EAAM,IACpB,EAAQ,OAAO,EAAM,IAAM,EAC3B,EAAM,OAAO,EAAM,IACnB,EAAS,IAAI,KAAK,KAAK,IAAI,EAAM,EAAO,IAE9C,OAAO,EAAO,mBAAqB,GAAQ,EAAO,gBAAkB,GAAS,EAAO,eAAiB,CACzG,CACJ,CAEA,OAAO,CACX,EAEA,EAAU,SAAW,SAAU,EAAM,GACjC,IAAI,EAAI,KACJ,EAAI,KACJ,EAAI,KACJ,EAAI,KACJ,EAAI,KACJ,EAAI,KAqBR,OAnBI,MAAM,QAAQ,IACd,EAAI,EAAK,GACT,EAAI,EAAK,GACT,EAAI,EAAK,GACT,EAAI,EAAK,GACT,EAAI,EAAK,GACT,EAAI,EAAK,KAEJ,IACD,EAAO,IAAI,MAEf,EAAI,EAAK,iBACT,EAAI,EAAK,cAAgB,EACzB,EAAI,EAAK,aACT,EAAI,EAAK,cACT,EAAI,EAAK,gBACT,EAAI,EAAK,kBAGI,IAAb,EACO,EAAU,IAAI,GAAK,IAAM,EAAU,IAAI,GAAK,IAAM,EAAU,IAAI,GAGnE,EAAU,IAAI,GAAK,IAAM,EAAU,IAAI,GAAK,IAAM,EAAU,IAAI,GAAK,IAAM,EAAU,IAAI,GAAK,IAAM,EAAU,IAAI,GAAK,IAAM,EAAU,IAAI,EAGvJ,EAEA,EAAU,QAAU,SAAU,GAC1B,IAAI,EAAO,EAAM,OAA8B,IAAxB,EAAM,QAAQ,KAAc,IAAM,KACrD,EAAO,EAAK,GAEhB,EAAO,EAAK,GAAG,MAAM,KACrB,IAAI,EAAI,SAAS,EAAK,IAClB,EAAI,SAAS,EAAK,IAClB,EAAI,SAAS,EAAK,IAClB,EAAI,EACJ,EAAI,EAOR,OALI,IACA,EAAO,EAAK,MAAM,KAClB,EAAI,SAAS,EAAK,IAClB,EAAI,SAAS,EAAK,KAEf,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3B,EAEA,EAAU,kBAAoB,SAAU,GACpC,OAAO,EAAU,SAAS,GAAK,EACnC,EAEA,EAAU,UAAY,SAAU,GACN,iBAAX,IACP,EAAS,IAAI,KAAK,EAAS,YAE/B,IAAI,EAAuB,EAAO,UAMlC,OALI,GAAwB,IACxB,GAAwB,GAE5B,GAAwB,EAEjB,EAAuB,CAClC,EAEA,EAAU,UAAY,SAAU,EAAmB,GAE/C,GAAI,SAAuF,KAAtB,EACjE,MAAO,GAGX,MAAM,EAAa,MACb,EAAc,MAGd,EAAoB,KAAK,IAAI,KAAM,GAAI,IAE7C,IAAI,EAAY,KAAK,MAAM,GACvB,EAAgB,EAAoB,EAGpC,GAAa,KAAI,GAAa,GAGlC,IAAI,EAAK,EAAoB,EAAY,EAIzC,GAAgB,IADA,KAAK,MAAM,EAAgB,GAG3C,MAAM,EAAI,IAAI,KAAK,GAEb,EAAM,CACR,EAAE,iBACF,EAAU,IAAI,EAAE,cAAgB,GAChC,EAAU,IAAI,EAAE,cAChB,EAAU,IAAI,EAAE,eAChB,EAAU,IAAI,EAAE,iBAChB,EAAU,IAAI,EAAE,kBAGpB,OAAO,EAAU,EAAM,EAAU,SAAS,GAAK,EACnD,EAEA,EAAU,SAAW,SAAU,EAAG,GACzB,IACD,EAAQ,CACJ,QAAS,WACT,YAAa,WACb,UAAW,WACX,SAAU,WACV,UAAW,WACX,WAAY,cACZ,UAAW,cAIO,IAAtB,EAAE,QAAQ,SAAqC,IAApB,EAAE,QAAQ,OACrC,GAAK,QAGT,IAAI,EAAK,IAAI,KACT,EAAK,IAAI,KAAK,GACd,EAAQ,UAAU,EAAK,GAAM,IAAO,IAExC,MAAM,EAAS,CAAC,EAAG,IACR,EAAE,QAAQ,MAAO,GAG5B,OAAK,EAEM,EAAQ,GACR,EAAO,EAAM,YAAa,GAC1B,EAAQ,KAER,EAAO,EAAM,UAAW,KAAK,MAAM,EAAQ,KAC3C,EAAQ,MAER,EAAO,EAAM,SAAU,KAAK,MAAM,EAAQ,OAC1C,EAAQ,MAER,EAAO,EAAM,UAAW,KAAK,MAAM,EAAQ,QAC3C,EAAQ,QAER,EAAO,EAAM,WAAY,KAAK,MAAM,EAAQ,QAG5C,EAAO,EAAM,UAAW,KAAK,MAAM,EAAQ,SAjB3C,EAAM,OAmBrB,EAEA,EAAU,YAAc,WACpB,IAAI,EAAW,SAAS,iBAAiB,eACzC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAS,OAAQ,IAC7B,EAAS,GAAG,aAAa,aACzB,EAAS,GAAG,UAAY,EAAU,SAAS,EAAS,GAAG,aAAa,cAEhE,EAAS,GAAG,YACZ,EAAS,GAAG,aAAa,QAAS,EAAS,GAAG,WAC9C,EAAS,GAAG,aAAa,YAAa,EAAS,GAAG,WAClD,EAAS,GAAG,UAAY,EAAU,SAAS,EAAS,GAAG,WAIvE,EAGA,EAAU,IAAM,EAAU,SAE1B,MAAM,EAAW,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YAC9E,EAAS,CAAC,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YAExH,EAAY,SAAU,GACxB,MAAwB,oBAAb,UAA4B,SAAS,YACrC,SAAS,WAAW,IAEpB,CAEf,EAkCA,OAhCA,OAAO,eAAe,EAAW,WAAY,CACzC,IAAK,WACD,OAAO,EAAS,KAAI,SAAU,GAC1B,OAAO,EAAU,EACrB,GACJ,IAGJ,OAAO,eAAe,EAAW,gBAAiB,CAC9C,IAAK,WACD,OAAO,EAAS,KAAI,SAAU,GAC1B,OAAO,EAAU,GAAG,UAAU,EAAG,EACrC,GACJ,IAGJ,OAAO,eAAe,EAAW,SAAU,CACvC,IAAK,WACD,OAAO,EAAO,KAAI,SAAU,GACxB,OAAO,EAAU,EACrB,GACJ,IAGJ,OAAO,eAAe,EAAW,cAAe,CAC5C,IAAK,WACD,OAAO,EAAO,KAAI,SAAU,GACxB,OAAO,EAAU,GAAG,UAAU,EAAG,EACrC,GACJ,IAGG,CACV,CAlQe,GAy5HhB,MAAO,CAAE,KArpHI,WAET,MAAM,EAAS,CAEX,OAAQ,CAAE,iBAEV,KAAM,CAAE,IAAK,KAEb,SAAU,CAAE,2BAEZ,SAAU,CAAE,mCAEZ,WAAY,CAAE,gCAEd,WAAY,CAAE,wBAEd,QAAS,CAAE,sBAAuB,MAElC,SAAU,CAAE,OAAQ,MAAO,KAAM,QAAS,OAAQ,MAAO,KAAM,QAAS,OAAQ,MAAO,KAAM,KAAM,MAAO,KAAM,IAAK,IAAK,QAAS,MAAO,OAAQ,OAAQ,KAAM,UAAW,IAAK,QAAS,KAAM,KAAM,KAAM,IAAK,IAAK,IAAK,KAE1N,QAAS,CAAE,IAAK,IAAK,MAAO,MAAO,MAAO,OAAQ,eAAgB,aAAc,MAAO,MAAO,MAG5F,EAAe,CACjB,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,KAAQ,CACJ,IACA,IACA,KAEJ,KAAQ,CACJ,IACA,IACA,KAEJ,KAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,KAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,IACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,KAAQ,CACJ,KACA,IACA,KAEJ,KAAQ,CACJ,OACA,IACA,KAEJ,OAAQ,CACJ,MACA,IACA,KAEJ,KAAQ,CACJ,IACA,IACA,KAEJ,KAAQ,CACJ,KACA,IACA,KAEJ,KAAQ,CACJ,MACA,IACA,KAEJ,OAAQ,CACJ,KACA,IACA,KAEJ,KAAQ,CACJ,MA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","file":"/npm/@lemonadejs/studio@5.7.9/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@lemonadejs/studio@5.7.9/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","if (! lemonade && typeof(require) === 'function') {\n    var lemonade = require('lemonadejs');\n}\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.studio = factory();\n}(this, (function () {\n\nvar studio;\n/******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 91:\n/***/ (function(module) {\n\n/**\r\n * (c) jSuites Javascript Plugins and Web Components (v6)\r\n *\r\n * Website: https://jsuites.net\r\n * Description: Create amazing web based applications.\r\n *\r\n * MIT License\r\n */\r\n\r\n;(function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    'use strict';\r\n\r\n    const Helpers = (function () {\r\n        const component = {};\r\n\r\n        // Excel like dates\r\n        const excelInitialTime = Date.UTC(1900, 0, 0);\r\n        const excelLeapYearBug = Date.UTC(1900, 1, 29);\r\n        const millisecondsPerDay = 86400000;\r\n\r\n        // Transform in two digits\r\n        component.two = function (value) {\r\n            value = '' + value;\r\n            if (value.length === 1) {\r\n                value = '0' + value;\r\n            }\r\n            return value;\r\n        };\r\n\r\n        component.isValidDate = function (d) {\r\n            return d instanceof Date && !isNaN(d.getTime());\r\n        };\r\n\r\n        component.isValidDateFormat = function(date) {\r\n            if (typeof date === 'string') {\r\n                // Check format: YYYY-MM-DD using regex\r\n                const match = date.substring(0, 10).match(/^(\\d{4})-(\\d{2})-(\\d{2})$/);\r\n                if (match) {\r\n                    const year = Number(match[1]);\r\n                    const month = Number(match[2]) - 1;\r\n                    const day = Number(match[3]);\r\n                    const parsed = new Date(Date.UTC(year, month, day));\r\n                    // Return\r\n                    return parsed.getUTCFullYear() === year && parsed.getUTCMonth() === month && parsed.getUTCDate() === day;\r\n                }\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        component.toString = function (date, dateOnly) {\r\n            let y = null;\r\n            let m = null;\r\n            let d = null;\r\n            let h = null;\r\n            let i = null;\r\n            let s = null;\r\n\r\n            if (Array.isArray(date)) {\r\n                y = date[0];\r\n                m = date[1];\r\n                d = date[2];\r\n                h = date[3];\r\n                i = date[4];\r\n                s = date[5];\r\n            } else {\r\n                if (!date) {\r\n                    date = new Date();\r\n                }\r\n                y = date.getUTCFullYear();\r\n                m = date.getUTCMonth() + 1;\r\n                d = date.getUTCDate();\r\n                h = date.getUTCHours();\r\n                i = date.getUTCMinutes();\r\n                s = date.getUTCSeconds();\r\n            }\r\n\r\n            if (dateOnly === true) {\r\n                return component.two(y) + '-' + component.two(m) + '-' + component.two(d);\r\n            } else {\r\n                return (\r\n                    component.two(y) + '-' + component.two(m) + '-' + component.two(d) + ' ' + component.two(h) + ':' + component.two(i) + ':' + component.two(s)\r\n                );\r\n            }\r\n        };\r\n\r\n        component.toArray = function (value) {\r\n            let date = value.split(value.indexOf('T') !== -1 ? 'T' : ' ');\r\n            let time = date[1];\r\n\r\n            date = date[0].split('-');\r\n            let y = parseInt(date[0]);\r\n            let m = parseInt(date[1]);\r\n            let d = parseInt(date[2]);\r\n            let h = 0;\r\n            let i = 0;\r\n\r\n            if (time) {\r\n                time = time.split(':');\r\n                h = parseInt(time[0]);\r\n                i = parseInt(time[1]);\r\n            }\r\n            return [y, m, d, h, i, 0];\r\n        };\r\n\r\n        component.arrayToStringDate = function (arr) {\r\n            return component.toString(arr, false);\r\n        };\r\n\r\n        component.dateToNum = function (jsDate) {\r\n            if (typeof jsDate === 'string') {\r\n                jsDate = new Date(jsDate + '  GMT+0');\r\n            }\r\n            let jsDateInMilliseconds = jsDate.getTime();\r\n            if (jsDateInMilliseconds >= excelLeapYearBug) {\r\n                jsDateInMilliseconds += millisecondsPerDay;\r\n            }\r\n            jsDateInMilliseconds -= excelInitialTime;\r\n\r\n            return jsDateInMilliseconds / millisecondsPerDay;\r\n        };\r\n\r\n        component.numToDate = function (excelSerialNumber, asArray) {\r\n            // allow 0; only bail on null/undefined/empty\r\n            if (excelSerialNumber === null || excelSerialNumber === undefined || excelSerialNumber === '') {\r\n                return '';\r\n            }\r\n\r\n            const MS_PER_DAY = 86_400_000;\r\n            const SEC_PER_DAY = 86_400;\r\n\r\n            // Excel day 0 is 1899-12-31 (with the fake 1900-02-29 at serial 60)\r\n            const EXCEL_DAY0_UTC_MS = Date.UTC(1899, 11, 31);\r\n\r\n            let wholeDays = Math.floor(excelSerialNumber);\r\n            let fractionalDay = excelSerialNumber - wholeDays;\r\n\r\n            // Fix the 1900 leap-year bug: shift serials >= 60 back one day\r\n            if (wholeDays >= 60) wholeDays -= 1;\r\n\r\n            // Build midnight UTC of the day\r\n            let ms = EXCEL_DAY0_UTC_MS + wholeDays * MS_PER_DAY;\r\n\r\n            // Add time part using integer seconds to avoid FP jitter\r\n            const seconds = Math.round(fractionalDay * SEC_PER_DAY);\r\n            ms += seconds * 1000;\r\n\r\n            const d = new Date(ms);\r\n\r\n            const arr = [\r\n                d.getUTCFullYear(),\r\n                component.two(d.getUTCMonth() + 1),\r\n                component.two(d.getUTCDate()),\r\n                component.two(d.getUTCHours()),\r\n                component.two(d.getUTCMinutes()),\r\n                component.two(d.getUTCSeconds()),\r\n            ];\r\n\r\n            return asArray ? arr : component.toString(arr, false);\r\n        };\r\n\r\n        component.prettify = function (d, texts) {\r\n            if (!texts) {\r\n                texts = {\r\n                    justNow: 'Just now',\r\n                    xMinutesAgo: '{0}m ago',\r\n                    xHoursAgo: '{0}h ago',\r\n                    xDaysAgo: '{0}d ago',\r\n                    xWeeksAgo: '{0}w ago',\r\n                    xMonthsAgo: '{0} mon ago',\r\n                    xYearsAgo: '{0}y ago',\r\n                };\r\n            }\r\n\r\n            if (d.indexOf('GMT') === -1 && d.indexOf('Z') === -1) {\r\n                d += ' GMT';\r\n            }\r\n\r\n            let d1 = new Date();\r\n            let d2 = new Date(d);\r\n            let total = parseInt((d1 - d2) / 1000 / 60);\r\n\r\n            const format = (t, o) => {\r\n                return t.replace('{0}', o);\r\n            };\r\n\r\n            if (!total) {\r\n                return texts.justNow;\r\n            } else if (total < 90) {\r\n                return format(texts.xMinutesAgo, total);\r\n            } else if (total < 1440) {\r\n                // One day\r\n                return format(texts.xHoursAgo, Math.round(total / 60));\r\n            } else if (total < 20160) {\r\n                // 14 days\r\n                return format(texts.xDaysAgo, Math.round(total / 1440));\r\n            } else if (total < 43200) {\r\n                // 30 days\r\n                return format(texts.xWeeksAgo, Math.round(total / 10080));\r\n            } else if (total < 1036800) {\r\n                // 24 months\r\n                return format(texts.xMonthsAgo, Math.round(total / 43200));\r\n            } else {\r\n                // 24 months+\r\n                return format(texts.xYearsAgo, Math.round(total / 525600));\r\n            }\r\n        };\r\n\r\n        component.prettifyAll = function () {\r\n            let elements = document.querySelectorAll('.prettydate');\r\n            for (let i = 0; i < elements.length; i++) {\r\n                if (elements[i].getAttribute('data-date')) {\r\n                    elements[i].innerHTML = component.prettify(elements[i].getAttribute('data-date'));\r\n                } else {\r\n                    if (elements[i].innerHTML) {\r\n                        elements[i].setAttribute('title', elements[i].innerHTML);\r\n                        elements[i].setAttribute('data-date', elements[i].innerHTML);\r\n                        elements[i].innerHTML = component.prettify(elements[i].innerHTML);\r\n                    }\r\n                }\r\n            }\r\n        };\r\n\r\n        // Compatibility with jSuites\r\n        component.now = component.toString;\r\n\r\n        const weekdays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n        const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];\r\n\r\n        const translate = function (t) {\r\n            if (typeof document !== 'undefined' && document.dictionary) {\r\n                return document.dictionary[t] || t;\r\n            } else {\r\n                return t;\r\n            }\r\n        };\r\n\r\n        Object.defineProperty(component, 'weekdays', {\r\n            get: function () {\r\n                return weekdays.map(function (v) {\r\n                    return translate(v);\r\n                });\r\n            },\r\n        });\r\n\r\n        Object.defineProperty(component, 'weekdaysShort', {\r\n            get: function () {\r\n                return weekdays.map(function (v) {\r\n                    return translate(v).substring(0, 3);\r\n                });\r\n            },\r\n        });\r\n\r\n        Object.defineProperty(component, 'months', {\r\n            get: function () {\r\n                return months.map(function (v) {\r\n                    return translate(v);\r\n                });\r\n            },\r\n        });\r\n\r\n        Object.defineProperty(component, 'monthsShort', {\r\n            get: function () {\r\n                return months.map(function (v) {\r\n                    return translate(v).substring(0, 3);\r\n                });\r\n            },\r\n        });\r\n\r\n        return component;\r\n    })();\r\n\r\n    const Mask = (function() {\r\n        // Currency\r\n        const tokens = {\r\n            // Escape\r\n            escape: [ '\\\\\\\\[.\\\\s\\\\S]' ],\r\n            // Text\r\n            text: [ '@', '&' ],\r\n            // Number\r\n            fraction: [ '#{0,1}.*?\\\\?+\\\\/[0-9?]+' ],\r\n            // Currency tokens\r\n            currency: [ '#(.{1})##0?(.{1}0+)?( ?;(.*)?)?' ],\r\n            // Scientific\r\n            scientific: [ '[0#]+([.,]{1}0*#*)?E{1}\\\\+0+' ],\r\n            // Percentage\r\n            percentage: [ '[0#]+([.,]{1}0*#*)?%' ],\r\n            // Number\r\n            numeric: [ '[0#]+([.,]{1}0*#*)?', '#+' ],\r\n            // Data tokens\r\n            datetime: [ 'YYYY', 'YYY', 'YY', 'MMMMM', 'MMMM', 'MMM', 'MM', 'DDDDD', 'DDDD', 'DDD', 'DD', 'DY', 'DAY', 'WD', 'D', 'Q', 'MONTH', 'MON', 'HH24', 'HH12', 'HH', '\\\\[H\\\\]', 'H', 'AM/PM', 'MI', 'SS', 'MS', 'S', 'Y', 'M', 'I' ],\r\n            // Other\r\n            general: [ 'A', '0', '\\\\?', '\\\\*', ',,M', ',,,B', '[a-zA-Z\\\\$]+', '_[.\\\\s\\\\S]', '\\\\(', '\\\\)', '.']\r\n        }\r\n\r\n        const countryCodes = {\r\n            \"0409\": [\r\n                \"$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0809\": [\r\n                \"£\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0C09\": [\r\n                \"$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"1009\": [\r\n                \"$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"1409\": [\r\n                \"$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"1809\": [\r\n                \"€\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"1C09\": [\r\n                \"R\",\r\n                \" \",\r\n                \".\"\r\n            ],\r\n            \"040C\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"080C\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"100C\": [\r\n                \"CHF\",\r\n                \"'\",\r\n                \".\"\r\n            ],\r\n            \"140C\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0C0C\": [\r\n                \"$\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0407\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0C07\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0807\": [\r\n                \"CHF\",\r\n                \"'\",\r\n                \".\"\r\n            ],\r\n            \"1007\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0413\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0813\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0410\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0810\": [\r\n                \"CHF\",\r\n                \"'\",\r\n                \".\"\r\n            ],\r\n            \"0C0A\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"080A\": [\r\n                \"$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"2C0A\": [\r\n                \"$\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"340A\": [\r\n                \"$\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"240A\": [\r\n                \"$\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"300A\": [\r\n                \"$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"280A\": [\r\n                \"S/\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"200A\": [\r\n                \"Bs.\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"140A\": [\r\n                \"₡\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"100A\": [\r\n                \"Q\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"1C0A\": [\r\n                \"RD$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"3C0A\": [\r\n                \"$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"440A\": [\r\n                \"C$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"4C0A\": [\r\n                \"B/.\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"480A\": [\r\n                \"L\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0816\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0416\": [\r\n                \"R$\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0406\": [\r\n                \"kr\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"041D\": [\r\n                \"kr\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0414\": [\r\n                \"kr\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"040B\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"040F\": [\r\n                \"kr\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0415\": [\r\n                \"zł\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0405\": [\r\n                \"Kč\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"041B\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"040E\": [\r\n                \"Ft\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0424\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"041A\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0418\": [\r\n                \"lei\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0402\": [\r\n                \"лв.\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0425\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0426\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0427\": [\r\n                \"€\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0408\": [\r\n                \"€\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"043A\": [\r\n                \"€\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"043C\": [\r\n                \"€\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0419\": [\r\n                \"₽\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0422\": [\r\n                \"₴\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0423\": [\r\n                \"Br\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"041F\": [\r\n                \"₺\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"042C\": [\r\n                \"₼\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"042F\": [\r\n                \"ден\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0441\": [\r\n                \"Lek\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"141A\": [\r\n                \"KM\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0401\": [\r\n                \"ر.س\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0C01\": [\r\n                \"ج.م\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"1401\": [\r\n                \"دج\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"1801\": [\r\n                \"د.م.\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"1C01\": [\r\n                \"د.ت\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"2001\": [\r\n                \"﷼\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"3401\": [\r\n                \"KD\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"3801\": [\r\n                \"د.إ\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"3C01\": [\r\n                \"BD\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"4001\": [\r\n                \"ر.ق\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"2801\": [\r\n                \"£\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"2C01\": [\r\n                \"د.ا\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"3001\": [\r\n                \"ل.ل\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"2401\": [\r\n                \"﷼\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"1001\": [\r\n                \"ل.د\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0429\": [\r\n                \"﷼\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"040D\": [\r\n                \"₪\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0439\": [\r\n                \"₹\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0445\": [\r\n                \"৳\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0461\": [\r\n                \"रु\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"045B\": [\r\n                \"Rs\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"044E\": [\r\n                \"₹\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0444\": [\r\n                \"₹\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0449\": [\r\n                \"₹\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"044B\": [\r\n                \"₹\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0421\": [\r\n                \"Rp\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"043E\": [\r\n                \"RM\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0464\": [\r\n                \"₱\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"041E\": [\r\n                \"฿\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"042A\": [\r\n                \"₫\",\r\n                \".\",\r\n                \",\"\r\n            ],\r\n            \"0453\": [\r\n                \"៛\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0454\": [\r\n                \"₭\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0455\": [\r\n                \"K\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0404\": [\r\n                \"NT$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0C04\": [\r\n                \"HK$\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0804\": [\r\n                \"¥\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0411\": [\r\n                \"¥\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0412\": [\r\n                \"₩\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0437\": [\r\n                \"₾\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"042B\": [\r\n                \"֏\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"043F\": [\r\n                \"₸\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0443\": [\r\n                \"so'm\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0428\": [\r\n                \"ЅМ\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0440\": [\r\n                \"сом\",\r\n                \" \",\r\n                \",\"\r\n            ],\r\n            \"0466\": [\r\n                \"₦\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0469\": [\r\n                \"₦\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"0468\": [\r\n                \"GH₵\",\r\n                \",\",\r\n                \".\"\r\n            ],\r\n            \"180C\": [\r\n                \"F CFA\",\r\n                \" \",\r\n                \",\"\r\n            ]\r\n        }\r\n\r\n        /**\r\n         * Detect decimal and thousand separators in a mask pattern\r\n         */\r\n        const detectMaskSeparators = function(mask) {\r\n            // Decimal: separator in pattern 0[sep]0+ (can have trailing chars like _ )\r\n            // Look for the rightmost occurrence of this pattern\r\n            const decimalMatches = mask.match(/0([.,\\s'])0+/g);\r\n            let decimal = null;\r\n            if (decimalMatches && decimalMatches.length > 0) {\r\n                // Get the last match (rightmost decimal pattern)\r\n                const lastMatch = decimalMatches[decimalMatches.length - 1];\r\n                const sepMatch = lastMatch.match(/0([.,\\s'])0/);\r\n                decimal = sepMatch ? sepMatch[1] : null;\r\n            }\r\n\r\n            // Thousand: other separator that appears in #[sep]# or 0[sep]# patterns\r\n            let thousand = null;\r\n            for (const sep of [',', '.', ' ', \"'\"]) {\r\n                if (sep !== decimal) {\r\n                    const escapedSep = sep === '.' ? '\\\\.' : sep;\r\n                    const regex = new RegExp('[#0]' + escapedSep + '[#0]');\r\n                    if (regex.test(mask)) {\r\n                        thousand = sep;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return { decimal, thousand };\r\n        }\r\n\r\n        /**\r\n         * Transform Excel currency locale patterns like [$$-409]#,##0.00\r\n         * countryCodes format: { \"0409\": [\"$\", \",\", \".\"] } // [currency, thousand, decimal]\r\n         * [$$ = use locale's default currency, [$X = use literal X]\r\n         */\r\n        const transformExcelLocaleMask = function(mask) {\r\n            // Handle multiple patterns (e.g., positive;negative)\r\n            // Accept any alphanumeric for locale code to handle invalid codes gracefully\r\n            const pattern = /\\[\\$(.?)-([0-9A-Z]+)\\]/gi;\r\n            let transformation = null;\r\n\r\n            // Find first pattern to determine locale\r\n            const firstMatch = mask.match(/\\[\\$(.?)-([0-9A-Z]+)\\]/i);\r\n            if (!firstMatch) return mask;\r\n\r\n            const symbolChar = firstMatch[1] || '';\r\n            let localeCode = firstMatch[2].toUpperCase();\r\n\r\n            // Pad with leading zero if 3 digits (e.g., \"409\" → \"0409\")\r\n            if (localeCode.length === 3) {\r\n                localeCode = '0' + localeCode;\r\n            }\r\n\r\n            // Look up locale in countryCodes\r\n            const localeData = countryCodes[localeCode];\r\n\r\n            if (!localeData) {\r\n                // Unknown locale - fallback: strip ALL patterns, use literal symbol (or $)\r\n                const fallbackSymbol = symbolChar || '$';\r\n                // Replace all occurrences of the pattern with the symbol\r\n                return mask.replace(/\\[\\$(.?)-([0-9A-Z]+)\\]/gi, fallbackSymbol);\r\n            }\r\n\r\n            // Extract from array: [currency, thousand, decimal]\r\n            const localeCurrency = localeData[0];\r\n            const localeThousand = localeData[1];\r\n            const localeDecimal = localeData[2];\r\n\r\n            // Determine currency symbol: $$ means use locale's default, else use literal\r\n            let currencySymbol;\r\n            if (symbolChar === '$') {\r\n                // $$ pattern - use locale's default currency\r\n                currencySymbol = localeCurrency;\r\n            } else {\r\n                // Literal symbol provided (e.g., [$€-407])\r\n                currencySymbol = symbolChar;\r\n            }\r\n\r\n            // Replace all locale patterns with currency symbol\r\n            let result = mask.replace(pattern, currencySymbol);\r\n\r\n            // Detect current separators in mask (after removing patterns)\r\n            const current = detectMaskSeparators(result);\r\n\r\n            // Transform separators to match locale using placeholders to avoid conflicts\r\n            const temp1 = '\\uFFF0';  // Placeholder for thousand\r\n            const temp2 = '\\uFFF1';  // Placeholder for decimal\r\n\r\n            // Step 1: Replace current separators with placeholders\r\n            if (current.thousand && current.thousand !== localeThousand) {\r\n                const from = current.thousand === '.' ? '\\\\.' : (current.thousand === ' ' ? ' ' : current.thousand);\r\n                result = result.replace(new RegExp(from, 'g'), temp1);\r\n            }\r\n            if (current.decimal && current.decimal !== localeDecimal) {\r\n                const from = current.decimal === '.' ? '\\\\.' : (current.decimal === ' ' ? ' ' : current.decimal);\r\n                result = result.replace(new RegExp(from, 'g'), temp2);\r\n            }\r\n\r\n            // Step 2: Replace placeholders with target separators\r\n            result = result.replace(new RegExp(temp1, 'g'), localeThousand);\r\n            result = result.replace(new RegExp(temp2, 'g'), localeDecimal);\r\n\r\n            return result;\r\n        }\r\n\r\n        // All expressions\r\n        const allExpressions = [].concat(tokens.escape, tokens.fraction, tokens.currency, tokens.datetime, tokens.percentage, tokens.scientific, tokens.numeric, tokens.text, tokens.general).join('|');\r\n\r\n        // Pre-compile all regexes once at initialization for better performance\r\n        const compiledTokens = {};\r\n        const tokenPriority = ['escape', 'fraction', 'currency', 'scientific', 'percentage', 'numeric', 'datetime', 'text', 'general'];\r\n\r\n        // Cache for getMethod results\r\n        const methodCache = {};\r\n        // Cache for getTokens results\r\n        const tokensCache = {};\r\n        // Cache for autoCasting results\r\n        const autoCastingCache = {};\r\n\r\n        // Initialize compiled regexes\r\n        for (const type of tokenPriority) {\r\n            compiledTokens[type] = tokens[type].map(pattern => ({\r\n                regex: new RegExp('^' + pattern + '$', 'i'),\r\n                method: pattern\r\n            }));\r\n        }\r\n\r\n        // Pre-compile regex for getTokens function\r\n        const allExpressionsRegex = new RegExp(allExpressions, 'gi');\r\n        const hiddenCaret = \"\\u200B\";\r\n        // Locale for date parsing\r\n        const userLocale = (typeof navigator !== 'undefined' && navigator.language) || 'en-US';\r\n        // Labels\r\n        const weekDaysFull = Helpers.weekdays;\r\n        const weekDays = Helpers.weekdaysShort;\r\n        const monthsFull = Helpers.months;\r\n        const months = Helpers.monthsShort;\r\n\r\n        // Helpers\r\n\r\n        const focus = function(el) {\r\n            if (el.textContent.length) {\r\n                // Handle contenteditable elements\r\n                const range = document.createRange();\r\n                const sel = window.getSelection();\r\n\r\n                let node = el;\r\n                // Go as deep as possible to the last text node\r\n                while (node.lastChild) node = node.lastChild;\r\n                // Ensure it's a text node\r\n                if (node.nodeType === Node.TEXT_NODE) {\r\n                    range.setStart(node, node.length);\r\n                } else {\r\n                    range.setStart(node, node.childNodes.length);\r\n                }\r\n                range.collapse(true);\r\n                sel.removeAllRanges();\r\n                sel.addRange(range);\r\n\r\n                el.scrollLeft = el.scrollWidth;\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Returns if the given value is considered blank\r\n         */\r\n        const isBlank = function(v) {\r\n            return v === null || v === '' || typeof(v) === 'undefined';\r\n        }\r\n\r\n        /**\r\n         * Clean mask - extremely fast implementation using only char operations\r\n         * Removes quotes, detects parenthesis for negative numbers, and removes brackets (except time format codes)\r\n         * Sets control.parenthesisForNegativeNumbers and returns cleaned mask\r\n         */\r\n        const cleanMask = function(mask, control) {\r\n            const len = mask.length;\r\n            let result = '';\r\n\r\n            for (let i = 0; i < len; i++) {\r\n                const char = mask[i];\r\n\r\n                // Remove quotes\r\n                if (char === '\"') {\r\n                    continue;\r\n                }\r\n\r\n                // Handle brackets - remove them unless they're time format codes\r\n                if (char === '[') {\r\n                    // Check if it's a time format code: [s], [ss], [h], [hh], [m], [mm]\r\n                    let isTimeFormat = false;\r\n                    if (i + 2 < len && mask[i + 2] === ']') {\r\n                        const c = mask[i + 1];\r\n                        if (c === 's' || c === 'h' || c === 'm') {\r\n                            isTimeFormat = true;\r\n                        }\r\n                    } else if (i + 3 < len && mask[i + 3] === ']') {\r\n                        const c1 = mask[i + 1];\r\n                        const c2 = mask[i + 2];\r\n                        if ((c1 === 's' && c2 === 's') || (c1 === 'h' && c2 === 'h') || (c1 === 'm' && c2 === 'm')) {\r\n                            isTimeFormat = true;\r\n                        }\r\n                    }\r\n\r\n                    if (isTimeFormat) {\r\n                        result += char;\r\n                    } else {\r\n                        // Skip content and closing bracket\r\n                        while (i < len && mask[i] !== ']') {\r\n                            i++;\r\n                        }\r\n                        continue;\r\n                    }\r\n                }\r\n                // Check for parenthesis (not preceded by underscore and no underscore inside)\r\n                else if (char === '(') {\r\n                    if (i === 0 || mask[i - 1] !== '_') {\r\n                        let hasUnderscore = false;\r\n                        let depth = 1;\r\n                        for (let j = i + 1; j < len && depth > 0; j++) {\r\n                            if (mask[j] === '(') depth++;\r\n                            if (mask[j] === ')') depth--;\r\n                            if (mask[j] === '_') {\r\n                                hasUnderscore = true;\r\n                                break;\r\n                            }\r\n                        }\r\n                        if (! hasUnderscore) {\r\n                            control.parenthesisForNegativeNumbers = true;\r\n                        }\r\n                    }\r\n                    result += char;\r\n                } else {\r\n                    result += char;\r\n                }\r\n            }\r\n\r\n            return result;\r\n        }\r\n\r\n        /**\r\n         * Receives a string from a method type and returns if it's a numeric method\r\n         */\r\n        const isNumeric = function(t) {\r\n            return t === 'currency' || t === 'percentage' || t === 'numeric' || t === 'scientific';\r\n        }\r\n\r\n        const adjustPrecision = function(num) {\r\n            if (typeof num === 'number' && ! Number.isInteger(num)) {\r\n                const v = num.toString().split('.');\r\n\r\n                if (v[1] && v[1].length > 10) {\r\n                    let t0 = 0;\r\n                    const t1 = v[1][v[1].length - 2];\r\n\r\n                    if (t1 == 0 || t1 == 9) {\r\n                        for (let i = v[1].length - 2; i > 0; i--) {\r\n                            if (t0 >= 0 && v[1][i] == t1) {\r\n                                t0++;\r\n                                if (t0 > 6) {\r\n                                    break;\r\n                                }\r\n                            } else {\r\n                                t0 = 0;\r\n                                break;\r\n                            }\r\n                        }\r\n\r\n                        if (t0) {\r\n                            return parseFloat(parseFloat(num).toFixed(v[1].length - 1));\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            return num;\r\n        }\r\n\r\n        /**\r\n         * Get the decimal defined in the mask configuration\r\n         */\r\n        const getDecimal = function(v) {\r\n            let decimal;\r\n            if (this.decimal) {\r\n                decimal = this.decimal;\r\n            } else {\r\n                if (this.locale) {\r\n                    let t = Intl.NumberFormat(this.locale).format(1.1);\r\n                    decimal = t[1];\r\n                } else {\r\n                    if (! v) {\r\n                        v = this.mask;\r\n                    }\r\n\r\n                    // Fixed regex: 0* means zero or more 0s before decimal separator\r\n                    let e = new RegExp('0*([,.])0+', 'ig');\r\n                    let t = e.exec(v);\r\n                    if (t && t[1] && t[1].length === 1) {\r\n                        decimal = t[1];\r\n                    } else {\r\n                        // Try the second pattern for # formats\r\n                        e = new RegExp('#{1}(.{1})#+', 'ig');\r\n                        t = e.exec(v);\r\n                        if (t && t[1] && t[1].length === 1) {\r\n                            if (t[1] === ',') {\r\n                                decimal = '.';\r\n                            } else if (t[1] === \"'\" || t[1] === '.') {\r\n                                decimal = ',';\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (! decimal) {\r\n                        decimal = '1.1'.toLocaleString().substring(1, 2);\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (decimal) {\r\n                return decimal;\r\n            } else {\r\n                return null;\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Caret position getter\r\n         * `this` in this function should be the element with a caret\r\n         */\r\n        const getCaretPosition = function(editableDiv) {\r\n            let caretPos = 0;\r\n            let sel = window.getSelection();\r\n            if (sel && sel.rangeCount > 0) {\r\n                let range = sel.getRangeAt(0);\r\n                let preRange = range.cloneRange();\r\n                preRange.selectNodeContents(editableDiv);\r\n                preRange.setEnd(range.endContainer, range.endOffset);\r\n                caretPos = preRange.toString().length;\r\n            }\r\n            return caretPos;\r\n        }\r\n\r\n        /**\r\n         * Caret position getter\r\n         * `this` in this function should be the element with a caret\r\n         */\r\n        const getCaret = function(el) {\r\n            if (el.tagName === 'DIV') {\r\n                return getCaretPosition(el);\r\n            } else {\r\n                return el.selectionStart;\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Caret position setter\r\n         * `this` should be the element (input/textarea or contenteditable div)\r\n         */\r\n        const setCaret = function(index) {\r\n            if (typeof index !== 'number') index = Number(index) || 0;\r\n\r\n            if (this.tagName !== 'DIV' || this.isContentEditable !== true) {\r\n                const n = this.value ?? '';\r\n                if (index < 0) index = 0;\r\n                if (index > n.length) index = n.length;\r\n                this.focus();\r\n                this.selectionStart = index;\r\n                this.selectionEnd = index;\r\n                return;\r\n            }\r\n\r\n            // Contenteditable DIV\r\n            const el = /** @type {HTMLElement} */ (this);\r\n            const totalLen = (el.textContent || '').length;\r\n\r\n            if (index < 0) index = 0;\r\n            if (index > totalLen) index = totalLen;\r\n\r\n            const sel = window.getSelection();\r\n            if (!sel) return;\r\n\r\n            const range = document.createRange();\r\n            el.focus();\r\n\r\n            // Empty element → ensure a text node to place the caret into\r\n            if (totalLen === 0) {\r\n                if (!el.firstChild) el.appendChild(document.createTextNode(''));\r\n                // place at start\r\n                range.setStart(el.firstChild, 0);\r\n                range.collapse(true);\r\n                sel.removeAllRanges();\r\n                sel.addRange(range);\r\n                return;\r\n            }\r\n\r\n            // If caret is at the very end, this is fastest/cleanest\r\n            if (index === totalLen) {\r\n                range.selectNodeContents(el);\r\n                range.collapse(false);\r\n                sel.removeAllRanges();\r\n                sel.addRange(range);\r\n                return;\r\n            }\r\n\r\n            // Walk text nodes to find the node that contains the index-th character\r\n            const walker = document.createTreeWalker(\r\n                el,\r\n                NodeFilter.SHOW_TEXT,\r\n                {\r\n                    acceptNode(node) {\r\n                        // skip empty/whitespace-only nodes if you want; or just accept all text\r\n                        return node.nodeValue ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\r\n                    }\r\n                }\r\n            );\r\n\r\n            let pos = 0;\r\n            let node = walker.nextNode();\r\n            while (node) {\r\n                const nextPos = pos + node.nodeValue.length;\r\n                if (index <= nextPos) {\r\n                    const offset = index - pos; // char offset within this text node\r\n                    range.setStart(node, offset);\r\n                    range.collapse(true);\r\n                    sel.removeAllRanges();\r\n                    sel.addRange(range);\r\n                    return;\r\n                }\r\n                pos = nextPos;\r\n                node = walker.nextNode();\r\n            }\r\n\r\n            // Fallback: collapse at end if something unexpected happened\r\n            range.selectNodeContents(el);\r\n            range.collapse(false);\r\n            sel.removeAllRanges();\r\n            sel.addRange(range);\r\n        };\r\n\r\n        /**\r\n         * Methods to deal with different types of data\r\n         */\r\n        const parseMethods = {\r\n            'FIND': function(v, a) {\r\n                if (isBlank(this.values[this.index])) {\r\n                    this.values[this.index] = '';\r\n                }\r\n                // TODO: tratar eventos\r\n                if (this.event && this.event.inputType && this.event.inputType.indexOf('delete') > -1) {\r\n                    this.values[this.index] += v;\r\n                    return;\r\n                }\r\n                let pos = 0;\r\n                let count = 0;\r\n                let value = (this.values[this.index] + v).toLowerCase();\r\n                for (let i = 0; i < a.length; i++) {\r\n                    if (a[i].toLowerCase().indexOf(value) === 0) {\r\n                        pos = i;\r\n                        count++;\r\n                    }\r\n                }\r\n                if (count > 1) {\r\n                    this.values[this.index] += v;\r\n                } else if (count === 1) {\r\n                    // Jump a number of chars\r\n                    let t = (a[pos].length - this.values[this.index].length) - 1;\r\n                    this.position += t;\r\n                    this.values[this.index] = a[pos];\r\n                    this.index++;\r\n                    return pos;\r\n                }\r\n            },\r\n            'YEAR': function(v, s) {\r\n                if (isBlank(this.values[this.index])) {\r\n                    this.values[this.index] = '';\r\n                }\r\n\r\n                let number = parseInt(v);\r\n\r\n                if (number >= 0 && number <= 10) {\r\n                    if (this.values[this.index].length < s) {\r\n                        this.values[this.index] += v;\r\n                    }\r\n                }\r\n                if (this.values[this.index].length === s) {\r\n                    let y = new Date().getFullYear().toString();\r\n                    if (s === 2) {\r\n                        y = y.substring(0,2) + this.values[this.index];\r\n                    } else if (s === 3) {\r\n                        y = y.substring(0,1) + this.values[this.index];\r\n                    } else if (s === 4) {\r\n                        y = this.values[this.index];\r\n                    }\r\n                    this.date[0] = y;\r\n                    this.index++;\r\n                }\r\n            },\r\n            'YYYY': function(v) {\r\n                parseMethods.YEAR.call(this, v, 4);\r\n            },\r\n            'YYY': function(v) {\r\n                parseMethods.YEAR.call(this, v, 3);\r\n            },\r\n            'YY': function(v) {\r\n                parseMethods.YEAR.call(this, v, 2);\r\n            },\r\n            'MMMMM': function(v) {\r\n                if (isBlank(this.values[this.index])) {\r\n                    this.values[this.index] = '';\r\n                }\r\n                let value = (this.values[this.index] + v).toLowerCase();\r\n                for (var i = 0; i < monthsFull.length; i++) {\r\n                    if (monthsFull[i][0].toLowerCase().indexOf(value) === 0) {\r\n                        this.values[this.index] = monthsFull[i][0];\r\n                        this.date[1] = i + 1;\r\n                        this.index++;\r\n                        break;\r\n                    }\r\n                }\r\n            },\r\n            'MMMM': function(v) {\r\n                let ret = parseMethods.FIND.call(this, v, monthsFull);\r\n                if (typeof(ret) !== 'undefined') {\r\n                    this.date[1] = ret + 1;\r\n                }\r\n            },\r\n            'MMM': function(v) {\r\n                let ret = parseMethods.FIND.call(this, v, months);\r\n                if (typeof(ret) !== 'undefined') {\r\n                    this.date[1] = ret + 1;\r\n                }\r\n            },\r\n            'MM': function(v, single) {\r\n                const commit = () => {\r\n                    this.date[1] = this.values[this.index];\r\n                    this.index++;\r\n                }\r\n\r\n                let number = parseInt(v);\r\n\r\n                if (isBlank(this.values[this.index])) {\r\n                    if (number > 1 && number < 10) {\r\n                        if (! single) {\r\n                            v = '0' + v;\r\n                        }\r\n                        this.values[this.index] = v;\r\n                        commit();\r\n                    } else if (number < 2) {\r\n                        this.values[this.index] = v;\r\n                    }\r\n                } else {\r\n                    if (this.values[this.index] == 1 && number < 3) {\r\n                        this.values[this.index] += v;\r\n                        commit();\r\n                    } else if (this.values[this.index] == 0 && number > 0 && number < 10) {\r\n                        this.values[this.index] += v;\r\n                        commit();\r\n                    } else {\r\n                        let test = parseInt(this.values[this.index]);\r\n                        if (test > 0 && test <= 12) {\r\n                            if (! single) {\r\n                                test = '0' + test;\r\n                            }\r\n                            this.values[this.index] = test;\r\n                            commit();\r\n                            return false;\r\n                        }\r\n                    }\r\n                }\r\n            },\r\n            'M': function(v) {\r\n                return parseMethods['MM'].call(this, v, true);\r\n            },\r\n            'MONTH': function(v) {\r\n                return parseMethods['MMMM'].call(this, v);\r\n            },\r\n            'MON': function(v) {\r\n                return parseMethods['MMM'].call(this, v);\r\n            },\r\n            'DDDD': function(v) {\r\n                return parseMethods.FIND.call(this, v, weekDaysFull);\r\n            },\r\n            'DDD': function(v) {\r\n                return parseMethods.FIND.call(this, v, weekDays);\r\n            },\r\n            'DD': function(v, single) {\r\n                const commit = () => {\r\n                    this.date[2] = this.values[this.index];\r\n                    this.index++;\r\n                }\r\n\r\n                let number = parseInt(v);\r\n\r\n                if (isBlank(this.values[this.index])) {\r\n                    if (number > 3 && number < 10) {\r\n                        if (! single) {\r\n                            v = '0' + v;\r\n                        }\r\n                        this.values[this.index] = v;\r\n                        commit();\r\n                    } else if (number < 10) {\r\n                        this.values[this.index] = v;\r\n                    }\r\n                } else {\r\n                    if (this.values[this.index] == 3 && number < 2) {\r\n                        this.values[this.index] += v;\r\n                        commit();\r\n                    } else if ((this.values[this.index] == 1 || this.values[this.index] == 2) && number < 10) {\r\n                        this.values[this.index] += v;\r\n                        commit();\r\n                    } else if (this.values[this.index] == 0 && number > 0 && number < 10) {\r\n                        this.values[this.index] += v;\r\n                        commit();\r\n                    } else {\r\n                        let test = parseInt(this.values[this.index]);\r\n                        if (test > 0 && test <= 31) {\r\n                            if (! single) {\r\n                                test = '0' + test;\r\n                            }\r\n                            this.values[this.index] = test;\r\n                            commit();\r\n                            return false;\r\n                        }\r\n                    }\r\n                }\r\n            },\r\n            'D': function(v) {\r\n                return parseMethods['DD'].call(this, v, true);\r\n            },\r\n            'DY': function(v) {\r\n                return parseMethods['DDD'].call(this, v);\r\n            },\r\n            'DAY': function(v) {\r\n                return parseMethods['DDDD'].call(this, v);\r\n            },\r\n            'HH12': function(v, two) {\r\n                let test = false;\r\n\r\n                let number = parseInt(v);\r\n\r\n                if (isBlank(this.values[this.index])) {\r\n                    if (number > 1 && number < 10) {\r\n                        if (two) {\r\n                            v = 0 + v;\r\n                        }\r\n                        this.date[3] = this.values[this.index] = v;\r\n                        this.index++;\r\n                    } else if (number < 10) {\r\n                        this.values[this.index] = v;\r\n                    }\r\n                } else {\r\n                    if (this.values[this.index] == 1 && number < 3) {\r\n                        this.date[3] = this.values[this.index] += v;\r\n                        this.index++;\r\n                    } else if (this.values[this.index] < 1 && number < 10) {\r\n                        this.date[3] = this.values[this.index] += v;\r\n                        this.index++;\r\n                    } else {\r\n                        test = true;\r\n                    }\r\n                }\r\n\r\n                // Re-test\r\n                if (test === true) {\r\n                    var t = parseInt(this.values[this.index]);\r\n                    if (t >= 0 && t <= 12) {\r\n                        this.date[3] = this.values[this.index];\r\n                        this.index++;\r\n                        return false;\r\n                    }\r\n                }\r\n            },\r\n            'HH24': function(v, two) {\r\n                let test = false;\r\n\r\n                let number = parseInt(v)\r\n\r\n                if (number >= 0 && number < 10) {\r\n                    if (isBlank(this.values[this.index])) {\r\n                        if (number > 2 && number < 10) {\r\n                            if (two) {\r\n                                v = 0 + v;\r\n                            }\r\n                            this.date[3] = this.values[this.index] = v;\r\n                            this.index++;\r\n                        } else if (number < 10) {\r\n                            this.values[this.index] = v;\r\n                        }\r\n                    } else {\r\n                        if (this.values[this.index] == 2 && number < 4) {\r\n                            if (! two && this.values[this.index] === '0') {\r\n                                this.values[this.index] = '';\r\n                            }\r\n                            this.date[3] = this.values[this.index] += v;\r\n                            this.index++;\r\n                        } else if (this.values[this.index] < 2 && number < 10) {\r\n                            if (! two && this.values[this.index] === '0') {\r\n                                this.values[this.index] = '';\r\n                            }\r\n                            this.date[3] = this.values[this.index] += v;\r\n                            this.index++;\r\n                        } else {\r\n                            test = true;\r\n                        }\r\n                    }\r\n                } else {\r\n                    test = true;\r\n                }\r\n\r\n                // Re-test\r\n                if (test === true) {\r\n                    var t = parseInt(this.values[this.index]);\r\n                    if (t >= 0 && t < 24) {\r\n                        this.date[3] = this.values[this.index];\r\n                        this.index++;\r\n                        return false;\r\n                    }\r\n                }\r\n            },\r\n            'HH': function(v) {\r\n                parseMethods['HH24'].call(this, v, 1);\r\n            },\r\n            'H': function(v) {\r\n                parseMethods['HH24'].call(this, v, 0);\r\n            },\r\n            '\\\\[H\\\\]': function(v) {\r\n                if (this.values[this.index] == undefined) {\r\n                    this.values[this.index] = '';\r\n                }\r\n                if (v.match(/[0-9]/g)) {\r\n                    this.date[3] = this.values[this.index] += v;\r\n                } else {\r\n                    if (this.values[this.index].match(/[0-9]/g)) {\r\n                        this.date[3] = this.values[this.index];\r\n                        this.index++;\r\n                        return false;\r\n                    }\r\n                }\r\n            },\r\n            'N60': function(v, i, two) {\r\n                let test = false;\r\n\r\n                let number = parseInt(v);\r\n\r\n                if (number >= 0 && number < 10) {\r\n                    if (isBlank(this.values[this.index])) {\r\n                        if (number > 5 && number < 10) {\r\n                            if (two) {\r\n                                v = '0' + v;\r\n                            }\r\n                            this.date[i] = this.values[this.index] = v;\r\n                            this.index++;\r\n                        } else if (number < 10) {\r\n                            this.values[this.index] = v;\r\n                        }\r\n                    } else {\r\n                        if (this.values[this.index] < 6 && number < 10) {\r\n                            if (! two && this.values[this.index] === '0') {\r\n                                this.values[this.index] = '';\r\n                            }\r\n                            this.date[i] = this.values[this.index] += v;\r\n                            this.index++;\r\n                        } else {\r\n                            test = true;\r\n                        }\r\n                    }\r\n                } else {\r\n                    test = true;\r\n                }\r\n\r\n                // Re-test\r\n                if (test === true) {\r\n                    var t = parseInt(this.values[this.index]);\r\n                    if (t >= 0 && t < 60) {\r\n                        this.date[i] = this.values[this.index];\r\n                        this.index++;\r\n                        return false;\r\n                    }\r\n                }\r\n            },\r\n            'MI': function(v) {\r\n                parseMethods.N60.call(this, v, 4, true);\r\n            },\r\n            'SS': function(v) {\r\n                parseMethods.N60.call(this, v, 5, true);\r\n            },\r\n            'I': function(v) {\r\n                parseMethods.N60.call(this, v, 4, false);\r\n            },\r\n            'S': function(v) {\r\n                parseMethods.N60.call(this, v, 5, false);\r\n            },\r\n            'AM/PM': function(v) {\r\n                if (typeof(this.values[this.index]) === 'undefined') {\r\n                    this.values[this.index] = '';\r\n                }\r\n\r\n                if (this.values[this.index] === '') {\r\n                    if (v.match(/a/i) && this.date[3] < 13) {\r\n                        this.values[this.index] += 'A';\r\n                    } else if (v.match(/p/i)) {\r\n                        this.values[this.index] += 'P';\r\n                    }\r\n                } else if (this.values[this.index] === 'A' || this.values[this.index] === 'P') {\r\n                    this.values[this.index] += 'M';\r\n                    this.index++;\r\n                }\r\n            },\r\n            'WD': function(v) {\r\n                if (typeof(this.values[this.index]) === 'undefined') {\r\n                    this.values[this.index] = '';\r\n                }\r\n\r\n                let number = parseInt(v);\r\n\r\n                if (number >= 0 && number < 7) {\r\n                    this.values[this.index] = v;\r\n                }\r\n                if (this.values[this.index].length == 1) {\r\n                    this.index++;\r\n                }\r\n            },\r\n            // Numeric Methods\r\n            '[0#]+([.,]{1}0*#*)?': function(v) {\r\n                if (v === '.' && inputIsANumber(this.raw)) {\r\n                    v = this.decimal;\r\n                }\r\n\r\n                if (isBlank(this.values[this.index])) {\r\n                    this.values[this.index] = '';\r\n                }\r\n\r\n                if (v === '-') {\r\n                    // Transform the number into negative if it is not already\r\n                    if (this.values[this.index][0] != '-') {\r\n                        this.values[this.index] = '-' + this.values[this.index];\r\n                    }\r\n                } else if (v === '+') {\r\n                    // Transform the number into positive if it is negative\r\n                    if (this.values[this.index][0] == '-') {\r\n                        this.values[this.index] = this.values[this.index].replace('-', '');\r\n                    }\r\n                } else if (v == '0') {\r\n                    // Only adds zero if there's a non-zero number before\r\n                    if (this.values[this.index] != '0' && this.values[this.index] != '-0') {\r\n                        this.values[this.index] += v;\r\n                    }\r\n                } else if (v > 0 && v < 10) {\r\n                    // Verify if there's a zero to remove it, avoiding left zeros\r\n                    if (this.values[this.index] == '0' || this.values[this.index] == '-0') {\r\n                        this.values[this.index] = this.values[this.index].replace('0', '');\r\n                    }\r\n                    this.values[this.index] += v;\r\n                } else if (v === this.decimal) {\r\n                    // Only adds decimal when there's a number value on its left\r\n                    if (! this.values[this.index].includes(this.decimal)) {\r\n                        if (! this.values[this.index].replace('-', '').length) {\r\n                            this.values[this.index] += '0';\r\n                        }\r\n                        this.values[this.index] += this.decimal;\r\n                    }\r\n                }\r\n            },\r\n            '[0#]+([.,]{1}0*#*)?%': function(v) {\r\n                parseMethods['[0#]+([.,]{1}0*#*)?'].call(this, v);\r\n\r\n                // Adds the % only if it has a number value\r\n                if (this.values[this.index].match(/[\\-0-9]/g)) {\r\n                    if (this.values[this.index].indexOf('%') !== -1) {\r\n                        this.values[this.index] = this.values[this.index].replaceAll('%', '');\r\n                    }\r\n                    this.values[this.index] += '%';\r\n                } else {\r\n                    this.values[this.index] = '';\r\n                }\r\n            },\r\n            '#(.{1})##0?(.{1}0+)?( ?;(.*)?)?': function(v) {\r\n                // Process first the number\r\n                parseMethods['[0#]+([.,]{1}0*#*)?'].call(this, v, true);\r\n                // Create the separators\r\n                let separator = this.tokens[this.index].substring(1,2);\r\n\r\n\r\n                let currentValue = this.values[this.index];\r\n                // Remove existing separators and negative sign\r\n                currentValue = currentValue.replaceAll(separator, '');\r\n                // Process separators\r\n                let val = currentValue.split(this.decimal);\r\n                if (val[0].length > 3) {\r\n                    let number = [];\r\n                    let count = 0;\r\n                    for (var j = val[0].length - 1; j >= 0 ; j--) {\r\n                        let c = val[0][j];\r\n                        if (c >= 0 && c <= 9) {\r\n                            if (count && ! (count % 3)) {\r\n                                number.unshift(separator);\r\n                            }\r\n                            count++;\r\n                        }\r\n                        number.unshift(c);\r\n                    }\r\n                    val[0] = number.join('');\r\n                }\r\n                // Reconstruct the value\r\n                this.values[this.index] = val.join(this.decimal);\r\n            },\r\n            '[0#]+([.,]{1}0*#*)?E{1}\\\\+0+': function(v) {\r\n                parseMethods['[0#]+([.,]{1}0*#*)?'].call(this, v);\r\n            },\r\n            '#{0,1}.*?\\\\?+\\\\/[0-9?]+': function (v) {\r\n                if (isBlank(this.values[this.index])) {\r\n                    this.values[this.index] = '';\r\n                }\r\n\r\n                const token = this.tokens[this.index]; // e.g. \"# ?/?\", \"?/2\", \"# ??/16\"\r\n                let cur = this.values[this.index];\r\n\r\n                // Parse RHS of mask to decide denominator rule\r\n                const rhsRaw = (token.split('/')[1] || '').replace(/\\s+/g, '');\r\n                const allowDen = /^\\d+$/.test(rhsRaw) ? rhsRaw : /^\\?+$/.test(rhsRaw) ? '?' : '?';\r\n\r\n                // ----- NEW: allow '-' as first char -----\r\n                if (v === '-') {\r\n                    if (cur.length === 0) {\r\n                        this.values[this.index] = '-';\r\n                    }\r\n                    return; // never return false\r\n                }\r\n                // ----------------------------------------\r\n\r\n                // Only accept digits / space / slash; ignore everything else\r\n                if (!(/[0-9\\/ ]/.test(v))) {\r\n                    return;\r\n                }\r\n\r\n                // If we already have a slash and denominator is fixed but not yet appended,\r\n                // auto-complete immediately regardless of what the user typed now.\r\n                const hasSlashNow = cur.includes('/');\r\n                if (hasSlashNow && allowDen !== '?') {\r\n                    const afterSlash = cur.slice(cur.indexOf('/') + 1);\r\n                    if (afterSlash.length === 0) {\r\n                        this.values[this.index] = cur + allowDen;\r\n                        this.index++; // move to next token\r\n                        return;\r\n                    }\r\n                }\r\n\r\n                // Empty -> only digits (or a leading '-' handled above)\r\n                if (cur.length === 0) {\r\n                    if (/\\d/.test(v)) this.values[this.index] = v;\r\n                    return;\r\n                }\r\n\r\n                const hasSpace = cur.includes(' ');\r\n                const hasSlash = cur.includes('/');\r\n                const last = cur[cur.length - 1];\r\n\r\n                // Space rules: only one, must be before slash, must follow a digit\r\n                if (v === ' ') {\r\n                    if (!hasSpace && !hasSlash && /\\d/.test(last)) {\r\n                        this.values[this.index] = cur + ' ';\r\n                    }\r\n                    return;\r\n                }\r\n\r\n                // Slash rules: only one slash, not right after a space, must follow a digit\r\n                if (v === '/') {\r\n                    if (!hasSlash && last !== ' ' && /\\d/.test(last)) {\r\n                        if (allowDen === '?') {\r\n                            this.values[this.index] = cur + '/';\r\n                        } else {\r\n                            this.values[this.index] = cur + '/' + allowDen;\r\n                            this.index++; // conclude this token\r\n                        }\r\n                    }\r\n                    return;\r\n                }\r\n\r\n                // Digit rules\r\n                if (/\\d/.test(v)) {\r\n                    if (!hasSlash) {\r\n                        // Before slash: digits always fine\r\n                        this.values[this.index] = cur + v;\r\n                        return;\r\n                    }\r\n\r\n                    // After slash\r\n                    if (allowDen === '?') {\r\n                        this.values[this.index] = cur + v;\r\n                        return;\r\n                    }\r\n\r\n                    // Fixed denominator: enforce prefix and advance when complete\r\n                    const afterSlash = cur.slice(cur.indexOf('/') + 1);\r\n                    const nextDen = afterSlash + v;\r\n                    if (allowDen.startsWith(nextDen)) {\r\n                        this.values[this.index] = cur + v;\r\n                        if (nextDen.length === allowDen.length) {\r\n                            this.index++;\r\n                        }\r\n                    }\r\n                }\r\n            },\r\n            '[a-zA-Z\\\\$]+': function(v) {\r\n                // Token to be added to the value\r\n                let word = this.tokens[this.index];\r\n                // Value\r\n                if (typeof(this.values[this.index]) === 'undefined') {\r\n                    this.values[this.index] = '';\r\n                }\r\n                if (v === null) {\r\n                    let size = this.values[this.index].length;\r\n                    v = word.substring(size, size+1);\r\n                }\r\n                // Add the value\r\n                this.values[this.index] += v;\r\n                // Only if caret is before the change\r\n                let current = this.values[this.index];\r\n                // Add token to the values\r\n                if (current !== word.substring(0,current.length)) {\r\n                    this.values[this.index] = word;\r\n                    // Next token to process\r\n                    this.index++;\r\n                    return false;\r\n                } else if (current === word) {\r\n                    // Next token to process\r\n                    this.index++;\r\n                }\r\n            },\r\n            'A': function(v) {\r\n                return parseMethods['[a-zA-Z\\\\$]+'].call(this, v);\r\n            },\r\n            'a': function(v) {\r\n                return parseMethods['[a-zA-Z\\\\$]+'].call(this, v);\r\n            },\r\n            '.': function(v) {\r\n                return parseMethods['[a-zA-Z\\\\$]+'].call(this, v);\r\n            },\r\n            '&': function(v) {\r\n                if (v.match(/^[a-zA-Z ]+$/)) {\r\n                    this.values[this.index] = v;\r\n                    this.index++;\r\n                }\r\n            },\r\n            '\\\\*': function() {\r\n                this.values[this.index] = '';\r\n                this.index++;\r\n                return false;\r\n            },\r\n            'C': function(v) {\r\n                parseMethods['&'].call(this, v);\r\n            },\r\n            // General Methods\r\n            '0': function(v) {\r\n                if (v.match(/[0-9]/g)) {\r\n                    this.values[this.index] = v;\r\n                    this.index++;\r\n                }\r\n            },\r\n            '9': function(v) {\r\n                parseMethods['0'].call(this, v);\r\n            },\r\n            '#': function(v) {\r\n                parseMethods['0'].call(this, v);\r\n            },\r\n            'L': function(v) {\r\n                if (v.match(/[a-zA-Z]/gi)) {\r\n                    this.values[this.index] = v;\r\n                    this.index++;\r\n                }\r\n            },\r\n            '\\\\?': function(v) {\r\n                if (v.match(/[1-9]/g)) {\r\n                    this.values[this.index] = v;\r\n                    this.index++;\r\n                }\r\n            },\r\n            '@': function(v) {\r\n                if (isBlank(this.values[this.index])) {\r\n                    this.values[this.index] = '';\r\n                }\r\n                this.values[this.index] += v;\r\n            },\r\n            '_[.\\\\s\\\\S]': function() {\r\n                this.values[this.index] = ' ';\r\n                this.index++;\r\n                return false;\r\n            },\r\n            '\\\\(': function() {\r\n                if (this.type === 'currency' && this.parenthesisForNegativeNumbers) {\r\n                    this.values[this.index] = '';\r\n                } else {\r\n                    this.values[this.index] = '(';\r\n                }\r\n                this.index++;\r\n                return false;\r\n            },\r\n            '\\\\)': function() {\r\n                if (this.type === 'currency' && this.parenthesisForNegativeNumbers) {\r\n                    this.values[this.index] = '';\r\n                } else {\r\n                    this.values[this.index] = ')';\r\n                }\r\n                this.index++;\r\n                return false;\r\n            },\r\n            ',,M': function() {\r\n                this.values[this.index] = 'M';\r\n                this.index++;\r\n                return false;\r\n            },\r\n            ',,,B': function() {\r\n                this.values[this.index] = 'B';\r\n                this.index++;\r\n                return false;\r\n            },\r\n            '\\\\\\\\[.\\\\s\\\\S]': function(v) {\r\n                this.values[this.index] = this.tokens[this.index].replace('\\\\', '');\r\n                this.index++;\r\n                return false;\r\n            }\r\n        }\r\n\r\n        const extractDate = function() {\r\n            let v = '';\r\n            if (! (this.date[0] && this.date[1] && this.date[2]) && (this.date[3] || this.date[4])) {\r\n                if (this.mask.toLowerCase().indexOf('[h]') !== -1) {\r\n                    v = parseInt(this.date[3]);\r\n                } else {\r\n                    let h = parseInt(this.date[3]);\r\n                    if (h < 13 && this.values.indexOf('PM') !== -1) {\r\n                        v = (h+12) % 24;\r\n                    } else {\r\n                        v = h % 24;\r\n                    }\r\n                }\r\n                if (this.date[4]) {\r\n                    v += parseFloat(this.date[4] / 60);\r\n                }\r\n                if (this.date[5]) {\r\n                    v += parseFloat(this.date[5] / 3600);\r\n                }\r\n                v /= 24;\r\n            } else if (this.date[0] || this.date[1] || this.date[2] || this.date[3] || this.date[4] || this.date[5]) {\r\n                if (this.date[0] && this.date[1] && ! this.date[2]) {\r\n                    this.date[2] = 1;\r\n                }\r\n                var t = Helpers.now(this.date);\r\n                v = Helpers.dateToNum(t);\r\n            }\r\n\r\n            if (isNaN(v)) {\r\n                v = '';\r\n            }\r\n\r\n            return v;\r\n        }\r\n\r\n        // Types TODO: Generate types so we can garantee that text,scientific, numeric,percentage, current are not duplicates. If they are, it will be general or broken.\r\n\r\n        const getTokens = function(str) {\r\n            // Check cache first - direct access, undefined check is fast\r\n            let result = tokensCache[str];\r\n            if (result !== undefined) {\r\n                return result;\r\n            }\r\n\r\n            allExpressionsRegex.lastIndex = 0; // Reset for global regex\r\n            result = str.match(allExpressionsRegex);\r\n            tokensCache[str] = result;\r\n            return result;\r\n        }\r\n\r\n        /**\r\n         * Get the method of one given token\r\n         */\r\n        const getMethod = function(str, temporary) {\r\n            str = str.toString().toUpperCase();\r\n\r\n            // Check cache first - direct access, undefined check is fast\r\n            let cached = methodCache[str];\r\n            if (cached !== undefined) {\r\n                return cached;\r\n            }\r\n\r\n            // Check for datetime mask\r\n            const datetime = temporary.every(t => t.type === 'datetime' || t.type === 'general' || t.type === 'escape');\r\n\r\n            // Use priority order for faster matching with pre-compiled regexes\r\n            for (const type of tokenPriority) {\r\n                if (!datetime && type === 'datetime') continue;\r\n\r\n                for (const compiled of compiledTokens[type]) {\r\n                    if (compiled.regex.test(str)) {\r\n                        const result = { type: type, method: compiled.method };\r\n                        methodCache[str] = result;\r\n                        return result;\r\n                    }\r\n                }\r\n            }\r\n            methodCache[str] = null;\r\n            return null;\r\n        }\r\n\r\n        const fixMinuteToken = function(t) {\r\n            const len = t.length;\r\n            for (let i = 0; i < len; i++) {\r\n                const token = t[i];\r\n                if (token === 'M' || token === 'MM') {\r\n                    // Check if this M is a minute (near H or S) rather than month\r\n                    let isMinute = false;\r\n\r\n                    // Check previous 2 tokens for H (hour indicator)\r\n                    if (i > 0) {\r\n                        const prev1 = t[i - 1];\r\n                        // Use includes for fast check - covers H, HH, HH24, HH12, [H], etc\r\n                        if (prev1 && prev1.includes('H')) {\r\n                            isMinute = true;\r\n                        } else if (i > 1) {\r\n                            const prev2 = t[i - 2];\r\n                            if (prev2 && prev2.includes('H')) {\r\n                                isMinute = true;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    // Check next 2 tokens for S (seconds indicator) if not already determined\r\n                    if (!isMinute && i < len - 1) {\r\n                        const next1 = t[i + 1];\r\n                        // Use includes for fast check - covers S, SS, MS, etc\r\n                        if (next1 && next1.includes('S')) {\r\n                            isMinute = true;\r\n                        } else if (i < len - 2) {\r\n                            const next2 = t[i + 2];\r\n                            if (next2 && next2.includes('S')) {\r\n                                isMinute = true;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (isMinute) {\r\n                        t[i] = token === 'M' ? 'I' : 'MI';\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Identify each method for each token\r\n         */\r\n        const getMethodsFromTokens = function(t) {\r\n            // Uppercase\r\n            t = t.map(v => {\r\n                return v.toString().toUpperCase();\r\n            });\r\n\r\n            // Compatibility with Excel\r\n            fixMinuteToken(t);\r\n\r\n            let result = [];\r\n            for (let i = 0; i < t.length; i++) {\r\n                var m = getMethod(t[i], result);\r\n                if (m) {\r\n                    result.push(m);\r\n                } else {\r\n                    result.push(null);\r\n                }\r\n            }\r\n            return result;\r\n        }\r\n\r\n        const getMethodByPosition = function(control) {\r\n            let methodName;\r\n            if (control.methods[control.index] && typeof(control.value[control.position]) !== 'undefined') {\r\n                methodName = control.methods[control.index].method;\r\n            }\r\n\r\n            let m = parseMethods[methodName];\r\n            if (typeof(m) === 'function') {\r\n                return m;\r\n            }\r\n\r\n            return false;\r\n        }\r\n\r\n        const processPaddingZeros = function(token, value, decimal) {\r\n            if (! value) {\r\n                return value;\r\n            }\r\n            let m = token.split(decimal);\r\n            let desiredNumOfPaddingZeros = m[0].match(/[0]+/g);\r\n            if (desiredNumOfPaddingZeros && desiredNumOfPaddingZeros[0]) {\r\n                desiredNumOfPaddingZeros = desiredNumOfPaddingZeros[0].length\r\n                let v = value.toString().split(decimal);\r\n                let len = v[0].length;\r\n                if (desiredNumOfPaddingZeros > len) {\r\n                    v[0] = v[0].padStart(desiredNumOfPaddingZeros, '0');\r\n                    return v.join(decimal);\r\n                }\r\n            }\r\n        }\r\n\r\n        const processNumOfPaddingZeros = function(control) {\r\n            let negativeSignal = false;\r\n            control.methods.forEach((method, k) => {\r\n                if (method) {\r\n                    if (method.type === 'numeric' || method.type === 'percentage' || method.type === 'scientific') {\r\n                        let ret = processPaddingZeros(control.tokens[k], control.values[k], control.decimal);\r\n                        if (ret) {\r\n                            control.values[k] = ret;\r\n                        }\r\n                    }\r\n\r\n                    if (isNumeric(control.type) && control.parenthesisForNegativeNumbers === true) {\r\n                        if (isNumeric(method.type)) {\r\n                            if (control.values[k] && control.values[k].toString().includes('-')) {\r\n                                control.values[k] = control.values[k].replace('-', '');\r\n\r\n                                negativeSignal = true;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            });\r\n\r\n\r\n            if (isNumeric(control.type) && control.parenthesisForNegativeNumbers === true && negativeSignal) {\r\n                control.methods.forEach((method, k) => {\r\n                    if (! control.values[k] && control.tokens[k] === '(') {\r\n                        control.values[k] = '(';\r\n                    } else if (! control.values[k] && control.tokens[k] === ')') {\r\n                        control.values[k] = ')';\r\n                    }\r\n                });\r\n            }\r\n        }\r\n\r\n        const getValue = function(control) {\r\n            let value = control.values.join('');\r\n            if (isNumeric(control.type)) {\r\n                if (value.indexOf('--') !== false) {\r\n                    value = value.replace('--', '-');\r\n                }\r\n                if (Number(control.raw) < 0 && value.includes('-')) {\r\n                    value = '-' + value.replace('-', '');\r\n                }\r\n            }\r\n            return value;\r\n        }\r\n\r\n        const inputIsANumber = function(num) {\r\n            if (typeof(num) === 'string') {\r\n                num = num.trim();\r\n            }\r\n            return !isNaN(num) && num !== null && num !== '';\r\n        }\r\n\r\n        const getType = function(control) {\r\n            // Mask type\r\n            let type = 'general';\r\n            // Process other types\r\n            for (var i = 0; i < control.methods.length; i++) {\r\n                let m = control.methods[i];\r\n                if (m) {\r\n                    let t = m.type;\r\n                    if (t !== 'general' && t !== 'escape' && t !== type) {\r\n                        if (type === 'general') {\r\n                            type = t;\r\n                        } else {\r\n                            type = 'general';\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            return type;\r\n        }\r\n\r\n        const isNumber = function(num) {\r\n            if (typeof(num) === 'string') {\r\n                num = num.trim();\r\n            }\r\n            return !isNaN(num) && num !== null && num !== '';\r\n        }\r\n\r\n        // TODO, get negative mask automatically based on the input sign?\r\n\r\n        const getConfig = function(config, value) {\r\n            // Internal default control of the mask system\r\n            const control = {\r\n                // Mask options\r\n                options: {},\r\n                // New values for each token found\r\n                values: [],\r\n                // Token position\r\n                index: 0,\r\n                // Character position\r\n                position: 0,\r\n                // Date raw values\r\n                date: [0,0,0,0,0,0],\r\n                // Raw number for the numeric values\r\n                number: 0,\r\n            }\r\n\r\n            if (typeof(value) === 'undefined' || value === null) {\r\n                value = '';\r\n            }\r\n\r\n            // Value to be masked\r\n            control.value = value.toString();\r\n            control.raw = value;\r\n\r\n\r\n            // Options defined by the user\r\n            if (typeof(config) == 'string') {\r\n                // Mask\r\n                control.mask = config;\r\n            } else if (config) {\r\n                // Mask\r\n                let k = Object.keys(config);\r\n                for (var i = 0; i < k.length; i++) {\r\n                    control[k[i]] = config[k[i]];\r\n                }\r\n            }\r\n\r\n            // Controls of Excel that should be ignored\r\n            let mask = control.mask;\r\n            if (mask) {\r\n                if (mask.indexOf(';') !== -1) {\r\n                    let d = mask.split(';');\r\n\r\n                    // Mask\r\n                    mask = d[0];\r\n\r\n                    if (typeof (value) === 'number' || isNumber(value)) {\r\n                        if (Number(value) < 0 && d[1]) {\r\n                            mask = d[1];\r\n                        } else if (Number(value) === 0 && d[2]) {\r\n                            mask = d[2];\r\n                        } else {\r\n                            mask = d[0];\r\n                        }\r\n                    } else {\r\n                        if (typeof(d[3]) !== 'undefined') {\r\n                            mask = d[3];\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Transform Excel locale patterns (e.g., [$$-409]#,##0.00) - only if pattern exists\r\n                if (mask.indexOf('[$') !== -1) {\r\n                    mask = transformExcelLocaleMask(mask);\r\n                }\r\n\r\n                // Cleaning the mask\r\n                mask = cleanMask(mask, control);\r\n                // Get only the first mask for now and remove\r\n                control.mask = mask;\r\n                // Get tokens which are the methods for parsing\r\n                let tokens = control.tokens = getTokens(mask);\r\n                // Get methods from the tokens\r\n                control.methods = getMethodsFromTokens(tokens);\r\n                // Type\r\n                control.type = getType(control);\r\n            }\r\n\r\n            // Decimal only for numbers\r\n            if (isNumeric(control.type) || control.locale) {\r\n                control.decimal = getDecimal.call(control);\r\n            }\r\n\r\n            return control;\r\n        }\r\n\r\n        const toPlainString = function(num) {\r\n            // Convert number to string if it isn't already\r\n            num = String(num);\r\n\r\n            // If it's not in exponential form, return as-is\r\n            if (!/e/i.test(num)) return num;\r\n\r\n            // Decompose scientific notation\r\n            const [coefficient, exponent] = num.toLowerCase().split('e');\r\n            const exp = parseInt(exponent, 10);\r\n\r\n            // Handle sign\r\n            const sign = coefficient[0] === '-' ? '-' : '';\r\n            const [intPart, fracPart = ''] = coefficient.replace('-', '').split('.');\r\n\r\n            const digits = intPart + fracPart;\r\n            const decimalPos = intPart.length;\r\n\r\n            let newPos = decimalPos + exp;\r\n\r\n            if (newPos <= 0) {\r\n                // Decimal point moves left\r\n                return sign + '0.' + '0'.repeat(-newPos) + digits;\r\n            } else if (newPos >= digits.length) {\r\n                // Decimal point moves right, add trailing zeros\r\n                return sign + digits + '0'.repeat(newPos - digits.length);\r\n            } else {\r\n                // Decimal point moves into the number\r\n                return sign + digits.slice(0, newPos) + '.' + digits.slice(newPos);\r\n            }\r\n        };\r\n\r\n        const adjustNumberOfDecimalPlaces = function(config, value) {\r\n            let temp = value;\r\n            let mask = config.mask;\r\n            let expo;\r\n\r\n            if (config.type === 'scientific') {\r\n                mask = config.mask.toUpperCase().split('E')[0];\r\n\r\n                let numOfDecimalPlaces = mask.split(config.decimal);\r\n                numOfDecimalPlaces = numOfDecimalPlaces[1].match(/[0#]+/g);\r\n                numOfDecimalPlaces = numOfDecimalPlaces[0]?.length ?? 0;\r\n                temp = temp.toExponential(numOfDecimalPlaces);\r\n                expo = temp.toString().split('e+');\r\n                temp = Number(expo[0]);\r\n            }\r\n\r\n            if (mask.indexOf(config.decimal) === -1) {\r\n                // No decimal places\r\n                if (! Number.isInteger(temp)) {\r\n                    temp = temp.toFixed(0);\r\n                }\r\n            } else {\r\n                // Length of the decimal\r\n                let mandatoryDecimalPlaces = mask.split(config.decimal);\r\n                mandatoryDecimalPlaces = mandatoryDecimalPlaces[1].match(/0+/g);\r\n                if (mandatoryDecimalPlaces) {\r\n                    mandatoryDecimalPlaces = mandatoryDecimalPlaces[0].length;\r\n                } else {\r\n                    mandatoryDecimalPlaces = 0;\r\n                }\r\n                // Amount of decimal\r\n                let numOfDecimalPlaces = temp.toString().split(config.decimal)\r\n                numOfDecimalPlaces = numOfDecimalPlaces[1]?.length ?? 0;\r\n                // Necessary adjustment\r\n                let necessaryAdjustment = 0;\r\n                if (numOfDecimalPlaces < mandatoryDecimalPlaces) {\r\n                    necessaryAdjustment = mandatoryDecimalPlaces;\r\n                } else {\r\n                    // Optional\r\n                    let optionalDecimalPlaces = mask.split(config.decimal);\r\n                    optionalDecimalPlaces = optionalDecimalPlaces[1].match(/[0#]+/g);\r\n                    if (optionalDecimalPlaces) {\r\n                        optionalDecimalPlaces = optionalDecimalPlaces[0].length;\r\n                        if (numOfDecimalPlaces > optionalDecimalPlaces) {\r\n                            necessaryAdjustment = optionalDecimalPlaces;\r\n                        }\r\n                    }\r\n                }\r\n                // Adjust decimal numbers if applicable\r\n                if (necessaryAdjustment) {\r\n                    let t = temp.toFixed(necessaryAdjustment);\r\n                    let n = temp.toString().split('.');\r\n                    let fraction = n[1];\r\n                    if (fraction && fraction.length > necessaryAdjustment && fraction[fraction.length - 1] === '5') {\r\n                        t = parseFloat(n[0] + '.' + fraction + '1').toFixed(necessaryAdjustment);\r\n                    }\r\n                    temp = t;\r\n                }\r\n            }\r\n\r\n            if (config.type === 'scientific') {\r\n                let ret = processPaddingZeros(mask, temp, config.decimal);\r\n                if (ret) {\r\n                    temp = ret;\r\n                }\r\n                expo[0] = temp;\r\n\r\n                mask = config.mask.toUpperCase().split('E+')[1];\r\n                ret = processPaddingZeros(mask, expo[1], config.decimal);\r\n                if (ret) {\r\n                    expo[1] = ret;\r\n                }\r\n\r\n                temp = expo.join('e+');\r\n            }\r\n\r\n            return temp;\r\n        }\r\n\r\n        const formatFraction = function(value, mask) {\r\n            let maxDenominator;\r\n            let fixedDenominator = null;\r\n            let allowWholeNumber = true;\r\n\r\n            // Check for fixed denominator like # ?/8 or ?/8\r\n            const fixed = mask.match(/\\/(\\d+)/);\r\n            if (fixed) {\r\n                fixedDenominator = parseInt(fixed[1], 10);\r\n                maxDenominator = fixedDenominator;\r\n            } else {\r\n                // Determine based on question marks in mask\r\n                const match = mask.match(/\\?\\/(\\?+)/);\r\n                if (match) {\r\n                    maxDenominator = Math.pow(10, match[1].length) - 1;\r\n                } else {\r\n                    maxDenominator = 9; // Default for # ?/? or ?/?\r\n                }\r\n            }\r\n            // Check if mask allows whole number (e.g., ?/? or ?/8 implies no whole number)\r\n            allowWholeNumber = mask.includes('#');\r\n\r\n            // If we have a fixed denominator, use it exactly (don't simplify)\r\n            if (fixedDenominator) {\r\n                const isNegative = value < 0;\r\n                const absValue = Math.abs(value);\r\n                const numerator = Math.round(absValue * fixedDenominator);\r\n\r\n                // For masks like ?/8, always output as pure fraction (no whole number)\r\n                if (!allowWholeNumber) {\r\n                    return isNegative ? `-${numerator}/${fixedDenominator}` : `${numerator}/${fixedDenominator}`;\r\n                }\r\n\r\n                // For masks like # ?/8, allow whole number\r\n                const whole = Math.floor(numerator / fixedDenominator);\r\n                const remainder = numerator % fixedDenominator;\r\n                if (remainder === 0) {\r\n                    return isNegative ? `-${whole}` : `${whole}`;\r\n                }\r\n                if (whole === 0) {\r\n                    return isNegative ? `-${numerator}/${fixedDenominator}` : `${numerator}/${fixedDenominator}`;\r\n                }\r\n                return isNegative ? `-${whole} ${remainder}/${fixedDenominator}` : `${whole} ${remainder}/${fixedDenominator}`;\r\n            }\r\n\r\n            // Use continued fractions algorithm for better approximation\r\n            function continuedFraction(value, maxDenom) {\r\n                if (value === 0) return [0, 1];\r\n                let sign = value < 0 ? -1 : 1;\r\n                value = Math.abs(value);\r\n                let whole = Math.floor(value);\r\n                let frac = value - whole;\r\n                if (frac === 0) return [sign * whole, 1];\r\n\r\n                let h1 = 1, h2 = 0;\r\n                let k1 = 0, k2 = 1;\r\n                let x = frac;\r\n                while (k1 <= maxDenom) {\r\n                    let a = Math.floor(x);\r\n                    let h0 = a * h1 + h2;\r\n                    let k0 = a * k1 + k2;\r\n                    if (k0 > maxDenom) break;\r\n                    h2 = h1; h1 = h0;\r\n                    k2 = k1; k1 = k0;\r\n                    if (Math.abs(x - a) < 1e-10) break;\r\n                    x = 1 / (x - a);\r\n                }\r\n\r\n                // Add the whole part back only if allowed\r\n                let finalNum = sign * (allowWholeNumber ? whole * k1 + h1 : Math.round(value * k1));\r\n                let finalDen = k1;\r\n                return [finalNum, finalDen];\r\n            }\r\n\r\n            const [numerator, denominator] = continuedFraction(value, maxDenominator);\r\n\r\n            // Handle the result\r\n            const isNegative = numerator < 0;\r\n            const absNumerator = Math.abs(numerator);\r\n            const whole = allowWholeNumber ? Math.floor(absNumerator / denominator) : 0;\r\n            const remainder = absNumerator % denominator;\r\n            const sign = isNegative ? '-' : '';\r\n\r\n            if (remainder === 0) {\r\n                return `${sign}${whole || 0}`;\r\n            }\r\n            if (whole === 0 || !allowWholeNumber) {\r\n                return `${sign}${absNumerator}/${denominator}`;\r\n            }\r\n            return `${sign}${whole} ${remainder}/${denominator}`;\r\n        }\r\n\r\n        const extractDateAndTime = function(value) {\r\n            value = value.toString().substring(0,19);\r\n            let splitStr = (value.indexOf('T') !== -1) ? 'T' : ' ';\r\n            value = value.split(splitStr);\r\n\r\n            let y = null;\r\n            let m = null;\r\n            let d = null;\r\n            let h = '0';\r\n            let i = '0';\r\n            let s = '0';\r\n\r\n            if (! value[1]) {\r\n                if (value[0].indexOf(':') !== -1) {\r\n                    value[0] = value[0].split(':');\r\n                    h = value[0][0];\r\n                    i = value[0][1];\r\n                    s = value[0][2];\r\n                } else {\r\n                    value[0] = value[0].split('-');\r\n                    y = value[0][0];\r\n                    m = value[0][1];\r\n                    d = value[0][2];\r\n                }\r\n            } else {\r\n                value[0] = value[0].split('-');\r\n                y = value[0][0];\r\n                m = value[0][1];\r\n                d = value[0][2];\r\n\r\n                value[1] = value[1].split(':');\r\n                h = value[1][0];\r\n                i = value[1][1];\r\n                s = value[1][2];\r\n            }\r\n\r\n            return [y,m,d,h,i,s];\r\n        }\r\n\r\n        const format = function(str, config) {\r\n            let ret = new Intl.NumberFormat(config.locale, config.options || {}).format(str);\r\n\r\n            config.values.push(ret);\r\n        }\r\n\r\n        const Component = function(str, config, returnObject) {\r\n            // Get configuration\r\n            const control = getConfig(config, str);\r\n\r\n            if (control.locale) {\r\n                format(str, control);\r\n            } else if (control.mask) {\r\n                // Walk every character on the value\r\n                let method;\r\n                while (method = getMethodByPosition(control)) {\r\n                    let char = control.value[control.position];\r\n                    if (char === hiddenCaret) {\r\n                        control.caret = {\r\n                            index: control.index,\r\n                            position: control.values[control.index]?.length ?? 0,\r\n                        }\r\n                        control.position++;\r\n                    } else {\r\n                        // Get the method name to handle the current token\r\n                        let ret = method.call(control, char);\r\n                        // Next position\r\n                        if (ret !== false) {\r\n                            control.position++;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Move index\r\n                if (control.methods[control.index]) {\r\n                    let type = control.methods[control.index].type;\r\n                    if (isNumeric(type) && control.methods[++control.index]) {\r\n                        let next;\r\n                        while (next = control.methods[control.index]) {\r\n                            if (control.methods[control.index].type === 'general') {\r\n                                let method = control.methods[control.index].method;\r\n                                if (method && typeof(parseMethods[method]) === 'function') {\r\n                                    parseMethods[method].call(control, null);\r\n                                }\r\n                            } else {\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            if (control.caret) {\r\n                let index = control.caret.index;\r\n                let position = control.caret.position;\r\n                let value = control.values[index] ?? '';\r\n                // Re-apply the caret to the original position\r\n                control.values[index] = value.substring(0, position) + hiddenCaret + value.substring(position);\r\n            }\r\n\r\n            control.value = getValue(control);\r\n\r\n            if (returnObject) {\r\n                return control;\r\n            } else {\r\n                return control.value;\r\n            }\r\n        }\r\n\r\n        // Helper: Compare rendered value to original input\r\n        const testMask = function(mask, value, original) {\r\n            const rendered = Component.render(value, { mask }, true);\r\n            return rendered.replace(/\\s/g, '') === original.replace(/\\s/g, '');\r\n        }\r\n\r\n        const autoCastingFractions = function(value) {\r\n            const fractionPattern = /^\\s*(-?\\d+\\s+)?(-?\\d+)\\/(\\d+)\\s*$/;\r\n            const fractionMatch = value.match(fractionPattern);\r\n            if (fractionMatch) {\r\n                const sign = value.trim().startsWith('-') ? -1 : 1;\r\n                const whole = fractionMatch[1] ? Math.abs(parseInt(fractionMatch[1])) : 0;\r\n                const numerator = Math.abs(parseInt(fractionMatch[2]));\r\n                const denominator = parseInt(fractionMatch[3]);\r\n\r\n                if (denominator === 0) return null;\r\n\r\n                const decimalValue = sign * (whole + (numerator / denominator));\r\n\r\n                // Determine the mask\r\n                let mask;\r\n                if ([2, 4, 8, 16, 32].includes(denominator)) {\r\n                    mask = whole !== 0 ? `# ?/${denominator}` : `?/${denominator}`;\r\n                } else if (denominator <= 9) {\r\n                    mask = whole !== 0 ? '# ?/?' : '?/?';\r\n                } else {\r\n                    mask = whole !== 0 ? '# ??/??' : '??/??';\r\n                }\r\n\r\n                if (testMask(mask, decimalValue, value.trim())) {\r\n                    return { mask, value: decimalValue, type: 'fraction', category: 'fraction' };\r\n                }\r\n            }\r\n            return null;\r\n        }\r\n\r\n        const autoCastingPercent = function(value) {\r\n            const percentPattern = /^\\s*([+-]?\\d+(?:[.,]\\d+)?)%\\s*$/;\r\n            const percentMatch = value.match(percentPattern);\r\n            if (percentMatch) {\r\n                const rawNumber = percentMatch[1].replace(',', '.');\r\n                const decimalValue = parseFloat(rawNumber) / 100;\r\n\r\n                const decimalPart = rawNumber.split('.')[1];\r\n                const decimalPlaces = decimalPart ? decimalPart.length : 0;\r\n                const mask = decimalPlaces > 0 ? `0.${'0'.repeat(decimalPlaces)}%` : '0%';\r\n\r\n                if (testMask(mask, decimalValue, value.trim())) {\r\n                    return { mask: mask, value: decimalValue, type: 'percent', category: 'numeric' };\r\n                }\r\n            }\r\n            return null;\r\n        }\r\n\r\n        const autoCastingDates = function(value) {\r\n            if (!value || typeof value !== 'string') {\r\n                return null;\r\n            }\r\n\r\n            // Smart pattern detection based on the structure of the string\r\n\r\n            // 1. Analyze the structure to determine possible formats\r\n            const analyzeStructure = function(str) {\r\n                const patterns = [];\r\n\r\n                // Check for date with forward slashes: XX/XX/XXXX or XX/XX/XX\r\n                if (str.match(/^\\d{1,2}\\/\\d{1,2}\\/\\d{2,4}$/)) {\r\n                    const parts = str.split('/');\r\n                    const p1 = parseInt(parts[0]);\r\n                    const p2 = parseInt(parts[1]);\r\n                    const p3 = parseInt(parts[2]);\r\n\r\n                    // Determine likely format based on values\r\n                    if (p1 <= 12 && p2 <= 31 && p2 > 12) {\r\n                        // Likely mm/dd/yyyy\r\n                        patterns.push('mm/dd/yyyy', 'mm/dd/yy', 'm/d/yyyy', 'm/d/yy');\r\n                    } else if (p1 <= 31 && p2 <= 12 && p1 > 12) {\r\n                        // Likely dd/mm/yyyy\r\n                        patterns.push('dd/mm/yyyy', 'dd/mm/yy', 'd/m/yyyy', 'd/m/yy');\r\n                    } else if (p1 <= 12 && p2 <= 12) {\r\n                        // Ambiguous - could be either, use locale preference\r\n                        if (userLocale.startsWith('en-US')) {\r\n                            patterns.push('mm/dd/yyyy', 'dd/mm/yyyy', 'mm/dd/yy', 'dd/mm/yy');\r\n                        } else {\r\n                            patterns.push('dd/mm/yyyy', 'mm/dd/yyyy', 'dd/mm/yy', 'mm/dd/yy');\r\n                        }\r\n                    }\r\n\r\n                    // Add variations\r\n                    if (p3 < 100) {\r\n                        patterns.push('dd/mm/yy', 'mm/dd/yy', 'd/m/yy', 'm/d/yy');\r\n                    } else {\r\n                        patterns.push('dd/mm/yyyy', 'mm/dd/yyyy', 'd/m/yyyy', 'm/d/yyyy');\r\n                    }\r\n                }\r\n\r\n                // Check for date with dashes: XX-XX-XXXX\r\n                else if (str.match(/^\\d{1,2}-\\d{1,2}-\\d{2,4}$/)) {\r\n                    const parts = str.split('-');\r\n                    const p1 = parseInt(parts[0]);\r\n                    const p2 = parseInt(parts[1]);\r\n\r\n                    if (p1 <= 12 && p2 <= 31 && p2 > 12) {\r\n                        patterns.push('mm-dd-yyyy', 'mm-dd-yy', 'm-d-yyyy', 'm-d-yy');\r\n                    } else if (p1 <= 31 && p2 <= 12 && p1 > 12) {\r\n                        patterns.push('dd-mm-yyyy', 'dd-mm-yy', 'd-m-yyyy', 'd-m-yy');\r\n                    } else {\r\n                        patterns.push('dd-mm-yyyy', 'mm-dd-yyyy', 'dd-mm-yy', 'mm-dd-yy');\r\n                    }\r\n                }\r\n\r\n                // Check for ISO format: YYYY-MM-DD\r\n                else if (str.match(/^\\d{4}-\\d{1,2}-\\d{1,2}$/)) {\r\n                    patterns.push('yyyy-mm-dd', 'yyyy-m-d');\r\n                }\r\n\r\n                // Check for format: YYYY/MM/DD\r\n                else if (str.match(/^\\d{4}\\/\\d{1,2}\\/\\d{1,2}$/)) {\r\n                    patterns.push('yyyy/mm/dd', 'yyyy/m/d');\r\n                }\r\n\r\n                // Check for dates with month names\r\n                else if (str.match(/\\b(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i)) {\r\n                    // DD Mon YYYY or DD Month YYYY\r\n                    if (str.match(/^\\d{1,2}\\s+\\w+\\s+\\d{2,4}$/i)) {\r\n                        patterns.push('dd mmm yyyy', 'dd mmmm yyyy', 'd mmm yyyy', 'd mmmm yyyy',\r\n                            'dd mmm yy', 'dd mmmm yy', 'd mmm yy', 'd mmmm yy');\r\n                    }\r\n                    // Mon DD, YYYY or Month DD, YYYY\r\n                    else if (str.match(/^\\w+\\s+\\d{1,2},?\\s+\\d{2,4}$/i)) {\r\n                        patterns.push('mmm dd, yyyy', 'mmmm dd, yyyy', 'mmm d, yyyy', 'mmmm d, yyyy',\r\n                            'mmm dd yyyy', 'mmmm dd yyyy', 'mmm d yyyy', 'mmmm d yyyy');\r\n                    }\r\n                    // DD-Mon-YYYY\r\n                    else if (str.match(/^\\d{1,2}-\\w+-\\d{2,4}$/i)) {\r\n                        patterns.push('dd-mmm-yyyy', 'dd-mmmm-yyyy', 'd-mmm-yyyy', 'd-mmmm-yyyy',\r\n                            'dd-mmm-yy', 'dd-mmmm-yy', 'd-mmm-yy', 'd-mmmm-yy');\r\n                    }\r\n                }\r\n\r\n                // Check for weekday formats\r\n                else if (str.match(/^(mon|tue|wed|thu|fri|sat|sun)/i)) {\r\n                    if (str.match(/^\\w+,\\s+\\d{1,2}\\s+\\w+\\s+\\d{4}$/i)) {\r\n                        patterns.push('ddd, dd mmm yyyy', 'ddd, d mmm yyyy',\r\n                            'dddd, dd mmmm yyyy', 'dddd, d mmmm yyyy');\r\n                    }\r\n                }\r\n\r\n                // Check for datetime formats\r\n                else if (str.includes(' ') && str.match(/\\d{1,2}:\\d{2}/)) {\r\n                    const parts = str.split(' ');\r\n                    if (parts.length >= 2) {\r\n                        const datePart = parts[0];\r\n                        const timePart = parts.slice(1).join(' ');\r\n\r\n                        // Determine date format\r\n                        let dateMasks = [];\r\n                        if (datePart.includes('/')) {\r\n                            dateMasks = ['dd/mm/yyyy', 'mm/dd/yyyy', 'd/m/yyyy', 'm/d/yyyy'];\r\n                        } else if (datePart.includes('-')) {\r\n                            if (datePart.match(/^\\d{4}-/)) {\r\n                                dateMasks = ['yyyy-mm-dd', 'yyyy-m-d'];\r\n                            } else {\r\n                                dateMasks = ['dd-mm-yyyy', 'mm-dd-yyyy', 'd-m-yyyy', 'm-d-yyyy'];\r\n                            }\r\n                        }\r\n\r\n                        // Determine time format\r\n                        let timeMasks = [];\r\n                        if (timePart.match(/\\d{1,2}:\\d{2}:\\d{2}/)) {\r\n                            timeMasks = ['hh:mm:ss', 'h:mm:ss'];\r\n                        } else {\r\n                            timeMasks = ['hh:mm', 'h:mm'];\r\n                        }\r\n\r\n                        // Add AM/PM variants if present\r\n                        if (timePart.match(/[ap]m/i)) {\r\n                            timeMasks = timeMasks.map(t => t + ' am/pm');\r\n                        }\r\n\r\n                        // Combine date and time masks\r\n                        for (const dateMask of dateMasks) {\r\n                            for (const timeMask of timeMasks) {\r\n                                patterns.push(`${dateMask} ${timeMask}`);\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Check for time-only formats\r\n                else if (str.match(/^\\d{1,2}:\\d{2}(:\\d{2})?(\\s*(am|pm))?$/i)) {\r\n                    if (str.match(/:\\d{2}:\\d{2}/)) {\r\n                        patterns.push('hh:mm:ss', 'h:mm:ss');\r\n                        if (str.match(/[ap]m/i)) {\r\n                            patterns.push('hh:mm:ss am/pm', 'h:mm:ss am/pm');\r\n                        }\r\n                    } else {\r\n                        patterns.push('hh:mm', 'h:mm');\r\n                        if (str.match(/[ap]m/i)) {\r\n                            patterns.push('hh:mm am/pm', 'h:mm am/pm');\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Check for extended hour format [h]:mm:ss\r\n                else if (str.match(/^\\[?\\d+\\]?:\\d{2}:\\d{2}$/)) {\r\n                    patterns.push('[h]:mm:ss');\r\n                }\r\n\r\n                return [...new Set(patterns)]; // Remove duplicates\r\n            };\r\n\r\n            // Get candidate masks based on the string structure\r\n            const candidateMasks = analyzeStructure(value);\r\n\r\n            // If no patterns detected, try some common formats as fallback\r\n            if (candidateMasks.length === 0) {\r\n                if (userLocale.startsWith('en-US')) {\r\n                    candidateMasks.push(\r\n                        'mm/dd/yyyy', 'mm-dd-yyyy', 'yyyy-mm-dd',\r\n                        'mm/dd/yy', 'mm-dd-yy',\r\n                        'hh:mm:ss', 'hh:mm', 'h:mm am/pm'\r\n                    );\r\n                } else {\r\n                    candidateMasks.push(\r\n                        'dd/mm/yyyy', 'dd-mm-yyyy', 'yyyy-mm-dd',\r\n                        'dd/mm/yy', 'dd-mm-yy',\r\n                        'hh:mm:ss', 'hh:mm', 'h:mm'\r\n                    );\r\n                }\r\n            }\r\n\r\n            // Try each candidate mask\r\n            for (const mask of candidateMasks) {\r\n                try {\r\n                    // Use Component.extractDateFromString to parse the date\r\n                    const isoDate = Component.extractDateFromString(value, mask);\r\n\r\n                    if (isoDate && isoDate !== '') {\r\n                        // Parse the ISO date string to components\r\n                        const parts = isoDate.split(' ');\r\n                        const dateParts = parts[0].split('-');\r\n                        const timeParts = parts[1] ? parts[1].split(':') : ['0', '0', '0'];\r\n\r\n                        const year = parseInt(dateParts[0]);\r\n                        const month = parseInt(dateParts[1]);\r\n                        const day = parseInt(dateParts[2]);\r\n                        const hour = parseInt(timeParts[0]);\r\n                        const minute = parseInt(timeParts[1]);\r\n                        const second = parseInt(timeParts[2]);\r\n\r\n                        // Validate the date components\r\n                        if (year > 0 && month >= 1 && month <= 12 && day >= 1 && day <= 31 &&\r\n                            hour >= 0 && hour < 24 && minute >= 0 && minute < 60 && second >= 0 && second < 60) {\r\n\r\n                            // Convert to Excel serial number\r\n                            const excelNumber = Helpers.dateToNum(isoDate);\r\n\r\n                            // Verify by rendering back\r\n                            const rendered = Component.render(excelNumber, { mask: mask }, true);\r\n\r\n                            // Case-insensitive comparison for month names\r\n                            if (rendered.toLowerCase() === value.toLowerCase()) {\r\n                                return {\r\n                                    mask: mask,\r\n                                    value: excelNumber,\r\n                                    type: 'date',\r\n                                    category: 'datetime'\r\n                                };\r\n                            }\r\n                        }\r\n                    }\r\n                } catch (e) {\r\n                }\r\n            }\r\n\r\n            // No matching format found\r\n            return null;\r\n        };\r\n\r\n        const autoCastingCurrency = function (input, filterDecimal) {\r\n            if (typeof input !== 'string') return null;\r\n\r\n            const str = input.trim();\r\n            if (!str) return null;\r\n\r\n            const len = str.length;\r\n            let isNegative = false;\r\n            let hasParens = false;\r\n            let symbol = '';\r\n            let numericPart = '';\r\n            let letterBuffer = '';\r\n            let firstCommaPos = -1;\r\n            let lastCommaPos = -1;\r\n            let firstDotPos = -1;\r\n            let lastDotPos = -1;\r\n            let commaCount = 0;\r\n            let dotCount = 0;\r\n            let hasInvalidChars = false;\r\n            let hasCurrencySymbol = false;\r\n\r\n            // Single pass through the string\r\n            for (let i = 0; i < len; i++) {\r\n                const char = str[i];\r\n\r\n                // Check for negative signs and parentheses\r\n                if (char === '-' && !numericPart) {\r\n                    isNegative = true;\r\n                    continue;\r\n                }\r\n                if (char === '(') {\r\n                    hasParens = true;\r\n                    isNegative = true;\r\n                    continue;\r\n                }\r\n                if (char === ')') continue;\r\n\r\n                // Skip whitespace\r\n                if (char === ' ' || char === '\\t') {\r\n                    if (letterBuffer) {\r\n                        letterBuffer += char;\r\n                    }\r\n                    continue;\r\n                }\r\n\r\n                // Currency symbols\r\n                if (char === '$' || char === '€' || char === '£' || char === '¥' ||\r\n                    char === '₹' || char === '₽' || char === '₩' || char === '₫' || char === '¢') {\r\n                    hasCurrencySymbol = true;\r\n                    // Validate letter buffer: max 2 letters before symbol\r\n                    const trimmedBuffer = letterBuffer.trim();\r\n                    if (trimmedBuffer.length > 2) {\r\n                        return null;\r\n                    }\r\n                    if (letterBuffer) {\r\n                        symbol = letterBuffer + char;\r\n                        letterBuffer = '';\r\n                    } else {\r\n                        symbol = char;\r\n                    }\r\n                    // Check if next char is a space to include it in symbol\r\n                    if (i + 1 < len && (str[i + 1] === ' ' || str[i + 1] === '\\t')) {\r\n                        symbol += ' ';\r\n                        i++; // Skip the space\r\n                    }\r\n                    continue;\r\n                }\r\n\r\n                // Letters (only valid BEFORE currency symbol, max 2 letters)\r\n                if ((char >= 'A' && char <= 'Z') || (char >= 'a' && char <= 'z')) {\r\n                    // Letters after symbol or numeric part are invalid\r\n                    if (hasCurrencySymbol || numericPart) {\r\n                        return null;\r\n                    }\r\n                    letterBuffer += char;\r\n                    continue;\r\n                }\r\n\r\n                // Digits\r\n                if (char >= '0' && char <= '9') {\r\n                    // Reject if we have letters but no currency symbol\r\n                    if (letterBuffer && !hasCurrencySymbol) {\r\n                        return null;\r\n                    }\r\n                    letterBuffer = '';\r\n                    numericPart += char;\r\n                    continue;\r\n                }\r\n\r\n                // Comma and dot separators\r\n                if (char === ',') {\r\n                    if (firstCommaPos === -1) firstCommaPos = numericPart.length;\r\n                    lastCommaPos = numericPart.length;\r\n                    commaCount++;\r\n                    numericPart += char;\r\n                    continue;\r\n                }\r\n                if (char === '.') {\r\n                    if (firstDotPos === -1) firstDotPos = numericPart.length;\r\n                    lastDotPos = numericPart.length;\r\n                    dotCount++;\r\n                    numericPart += char;\r\n                    continue;\r\n                }\r\n\r\n                // Invalid character\r\n                hasInvalidChars = true;\r\n            }\r\n\r\n            // Reject if no currency symbol was found\r\n            if (!hasCurrencySymbol) {\r\n                return null;\r\n            }\r\n\r\n            // Reject if there are any invalid characters\r\n            if (hasInvalidChars) {\r\n                return null;\r\n            }\r\n\r\n            // If no numeric part, reject\r\n            if (!numericPart) return null;\r\n\r\n            // Ensure numeric part contains at least one digit (not just separators)\r\n            if (!/\\d/.test(numericPart)) return null;\r\n\r\n            // Infer decimal and group separators\r\n            let decimal = '.';\r\n            let group = ',';\r\n\r\n            // If filterDecimal is provided, use it to determine separators\r\n            if (filterDecimal) {\r\n                decimal = filterDecimal;\r\n                group = filterDecimal === ',' ? '.' : ',';\r\n\r\n                // Validate that the input matches this interpretation\r\n                if (commaCount > 0 && dotCount > 0) {\r\n                    // Both present: check if filterDecimal matches the last one (which should be decimal)\r\n                    const lastIsComma = lastCommaPos > lastDotPos;\r\n                    if ((filterDecimal === ',' && !lastIsComma) || (filterDecimal === '.' && lastIsComma)) {\r\n                        return null;\r\n                    }\r\n                } else if (dotCount === 1 && commaCount === 0) {\r\n                    // Only one dot: if NOT followed by exactly 3 digits, it's a decimal separator\r\n                    const afterDot = numericPart.substring(lastDotPos + 1);\r\n                    if (afterDot.length !== 3) {\r\n                        // It's a decimal separator, must match filterDecimal\r\n                        if (filterDecimal !== '.') {\r\n                            return null;\r\n                        }\r\n                    }\r\n                } else if (commaCount === 1 && dotCount === 0) {\r\n                    // Only one comma: if NOT followed by exactly 3 digits, it's a decimal separator\r\n                    const afterComma = numericPart.substring(lastCommaPos + 1);\r\n                    if (afterComma.length !== 3) {\r\n                        // It's a decimal separator, must match filterDecimal\r\n                        if (filterDecimal !== ',') {\r\n                            return null;\r\n                        }\r\n                    }\r\n                }\r\n            } else {\r\n                // Infer from the input pattern\r\n                if (commaCount > 0 && dotCount > 0) {\r\n                    // Both present: the one that appears last is decimal\r\n                    if (lastCommaPos > lastDotPos) {\r\n                        decimal = ',';\r\n                        group = '.';\r\n                    }\r\n                } else if (dotCount === 1 && commaCount === 0) {\r\n                    // Only one dot: check if it's followed by exactly 3 digits\r\n                    const afterDot = numericPart.substring(lastDotPos + 1);\r\n                    if (afterDot.length === 3) {\r\n                        // Likely a thousands separator\r\n                        decimal = ',';\r\n                        group = '.';\r\n                    }\r\n                } else if (commaCount === 1 && dotCount === 0) {\r\n                    // Only one comma: check if it's followed by exactly 3 digits\r\n                    const afterComma = numericPart.substring(lastCommaPos + 1);\r\n                    if (afterComma.length !== 3) {\r\n                        // Likely a decimal separator\r\n                        decimal = ',';\r\n                        group = '.';\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Normalize: remove group separator, convert decimal to '.'\r\n            let normalized = '';\r\n            for (let i = 0; i < numericPart.length; i++) {\r\n                const char = numericPart[i];\r\n                if (char === group) continue;\r\n                if (char === decimal) {\r\n                    normalized += '.';\r\n                } else {\r\n                    normalized += char;\r\n                }\r\n            }\r\n\r\n            const parsed = parseFloat(normalized);\r\n            if (isNaN(parsed)) return null;\r\n\r\n            const finalValue = isNegative ? -parsed : parsed;\r\n\r\n            // Build mask\r\n            const dotPos = normalized.indexOf('.');\r\n            const decimalPlaces = dotPos !== -1 ? normalized.length - dotPos - 1 : 0;\r\n            const maskDecimal = decimalPlaces ? decimal + '0'.repeat(decimalPlaces) : '';\r\n            const groupMask = '#' + group + '##0';\r\n            const needsSpace = symbol && !symbol.endsWith(' ') && !symbol.endsWith('\\t') && !hasParens;\r\n            let mask = symbol + (needsSpace ? ' ' : '') + groupMask + maskDecimal;\r\n\r\n            if (hasParens) {\r\n                mask = `(${mask})`;\r\n            }\r\n\r\n            return {\r\n                mask,\r\n                value: finalValue,\r\n                type: 'currency',\r\n                category: 'numeric'\r\n            };\r\n        }\r\n\r\n        const autoCastingNumber = function (input, filterDecimal) {\r\n            // If you currently support numeric inputs directly, keep this:\r\n            if (typeof input === 'number' && Number.isFinite(input)) {\r\n                return { mask: '0', value: input, type: 'number', category: 'numeric' };\r\n            }\r\n\r\n            if (typeof input !== 'string') {\r\n                return null;\r\n            }\r\n\r\n            const sRaw = input.trim();\r\n\r\n            // Check for simple integers first (with optional sign)\r\n            if (/^[+-]?\\d+$/.test(sRaw)) {\r\n                const sign = /^[+-]/.test(sRaw) ? sRaw[0] : '';\r\n                const digitsClean = (sign ? sRaw.slice(1) : sRaw);\r\n                const rawDigits = sign ? sRaw.slice(1) : sRaw;\r\n                const m = rawDigits.match(/^0+/);\r\n                const leadingZeros = m ? m[0].length : 0;\r\n                const mask = leadingZeros > 0 ? '0'.repeat(rawDigits.length) : '0';\r\n                const value = Number(sign + digitsClean);\r\n                return { mask, value, type: 'number', category: 'numeric' };\r\n            }\r\n\r\n            // Check for formatted numbers with thousand separators (no letters, no symbols)\r\n            // Examples: \"1,000.25\", \"1.000,25\", \"-1,234.56\"\r\n            if (/^[+-]?[\\d,.]+$/.test(sRaw)) {\r\n                let isNegative = sRaw[0] === '-';\r\n                let numStr = isNegative ? sRaw.slice(1) : sRaw;\r\n\r\n                // Count separators\r\n                const commaCount = (numStr.match(/,/g) || []).length;\r\n                const dotCount = (numStr.match(/\\./g) || []).length;\r\n\r\n                // Must have at least one digit\r\n                if (!/\\d/.test(numStr)) return null;\r\n\r\n                // Infer decimal and group separators\r\n                let decimal = '.';\r\n                let group = ',';\r\n\r\n                const lastCommaPos = numStr.lastIndexOf(',');\r\n                const lastDotPos = numStr.lastIndexOf('.');\r\n\r\n                // If filterDecimal is provided, use it to determine separators\r\n                if (filterDecimal) {\r\n                    decimal = filterDecimal;\r\n                    group = filterDecimal === ',' ? '.' : ',';\r\n\r\n                    // Validate that the input matches this interpretation\r\n                    if (commaCount > 0 && dotCount > 0) {\r\n                        // Both present: check if filterDecimal matches the last one (which should be decimal)\r\n                        const lastIsComma = lastCommaPos > lastDotPos;\r\n                        if ((filterDecimal === ',' && !lastIsComma) || (filterDecimal === '.' && lastIsComma)) {\r\n                            return null;\r\n                        }\r\n                    } else if (dotCount === 1 && commaCount === 0) {\r\n                        // Only one dot: if NOT followed by exactly 3 digits, it's a decimal separator\r\n                        const afterDot = numStr.substring(lastDotPos + 1);\r\n                        if (afterDot.length !== 3 || /[,.]/.test(afterDot)) {\r\n                            // It's a decimal separator, must match filterDecimal\r\n                            if (filterDecimal !== '.') {\r\n                                return null;\r\n                            }\r\n                        }\r\n                    } else if (commaCount === 1 && dotCount === 0) {\r\n                        // Only one comma: if NOT followed by exactly 3 digits, it's a decimal separator\r\n                        const afterComma = numStr.substring(lastCommaPos + 1);\r\n                        if (afterComma.length !== 3 || /[,.]/.test(afterComma)) {\r\n                            // It's a decimal separator, must match filterDecimal\r\n                            if (filterDecimal !== ',') {\r\n                                return null;\r\n                            }\r\n                        }\r\n                    }\r\n                } else {\r\n                    // Infer from the input pattern\r\n                    if (commaCount > 0 && dotCount > 0) {\r\n                        // Both present: the one that appears last is decimal\r\n                        if (lastCommaPos > lastDotPos) {\r\n                            decimal = ',';\r\n                            group = '.';\r\n                        }\r\n                    } else if (dotCount === 1 && commaCount === 0) {\r\n                        // Only one dot: check if it's followed by exactly 3 digits (thousands separator)\r\n                        const afterDot = numStr.substring(lastDotPos + 1);\r\n                        if (afterDot.length === 3 && !/[,.]/.test(afterDot)) {\r\n                            decimal = ',';\r\n                            group = '.';\r\n                        }\r\n                    } else if (commaCount === 1 && dotCount === 0) {\r\n                        // Only one comma: check if it's NOT followed by exactly 3 digits (decimal separator)\r\n                        const afterComma = numStr.substring(lastCommaPos + 1);\r\n                        if (afterComma.length !== 3 || /[,.]/.test(afterComma)) {\r\n                            decimal = ',';\r\n                            group = '.';\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Check if group separator is actually used in the input\r\n                const hasGroupSeparator = (group === ',' && commaCount > 1) || (group === '.' && dotCount > 1) ||\r\n                    (group === ',' && decimal === '.' && commaCount > 0) ||\r\n                    (group === '.' && decimal === ',' && dotCount > 0);\r\n\r\n                // Normalize: remove group separator, convert decimal to '.'\r\n                let normalized = numStr.replace(new RegExp('\\\\' + group, 'g'), '').replace(decimal, '.');\r\n                const parsed = parseFloat(normalized);\r\n                if (isNaN(parsed)) return null;\r\n\r\n                const value = isNegative ? -parsed : parsed;\r\n\r\n                // Build mask\r\n                const dotPos = normalized.indexOf('.');\r\n                const decimalPlaces = dotPos !== -1 ? normalized.length - dotPos - 1 : 0;\r\n                const maskDecimal = decimalPlaces ? decimal + '0'.repeat(decimalPlaces) : '';\r\n                const mask = (hasGroupSeparator ? '#' + group + '##0' : '0') + maskDecimal;\r\n\r\n                return { mask, value, type: 'number', category: 'numeric' };\r\n            }\r\n\r\n            return null;\r\n        };\r\n\r\n        const autoCastingScientific = function(input) {\r\n            if (typeof input !== 'string') return null;\r\n\r\n            const original = input.trim();\r\n\r\n            // Match scientific notation: 1e3, -2.5E-4, etc.\r\n            const sciPattern = /^[-+]?\\d*\\.?\\d+[eE][-+]?\\d+$/;\r\n            if (!sciPattern.test(original)) return null;\r\n\r\n            const parsed = parseFloat(original);\r\n            if (isNaN(parsed)) return null;\r\n\r\n            // Extract parts to determine mask\r\n            const [coefficient, exponent] = original.toLowerCase().split('e');\r\n            const decimalPlaces = coefficient.includes('.') ? coefficient.split('.')[1].length : 0;\r\n            const mask = `0${decimalPlaces ? '.' + '0'.repeat(decimalPlaces) : ''}E+00`;\r\n\r\n            return {\r\n                mask,\r\n                value: parsed,\r\n                type: 'scientific',\r\n                category: 'scientific'\r\n            };\r\n        }\r\n\r\n        const autoCastingTime = function (input) {\r\n            if (typeof input !== 'string') return null;\r\n            const original = input.trim();\r\n\r\n            // hh:mm[:ss][ am/pm]\r\n            const m = original.match(/^(\\d{1,2}):(\\d{2})(?::(\\d{2}))?(?:\\s*(am|pm))?$/i);\r\n            if (!m) return null;\r\n\r\n            let h = parseInt(m[1], 10);\r\n            const i = parseInt(m[2], 10);\r\n            const s = m[3] ? parseInt(m[3], 10) : 0;\r\n            const mer = m[4] && m[4].toLowerCase();\r\n\r\n            // basic range checks\r\n            if (i > 59 || s > 59) return null;\r\n            if (mer) {\r\n                if (h < 1 || h > 12) return null;\r\n                if (mer === 'pm' && h < 12) h += 12;\r\n                if (mer === 'am' && h === 12) h = 0;\r\n            } else {\r\n                if (h > 23) return null;\r\n            }\r\n\r\n            // Excel serial for time-of-day = hours/24 + minutes/1440 + seconds/86400\r\n            const excel = (h + i / 60 + s / 3600) / 24;\r\n\r\n            // Build mask according to how user typed it\r\n            const hourToken = m[1].length === 1 ? 'h' : 'hh';\r\n            const base = s !== 0 || m[3] ? `${hourToken}:mm:ss` : `${hourToken}:mm`;\r\n            const mask = mer ? `${base} am/pm` : base;\r\n\r\n            // Verify we can render back exactly what the user typed\r\n            if (testMask(mask, excel, original)) {            // uses Component.render under the hood\r\n                return { mask: mask, value: excel, type: 'time', category: 'datetime' };\r\n            }\r\n\r\n            // Try alternate hour width if needed\r\n            const altHour = hourToken === 'hh' ? 'h' : 'hh';\r\n            const alt = mer\r\n                ? `${altHour}${base.slice(hourToken.length)} am/pm`\r\n                : `${altHour}${base.slice(hourToken.length)}`;\r\n\r\n            if (testMask(alt, excel, original)) {\r\n                return { mask: alt, value: excel, type: 'time', category: 'datetime' };\r\n            }\r\n\r\n            return null;\r\n        };\r\n\r\n        const ParseValue = function(v, config) {\r\n            if (v === '') return '';\r\n\r\n            const originalInput = '' + v;\r\n            const decimal = config.decimal || '.';\r\n\r\n            // Validate that the input looks like a reasonable number format before extracting digits\r\n            // Reject strings that are clearly not intended to be numbers (e.g., \"test123\", \"abc\", etc.)\r\n            const hasLetters = /[a-zA-Z]/.test(originalInput);\r\n            const hasDigits = /[0-9]/.test(originalInput);\r\n\r\n            if (hasLetters && hasDigits) {\r\n                // Mixed letters and digits - check if it's a valid numeric format\r\n                // Allow currency symbols, currency codes (3 letters), percentage, and separators\r\n\r\n                // Remove all valid numeric characters and symbols\r\n                let cleaned = originalInput.replace(/[\\d\\s.,\\-+()]/g, ''); // Remove digits, spaces, separators, signs, parentheses\r\n                cleaned = cleaned.replace(/[A-Z]{1,2}[€$£¥₹₽₩₫¢]/gi, ''); // Remove 1-2 letter prefix + currency symbol (R$, U$, etc.)\r\n                cleaned = cleaned.replace(/[€$£¥₹₽₩₫¢]/g, ''); // Remove remaining currency symbols\r\n                cleaned = cleaned.replace(/%/g, ''); // Remove percentage\r\n                cleaned = cleaned.replace(/\\b[A-Z]{3}\\b/g, ''); // Remove 3-letter currency codes (USD, BRL, etc.)\r\n\r\n                // If anything remains, it's likely invalid (like \"test\" in \"test123\")\r\n                if (cleaned.trim().length > 0) {\r\n                    return null; // Reject patterns like \"test123\", \"abc123\", etc.\r\n                }\r\n            }\r\n\r\n            v = originalInput.split(decimal);\r\n\r\n            // Detect negative sign\r\n            let signal = v[0].includes('-');\r\n\r\n            v[0] = v[0].match(/[0-9]+/g);\r\n            if (v[0]) {\r\n                if (signal) v[0].unshift('-');\r\n                v[0] = v[0].join('');\r\n            } else {\r\n                v[0] = signal ? '-' : '';\r\n            }\r\n\r\n            if (v[1] !== undefined) {\r\n                v[1] = v[1].match(/[0-9]+/g);\r\n                v[1] = v[1] ? v[1].join('') : '';\r\n            }\r\n\r\n            return v[0] || v[1] ? v : '';\r\n        }\r\n\r\n        const Extract = function(v, config) {\r\n            const parsed = ParseValue(v, config);\r\n            if (parsed) {\r\n                if (parsed[0] === '-') {\r\n                    parsed[0] = '-0';\r\n                }\r\n                return parseFloat(parsed.join('.'));\r\n            }\r\n            return null;\r\n        }\r\n\r\n        /**\r\n         * Try to get which mask that can transform the number in that format\r\n         * @param {string|number} value - The value to detect the mask for\r\n         * @param {string} [decimal] - Optional decimal separator filter ('.' or ',')\r\n         */\r\n        Component.autoCasting = function(value, decimal) {\r\n            // Check cache first - use string value and decimal as key\r\n            const cacheKey = decimal ? String(value) + '|' + decimal : String(value);\r\n            let cached = autoCastingCache[cacheKey];\r\n            if (cached !== undefined) {\r\n                return cached;\r\n            }\r\n\r\n            const methods = [\r\n                autoCastingDates,        // Most structured, the least ambiguous\r\n                autoCastingTime,\r\n                autoCastingFractions,    // Specific pattern with slashes\r\n                autoCastingPercent,      // Recognizable with \"%\"\r\n                autoCastingScientific,\r\n                (v) => autoCastingNumber(v, decimal),       // Only picks up basic digits, decimals, leading 0s\r\n                (v) => autoCastingCurrency(v, decimal),     // Complex formats, but recognizable\r\n            ];\r\n\r\n            let result = null;\r\n            for (let method of methods) {\r\n                const test = method(value);\r\n                if (test) {\r\n                    result = test;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            // Cache the result (even if null)\r\n            autoCastingCache[cacheKey] = result;\r\n            return result;\r\n        }\r\n\r\n        Component.extract = function(value, options, returnObject) {\r\n            if (! value || typeof options !== 'object') {\r\n                return value;\r\n            }\r\n\r\n            if (options.locale) {\r\n                const config = getConfig(options, value);\r\n                config.value = Extract(value, config);\r\n                if (value.toString().indexOf('%') !== -1) {\r\n                    config.value /= 100;\r\n                }\r\n                return returnObject ? config : config.value;\r\n            } else if (options.mask) {\r\n                let mask = options.mask.split(';')[0];\r\n                if (mask) {\r\n                    options.mask = mask;\r\n                }\r\n\r\n                // Get decimal, group, type, etc.\r\n                const config = getConfig(options, value);\r\n                const type = config.type;\r\n\r\n                let result;\r\n                let o = options;\r\n\r\n                if (type === 'text') {\r\n                    result = value;\r\n                } else if (type === 'general') {\r\n                    result = Component(value, options);\r\n                } else if (type === 'datetime') {\r\n                    if (value instanceof Date) {\r\n                        value = Component.getDateString(value, config.mask);\r\n                    }\r\n\r\n                    o = Component(value, options, true);\r\n\r\n                    result = typeof o.value === 'number' ? o.value : extractDate.call(o);\r\n                } else if (type === 'scientific') {\r\n                    result = typeof value === 'string' ? Number(value) : value;\r\n                } else if (type === 'fraction') {\r\n                    // Parse a fraction string according to the mask (supports mixed \"# ?/d\" or simple \"?/d\")\r\n                    const mask = config.mask;\r\n\r\n                    // Detect fixed denominator (e.g. \"# ?/16\" or \"?/8\")\r\n                    const fixedDenMatch = mask.match(/\\/\\s*(\\d+)\\s*$/);\r\n                    const fixedDen = fixedDenMatch ? parseInt(fixedDenMatch[1], 10) : null;\r\n\r\n                    // Whether a mask allows a whole part (e.g. \"# ?/?\")\r\n                    const allowWhole = mask.includes('#');\r\n\r\n                    let s = ('' + value).trim();\r\n                    if (!s) {\r\n                        result = null;\r\n                    } else {\r\n                        // Allow leading parentheses or '-' for negatives\r\n                        let sign = 1;\r\n                        if (/^\\(.*\\)$/.test(s)) {\r\n                            sign = -1;\r\n                            s = s.slice(1, -1).trim();\r\n                        }\r\n                        if (/^\\s*-/.test(s)) {\r\n                            sign = -1;\r\n                            s = s.replace(/^\\s*-/, '').trim();\r\n                        }\r\n\r\n                        let out = null;\r\n\r\n                        if (s.includes('/')) {\r\n                            // sign? (whole )? numerator / denominator\r\n                            // Examples:\r\n                            //  \"1 1/2\" => whole=1, num=1, den=2\r\n                            //  \"1/2\"   => whole=undefined, num=1, den=2\r\n                            const m = s.match(/^\\s*(?:(\\d+)\\s+)?(\\d+)\\s*\\/\\s*(\\d+)\\s*$/);\r\n                            if (m) {\r\n                                const whole = allowWhole && m[1] ? parseInt(m[1], 10) : 0;\r\n                                const num = parseInt(m[2], 10);\r\n                                let den = parseInt(m[3], 10);\r\n\r\n                                // If mask fixes the denominator, enforce it\r\n                                if (fixedDen) den = fixedDen;\r\n\r\n                                if (den !== 0) {\r\n                                    out = sign * (whole + num / den);\r\n                                }\r\n                            }\r\n                        } else {\r\n                            // No slash → treats as a plain number (e.g., whole only)\r\n                            const plain = Number(s.replace(',', '.'));\r\n                            if (!Number.isNaN(plain)) {\r\n                                out = sign * Math.abs(plain);\r\n                            }\r\n                        }\r\n\r\n                        result = out;\r\n                    }\r\n                } else {\r\n                    // Default fallback — numeric/currency/percent/etc.\r\n                    result = Extract(value, config);\r\n                    // Adjust percent\r\n                    if (type === 'percentage' && ('' + value).indexOf('%') !== -1) {\r\n                        result = result / 100;\r\n                    }\r\n                }\r\n\r\n                o.value = result;\r\n\r\n                if (!o.type && type) {\r\n                    o.type = type;\r\n                }\r\n\r\n                return returnObject ? o : result;\r\n            }\r\n\r\n            return value;\r\n        };\r\n\r\n        Component.render = function(value, options, fullMask) {\r\n            // Nothing to render\r\n            if (value === '' || value === undefined || value === null) {\r\n                return '';\r\n            }\r\n\r\n            // Config\r\n            const config = getConfig(options, value);\r\n\r\n            if (config.locale) {\r\n                value = Component(value, options);\r\n            } else if (config.mask) {\r\n                // Percentage\r\n                if (config.type === 'datetime') {\r\n                    var t = Component.getDateString(value, config.mask);\r\n                    if (t) {\r\n                        value = t;\r\n                    } else {\r\n                        return '';\r\n                    }\r\n                } else if (config.type === 'text') {\r\n                    // Parse number\r\n                    if (typeof (value) === 'number') {\r\n                        value = value.toString();\r\n                    }\r\n                } else {\r\n                    if (config.type === 'percentage') {\r\n                        if (typeof (value) === 'string' && value.indexOf('%') !== -1) {\r\n                            value = value.replace('%', '');\r\n                        } else {\r\n                            value = adjustPrecision(Number(value) * 100);\r\n                        }\r\n                    } else {\r\n                        if (config.mask.includes(',,M')) {\r\n                            if (typeof (value) === 'string' && value.indexOf('M') !== -1) {\r\n                                value = value.replace('M', '');\r\n                            } else {\r\n                                value = Number(value) / 1000000;\r\n                            }\r\n                        } else if (config.mask.includes(',,,B')) {\r\n                            if (typeof (value) === 'string' && value.indexOf('B') !== -1) {\r\n                                value = value.replace('B', '');\r\n                            } else {\r\n                                value = Number(value) / 1000000000;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (typeof (value) === 'string' && isNumber(value)) {\r\n                        value = Number(value);\r\n                    }\r\n\r\n                    if (typeof value === 'number') {\r\n                        // Temporary value\r\n                        let temp = value;\r\n\r\n                        if (config.type === 'fraction') {\r\n                            temp = formatFraction(value, config.mask);\r\n                        } else {\r\n                            if (fullMask) {\r\n                                temp = adjustNumberOfDecimalPlaces(config, value);\r\n\r\n                                if (config.type === 'scientific') {\r\n                                    return temp;\r\n                                }\r\n                            }\r\n                        }\r\n\r\n                        value = toPlainString(temp);\r\n\r\n                        if (config.decimal === ',') {\r\n                            value = value.replace('.', config.decimal);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Process mask\r\n                let control = Component(value, options, true);\r\n                // Complement render\r\n                if (fullMask) {\r\n                    processNumOfPaddingZeros(control);\r\n                }\r\n\r\n                value = getValue(control);\r\n\r\n                // If numeric mask but no numbers in input, return empty\r\n                if (isNumeric(control.type)) {\r\n                    // Check if any numeric digit was actually extracted\r\n                    const hasNumericValue = control.values.some(v => v && /\\d/.test(v));\r\n                    if (! hasNumericValue) {\r\n                        value = '';\r\n                    }\r\n                }\r\n\r\n                if (options.input && options.input.tagName) {\r\n                    if (options.input.contentEditable) {\r\n                        options.input.textContent = value;\r\n                    } else {\r\n                        options.input.value = value;\r\n                    }\r\n                    focus(options.input);\r\n                }\r\n            }\r\n\r\n            return value;\r\n        }\r\n\r\n        // Helper to extract date from a string\r\n        Component.extractDateFromString = function (date, format) {\r\n            let o = Component(date, { mask: format }, true);\r\n\r\n            // Check if in format Excel (Need difference with format date or type detected is numeric)\r\n            if (date > 0 && Number(date) == date && (o.values.join(\"\") !== o.value || o.type == \"numeric\")) {\r\n                var d = new Date(Math.round((date - 25569) * 86400 * 1000));\r\n                return d.getFullYear() + \"-\" + Helpers.two(d.getMonth()) + \"-\" + Helpers.two(d.getDate()) + ' 00:00:00';\r\n            }\r\n\r\n            let complete = false;\r\n\r\n            if (o.values && o.values.length === o.tokens.length && o.values[o.values.length - 1].length >= o.tokens[o.tokens.length - 1].length) {\r\n                complete = true;\r\n            }\r\n\r\n            if (o.date[0] && o.date[1] && (o.date[2] || complete)) {\r\n                if (!o.date[2]) {\r\n                    o.date[2] = 1;\r\n                }\r\n\r\n                return o.date[0] + '-' + Helpers.two(o.date[1]) + '-' + Helpers.two(o.date[2]) + ' ' + Helpers.two(o.date[3]) + ':' + Helpers.two(o.date[4]) + ':' + Helpers.two(o.date[5]);\r\n            }\r\n\r\n            return '';\r\n        }\r\n\r\n        // Tokens\r\n        const dateTokens = ['DAY', 'WD', 'DDDD', 'DDD', 'DD', 'D', 'Q', 'HH24', 'HH12', 'HH', '\\\\[H\\\\]', 'H', 'AM/PM', 'MI', 'SS', 'MS', 'YYYY', 'YYY', 'YY', 'Y', 'MONTH', 'MON', 'MMMMM', 'MMMM', 'MMM', 'MM', 'M', '.'];\r\n        // All date tokens\r\n        const allDateTokens = dateTokens.join('|')\r\n\r\n        Component.getDateString = function(value, options) {\r\n            if (! options) {\r\n                options = {};\r\n            }\r\n\r\n            // Labels\r\n            let format;\r\n\r\n            if (options && typeof(options) == 'object') {\r\n                if (options.format) {\r\n                    format = options.format;\r\n                } else if (options.mask) {\r\n                    format = options.mask;\r\n                }\r\n            } else {\r\n                format = options;\r\n            }\r\n\r\n            if (! format) {\r\n                format = 'YYYY-MM-DD';\r\n            }\r\n\r\n            format = format.toUpperCase();\r\n\r\n            // Date instance\r\n            if (value instanceof Date) {\r\n                value = Helpers.now(value);\r\n            } else if (isNumber(value)) {\r\n                value = Helpers.numToDate(value);\r\n            }\r\n\r\n\r\n            // Expression to extract all tokens from the string\r\n            let e = new RegExp(allDateTokens, 'gi');\r\n            // Extract\r\n            let t = format.match(e);\r\n\r\n            // Compatibility with Excel\r\n            fixMinuteToken(t);\r\n\r\n            // Object\r\n            const o = {\r\n                tokens: t\r\n            }\r\n\r\n            // Value\r\n            if (value) {\r\n                try {\r\n                    // Data\r\n                    o.data = extractDateAndTime(value);\r\n\r\n                    if (o.data[1] && o.data[1] > 12) {\r\n                        throw new Error('Invalid date');\r\n                    } else if (o.data[4] && o.data[4] > 59) {\r\n                        throw new Error('Invalid date');\r\n                    } else if (o.data[5] && o.data[5] > 59) {\r\n                        throw new Error('Invalid date');\r\n                    } else if (o.data[0] != null && o.data[1] != null) {\r\n                        let day = new Date(o.data[0], o.data[1], 0).getDate();\r\n                        if (o.data[2] > day) {\r\n                            throw new Error('Invalid date');\r\n                        }\r\n                    }\r\n\r\n                    // Value\r\n                    o.value = [];\r\n\r\n                    // Calendar instance\r\n                    let calendar = new Date(o.data[0], o.data[1] - 1, o.data[2], o.data[3], o.data[4], o.data[5]);\r\n\r\n                    if (o.data[0] === null && o.data[1] === null && o.data[2] === null) {\r\n                        // Do nothing\r\n                    } else {\r\n                        if (isNaN(calendar.getTime())) {\r\n                            throw new Error('Invalid date');\r\n                        }\r\n                    }\r\n\r\n                    // Get method\r\n                    const get = function (i) {\r\n                        // Token\r\n                        let t = this.tokens[i];\r\n\r\n                        // Case token\r\n                        let s = t.toUpperCase();\r\n                        let v = null;\r\n\r\n                        if (s === 'YYYY') {\r\n                            v = this.data[0];\r\n                        } else if (s === 'YYY') {\r\n                            v = this.data[0];\r\n                            if (v) {\r\n                                v = v.substring(1, 4);\r\n                            }\r\n                        } else if (s === 'YY') {\r\n                            v = this.data[0];\r\n                            if (v) {\r\n                                v = v.substring(2, 4);\r\n                            }\r\n                        } else if (s === 'Y') {\r\n                            v = this.data[0];\r\n                            if (v) {\r\n                                v = v.substring(3, 4);\r\n                            }\r\n                        } else if (t === 'MON') {\r\n                            v = Helpers.months[calendar.getMonth()];\r\n                            if (v) {\r\n                                v = v.substr(0, 3).toUpperCase();\r\n                            }\r\n                        } else if (t === 'mon') {\r\n                            v = Helpers.months[calendar.getMonth()];\r\n                            if (v) {\r\n                                v = v.substr(0, 3).toLowerCase();\r\n                            }\r\n                        } else if (t === 'MONTH') {\r\n                            v = Helpers.months[calendar.getMonth()];\r\n                            if (v) {\r\n                                v = v.toUpperCase();\r\n                            }\r\n                        } else if (t === 'month') {\r\n                            v = Helpers.months[calendar.getMonth()];\r\n                            if (v) {\r\n                                v = v.toLowerCase();\r\n                            }\r\n                        } else if (s === 'MMMMM') {\r\n                            v = Helpers.months[calendar.getMonth()];\r\n                            if (v) {\r\n                                v = v.substr(0, 1);\r\n                            }\r\n                        } else if (s === 'MMMM' || t === 'Month') {\r\n                            v = Helpers.months[calendar.getMonth()];\r\n                        } else if (s === 'MMM' || t == 'Mon') {\r\n                            v = Helpers.months[calendar.getMonth()];\r\n                            if (v) {\r\n                                v = v.substr(0, 3);\r\n                            }\r\n                        } else if (s === 'MM') {\r\n                            v = Helpers.two(this.data[1]);\r\n                        } else if (s === 'M') {\r\n                            v = calendar.getMonth() + 1;\r\n                        } else if (t === 'DAY') {\r\n                            v = Helpers.weekdays[calendar.getDay()];\r\n                            if (v) {\r\n                                v = v.toUpperCase();\r\n                            }\r\n                        } else if (t === 'day') {\r\n                            v = Helpers.weekdays[calendar.getDay()];\r\n                            if (v) {\r\n                                v = v.toLowerCase();\r\n                            }\r\n                        } else if (s === 'DDDD' || t == 'Day') {\r\n                            v = Helpers.weekdays[calendar.getDay()];\r\n                        } else if (s === 'DDD') {\r\n                            v = Helpers.weekdays[calendar.getDay()];\r\n                            if (v) {\r\n                                v = v.substr(0, 3);\r\n                            }\r\n                        } else if (s === 'DD') {\r\n                            v = Helpers.two(this.data[2]);\r\n                        } else if (s === 'D') {\r\n                            v = parseInt(this.data[2]);\r\n                        } else if (s === 'Q') {\r\n                            v = Math.floor((calendar.getMonth() + 3) / 3);\r\n                        } else if (s === 'HH24' || s === 'HH') {\r\n                            v = this.data[3]%24;\r\n                            if (this.tokens.indexOf('AM/PM') !== -1) {\r\n                                if (v > 12) {\r\n                                    v -= 12;\r\n                                } else if (v == '0' || v == '00') {\r\n                                    v = 12;\r\n                                }\r\n                            }\r\n                            v = Helpers.two(v);\r\n                        } else if (s === 'HH12') {\r\n                            v = this.data[3]%24;\r\n                            if (v > 12) {\r\n                                v = Helpers.two(v - 12);\r\n                            } else {\r\n                                v = Helpers.two(v);\r\n                            }\r\n                        } else if (s === 'H') {\r\n                            v = this.data[3]%24;\r\n                            if (this.tokens.indexOf('AM/PM') !== -1) {\r\n                                if (v > 12) {\r\n                                    v -= 12;\r\n                                } else if (v == '0' || v == '00') {\r\n                                    v = 12;\r\n                                }\r\n                            }\r\n                        } else if (s === '[H]') {\r\n                            v = this.data[3];\r\n                        } else if (s === 'MI') {\r\n                            v = Helpers.two(this.data[4]);\r\n                        } else if (s === 'I') {\r\n                            v = parseInt(this.data[4]);\r\n                        } else if (s === 'SS') {\r\n                            v = Helpers.two(this.data[5]);\r\n                        } else if (s === 'S') {\r\n                            v = parseInt(this.data[5]);\r\n                        } else if (s === 'MS') {\r\n                            v = calendar.getMilliseconds();\r\n                        } else if (s === 'AM/PM') {\r\n                            if (this.data[3] >= 12) {\r\n                                v = 'PM';\r\n                            } else {\r\n                                v = 'AM';\r\n                            }\r\n                        } else if (s === 'WD') {\r\n                            v = Helpers.weekdays[calendar.getDay()];\r\n                        }\r\n\r\n                        if (v === null) {\r\n                            this.value[i] = this.tokens[i];\r\n                        } else {\r\n                            this.value[i] = v;\r\n                        }\r\n                    }\r\n\r\n                    for (let i = 0; i < o.tokens.length; i++) {\r\n                        get.call(o, i);\r\n                    }\r\n\r\n                    value = o.value.join('');\r\n                } catch (e) {\r\n                    value = '';\r\n                }\r\n            }\r\n\r\n            return value;\r\n        }\r\n\r\n        Component.getDate = function(value, format) {\r\n            if (! format) {\r\n                format = 'YYYY-MM-DD';\r\n            }\r\n\r\n            let ret = value;\r\n            if (ret && Number(ret) == ret) {\r\n                ret = Helpers.numToDate(ret);\r\n            }\r\n\r\n            // Try a formatted date\r\n            if (! Helpers.isValidDateFormat(ret)) {\r\n                let tmp = Component.extractDateFromString(ret, format);\r\n                if (tmp) {\r\n                    ret = tmp;\r\n                }\r\n            }\r\n\r\n            return Component.getDateString(ret, format);\r\n        }\r\n\r\n        Component.oninput = function(e, mask) {\r\n            // Element\r\n            let element = e.target;\r\n            // Property\r\n            let property = 'value';\r\n            // Get the value of the input\r\n            if (element.tagName !== 'INPUT') {\r\n                property = 'textContent';\r\n            }\r\n            // Value\r\n            let value = element[property];\r\n            // Get the mask\r\n            if (! mask) {\r\n                mask = element.getAttribute('data-mask');\r\n            }\r\n            // Keep the current caret position\r\n            let caret = getCaret(element);\r\n            if (caret) {\r\n                value = value.substring(0, caret) + hiddenCaret + value.substring(caret);\r\n            }\r\n\r\n            // Run mask\r\n            let result = Component(value, { mask: mask }, true);\r\n\r\n            // New value\r\n            let newValue = result.values.join('');\r\n            // Apply the result back to the element\r\n            if (newValue !== value && ! e.inputType.includes('delete')) {\r\n                // Set the caret to the position before transformation\r\n                let caret = newValue.indexOf(hiddenCaret);\r\n                if (caret !== -1) {\r\n                    // Apply value\r\n                    element[property] = newValue.replace(hiddenCaret, \"\");\r\n                    // Set caret\r\n                    setCaret.call(element, caret);\r\n                } else {\r\n                    // Apply value\r\n                    element[property] = newValue;\r\n                    // Make sure the caret is positioned in the end\r\n                    focus(element);\r\n                }\r\n            }\r\n        }\r\n\r\n        Component.getType = function(config) {\r\n            // Get configuration\r\n            const control = getConfig(config, null);\r\n\r\n            return control.type;\r\n        };\r\n\r\n        Component.adjustPrecision = adjustPrecision;\r\n\r\n        return Component;\r\n    })();\r\n\r\n    return { Mask: Mask, Helpers: Helpers };\r\n})));\n\n/***/ }),\n\n/***/ 673:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\n\r\n\r\nif (! Modal && \"function\" === 'function') {\r\n    var Modal = __webpack_require__(392);\r\n}\r\n\r\nif (! utils && \"function\" === 'function') {\r\n    var utils = __webpack_require__(91);\r\n}\r\n\r\nconst Helpers = utils.Helpers;\r\nconst Mask = utils.Mask;\r\n\r\n; (function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (! (key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    // Translations\r\n    const T = function(t) {\r\n        if (typeof(document) !== \"undefined\" && document.dictionary) {\r\n            return document.dictionary[t] || t;\r\n        } else {\r\n            return t;\r\n        }\r\n    }\r\n\r\n    const filterData = function(year, month) {\r\n        // Data for the month\r\n        let data = {};\r\n        if (Array.isArray(this.data)) {\r\n            this.data.map(function (v) {\r\n                let d = year + '-' + Helpers.two(month + 1);\r\n                if (v.date.substring(0, 7) === d) {\r\n                    if (!data[v.date]) {\r\n                        data[v.date] = [];\r\n                    }\r\n                    data[v.date].push(v);\r\n                }\r\n            });\r\n        }\r\n        return data;\r\n    }\r\n\r\n    // Get the short weekdays name\r\n    const getWeekdays = function(firstDayOfWeek) {\r\n        const reorderedWeekdays = [];\r\n        for (let i = 0; i < 7; i++) {\r\n            const dayIndex = (firstDayOfWeek + i) % 7;\r\n            reorderedWeekdays.push(Helpers.weekdays[dayIndex]);\r\n        }\r\n\r\n        return reorderedWeekdays.map(w => {\r\n            return { title: w.substring(0, 1) };\r\n        });\r\n    }\r\n\r\n    const Views = function(self) {\r\n        const view = {};\r\n\r\n        // Create years container\r\n        view.years = [];\r\n        view.months = [];\r\n        view.days = [];\r\n        view.hours = [];\r\n        view.minutes = [];\r\n\r\n        for (let i = 0; i < 16; i++) {\r\n            view.years.push({\r\n                title: null,\r\n                value: null,\r\n                selected: false,\r\n            });\r\n        }\r\n\r\n        for (let i = 0; i < 12; i++) {\r\n            view.months.push({\r\n                title: null,\r\n                value: null,\r\n                selected: false,\r\n            });\r\n        }\r\n\r\n        for (let i = 0; i < 42; i++) {\r\n            view.days.push({\r\n                title: null,\r\n                value: null,\r\n                selected: false,\r\n            });\r\n        }\r\n\r\n        for (let i = 0; i < 24; i++) {\r\n            view.hours.push({\r\n                title: Helpers.two(i),\r\n                value: i\r\n            });\r\n        }\r\n\r\n        for (let i = 0; i < 60; i++) {\r\n            view.minutes.push({\r\n                title: Helpers.two(i),\r\n                value: i\r\n            });\r\n        }\r\n\r\n        view.years.update = function(date) {\r\n            let year = date.getUTCFullYear();\r\n            let start = year - (year % 16);\r\n\r\n            for (let i = 0; i < 16; i++) {\r\n                let item = view.years[i];\r\n                let value = start + i;\r\n\r\n                item.title = value\r\n                item.value = value;\r\n\r\n                if (self.cursor.y === value) {\r\n                    item.selected = true;\r\n                    // Current item\r\n                    self.cursor.current = item;\r\n                } else {\r\n                    item.selected = false;\r\n                }\r\n            }\r\n        }\r\n\r\n        view.months.update = function(date) {\r\n            let year = date.getUTCFullYear();\r\n\r\n            for (let i = 0; i < 12; i++) {\r\n                let item = view.months[i];\r\n\r\n                item.title = Helpers.months[i].substring(0,3);\r\n                item.value = i;\r\n\r\n                if (self.cursor.y === year && self.cursor.m === i) {\r\n                    item.selected = true;\r\n                    // Current item\r\n                    self.cursor.current = item;\r\n                } else {\r\n                    item.selected = false;\r\n                }\r\n            }\r\n        }\r\n\r\n        view.days.update = function(date) {\r\n            let year = date.getUTCFullYear();\r\n            let month = date.getUTCMonth();\r\n            let data = filterData.call(self, year, month);\r\n\r\n            // First day\r\n            let tmp = new Date(Date.UTC(year, month, 1, 0, 0, 0));\r\n            let firstDayOfMonth = tmp.getUTCDay();\r\n            let firstDayOfWeek = self.startingDay ?? 0;\r\n\r\n            // Calculate offset based on desired first day of week. firstDayOfWeek: 0 = Sunday, 1 = Monday, 2 = Tuesday, etc.\r\n            let offset = (firstDayOfMonth - firstDayOfWeek + 7) % 7;\r\n\r\n            let index = -1 * offset;\r\n\r\n            for (let i = 0; i < 42; i++) {\r\n                index++;\r\n                // Item\r\n                let item = view.days[i];\r\n                // Get the day\r\n                tmp = new Date(Date.UTC(year, month, index, 0, 0, 0));\r\n                // Day\r\n                let day = tmp.getUTCDate();\r\n\r\n                // Create the item\r\n                item.title = day;\r\n                item.value = index;\r\n                item.number = Helpers.dateToNum(tmp.toISOString().substring(0, 10));\r\n\r\n                // Reset range properties for each item\r\n                item.start = false;\r\n                item.end = false;\r\n                item.range = false;\r\n                item.last = false;\r\n                item.disabled = false;\r\n                item.data = null;\r\n\r\n                // Check selections\r\n                if (tmp.getUTCMonth() !== month) {\r\n                    // Days are not in the current month\r\n                    item.grey = true;\r\n                } else {\r\n                    // Check for data\r\n                    let d = [ year, Helpers.two(month+1), Helpers.two(day) ].join('-');\r\n\r\n                    if (data && data[d]) {\r\n                        item.data = data[d];\r\n                    }\r\n\r\n                    item.grey = false;\r\n                }\r\n                // Month\r\n                let m = tmp.getUTCMonth();\r\n\r\n                // Select cursor\r\n                if (self.cursor.y === year && self.cursor.m === m && self.cursor.d === day) {\r\n                    item.selected = true;\r\n                    // Current item\r\n                    self.cursor.current = item;\r\n                } else {\r\n                    item.selected = false;\r\n                }\r\n\r\n\r\n                // Valid ranges\r\n                if (self.validRange) {\r\n                    if (typeof self.validRange === 'function') {\r\n                        let ret = self.validRange(day,m,year,item);\r\n                        if (typeof ret !== 'undefined') {\r\n                            item.disabled = ret;\r\n                        }\r\n                    } else {\r\n                        let current = year + '-' + Helpers.two(m+1) + '-' + Helpers.two(day);\r\n\r\n                        let test1 = !self.validRange[0] || current >= self.validRange[0].substr(0, 10);\r\n                        let test2 = !self.validRange[1] || current <= self.validRange[1].substr(0, 10);\r\n\r\n                        if (! (test1 && test2)) {\r\n                            item.disabled = true;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Select range\r\n                if (self.range && self.rangeValues) {\r\n                    // Only mark start/end if the number matches\r\n                    item.start = self.rangeValues[0] === item.number;\r\n                    item.end = self.rangeValues[1] === item.number;\r\n                    // Mark as part of range if between start and end\r\n                    item.range = self.rangeValues[0] && self.rangeValues[1] && self.rangeValues[0] <= item.number && self.rangeValues[1] >= item.number;\r\n                }\r\n            }\r\n        }\r\n\r\n        return view;\r\n    }\r\n\r\n    const isTrue = function(v) {\r\n        return v === true || v === 'true';\r\n    }\r\n\r\n    const isNumber = function (num) {\r\n        if (typeof(num) === 'string') {\r\n            num = num.trim();\r\n        }\r\n        return !isNaN(num) && num !== null && num !== '';\r\n    }\r\n\r\n    const Calendar = function(children, { onchange, onload, track }) {\r\n        let self = this;\r\n\r\n        // Event\r\n        let change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        // Weekdays\r\n        self.weekdays = getWeekdays(self.startingDay ?? 0);\r\n\r\n        // Cursor\r\n        self.cursor = {};\r\n\r\n        // Time\r\n        self.time = !! self.time;\r\n\r\n        // Range values\r\n        self.rangeValues = null;\r\n\r\n        // Calendar date\r\n        let date = new Date();\r\n\r\n        // Views\r\n        const views = Views(self);\r\n        const hours = views.hours;\r\n        const minutes = views.minutes;\r\n\r\n        // Initial view\r\n        self.view = 'days';\r\n\r\n        // Auto Input\r\n        if (self.input === 'auto') {\r\n            self.input = document.createElement('input');\r\n            self.input.type = 'text';\r\n        }\r\n\r\n\r\n        // Get the position of the data based on the view\r\n        const getPosition = function() {\r\n            let position = 2;\r\n            if (self.view === 'years') {\r\n                position = 0;\r\n            } else if (self.view === 'months') {\r\n                position = 1;\r\n            }\r\n            return position;\r\n        }\r\n\r\n        const setView = function(e) {\r\n            if (typeof e === 'object') {\r\n                e = this.getAttribute('data-view');\r\n            }\r\n\r\n            // Valid views\r\n            const validViews = ['days', 'months', 'years'];\r\n\r\n            // Define new view\r\n            if (validViews.includes(e) && self.view !== e) {\r\n                self.view = e;\r\n            }\r\n        }\r\n\r\n        const reloadView = function(reset) {\r\n            if (reset) {\r\n                // Update options to the view\r\n                self.options = views[self.view];\r\n            }\r\n            // Update the values of hte options of hte view\r\n            views[self.view]?.update.call(self, date);\r\n        }\r\n\r\n        const getValue = function() {\r\n            let value = null;\r\n            if (isTrue(self.range)) {\r\n                if (Array.isArray(self.rangeValues)) {\r\n                    if (isTrue(self.numeric)) {\r\n                        value = self.rangeValues;\r\n                    } else {\r\n                        value = [\r\n                            Helpers.numToDate(self.rangeValues[0]).substring(0, 10),\r\n                            Helpers.numToDate(self.rangeValues[1]).substring(0, 10)\r\n                        ];\r\n                    }\r\n                }\r\n            } else {\r\n                value = getDate();\r\n                if (isTrue(self.numeric)) {\r\n                    value = Helpers.dateToNum(value);\r\n                }\r\n            }\r\n            return value;\r\n        }\r\n\r\n        const setValue = function(v) {\r\n            let d = new Date();\r\n            if (v) {\r\n                if (isTrue(self.range)) {\r\n                    if (v) {\r\n                        if (! Array.isArray(v)) {\r\n                            v = v.toString().split(',');\r\n                        }\r\n                        self.rangeValues = [...v];\r\n\r\n                        if (v[0] && typeof (v[0]) === 'string' && v[0].indexOf('-')) {\r\n                            self.rangeValues[0] = Helpers.dateToNum(v[0]);\r\n                        }\r\n                        if (v[1] && typeof (v[1]) === 'string' && v[1].indexOf('-')) {\r\n                            self.rangeValues[1] = Helpers.dateToNum(v[1]);\r\n                        }\r\n\r\n                        v = v[0];\r\n                    }\r\n                } else if (typeof v === 'string' && v.includes(',')) {\r\n                    v = v.split(',')[0];\r\n                }\r\n\r\n                if (v) {\r\n                    v = isNumber(v) ? Helpers.numToDate(v) : v;\r\n                    d = new Date(v + '  GMT+0');\r\n                }\r\n\r\n                // if no date is defined\r\n                if (! Helpers.isValidDate(d)) {\r\n                    d = new Date();\r\n                }\r\n            }\r\n\r\n            // Update the internal calendar date\r\n            setDate(d, true);\r\n            // Update the view\r\n            reloadView();\r\n        }\r\n\r\n        const getDate = function() {\r\n            let v = [ self.cursor.y, self.cursor.m, self.cursor.d, self.hour, self.minute ];\r\n            let d = new Date(Date.UTC(...v));\r\n            // Update the headers of the calendar\r\n            if (self.time) {\r\n                return d.toISOString().substring(0, 19).replace('T', ' ');\r\n            } else {\r\n                return d.toISOString().substring(0, 10);\r\n            }\r\n        }\r\n\r\n        const setDate = function(d, update) {\r\n            if (Array.isArray(d)) {\r\n                d = new Date(Date.UTC(...d));\r\n            } else if (typeof(d) === 'string') {\r\n                d = new Date(d);\r\n            }\r\n\r\n            // Update the date\r\n            let value = d.toISOString().substring(0,10).split('-');\r\n            let month = Helpers.months[parseInt(value[1])-1];\r\n            let year = parseInt(value[0]);\r\n\r\n            if (self.month !== month) {\r\n                self.month = month;\r\n            }\r\n            if (self.year !== year) {\r\n                self.year = year;\r\n            }\r\n\r\n            // Update the time\r\n            let time = d.toISOString().substring(11,19).split(':');\r\n            let hour = parseInt(time[0]);\r\n            let minute = parseInt(time[1]);\r\n\r\n            if (self.hour !== hour) {\r\n                self.hour = hour;\r\n            }\r\n            if (self.minute !== minute) {\r\n                self.minute = minute;\r\n            }\r\n\r\n            // Update internal date\r\n            date = d;\r\n\r\n            // Update cursor information\r\n            if (update) {\r\n                updateCursor();\r\n            }\r\n        }\r\n\r\n        const updateCursor = function() {\r\n            self.cursor.y = date.getUTCFullYear();\r\n            self.cursor.m = date.getUTCMonth();\r\n            self.cursor.d = date.getUTCDate();\r\n        }\r\n\r\n        const resetCursor = function() {\r\n            // Remove selection from the current object\r\n            let current = self.cursor.current;\r\n            // Current item\r\n            if (typeof current !== 'undefined') {\r\n                current.selected = false;\r\n            }\r\n        }\r\n\r\n        const setCursor = function(s) {\r\n            // Reset current visual cursor\r\n            resetCursor();\r\n            // Update cursor based on the object position\r\n            if (s) {\r\n                // Update current\r\n                self.cursor.current = s;\r\n                // Update selected property\r\n                s.selected = true;\r\n            }\r\n\r\n            updateCursor();\r\n\r\n            // Update range\r\n            if (isTrue(self.range)) {\r\n                updateRange(s)\r\n            }\r\n\r\n            Dispatch.call(self, self.onupdate, 'update', {\r\n                instance: self,\r\n                value: date.toISOString(),\r\n            });\r\n        }\r\n\r\n        const select = function(e, s) {\r\n            // Get new date content\r\n            let d = updateDate(s.value, getPosition());\r\n            // New date\r\n            setDate(new Date(Date.UTC(...d)))\r\n            // Based where was the click\r\n            if (self.view !== 'days') {\r\n                // Back to the days\r\n                self.view = 'days';\r\n            } else if (! s.disabled) {\r\n                setCursor(s);\r\n\r\n                if (isTrue(self.range)) {\r\n                    // Start a new range\r\n                    if (self.rangeValues && (self.rangeValues[0] >= s.number || self.rangeValues[1])) {\r\n                        destroyRange();\r\n                    }\r\n                    // Range\r\n                    s.range = true;\r\n                    // Update range\r\n                    if (! self.rangeValues) {\r\n                        s.start = true;\r\n                        self.rangeValues = [s.number, null];\r\n                    } else {\r\n                        s.end = true;\r\n                        self.rangeValues[1] = s.number;\r\n                    }\r\n                } else {\r\n                    update();\r\n                }\r\n            }\r\n        }\r\n\r\n        // Update Calendar\r\n        const update = function(e) {\r\n            self.setValue(getValue());\r\n            self.close({ origin: 'button' });\r\n        }\r\n\r\n        const reset = function() {\r\n            self.setValue('');\r\n            self.close({ origin: 'button' });\r\n        }\r\n\r\n        const updateDate = function(v, position) {\r\n            // Current internal date\r\n            let value = [date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), self.hour, self.minute, 0];\r\n            // Update internal date\r\n            value[position] = v;\r\n            // Return new value\r\n            return value;\r\n        }\r\n\r\n        const move = function(direction) {\r\n            // Reset visual cursor\r\n            resetCursor();\r\n\r\n            // Value\r\n            let value;\r\n\r\n            // Update the new internal date\r\n            if (self.view === 'days') {\r\n                // Select the new internal date\r\n                value = updateDate(date.getUTCMonth()+direction, 1);\r\n            } else if (self.view === 'months') {\r\n                // Select the new internal date\r\n                value = updateDate(date.getUTCFullYear()+direction, 0);\r\n            } else if (self.view === 'years') {\r\n                // Select the new internal date\r\n                value = updateDate(date.getUTCFullYear()+(direction*16), 0);\r\n            }\r\n\r\n            // Update view\r\n            setDate(value);\r\n\r\n            // Reload content of the view\r\n            reloadView();\r\n        }\r\n\r\n        const getJump = function(e) {\r\n            if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\r\n                return self.view === 'days' ? 7 : 4;\r\n            }\r\n\r\n            return 1;\r\n        }\r\n\r\n        const prev = function(e) {\r\n            if (e && e.type === 'keydown') {\r\n                // Current index\r\n                let total = self.options.length;\r\n                let position = self.options.indexOf(self.cursor.current) - getJump(e);\r\n                if (position < 0) {\r\n                    // Next month\r\n                    move(-1);\r\n                    // New position\r\n                    position = total + position;\r\n                }\r\n                // Update cursor\r\n                setCursor(self.options[position])\r\n            } else {\r\n                move(-1);\r\n            }\r\n        }\r\n\r\n        const next = function(e) {\r\n            if (e && e.type === 'keydown') {\r\n                // Current index\r\n                let total = self.options.length;\r\n                let position = self.options.indexOf(self.cursor.current) + getJump(e);\r\n                if (position >= total) {\r\n                    // Next month\r\n                    move(1);\r\n                    // New position\r\n                    position = position - total;\r\n                }\r\n                // Update cursor\r\n                setCursor(self.options[position])\r\n            } else {\r\n                move(1);\r\n            }\r\n        }\r\n\r\n        const getInput = function() {\r\n            let input = self.input;\r\n            if (input && input.current) {\r\n                input = input.current;\r\n            } else {\r\n                if (self.input) {\r\n                    input = self.input;\r\n                }\r\n            }\r\n\r\n            return input;\r\n        }\r\n\r\n        const updateRange = function(s) {\r\n            if (self.range && self.view === 'days' && self.rangeValues) {\r\n                // Creating a range\r\n                if (self.rangeValues[0] && ! self.rangeValues[1]) {\r\n                    let number = s.number;\r\n                    if (number) {\r\n                        // Update range properties\r\n                        for (let i = 0; i < self.options.length; i++) {\r\n                            let v = self.options[i].number;\r\n                            // Update property condition\r\n                            self.options[i].range = v >= self.rangeValues[0] && v <= number;\r\n                            self.options[i].last = (v === number);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        const destroyRange = function() {\r\n            if (self.range) {\r\n                for (let i = 0; i < self.options.length; i++) {\r\n                    if (self.options[i].range !== false) {\r\n                        self.options[i].range = false;\r\n                    }\r\n                    if (self.options[i].start !== false) {\r\n                        self.options[i].start = false;\r\n                    }\r\n                    if (self.options[i].end !== false) {\r\n                        self.options[i].end = false;\r\n                    }\r\n                    if (self.options[i].last !== false) {\r\n                        self.options[i].last = false;\r\n                    }\r\n                }\r\n                self.rangeValues = null;\r\n            }\r\n        }\r\n\r\n        const render = function(v) {\r\n            if (v) {\r\n                if (! Array.isArray(v)) {\r\n                    v = v.toString().split(',');\r\n                }\r\n\r\n                v = v.map(entry => {\r\n                    return Mask.render(entry, self.format || 'YYYY-MM-DD');\r\n                }).join(',');\r\n            }\r\n            return v;\r\n        }\r\n\r\n        const normalize = function(v) {\r\n            if (! Array.isArray(v)) {\r\n                v = v.toString().split(',');\r\n            }\r\n\r\n            return v.map(item => {\r\n                if (Number(item) == item) {\r\n                    return Helpers.numToDate(item);\r\n                } else {\r\n                    if (Helpers.isValidDateFormat(item)) {\r\n                        return item;\r\n                    } else if (self.format) {\r\n                        let tmp = Mask.extractDateFromString(item, self.format);\r\n                        if (tmp) {\r\n                            return tmp;\r\n                        }\r\n                    }\r\n                }\r\n            })\r\n        }\r\n\r\n        const extractValueFromInput = function() {\r\n            let input = getInput();\r\n            if (input) {\r\n                let v;\r\n                if (input.tagName === 'INPUT' || input.tagName === 'TEXTAREA') {\r\n                    v = input.value;\r\n                } else if (input.isContentEditable) {\r\n                    v = input.textContent;\r\n                }\r\n                if (v) {\r\n                    return normalize(v).join(',');\r\n                }\r\n                return v;\r\n            }\r\n        }\r\n\r\n        const onopen = function() {\r\n            let isEditable = false;\r\n            let value = self.value;\r\n\r\n            let input = getInput();\r\n            if (input) {\r\n                if (input.tagName === 'INPUT' || input.tagName === 'TEXTAREA') {\r\n                    isEditable = !input.hasAttribute('readonly') && !input.hasAttribute('disabled');\r\n                } else if (input.isContentEditable) {\r\n                    isEditable = true;\r\n                }\r\n\r\n                let ret = extractValueFromInput();\r\n                if (ret && ret !== value) {\r\n                    value = ret;\r\n                }\r\n            }\r\n\r\n            if (! isEditable) {\r\n                self.content.focus();\r\n            }\r\n\r\n            // Update the internal date values\r\n            setValue(value);\r\n\r\n            // Open event\r\n            Dispatch.call(self, self.onopen, 'open', {\r\n                instance: self\r\n            });\r\n        }\r\n\r\n        const onclose = function(modal, origin) {\r\n            // Cancel range events\r\n            destroyRange();\r\n            // Close event\r\n            Dispatch.call(self, self.onclose, 'close', {\r\n                instance: self,\r\n                origin: origin,\r\n            });\r\n        }\r\n\r\n        const dispatchOnChangeEvent = function() {\r\n            // Destroy range\r\n            destroyRange();\r\n            // Update the internal controllers\r\n            setValue(self.value);\r\n            // Events\r\n            Dispatch.call(self, change, 'change', {\r\n                instance: self,\r\n                value: self.value,\r\n            });\r\n            // Update input\r\n            let input = getInput();\r\n            if (input) {\r\n                // Update input value\r\n                input.value = render(self.value);\r\n                // Dispatch event\r\n                Dispatch.call(input, null, 'change', {\r\n                    instance: self,\r\n                    value: self.value,\r\n                });\r\n            }\r\n        }\r\n\r\n        const events = {\r\n            focusin: (e) => {\r\n                if (self.modal && self.isClosed()) {\r\n                    self.open();\r\n                }\r\n            },\r\n            focusout: (e) => {\r\n                if (self.modal && ! self.isClosed()) {\r\n                    if (! (e.relatedTarget && self.modal.el.contains(e.relatedTarget))) {\r\n                        self.modal.close({ origin: 'focusout' });\r\n                    }\r\n                }\r\n            },\r\n            click: (e) => {\r\n                if (e.target.classList.contains('lm-calendar-input')) {\r\n                    self.open();\r\n                }\r\n            },\r\n            keydown: (e) => {\r\n                if (self.modal) {\r\n                    if (e.code === 'ArrowUp' || e.code === 'ArrowDown') {\r\n                        if (! self.isClosed()) {\r\n                            self.content.focus();\r\n                        } else {\r\n                            self.open();\r\n                        }\r\n                    } else if (e.code === 'Enter') {\r\n                        if (! self.isClosed()) {\r\n                            update();\r\n                        } else {\r\n                            self.open();\r\n                        }\r\n                    } else if (e.code === 'Escape') {\r\n                        if (! self.isClosed()) {\r\n                            self.modal.close({origin: 'escape'});\r\n                        }\r\n                    }\r\n                }\r\n            },\r\n            input: (e) => {\r\n                let input = e.target;\r\n                if (input.classList.contains('lm-calendar-input')) {\r\n                    if (! isTrue(self.range)) {\r\n                        // TODO: process with range\r\n                        // Apply mask\r\n                        if (self.format) {\r\n                            Mask.oninput(e, self.format);\r\n                        }\r\n                        let value = null;\r\n                        // Content\r\n                        let content = (input.tagName === 'INPUT' || input.tagName === 'TEXTAREA') ? input.value : input.textContent;\r\n                        // Check if that is a valid date\r\n                        if (Helpers.isValidDateFormat(content)) {\r\n                            value = content;\r\n                        } else if (self.format) {\r\n                            let tmp = Mask.extractDateFromString(content, self.format);\r\n                            if (tmp) {\r\n                                value = tmp;\r\n                            }\r\n                        }\r\n                        // Change the calendar view\r\n                        if (value) {\r\n                            setValue(value);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        // Onload\r\n        onload(() => {\r\n            if (self.type !== \"inline\") {\r\n                // Create modal instance\r\n                self.modal = {\r\n                    width: 300,\r\n                    closed: true,\r\n                    focus: false,\r\n                    onopen: onopen,\r\n                    onclose: onclose,\r\n                    position: 'absolute',\r\n                    'auto-close': false,\r\n                    'auto-adjust': true,\r\n                };\r\n                // Generate modal\r\n                Modal(self.el, self.modal);\r\n            }\r\n\r\n            let ret;\r\n\r\n            // Create input controls\r\n            if (self.input && self.initInput !== false) {\r\n                if (! self.input.parentNode) {\r\n                    self.el.parentNode.insertBefore(self.input, self.el);\r\n                }\r\n\r\n                let input = getInput();\r\n                if (input && input.tagName) {\r\n                    input.classList.add('lm-input');\r\n                    input.classList.add('lm-calendar-input');\r\n                    input.addEventListener('click', events.click);\r\n                    input.addEventListener('input', events.input);\r\n                    input.addEventListener('keydown', events.keydown);\r\n                    input.addEventListener('focusin', events.focusin);\r\n                    input.addEventListener('focusout', events.focusout);\r\n                    if (self.placeholder) {\r\n                        input.setAttribute('placeholder', self.placeholder);\r\n                    }\r\n                    if (self.onChange) {\r\n                        input.addEventListener('change', self.onChange);\r\n                    }\r\n\r\n                    // Retrieve the value\r\n                    if (self.value) {\r\n                        input.value = render(self.value);\r\n                    } else {\r\n                        let value = extractValueFromInput();\r\n                        if (value && value !== self.value) {\r\n                            ret = value;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Update the internal date values\r\n            if (ret) {\r\n                self.setValue(ret);\r\n            } else {\r\n                setValue(self.value);\r\n            }\r\n\r\n            // Reload view\r\n            reloadView(true);\r\n\r\n            /**\r\n             * Handler keyboard\r\n             * @param {object} e - event\r\n             */\r\n            self.el.addEventListener('keydown', function(e) {\r\n                let prevent = false;\r\n                if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\r\n                    if (e.target !== self.content) {\r\n                        self.content.focus();\r\n                    }\r\n                    prev(e);\r\n                    prevent = true;\r\n                } else if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\r\n                    if (e.target !== self.content) {\r\n                        self.content.focus();\r\n                    }\r\n                    next(e);\r\n                    prevent = true;\r\n                } else if (e.key === 'Enter') {\r\n                    if (e.target === self.content) {\r\n                        // Item\r\n                        if (self.cursor.current) {\r\n                            // Select\r\n                            select(e, self.cursor.current);\r\n                            prevent = true;\r\n                        }\r\n                    }\r\n                } else if (e.key === 'Escape') {\r\n                    if (! self.isClosed()) {\r\n                        self.close({ origin: 'escape' });\r\n                        prevent = true;\r\n                    }\r\n                }\r\n\r\n                if (prevent) {\r\n                    e.preventDefault();\r\n                    e.stopImmediatePropagation();\r\n                }\r\n            });\r\n\r\n            /**\r\n             * Mouse wheel handler\r\n             * @param {object} e - mouse event\r\n             */\r\n            self.content.addEventListener('wheel', function(e){\r\n                if (self.wheel !== false) {\r\n                    if (e.deltaY < 0) {\r\n                        prev(e);\r\n                    } else {\r\n                        next(e);\r\n                    }\r\n                    e.preventDefault();\r\n                }\r\n            }, { passive: false });\r\n\r\n            /**\r\n             * Range handler\r\n             * @param {object} e - mouse event\r\n             */\r\n            self.content.addEventListener('mouseover', function(e){\r\n                let parent = e.target.parentNode\r\n                if (parent === self.content) {\r\n                    let index = Array.prototype.indexOf.call(parent.children, e.target);\r\n                    updateRange(self.options[index]);\r\n                }\r\n            });\r\n\r\n            // Create event for focus out\r\n            self.el.addEventListener(\"focusout\", (e) => {\r\n                let input = getInput();\r\n                if (e.relatedTarget !== input && ! self.el.contains(e.relatedTarget)) {\r\n                    self.close({ origin: 'focusout' });\r\n                }\r\n            });\r\n        });\r\n\r\n        onchange((prop) => {\r\n            if (prop === 'view') {\r\n                reloadView(true);\r\n            } else if (prop === 'startingDay') {\r\n                self.weekdays = getWeekdays(self.startingDay ?? 0);\r\n            } else if (prop === 'value') {\r\n                dispatchOnChangeEvent();\r\n            }\r\n        })\r\n\r\n        // Tracking variables\r\n        track('value');\r\n\r\n        // Public methods\r\n\r\n        self.open = function(e) {\r\n            if (self.modal) {\r\n                if (self.type === 'auto') {\r\n                    self.type = window.innerWidth > 640 ? self.type = 'default' : 'picker';\r\n                }\r\n                self.modal.open();\r\n            }\r\n        }\r\n\r\n        self.close = function(options) {\r\n            if (self.modal) {\r\n                if (options && options.origin) {\r\n                    self.modal.close(options)\r\n                } else {\r\n                    self.modal.close({ origin: 'button' })\r\n                }\r\n            }\r\n        }\r\n\r\n        self.isClosed = function() {\r\n            if (self.modal) {\r\n                return self.modal.isClosed();\r\n            }\r\n        }\r\n\r\n        self.getValue = function() {\r\n            return self.value;\r\n        }\r\n\r\n        self.setValue = function(v) {\r\n            // Update value\r\n            if (v) {\r\n                let ret = normalize(v);\r\n                if (isTrue(self.numeric)) {\r\n                    ret = ret.map(entry => {\r\n                        return Helpers.dateToNum(entry);\r\n                    })\r\n                }\r\n\r\n                if (! Array.isArray(v)) {\r\n                    ret = ret.join(',');\r\n                }\r\n\r\n                if (ret == Number(ret)) {\r\n                    ret = Number(ret);\r\n                }\r\n\r\n                v = ret;\r\n            }\r\n\r\n            // Events\r\n            if (v !== self.value) {\r\n                self.value = v;\r\n            }\r\n        }\r\n\r\n        self.onevent = function(e) {\r\n            if (events[e.type]) {\r\n                events[e.type](e);\r\n            }\r\n        }\r\n\r\n        self.update = update;\r\n        self.next = next;\r\n        self.prev = prev;\r\n        self.reset = reset;\r\n        self.setView = setView;\r\n        self.helpers = Helpers;\r\n        self.helpers.getDate = Mask.getDate;\r\n\r\n        return render => render`<div class=\"lm-calendar\" data-grid=\"{{self.grid}}\" data-type=\"{{self.type}}\" data-disabled=\"{{self.disabled}}\" data-starting-day=\"{{self.startingDay}}\">\r\n            <div class=\"lm-calendar-options\">\r\n                <button type=\"button\" onclick=\"${reset}\">${T('Reset')}</button>\r\n                <button type=\"button\" onclick=\"${update}\">${T('Done')}</button>\r\n            </div>\r\n            <div class=\"lm-calendar-container\" data-view=\"{{self.view}}\">\r\n                <div class=\"lm-calendar-header\">\r\n                    <div>\r\n                        <div class=\"lm-calendar-labels\"><button type=\"button\" onclick=\"${setView}\" data-view=\"months\">{{self.month}}</button> <button type=\"button\" onclick=\"${setView}\" data-view=\"years\">{{self.year}}</button></div> \r\n                        <div class=\"lm-calendar-navigation\">\r\n                            <button type=\"button\" class=\"lm-calendar-icon lm-ripple\" onclick=\"${prev}\" tabindex=\"0\">expand_less</button>\r\n                            <button type=\"button\" class=\"lm-calendar-icon lm-ripple\" onclick=\"${next}\" tabindex=\"0\">expand_more</button>\r\n                        </div>\r\n                    </div>\r\n                    <div class=\"lm-calendar-weekdays\" :loop=\"self.weekdays\"><div>{{self.title}}</div></div>\r\n                </div>\r\n                <div class=\"lm-calendar-content\" :loop=\"self.options\" tabindex=\"0\" :ref=\"self.content\">\r\n                    <div data-start=\"{{self.start}}\" data-end=\"{{self.end}}\" data-last=\"{{self.last}}\" data-range=\"{{self.range}}\" data-event=\"{{self.data}}\" data-grey=\"{{self.grey}}\" data-bold=\"{{self.bold}}\" data-selected=\"{{self.selected}}\" data-disabled=\"{{self.disabled}}\" onclick=\"${select}\">{{self.title}}</div>\r\n                </div>\r\n                <div class=\"lm-calendar-footer\" data-visible=\"{{self.footer}}\">\r\n                    <div class=\"lm-calendar-time\" data-visible=\"{{self.time}}\"><select :loop=\"${hours}\" :bind=\"self.hour\" class=\"lm-calendar-control\"><option value=\"{{self.value}}\">{{self.title}}</option></select>:<select :loop=\"${minutes}\" :bind=\"self.minute\" class=\"lm-calendar-control\"><option value=\"{{self.value}}\">{{self.title}}</option></select></div>\r\n                    <div class=\"lm-calendar-update\"><input type=\"button\" value=\"${T('Update')}\" onclick=\"${update}\" class=\"lm-ripple lm-input\"></div>\r\n                </div>\r\n            </div>\r\n        </div>`\r\n    }\r\n\r\n    // Register the LemonadeJS Component\r\n    lemonade.setComponents({ Calendar: Calendar });\r\n    // Register the web component\r\n    lemonade.createWebComponent('calendar', Calendar);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Calendar, root, options)\r\n            return options;\r\n        } else {\r\n            return Calendar.call(this, root)\r\n        }\r\n    }\r\n})));\n\n/***/ }),\n\n/***/ 98:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\n\r\n\r\nif (! Modal && \"function\" === 'function') {\r\n    var Modal = __webpack_require__(392);\r\n}\r\n\r\nif (! Tabs && \"function\" === 'function') {\r\n    var Tabs = __webpack_require__(979);\r\n}\r\n\r\n; (function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            method(...a);\r\n        } else if (this.tagName) {\r\n            // Fallback: dispatch a custom event\r\n            const event = new CustomEvent(type, {\r\n                bubbles: true,\r\n                cancelable: true,\r\n                detail: options,\r\n            });\r\n            this.dispatchEvent(event);\r\n        }\r\n    }\r\n\r\n    const defaultPalette =  [\r\n        [\"#ffebee\", \"#fce4ec\", \"#f3e5f5\", \"#e8eaf6\", \"#e3f2fd\", \"#e0f7fa\", \"#e0f2f1\", \"#e8f5e9\", \"#f1f8e9\", \"#f9fbe7\", \"#fffde7\", \"#fff8e1\", \"#fff3e0\", \"#fbe9e7\", \"#efebe9\", \"#fafafa\", \"#eceff1\"],\r\n        [\"#ffcdd2\", \"#f8bbd0\", \"#e1bee7\", \"#c5cae9\", \"#bbdefb\", \"#b2ebf2\", \"#b2dfdb\", \"#c8e6c9\", \"#dcedc8\", \"#f0f4c3\", \"#fff9c4\", \"#ffecb3\", \"#ffe0b2\", \"#ffccbc\", \"#d7ccc8\", \"#f5f5f5\", \"#cfd8dc\"],\r\n        [\"#ef9a9a\", \"#f48fb1\", \"#ce93d8\", \"#9fa8da\", \"#90caf9\", \"#80deea\", \"#80cbc4\", \"#a5d6a7\", \"#c5e1a5\", \"#e6ee9c\", \"#fff59d\", \"#ffe082\", \"#ffcc80\", \"#ffab91\", \"#bcaaa4\", \"#eeeeee\", \"#b0bec5\"],\r\n        [\"#e57373\", \"#f06292\", \"#ba68c8\", \"#7986cb\", \"#64b5f6\", \"#4dd0e1\", \"#4db6ac\", \"#81c784\", \"#aed581\", \"#dce775\", \"#fff176\", \"#ffd54f\", \"#ffb74d\", \"#ff8a65\", \"#a1887f\", \"#e0e0e0\", \"#90a4ae\"],\r\n        [\"#ef5350\", \"#ec407a\", \"#ab47bc\", \"#5c6bc0\", \"#42a5f5\", \"#26c6da\", \"#26a69a\", \"#66bb6a\", \"#9ccc65\", \"#d4e157\", \"#ffee58\", \"#ffca28\", \"#ffa726\", \"#ff7043\", \"#8d6e63\", \"#bdbdbd\", \"#78909c\"],\r\n        [\"#f44336\", \"#e91e63\", \"#9c27b0\", \"#3f51b5\", \"#2196f3\", \"#00bcd4\", \"#009688\", \"#4caf50\", \"#8bc34a\", \"#cddc39\", \"#ffeb3b\", \"#ffc107\", \"#ff9800\", \"#ff5722\", \"#795548\", \"#9e9e9e\", \"#607d8b\"],\r\n        [\"#e53935\", \"#d81b60\", \"#8e24aa\", \"#3949ab\", \"#1e88e5\", \"#00acc1\", \"#00897b\", \"#43a047\", \"#7cb342\", \"#c0ca33\", \"#fdd835\", \"#ffb300\", \"#fb8c00\", \"#f4511e\", \"#6d4c41\", \"#757575\", \"#546e7a\"],\r\n        [\"#d32f2f\", \"#c2185b\", \"#7b1fa2\", \"#303f9f\", \"#1976d2\", \"#0097a7\", \"#00796b\", \"#388e3c\", \"#689f38\", \"#afb42b\", \"#fbc02d\", \"#ffa000\", \"#f57c00\", \"#e64a19\", \"#5d4037\", \"#616161\", \"#455a64\"],\r\n        [\"#c62828\", \"#ad1457\", \"#6a1b9a\", \"#283593\", \"#1565c0\", \"#00838f\", \"#00695c\", \"#2e7d32\", \"#558b2f\", \"#9e9d24\", \"#f9a825\", \"#ff8f00\", \"#ef6c00\", \"#d84315\", \"#4e342e\", \"#424242\", \"#37474f\"],\r\n        [\"#b71c1c\", \"#880e4f\", \"#4a148c\", \"#1a237e\", \"#0d47a1\", \"#006064\", \"#004d40\", \"#1b5e20\", \"#33691e\", \"#827717\", \"#f57f17\", \"#ff6f00\", \"#e65100\", \"#bf360c\", \"#3e2723\", \"#212121\", \"#263238\"],\r\n    ]\r\n\r\n    const Grid = function(children, { onchange }) {\r\n        const self = this;\r\n\r\n        if (! self.palette) {\r\n            self.palette = defaultPalette;\r\n        }\r\n\r\n        const select = (event) => {\r\n            if (event.target.tagName === 'TD') {\r\n                let color = event.target.getAttribute('data-value')\r\n\r\n                // Remove current selected mark\r\n                let selected = self.el.querySelector('.lm-color-selected');\r\n                if (selected) {\r\n                    selected.classList.remove('lm-color-selected');\r\n                }\r\n\r\n                // Mark cell as selected\r\n                if (color) {\r\n                    event.target.classList.add('lm-color-selected');\r\n                    self.set(color);\r\n                }\r\n            }\r\n        }\r\n\r\n        self.constructRows = function (e) {\r\n            let tbody = [];\r\n            e.textContent = '';\r\n            for (let j = 0; j < self.palette.length; j++) {\r\n                let tr = document.createElement('tr');\r\n                e.appendChild(tr);\r\n\r\n                for (let i = 0; i < self.palette[j].length; i++) {\r\n                    let color = self.palette[j][i];\r\n                    let td = document.createElement('td');\r\n                    td.setAttribute('data-value', color);\r\n                    td.style.backgroundColor = color;\r\n                    tr.appendChild(td);\r\n                }\r\n            }\r\n        }\r\n\r\n        onchange(property => {\r\n            if (property === 'palette') {\r\n                self.constructRows()\r\n            }\r\n        });\r\n\r\n        return render => render`<div class=\"lm-color-grid\" :palette=\"self.palette\">\r\n            <table cellpadding=\"7\" cellspacing=\"0\" onclick=\"${select}\" :ref=\"self.table\" :ready=\"self.constructRows\"></table>\r\n        </div>`\r\n    }\r\n\r\n    const Spectrum = function(children, { onload }) {\r\n        let self = this;\r\n        let context = null;\r\n\r\n        let decToHex = function(num) {\r\n            let hex = num.toString(16);\r\n            return hex.length === 1 ? \"0\" + hex : hex;\r\n        }\r\n        let rgbToHex = function(r, g, b) {\r\n            return \"#\" + decToHex(r) + decToHex(g) + decToHex(b);\r\n        }\r\n\r\n        onload(() => {\r\n            context = self.canvas.getContext(\"2d\", { willReadFrequently: true });\r\n            draw();\r\n        })\r\n\r\n        // Drsaw\r\n        const draw = function() {\r\n            let g = context.createLinearGradient(0, 0, self.canvas.width, 0);\r\n            // Create color gradient\r\n            g.addColorStop(0,    \"rgb(255,0,0)\");\r\n            g.addColorStop(0.15, \"rgb(255,0,255)\");\r\n            g.addColorStop(0.33, \"rgb(0,0,255)\");\r\n            g.addColorStop(0.49, \"rgb(0,255,255)\");\r\n            g.addColorStop(0.67, \"rgb(0,255,0)\");\r\n            g.addColorStop(0.84, \"rgb(255,255,0)\");\r\n            g.addColorStop(1,    \"rgb(255,0,0)\");\r\n            context.fillStyle = g;\r\n            context.fillRect(0, 0, self.canvas.width, self.canvas.height);\r\n            g = context.createLinearGradient(0, 0, 0, self.canvas.height);\r\n            g.addColorStop(0,   \"rgba(255,255,255,1)\");\r\n            g.addColorStop(0.5, \"rgba(255,255,255,0)\");\r\n            g.addColorStop(0.5, \"rgba(0,0,0,0)\");\r\n            g.addColorStop(1,   \"rgba(0,0,0,1)\");\r\n            context.fillStyle = g;\r\n            context.fillRect(0, 0, self.canvas.width, self.canvas.height);\r\n        }\r\n\r\n        // Moves the marquee point to the specified position\r\n        const update = (e) => {\r\n            let x;\r\n            let y;\r\n            let buttons = 1;\r\n            if (e.type === 'touchmove') {\r\n                x = e.changedTouches[0].clientX;\r\n                y = e.changedTouches[0].clientY;\r\n            } else {\r\n                buttons = e.buttons;\r\n                x = e.clientX;\r\n                y = e.clientY;\r\n            }\r\n\r\n            if (buttons === 1) {\r\n                let rect = self.el.getBoundingClientRect();\r\n                let left = x - rect.left;\r\n                let top = y - rect.top;\r\n                // Get the color in this pixel\r\n                let pixel = context.getImageData(left, top, 1, 1).data;\r\n                // Position pointer\r\n                self.point.style.left = left + 'px';\r\n                self.point.style.top = top + 'px';\r\n                // Return color\r\n                self.set(rgbToHex(pixel[0], pixel[1], pixel[2]));\r\n            }\r\n        }\r\n\r\n        return render => render`<div class=\"lm-color-hsl\">\r\n            <canvas width=\"240\" height=\"140\" :ref=\"self.canvas\" onmousedown=\"${update}\" onmousemove=\"${update}\" ontouchmove=\"${update}\"></canvas>\r\n            <div class=\"lm-color-point\" :ref=\"self.point\"></div>\r\n        </div>`;\r\n    }\r\n\r\n    const Color = function(children, { onchange, onload }) {\r\n        let self = this;\r\n        let value = null;\r\n\r\n        const change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        // Decide the type based on the size of the screen\r\n        let autoType = self.type === 'auto';\r\n\r\n        const applyValue = function(v) {\r\n            if (self.value !== v) {\r\n                self.value = v;\r\n            }\r\n        }\r\n\r\n        const onopen = function(e) {\r\n            self.open();\r\n            // Open event\r\n            Dispatch.call(self, self.onopen, 'open', {\r\n                instance: self\r\n            });\r\n        }\r\n\r\n        const onclose = function(modal, origin) {\r\n            // Close event\r\n            Dispatch.call(self, self.onclose, 'close', {\r\n                instance: self,\r\n                origin: origin,\r\n            });\r\n        }\r\n\r\n        const update = function() {\r\n            applyValue(value);\r\n            self.close({ origin: 'button' });\r\n        }\r\n\r\n        const getInput = function() {\r\n            let input = self.input;\r\n            if (input && input.current) {\r\n                input = input.current;\r\n            } else {\r\n                if (self.input) {\r\n                    input = self.input;\r\n                }\r\n            }\r\n\r\n            return input;\r\n        }\r\n\r\n        const events = {\r\n            focusin: (e) => {\r\n                if (self.modal && self.isClosed()) {\r\n                    self.open();\r\n                }\r\n            },\r\n            focusout: (e) => {\r\n                if (self.modal && ! self.isClosed()) {\r\n                    if (! (e.relatedTarget && self.modal.el.contains(e.relatedTarget))) {\r\n                        self.modal.close({ origin: 'focusout' });\r\n                    }\r\n                }\r\n            },\r\n            click: (e) => {\r\n                if (e.target.classList.contains('lm-color-input')) {\r\n                    self.open();\r\n                }\r\n            },\r\n            keydown: (e) => {\r\n                if (self.modal) {\r\n                    if (e.code === 'ArrowUp' || e.code === 'ArrowDown') {\r\n                        if (self.isClosed()) {\r\n                            self.open();\r\n                        }\r\n                    } else if (e.code === 'Enter') {\r\n                        if (! self.isClosed()) {\r\n                            update();\r\n                        } else {\r\n                            self.open();\r\n                        }\r\n                    } else if (e.code === 'Escape') {\r\n                        if (! self.isClosed()) {\r\n                            self.modal.close({origin: 'escape'});\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        const set = function(v) {\r\n            value = v;\r\n            // Close\r\n            if (self.closeOnChange === true) {\r\n                // Update value\r\n                self.setValue(v);\r\n                // Close modal\r\n                self.close({ origin: 'select' });\r\n            }\r\n        }\r\n\r\n        self.open = function(e) {\r\n            if (self.modal) {\r\n                if (autoType) {\r\n                    self.type = window.innerWidth > 640 ? self.type = 'default' : 'picker';\r\n                }\r\n                value = self.value;\r\n                // Table\r\n                let table = self.grid.table;\r\n                // Remove any selection\r\n                let o = table.querySelector('.lm-color-selected');\r\n                if (o) {\r\n                    o.classList.remove('lm-color-selected');\r\n                }\r\n                // Selected\r\n                o = table.querySelector('[data-value=\"'+self.value+'\"]');\r\n                if (o) {\r\n                    o.classList.add('lm-color-selected');\r\n                }\r\n                // Open modal\r\n                self.modal.open();\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Close the modal\r\n         */\r\n        self.close = function(options) {\r\n            if (self.modal) {\r\n                if (options && options.origin) {\r\n                    self.modal.close(options)\r\n                } else {\r\n                    self.modal.close({ origin: 'button' })\r\n                }\r\n            }\r\n        }\r\n\r\n        self.isClosed = function() {\r\n            if (self.modal) {\r\n                return self.modal.isClosed();\r\n            }\r\n        }\r\n\r\n        self.reset = function() {\r\n            self.setValue('');\r\n            self.close({ origin: 'button' });\r\n        }\r\n\r\n        self.setValue = function(v) {\r\n            self.value = value = v;\r\n        }\r\n\r\n        self.getValue = function() {\r\n            return self.value;\r\n        }\r\n\r\n        self.onevent = function(e) {\r\n            if (events[e.type]) {\r\n                events[e.type](e);\r\n            }\r\n        }\r\n\r\n        onchange(prop => {\r\n            if (prop === 'value') {\r\n                let input = getInput();\r\n                if (input) {\r\n                    input.value = self.value;\r\n                    if (self.value) {\r\n                        input.style.color = self.value;\r\n                    } else {\r\n                        input.style.color = '';\r\n                    }\r\n                }\r\n\r\n                Dispatch.call(self, change, 'change', {\r\n                    instance: self,\r\n                    value: self.value,\r\n                });\r\n            }\r\n        });\r\n\r\n        // Input\r\n        if (self.input === 'auto') {\r\n            self.input = document.createElement('input');\r\n            self.input.type = 'text';\r\n        }\r\n\r\n        onload(() => {\r\n            if (self.type !== \"inline\") {\r\n                // Create modal instance\r\n                self.modal = {\r\n                    closed: true,\r\n                    onopen: onopen,\r\n                    onclose: onclose,\r\n                    focus: false,\r\n                    position: 'absolute',\r\n                    'auto-close': false,\r\n                    'auto-adjust': true,\r\n                };\r\n                // Generate modal\r\n                Modal(self.el, self.modal);\r\n            }\r\n\r\n            // Create input controls\r\n            if (self.input && self.initInput !== false) {\r\n                if (! self.input.parentNode) {\r\n                    self.el.parentNode.insertBefore(self.input, self.el);\r\n                }\r\n\r\n                let input = getInput();\r\n                if (input && input.tagName) {\r\n                    input.classList.add('lm-input');\r\n                    input.classList.add('lm-color-input');\r\n                    input.addEventListener('click', events.click);\r\n                    input.addEventListener('focusin', events.focusin);\r\n                    input.addEventListener('focusout', events.focusout);\r\n                    if (self.placeholder) {\r\n                        input.setAttribute('placeholder', self.placeholder);\r\n                    }\r\n                    if (self.onChange) {\r\n                        input.addEventListener('change', self.onChange);\r\n                    }\r\n\r\n                    // Retrieve the value\r\n                    if (self.value) {\r\n                        input.value = self.value;\r\n                    } else if (input.value && input.value !== self.value) {\r\n                        self.value = input.value;\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Create event for focus out\r\n            self.el.addEventListener(\"focusout\", (e) => {\r\n                let input = getInput();\r\n                if (e.relatedTarget !== input && ! self.el.contains(e.relatedTarget)) {\r\n                    self.close({ origin: 'focusout' });\r\n                }\r\n            });\r\n        });\r\n\r\n        return render => render`<div class=\"lm-color\" :value=\"self.value\">\r\n            <div class=\"lm-color-options\">\r\n                <button type=\"button\" onclick=\"${self.reset}\">Reset</button>\r\n                <button type=\"button\" onclick=\"${update}\">Done</button>\r\n            </div>\r\n            <lm-tabs selected=\"0\" position=\"center\" :ref=\"self.tabs\">\r\n                <div title=\"Grid\"><${Grid} :palette=\"self.palette\" :ref=\"self.grid\" :set=\"${set}\" /></div>\r\n                <div title=\"Spectrum\"><${Spectrum} :ref=\"self.spectrum\" :set=\"${set}\" /></div>\r\n            </lm-tabs>\r\n        </div>`;\r\n    }\r\n\r\n    lemonade.setComponents({ Color: Color });\r\n    // Register the web component\r\n    lemonade.createWebComponent('color', Color);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Color, root, options)\r\n            return options;\r\n        } else {\r\n            return Color.call(this, root)\r\n        }\r\n    }\r\n})));\n\n/***/ }),\n\n/***/ 319:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\n\r\n\r\nif (! Modal && \"function\" === 'function') {\r\n    var Modal = __webpack_require__(392);\r\n}\r\n\r\n; (function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (! (key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    // Get the coordinates of the action\r\n    const getCoords = function(e) {\r\n        let x;\r\n        let y;\r\n\r\n        if (e.changedTouches && e.changedTouches[0]) {\r\n            x = e.changedTouches[0].clientX;\r\n            y = e.changedTouches[0].clientY;\r\n        } else {\r\n            x = e.clientX;\r\n            y = e.clientY;\r\n        }\r\n\r\n        return [x,y];\r\n    }\r\n\r\n    const Item = function() {\r\n        let self = this;\r\n\r\n        self.onload = function() {\r\n            if (typeof(self.render) === 'function') {\r\n                self.render.call(self, self.el);\r\n            }\r\n        }\r\n\r\n        // Initialize expanded state\r\n        self.expanded = false;\r\n\r\n        if (self.type === 'line') {\r\n            return `<hr role=\"separator\" />`;\r\n        } else if (self.type === 'inline') {\r\n            return `<div></div>`;\r\n        } else {\r\n            return `<div class=\"lm-menu-item\" role=\"menuitem\" data-disabled=\"{{self.disabled}}\" data-cursor=\"{{self.cursor}}\" data-icon=\"{{self.icon}}\" title=\"{{self.tooltip}}\" data-submenu=\"${!!self.submenu}\" aria-haspopup=\"${!!self.submenu}\" aria-expanded=\"{{self.expanded}}\" aria-label=\"{{self.title}}\" tabindex=\"-1\" onmouseup=\"self.parent.mouseUp\" onmouseenter=\"self.parent.mouseEnter\" onmouseleave=\"self.parent.mouseLeave\">\r\n                <span>{{self.title}}</span> <div>{{self.shortcut}}</div>\r\n            </div>`;\r\n        }\r\n    }\r\n\r\n    const Create = function() {\r\n        let self = this;\r\n\r\n        // Delay on open\r\n        let delayTimer;\r\n        // Save the position of this modal\r\n        let index = self.parent.modals.length;\r\n\r\n        // Blank options\r\n        self.options = [];\r\n\r\n        // Close handler\r\n        self.onclose = function() {\r\n            // Reset any cursor\r\n            resetCursor.call(self);\r\n            // Parent\r\n            if (typeof(self.parent.onclose) === 'function') {\r\n                self.parent.onclose(self.parent, self);\r\n            }\r\n        }\r\n\r\n        self.onopen = function() {\r\n            // Parent\r\n            if (typeof(self.parent.onopen) === 'function') {\r\n                self.parent.onopen(self.parent, self);\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Close the modal\r\n         */\r\n        self.close = function() {\r\n            // Close modals with higher level\r\n            self.parent.close(index);\r\n        }\r\n\r\n        /**\r\n         * Open submenu handler\r\n         * @param {object} s\r\n         * @param {boolean} cursor - Activate the first item\r\n         */\r\n        self.open = function(s, cursor) {\r\n            if (s.submenu) {\r\n                // Get the modal in the container of modals\r\n                let current = self.parent.modals[index+1];\r\n                // Do not exist yet, create it.\r\n                if (! current) {\r\n                    // Modal needs to be created\r\n                    current = self.parent.create();\r\n                }\r\n                // Get the parent from this one\r\n                let parent = self.parent.modals[index];\r\n                // Update modal content\r\n                if (current.options !== s.submenu) {\r\n                    // Close modals with higher level\r\n                    current.options = s.submenu;\r\n                    // Close other modals\r\n                    self.parent.close(index+1);\r\n                }\r\n                // Update the selected modal\r\n                self.parent.modalIndex = index+1;\r\n                let rect = parent.modal.el.getBoundingClientRect();\r\n                // Update modal\r\n                current.modal.open();\r\n                // Aria indication\r\n                current.modal.top = rect.y + s.el.offsetTop + 2;\r\n                current.modal.left = rect.x + 248;\r\n                // Keep current item for each modal\r\n                current.item = s;\r\n                s.expanded = true;\r\n\r\n                // Activate the cursor\r\n                if (cursor === true) {\r\n                    // Place cursor in the first position\r\n                    current.options[0].cursor = true;\r\n                    // Position cursor\r\n                    current.cursor = 0;\r\n                }\r\n\r\n                onopen(current, s.submenu)\r\n            } else {\r\n                // Close modals with higher level\r\n                self.parent.close(index+1);\r\n            }\r\n        }\r\n\r\n        // Mouse open\r\n        self.mouseUp = function(e, s) {\r\n            if (typeof(s.onclick) === 'function') {\r\n                s.onclick.call(s, e, s.el);\r\n            }\r\n            if (! s.submenu) {\r\n                self.close();\r\n            }\r\n        }\r\n\r\n        self.mouseEnter = function(e, s) {\r\n            if (delayTimer) {\r\n                clearTimeout(delayTimer);\r\n            }\r\n            delayTimer = setTimeout(function() {\r\n                self.open(s);\r\n            }, 200);\r\n        }\r\n\r\n        self.mouseLeave = function(e, s) {\r\n            if (delayTimer) {\r\n                clearTimeout(delayTimer);\r\n            }\r\n        }\r\n\r\n        let template = `<lm-modal :overflow=\"true\" :closed=\"true\" :ref=\"self.modal\" :responsive=\"false\" :auto-adjust=\"true\" :focus=\"false\" :layers=\"false\" :onopen=\"self.onopen\" :onclose=\"self.onclose\">\r\n            <div class=\"lm-menu-submenu\" role=\"menu\" aria-orientation=\"vertical\">\r\n                <Item :loop=\"self.options\" />\r\n            </div>\r\n        </lm-modal>`;\r\n\r\n        return lemonade.element(template, self, { Item: Item });\r\n    }\r\n\r\n    const findNextEnabledCursor = function(startIndex, direction) {\r\n        if (!this.options || this.options.length === 0) {\r\n            return null;\r\n        }\r\n        \r\n        let cursor = startIndex;\r\n        let attempts = 0;\r\n        const maxAttempts = this.options.length;\r\n        \r\n        while (attempts < maxAttempts) {\r\n            if (direction) {\r\n                // Down\r\n                if (cursor >= this.options.length) {\r\n                    cursor = 0;\r\n                }\r\n            } else {\r\n                // Up\r\n                if (cursor < 0) {\r\n                    cursor = this.options.length - 1;\r\n                }\r\n            }\r\n            \r\n            let item = this.options[cursor];\r\n            if (item && !item.disabled && item.type !== 'line') {\r\n                return cursor;\r\n            }\r\n            \r\n            cursor = direction ? cursor + 1 : cursor - 1;\r\n            attempts++;\r\n        }\r\n        return null;\r\n    };\r\n\r\n    const setCursor = function(direction) {\r\n        let cursor = null;\r\n\r\n        if (typeof(this.cursor) !== 'undefined') {\r\n            if (! direction) {\r\n                // Up\r\n                cursor = findNextEnabledCursor.call(this, this.cursor - 1, false);\r\n            } else {\r\n                // Down\r\n                cursor = findNextEnabledCursor.call(this, this.cursor + 1, true);\r\n            }\r\n        }\r\n\r\n        // Remove the cursor\r\n        if (cursor === null) {\r\n            if (direction) {\r\n                cursor = findNextEnabledCursor.call(this, 0, true);\r\n            } else {\r\n                cursor = findNextEnabledCursor.call(this, this.options.length - 1, false);\r\n            }\r\n        } else if (typeof(this.cursor) !== 'undefined') {\r\n            this.options[this.cursor].cursor = false;\r\n        }\r\n\r\n        // Add the cursor if found\r\n        if (cursor !== null) {\r\n            this.options[cursor].cursor = true;\r\n            this.cursor = cursor;\r\n            return true;\r\n        }\r\n\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * Reset the cursor for a contextmenu\r\n     */\r\n    const resetCursor = function() {\r\n        // Contextmenu modal\r\n        let item = this.options[this.cursor];\r\n        // Cursor is found so reset it\r\n        if (typeof(item) !== 'undefined') {\r\n            // Remove the cursor style\r\n            item.cursor = false;\r\n            // Delete reference index\r\n            delete this.cursor;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Go through all items of a menu\r\n     * @param s\r\n     * @param options\r\n     */\r\n    const onopen = function(s, options) {\r\n        // Onopen\r\n        for (let i = 0; i < options.length; i++) {\r\n            if (typeof(options[i].onopen) === 'function') {\r\n                options[i].onopen(s);\r\n            }\r\n        }\r\n    }\r\n\r\n    const Contextmenu = function(children, { onload }) {\r\n        let self = this;\r\n\r\n        // Container for all modals\r\n        self.modals = [];\r\n        self.modalIndex = 0;\r\n\r\n        self.create = function() {\r\n            // Create a new self for each modal\r\n            let s = {\r\n                parent: self,\r\n            };\r\n            // Render the modal inside the main container\r\n            lemonade.render(Create, self.el, s);\r\n            // Add the reference of the modal in a container#\r\n            self.modals.push(s);\r\n            // Return self\r\n            return s;\r\n        }\r\n\r\n        self.isClosed = function() {\r\n            return self.modals[0].modal.closed === true;\r\n        }\r\n\r\n        self.open = function(options, x, y, adjust) {\r\n            // Get the main modal\r\n            let menu = self.modals[0];\r\n            // Reset cursor\r\n            resetCursor.call(menu);\r\n            // Define new position\r\n            menu.modal.top = y;\r\n            menu.modal.left = x;\r\n            // Open\r\n            menu.modal.open();\r\n            // If the modal is open and the content is different from what is shown. Close modals with higher level\r\n            self.close(1);\r\n            // Update the data\r\n            if (options && menu.options !== options) {\r\n                // Refresh content\r\n                menu.options = options;\r\n            }\r\n            onopen(self, options);\r\n\r\n            // Adjust position to respect mouse cursor after auto-adjust\r\n            // Use queueMicrotask to ensure it runs after the modal's auto-adjust\r\n            if (adjust === true) {\r\n                queueMicrotask(() => {\r\n                    let modalEl = menu.modal.el;\r\n                    let rect = modalEl.getBoundingClientRect();\r\n                    let marginLeft = parseFloat(modalEl.style.marginLeft) || 0;\r\n                    let marginTop = parseFloat(modalEl.style.marginTop) || 0;\r\n\r\n                    // Check if horizontal adjustment was applied (margin is non-zero)\r\n                    if (marginLeft !== 0) {\r\n                        // Position modal so its right edge is at x - 1 (cursor 1px to the right of modal)\r\n                        // Formula: left + margin + width = x - 1, where left = x\r\n                        // Therefore: margin = -width - 1\r\n                        let newMarginLeft = -rect.width - 1;\r\n                        // Check if this would push modal off the left edge\r\n                        let newLeft = x + newMarginLeft;\r\n                        if (newLeft < 10) {\r\n                            // Keep a 10px margin from the left edge\r\n                            newMarginLeft = 10 - x;\r\n                        }\r\n                        modalEl.style.marginLeft = newMarginLeft + 'px';\r\n                    }\r\n\r\n                    // Check if vertical adjustment was applied (margin is non-zero)\r\n                    if (marginTop !== 0) {\r\n                        // Position modal so its bottom edge is at y - 1 (cursor 1px below modal)\r\n                        // Formula: top + margin + height = y - 1, where top = y\r\n                        // Therefore: margin = -height - 1\r\n                        let newMarginTop = -rect.height - 1;\r\n                        // Check if this would push modal off the top edge\r\n                        let newTop = y + newMarginTop;\r\n                        if (newTop < 10) {\r\n                            // Keep a 10px margin from the top edge\r\n                            newMarginTop = 10 - y;\r\n                        }\r\n                        modalEl.style.marginTop = newMarginTop + 'px';\r\n                    }\r\n                });\r\n            }\r\n            // Focus\r\n            self.el.classList.add('lm-menu-focus');\r\n            // Focus on the contextmenu\r\n            self.el.focus();\r\n        }\r\n\r\n        self.close = function(level) {\r\n            // Close all modals from the level specified\r\n            self.modals.forEach(function(menu, k) {\r\n                if (k >= level) {\r\n                    if (menu.item) {\r\n                        menu.item.expanded = false;\r\n                        menu.item = null;\r\n                    }\r\n                    menu.modal.close();\r\n                }\r\n            });\r\n            // Keep the index of the modal that is opened\r\n            self.modalIndex = level ? level - 1 : 0;\r\n\r\n            // Close event\r\n            if (level === 0) {\r\n                self.el.classList.remove('lm-menu-focus');\r\n\r\n                Dispatch.call(self, self.onclose, 'close', {\r\n                    instance: self,\r\n                });\r\n            }\r\n        }\r\n\r\n        onload(() => {\r\n            // Create first menu\r\n            self.create();\r\n\r\n            // Create event for focus out\r\n            self.el.addEventListener(\"focusout\", (e) => {\r\n                if (! (e.relatedTarget && (self.el.contains(e.relatedTarget) || self.root?.contains(e.relatedTarget)))) {\r\n                    self.close(0);\r\n                }\r\n            });\r\n\r\n            // Keyboard event\r\n            self.el.addEventListener(\"keydown\", function(e) {\r\n                // Menu object\r\n                let menu = self.modals[self.modalIndex];\r\n                // Modal must be opened\r\n                if (! menu.modal.closed) {\r\n                    // Something happens\r\n                    let ret = false;\r\n                    // Control\r\n                    if (e.key === 'ArrowLeft') {\r\n                        if (self.modalIndex > 0) {\r\n                            // Close modal\r\n                            menu.close();\r\n                            // Action happened\r\n                            ret = true;\r\n                        }\r\n                    } else if (e.key === 'ArrowRight') {\r\n                        // Get the selected cursor\r\n                        let item = menu.options[menu.cursor];\r\n                        // Open submenu\r\n                        if (typeof (item) !== 'undefined') {\r\n                            // Open submenu in case that exists\r\n                            if (item.submenu && !item.disabled) {\r\n                                // Open modal\r\n                                menu.open(item, true);\r\n                                // Action happened\r\n                                ret = true;\r\n                            }\r\n                        }\r\n                    } else if (e.key === 'ArrowUp') {\r\n                        ret = setCursor.call(menu, 0);\r\n                    } else if (e.key === 'ArrowDown') {\r\n                        ret = setCursor.call(menu, 1);\r\n                    } else if (e.key === 'Enter') {\r\n                        // Contextmenu modal\r\n                        let item = menu.options[menu.cursor];\r\n                        // Cursor is found so reset it\r\n                        if (typeof(item) !== 'undefined') {\r\n                            // Execute action\r\n                            if (typeof (item.onclick) === 'function') {\r\n                                item.onclick.call(item, e, item.el);\r\n                            }\r\n                            // Open sub menu in case exists\r\n                            if (item.submenu) {\r\n                                // Open menu\r\n                                menu.open(item, true);\r\n                                // Action happened\r\n                                ret = true;\r\n                            } else {\r\n                                // Close all menu\r\n                                self.close(0);\r\n                                // Action happened\r\n                                ret = true;\r\n                            }\r\n                        }\r\n                    } else if (e.key === 'Escape') {\r\n                        self.close(0);\r\n                    }\r\n\r\n                    // Something important happen so block any progression\r\n                    if (ret === true) {\r\n                        e.preventDefault();\r\n                        e.stopImmediatePropagation();\r\n                    }\r\n                }\r\n            });\r\n\r\n            if (! self.root) {\r\n                if (self.tagName) {\r\n                    self.root = self.el.parentNode.parentNode;\r\n                } else {\r\n                    self.root = self.el.parentNode;\r\n                }\r\n            }\r\n\r\n            // Parent\r\n            self.root.addEventListener(\"contextmenu\", function(e) {\r\n                if (Array.isArray(self.options) && self.options.length) {\r\n                    let [x, y] = getCoords(e);\r\n                    self.open(self.options, x, y, true);\r\n                    e.preventDefault();\r\n                    e.stopImmediatePropagation();\r\n                }\r\n            });\r\n        });\r\n\r\n        return `<div class=\"lm-menu\" role=\"menu\" aria-orientation=\"vertical\" tabindex=\"0\"></div>`;\r\n    }\r\n\r\n    lemonade.setComponents({ Contextmenu: Contextmenu });\r\n\r\n    lemonade.createWebComponent('contextmenu', Contextmenu);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Contextmenu, root, options)\r\n            return options;\r\n        } else {\r\n            return Contextmenu.call(this, root)\r\n        }\r\n    }\r\n})));\n\n/***/ }),\n\n/***/ 960:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\n/**\r\n * Implement page up and down navigation\r\n * Implement color attribute for items\r\n */\r\n\r\n\r\n\r\nif (!Modal && \"function\" === 'function') {\r\n    var Modal = __webpack_require__(392);\r\n}\r\n\r\n; (function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (! (key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            return this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    // Default row height\r\n    let defaultRowHeight = 24;\r\n\r\n    // Translations\r\n    const T = function(t) {\r\n        if (typeof(document) !== \"undefined\" && document.dictionary) {\r\n            return document.dictionary[t] || t;\r\n        } else {\r\n            return t;\r\n        }\r\n    }\r\n\r\n    const isEmpty = function(v) {\r\n        return v === '' || v === null || v === undefined || (Array.isArray(v) && v.length === 0);\r\n    }\r\n\r\n    /**\r\n     * Compare two values (arrays, strings, numbers, etc.)\r\n     * Returns true if both are equal or empty\r\n     * @param {*} a1\r\n     * @param {*} a2\r\n     */\r\n    const compareValues = function(a1, a2) {\r\n        if (a1 === a2 || (isEmpty(a1) && isEmpty(a2))) {\r\n            return true;\r\n        }\r\n\r\n        if (!a1 || !a2) {\r\n            return false;\r\n        }\r\n\r\n        if (Array.isArray(a1) && Array.isArray(a2)) {\r\n            if (a1.length !== a2.length) {\r\n                return false;\r\n            }\r\n            for (let i = 0; i < a1.length; i++) {\r\n                if (a1[i] !== a2[i]) {\r\n                    return false;\r\n                }\r\n            }\r\n            return true;\r\n        }\r\n\r\n        return a1 === a2;\r\n    }\r\n\r\n    const lazyLoading = function (self) {\r\n        /**\r\n         * Get the position from top of a row by its index\r\n         * @param item\r\n         * @returns {number}\r\n         */\r\n        const getRowPosition = function (item) {\r\n            // Position from top\r\n            let top = 0;\r\n            if (item) {\r\n                let items = self.rows;\r\n                if (items && items.length) {\r\n                    let index = self.rows.indexOf(item);\r\n                    // Go through the items\r\n                    for (let j = 0; j < index; j++) {\r\n                        top += items[j].height || defaultRowHeight;\r\n                    }\r\n                }\r\n            }\r\n            return top;\r\n        }\r\n\r\n        const updateScroll = function () {\r\n            let items = self.rows;\r\n            if (items) {\r\n                // Before control\r\n                let before = true;\r\n                // Total of items in the container\r\n                let numOfItems = items.length;\r\n                // Position from top\r\n                let height = 0;\r\n                // Size of the adjustment\r\n                let size = 0;\r\n                // Go through the items\r\n                for (let j = 0; j < numOfItems; j++) {\r\n                    let h = items[j].height || defaultRowHeight;\r\n                    // Height\r\n                    height += h;\r\n                    // Start tracking all items as before\r\n                    if (items[j] === self.result[0]) {\r\n                        before = false;\r\n                    }\r\n                    // Adjustment\r\n                    if (before) {\r\n                        size += h;\r\n                    }\r\n                }\r\n                // Update height\r\n                scroll.style.height = height + 'px';\r\n                // Adjust scroll position\r\n                return size;\r\n            }\r\n            return false;\r\n        }\r\n\r\n        const getVisibleRows = function (reset) {\r\n            let items = self.rows;\r\n            if (items) {\r\n                let adjust;\r\n                // Total of items in the container\r\n                let numOfItems = items.length;\r\n                // Get the position from top\r\n                let y = el.scrollTop;\r\n                // Get the height\r\n                let h = null;\r\n                if (self.type === 'searchbar' || self.type === 'picker') {\r\n                    // Priority should be the size used on the viewport\r\n                    h = y + (el.offsetHeight || self.height);\r\n                } else {\r\n                    // Priority is the height define during initialization\r\n                    h = y + (self.height || el.offsetHeight);\r\n                }\r\n                // Go through the items\r\n                let rows = [];\r\n                // Height\r\n                let height = 0;\r\n                // Go through all items\r\n                for (let j = 0; j < numOfItems; j++) {\r\n                    if (items[j].visible !== false) {\r\n                        // Height\r\n                        let rowHeight = items[j].height || defaultRowHeight;\r\n                        // Return on partial width\r\n                        if (height + rowHeight > y && height < h) {\r\n                            rows.push(items[j]);\r\n                        }\r\n                        height += rowHeight;\r\n                    }\r\n                }\r\n\r\n                // Update visible rows\r\n                if (reset || !compareValues(rows, self.result)) {\r\n                    // Render the items\r\n                    self.result = rows;\r\n                    // Adjust scroll height\r\n                    let adjustScroll = reset;\r\n                    // Adjust scrolling\r\n                    for (let i = 0; i < rows.length; i++) {\r\n                        // Item\r\n                        let item = rows[i];\r\n                        // Item height\r\n                        let h = item.el.offsetHeight;\r\n                        // Update row height\r\n                        if (!item.height || h !== item.height) {\r\n                            // Keep item height\r\n                            item.height = h;\r\n                            // Adjust total height\r\n                            adjustScroll = true;\r\n                        }\r\n                    }\r\n\r\n                    // Update scroll if the height of one element has been changed\r\n                    if (adjustScroll) {\r\n                        // Adjust the scroll height\r\n                        adjust = updateScroll();\r\n                    }\r\n                }\r\n\r\n                // Adjust position of the first element\r\n                let position = getRowPosition(self.result[0]);\r\n                let diff = position - el.scrollTop;\r\n                if (diff > 0) {\r\n                    diff = 0;\r\n                }\r\n                self.container.style.top = diff + 'px';\r\n\r\n                return adjust;\r\n            }\r\n        }\r\n\r\n        /**\r\n         * Move the position to the top and re-render based on the scroll\r\n         * @param reset\r\n         */\r\n        const render = function (reset) {\r\n            // Move scroll to the top\r\n            el.scrollTop = 0;\r\n            // Reset scroll\r\n            updateScroll();\r\n            // Append first batch\r\n            getVisibleRows(reset);\r\n        }\r\n\r\n        /**\r\n         * Will adjust the items based on the scroll position offset\r\n         */\r\n        self.adjustPosition = function (item) {\r\n            if (item.el) {\r\n                let h = item.el.offsetHeight;\r\n                let calc = item.el.offsetTop + h;\r\n                if (calc > el.offsetHeight) {\r\n                    let size = calc - el.offsetHeight;\r\n                    if (size < h) {\r\n                        size = h;\r\n                    }\r\n                    el.scrollTop -= -1 * size;\r\n                }\r\n            }\r\n        }\r\n\r\n        // Controls\r\n        const scrollControls = function () {\r\n            getVisibleRows(false);\r\n        }\r\n\r\n        // Element for scrolling\r\n        let el = self.container.parentNode;\r\n        el.classList.add('lm-lazy');\r\n        // Div to represent the height of the content\r\n        const scroll = document.createElement('div');\r\n        scroll.classList.add('lm-lazy-scroll');\r\n        // Force the height and add scrolling\r\n        el.appendChild(scroll);\r\n        el.addEventListener('scroll', scrollControls, { passive: true });\r\n        el.addEventListener('wheel', scrollControls, { passive: true });\r\n        self.container.classList.add('lm-lazy-items');\r\n\r\n        self.goto = function (item) {\r\n            el.scrollTop = getRowPosition(item);\r\n            let adjust = getVisibleRows(false);\r\n            if (adjust) {\r\n                el.scrollTop = adjust;\r\n                // Last adjust on the visible rows\r\n                getVisibleRows(false);\r\n            }\r\n        }\r\n\r\n        return (prop) => {\r\n            if (prop === 'rows') {\r\n                render(true);\r\n            }\r\n        }\r\n    }\r\n\r\n    const getAttributeName = function(prop) {\r\n        if (prop.substring(0,1) === ':') {\r\n            prop = prop.substring(1);\r\n        } else if (prop.substring(0,3) === 'lm-') {\r\n            prop = prop.substring(3);\r\n        }\r\n        return prop.toLowerCase();\r\n    }\r\n\r\n    const extractFromHtml =  function(element) {\r\n        let data = [];\r\n        // Content\r\n        for (let i = 0; i < element.children.length; i++) {\r\n            let e = element.children[i];\r\n            let item = {\r\n                text: e.textContent || e.getAttribute('title'),\r\n                value: e.getAttribute('value'),\r\n            }\r\n            if (item.value == null) {\r\n                item.value = item.text;\r\n            }\r\n            data.push(item);\r\n        }\r\n\r\n        return data;\r\n    }\r\n\r\n    const extract = function(children) {\r\n        let data = [];\r\n\r\n        if (this.tagName) {\r\n            data = extractFromHtml(this);\r\n            // Remove all elements\r\n            this.textContent = '';\r\n        } else {\r\n            // Get data\r\n            if (typeof(children) === 'string') {\r\n                // Version 4\r\n                let d = document.createElement('div');\r\n                d.innerHTML = children;\r\n                data = extractFromHtml(d);\r\n            } else if (children && children.length) {\r\n                // Version 5\r\n                children.forEach((v) => {\r\n                    let item = {}\r\n                    v.props.forEach((prop) => {\r\n                        item[getAttributeName(prop.name)] = prop.value;\r\n                    });\r\n                    if (! item.text) {\r\n                        item.text = v.children[0]?.props[0]?.value || '';\r\n                    }\r\n                    data.push(item);\r\n                });\r\n                // Block children\r\n                children.length = 0;\r\n            }\r\n        }\r\n\r\n        return data;\r\n    }\r\n\r\n    const isDOM = function(o) {\r\n        return (o instanceof Element || o instanceof HTMLDocument || o instanceof DocumentFragment);\r\n    }\r\n\r\n    const Dropdown = function (children, { onchange, onload }) {\r\n        let self = this;\r\n        // Data\r\n        let data = [];\r\n        // Internal value controllers\r\n        let value = [];\r\n        // Cursor\r\n        let cursor = null;\r\n        // Control events\r\n        let ignoreEvents = false;\r\n        // Lazy loading global instance\r\n        let lazyloading = null;\r\n        // Tracking changes\r\n        let changesDetected = false;\r\n        // Debounce timer for search\r\n        let searchTimeout = null;\r\n\r\n        // Data\r\n        if (! Array.isArray(self.data)) {\r\n            self.data = [];\r\n        }\r\n\r\n        let d = extract.call(this, children);\r\n        if (d) {\r\n            d.forEach((v) => {\r\n                self.data.push(v)\r\n            })\r\n        }\r\n\r\n        // Decide the type based on the size of the screen\r\n        let autoType = self.type === 'auto';\r\n\r\n        // Custom events defined by the user\r\n        let load = self.onload;\r\n        self.onload = null;\r\n        let change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        // Compatibility\r\n        if (typeof self.newOptions !== 'undefined') {\r\n            self.insert = self.newOptions;\r\n        }\r\n\r\n        // Cursor controllers\r\n        const setCursor = function (index, force) {\r\n            let item = self.rows[index];\r\n            if (typeof (item) !== 'undefined') {\r\n                // Set the cursor number\r\n                cursor = index;\r\n                // Set visual indication\r\n                item.cursor = true;\r\n                // Go to the item on the scroll in case the item is not on the viewport\r\n                if (!(item.el && item.el.parentNode) || force === true) {\r\n                    // Goto method\r\n                    self.goto(item);\r\n                }\r\n                // Adjust cursor position\r\n                setTimeout(function () {\r\n                    self.adjustPosition(item);\r\n                });\r\n            }\r\n        }\r\n\r\n        const removeCursor = function (reset) {\r\n            if (cursor !== null) {\r\n                if (typeof (self.rows[cursor]) !== 'undefined') {\r\n                    self.rows[cursor].cursor = false;\r\n                }\r\n                if (reset) {\r\n                    // Cursor is null\r\n                    cursor = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        const moveCursor = function (direction, jump) {\r\n            // Remove cursor\r\n            removeCursor();\r\n            // Last item\r\n            let last = self.rows.length - 1;\r\n            if (jump) {\r\n                if (direction < 0) {\r\n                    cursor = 0;\r\n                } else {\r\n                    cursor = last;\r\n                }\r\n            } else {\r\n                // Position\r\n                if (cursor === null) {\r\n                    cursor = 0;\r\n                } else {\r\n                    // Move previous\r\n                    cursor = cursor + direction;\r\n                }\r\n                // Reach the boundaries\r\n                if (direction < 0) {\r\n                    // Back to the last one\r\n                    if (cursor < 0) {\r\n                        cursor = last;\r\n                    }\r\n                } else {\r\n                    // Back to the first one\r\n                    if (cursor > last) {\r\n                        cursor = 0;\r\n                    }\r\n                }\r\n            }\r\n            // Add cursor\r\n            setCursor(cursor);\r\n        }\r\n\r\n        const adjustDimensions = function(data) {\r\n            // Estimate width\r\n            let width = self.width ?? 0;\r\n            // Adjust the width\r\n            let w = getInput().offsetWidth;\r\n            if (width < w) {\r\n                width = w;\r\n            }\r\n            // Width && values\r\n            data.map(function (s) {\r\n                // Estimated width of the element\r\n                if (s.text) {\r\n                    let w = Math.max(width, s.text.length * 7.5);\r\n                    if (width < w) {\r\n                        width = w;\r\n                    }\r\n                }\r\n            });\r\n            // Min width for the container\r\n            self.container.parentNode.style.width = (width - 2) + 'px';\r\n        }\r\n\r\n        const setData = function () {\r\n            // Data\r\n            data = JSON.parse(JSON.stringify(self.data));\r\n            // Re-order to make sure groups are in sequence\r\n            if (data && data.length) {\r\n                // Adjust width and height\r\n                adjustDimensions(data);\r\n                // Groups\r\n                data.sort((a, b) => {\r\n                    // Compare groups\r\n                    if (a.group && b.group) {\r\n                        return a.group.localeCompare(b.group);\r\n                    }\r\n                    return 0;\r\n                });\r\n                let group = '';\r\n                // Define group headers\r\n                data.map((v) => {\r\n                    // Compare groups\r\n                    if (v && v.group && v.group !== group) {\r\n                        v.header = v.group;\r\n                        group = v.group;\r\n                    }\r\n                });\r\n            }\r\n            // Data to be listed\r\n            self.rows = data;\r\n        }\r\n\r\n        const updateLabel = function () {\r\n            if (value && value.length) {\r\n                getInput().textContent = value.filter(v => v.selected).map(i => i.text).join('; ');\r\n            } else {\r\n                getInput().textContent = '';\r\n            }\r\n        }\r\n\r\n        const setValue = function (v, ignoreEvent) {\r\n            // Values\r\n            let newValue;\r\n            if (! Array.isArray(v)) {\r\n                if (typeof(v) === 'string') {\r\n                    newValue = v.split(self.divisor ?? ';');\r\n                } else {\r\n                    newValue = [v];\r\n                }\r\n            } else {\r\n                newValue = v;\r\n            }\r\n\r\n            // Width && values\r\n            value = [];\r\n\r\n            if (Array.isArray(data)) {\r\n                data.map(function (s) {\r\n                    s.selected = newValue.some(v => v == s.value);\r\n                    if (s.selected) {\r\n                        value.push(s);\r\n                    }\r\n                });\r\n            }\r\n\r\n            // Update label\r\n            if (self.isClosed()) {\r\n                updateLabel();\r\n            }\r\n\r\n            // Component onchange\r\n            if (! ignoreEvent) {\r\n                Dispatch.call(self, change, 'change', {\r\n                    instance: self,\r\n                    value: getValue(),\r\n                });\r\n            }\r\n        }\r\n\r\n        const getValue = function () {\r\n            if (self.multiple) {\r\n                if (value && value.length) {\r\n                    return value.filter(v => v.selected).map(i => i.value);\r\n                }\r\n            } else {\r\n                if (value && value.length) {\r\n                    return value[0].value;\r\n                }\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        const onopen = function () {\r\n            self.state = true;\r\n            // Value\r\n            let v = value[value.length - 1];\r\n            // Make sure goes back to the top of the scroll\r\n            if (self.container.parentNode.scrollTop > 0) {\r\n                self.container.parentNode.scrollTop = 0;\r\n            }\r\n            // Move to the correct position\r\n            if (v) {\r\n                // Mark the position of the cursor to the same element\r\n                setCursor(self.rows.indexOf(v), true);\r\n            }\r\n            // Prepare search field\r\n            if (self.autocomplete) {\r\n                // Get the input\r\n                let input = getInput();\r\n                // Editable\r\n                input.setAttribute('contenteditable', true);\r\n                // Clear input\r\n                input.textContent = '';\r\n                // Focus on the item\r\n                input.focus();\r\n            }\r\n            // Adjust width and height\r\n            adjustDimensions(self.data);\r\n            // Open event\r\n            Dispatch.call(self, self.onopen, 'open', {\r\n                instance: self\r\n            });\r\n        }\r\n\r\n        const onclose = function (options, origin) {\r\n            // Cursor\r\n            removeCursor(true);\r\n            // Reset search\r\n            if (self.autocomplete) {\r\n                // Go to begin of the data\r\n                self.rows = data;\r\n                // Get the input\r\n                let input = getInput();\r\n                if (input) {\r\n                    // Remove editable attribute\r\n                    input.removeAttribute('contenteditable');\r\n                    // Clear input\r\n                    input.textContent = '';\r\n                }\r\n            }\r\n\r\n            if (origin === 'escape') {\r\n                // Cancel operation and keep the same previous value\r\n                setValue(self.value, true);\r\n            } else {\r\n                // Current value\r\n                let newValue = getValue();\r\n\r\n                // If that is different from the component value\r\n                if (changesDetected === true && ! compareValues(newValue, self.value)) {\r\n                    self.value = newValue;\r\n                } else {\r\n                    // Update label\r\n                    updateLabel();\r\n                }\r\n            }\r\n\r\n            // Identify the new state of the dropdown\r\n            self.state = false;\r\n\r\n            // Close event\r\n            Dispatch.call(self, self.onclose, 'close', {\r\n                instance: self,\r\n                ...options\r\n            });\r\n        }\r\n\r\n        const normalizeData = function(result) {\r\n            if (result && result.length) {\r\n                return result.map((v) => {\r\n                    if (typeof v === 'string' || typeof v === 'number') {\r\n                        return { value: v, text: v };\r\n                    } else if (typeof v === 'object' && v.hasOwnProperty('name')) {\r\n                        return { value: v.id, text: v.name };\r\n                    } else {\r\n                        return v;\r\n                    }\r\n                });\r\n            }\r\n        }\r\n\r\n        const loadData = function(result) {\r\n            result = normalizeData(result);\r\n            // Loading controls\r\n            lazyloading = lazyLoading(self);\r\n            // Loading new data from a remote source\r\n            if (result) {\r\n                result.forEach((v) => {\r\n                    self.data.push(v);\r\n                });\r\n            }\r\n            // Process the data\r\n            setData();\r\n            // Set value\r\n            if (typeof(self.value) !== 'undefined') {\r\n                setValue(self.value, true);\r\n            }\r\n            // Onload method\r\n            Dispatch.call(self, load, 'load', {\r\n                instance: self\r\n            });\r\n            // Remove loading spin\r\n            self.input.classList.remove('lm-dropdown-loading');\r\n        }\r\n\r\n        const resetData = function(result) {\r\n            result = normalizeData(result);\r\n            // Reset cursor\r\n            removeCursor(true);\r\n            let r = data.filter(item => {\r\n                return item.selected === true;\r\n            });\r\n            // Loading new data from a remote source\r\n            if (result) {\r\n                result.forEach((v) => {\r\n                    r.push(v);\r\n                });\r\n            }\r\n            self.rows = r;\r\n            // Remove loading spin\r\n            self.input.classList.remove('lm-dropdown-loading');\r\n\r\n            // Event\r\n            Dispatch.call(self, self.onsearch, 'search', {\r\n                instance: self,\r\n                result: result,\r\n            });\r\n        }\r\n\r\n        const getInput = function() {\r\n            return self.input;\r\n        }\r\n\r\n        const search = function(query) {\r\n            if (! self.isClosed() && self.autocomplete) {\r\n\r\n                // Remote or normal search\r\n                if (self.remote === true) {\r\n                    // Clear existing timeout\r\n                    if (searchTimeout) {\r\n                        clearTimeout(searchTimeout);\r\n                    }\r\n                    // Loading spin\r\n                    self.input.classList.add('lm-dropdown-loading');\r\n                    // Headers\r\n                    let http = {\r\n                        headers: {\r\n                            'Content-Type': 'text/json',\r\n                        }\r\n                    }\r\n                    let ret = Dispatch.call(self, self.onbeforesearch, 'beforesearch', {\r\n                        instance: self,\r\n                        http: http,\r\n                        query: query,\r\n                    });\r\n\r\n                    if (ret === false) {\r\n                        return;\r\n                    }\r\n\r\n                    // Debounce the search with 300ms delay\r\n                    searchTimeout = setTimeout(() => {\r\n                        fetch(`${self.url}?q=${query}`, http).then(r => r.json()).then(resetData).catch((error) => {\r\n                            resetData([]);\r\n                        });\r\n                    }, 300);\r\n                } else {\r\n                    // Filter options\r\n                    let temp;\r\n\r\n                    const find = (prop) => {\r\n                        if (prop) {\r\n                            if (Array.isArray(prop)) {\r\n                                // match if ANY element contains the query (case-insensitive)\r\n                                return prop.some(v => v != null && v.toString().toLowerCase().includes(query));\r\n                            }\r\n                            // handle strings/numbers/others\r\n                            return prop.toString().toLowerCase().includes(query);\r\n                        }\r\n                        return false;\r\n                    };\r\n\r\n                    if (! query) {\r\n                        temp = data;\r\n                    } else {\r\n                        temp = data.filter(item => {\r\n                            return item.selected === true || find(item.text) || find(item.group) || find(item.keywords) || find(item.synonym);\r\n                        });\r\n                    }\r\n\r\n                    // Cursor\r\n                    removeCursor(true);\r\n                    // Update the data from the dropdown\r\n                    self.rows = temp;\r\n                }\r\n            }\r\n        }\r\n\r\n        const events = {\r\n            focusout: (e) => {\r\n                if (self.modal) {\r\n                    if (! (e.relatedTarget && self.el.contains(e.relatedTarget))) {\r\n                        if (! self.isClosed()) {\r\n                            self.close({ origin: 'focusout '});\r\n                        }\r\n                    }\r\n                }\r\n            },\r\n            keydown: (e) => {\r\n                if (! self.isClosed()) {\r\n                    let prevent = false;\r\n                    if (e.code === 'ArrowUp') {\r\n                        moveCursor(-1);\r\n                        prevent = true;\r\n                    } else if (e.code === 'ArrowDown') {\r\n                        moveCursor(1);\r\n                        prevent = true;\r\n                    } else if (e.code === 'Home') {\r\n                        moveCursor(-1, true);\r\n                        if (!self.autocomplete) {\r\n                            prevent = true;\r\n                        }\r\n                    } else if (e.code === 'End') {\r\n                        moveCursor(1, true);\r\n                        if (!self.autocomplete) {\r\n                            prevent = true;\r\n                        }\r\n                    } else if (e.code === 'Enter') {\r\n                        if (e.target.tagName === 'BUTTON') {\r\n                            e.target.click();\r\n                            let input = getInput();\r\n                            input.focus();\r\n                        } else {\r\n                            select(e, self.rows[cursor]);\r\n                        }\r\n                        prevent = true;\r\n                    } else if (e.code === 'Escape') {\r\n                        self.close({ origin: 'escape'});\r\n                        prevent = true;\r\n                    } else {\r\n                        if (e.keyCode === 32 && !self.autocomplete) {\r\n                            select(e, self.rows[cursor]);\r\n                        }\r\n                    }\r\n\r\n                    if (prevent) {\r\n                        e.preventDefault();\r\n                        e.stopImmediatePropagation();\r\n                    }\r\n                } else {\r\n                    if (e.code === 'ArrowUp' || e.code === 'ArrowDown' || e.code === 'Enter') {\r\n                        self.open();\r\n                        e.preventDefault();\r\n                        e.stopImmediatePropagation();\r\n                    }\r\n                }\r\n            },\r\n            mousedown: (e) => {\r\n                if (e.target.classList.contains('lm-dropdown-input')) {\r\n                    if (self.autocomplete) {\r\n                        let x;\r\n                        if (e.changedTouches && e.changedTouches[0]) {\r\n                            x = e.changedTouches[0].clientX;\r\n                        } else {\r\n                            x = e.clientX;\r\n                        }\r\n                        if (e.target.offsetWidth - (x - e.target.offsetLeft) < 20) {\r\n                            toggle();\r\n                        } else {\r\n                            self.open();\r\n                        }\r\n                    } else {\r\n                        toggle();\r\n                    }\r\n                }\r\n            },\r\n            paste: (e) => {\r\n                if (e.target.classList.contains('lm-dropdown-input')) {\r\n                    let text;\r\n                    if (e.clipboardData || e.originalEvent.clipboardData) {\r\n                        text = (e.originalEvent || e).clipboardData.getData('text/plain');\r\n                    } else if (window.clipboardData) {\r\n                        text = window.clipboardData.getData('Text');\r\n                    }\r\n                    text = text.replace(/(\\r\\n|\\n|\\r)/gm, \"\");\r\n                    document.execCommand('insertText', false, text)\r\n                    e.preventDefault();\r\n                }\r\n            },\r\n            input: (e) => {\r\n                if (e.target.classList.contains('lm-dropdown-input')) {\r\n                    search(e.target.textContent.toLowerCase());\r\n                }\r\n            },\r\n        }\r\n\r\n        const selectItem = function(s) {\r\n            if (self.remote === true) {\r\n                if (data.indexOf(s) === -1) {\r\n                    self.data.push(s);\r\n                    data.push(s);\r\n                }\r\n            }\r\n\r\n            if (self.multiple === true) {\r\n                let position = value.indexOf(s);\r\n                if (position === -1) {\r\n                    value.push(s);\r\n                    s.selected = true;\r\n                } else {\r\n                    value.splice(position, 1);\r\n                    s.selected = false;\r\n                }\r\n            } else {\r\n                if (value[0] === s) {\r\n                    if (self.allowEmpty === false) {\r\n                        s.selected = true;\r\n                    } else {\r\n                        s.selected = !s.selected;\r\n                    }\r\n                } else {\r\n                    if (value[0]) {\r\n                        value[0].selected = false;\r\n                    }\r\n                    s.selected = true;\r\n                }\r\n                if (s.selected) {\r\n                    value = [s];\r\n                } else {\r\n                    value = [];\r\n                }\r\n            }\r\n\r\n            changesDetected = true;\r\n        }\r\n\r\n        const add = async function (e) {\r\n            let input = getInput();\r\n            let text = input.textContent;\r\n            if (! text) {\r\n                return false;\r\n            }\r\n\r\n            // New item\r\n            let s = {\r\n                text: text,\r\n                value: text,\r\n            }\r\n\r\n            self.add(s);\r\n\r\n            e.preventDefault();\r\n        }\r\n\r\n        const select = function (e, s) {\r\n            if (s && s.disabled !== true) {\r\n                selectItem(s);\r\n                // Close the modal\r\n                if (self.multiple !== true) {\r\n                    self.close({ origin: 'button' });\r\n                }\r\n            }\r\n        }\r\n\r\n        const toggle = function () {\r\n            if (self.modal) {\r\n                if (self.isClosed()) {\r\n                    self.open();\r\n                } else {\r\n                    self.close({ origin: 'button' });\r\n                }\r\n            }\r\n        }\r\n\r\n        self.add = async function (newItem) {\r\n            // Event\r\n            if (typeof(self.onbeforeinsert) === 'function') {\r\n                self.input.classList.add('lm-dropdown-loading');\r\n                let ret = await self.onbeforeinsert(self, newItem);\r\n                self.input.classList.remove('lm-dropdown-loading');\r\n                if (ret === false) {\r\n                    return;\r\n                } else if (ret) {\r\n                    newItem = ret;\r\n                }\r\n            }\r\n            // Process the data\r\n            data.push(newItem);\r\n            self.data.push(newItem);\r\n            // Refresh screen\r\n            self.result.unshift(newItem);\r\n            self.rows.unshift(newItem);\r\n            self.refresh('result');\r\n\r\n            Dispatch.call(self, self.oninsert, 'insert', {\r\n                instance: self,\r\n                item: newItem,\r\n            });\r\n        }\r\n\r\n        self.open = function () {\r\n            if (self.modal && ! self.disabled) {\r\n                if (self.isClosed()) {\r\n                    if (autoType) {\r\n                        self.type = window.innerWidth > 640 ? self.type = 'default' : (self.autocomplete ? 'searchbar' : 'picker');\r\n                    }\r\n                    // Track\r\n                    changesDetected = false;\r\n                    // Open the modal\r\n                    self.modal.open();\r\n                }\r\n            }\r\n        }\r\n\r\n        self.close = function (options) {\r\n            if (self.modal) {\r\n                if (options?.origin) {\r\n                    self.modal.close(options)\r\n                } else {\r\n                    self.modal.close({ origin: 'button' })\r\n                }\r\n            }\r\n        }\r\n\r\n        self.isClosed = function() {\r\n            if (self.modal) {\r\n                return self.modal.isClosed();\r\n            }\r\n        }\r\n\r\n        self.setData = function(data) {\r\n            self.data = data;\r\n        }\r\n\r\n        self.getData = function() {\r\n            return self.data;\r\n        }\r\n\r\n        self.getValue = function() {\r\n            return self.value;\r\n        }\r\n\r\n        self.setValue = function(v) {\r\n            self.value = v;\r\n        }\r\n\r\n        self.reset = function() {\r\n            self.value = null;\r\n            self.close({ origin: 'button' });\r\n        }\r\n\r\n        self.onevent = function(e) {\r\n            if (events[e.type]) {\r\n                events[e.type](e);\r\n            }\r\n        }\r\n\r\n        // Init with a\r\n        let input = self.input;\r\n\r\n        onload(() => {\r\n            if (self.type === \"inline\") {\r\n                // For inline dropdown\r\n                self.el.setAttribute('tabindex', 0);\r\n                // Remove search\r\n                self.input.remove();\r\n            } else {\r\n                // Create modal instance\r\n                self.modal = {\r\n                    closed: true,\r\n                    focus: false,\r\n                    onopen: onopen,\r\n                    onclose: onclose,\r\n                    position: 'absolute',\r\n                    'auto-adjust': true,\r\n                    'auto-close': false,\r\n                };\r\n                // Generate modal\r\n                Modal(self.el.children[1], self.modal);\r\n            }\r\n\r\n            if (self.remote === 'true') {\r\n                self.remote = true;\r\n            }\r\n\r\n            if (self.autocomplete === 'true') {\r\n                self.autocomplete = true;\r\n            }\r\n\r\n            if (self.multiple === 'true') {\r\n                self.multiple = true;\r\n            }\r\n\r\n            if (self.insert === 'true') {\r\n                self.insert = true;\r\n            }\r\n\r\n            // Autocomplete will be forced to be true when insert action is active\r\n            if ((self.insert === true || self.type === 'searchbar' || self.remote === true) && ! self.autocomplete) {\r\n                self.autocomplete = true;\r\n            }\r\n\r\n            if (typeof(input) !== 'undefined') {\r\n                // Remove the native element\r\n                if (isDOM(input)) {\r\n                    input.classList.add('lm-dropdown-input');\r\n                }\r\n                // Remove search\r\n                self.input.remove();\r\n                // New input\r\n                self.input = input;\r\n            } else {\r\n                self.el.children[0].style.position = 'relative';\r\n            }\r\n\r\n            // Default width\r\n            if (self.width) {\r\n                // Dropdown\r\n                self.el.style.width = self.width + 'px';\r\n            }\r\n\r\n            // Height\r\n            self.height = 400;\r\n\r\n            // Animation for mobile\r\n            if (document.documentElement.clientWidth < 800) {\r\n                self.animation = true;\r\n            }\r\n\r\n            // Events\r\n            self.el.addEventListener('focusout', events.focusout);\r\n            self.el.addEventListener('keydown', events.keydown);\r\n            self.el.addEventListener('mousedown', events.mousedown);\r\n            self.el.addEventListener('paste', events.paste);\r\n            self.el.addEventListener('input', events.input);\r\n\r\n            // Load remote data\r\n            if (self.url) {\r\n                if (self.remote === true) {\r\n                    loadData();\r\n                } else {\r\n                    // Loading spin\r\n                    self.input.classList.add('lm-dropdown-loading');\r\n                    // Load remote data\r\n                    fetch(self.url, {\r\n                        headers: {\r\n                            'Content-Type': 'text/json',\r\n                        }\r\n                    }).then(r => r.json()).then(loadData).catch(() => {\r\n                        loadData();\r\n                    });\r\n                }\r\n            } else {\r\n                loadData();\r\n            }\r\n        });\r\n\r\n        onchange(prop => {\r\n            if (prop === 'value') {\r\n                setValue(self.value);\r\n            } else if (prop === 'data') {\r\n                setData();\r\n                self.value = null;\r\n            }\r\n\r\n            if (typeof (lazyloading) === 'function') {\r\n                lazyloading(prop);\r\n            }\r\n        });\r\n\r\n        return render => render`<div class=\"lm-dropdown\" data-state=\"{{self.state}}\" data-insert=\"{{self.insert}}\" data-type=\"{{self.type}}\" data-disabled=\"{{self.disabled}}\" :value=\"self.value\" :data=\"self.data\">\r\n            <div class=\"lm-dropdown-header\">\r\n                <div class=\"lm-dropdown-input\" placeholder=\"{{self.placeholder}}\" :ref=\"self.input\" tabindex=\"0\"></div>\r\n                <button class=\"lm-dropdown-add\" onclick=\"${add}\" tabindex=\"0\"></button>\r\n                <div class=\"lm-dropdown-header-controls\">\r\n                    <button onclick=\"self.reset\" class=\"lm-dropdown-done\">${T('Reset')}</button>\r\n                    <button onclick=\"self.close\" class=\"lm-dropdown-done\">${T('Done')}</button>\r\n                </div>\r\n            </div>\r\n            <div class=\"lm-dropdown-content\">\r\n                <div>\r\n                    <div :loop=\"self.result\" :ref=\"self.container\" :rows=\"self.rows\">\r\n                        <div class=\"lm-dropdown-item\" onclick=\"${select}\" data-cursor=\"{{self.cursor}}\" data-disabled=\"{{self.disabled}}\" data-selected=\"{{self.selected}}\" data-group=\"{{self.header}}\">\r\n                            <div><img :src=\"self.image\" /> <div>{{self.text}}</div></div>\r\n                        </div>\r\n                    </div>\r\n                </div>\r\n            </div>\r\n        </div>`;\r\n    }\r\n\r\n    lemonade.setComponents({ Dropdown: Dropdown });\r\n\r\n    lemonade.createWebComponent('dropdown', Dropdown);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Dropdown, root, options)\r\n            return options;\r\n        } else {\r\n            return Dropdown.call(this, root)\r\n        }\r\n    }\r\n})));\n\n/***/ }),\n\n/***/ 392:\n/***/ (function(module) {\n\n/**\r\n * pin the modal to the left panel\r\n */\r\n\r\n\r\n;(function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (! (key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    // References\r\n    const modals = [];\r\n    // State of the resize and move modal\r\n    let state = {};\r\n    // Internal controls of the action of resize and move\r\n    let controls = {};\r\n    // Width of the border\r\n    let cornerSize = 10;\r\n    // Container with minimized modals\r\n    const minimizedModals = [];\r\n    // Default z-index for the modals\r\n    const defaultZIndex = 20;\r\n\r\n    /**\r\n     * Send the modal to the front\r\n     * @param container\r\n     */\r\n    const sendToFront = function(container) {\r\n        let highestXIndex = defaultZIndex;\r\n        for (let i = 0; i < modals.length; i++) {\r\n            const zIndex = parseInt(modals[i].el.style.zIndex);\r\n            if (zIndex > highestXIndex) {\r\n                highestXIndex = zIndex;\r\n            }\r\n        }\r\n        container.style.zIndex = highestXIndex + 1;\r\n    }\r\n\r\n    /**\r\n     * Send modal to the back\r\n     * @param container\r\n     */\r\n    const sendToBack = function(container) {\r\n        container.style.zIndex = defaultZIndex;\r\n    }\r\n\r\n    // Get the coordinates of the action\r\n    const getCoords = function(e) {\r\n        let x;\r\n        let y;\r\n\r\n        if (e.changedTouches && e.changedTouches[0]) {\r\n            x = e.changedTouches[0].clientX;\r\n            y = e.changedTouches[0].clientY;\r\n        } else {\r\n            x = e.clientX;\r\n            y = e.clientY;\r\n        }\r\n\r\n        return [x,y];\r\n    }\r\n\r\n    // Get the button status\r\n    const getButton = function(e) {\r\n        e = e || window.event;\r\n        if (e.buttons) {\r\n            return e.buttons;\r\n        } else if (e.button) {\r\n            return e.button;\r\n        } else {\r\n            return e.which;\r\n        }\r\n    }\r\n\r\n    // Finalize any potential action\r\n    const mouseUp = function(e) {\r\n        // Finalize all actions\r\n        if (typeof(controls.action) === 'function') {\r\n            controls.action();\r\n        }\r\n        setTimeout(function() {\r\n            // Remove cursor\r\n            if (controls.e) {\r\n                controls.e.style.cursor = '';\r\n            }\r\n            // Reset controls\r\n            controls = {};\r\n            // Reset state controls\r\n            state = {\r\n                x: null,\r\n                y: null,\r\n            }\r\n        }, 0)\r\n    }\r\n\r\n    const mouseMove = function(e) {\r\n        if (! getButton(e)) {\r\n            return false;\r\n        }\r\n        // Get mouse coordinates\r\n        let [x,y] = getCoords(e);\r\n\r\n        // Move modal\r\n        if (controls.type === 'move') {\r\n            if (state && state.x == null && state.y == null) {\r\n                state.x = x;\r\n                state.y = y;\r\n            }\r\n\r\n            let dx = x - state.x;\r\n            let dy = y - state.y;\r\n            let top = controls.e.offsetTop + dy;\r\n            let left = controls.e.offsetLeft + dx;\r\n\r\n            // Update position\r\n            controls.top = top;\r\n            controls.left = left;\r\n            controls.e.style.top = top + 'px';\r\n            controls.e.style.left = left + 'px';\r\n\r\n            state.x = x;\r\n            state.y = y;\r\n            state.top = top;\r\n            state.left = left;\r\n        } else if (controls.type === 'resize') {\r\n            let top = null;\r\n            let left = null;\r\n            let width = null;\r\n            let height = null;\r\n\r\n            if (controls.d === 'e-resize' || controls.d === 'ne-resize' || controls.d === 'se-resize') {\r\n                width = controls.w + (x - controls.x);\r\n\r\n                if (e.shiftKey) {\r\n                    height = controls.h + (x - controls.x) * (controls.h / controls.w);\r\n                }\r\n            } else if (controls.d === 'w-resize' || controls.d === 'nw-resize'|| controls.d === 'sw-resize') {\r\n                left = controls.l + (x - controls.x);\r\n                // Do not move further\r\n                if (left >= controls.l) {\r\n                    left = controls.l;\r\n                }\r\n                // Update width\r\n                width = controls.l + controls.w - left;\r\n                // Consider shift to update height\r\n                if (e.shiftKey) {\r\n                    height = controls.h - (x - controls.x) * (controls.h / controls.w);\r\n                }\r\n            }\r\n\r\n            if (controls.d === 's-resize' || controls.d === 'se-resize' || controls.d === 'sw-resize') {\r\n                if (! height) {\r\n                    height = controls.h + (y - controls.y);\r\n                }\r\n            } else if (controls.d === 'n-resize' || controls.d === 'ne-resize' || controls.d === 'nw-resize') {\r\n                top = controls.t + (y - controls.y);\r\n                // Do not move further\r\n                if (top >= controls.t) {\r\n                    top = controls.t;\r\n                }\r\n                // Update height\r\n                height = controls.t + controls.h - top;\r\n            }\r\n\r\n            if (top) {\r\n                controls.e.style.top = top + 'px';\r\n            }\r\n            if (left) {\r\n                controls.e.style.left = left + 'px';\r\n            }\r\n            if (width) {\r\n                controls.e.style.width = width + 'px';\r\n            }\r\n            if (height) {\r\n                controls.e.style.height = height + 'px';\r\n            }\r\n        }\r\n    }\r\n\r\n    if (typeof(document) !== \"undefined\") {\r\n        document.addEventListener('mouseup', mouseUp);\r\n        document.addEventListener('mousemove', mouseMove);\r\n    }\r\n\r\n    const isTrue = function(e) {\r\n        return e === true || e === 1 || e === 'true';\r\n    }\r\n\r\n    const refreshMinimized = function() {\r\n        let items = minimizedModals;\r\n        let numOfItems = items.length;\r\n        let width = 10;\r\n        let height = 55;\r\n        let offsetWidth = window.innerWidth;\r\n        let offsetHeight = window.innerHeight;\r\n        for (let i = 0; i < numOfItems; i++) {\r\n            let item = items[i];\r\n            item.el.style.left = width + 'px';\r\n            item.el.style.top = offsetHeight - height + 'px';\r\n            width += 205;\r\n\r\n            if (offsetWidth - width < 205) {\r\n                width = 10;\r\n                height += 50;\r\n            }\r\n        }\r\n    }\r\n\r\n    const delayAction = function(self, action) {\r\n        // Make sure to remove the transformation before minimize to preserve the animation\r\n        if (self.el.style.marginLeft || self.el.style.marginTop) {\r\n            // Make sure no animation during this process\r\n            self.el.classList.add('action');\r\n            // Remove adjustment\r\n            removeMargin(self);\r\n            // Make sure to continue with minimize\r\n            setTimeout(function() {\r\n                // Remove class\r\n                self.el.classList.remove('action');\r\n                // Call action\r\n                action(self);\r\n            },0)\r\n\r\n            return true;\r\n        }\r\n    }\r\n\r\n    const setMini = function(self) {\r\n        if (delayAction(self, setMini)) {\r\n            return;\r\n        }\r\n\r\n        // Minimize modals\r\n        minimizedModals.push(self);\r\n\r\n        self.el.top = self.el.offsetTop;\r\n        self.el.left = self.el.offsetLeft;\r\n\r\n        if (! self.el.style.top) {\r\n            self.el.style.top = self.el.top + 'px';\r\n        }\r\n        if (! self.el.style.left) {\r\n            self.el.style.left = self.el.left + 'px';\r\n        }\r\n\r\n        self.el.translateY = 0;\r\n        self.el.translateX = 0;\r\n\r\n        // Refresh positions\r\n        setTimeout(function() {\r\n            refreshMinimized();\r\n            self.minimized = true;\r\n        },10)\r\n    }\r\n\r\n    const removeMini = function(self) {\r\n        minimizedModals.splice(minimizedModals.indexOf(self), 1);\r\n        self.minimized = false;\r\n        self.el.style.top = self.el.top + 'px';\r\n        self.el.style.left = self.el.left + 'px';\r\n        // Refresh positions\r\n        setTimeout(() => {\r\n            refreshMinimized();\r\n        }, 10);\r\n        // Refresh positions\r\n        setTimeout(() => {\r\n            if (self.top === '') {\r\n                self.el.style.top = '';\r\n            }\r\n            if (self.left === '') {\r\n                self.el.style.left = '';\r\n            }\r\n        }, 400);\r\n    }\r\n\r\n    const removeMargin = function(self) {\r\n        if (self.el.style.marginLeft) {\r\n            let y = self.el.offsetLeft;\r\n            self.el.style.marginLeft = '';\r\n            self.left = y;\r\n        }\r\n\r\n        if (self.el.style.marginTop) {\r\n            let x = self.el.offsetTop;\r\n            self.el.style.marginTop = '';\r\n            self.top = x;\r\n        }\r\n    }\r\n\r\n    const adjustHorizontal = function(self) {\r\n        if (! isTrue(self['auto-adjust'])) {\r\n            return false;\r\n        }\r\n\r\n        self.el.style.marginLeft = '';\r\n        let viewportWidth = window.innerWidth;\r\n        let margin = 10;\r\n\r\n        if (self.position) {\r\n            if (self.position === 'absolute') {\r\n                let w = document.documentElement.offsetWidth;\r\n                if (w > viewportWidth) {\r\n                    //viewportWidth = w;\r\n                }\r\n            } else if (self.position !== 'center') {\r\n                margin = 0;\r\n            }\r\n        }\r\n\r\n        let el = self.el.getBoundingClientRect();\r\n\r\n        let rightEdgeDistance = viewportWidth - (el.left + el.width);\r\n        let transformX = 0;\r\n\r\n        if (self.position === 'absolute') {\r\n            if (rightEdgeDistance < 0) {\r\n                transformX = rightEdgeDistance - margin - 10; // 10 is the scroll width\r\n            }\r\n        } else {\r\n            if (rightEdgeDistance < 0) {\r\n                transformX = rightEdgeDistance - margin;\r\n            }\r\n        }\r\n\r\n        if (el.left < 0) {\r\n            transformX = margin - el.left;\r\n        }\r\n        if (transformX !== 0) {\r\n            self.el.style.marginLeft = transformX + 'px';\r\n        }\r\n    }\r\n\r\n    const adjustVertical = function(self) {\r\n        if (! isTrue(self['auto-adjust'])) {\r\n            return false;\r\n        }\r\n\r\n        self.el.style.marginTop = '';\r\n        let viewportHeight = window.innerHeight;\r\n        let margin = 10;\r\n\r\n        if (self.position) {\r\n            if (self.position === 'absolute') {\r\n                let h = document.documentElement.offsetHeight;\r\n                if (h > viewportHeight) {\r\n                    //viewportHeight = h;\r\n                }\r\n            } else if (self.position !== 'center') {\r\n                margin = 0;\r\n            }\r\n        }\r\n\r\n        let el = self.el.getBoundingClientRect();\r\n\r\n        let bottomEdgeDistance = viewportHeight - (el.top + el.height);\r\n        let transformY = 0;\r\n\r\n        if (self.position === 'absolute') {\r\n            if (bottomEdgeDistance < 5) {\r\n                transformY = (-1 * el.height) - margin - 12;\r\n                if (el.top + transformY < 0) {\r\n                    transformY = -el.top + 10;\r\n                }\r\n            }\r\n        } else {\r\n            if (bottomEdgeDistance < 0) {\r\n                transformY = bottomEdgeDistance - margin;\r\n            }\r\n        }\r\n\r\n        if (el.top < 0) {\r\n            transformY = margin - el.top;\r\n        }\r\n        if (transformY !== 0) {\r\n            self.el.style.marginTop = transformY + 'px';\r\n        }\r\n    }\r\n\r\n    const removeElements = function(root) {\r\n        // Keep the DOM elements\r\n        let elements = [];\r\n        if (root) {\r\n            while (root.firstChild) {\r\n                elements.push(root.firstChild);\r\n                root.firstChild.remove();\r\n            }\r\n        }\r\n        return elements;\r\n    }\r\n\r\n    const appendElements = function(root, elements) {\r\n        if (elements && elements.length) {\r\n            while (elements[0]) {\r\n                root.appendChild(elements.shift());\r\n            }\r\n        }\r\n    }\r\n\r\n    const Modal = function (template, { onchange, onload }) {\r\n        let self = this;\r\n        let backdrop = null;\r\n        let elements = null;\r\n\r\n        if (this.tagName) {\r\n            // Remove elements from the DOM\r\n            elements = removeElements(this);\r\n\r\n            this.addEventListener('dragstart', (e) => {\r\n                e.preventDefault();\r\n            });\r\n        }\r\n\r\n        // Make sure keep the state as boolean\r\n        self.closed = !! self.closed;\r\n\r\n        // Keep all modals references\r\n        modals.push(self);\r\n\r\n        // External onload remove from the lifecycle\r\n        let change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        let load = self.onload;\r\n        self.onload = null;\r\n\r\n        let ignoreEvents = false;\r\n\r\n        const click = function(e) {\r\n            if (e.target.classList.contains('lm-modal-close')) {\r\n                self.close({ origin: 'button' });\r\n            }\r\n\r\n            if (e.target.classList.contains('lm-modal-minimize')) {\r\n                // Handles minimized modal positioning\r\n                if (self.minimized === true) {\r\n                    removeMini(self);\r\n                } else {\r\n                    setMini(self);\r\n                }\r\n            }\r\n        }\r\n\r\n        const mousemove = function(e) {\r\n            if (getButton(e)) {\r\n                return;\r\n            }\r\n\r\n            // Get mouse coordinates\r\n            let [x,y] = getCoords(e);\r\n            // Root element of the component\r\n            let item = self.el;\r\n            // Get the position and dimensions\r\n            let rect = item.getBoundingClientRect();\r\n\r\n            controls.type = null;\r\n            controls.d = null;\r\n            controls.e = item;\r\n            controls.w = rect.width;\r\n            controls.h = rect.height;\r\n            controls.t = rect.top;\r\n            controls.l = rect.left;\r\n\r\n            // When resizable\r\n            if (isTrue(self.resizable)) {\r\n                if (e.clientY - rect.top < cornerSize) {\r\n                    if (rect.width - (e.clientX - rect.left) < cornerSize) {\r\n                        item.style.cursor = 'ne-resize';\r\n                    } else if (e.clientX - rect.left < cornerSize) {\r\n                        item.style.cursor = 'nw-resize';\r\n                    } else {\r\n                        item.style.cursor = 'n-resize';\r\n                    }\r\n                } else if (rect.height - (e.clientY - rect.top) < cornerSize) {\r\n                    if (rect.width - (e.clientX - rect.left) < cornerSize) {\r\n                        item.style.cursor = 'se-resize';\r\n                    } else if (e.clientX - rect.left < cornerSize) {\r\n                        item.style.cursor = 'sw-resize';\r\n                    } else {\r\n                        item.style.cursor = 's-resize';\r\n                    }\r\n                } else if (rect.width - (e.clientX - rect.left) < cornerSize) {\r\n                    item.style.cursor = 'e-resize';\r\n                } else if (e.clientX - rect.left < cornerSize) {\r\n                    item.style.cursor = 'w-resize';\r\n                } else {\r\n                    item.style.cursor = '';\r\n                }\r\n\r\n                if (item.style.cursor) {\r\n                    controls.type = 'resize';\r\n                    controls.d = item.style.cursor;\r\n                } else {\r\n                    controls.type = null;\r\n                    controls.d = null;\r\n                }\r\n            }\r\n\r\n            if (controls.type == null && isTrue(self.draggable)) {\r\n                if (y - rect.top < 40) {\r\n                    item.style.cursor = 'move';\r\n                } else {\r\n                    item.style.cursor = '';\r\n                }\r\n\r\n                if (item.style.cursor) {\r\n                    controls.type = 'move';\r\n                    controls.d = item.style.cursor;\r\n                } else {\r\n                    controls.type = null;\r\n                    controls.d = null;\r\n                }\r\n            }\r\n        }\r\n\r\n        const mousedown = function(e) {\r\n            if (! self.minimized) {\r\n                // Get mouse coordinates\r\n                let [x,y] = getCoords(e);\r\n                controls.x = x;\r\n                controls.y = y;\r\n                // Root element of the component\r\n                let item = self.el;\r\n                // Get the position and dimensions\r\n                let rect = item.getBoundingClientRect();\r\n                controls.e = item;\r\n                controls.w = rect.width;\r\n                controls.h = rect.height;\r\n                controls.t = rect.top;\r\n                controls.l = rect.left;\r\n                // If is not minimized\r\n                if (controls.type === 'resize') {\r\n                    // Make sure the width and height is defined for the modal\r\n                    if (! item.style.width) {\r\n                        item.style.width = controls.w + 'px';\r\n                    }\r\n                    if (! item.style.height) {\r\n                        item.style.height = controls.h + 'px';\r\n                    }\r\n                    // This will be the callback when finalize the resize\r\n                    controls.action = function () {\r\n                        self.width = parseInt(item.style.width);\r\n                        self.height = parseInt(item.style.height);\r\n                        controls.e.classList.remove('action');\r\n                        // Event\r\n                        Dispatch.call(self, self.onresize, 'resize', {\r\n                            instance: self,\r\n                            width: self.width,\r\n                            height: self.height,\r\n                        });\r\n                    }\r\n                    controls.e.classList.add('action');\r\n                } else if (isTrue(self.draggable) && y - rect.top < 40) {\r\n                    // Callback\r\n                    controls.action = function () {\r\n                        self.top = parseInt(item.style.top);\r\n                        self.left = parseInt(item.style.left);\r\n                        controls.e.classList.remove('action');\r\n                        // Open event\r\n                        Dispatch.call(self, self.onmove, 'move', {\r\n                            instance: self,\r\n                            top: self.top,\r\n                            left: self.left,\r\n                        });\r\n                    }\r\n                    controls.e.classList.add('action');\r\n                    // Remove transform\r\n                    removeMargin(self);\r\n                }\r\n            }\r\n        }\r\n\r\n        self.back = function() {\r\n            sendToBack(self.el);\r\n        }\r\n\r\n        self.front = function() {\r\n            sendToFront(self.el);\r\n        }\r\n\r\n        self.open = function() {\r\n            if (self.closed === true) {\r\n                self.closed = false;\r\n                // Close event\r\n                Dispatch.call(self, self.onopen, 'open', {\r\n                    instance: self\r\n                });\r\n            }\r\n        }\r\n\r\n        self.close = function(options) {\r\n            if (self.closed === false) {\r\n                self.closed = true;\r\n                // Close event\r\n                Dispatch.call(self, self.onclose, 'close', {\r\n                    instance: self,\r\n                    ...options\r\n                });\r\n            }\r\n        }\r\n\r\n        self.isClosed = function() {\r\n            return self.closed;\r\n        }\r\n\r\n        if (! template || typeof(template) !== 'string') {\r\n            template = '';\r\n        }\r\n\r\n        // Custom Root Configuration\r\n        self.settings = {\r\n            getRoot: function() {\r\n                return self.root;\r\n            }\r\n        }\r\n\r\n        // Native lemonade\r\n        onload(() => {\r\n            // Dimensions\r\n            if (self.width) {\r\n                self.el.style.width = self.width + 'px';\r\n            }\r\n            if (self.height) {\r\n                self.el.style.height = self.height + 'px';\r\n            }\r\n            // Position\r\n            if (self.top) {\r\n                self.el.style.top = self.top + 'px';\r\n            }\r\n            if (self.left) {\r\n                self.el.style.left = self.left + 'px';\r\n            }\r\n\r\n            if (self.position === 'absolute' || self.position === 'right' || self.position === 'bottom' || self.position === 'left') {\r\n\r\n            } else {\r\n                if (!self.width && self.el.offsetWidth) {\r\n                    self.width = self.el.offsetWidth;\r\n                }\r\n                if (!self.height && self.el.offsetHeight) {\r\n                    self.height = self.el.offsetHeight;\r\n                }\r\n\r\n                // Initial centralize\r\n                if (self.position === 'center' || !self.top) {\r\n                    self.top = (window.innerHeight - self.height) / 2;\r\n                }\r\n                if (self.position === 'center' || !self.left) {\r\n                    self.left = (window.innerWidth - self.width) / 2;\r\n                }\r\n\r\n                // Responsive\r\n                if (document.documentElement.clientWidth < 800) {\r\n                    // Full screen\r\n                    if (self.height > 300) {\r\n                        self.el.classList.add('fullscreen');\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Auto adjust\r\n            adjustHorizontal(self);\r\n            adjustVertical(self);\r\n\r\n            // Backdrop\r\n            if (self.backdrop === true) {\r\n                backdrop = document.createElement('div');\r\n                backdrop.classList.add('lm-modal-backdrop');\r\n                backdrop.addEventListener('click', () => {\r\n                    self.close({ origin: 'backdrop' });\r\n                });\r\n\r\n                if (self.closed === false) {\r\n                    self.el.parentNode.insertBefore(backdrop, self.el);\r\n                }\r\n            }\r\n\r\n            // Import content from DOM\r\n            if (self.content) {\r\n                if (typeof(self.content) === 'string') {\r\n                    template = self.content;\r\n                } else if (typeof(self.content) === 'object' && self.content.tagName) {\r\n                    self.root.appendChild(self.content);\r\n                }\r\n            }\r\n\r\n            // Focus out of the component\r\n            self.el.addEventListener('focusout', function(e) {\r\n                if (! self.el.contains(e.relatedTarget)) {\r\n                    if (isTrue(self['auto-close'])) {\r\n                        self.close({ origin: 'focusout' });\r\n                    }\r\n                    // Remove focus\r\n                    self.el.classList.remove('lm-modal-focus');\r\n                }\r\n            });\r\n\r\n            // Focus out of the component\r\n            self.el.addEventListener('focusin', function(e) {\r\n                self.el.classList.add('lm-modal-focus');\r\n            });\r\n\r\n            // Close and stop propagation\r\n            self.el.addEventListener('keydown', (e) => {\r\n                if (e.key === 'Escape') {\r\n                    if (self.closed === false) {\r\n                        self.close({ origin: 'escape' });\r\n                        e.preventDefault();\r\n                        e.stopImmediatePropagation();\r\n                    }\r\n                } else if (e.key === 'Enter') {\r\n                    click(e);\r\n                }\r\n            });\r\n\r\n            // Append elements to the container\r\n            appendElements(self.el.children[1], elements);\r\n\r\n            if (self.url) {\r\n                fetch(self.url)\r\n                    .then(response => response.clone().body)\r\n                    .then(body => {\r\n                        let reader = body.getReader();\r\n                        reader.read().then(({ done, value }) => {\r\n                            // Add HTML to the modal\r\n                            self.root.innerHTML = new TextDecoder().decode(value.buffer);\r\n                            // Call onload event\r\n                            Dispatch.call(self, load, 'load', {\r\n                                instance: self\r\n                            });\r\n                        });\r\n                    });\r\n            } else {\r\n                // Call onload event\r\n                Dispatch.call(self, load, 'load', {\r\n                    instance: self\r\n                });\r\n            }\r\n        });\r\n\r\n        onchange((property) => {\r\n            if (ignoreEvents) {\r\n                return false;\r\n            }\r\n\r\n            if (property === 'closed') {\r\n                if (self.closed === false) {\r\n                    // Focus on the modal\r\n                    if (self.focus !== false) {\r\n                        self.el.focus();\r\n                    }\r\n                    // Show backdrop\r\n                    if (backdrop) {\r\n                        self.el.parentNode.insertBefore(backdrop, self.el);\r\n                    }\r\n\r\n                    // Auto adjust\r\n                    queueMicrotask(() => {\r\n                        adjustHorizontal(self);\r\n                        adjustVertical(self);\r\n                    });\r\n                } else {\r\n                    // Hide backdrop\r\n                    if (backdrop) {\r\n                        backdrop.remove();\r\n                    }\r\n                }\r\n            } else if (property === 'top' || property === 'left' || property === 'width' || property === 'height') {\r\n                if (self[property] !== '') {\r\n                    self.el.style[property] = self[property] + 'px';\r\n                } else {\r\n                    self.el.style[property] = '';\r\n                }\r\n\r\n                if (self.closed === false) {\r\n                    queueMicrotask(() => {\r\n                        if (property === 'top') {\r\n                            adjustVertical(self);\r\n                        }\r\n                        if (property === 'left') {\r\n                            adjustHorizontal(self);\r\n                        }\r\n                    });\r\n                }\r\n            } else if (property === 'position') {\r\n                if (self.position) {\r\n                    if (self.position === 'center') {\r\n                        self.top = (window.innerHeight - self.el.offsetHeight) / 2;\r\n                        self.left = (window.innerWidth - self.el.offsetWidth) / 2;\r\n                    } else {\r\n                        self.top = '';\r\n                        self.left = '';\r\n                    }\r\n                } else {\r\n                    if (! self.top) {\r\n                        self.top = (window.innerHeight - self.el.offsetHeight) / 2;\r\n                    }\r\n                    if (! self.left) {\r\n                        self.left = (window.innerWidth - self.el.offsetWidth) / 2;\r\n                    }\r\n                }\r\n            }\r\n        });\r\n\r\n        return render => render`<div class=\"lm-modal\" animation=\"{{self.animation}}\" position=\"{{self.position}}\" closed=\"{{self.closed}}\" closable=\"{{self.closable}}\" minimizable=\"{{self.minimizable}}\" minimized=\"{{self.minimized}}\" overflow=\"{{self.overflow}}\" :top=\"self.top\" :left=\"self.left\" :width=\"self.width\" :height=\"self.height\" tabindex=\"-1\" role=\"modal\" onmousedown=\"${mousedown}\" onmousemove=\"${mousemove}\" onclick=\"${click}\">\r\n            <div class=\"lm-modal-title\" data-title=\"{{self.title}}\" data-icon=\"{{self.icon}}\"><div class=\"lm-modal-icon\">{{self.icon}}</div><div>{{self.title}}</div><div class=\"lm-modal-icon lm-modal-minimize\" tabindex=\"0\"></div><div class=\"lm-modal-icon lm-modal-close\" tabindex=\"0\"></div></div>\r\n            <div :ref=\"self.root\">${template}</div>\r\n        </div>`\r\n    }\r\n\r\n    const Component = function (root, options) {\r\n        if (typeof(root) === 'object') {\r\n            // Remove elements from the DOM\r\n            let elements = removeElements(root);\r\n            // Create the modal\r\n            let e = lemonade.render(Modal, root, options);\r\n            // Add elements to the container\r\n            appendElements(e.children[1], elements);\r\n\r\n            return options;\r\n        } else {\r\n            return Modal.call(this);\r\n        }\r\n    }\r\n\r\n    // Create LemonadeJS Component\r\n    lemonade.setComponents({ Modal: Modal });\r\n    // Create Web Component\r\n    lemonade.createWebComponent('modal', Modal)\r\n\r\n    return Component;\r\n})));\n\n/***/ }),\n\n/***/ 712:\n/***/ (function(module) {\n\n\r\n\r\n;(function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (! (key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    const Rating = function(children, { onchange, onload }) {\r\n        let self = this;\r\n\r\n        // Event\r\n        let change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        if (! self.number) {\r\n            self.number = 5;\r\n        }\r\n\r\n        self.stars = [];\r\n\r\n        // Current self star\r\n        let current = null;\r\n\r\n        /**\r\n         * Update the number of stars\r\n         */\r\n        const len = function () {\r\n            // Remove stars\r\n            if (self.number < self.stars.length) {\r\n                self.stars.splice(self.number, self.stars.length);\r\n                if (self.value > self.number) {\r\n                    self.value = self.number;\r\n                }\r\n            }\r\n            // Add missing stars\r\n            for (let i = 0; i < self.number; i++) {\r\n                if (! self.stars[i]) {\r\n                    self.stars[i] = {\r\n                        icon: 'star',\r\n                    };\r\n                    if (self.tooltip[i]) {\r\n                        self.stars[i].title = self.tooltip[i];\r\n                    }\r\n                }\r\n            }\r\n            // Refresh\r\n            self.refresh('stars');\r\n        }\r\n\r\n        const val = function (index, events) {\r\n            if (typeof(index) === 'string') {\r\n                index = Number(index);\r\n            }\r\n            // Apply value to the selected property in each star\r\n            for (let i = 0; i < self.number; i++) {\r\n                self.stars[i].selected = i <= index - 1 ? 1 : 0;\r\n            }\r\n            // Keep current value\r\n            current = index;\r\n            // Dispatch method\r\n            if (events !== false) {\r\n                Dispatch.call(self, change, 'change', {\r\n                    instance: self,\r\n                    value: index,\r\n                });\r\n            }\r\n        }\r\n\r\n        const getElementPosition = function(child) {\r\n            if (child.tagName === 'I') {\r\n                let root = self.el;\r\n                for (let i = 0; i < root.children.length; i++) {\r\n                    let c = root.children[i];\r\n                    if (c === child) {\r\n                        return i;\r\n                    }\r\n                }\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        const click = function(e, s) {\r\n            let ret = getElementPosition(e.target);\r\n            if (ret !== -1) {\r\n                let index = ret + 1;\r\n                if (index === current) {\r\n                    index = 0;\r\n                }\r\n                self.value = index;\r\n            }\r\n        }\r\n\r\n        const mouseover = function(e, s) {\r\n            let index = getElementPosition(e.target);\r\n            if (index !== -1) {\r\n                for (let i = 0; i < self.number; i++) {\r\n                    if (i <= index) {\r\n                        self.stars[i].hover = 1;\r\n                    } else {\r\n                        self.stars[i].hover = 0;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        const mouseout = function(e, s) {\r\n            for (let i = 0; i < self.number; i++) {\r\n                self.stars[i].hover = 0;\r\n            }\r\n        }\r\n\r\n        onchange((prop) => {\r\n            if (prop === 'number') {\r\n                len();\r\n            } else if (prop === 'value') {\r\n                val(self.value);\r\n            } else if (prop === 'tooltip') {\r\n                if (typeof(self.tooltip) === 'string') {\r\n                    self.tooltip = self.tooltip.split(',')\r\n                }\r\n                len();\r\n            }\r\n        })\r\n\r\n        onload(() => {\r\n            // Bind global method to be compatible with LemonadeJS forms\r\n            self.el.val = function (v) {\r\n                if (typeof (v) === 'undefined') {\r\n                    return self.value;\r\n                } else {\r\n                    self.value = v;\r\n                }\r\n            }\r\n\r\n            if (self.tooltip && typeof(self.tooltip) === 'string') {\r\n                self.tooltip = self.tooltip.split(',')\r\n            } else {\r\n                self.tooltip = '';\r\n            }\r\n            len();\r\n            // Ignore events\r\n            val(self.value, false);\r\n\r\n            self.el.addEventListener('click', click);\r\n            self.el.addEventListener('mouseout', mouseout);\r\n            self.el.addEventListener('mouseover', mouseover);\r\n        });\r\n\r\n        self.getValue = function () {\r\n            return Number(self.value);\r\n        }\r\n\r\n        self.setValue = function (index) {\r\n            self.value = index;\r\n        }\r\n\r\n        return `<div class=\"lm-rating\" value=\"{{self.value}}\" number=\"{{self.number}}\" name=\"{{self.name}}\" data-size=\"{{self.size}}\" :loop=\"self.stars\">\r\n            <i class=\"material-symbols-outlined material-icons\" data-selected=\"{{self.selected}}\" data-hover=\"{{self.hover}}\" title=\"{{self.title}}\">star</i>\r\n        </div>`;\r\n    }\r\n\r\n    // Register the LemonadeJS Component\r\n    lemonade.setComponents({ Rating: Rating });\r\n    // Register the web component\r\n    lemonade.createWebComponent('rating', Rating);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Rating, root, options)\r\n            return options;\r\n        } else {\r\n            return Rating.call(this, root)\r\n        }\r\n    }\r\n\r\n})));\n\n/***/ }),\n\n/***/ 711:\n/***/ (function(module) {\n\n\r\n\r\n; (function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (! (key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    const Switch = function (children, { onchange, onload }) {\r\n        let self = this;\r\n\r\n        // Event\r\n        let change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        const state = () => {\r\n            let s = self.el.firstChild.checked;\r\n            if (s !== self.checked) {\r\n                self.checked = s;\r\n            }\r\n        }\r\n\r\n        onchange((prop, a, b, c, d) => {\r\n            if (a !== b) {\r\n                Dispatch.call(self, change, 'change', {\r\n                    instance: self,\r\n                    value: self.value,\r\n                });\r\n            }\r\n\r\n            state();\r\n        })\r\n\r\n        onload(state);\r\n\r\n        return render => render`<label class=\"lm-switch\" position=\"{{self.position}}\" data-color=\"{{self.color}}\">\r\n            <input type=\"checkbox\" name=\"{{self.name}}\" disabled=\"{{self.disabled}}\" checked=\"{{self.checked}}\" :bind=\"self.value\" /> <span>{{self.text}}</span>\r\n        </label>`\r\n    }\r\n\r\n    // Create LemonadeJS references\r\n    lemonade.setComponents({ Switch: Switch });\r\n    // Create web-component\r\n    lemonade.createWebComponent('switch', Switch);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Switch, root, options)\r\n            return options;\r\n        } else {\r\n            return Switch.call(this, root);\r\n        }\r\n    }\r\n\r\n})));\n\n/***/ }),\n\n/***/ 979:\n/***/ (function(module) {\n\n\r\n\r\n; (function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    class CustomEvents extends Event {\r\n        constructor(type, props, options) {\r\n            super(type, {\r\n                bubbles: true,\r\n                composed: true,\r\n                ...options,\r\n            });\r\n\r\n            if (props) {\r\n                for (const key in props) {\r\n                    // Avoid assigning if property already exists anywhere on `this`\r\n                    if (! (key in this)) {\r\n                        this[key] = props[key];\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // Dispatcher\r\n    const Dispatch = function(method, type, options) {\r\n        // Try calling the method directly if provided\r\n        if (typeof method === 'function') {\r\n            let a = Object.values(options);\r\n            return method(...a);\r\n        } else if (this.tagName) {\r\n            this.dispatchEvent(new CustomEvents(type, options));\r\n        }\r\n    }\r\n\r\n    const extract = function(root, self) {\r\n        if (! Array.isArray(self.data)) {\r\n            self.data = [];\r\n        }\r\n\r\n        if (root.tagName) {\r\n            for (let i = 0; i < root.children.length; i++) {\r\n                self.data.push({\r\n                    el: root.children[i],\r\n                })\r\n            }\r\n        } else {\r\n            root.forEach((child) => {\r\n                self.data.push({\r\n                    el: child.element,\r\n                })\r\n            });\r\n        }\r\n    }\r\n\r\n    const sorting = function(el, options) {\r\n        const obj = {};\r\n\r\n        let dragElement = null;\r\n\r\n        el.addEventListener('dragstart', function(e) {\r\n            let target = e.target;\r\n            if (target.nodeType === 3) {\r\n                if (target.parentNode.getAttribute('draggable') === 'true') {\r\n                    target = target.parentNode;\r\n                } else {\r\n                    e.preventDefault();\r\n                    e.stopPropagation();\r\n                    return;\r\n                }\r\n            }\r\n\r\n            if (target.getAttribute('draggable') === 'true') {\r\n                let position = Array.prototype.indexOf.call(target.parentNode.children, target);\r\n                dragElement = {\r\n                    element: target,\r\n                    o: position,\r\n                    d: position\r\n                }\r\n                target.style.opacity = '0.25';\r\n                e.dataTransfer.setDragImage(target,0,0);\r\n            }\r\n        });\r\n\r\n        el.addEventListener('dragover', function(e) {\r\n            e.preventDefault();\r\n\r\n            if (dragElement && getElement(e.target) && e.target.getAttribute('draggable') == 'true' && dragElement.element != e.target) {\r\n                let element = e.target.clientWidth / 2 > e.offsetX ? e.target : e.target.nextSibling;\r\n                e.target.parentNode.insertBefore(dragElement.element, element);\r\n                dragElement.d = Array.prototype.indexOf.call(e.target.parentNode.children, dragElement.element);\r\n            }\r\n        });\r\n\r\n        el.addEventListener('dragleave', function(e) {\r\n            e.preventDefault();\r\n        });\r\n\r\n        el.addEventListener('dragend', function(e) {\r\n            e.preventDefault();\r\n\r\n            if (dragElement) {\r\n                let element = dragElement.o < dragElement.d ? e.target.parentNode.children[dragElement.o] : e.target.parentNode.children[dragElement.o].nextSibling\r\n                e.target.parentNode.insertBefore(dragElement.element, element);\r\n                dragElement.element.style.opacity = '';\r\n                dragElement = null;\r\n            }\r\n        });\r\n\r\n        el.addEventListener('drop', function(e) {\r\n            e.preventDefault();\r\n\r\n            if (dragElement) {\r\n                if (dragElement.o !== dragElement.d) {\r\n                    if (typeof(options.ondrop) == 'function') {\r\n                        options.ondrop(el, dragElement.o, dragElement.d, dragElement.element, e.target, e);\r\n                    }\r\n                }\r\n\r\n                dragElement.element.style.opacity = '';\r\n                dragElement = null;\r\n            }\r\n        });\r\n\r\n        const getElement = function(element) {\r\n            var sorting = false;\r\n\r\n            function path (element) {\r\n                if (element === el) {\r\n                    sorting = true;\r\n                }\r\n\r\n                if (! sorting) {\r\n                    path(element.parentNode);\r\n                }\r\n            }\r\n\r\n            path(element);\r\n\r\n            return sorting;\r\n        }\r\n\r\n        for (let i = 0; i < el.children.length; i++) {\r\n            if (! el.children[i].hasAttribute('draggable')) {\r\n                el.children[i].setAttribute('draggable', 'true');\r\n            }\r\n        }\r\n\r\n        return el;\r\n    }\r\n\r\n    const Tabs = function(children, { onchange, onload }) {\r\n        let self = this\r\n\r\n        // Event\r\n        let change = self.onchange;\r\n        self.onchange = null;\r\n\r\n        // Add new tab\r\n        let createButton;\r\n\r\n        // Get the references from the root web component\r\n        let root;\r\n        let template = '';\r\n        if (this.tagName) {\r\n            root = this;\r\n        } else {\r\n            // References from LemonadeJS\r\n            if (typeof(children) === 'string') {\r\n                // Version 4\r\n                template = children;\r\n            } else if (children && children.length) {\r\n                // Version 5\r\n                root = children;\r\n            }\r\n        }\r\n\r\n        if (root) {\r\n            extract(root, self);\r\n        }\r\n\r\n        // Process the data\r\n        if (self.data) {\r\n            for (let i = 0; i < self.data.length; i++) {\r\n                if (! self.data[i].el) {\r\n                    // Create element\r\n                    self.data[i].el = document.createElement('div');\r\n                    // Create from content\r\n                    if (self.data[i].content) {\r\n                        self.data[i].el.innerHTML = self.data[i].content;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        let props = ['title', 'selected', 'data-icon'];\r\n\r\n        const select = function(index) {\r\n            // Make sure the index is a number\r\n            index = parseInt(index);\r\n            // Do not select tabs that does not exist\r\n            if (index >= 0 && index < self.data.length) {\r\n                for (let i = 0; i < self.root.children.length; i++) {\r\n                    self.headers.children[i].classList.remove('selected');\r\n                    self.root.children[i].classList.remove('selected');\r\n                }\r\n                self.headers.children[index].classList.add('selected');\r\n                self.root.children[index].classList.add('selected');\r\n            }\r\n        }\r\n\r\n        const init = function(selected) {\r\n            let tabs = [];\r\n\r\n            for (let i = 0; i < self.data.length; i++) {\r\n                // Extract meta information from the DOM\r\n                if (props) {\r\n                    props.forEach((prop) => {\r\n                        let short = prop.replace('data-', '');\r\n                        if (! self.data[i][short]) {\r\n                            let ret = self.data[i].el.getAttribute(prop);\r\n                            if (ret != null) {\r\n                                self.data[i][short] = ret;\r\n                            }\r\n                        }\r\n                    });\r\n                }\r\n                // Create tabs object\r\n                tabs[i] = {\r\n                    title: self.data[i].title,\r\n                }\r\n                // Which one is selected by default\r\n                if (self.data[i].selected) {\r\n                    selected = i;\r\n                }\r\n                if (self.data[i].icon) {\r\n                    tabs[i].icon = self.data[i].icon;\r\n                }\r\n\r\n                self.root.appendChild(self.data[i].el);\r\n            }\r\n\r\n            // Create headers\r\n            self.tabs = tabs;\r\n\r\n            // Default selected\r\n            if (typeof(selected) !== 'undefined') {\r\n                self.selected = selected;\r\n            }\r\n\r\n            if (props) {\r\n                // Add create new tab button\r\n                if (createButton) {\r\n                    self.headers.appendChild(createButton);\r\n                }\r\n                // Add sorting\r\n                sorting(self.el.firstChild.firstChild, {\r\n                    ondrop: (el, fromIndex, toIndex) => {\r\n                        // Remove the item from its original position\r\n                        const [movedItem] = self.data.splice(fromIndex, 1);\r\n                        // Insert it into the new position\r\n                        self.data.splice(toIndex, 0, movedItem);\r\n                        // Make sure correct order\r\n                        for (let i = 0; i < self.data.length; i++) {\r\n                            self.root.appendChild(self.data[i].el);\r\n                        }\r\n                        // Select new position\r\n                        self.selected = toIndex;\r\n                        // Dispatch event\r\n                        Dispatch.call(self, self.onchangeposition, 'changeposition', {\r\n                            instance: self,\r\n                            fromIndex: fromIndex,\r\n                            toIndex: toIndex,\r\n                        });\r\n                    }\r\n                })\r\n            }\r\n\r\n            props = null;\r\n        }\r\n\r\n        const create = function() {\r\n            // Create a new item\r\n            self.create({ title: 'Untitled' }, null, true);\r\n        }\r\n\r\n        const open = function(e) {\r\n            if (e.target.tagName === 'LI') {\r\n                // Avoid select something already selected\r\n                let index = Array.prototype.indexOf.call(e.target.parentNode.children, e.target);\r\n                if (index !== self.selected) {\r\n                    self.selected = index;\r\n                }\r\n            }\r\n        }\r\n\r\n        const keydown = function(e, s) {\r\n            let index = null;\r\n            if (e.key === 'Enter') {\r\n                self.click(e, s);\r\n            } else if (e.key === 'ArrowUp' || e.key === 'ArrowLeft') {\r\n                index = self.selected - 1;\r\n                if (index < 0) {\r\n                    index = 0;\r\n                }\r\n            } else if (e.key === 'ArrowDown' || e.key === 'ArrowRight') {\r\n                index = self.selected + 1;\r\n                if (index > self.tabs.length-1) {\r\n                    index = self.tabs.length-1;\r\n                }\r\n            }\r\n\r\n            // Make selection\r\n            if (index !== null) {\r\n                self.tabs[index].el.focus();\r\n            }\r\n        }\r\n\r\n        onload(() => {\r\n            if (template) {\r\n                extract(self.root, self);\r\n            }\r\n\r\n            init(self.selected || 0);\r\n        })\r\n\r\n        onchange((property) => {\r\n            if (property === 'selected') {\r\n                select(self.selected);\r\n\r\n                Dispatch.call(self, self.onopen, 'open', {\r\n                    instance: self,\r\n                    selected: self.selected,\r\n                });\r\n\r\n                Dispatch.call(self, change, 'change', {\r\n                    instance: self,\r\n                    value: self.selected,\r\n                });\r\n            }\r\n        })\r\n\r\n        self.open = function (index) {\r\n            self.selected = index;\r\n        }\r\n\r\n        self.create = function(item, position, select) {\r\n            // Create element\r\n            if (typeof(item) !== 'object') {\r\n                console.error('Item must be an object');\r\n            } else {\r\n\r\n                let ret = Dispatch.call(self, self.onbeforecreate, 'beforecreate', {\r\n                    instance: self,\r\n                    item: item,\r\n                    position: position,\r\n                });\r\n\r\n                if (ret === false) {\r\n                    return false;\r\n                }\r\n\r\n                // Create DOM\r\n                item.el = document.createElement('div');\r\n                // Create from content\r\n                if (item.content) {\r\n                    item.el.innerHTML = item.content;\r\n                }\r\n\r\n                // Add the new item in the end\r\n                if (typeof(position) === 'undefined' || position === null) {\r\n                    // Mew item\r\n                    position = self.data.length;\r\n                    // Add in the end\r\n                    self.data.push(item);\r\n                } else {\r\n                    self.data.splice(position, 0, item);\r\n                }\r\n                // New position\r\n                if (select) {\r\n                    // Refresh\r\n                    init(self.data.indexOf(item));\r\n                } else {\r\n                    init(self.selected);\r\n                }\r\n\r\n                self.tabs.forEach(item => {\r\n                    item.el.setAttribute('draggable', 'true');\r\n                })\r\n\r\n                Dispatch.call(self, self.oncreate, 'create', {\r\n                    instance: self,\r\n                    item: item,\r\n                    position: position,\r\n                });\r\n            }\r\n        }\r\n\r\n        self.allowCreate = !! self.allowCreate;\r\n\r\n        return render => render`<div class=\"lm-tabs\" data-position=\"{{self.position}}\" data-round=\"{{self.round}}\">\r\n            <div role=\"tabs\" class=\"lm-tabs-headers\">\r\n                <ul :ref=\"self.headers\" :loop=\"self.tabs\" :selected=\"self.selected\" onclick=\"${open}\" onkeydown=\"${keydown}\" onfocusin=\"${open}\"><li class=\"lm-tab\" tabindex=\"0\" role=\"tab\" data-icon=\"{{self.icon}}\">{{self.title}}</li></ul>\r\n                <div data-visible=\"{{self.allowCreate}}\" class=\"lm-tabs-insert-button\" role=\"insert-tab\" onclick=\"${create}\">add</div>\r\n            </div>\r\n            <div :ref=\"self.root\" class=\"lm-tabs-content\">${template}</div>\r\n        </div>`\r\n    }\r\n\r\n    lemonade.setComponents({ Tabs: Tabs });\r\n\r\n    lemonade.createWebComponent('tabs', Tabs);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            if (typeof(options) !== 'object') {\r\n                options = {};\r\n            }\r\n            // Extract DOM references\r\n            extract(root, options);\r\n            // Create the modal\r\n            lemonade.render(Tabs, root, options);\r\n            // Return self\r\n            return options;\r\n        } else {\r\n            return Tabs.call(this);\r\n        }\r\n    };\r\n})));\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\n\r\n\r\nif (! Contextmenu && \"function\" === 'function') {\r\n    var Contextmenu = __webpack_require__(319);\r\n}\r\n\r\n; (function (global, factory) {\r\n     true ? module.exports = factory() :\r\n    0;\r\n}(this, (function () {\r\n\r\n    const Topmenu = function(children, { onload, onchange }) {\r\n        let self = this;\r\n\r\n        // Current selection\r\n        let currentIndex = null;\r\n\r\n        const getElementPosition = function(child) {\r\n            let root = self.el.children[0];\r\n            for (let i = 0; i < root.children.length; i++) {\r\n                let c = root.children[i];\r\n                if (c === child) {\r\n                    return i;\r\n                }\r\n            }\r\n            return -1;\r\n        }\r\n\r\n        const select = function(e, s) {\r\n            if (! self.menu.isClosed()) {\r\n                let index = self.options.indexOf(s);\r\n                if (index !== currentIndex) {\r\n                    open(index);\r\n                }\r\n            }\r\n        }\r\n\r\n        const deselect = function() {\r\n            if (self.options) {\r\n                self.options.forEach(v => v.selected = false);\r\n            }\r\n        }\r\n\r\n        const selectIndex = function(newIndex) {\r\n            if (self.options) {\r\n                let s = self.options[newIndex];\r\n                if (s && ! s.disabled) {\r\n                    deselect();\r\n                    // Make it selected\r\n                    s.selected = true;\r\n                    // New index\r\n                    currentIndex = newIndex;\r\n                    // Focus\r\n                    s.el.focus();\r\n                }\r\n            }\r\n        }\r\n\r\n        const open = function(index) {\r\n            // Update cursor position\r\n            selectIndex(index);\r\n            let s = self.options[currentIndex];\r\n            if (s && s.submenu) {\r\n                let x = s.el.offsetLeft;\r\n                let y = s.el.offsetTop + s.el.offsetHeight + 2;\r\n                self.menu.open(s.submenu, x, y);\r\n                s.expanded = true;\r\n            }\r\n        }\r\n\r\n        const close = function() {\r\n            self.menu.close(0);\r\n            let s = self.options[currentIndex];\r\n            if (s) {\r\n                s.el.focus();\r\n                s.expanded = false;\r\n            }\r\n        }\r\n\r\n        const toggle = function(e, s) {\r\n            if (s.submenu && ! s.disabled) {\r\n                let index = self.options.indexOf(s);\r\n                if (index === currentIndex && ! self.menu.isClosed()) {\r\n                    close();\r\n                } else {\r\n                    open(index);\r\n                }\r\n                cancel(e);\r\n            }\r\n        }\r\n\r\n        const findNextEnabledIndex = function(startIndex) {\r\n            if (!self.options || self.options.length === 0) {\r\n                return null;\r\n            }\r\n            \r\n            let index = startIndex;\r\n            let attempts = 0;\r\n            const maxAttempts = self.options.length;\r\n            \r\n            while (attempts < maxAttempts) {\r\n                if (index >= self.options.length) {\r\n                    index = 0;\r\n                }\r\n                if (!self.options[index].disabled) {\r\n                    return index;\r\n                }\r\n                index++;\r\n                attempts++;\r\n            }\r\n            return null;\r\n        };\r\n\r\n        const findPreviousEnabledIndex = function(startIndex) {\r\n            if (!self.options || self.options.length === 0) {\r\n                return null;\r\n            }\r\n            \r\n            let index = startIndex;\r\n            let attempts = 0;\r\n            const maxAttempts = self.options.length;\r\n            \r\n            while (attempts < maxAttempts) {\r\n                if (index < 0) {\r\n                    index = self.options.length - 1;\r\n                }\r\n                if (!self.options[index].disabled) {\r\n                    return index;\r\n                }\r\n                index--;\r\n                attempts++;\r\n            }\r\n            return null;\r\n        };\r\n\r\n        const adjustOptionProperties = function() {\r\n            if (self.options) {\r\n                self.options.forEach(v => {\r\n                    v.haspopup = !!v.submenu;\r\n                    v.expanded = false;\r\n\r\n                    if (v.disabled) {\r\n                        v.el.removeAttribute('tabindex');\r\n                    } else {\r\n                        v.el.setAttribute('tabindex', '0');\r\n                    }\r\n                })\r\n            }\r\n        };\r\n\r\n        /**\r\n         * Open a submenu programaticaly. Default 0\r\n         * @param {number} index\r\n         */\r\n        self.open = function(index) {\r\n            if (typeof index === 'undefined') {\r\n                index = currentIndex;\r\n            }\r\n            if (! index) {\r\n                index = 0;\r\n            }\r\n\r\n            let s = self.options[index];\r\n            if (s) {\r\n                open(index);\r\n            }\r\n        }\r\n\r\n        onchange((prop) => {\r\n            if (prop === 'options') {\r\n                adjustOptionProperties();\r\n            }\r\n        });\r\n\r\n        // Keyboard event\r\n        onload(() => {\r\n            self.el.addEventListener(\"focusin\", function(e) {\r\n                let index = getElementPosition(e.target);\r\n                if (index !== -1) {\r\n                    if (e.relatedTarget === self.menu.el) {\r\n                        close();\r\n                    } else {\r\n                        selectIndex(index);\r\n                    }\r\n                }\r\n            });\r\n\r\n            self.el.addEventListener(\"focusout\", function(e) {\r\n                if (! (e.relatedTarget && self.el.contains(e.relatedTarget))) {\r\n                    if (self.options[currentIndex]) {\r\n                        self.options[currentIndex].selected = false;\r\n                    }\r\n                }\r\n            });\r\n\r\n            self.el.addEventListener(\"keydown\", function(e) {\r\n                let o = self.options;\r\n                // Select top menu\r\n                let select = null;\r\n\r\n                if (e.key === 'Enter') {\r\n                    toggle(e, o[currentIndex])\r\n                } else if (e.key === 'ArrowLeft') {\r\n                    select = findPreviousEnabledIndex(currentIndex - 1);\r\n                } else if (e.key === 'ArrowRight') {\r\n                    select = findNextEnabledIndex(currentIndex + 1);\r\n                }\r\n\r\n                if (select !== null) {\r\n                    if (self.menu.isClosed()) {\r\n                        selectIndex(select);\r\n                    } else {\r\n                        open(select);\r\n                    }\r\n                }\r\n            });\r\n\r\n            adjustOptionProperties();\r\n        });\r\n\r\n        const cancel = function(e) {\r\n            e.preventDefault();\r\n            e.stopImmediatePropagation();\r\n        }\r\n\r\n        return render => render`<div class=\"lm-topmenu\" role=\"menubar\" aria-orientation=\"horizontal\" oncontextmenu=\"${cancel}\">\r\n            <div class=\"lm-topmenu-options\" :loop=\"self.options\">\r\n                <div class=\"lm-topmenu-title\" role=\"menuitem\" data-disabled=\"{{self.disabled}}\" data-selected=\"{{self.selected}}\" tabindex=\"0\" aria-haspopup=\"{{self.haspopup}}\" aria-expanded=\"{{self.expanded}}\" aria-label=\"{{self.title}}\" onmousedown=\"${toggle}\" onmouseenter=\"${select}\">{{self.title}}</div>\r\n            </div>\r\n            <Contextmenu :ref=\"self.menu\" :root=\"self.el\" />\r\n        </div>`\r\n    }\r\n\r\n    lemonade.setComponents({ Topmenu: Topmenu });\r\n\r\n    // Register the web component\r\n    lemonade.createWebComponent('topmenu', Topmenu);\r\n\r\n    return function (root, options) {\r\n        if (typeof (root) === 'object') {\r\n            lemonade.render(Topmenu, root, options)\r\n            return options;\r\n        } else {\r\n            return Topmenu.call(this, root)\r\n        }\r\n    }\r\n})));\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tvar cachedModule = __webpack_module_cache__[moduleId];\n/******/ \t\tif (cachedModule !== undefined) {\n/******/ \t\t\treturn cachedModule.exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\nvar __webpack_exports__ = {};\n// This entry needs to be wrapped in an IIFE because it needs to be in strict mode.\n!function() {\n\"use strict\";\n/* harmony import */ var _plugins_calendar_dist_index__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(673);\n/* harmony import */ var _plugins_calendar_dist_index__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_plugins_calendar_dist_index__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _plugins_color_dist_index__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(98);\n/* harmony import */ var _plugins_color_dist_index__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_plugins_color_dist_index__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _plugins_contextmenu_dist_index__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(319);\n/* harmony import */ var _plugins_contextmenu_dist_index__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_plugins_contextmenu_dist_index__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _plugins_dropdown_dist_index__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(960);\n/* harmony import */ var _plugins_dropdown_dist_index__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_plugins_dropdown_dist_index__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _plugins_modal_dist_index__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(392);\n/* harmony import */ var _plugins_modal_dist_index__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_plugins_modal_dist_index__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _plugins_switch_dist_index__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(711);\n/* harmony import */ var _plugins_switch_dist_index__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_plugins_switch_dist_index__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _plugins_tabs_dist_index__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(979);\n/* harmony import */ var _plugins_tabs_dist_index__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_plugins_tabs_dist_index__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var _plugins_topmenu_dist_index__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(879);\n/* harmony import */ var _plugins_topmenu_dist_index__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_plugins_topmenu_dist_index__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var _plugins_rating_dist_index__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(712);\n/* harmony import */ var _plugins_rating_dist_index__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_plugins_rating_dist_index__WEBPACK_IMPORTED_MODULE_8__);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nlet about = function () {\n    return {\n        name: 'LemonadeJS Studio',\n        version: '5.3.0',\n        url: 'https://lemonadejs.com/',\n    };\n};\n\nlet studio = {\n    Calendar: (_plugins_calendar_dist_index__WEBPACK_IMPORTED_MODULE_0___default()),\n    Color: (_plugins_color_dist_index__WEBPACK_IMPORTED_MODULE_1___default()),\n    Contextmenu: (_plugins_contextmenu_dist_index__WEBPACK_IMPORTED_MODULE_2___default()),\n    Dropdown: (_plugins_dropdown_dist_index__WEBPACK_IMPORTED_MODULE_3___default()),\n    Modal: (_plugins_modal_dist_index__WEBPACK_IMPORTED_MODULE_4___default()),\n    Switch: (_plugins_switch_dist_index__WEBPACK_IMPORTED_MODULE_5___default()),\n    Tabs: (_plugins_tabs_dist_index__WEBPACK_IMPORTED_MODULE_6___default()),\n    Topmenu: (_plugins_topmenu_dist_index__WEBPACK_IMPORTED_MODULE_7___default()),\n    Rating: (_plugins_rating_dist_index__WEBPACK_IMPORTED_MODULE_8___default()),\n    about: about,\n};\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (studio);\n\n}();\nstudio = __webpack_exports__[\"default\"];\n/******/ })()\n;\n\n    return studio;\n})));"]}