{"version":3,"file":"virtual-keyboard-angular.mjs","sources":["../../../projects/virtual-keyboard/src/lib/interfaces/keyboards-layout/hebrew.ts","../../../projects/virtual-keyboard/src/lib/interfaces/keyboards-layout/english.ts","../../../projects/virtual-keyboard/src/lib/interfaces/keyboards-layout/emoji.ts","../../../projects/virtual-keyboard/src/lib/interfaces/keyboards-layout/numeric.ts","../../../projects/virtual-keyboard/src/lib/interfaces/keyboards-layout/keyboard-layout.ts","../../../projects/virtual-keyboard/src/lib/services/virtual-keyboard-events.service.ts","../../../projects/virtual-keyboard/src/lib/virtual-keyboard.component.ts","../../../projects/virtual-keyboard/src/lib/extenders/search-result/search-result.component.ts","../../../projects/virtual-keyboard/src/lib/extenders/search-result/search-result.component.html","../../../projects/virtual-keyboard/src/lib/extenders/search-result/search-result.service.ts","../../../projects/virtual-keyboard/src/lib/extenders/virtual-keyboard-label/virtual-keyboard-label.component.ts","../../../projects/virtual-keyboard/src/lib/extenders/virtual-keyboard-label/virtual-keyboard-label.component.html","../../../projects/virtual-keyboard/src/lib/virtual-keyboard.module.ts","../../../projects/virtual-keyboard/src/public-api.ts","../../../projects/virtual-keyboard/src/virtual-keyboard-angular.ts"],"sourcesContent":["import { KeyboardLayout } from \"./keyboard-layout\"\r\nexport const Hebrew: KeyboardLayout =\r\n{\r\n  name: \"ms-Hebrew\",\r\n  lang: \"he\",\r\n  default: [\r\n    \"; 1 2 3 4 5 6 7 8 9 0 - = {bksp}\",\r\n    \"{tab} / ' \\u05e7 \\u05e8 \\u05d0 \\u05d8 \\u05d5 \\u05df \\u05dd \\u05e4 ] [ \\\\\",\r\n    \"\\u05e9 \\u05d3 \\u05d2 \\u05db \\u05e2 \\u05d9 \\u05d7 \\u05dc \\u05da \\u05e3 , {enter}\",\r\n    \"{shift} \\\\ \\u05d6 \\u05e1 \\u05d1 \\u05d4 \\u05e0 \\u05de \\u05e6 \\u05ea \\u05e5 . {shift}\",\r\n    \"{accept} {alt} {space} {alt} {cancel}\"],\r\n  shift: [\r\n    \"~ ! @ # $ % ^ & * ) ( _ + {bksp}\",\r\n    \"{tab} Q W E R T Y U I O P } { |\",\r\n    \"A S D F G H J K L : \\\" {enter}\",\r\n    \"{shift} | Z X C V B N M > < / {shift}\",\r\n    \"{accept} {alt} {space} {alt} {cancel}\"\r\n  ],\r\n  alt: [\r\n    \"{empty} {empty} {empty} {empty} \\u20aa {empty} {empty} {empty} {empty} {empty} {empty} \\u05bf {empty} {bksp}\",\r\n    \"{tab} {empty} {empty} \\u20ac {empty} {empty} {empty} \\u05f0 {empty} {empty} {empty} {empty} {empty} {empty}\",\r\n    \"{empty} {empty} {empty} {empty} {empty} \\u05f2 \\u05f1 {empty} {empty} {empty} {empty} {enter}\",\r\n    \"{shift} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {shift}\",\r\n    \"{accept} {alt} {space} {alt} {cancel}\"\r\n  ],\r\n  getDefaultDiplay() {\r\n    return {\r\n      \"{empty}\": \" \",\r\n      \"{bksp}\": \"backspace\",\r\n      \"{backspace}\": \"backspace\",\r\n      \"{enter}\": \"< enter\",\r\n      \"{shift}\": \"shift\",\r\n      \"{shiftleft}\": \"shift\",\r\n      \"{shiftright}\": \"shift\",\r\n      \"{alt}\": \"alt\",\r\n      \"{s}\": \"shift\",\r\n      \"{tab}\": \"tab\",\r\n      \"{lock}\": \"caps\",\r\n      \"{capslock}\": \"caps\",\r\n      \"{accept}\": \"Submit\",\r\n      \"{space}\": \"רווח\",\r\n      \"{//}\": \" \",\r\n      \"{esc}\": \"esc\",\r\n      \"{escape}\": \"esc\",\r\n      \"{f1}\": \"f1\",\r\n      \"{f2}\": \"f2\",\r\n      \"{f3}\": \"f3\",\r\n      \"{f4}\": \"f4\",\r\n      \"{f5}\": \"f5\",\r\n      \"{f6}\": \"f6\",\r\n      \"{f7}\": \"f7\",\r\n      \"{f8}\": \"f8\",\r\n      \"{f9}\": \"f9\",\r\n      \"{f10}\": \"f10\",\r\n      \"{f11}\": \"f11\",\r\n      \"{f12}\": \"f12\",\r\n      \"{numpaddivide}\": \"/\",\r\n      \"{numlock}\": \"lock\",\r\n      \"{arrowup}\": \"↑\",\r\n      \"{arrowleft}\": \"←\",\r\n      \"{arrowdown}\": \"↓\",\r\n      \"{arrowright}\": \"→\",\r\n      \"{prtscr}\": \"print\",\r\n      \"{scrolllock}\": \"scroll\",\r\n      \"{pause}\": \"pause\",\r\n      \"{insert}\": \"ins\",\r\n      \"{home}\": \"home\",\r\n      \"{pageup}\": \"up\",\r\n      \"{delete}\": \"del\",\r\n      \"{forwarddelete}\": \"del\",\r\n      \"{end}\": \"end\",\r\n      \"{pagedown}\": \"down\",\r\n      \"{numpadmultiply}\": \"*\",\r\n      \"{numpadsubtract}\": \"-\",\r\n      \"{numpadadd}\": \"+\",\r\n      \"{numpadenter}\": \"enter\",\r\n      \"{period}\": \".\",\r\n      \"{numpaddecimal}\": \".\",\r\n      \"{numpad0}\": \"0\",\r\n      \"{numpad1}\": \"1\",\r\n      \"{numpad2}\": \"2\",\r\n      \"{numpad3}\": \"3\",\r\n      \"{numpad4}\": \"4\",\r\n      \"{numpad5}\": \"5\",\r\n      \"{numpad6}\": \"6\",\r\n      \"{numpad7}\": \"7\",\r\n      \"{numpad8}\": \"8\",\r\n      \"{numpad9}\": \"9\",\r\n    }\r\n  }\r\n}\r\n","import { KeyboardLayout } from \"./keyboard-layout\"\r\nexport const English: KeyboardLayout =\r\n{\r\n  name: \"ms-english\",\r\n  lang: \"en\",\r\n  default: [\r\n    \"` 1 2 3 4 5 6 7 8 9 0 - = {bksp}\",\r\n    \"{tab} q w e r t y u i o p [ ] \\\\\",\r\n    \"{lock} a s d f g h j k l ; ' {enter}\",\r\n    \"{shift} z x c v b n m , . / {shift}\",\r\n    \"{accept} .com @ {space}\"\r\n  ],\r\n  shift: [\r\n    \"~ ! @ # $ % ^ & * ( ) _ + {bksp}\",\r\n    \"{tab} Q W E R T Y U I O P { } |\",\r\n    '{lock} A S D F G H J K L : \" {enter}',\r\n    \"{shift} Z X C V B N M < > ? {shift}\",\r\n    \"{accept} .com @ {space}\"\r\n  ],\r\n  alt: [\r\n    \"{empty} {empty} {empty} {empty} \\u20aa {empty} {empty} {empty} {empty} {empty} {empty} \\u05bf {empty} {bksp}\",\r\n    \"{tab} {empty} {empty} \\u20ac {empty} {empty} {empty} \\u05f0 {empty} {empty} {empty} {empty} {empty} {empty}\",\r\n    \"{empty} {empty} {empty} {empty} {empty} \\u05f2 \\u05f1 {empty} {empty} {empty} {empty} {enter}\",\r\n    \"{shift} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {shift}\",\r\n    \"{accept} {alt} {space} {alt} {cancel}\"\r\n  ],\r\n  getDefaultDiplay() {\r\n    return {\r\n      \"{empty}\": \" \",\r\n      \"{bksp}\": \"backspace\",\r\n      \"{backspace}\": \"backspace\",\r\n      \"{enter}\": \"< enter\",\r\n      \"{shift}\": \"shift\",\r\n      \"{shiftleft}\": \"shift\",\r\n      \"{shiftright}\": \"shift\",\r\n      \"{alt}\": \"alt\",\r\n      \"{s}\": \"shift\",\r\n      \"{tab}\": \"tab\",\r\n      \"{lock}\": \"caps\",\r\n      \"{capslock}\": \"caps\",\r\n      \"{accept}\": \"Accept\",\r\n      \"{space}\": \" \",\r\n      \"{//}\": \" \",\r\n      \"{esc}\": \"esc\",\r\n      \"{escape}\": \"esc\",\r\n      \"{f1}\": \"f1\",\r\n      \"{f2}\": \"f2\",\r\n      \"{f3}\": \"f3\",\r\n      \"{f4}\": \"f4\",\r\n      \"{f5}\": \"f5\",\r\n      \"{f6}\": \"f6\",\r\n      \"{f7}\": \"f7\",\r\n      \"{f8}\": \"f8\",\r\n      \"{f9}\": \"f9\",\r\n      \"{f10}\": \"f10\",\r\n      \"{f11}\": \"f11\",\r\n      \"{f12}\": \"f12\",\r\n      \"{numpaddivide}\": \"/\",\r\n      \"{numlock}\": \"lock\",\r\n      \"{arrowup}\": \"↑\",\r\n      \"{arrowleft}\": \"←\",\r\n      \"{arrowdown}\": \"↓\",\r\n      \"{arrowright}\": \"→\",\r\n      \"{prtscr}\": \"print\",\r\n      \"{scrolllock}\": \"scroll\",\r\n      \"{pause}\": \"pause\",\r\n      \"{insert}\": \"ins\",\r\n      \"{home}\": \"home\",\r\n      \"{pageup}\": \"up\",\r\n      \"{delete}\": \"del\",\r\n      \"{forwarddelete}\": \"del\",\r\n      \"{end}\": \"end\",\r\n      \"{pagedown}\": \"down\",\r\n      \"{numpadmultiply}\": \"*\",\r\n      \"{numpadsubtract}\": \"-\",\r\n      \"{numpadadd}\": \"+\",\r\n      \"{numpadenter}\": \"enter\",\r\n      \"{period}\": \".\",\r\n      \"{numpaddecimal}\": \".\",\r\n      \"{numpad0}\": \"0\",\r\n      \"{numpad1}\": \"1\",\r\n      \"{numpad2}\": \"2\",\r\n      \"{numpad3}\": \"3\",\r\n      \"{numpad4}\": \"4\",\r\n      \"{numpad5}\": \"5\",\r\n      \"{numpad6}\": \"6\",\r\n      \"{numpad7}\": \"7\",\r\n      \"{numpad8}\": \"8\",\r\n      \"{numpad9}\": \"9\",\r\n    }\r\n  }\r\n}\r\n","import { KeyboardLayout } from \"./keyboard-layout\"\r\n//https://fsymbols.com/emoticons/\r\nexport const Emoji : KeyboardLayout =\r\n{\r\n  name: \"Emoji\",\r\n  lang: \"emo\",\r\n  default: [\r\n    \"; 1 2 3 4 5 6 7 8 9 0 - = {bksp}\",\r\n    \"{tab} / ' ☺ ☻ ♥ ♦ ♣ ✌ ☮ 🍾 ] [ \\\\\",\r\n    \"\\u05e9 ♂ ⚤ ✡ 🎸 🙈 👏 👌 🙏 ♥ , {enter}\",\r\n    \"{shift} \\\\ 💋 💔 😍 ☠ 💰 🔥 🚑 👓 \\u05e5 . {shift}\",\r\n    \"{accept} {alt} {space} {alt} {cancel}\"],\r\n  shift: [\r\n    \"~ ! @ # $ % ^ & * ) ( _ + {bksp}\",\r\n    \"{tab} Q W E R T Y U I O P } { |\",\r\n    \"A S D F G H J K L : \\\" {enter}\",\r\n    \"{shift} | Z X C V B N M > < / {shift}\",\r\n    \"{accept} {alt} {space} {alt} {cancel}\"\r\n  ],\r\n  alt: [\r\n    \"{empty} {empty} {empty} {empty} \\u20aa {empty} {empty} {empty} {empty} {empty} {empty} \\u05bf {empty} {bksp}\",\r\n    \"{tab} {empty} {empty} \\u20ac {empty} {empty} {empty} \\u05f0 {empty} {empty} {empty} {empty} {empty} {empty}\",\r\n    \"{empty} {empty} {empty} {empty} {empty} \\u05f2 \\u05f1 {empty} {empty} {empty} {empty} {enter}\",\r\n    \"{shift} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {empty} {shift}\",\r\n    \"{accept} {alt} {space} {alt} {cancel}\"\r\n  ],\r\n  getDefaultDiplay() {\r\n    return {\r\n      \"{bksp}\": \"backspace\",\r\n      \"{backspace}\": \"backspace\",\r\n      \"{enter}\": \"< enter\",\r\n      \"{shift}\": \"shift\",\r\n      \"{shiftleft}\": \"shift\",\r\n      \"{shiftright}\": \"shift\",\r\n      \"{alt}\": \"alt\",\r\n      \"{s}\": \"shift\",\r\n      \"{tab}\": \"tab\",\r\n      \"{lock}\": \"caps\",\r\n      \"{capslock}\": \"caps\",\r\n      \"{accept}\": \"Submit\",\r\n      \"{space}\": \"רווח\",\r\n      \"{//}\": \" \",\r\n      \"{esc}\": \"esc\",\r\n      \"{escape}\": \"esc\",\r\n      \"{f1}\": \"f1\",\r\n      \"{f2}\": \"f2\",\r\n      \"{f3}\": \"f3\",\r\n      \"{f4}\": \"f4\",\r\n      \"{f5}\": \"f5\",\r\n      \"{f6}\": \"f6\",\r\n      \"{f7}\": \"f7\",\r\n      \"{f8}\": \"f8\",\r\n      \"{f9}\": \"f9\",\r\n      \"{f10}\": \"f10\",\r\n      \"{f11}\": \"f11\",\r\n      \"{f12}\": \"f12\",\r\n      \"{numpaddivide}\": \"/\",\r\n      \"{numlock}\": \"lock\",\r\n      \"{arrowup}\": \"↑\",\r\n      \"{arrowleft}\": \"←\",\r\n      \"{arrowdown}\": \"↓\",\r\n      \"{arrowright}\": \"→\",\r\n      \"{prtscr}\": \"print\",\r\n      \"{scrolllock}\": \"scroll\",\r\n      \"{pause}\": \"pause\",\r\n      \"{insert}\": \"ins\",\r\n      \"{home}\": \"home\",\r\n      \"{pageup}\": \"up\",\r\n      \"{delete}\": \"del\",\r\n      \"{forwarddelete}\": \"del\",\r\n      \"{end}\": \"end\",\r\n      \"{pagedown}\": \"down\",\r\n      \"{numpadmultiply}\": \"*\",\r\n      \"{numpadsubtract}\": \"-\",\r\n      \"{numpadadd}\": \"+\",\r\n      \"{numpadenter}\": \"enter\",\r\n      \"{period}\": \".\",\r\n      \"{numpaddecimal}\": \".\",\r\n      \"{numpad0}\": \"0\",\r\n      \"{numpad1}\": \"1\",\r\n      \"{numpad2}\": \"2\",\r\n      \"{numpad3}\": \"3\",\r\n      \"{numpad4}\": \"4\",\r\n      \"{numpad5}\": \"5\",\r\n      \"{numpad6}\": \"6\",\r\n      \"{numpad7}\": \"7\",\r\n      \"{numpad8}\": \"8\",\r\n      \"{numpad9}\": \"9\",\r\n    }\r\n  }\r\n}\r\n","import { KeyboardLayout } from \"./keyboard-layout\"\r\nexport const Numeric: KeyboardLayout =\r\n{\r\n    name: \"numeric\",\r\n    lang: \"num\",\r\n    default: ['7 8 9 {b}',\r\n        '4 5 6 {empty}',\r\n        '1 2 3 {clear}',\r\n        '{accept} 0 {dec} {c}'],\r\n    shift: [],\r\n  alt: [],\r\n  getDefaultDiplay() {\r\n    return {\r\n      \"{empty}\": \" \",\r\n      \"{bksp}\": \"backspace\",\r\n      \"{backspace}\": \"backspace\",\r\n      \"{enter}\": \"< enter\",\r\n      \"{alt}\": \"alt\",\r\n      \"{s}\": \"shift\",\r\n      \"{tab}\": \"tab\",\r\n      \"{lock}\": \"caps\",\r\n      \"{capslock}\": \"caps\",\r\n      \"{accept}\": \"✔\",\r\n      \"{space}\": \" \",\r\n      \"{esc}\": \"esc\",\r\n      \"{dec}\": \".\"\r\n    }\r\n  }\r\n}\r\n\r\nexport const Numeric_Minus: KeyboardLayout =\r\n{\r\n  name: \"numeric\",\r\n  lang: \"num_minus\",\r\n  default: ['7 8 9 {bksp}',\r\n    '4 5 6 -',\r\n    '1 2 3 {clear}',\r\n    '{accept} 0 {dec} {c}'],\r\n  shift: [],\r\n  alt: [],\r\n  getDefaultDiplay() {\r\n    return {\r\n      \"{bksp}\": \"backspace\",\r\n      \"{backspace}\": \"backspace\",\r\n      \"{enter}\": \"< enter\",\r\n      \"{shift}\": \"shift\",\r\n      \"{shiftleft}\": \"shift\",\r\n      \"{shiftright}\": \"shift\",\r\n      \"{alt}\": \"alt\",\r\n      \"{s}\": \"shift\",\r\n      \"{tab}\": \"tab\",\r\n      \"{lock}\": \"caps\",\r\n      \"{capslock}\": \"caps\",\r\n      \"{accept}\": \"✔\",\r\n      \"{space}\": \" \",\r\n      \"{//}\": \" \",\r\n      \"{esc}\": \"esc\",\r\n      \"{escape}\": \"esc\",\r\n      \"{f1}\": \"f1\",\r\n      \"{f2}\": \"f2\",\r\n      \"{f3}\": \"f3\",\r\n      \"{f4}\": \"f4\",\r\n      \"{f5}\": \"f5\",\r\n      \"{f6}\": \"f6\",\r\n      \"{f7}\": \"f7\",\r\n      \"{f8}\": \"f8\",\r\n      \"{f9}\": \"f9\",\r\n      \"{f10}\": \"f10\",\r\n      \"{f11}\": \"f11\",\r\n      \"{f12}\": \"f12\",\r\n      \"{numpaddivide}\": \"/\",\r\n      \"{numlock}\": \"lock\",\r\n      \"{arrowup}\": \"↑\",\r\n      \"{arrowleft}\": \"←\",\r\n      \"{arrowdown}\": \"↓\",\r\n      \"{arrowright}\": \"→\",\r\n      \"{prtscr}\": \"print\",\r\n      \"{scrolllock}\": \"scroll\",\r\n      \"{pause}\": \"pause\",\r\n      \"{insert}\": \"ins\",\r\n      \"{home}\": \"home\",\r\n      \"{pageup}\": \"up\",\r\n      \"{delete}\": \"del\",\r\n      \"{forwarddelete}\": \"del\",\r\n      \"{end}\": \"end\",\r\n      \"{pagedown}\": \"down\",\r\n      \"{numpadmultiply}\": \"*\",\r\n      \"{numpadsubtract}\": \"-\",\r\n      \"{numpadadd}\": \"+\",\r\n      \"{numpadenter}\": \"enter\",\r\n      \"{period}\": \".\",\r\n      \"{numpaddecimal}\": \".\",\r\n      \"{numpad0}\": \"0\",\r\n      \"{numpad1}\": \"1\",\r\n      \"{numpad2}\": \"2\",\r\n      \"{numpad3}\": \"3\",\r\n      \"{numpad4}\": \"4\",\r\n      \"{numpad5}\": \"5\",\r\n      \"{numpad6}\": \"6\",\r\n      \"{numpad7}\": \"7\",\r\n      \"{numpad8}\": \"8\",\r\n      \"{numpad9}\": \"9\",\r\n    }\r\n  }\r\n}\r\n","import { Hebrew } from \"./hebrew\";\r\nimport { English } from \"./english\";\r\nimport { Emoji } from \"./emoji\";\r\nimport { Numeric, Numeric_Minus } from \"./numeric\";\r\n\r\nexport interface KeyboardLayout {\r\n  lang: string;\r\n  name: string;\r\n  default: string[];\r\n  shift: string[];\r\n  alt: string[];\r\n  getDefaultDiplay(): { [button: string]: string };\r\n}\r\n//This variable contain the all keyboard layouts language \r\nexport const AllKeyboardsLayout = new Map<string, KeyboardLayout>([[Hebrew.lang, Hebrew],\r\n  [English.lang, English],\r\n  [Emoji.lang,Emoji],\r\n  [Numeric.lang, Numeric],\r\n  [Numeric_Minus.lang, Numeric_Minus]]);\r\n//This method get language and return KeyboardLayout\r\nexport const getKeyboardLayout = (lang: string): KeyboardLayout | undefined => {\r\n  var keyboardLayout: KeyboardLayout | undefined;\r\n  keyboardLayout = AllKeyboardsLayout.get(lang);\r\n  if (keyboardLayout == undefined) {\r\n    keyboardLayout = AllKeyboardsLayout.get(\"en\");\r\n  }\r\n  return keyboardLayout;\r\n};\r\n\r\n/**\r\n * Default button display labels\r\n * This method We declare in English/Hebrew layout, because for each specific keyboard layout there is unique declarations\r\n * For example for Hebrew layout We declare the space like this: \"{space}\": \"רווח\"  \r\n */\r\n  //export const getDefaultDiplay = () => {\r\n  //  return {\r\n  //    \"{bksp}\": \"backspace\",\r\n  //    \"{backspace}\": \"backspace\",\r\n  //    \"{enter}\": \"< enter\",\r\n  //    \"{shift}\": \"shift\",\r\n  //    \"{shiftleft}\": \"shift\",\r\n  //    \"{shiftright}\": \"shift\",\r\n  //    \"{alt}\": \"alt\",\r\n  //    \"{s}\": \"shift\",\r\n  //    \"{tab}\": \"tab\",\r\n  //    \"{lock}\": \"caps\",\r\n  //    \"{capslock}\": \"caps\",\r\n  //    \"{accept}\": \"Submit\",\r\n  //    \"{space}\": \" \",\r\n  //    \"{//}\": \" \",\r\n  //    \"{esc}\": \"esc\",\r\n  //    \"{escape}\": \"esc\",\r\n  //    \"{f1}\": \"f1\",\r\n  //    \"{f2}\": \"f2\",\r\n  //    \"{f3}\": \"f3\",\r\n  //    \"{f4}\": \"f4\",\r\n  //    \"{f5}\": \"f5\",\r\n  //    \"{f6}\": \"f6\",\r\n  //    \"{f7}\": \"f7\",\r\n  //    \"{f8}\": \"f8\",\r\n  //    \"{f9}\": \"f9\",\r\n  //    \"{f10}\": \"f10\",\r\n  //    \"{f11}\": \"f11\",\r\n  //    \"{f12}\": \"f12\",\r\n  //    \"{numpaddivide}\": \"/\",\r\n  //    \"{numlock}\": \"lock\",\r\n  //    \"{arrowup}\": \"↑\",\r\n  //    \"{arrowleft}\": \"←\",\r\n  //    \"{arrowdown}\": \"↓\",\r\n  //    \"{arrowright}\": \"→\",\r\n  //    \"{prtscr}\": \"print\",\r\n  //    \"{scrolllock}\": \"scroll\",\r\n  //    \"{pause}\": \"pause\",\r\n  //    \"{insert}\": \"ins\",\r\n  //    \"{home}\": \"home\",\r\n  //    \"{pageup}\": \"up\",\r\n  //    \"{delete}\": \"del\",\r\n  //    \"{forwarddelete}\": \"del\",\r\n  //    \"{end}\": \"end\",\r\n  //    \"{pagedown}\": \"down\",\r\n  //    \"{numpadmultiply}\": \"*\",\r\n  //    \"{numpadsubtract}\": \"-\",\r\n  //    \"{numpadadd}\": \"+\",\r\n  //    \"{numpadenter}\": \"enter\",\r\n  //    \"{period}\": \".\",\r\n  //    \"{numpaddecimal}\": \".\",\r\n  //    \"{numpad0}\": \"0\",\r\n  //    \"{numpad1}\": \"1\",\r\n  //    \"{numpad2}\": \"2\",\r\n  //    \"{numpad3}\": \"3\",\r\n  //    \"{numpad4}\": \"4\",\r\n  //    \"{numpad5}\": \"5\",\r\n  //    \"{numpad6}\": \"6\",\r\n  //    \"{numpad7}\": \"7\",\r\n  //    \"{numpad8}\": \"8\",\r\n  //    \"{numpad9}\": \"9\",\r\n  //  };\r\n  //}\r\n\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject, Subject } from 'rxjs';\r\nimport { VirtualKeyboardComponent } from '../virtual-keyboard.component';\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class VirtualKeyboardEventsService {\r\n\r\n  private eventSubject = new BehaviorSubject<VirtualKeyboardComponent | null>(null);\r\n  //In the VK component there is attribute parameter like: 'acceptWithIDCallBack'\r\n  //<lib-VirtualKeyboard [language]=\"'en'\" [acceptWithIDCallBack]=\"acceptWithVK_ID\" [vk_id]=\"'007'\"></lib-VirtualKeyboard>\r\n  //This attribute is like function pointer, and will called when we click on 'Accept' key. \r\n  //The 'acceptWithVK_ID'  function can only activate superficial things,\r\n  //and you should not call the objects from this function, \r\n  //objects that are defined within the application, \r\n  //since this method is called by the virtual keyboard and does not have the app 'this' object so we will get this error:\r\n  //Cannot read properties of undefined (reading 'xxx')\r\n  //To fix that problem We need to declare accept event that will capture at app component, And then We can used and execute complicated thing    \r\n  private acceptSubject = new BehaviorSubject<VirtualKeyboardComponent | null>(null);\r\n  constructor() { }\r\n\r\n\r\n  emitEvent(event: VirtualKeyboardComponent) {\r\n    this.eventSubject.next(event);\r\n  }\r\n\r\n  getEvent() {\r\n    return this.eventSubject.asObservable();\r\n  }\r\n\r\n  acceptEvent(event: VirtualKeyboardComponent) {\r\n    this.acceptSubject.next(event);\r\n  }\r\n\r\n  getAcceptEvent() {\r\n    return this.acceptSubject.asObservable();\r\n  }\r\n}\r\n","import { AfterViewInit, Component, ElementRef, EventEmitter, HostListener, Input, OnInit, Output, Renderer2, ViewChild } from '@angular/core';\nimport { KeyboardLayout, getKeyboardLayout } from './interfaces/keyboards-layout/keyboard-layout';\nimport { KeyboardHandlerEvent, KeyboardInput, KeyboardOptions } from './interfaces/interfaces';\nimport { Position } from './interfaces/position';\nimport { KeyActions } from './interfaces/key-actions';\nimport { VirtualKeyboardEventsService } from './services/virtual-keyboard-events.service';\n\n@Component({\n  selector: 'vk-virtual-keyboard',\n  template: `\n  <div (click)=\"$event.stopPropagation()\">\n  <div [hidden]=\"is_display_text_input == true ? false : true\">\n    <input #message type=\"text\" name=\"message\" [dir]=\"vk_dir\" [readOnly]=\"vk_is_readonly\" value=\"\" style=\"width:100%;\"\n           (keyup)=\"handleKeyUp($event)\"\n           (keydown)=\"handleKeyDown($event)\"\n           (mouseup)=\"handleMouseUp($event)\"\n           (touchend)=\"handleTouchEnd($event)\"\n           (select)=\"handleSelect($event)\"\n           (focusout)=\"handleFocusOut($event)\"\n           (focus)=\"handleFocusIn($event)\"\n           (selectionchange)=\"handleSelectionChange($event)\" />\n\n  </div>\n  </div>\n\n  <div #div_keyboard [class]=\"keyboard_css\" dir=\"ltr\" data-skinstance=\"simpleKeyboard\" *ngIf=\"keyboardLayout && vk_is_visible\"\n       [style.left.px]=\"keyboardPosition.x\"\n             [style.top.px]=\"keyboardPosition.y\">\n    <div class=\"hg-rows\">\n      <div class=\"hg-row\" *ngFor='let row_layout of keyboardLayout.default; let i = index'>\n        <ng-container *ngFor='let bbb of row_layout.split(\" \");let j = index'>\n          <div [ngClass]=\"'hg-button ' + getButtonClass(bbb)+ ' ' + css.keyButton + ''  \" [attr.data-skbtn]=\"bbb\" [attr.data-skbtnuid]=\"'default-r' + i + 'b' + j\" (click)=\"onClick($event,bbb)\">\n            <span>{{getButtonDisplayName(bbb)}}</span>\n          </div>\n        </ng-container>\n      </div>\n    </div>\n  </div>\n\n  `,\n  styles: [` \n    .hg-theme-default {\n    /*width: 100%;*/\n    user-select: none;\n    box-sizing: border-box;\n    overflow: hidden;\n    touch-action: manipulation;\n    font-family: \"HelveticaNeue-Light\", \"Helvetica Neue Light\", \"Helvetica Neue\", Helvetica, Arial, \"Lucida Grande\", sans-serif;\n    background-color: #ececec;\n    padding: 5px;\n    border-radius: 5px;\n  }\n  .hg-theme-default .hg-button span {\n    pointer-events: none;\n  }\n\n  /* When using option \"useButtonTag\" */\n  .hg-theme-default button.hg-button {\n    border-width: 0;\n    outline: 0;\n    font-size: inherit;\n  }\n\n  .hg-theme-default .hg-button {\n    display: inline-block;\n    flex-grow: 1;\n    cursor: pointer;\n  }\n\n  .hg-theme-default .hg-row {\n    display: flex;\n  }\n\n    .hg-theme-default .hg-row:not(:last-child) {\n      margin-bottom: 5px;\n    }\n\n    .hg-theme-default .hg-row .hg-button:not(:last-child) {\n      margin-right: 5px;\n    }\n\n    .hg-theme-default .hg-row .hg-button-container {\n      margin-right: 5px;\n    }\n\n    .hg-theme-default .hg-row > div:last-child {\n      margin-right: 0;\n    }\n\n    .hg-theme-default .hg-row .hg-button-container {\n      display: flex;\n    }\n\n  .hg-theme-default .hg-button {\n    box-shadow: 0px 0px 3px -1px rgba(0, 0, 0, 0.3);\n    height: 40px;\n    border-radius: 5px;\n    box-sizing: border-box;\n    padding: 5px;\n    background: white;\n    border-bottom: 1px solid #b5b5b5;\n    cursor: pointer;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n  }\n\n    .hg-theme-default .hg-button.hg-standardBtn {\n      width: 20px;\n    }\n\n    .hg-theme-default .hg-button.hg-activeButton {\n      background: #efefef;\n    }\n\n  .hg-theme-default.hg-layout-numeric .hg-button {\n    width: 33.3%;\n    height: 60px;\n    align-items: center;\n    display: flex;\n    justify-content: center;\n  }\n\n  .hg-theme-default .hg-button.hg-button-numpadadd {\n    height: 85px;\n  }\n\n  .hg-theme-default .hg-button.hg-button-numpadenter {\n    height: 85px;\n  }\n\n  .hg-theme-default .hg-button.hg-button-numpad0 {\n    width: 105px;\n  }\n\n  .hg-theme-default .hg-button.hg-button-com {\n    max-width: 85px;\n  }\n\n  .hg-theme-default .hg-button.hg-standardBtn.hg-button-at {\n    max-width: 45px;\n  }\n  \n\n  .hg-theme-default .hg-button.hg-selectedButton {\n    background: rgba(5, 25, 70, 0.53);\n    color: white;\n  }\n\n  .hg-theme-default .hg-button.hg-standardBtn[data-skbtn=\".com\"] {\n    max-width: 82px;\n  }\n\n  .hg-theme-default .hg-button.hg-standardBtn[data-skbtn=\"@\"] {\n    max-width: 60px;\n  }\n\n\n\n\n\n/* keyboard - jQuery UI Widget */\n.ui-keyboard {\n  text-align: center;\n  padding: .3em;\n  position: fixed;\n  /*left: 0;\n  top: 0;*/\n  z-index: 16000;\n  /* see issue #484 */\n  -ms-touch-action: manipulation;\n  touch-action: manipulation;\n}\n\n.ui-keyboard-has-focus {\n  z-index: 16001;\n}\n\n.ui-keyboard div {\n  font-size: 1.1em;\n}\n\n/* see http://nicolasgallagher.com/another-css-image-replacement-technique/ */\n.hg-button-empty span, .hg-button-empty {\n\tfont: 0/0 a;\n\ttext-shadow: none;\n\tcolor: transparent;\n}\n\n\n/*\n.ui-keyboard-button {\n\theight: 2em;\n\tmin-width: 2em;\n\tmargin: .1em;\n\tcursor: pointer;\n\toverflow: hidden;\n\tline-height: 2em;\n\t-moz-user-focus: ignore;\n}\n.ui-keyboard-button span {\n\tpadding: 0;\n\tmargin: 0;\n\twhite-space: nowrap;\n\tdisplay: inline-block;\n}\n*/\n\n  `]\n})\nexport class VirtualKeyboardComponent implements OnInit, AfterViewInit {\n  @Input() keyboardLayout: KeyboardLayout | undefined;\n  @Input() language: string | undefined;\n  //This variable declare the input text direction ('rtl','ltr')\n  //The user can setting the input text direction \n  @Input() vk_dir: string = \"ltr\";\n  //This variable declare the input text if We completely remove this element from the DOM tree. (true,false)\n  //The user can setting the input text displaying  \n  @Input() is_display_text_input: boolean = true;\n  //This variable declare us if we display the VK or not\n  //For example if we have external keyboard and we don't wont the VK then we will set the variable to 'false'\n  @Input() vk_is_visible: boolean = true;\n  //This variable declare the input text if he readonly or not \n  @Input() vk_is_readonly: boolean = false;\n  //This variable declare the virtual keyboard id. \n  //With this parameter we notify the 'acceptWithIDCallBack' with this id param.\n  //For example when we declare the call back method at the father, and we click on 'accept' button then we will \n  //Execute this method with this parameter. With this param We can know who is element    \n  @Input() vk_id: string | undefined;\n  //Usually the user uses VK as it is, that is, he adds the VK component directly to his application and it also includes a text box,\n  //However, there are times when the user defines his own text box and therefore wants the VK component to know how to work with his text box. In such a situation when the user defines his own text box for him, we will make sure to make our text box disappear from the VK component and we will have to define all the events for the user's text box\n  //This is the variable that pass as attribute and contain the external input text.\n  @Input() text_input_element!: HTMLInputElement;\n  @Input() validateCallBack!: (args: string) => boolean;\n  @Input() acceptCallBack!: (args: string) => boolean | void;\n  @Input() acceptWithIDCallBack!: (vk_id: string, text: string) => any | void;\n  //This value contain the text input  \n  @ViewChild('message') _input!: ElementRef<HTMLInputElement>;\n  //This value contain the virtual keyboard div \n  @ViewChild('div_keyboard') div_keyboard!: ElementRef<HTMLDivElement>;\n  //https://dev.to/chiangs/how-im-starting-my-own-angular-component-library-part-1---generic-button-3f3m\n  //This event that come from the application, and deal with accept click.\n  //With this event we can declare the method that treatment with this event in the parent app \n  @Output() acceptClick: EventEmitter<VirtualKeyboardComponent>;\n  //This for the keyboard position\n  keyboardPosition!: Position;\n  //This variable keeps the window size.\n  //With this variable We will know how to position the virtual keyboard, \n  //For example if the input text is located in the end of the window, We wont to prevent display the virtual keyboard under the input text element,\n  //Instead We wont to display the virtual keyboard above the input text filed  \n  public getScreenWidth: any;\n  public getScreenHeight: any;\n  //this variable responsible declare for us if we will show the shift keyboard or the default keyboard\n  //This variable represent the state keyboard\n  isShiftOn: boolean = false;\n  //This variable save the Default keyboard, By this saving the Default keyboard We can know replace the\n  //keyboardLayout.default when We click on 'shift' in the HTML code\n  //*ngFor='let row_layout of keyboardLayout.default; let i = index' \n  defaultKeyboardLayout: string[] = [];\n  input!: HTMLInputElement;\n  defaultName = \"default\";\n  activeInputElement: HTMLInputElement | HTMLTextAreaElement | null = null;\n  keyboard_css: string = '';\n  //This variable declare for us if We make changing text value after We click on 'accept' button,\n  //If We click on 'accept' button and We pass the validation then We need to change the final text value\n  //Otherwise (if We not passing the validation process) then We need to return back to the previous text.       \n  textBeforeAccept: string = '';\n\n  //When we wont to allow initialize the text filed with value, We do that with this variable\n  private value: string | undefined;\n  @Input() set valueFiled(_value: string) {\n    this.value = _value;\n    //Here We check if We need to initialize the VK text filed with value that supply as attribute \n    //!!! Before We initialize the input text, We need to show if his already create...\n    //This object created when ngAfterViewInit execute --> this.input = <HTMLInputElement>this._input.nativeElement\n    if (this.input != undefined)\n      this.input.value = this.value;\n  }\n\n  /**\n   * Getters\n   */\n  getOptions = (): KeyboardOptions => this.options;\n  getCaretPosition = (): number | null => this.caretPosition;\n  getCaretPositionEnd = (): number | null => this.caretPositionEnd;\n\n  keyActions!: KeyActions;\n  options!: KeyboardOptions;\n  caretPosition!: number | null;\n  caretPositionEnd!: number | null;\n  /**\n * @type {boolean} Boolean value that shows whether maxLength has been reached\n */\n  maxLengthReached!: boolean;\n\n\n\n  css = {\n    default: 'simple-keyboard hg-theme-default hg-layout-default',\n    // keyboard id suffix\n    idSuffix: '_keyboard',\n    // class name to set initial focus\n    initialFocus: 'keyboard-init-focus',\n    // element class names\n    input: 'ui-keyboard-input',\n    inputClone: 'ui-keyboard-preview-clone',\n    wrapper: 'ui-keyboard-preview-wrapper',\n    preview: 'ui-keyboard-preview',\n    keyboard: 'ui-keyboard',\n    keySet: 'ui-keyboard-keyset',\n    keyButton: 'ui-keyboard-button',\n    keyWide: 'ui-keyboard-widekey',\n    keyPrefix: 'ui-keyboard-',\n    keyText: 'ui-keyboard-text', // span with button text\n    keyHasActive: 'ui-keyboard-hasactivestate',\n    keyAction: 'ui-keyboard-actionkey',\n    keySpacer: 'ui-keyboard-spacer', // empty keys\n    keyToggle: 'ui-keyboard-toggle',\n    keyDisabled: 'ui-keyboard-disabled',\n    // Class for BRs with a div wrapper inside of contenteditable\n    divWrapperCE: 'ui-keyboard-div-wrapper',\n    // states\n    locked: 'ui-keyboard-lockedinput',\n    alwaysOpen: 'ui-keyboard-always-open',\n    noKeyboard: 'ui-keyboard-nokeyboard',\n    placeholder: 'ui-keyboard-placeholder',\n    hasFocus: 'ui-keyboard-has-focus',\n    isCurrent: 'ui-keyboard-input-current',\n    // validation & autoaccept\n    inputValid: 'ui-keyboard-valid-input',\n    inputInvalid: 'ui-keyboard-invalid-input',\n    inputAutoAccepted: 'ui-keyboard-autoaccepted',\n    endRow: 'ui-keyboard-button-endrow' // class added to <br>\n  };\n\n  self = this;\n\n\n  constructor(private renderer: Renderer2, private keyboardEventsService: VirtualKeyboardEventsService,\n    private elementRef: ElementRef) {\n\n    this.caretPosition = 0;\n    this.caretPositionEnd = 0;\n\n    this.options = {\n      layoutName: \"default\",\n      theme: \"hg-theme-default\",\n      inputName: \"default\",\n      preventMouseDownDefault: false,\n      enableLayoutCandidates: true,\n      excludeFromLayout: {},\n      debug: true\n      //validate: null,\n      //accept: null\n      //In the constructor the validateCallBack is not initialize yet.\n      //validate: this.validateCallBack\n\n\n      //validate: function (/* keyboard, value, isClosing */) {\n      //  return true;\n      //}\n      //validate: function () {\n      //  return true;\n      //}\n    };\n    this.keyboard_css = this.css.default;\n\n    this.keyboardPosition = {\n      x: 0,\n      y: 0\n    }\n\n    this.acceptClick = new EventEmitter<VirtualKeyboardComponent>();\n  }\n  ngAfterViewInit(): void {\n    //Usually the user uses VK as it is, that is, he adds the VK component directly to his application and it also includes a text box,\n    this.input = <HTMLInputElement>this._input.nativeElement;\n    //if the user defines his own text box and therefore wants us to add the VK on it.\n    //In such a situation when the user defines his own text box for the VK, \n    //we will make sure to make our text box disappear and we will have to define all the events for the user's text box\n    if (this.text_input_element != undefined) {\n      //We need to declare the events for the external text input\n      //  (keyup)=\"handleKeyUp($event)\"\n      //  (keydown)=\"handleKeyDown($event)\"\n      //  (mouseup)=\"handleMouseUp($event)\"\n      //  (touchend)=\"handleTouchEnd($event)\"\n      //  (select)=\"handleSelect($event)\"\n      //  (focusout)=\"handleFocusOut($event)\"\n      //  (focus)=\"handleFocusIn($event)\"\n      //  (selectionchange)=\"handleSelectionChange($event)\" \n      this.text_input_element.addEventListener('keyup', this.handleKeyUp.bind(this));\n      this.text_input_element.addEventListener('keydown', this.handleKeyDown.bind(this));\n      this.text_input_element.addEventListener('mouseup', this.handleMouseUp.bind(this));\n      this.text_input_element.addEventListener('touchend', this.handleTouchEnd.bind(this));\n      this.text_input_element.addEventListener('select', this.handleSelect.bind(this));\n      this.text_input_element.addEventListener('focusout', this.handleFocusOut.bind(this));\n      this.text_input_element.addEventListener('focus', this.handleFocusIn.bind(this));\n      this.text_input_element.addEventListener('selectionchange', this.handleSelectionChange.bind(this));\n      //We need to hide the 'message' input element, because if the user pass as attribute external text input\n      //We need to work on him and We need to disable the 'message' element.\n      this._input.nativeElement.hidden = true;\n      this.input = this.text_input_element;\n    }\n    //In the default We wont to hide the keyboard, And When We focus on the text input We wont to show the keyboard.\n    this.div_keyboard.nativeElement.hidden = true;\n\n    //In the past we declare the key actions in the options object \n    //this.options.validate = this.validateCallBack;\n    //this.options.accept = this.acceptCallBack;\n\n    this.keyActions = {\n      validate: this.validateCallBack,\n      accept: this.acceptCallBack,\n      accept_with_id: this.acceptWithIDCallBack\n    };\n\n\n    //Here We check if We need to initialize the VK text filed with value that supply as attribute \n    if (this.value != undefined) {\n      this.input.value = this.value;\n    }\n\n  }\n  ngOnInit(): void {\n    if (this.keyboardLayout == undefined) {\n      if (this.language != undefined) {\n        this.keyboardLayout = getKeyboardLayout(this.language);\n      }\n      else {\n        this.keyboardLayout = getKeyboardLayout('en');\n      }\n      if (this.keyboardLayout?.default != undefined)\n        this.defaultKeyboardLayout = this.keyboardLayout.default;\n    }\n\n    //We initialize the variable of the window size\n    this.getScreenWidth = window.innerWidth;\n    this.getScreenHeight = window.innerHeight;\n\n\n    // 👇️ const input: HTMLInputElement | null\n    //this.input = <HTMLInputElement>this._input.nativeElement;\n    //this.input = document.getElementById('message') as HTMLInputElement;\n    //this.activeInputElement = this.input;\n    /**\n   * setEventListeners\n   */\n    //this.setEventListeners();\n\n\n    //Here We define the event listener, When We click on the focus on the input we will capture the event here\n    //!!!!! We don't use her to capture the input focus event, Because this is not working well We cannot hide external data like this:\n    // data.div_keyboard.nativeElement.hidden = true; this is not work. To fix that We need to capture the event in the parent component\n    // And then We need to show the child component and to hide the others children's component \n    //this.keyboardEventsService.getEvent().subscribe(data => {\n    //  if (data != null) {\n    //    alert(this.div_keyboard.nativeElement.hidden);\n    //    if (data != this) {\n    //    data.div_keyboard.nativeElement.hidden = true;\n    //    if (data.language == this.language) {\n    //      this.div_keyboard.nativeElement.hidden == false;\n    //      alert('We need to show:' + this.language);\n    //    }\n    //    else {\n    //      alert('We need to hide:' + this.language);\n    //      this.div_keyboard.nativeElement.hidden == true;\n\n    //    }\n    //    alert(':' + data.language);\n    //    }\n    //    else {\n    //      data.div_keyboard.nativeElement.hidden = false;\n    //    }\n    //  }\n    //});\n\n\n\n  }\n\n  //https://www.c-sharpcorner.com/article/how-to-detect-event-on-clicks-outside-in-angular-application/\n  @HostListener('document: click', ['$event.target']) onMouseEnter(targetElement: any) {\n    //the 'elementRef' contain the VK element. \n    //When we click on some of the document We will check if We click outside from the VK.\n    const clickInside = this.elementRef.nativeElement.contains(targetElement);\n    if (!clickInside) { //If We click outside the VK then \n      //There can be problem before We hide the VK, the problem is:\n      //When we edit the input text but We don't click on 'accept', And we dispatch 'document:click' event, We wont\n      //To prevent editing the VK input text without accepting, because when We declare accept method, We don't make any\n      //text change without making accept before. \n      //All we need to do is:\n      //this.input.value = this.textBeforeAccept;\n      //A better solution. Before I will just explain that when performing:\n      //document:click\n      //All VKs will respond, even those that are already closed and not displayed. \n      //Therefore, if we want to allow a change of the text even without clicking 'accept',\n      //We will be able to know about the changes and respond accordingly. \n      //When a 'document:click' event occurred I will see which of the VK is 'hidden = true',\n      //Then I will trigger a \"acceptClick.emit(this)\" event and at the application level I can catch this event and respond accordingly\n      //But don't forget to make validation to this text before you accept him, if there is validation method\n      if (this.div_keyboard.nativeElement.hidden == false && this.input.value != this.textBeforeAccept)\n        this.startAcceptingProcess();\n      //In the default We wont to hide the keyboard, And When We focus on the text input We wont to show the keyboard.\n      this.div_keyboard.nativeElement.hidden = true;\n    }\n  }\n\n\n  //!!!! this not work so well, because when i click on some of the key in the VK, this event will trigger up\n  //     And We will hide this VK  that the reason we create the code above to check if we click outside the element\n  // @HostListener('document:click', ['$event']) onDocumentClick(event: Event) {\n  //   //There can be problem before We hide the VK, the problem is:\n  //   //When we edit the input text but We don't click on 'accept', And we dispatch 'document:click' event, We wont\n  //   //To prevent editing the VK input text without accepting, because when We declare accept method, We don't make any\n  //   //text change without making accept before. \n  //   //All we need to do is:\n  //   //this.input.value = this.textBeforeAccept;\n  //   //A better solution. Before I will just explain that when performing:\n  //   //document:click\n  //   //All VKs will respond, even those that are already closed and not displayed. \n  //   //Therefore, if we want to allow a change of the text even without clicking 'accept',\n  //   //We will be able to know about the changes and respond accordingly. \n  //   //When a 'document:click' event occurred I will see which of the VK is 'hidden = true',\n  //   //Then I will trigger a \"acceptClick.emit(this)\" event and at the application level I can catch this event and respond accordingly\n  //   //But don't forget to make validation to this text before you accept him, if there is validation method\n  //   if(this.div_keyboard.nativeElement.hidden == false && this.input.value != this.textBeforeAccept)\n  //     this.startAcceptingProcess();\n  //   //In the default We wont to hide the keyboard, And When We focus on the text input We wont to show the keyboard.\n  //   this.div_keyboard.nativeElement.hidden = true;\n  // }\n\n  @HostListener('window:resize', ['$event'])\n  onWindowResize() {\n    //After we change the window size, We wont to keeps the new size \n    this.getScreenWidth = window.innerWidth;\n    this.getScreenHeight = window.innerHeight;\n    //console.log(\"Width/Height = \", this.getScreenWidth + ',' + this.getScreenHeight);\n  }\n\n\n  //In this code We try to declare event and notify the component when this event send...\n  //But how We calling to this  event??? We wont to hide the all keyboard when We focus on some specific keyboard...\n  //We need to find how to make broadcast event ...\n  //We need to delete this line of code\n  //https://medium.com/@Armandotrue/broadcasting-events-in-angular-b85289a4d685\n  @HostListener('experiment')\n  activeFunction() {\n    alert('yyyyyyyyyyddddddbbbkkkk');\n  }\n\n\n\n\n\n  /**\n   * Returns the display (label) name for a given button\n   *\n   * @param  {string} button The button's layout name\n   * @param  {object} display The provided display option\n   * @param  {boolean} mergeDisplay Whether the provided param value should be merged with the default one.\n   */\n  getButtonDisplayName(button: string) {\n    /**\n     * Replaces variable buttons (such as `{bksp}`) with a human-friendly name (e.g.: `backspace`).\n     */\n    let display: { [button: string]: string } | undefined;\n\n    if (this.options.mergeDisplay) {\n      //display = Object.assign({}, getDefaultDiplay(), display);\n      display = Object.assign({}, this.keyboardLayout?.getDefaultDiplay(), display);\n    } else {\n      //display = display || getDefaultDiplay();\n      display = display || this.keyboardLayout?.getDefaultDiplay();\n    }\n    if (display != undefined)\n      return display[button] || button;\n    else\n      return button;\n  }\n\n  /**\n * Default button display labels\n * !!!! We declare this method at KeyboardLayout interface,\n * Because this is the most correct place to define this method\n */\n  //getDefaultDiplay() {\n  //  return {\n  //    \"{bksp}\": \"backspace\",\n  //    \"{backspace}\": \"backspace\",\n  //    \"{enter}\": \"< enter\",\n  //    \"{shift}\": \"shift\",\n  //    \"{shiftleft}\": \"shift\",\n  //    \"{shiftright}\": \"shift\",\n  //    \"{alt}\": \"alt\",\n  //    \"{s}\": \"shift\",\n  //    \"{tab}\": \"tab\",\n  //    \"{lock}\": \"caps\",\n  //    \"{capslock}\": \"caps\",\n  //    \"{accept}\": \"Submit\",\n  //    \"{space}\": \" \",\n  //    \"{//}\": \" \",\n  //    \"{esc}\": \"esc\",\n  //    \"{escape}\": \"esc\",\n  //    \"{f1}\": \"f1\",\n  //    \"{f2}\": \"f2\",\n  //    \"{f3}\": \"f3\",\n  //    \"{f4}\": \"f4\",\n  //    \"{f5}\": \"f5\",\n  //    \"{f6}\": \"f6\",\n  //    \"{f7}\": \"f7\",\n  //    \"{f8}\": \"f8\",\n  //    \"{f9}\": \"f9\",\n  //    \"{f10}\": \"f10\",\n  //    \"{f11}\": \"f11\",\n  //    \"{f12}\": \"f12\",\n  //    \"{numpaddivide}\": \"/\",\n  //    \"{numlock}\": \"lock\",\n  //    \"{arrowup}\": \"↑\",\n  //    \"{arrowleft}\": \"←\",\n  //    \"{arrowdown}\": \"↓\",\n  //    \"{arrowright}\": \"→\",\n  //    \"{prtscr}\": \"print\",\n  //    \"{scrolllock}\": \"scroll\",\n  //    \"{pause}\": \"pause\",\n  //    \"{insert}\": \"ins\",\n  //    \"{home}\": \"home\",\n  //    \"{pageup}\": \"up\",\n  //    \"{delete}\": \"del\",\n  //    \"{forwarddelete}\": \"del\",\n  //    \"{end}\": \"end\",\n  //    \"{pagedown}\": \"down\",\n  //    \"{numpadmultiply}\": \"*\",\n  //    \"{numpadsubtract}\": \"-\",\n  //    \"{numpadadd}\": \"+\",\n  //    \"{numpadenter}\": \"enter\",\n  //    \"{period}\": \".\",\n  //    \"{numpaddecimal}\": \".\",\n  //    \"{numpad0}\": \"0\",\n  //    \"{numpad1}\": \"1\",\n  //    \"{numpad2}\": \"2\",\n  //    \"{numpad3}\": \"3\",\n  //    \"{numpad4}\": \"4\",\n  //    \"{numpad5}\": \"5\",\n  //    \"{numpad6}\": \"6\",\n  //    \"{numpad7}\": \"7\",\n  //    \"{numpad8}\": \"8\",\n  //    \"{numpad9}\": \"9\",\n  //  };\n  //}\n\n  /**\n * Adds default classes to a given button\n *\n * @param  {string} button The button's layout name\n * @return {string} The classes to be added to the button\n */\n  getButtonClass(button: string): string {\n    const buttonTypeClass = this.getButtonType(button);\n    const buttonWithoutBraces = button.replace(\"{\", \"\").replace(\"}\", \"\");\n    let buttonNormalized = \"\";\n\n    if (buttonTypeClass !== \"standardBtn\")\n      buttonNormalized = ` hg-button-${buttonWithoutBraces}`;\n\n    return `hg-${buttonTypeClass}${buttonNormalized}`;\n  }\n\n  /**\n * Retrieve button type\n *\n * @param  {string} button The button's layout name\n * @return {string} The button type\n */\n  getButtonType(button: string): string {\n    return button.includes(\"{\") && button.includes(\"}\") && button !== \"{//}\"\n      ? \"functionBtn\"\n      : \"standardBtn\";\n  }\n\n\n  /**\n   * Calculate caret position offset when using rtl option\n   */\n  getRtlOffset(index: number, input: string) {\n    let newIndex = index;\n    const startMarkerIndex = input.indexOf(\"\\u202B\");\n    const endMarkerIndex = input.indexOf(\"\\u202C\");\n\n    if (startMarkerIndex < index && startMarkerIndex != -1) { newIndex--; }\n    if (endMarkerIndex < index && startMarkerIndex != -1) { newIndex--; }\n\n    return newIndex < 0 ? 0 : newIndex;\n  }\n\n\n  /**\n   * Adds a string to the input at a given position\n   *\n   * @param  {string} source The source input\n   * @param  {string} str The string to add\n   * @param  {number} position The (cursor) position where the string should be added\n   * @param  {boolean} moveCaret Whether to update simple-keyboard's cursor\n   */\n  addStringAt(\n    source: string,\n    str: string,\n    position = source.length,\n    positionEnd = source.length,\n    moveCaret = false\n  ) {\n    let output;\n\n    if (!position && position !== 0) {\n      output = source + str;\n    } else {\n      output = [source.slice(0, position), str, source.slice(positionEnd)].join(\n        \"\"\n      );\n\n      /**\n       * Avoid caret position change when maxLength is set\n       */\n      if (!this.isMaxLengthReached()) {\n        if (moveCaret) this.updateCaretPos(str.length);\n      }\n    }\n\n    return output;\n  }\n\n  /**\n   * Determines whether the maxLength has been reached. This function is called when the maxLength option it set.\n   *\n   * @param  {object} inputObj\n   * @param  {string} updatedInput\n   */\n  handleMaxLength(updatedInput: string) {\n    const options = this.getOptions();\n    const maxLength = options.maxLength;\n    const currentInput = this.input.value;\n    const condition = updatedInput.length - 1 >= maxLength;\n\n    if (\n      /**\n       * If pressing this button won't add more characters\n       * We exit out of this limiter function\n       */\n      updatedInput.length <= currentInput.length\n    ) {\n      return false;\n    }\n\n    if (Number.isInteger(maxLength)) {\n      if (options.debug) {\n        console.log(\"maxLength (num) reached:\", condition);\n      }\n\n      if (condition) {\n        /**\n         * @type {boolean} Boolean value that shows whether maxLength has been reached\n         */\n        this.maxLengthReached = true;\n        return true;\n      } else {\n        this.maxLengthReached = false;\n        return false;\n      }\n    }\n\n    if (typeof maxLength === \"object\") {\n      const condition =\n        updatedInput.length - 1 >= maxLength[options.inputName || \"default\"];\n\n      if (options.debug) {\n        console.log(\"maxLength (obj) reached:\", condition);\n      }\n\n      if (condition) {\n        this.maxLengthReached = true;\n        return true;\n      } else {\n        this.maxLengthReached = false;\n        return false;\n      }\n    }\n    return true; //Default value\n  }\n\n\n  /**\n * Moves the cursor position by a given amount\n *\n * @param  {number} length Represents by how many characters the input should be moved\n * @param  {boolean} minus Whether the cursor should be moved to the left or not.\n */\n  updateCaretPos(length: number, minus = false) {\n    const newCaretPos = this.updateCaretPosAction(length, minus);\n    this.setCaretPosition(newCaretPos);\n    //this.dispatch((instance: any) => {\n    //  instance.setCaretPosition(newCaretPos);\n    //});\n  }\n\n  /**\n   * Action method of updateCaretPos\n   *\n   * @param  {number} length Represents by how many characters the input should be moved\n   * @param  {boolean} minus Whether the cursor should be moved to the left or not.\n   */\n  updateCaretPosAction(length: number, minus = false) {\n    const options = this.getOptions();\n    let caretPosition = this.getCaretPosition();\n\n    if (caretPosition != null) {\n      if (minus) {\n        if (caretPosition > 0) caretPosition = caretPosition - length;\n      } else {\n        caretPosition = caretPosition + length;\n      }\n    }\n\n    if (options.debug) {\n      console.log(\"Caret at 3:\", caretPosition);\n    }\n\n    return caretPosition;\n  }\n\n\n  /**\n   * Returns the updated input resulting from clicking a given button\n   *\n   * @param  {string} button The button's layout name\n   * @param  {string} input The input string\n   * @param  {number} caretPos The cursor's current position\n   * @param  {number} caretPosEnd The cursor's current end position\n   * @param  {boolean} moveCaret Whether to update simple-keyboard's cursor\n   */\n  getUpdatedInput(\n    button: string,\n    input: string,\n    caretPos: any,\n    caretPosEnd = caretPos,\n    moveCaret = false\n  ) {\n    const options = this.getOptions();\n    const commonParams: [number | undefined, number | undefined, boolean] = [\n      caretPos,\n      caretPosEnd,\n      moveCaret,\n    ];\n\n    let output = input;\n\n    if (\n      (button === \"{bksp}\" || button === \"{backspace}\") &&\n      output.length > 0\n    ) {\n      output = this.removeAt(output, ...commonParams);\n    } else if (\n      (button === \"{delete}\" || button === \"{forwarddelete}\") &&\n      output.length > 0\n    ) {\n      output = this.removeForwardsAt(output, ...commonParams);\n    } else if (button === \"{space}\")\n      output = this.addStringAt(output, \" \", ...commonParams);\n    else if (\n      button === \"{tab}\" &&\n      !(\n        typeof options.tabCharOnTab === \"boolean\" &&\n        options.tabCharOnTab === false\n      )\n    ) {\n      output = this.addStringAt(output, \"\\t\", ...commonParams);\n    } else if (\n      (button === \"{enter}\" || button === \"{numpadenter}\") &&\n      options.newLineOnEnter\n    )\n      output = this.addStringAt(output, \"\\n\", ...commonParams);\n    else if (\n      button.includes(\"numpad\") &&\n      Number.isInteger(Number(button[button.length - 2]))\n    ) {\n      output = this.addStringAt(\n        output,\n        button[button.length - 2],\n        ...commonParams\n      );\n    }\n    else if (button === \"{shift}\") {\n      if (this.isShiftOn) {\n        this.isShiftOn = false;\n        if (this.keyboardLayout?.default != undefined)\n          this.keyboardLayout.default = this.defaultKeyboardLayout;\n      }\n      else {\n        this.isShiftOn = true;\n        if (this.keyboardLayout?.default != undefined)\n          this.keyboardLayout.default = this.keyboardLayout?.shift;\n      }\n    }\n    else if (button === \"{accept}\") {\n      // //When We click on 'accept' We need to capture this clicking and accept the typing...\n      // //if (this.options.validate != null)\n      // //  if (this.options.validate(this.input.value)) {\n      // //    if (this.options.accept != null) {\n      // //      this.options.accept(this.input.value);\n      // //    }\n      // //  }\n      // //  else {\n\n      // //  }\n      // if (this.keyActions.validate != undefined) {\n      //   if (this.keyActions.validate(this.input.value)) {\n      //     if (this.keyActions.accept != undefined) {\n      //       this.keyActions.accept(this.input.value);\n      //       this.textBeforeAccept = this.input.value;\n      //       //After WE pass the validation and We make the accept event then We need to hide the virtual keyboard\n      //       this.div_keyboard.nativeElement.hidden = true; \n      //     }\n      //     else {\n      //       this.textBeforeAccept = this.input.value;\n      //       //After WE pass the validation We need to hide the virtual keyboard\n      //       this.div_keyboard.nativeElement.hidden = true;\n      //     }\n      //     if (this.keyActions.accept_with_id != undefined &&  this.vk_id != undefined){ \n      //       this.keyActions.accept_with_id(this.vk_id,this.input.value);\n      //     }\n\n      //     this.keyboardEventsService.acceptEvent(this);            \n      //   }\n      //   else {\n      //     //If we failed in validation process then We need to re-back to previous text\n      //     this.input.value = this.textBeforeAccept;\n      //     //WE don't hide the virtual keyboard because We don't pass the validation\n      //   }\n      // } \n      // else { //If We don't declare validation then We skipping right to the accept method\n      //   if (this.keyActions.accept != undefined) {\n      //     this.keyActions.accept(this.input.value);\n      //   }\n      //   if (this.keyActions.accept_with_id != undefined &&  this.vk_id != undefined) {\n      //   this.keyActions.accept_with_id(this.vk_id,this.input.value);\n      //   }\n      //   this.textBeforeAccept = this.input.value;\n      //   //After WE pass the validation and We make the accept event then We need to hide the virtual keyboard\n      //   this.div_keyboard.nativeElement.hidden = true;\n      //   this.keyboardEventsService.acceptEvent(this);            \n      // }\n\n      this.startAcceptingProcess();\n    }\n    else if (button === \"{clear}\") {\n      this.input.value = \"\";\n    }\n    else if (button === \"{numpaddivide}\")\n      output = this.addStringAt(output, \"/\", ...commonParams);\n    else if (button === \"{numpadmultiply}\")\n      output = this.addStringAt(output, \"*\", ...commonParams);\n    else if (button === \"{numpadsubtract}\")\n      output = this.addStringAt(output, \"-\", ...commonParams);\n    else if (button === \"{numpadadd}\")\n      output = this.addStringAt(output, \"+\", ...commonParams);\n    else if (button === \"{numpaddecimal}\" || button === \"{dec}\")\n      output = this.addStringAt(output, \".\", ...commonParams);\n    else if (button === \"{\" || button === \"}\")\n      output = this.addStringAt(output, button, ...commonParams);\n    else if (!button.includes(\"{\") && !button.includes(\"}\"))\n      output = this.addStringAt(output, button, ...commonParams);\n\n    if (options.debug) {\n      console.log(\"Input will be: \" + output);\n    }\n\n    return output;\n  }\n  /**\n * Gets the current value of maxLengthReached\n */\n  isMaxLengthReached() {\n    return Boolean(this.maxLengthReached);\n  }\n\n  /**\n   * Removes an amount of characters before a given position\n   *\n   * @param  {string} source The source input\n   * @param  {number} position The (cursor) position from where the characters should be removed\n   * @param  {boolean} moveCaret Whether to update simple-keyboard's cursor\n   */\n  removeAt(\n    source: string,\n    position = source.length,\n    positionEnd = source.length,\n    moveCaret = false\n  ) {\n    if (position === 0 && positionEnd === 0) {\n      return source;\n    }\n\n    let output;\n\n    if (position === positionEnd) {\n      let prevTwoChars;\n      let emojiMatched;\n      const emojiMatchedReg = /([\\uD800-\\uDBFF][\\uDC00-\\uDFFF])/g;\n\n      /**\n       * Emojis are made out of two characters, so we must take a custom approach to trim them.\n       * For more info: https://mathiasbynens.be/notes/javascript-unicode\n       */\n      if (position && position >= 0) {\n        prevTwoChars = source.substring(position - 2, position);\n        emojiMatched = prevTwoChars.match(emojiMatchedReg);\n\n        if (emojiMatched) {\n          output = source.substr(0, position - 2) + source.substr(position);\n          if (moveCaret) this.updateCaretPos(2, true);\n        } else {\n          output = source.substr(0, position - 1) + source.substr(position);\n          if (moveCaret) this.updateCaretPos(1, true);\n        }\n      } else {\n        prevTwoChars = source.slice(-2);\n        emojiMatched = prevTwoChars.match(emojiMatchedReg);\n\n        if (emojiMatched) {\n          output = source.slice(0, -2);\n          if (moveCaret) this.updateCaretPos(2, true);\n        } else {\n          output = source.slice(0, -1);\n          if (moveCaret) this.updateCaretPos(1, true);\n        }\n      }\n    } else {\n      output = source.slice(0, position) + source.slice(positionEnd);\n      if (moveCaret) {\n        //this.dispatch((instance: any) => {\n        this.setCaretPosition(position);\n        //});\n      }\n    }\n\n    return output;\n  }\n\n  /**\n   * Removes an amount of characters after a given position\n   *\n   * @param  {string} source The source input\n   * @param  {number} position The (cursor) position from where the characters should be removed\n   */\n  removeForwardsAt(\n    source: string,\n    position: number = source.length,\n    positionEnd: number = source.length,\n    moveCaret = false\n  ) {\n    if (!source?.length || position === null) {\n      return source;\n    }\n\n    let output;\n\n    if (position === positionEnd) {\n      const emojiMatchedReg = /([\\uD800-\\uDBFF][\\uDC00-\\uDFFF])/g;\n\n      /**\n       * Emojis are made out of two characters, so we must take a custom approach to trim them.\n       * For more info: https://mathiasbynens.be/notes/javascript-unicode\n       */\n      const nextTwoChars = source.substring(position, position + 2);\n      const emojiMatched = nextTwoChars.match(emojiMatchedReg);\n\n      if (emojiMatched) {\n        output = source.substr(0, position) + source.substr(position + 2);\n      } else {\n        output = source.substr(0, position) + source.substr(position + 1);\n      }\n    } else {\n      output = source.slice(0, position) + source.slice(positionEnd);\n      if (moveCaret) {\n        //this.dispatch((instance: any) => {\n        this.setCaretPosition(position);\n        //});\n      }\n    }\n\n    return output;\n  }\n\n\n  /**\n   * Set the keyboard’s input.\n   * @param  {string} input the input value\n   * @param  {string} inputName optional - the internal input to select\n   */\n  setInput(input_value: string,\n    skipSync?: boolean): void {\n    this.input.value = input_value;\n  }\n  /**\n * Send a command to all simple-keyboard instances (if you have several instances).\n */\n  syncInstanceInputs(): void {\n    //this.dispatch((instance: SimpleKeyboard) => {\n    //this.replaceInput(this.input);\n    this.setCaretPosition(this.caretPosition, this.caretPositionEnd);\n    //});\n  }\n  /**\n * Check whether the button is a standard button\n */\n  isStandardButton = (button: string) =>\n    button && !(button[0] === \"{\" && button[button.length - 1] === \"}\");\n\n  /**\n   * Changes the internal caret position\n   * @param {number} position The caret's start position\n   * @param {number} positionEnd The caret's end position\n   */\n  setCaretPosition(position: number | null, endPosition = position): void {\n    this.caretPosition = position;\n    this.caretPositionEnd = endPosition;\n    console.warn('caretPosition:' + this.caretPosition + ',caretPositionEnd:' + this.caretPositionEnd);\n  }\n\n\n\n  onClick(event: Event, button: string) {\n\n    const buttonDOM = event.target as HTMLButtonElement;\n    //this.input.focus();\n    this.handleButtonClicked(buttonDOM, event);\n    this._setCaretPosition(this.getCaretPosition());\n\n  }\n\n  setCurrent() {\n    //var kbcss = $keyboard.css,\n    //  // close any \"isCurrent\" keyboard (just in case they are always open)\n    //  $current = $('.' + kbcss.isCurrent),\n    //  kb = $current.data('keyboard');\n    //// close keyboard, if not self\n    //if (!$.isEmptyObject(kb) && kb.el !== base.el) {\n    //  kb.close(kb.options.autoAccept ? 'true' : false);\n    //}\n    //$current.removeClass(kbcss.isCurrent);\n    //// ui-keyboard-has-focus is applied in case multiple keyboards have\n    //// alwaysOpen = true and are stacked\n    //$('.' + kbcss.hasFocus).removeClass(kbcss.hasFocus);\n\n    //base.$el.addClass(kbcss.isCurrent);\n    //base.$preview.focus();\n    //base.$keyboard.addClass(kbcss.hasFocus);\n    //base.isCurrent(true);\n    //base.isOpen = true;\n  }\n\n\n\n  /**\n   * Handles clicks made to keyboard buttons\n   * @param  {string} button The button's layout name.\n   */\n  handleButtonClicked(button: HTMLButtonElement, e?: KeyboardHandlerEvent): void {\n    const { inputName = this.defaultName, debug } = this.options;\n\n    let button_value: string = '';\n    let temp: string | null = button.getAttribute('data-skbtn');\n    //alert('temp:' + temp);\n    if (temp !== null)\n      button_value = temp;\n\n\n    /**\n     * Ignoring placeholder buttons\n     */\n    if (button_value === \"{//}\") return;\n\n    /**\n     * Calculating new input\n     */\n    const updatedInput = this.getUpdatedInput(\n      button_value,\n      this.input.value,\n      this.caretPosition,\n      this.caretPositionEnd\n    );\n\n    /**\n     * EDGE CASE: Check for whole input selection changes that will yield same updatedInput\n     */\n    if (this.isStandardButton(button_value) && this.activeInputElement) {\n      const isEntireInputSelection =\n        this.input &&\n        this.input.value === updatedInput &&\n        this.caretPosition === 0 &&\n        this.caretPositionEnd === updatedInput.length;\n\n      if (isEntireInputSelection) {\n        this.setInput(\"\", true);\n        this.setCaretPosition(0);\n        this.activeInputElement.value = \"\";\n        this.activeInputElement.setSelectionRange(0, 0);\n        this.handleButtonClicked(button, e);\n        return;\n      }\n    }\n\n    /**\n     * Calling onKeyPress\n     */\n    if (typeof this.options.onKeyPress === \"function\") {\n      //We can define in option function pointer that execute when we press on button, For all buttons...\n      //(don't forget that this \"handelButtonClicked\" also execute)\n      //this.options.onKeyPress(button, e);\n    }\n\n    if (\n      // If input will change as a result of this button press\n      this.input.value !== updatedInput &&\n      // This pertains to the \"inputPattern\" option:\n      // If inputPattern isn't set\n      (!this.options.inputPattern ||\n        // Or, if it is set and if the pattern is valid - we proceed.\n        (this.options.inputPattern && this.inputPatternIsValid(updatedInput)))\n    ) {\n      /**\n       * If maxLength and handleMaxLength yield true, halting\n       */\n      if (\n        this.options.maxLength &&\n        this.handleMaxLength(updatedInput)\n      ) {\n        return;\n      }\n\n      /**\n       * Updating input\n       */\n      const newInputValue = this.getUpdatedInput(\n        button_value,\n        this.input.value,\n        this.caretPosition,\n        this.caretPositionEnd,\n        true\n      );\n\n      this.setInput(newInputValue, true);\n\n      //if (debug) console.log(\"Input changed:\", this.getAllInputs());\n\n\n      //this._setCaretPosition(this.getCaretPosition() as number);\n\n      if (this.options.debug) {\n        console.log(\n          \"Caret at 2: \",\n          this.getCaretPosition(),\n          this.getCaretPositionEnd(),\n          `(xxx)`,\n          e?.type\n        );\n      }\n\n      /**\n       * Enforce syncInstanceInputs, if set\n       */\n      if (this.options.syncInstanceInputs) this.syncInstanceInputs();\n\n      /**\n       * Calling onChange\n       */\n      if (typeof this.options.onChange === \"function\")\n        this.options.onChange(this.getInput(this.options.inputName, true), e);\n\n      /**\n       * Calling onChangeAll\n       */\n      //if (typeof this.options.onChangeAll === \"function\")\n      //  this.options.onChangeAll(this.getAllInputs(), e);\n\n      /**\n       * Check if this new input has candidates (suggested words)\n       */\n      // https://hodgef.com/simple-keyboard/documentation/options/layoutcandidates/\n      //  if (e?.target && this.options.enableLayoutCandidates) {\n      //    const { candidateKey, candidateValue } =\n      //      this.getInputCandidates(updatedInput);\n\n      //    if (candidateKey && candidateValue) {\n      //      this.showCandidatesBox(\n      //        candidateKey,\n      //        candidateValue,\n      //        this.keyboardDOM\n      //      );\n      //    } else {\n      //      this.candidateBox?.destroy();\n      //    }\n      //  }\n      //}\n\n      /**\n       * After a button is clicked the selection (if any) will disappear\n       * we should reflect this in our state, as applicable\n       */\n      console.warn('1:');\n      if (this.caretPositionEnd && this.caretPosition !== this.caretPositionEnd) {\n        this.setCaretPosition(this.caretPositionEnd, this.caretPositionEnd);\n        console.warn('2:');\n        if (this.input) {\n          this.input.setSelectionRange(this.caretPositionEnd, this.caretPositionEnd);\n          console.warn('3:');\n        }\n\n        if (this.options.debug) {\n          console.log(\"Caret position aligned\", this.caretPosition);\n        }\n      }\n\n      if (debug) {\n        console.log(\"Key pressed:\", button);\n      }\n    }\n\n  }\n\n\n  _setCaretPosition(position: number | null) {\n    // Modern browsers\n    //alert(position);\n    //if (position == null) {\n    //  this.input.focus();\n    //  this.input.setSelectionRange(1, 1);\n    //  alert(position);\n    //}\n    //else {\n    //  this.input.focus();\n    //  this.input.setSelectionRange(position, position);\n    //}\n\n\n    this.input.focus();\n    this.input.setSelectionRange(position, position);\n\n    // IE8 and below\n    //} else if (ctrl.createTextRange) {\n    //  var range = ctrl.createTextRange();\n    //  range.collapse(true);\n    //  range.moveEnd('character', pos);\n    //  range.moveStart('character', pos);\n    //  range.select();\n    //}\n  }\n\n\n\n  /**\n   * Called by {@link setEventListeners} when an event that warrants a cursor position update is triggered\n   */\n  caretEventHandler(event: KeyboardHandlerEvent): void {\n    //let targetTagName: string;\n    //if (event.target.tagName) {\n    //  targetTagName = event.target.tagName.toLowerCase();\n    //}\n\n    //this.dispatch((instance) => {\n    //let isKeyboard =\n    //  event.target === instance.keyboardDOM ||\n    //  (event.target && instance.keyboardDOM.contains(event.target));\n\n    /**\n     * If syncInstanceInputs option is enabled, make isKeyboard match any instance\n     * not just the current one\n     */\n    //if (this.options.syncInstanceInputs && Array.isArray(event.path)) {\n    //  isKeyboard = event.path.some((item: HTMLElement) =>\n    //    item?.hasAttribute?.(\"data-skInstance\")\n    //  );\n    //}\n\n    //if (\n    //  (targetTagName === \"textarea\" ||\n    //    (targetTagName === \"input\" &&\n    //      [\"text\", \"search\", \"url\", \"tel\", \"password\"].includes(\n    //        event.target.type\n    //      ))) &&\n    //  !instance.options.disableCaretPositioning\n    //) {\n    /**\n     * Tracks current cursor position\n     * As keys are pressed, text will be added/removed at that position within the input.\n     */\n    let selectionStart = this.input.selectionStart;\n    let selectionEnd = this.input.selectionEnd;\n\n    if (this.options.rtl) {\n      selectionStart = this.getRtlOffset(selectionStart as number, this.getInput());\n      selectionEnd = this.getRtlOffset(selectionEnd as number, this.getInput());\n    }\n\n    this.setCaretPosition(selectionStart, selectionEnd);\n\n    /**\n     * Tracking current input in order to handle caret positioning edge cases\n     */\n    this.activeInputElement = this.input;\n\n    if (this.options.debug) {\n      console.log(\n        \"Caret at 1: \",\n        this.getCaretPosition(),\n        this.getCaretPositionEnd(),\n        event && event.target.tagName.toLowerCase(),\n        `()`,\n        event?.type\n      );\n    }\n    //}\n    //else if (\n    //  (instance.options.disableCaretPositioning || !isKeyboard) &&\n    //  event?.type !== \"selectionchange\"\n    //) {\n    //  /**\n    //   * If we toggled off disableCaretPositioning, we must ensure caretPosition doesn't persist once reactivated.\n    //   */\n    //  instance.setCaretPosition(null);\n\n    //  /**\n    //   * Resetting activeInputElement\n    //   */\n    //  this.activeInputElement = null;\n\n    //  if (instance.options.debug) {\n    //    console.log(\n    //      `Caret position reset due to \"${event?.type}\" event`,\n    //      event\n    //    );\n    //  }\n    //}\n    //});\n    ////\n  }\n\n  /**\n   * This handles the \"inputPattern\" option\n   * by checking if the provided inputPattern passes\n   */\n  inputPatternIsValid(inputVal: string): boolean {\n    const inputPatternRaw = this.options.inputPattern;\n    let inputPattern;\n\n    /**\n     * Check if input pattern is global or targeted to individual inputs\n     */\n    if (inputPatternRaw instanceof RegExp) {\n      inputPattern = inputPatternRaw;\n    } else {\n      inputPattern =\n        inputPatternRaw[this.options.inputName || this.defaultName];\n    }\n\n    if (inputPattern && inputVal) {\n      const didInputMatch = inputPattern.test(inputVal);\n\n      if (this.options.debug) {\n        console.log(\n          `inputPattern (\"${inputPattern}\"): ${didInputMatch ? \"passed\" : \"did not pass!\"\n          }`\n        );\n      }\n\n      return didInputMatch;\n    } else {\n      /**\n       * inputPattern doesn't seem to be set for the current input, or input is empty. Pass.\n       */\n      return true;\n    }\n  }\n\n  /**\n   * Get the keyboard’s input (You can also get it from the onChange prop).\n   * @param  {string} [inputName] optional - the internal input to select\n   */\n  getInput(\n    inputName: string = this.options.inputName || this.defaultName,\n    skipSync = false\n  ): string {\n    /**\n     * Enforce syncInstanceInputs, if set\n     */\n    //    if (this.options.syncInstanceInputs && !skipSync) this.syncInstanceInputs();\n\n    if (this.options.rtl) {\n      // Remove existing control chars\n      const inputWithoutRTLControl = this.input.value\n        .replace(\"\\u202B\", \"\")\n        .replace(\"\\u202C\", \"\");\n\n      return \"\\u202B\" + inputWithoutRTLControl + \"\\u202C\";\n    } else {\n      return this.input.value;\n    }\n  }\n\n\n  /**\n * Send a command to all simple-keyboard instances at once (if you have multiple instances).\n * @param  {function(instance: object, key: string)} callback Function to run on every instance\n */\n  // eslint-disable-next-line no-unused-vars\n  dispatch(callback: (instance: this, key?: string) => void): void {\n\n    alert('dispatch');\n  }\n\n\n  /**\n   * Handles simple-keyboard event listeners\n   */\n  setEventListeners(): void {\n    /**\n     * Only first instance should set the event listeners\n     */\n    //if (this.isFirstKeyboardInstance || !this.allKeyboardInstances) {\n\n    const { physicalKeyboardHighlightPreventDefault = false } = this.options;\n\n    /**\n     * Event Listeners\n     */\n    this.input.addEventListener(\"keyup\", this.handleKeyUp, physicalKeyboardHighlightPreventDefault);\n    this.input.addEventListener(\"keydown\", this.handleKeyDown, physicalKeyboardHighlightPreventDefault);\n    this.input.addEventListener(\"mouseup\", this.handleMouseUp);\n    this.input.addEventListener(\"touchend\", this.handleTouchEnd);\n    this.input.addEventListener(\"selectionchange\", this.handleSelectionChange);\n    this.input.addEventListener(\"select\", this.handleSelect);\n\n  }\n\n  /**\n   * Event Handler: KeyUp\n   */\n  handleKeyUp(event: KeyboardHandlerEvent): void {\n    //alert('handleKeyUp');\n    this.input.focus();\n    this.caretEventHandler(event);\n\n    if (this.options.physicalKeyboardHighlight) {\n      //this.physicalKeyboard.handleHighlightKeyUp(event);\n    }\n  }\n\n  /**\n   * Event Handler: KeyDown\n   */\n  handleKeyDown(event: KeyboardHandlerEvent): void {\n    //alert('handleKeyDown');\n    if (this.options.physicalKeyboardHighlight) {\n      //this.physicalKeyboard.handleHighlightKeyDown(event);\n    }\n    if (event.keyCode === 13) {\n      this.startAcceptingProcess();\n      // rest of your code\n    }\n  }\n  /**\n   * Event Handler: Focus in, When we click on input and we focus in then we execute this method\n   */\n  handleFocusIn(event: KeyboardHandlerEvent): void {\n    //We select the all text at the input field  \n    <HTMLInputElement>event.target.select();\n  }\n\n  /**\n   * Event Handler: MouseUp\n   */\n  handleFocusOut(event: KeyboardHandlerEvent): void {\n    //When We finish focus on the input text, We need to check if the text we input is correct,\n    //We do that by calling to validation method.\n\n    //!!!!! there is problem, because when we focus on the input text the keyboard is come up,\n    //And when We press on the keyboard the trigger 'focus out' event is lunch even we still in the text input typing process.\n    //So We must to Therefore, in order to know when we are done typing, the simplest way is when you click the 'Confirm/accept' button,\n    //Only then will we update the text, without that we will not update it.\n    //Or in a second way, only when the user has exited the text box and also closed the keyboard, then we will activate the 'validation' function\n    //if (this.options.validate != null && this.div_keyboard.nativeElement.hidden)  --> this line of code don't work well,\n    //This condition be true only if focus out from the text input and also if we hide the keyboard\n    //if (this.options.validate != null && this.div_keyboard.nativeElement.hidden) {\n    //  this.options.validate(this.input.value);\n    //}\n    //else {\n\n    //}\n  }\n  /**\n   * Event Handler: MouseUp\n   */\n  handleMouseUp(event: KeyboardHandlerEvent): void {\n    //When We focus on the text input We wont to show the virtual keyboard.\n    this.keyboard_css = this.css.default + ' ' + this.css.isCurrent + ' ' + this.css.hasFocus + ' ' + this.css.keyboard;\n    this.keyboardEventsService.emitEvent(this);\n    //this.div_keyboard.nativeElement.hidden = false;\n    this.caretEventHandler(event);\n\n    //this.div_keyboard.nativeElement.offsetLeft --> X value;\n    //this.div_keyboard.nativeElement.offsetTop --> Y value;\n    //this.div_keyboard.nativeElement.offsetWidth --> The Width;\n    //this.div_keyboard.nativeElement.offsetHeight --> The height;\n\n    this.calculationPosition();\n\n    //this.keyboardPosition.y = this._input.nativeElement.getBoundingClientRect().y +(this._input.nativeElement.getBoundingClientRect().bottom - this._input.nativeElement.getBoundingClientRect().y ) ;\n    //this.keyboardPosition.x = this._input.nativeElement.getBoundingClientRect().x;\n\n\n\n\n    //console.log(\"datas = \", this._input.nativeElement.getBoundingClientRect());\n\n    //this.keyboardPosition.top = this.div_keyboard.nativeElement.getBoundingClientRect().y;\n    //this.keyboardPosition.left = this.div_keyboard.nativeElement.getBoundingClientRect().x;\n\n    //when We build our Virtual keyboard in dynamic html page like ngFor... We need to use with  'getBoundingClientRect'\n    //Instead of offsetTop/offsetLeft    \n    //this.keyboardPosition.top = this.div_keyboard.nativeElement.offsetTop + 5;\n    //this.keyboardPosition.left = this.div_keyboard.nativeElement.offsetLeft;\n\n\n  }\n\n  /**\n   * Event Handler: TouchEnd\n   */\n  /* istanbul ignore next */\n  handleTouchEnd(event: KeyboardHandlerEvent): void {\n    //alert('handleTouchEnd');\n    this.caretEventHandler(event);\n  }\n\n  /**\n   * Event Handler: Select\n   */\n  /* istanbul ignore next */\n  handleSelect(event: KeyboardHandlerEvent): void {\n    //alert('swelect');\n    this.caretEventHandler(event);\n  }\n\n  /**\n   * Event Handler: SelectionChange\n   */\n  /* istanbul ignore next */\n  handleSelectionChange(event: KeyboardHandlerEvent): void {\n    //alert('handleSelectionChange');\n\n    /**\n     * Firefox is not reporting the correct caret position through this event\n     * https://github.com/hodgef/simple-keyboard/issues/1839\n     */\n    if (navigator.userAgent.includes('Firefox')) {\n      return;\n    }\n    this.caretEventHandler(event);\n  }\n\n\n\n  /**\n   * This method responsible to calculate the virtual keyboard location.\n   * For example: If We click on the input text element We wont to display the virtual keyboard near to input text \n   * Sometimes the keyboard position will appear below the text and sometimes above, sometimes on the right and sometimes on the left\n   * Its all depend in the input text element position on the page.  \n   */\n  calculationPosition(): void {\n\n    //By the default, in the regular state We show the virtual keyboard below the input text \n    if ((this.input.getBoundingClientRect().y + this.input.getBoundingClientRect().height + this.getVK_Height()) <= this.getScreenHeight) {\n      //this.keyboardPosition.y = this._input.nativeElement.getBoundingClientRect().y - this._input.nativeElement.getBoundingClientRect().height ;\n      this.keyboardPosition.y = this.input.getBoundingClientRect().y + this.input.getBoundingClientRect().height;\n    }\n    else //We show the virtual keyboard above the input text \n    {\n      //this.keyboardPosition.y = this._input.nativeElement.getBoundingClientRect().y - this._input.nativeElement.getBoundingClientRect().height - this.getVK_Height();\n      this.keyboardPosition.y = this.input.getBoundingClientRect().y - this.getVK_Height();\n      //alert('2:' + this.keyboardPosition.y);\n    }\n    //After We located the Y coordinate We need to calculate the X coordinate. \n    if ((this.input.getBoundingClientRect().x + this.getVK_Width()) < this.getScreenWidth) {\n      this.keyboardPosition.x = this.input.getBoundingClientRect().x;\n    }\n    else //We show the virtual keyboard above the input text \n    {\n      this.keyboardPosition.x = this.input.getBoundingClientRect().x - this.getVK_Width();\n    }\n  }\n  /**\n   * This method responsible to return the virtual keyboard y1  \n   * !!! unused, We can delete this method\n   */\n  getVK_Y1(): number {\n    return this.div_keyboard.nativeElement.getBoundingClientRect().y;\n  }\n  /**\n * This method responsible to return the virtual keyboard x1 \n * !!! unused, We can delete this method \n */\n  getVK_X1(): number {\n    return this.div_keyboard.nativeElement.getBoundingClientRect().x;\n  }\n\n\n  /**\n   * This method responsible to return the virtual keyboard y2 \n   * !!! unused, We can delete this method \n   */\n  getVK_Y2(): number {\n    return this.div_keyboard.nativeElement.getBoundingClientRect().y + this.div_keyboard.nativeElement.getBoundingClientRect().height;\n  }\n  /**\n * This method responsible to return the virtual keyboard x2  \n * !!! unused, We can delete this method\n */\n  getVK_X2(): number {\n    return this.div_keyboard.nativeElement.getBoundingClientRect().x + this.div_keyboard.nativeElement.getBoundingClientRect().width;\n  }\n\n\n  /**\n   * This method responsible to return the virtual keyboard width  \n   */\n  getVK_Width(): number {\n    return this.div_keyboard.nativeElement.getBoundingClientRect().width;\n  }\n  /**\n   * This method responsible to return the virtual keyboard height  \n   */\n  getVK_Height(): number {\n    return this.div_keyboard.nativeElement.getBoundingClientRect().height;\n  }\n\n  /**\n   * This method execute when we typing on VK and We making 'accept' or we dispatch 'document:click'.\n   * This method responsible to making the validation process if his declare and to modify the new input text  \n   */\n  startAcceptingProcess() {\n    if (this.keyActions.validate != undefined) {\n      if (this.keyActions.validate(this.input.value)) {\n        this.textBeforeAccept = this.input.value;\n        //!!!!! We wont to make focus out from the input text after we click on 'accept'. I don't know how to do that\n\n        //After WE pass the validation and We make the accept event then We need to hide the virtual keyboard\n        this.div_keyboard.nativeElement.hidden = true;\n        this.keyboardEventsService.acceptEvent(this);\n        this.acceptClick.emit(this);\n      }\n      else {\n        //If we failed in validation process then We need to re-back to previous text\n        this.input.value = this.textBeforeAccept;\n        alert('There is problem with value');\n        //WE don't hide the virtual keyboard because We don't pass the validation\n      }\n    }\n    else { //If We don't declare validation then We skipping right to the accept method\n\n      this.textBeforeAccept = this.input.value;\n      //After WE pass the validation and We make the accept event then We need to hide the virtual keyboard\n      this.div_keyboard.nativeElement.hidden = true;\n      this.keyboardEventsService.acceptEvent(this);\n      this.acceptClick.emit(this);\n\n    }\n  }\n\n  // Action key function list\n  //Instead to use with this object, We create new interface 'KeyActions' that need to implementation the all key actions \n  keyaction = {\n    accept: function () {\n      //base.close(true); // same as base.accept();\n      return false; // return false prevents further processing\n    },\n    alt: function () {\n      //base.altActive = !base.altActive;\n      //base.showSet();\n    },\n    bksp: function () {\n      //if (base.isContentEditable) {\n      //  base.execCommand('delete');\n      //  // save new caret position\n      //  base.saveCaret();\n      //} else {\n      //  // the script looks for the '\\b' string and initiates a backspace\n      //  base.insertText('\\b');\n      //}\n    },\n    cancel: function () {\n      //base.close();\n      return false; // return false prevents further processing\n    },\n    clear: function () {\n      //base.$preview[base.isContentEditable ? 'text' : 'val']('');\n      //if (base.$decBtn.length) {\n      //  base.checkDecimal();\n      //}\n    },\n    combo: function () {\n      //var o = base.options,\n      //  c = !o.useCombos,\n      //  $combo = base.$keyboard.find('.' + $keyboard.css.keyPrefix + 'combo');\n      //o.useCombos = c;\n      //$combo\n      //  .toggleClass(o.css.buttonActive, c)\n      //  // update combo key state\n      //  .attr('title', $combo.attr('data-title') + ' (' + o.display[c ? 'active' : 'disabled'] + ')');\n      //if (c) {\n      //  base.checkCombos();\n      //}\n      return false;\n    },\n    dec: function () {\n      //base.insertText((base.decimal) ? '.' : ',');\n    },\n    del: function () {\n      //if (base.isContentEditable) {\n      //  base.execCommand('forwardDelete');\n      //} else {\n      //  // the script looks for the '{d}' string and initiates a delete\n      //  base.insertText('{d}');\n      //}\n    },\n    // resets to base keyset (deprecated because \"default\" is a reserved word)\n    'default': function () {\n      //base.shiftActive = base.altActive = base.metaActive = false;\n      //base.showSet();\n    },\n    // el is the pressed key (button) object; it is null when the real keyboard enter is pressed\n    enter: function (/*base, el, e*/) {\n      //var o = base.options;\n      //// shift+enter in textareas\n      //if (e.shiftKey) {\n      //  // textarea, input & contenteditable - enterMod + shift + enter = accept,\n      //  //  then go to prev; base.switchInput(goToNext, autoAccept)\n      //  // textarea & input - shift + enter = accept (no navigation)\n      //  return (o.enterNavigation) ? base.switchInput(!e[o.enterMod], true) : base.close(true);\n      //}\n      //// input only - enterMod + enter to navigate\n      //if (o.enterNavigation && (!base.isTextArea || e[o.enterMod])) {\n      //  return base.switchInput(!e[o.enterMod], o.autoAccept ? 'true' : false);\n      //}\n      //// pressing virtual enter button inside of a textarea - add a carriage return\n      //// e.target is span when clicking on text and button at other times\n      //if (base.isTextArea && $(e.target).closest('button').length) {\n      //  // IE8 fix (space + \\n) - fixes #71 thanks Blookie!\n      //  base.insertText(($keyboard.msie ? ' ' : '') + '\\n');\n      //}\n      //if (base.isContentEditable && !o.enterNavigation) {\n      //  base.execCommand('insertHTML', '<div><br class=\"' + $keyboard.css.divWrapperCE + '\"></div>');\n      //  // Using backspace on wrapped BRs will now shift the textnode inside of the wrapped BR\n      //  // Although not ideal, the caret is moved after the block - see the wiki page for\n      //  // more details: https://github.com/Mottie/Keyboard/wiki/Contenteditable#limitations\n      //  // move caret after a delay to allow rendering of HTML\n      //  setTimeout(function () {\n      //    $keyboard.keyaction.right(base);\n      //    base.saveCaret();\n      //  }, 0);\n      //}\n    },\n    // caps lock key\n    lock: function () {\n      //base.last.keyset[0] = base.shiftActive = base.capsLock = !base.capsLock;\n      //base.showSet();\n    },\n    left: function () {\n      //var p = $keyboard.caret(base.$preview);\n      //if (p.start - 1 >= 0) {\n      //  // move both start and end of caret (prevents text selection) & save caret position\n      //  base.last.start = base.last.end = p.start - 1;\n      //  $keyboard.caret(base.$preview, base.last);\n      //  base.setScroll();\n      //}\n    },\n    meta: function (/*base, el*/) {\n      //var $el = $(el);\n      //base.metaActive = !$el.hasClass(base.options.css.buttonActive);\n      //base.showSet($el.attr('data-name'));\n    },\n    next: function () {\n      //base.switchInput(true, base.options.autoAccept);\n      return false;\n    },\n    // same as 'default' - resets to base keyset\n    normal: function () {\n      //base.shiftActive = base.altActive = base.metaActive = false;\n      //base.showSet();\n    },\n    prev: function () {\n      //base.switchInput(false, base.options.autoAccept);\n      return false;\n    },\n    right: function () {\n      //var p = $keyboard.caret(base.$preview),\n      //  len = base.isContentEditable ? $keyboard.getEditableLength(base.el) : base.getValue().length;\n      //if (p.end + 1 <= len) {\n      //  // move both start and end of caret to end position\n      //  // (prevents text selection) && save caret position\n      //  base.last.start = base.last.end = p.end + 1;\n      //  $keyboard.caret(base.$preview, base.last);\n      //  base.setScroll();\n      //}\n    },\n    shift: function () {\n      //base.last.keyset[0] = base.shiftActive = !base.shiftActive;\n      //base.showSet();\n    },\n    sign: function () {\n      //var signRegex = base.decimal ? /^[+-]?\\d*\\.?\\d*$/ : /^[+-]?\\d*,?\\d*$/;\n      //if (signRegex.test(base.getValue())) {\n      //  var caret,\n      //    p = $keyboard.caret(base.$preview),\n      //    val = base.getValue(),\n      //    len = base.isContentEditable ? $keyboard.getEditableLength(base.el) : val.length;\n      //  base.setValue(val * -1);\n      //  caret = len - val.length;\n      //  base.last.start = p.start + caret;\n      //  base.last.end = p.end + caret;\n      //  $keyboard.caret(base.$preview, base.last);\n      //  base.setScroll();\n      //}\n    },\n    space: function () {\n      //base.insertText(' ');\n    },\n    tab: function () {\n      //var o = base.options;\n      //if (!base.isTextArea) {\n      //  if (o.tabNavigation) {\n      //    return base.switchInput(!base.shiftActive, true);\n      //  } else if (base.isInput) {\n      //    // ignore tab key in input\n      //    return false;\n      //  }\n      //}\n      //base.insertText('\\t');\n    },\n    toggle: function () {\n      //base.enabled = !base.enabled;\n      //base.toggle();\n    },\n    // *** Special action keys: NBSP & zero-width characters ***\n    // Non-breaking space\n    NBSP: '\\u00a0',\n    // zero width space\n    ZWSP: '\\u200b',\n    // Zero width non-joiner\n    ZWNJ: '\\u200c',\n    // Zero width joiner\n    ZWJ: '\\u200d',\n    // Left-to-right Mark\n    LRM: '\\u200e',\n    // Right-to-left Mark\n    RLM: '\\u200f'\n  };\n\n\n\n\n  /*\n     Position keyboard\n  */\n  /* ****************************************************************\n   * Position the keyboard\n   *https://github.com/the-darc/angular-virtual-keyboard/blob/master/src/vki-core.js\n   */\n  //VKI_position(force: string) {\n  //  /* ***** Build the keyboard interface ************************** */\n  //  //this.VKI_keyboard = document.createElement('table');\n  //  if (!self.VKI_relative) {\n  //    this.div_keyboard.nativeElement.style.position\n  //    this.div_keyboard.nativeElement.style.position = 'fixed';\n  //    this.div_keyboard.nativeElement.style.bottom = '0px';\n  //    this.div_keyboard.nativeElement.style.left = '0px';\n  //    this.div_keyboard.nativeElement.style.width = '100%';\n  //    return;\n  //  }\n  //  if (true) {\n  //    var kPos = this.VKI_findPos(this.div_keyboard.nativeElement), wDim = this.VKI_innerDimensions(), sDis = this.VKI_scrollDist();\n  //    var place = false, fudge = self.VKI_target.offsetHeight + 3;\n  //    if (self.VKI_forcePosition === 'top') {\n  //      fudge = -this.div_keyboard.nativeElement.offsetHeight - 3;\n  //    }\n  //    if (force !== true) {\n  //      if (kPos[1] + this.div_keyboard.nativeElement.offsetHeight - sDis[1] - wDim[1] > 0 && self.VKI_forcePosition !== 'bottom') {\n  //        place = true;\n  //        fudge = -this.div_keyboard.nativeElement.offsetHeight - 3;\n  //      } else if (kPos[1] - sDis[1] < 0) place = true;\n  //    }\n  //    if (place || force === true) {\n  //      var iPos = this.VKI_findPos(self.VKI_target), scr = self.VKI_target;\n  //      while (scr = scr.parentNode) {\n  //        if (scr == document.body) break;\n  //        if (scr.scrollHeight > scr.offsetHeight || scr.scrollWidth > scr.offsetWidth) {\n  //          if (!scr.getAttribute(\"VKI_scrollListener\")) {\n  //            scr.setAttribute(\"VKI_scrollListener\", true);\n  //            VKI_addListener(scr, 'scroll', function () { self.VKI_position(true); }, false);\n  //          } // Check if the input is in view\n  //          var pPos = VKI_findPos(scr), oTop = iPos[1] - pPos[1], oLeft = iPos[0] - pPos[0];\n  //          var top = oTop + self.VKI_target.offsetHeight;\n  //          var left = oLeft + self.VKI_target.offsetWidth;\n  //          var bottom = scr.offsetHeight - oTop - self.VKI_target.offsetHeight;\n  //          var right = scr.offsetWidth - oLeft - self.VKI_target.offsetWidth;\n  //          self.VKI_keyboard.style.display = (top < 0 || left < 0 || bottom < 0 || right < 0) ? \"none\" : \"\";\n  //          if (self.VKI_isIE6) self.VKI_iframe.style.display = (top < 0 || left < 0 || bottom < 0 || right < 0) ? \"none\" : \"\";\n  //        }\n  //      }\n  //      self.VKI_keyboard.style.top = iPos[1] - ((self.VKI_target.keyboardPosition == \"fixed\" && !self.VKI_isIE && !self.VKI_isMoz) ? sDis[1] : 0) + fudge + \"px\";\n  //      self.VKI_keyboard.style.left = Math.max(10, Math.min(wDim[0] - self.VKI_keyboard.offsetWidth - 25, iPos[0])) + \"px\";\n  //      if (self.VKI_isIE6) {\n  //        self.VKI_iframe.style.width = self.VKI_keyboard.offsetWidth + \"px\";\n  //        self.VKI_iframe.style.height = self.VKI_keyboard.offsetHeight + \"px\";\n  //        self.VKI_iframe.style.top = self.VKI_keyboard.style.top;\n  //        self.VKI_iframe.style.left = self.VKI_keyboard.style.left;\n  //      }\n  //    }\n  //    if (force === true) self.VKI_position();\n  //  }\n  //}\n\n  //VKI_findPos(obj: HTMLElement) {\n  //  var curleft: number = 0;\n  //  var curtop: number = 0;\n  //  var src: ParentNode | null = obj.parentNode;\n  //  while (src && src != document.body) {\n  //    curleft -= (<HTMLElement>src).scrollLeft || 0;\n  //    curtop -= (<HTMLElement>src).scrollTop || 0;\n  //  }\n  //  while (obj != (<HTMLElement>obj).offsetParent)\n  //  {\n  //    curleft += (<HTMLElement>obj).offsetLeft;\n  //    curtop += (<HTMLElement>obj).offsetTop;\n  //    obj = <HTMLElement>obj.offsetParent;\n  //  } \n  //  return [curleft, curtop];\n  //}\n\n  //VKI_innerDimensions() {\n  //  if (innerHeight) {\n  //    return [innerWidth, innerHeight];\n  //  } else if (document.documentElement && document.documentElement.clientHeight) {\n  //    return [document.documentElement.clientWidth, document.documentElement.clientHeight];\n  //  } else if (document.body)\n  //    return [document.body.clientWidth, document.body.clientHeight];\n  //  return [0, 0];\n  //}\n\n  //VKI_scrollDist() {\n  //  var html = document.getElementsByTagName('html')[0];\n  //  if (html.scrollTop && document.documentElement.scrollTop) {\n  //    return [html.scrollLeft, html.scrollTop];\n  //  } else if (html.scrollTop || document.documentElement.scrollTop) {\n  //    return [html.scrollLeft + document.documentElement.scrollLeft, html.scrollTop + document.documentElement.scrollTop];\n  //  } else if (document.body.scrollTop)\n  //    return [document.body.scrollLeft, document.body.scrollTop];\n  //  return [0, 0];\n  //}\n\n\n  /**\n   * Physical Keyboard Service\n   */\n\n\n\n}\n\n","import { Component, ElementRef, EventEmitter, HostListener, Input, Output, ViewChild } from '@angular/core';\nimport { KeyboardLayout, VirtualKeyboardEventsService, SearchResultService, SearchResultItem, Position, VirtualKeyboardComponent } from \"../../../public-api\";\n\n@Component({\n  selector: 'vk-search-result',\n  // template: `\n  // <p>search-result works!</p>\n  // <vk-virtual-keyboard [language]=language [vk_id]=\"vk_id\"></vk-virtual-keyboard>\n  // <div #div_search_result [class]=\"'simple-search-result'\">\n  // <ul class=\"typeahead typeahead-long dropdown-menu show\" style=\"position:absolute;z-index:10000;\" *ngIf=\"items\">\n  //     <ng-container *ngFor='let item of items;let j = index'>\n  //         <li data-value=\"'{{item.text}}'\" (click)=\"onSelectItemClick(item)\"> \n  //             <a href = \"#\" class=\"dropdown-item btn-lg\">\n  //                 <strong>{{item.text}}</strong>\n  //             </a>\n  //         </li>\n  //     </ng-container>\n  // </ul>    \n  // </div>\n  // `\n  //standalone: true,\n  templateUrl: './search-result.component.html',\n  //styleUrl: './search-result.component.css', \n  //imports: [VirtualKeyboardModule,CommonModule]\n})\nexport class SearchResultComponent<T> {\n\n  @Input() keyboardLayout: KeyboardLayout | undefined;\n  @Input() language: string | undefined;\n  //This variable declare the input text direction ('rtl','ltr')\n  //The user can setting the input text direction \n  @Input() vk_dir: string = \"ltr\";\n    //This variable declare us if we display the VK or not\n  //For example if we have external keyboard and we don't wont the VK then we will set the variable to 'false'\n  @Input() vk_is_visible: boolean = true;\n  //This variable declare the input text if he readonly or not \n  @Input() vk_is_readonly: boolean = false;\n  //This variable declare the virtual keyboard id. \n  //With this parameter we notify the 'acceptWithIDCallBack' with this id param.\n  //For example when we declare the call back method at the father, and we click on 'accept' button then we will \n  //Execute this method with this parameter. With this param We can know who is element. \n  @Input() vk_id: string | undefined;\n  //This variable declare the virtual keyboard value filed. \n  //For example when we wont to initialize the input text with value We can set the value with this variable.\n  @Input() value_filed: string = '';\n\n  //We can delete this input, This parameter is no longer used\n  @Input() validateCallBack!: (args: string) => boolean;\n  //We can delete this input, This parameter is no longer used\n  @Input() acceptCallBack!: (args: string) => boolean | void;\n  //We can delete this input, This parameter is no longer used\n  @Input() acceptWithIDCallBack!: (vk_id: string, text: string) => any | void;\n  //This variable declare the search result list\n  @Input() items: SearchResultItem<T>[] | undefined;\n  //This value contain the search result div \n  @ViewChild('div_search_result') div_search_result!: ElementRef<HTMLDivElement>;\n  //https://dev.to/chiangs/how-im-starting-my-own-angular-component-library-part-1---generic-button-3f3m\n  //This event that come from the application, and deal with item selected click.\n  //With this event we can declare the method that treatment with this event in the parent app \n  //@Output() itemSelectedClick: EventEmitter<SearchResultComponent<T>>;\n  @Output() itemSelectedClick: EventEmitter<SearchResultItem<T>>;\n  //This event that come from the application, and deal with accept click.\n  //With this event we can declare the method that treatment with this event in the parent app \n  //This vkAcceptClick help us to do couple of things,\n  //I will explain why We declare this variable,\n  //We defined the VK (sun) object inside the SVK (parent) object, \n  //There are some complex problems when defining an object inside an object and that is how to transfer variables as attributes to the sub-object (sun), \n  //Just non-complex variables I can simply define in the parent object and then pass them as parameters to the child object.\n  //For example:\n  //<vk-virtual-keyboard [language]=language [vk_id]=\"vk_id\"></vk-virtual-keyboard>\n  //We define @Input variables like 'language' in the same name in the parent and his child,  \n  //But when I want to transfer a method (acceptClick)=... how do I do it ?,\n  // I tried and failed, and only in the following way that I will explain I succeeded and that is:\n  //In the child object we defined a parameter that behaves as an event: @Output() acceptClick: EventEmitter<VirtualKeyboardComponent>,\n  // and also in the parent object I defined a parameter that behaves as an event:   @Output() vkAcceptClick: EventEmitter<SearchResultComponent<T>>  \n  //Inside the parent we will define a method that handles the child event and all it does is dispatch to the application level of the event\n  @Output() vkAcceptClick: EventEmitter<SearchResultComponent<T>>;\n  //This for the keyboard position\n  keyboardPosition!: Position;\n  // First of all, you should know that I am dealing with a very complex problem\n  // That occurs when we create several objects of 'SearchResultComponent' type.\n  // The problem arises when we click on the 'accept' key button, an event called:\n  // 1. acceptEvent is an event that occur when typing the 'accept' button\n  // 2. displaySearchResultEvent is an event that takes place after pressing the 'accept' button \n  // And then We need to display a list of search results according to the value the user typed.\n  // The problem is that since in the application layer we catch the events of displaySearchResultEvent, \n  // How do We know which search method to perform and which object to bind his search data to.\n  // For example, when We declare two 'SearchResultComponent' objects in the application layer,\n  // An object that searches for customers and an object that searches for products.\n  // Therefore, in the application layer I need to identify the object and thus know which search to perform\n  // And where to load the search results.\n  // Therefore by the parameter _vk_id we will know who committed the event\n  _vk_id: string | undefined;\n  //When we are in the application layer and We want to perform a search for the value that entered in VK object\n  //We will do this by listener to 'Accept' event and  catch him,\n  //Then We will save the value of the search value right to search_key_value\n  search_key_value: string | undefined;\n  //Many times we want to read/write data from the Virtual Keyboard Component \n  //As for example when We selected an item from the search list,\n  //We want this item to be entered inside the VK input filed\n  vk: VirtualKeyboardComponent | undefined;\n\n  constructor(private keyboardEventsService: VirtualKeyboardEventsService,\n    private searchResultService: SearchResultService<T>) {\n    var that = this;\n    //This event responsible to show search result when We click on accept ket at VK\n    this.keyboardEventsService.getAcceptEvent().subscribe(vk => {\n      //When we click on 'accept' key we get the Virtual keyboard that type this key (there is many of VK) \n      //And We save its id value to know who is VK that makes the 'accept' click. \n      that._vk_id = vk?.vk_id;\n      if (that.div_search_result != undefined) {\n        //Here We save the search value key from VK to our object \n        that.search_key_value = vk?.input.value;\n        //Here We save the VK that typing to make changes\n        if (vk != null)\n          this.vk = vk;\n        //that.div_search_result.nativeElement.hidden = false;\n        searchResultService.displaySearchResultEvent(that);\n      }\n      if (vk != null) {\n        //We show the only focus input keyboard component \n        //alert(vk.vk_id);\n        //alert(vk.input.value);\n      }\n    });\n    // if(this.div_search_result != undefined)\n    //   this.div_search_result.nativeElement.hidden = true;\n\n\n    //We disable this row \n    // this.searchResultService.getUpdateResultEvent().subscribe(items => {\n    //   if (items != null) {\n    //     this.items = items;\n    //   } \n    // });\n\n\n\n    this.keyboardPosition = {\n      x: 0,\n      y: 0\n    }\n\n\n    //this.itemSelectedClick = new EventEmitter<SearchResultComponent<T>>();\n    this.itemSelectedClick = new EventEmitter<SearchResultItem<T>>();\n    this.vkAcceptClick = new EventEmitter<SearchResultComponent<T>>();\n\n  }\n\n  ngAfterViewInit(): void {\n    this.div_search_result.nativeElement.hidden = true;\n\n  }\n  ngOnInit(): void {\n\n    // var that = this;\n    // this.keyboardEventsService.getAcceptEvent().subscribe(vk => {\n    //   that.div_search_result.nativeElement.hidden = false;\n    //   if (vk != null) {\n    //     //We show the only focus input keyboard component \n    //     //alert(vk.vk_id);\n    //     //alert(vk.input.value);\n    //   } \n    // });\n    // this.div_search_result.nativeElement.hidden = true;\n\n  }\n\n  @HostListener('document:click', ['$event']) onDocumentClick(event: Event) {\n    //In the default We wont to hide the search result.\n    this.div_search_result.nativeElement.hidden = true;\n  }\n\n  onSelectItemClick(item: SearchResultItem<T>) {\n    //alert('You clicked: ' + item.text);\n    //When We select item click, We trigger the select item event to dispatch this event and capture him in others application\n    this.searchResultService.selectItemEvent(item);\n    //this.itemSelectedClick.emit(this);\n    this.itemSelectedClick.emit(item);\n  }\n  VKAcceptClicked(event: VirtualKeyboardComponent): void {\n    this.vk = event;\n    this.vkAcceptClick.emit(this);\n  }\n\n  // /**\n  //    * This method responsible to calculate the virtual keyboard location.\n  //    * For example: If We click on the input text element We wont to display the search result below to input text \n  //    * I don't know why when We adding the Search result component it show not correct.  \n  //    */\n  // calculationPosition(): void {\n  //   //By the default, in the regular state We show the virtual keyboard below the input text \n  //   this.keyboardPosition.y = this.div_search_result.nativeElement.getBoundingClientRect().y + this.div_search_result.nativeElement.getBoundingClientRect().height;\n  // }\n  // /**\n  //  * This method responsible to return the virtual keyboard width  \n  //  */\n  // getVK_Width(): number {\n  //   return this.div_search_result.nativeElement.getBoundingClientRect().width;\n  // }\n  // /**\n  //  * This method responsible to return the virtual keyboard height  \n  //  */\n  // getVK_Height(): number {\n  //   return this.div_search_result.nativeElement.getBoundingClientRect().height;\n  // }\n\n\n\n\n}\n","<vk-virtual-keyboard [language]=language [vk_dir]=\"vk_dir\" [vk_id]=\"vk_id\" [vk_is_visible]=\"vk_is_visible\" [vk_is_readonly]=\"vk_is_readonly\" [valueFiled]=\"value_filed\" (acceptClick)=\"VKAcceptClicked($event)\"></vk-virtual-keyboard>\n<div #div_search_result [class]=\"'simple-search-result'\" style=\"position:absolute;z-index:10000;\">\n<ul class=\"typeahead typeahead-long dropdown-menu show\"  *ngIf=\"items\">\n    <ng-container *ngFor='let item of items;let j = index'>\n        <li data-value=\"'{{item.text}}'\" (click)=\"onSelectItemClick(item)\"> \n            <a  class=\"dropdown-item btn-lg\" ng-click=\"do(); $event.preventDefault()\">\n                <strong>{{item.text}}</strong>\n            </a>\n        </li>\n    </ng-container>\n</ul>    \n</div>","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { SearchResultItem,SearchResultComponent } from '../../../public-api';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class SearchResultService<T> {\n  \n  private selectItemEventSubject = new BehaviorSubject<SearchResultItem<T> | null>(null);\n  private displayResultEventSubject = new BehaviorSubject<SearchResultComponent<T> | null>(null);\n  //This for update the \n  private updateResultEventSubject = new BehaviorSubject<SearchResultItem<T>[] | null>(null);\n\n \n  constructor() { }\n\n  updateResultEvent(event: SearchResultItem<T>[]) {\n    this.updateResultEventSubject.next(event);\n  }\n\n  getUpdateResultEvent() {\n    return this.updateResultEventSubject.asObservable();\n  }\n\n\n  selectItemEvent(event: SearchResultItem<T>) {\n    this.selectItemEventSubject.next(event);\n  }\n\n  getSelectItemEvent() {\n    return this.selectItemEventSubject.asObservable();\n  }\n\n  displaySearchResultEvent(event: SearchResultComponent<T>) {\n    this.displayResultEventSubject.next(event);\n  }\n\n  getDisplaySearchResultEvent() {\n    return this.displayResultEventSubject.asObservable();\n  }\n}\n\n","import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { KeyboardHandlerEvent, KeyboardLayout, VirtualKeyboardComponent } from '../../../public-api';\n\n@Component({\n  selector: 'vk-label',\n  templateUrl: './virtual-keyboard-label.component.html',\n  styleUrl: './virtual-keyboard-label.component.css'\n})\nexport class VirtualKeyboardLabelComponent {\n  @Input() keyboardLayout: KeyboardLayout | undefined;\n  @Input() language: string | undefined;\n  //This variable declare the input text direction ('rtl','ltr')\n  //The user can setting the input text direction \n  @Input() vk_dir: string = \"ltr\";\n    //This variable declare us if we display the VK or not\n  //For example if we have external keyboard and we don't wont the VK then we will set the variable to 'false'\n  @Input() vk_is_visible: boolean = true;\n  //This variable declare the input text if he readonly or not \n  @Input() vk_is_readonly: boolean = false;\n  //This variable declare the virtual keyboard id. \n  //With this parameter we notify the 'acceptWithIDCallBack' with this id param.\n  //For example when we declare the call back method at the father, and we click on 'accept' button then we will \n  //Execute this method with this parameter. With this param We can know who is element. \n  @Input() vk_id: string | undefined;\n  //This variable declare the virtual keyboard value filed. \n  //For example when we wont to initialize the input text with value We can set the value with this variable.\n  @Input() value_filed: string = '';\n  //This variable declare the input text if We completely remove this element from the DOM tree. (true,false)\n  //The user can setting the input text displaying  \n  @Input() is_display_text_input: boolean = false;\n  //Many times we want to read/write data from the Virtual Keyboard Component \n  //As for example when We selected an item from the search list,\n  //We want this item to be entered inside the VK input filed\n  vk: VirtualKeyboardComponent | undefined;\n  //This event that come from the application, and deal with accept click.\n  //With this event we can declare the method that treatment with this event in the parent app \n  //This vkAcceptClick help us to do couple of things,\n  //I will explain why We declare this variable,\n  //We defined the VK (sun) object inside the SVK (parent) object, \n  //There are some complex problems when defining an object inside an object and that is how to transfer variables as attributes to the sub-object (sun), \n  //Just non-complex variables I can simply define in the parent object and then pass them as parameters to the child object.\n  //For example:\n  //<vk-virtual-keyboard [language]=language [vk_id]=\"vk_id\"></vk-virtual-keyboard>\n  //We define @Input variables like 'language' in the same name in the parent and his child,  \n  //But when I want to transfer a method (acceptClick)=... how do I do it ?,\n  // I tried and failed, and only in the following way that I will explain I succeeded and that is:\n  //In the child object we defined a parameter that behaves as an event: @Output() acceptClick: EventEmitter<VirtualKeyboardComponent>,\n  // and also in the parent object I defined a parameter that behaves as an event:   @Output() vkAcceptClick: EventEmitter<SearchResultComponent<T>>  \n  //Inside the parent we will define a method that handles the child event and all it does is dispatch to the application level of the event\n  @Output() vkAcceptClick: EventEmitter<VirtualKeyboardComponent>;\n\n\n  @ViewChild(VirtualKeyboardComponent) child:VirtualKeyboardComponent | undefined;\n\n  constructor(){\n    this.vkAcceptClick = new EventEmitter<VirtualKeyboardComponent>();\n  }\n\n  /**\n   * Event Handler: KeyUp\n   */\n  handleKeyUp(event: KeyboardHandlerEvent): void {\n    //alert('handleKeyUp');\n    // this.input.focus();\n    // this.caretEventHandler(event);\n\n    // if (this.options.physicalKeyboardHighlight) {\n\n    // }\n    //alert('yes');\n    this.is_display_text_input = !this.is_display_text_input;\n\n    if(this.child!= undefined)\n      {\n        let event = new KeyboardEvent('mouseup',{'bubbles':true});\n        let event_focus = new KeyboardEvent('focus',{'bubbles':true}); \n        //this.child._input.nativeElement.dispatchEvent(event_focus);\n        //this.child.input.select();\n        //alert('woo');\n        //alert(this.child.getInput());\n      }\n  }\n  \n  VKAcceptClicked(event: VirtualKeyboardComponent): void {\n    this.is_display_text_input = !this.is_display_text_input;\n    this.value_filed = event.getInput();\n    //this.vkAcceptClick.emit(event);\n  }\n\n}\n","<vk-virtual-keyboard  [language]=language [vk_dir]=\"vk_dir\" [vk_id]=\"vk_id\"  \n[vk_is_visible]=\"vk_is_visible\" [vk_is_readonly]=\"vk_is_readonly\" \n[valueFiled]=\"value_filed\" (acceptClick)=\"VKAcceptClicked($event)\" [is_display_text_input]=\"is_display_text_input\"></vk-virtual-keyboard>\n<div [hidden]=\"is_display_text_input == true? true: false\" (click)=\"handleKeyUp($event)\" >\n     {{value_filed}}   \n</div>\n\n\n<!-- <vk-virtual-keyboard #xxx [language]=language [vk_dir]=\"vk_dir\" [vk_id]=\"vk_id\"  \n[vk_is_visible]=\"vk_is_visible\" [vk_is_readonly]=\"vk_is_readonly\" \n[valueFiled]=\"value_filed\"  [is_display_text_input]=\"is_display_text_input\"></vk-virtual-keyboard>\n<div [hidden]=\"!is_display_text_input\" >\n     {{value_filed}}   \n</div> -->\n","//https://stackoverflow.com/questions/60102146/custom-library-component-is-not-a-known-element-but-app-compiles-and-runs\r\n\r\n\r\nimport { NgModule } from '@angular/core';\r\nimport { VirtualKeyboardComponent } from './virtual-keyboard.component';\r\nimport { SearchResultComponent } from './extenders/search-result/search-result.component';\r\nimport {VirtualKeyboardEventsService} from './services/virtual-keyboard-events.service';\r\nimport { SearchResultService } from './extenders/search-result/search-result.service';\r\nimport { CommonModule } from '@angular/common';\r\nimport { VirtualKeyboardLabelComponent } from './extenders/virtual-keyboard-label/virtual-keyboard-label.component';\r\n\r\n\r\n\r\n@NgModule({\r\n  declarations: [\r\n    VirtualKeyboardComponent,\r\n    SearchResultComponent,\r\n    VirtualKeyboardLabelComponent\r\n  ],\r\n  imports: [\r\n    CommonModule\r\n  ],\r\n  exports: [\r\n    VirtualKeyboardComponent,\r\n    SearchResultComponent,\r\n    VirtualKeyboardLabelComponent\r\n  ],\r\n  providers: [VirtualKeyboardEventsService,SearchResultService]\r\n})\r\nexport class VirtualKeyboardModule { }\r\n\r\n\r\n\r\n\r\n// import { NgModule } from '@angular/core';\r\n// import { VirtualKeyboardComponent } from './virtual-keyboard.component';\r\n// import {VirtualKeyboardEventsService} from './services/virtual-keyboard-events.service';\r\n// import { CommonModule } from '@angular/common';\r\n// import { SearchResultComponent } from '../public-api';\r\n\r\n\r\n// @NgModule({\r\n//   declarations: [\r\n//     VirtualKeyboardComponent,\r\n//   ],\r\n//   imports: [\r\n//     CommonModule,\r\n//     SearchResultComponent\r\n//   ],\r\n//   exports: [\r\n//     VirtualKeyboardComponent,\r\n//     SearchResultComponent\r\n//   ],\r\n//   providers: [VirtualKeyboardEventsService]\r\n// })\r\n// export class VirtualKeyboardModule { }\r\n","/*\n * Public API Surface of virtual-keyboard\n */\n\n\nexport * from './lib/virtual-keyboard.component';\nexport * from './lib/interfaces/key-actions';\nexport * from './lib/interfaces/position';\nexport * from './lib/interfaces/interfaces';\nexport * from './lib/interfaces/keyboards-layout/keyboard-layout';\nexport * from './lib/interfaces/search-result/search-result-item';\nexport * from './lib/services/virtual-keyboard-events.service';\nexport * from './lib/virtual-keyboard.module';\nexport * from './lib/extenders/search-result/search-result.component';\nexport * from './lib/extenders/search-result/search-result.service';\nexport * from './lib/extenders/virtual-keyboard-label/virtual-keyboard-label.component';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.VirtualKeyboardEventsService","i1.SearchResultService","i3.VirtualKeyboardComponent","i1.VirtualKeyboardComponent"],"mappings":";;;;;;AACO,MAAM,MAAM,GACnB;AACE,IAAA,IAAI,EAAE,WAAW;AACjB,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,OAAO,EAAE;QACP,kCAAkC;QAClC,0EAA0E;QAC1E,iFAAiF;QACjF,qFAAqF;QACrF,uCAAuC;AAAC,KAAA;AAC1C,IAAA,KAAK,EAAE;QACL,kCAAkC;QAClC,iCAAiC;QACjC,gCAAgC;QAChC,uCAAuC;QACvC,uCAAuC;AACxC,KAAA;AACD,IAAA,GAAG,EAAE;QACH,8GAA8G;QAC9G,6GAA6G;QAC7G,+FAA+F;QAC/F,yGAAyG;QACzG,uCAAuC;AACxC,KAAA;IACD,gBAAgB,GAAA;QACd,OAAO;AACL,YAAA,SAAS,EAAE,GAAG;AACd,YAAA,QAAQ,EAAE,WAAW;AACrB,YAAA,aAAa,EAAE,WAAW;AAC1B,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,SAAS,EAAE,OAAO;AAClB,YAAA,aAAa,EAAE,OAAO;AACtB,YAAA,cAAc,EAAE,OAAO;AACvB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,YAAY,EAAE,MAAM;AACpB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,SAAS,EAAE,MAAM;AACjB,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,gBAAgB,EAAE,GAAG;AACrB,YAAA,WAAW,EAAE,MAAM;AACnB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,aAAa,EAAE,GAAG;AAClB,YAAA,aAAa,EAAE,GAAG;AAClB,YAAA,cAAc,EAAE,GAAG;AACnB,YAAA,UAAU,EAAE,OAAO;AACnB,YAAA,cAAc,EAAE,QAAQ;AACxB,YAAA,SAAS,EAAE,OAAO;AAClB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,iBAAiB,EAAE,KAAK;AACxB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,YAAY,EAAE,MAAM;AACpB,YAAA,kBAAkB,EAAE,GAAG;AACvB,YAAA,kBAAkB,EAAE,GAAG;AACvB,YAAA,aAAa,EAAE,GAAG;AAClB,YAAA,eAAe,EAAE,OAAO;AACxB,YAAA,UAAU,EAAE,GAAG;AACf,YAAA,iBAAiB,EAAE,GAAG;AACtB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;SACjB,CAAA;KACF;CACF;;ACzFM,MAAM,OAAO,GACpB;AACE,IAAA,IAAI,EAAE,YAAY;AAClB,IAAA,IAAI,EAAE,IAAI;AACV,IAAA,OAAO,EAAE;QACP,kCAAkC;QAClC,kCAAkC;QAClC,sCAAsC;QACtC,qCAAqC;QACrC,yBAAyB;AAC1B,KAAA;AACD,IAAA,KAAK,EAAE;QACL,kCAAkC;QAClC,iCAAiC;QACjC,sCAAsC;QACtC,qCAAqC;QACrC,yBAAyB;AAC1B,KAAA;AACD,IAAA,GAAG,EAAE;QACH,8GAA8G;QAC9G,6GAA6G;QAC7G,+FAA+F;QAC/F,yGAAyG;QACzG,uCAAuC;AACxC,KAAA;IACD,gBAAgB,GAAA;QACd,OAAO;AACL,YAAA,SAAS,EAAE,GAAG;AACd,YAAA,QAAQ,EAAE,WAAW;AACrB,YAAA,aAAa,EAAE,WAAW;AAC1B,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,SAAS,EAAE,OAAO;AAClB,YAAA,aAAa,EAAE,OAAO;AACtB,YAAA,cAAc,EAAE,OAAO;AACvB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,YAAY,EAAE,MAAM;AACpB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,SAAS,EAAE,GAAG;AACd,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,gBAAgB,EAAE,GAAG;AACrB,YAAA,WAAW,EAAE,MAAM;AACnB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,aAAa,EAAE,GAAG;AAClB,YAAA,aAAa,EAAE,GAAG;AAClB,YAAA,cAAc,EAAE,GAAG;AACnB,YAAA,UAAU,EAAE,OAAO;AACnB,YAAA,cAAc,EAAE,QAAQ;AACxB,YAAA,SAAS,EAAE,OAAO;AAClB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,iBAAiB,EAAE,KAAK;AACxB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,YAAY,EAAE,MAAM;AACpB,YAAA,kBAAkB,EAAE,GAAG;AACvB,YAAA,kBAAkB,EAAE,GAAG;AACvB,YAAA,aAAa,EAAE,GAAG;AAClB,YAAA,eAAe,EAAE,OAAO;AACxB,YAAA,UAAU,EAAE,GAAG;AACf,YAAA,iBAAiB,EAAE,GAAG;AACtB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;SACjB,CAAA;KACF;CACF;;AC1FD;AACO,MAAM,KAAK,GAClB;AACE,IAAA,IAAI,EAAE,OAAO;AACb,IAAA,IAAI,EAAE,KAAK;AACX,IAAA,OAAO,EAAE;QACP,kCAAkC;QAClC,mCAAmC;QACnC,yCAAyC;QACzC,oDAAoD;QACpD,uCAAuC;AAAC,KAAA;AAC1C,IAAA,KAAK,EAAE;QACL,kCAAkC;QAClC,iCAAiC;QACjC,gCAAgC;QAChC,uCAAuC;QACvC,uCAAuC;AACxC,KAAA;AACD,IAAA,GAAG,EAAE;QACH,8GAA8G;QAC9G,6GAA6G;QAC7G,+FAA+F;QAC/F,yGAAyG;QACzG,uCAAuC;AACxC,KAAA;IACD,gBAAgB,GAAA;QACd,OAAO;AACL,YAAA,QAAQ,EAAE,WAAW;AACrB,YAAA,aAAa,EAAE,WAAW;AAC1B,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,SAAS,EAAE,OAAO;AAClB,YAAA,aAAa,EAAE,OAAO;AACtB,YAAA,cAAc,EAAE,OAAO;AACvB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,YAAY,EAAE,MAAM;AACpB,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,SAAS,EAAE,MAAM;AACjB,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,gBAAgB,EAAE,GAAG;AACrB,YAAA,WAAW,EAAE,MAAM;AACnB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,aAAa,EAAE,GAAG;AAClB,YAAA,aAAa,EAAE,GAAG;AAClB,YAAA,cAAc,EAAE,GAAG;AACnB,YAAA,UAAU,EAAE,OAAO;AACnB,YAAA,cAAc,EAAE,QAAQ;AACxB,YAAA,SAAS,EAAE,OAAO;AAClB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,iBAAiB,EAAE,KAAK;AACxB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,YAAY,EAAE,MAAM;AACpB,YAAA,kBAAkB,EAAE,GAAG;AACvB,YAAA,kBAAkB,EAAE,GAAG;AACvB,YAAA,aAAa,EAAE,GAAG;AAClB,YAAA,eAAe,EAAE,OAAO;AACxB,YAAA,UAAU,EAAE,GAAG;AACf,YAAA,iBAAiB,EAAE,GAAG;AACtB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;SACjB,CAAA;KACF;CACF;;ACzFM,MAAM,OAAO,GACpB;AACI,IAAA,IAAI,EAAE,SAAS;AACf,IAAA,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,CAAC,WAAW;QACjB,eAAe;QACf,eAAe;AACf,QAAA,sBAAsB,CAAC;AAC3B,IAAA,KAAK,EAAE,EAAE;AACX,IAAA,GAAG,EAAE,EAAE;IACP,gBAAgB,GAAA;QACd,OAAO;AACL,YAAA,SAAS,EAAE,GAAG;AACd,YAAA,QAAQ,EAAE,WAAW;AACrB,YAAA,aAAa,EAAE,WAAW;AAC1B,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,YAAY,EAAE,MAAM;AACpB,YAAA,UAAU,EAAE,GAAG;AACf,YAAA,SAAS,EAAE,GAAG;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE,GAAG;SACb,CAAA;KACF;CACF,CAAA;AAEM,MAAM,aAAa,GAC1B;AACE,IAAA,IAAI,EAAE,SAAS;AACf,IAAA,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,CAAC,cAAc;QACtB,SAAS;QACT,eAAe;AACf,QAAA,sBAAsB,CAAC;AACzB,IAAA,KAAK,EAAE,EAAE;AACT,IAAA,GAAG,EAAE,EAAE;IACP,gBAAgB,GAAA;QACd,OAAO;AACL,YAAA,QAAQ,EAAE,WAAW;AACrB,YAAA,aAAa,EAAE,WAAW;AAC1B,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,SAAS,EAAE,OAAO;AAClB,YAAA,aAAa,EAAE,OAAO;AACtB,YAAA,cAAc,EAAE,OAAO;AACvB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,YAAY,EAAE,MAAM;AACpB,YAAA,UAAU,EAAE,GAAG;AACf,YAAA,SAAS,EAAE,GAAG;AACd,YAAA,MAAM,EAAE,GAAG;AACX,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,gBAAgB,EAAE,GAAG;AACrB,YAAA,WAAW,EAAE,MAAM;AACnB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,aAAa,EAAE,GAAG;AAClB,YAAA,aAAa,EAAE,GAAG;AAClB,YAAA,cAAc,EAAE,GAAG;AACnB,YAAA,UAAU,EAAE,OAAO;AACnB,YAAA,cAAc,EAAE,QAAQ;AACxB,YAAA,SAAS,EAAE,OAAO;AAClB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,iBAAiB,EAAE,KAAK;AACxB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,YAAY,EAAE,MAAM;AACpB,YAAA,kBAAkB,EAAE,GAAG;AACvB,YAAA,kBAAkB,EAAE,GAAG;AACvB,YAAA,aAAa,EAAE,GAAG;AAClB,YAAA,eAAe,EAAE,OAAO;AACxB,YAAA,UAAU,EAAE,GAAG;AACf,YAAA,iBAAiB,EAAE,GAAG;AACtB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;AAChB,YAAA,WAAW,EAAE,GAAG;SACjB,CAAA;KACF;CACF;;AC3FD;AACO,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAyB,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;AACtF,IAAA,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;AACvB,IAAA,CAAC,KAAK,CAAC,IAAI,EAAC,KAAK,CAAC;AAClB,IAAA,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,EAAE;AACxC;AACa,MAAA,iBAAiB,GAAG,CAAC,IAAY,KAAgC;AAC5E,IAAA,IAAI,cAA0C,CAAC;AAC/C,IAAA,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9C,IAAI,cAAc,IAAI,SAAS,EAAE;AAC/B,QAAA,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC/C,KAAA;AACD,IAAA,OAAO,cAAc,CAAC;AACxB,EAAE;AAEF;;;;AAIG;AACD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;MC3FW,4BAA4B,CAAA;AAavC,IAAA,WAAA,GAAA;AAXQ,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,eAAe,CAAkC,IAAI,CAAC,CAAC;;;;;;;;;;AAU1E,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,eAAe,CAAkC,IAAI,CAAC,CAAC;KAClE;AAGjB,IAAA,SAAS,CAAC,KAA+B,EAAA;AACvC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC/B;IAED,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;KACzC;AAED,IAAA,WAAW,CAAC,KAA+B,EAAA;AACzC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAChC;IAED,cAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;KAC1C;8GA9BU,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAA5B,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,4BAA4B,cAF3B,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAEP,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBAHxC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MC8MY,wBAAwB,CAAA;IA4DnC,IAAa,UAAU,CAAC,MAAc,EAAA;AACpC,QAAA,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;;;;AAIpB,QAAA,IAAI,IAAI,CAAC,KAAK,IAAI,SAAS;YACzB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;KACjC;AA6DD,IAAA,WAAA,CAAoB,QAAmB,EAAU,qBAAmD,EAC1F,UAAsB,EAAA;QADZ,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAW;QAAU,IAAqB,CAAA,qBAAA,GAArB,qBAAqB,CAA8B;QAC1F,IAAU,CAAA,UAAA,GAAV,UAAU,CAAY;;;QA5HvB,IAAM,CAAA,MAAA,GAAW,KAAK,CAAC;;;QAGvB,IAAqB,CAAA,qBAAA,GAAY,IAAI,CAAC;;;QAGtC,IAAa,CAAA,aAAA,GAAY,IAAI,CAAC;;QAE9B,IAAc,CAAA,cAAA,GAAY,KAAK,CAAC;;;QA+BzC,IAAS,CAAA,SAAA,GAAY,KAAK,CAAC;;;;QAI3B,IAAqB,CAAA,qBAAA,GAAa,EAAE,CAAC;QAErC,IAAW,CAAA,WAAA,GAAG,SAAS,CAAC;QACxB,IAAkB,CAAA,kBAAA,GAAkD,IAAI,CAAC;QACzE,IAAY,CAAA,YAAA,GAAW,EAAE,CAAC;;;;QAI1B,IAAgB,CAAA,gBAAA,GAAW,EAAE,CAAC;AAa9B;;AAEG;AACH,QAAA,IAAA,CAAA,UAAU,GAAG,MAAuB,IAAI,CAAC,OAAO,CAAC;AACjD,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAqB,IAAI,CAAC,aAAa,CAAC;AAC3D,QAAA,IAAA,CAAA,mBAAmB,GAAG,MAAqB,IAAI,CAAC,gBAAgB,CAAC;AAajE,QAAA,IAAA,CAAA,GAAG,GAAG;AACJ,YAAA,OAAO,EAAE,oDAAoD;;AAE7D,YAAA,QAAQ,EAAE,WAAW;;AAErB,YAAA,YAAY,EAAE,qBAAqB;;AAEnC,YAAA,KAAK,EAAE,mBAAmB;AAC1B,YAAA,UAAU,EAAE,2BAA2B;AACvC,YAAA,OAAO,EAAE,6BAA6B;AACtC,YAAA,OAAO,EAAE,qBAAqB;AAC9B,YAAA,QAAQ,EAAE,aAAa;AACvB,YAAA,MAAM,EAAE,oBAAoB;AAC5B,YAAA,SAAS,EAAE,oBAAoB;AAC/B,YAAA,OAAO,EAAE,qBAAqB;AAC9B,YAAA,SAAS,EAAE,cAAc;AACzB,YAAA,OAAO,EAAE,kBAAkB;AAC3B,YAAA,YAAY,EAAE,4BAA4B;AAC1C,YAAA,SAAS,EAAE,uBAAuB;AAClC,YAAA,SAAS,EAAE,oBAAoB;AAC/B,YAAA,SAAS,EAAE,oBAAoB;AAC/B,YAAA,WAAW,EAAE,sBAAsB;;AAEnC,YAAA,YAAY,EAAE,yBAAyB;;AAEvC,YAAA,MAAM,EAAE,yBAAyB;AACjC,YAAA,UAAU,EAAE,yBAAyB;AACrC,YAAA,UAAU,EAAE,wBAAwB;AACpC,YAAA,WAAW,EAAE,yBAAyB;AACtC,YAAA,QAAQ,EAAE,uBAAuB;AACjC,YAAA,SAAS,EAAE,2BAA2B;;AAEtC,YAAA,UAAU,EAAE,yBAAyB;AACrC,YAAA,YAAY,EAAE,2BAA2B;AACzC,YAAA,iBAAiB,EAAE,0BAA0B;YAC7C,MAAM,EAAE,2BAA2B;SACpC,CAAC;QAEF,IAAI,CAAA,IAAA,GAAG,IAAI,CAAC;AAuwBZ;;AAEC;AACD,QAAA,IAAA,CAAA,gBAAgB,GAAG,CAAC,MAAc,KAChC,MAAM,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;;;AAwpBtE,QAAA,IAAA,CAAA,SAAS,GAAG;AACV,YAAA,MAAM,EAAE,YAAA;;gBAEN,OAAO,KAAK,CAAC;aACd;AACD,YAAA,GAAG,EAAE,YAAA;;;aAGJ;AACD,YAAA,IAAI,EAAE,YAAA;;;;;;;;;aASL;AACD,YAAA,MAAM,EAAE,YAAA;;gBAEN,OAAO,KAAK,CAAC;aACd;AACD,YAAA,KAAK,EAAE,YAAA;;;;;aAKN;AACD,YAAA,KAAK,EAAE,YAAA;;;;;;;;;;;;AAYL,gBAAA,OAAO,KAAK,CAAC;aACd;AACD,YAAA,GAAG,EAAE,YAAA;;aAEJ;AACD,YAAA,GAAG,EAAE,YAAA;;;;;;;aAOJ;;AAED,YAAA,SAAS,EAAE,YAAA;;;aAGV;;YAED,KAAK,EAAE,4BAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA8B/B;;AAED,YAAA,IAAI,EAAE,YAAA;;;aAGL;AACD,YAAA,IAAI,EAAE,YAAA;;;;;;;;aAQL;YACD,IAAI,EAAE,yBAAsB;;;;aAI3B;AACD,YAAA,IAAI,EAAE,YAAA;;AAEJ,gBAAA,OAAO,KAAK,CAAC;aACd;;AAED,YAAA,MAAM,EAAE,YAAA;;;aAGP;AACD,YAAA,IAAI,EAAE,YAAA;;AAEJ,gBAAA,OAAO,KAAK,CAAC;aACd;AACD,YAAA,KAAK,EAAE,YAAA;;;;;;;;;;aAUN;AACD,YAAA,KAAK,EAAE,YAAA;;;aAGN;AACD,YAAA,IAAI,EAAE,YAAA;;;;;;;;;;;;;;aAcL;AACD,YAAA,KAAK,EAAE,YAAA;;aAEN;AACD,YAAA,GAAG,EAAE,YAAA;;;;;;;;;;;aAWJ;AACD,YAAA,MAAM,EAAE,YAAA;;;aAGP;;;AAGD,YAAA,IAAI,EAAE,QAAQ;;AAEd,YAAA,IAAI,EAAE,QAAQ;;AAEd,YAAA,IAAI,EAAE,QAAQ;;AAEd,YAAA,GAAG,EAAE,QAAQ;;AAEb,YAAA,GAAG,EAAE,QAAQ;;AAEb,YAAA,GAAG,EAAE,QAAQ;SACd,CAAC;AAtlDA,QAAA,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;AACvB,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAE1B,IAAI,CAAC,OAAO,GAAG;AACb,YAAA,UAAU,EAAE,SAAS;AACrB,YAAA,KAAK,EAAE,kBAAkB;AACzB,YAAA,SAAS,EAAE,SAAS;AACpB,YAAA,uBAAuB,EAAE,KAAK;AAC9B,YAAA,sBAAsB,EAAE,IAAI;AAC5B,YAAA,iBAAiB,EAAE,EAAE;AACrB,YAAA,KAAK,EAAE,IAAI;;;;;;;;;;;SAaZ,CAAC;QACF,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;QAErC,IAAI,CAAC,gBAAgB,GAAG;AACtB,YAAA,CAAC,EAAE,CAAC;AACJ,YAAA,CAAC,EAAE,CAAC;SACL,CAAA;AAED,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,YAAY,EAA4B,CAAC;KACjE;IACD,eAAe,GAAA;;QAEb,IAAI,CAAC,KAAK,GAAqB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;;;;AAIzD,QAAA,IAAI,IAAI,CAAC,kBAAkB,IAAI,SAAS,EAAE;;;;;;;;;;AAUxC,YAAA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/E,YAAA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnF,YAAA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnF,YAAA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrF,YAAA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACjF,YAAA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrF,YAAA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACjF,YAAA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;;;YAGnG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC;AACxC,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC;AACtC,SAAA;;QAED,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC;;;;QAM9C,IAAI,CAAC,UAAU,GAAG;YAChB,QAAQ,EAAE,IAAI,CAAC,gBAAgB;YAC/B,MAAM,EAAE,IAAI,CAAC,cAAc;YAC3B,cAAc,EAAE,IAAI,CAAC,oBAAoB;SAC1C,CAAC;;AAIF,QAAA,IAAI,IAAI,CAAC,KAAK,IAAI,SAAS,EAAE;YAC3B,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;AAC/B,SAAA;KAEF;IACD,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,cAAc,IAAI,SAAS,EAAE;AACpC,YAAA,IAAI,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE;gBAC9B,IAAI,CAAC,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACxD,aAAA;AACI,iBAAA;AACH,gBAAA,IAAI,CAAC,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;AAC/C,aAAA;AACD,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE,OAAO,IAAI,SAAS;gBAC3C,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;AAC5D,SAAA;;AAGD,QAAA,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC;AACxC,QAAA,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC;;;;;AAO1C;;AAEC;;;;;;;;;;;;;;;;;;;;;;;;;;KAgCF;;AAGmD,IAAA,YAAY,CAAC,aAAkB,EAAA;;;AAGjF,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC1E,QAAA,IAAI,CAAC,WAAW,EAAE;;;;;;;;;;;;;;;AAehB,YAAA,IAAI,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,gBAAgB;gBAC9F,IAAI,CAAC,qBAAqB,EAAE,CAAC;;YAE/B,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC;AAC/C,SAAA;KACF;;;;;;;;;;;;;;;;;;;;;;;IA2BD,cAAc,GAAA;;AAEZ,QAAA,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC;AACxC,QAAA,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC;;KAE3C;;;;;;IASD,cAAc,GAAA;QACZ,KAAK,CAAC,yBAAyB,CAAC,CAAC;KAClC;AAMD;;;;;;AAMG;AACH,IAAA,oBAAoB,CAAC,MAAc,EAAA;AACjC;;AAEG;AACH,QAAA,IAAI,OAAiD,CAAC;AAEtD,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;;AAE7B,YAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,gBAAgB,EAAE,EAAE,OAAO,CAAC,CAAC;AAC/E,SAAA;AAAM,aAAA;;YAEL,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,cAAc,EAAE,gBAAgB,EAAE,CAAC;AAC9D,SAAA;QACD,IAAI,OAAO,IAAI,SAAS;AACtB,YAAA,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;;AAEjC,YAAA,OAAO,MAAM,CAAC;KACjB;AAED;;;;AAIC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkED;;;;;AAKC;AACD,IAAA,cAAc,CAAC,MAAc,EAAA;QAC3B,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AACnD,QAAA,MAAM,mBAAmB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI,gBAAgB,GAAG,EAAE,CAAC;QAE1B,IAAI,eAAe,KAAK,aAAa;AACnC,YAAA,gBAAgB,GAAG,CAAA,WAAA,EAAc,mBAAmB,CAAA,CAAE,CAAC;AAEzD,QAAA,OAAO,CAAM,GAAA,EAAA,eAAe,CAAG,EAAA,gBAAgB,EAAE,CAAC;KACnD;AAED;;;;;AAKC;AACD,IAAA,aAAa,CAAC,MAAc,EAAA;AAC1B,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,MAAM,KAAK,MAAM;AACtE,cAAE,aAAa;cACb,aAAa,CAAC;KACnB;AAGD;;AAEG;IACH,YAAY,CAAC,KAAa,EAAE,KAAa,EAAA;QACvC,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACjD,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE/C,IAAI,gBAAgB,GAAG,KAAK,IAAI,gBAAgB,IAAI,CAAC,CAAC,EAAE;AAAE,YAAA,QAAQ,EAAE,CAAC;AAAE,SAAA;QACvE,IAAI,cAAc,GAAG,KAAK,IAAI,gBAAgB,IAAI,CAAC,CAAC,EAAE;AAAE,YAAA,QAAQ,EAAE,CAAC;AAAE,SAAA;QAErE,OAAO,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;KACpC;AAGD;;;;;;;AAOG;AACH,IAAA,WAAW,CACT,MAAc,EACd,GAAW,EACX,QAAQ,GAAG,MAAM,CAAC,MAAM,EACxB,WAAW,GAAG,MAAM,CAAC,MAAM,EAC3B,SAAS,GAAG,KAAK,EAAA;AAEjB,QAAA,IAAI,MAAM,CAAC;AAEX,QAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,CAAC,EAAE;AAC/B,YAAA,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;AACvB,SAAA;AAAM,aAAA;YACL,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CACvE,EAAE,CACH,CAAC;AAEF;;AAEG;AACH,YAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAC9B,gBAAA,IAAI,SAAS;AAAE,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAChD,aAAA;AACF,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AAED;;;;;AAKG;AACH,IAAA,eAAe,CAAC,YAAoB,EAAA;AAClC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAClC,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;AACpC,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACtC,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC;AAEvD,QAAA;AACE;;;AAGG;AACH,QAAA,YAAY,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,EAC1C;AACA,YAAA,OAAO,KAAK,CAAC;AACd,SAAA;AAED,QAAA,IAAI,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;YAC/B,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,gBAAA,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAC;AACpD,aAAA;AAED,YAAA,IAAI,SAAS,EAAE;AACb;;AAEG;AACH,gBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAC7B,gBAAA,OAAO,IAAI,CAAC;AACb,aAAA;AAAM,iBAAA;AACL,gBAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;AAC9B,gBAAA,OAAO,KAAK,CAAC;AACd,aAAA;AACF,SAAA;AAED,QAAA,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;AACjC,YAAA,MAAM,SAAS,GACb,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;YAEvE,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,gBAAA,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,SAAS,CAAC,CAAC;AACpD,aAAA;AAED,YAAA,IAAI,SAAS,EAAE;AACb,gBAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;AAC7B,gBAAA,OAAO,IAAI,CAAC;AACb,aAAA;AAAM,iBAAA;AACL,gBAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;AAC9B,gBAAA,OAAO,KAAK,CAAC;AACd,aAAA;AACF,SAAA;QACD,OAAO,IAAI,CAAC;KACb;AAGD;;;;;AAKC;AACD,IAAA,cAAc,CAAC,MAAc,EAAE,KAAK,GAAG,KAAK,EAAA;QAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC7D,QAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;;;;KAIpC;AAED;;;;;AAKG;AACH,IAAA,oBAAoB,CAAC,MAAc,EAAE,KAAK,GAAG,KAAK,EAAA;AAChD,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAClC,QAAA,IAAI,aAAa,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAE5C,IAAI,aAAa,IAAI,IAAI,EAAE;AACzB,YAAA,IAAI,KAAK,EAAE;gBACT,IAAI,aAAa,GAAG,CAAC;AAAE,oBAAA,aAAa,GAAG,aAAa,GAAG,MAAM,CAAC;AAC/D,aAAA;AAAM,iBAAA;AACL,gBAAA,aAAa,GAAG,aAAa,GAAG,MAAM,CAAC;AACxC,aAAA;AACF,SAAA;QAED,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,YAAA,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC;AAC3C,SAAA;AAED,QAAA,OAAO,aAAa,CAAC;KACtB;AAGD;;;;;;;;AAQG;AACH,IAAA,eAAe,CACb,MAAc,EACd,KAAa,EACb,QAAa,EACb,WAAW,GAAG,QAAQ,EACtB,SAAS,GAAG,KAAK,EAAA;AAEjB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;AAClC,QAAA,MAAM,YAAY,GAAsD;YACtE,QAAQ;YACR,WAAW;YACX,SAAS;SACV,CAAC;QAEF,IAAI,MAAM,GAAG,KAAK,CAAC;QAEnB,IACE,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,aAAa;AAChD,YAAA,MAAM,CAAC,MAAM,GAAG,CAAC,EACjB;YACA,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC;AACjD,SAAA;aAAM,IACL,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,iBAAiB;AACtD,YAAA,MAAM,CAAC,MAAM,GAAG,CAAC,EACjB;YACA,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC;AACzD,SAAA;aAAM,IAAI,MAAM,KAAK,SAAS;AAC7B,YAAA,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC;aACrD,IACH,MAAM,KAAK,OAAO;AAClB,YAAA,EACE,OAAO,OAAO,CAAC,YAAY,KAAK,SAAS;AACzC,gBAAA,OAAO,CAAC,YAAY,KAAK,KAAK,CAC/B,EACD;AACA,YAAA,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC;AAC1D,SAAA;aAAM,IACL,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,eAAe;AACnD,YAAA,OAAO,CAAC,cAAc;AAEtB,YAAA,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,CAAC;AACtD,aAAA,IACH,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACzB,YAAA,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EACnD;AACA,YAAA,MAAM,GAAG,IAAI,CAAC,WAAW,CACvB,MAAM,EACN,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EACzB,GAAG,YAAY,CAChB,CAAC;AACH,SAAA;aACI,IAAI,MAAM,KAAK,SAAS,EAAE;YAC7B,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,gBAAA,IAAI,IAAI,CAAC,cAAc,EAAE,OAAO,IAAI,SAAS;oBAC3C,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC;AAC5D,aAAA;AACI,iBAAA;AACH,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,gBAAA,IAAI,IAAI,CAAC,cAAc,EAAE,OAAO,IAAI,SAAS;oBAC3C,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC;AAC5D,aAAA;AACF,SAAA;aACI,IAAI,MAAM,KAAK,UAAU,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAiD9B,IAAI,CAAC,qBAAqB,EAAE,CAAC;AAC9B,SAAA;aACI,IAAI,MAAM,KAAK,SAAS,EAAE;AAC7B,YAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;AACvB,SAAA;aACI,IAAI,MAAM,KAAK,gBAAgB;AAClC,YAAA,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC;aACrD,IAAI,MAAM,KAAK,kBAAkB;AACpC,YAAA,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC;aACrD,IAAI,MAAM,KAAK,kBAAkB;AACpC,YAAA,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC;aACrD,IAAI,MAAM,KAAK,aAAa;AAC/B,YAAA,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC;AACrD,aAAA,IAAI,MAAM,KAAK,iBAAiB,IAAI,MAAM,KAAK,OAAO;AACzD,YAAA,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,CAAC;AACrD,aAAA,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;AACvC,YAAA,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC;AACxD,aAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;AACrD,YAAA,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC;QAE7D,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,YAAA,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC,CAAC;AACzC,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AACD;;AAEC;IACD,kBAAkB,GAAA;AAChB,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;KACvC;AAED;;;;;;AAMG;AACH,IAAA,QAAQ,CACN,MAAc,EACd,QAAQ,GAAG,MAAM,CAAC,MAAM,EACxB,WAAW,GAAG,MAAM,CAAC,MAAM,EAC3B,SAAS,GAAG,KAAK,EAAA;AAEjB,QAAA,IAAI,QAAQ,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,EAAE;AACvC,YAAA,OAAO,MAAM,CAAC;AACf,SAAA;AAED,QAAA,IAAI,MAAM,CAAC;QAEX,IAAI,QAAQ,KAAK,WAAW,EAAE;AAC5B,YAAA,IAAI,YAAY,CAAC;AACjB,YAAA,IAAI,YAAY,CAAC;YACjB,MAAM,eAAe,GAAG,mCAAmC,CAAC;AAE5D;;;AAGG;AACH,YAAA,IAAI,QAAQ,IAAI,QAAQ,IAAI,CAAC,EAAE;gBAC7B,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;AACxD,gBAAA,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AAEnD,gBAAA,IAAI,YAAY,EAAE;AAChB,oBAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAClE,oBAAA,IAAI,SAAS;AAAE,wBAAA,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7C,iBAAA;AAAM,qBAAA;AACL,oBAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAClE,oBAAA,IAAI,SAAS;AAAE,wBAAA,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7C,iBAAA;AACF,aAAA;AAAM,iBAAA;gBACL,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAChC,gBAAA,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AAEnD,gBAAA,IAAI,YAAY,EAAE;oBAChB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7B,oBAAA,IAAI,SAAS;AAAE,wBAAA,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7C,iBAAA;AAAM,qBAAA;oBACL,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC7B,oBAAA,IAAI,SAAS;AAAE,wBAAA,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7C,iBAAA;AACF,aAAA;AACF,SAAA;AAAM,aAAA;AACL,YAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAC/D,YAAA,IAAI,SAAS,EAAE;;AAEb,gBAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;;AAEjC,aAAA;AACF,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AAED;;;;;AAKG;AACH,IAAA,gBAAgB,CACd,MAAc,EACd,QAAA,GAAmB,MAAM,CAAC,MAAM,EAChC,WAAA,GAAsB,MAAM,CAAC,MAAM,EACnC,SAAS,GAAG,KAAK,EAAA;QAEjB,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,QAAQ,KAAK,IAAI,EAAE;AACxC,YAAA,OAAO,MAAM,CAAC;AACf,SAAA;AAED,QAAA,IAAI,MAAM,CAAC;QAEX,IAAI,QAAQ,KAAK,WAAW,EAAE;YAC5B,MAAM,eAAe,GAAG,mCAAmC,CAAC;AAE5D;;;AAGG;AACH,YAAA,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;YAC9D,MAAM,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AAEzD,YAAA,IAAI,YAAY,EAAE;AAChB,gBAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AACnE,aAAA;AAAM,iBAAA;AACL,gBAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;AACnE,aAAA;AACF,SAAA;AAAM,aAAA;AACL,YAAA,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AAC/D,YAAA,IAAI,SAAS,EAAE;;AAEb,gBAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;;AAEjC,aAAA;AACF,SAAA;AAED,QAAA,OAAO,MAAM,CAAC;KACf;AAGD;;;;AAIG;IACH,QAAQ,CAAC,WAAmB,EAC1B,QAAkB,EAAA;AAClB,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,WAAW,CAAC;KAChC;AACD;;AAEC;IACD,kBAAkB,GAAA;;;QAGhB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;;KAElE;AAOD;;;;AAIG;AACH,IAAA,gBAAgB,CAAC,QAAuB,EAAE,WAAW,GAAG,QAAQ,EAAA;AAC9D,QAAA,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;AAC9B,QAAA,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC;AACpC,QAAA,OAAO,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,GAAG,oBAAoB,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC;KACpG;IAID,OAAO,CAAC,KAAY,EAAE,MAAc,EAAA;AAElC,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,MAA2B,CAAC;;AAEpD,QAAA,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC3C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;KAEjD;IAED,UAAU,GAAA;;;;;;;;;;;;;;;;;;KAmBT;AAID;;;AAGG;IACH,mBAAmB,CAAC,MAAyB,EAAE,CAAwB,EAAA;AACrE,QAAA,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAE7D,IAAI,YAAY,GAAW,EAAE,CAAC;QAC9B,IAAI,IAAI,GAAkB,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;;QAE5D,IAAI,IAAI,KAAK,IAAI;YACf,YAAY,GAAG,IAAI,CAAC;AAGtB;;AAEG;QACH,IAAI,YAAY,KAAK,MAAM;YAAE,OAAO;AAEpC;;AAEG;QACH,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CACvC,YAAY,EACZ,IAAI,CAAC,KAAK,CAAC,KAAK,EAChB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,gBAAgB,CACtB,CAAC;AAEF;;AAEG;QACH,IAAI,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAClE,YAAA,MAAM,sBAAsB,GAC1B,IAAI,CAAC,KAAK;AACV,gBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,YAAY;gBACjC,IAAI,CAAC,aAAa,KAAK,CAAC;AACxB,gBAAA,IAAI,CAAC,gBAAgB,KAAK,YAAY,CAAC,MAAM,CAAC;AAEhD,YAAA,IAAI,sBAAsB,EAAE;AAC1B,gBAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AACxB,gBAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;AACzB,gBAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,GAAG,EAAE,CAAC;gBACnC,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChD,gBAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBACpC,OAAO;AACR,aAAA;AACF,SAAA;AAED;;AAEG;QACH,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,UAAU,EAAE;;;;AAIlD,SAAA;AAED,QAAA;;AAEE,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,YAAY;;;AAGjC,aAAC,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY;;AAEzB,iBAAC,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,EACxE;AACA;;AAEG;AACH,YAAA,IACE,IAAI,CAAC,OAAO,CAAC,SAAS;AACtB,gBAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,EAClC;gBACA,OAAO;AACR,aAAA;AAED;;AAEG;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CACxC,YAAY,EACZ,IAAI,CAAC,KAAK,CAAC,KAAK,EAChB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CACL,CAAC;AAEF,YAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;;;AAOnC,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;gBACtB,OAAO,CAAC,GAAG,CACT,cAAc,EACd,IAAI,CAAC,gBAAgB,EAAE,EACvB,IAAI,CAAC,mBAAmB,EAAE,EAC1B,CAAA,KAAA,CAAO,EACP,CAAC,EAAE,IAAI,CACR,CAAC;AACH,aAAA;AAED;;AAEG;AACH,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,kBAAkB;gBAAE,IAAI,CAAC,kBAAkB,EAAE,CAAC;AAE/D;;AAEG;AACH,YAAA,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,UAAU;gBAC7C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAExE;;AAEG;;;AAIH;;AAEG;;;;;;;;;;;;;;;;AAkBH;;;AAGG;AACH,YAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,gBAAgB,EAAE;gBACzE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;AACpE,gBAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,oBAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAC3E,oBAAA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACpB,iBAAA;AAED,gBAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;oBACtB,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;AAC3D,iBAAA;AACF,aAAA;AAED,YAAA,IAAI,KAAK,EAAE;AACT,gBAAA,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;AACrC,aAAA;AACF,SAAA;KAEF;AAGD,IAAA,iBAAiB,CAAC,QAAuB,EAAA;;;;;;;;;;;;AAcvC,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;;;;;;;;;KAUlD;AAID;;AAEG;AACH,IAAA,iBAAiB,CAAC,KAA2B,EAAA;;;;;;;;;AAW3C;;;AAGG;;;;;;;;;;;;;;AAeH;;;AAGG;AACH,QAAA,IAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC;AAC/C,QAAA,IAAI,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;AAE3C,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;AACpB,YAAA,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,cAAwB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC9E,YAAA,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,YAAsB,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC3E,SAAA;AAED,QAAA,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;AAEpD;;AAEG;AACH,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC;AAErC,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACtB,YAAA,OAAO,CAAC,GAAG,CACT,cAAc,EACd,IAAI,CAAC,gBAAgB,EAAE,EACvB,IAAI,CAAC,mBAAmB,EAAE,EAC1B,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,EAC3C,CAAA,EAAA,CAAI,EACJ,KAAK,EAAE,IAAI,CACZ,CAAC;AACH,SAAA;;;;;;;;;;;;;;;;;;;;;;;KAyBF;AAED;;;AAGG;AACH,IAAA,mBAAmB,CAAC,QAAgB,EAAA;AAClC,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;AAClD,QAAA,IAAI,YAAY,CAAC;AAEjB;;AAEG;QACH,IAAI,eAAe,YAAY,MAAM,EAAE;YACrC,YAAY,GAAG,eAAe,CAAC;AAChC,SAAA;AAAM,aAAA;YACL,YAAY;gBACV,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;AAC/D,SAAA;QAED,IAAI,YAAY,IAAI,QAAQ,EAAE;YAC5B,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAElD,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AACtB,gBAAA,OAAO,CAAC,GAAG,CACT,CAAkB,eAAA,EAAA,YAAY,OAAO,aAAa,GAAG,QAAQ,GAAG,eAChE,CAAA,CAAE,CACH,CAAC;AACH,aAAA;AAED,YAAA,OAAO,aAAa,CAAC;AACtB,SAAA;AAAM,aAAA;AACL;;AAEG;AACH,YAAA,OAAO,IAAI,CAAC;AACb,SAAA;KACF;AAED;;;AAGG;AACH,IAAA,QAAQ,CACN,SAAA,GAAoB,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,EAC9D,QAAQ,GAAG,KAAK,EAAA;AAEhB;;AAEG;;AAGH,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;;AAEpB,YAAA,MAAM,sBAAsB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;AAC5C,iBAAA,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;AACrB,iBAAA,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAEzB,YAAA,OAAO,QAAQ,GAAG,sBAAsB,GAAG,QAAQ,CAAC;AACrD,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;AACzB,SAAA;KACF;AAGD;;;AAGC;;AAED,IAAA,QAAQ,CAAC,QAAgD,EAAA;QAEvD,KAAK,CAAC,UAAU,CAAC,CAAC;KACnB;AAGD;;AAEG;IACH,iBAAiB,GAAA;AACf;;AAEG;;QAGH,MAAM,EAAE,uCAAuC,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;AAEzE;;AAEG;AACH,QAAA,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,uCAAuC,CAAC,CAAC;AAChG,QAAA,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,EAAE,uCAAuC,CAAC,CAAC;QACpG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC3E,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;KAE1D;AAED;;AAEG;AACH,IAAA,WAAW,CAAC,KAA2B,EAAA;;AAErC,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAE9B,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE;;AAE3C,SAAA;KACF;AAED;;AAEG;AACH,IAAA,aAAa,CAAC,KAA2B,EAAA;;AAEvC,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE;;AAE3C,SAAA;AACD,QAAA,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE,EAAE;YACxB,IAAI,CAAC,qBAAqB,EAAE,CAAC;;AAE9B,SAAA;KACF;AACD;;AAEG;AACH,IAAA,aAAa,CAAC,KAA2B,EAAA;;AAErB,QAAA,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;KACzC;AAED;;AAEG;AACH,IAAA,cAAc,CAAC,KAA2B,EAAA;;;;;;;;;;;;;;;KAiBzC;AACD;;AAEG;AACH,IAAA,aAAa,CAAC,KAA2B,EAAA;;AAEvC,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;AACpH,QAAA,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;;AAE3C,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;;;;;QAO9B,IAAI,CAAC,mBAAmB,EAAE,CAAC;;;;;;;;;;KAmB5B;AAED;;AAEG;;AAEH,IAAA,cAAc,CAAC,KAA2B,EAAA;;AAExC,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;KAC/B;AAED;;AAEG;;AAEH,IAAA,YAAY,CAAC,KAA2B,EAAA;;AAEtC,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;KAC/B;AAED;;AAEG;;AAEH,IAAA,qBAAqB,CAAC,KAA2B,EAAA;;AAG/C;;;AAGG;QACH,IAAI,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YAC3C,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;KAC/B;AAID;;;;;AAKG;IACH,mBAAmB,GAAA;;AAGjB,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,CAAC,eAAe,EAAE;;YAEpI,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,MAAM,CAAC;AAC5G,SAAA;;AAED,SAAA;;AAEE,YAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;;AAEtF,SAAA;;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE;AACrF,YAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;AAChE,SAAA;;AAED,SAAA;AACE,YAAA,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AACrF,SAAA;KACF;AACD;;;AAGG;IACH,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;KAClE;AACD;;;AAGC;IACD,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC;KAClE;AAGD;;;AAGG;IACH,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,MAAM,CAAC;KACnI;AACD;;;AAGC;IACD,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC;KAClI;AAGD;;AAEG;IACH,WAAW,GAAA;QACT,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC;KACtE;AACD;;AAEG;IACH,YAAY,GAAA;QACV,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC,MAAM,CAAC;KACvE;AAED;;;AAGG;IACH,qBAAqB,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,SAAS,EAAE;AACzC,YAAA,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;gBAC9C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;;;gBAIzC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC;AAC9C,gBAAA,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAC7C,gBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,aAAA;AACI,iBAAA;;gBAEH,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBACzC,KAAK,CAAC,6BAA6B,CAAC,CAAC;;AAEtC,aAAA;AACF,SAAA;AACI,aAAA;YAEH,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;;YAEzC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC;AAC9C,YAAA,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAC7C,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE7B,SAAA;KACF;8GA5hDU,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAAA,4BAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,EA1MzB,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,6BAAA,EAAA,eAAA,EAAA,wBAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,woEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FA4KU,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBA5MpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EACrB,QAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,woEAAA,CAAA,EAAA,CAAA;+IA6KQ,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBAGG,MAAM,EAAA,CAAA;sBAAd,KAAK;gBAGG,qBAAqB,EAAA,CAAA;sBAA7B,KAAK;gBAGG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBAEG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBAKG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBAIG,kBAAkB,EAAA,CAAA;sBAA1B,KAAK;gBACG,gBAAgB,EAAA,CAAA;sBAAxB,KAAK;gBACG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBACG,oBAAoB,EAAA,CAAA;sBAA5B,KAAK;gBAEgB,MAAM,EAAA,CAAA;sBAA3B,SAAS;uBAAC,SAAS,CAAA;gBAEO,YAAY,EAAA,CAAA;sBAAtC,SAAS;uBAAC,cAAc,CAAA;gBAIf,WAAW,EAAA,CAAA;sBAApB,MAAM;gBA2BM,UAAU,EAAA,CAAA;sBAAtB,KAAK;gBAmN8C,YAAY,EAAA,CAAA;sBAA/D,YAAY;uBAAC,iBAAiB,EAAE,CAAC,eAAe,CAAC,CAAA;gBAmDlD,cAAc,EAAA,CAAA;sBADb,YAAY;uBAAC,eAAe,EAAE,CAAC,QAAQ,CAAC,CAAA;gBAezC,cAAc,EAAA,CAAA;sBADb,YAAY;uBAAC,YAAY,CAAA;;;MCzgBf,qBAAqB,CAAA;IA6EhC,WAAoB,CAAA,qBAAmD,EAC7D,mBAA2C,EAAA;QADjC,IAAqB,CAAA,qBAAA,GAArB,qBAAqB,CAA8B;QAC7D,IAAmB,CAAA,mBAAA,GAAnB,mBAAmB,CAAwB;;;QAxE5C,IAAM,CAAA,MAAA,GAAW,KAAK,CAAC;;;QAGvB,IAAa,CAAA,aAAA,GAAY,IAAI,CAAC;;QAE9B,IAAc,CAAA,cAAA,GAAY,KAAK,CAAC;;;QAQhC,IAAW,CAAA,WAAA,GAAW,EAAE,CAAC;QA4DhC,IAAI,IAAI,GAAG,IAAI,CAAC;;QAEhB,IAAI,CAAC,qBAAqB,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,EAAE,IAAG;;;AAGzD,YAAA,IAAI,CAAC,MAAM,GAAG,EAAE,EAAE,KAAK,CAAC;AACxB,YAAA,IAAI,IAAI,CAAC,iBAAiB,IAAI,SAAS,EAAE;;gBAEvC,IAAI,CAAC,gBAAgB,GAAG,EAAE,EAAE,KAAK,CAAC,KAAK,CAAC;;gBAExC,IAAI,EAAE,IAAI,IAAI;AACZ,oBAAA,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;;AAEf,gBAAA,mBAAmB,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC;AACpD,aAAA;YACD,IAAI,EAAE,IAAI,IAAI,EAAE;;;;AAIf,aAAA;AACH,SAAC,CAAC,CAAC;;;;;;;;;QAcH,IAAI,CAAC,gBAAgB,GAAG;AACtB,YAAA,CAAC,EAAE,CAAC;AACJ,YAAA,CAAC,EAAE,CAAC;SACL,CAAA;;AAID,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,YAAY,EAAuB,CAAC;AACjE,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,EAA4B,CAAC;KAEnE;IAED,eAAe,GAAA;QACb,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC;KAEpD;IACD,QAAQ,GAAA;;;;;;;;;;;KAaP;AAE2C,IAAA,eAAe,CAAC,KAAY,EAAA;;QAEtE,IAAI,CAAC,iBAAiB,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC;KACpD;AAED,IAAA,iBAAiB,CAAC,IAAyB,EAAA;;;AAGzC,QAAA,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;;AAE/C,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACnC;AACD,IAAA,eAAe,CAAC,KAA+B,EAAA;AAC7C,QAAA,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC;AAChB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC/B;8GA/JU,qBAAqB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,4BAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,mBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,qpBCzBlC,6wBAWM,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,wBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,UAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FDcO,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAtBjC,SAAS;+BACE,kBAAkB,EAAA,QAAA,EAAA,6wBAAA,EAAA,CAAA;6HAuBnB,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBAGG,MAAM,EAAA,CAAA;sBAAd,KAAK;gBAGG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBAEG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBAKG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBAGG,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBAGG,gBAAgB,EAAA,CAAA;sBAAxB,KAAK;gBAEG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBAEG,oBAAoB,EAAA,CAAA;sBAA5B,KAAK;gBAEG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBAE0B,iBAAiB,EAAA,CAAA;sBAAhD,SAAS;uBAAC,mBAAmB,CAAA;gBAKpB,iBAAiB,EAAA,CAAA;sBAA1B,MAAM;gBAgBG,aAAa,EAAA,CAAA;sBAAtB,MAAM;gBA6FqC,eAAe,EAAA,CAAA;sBAA1D,YAAY;uBAAC,gBAAgB,EAAE,CAAC,QAAQ,CAAC,CAAA;;;MElK/B,mBAAmB,CAAA;AAQ9B,IAAA,WAAA,GAAA;AANQ,QAAA,IAAA,CAAA,sBAAsB,GAAG,IAAI,eAAe,CAA6B,IAAI,CAAC,CAAC;AAC/E,QAAA,IAAA,CAAA,yBAAyB,GAAG,IAAI,eAAe,CAAkC,IAAI,CAAC,CAAC;;AAEvF,QAAA,IAAA,CAAA,wBAAwB,GAAG,IAAI,eAAe,CAA+B,IAAI,CAAC,CAAC;KAG1E;AAEjB,IAAA,iBAAiB,CAAC,KAA4B,EAAA;AAC5C,QAAA,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC3C;IAED,oBAAoB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,wBAAwB,CAAC,YAAY,EAAE,CAAC;KACrD;AAGD,IAAA,eAAe,CAAC,KAA0B,EAAA;AACxC,QAAA,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACzC;IAED,kBAAkB,GAAA;AAChB,QAAA,OAAO,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,CAAC;KACnD;AAED,IAAA,wBAAwB,CAAC,KAA+B,EAAA;AACtD,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC5C;IAED,2BAA2B,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,yBAAyB,CAAC,YAAY,EAAE,CAAC;KACtD;8GAjCU,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAnB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cAFlB,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAEP,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;MCEY,6BAA6B,CAAA;AA8CxC,IAAA,WAAA,GAAA;;;QAzCS,IAAM,CAAA,MAAA,GAAW,KAAK,CAAC;;;QAGvB,IAAa,CAAA,aAAA,GAAY,IAAI,CAAC;;QAE9B,IAAc,CAAA,cAAA,GAAY,KAAK,CAAC;;;QAQhC,IAAW,CAAA,WAAA,GAAW,EAAE,CAAC;;;QAGzB,IAAqB,CAAA,qBAAA,GAAY,KAAK,CAAC;AA0B9C,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,EAA4B,CAAC;KACnE;AAED;;AAEG;AACH,IAAA,WAAW,CAAC,KAA2B,EAAA;;;;;;;AASrC,QAAA,IAAI,CAAC,qBAAqB,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC;AAEzD,QAAA,IAAG,IAAI,CAAC,KAAK,IAAG,SAAS,EACvB;AACE,YAAA,IAAI,KAAK,GAAG,IAAI,aAAa,CAAC,SAAS,EAAC,EAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC;AAC1D,YAAA,IAAI,WAAW,GAAG,IAAI,aAAa,CAAC,OAAO,EAAC,EAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC;;;;;AAK/D,SAAA;KACJ;AAED,IAAA,eAAe,CAAC,KAA+B,EAAA;AAC7C,QAAA,IAAI,CAAC,qBAAqB,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC;AACzD,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;;KAErC;8GA/EU,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAA7B,6BAA6B,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,aAAA,EAAA,eAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,WAAA,EAAA,aAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA4C7B,wBAAwB,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECpDrC,gxBAcA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,wBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,UAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,gBAAA,EAAA,sBAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA,EAAA;;2FDNa,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBALzC,SAAS;+BACE,UAAU,EAAA,QAAA,EAAA,gxBAAA,EAAA,CAAA;wDAKX,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBACG,QAAQ,EAAA,CAAA;sBAAhB,KAAK;gBAGG,MAAM,EAAA,CAAA;sBAAd,KAAK;gBAGG,aAAa,EAAA,CAAA;sBAArB,KAAK;gBAEG,cAAc,EAAA,CAAA;sBAAtB,KAAK;gBAKG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBAGG,WAAW,EAAA,CAAA;sBAAnB,KAAK;gBAGG,qBAAqB,EAAA,CAAA;sBAA7B,KAAK;gBAoBI,aAAa,EAAA,CAAA;sBAAtB,MAAM;gBAG8B,KAAK,EAAA,CAAA;sBAAzC,SAAS;uBAAC,wBAAwB,CAAA;;;AEpDrC;MA6Ba,qBAAqB,CAAA;8GAArB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA,EAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,iBAd9B,wBAAwB;YACxB,qBAAqB;YACrB,6BAA6B,CAAA,EAAA,OAAA,EAAA,CAG7B,YAAY,CAAA,EAAA,OAAA,EAAA,CAGZ,wBAAwB;YACxB,qBAAqB;YACrB,6BAA6B,CAAA,EAAA,CAAA,CAAA,EAAA;AAIpB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,aAFrB,CAAC,4BAA4B,EAAC,mBAAmB,CAAC,YAP3D,YAAY,CAAA,EAAA,CAAA,CAAA,EAAA;;2FASH,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAhBjC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE;wBACZ,wBAAwB;wBACxB,qBAAqB;wBACrB,6BAA6B;AAC9B,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,YAAY;AACb,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,wBAAwB;wBACxB,qBAAqB;wBACrB,6BAA6B;AAC9B,qBAAA;AACD,oBAAA,SAAS,EAAE,CAAC,4BAA4B,EAAC,mBAAmB,CAAC;AAC9D,iBAAA,CAAA;;;AC5BD;;AAEG;;ACFH;;AAEG;;;;"}