diff --git a/.gitignore b/.gitignore index 3717c17..24cf634 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ tmp +.envrc + # Logs logs *.log diff --git a/Caddyfile b/Caddyfile index 9056145..d00a4c3 100644 --- a/Caddyfile +++ b/Caddyfile @@ -1,5 +1,27 @@ :80 -root * dist/ +# Enable the static file server file_server -try_files {path} /index.html + +# Add compression +encode zstd gzip + +# Reverse proxy configuration for the API +reverse_proxy /api/* { + to http://localhost:11434 + + # basicauth /* { + # apitoken $2a$14$sI1j0RbhzKHMZ4cHU8otHOkB3Dgl9egF2D.CXB6C0/Qk5dtaMHS/u + # } + # Remove Origin + # header_up -Origin + # Add a new Origin header + # header_up Origin http://127.0.0.1 +} + +root * dist/ + +log { + output stdout + format json +} diff --git a/README.md b/README.md index 072b3be..2538911 100644 --- a/README.md +++ b/README.md @@ -126,6 +126,7 @@ $ parcel build index.html
Tasks + - [ ] Personas / Characters / Custom GPTs - [ ] Ollama authentication - [ ] Edit message / response - [ ] Clear chat diff --git a/css/ChatList.scss b/css/ChatList.scss index 7ed3fcd..ef5fba2 100644 --- a/css/ChatList.scss +++ b/css/ChatList.scss @@ -9,6 +9,10 @@ transparent ); // Fade out title instead of ellipsis } + + .button { + padding: 0.25rem 0.75rem; + } } .list-item.selected { diff --git a/css/DropDownMenu.scss b/css/DropDownMenu.scss index d82ee3d..b059ba8 100644 --- a/css/DropDownMenu.scss +++ b/css/DropDownMenu.scss @@ -7,6 +7,12 @@ position: absolute; top: 100%; /* Position below the button */ display: none; /* Hide initially */ + font-size: 0.75rem; + white-space: nowrap; + + i[class^='icon-']::before { + padding-right: 0.5rem; + } @extend %box-shadow; diff --git a/css/button.scss b/css/button.scss index 1bba664..fc489fb 100644 --- a/css/button.scss +++ b/css/button.scss @@ -1,18 +1,20 @@ button { background-color: var(--button-secondary-bgcolor); z-index: 1; - padding: 0.75rem 1rem; border: none; cursor: pointer; +} + +.button { + padding: 0.75rem 1rem; i { - width: 1rem; // Center the icon display: inline-block; } } -button:hover, -button.selected { +.button:hover, +.button.selected { @extend %box-shadow-hover; } diff --git a/css/icons.scss b/css/icons.scss index 055b9bc..d48b640 100644 --- a/css/icons.scss +++ b/css/icons.scss @@ -15,6 +15,19 @@ svg { vertical-align: middle; } +.icon-flag::before { + content: "\1F6A9"; /* Triangular Flag on Post */ + content: "\26A0"; +} + +.icon-good::before { + content: "\1F44E"; /* Thumbs Down */ +} + +.icon-bad::before { + content: "\1F44D"; /* Thumbs Up */ +} + .icon-close::before { content: '\00D7'; } @@ -60,10 +73,14 @@ svg { content: '\1F4E9'; } -.icon-delete::before { +.icon-delete-alt::before { content: '\274C'; } +.icon-delete::before { + content: '\2716'; +} + .icon-abort::before { content: '\00D7'; color: var(--red); diff --git a/css/modal.scss b/css/modal.scss index 80c5d19..7aeeee2 100644 --- a/css/modal.scss +++ b/css/modal.scss @@ -19,7 +19,8 @@ border-bottom: 1px solid var(--border-color); .button { - background-color: var(--light-text-color); + color: var(--text-color); + background-color: var(--bg-color); padding: 0.35rem; line-height: 0.5rem; border-radius: 0.1rem; diff --git a/css/reset.scss b/css/reset.scss index 4df1480..9b24586 100644 --- a/css/reset.scss +++ b/css/reset.scss @@ -140,5 +140,5 @@ html * { } html { - font-size: 16px; /* Standard font size for body, use rem to modify font-size */ + font-size: 14px; /* Standard font size for body, use rem to modify font-size */ } diff --git a/dist/index.html b/dist/index.html index 20ff63d..b03f0bb 100644 --- a/dist/index.html +++ b/dist/index.html @@ -15,7 +15,7 @@
- - - - @@ -169,25 +169,31 @@

Chat settings

+
diff --git a/dist/script.d573be0b.js b/dist/script.d573be0b.js index 7aa31ca..c3466a7 100644 --- a/dist/script.d573be0b.js +++ b/dist/script.d573be0b.js @@ -1108,10 +1108,14 @@ Object.defineProperty(exports, "__esModule", { exports.CopyButton = void 0; class CopyButton { constructor() { - document.addEventListener('click', function (event) { + document.addEventListener('click', event => { // Check if the clicked element has the class 'copy-button' if (event.target.classList.contains('copy-button')) { const targetSelector = event.target.getAttribute('data-target'); + if (!targetSelector) { + console.error('The data-target attribute is not set'); + return; + } const textToCopy = document.getElementById(targetSelector).innerText; // Create a temporary textarea element const textarea = document.createElement('textarea'); @@ -1799,6 +1803,7 @@ class ChatArea { }); } createMessageDiv(message) { + const domId = `chat-message-${message.id}`; const role = message.role; const content = message.content; // Get the template and its content @@ -1808,9 +1813,14 @@ class ChatArea { const messageDiv = messageClone.querySelector('.chat-message'); const textSpan = messageClone.querySelector('.chat-message-text'); const deleteButton = messageClone.querySelector('.delete-chat-message-button'); + const copyButton = messageClone.querySelector('.copy-chat-message-button .copy-button'); + const goodButton = messageClone.querySelector('.good-chat-message-button'); + const badButton = messageClone.querySelector('.bad-chat-message-button'); + const flagButton = messageClone.querySelector('.flag-chat-message-button'); // Set the class for role and text content messageDiv.classList.add(`${role}-chat-message`); + messageDiv.id = domId; textSpan.textContent = content; messageDiv.spellcheck = false; @@ -1822,6 +1832,22 @@ class ChatArea { await _AppController.AppController.deleteChatMessage(message.id); messageDiv.remove(); }); + copyButton.dataset['target'] = domId; + flagButton.addEventListener('click', async () => { + console.log('flagged'); + message.quality = 'flagged'; + await message.save(); + }); + goodButton.addEventListener('click', async () => { + console.log('good'); + message.quality = 'good'; + await message.save(); + }); + badButton.addEventListener('click', async () => { + console.log('bad'); + message.quality = 'bad'; + await message.save(); + }); return messageDiv; } handleChatDeleted(chat) { @@ -2086,7 +2112,7 @@ var parent = module.bundle.parent; if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') { var hostname = "" || location.hostname; var protocol = location.protocol === 'https:' ? 'wss' : 'ws'; - var ws = new WebSocket(protocol + '://' + hostname + ':' + "63542" + '/'); + var ws = new WebSocket(protocol + '://' + hostname + ':' + "60773" + '/'); ws.onmessage = function (event) { checkedAssets = {}; assetsToAccept = []; diff --git a/dist/script.d573be0b.js.map b/dist/script.d573be0b.js.map index e8a20f9..30efbb9 100644 --- a/dist/script.d573be0b.js.map +++ b/dist/script.d573be0b.js.map @@ -1 +1 @@ -{"version":3,"sources":["js/UINotification.js","js/models/Settings.js","js/Event.js","js/Dom.js","js/debounce.js","js/Database.js","js/Migrations.js","js/models/BaseModel.js","js/models/ChatMessage.js","js/models/Chat.js","js/AppController.js","js/ChatListItem.js","js/DragAndDrop.js","js/ChatList.js","js/DownloadChatsButton.js","js/models/LocalStorage.js","js/Sidebar.js","js/CopyButton.js","js/OllamaApi.js","js/DownloadButton.js","js/DropDownMenu.js","js/Modal.js","js/List.js","js/models/Models.js","js/ModelsList.js","js/SettingsDialog.js","js/ChatSettingsDialog.js","js/Hoverable.js","js/ChatTitle.js","js/ChatForm.js","js/ChatArea.js","js/App.js","js/script.js"],"names":["simpleHash","str","hash","i","length","char","charCodeAt","UINotification","constructor","message","type","id","JSON","stringify","domId","container","document","body","template","getElementById","content","_bindEventListeners","window","addEventListener","event","key","hide","show","notification","initialize","originalConsoleError","console","error","_len","arguments","args","Array","_key","apply","handleApplicationError","debug","clone","cloneNode","notificationElement","querySelector","textContent","classList","add","closeButton","onclick","appendChild","remove","exports","Settings","set","value","stringValue","localStorage","setItem","e","get","defaultValue","undefined","getItem","parse","removeItem","getUrl","uri","baseUrl","URL","href","setUrl","url","getModel","setModel","model","getSystemPrompt","setSystemPrompt","systemPrompt","getModelParameters","setModelParameters","modelParameters","getCurrentChatId","setCurrentChatId","chatId","Event","listen","eventName","handler","detail","emit","data","log","CustomEvent","bubbles","dispatchEvent","DOM","showElement","element","hideElement","enableInput","removeAttribute","disableInput","setAttribute","debounce","func","wait","timeout","funcWrapper","later","clearTimeout","setTimeout","Database","dbName","objectStores","migrations","dbConnection","open","Error","Promise","resolve","reject","request","indexedDB","version","onerror","target","onupgradeneeded","db","result","transaction","currentTarget","upgrade","oldVersion","onsuccess","storeName","mode","objectStore","store","handleRequest","put","delete","getAll","clear","Migrations","database","funcName","upgradeFunc","upgradeToVersion2","context","createObjectStore","keyPath","autoIncrement","chatMessages","createIndex","unique","_Database","require","_Migrations","BaseModel","Object","assign","name","create","save","records","map","getAllByIndexAndId","indexName","index","messages","export","_BaseModel","ChatMessage","getAllByChatId","_ChatMessage","Chat","addMessage","getMessages","chat","_Event","_Chat","_Settings","AppController","updateChat","createChat","title","deleteChatMessage","messageId","deleteChat","getCurrentChat","setCurrentChat","clearChats","_AppController","ChatListItem","chatList","selected","setTitle","bindEventListeners","render","onMouseover","bind","onMouseout","onClick","selectChat","chatTitle","DragAndDrop","selector","listItems","querySelectorAll","draggedItem","initializeDragAndDrop","forEach","item","handleDragStart","handleDragOver","handleDrop","handleDragEnd","preventDefault","currentHTML","innerHTML","_ChatListItem","_DragAndDrop","ChatList","then","handleChatCreated","handleChatDeleted","handleChatsCleared","handleChatUpdated","handleChatSelected","appendChat","elements","listElement","previousListElement","newListElement","currentChatId","chats","chatListItem","DownloadChatsButton","button","exportChat","exportChatMessages","jsonData","blob","Blob","createObjectURL","a","createElement","download","click","revokeObjectURL","errorCode","LocalStorage","_debounce","_ChatList","_DownloadChatsButton","_LocalStorage","Sidebar","settings","newChatButton","clearButton","hamburgerButton","searchButton","downloadChatsButton","searchRow","searchInput","toggleSearch","performSearch","handleNewChat","handleClear","toggle","listItem","scrollIntoView","behavior","block","inline","focus","escapeRegExp","string","replace","query","trim","queryContent","regex","RegExp","matches","filter","match","test","includes","contains","CopyButton","targetSelector","getAttribute","textToCopy","innerText","textarea","select","execCommand","removeChild","alert","OllamaApi","abortController","send","onResponse","onError","onDone","response","postChatMessage","handleResponse","AbortController","signal","fetch","method","headers","ok","status","reader","getReader","partialLine","isRequestDone","done","read","textChunk","TextDecoder","decode","lines","split","pop","line","responseData","printResponseStats","abort","total_duration","totalDurationInSeconds","loadDurationInSeconds","load_duration","promptEvalDurationInSeconds","prompt_eval_duration","responseEvalDurationInSeconds","eval_duration","tokensPerSecond","eval_count","output","created_at","toFixed","prompt_eval_count","getModels","json","models","catch","DownloadButton","targetId","downloadElementContent","elementId","filename","DropDownMenu","buttonSelector","dropDownMenus","init","menuElement","closest","dropDownMenu","toggleMenu","menu","Modal","modal","handleShow","handleHide","List","containerId","items","clickHandler","setItems","setSelected","getSelected","ul","li","_OllamaApi","Models","load","getNames","findModelByName","find","_List","_Models","ModelsList","selectedModel","modelList","handleModelsLoaded","_Modal","_UINotification","_ModelsList","SettingsDialog","showButton","urlInput","modelInput","systemPromptInput","modelParametersInput","refreshModelsButton","loadSettings","parsedValue","prettyJSON","refreshModels","ChatSettingsDialog","Hoverable","hoverable","ChatTitle","defaultTitle","hasFocus","activeElement","handleSave","blur","ChatForm","chatHistory","messageInput","sendButton","abortButton","_Hoverable","_ChatTitle","_ChatForm","ChatArea","chatForm","editChatButton","scrollToTopButton","scrollToEndButton","deleteChatButton","createMessageDiv","scrollToEnd","scrollToTop","handleEditChat","handleDeleteChat","currentMessage","next","previous","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","role","messageClone","messageDiv","textSpan","deleteButton","spellcheck","dataset","stopPropagation","scrollTop","scrollHeight","_Dom","_Sidebar","_CopyButton","_DownloadButton","_DropDownMenu","_SettingsDialog","_ChatSettingsDialog","_ChatArea","App","run","app","sidebar","chatArea","ollamaApi","settingsDialog","chatSettingsDialog","downloadButton","copyButton","initializeElements","logInitialization","msg","handleAbort","handleKeyPress","history","pushState","enableForm","shiftKey","sendMessage","disableForm","userMessage","createChatMessage","responseElement","requestContext","requestData","prompt","system","options","handleResponseError","handleDone","sanitizedContent","sanitizeContent","getIdParam","location","pathname","_App"],"mappings":";;AgCAA,IAAA6e,IAAA,GAAAhV,OAAA;AACA,IAAAwB,KAAA,GAAAxB,OAAA;AACA,IAAAkB,YAAA,GAAAlB,OAAA;AAEA;ADJA,ArBAA,AoBAA,ADAA,AhBAA,AFAA,AeAA,AEAA,AXAO,AZAA,AFAA,AgBAA,ALAP,AFAO,AQAA,AlBAA,AyBAA,ALAA,AhBAA,AeAP,AGAA,ANAO,AOAP,ATAA,AhBAA,AIAO,AGAP,AEAA,ADAA,AOAO,AQAP,AtBAO,A+BKP,IDLA0O,ArBAAnN,AoBAAa,AjBAAb,AFAAa,AeAAA,AEAAb,AdAAC,AUAA2M,ACAAM,ATAAzI,ATAAjG,AEAAgB,ADAAA,AeAAQ,ENAa+G,AZAAnL,AFAAhB,AgBAA+P,APAAjJ,AQAAsJ,AlBAA/Q,AyBAAgU,ALAApC,AhBAAjO,AYAA6J,AHAAjD,AdAAvM,GEAG,AWAhB,AUAA,AxBASrD,AIAOwG,CMAhB,AGAA,AeAA,AzBAiB,AmBAA,AGAjB,AFAA,CrBAkB,AoBAA,CRAlBqD,AZAmB,AsBAnBA,CdAAA,AGAAA,AeAAA,AHAAA,ATAA,ATAA,AgBAAA,ClBAqB,AIArB,ADAA,APAqB,CIAC,AsBAA,ATAA,AjBAA,A+BKPhI,CfLQ,AUAA,ArBAA,AYAA,AFAvBgI,ATAAA,CUAwB,ALAA,ANAA,AFAArD,AKAxBqD,ADAAA,CsBAA,AnBAA,AeAA,AdAyB,AQAA,AhBAApD,AWAA,CgBAzB,AjBAA,AMA0B,AIA1B,AxBAmBzG,AeAO,CLA1B,AGAA,AeAA,ATA2B,AMA3B,AzBAoBC,AuBApB,COAA4J,AnBAAA,AeAAA,APA4B,CYA5BA,A3BA6B,CYA7B,AhBAuB,AOAvB,CHA+BnD,AKA/B,ADAA,CRAyB,AgCKA7E,CAAA,EFLzB,AnBAA,AeAA,AtBAmC,A4BKP,CDL5B,C3BAqC;A2BCrC,ArBAA,AoBAA,ADAO,AhBAP,AFCO,AeDP,AEAA,AdAA,AOAO,AGAP,ACAA,ATAA,ATAA,AEAA,ADCO,AeDP,ENAErB,AZAAA,AFAA,AgBAAA,APAAA,AQAAA,AlBAA,AyBAAA,ALAAA,AhBAA,AYAAA,AlBAA,AIAA,AWAA,AdAA,A+BKA,EDLF8K,ArBAAD,AoBAAD,AjBAAyC,AaAAzC,AEAAa,AdAAlB,AUAAK,ACAAmN,ATAAnN,ATAAtB,AEAAiB,AcAAO,EMAauO,AlBCA3N,AUDA2K,ArBAP3W,AIAAyG,AICOkE,EwBILG,CtBLR,APAS/E,ADAAX,AIAAsC,CwBAT,AJAA,AFAA,ARAA,AhBAU,CqBAQ,CXAlBiC,AWAmB,CUAnB,ADAAA,AJAAA,ATAarJ,AZAAA,AcAAA,APAAA,AQAAA,AOAAA,ALAAA,AEAbqJ,ANAarJ,AFAbqJ,AhBAa,AIAA,AmBAb,CMAqB,AZAR,AZAC5C,AcAD,APAC8F,AQAD,AOAC7G,ALAAgR,AJAD,AlBAC,C6BAQ,A3BAP5R,AKAf,CwBAAuE,AdAgB,AEAA,ALAhB,AMAgB,AlBAAtE,AIAA,AYAA,ATAhB,AcAAsE,CVAA,ALCwB,CGAC,AiBDzB,ArBAAA,AyBKY,CtBLZ,ACC0B,AGD1BA,ARAmB,AmBAnB,AhBAAA,AuBKahI,CFLb,AjBAAgI,AaAA,ArBAoB,AFAA5D,AGAA,AkBApB,ARAA,CYAA4D,AzBAqB3D,AwBAA,CtBACgB,AOAA,AaAtB2C,CMAA,AJAuB,AJAvB,CXAwB,CVAC,AoBAA,AfAzB,COAA,ALAA,ADCiCE,CKDjC,AXA2BvE,AoBAA2R,CMA3B,AzBA4B,CsBA5B,AOKuB,C7BLO,A6BKN,CAAC,CVLO,EjBAE,AHAA,AoBAA/K,EjBAEjF,AHAA,MoBAM,EAAE,EjBAE,AGCJ,CAAC,CHDK;A0BChD,ArBAA,AoBAA,AjBAA,AaAA,AECO,AdAA,AUDP,ACAA,ATAA,ATCO,AEAA,AcDP,EMAE3G,AlBCAA,ALDA,AeAAA,ArBAA,AICA,AIAA,AODA8C,AdAA,A+BKA,EDLF8H,ArBAAL,AoBAAmP,AjBAApM,AaAAwK,ATAItX,AZAA,AFAAkF,AgBAAlF,APAA,AQAA,AlBAAM,AyBAA,ALAA,AEAJ2W,ANAI,AOAJO,ATAAnN,AOAAqM,CRAKpU,CaCQiW,AdAAzK,APAA/E,AEAAiB,AMDPvJ,CfAC,CKAC,AOAA,AQAA,AOAA,ALAA,AJAA,AcKAoJ,C3BLC5D,AOAA+F,AQAAqJ,AOAAnQ,ALAAnF,AhBAAqH,AYAA0K,AFAT,AZCS,AWDA,AdAAxP,C8BAT,ALAA,AxBAU,AOCO,CNDN,ADAA/B,AsBAX,AxBAWpB,AeAAoD,CEAC,AdAAT,AgBAA,AHAZ+G,AhBAY,ACAAvG,C8BAZuG,AFAarJ,AlBCAA,AeDbqJ,ATAatI,AEAAA,AEAAf,ApBAAiB,C6BAb,ADAa,AlBCC0J,AUDArK,AGAd+I,ADAA,CKCsB,AvBDP,AoBAf,AzBAe,AOCO,ACAPhI,CEDf,AmBAgB,AhBAhB,AeCuB,ADDP,ArBAAuG,ANAA,AOCO,AQDP,AdAA,C6BAhByB,AxBAiBZ,AiBAjBY,CZCkB,ANDA5C,AOAA,AUAA,AGAlB4C,AzBAkB1J,AICAyG,AWDA,AdAArD,CSAlBsG,AGAAA,AcAmB3D,ANAA,ALAnB,AhBAmB,ASCO6D,CsBD1B,ApBCoBoC,AeDpB,CvBAqB,ASAAnL,AUAAA,ADAA,AGArB,CrBAsBmC,AHAAlD,CoBAC,AnBAA,C6BAvB,AzBAwB,AaAA,AKAxB,CTCgC,ARDP,AmBAzB,AzBAyB,AQCA4B,APDA,CSAzB,AGAA,ACCiC,AMDP,AOAA,A3BAAzB,AQCD,CNDE,AIAA8H,AYAA,CPCC,ARDA,ADAA3C,AMCA,CSDC,AdAA,AgBAA,APAA,AUAA,AlBCAqB,COACwF,AMDA,AEAA,APAAa,AUAA9L,AlBCD,CcDE,ClBAC,AICO,A4BIpB,CAACU,ChCLc1B,CAAC,EiBAE,AdAA,AgBAA,AjBAA,AFAA,CWCC,ARDA,AGAA,CWAC,AEACqB,AjBAAA,AFAD,ASCJ,CEAK,ALDA6G,AGCJ,GWDO,AYKb,CbLe,AjBAA,AoBAD,AUKb,CVLc6O,AUKb,CpBLc,CAACnK,COAG,AjBAA,CeADvL,CXAC,EAAE,EWAE,CLAC,CKAC,ALAA,AUAA,CAAC;ASCzD,ArBAA,AoBAA,AjBAA,AaAA,AFCO,ACDP,ATAA,AOCO,ASIP,EJJEhB,AdAAA,AIDA,AXCAA,AEAA,EsBDFyb,ArBAA3Q,AoBAA6O,ADAI,AhBAJ9O,AFCI,AeDJ4M,ArBAI,AFAA,ASAA,AQAA,AOAA/R,ALAA,AhBAAnE,AeAA,AIAJkW,ATAAhM,AhBAI,AIAmC,AICnC,AODA,AdAA,EgBAE,AEAA,AjBAAzG,AsBCO0S,ADAAP,EQDb,AFAQ,AlBCA,ANDA,AOAA,AQAA,AEAA,ADAA,AZCA1M,AMDA,AdAA,C4BAC6O,AhBAT,AFCS3O,ANDAjE,AOAAgG,AQAAoJ,AEAAa,ADAArW,CrBACT,AQCA,CuBDVwJ,ALAA,AvBAW,AwBAA,ArBAA,AmBAX,CZAAA,AcAYyP,ArBAA9W,AiBCO,CbDnB,ACCa,AiBAAhC,AdAAA,AZDA,AEA0ByB,AGC1BzB,AgBAO,CODpB,AJAAqJ,AECa,AdAA,AZDCrI,AoBAA,ADAA,AIAdqI,AzBAc,AOCAlE,ACAA,CLDC,AKCAsD,CEDfY,ACCgBsB,AiBAA,AdAA,AUAO,CMDvBtB,ARAiBsN,AhBAA,AeAArW,AGCO,AxBDPb,AIAsB,C2BAvC,AzBCO,AUDP,ATCkB,AEAAgL,CIDlB,AXAmB,AOCAtF,CoBDC,AlBCA,ACDA,AVAAF,AFAA,AIAmBvD,AGCnB,CmBDpB,ArBAqB,AsBAA,AFArB,ATAA2H,AhBAqBvJ,CoBAC,AEAA,ADAA,CXAtB,AmBAuBU,AjBAA,AHCA,ADAA,CsBDvB,AzBAwBkG,AsBAA,AnBCA,CYDClG,AXCA,CPDC,CUAC,AVAA,CyBAC,AXA5B,CZAuC,CAAAZ,CyBAR,A7BAA,C6BACe,A7BAAhB,CoBAC,ApBAA,AQCA,CYDC8M,ApBAA,CQCC,CHDC,ADAG,EAAN9K,IAAI,IyBAS,CAAC,EzBAVC,CgBAa,AZCA,CYDC,AdCZiG,AEAY,GJDd,CgBAkB,AhBAlBpG,CgBAmBoU,GhBAnB,EyBAwB,AvBCX,CuBDY,AzBAzBhU,IAAA,IgBAiC,CAAC,ChBAlCA,IAAA,EEC6B,CFD7BJ,GECiC,CAAC2F,AFDlC,EAAAvF,IAAA,CEC0C,GAC3E,CAAC;AyBDL,ArBCO,AoBDP,AjBAA,AaAA,ADAA,ATAA,AgBMAR,E7BNE,AqBCArB,ANAA,AVAA,AeAA,EQDF0b,ADAA9B,ADAI,AhBAJnO,AFCI,AeDJuM,AECI,AvBDA,ASCA,AFDA,AQAA,AlBAA,AyBAA,ALAA,AhBEA,AeFA,AIAJlN,ATAAwE,AhBAI5P,AOCA8J,AEAArE,CPDC,CQCQ4F,AODP,AEAA,AjBAA,AED2BpJ,AWC3B,AdAA,E4BAE,AlBCA,AiBAA,AvBDA,ASCA,AFDA,AQAA,AOAA,ALAA,ADAA,AHCA4Q,AlBDA,ASCA,CoBDCgH,AlBCA5N,AiBAAqN,AvBDApS,ASCA2H,AFDA5B,AQAAoJ,AOAAjK,ALAAF,ADAA0K,AZCA1R,AcAAyQ,CNDCrU,AEAAA,AbEA0H,AFH2B,AGE3B,AyBKA,ChCNC,AID0B7G,AGE1B4H,AyBKA,CDNX,AbCY8I,AlBDA7S,AeAAsD,AdAAA,A+BMA,CFNZ,AVAa,AICAhD,ANAAgE,AODb,ATAA,AgBMawJ,CZNC,ACAA,AGCAjB,CODdlD,ALAA,ATAe,AEAA,ALCA,AMDA,AhBDsB,AKEtB,AcAA,CODfA,AbAgB/B,AEAAA,ADCA,AODhB+B,ATAAA,AhBAgB,CWCC,AWDA,ADAA7I,AdCA,AyBKA,CnBNjB,AaAA6I,AZCkB7I,ARCA,AYDA2E,AXAA,AEAA,AcAA,ASKA,CtBLQ,ANFWzD,CMEV,ACAPiK,AWDAC,AtBAA,AuBCA,CMDC,AhBArBvC,AeCqB,AvBDA,ACEC,ANFD,C+BArB,AdAsB,AEAA,AKCA,ANAA,AXAA,AEAA,CqBDtB,AbAuB/G,AEAAA,AMAvB,ATAA,APCuBnC,AMDA,AdAA,C4BACK,ADCA,AvBDA,AmBCAmX,ANAAnF,AXAArN,AyBKA,CNNxB,ALAyB,ArBAAzF,ASCA,CKAC,AODAiB,ANAAP,AdAAA,CaCCgC,AaDA,CdA3B,AFC4B,ANDA,AsBAA,ALAA,AlBDS,AGET,CFDC,AsBAA,A3BAA,AIDQP,AGER,CFDC,AOAA,AGAA,AdAA,CWAC,AGAAxB,AdAAA,C4BAC,AZAA,AEAA,APAA,AZAAR,C6BACc,AZAA+Q,AEAAA,AfDI,CwBEH,AVAA,EAAEe,AlBDA,CwBCC,EAAE,CVAC,ARCA,AeFA,ANAA,AdAA,CgBAC,AEAA,ALCA,AODA,ANAA1P,AdAAA,CgBAC,AEAA,CDCC,CZCC,CAACqE,AeFA,AHCAsL,CGDCpS,ANAA,AdAA,C4BAC,AdAA,AdAA,C4BAC,GRAG,AHCA,CZCE,AeFD,CHCC,CZCC,CWFC,CAAC,CHCC,CGDC,AHCA,CKDC,CAAC,EAAE,CUAC,CAAC;AEChE,ADCO,AjBAA,AaAA,ADAA,ATDP,ENCE,APAA,ASDA,AQAA,AlBAA,AyBAA,ApBCA,ACCA,AeAA,ASIA2b,EDNFxQ,AFAI,AlBCA,AiBAA,AvBDA,ASCA,AQDA,AhBEA,AeFA,AGCA,ANAA,AFDJ8D,AhBAI7P,AIFiC,AKGjC,EqBASma,AjBAAtM,AaAAqL,ADAAX,AVDPhV,AdAAA,E4BAE,AlBCA,AiBAA,AXDA,AZAA,AcAA,ALCA,AQDA,ADAA,AGCA,AxBDA,C6BACuW,AlBCA5Y,AiBAA8E,AvBDAiB,AFCAhB,AWAAmG,AQDAC,ADAAvJ,AGCAoV,ADCAlU,CjBACiF,AYDAzB,ATAA,AuBKL,ChCNMxH,AgCMLwc,GFLe,AjBAA,AIDPtK,ARCAvH,AuBKL,CtBLMW,AoBAO,AjBAA,ASDP,AtBAA,AQEAV,AeAA5G,ASIL,CrBLM,AiBAA,ANDA,ACED,ASIJ,CVNM,AJCA,CaDjB,APCkB,AxBDAhE,AeAA,AQEA,AtBFA,C4BAC,AlBCAc,AiBAAA,AvBDA,AUAA0C,AdAAA,CECCyC,AkBDA,AHCA,AOAO,CMD3B0D,A5BCqB3D,AGCA,AkBDA,CKDClF,AxBAAmG,ALAA,CqBAC,ArBAA,C0BCQ,ApBCP,AUFxB,AhBAwB,CUCCqE,AcAAyL,CdAC9L,AKDA,AdAA,CUCC,AiBAA,AdAA,AODA,ALA3BtB,ADA2BpI,AdAAA,C8BA3B,ApBEON,AiBDqBA,AXDA,AdCA,AWAA,ARCA,AeFA2V,CPCC,ARCA5N,AmBDO2N,AjBCP/L,CEDC,AmBDA,A1BCA,AKCA1F,AOFA,AdAA,C4BACjE,AZAAK,CPCCmE,ALDA,AUAAnC,AdAAA,CyBCQqT,ALDP,CAACjU,ALAlC,CQC6B,CdAO,AODA,AOCNmK,AhBCM,CSFCjF,AXEA,CIDC,AJCA,AGDb,ADCa,CCDZnC,EgBAe,CdCpB,AiBDqB,AHAA,CdCpB,AiBDqB,AXDA,ARCb,AMDa,AdAA,CgBAC0M,AOCN,AfAP,AMDa,AdAA,C4BAC,AHCA,AjBAblI,CoBDc,AHCA,AFANwN,CHDO,CAAC,GZCV,CAAC,CAAC,EmBAe,CAAC,AXDA,CAAC,EYAE,CAAC,ALCd,CAACE,EHDgB,CAAC,IVEjB,CAAC,AaDO,CbEhDzW,AMH+D,AOCd,CPDe,AOCd,EAAE+W,IbE7C,CAACzV,QaFyD,CbEhD,AaFiD,CbEhD,IAAI,CAAC;AoBF9B,AfAA,AgBMA,CAAC,CFLClC,AjBAAA,AaAAA,ArBDA,ASCA,AFAA2M,AQAAoJ,AlBAA,AyBAAjK,AFAA9L,AzBDA,AOEA,AEDA,AuBKA,EDNF2b,ArBCInS,AmBDA,AlBGA,AiBFA,AzBAA9D,AmBDA,AhBEA,AeFA,AGCA,ARDJ8J,AZFI,AIIA,AOFA,AQEA,AtBFA,CcAC,AdAA,CmBCCuG,AFDgB5Q,AHAhB,AdAA,CmBCA,CSDE,AlBGA,AiBFA,AXDA,AEAA,AGAA,AhBEA,AeFA,AGCA,CKDCsU,AlBGA/T,AiBFAoG,ARAA,AlBAA5G,AoBDA0R,AhBEAjO,AeFAnG,AGCAsJ,CdAC,ANHAzF,CMGCoD,APAA,AKCA,AeAA5G,CpBDCP,C2BACtC,AjBAAA,AaAAA,AxBAAkF,AuBAAlF,AVDAmD,AdAAA,C6BCA,AjBAA,AaAA,ATDC2O,AEAA0D,AjBCAzQ,AuBAD,AVDC,AdAA,C8BAd,A3BFe,AGIA0D,ACAA,CsBDC,AjBAA,AFEA,AeFA,ADAA,AjBCAsB,AOFA,AdAA,CSCC,AMDjB,CeAAV,ArBCkBsB,ANHAtE,COKC,APLD,CyBEE,AFCAyF,ArBCA,AeFA,ALApBzC,CbCqB,AwBAD,ALDC,ADAA5G,CXCC,APAAF,AgBDA,AbEA,CuBFC/B,AlBGA,ACFAmM,AVAA,AyBAA,ApBCAlE,CGDCtD,ACEAvE,AMHA,ALCD,AUDC,AlBFA,AGIA8I,CwBFxB,A5BCyB,AgBDA1I,AjBCAmE,CCAC,ASAA,CgBAC,AXDA3E,AOCA,ARD3B,CNC4B,AkBAA,ANDA,ADAA,AGCA,AjBCA,CGDC,AkBAA,A1BAA,AsBAA,ADCV,CJFW,AZEA0H,AgBAVxE,CMFW,AlBGA,AQHA4D,AjBCA,AmBDA,CQAC3G,AlBGAyB,ERFE,AKCA,CSFC,AdCA,AICA,ACAA,CSFCzB,AMEV,CJFW,AEAA,AdEA,AgBAV,CJFWkR,GEAG,CAAC3Q,EbEE,CGCC,CkBHC,AlBGA,AUHA,AbEA0D,CqBFC,ARAA,CAAC,AEEV,CAAC,CNFW,AEAA,CFACgN,AEAA,CXEC,CAAC,QqBFQ,CAAC,ClBGC,CAAC,AQHA,CFAC,AEAA,CFAC,CAACG,SAAS;AcC5E,AfCO,EaDL,AxBCA,ASCAjG,AQFA,AECA,AxBDA,ASEA,ADAA,AeAA,EQFFoL,ArBCI,AoBAA,AjBAA,AFEA,AeFA,AEAA,AzBAA,ASAA,AQAA,AlBAA,AyBAA,ANDA,AHDuB,AOEvB,AlBCA,CWHwB,CZGtB,AUDOzH,AZHPnJ,AWEA/E,AdAAA,E6BCE,AjBAA,AFEA,AiBFA,AXDA,AZCAsF,AcDA,APCA,AVAAzB,AyBAA,ANDA,AdEA,AEAAsF,CqBDC2B,AjBAA3G,AFEAA,AeFA,AEAAqG,AhBAAS,AeAA9G,ANDA7E,AICA,AzBDAnB,AOEA+G,CGDCkE,AgBAA,ADAA,CtBAC,ADAA,CGAC9D,AcDA,AbEA,CDDA,AcDC4O,AHCO,AhBDP,AeAA,AdAA,C8BAb,ArBCc,ARAC,AcAM,ADDPjU,AdAAA,CSCCoI,AkBAA,AvBAA,AFAA,AICA,CMDC,AFEA,AiBFA,ADAA,ArBCA9C,CyBFhBuC,ApBGiB6B,AiBFA,A1BAAnG,AyBAAhE,CGAC,AlBAA,ARHA,AGIA2I,CGDC,AGAAlJ,ADAAoM,ARHAzG,AKIAuE,AMFA,AdAA,CSCC,AICAoB,ALAD,AMFC,AdAA,CSCC,AoBAA,AhBCD,ARAC,CKCC,ALDC,ACAD,AEAA,CKAC,CiBFvB,CDCyBiN,AnBEA,CCFC,AVAC,AEHD,CSGC,ADAClM,AaAD,ArBHA,CSGClM,AXAA,AmBDA,AICA,CdEC,AUHA,CVGCgK,AUHA,CTCE,CcAA,CAAC,ACAA,ChBEC,AgBFA,ChBECO,AQHA,APCE,CODDsK,IRGI,EEFE,CAAC,CMDC,CWCV,AHAW,CGAV,AXDW,CWCV,AHAW,GZDG,AdAA,EcAErS,AdAAA,C0BCC,AZDA,AdAA,CYCC,APCAuF,ASFA,AdAA,CYCC,EMDE,AQCA,CRDC,AQCAsD,IrBCK,EAAC,CAAC,IqBDI,CAAC,CAAC,CAAC;AIAxE,AFAA,A7BAA,AQEA,EoBDE,AzBAA,AmBAAG,ADDA,AGEAL,ARDA9L,AOEA,EQHF4b,ArBCI,AoBAA,AjBAA,AFEA,AeFA,ArBAA,ASCA,AMDApb,AlBAA,AyBAA,ArBCA,AYHA,AOEA,AlBCA,AEAA,AMFA,AdAA,EkBAE,APCAqM,ARHA5G,E0BGE,AjBAA,AFEA,AeFA,ATDA,AZCA,ASCA,AZDAd,AyBAA,ATFA,AOEA,AlBCA,CuBDC2U,AjBAApZ,AFEAgF,AeFAwS,AZCA3J,AaDA7I,ALAAyG,AGAA+L,AlBCAnQ,AgBCAqP,CXFC,AUAApS,AlBHA,AKIAkF,CGDCnJ,ARHA,CCGC,AeAA,AlBAA,CGAC6F,AeAA7F,AJAAf,AOEAoX,CNHCpF,AfCA7R,AcAD,AZHCwB,AmBKD,CTDE,CHCC,AGDAZ,AZDA,AyBAA,AXAA,AOEA,COFC,AjBAA,AFEAoE,AgBFApE,ALAA,CpBAC,AEHA,AGIA,AEAA,CsBFlB,ALCmB,AJAA,AGAA,ArBHA,C0BGC,AjBAAP,AWCAsL,CbCC,AaDD,AjBAC5D,AEAA,CsBFrBmB,ALCsB7I,ATDA,AQCAA,CDCC,CMDC6Y,AnBEA,CMHC7Y,AZCA,CECC,CFDC,AOAA,AHCA6J,CIDC,ADAA,CmBD5B,AlBC6B1J,AOAA,CMAC,ANAA,AKAA,CCACA,ADAAA,CXCC,CGFC,AHEA,AaDA,CVDCoO,AUCA,GPAG,ERAE,AQAC/N,CNCA,CFDC,CkBAT,AhBCU,CgBDT,AjBAU,CiBAT,AjBAU,AOAC,AOAD,CDAC,AdAA,AaAA,CCAC,AdAA8L,AeAA,AFAA,CRDC,CAAC,AHEA,AMDE,GXCZ,CkBDc,AlBCbxC,IkBDiB,CAAC4B,CVDC,CAAC,ELCE,CAACD,CaAC,CAAC,EbAE,AHCb,CGDc,AeAA,AlBCb,CiBDc,ACAA,CdAC,AaAA,ACAA,CdAC,AcAA,CdACrL,ADAA,AHCb,CAACT,CGDc0M,CHCZ,CAAC,EGDe,CCAC,ADAA,CAAC;AmBA/E,AFDCjK,ArBEAA,EoBCCmJ,AzBAA,AwBDA,ANAAlL,ANDA,AdAA,E8BAFgb,ArBCIhX,AoBAA,AjBAA,AaAA,APDA,AGCA,AhBCA,AkBAAA,ACDA,ATAA,AZHA,AGIA,AEAA,AcCA,CJHC,AfFA,COIqB1E,ANDpB,AcDA,ALEA,AFDA0M,AQAA,AlBAAzH,AgBFA,CWAL,ArBEA,CsBAO,ADFPiU,AhBEO,AFCoB,AeDpB,AECAtN,AXFAiG,AKCA,AhBCA,AmBDA,ATAA,ATCA,AEAA,ADDP3H,AeEO,COFCiP,AjBAAxN,AaAAA,AECD,AzBAClG,ADDA,AoBAAgR,AGAAuB,ATAAzI,ATCAlI,AEAA0C,AcCA,CZDqB,AGApB,AFDA,CgBCC,AdAAsE,AFDAzN,ALCA,CFDC,ACCA,AYHA4R,ChBEE,AICDvL,AiBCA,CZDqB,AJApB,AgBCA1D,CZDqBiH,CDD1B,AmBFR,AZCe,AZCA7D,AmBCP,COFT,ArBCU5B,AODOnC,AOEP+B,ACDO,ATAA,APCA,CFAC0B,CsBHjB6S,AlBGsC,AHDtC,CuBDDhQ,ADCoB,AnBCoBlJ,ARApByF,AGAA,AYHA,AOEApF,ATAA,APCA0J,AcCA,CbFN,ALAO,AFCAxE,AWAA,AZDAP,AoBAA,ADAAtE,AEEA,CbFN,AODO,AZCA,ASCA,AODD,AbApBwJ,AeEqB,COFC7J,AhBCA,AUAP,ANHO,CIECwE,AhBCA6C,AeDA,AGCP,ARDOuH,AOEA,CNHC0C,AfCA,CAAC3R,C6BD1B,AFDC,AhBE0B,AaAA,AdAA,CCAC,AaAA,AvBCA,ASDA,AVAC,AuBAD,AhBCA,CIDC,AaAA,ARFA,AOEAQ,CtBCC,ADDA,C4BAC,ARAA,CQACA,CZFC,AVEhC,CFCiC,AYHAiS,CREN,AODO,CXEC,ACAV,CGDIjI,AHCHjB,CKDW,AYCP,EZDS,AYCP,CdDC,AHCH,CGDI,CeAQ,AlBCV,CKDW,AYCP,ACDO,AlBCVxB,CKDW6E,AYCP8K,CMDQ,CAAC,AzBAA,CAAC,CaFC,AXGV,CWHW7T,AFEd,ATCI,CSDH,CAAC,ATCIwE,CWHW,EAAErD,AOEA,CAAC,GbAG,AMFA,CNEC8G,AMFA,CYEC,CAAC,CNCN,CZDQ,AYCPA,CZDQ,GYCJ,CZDQ,AYCP,CZDQ,CAAC,EYCL,CAAC,AjBAf,CiBAgB,AjBAf;AwBDrD,A/BAA,EUCE,AgBAA,APDA,AQEAD,AHAA,EOFF8P,ADCI,AjBAA/Q,AFAuC,AiBCvCA,AvBDA,AFCArF,ADDA,AoBAA,ADAA5E,AIAA,ATAA,AZFAwF,AGGA,AEAA,CEDwC,CGCtC,AFDAuG,AQAA,AdCAlE,AYHA,AKIA,EOFE,AbDAnI,AQCA,ATAA,CcAC+Y,ALAAnB,ATAAzM,CFCC,AFDA,ASAA,AdCA,CJAC,AWAA8C,AFDA1N,AUAA,ADAAA,AZCA,CNAC8E,AiBDAmQ,AFFA,CSGChK,AJCA,CIDA,ApBAC,CeDC,AfCAxE,AEAA,CQFC,AUEA,ALDA,AJFA,AdAA,AKGA0C,CQFCzJ,AKCA,AhBCA,AYHAoS,AFEA,AZFA1M,AGGA,AgBCA,CjBDC,ACAAU,CwBFlB,ANCmB,CTAC,CcAC,AbDA,CcArBwC,AdAsB3G,AQCAlC,AlBCA,CaDC,AbCA,CuBDCA,AdAA+M,AZFA,AGGA,AEAA,CLHC,CgBECvM,CjBCC,ASDA,ASAA,ClBCC,ASDA,ASAA,CUD5B,AjBE6B,CAAC,AWDA,CXCC,AMDA,AFFA,AOEAL,CKAC,AjBAf,AeCA,ARDe2G,AFFAJ,CYECvG,AjBAf2K,AeCAA,AXFe,CAAC0G,ALCA,EAAE,CSAC,ClBCC,AiBDA,CjBCC,AiBDAiE,ACACjV,AHFD,CNEC,CAACgM,AMFA2F,CDCC,ADCV,CCDW,ADCV,CKAY,ALAX,CSAW,CLAC,AKAA,CKAC,AjBAf,AeCA,ARDe,CUAC,AjBAf,AeCA,APDiB,CRAhB,AeCA,AVHe,CLEdnF,AeCAA,ChBDgB,AQAA,AFFAgF,CNECvG,AQAA4J,EPAb,AeCA,CfDElL,AeCAA,ChBDe,CAAC,ECAZ,AeCA,AHDc,CAAC,CbAC,AMFA,EYEE,AjBAb,AeCA,AhBDakC,AMFA6F,CYEC,EVAE,CRAC,AQAA,CRAC,CAAC,AMFA,CAAC;AaEtE,A/BAA,EUEE,AgBAA5G,APDA2J,AGAA,AEEAoC,AjBDA,AEAA,AMFA,AdAA,E8BAFkE,ADCI,AnBAA,ANCA,AFAA,AWAA,AZDAxa,AyBCA,ATHA,AOEA,ATAA,AZFA4E,AmBIA,CTDC,AIHA,CLEC,AeCA,AdAA,AFDA0G,AQAA,ACAA,AHFA,EYEE,AnBAA,AgBCA,ArBDYpE,AmBAZ,ATAA,CcACsR,AnBAArU,AgBCAA,AFDA2S,ATAA3S,CHAC,AeCA,AhBDA,AQAAsQ,ACAAhV,CRAC2J,AeCAA,AvBAA,AFAA,ASDA5J,AVAA,AEFA,CFECqE,CgBFC5D,CdAC+E,CMGC0E,AGDA,AeCA,AvBAAlE,AFAA,ADDA,AmBAA,CVAC,ATAA3B,AyBCA,ArBDY,AeAZnE,ALAA,CLACqB,AgBCAA,CdDCqI,AeCAA,AVHA,ChBEC,AmBAA,ALAAnK,CUCCsL,AxBDA,AsBEA+L,ANJA,CQGA,ANDC,AIED,CXFE,AeCA,AvBAA,C0BFtB,ADCuB,AJCA,ArBAA,AeDA,AIEA,CnBDC7Q,AcDAyO,AEAA,AjBFA,CMGCxK,ASDAyK,AfFArP,C2BCzBgD,ArBE0BlE,AoBDA3E,AnBAA,AgBCA,AFDA,CdAC+B,ACAA,AeCAA,AXDA,CJAC,AIAA5B,CSAC,CfCC,ACDA,AgBCA,AvBHA,COEE,ANCD,AsBAA,CjBAC,AWDA,AjBFAuF,C2BChC,A1BEiCe,AoBDA,CKAC,AXAA,AEAA,AIAAqP,CKAC3V,CXACgV,AfFA,CQEC,ARFA,COEC,AgBCA,CtBAC,AODA,AeCA,AFDA,CAACvT,EdAE,AKAA,CLACuI,ACAA,AIAA,CXCC,AcDA,APAAsC,EOAE,CRAC,CAAC9M,CmBAC,CAAC,AnBAC,EAAC,AKAA,CLAC,AcAA,ATAA,CSAC,GbAG,CAAC8L,IAAI,CAAC,IAAI,CkBAC,AlBAA,CkBAC,AlBAA,OaAO,CAAC;AMC7E,A/BDA,EGEE,AWAA,AaAA,ALAA4K,AlBHA,AGIA,AEAA,AMHAzT,AdAA,CGDC,C2BEH4Y,ArBCI,AoBDA,AjBAA,AFAA,AeCA,APDA,APAA,AVAA,AsBEA,ACFA,ATAA,AOEA,CVFC,ADAA,AGDA5Y,CFCC,AeCA,AvBAA,AODA,AMFAqP,AHCAxR,ELEE,AoBDA,AnBAA2K,AeCA,ATFA,AGCA,AdDsBlE,AeCtB,AGEA,ACFA,ATAA,CNCCvC,AoBDA6U,AJCA9B,AFCAN,ACFAU,ATAA3I,ADDA,AdAAvM,C2BEC,A1BDApC,AoBCA6V,CMAChL,ANAA8K,APFqB,AQGrBtE,ClBDCnL,AgBDA,ApBDA9D,C8BCZ,ArBCa,AWDAlC,AHFA,AjBCAD,CmBCCiV,AFFAhP,CRGC,ARDA,AKEAQ,AEAArG,CsBFfgI,ApBAgB,AWCA,ArBFA,CoBCC,CnBAC,AoBCA,ADDA,AGEA,AvBHqB,CyBEpB,AEAA,AvBAA,AgBDA,AGEAwN,CEDC9V,AEAA4J,CjBDC,AOFA,CbGCxD,AHDA9B,AcAA,CeAtB,AbFuB7D,CUGC,CjBDC,AKAA,APEAH,CqBFC,AFCA6J,ARDA,AbEAxD,AEAD,CEFE,AaEA,AjBAAM,CiBACmP,ANJA,ATIA,CqBFC3W,AVAAwV,AFFA,AOEA,ATAA,CAACtQ,CYCC,AvBAA,AECA,AgBAX,CKDY,AvBAAmB,AoBDA,AFEXsO,CrBFY,AKEA,CLFCpQ,EwBCE,ArBAA,AoBDA,CKAC,AJCA,ArBAA,AoBDAuR,ATAA,CcAC3V,AdAAyB,EIAE,CfCC,AeDAA,AGEX,ClBDYqE,AmBCR,ACFQ,AFEX,CrBFY,AsBER4Q,ACFQjV,CCCC,CxBDC,CwBCC,AHCX,CAACsB,ClBDY,EqBAE,ArBAA,CqBACvC,AFCR,ARFQ,CcAC,ANER,ARFQ,CcAC,ANER,ADAH,ClBDY,AeDA,AIER,ADAH,CGDY,ArBAAwF,AeDA,AGEX,CGDYsF,ADDA,CAClD,AFCyCoJ,GGDa,CAAC,EHCR,EGDY,ArBAA,CqBAC,ArBAAjO,CqBAC,AHCT,GPFY,CAAC,EXCE,CAAC,CyBDC,CAAC,EVAE,CAAC,GKE3E,CAAC;AMHL,A/BCA,AIDA,ESEE,AVEA,AWAA,AFFA,AeEA8E,AHAA,EMFE,AJCArH,AEAA,ATDA,AGCA,AJHA,AOIA,ATFA,ATEA,AEAA,AMJ4B,AdAO,C2BGlC,ClBACM,ACDA,AiBCA,AvBCA+B,AHFAjC,AIFoC,AeEpC,AEEAkS,CjBJqC,CwBEnC,AbDAnF,AHGAxD,AMFA,AECA,AhBHoC,AmBIpC,ATFA,ADFGnL,AdAOA,C6BET4W,A3BEAnU,AmBDA6Q,AGCA4B,ATFA3I,CNCC,ACDA,AQAAlK,AVEA,CEFCA,AJEA,CaFCwQ,AlBAA,AyBEAhK,AJAA,CbDC,ALCA,AsBAD,AJACmJ,CbDC,ALCAhO,AHFAlC,AoBCA,AbCA,CCDC,AiBCA,AlBAAsD,CiBDN,ATFO,CSEN3D,ATFOmN,AECA,AGCA0E,AfCA,CIFC,AGEAnI,AZFA,CSAClM,AGED,ASAC,CJFC9B,AHAA,ADFG,AdAO,CIIT,AFAAsF,AWAA,APAA,CJACJ,ADFA,AoBCA,AfCA8B,AgBAA6N,CGDN,ATFO,AfCA,AcAA,APEA,AMJA3T,AdAOA,CyBGb,ATFO,AZGCV,AeFD,AlBAA,AKEA,AEAA,CQHC,AVGA0G,CuBFC,AVAA,CJAC,CLAC,AQAA,AMEA,ATFAhC,AOEA,COFClF,AnBAA+B,ANEC,AFAD,AgBFA5B,EhBEE,AsBAA,CdFC,AIFT,AdAO,CUEG,ANEEsG,AIAF,AMJVrH,AdAOA,EwBIK,ATFA,APEA,CgBAC0W,ATFAlU,ATEA,AEAA,CqBFC,AvBEA,CuBFCzB,AJCP,CrBCU,AUJlB,AdAO,CyBGG,ArBCSK,CoBAD,AlBAA,CkBACoB,AlBAA2F,CIFC,AQAA,AVEA,CEFC,AeCP,APDO2N,AVEA,CiBDN7H,ArBCS,AIAF,CJAGvG,CUJzB5F,AdAOA,EeEmB,CAAC,CTEC,CuBFC,AzBEE,CyBFD,AzBEEF,AcFF,AZEAwG,CYFC,CMEC,CACjD,AVLiB,AdAO,CMI2B,CFAG,AEAF,CFAG,IqBDL,CAACiE,AXHlC3I,AdAOA,CeEmC,CAAC,EUCL,CAAC,IAAI,AXH3C,AdAO,CyBGqC,CIDQ,AJCP,CIDQ,AfFrD5B,AdAOA,IwBM1B,CAAC,IVNkB,AdAO,McAJ,AdAO,IcAH,AdAO;ADErC,EaEEoK,AaAA,AEAA,AhBAAgB,AYEAX,ANLA,AXIA,AEAA,ECDE,AoBDA,A3BEAzG,AgBFA,ALEA,AaAA,ALDA,AhBHA,AeEA,AIIA,ATJA,ADFA,AdAA,CoBEC,CVAC,ANEAwB,AHFA5B,AmBAA,AEEAzC,EOFE,AbDArC,AECA,AQEA,ALDA,AGGA,ATJA,ADFA,AdAA,C6BEC0Z,AXAAxU,AQEAA,ALDAqG,AEEAI,ACCAyL,ATJA/H,CFEC3I,AMFA,AIGAlC,CrBDC,CAACe,CEAC,AHFA,CGECwB,AeFA,CAAC4O,AlBAA,AoBCA,CLFC,AECA,AQEA,ALDA,CLFCjE,AHGA,AFDApF,AeCAxK,ALDA,AEEA,CLHC,APCAuK,AaGA,CvBJC,AsBGA,CXFCf,ACCA,AZFC,CWCD,AYGC,CbHC,CCAC,CVCC,ASDA,AIDA,AOEV,COFW,A3BEA,AiBFA,AKIA4L,AFFV5U,CTAW0H,AMFA0L,AOEA,CAACvT,AXFAnC,CcACA,AbDA,AMGV,CNHW,AZGA,AkBAV,GlBAcQ,CsBAA,CAAC,CVHC,AdGA,AaFA,CcAC,AbDA,AHGN,AEFML,CcACA,AzBEC,AFAD,AWANwJ,ASAJ,CHFW,CAAC,AGEVgN,ElBAc,AsBAF,CAAC,CbAL,CAAC,CAAC,ASAJ,CAAC9B,CpBAW,AsBEZ,CtBFa,AsBEZ,ETJc,CcAC,AdAA,CcAC,APEV,CAAC,OEEK,EAAExS,KTJiB,CAAC,IcAI,CAAC,OLIf,CAACoB,QAAQ,CAAC,CAAC,CAAC;AMJtE,A/BAA,E0BGE9C,AEAA0K,ADAA,ALDA,AhBHA,AeEA,AHDA,AXIA,AEAA,ECFE,AoBDAd,AjBCAlG,AFDA,AREA,AWCAqC,AFFA,AVDA,AsBGA,ACCA,ATJA,CdAC,CwBEC/F,APFAI,AjBAA,AaFA,AQIAsD,AtBJA,CyBIA,ChBDE,ALCA,AODA,AQDA,AIGA,ANJA+N,AOKA,ATJA,ATGAlL,CGFCvC,AgBCA,AdDAuH,AYEAkL,ACCA9L,ATJAgE,CYECjE,CAACX,AzBAA,AWCA,CAACpD,ACLA/E,AdAAA,CSGC,ASDA,CTCCmI,ALCA1D,AcFAhG,ChBEC,AMCA+G,CIFN,AeCO,AvBAA,CQDNzD,AEHO,AdAA,C2BIC,AJCA,ADDP,CbDQ,ALCA9D,AcFA,AKGA4V,AjBAAlP,AgBDPxC,CJFQ,APCA,ALEA8C,AEAAO,AMLAtF,AdAAA,CSGC,AIEA,AEHA,APGD,EIFJ,ADAO4J,AMFA+F,ATIA,AcDP,CVDC,ARCO,ASCA,AIJA5O,AFCAxD,ATGA,AgBDP,ClBAQ8G,CECC,CKFC,AMFA,AOKA,CAAC,CPLCnC,AOKA,EpBFE,AmBCA,CMHd,AzBEesC,AWFA,ADFA,AdAA,C6BEd6D,AZDe,AFCA3K,ADFA4C,AdAAA,CuBKCyB,CNJC,CJIC,CDFN,CRCQ,AkBAP,CVDC,AMDO,CAAC,AJFA,AQIPmS,AtBJO,CuBKC,ATLAlW,AdAAA,EYGL,CAACwM,AEHO,AdAA,CcAC,AdAA,CsBIN,COFP,AdAe,AOEP4H,COFP,AdAe,CcAd,CAAC7H,GPEW,COFP,APEQ,COFN7C,IAAI,EjBCS,CAACsB,CiBDL,AdAa,CAAC,EHCL,CAAC,IAAI,CAAC,CAAC;AkBD3D,AJGP,A3BHA,EGGE,ASDA,AUCA6K,AhBHA,AeEA3V,ERAE0D,AFDA,AeEAsS,AEAA,A1BFArW,AsBGA,ANJA,AOKA,ATJA,ATGA,AEAA,AcDA,CAAC,CQHQmb,ArBEP9W,AoBDA,AXAA,ALGA,AMHA,ACCAhE,ANHA,AQIA,AtBJA,CoBGA,CVDE,AiBEA,AXHA,AZGA,AaHA,AOKA,ATJA,CeDQ,ApBCP0K,AiBEAnG,AtBHAkD,AeEA,AHFA0J,AOKAkG,ATJAzI,CeDQ,ArBEP,AoBDA,AhBGA5K,AZHA,AOGAkF,CCFCa,AoBDAP,A5BAApF,AsBGA,AjBAA,EeDEuR,APJA/T,AdAAA,CIIC2E,ASCA,AQDAkE,CQFC,ANGA,CdFC,AGAP,AeCO,AJCAgM,CXFN9S,AFDO,AiBEAzC,AdCA6E,APAA,CuBHCyD,AnBAA,AeER,AXJQ,AdAA,CSGC,ACDA,AeERyM,EDEU,AlBDA,CuBHC,AREA,AGEA,AlBDApX,CMFN,AaCD,ADEQ,AVNA,AdAA,CYGN,AaCD,AZCQ,AZHA,AoBEA,AJHA,CQGP,ArBAQ,ASCAyH,AZHAzG,AsBGA,CEDPwM,ApBHQ5E,AkBIA,ClBJCC,AkBIA,ANJA,AHDA,AdAA,C2BIC,AvBAA7H,AWFA,CNCC,CgBCP,AxBFQ,AaFAZ,AdAAA,CyBIP,AEAQ8K,AdCA,AZHA,AgBDA4H,AFCA,EXEE,AECA,CFDCnL,ACHA,ACIAD,AEAb,AMLa,AdAA,CeEC4G,APGb/F,AMLa/E,AdAAA,C2BIC,AtBHA,COEN,AaCD,EbDG,CeCQ,AnBCb,AMLa,AdAA,CQKZ,AMLaT,AdAAA,CQKZ,CIFO,CAAC2K,AeCO,CAACsL,ArBCA,CWJC,AXIAhR,AQLA,AdAA,CIIC,AaHA,AHDA,AdAA,CIICN,AaHA,EXIE,AQLArE,AdAAA,CMKC,MqBDM,EvBAE,EQDL,CAAC4I,AEHO,AdAA,IYGH,CAAC,IAAI,CAAC,CAAC,EGDZ,CAAC,CAAC;AbGxD,AwBDCrJ,A3BFD,E+BAE,AHGA,AhBAAmK,AVFA,AsBGA,ACCA,AlBDA,AgBDA,EbDE,AGAAlI,AFDA,AQAA,ACAA,AEEAtD,AhBHA,AeEA,AHFA,AFCA,APGA,AMLA,AdAA,CmBEC,ALFA,AdAA,C6BEC,AJEAwJ,ANFA,ALFA,AdAA,C0BGL,ChBDO,AMDAvK,AZGA,AsBDPqY,ANAO,ALDA,CeDCqD,ApBCApQ,AUCAyK,ALDAvG,CcAC,AZDA,ATIA,CqBHCjE,AREA,CSHCmQ,A1BGA,AiBAAla,CSHA,A1BGC2E,AUJAxD,AdAAA,CcAC,AdAA,C8BCC,AtBIA,CIFN,AIFO,ALGA4J,AHCAxE,AMLA,AdAA,C6BEC,AjBCPzD,AIFOrE,ALGA0C,AeDhB,ALCgB,CQFC,AlBEA,AUAC,ANFD,CcAC,ATCA,CTCC,AeDnB0V,ANAmB,CJFC,AIEA,ALDArY,APGA,CQJC2R,ARIA,CIFN,ARCO,AICA,CIFN,ARCOvK,GMFG,CAAC,AWEAgE,CXFC,AgBC5B,AXD4B,CAACjL,CXEC,CAAC6G,CYHC,CSGd,ATHewK,AZGA,CqBAd1G,CrBAgB5D,AiBAC,ETDN,ASCO,CAAC,CTDN,EIFS,CAAC,CJEN,AGDO,CHCNiG,AGDO,EXEE,EqBAb,ArBAe3M,CqBAd,CAAC,CAACwM,ErBAiB,CAAC3F,CqBAd,CAAE8C,AVFc,CAAC,GUEX,EbDS,CAACsB,CaCL,ArBAa,CAAC,EQDL,CAAC,IAAI,CAAC,CAAC;AVCnErJ,ADDD,ESAE,AiBGAgO,ARHA,ACCA,AGGAmG,ACCAjL,AlBDA,AEDA,AcAA,EQJE/L,ArBEA,AoBDA,AjBCA8E,ADCA1B,AUAA,AhBHA0F,AUCA,CcAC,AlBEA,CkBFC,AzBEA,ASCA,AFDAqE,AMJM6F,AHANxR,AdAAA,C2BKCqP,AvBDA,AFDN,COAO,AgBCA,AECD,AzBFNpL,AmBCO,ANFA,ATIAmE,CGHCxE,AYCAyG,ANFAqE,AOGA3H,CKAC,CzBFT,AGFU,CoBGC,ApBHAG,CIEC,AgBCAoF,AFEAkJ,ATNA,AdAA,CSGC5S,APAbqB,AqBGY,AjBACmE,AQNAnI,AdAAA,CMMA,AgBDC8G,CVFN,AWGO,ADDD,CVFLxD,AVAT,AmBCgB,AfEA,CgBDC,CbFC,AKHA,AdAA,CWIC,AUAA8G,AhBHA,AmBMAE,ATLA,ADFA,AdAA,CSGC,AECA,ANHAhD,AmBMD,CbHE,CCDN,AYIO,ATLAtI,CHCN,ISCW,GIAG,AVFA,CUECmK,AVFAhK,EeDd,CAACU,CLGiB,CbDN,AaCO,CpBHC,COEN,APFO,IOEH,CAACuM,CkBFR,CAAC,AzBAgB,AUCA,CeDf,AfCgB,CVDC,KSDK,AdAA,EcAEzK,AdAAA,CcAC,AdAA,CcAC,AdAA,IYGH,AGDO,CHCN8I,AGDO,IHCH,CAAC,IAAI,CAAC,CAAC;AXDjErJ,AFAM,EWELmJ,ACCA,AQDAoK,ACCAjV,AZEA,EsBLE,ADCA,AjBCA2D,AeEA,ATHA,AGEA,AEEA,ANPe,AOQf,ATLA,ATIA,AgBDA,CLNgB,CRIdM,ALCA+B,ASCA,ARJA6B,AeGA7H,ArBHOnB,AeDP,AdAA,CCCL,AmBGK,CSFE,AnBCAgM,AeCA,ATHA,AfAPlH,AoBGO,AJLe,AOQf,ATLA,CcACiH,AnBCD,AWCCC,ADAA,AIGAoM,CMNCgE,ArBEA,AkBEAlD,AdAAvK,APCAzN,CGHCkD,ACAA,AaGA,ADDAgT,CZFC,AeCA,ANDAhB,AFJe,AFGf,CeDC,ALGAI,ArBAA,AeDAH,AlBFZ,AIAY,AYFe9D,AFGf5C,ATIA,AQNArM,AdAAA,CIICyE,CiBAC,AhBHA,AkBKA,AfAA1E,CsBLC,ArBEA,AGAP,AXFRyB,AoBGe,AEEA+S,AjBAA,CMHN9S,AOAO,AECA,AGGA,AFFA,CKAC,AdAA,AWEA/D,AhBDAqC,AcDAiS,CbFCxS,AUAA,AdFA,AGKA1C,CsBLC8b,A/BAO,C4BINzb,AdAAJ,AZJpB,AcCoB,AhBDO,ASKP,COJCgD,ATIA,CwBLC,AlBEP,AaCO,ArBAA,AIEA,CsBLC,AlBEP,AaCO,AHCA,CQJC,ALGA,AZCA,AUCA,ARJA,ADFA,AdAA,CIIEpC,ASCDX,AUCAuL,ARJA,ATIA,CuBJC,AvBIA5L,CuBJC,AZHe,CYGd,AFGA,CAACkZ,CvBDE,GmBEE,ACCA,CpBHG,ASCF,AWEA,CXFC/T,CJFT,CAAClB,AGAG,ANGO,CAACuD,CMHN,ACEO,CWEC,AlBDA,CODC,APCAjF,CqBDC,AdAA,AWEA,CZJN,ACEO,CDFNsL,AGDO,ATIA,CGHT,AMDU,ATIA,CGHT,CAAC,AkBEU,CHEC,ClBDC,CSJC,ATIA7N,CqBDC,CAAC0F,EZHE,EAAE,GYGG,ErBCE,CMHN,ANGOqC,CMHNkE,IAAI,CAAC,GNGU,CMHN,CAAC,ANGO,CMHN,GNGU,CAAC;EuBH7E,AjBCA,AFCAH,ACCAkB,AUDA,AEEA,AxBLAhN,AuBIA,EQJE,ArBEA,AkBEA,ATHA,ACCAoW,ACCA,AHLA,AXOA,AEAA,AMNA,AdAA,EyBIE,ApBHApN,AmBMA,ATLA,CUEC,CAAC,AECA,AXJAoJ,AZGA,AeDA,ACCA,AdEA,CqBDC6G,ARFA3W,ACCAkU,AdEA,CYJC5V,ADHA+R,AFGA,APIAhI,CsBLCwR,AfCAzW,CXEC,AOCAsH,AaEAjK,CRNC,AZGA6D,AOCAiG,AZJA7M,AOKA,CwBLC,AdAA,AjBAAC,AOKAE,AEAA,EFAE,CqBDC,ATHA,APGA,AaEA,AhBDA,CWHC,AFJA,AFGA,ATIA,CqBDC,AhBAA,AQFAmQ,AdFA,AeGA,ALFAhO,CLECwJ,AQFApG,AEEA,AIGA,CdHA,ALHC,AeGA,AHLA,AlBEA,EWGE,AXHAxF,ASKA,CgBCC,CpBHC,AeDA,AKIAiY,CLJC,CDDC,ADHAnF,AlBEA,CKGChS,AcFA+Q,AHAA,APIA,COJCxP,AhBDA,ASKAa,GSPG,AFGA,APIA,CJFC,AaLAY,AOQA,ATLA,APIA7D,CJFCmH,AeDA,AKIAvE,CLJC,AXGA,CSPC,ATOA,CUJC,CDHC,COQC,CRNC,AZGA,AoBGAkO,CRNC,AZGAxJ,GoBGG,ATLA,CSKC,ATLA,CSKC,CpBHC;AmBG/C,EOLE,ADEAsE,AjBCA,ASCAgL,ADDA,ANJA,AQMA,AtBNA,ESGE,ACCA,AeAA,AdCA,AQFAX,AdFA,AUCA,AhBDA,C0BGC,ApBHA,CoBGC,AECA,AXJA,AHIA,ARJA,AYFArD,AOQAlQ,AlBDA,EuBHEkJ,AjBCAK,AFAA,ANAApF,AOCA6F,AQFA,CUAA,AnBCCnH,ASDApD,AGGA+U,CbHC1M,AkBEA,A5BJAxK,AOKA,CuBHC,AFEAuF,ArBCAvF,CKDC,AMNA,AlBEA,CsBIC4W,AfCA,CGHC,AYED,CjBDE,ALHAvX,CWGC,ANAA,AiBCA,AfCAyB,CGHC,ACCAF,ACCA,AWCAsW,CVFCjL,AeCA,ARFA,AGGD,CVFExH,AeCAgM,ARFAN,AbGA,CFFC,AkBEA,ClBFC1J,AOCA,CAAC8F,CFFC,CkBEC,AHEV,CZHW,AeCA,ARFA,AKIV3I,AzBNU,C4BIC,ARFA,ApBFA3D,CUECoK,AGCA,GbHG,CyBMT,AzBNUnK,CyBMT0C,CdHW,ANAA,AOCA,CDDC,ANAA,COCC,AQFA,CAAC,CVAL,AeIJ,CfJKoC,AeIJ,EzBNY,CAAClF,CUEL,CAAC,CAAC0J,CCCO,EAAE,CXHC,CAAC,CUEL,AVFM,CUEL,ACCM,CDDL,ACCMqC,WAAW,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;AaE1ErJ,EOHC5C,ALEA,ANDA,ACEAuW,EXFE1T,AoBAA,AjBCA,AFAA,AiBCA,AXJA,AECA,AGGA,AhBJA,AmBMA,ATLA,AhBDA,AOKA,AEAA,AcAA,CNLC,AQMA,CRNC,AZGA,ASCA,AFAA,AMNAoQ,AOQA,CpBHC,AmBCN,CbDO,AaCPyE,ARHO,AhBDA,CWGChS,AKFAoG,AhBDA5L,CaGC6K,ACCA4D,AFAAxB,CUAC,ACCAgK,CFDCZ,AHNA,CaGCvW,AVGD,ArBJC,C+BCA,AjBGC,AINA,CIMC,ADAA,CUHC,ApBEA,AWCA4L,AtBJA1L,CWGCa,AGCA,ASCA,CCDhB,ADCiBsU,ELPE,AlBEA,CcICzG,AFAA,AYApB8I,CdFW,CAAC/S,CEEWkI,AUAA,ACCA,CTDC,ASCA/C,CTDC,CAAC4E,AEHA,CJGC,AIHA,AOIA,CXDCtB,AIHA,AOICjJ,ECD7B,EbDgC,CAAC,AYEC,CTDA,CAAC,EDDb,ACCe,AFAA,AWCEA,CbHX,AGCLQ,CHDMgG,GaGe,CbHX,ACCU,AYEEjB,CbHXvJ,CCCW,CDDT,CAAC,AaGY,CAAC,CZFD,CAAC+L,IEAX,CAACtH,KFAoB,CEAd,AFAeqH,CEAd,GFAkB,CAAC,IAAI,CAAC,CAAC;ASAzE,AXGA,EIFE,AaCA4B,AEAA,AXJA,AKIA,ANHA,ADFA,AQMA,AtBNA,E8BEE,ArBCAhJ,AoBAA,AnBCA,ANAA,AcFA,AbDA,AeIA,AIEA,AzBNA,AOKA,CFFC,CAAC,AOCAgI,AMNAqG,EaGE,ADCA,AnBCA,AGAgChT,AOChC,AIEA,AzBNA,C+BCCkc,ADCA9C,AnBCA5T,AUCA4Q,AIEA+B,AzBNA/X,CmBCCqO,APGA,ANJA1F,CMICmE,ALCA,COFiC,CIL/B,CCGC,ALEgC,AOChC,ArBJA,CqBIC9K,AHNA,AXOA,CwBJC,ArBCP,ACCO,CDDN4C,ACCOnE,AQFA,AnBDC,E+BCC,CDCC,AJEA8M,AdAA,CFFN,AoBAOkE,AJEApH,APHAiE,CTCN,AJFO,CyBCCa,AnBGA,CSAC,CKAC,APHA,AbDA5G,AeIAtG,CFHC,AMKA,CCFC,APHA3B,APGA,AaEAG,CbFC2L,ASAA,CAAC,CSFC,ExBFE,CwBEC,AnBCA,ALHAjE,ANAAtI,CWGC,AQFA,CTCN,AoBAO,AXDA,AEGA,ArBJC,CqBIA,CXFNwK,ASDO,AnBDA,E+BCP,AnBGS,CmBHR,AnBGSyC,CmBHR,ArBCE,ACCO,ALHA,CIEN,AJFOtE,CKGC,AcGA,CAAC,GdHG,CAACqD,CCCC,CaEC,EAAE,GdHG,CAACF,EcGE,CnBNC,CKGC,ALHA,CKGC,IAAI,CAAC,CAAC,QLHQ,EAAE;AWC7E,AGCCrJ,AXID,EIDE6K,AeCA3B,AvBFA,AiBEAC,ADDA,ALFAA,ATGA,AQNApJ,AQOA,AtBPA,E8BEE,ArBCAkC,AoBAA,AnBCA,AeCA,A1BJA,EmBAmC3E,ALE0B,AFE3D,ANJA6I,AmBMAlG,CXJ4D,AMDjE,CWAO,ApBEA,AeCA,AZF2D,AMDlE+S,AEIO7J,AJRS,AFKTA,AhBFA,AeDApJ,CgBEC0Z,ApBEA3W,AeCAkS,AJCD,ANHA,AhBFCrX,AeDAU,AQOAqW,AtBPA3U,CkBCkC,APIjC,CAAC+J,AUCA,ANHA,CGFkC,AJDjC,CTCC,CSDC,CTCC,ALDA/J,CSGN,ACCO,AVJA1B,C8BEC,ArBCPiE,ACEH9C,CeAW,A1BJA,CaICqL,APJA,ALDA,C8BEC,AlBGA9C,AeCAmB,ARJnB,CVCa,AgBEO,AECD,A5BLCtL,ACDA,CSGN,AEEO,AMPS,CUQR,AhBDA4M,AQHtBwI,CWAuBiE,AlBGA,AKPS,AOSnB,AFAUvC,CGFCI,ADEVrT,AFAUqF,CVFC,GbJG,AuBMA,CZFT,AXJUjJ,CWIT,AYEU,CXFC,EZJE,CYIC0M,AQHlC,CVC4B,EAAExC,EeID,CAAC,CMLC,ArBCG,CqBDF,ArBCG,CqBDF,CNKC,CbFW,AaEV0N,CCFD,CAAC,EfAI,CAAC,CAClCtX,WcC8C,CAACgC,CCFD,EAAE4H,CfChC,CAAC,AcCmC,CAACsG,CCFD,CAAC9M,EDEI,CAAC,CdDlC,AcCmC,CCFD,ADEE,CdDlC,AeDiC,IfC7B,CAACkH,UAAU,CAACY,IAAI,CAAC,IAAI,CAAC,CAAC;AML3DrJ,ARMD,EEAE,ANDA,AgBCA4T,AdCA,EwBLE,ArBCA,AoBAA,AjBEA,AaAA,AECA3R,ATNqD,AGMrD,AGCA,ATJA,AhBFA,AeDA,AQOA,AtBPA,CkBAsD,AMOrD,CNPsD,ALGrD,AFEAtD,ANJAyH,AYJ8C,AOU9C,CRPL,ACHoD,CaK7C,ADCA,AjBEA,AaAA,ATLP2I,AZKOjK,AiBCA,ANHA,AhBFA,AOMAkC,AQPA,AdAA,C8BEC0S,ADCA3R,AjBEAmD,AaAA8J,AJCArX,ANHAoL,AhBFAjL,CcECsD,CJAC2G,AaIAwM,CFDCX,AdCA5M,CuBJC,AhBAA,AFEA,ASCD,AdCA,CKFE5H,CFFC,AoBAA0I,ATGA,AdCA,CqBDN,AdHO7G,CcGNiB,AZHO,AhBFA,AuBMA,CQLC,ALGA,ATLjB,AKMiB,ANHAiH,AOIAsJ,CVFC,AaAAlJ,ArBAAzE,ASFA,AFEA,AUCA0F,AhBLA,COICzC,ARAA5C,ASFA8G,AFEA,AZJArO,C+BCC,AdFpBmR,AXCoB,EsBKL,CfDQ,AeCP,AZHO,AOIA,CQLCU,AfCA,AOIAkF,COJC,AjBEA,AaAA,AVFA,CcAC,AJEA,CIFC,ARGA,AtBLA,CKIC,ALJA5W,AuBMA,COJC6M,AjBEA,ADAA,AWECrJ,CVFA,AIL9B,AZK8B6D,AOAA,AUCA,EIDG7D,AJCD,CQHC,ARGA,CQHE+F,AzBED,ASFA,AQGA,ACCC,CTJAyE,CcGN,AvBDO,CqBAE,CECP,ALCSxK,CTJD,CAAC,CYEG,CIFA,AFGR,A5BLO,C4BKNuJ,A5BLO,AuBME,CQLZ,ARKahE,CQLZ,CAAC,ADCa,EPIE,KAAKA,IAAI,CAAC,EKDP,CAACuC,IAAI,CAAC,A5BLO,CAAC,CAACrL,E4BKL,CAAC,CAAC,G5BLU;ASM5E,ECHE,AGEA,AFEAoL,AKJA,AOIA,EQLE,AHIAnH,AvBDA,AOAA,AUCA,AhBLA,AeKA,AICA,AzBNA,AOMA,CDNC,CwBECqF,AJEAS,AZDA,ARHA,AYJAlK,AHGAwC,AdAAA,E8BEE,AVIA,AICA,AzBNA,C+BCCsZ,AVIAjG,AICAgC,AzBNAzX,C0BIC,AZDAiO,AQEAkI,AJTA,CQQC7S,ArBAA,ASDA,APGA,CeDC,AJTA/D,CPUC4L,CmBJC,AnBID,AGHCxL,AOEA,CSHCoM,AzBEA,AiBCApM,ADAA8B,CVCC,AeFA,AECP,AvBDOsE,AaRA,CUSN9B,AVTOzE,AXUA,CQPC,AdAA,CyBKC8D,AXLAV,AdAAA,EMOE,CuBJC,AhBCA,APGAzD,CwBLC,ADCCC,AFGR,AdFO8O,AQEA,CIDC,AECP,ANAOA,ADAA,CAACpM,CUJC,AbLA,CAACwC,CbQC,ALJA,CKKrBuC,AoBCsB,AzBNA,AeDA,AdAA,C8BECuQ,ADCC,ALIDlX,AzBNA,AeDAE,AdAAA,CoBMC,AHTA,CGSC,CdCC,AQPA,AdAA,C6BGG,AvBIFuG,AQPA,AdAA,EaIE,APGA,COHC,AQEA,AfCAY,CqBDN,ANAO,ADAA,CAAC,COAN,AvBAf,ASFsB,APGA,CFDrB,ASFsB,APGA,CFDrBL,AiBAsB,CAAC,CMAN,CAAC8F,ArBCO,CkBAC,AlBAA7N,CkBAC,IpBDlB,CAAC,CoBCuB,CpBDrBgI,CoBCuB,ElBAE,CFDrB,AECsBD,CFDrB,C0BJO,A1BKrCE,C0BLsC,ANKgB,CMLf,CHIU,CAACgE,GrBCU,CqBDN,CAAC,ArBCO,EFAnD,CAAClE,CuBD+C,ArBCO,CqBDN,ArBCO,CqBDN,MvBCxC,CAAC;AIA7B,AcCA,EbHE,AGEA2F,ARCA,AOFA,ASCA,ALFA5B,AhBHA,AOMA,EwBLE,ApBKA,AiBDA,ATNA,AGMAkL,AhBLA/N,AYJA,AHGA,AdAA,CiBHC,AHGA,AdAA,CyBKC,AZDA6F,AQEA,AJTA,AOUA,AVPA,AdAA,CaIC,AQEAxM,CSJC,ADCA,AnBIA,AiBDA,AdFAwB,CiBFC0Y,ApBKA9W,AiBDAA,GEHG,AJEAiF,AZDA,AWGA5H,CKJCoX,AfHAhX,AdAAA,CcAC,AdAA,CSICgI,AIAAnH,CHGC,AeFA,AECA,ANAA,AhBLA,ASDA,AdAA,CUOC1B,AeFAsH,AECA7I,ANAAwB,AhBLA2G,AmBMA,CXHC,CDECwE,CAAC/C,ASAA,AGCA,ATHAmB,CUCC,AJCA,ANFD,CUCE,CAAC,AVDA,CHEC,AYCA,CAACwM,CZDC,AFCA,CoBLC,ApBKA/V,AWDA,CAAC,AhBLA,CwBEC,AxBFA,CyBCC,ADCAtC,AnBIA,CAAC,CDHCkL,CAACC,AkBEA,CGJCwN,AHIA,GEHG,CAAC,AnBIA,ALNA,CKMC,CiBDC,AtBLA,EIGE,AkBEA,ElBFE,CeGC,CGDC,AHCA7V,CGDCoW,CtBLC,EAAE,CmBMC,CAAClI,IAAI,CGDC,AHCA,CGDChF,AHCA,IGDI,CAAC,IAAI,CAAC,CAAC,GGJjB,CAAC,CAAC;AVKtD,AZAA,AcACrJ,EZCC,ANCA,AOFAqK,AZJApM,AOMA,EwBNE,ArBEA,AGEA,AaDA,AECA,ATNA,AGMA,AJRA,AFMAgE,CUCC,CIFC,AJEA,AZDAiK,ARJ8C3F,AmBO9C,AVPA5H,AdAAA,C6BGC,AhBCA,ASEN,CQJO,ADCA,AjBGA,AeAA,AvBEAgB,ASJAyM,AQEA,AJRA,AXUA3G,AgBFP8O,CQJQsF,AHIA/W,ANAAiR,AJRAhE,CRMC1S,ASJA6O,AMOA/L,CpBCCR,AcRA,CNMC,AREAwF,ACR8C,COM7C4C,AENA,AdAA,CkBACnK,AGMA,AhBN8C,ACQ9C6H,AQRA7G,AQMb,AtBNaA,CWMCyL,AUAAL,AGCA,AlBCD,CqBFE,AdFA,AFED,AIFN,CNAQ,AGEA,AeAA7L,AVRA,AFMP+D,ATIO,AgBFhBqS,CXAiB,AMRAhE,CLQChT,ACFA,ACJA,AdAA,CSIC,AQNA,AOSA,AVPA,AdAA,CYMC,AREA,ALNAU,CmBFC,AGMA,AJRA,AOSA,AzBLD,C+BAE,A1BMAsE,AcRA4J,AGMClC,ANFR,AOEf,CECuB,ATHP,AhBFO,E+BAE,ArBEAxC,AGEAM,CREC,AiBFC,EjBEC,C0BNC4K,AlBIA,CAACpV,ACFA,AQEE,ETAA,AeAA,CAAC,CfAC,CMNC,CAAC,CHIN,EGJS,AHIP,CGJQ,GSMG,AZFP,CAAC0N,CYES1K,CAAC,GlBFX,CAACC,AkBEe,GlBFZ,AKJa,AdAA,CSIZgI,CKJcjI,AdAAA,CcAC,AdAA,CcAC,AdAA,E8BEd,CAAC,CAAC,CfEU,CNAL,AMAM,CNAL;AWEnDP,EVGCsJ,AeHA,EKHE,ArBEAjM,AoBDA,AzBKA,AcRA6O,APMA,ANP8D,AUK9D,AhBFAhO,AOMA,AQRA,AdAA,C6BGC,AXHA,AbD8D,CwBI7D,AjBGA,AeAA,ATNAgD,ALIAgL,AQEA,AhBP8D,AYD9D,CJMC,AOCN,CUHO,AjBEAG,AFEA,ASDPoH,AIEO,ATHA,CeFCqG,AnBIAhQ,AIFAoD,CHEC,AeAA3M,AvBEA+E,AcRA,AnBEA,CUEC,AGEAyC,AeAA,A5BJA5J,AOMA,CGJCsH,ACIA6D,AiBFAjL,ANAAgW,AJRA,CPUA,AQRCpT,ALIA,AOCZ,CPDa,AQEA,CTAC,AFEA,AiBFA,AvBEA,ASJA,CKJC,AEKfwS,AHPevP,CCEC+H,AGMArO,AfEA,CGJC,AGEA,AREA,C0BNC,ArBEA,CAAC,AkBEA,AhBAA,CSDnB,AHPoB,AFMA,ATIA,CwBNC,AlBIA,AKRC,AFMDO,ATIAf,CKFC,CPEC,CiBFC,AJRAgE,CaIC2N,ATIA5C,CMAC,AhBAA,AZJA,CKMC,AaVC,AlBID,C4BIC,AvBEArH,GcRG,CAACiH,AZQA,CAACnH,EAAE,CYRC,AnBEA,AOMAa,CYRC,AHIA,CMEC,ANFA,AhBFCrH,CKMA,AiBFA,CjBEC+G,EEAE,CeFC,AtBJC,AOOvC,CeHuC,CNFC,EeFV,AfEY,AhBFE,AOOxC,CwBP2B,AxBO1B/H,CwBP2B,A1BMY,CaVC2S,CbUC,AWJA,CAACzC,MENM,CAACkD,AXWtC,CAACrL,EFDwC,CAAC,CWJC,CENE,AFMDkE,EENE,CAAC,CFMC,ATKtC,CSLuC,CTMjE,GSNqE,CAAC,ATMlE,CSNmE,ATMlE9L,EACP,CAAC;AmBLL,EhBDE,AEEA,ANPA,ACYA,AQXA,AdAA,E8BEE,ADCA,AjBGA,AFEA,ANAA,AcRA2O,ADFA,AFMA,APEA,CUNC,CAACE,ALIAnL,AQEAoT,AGCA,AzBLA,E+BAE,ADCA,AnBKA,AiBFA9T,ANAA,ANFA,CeFC+S,ADCAkE,AnBKA1U,AiBFA,AdFA,AQEApD,ANFA2N,CYEC/C,AdFAgC,AdFAlO,CKMC,AIFA2J,GUNG,CdQC,ALNA,ASIA,CEEC,ANAAxC,ALNAlH,CWMCqB,AQRAqT,CGMC,CAACpT,AtBJA,C8BCC,AdCA,CeFC,ADCA,AdCAxB,CcDC,ARGA,CAAC,CSJC,AHIA,A5BJA,C4BIC,ATNA,ALIA,CHIC,AiBFA,AdFAiD,CHICrB,CoBNCiT,C1BMC,ASJA,CTIC,ASJA,EdFE,CWMC,CAAC,AWFA,AtBJA,CKMC,AiBFA,EjBEE1N,AWJA,CAC/B,GLGmC,CAAC,ANAA,CAAC3F,GAAG,CAAC4C,CWH/B,EACV,CXE6C,CAAC,CAAC,C0BNb,AfIlCa,CeJmC,CAAC,gBfI5B,EAAC,IAAI,CAACmK,aAAa,CAAClE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAC5C,CAAC;AUFJrJ,AdED,ANPA,ASCA,ELKE,ACGA,ANAA,AEIA,AENA,ARLA,E8BCE,ADCA,AjBGA,ACFA,AILA,AFQA,CFHC,CQEC,AGCA,CCHL,CKFO,ADCA,AjBGA,AaFPgW,AEEO,AZCA,AhBLA,C+BAC+D,ADCApD,AjBGA7T,AGCAuK,AfNAvM,CqBKCmJ,AGCA,CPRC8F,CUOC,A5BJA,C4BICjN,A5BJAxE,CsBIC,CZDCmK,AHOAjI,ANXAM,CYKC,AZLAC,CYKCvB,AbJA,CAAC,AOUAgB,CeNC,AJPA,AlBGA,AOUAjD,ANXA,C2BKC,AZCA,CcJC,AFGAiZ,AZCArY,ATKA,ANXA,C6BEC6P,CRGC,AfMA,CeNChF,CZDCP,AkBCA,ClBDCV,AgBDzB,AEEyB,CGJC,ADCA,AFGA,CGJC,ADCA,CCDC,ADCA,AJC5BiO,ChBC6B,AGCA,CAAE,CHDA,AYCA,EAAE,GNCG,CAC/B,CHFiCjO,IAAI,CAACxK,CGE/B,CHFkC,CaF9C,AVKK,CHH0C,CAAC,EAAEwC,AGG7CqD,MHHmD,CAAC,CAAC,UGG7C,EAAC,IAAI,CAACmK,aAAa,CAAClE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAC5C,CAAC;AJJJrJ,ANPAA,ASCAA,EeIC,AjBGA,AFGAuJ,ANAA,AaVA,ATQA,EsBLE,ArBGA,ASLA,ALKAjF,AEKA,ATEA,ANXA,E2BKE,A5BJA,CYGL,ANPA,ASCA,CgBGO,A1BOA9D,AOJPkJ,AUCO2K,AhBRPzO,AmBSO,ATGA,ADXP4G,AdEO,C8BCCtD,ApBOAK,AKCAwD,CNLChF,ACID,AWHC,AfMAxF,CFHC/B,ASJA,AQCAd,CXGC,ANAAyF,ASJAV,EJAE,AeEAoR,AlBKA,CGPCpQ,ADEAA,EFKE,CDdhB,CQOkB,AFAlB,CUCmB,APPnB,CLMoB,ALIA,AiBHA9F,AhBRpBiG,AGSoBH,CCFC,AIAA,AFArBiE,AIKqB,APHAnM,CCFC,ALIAA,AWCAY,ATEA,AQbtBqO,COOuB,AbCA,CJEC,AiBHA,AGCA,ChBAC,CsBLC,A1BOA,AEGA,CwBVC,ANKAhP,AlBKAoH,CwBVC,CxBUC,CDd7B,ACc8BpE,COPCpC,AWEA,CbF/B,AaEgCwC,ClBKC,CeNC,AfMA,AQblC,COOmC,CRDC,CWEC,CXFC,AWEAT,ATGA,ATEA,CSFC,ATEAgF,IkBLI,CAAC,ETGE,EAAE,ATEA,EAAE5H,ESFE,ATEA,CSFCiQ,ATEA,aSFa,CAACnE,IAAI,CAAC,IAAI,CAAC,CAAC;EcL7EH,AjBGA6B,AKPA,EaEE,ArBGA,ACIA,AiBHA,AvBGA,AcTAnN,AHUA,AhBRA,AOUA,AELA,CmBDC,A5BJA,C4BIC,AdDAe,AQCA,AtBJA,ACDA,E8BCE,ArBGAsB,ACIA,AOTAgQ,AOOA,ATGA,CeRC+J,ApBOAjR,AKCAiE,CXDC1H,CEGC,CYZC,AlBCAtE,CkBDCnD,ALKA,CAACe,AWEAkX,CpBEC,AEGA,EIHE,AQTA,CRSCtM,ANAA,AcTA1J,CLKC,APOA,ANXA,C6BGCoJ,AjBGA6B,ACFA,AEKA,ATEAxI,CuBRA,AjBGA,AGGCpE,CEVC8R,AjBCAhQ,C6BGC,AjBGA,AKPAqE,CbSC,AoBFA,AlBKA,CAAC,CwBVC,ArBGV,CqBHW,ArBGVxC,AeEUtE,CMLC,ApBOA,ANAA,CMAC,ANAAsH,AcTA,CAACoH,ADAA,AjBCA,CkBDC,AMOA,AxBNA1L,CkBDC,ADAAuP,AOOAtS,CdEC,CAACsK,AVRA,CAAC,EeSE,CLDC,AKCA,CLDCxK,CNAC,AaTA,AjBCA,CUQC,ANAA4H,AoBFA,AxBNA,CUQC,AGJA,AILAyK,AOOAiG,CfFT,CAAC,AIAUzX,CJAT,AMKU,EAAE,EFLE,CJAT2J,ALIU,ASJArD,CEKC,CXDC,AaTA,AFUA+I,CSHC,CfFT,AQLUqC,CRKTvS,AeEU,CXFC,AWEA,CfFT,AIAUgP,AWEA,EfFR,CQLW,EbSE,AaTA,CbSC,AWCA,CAAClD,EFLE,CAAC,CEKC,CAAC,IAAI,CAAC,CAAC;ELAzE,AiBHA,A5BJA,AOUA,EwBVE,ADEApH,AjBGA,AREA,AcTAiK,ALKA,AILA,AFUA,APHA,CUPC,ALKA,CJACjM,ASLAoM,AGMAgI,ArBLA,E8BCE,ATIA,AGCApU,ATGA,CeRCkJ,ATIA1J,ANIAwN,CHHC9B,AKPAsF,ATOA,ARNA1P,CIQC,AcTA,CAAC,CAAC,AlBCA,E8BCE,A1BOA,AIFA,ARNA,C8BCC,ADEP,AzBKOwE,AaTA,ATOAE,CsBLC,ADEPvD,CjBGQ,CKPC6N,CIMC,CTCC,CJAC,CqBHN,AREO9F,AbCA1M,CCFT,AoBDG,AdMO,CNLTwE,AGEU,AGGA5D,APHA,CIAC2E,AYAV,AhBAU,CaDC,AJNA,AOOVlB,CPPW/D,CbSC,CAAC,EaTE,CLOC,AKPA6S,CLOC7G,CREC,EAAEvE,CyBLN,EAAE,CpBCF,AMKU,CNLT,ALIU,AaTA,AFUA,CXDC9E,AaTA,CYIN,AZJO,CYINyK,ALGH,CfFC,ALIU,AoBFV4K,CfFC,ALIUtY,EAAE,AWCA,CHHC,AREA,CQFC,AREA,AWCA,IAAI,CAACmQ,CSHT,CAAC,ITGc,CcNN,AdMOrE,CcNNA,GdMU,CcNN,AjBGO,AGGA,CcNN,AjBGO,GGGG,CcNN,AdMO,CcNN,AdMO,CcNN;ECDlE,ApBQAJ,AiBHAgC,AvBEA,ASJA,AEKA,AhBPA,AOUA,EGRE,AoBDAhJ,AjBGAkJ,AMPAvN,ADAA,EIMEyW,EAAE,AJNA1D,AOOA,AxBNA,CqBKC1G,AtBHA1L,CWOC0K,CAAA,CEHE,AMPA,AMOA,CZACe,AFGA,AQVAnM,AGMA,AGCA6X,AzBJAnX,CAAClB,COUCsI,ANZA,C6BGN,AREOsE,CQFN/H,AXJO,CAACqN,CDAC,AjBCAtO,CYMC,AeAAgK,ANDA,AfOAtF,CMNE7C,AeADiF,A5BJA,AOUD,CWbE,AjBCA,C6BGN,A9BDOzK,AOUA,ANZAyD,C6BGN,AZJO,CUOC,C3BNC,C2BMC,A5BJA,CaIE,AZNDC,CkBDC,AnBGA,CmBHCkL,CAAC,CNOGpJ,AMPF,CMOC,CAAC3C,CxBNC,CAAC,C6BGN,A7BHOe,E6BGL,AjBGS,AYAF,CZAGnB,CZND,CwBMC+V,CKHN,CAAChL,EjBGW,CAAC,CAAC,CAAC,GYAC,SKHE,CAACzB,IAAI,CAAC,IAAI,CAAC,CAAC;ECAhE0Q,AlBIA,ARGA,ASJA,EJDE9X,AoBDA,AnBMA,AiBHA,AVPA,AlBGA,AOUA,AENA,EaDEoS,ArBLA,CAAC,C6BGC,AFGA,AvBGA7O,ASJAqG,AQAA,AJNA+E,AOOA,CKHCwG,AFGArP,ANDA5J,CXICsL,AXPAjL,CKOCgH,AEGA,CFHCL,AoBHA,CGAC,AHAAuQ,AxBNA,GSIJ,AkBEO3N,ClBFNzF,AHQO,EIHE,CoBPCyX,AHIA,CGJA,ArBEN,ALKO,AaVA,AXaA,CGRN,ACKO,AXPA,AOUAnV,CwBVC,A1BOArC,CaVC,AXaA,CePC,AtBHA,AOUAoD,CuBTC,AnBMA,AGJAkG,AQAA,CQFC1N,AnBMAH,ANAA,ASJD,ETIG,ASJA,AINA,AlBGAb,COUC,CAAC,EePE,AGCA,CdGC,AcHAuC,CfFN,ACKOF,AWJA,AfOA,CAAC2F,CGRN4C,IAAI,AYCO,CZDN,CoBDQ,ALGA,AzBJA,C8BErC,ALEsChI,AzBJA1C,COUC,CAAC,EIHE,CAAC,CcHC,CKFrC,ALEsC,AzBJA,E8BG7C,A9BH+CC,I8BG3C,A9BH+C,C8BG9Cma,ALC+C,AzBJA,CyBIC,GdGG,CAAC,MmBJzC,CAACpO,IAAI,CAAC,IAAI,CAC5B,CAAC;EpBDH,AGGA2B,AGEA,ATGA,EwBVE,ADIA,AnBGAvB,AiBHA,AvBGA,AcVA,ALMA,AILA,AlBEAjL,ASIA,EgBAE,CAAC,CKAC,AFAA,ANDA,AGCA,AxBNA,C6BMC6Y,AFAApO,CvBGC3D,ASJAhB,ALCAgD,CSNC,CIKC,AJLAsJ,CPSC,AWJAsD,CXICzU,CNAC,AoBHAb,AxBNAoC,CDEC,C4BIC,AdDA,AdHAzC,C4BICwJ,AvBGA,AIHA,CICCiD,CAACjD,ACFA,AWCA,CzBJC,ASIA,CmBAC,AHAA,AzBJA1K,ACFA,C2BMCiL,CfCC,AREA,AiBJA,CXIC,AWJA2B,AJLA,CYMC,AjBCA,ACFAxC,CgBCCtJ,AZNA,ATMAsJ,CEGC,AiBHA,AvBGA,CuBHC,AvBGA3C,AiBJA,AtBHA,CsBGC,AtBHA,EWOE,CAACiD,IAAI,CAACO,ENAE,CAACnD,EyBHE,AnBGA,CmBFrC,MzBE4C,ASJb,CgBExB,AhBFyBoC,ALCA,CJGc,AIHbG,CqBEjC,IAAI,AhBHkC,CgBGjC8P,AhBHkC,CAAC,ITIiB,CAAC,EIHX,CAACja,EqBEhC,ArBFkC,CqBEjC8L,ArBFkC,IqBE9B,CAAC,IAAI,CAC5B,CAAC;EpBHH,ACIA,AiBHA,AZGA4B,AhBPA,E+BAE,ADOA,AjBFA,AREA,AcVAhK,ALOAqD,ALAA,ESNE,AjBAA,CkBDC,CYGC,ADOA,AXVAgI,AGMA,AGCA,CMJCuK,ADOAM,ArBHA,CICC/L,CREC,ASHA,CAAClG,AQDA,AJLA,AOMAtG,GfDG8J,ALIA,AIHArL,CJGCkI,AiBJA,CAACyO,AGCA,CAAClN,EMJE,AfOA,CHFC,ACDA,CWAC,AhBAA,CsBJClJ,ADOA,AXVA,AHUCmK,CcAA5J,AjBFA,AMRA+N,ALOA,CKPC,CAAChL,AVOAoG,CgBAC,ATGC,CHFA,CHFCoB,AGEA5F,AREA,AiBJA,CZAA,ALIC,AcVA,CYGC,AZHA,AGMA,ANIE,CePD/E,ArBGA,EDCE,CJGC,CQFC,ACDA,ALAA,CICCyB,AREA8F,GyBAG,ALHA,CKIlC,CzBDoC,AoBHA,CpBGCE,G0BPG,A1BOA,C0BPC,A1BOAjD,CyBClC,EACP,AjBJ4C,CAC3C,ARC4C,CAAC,CAAC,CyBE3C,CAACmV,IjBHG3P,EkBN+C,CAAC,ClBM5C,CAACxK,EAAG,GiBGG,CAAC8L,IAAI,CAAC,IAAI,CAC/B,AjBHA,CiBGC,AjBHA;EFEHZ,AiBHAqC,AvBEA,AcVA,AnBIA,AOSA,EwBVE,ArBGA,AoBOA,AjBHA,AGAA,AfTA,CAAC,CaMC,ALAA,ARNA,E8BEE,ADUA,AjBHAM,AKVMyF,CaGL8F,ADUAW,A9BTA7Y,CUECuD,AICAO,AQDA,AGCA,ATGAoL,ELCElF,AOXM,ATONpL,CEIA,AVVCuB,CaMC,AQDA,AGCA,CdIC,AWLAoV,AGCA0B,CfDC,CICCpR,CEGC,AfTA,CSKC,AGIA,AeFAwG,A5BJArM,ASGA,CmBCCsJ,A5BJD,ASGCtC,ARNA,C8BEC,AlBOA,AGAA,ChBNC,CUEC,CqBHC7H,ArBGAkE,AkBEA,AdDA,CgBMC,AhBNA+C,AEGA,CcGC1G,AFLA,AZEA2E,APHA,CaDC,AbCA,CaDCmH,AbCA,GKAG,CiBJC,ATGA,CSHClM,ATGA,ANIA,CAACyB,CSHC,CAACE,IfDI,CAAC,CAAC,AoBOA,CACpC,ELPuC,CAACC,CMJC,AfOA,CePC,AfOC,CSHA,CKOpC,ALPqC,EKQ5C,GdLiDoI,CcK7C,CAAC4P,ALR8C,CAAC,CTGC,CAACpa,EAAG,CePA,CAAC,AfOA,CAAC,QcKtC,CAAC8L,IAAI,CAAC,IAAI,CACjC,CAAC;AXfL,EdWE,AEEA,EwBVE,ArBGA,AoBUA,AnBLAlB,AiBHA,AZEA,AhBNA,ASGA,EIGEiD,AZTA,E8BEE,ArBGApJ,AoBUA,AFRA+F,AvBGAtC,AiBLA,AJPYtF,AOQZ,ATGAwN,CePC+I,ADaAkB,ALTA,GGCG,CAACra,A3BPA,CSKC,ALKAkI,CuBHC,AvBGAN,AoBJA,AlBMAO,CGPC,AMIA,CHAC,AZTA,CYSCjG,AGAA,EePE,AHKA,CrBKCiG,CAAA,CwBVE9H,ADaA,CFRC,AvBGA,AEEA,CqBLCmK,CEQC,AzBLAxK,EAAE,CQDC,AeFA,CEQC,AFRAA,AvBGA,C0BRC,ADaAmZ,CCbC3Y,AlBOAgK,AFCf,AiBHe,CjBGdU,CiBHgB,EfEE,CAACH,KiBMK,AjBNA,CiBMC9I,AnBLf,CAAC,EoBRiB,CAAC,CpBQd,CAACuI,IAAI,CAAC,EmBKiB,CAAC,ICbI,CAAC,MDaM,CAAC;AXhBpE/H,EYIC,AtBIA,EqBSE,AjBNA,AFCA,ANAA,ALPA,AOSA,ANZA,ESKE,AkBEA,AdDA,AQDA,AJRoB,AFYpB2N,CGXL,AGOM,AJRoB,CPanB,AQZPgF,AGOO,CXKC7P,CiBHC,AvBGAwC,AaboB,AOSpB3G,AzBHAD,AOSAuI,CqBLCgC,ElBFE,CMIC,CXCC,AWDA2E,CLCC,AOboB6C,CPanB1Q,AcJA,AlBMA,CFFC,AoBJAnB,CfDCgJ,AkBEA,CAAC,ArBKA,EYdnB,ADDyC,CPanB,AOboBkJ,AOSpB,CdIC,AiBHA,AvBGA,AoBJAlS,CdIC,AiBHAwX,ATTxBzD,CZcyB,CWfqB,CbanB,AaboB,CRQzB,ALKM7N,AaboB,AOSpB,ATGA,CNJLtE,AeCM,ATGA,AhBNA,AOSA,CAACoE,EGPJ,AVFMjG,AOSA,CGPLqD,AHOM0D,GqBLG,CAAC,CTTrC,CTOiC,ALKM,ALPA,AOSA,CGPL,ALKMP,ALPAvG,AOSA,IAAI,CPTC,AOSAuG,IFFI,EAAE,GEEG,CAAC,OFFO,CAAC;AIHhE,EsBHE6U,AlBMA,AFCA,AVVA,ESKE,AoBUApc,AFRA,AvBGA,AEEA,EONE,AQDAwW,AJRA,EIQE,AGCA,ATGAvG,CMJC/N,CRCCgM,AITA+E,CbaC,AEEA5J,CuBGC,CAAC9I,CZlBC,CbaC,CAACoH,AabA,AFYA,EFHE,AEGA,ATGA,CwBTCyU,AxBSA9S,CwBTA,ATEC,CRCC1J,AQDA6W,CSFC,AxBSA,CePC,AfOC9R,CePA,CRCC,CAAC9E,AEGA,CTGE,EuBGC,AzBLA,CyBKC,AzBLA,CEEG,IONE,APME,COND8E,ETIE,CyBKC,AvBHE,CFFD+C,ASJA,APME/C,CuBGAnE,ChBTA,CAAC,CAAC,APME,CFFD,AEEE,CuBGA,AzBLDqH,AEEE,IuBGI,EzBLA,CAAClI,EAAE,CAAC,CAAC;AMCzD,AFLCyC,EIKCiL,AeHA,AvBGA,AEEA,ANXA,E8BEE,ArBEA,AYAA,AtBFA,CsBEC,CQUC,ARVA,AGCA,ChBDL,CSRO6E,AFYAhC,APJPlG,CRJQzG,C8BEC8Y,ADYApC,CpBVC,CDAV,CsBFY,AfMA,CcMC,AZlBA,CRQC,AQRAvT,AFYA,APJdsD,ARJczG,C8BEE,ADYD2W,A7BdA1W,GQIf,ARJkB,CYSC6J,CAAClD,AZTA,CiBJC,AFYA,EcME,AZlBAgI,CLaC,EAAE,KKbK,CAAC;AaOjC,ApBMC/P,EDJC,AkBGA,AvBGA,EQDE,ASLA,AGCA,AzBHArB,ACFAsB,CwBKC,CKUC,AhBVA,AWAA,CdGL,CECO,AFDP6I,AiBDOyN,AvBGA7Q,AiBNA,AJRAkL,AFWgB,CMHfjT,CQWCS,C9BbC,CaOC,AbPAQ,ACFA,CYSCmJ,AZTA7H,CIUCwF,C0BRCzF,ADaA,AzBLAkF,CyBKC9G,A7BfA,CYSC,AbPA,ACFA,C2BOCkY,ANHA,CQWC,AjBNA,AeFD,ANHCzW,CXIlB,AXNmB,C4BKC,AVXA,CjBIC,CUQrBgJ,CmBOuB,AzBLA,AadA,AjBIA1H,EIUE,CJVC,CiBJC,AjBIA,EqBIE,CAACgT,CtBFQ,C+BAhB,ATEU,CSFT/S,ATEU,CQWC,AnBPlC,EmBOoC,KCbL,CAAC,CAAE;AACnC,ErBGE,AYDA,AfOA,ANXA,E2BOE,AvBGA,AoBLA,EZIE,ACJA,AdJiC,E8Bc/BwW,AFRAvP,AVXA,AOSA,ATEAyF,CNFCjM,AeAAkT,CpBKC1P,ASLAyG,EgBUE,AjBNAV,CeFC,CdFC,AEEA,CeLCpL,ADaA,AzBLA,ALTwBpB,C4BMvB,AZAA,CFFC,CTKC,AoBLA,CKUC,ALVA0K,AzBJoB,C8BcnBqO,AFRA,CAAC9U,AdFAkJ,CdJkBlN,EKSf,CKLCgD,AIAA,AEEA,CNFA,AIAC,AWAA,ATEC,CFFAgK,AWAA,CfAC,AkBEA,AvBGA,CuBHCrM,AvBGAqF,EQDE,AbRQ,CAAA9H,C+BChB,ANGU,CMHT8D,ADaU,AjBNA,CCJC,CAAC,CgBWxB,CjBP0B,ACJA,AdJC,CaQAgC,CkBPT,AHKU,AvBGA,ALTP/D,C+BCF,ADcf,AFTyBsP,AvBGAlJ,C0BRR,ADchByS,E9BfoB,C4BMQ,CfEC,AeFA,CfECpY,AeFA,GvBGG,CLTbR,CKSe,IyBMrB,A9BfM,C8BeL+Y,A9BfKlZ,GaQuB,CACnD,AbT4B,EKS0B,CAAC,ALT3BI,IAAA,CaSrB,IAAI,CAAC8I,AbTgB9I,C8Bea,GACtC,AjBPa,AbTY,CaSX1B,EAAG,AbTQsB,C8BgBrB,CAAC6X,AjBNX,CAAC,CbV8B,EAAAzX,IAAA,G8BgBT,CAAC+Y,iBAAiB;ACd9C,ATEA,AfOA,ENVE,ESIE,AkBEA,AvBGA,EQCE,AKfA,AOSA/X,ATEA,CAAC,CcUC,AFVAqI,AdHgChL,AEGhC,AhBPyByB,CCCxBsC,CYUCgK,CHNCpL,ALKA,CyBOC4X,AhBbgC,AdJP,C4BOxB,A5BPwB5Y,C4BOvBjC,AdHgC,CiBF/BiD,A1BQA,CyBOC,AzBPAsF,CLVqB,ACCpBlE,C6BgBC,A7BhBD,E2BMG,A3BNA,CDDiBvC,GyBKvB,CGEW,AHFVwC,CGEW,EAAE,ClBFT,AGMU,ARDA,CKLTd,ALKU,ALVO,CaWN,AbXMvB,E+BEd,ArBGA,AeAA,CMHC6C,ArBGA,AeAA,CzBLa,GKUC,AoBLV,CAACkT,CpBKW1P,KAAK,CAACI,EoBLR,CfAC,AeAAyO,CMHC,ArBGA,CqBHC,CAAE,A1BQS,CAAC,CAAC,CAAC,KoBLL,CAAC,CAAC,CAAC;AMFrD,ATCCnU,AfQD,EGNE,ALKA,EoBLE,ATEA,AfNA,CwBIC,CGECsI,AdJ2D,AIN3D,AOQA,AzBN+B,CcI6B,AQAjE,CTQO+C,ACR2D,AQAlEwI,EQcS,CFVC,A3BNA5T,CqBEV,AJNW8Q,EYoBE,AFVA,CGLCvT,ATCdqW,GQciB,AFVA,CGLC,ADeA+D,AFVAxB,ANJlB,ArBFkB,C8BCC3Y,A9BDA+C,CiBJC,EjBIE,CiBJC,AjBIA,GYUG,CAACd,AKdAsR,CaKC,CAAC/Q,CHKC,A3BNA,CAAC,C6BgBC,EACrB,EjBPyB,CAACF,CiBOtB,AZrBuB,CYqBtB6X,AZrBuB,CAAC,CAAC3G,ELcE,CAAC,GkBTP,AbLU,CaKTtP,AbLUxB,KYqBlB,AZrBuB,CYqBtBT,AjBPuB,AKdA,CLcC,QiBOf,CAACK,EChBe,CAAC,CAAC,CAAE,CDgBb,CAAC,OAAO,CAAC;ACfzD,AxBSA,CwBTC,CrBIC,ALKA,AWJA,AfNA,CeMC,CSFC,EZME,AeJA,AdJA,AINA,AlBEA5C,EKYEwI,AoBNA,CAAC2P,CKaCuC,AFXA,AdJAzW,CcIC0B,CVVCoO,CbcCvL,ASRA,CgBeC,AzBPAR,CKLCwD,AoBYAjJ,ChBfCuB,CINC,CUUC,CAACvB,AdJA,AWEA,CXFCuM,AINA,AOQA9N,AzBNA,CkBFCwS,AlBEApS,EKYE,CyBOC,CAACoB,AzBPA,ALZA,CAACZ,E8BmBE,AFXA,ClBDC4J,AoBYA,AFXAhJ,ClBDCoI,AVPA,CAAC,C4BQC,AVVA,CUUC,ClBDC,CIHC,AINAgJ,CRSC,AoBYA,AhBfAhF,AWEA,CKaC,ALbA,GGEG,AdJA,CcIC,AdJA,GING,AOQA,EPREoF,AOQA,IAAI,CPRC,AOQA5S,CPRC,GOQG,CPRC,AOQA8K,CPRC,GOQG,CAAC,IAAI,CAAC,CAAC;AlBOnE,ESHEiE,AfNA,E8BAE3O,ArBIAsB,AGKA,AeJA,AvBIA,AoBNA,CGEC,CdHC,AIPA0Q,AlBEA,EyBME,CAACgF,AxBHArU,C6BgBC,AzBPAgE,ASPA4G,CiBFC,AHKA,AdHA,CiBFC1J,EDgBE,AhBdA5E,AEIA0P,CeNC,ADgBAsK,AzBPA,AWHD,CeNEqC,CbLC,AFWA,AfNA3Y,CISC,AJTAC,C8BAC,CAAC,AbLA2P,ERSR,AIFU,CJETnP,AIFUoK,AbFA,CISC,CadC,AjBKA,CiBLCiF,EbcE,AoBNA,CKaC,AzBPAtM,AadA,AOQAjF,CPRC,CAAC,CYqBCgY,IAAI,AhBdA,AWCA,CKaC,AhBdA,CgBcC,CpBZT,AeDU,CfCT9P,ALKU,ASPA,CTOC5C,ASPA,GJEP,CAAC5H,AeDU,EfCR,CAAC,CeDW,CpBMC,AoBNAwY,EpBME,WAAW,AoBNA,CpBMC,AoBNA,CAAC;AlBOjE,EwBTE,ErBIE9T,AGKA,ARAA,AoBNA,ATGA,AfNAhC,E2BKE,AdHAiM,AINAgF,AlBCAxS,CcKC,CAACwC,AWCA,CAACtB,CKaC,AjBPA0L,AeJA,AZCA8B,CYDCtK,AvBIA,AabA,CJMC,AINAkH,AjBIA,CAAC9J,C6BgBC,CAAC0X,AzBPA,ASPAxW,CJEN,ALKOmE,AJTA,CSINjD,ATJO,C2BKC,AdHA,CcGC5C,AVTA,AFUA,CEVE2R,AOOD,CfCN,AeDOxR,CfCN,AMEOjC,EHGE,AKbC,AjBID,EDHE,ACGA2D,CYSC,AbZArC,C4BQC,AVTE,AOOF,CKaC,AFXAa,AvBIA,CyBOC6N,AzBPA,AWHA,CHGC,AYNA,ATGA7P,AfNA,CYSC+E,AbZA,ACGA,CDHCnE,E4BQE,ClBDN,AkBCO,CHFC,CfCNoJ,CGKQ,CAACvI,AbZA,CKYC,AoBNA,CfCN,AeDOlB,AzBNAS,CUON,AkBCO,AvBIAuG,CyBOC,AFXA,CEWC,AdVA,CSHC,ATGA,AhBTA,CyBMC,AzBNA,CKYC,AoBNA,CpBMCK,IQAI,CAAE,ARAD,CAAC,CAAC,CAAC,CWHC,CAAC,GHGGoC,IAAI,CAACxK,EAAG,EAAC,CAAC;EkBPtE4L,ArBGA,ALKA,AoBNA,AlBMA,ANTA,EYSE,AeJA,AZCAiE,AhBTA,CAAC,CcKClB,CAAC,CiBDC/C,AlBQAmC,ACPAc,AINA,CaKA,EAAG,CDeCyB,CdVC,CEVCyD,AFUA5R,CTGCyH,COPC,GAAG,CgBcC,EAAE,AjBPA,CGHC,CHGC,AGHAuG,EEVE,GAAGlQ,CYoBC,AdVA,CAAC,EEVE,AXaA2J,CWbCvG,AXaAwG,KOPK,AINA,AFUA,CEVCiK,AFUA,GTGG,CWbC,CAAC,AXaA9T,EAAE,EAAE;EGH/C,ALKAgI,AoBNAhH,AzBPA,ACIA,E8BAE,AHIA,AZCA,ATGA,EMAE+M,ACPAY,AWEA3N,CXFC,AWED,CMHE,AjBCA8N,AINA,AFUA,CeLCmN,ANGA,ATEAnM,AfLA7L,C2BICuG,EEWE+F,AZpBAuD,CJMC,CcGC,AdHA,CJGCtP,ALKAwD,ASRA,CiBDC,A1BSAjI,AadA,CaKC6L,ADeA,AFXA,AVTAkF,EYoBE,CjBPC,ARCA,AWJA,CHGC3O,AKbA,AFUAsO,CXIC1J,AadA,CaKC,AHIA6D,AVTA,CaKC,A9BAA3G,C8BAC,AbLA,AjBKD,CeKE,CAAC,AfLA,CeKC,CXIC,CQDC,CHJCO,AGIApC,ARCA,CKLCqC,EGIE,CAAC,GHJG,EAAE,KGIK,CAAC,KeJV,CAAC0G,cAAc,CAAC,CAAC;EZEnD,AhBRA,E+BGE,ArBIA,AGIA,AeJA,AvBKA,AoBNA6L,AlBKA,ANRA,EaCEtT,EiBDE,AHIA8G,CGJC0R,AjBCA,AdJAta,CUOC4I,AoBWA,AhBdAuE,AINA,AXaAxH,CuBOC,AzBNA,AJTA7E,C6BeC,AFXA,CEWC,CpBXC,AoBWA,AFXA,CvBKCkE,E0BTE,ArBIA,CqBJCgF,ANGR,CAACqL,AxBHQ,CAAChU,CMQC,CFCC,CKLCoH,ALKA,AoBNR,AxBHQ,C8BAC,A1BSAxD,AoBNR,AlBKQ,ANRA,C8BAC,AjBCA,AWER,CMHS,AjBCAhD,GAAG,CAAC,APOA,CFCC,ALZAjC,CAACP,CUOL,ALKMyF,CKLL7D,AHIM,CAACsE,EGJJ,AVPM,CUOL9C,CLKO,ALZA,ACGA,CAAC,ISIF,ALKM,CKLL,CHIO,CAAC,UAAU,CAAC;EwBPxD,AfMAuL,AfNA,ESIE,AGIA,ACPA,AWEA,AzBNA5O,CcIC,CcGC,AvBKA2F,EKLEyD,AoBWA,ALZA,CAAC4L,CPRC,ClBEC,CUOC,AkBAAxL,A5BPA/I,CKYC,CKLC,ALKA8F,AadA,CAACqM,AFWAhE,CAAA,ChBTE,CgBSC,AhBTA,CyBMC,CAAC,CAAC,EpBME,GAAG,MAAMnJ,ALZA,CkBFC,AlBEA,CkBFCkN,KbcK,CuBLd,AvBKehN,CuBLd8D,KVToB,CbcC,AadA,CbcCvD,GuBLZ,CAACkD,EvBKiB,CAAC,CuBLd,EAAE;EGFzCmB,ANEA,AxBFA,EYOE,ACNA5E,AEIA,AhBTA3F,AOWA,EGJE,AoBWA,AzBLA2F,CyBKC,CjBPC,AeLqCgE,CfKpCP,AZPAtG,CiBNCmO,CJOC,AdLA,CUOC,AIFAnL,AdLA7F,C8BkBC,AjBPA,AREA,AWJAqP,CXICxJ,EKNE,AGIAsD,CHJCY,AoBWAvK,A9BlBA,CAACQ,CcKC,CiBDCsK,AlBOA,AKbA,CaMA,A1BSC,AafA5E,CYoBC,AhBbA,CiBDC,ADcAjG,A9BlBA,CKaED,ALbD,ACIAqD,CeKCwM,AfLAvM,C6BcC,AdTAwM,EEXE,CbeE,CafAoD,CRSC,AoBWA,CpBXCvJ,AIFA3J,AEIA,CXIG,CWJD,ENFE,CAAC,AIFA,AbDA,EaCE,AbDA,C6BcC,EAAE,AZpBA,CAACf,OAAO,CAACW,OAAO,CAAC;ELczD,AYJA+X,EMHE9T,ArBGA,AVPA9E,AOWA,ANPA,E2BC+C,AdA7CwB,AEIA,CYJ8C,CEa5CmZ,AFb6C,AvBQ7C,AafA,AjBMApW,EMOE2F,GONG,AEIA6G,CXICtP,ASRAA,CWECmX,AlBIA,CwBPN,ADcO,ALXD,CMHL7T,CNGQ,AzBPA,AOWA4C,CuBOC,AzBLA,ASRA,AEIA,AhBTAvG,CcKC,AEIA4P,AfLA,EISG,C0BTP,ADcO,A9BlBA,C+BIN,ADcOyJ,A9BlBAhZ,CCIC,EeKE,AfLA,CeKC,ChBTC,AOWA,ANPA,CDJC,AOWAyI,IFEI/J,CEFC,CAAC8J,EwBPL,ADcO,AzBLC,E0BTN,CDerB,ChBd8B,EiBDL,AjBCOhJ,CiBDN6M,ADetB,AvBR6B,CuBQ5B2M,AvBR6B,GONG,AEIA,CFJClT,CEIC,KFJK,CAAC6H,AEIA,CAAC,CAAC,CcU5B,AzBN6BnO,AWJA,CcU5B6Z,ECfwB,CAAC,C1BSQ,CAACvT,ASRA,CAAC,KTQK,CAAC9F,KAAK,CAACvB,IyBMzB,GAC1C,AzBP2E,EAAC,EyBOxE,CAACqZ,WAAW,CAACwB,gBAAgB;EpBZ3C,AGKA/O,AbZA,E+BIE,AHCA,AdAA,AWEA,ATEA,ATEA,CqBNC,AdAA,CIPC,AjBMAzH,CiBNC,CYsBC,AjBRAyH,ARCA9E,AafA,AOSA,CZKA,AYLCkQ,ClBICjQ,CMCC,AePA,CEeCwT,EzBPE,CAAC,EEFE,CNPC,CISC5T,CyBOC,AvBTAmD,CNPC,C6BgBC,CLbP,CpBMS,AoBNRvG,CpBMStD,AEFA,ANPA,CMOCkI,GFEG,CAACjI,AoBNR,CAAC,CAAC,AlBIQ,CAACF,CkBJP,ClBIS,CAAC,GFEG,CAACqB,KAAK,CAAC,CAAC,CAAC;EKJ9C,AIHA,AdJAL,E+BGE,AlBQA,AKdA,AFWA,ATGA,ANRA,E2BCE,AvBQA,AoBNApB,AzBNAoB,CKYC,ALZAlB,C+BGC,CAACwZ,CDgBC,AjBRAtL,AGHA6C,CTGC,CqBPCjG,EEeE,A9BnBA,CUOCS,AMCA,ATGAzE,CPXC,E8BmBE,AdXA8J,CcWC2J,CChBC,CAACzZ,CxBQC,CMAC,ANAA,CAACiG,CGJCwE,CAAA,AGICT,EHJE,EMCE,CAAC,ATGA,EuBQE,AvBRA9D,EuBSrB,AdZuB,CSFf,ATEgBgJ,CeLC,ANGhB9O,CMHiB,CDiBtB,AvBTuB,CuBStBqZ,AFhBQ,CAACvP,AHED,CAAC,ElBKkB,CwBRC,EAAE,AfKA,CAAClI,GeLG,AHCf,CGDgB+Z,AHCf,CZIgB,CcYtB,AjBTQ,AGHe7L,CcYtB3O,AjBTQoC,GGHkB,CAAC,CAAC,CAAC,CAACqM,CeLC,CAAC9E,ADiBvB,CAACtJ,GCjB0B,CAAC,AfKA,CAC/D,CcW0C,AjBTQ,CiBSP,AjBTQ,CkBRgB,AlBQf,CkBRgB,CAAC,CfM/D,EACN,CcUkD,CAAC,EdTrD,CAAC,WSLyE,CAAC;AXD/E,IiBDI,ArBIAE,AGIA,ARCA,AadA,AOQA,ATKA,AhBXA,ACGAA,CISC,AoBNA,CpBMC,AEDAqE,EwBRE,AlBQA,AeR+BgE,AVL/BqI,CaKCgG,AlBQA7T,CiBSCgV,AdTAxJ,CSLC,CxBHC,CMQC,ANRApO,CMQCgF,EMAE,AZRA,CYQCsF,AZRA,C6BiBC,CAAC9K,AZtBA,CAAC2O,CaKC,CAAClQ,ArBIV,AMIU,CNJT4D,AHIU,CWbC,CAAC,AFaAqM,CHAC,AKbA,AXaA,EuBSE,AZtBA,CYsBCzO,AjBTA,CGAC,CHAC,AGAA3C,CcSC,AvBTA,ANRA,C6BiBC,C7BjBC0E,GeQG,CeRC,CAChC,ArBGuB,CAAC,AoBaU,AdTA,CcSC,AdTA,CAAC,CAAC,CNJT,CAAC,CTJW,CAAC,E8BC/B,EACV,IAAI,CAACyY,cAAc,CAAC9Q,IAAI,CAAC,IAAI,CAC/B,CAAC;AjBFJrJ,EiBGC,A1BMA,AJTA,ESIE,AGIA4H,AGAA,AhBXA,E4BEyC,AVJvCgI,AOQA2E,CGJwC,AdC7C,CgBiBO,AFlBuC,AdC9C7I,APQO,EGJE9D,AMIA2G,AhBXAlP,IaWF,CAACqG,AGAM,AhBXA,CkBFC,CAACpB,CFaC,AhBXA,EUOJ,AeDF,CfCGqB,AGIA,AYLF6O,CZKG,AGAMhG,AhBXA,CaWL,AbXM1Q,CaWL8M,AKbM,COQP,CfCG,AQTM+F,AOQR,CfCG,AIJpB,AWGkB,CfCG,AGIA,AGAM,CHAJnF,AGAK4C,CFR5B1C,CdH8B,CAACpM,EaWH,AGAK,EAAE,CEbC,CLaH,AKbI,CFaC,CAAC,CAAC,AhBXA,CgBWC,AhBXA,IAAI,CAAC,EcG9C;ATUD,E0BLE2L,A9BHA,ESGEhJ,AkBLA,AVJA,AOQA,ATKAtD,EHAE6M,EiBSE,AvBTA,CNPC7J,EYOE,AGAA,CcSC,AjBTAqI,AGAAxH,CcSCoV,CvBTCtQ,CSAC,CNJN,AMIQ,CNJPhF,EGIS,CkBJC,AlBICyF,CHJP,CAAC,AHIO,CwBJEA,ClBIC,CNAAzD,CSAC8J,CeJE,ADaD,A7BhBAzM,CYOG,AZPH,E6BgBGmW,A7BhBA,C8BGG,AfID,CTAA,CSAC,ATAAjT,CSAC,ENJL,CAAC,CoBaQ,CAAC,AvBTA,CuBSC,AvBTAqC,GAAG,CAAE3E,IAAI,IAAK,IAAI,IAAI,CAACA,IAAI,CAAC,CAAC;AFCpEvC,EKJC,AkBLA,AVJA,AOQA,EMCE9B,AfIA0J,AhBXA,ACIA,GIOH,CyBSO,AjBTA,ARAPhE,AEAOQ,EwBJE,CAACgW,A9BHAna,C6BgBC,CAAC2X,CjBTC5O,AGAN,CAACtD,ATAM,CFAd,AEAe4B,EwBJE,CAAC+S,A1BIlBzW,AJPkB,CAACpD,CeOL,CHAO,AGAN,CAAC,AfPM,CeOLoK,ATAM,ANPA,CYOC7C,ANAA,EuBSE,AzBT1B,C0BJ2B,ADaA6F,AdTN,CeJO,AlBIA,AGALpC,CeJM,AlBIAjO,CkBJC,ClBIC,CkBJC,CfIJ,CeJM,EAAG,AlBIDgO,CGAH,IcSQ,A7BhBA,C6BgBC,A7BhBA,I8BGIxD,GlBIG,CkBJC,CAACxK,EAAG,EAAC,CAAC;ArBCzD,AkBLA,EGKE,AbRAiU,AOQAoE,AxBHA,C8BGC,C/BPC,EgBWE,ATAA,CWZCpE,AXYA,CMAC,AKZD,EYqBG3D,AZrBA,AlBCAtO,EaWE,AGAAkP,CHACvD,CYJC0K,CAAA,EAAG,CKaC,CdTC,CcSC,EdTEpK,CHAC,CAACzD,GGAG,CcSC,AjBTA,AGCnB2G,ChBZoB,CaWC1F,EbXE3J,EgBYjB,CAAE0I,EhBZoB,CaWC,AbXAvI,CaWC,AGClB,IAAK,QhBZyB,CAAC,eAAe,CAAC;AUOnEQ,AkBLAA,EGOCka,A9BHA,EiBNE,AOQA,AzBPA,EaWE,ANAA5V,CGLL,AGKM,AeVN,ClBKA6D,AGKO,AeVPgO,AVFO,AOQA,ATKE,AhBZF,CyBOCZ,AzBPAhW,ACKAqC,C6BeCkM,EZrBE,AFaEa,CeJD,AbTAe,AXYA,CAACjL,CuBSC,CCZCyV,CAAA,ADYC,AFnBhB,AHMgB,ATKE,CSLD/Z,EGNjBgW,AZWqB5H,CNNrB,AHKoB,CwBHC,CNDC,CfDtBpG,AHKuB,CSCG,CSLDlI,ATKE2O,CfPDhN,CiBNC,AlBCA,ACKAC,C2BJ3B,CVF6B,AFaE,AhBZF,AOWA,CSCGkG,IAAI,CAACO,CNNrC,IMM0C,CAAC,CfPD,CwBET,CAACxH,AxBFU,MwBEJ,CAAC,CAAC;IMEvC,ANDA,AxBFA,EYME,AKZA,AlBCAnC,E+BQE,ADYA,AdRE,ATDF0F,ANNAxC,C8BGC6X,ADYA,CAAC,AjBTAhQ,AKZA,AOQA7H,CKaC,AZrBA6N,CYqBC,AdREpB,ChBZD,CAAC1P,AOWA,CAAC0F,GwBHG,CAACkN,A/BRA,CAAC,EOWE,CAAC5S,ANNA,C8BGC,AfIE,CeJD,ANDA,CMCC,AbTA,AFaE,CEbD4S,COQCvR,AlBIA,ANNA,CMMC,CNNC,EiBNE,AjBMA,CiBNC,CLYZ,AKZa,CLYZ,WYJc,CAAC0B,KZIE,CAAC,YYJe,CAAC,CAAC,EzBPY,CAAC;I+BSlE,AlBGA,AKZA,AOQA,CZIC,CiBSC,AjBTA,AbXA,AOWA,ANNAE,CMMC,CwBHC,ANDAA,CMCCyY,CfIG3L,KAAK,IeJE,CAAC,AfIEJ,CeJD,A9BHA,EwBEE,CxBFC,CwBEC,ATKE,CAACK,EfPA,EeOI,CAAC7G,IAAI,CAAC/J,OAAO,CAAC;EHA5C,AKZA,EaSEW,ADYA,A9BpBA,AOWA,ANNA,C6BeC,AvBTA,CuBSC,ALbA,AlBIA,ESCI,ESLA,CMCC,ANDA+W,CMCClT,GAAG,CAAC,eNDe,CAACrC,CMCC,CAAC,GNDG,GAAG3C,IAAI,CAACC,SAAS,CAACoE,eAAe,EAAE,CAAC,CAAC;EMExE,ADYA,AjBRAqJ,AKZAqG,AXWA,CwBHC,CNDC,AxBFAtR,IeOM,IHAEiL,AZPA,CYOCnD,AZPA7H,EeOIyO,CfPD,CYOC,AZPA,EYOE3F,CKZCuI,AFYE,CEZDhP,IAAI,ELYE,AKZA,ELYE,MZPM,EAAEV,eAAe,CAAC;E8BKnDsY,ADYA5C,ALdA,AxBFA,EYOE,AKZA,AlBAA,EgBYI,CAAC,CEZD,AFYE,CEZDhV,AFaA2E,CHDCuE,EGCE,CEbC,AFaC1D,CEbA0J,EaSE,CfIE,CcQA8F,CCZEnZ,ADYDf,EdRI0K,CHDD,EkBHG,ClBGA,AGCE,CcQD,AdRExK,EeJE,ADYF,AZrBA,AFaE,CHDDuL,AGCE,CEbD,yBLYW,CAACf,IAAI,EAAE,IAAI,EAAEiB,QAAQ,CAAC;AYJ/D,ElBIE,ANLA,E8BGE,ADYA,AjBTA,AbZA3J,EkBAE,AFaA,EeJEjB,AlBGA,CAAC0E,AbZA,ACMAhB,C6BeCqW,AdRA,AhBbA3Y,CgBaCsD,EeJE,CAACzE,ADYA,EjBTE,CkBHC,ADYAhB,AjBTAyC,CGCC,CAAC+J,GeJG,C/BTC,C8BqBC,A9BrBA,C8BqBCsO,A7BfArW,CAAA,EYMG,AZNA,C8BGC,ADYA,AjBTA2J,IkBHI,CAACrN,CfIC,CAAC,GeJG,CAACmc,ClBGC,CAACzX,KbZK,C+BSC,A/BTA,CaYC,AbZArD,C+BSC,AlBGA,GGCG,CAAC,CAACuK,KhBbK,EgBaE,CAAEC,AhBbD5M,IgBaK,GhBbE,CgBaG;ASNxE2C,ElBKC,EuBUE,AjBTA,AKZA,AlBCAT,ACKA,E8BGE,CNHL,CAAA8V,ATOO,EeJE,ADYArX,CCZCwc,AlBGA/O,AZNAxL,CeOCwO,GTFGlH,EuBUE,EdRE,AfPA,C6BeClK,AdRAwR,AfPArO,CMKC+G,CwBFC,ANHrB,AlBKoB,CwBFE,AlBGA,AbXA,ACKA,C8BGC,A/BRAhK,AOUA,ANLA,CwBAvB8X,CzBLyB,C8BoBC,CAACrX,AdRA,CAACiM,AhBZA,IgBYI,AhBZA,CgBYC1H,AhBZA7E,C8BoBC,GdRG,CSPrC,ATOsCH,AhBZA,ACKA,CDLC,ACKA,CeOC,AhBZA,CgBYC,EAAE;EHA1C,AZNA,E8BGE,ADYA,AZrBA,AlBCA,AOUA,IAAIuH,ESEE,STFS,GAAG,MAAM,IAAI,CAACF,EAAE,CAACE,WAAW,CAAC,IAAI,CAACK,SAAS,EAAE,UAAU,CAAC;AME3E,EkBHE,A9BFA,C8BEC,CDYC,AZrBA,AlBCA,AOUA,IPVI,AOUAG,CNJCvD,C6BcCjE,AZrBA4T,AFaAzH,EhBZE,CAAC3M,AOUA,CSEC,CAACoC,CTFC,CPVC,C8BoBC,C9BpBC,E8BoBE9B,CvBVCkH,ESEE,CAAC/E,AfNAgC,CAACC,G6BcG,CAACjE,CdRC,CEbC,AFaA,AfNA,CMIC,CAAC+G,ANJA,CiBPCvC,IAAI,CAACkP,AFaA,CAAC,GcQG,CAAC,AvBVA,CAACpM,QWXQ,GAAG,AXWA,CAAC,EWXE,EXWE,CAACF,KuBUK,CAAC,GvBVG,CAAC;AMCxEnF,EkBDCsa,EDWE,AZrBA,AXWA,ANJA,EDNE/a,CaUL,CAAAoL,AGEO,AfNA3I,CeMC,CcQCoW,AZrBAzG,CXWCrM,CwBDCgV,CAAA,C9BHE,C8BGC,AfGA,CHFd,ANAe,CAAC5U,EMAhBiF,AZJkBjK,G6BcG,CvBVC,CAAC,CuBUC5C,A9BpBA,AOUA,CPVC4B,CaUzB,CZJ2B,EAAE,CiBPC,EYqBE,CAAC1B,AZrBAuE,ClBCC,CAAC5C,EkBDE,CAACiS,AlBCA,CAAE,C8BoBA,CAACtS,SAAS,CAAC,AZrBA,GAAG,CYqBC,A9BpBA,C8BoBC,CZrBC,ElBCE,CAAChC,IAAK,EAAC,CAAC;EOWlE,EwBDEsF,ADWA,AZrBA,AlBCA,ECMEZ,IiBPI6P,AFaA5H,EeHH,A9BHK,C8BGJlH,CfGM,CAACrD,AfNA,IAAI,K8BGA,AfGK,CeHJ,AfGKC,GAAG,CeHJ,AfGK,CeHJkX,ObVY,AFaA,CAAC,EEbEtU,CaUJ,CAAC,CAACS,CbVM,CAAC8O,SaUI,CAAC,IAAI,CAAC6E,KbVU,GAAG,GAAG,CaUJ,CAAC;AxBEpE,IwBDI,ADWA,AZrBA,AjBOA,I8BGI,AfGA,CeHCA,CDWC0B,AZrBAtG,UYqBU,CCXC,CAAC/D,CDWCoK,ICXI,CAAC,CAAC,MDWM,CAAC5Y,GZrBG,GAAG+C,IAAI,CAACyP,EYqBE,CAAC,UZrBU,GAAG,EYqBE,CAAC,AZrBA;AXWjEhS,EwBAC,EDWE,A9BpBA,ACMAC,EeME,CAAC,ATHN,CSGO,ATHP0G,EuBWS2R,E7BdE,CAACpY,GAAG,CMGf,ANHgB,C6BcC,EvBXjByG,CuBWoByR,QvBXpB,GNH+B,C6BcC,CAAC5Y,A7BdAwC,MAAM,CAAC,M6BcM,CAAC,oBAAoB,CAAC;ECTnEyY,A9BJA,E6BcE,AZrBA,AFaA,AhBZA,CgBYC,CAAC,IcQIlC,A9BpBA3Y,G+BUG6a,CAAA,EAAG,K/BVK,C8BoBC,E9BpBEpb,C8BoBC+Y,I9BpBI,CAAC5Y,O8BoBO,CAACA,K9BpBK,CAAC,O8BoBO,CAC7C,oB9BrBkE,CAAC,Q8BsBrE,CAAC;A7BfL,EeME,EeFEoD,AbXA,AlBCAhD,MkBDMqS,EaWH,CAACpP,E/BVO,CAAChD,OAAO,C+BUJ,CAAC,AbXK,ClBCC,EkBDE0C,CaWJ,CAACsU,EbXO,AlBCA,CkBDC3E,GlBCG,CAAC5T,I+BUD,A/BVK,C+BUJ,A/BVK,C+BUJ4E,AbXK,AlBCA,GkBDG6O,SaWI,CAAC,IAAI,CAAC4E,YAAY,CAAC,CbXM;AjBO1E3W,E8BKC,AfGA0N,EcSE,AZvBA,GjBMH,CeQOA,AfRPzN,CeQO,CEdEkS,CFcC,KEdK,AjBMf,GiBNmB,AjBMnBlS,QAAA;AiBLD,IYuBIoY,AdTA,AhBbA,IgBaI,CEdC9V,AFcAO,IEdI,CYuBC,AZvBAvB,CYuBC7B,CdTC,CAACA,EEdG,KYuBI,CAACC,CdTC,CAAC+N,CcSC,CAAE,GAAEyK,CdTC,CAAC,EcSG,SdTQ,CAAC,KcSK,CAAC;AZtBpD,EaWE,EDYEG,AdTA,AhBbA,IgBaI,AhBbA,CgBaCrL,AhBbArP,G8BsBG,CAAC6B,CZvBC8C,GlBCG,CkBDC,AlBCAxE,CkBDCqU,KYuBK,AdTA,CAAC1S,EcSE1B,EZvBG,GlBCE,CAAC,C8BsBC,AdTA,CAAC0P,EhBbE,CAAChQ,GgBaG,CAAC,ChBbC,CAAC,EAAE,OgBaO,CAAC;AEbtD,EaWE,EDYE2a,AdTA,EhBbE,E+BUEmC,AfGA,IAAI,CAAC1X,CcSC,CAAC0V,ICZIgC,CAAA,AfGC,CAAC9a,CeHC,AbXAgS,GYuBG,GAAG,EdTE,CAAC5C,EcSE,MdTM,CAAC,IEdI,CAACuD,MFcM,CEdC,AFcA,CEdC,CAAC,AFcA,CEdE;AACxD,IaWI,EfGE,AhBbA,I+BUIqI,AfGA,AhBbA,CgBaC5N,AhBbAnP,QgBaQ,CAACuC,AhBbA,C+BUC,AbXAyR,AlBCA7R,EgBaE,CeHC,AfGA,IeHI,CAAC6W,G/BVG,CAACtX,KAAK,CAAC,E+BUE,CAACc,AbXA,CAACkS,AFcA,EAAE,EeHE,CAAChE,CfGC,CEdC,AFcA,CEdC,CaWC,AbXA,CaWC,AbXC,CaWA;AbVtD,IaWI,ADYA,AdTA,AhBbA,CgBaC,MAAM,gBEdgB9L,IAAI,CAAC+P,iBAAkB;AAClD,ElBCE,E+BUE,ADYA,EdTE,EeHEvK,ADYA,CAAC2O,CdTC,CAAC5J,CeHC,GAAG,IfGI,CcSC,AdTA5M,CeHCiI,ADYArI,EdTE,CAAC,QcSQ,CAACuY,CZvBCxG,SYuBS,AdTA,CcSC,CdTC,IeHX,CAACnJ,AfGe,CAAC,UEdU,CAAC2J,EaWb,CAAC,CAAC,GbXkB,CAAC,CAAC,CAAE;AACzE,ElBEE/T,E+BSE,ADYA+Z,AdTA,EhBZE/Z,CAAA,EAAG,C+BSC8C,GAAG,CDYC,CAACqX,CCZCxY,MDYM,CAAC,IAAI,CAAC,CZvBCsC,EYuBElF,EZvBE,CaWT,AbXU6U,CaWTpR,GDYa,CAACvD,ECZR,ADYU,CCZT,EbXa,SaWF,CAAC;AbV5C,EFcE,EeHE,ADYA,A9BrBAK,I+BSI,ADYAqY,CCZC7U,GAAG,A/BTA,CAACrD,C+BSC,a/BTa,C8BqBV,A9BrBW,C8BqBVsa,G9BrBc,CAAC3a,GkBFGqU,ElBEE,C8BqBV,A9BrBW,C8BqBV,C9BrBYhS,MAAM,CAAC,CAAC,gBkBFgB,CAACsS,OAAO,CAAC,CAAC,CAAE;AAC7E,EFeE,AhBbA,E8BqBEkG,ECZEpb,EfIEqQ,QcQQ,CAACrP,IZvBI8T,AFeAzE,CAAA,EAAG,ScQS,CAAC,ECZd,AbXgB,CaWfjP,AbXgB8T,IaWZ,ADYgB,CCXjC,CDWmC,CZvBC,CAAC,CAAC,CAAE,QYuBO,wCCVjD,CAAC;AbZP,AlBEA,IgBaI,CEfC,CaaC,ADUA,IdRIlK,EcQEA,CCVC,IAAI,qBfEM,CAACE,CcQC,CAACE,QdRQ,CAAC,CAAC,OcQO,CAAClL,OAAO,CAACE,EAAE,CAAC;A9BrBtDyC,EgBcC,EeFE,AbbArB,EYuBE0Z,C9BtBL,CAAAlb,GkBDU,CAACqF,GAAG,CYuBC,AZvBA2P,CYuBCpS,KZvBK,AlBCrB,C8BsBsB,AZvBA,CYuBC,CAAC,A9BtBxB5C,cAAA;EkBAC,AFgBA,EeHE,ADUA,CAAC,CAAC,ECVEud,AfGAjN,WeHW,AfGAA,CAAA,CeHE,CfGC;EEdpB,EYsBE,AdPA,EeHE,GbZG8E,CFeCpK,CcOCkQ,OZtBO9F,CAACnR,EYsBE,CZtBC,EAAEwO,UAAU,EAAE,EFeb,CAAChH,UAAU,CAAC,CAAC;EcQlC,AdPA,EEfE,EaYE,EbZE,CAACxH,CaYC,CAACuV,CbZC,EAAE,SaYS,CAACxW,KAAK,GAAG,EAAE;AfIlC,EcQE2K,ICXI,AbZA,OAAO,IAAI,EYuBEA,CAAC/C,IAAI,EAAE;AdRzB/H,IcSG,AZvBA,EaYE,CfEL,CcSO+H,AdTP8E,EeFS,CAAC9E,CDWC,CAACxK,ECXE,ADWA,AdTd,EeFgB,CfEhBsP,EcSmB,IAAI,CAAC9E,AdTxB,IcS4B,EAAExK,EAAE,EAAE;IZrB/B,EYsBE,ECXEwK,EDWE,CAACA,AZtBAqI,CaWC,GAAG,ADWA,CZtBC,CAAChP,CYsBC,EZtBE,CaWC+G,AbXA,CYsBC,AZrBfyC,IAAI,CAAEmF,QAAQ,IAAK,UaUQ,CAAC1H,UAAU,CAAC;IDY1C,CAAC,CZrBG,IaUEC,AbVE,CYqBD,AZrBEyH,IaUE,EAAE,EbVI,CAACQ,EAAE,EAAE,GaUC;MDYrB,EZrBI,EaUAhP,ADWA,CAACwG,GZrBK,CaUD,ADWA,ECXE9H,CDWC8H,AZrBE7D,IYqBE,CZrBG,CAAE,WaUF,CAAC7C,QAAQ,CAAC,UbVsBD,GAAI,EAAC,CAAC;IYsB3D,EZrBI,EaUA,CAAC,CAAC;IDYN,ECXE,AbVE,EYqBA,CAAC+H,IZrBM4G,EYqBA,CAAC,CAAC,IZrBM,CAACyC,IAAI,CAAC,CAAC;EYsB5B,EZrBI,CAAC,CaUD,AbVE,CACD5H,IAAI,CAAErI,IAAI,IAAK;EYsBpB0I,ICZI,AbTE2E,MaSI7H,IAAI,AbTE,CaSDF,AbTEtF,GYqBC0I,CAAClD,AZrBE,CAAC0K,GYqBC,ECZE,ADYA,CCZC,AbTE,CAAC;IYsB3B,AZrBE,CAAC,CAAC,CACDC,CaQCyF,ADYA,CAACpQ,GCZG,AbRA,CYoBC,AZpBCnJ,CaQA,EDYEmJ,EZpBG,EaQC,ADYA,EZpBI;IYqBpB,EZpBIpJ,EaQAX,ADYA,CAACmL,IZpBM,CAAC/J,CaQD,ADYA,CAAC,CCZCsb,ADYA,EZpBI,CAAC9b,KAAK,CAAC;EYqB1B,ICZI,AbRED,CaQD,CAAC,KbRO,CAACC,KAAK,CACV,2CAA0CwC,GAAI,qBACjD,CAAC;EYoBPsW,ICbI,AbNE9H,MaMIlO,IDaIgW,AZnBE,CYmBF,AZnBG,EYmBA,AZnBE,CAAC,IaME,GAAGzX,kBAAQ,CAACuB,eAAe,CAAC,CAAC;IDcjD,AZnBE,CAAC,CaMD,AbNE,EYmBA,CAACiI,GCbG5H,MDaM,CAACmM,KAAK,CAAC,CAAC,CCbC,GAAG/N,kBAAQ,CAAC0B,kBAAkB,CAAC,CAAC;EbLzD,EYmBEvD,ECbE,GDaG,CAACsa,eAAe,CAAC,CAAC;AZlB3B,EYmBE,ICbI,IAAI,CAAC+B,WAAW,CAAC,CAAC;AbNvBza,EYqBC,ICdI,CbPL,CYqBO2X,AZrBPlI,SAAA,GAAAA,IYqBuBkI,CAAA,EAAG,EZrB1B;IYsBG,ECdE,IAAI,ADcA5P,CCdC4S,GDcG,GAAG,MAAMxS,KCdK,CAAC,sBDcO,CAACO,cAAc,CAAC,CAAC;IACjD,ICf2B1K,ADevB+J,IAAI,EAAE,CCfwB,EAAE2S,WAAW;MDgB7C,EChB+CvC,IAAI,ADgB7ChQ,EChB+C,0BDgBlC,CAACM,UAAU,CAACV,IAAI,CAAC;IACtC,ECjB8D,CAAC,CAAC;EDkBlE,ICjBI;EDmBJ0P,IClBI,MAAMmD,CDkBCnD,CAAA,EAAG,WClBW,GAAG,IAAI,CAACkD,iBAAiB,CAAC;IDmBjD,IClBI3c,ADkBA,CAAC0Y,MClBM,EAAE,EAAE,CDkBC,CAACiC,SAAS,GAAG,CAAC;EAChC,MClBMR,IAAI,EAAE;EDoBZX,ICnBI,CAAC,CAAC,KDmBKA,CAAA,EAAG;IACZ,ECnBE,EDmBE,CAACd,GCnBGmE,QDmBQ,CAAClC,KCnBK,GAAG,CDmBC,GAAG,IAAI,CAACjC,WAAW,CAACkC,YAAY;EAC5D,MCnBM7Q,IAAI;ADoBZ,QCnBQ/J,OAAO,EAAE,EAAE;ADmBlBgC,OAAA,CCnBoB,ADmBpBiX,QAAA,GAAAA,QAAA;QClBO2D;MACF,CAAC;MACD,MAAME,WAAW,GAAG;QAClBC,MAAM,EAAEL,WAAW;QACnBnZ,KAAK,EAAEwG,IAAI,CAACxG,KAAK;QACjB+F,QAAQ,EAAE,CAAC,MAAMS,IAAI,CAACD,WAAW,CAAC,CAAC,EAAEZ,GAAG,CAAE7J,OAAO,KAAM;UACrD8a,IAAI,EAAE9a,OAAO,CAAC8a,IAAI;UAClBna,OAAO,EAAEX,OAAO,CAACW;QACnB,CAAC,CAAC;MACJ,CAAC;MACD;MACA,IAAI0D,YAAY,EAAE;QAChBoZ,WAAW,CAACE,MAAM,GAAGtZ,YAAY;MACnC;MACA;MACA,IAAIG,eAAe,EAAE;QACnBiZ,WAAW,CAACG,OAAO,GAAGpZ,eAAe;MACvC;MACA;MACA+Y,eAAe,CAACpQ,SAAS,GAAG,6BAA6B;MACzD;MACA,IAAI,CAACkP,SAAS,CAAC/J,IAAI,CACjBvO,GAAG,EACH0Z,WAAW,EACX,CAACxW,OAAO,EAAEyL,QAAQ,KAChB,IAAI,CAACE,cAAc,CAAC3L,OAAO,EAAEyL,QAAQ,EAAE8K,cAAc,CAAC,EACxD,CAACvW,OAAO,EAAE1F,KAAK,KAAK,IAAI,CAACsc,mBAAmB,CAAC5W,OAAO,EAAE1F,KAAK,CAAC,EAC5D,CAAC0F,OAAO,EAAEyL,QAAQ,KAChB,IAAI,CAACoL,UAAU,CAAC7W,OAAO,EAAEyL,QAAQ,EAAE8K,cAAc,CACrD,CAAC;IACH;EACF;EAEAF,iBAAiBA,CAACtd,OAAO,EAAE;IACzB,OAAO,IAAI,CAACoc,QAAQ,CAAClC,gBAAgB,CAACla,OAAO,CAAC;EAChD;EAEA4S,cAAcA,CAAC3L,OAAO,EAAEyL,QAAQ,EAAE9J,OAAO,EAAE;IACzC,MAAM2U,eAAe,GAAG3U,OAAO,CAAC2U,eAAe;IAC/C,MAAMQ,gBAAgB,GAAG,IAAI,CAACC,eAAe,CAACtL,QAAQ,CAAC;IACvD;IACA9J,OAAO,CAACjI,OAAO,IAAIod,gBAAgB;IACnCR,eAAe,CAACnb,WAAW,IAAI2b,gBAAgB;IAC/C,IAAI,CAAC3B,QAAQ,CAACjC,WAAW,CAAC,CAAC;EAC7B;EAEA0D,mBAAmBA,CAAC5W,OAAO,EAAE1F,KAAK,EAAE;IAClC;IACA,IAAIA,KAAK,CAACkI,IAAI,KAAK,YAAY,EAAE;MAC/BnI,OAAO,CAACC,KAAK,CAAE,UAASA,KAAK,CAACvB,OAAQ,EAAC,CAAC;IAC1C;IACA,IAAI,CAACoc,QAAQ,CAACjC,WAAW,CAAC,CAAC;IAC3B,IAAI,CAAC8C,UAAU,CAAC,CAAC;EACnB;EAEA,MAAMa,UAAUA,CAAC7W,OAAO,EAAEyL,QAAQ,EAAE9J,OAAO,EAAE;IAC3C,MAAM8B,IAAI,GAAG9B,OAAO,CAAC8B,IAAI;IACzBpJ,OAAO,CAAC6D,GAAG,CAAE,QAAOuF,IAAI,CAACxK,EAAG,OAAM,CAAC;IACnC,MAAMwK,IAAI,CAACF,UAAU,CAAC;MACpBsQ,IAAI,EAAE,WAAW;MACjBna,OAAO,EAAEiI,OAAO,CAACjI;IACnB,CAAC,CAAC;IACF,IAAI,CAACsc,UAAU,CAAC,CAAC;EACnB;EAEAe,eAAe,GAAIrd,OAAO,IAAK;IAC7B;IACA,OAAOA,OAAO;EAChB,CAAC;EAEDsd,UAAU,GAAGA,CAAA,KAAM;IACjB,OAAO,IAAIra,GAAG,CAAC/C,MAAM,CAACqd,QAAQ,CAACra,IAAI,CAAC,CAACsa,QAAQ,CAACrK,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;EAChE,CAAC;AACH;AAACpR,OAAA,CAAAqZ,GAAA,GAAAA,GAAA","file":"script.d573be0b.js","sourceRoot":"..","sourcesContent":["function simpleHash(str) {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\n// Show all uncaught errors as UI notifications\n/*\nwindow.onerror = function (message, source, lineno, colno, error) {\n const errorDetails = `${message} at ${source}:${lineno}:${colno}`;\n UINotification.show(errorDetails, 'error');\n return true;\n};\n*/\n\nexport class UINotification {\n constructor(message, type) {\n const id = simpleHash(JSON.stringify(message));\n this.type = type;\n this.domId = `notification-${id}`;\n this.container = document.body;\n this.template = document.getElementById('notification-template').content;\n this._bindEventListeners();\n }\n\n _bindEventListeners() {\n window.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n this.hide();\n }\n });\n }\n\n static show(message, type) {\n const notification = new UINotification(message, type);\n notification.show(message);\n }\n\n static initialize() {\n // Store the original console.error function\n const originalConsoleError = console.error;\n\n // Override console.error\n console.error = function (...args) {\n UINotification.show(args);\n // Call the original console.error with all arguments\n originalConsoleError.apply(console, args);\n };\n }\n\n static handleApplicationError(error) {\n console.debug('caught error');\n console.error(error);\n UINotification.show(error);\n }\n\n show(message) {\n // Clone the template\n const clone = this.template.cloneNode(true);\n\n // Find the root element of the notification in the clone\n const notificationElement = clone.querySelector('.notification');\n if (!notificationElement) {\n console.error('Notification root element not found in template');\n return;\n }\n\n // Set the message\n clone.querySelector('.notification-message').textContent = message;\n\n notificationElement.id = this.domId; // Set ID on the actual element, not the fragment\n // Add type, for example, error\n if (this.type) {\n notificationElement.classList.add(`notification-${this.type}`);\n }\n\n // Add close functionality\n const closeButton = clone.querySelector('.close-notification-button');\n closeButton.onclick = () => this.hide();\n\n // Don't show the same notification twice\n if (!document.getElementById(this.domId)) {\n // Append to the container and display\n this.container.appendChild(clone);\n }\n }\n\n hide() {\n document.getElementById(this.domId)?.remove();\n }\n}\n","export class Settings {\n // Static method to set a value in localStorage\n static set(key, value) {\n try {\n const stringValue = JSON.stringify(value);\n localStorage.setItem(key, stringValue);\n } catch (e) {\n console.error('Error saving to localStorage', e);\n }\n }\n\n // Static method to get a value from localStorage\n static get(key, defaultValue = null) {\n try {\n const value = localStorage.getItem(key);\n return value !== null ? JSON.parse(value) : defaultValue;\n } catch (e) {\n console.error('Error reading from localStorage', e);\n return defaultValue;\n }\n }\n\n // Static method to remove a value from localStorage\n static remove(key) {\n try {\n localStorage.removeItem(key);\n } catch (e) {\n console.error('Error removing from localStorage', e);\n }\n }\n\n static getUrl(uri) {\n try {\n const baseUrl = Settings.get('url');\n if (uri) {\n return new URL(uri, baseUrl).href;\n } else {\n return baseUrl;\n }\n } catch (error) {\n return null;\n }\n }\n\n static setUrl(url) {\n Settings.set('url', url);\n }\n\n static getModel() {\n return Settings.get('model');\n }\n\n static setModel(model) {\n Settings.set('model', model);\n }\n\n static getSystemPrompt() {\n return Settings.get('system-prompt');\n }\n\n static setSystemPrompt(systemPrompt) {\n if (systemPrompt === '') {\n systemPrompt = null;\n }\n Settings.set('system-prompt', systemPrompt);\n }\n\n static getModelParameters() {\n return Settings.get('model-parameters');\n }\n\n static setModelParameters(modelParameters) {\n if (modelParameters === '') {\n modelParameters = null;\n }\n Settings.set('model-parameters', modelParameters);\n }\n\n static getCurrentChatId() {\n return Settings.get('currentChatId');\n }\n\n static setCurrentChatId(chatId) {\n if (chatId === undefined) {\n chatId = null;\n }\n Settings.set('currentChatId', chatId);\n }\n}\n","export class Event {\n static listen(eventName, handler) {\n window.addEventListener(eventName, (event) => {\n handler(event.detail);\n });\n }\n\n static emit(eventName, data) {\n let log = `${eventName}`;\n if (data?.id) {\n log += ` id: ${data.id}`;\n }\n console.log(log);\n const event = new CustomEvent(eventName, {\n detail: data || {},\n bubbles: true, // This makes the event bubble up through the DOM\n });\n window.dispatchEvent(event);\n }\n}\n","export class DOM {\n static showElement(element) {\n element.classList.remove('hidden');\n return this;\n }\n\n static hideElement(element) {\n element.classList.add('hidden');\n return this;\n }\n\n static enableInput(element) {\n element.removeAttribute('disabled');\n return this;\n }\n\n static disableInput(element) {\n element.setAttribute('disabled', 'disabled');\n return this;\n }\n}\n","export function debounce(func, wait) {\n let timeout;\n\n return function funcWrapper(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n}\n","export class Database {\n constructor(dbName, objectStores, migrations) {\n this.dbName = dbName;\n this.objectStores = objectStores;\n this.dbConnection = null; // Initialized in open\n this.migrations = migrations;\n }\n\n async open() {\n if (this.dbConnection) {\n throw new Error('Connection already open');\n }\n\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.migrations.version);\n\n request.onerror = (event) => reject(event.target.error);\n request.onupgradeneeded = (event) => {\n const db = event.target.result;\n const transaction = event.currentTarget.transaction;\n this.migrations.upgrade(db, transaction, event.oldVersion);\n };\n request.onsuccess = (event) => {\n this.dbConnection = event.target.result;\n resolve(this.dbConnection);\n };\n });\n }\n\n async transaction(storeName, mode) {\n return this.dbConnection\n .transaction([storeName], mode)\n .objectStore(storeName);\n }\n\n async add(storeName, data) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('add', store.add(data));\n }\n\n async get(storeName, id) {\n const store = await this.transaction(storeName, 'readonly');\n return this.handleRequest('get', store.get(id));\n }\n\n async put(storeName, data) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('put', store.put(data));\n }\n\n async delete(storeName, id) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('delete', store.delete(id));\n }\n\n async getAll(storeName) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('getAll', store.getAll());\n }\n\n async clear(storeName) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('deleteAll', store.clear());\n }\n\n handleRequest(type, request) {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n\n request.onerror = (event) => {\n const error = `Database ${type} operation failed: ${event.target.error.message}`;\n reject(new Error(JSON.stringify(error)));\n };\n });\n }\n}\n","export class Migrations {\n static version = 2;\n static upgrade(database, transaction, oldVersion) {\n console.debug(\n `Migration needed. Old version ${oldVersion}. New version ${this.version}.`,\n );\n const funcName = `upgradeToVersion${this.version}`;\n const upgradeFunc = this[funcName];\n if (!upgradeFunc) {\n throw new Error(`Upgrade function missing for ${funcName}`);\n }\n if (this.version >= oldVersion) {\n upgradeFunc({ database, transaction });\n }\n }\n\n static upgradeToVersion2(context) {\n // Create chats\n context.database.createObjectStore('chats', {\n keyPath: 'id',\n autoIncrement: true,\n });\n // Create chat_messages\n const chatMessages = context.database.createObjectStore('chat_messages', {\n keyPath: 'id',\n autoIncrement: true,\n });\n chatMessages.createIndex('by_chat', 'chatId', { unique: false });\n }\n}\n","import { Database } from '../Database.js';\nimport { Migrations } from '../Migrations.js';\n\nexport class BaseModel {\n constructor(data) {\n Object.assign(this, data);\n }\n\n static async database(name, store) {\n this.dbName = name;\n this.storeName = store;\n this.db = new Database(name, [store], Migrations);\n await this.db.open();\n }\n\n static async transaction(mode) {\n return await this.db.transaction(this.storeName, mode);\n }\n\n async transaction(mode) {\n return await this.constructor.transaction(mode);\n }\n\n async create() {\n const key = await this.constructor.db.add(this.constructor.storeName, this);\n if (!this.id) {\n this.id = key;\n }\n return this;\n }\n\n async save() {\n return await this.constructor.db.put(this.constructor.storeName, this);\n }\n\n async delete() {\n return await this.constructor.db.delete(\n this.constructor.storeName,\n this.id,\n );\n }\n\n static async get(id) {\n const data = await this.db.get(this.storeName, id);\n return new this(data);\n }\n\n static async clear() {\n return await this.db.clear(this.storeName);\n }\n\n // TODO: sorting and selecting only certain attributes\n static async getAll() {\n const records = await this.db.getAll(this.storeName);\n return records.map((data) => new this(data));\n }\n\n /**\n * Retrieves all objects associated with a given ID and index.\n *\n * @param {number|string} chatId - The ID of the chat.\n * @returns {Promise} A promise that resolves to an array.\n */\n static async getAllByIndexAndId(indexName, id) {\n // Open a transaction and access the messages store\n const transaction = await this.transaction('readonly');\n\n // Use an index to find objects with the specified id\n const index = transaction.index(indexName);\n const request = index.getAll(id);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = () => {\n // Convert the result into instances\n const messages = request.result.map((data) => new this(data));\n resolve(messages);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n }\n\n // Exports the whole store\n static async export() {\n let transaction = await this.db.transaction(this.storeName, 'readonly');\n let store = await transaction.transaction.objectStore(this.storeName);\n return store.getAll();\n }\n}\n","import { BaseModel } from './BaseModel.js';\n\nexport class ChatMessage extends BaseModel {\n static async initialize() {\n await this.database('ChatApp', 'chat_messages');\n }\n\n static async getAllByChatId(chatId) {\n return this.getAllByIndexAndId('by_chat', chatId);\n }\n}\n","import { BaseModel } from './BaseModel.js';\nimport { ChatMessage } from './ChatMessage.js';\n\nexport class Chat extends BaseModel {\n async addMessage(data) {\n data.chatId = this.id;\n await new ChatMessage(data).create();\n }\n\n async getMessages() {\n const messages = await ChatMessage.getAllByChatId(this.id);\n this.messages = messages;\n return this.messages;\n }\n\n static async initialize() {\n await this.database('ChatApp', ['chats']);\n }\n\n static async clear() {\n await ChatMessage.clear();\n await super.clear();\n }\n\n static async get(id) {\n const chat = await super.get(id);\n\n /*\n if (chat) {\n // Fetch all messages for this chat\n const messages = await ChatMessage.getAllByChatId(id);\n chat.messages = messages;\n }\n */\n\n return chat;\n }\n\n static async delete(id) {\n // Delete the chat instance\n await super.delete(id);\n\n // Delete all associated messages\n const messages = await ChatMessage.getAllByChatId(id);\n for (const message of messages) {\n await message.delete();\n }\n }\n}\n","import { Event } from './Event.js';\nimport { Chat } from './models/Chat.js';\nimport { ChatMessage } from './models/ChatMessage.js';\nimport { Settings } from './models/Settings.js';\n\nexport class AppController {\n static async updateChat(chat, data) {\n Object.assign(chat, data);\n await chat.save();\n // TODO: Move to BaseModel\n Event.emit('chatUpdated', chat);\n }\n\n static async createChat(data) {\n if (!data) {\n data = {};\n }\n if (!data.title) {\n data.title = 'Untitled';\n }\n if (!data.model) {\n data.model = Settings.getModel();\n }\n const chat = await new Chat(data).create();\n Settings.setCurrentChatId(chat.id);\n Event.emit('chatCreated', chat);\n Event.emit('chatSelected', chat);\n return chat;\n }\n\n static async deleteChatMessage(messageId) {\n const message = await ChatMessage.get(messageId);\n message.delete();\n }\n\n static async deleteChat(chat) {\n await chat.delete();\n if (Settings.getCurrentChatId() === chat.id) {\n Settings.setCurrentChatId(null);\n }\n Event.emit('chatDeleted', chat);\n }\n\n static async getCurrentChat() {\n const chatId = this.getCurrentChatId();\n if (chatId) {\n return await Chat.get(chatId);\n }\n return null;\n }\n\n static getCurrentChatId() {\n return Settings.get('currentChatId');\n }\n\n static async setCurrentChat(chat) {\n Settings.setCurrentChatId(chat.id);\n Event.emit('chatSelected', chat);\n }\n\n static async setCurrentChatId(chatId) {\n const chat = await Chat.get(chatId);\n if (chat) {\n await this.setCurrentChat(chat);\n }\n }\n\n static async clearChats() {\n Settings.setCurrentChatId(null);\n await Chat.clear();\n Event.emit('chatsCleared');\n }\n}\n","import { AppController } from './AppController.js';\n\nexport class ChatListItem {\n constructor(chat, chatList, selected) {\n this.chat = chat;\n this.chatList = chatList;\n this.content = document\n .getElementById('chat-list-item-template')\n .content.cloneNode(true);\n this.element = this.content.querySelector('.chat-list-item');\n this.element.title = this.chat.title;\n this.element.data = { id: this.chat.id };\n this.element.classList.add(`chat${this.chat.id}`);\n if (selected === true) {\n this.element.classList.add('selected');\n // this.content.querySelector('.icon-selected').classList.remove('hidden')\n }\n this.setTitle();\n this.bindEventListeners();\n }\n\n render() {}\n\n bindEventListeners() {\n this.element.addEventListener('mouseover', this.onMouseover.bind(this));\n this.element.addEventListener('mouseout', this.onMouseout.bind(this));\n this.element.addEventListener('click', this.onClick.bind(this));\n this.element\n .querySelector('.list-item-delete')\n .addEventListener('click', this.deleteChat.bind(this));\n }\n\n onMouseover() {\n this.element.classList.add('hover');\n }\n\n onMouseout() {\n this.element.classList.remove('hover');\n }\n\n onClick() {\n this.chatList.selectChat(this.chat.id);\n }\n\n setTitle() {\n const chatTitle = this.content.querySelector('.chat-title');\n chatTitle.textContent = this.chat.title;\n }\n\n deleteChat() {\n AppController.deleteChat(this.chat);\n this.element.remove();\n }\n}\n","export class DragAndDrop {\n constructor(selector) {\n this.listItems = document.querySelectorAll(selector);\n this.draggedItem = null;\n this.initializeDragAndDrop();\n }\n\n initializeDragAndDrop() {\n this.listItems.forEach((item) => {\n item.addEventListener('dragstart', this.handleDragStart.bind(this, item));\n item.addEventListener('dragover', this.handleDragOver.bind(this));\n item.addEventListener('drop', this.handleDrop.bind(this, item));\n item.addEventListener('dragend', this.handleDragEnd.bind(this));\n });\n }\n\n handleDragStart(item) {\n this.draggedItem = item;\n }\n\n handleDragOver(e) {\n e.preventDefault();\n }\n\n handleDrop(item) {\n if (item !== this.draggedItem) {\n let currentHTML = item.innerHTML;\n item.innerHTML = this.draggedItem.innerHTML;\n this.draggedItem.innerHTML = currentHTML;\n console.debug('dnd drop');\n }\n }\n\n handleDragEnd() {\n this.draggedItem = null;\n }\n}\n","import { Event } from './Event.js';\nimport { ChatListItem } from './ChatListItem.js';\nimport { DragAndDrop } from './DragAndDrop.js';\nimport { Chat } from './models/Chat.js';\nimport { AppController } from './AppController.js';\n\nexport class ChatList {\n constructor() {\n this.element = document.getElementById('chat-list');\n this.template = document.getElementById('chat-list-item-template').content;\n this.bindEventListeners();\n AppController.getCurrentChat().then((chat) => {\n this.chat = chat;\n });\n }\n\n bindEventListeners() {\n Event.listen('chatCreated', this.handleChatCreated.bind(this));\n Event.listen('chatDeleted', this.handleChatDeleted.bind(this));\n Event.listen('chatsCleared', this.handleChatsCleared.bind(this));\n Event.listen('chatUpdated', this.handleChatUpdated.bind(this));\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n }\n\n async selectChat(chatId) {\n await AppController.setCurrentChatId(chatId);\n }\n\n handleChatCreated(chat) {\n this.appendChat(chat, true);\n }\n\n handleChatDeleted(chat) {\n if (this.chat?.id === chat.id) {\n this.chat = null;\n }\n this.element.querySelector(`.chat${chat.id}`)?.remove();\n }\n\n handleChatsCleared() {\n const elements = this.element.querySelectorAll('.chat-list-item');\n elements.forEach((element) => element.remove());\n }\n\n handleChatUpdated(chat) {\n const listElement = this.element.querySelector(\n `.chat${chat.id} .chat-title`,\n );\n if (listElement) {\n listElement.textContent = chat.title;\n }\n }\n\n handleChatSelected(chat) {\n if (this.chat) {\n const previousListElement = this.element.querySelector(\n `.chat${this.chat.id}`,\n );\n if (previousListElement) {\n previousListElement.classList.remove('selected');\n }\n }\n const newListElement = this.element.querySelector(`.chat${chat.id}`);\n if (newListElement) {\n newListElement.classList.add('selected');\n }\n // Remember selected chat\n this.chat = chat;\n }\n\n render() {\n const currentChatId = AppController.getCurrentChatId();\n this.element.innerHTML = '';\n Chat.getAll().then((chats) => {\n chats.forEach((chat) => {\n const selected = chat.id === currentChatId;\n this.appendChat(chat, selected);\n });\n new DragAndDrop('.chat-list-item');\n });\n }\n\n appendChat(chat, selected) {\n const chatListItem = new ChatListItem(chat, this, selected);\n this.element.appendChild(chatListItem.element);\n return chatListItem;\n }\n}\n","import { Chat } from './models/Chat.js';\nimport { ChatMessage } from './models/ChatMessage.js';\n\nexport class DownloadChatsButton {\n constructor() {\n this.button = document.querySelector('#export-button');\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n this.button.addEventListener('click', () => {\n this.exportChat();\n this.exportChatMessages();\n });\n }\n\n async exportChat() {\n const request = await Chat.export();\n\n request.onsuccess = function () {\n let data = request.result;\n\n // Convert the data to JSON format\n let jsonData = JSON.stringify(data, 2);\n\n // Export the JSON data by creating a file to download\n let blob = new Blob([jsonData], { type: 'application/json' });\n let url = URL.createObjectURL(blob);\n\n let a = document.createElement('a');\n a.href = url;\n a.download = 'chats.json';\n a.click();\n URL.revokeObjectURL(url);\n };\n\n request.onerror = function (event) {\n console.error('Error reading data: ', event.target.errorCode);\n };\n }\n\n async exportChatMessages() {\n const request = await ChatMessage.export();\n\n request.onsuccess = function () {\n let data = request.result;\n\n // Convert the data to JSON format\n let jsonData = JSON.stringify(data, 2);\n\n // Export the JSON data by creating a file to download\n let blob = new Blob([jsonData], { type: 'application/json' });\n let url = URL.createObjectURL(blob);\n\n let a = document.createElement('a');\n a.href = url;\n a.download = 'chat_messages.json';\n a.click();\n URL.revokeObjectURL(url);\n };\n\n request.onerror = function (event) {\n console.error('Error reading data: ', event.target.errorCode);\n };\n }\n}\n","export class LocalStorage {\n // Set a value in localStorage\n set(key, value) {\n try {\n const stringValue = JSON.stringify(value);\n localStorage.setItem(key, stringValue);\n } catch (e) {\n console.error('Error saving to localStorage', e);\n }\n }\n\n // Get a value from localStorage, return defaultValue if key doesn't exist\n get(key, defaultValue = null) {\n try {\n const value = localStorage.getItem(key);\n return value !== null ? JSON.parse(value) : defaultValue;\n } catch (e) {\n console.error('Error reading from localStorage', e);\n return defaultValue;\n }\n }\n\n // Remove a value from localStorage\n remove(key) {\n try {\n localStorage.removeItem(key);\n } catch (e) {\n console.error('Error removing from localStorage', e);\n }\n }\n}\n","import { debounce } from './debounce.js';\nimport { Event } from './Event.js';\nimport { Chat } from './models/Chat.js';\nimport { AppController } from './AppController.js';\nimport { ChatList } from './ChatList.js';\nimport { DownloadChatsButton } from './DownloadChatsButton.js';\nimport { LocalStorage } from './models/LocalStorage.js';\n\nexport class Sidebar {\n constructor() {\n this.settings = new LocalStorage();\n this.chatList = new ChatList();\n this.element = document.getElementById('sidebar');\n this.newChatButton = this.element.querySelector('#new-chat-button');\n this.clearButton = this.element.querySelector('#clear-button');\n this.hamburgerButton = document.getElementById('hamburger-menu');\n this.searchButton = document.getElementById('search-button');\n this.downloadChatsButton = new DownloadChatsButton();\n this.searchRow = document.getElementById('search-row');\n this.searchInput = document.getElementById('search-input');\n if (this.settings.get('sidebar-collapsed') === true) {\n this.element.classList.add('collapsed');\n }\n this.bindEventListeners();\n }\n\n render() {\n this.chatList.render();\n }\n\n bindEventListeners() {\n Event.listen('chatSelected', this.handleChatSelected);\n this.searchButton.addEventListener('click', this.toggleSearch.bind(this));\n this.searchInput.addEventListener(\n 'keypress',\n debounce(this.performSearch.bind(this), 50),\n );\n this.searchInput.addEventListener(\n 'keyup',\n debounce(this.performSearch.bind(this), 50),\n );\n this.newChatButton.addEventListener('click', this.handleNewChat.bind(this));\n this.clearButton.addEventListener('click', this.handleClear.bind(this));\n this.hamburgerButton.addEventListener('click', this.toggle.bind(this));\n }\n\n // TODO: Fix\n handleChatSelected = (chat) => {\n const listItem = this.element.querySelector(`chat${chat.id}`);\n if (listItem) {\n listItem.scrollIntoView({\n behavior: 'smooth',\n block: 'start', // \"start\" will bring the top of the element into view\n inline: 'nearest', // \"nearest\" will scroll to the nearest edge if partially visible\n });\n }\n };\n\n toggleSearch() {\n const searchRow = document.getElementById('search-row');\n searchRow.classList.toggle('hidden');\n this.searchInput.focus();\n }\n\n performSearch() {\n function escapeRegExp(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // Escapes special characters\n }\n const query = escapeRegExp(this.searchInput.value.trim()).replace(\n /\\s+/g,\n '.*',\n );\n const queryContent = query.length > 2; // Nobody wants to query content based on one character?\n const regex = new RegExp(query, 'i'); // 'i' for case-insensitive matching\n console.log(`Search ${query}`);\n Chat.getAll().then((chats) => {\n const matches = chats\n .filter((chat) => {\n let match = regex.test(chat.title);\n if (queryContent) {\n match ||= regex.test(chat.content);\n }\n return match;\n })\n .map((chat) => chat.id);\n this.element.querySelectorAll('.chat-list-item').forEach((item) => {\n if (matches.includes(item.data.id)) {\n // Now matches the type\n item.classList.remove('hidden');\n } else {\n item.classList.add('hidden');\n }\n });\n });\n }\n\n toggle() {\n this.element.classList.toggle('collapsed');\n this.hamburgerButton.classList.toggle('collapsed');\n if (this.element.classList.contains('collapsed')) {\n this.settings.set('sidebar-collapsed', true);\n } else {\n this.settings.set('sidebar-collapsed', false);\n }\n }\n\n async handleNewChat() {\n await AppController.createChat();\n }\n\n async handleClear() {\n await AppController.clearChats();\n }\n}\n","export class CopyButton {\n constructor() {\n document.addEventListener('click', function (event) {\n // Check if the clicked element has the class 'copy-button'\n if (event.target.classList.contains('copy-button')) {\n const targetSelector = event.target.getAttribute('data-target');\n const textToCopy = document.getElementById(targetSelector).innerText;\n // Create a temporary textarea element\n const textarea = document.createElement('textarea');\n textarea.value = textToCopy;\n document.body.appendChild(textarea);\n\n // Select the text and copy it\n textarea.select();\n document.execCommand('copy');\n\n // Remove the temporary textarea\n document.body.removeChild(textarea);\n\n // Optional: Display a message or change the button text/content\n alert('Text copied to clipboard');\n }\n });\n }\n}\n","export class OllamaApi {\n constructor() {\n this.abortController = null;\n }\n\n async send(url, data, onResponse, onError, onDone) {\n const request = { data };\n try {\n const response = await this.postChatMessage(url, data);\n await this.handleResponse(request, response, onResponse, onDone);\n } catch (error) {\n onError(request, error);\n }\n }\n\n async postChatMessage(url, data) {\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n const response = await fetch(url, {\n signal,\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`${url} failed with status ${response.status}`);\n }\n\n return response;\n }\n\n async handleResponse(request, response, onResponse, onDone) {\n const reader = response.body.getReader();\n let partialLine = '';\n var isRequestDone = false;\n\n while (!isRequestDone) {\n const { done, value } = await reader.read();\n if (done) {\n onDone(request, response);\n isRequestDone = true;\n continue;\n }\n\n const textChunk = new TextDecoder().decode(value);\n const lines = (partialLine + textChunk).split('\\n');\n partialLine = lines.pop();\n\n lines.forEach((line) => {\n const responseData = JSON.parse(line);\n if (line.trim()) {\n // TODO: Move this line:\n this.printResponseStats(responseData);\n onResponse(request, responseData.message.content);\n }\n });\n }\n\n if (partialLine.trim()) {\n onResponse(request, partialLine);\n }\n }\n\n abort() {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n printResponseStats(data) {\n if (!data.total_duration) {\n return;\n }\n // Convert nanoseconds to seconds for durations\n const totalDurationInSeconds = data.total_duration / 1e9;\n const loadDurationInSeconds = data.load_duration / 1e9;\n const promptEvalDurationInSeconds = data.prompt_eval_duration / 1e9;\n const responseEvalDurationInSeconds = data.eval_duration / 1e9;\n\n // Calculate tokens per second (token/s)\n const tokensPerSecond = data.eval_count / responseEvalDurationInSeconds;\n const output = `\nModel: ${data.model}\nCreated At: ${data.created_at}\nTotal Duration (s): ${totalDurationInSeconds.toFixed(2)}\nLoad Duration (s): ${loadDurationInSeconds.toFixed(2)}\nPrompt Evaluation Count: ${data.prompt_eval_count}\nPrompt Evaluation Duration (s): ${promptEvalDurationInSeconds.toFixed(2)}\nResponse Evaluation Count: ${data.eval_count}\nResponse Evaluation Duration (s): ${responseEvalDurationInSeconds.toFixed(2)}\nTokens Per Second: ${tokensPerSecond.toFixed(2)} token/s\n `;\n console.log(output);\n }\n\n static getModels(url, onResponse) {\n if (!url) {\n return null;\n }\n\n return fetch(url)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`Unable to fetch models from ${url}`);\n }\n return response.json();\n })\n .then((data) => {\n onResponse(data.models);\n })\n .catch((error) => {\n console.debug(error);\n console.error(\n `Please ensure the server is running at: ${url}. Error code: 39847`,\n );\n onResponse([]);\n });\n }\n}\n","export class DownloadButton {\n constructor() {\n document.addEventListener('click', (event) => {\n // Check if the clicked element has the class 'copy-button'\n if (event.target.classList.contains('download-button')) {\n // Get the index from the data-target attribute\n const targetId = event.target.getAttribute('data-target');\n this.downloadElementContent(targetId, 'chat.html');\n }\n });\n }\n\n downloadElementContent(elementId, filename) {\n // Get the element\n const element = document.getElementById(elementId);\n if (!element) {\n console.error('Element not found');\n return;\n }\n\n // Get the contents of the element\n const content = element.innerText;\n\n // Create a Blob with the content\n const blob = new Blob([content], { type: 'text/html' });\n\n // Create an anchor element and set the href to the blob\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = filename;\n\n // Append the anchor to the document, trigger a click, and then remove it\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n\n // Revoke the blob URL\n URL.revokeObjectURL(a.href);\n }\n}\n","export class DropDownMenu {\n constructor() {\n this.buttonSelector = '.drop-down-menu';\n this.dropDownMenus = document.querySelectorAll(this.buttonSelector);\n this.init();\n }\n\n init() {\n // Add a click listener to the whole document\n document.addEventListener('click', (event) => {\n // Check if the clicked element or any of its parents has the 'drop-down-menu' class\n const menuElement = event.target.closest(this.buttonSelector);\n if (menuElement) {\n const dropDownMenu = menuElement.querySelector('.drop-down-menu-items');\n if (dropDownMenu) {\n this.toggleMenu(dropDownMenu);\n }\n }\n });\n }\n\n toggleMenu(menu) {\n menu.classList.toggle('hidden');\n menu.classList.toggle('visible');\n }\n}\n","// Modal base class\nexport class Modal {\n constructor(domId) {\n this.domId = domId;\n this.modal = document.getElementById(this.domId);\n this.closeButton = this.modal.querySelector('.button-close');\n this.closeButton.onclick = () => this.hide();\n this._bindEventListeners();\n }\n\n _bindEventListeners() {\n window.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n this.hide();\n }\n });\n }\n\n show() {\n this.handleShow();\n }\n\n hide() {\n this.handleHide();\n }\n\n handleShow() {\n this.modal.classList.add('show');\n }\n\n handleHide() {\n this.modal.classList.remove('show');\n }\n}\n","export class List {\n constructor(containerId, items, selected) {\n this.container = document.getElementById(containerId);\n this.items = items;\n this.selected = selected;\n this.render();\n this.clickHandler = null;\n }\n\n onClick(handler) {\n this.clickHandler = handler;\n return this; // Allow chaining\n }\n\n setItems(items) {\n this.items = items;\n this.render();\n }\n\n setSelected(selected) {\n console.debug(`Select ${selected}`);\n this.selected = selected;\n this.render();\n }\n\n getSelected() {\n return this.selected;\n }\n\n render() {\n this.container.innerHTML = ''; // Clear existing content\n const ul = document.createElement('ul');\n ul.classList.add('list');\n this.items.forEach((item) => {\n const li = document.createElement('li');\n li.classList.add('list-item');\n if (item === this.selected) {\n li.classList.add('selected');\n }\n li.textContent = item;\n li.item = item;\n li.addEventListener('click', () => {\n this.setSelected(item);\n if (this.clickHandler) {\n this.clickHandler(item);\n }\n });\n ul.appendChild(li);\n });\n this.container.appendChild(ul);\n }\n}\n","import { Event } from '../Event.js';\nimport { Settings } from './Settings.js';\nimport { OllamaApi } from '../OllamaApi.js';\n\nexport class Models {\n static models = [];\n\n static getUrl() {\n return Settings.getUrl('/api/tags');\n }\n\n static load() {\n if (!this.getUrl()) {\n return null;\n }\n return OllamaApi.getModels(this.getUrl(), (models) => {\n Models.models = models;\n Settings.set('models', Models.models);\n Event.emit('modelsLoaded', Models.models);\n });\n }\n\n static getAll() {\n return Models.models;\n }\n\n static getNames() {\n return Models.models.map((model) => model.name);\n }\n\n static findModelByName(name) {\n return Models.models.find((model) => model.name === name);\n }\n}\n","import { List } from './List.js';\nimport { Event } from './Event.js';\nimport { Models } from './models/Models.js';\n\nexport class ModelsList {\n constructor(selector, selectedModel) {\n this.modelList = new List(selector, Models.getNames(), selectedModel);\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n Event.listen('modelsLoaded', this.handleModelsLoaded.bind(this));\n }\n\n handleModelsLoaded() {\n this.modelList.setItems(Models.getNames());\n }\n\n onClick(handler) {\n this.modelList.clickHandler = handler;\n return this.modelList; // Allow chaining\n }\n\n getSelected() {\n return this.modelList.selected;\n }\n}\n","import { Modal } from './Modal.js';\nimport { UINotification } from './UINotification.js';\nimport { ModelsList } from './ModelsList.js';\nimport { Models } from './models/Models.js';\nimport { Settings } from './models/Settings.js';\n\nexport class SettingsDialog extends Modal {\n constructor() {\n super('settings-dialog');\n this.showButton = document.getElementById('settings-button');\n this.urlInput = document.getElementById('input-url');\n this.modelInput = document.getElementById('input-model');\n this.systemPromptInput = this.modal.querySelector('#input-system-prompt');\n this.modelParametersInput = this.modal.querySelector(\n '#input-model-parameters',\n );\n this.refreshModelsButton = this.modal.querySelector(\n '.refresh-models-button',\n );\n this.modelList = new ModelsList('model-list', Settings.getModel());\n this.bindEventListeners();\n this.loadSettings();\n }\n\n bindEventListeners() {\n this.urlInput.addEventListener('blur', () => {\n const value = this.urlInput.value.trim();\n Settings.setUrl(value);\n });\n this.systemPromptInput.addEventListener('blur', () => {\n Settings.setSystemPrompt(this.systemPromptInput.value.trim());\n });\n this.modelParametersInput.addEventListener('blur', () => {\n const value = this.modelParametersInput.value.trim();\n if (value === '') {\n return;\n }\n try {\n const parsedValue = JSON.parse(value);\n const prettyJSON = JSON.stringify(parsedValue, 2);\n Settings.setModelParameters(parsedValue);\n this.modelParametersInput.value = prettyJSON;\n this.modelParametersInput.classList.remove('error');\n } catch (error) {\n if (error.name === 'SyntaxError') {\n this.modelParametersInput.classList.add('error');\n } else {\n console.error(error);\n }\n }\n });\n this.modelList.onClick(() => {\n Settings.setModel(this.modelList.getSelected());\n });\n this.showButton.addEventListener('click', this.show.bind(this));\n this.refreshModelsButton.onclick = () => this.refreshModels();\n this.closeButton.onclick = () => this.hide();\n }\n\n show() {\n Models.load();\n this.handleShow();\n }\n\n refreshModels() {\n if (!Models.getUrl()) {\n UINotification.show('Please update the URL in the settings to continue.');\n } else {\n Models.load();\n }\n }\n\n loadSettings() {\n this.urlInput.value = Settings.getUrl();\n const modelParameters = Settings.getModelParameters();\n if (modelParameters) {\n this.modelParametersInput.value = JSON.stringify(modelParameters, 2);\n }\n }\n}\n","import { AppController } from './AppController.js';\nimport { Event } from './Event.js';\nimport { Modal } from './Modal.js';\nimport { Models } from './models/Models.js';\nimport { ModelsList } from './ModelsList.js';\n\nexport class ChatSettingsDialog extends Modal {\n constructor() {\n super('chat-settings-dialog');\n this.showButton = document.getElementById('chat-settings-button');\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n this.showButton.addEventListener('click', this.show.bind(this));\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n }\n\n show() {\n Models.load().then(() => {\n AppController.getCurrentChat().then((chat) => {\n this.handleChatSelected(chat);\n this.handleShow();\n });\n });\n }\n\n handleChatSelected(chat) {\n this.modelList = new ModelsList('chat-model-list', chat.model);\n this.modelList.onClick(async (model) => {\n chat.model = model;\n await chat.save();\n });\n }\n}\n","export class Hoverable {\n constructor(element) {\n this.element = element;\n element.hoverable = this;\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n this.element.addEventListener('mouseover', () => this.onMouseover());\n this.element.addEventListener('mouseout', () => this.onMouseout());\n }\n\n onMouseover() {\n this.element.classList.add('hover');\n }\n\n onMouseout() {\n this.element.classList.remove('hover');\n }\n}\n","import { Event } from './Event.js';\nimport { AppController } from './AppController.js';\n\nexport class ChatTitle {\n constructor() {\n this.defaultTitle = 'Untitled';\n this.element = document.getElementById('chat-title');\n this.bindEventListeners();\n this.render();\n }\n\n render() {\n AppController.getCurrentChat().then((chat) => {\n this.chat = chat;\n this.setTitle(chat?.title);\n });\n }\n\n setTitle(title) {\n this.element.textContent = title || this.defaultTitle;\n }\n\n focus() {\n const hasFocus = document.activeElement === this.element;\n if (!hasFocus) {\n this.element.focus();\n }\n }\n\n bindEventListeners() {\n Event.listen('chatDeleted', this.handleChatDeleted.bind(this));\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n this.element.addEventListener('blur', this.handleSave.bind(this));\n this.element.addEventListener('keypress', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.element.blur();\n }\n });\n }\n\n handleChatSelected(chat) {\n this.chat = chat;\n this.setTitle(chat.title);\n }\n\n handleChatDeleted(chat) {\n if (chat.id === this.chat.id) {\n this.setTitle(this.defaultTitle);\n }\n }\n\n async handleSave() {\n let title = this.element.textContent.trim();\n if (title.length === 0) {\n title = this.defaultTitle;\n this.element.classList.add('error');\n } else {\n this.element.classList.remove('error');\n }\n const chat = await AppController.getCurrentChat();\n if (chat) {\n await AppController.updateChat(chat, { title });\n } else {\n await AppController.createChat({ title });\n }\n }\n}\n","// TODO: Move code here from App.js\nexport class ChatForm {\n constructor() {\n this.chatHistory = document.getElementById('chat-history');\n this.messageInput = document.getElementById('message-input');\n this.sendButton = document.getElementById('send-button');\n this.abortButton = document.getElementById('abort-button');\n }\n}\n","import { AppController } from './AppController.js';\nimport { Event } from './Event.js';\nimport { Hoverable } from './Hoverable.js';\nimport { ChatTitle } from './ChatTitle.js';\nimport { ChatForm } from './ChatForm.js';\n\nexport class ChatArea {\n constructor() {\n this.chatTitle = new ChatTitle();\n this.chatForm = new ChatForm();\n this.chatHistory = document.getElementById('chat-history');\n this.messageInput = document.getElementById('message-input');\n this.editChatButton = document.getElementById('edit-chat-button');\n this.scrollToTopButton = document.getElementById('scroll-to-top-button');\n this.scrollToEndButton = document.getElementById('scroll-to-end-button');\n this.deleteChatButton = document.getElementById('delete-chat-button');\n AppController.getCurrentChat().then((chat) => {\n this.chat = chat;\n this.render();\n });\n this.bindEventListeners();\n }\n\n render() {\n // Clear history view\n this.chatHistory.innerText = '';\n // Render chat history\n this.chat?.getMessages()?.then((messages) => {\n messages.forEach((message) => {\n this.createMessageDiv(message);\n });\n });\n this.scrollToEnd();\n this.messageInput.focus();\n }\n\n bindEventListeners() {\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n Event.listen('chatDeleted', this.handleChatDeleted.bind(this));\n this.scrollToTopButton.addEventListener(\n 'click',\n this.scrollToTop.bind(this),\n );\n this.scrollToEndButton.addEventListener(\n 'click',\n this.scrollToEnd.bind(this),\n );\n this.editChatButton.addEventListener(\n 'click',\n this.handleEditChat.bind(this),\n );\n this.deleteChatButton.addEventListener(\n 'click',\n this.handleDeleteChat.bind(this),\n );\n this.currentMessage = this.chatHistory.querySelector('.selected');\n // Select chat message with arrow up and arrow down keys\n document.addEventListener('keydown', (event) => {\n let next, previous;\n\n if (event.key === 'ArrowDown') {\n next = this.currentMessage\n ? this.currentMessage.nextElementSibling\n : this.chatHistory.firstElementChild;\n if (next) {\n if (this.currentMessage)\n this.currentMessage.classList.remove('hover');\n next.classList.add('hover');\n this.currentMessage = next; // Update currentMessage\n this.currentMessage.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n }); // Scroll into view\n }\n } else if (event.key === 'ArrowUp') {\n previous = this.currentMessage\n ? this.currentMessage.previousElementSibling\n : this.chatHistory.lastElementChild;\n if (previous) {\n if (this.currentMessage)\n this.currentMessage.classList.remove('hover');\n previous.classList.add('hover');\n }\n this.currentMessage = previous; // Update currentMessage\n this.currentMessage.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n }); // Scroll into view\n }\n });\n }\n\n createMessageDiv(message) {\n const role = message.role;\n const content = message.content;\n // Get the template and its content\n const template = document.getElementById('chat-message-template');\n const messageClone = template.content.cloneNode(true);\n // Find the div and span elements within the cloned template\n const messageDiv = messageClone.querySelector('.chat-message');\n const textSpan = messageClone.querySelector('.chat-message-text');\n const deleteButton = messageClone.querySelector(\n '.delete-chat-message-button',\n );\n\n // Set the class for role and text content\n messageDiv.classList.add(`${role}-chat-message`);\n textSpan.textContent = content;\n messageDiv.spellcheck = false;\n\n // Append to chatHistory and adjust scroll\n this.chatHistory.appendChild(messageDiv);\n messageDiv.dataset['id'] = message.id;\n new Hoverable(messageDiv);\n deleteButton.addEventListener('click', async () => {\n await AppController.deleteChatMessage(message.id);\n messageDiv.remove();\n });\n return messageDiv;\n }\n\n handleChatDeleted(chat) {\n if (chat.id === this.chat?.id) {\n this.chat = null;\n } else {\n this.chat = chat;\n }\n this.render();\n }\n\n handleChatSelected(chat) {\n this.chat = chat;\n this.render();\n }\n\n handleEditChat() {\n this.chatTitle.focus();\n event.stopPropagation();\n }\n\n async handleDeleteChat() {\n const chat = await AppController.getCurrentChat();\n if (chat) {\n await AppController.deleteChat(chat);\n }\n }\n\n scrollToTop() {\n this.chatHistory.scrollTop = 0;\n }\n\n scrollToEnd() {\n this.chatHistory.scrollTop = this.chatHistory.scrollHeight;\n }\n}\n","import { UINotification } from './UINotification.js';\nimport { Settings } from './models/Settings.js';\nimport { Event } from './Event.js';\nimport { DOM } from './Dom.js';\nimport { Sidebar } from './Sidebar.js';\nimport { AppController } from './AppController.js';\nimport { CopyButton } from './CopyButton.js';\nimport { OllamaApi } from './OllamaApi.js';\nimport { DownloadButton } from './DownloadButton.js';\nimport { DropDownMenu } from './DropDownMenu.js';\nimport { SettingsDialog } from './SettingsDialog.js';\nimport { ChatSettingsDialog } from './ChatSettingsDialog.js';\n// import { MarkdownFormatter } from './MarkdownFormatter.js'\nimport { ChatArea } from './ChatArea.js';\n\n// TODO: Review and refactor\nexport class App {\n static run() {\n UINotification.initialize();\n const app = new App();\n return app;\n }\n\n constructor() {\n this.sidebar = new Sidebar();\n this.chatArea = new ChatArea();\n this.ollamaApi = new OllamaApi();\n this.settingsDialog = new SettingsDialog();\n this.chatSettingsDialog = new ChatSettingsDialog();\n this.downloadButton = new DownloadButton();\n this.copyButton = new CopyButton();\n this.dropDownMenu = new DropDownMenu();\n this.initializeElements();\n this.bindEventListeners();\n this.logInitialization();\n this.render();\n }\n\n initializeElements() {\n // this.sendButton = document.getElementById('send-button');\n this.abortButton = document.getElementById('abort-button');\n this.messageInput = document.getElementById('message-input');\n this.chatHistory = document.getElementById('chat-history');\n }\n\n logInitialization() {\n const msg = `~~~~\\nChat\\n~~~~\nModel: ${Settings.getModel()}\nURL: ${Settings.getUrl()}\nChat: ${Settings.getCurrentChatId()}\nParameters: ${JSON.stringify(Settings.getModelParameters())}\n`;\n console.log(msg);\n }\n\n render() {\n this.sidebar.render();\n this.chatArea.render();\n }\n\n bindEventListeners() {\n Event.listen('chatSelected', this.handleChatSelected);\n // this.sendButton.addEventListener('click', this.sendMessage.bind(this));\n this.abortButton.addEventListener('click', this.handleAbort.bind(this));\n this.messageInput.addEventListener(\n 'keypress',\n this.handleKeyPress.bind(this),\n );\n }\n\n handleChatSelected = (chat) => {\n window.history.pushState({}, '', `/chats/${chat.id}`);\n };\n\n handleAbort = () => {\n this.ollamaApi.abort();\n this.enableForm();\n console.log('Request aborted');\n };\n\n handleKeyPress = (event) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n this.sendMessage();\n }\n };\n\n enableForm() {\n DOM.hideElement(this.abortButton).enableInput(this.messageInput);\n this.messageInput.focus();\n }\n\n disableForm() {\n DOM.showElement(this.abortButton).disableInput(this.messageInput);\n }\n\n // https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion\n async sendMessage() {\n const userMessage = this.messageInput.value.trim();\n // Get the current chat\n let chat = await AppController.getCurrentChat();\n const url = Settings.getUrl('/api/chat');\n if (!url) {\n UINotification.show(\n 'Please update the URL in the settings to continue. ',\n );\n return null;\n }\n if (userMessage) {\n // Reset input\n this.messageInput.value = '';\n // Create new chat\n if (!chat) {\n chat = await AppController.createChat({\n title: 'Untitled',\n model: Settings.getModel(),\n });\n }\n // Store user message\n await chat.addMessage({\n role: 'user',\n content: userMessage,\n });\n const systemPrompt = Settings.getSystemPrompt();\n const modelParameters = Settings.getModelParameters();\n // Disable form\n this.disableForm();\n // Create user message\n this.createChatMessage({ content: userMessage, role: 'user' });\n // Create system message container\n const responseElement = this.createChatMessage({\n content: '',\n role: 'system',\n });\n const requestContext = {\n chat,\n content: '', // TODO: Move this to the response?\n responseElement,\n };\n const requestData = {\n prompt: userMessage,\n model: chat.model,\n messages: (await chat.getMessages()).map((message) => ({\n role: message.role,\n content: message.content,\n })),\n };\n // Add system prompt\n if (systemPrompt) {\n requestData.system = systemPrompt;\n }\n // Add model parameters\n if (modelParameters) {\n requestData.options = modelParameters;\n }\n // Show spinner\n responseElement.innerHTML = '
';\n // Make request\n this.ollamaApi.send(\n url,\n requestData,\n (request, response) =>\n this.handleResponse(request, response, requestContext),\n (request, error) => this.handleResponseError(request, error),\n (request, response) =>\n this.handleDone(request, response, requestContext),\n );\n }\n }\n\n createChatMessage(message) {\n return this.chatArea.createMessageDiv(message);\n }\n\n handleResponse(request, response, context) {\n const responseElement = context.responseElement;\n const sanitizedContent = this.sanitizeContent(response);\n // Remember original response\n context.content += sanitizedContent;\n responseElement.textContent += sanitizedContent;\n this.chatArea.scrollToEnd();\n }\n\n handleResponseError(request, error) {\n // Ignore \"Abort\" button\n if (error.name !== 'AbortError') {\n console.error(`Error: ${error.message}`);\n }\n this.chatArea.scrollToEnd();\n this.enableForm();\n }\n\n async handleDone(request, response, context) {\n const chat = context.chat;\n console.log(`Chat ${chat.id} done`);\n await chat.addMessage({\n role: 'assistant',\n content: context.content,\n });\n this.enableForm();\n }\n\n sanitizeContent = (content) => {\n // TODO: Sanitization logic here\n return content;\n };\n\n getIdParam = () => {\n return new URL(window.location.href).pathname.split('/').pop();\n };\n}\n","import { App } from './App.js';\nimport { Chat } from './models/Chat.js';\nimport { ChatMessage } from './models/ChatMessage.js';\n\n// TODO: refactor\nasync function initialize() {\n await Chat.initialize();\n await ChatMessage.initialize();\n}\n\ninitialize().then(() => {\n App.run();\n});\n"]} \ No newline at end of file +{"version":3,"sources":["js/UINotification.js","js/models/Settings.js","js/Event.js","js/Dom.js","js/debounce.js","js/Database.js","js/Migrations.js","js/models/BaseModel.js","js/models/ChatMessage.js","js/models/Chat.js","js/AppController.js","js/ChatListItem.js","js/DragAndDrop.js","js/ChatList.js","js/DownloadChatsButton.js","js/models/LocalStorage.js","js/Sidebar.js","js/CopyButton.js","js/OllamaApi.js","js/DownloadButton.js","js/DropDownMenu.js","js/Modal.js","js/List.js","js/models/Models.js","js/ModelsList.js","js/SettingsDialog.js","js/ChatSettingsDialog.js","js/Hoverable.js","js/ChatTitle.js","js/ChatForm.js","js/ChatArea.js","js/App.js","js/script.js"],"names":["simpleHash","str","hash","i","length","char","charCodeAt","UINotification","constructor","message","type","id","JSON","stringify","domId","container","document","body","template","getElementById","content","_bindEventListeners","window","addEventListener","event","key","hide","show","notification","initialize","originalConsoleError","console","error","_len","arguments","args","Array","_key","apply","handleApplicationError","debug","clone","cloneNode","notificationElement","querySelector","textContent","classList","add","closeButton","onclick","appendChild","remove","exports","Settings","set","value","stringValue","localStorage","setItem","e","get","defaultValue","undefined","getItem","parse","removeItem","getUrl","uri","baseUrl","URL","href","setUrl","url","getModel","setModel","model","getSystemPrompt","setSystemPrompt","systemPrompt","getModelParameters","setModelParameters","modelParameters","getCurrentChatId","setCurrentChatId","chatId","Event","listen","eventName","handler","detail","emit","data","log","CustomEvent","bubbles","dispatchEvent","DOM","showElement","element","hideElement","enableInput","removeAttribute","disableInput","setAttribute","debounce","func","wait","timeout","funcWrapper","later","clearTimeout","setTimeout","Database","dbName","objectStores","migrations","dbConnection","open","Error","Promise","resolve","reject","request","indexedDB","version","onerror","target","onupgradeneeded","db","result","transaction","currentTarget","upgrade","oldVersion","onsuccess","storeName","mode","objectStore","store","handleRequest","put","delete","getAll","clear","Migrations","database","funcName","upgradeFunc","upgradeToVersion2","context","createObjectStore","keyPath","autoIncrement","chatMessages","createIndex","unique","_Database","require","_Migrations","BaseModel","Object","assign","name","create","save","records","map","getAllByIndexAndId","indexName","index","messages","export","_BaseModel","ChatMessage","getAllByChatId","_ChatMessage","Chat","addMessage","getMessages","chat","_Event","_Chat","_Settings","AppController","updateChat","createChat","title","deleteChatMessage","messageId","deleteChat","getCurrentChat","setCurrentChat","clearChats","_AppController","ChatListItem","chatList","selected","setTitle","bindEventListeners","render","onMouseover","bind","onMouseout","onClick","selectChat","chatTitle","DragAndDrop","selector","listItems","querySelectorAll","draggedItem","initializeDragAndDrop","forEach","item","handleDragStart","handleDragOver","handleDrop","handleDragEnd","preventDefault","currentHTML","innerHTML","_ChatListItem","_DragAndDrop","ChatList","then","handleChatCreated","handleChatDeleted","handleChatsCleared","handleChatUpdated","handleChatSelected","appendChat","elements","listElement","previousListElement","newListElement","currentChatId","chats","chatListItem","DownloadChatsButton","button","exportChat","exportChatMessages","jsonData","blob","Blob","createObjectURL","a","createElement","download","click","revokeObjectURL","errorCode","LocalStorage","_debounce","_ChatList","_DownloadChatsButton","_LocalStorage","Sidebar","settings","newChatButton","clearButton","hamburgerButton","searchButton","downloadChatsButton","searchRow","searchInput","toggleSearch","performSearch","handleNewChat","handleClear","toggle","listItem","scrollIntoView","behavior","block","inline","focus","escapeRegExp","string","replace","query","trim","queryContent","regex","RegExp","matches","filter","match","test","includes","contains","CopyButton","targetSelector","getAttribute","textToCopy","innerText","textarea","select","execCommand","removeChild","alert","OllamaApi","abortController","send","onResponse","onError","onDone","response","postChatMessage","handleResponse","AbortController","signal","fetch","method","headers","ok","status","reader","getReader","partialLine","isRequestDone","done","read","textChunk","TextDecoder","decode","lines","split","pop","line","responseData","printResponseStats","abort","total_duration","totalDurationInSeconds","loadDurationInSeconds","load_duration","promptEvalDurationInSeconds","prompt_eval_duration","responseEvalDurationInSeconds","eval_duration","tokensPerSecond","eval_count","output","created_at","toFixed","prompt_eval_count","getModels","json","models","catch","DownloadButton","targetId","downloadElementContent","elementId","filename","DropDownMenu","buttonSelector","dropDownMenus","init","menuElement","closest","dropDownMenu","toggleMenu","menu","Modal","modal","handleShow","handleHide","List","containerId","items","clickHandler","setItems","setSelected","getSelected","ul","li","_OllamaApi","Models","load","getNames","findModelByName","find","_List","_Models","ModelsList","selectedModel","modelList","handleModelsLoaded","_Modal","_UINotification","_ModelsList","SettingsDialog","showButton","urlInput","modelInput","systemPromptInput","modelParametersInput","refreshModelsButton","loadSettings","parsedValue","prettyJSON","refreshModels","ChatSettingsDialog","Hoverable","hoverable","ChatTitle","defaultTitle","hasFocus","activeElement","handleSave","blur","ChatForm","chatHistory","messageInput","sendButton","abortButton","_Hoverable","_ChatTitle","_ChatForm","ChatArea","chatForm","editChatButton","scrollToTopButton","scrollToEndButton","deleteChatButton","createMessageDiv","scrollToEnd","scrollToTop","handleEditChat","handleDeleteChat","currentMessage","next","previous","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","role","messageClone","messageDiv","textSpan","deleteButton","copyButton","goodButton","badButton","flagButton","spellcheck","dataset","quality","stopPropagation","scrollTop","scrollHeight","_Dom","_Sidebar","_CopyButton","_DownloadButton","_DropDownMenu","_SettingsDialog","_ChatSettingsDialog","_ChatArea","App","run","app","sidebar","chatArea","ollamaApi","settingsDialog","chatSettingsDialog","downloadButton","initializeElements","logInitialization","msg","handleAbort","handleKeyPress","history","pushState","enableForm","shiftKey","sendMessage","disableForm","userMessage","createChatMessage","responseElement","requestContext","requestData","prompt","system","options","handleResponseError","handleDone","sanitizedContent","sanitizeContent","getIdParam","location","pathname","_App"],"mappings":";;AgCAA,IAAAif,IAAA,GAAApV,OAAA;AACA,IAAAwB,KAAA,GAAAxB,OAAA;AACA,IAAAkB,YAAA,GAAAlB,OAAA;AAEA;ADJA,ArBAA,AoBAA,ADAA,AhBAA,AFAA,AeAA,AEAA,AXAO,AZAA,AFAA,AgBAA,ALAP,AFAO,AQAA,AlBAA,AyBAA,ALAA,AhBAA,AeAP,AGAA,ANAO,AOAP,ATAA,AhBAA,AIAO,AGAP,AEAA,ADAA,AOAO,AQAP,AtBAO,A+BKP,IDLA0O,ArBAAnN,AoBAAa,AjBAAb,AFAAa,AeAAA,AEAAb,AdAAC,AUAA2M,ACAAM,ATAAzI,ATAAjG,AEAAgB,ADAAA,AeAAQ,ENAa+G,AZAAnL,AFAAhB,AgBAA+P,APAAjJ,AQAAsJ,AlBAA/Q,AyBAAgU,ALAApC,AhBAAjO,AYAA6J,AHAAjD,AdAAvM,GEAG,AWAhB,AUAA,AxBASrD,AIAOwG,CMAhB,AGAA,AeAA,AzBAiB,AmBAA,AGAjB,AFAA,CrBAkB,AoBAA,CRAlBqD,AZAmB,AsBAnBA,CdAAA,AGAAA,AeAAA,AHAAA,ATAA,ATAA,AgBAAA,ClBAqB,AIArB,ADAA,APAqB,CIAC,AsBAA,ATAA,AjBAA,A+BKPhI,CfLQ,AUAA,ArBAA,AYAA,AFAvBgI,ATAAA,CUAwB,ALAA,ANAA,AFAArD,AKAxBqD,ADAAA,CsBAA,AnBAA,AeAA,AdAyB,AQAA,AhBAApD,AWAA,CgBAzB,AjBAA,AMA0B,AIA1B,AxBAmBzG,AeAO,CLA1B,AGAA,AeAA,ATA2B,AMA3B,AzBAoBC,AuBApB,COAA4J,AnBAAA,AeAAA,APA4B,CYA5BA,A3BA6B,CYA7B,AhBAuB,AOAvB,CHA+BnD,AKA/B,ADAA,CRAyB,AgCKA7E,CAAA,EFLzB,AnBAA,AeAA,AtBAmC,A4BKP,CDL5B,C3BAqC;A2BCrC,ArBAA,AoBAA,ADAO,AhBAP,AFCO,AeDP,AEAA,AdAA,AOAO,AGAP,ACAA,ATAA,ATAA,AEAA,ADCO,AeDP,ENAErB,AZAAA,AFAA,AgBAAA,APAAA,AQAAA,AlBAA,AyBAAA,ALAAA,AhBAA,AYAAA,AlBAA,AIAA,AWAA,AdAA,A+BKA,EDLF8K,ArBAAD,AoBAAD,AjBAAyC,AaAAzC,AEAAa,AdAAlB,AUAAK,ACAAmN,ATAAnN,ATAAtB,AEAAiB,AcAAO,EMAauO,AlBCA3N,AUDA2K,ArBAP3W,AIAAyG,AICOkE,EwBILG,CtBLR,APAS/E,ADAAX,AIAAsC,CwBAT,AJAA,AFAA,ARAA,AhBAU,CqBAQ,CXAlBiC,AWAmB,CUAnB,ADAAA,AJAAA,ATAarJ,AZAAA,AcAAA,APAAA,AQAAA,AOAAA,ALAAA,AEAbqJ,ANAarJ,AFAbqJ,AhBAa,AIAA,AmBAb,CMAqB,AZAR,AZAC5C,AcAD,APAC8F,AQAD,AOAC7G,ALAAgR,AJAD,AlBAC,C6BAQ,A3BAP5R,AKAf,CwBAAuE,AdAgB,AEAA,ALAhB,AMAgB,AlBAAtE,AIAA,AYAA,ATAhB,AcAAsE,CVAA,ALCwB,CGAC,AiBDzB,ArBAAA,AyBKY,CtBLZ,ACC0B,AGD1BA,ARAmB,AmBAnB,AhBAAA,AuBKahI,CFLb,AjBAAgI,AaAA,ArBAoB,AFAA5D,AGAA,AkBApB,ARAA,CYAA4D,AzBAqB3D,AwBAA,CtBACgB,AOAA,AaAtB2C,CMAA,AJAuB,AJAvB,CXAwB,CVAC,AoBAA,AfAzB,COAA,ALAA,ADCiCE,CKDjC,AXA2BvE,AoBAA2R,CMA3B,AzBA4B,CsBA5B,AOKuB,C7BLO,A6BKN,CAAC,CVLO,EjBAE,AHAA,AoBAA/K,EjBAEjF,AHAA,MoBAM,EAAE,EjBAE,AGCJ,CAAC,CHDK;A0BChD,ArBAA,AoBAA,AjBAA,AaAA,AECO,AdAA,AUDP,ACAA,ATAA,ATCO,AEAA,AcDP,EMAE3G,AlBCAA,ALDA,AeAAA,ArBAA,AICA,AIAA,AODA8C,AdAA,A+BKA,EDLF8H,ArBAAL,AoBAAmP,AjBAApM,AaAAwK,ATAItX,AZAA,AFAAkF,AgBAAlF,APAA,AQAA,AlBAAM,AyBAA,ALAA,AEAJ2W,ANAI,AOAJO,ATAAnN,AOAAqM,CRAKpU,CaCQiW,AdAAzK,APAA/E,AEAAiB,AMDPvJ,CfAC,CKAC,AOAA,AQAA,AOAA,ALAA,AJAA,AcKAoJ,C3BLC5D,AOAA+F,AQAAqJ,AOAAnQ,ALAAnF,AhBAAqH,AYAA0K,AFAT,AZCS,AWDA,AdAAxP,C8BAT,ALAA,AxBAU,AOCO,CNDN,ADAA/B,AsBAX,AxBAWpB,AeAAoD,CEAC,AdAAT,AgBAA,AHAZ+G,AhBAY,ACAAvG,C8BAZuG,AFAarJ,AlBCAA,AeDbqJ,ATAatI,AEAAA,AEAAf,ApBAAiB,C6BAb,ADAa,AlBCC0J,AUDArK,AGAd+I,ADAA,CKCsB,AvBDP,AoBAf,AzBAe,AOCO,ACAPhI,CEDf,AmBAgB,AhBAhB,AeCuB,ADDP,ArBAAuG,ANAA,AOCO,AQDP,AdAA,C6BAhByB,AxBAiBZ,AiBAjBY,CZCkB,ANDA5C,AOAA,AUAA,AGAlB4C,AzBAkB1J,AICAyG,AWDA,AdAArD,CSAlBsG,AGAAA,AcAmB3D,ANAA,ALAnB,AhBAmB,ASCO6D,CsBD1B,ApBCoBoC,AeDpB,CvBAqB,ASAAnL,AUAAA,ADAA,AGArB,CrBAsBmC,AHAAlD,CoBAC,AnBAA,C6BAvB,AzBAwB,AaAA,AKAxB,CTCgC,ARDP,AmBAzB,AzBAyB,AQCA4B,APDA,CSAzB,AGAA,ACCiC,AMDP,AOAA,A3BAAzB,AQCD,CNDE,AIAA8H,AYAA,CPCC,ARDA,ADAA3C,AMCA,CSDC,AdAA,AgBAA,APAA,AUAA,AlBCAqB,COACwF,AMDA,AEAA,APAAa,AUAA9L,AlBCD,CcDE,ClBAC,AICO,A4BIpB,CAACU,ChCLc1B,CAAC,EiBAE,AdAA,AgBAA,AjBAA,AFAA,CWCC,ARDA,AGAA,CWAEqB,AEAAA,AjBAAA,AFAD,ASCJ,CEAK,ALDA6G,AGCJ,GWDO,AYKb,CfLe,AEAA,AjBAA,AoBAD,AUKb,CVLc6O,AUKb,CpBLc,CAACnK,CKAG,AEAA,AjBAA,EIAA,EAAE,GMAG,CAAC,AUAA,CAAC;ASCzD,ArBAA,AoBAA,AjBAA,AaAA,AFCO,ACDP,ATAA,AOCO,ASIP,EJJEvM,AdAAA,AIDA,AXCAA,AEAA,EsBDF8b,ArBAAhR,AoBAA6O,ADAI,AhBAJ9O,AFCI,AeDJ4M,ArBAI,AFAA,ASAA,AQAA,AOAA/R,ALAA,AhBAAnE,AeAA,AIAJkW,ATAAhM,AhBAI,AIAmC,AICnC,AODA,AdAA,EgBAE,AEAA,AjBAAzG,AsBCO0S,ADAAP,EQDb,AFAQ,AlBCA,ANDA,AOAA,AQAA,AEAA,ADAA,AZCA1M,AMDA,AdAA,C4BAC6O,AhBAT,AFCS3O,ANDAjE,AOAAgG,AQAAoJ,AEAAa,ADAArW,CrBACT,AQCA,CuBDVwJ,ALAA,AvBAW,AwBAA,ArBAA,AmBAX,CZAAA,AcAYyP,ArBAA9W,AiBCO,CbDnB,ACCa,AiBAAhC,AdAAA,AZDA,AEA0ByB,AGC1BzB,AgBAO,CODpB,AJAAqJ,AECa,AdAA,AZDCrI,AoBAA,ADAA,AIAdqI,AzBAc,AOCAlE,ACAA,CLDC,AKCAsD,CEDfY,ACCgBsB,AiBAA,AdAA,AUAO,CMDvBtB,ARAiBsN,AhBAA,AeAArW,AGCO,AxBDPb,AIAsB,C2BAvC,AzBCO,AUDP,ATCkB,AEAAgL,CIDlB,AXAmB,AOCAtF,CoBDC,AlBCA,ACDA,AVAAF,AFAA,AIAmBvD,AGCnB,CmBDpB,ArBAqB,AsBAA,AFArB,ATAA2H,AhBAqBvJ,CoBAC,AEAA,ADAA,CXAtB,AmBAuBU,AjBAA,AHCA,ADAA,CsBDvB,AzBAwBkG,AsBAA,AnBCA,CYDClG,AXCA,CPDC,CUAC,AVAA,CyBAC,AXA5B,CZAuC,CAAAZ,CyBAR,A7BAA,C6BACe,A7BAAhB,CoBAC,ApBAA,AQCA,CYDC8M,ApBAA,CQCC,CHDC,ADAG,EAAN9K,IAAI,IyBAS,CAAC,EzBAVC,CgBAa,AZCA,CYDC,AdCZiG,AEAY,GJDd,CgBAkB,AhBAlBpG,CgBAmBoU,GhBAnB,EyBAwB,AvBCX,CuBDY,AzBAzBhU,IAAA,IgBAiC,CAAC,ChBAlCA,IAAA,EEC6B,CFD7BJ,GECiC,CAAC2F,AFDlC,EAAAvF,IAAA,CEC0C,GAC3E,CAAC;AyBDL,ArBCO,AoBDP,AjBAA,AaAA,ADAA,ATAA,AgBMAR,E7BNE,AqBCArB,ANAA,AVAA,AeAA,EQDF+b,ADAAnC,ADAI,AhBAJnO,AFCI,AeDJuM,AECI,AvBDA,ASCA,AFDA,AQAA,AlBAA,AyBAA,ALAA,AhBEA,AeFA,AIAJlN,ATAAwE,AhBAI5P,AOCA8J,AEAArE,CPDC,CQCQ4F,AODP,AEAA,AjBAA,AED2BpJ,AWC3B,AdAA,E4BAE,AlBCA,AiBAA,AvBDA,ASCA,AFDA,AQAA,AOAA,ALAA,ADAA,AHCA4Q,AlBDA,ASCA,CoBDCgH,AlBCA5N,AiBAAqN,AvBDApS,ASCA2H,AFDA5B,AQAAoJ,AOAAjK,ALAAF,ADAA0K,AZCA1R,AcAAyQ,CNDCrU,AEAAA,AbEA0H,AFH2B,AGE3B,AyBKA,ChCNC,AID0B7G,AGE1B4H,AyBKA,CDNX,AbCY8I,AlBDA7S,AeAAsD,AdAAA,A+BMA,CFNZ,AVAa,AICAhD,ANAAgE,AODb,ATAA,AgBMawJ,CZNC,ACAA,AGCAjB,CODdlD,ALAA,ATAe,AEAA,ALCA,AMDA,AhBDsB,AKEtB,AcAA,CODfA,AbAgB/B,AEAAA,ADCA,AODhB+B,ATAAA,AhBAgB,CWCC,AWDA,ADAA7I,AdCA,AyBKA,CnBNjB,AaAA6I,AZCkB7I,ARCA,AYDA2E,AXAA,AEAA,AcAA,ASKA,CtBLQ,ANFWzD,CMEV,ACAPiK,AWDAC,AtBAA,AuBCA,CMDC,AhBArBvC,AeCqB,AvBDA,ACEC,ANFD,C+BArB,AdAsB,AEAA,AKCA,ANAA,AXAA,AEAA,CqBDtB,AbAuB/G,AEAAA,AMAvB,ATAA,APCuBnC,AMDA,AdAA,C4BACK,ADCA,AvBDA,AmBCAmX,ANAAnF,AXAArN,AyBKA,CNNxB,ALAyB,ArBAAzF,ASCA,CKAC,AODAiB,ANAAP,AdAAA,CaCCgC,AaDA,CdA3B,AFC4B,ANDA,AsBAA,ALAA,AlBDS,AGET,CFDC,AsBAA,A3BAA,AIDQP,AGER,CFDC,AOAA,AGAA,AdAA,CWAC,AGAAxB,AdAAA,C4BAC,AZAA,AEAA,APAA,AZAAR,C6BACc,AZAA+Q,AEAAA,AfDI,CwBEH,AVAA,EAAEe,AlBDA,CwBCC,EAAE,CVAC,ARCA,AeFA,ANAA,AdAA,CgBAC,AEAA,ALCA,AODA,ANAA1P,AdAAA,CgBAC,AEAA,CDCC,CZCC,CAACqE,AeFA,AHCAsL,CGDCpS,ANAA,AdAA,C4BAC,AdAA,AdAA,C4BAC,GRAG,AHCA,CZCE,AeFD,CHCC,CZCC,CWFC,CAAC,CHCC,CGDC,AHCA,CKDC,CAAC,EAAE,CUAC,CAAC;AEChE,ADCO,AjBAA,AaAA,ADAA,ATDP,ENCE,APAA,ASDA,AQAA,AlBAA,AyBAA,ApBCA,ACCA,AeAA,ASIAgc,EDNF7Q,AFAI,AlBCA,AiBAA,AvBDA,ASCA,AQDA,AhBEA,AeFA,AGCA,ANAA,AFDJ8D,AhBAI7P,AIFiC,AKGjC,EqBASma,AjBAAtM,AaAAqL,ADAAX,AVDPhV,AdAAA,E4BAE,AlBCA,AiBAA,AXDA,AZAA,AcAA,ALCA,AQDA,ADAA,AGCA,AxBDA,C6BACuW,AlBCA5Y,AiBAA8E,AvBDAiB,AFCAhB,AWAAmG,AQDAC,ADAAvJ,AGCAoV,ADCAlU,CjBACiF,AYDAzB,ATAA,AuBKL,ChCNMxH,AgCML6c,GFLe,AjBAA,AIDP3K,ARCAvH,AuBKL,CtBLMW,AoBAO,AjBAA,ASDP,AtBAA,AQEAV,AeAA5G,ASIL,CrBLM,AiBAA,ANDA,ACED,ASIJ,CVNM,AJCA,CaDjB,APCkB,AxBDAhE,AeAA,AQEA,AtBFA,C4BAC,AlBCAc,AiBAAA,AvBDA,AUAA0C,AdAAA,CECCyC,AkBDA,AHCA,AOAO,CMD3B0D,A5BCqB3D,AGCA,AkBDA,CKDClF,AxBAAmG,ALAA,CqBAC,ArBAA,C0BCQ,ApBCP,AUFxB,AhBAwB,CUCCqE,AcAAyL,CdAC9L,AKDA,AdAA,CUCC,AiBAA,AdAA,AODA,ALA3BtB,ADA2BpI,AdAAA,C8BA3B,ApBEON,AiBDqBA,AXDA,AdCA,AWAA,ARCA,AeFA2V,CPCC,ARCA5N,AmBDO2N,AjBCP/L,CEDC,AmBDA,A1BCA,AKCA1F,AOFA,AdAA,C4BACjE,AZAAK,CPCCmE,ALDA,AUAAnC,AdAAA,CyBCQqT,ALDP,CAACjU,ALAlC,CQC6B,CdAO,AODA,AOCNmK,AhBCM,CSFCjF,AXEA,CIDC,AJCA,AGDb,ADCa,CCDZnC,EgBAe,CdCpB,AiBDqB,AHAA,CdCpB,AiBDqB,AXDA,ARCb,AMDa,AdAA,CgBAC0M,AOCN,AfAP,AMDa,AdAA,C4BAC,AHCA,AjBAblI,CoBDc,AHCA,AFANwN,CHDO,CAAC,GZCV,CAAC,CAAC,EmBAe,CAAC,AXDA,CAAC,EYAE,CAAC,ALCd,CAACE,EHDgB,CAAC,IVEjB,CAAC,AaDO,CbEhDzW,AMH+D,AOCd,CPDe,AOCd,EAAE+W,IbE7C,CAACzV,QaFyD,CbEhD,AaFiD,CbEhD,IAAI,CAAC;AoBF9B,AfAA,AgBMA,CAAC,CFLClC,AjBAAA,AaAAA,ArBDA,ASCA,AFAA2M,AQAAoJ,AlBAA,AyBAAjK,AFAA9L,AzBDA,AOEA,AEDA,AuBKA,EDNFgc,ArBCIxS,AmBDA,AlBGA,AiBFA,AzBAA9D,AmBDA,AhBEA,AeFA,AGCA,ARDJ8J,AZFI,AIIA,AOFA,AQEA,AtBFA,CcAC,AdAA,CmBCCuG,AFDgB5Q,AHAhB,AdAA,CmBCA,CSDE,AlBGA,AiBFA,AXDA,AEAA,AGAA,AhBEA,AeFA,AGCA,CKDCsU,AlBGA/T,AiBFAoG,ARAA,AlBAA5G,AoBDA0R,AhBEAjO,AeFAnG,AGCAsJ,CdAC,ANHAzF,CMGCoD,APAA,AKCA,AeAA5G,CNFC,AdCAP,C2BACtC,AjBAAA,AaAAA,ATDA4R,AfCA1M,AuBAAlF,AVDAmD,AdAAA,C6BCA,AjBAA,AaAA,APDCqS,AjBCAzQ,AuBAD,AVDC,AdAA,C8BAd,A3BFe,AGIA0D,ACAA,CsBDC,AjBAA,AFEA,AeFA,ADAA,AjBCAsB,AOFA,AdAA,CSCC,AMDjB,CeAAV,ArBCkBsB,ANHAtE,COKC,APLD,CyBEE,AFCAyF,ArBCA,AeFA,ALApBzC,CbCqB,AwBAD,ALDC,ADAA5G,CXCC,APAAF,AgBDA,AbEA,CuBFC/B,AlBGA,ACFAmM,AVAA,AyBAA,ApBCAlE,CGDCtD,ACEAvE,ACFD,AUDC,AlBFA,AGIA8I,CwBFxB,A5BCyB,AgBDA1I,AjBCAmE,CCAC,ASAA,CgBAC,AXDA,AOCA,ARD3B,CNC4B,AkBAA,ANDA,ADAA,AGCA,AjBCA,CGDC,AkBAA,AXDA,AfCA,AsBAA,ADCV,CJFW,AZEA+C,AgBAVxE,CMFW,AlBGA,AQHA4D,AjBCA,AmBDA,CQAC3G,AlBGAyB,ERFE,AKCA,CLDC,AICA,ACAA,CeAT,CJFW,AEAA,AdEA,AgBAV,CJFWyP,GEAG,CAAC3Q,EbEE,CGCC,CkBHC,AlBGA,AUHA,AbEA0D,CqBFC,ARAA,CAAC,AEEV,CAAC,CJFW,CAAC,CXEC,CAAC,QqBFQ,CAAC,ClBGC,CAAC,AQHA,CAAC;AYCjE,AfCO,EaDL,AxBCA,ASCAkH,AQFA,AECA,AxBDA,ASEA,ADAA,AeAA,EQFFoL,ArBCI,AoBAA,AjBAA,AFEA,AeFA,AEAA,AzBAA,ASAA,AQAA,AlBAA,AyBAA,ANDA,AHDuB,AOEvB,AlBCA,CWHwB,CZGtB,AUDOzH,AZHPnJ,AWEA/E,AdAAA,E6BCE,AjBAA,AFEA,AiBFA,AvBAAsF,AcDA,APCA,AVAAzB,AyBAA,ANDA,AdEA,AEAAsF,CqBDC2B,AjBAA3G,AFEAA,AeFA,AEAAqG,AhBAAS,AeAA9G,ANDA7E,AICA,AzBDAnB,AOEA+G,CGDCkE,AgBAA,ATDApJ,AQCA,CtBAC,ADAA,CGACsF,AcDA,AbEA,CDDA,AcDC4O,AHCO,AhBDP,AeAA,AdAA,C8BAb,ArBCc,ARAC,AcAM,ADDPjU,AdAAA,CSCCoI,AkBAA,AvBAA,AFAA,AICA,CMDC,AFEA,AiBFA,ADAA,ArBCA9C,CyBFhBuC,ApBGiB6B,AiBFA,AXDA,AfCAnG,AyBAAhE,CGAC,AbDAS,ALCA,ARHA,AGIAkI,CGDC,AGAAlJ,ADAAoM,ARHAzG,AKIAuE,AMFA,AdAA,CSCC,AICAoB,ALAD,AMFC,AdAA,CSCC,AoBAA,AhBCD,ARAC,CKCC,ALDC,ACAD,AEAA,CQFC,AHEA,CiBFvB,AdAwB,CaCCiN,AnBEA,CCFC,AVAC,AEHD,CSGC,ADAClM,AaAD,ArBHA,CSGClM,AXAA,AmBDA,AICA,CdEC,AUHA,CVGCgK,AUHA,CTCE,CcAA,CAAC,ACAA,ChBEC,AgBFA,ChBECO,AQHA,APCE,CODDsK,IRGI,EEFE,CAAC,CMDC,CWCV,AHAW,CGAV,AXDW,CWCV,AHAW,GZDG,AdAA,EcAErS,AdAAA,C0BCC,AZDA,AdAA,CYCC,APCAuF,ASFA,AdAA,CYCC,EMDE,AQCA,CRDC,AQCAsD,IVDI,AXEC,CWFA,CXEC,CAAC,IqBDI,CAAC,CAAC,CAAC;AIAxE,AFAA,A7BAA,AQEA,EoBDE,AzBAA,AmBAAG,ADDA,AGEAL,ARDA9L,AOEA,EQHFic,ArBCI,AoBAA,AjBAA,AFEA,AeFA,ArBAA,ASCA,AMDAzb,AlBAA,AyBAA,ArBCA,AYHA,AOEA,AlBCA,AEAA,AMFA,AdAA,EkBAE,APCAqM,ARHA5G,E0BGE,AjBAA,AFEA,AeFA,ArBAA,ASCA,AZDAd,AyBAA,ATFA,AOEA,AlBCA,CuBDC2U,AjBAApZ,AFEAgF,AeFAwS,AZCA3J,AaDA7I,ALAAyG,AGAA+L,AlBCAnQ,AgBCAqP,CNHC,ALCA,AUAApS,AlBHA,AKIAkF,CGDCnJ,ARHA,CCGC,AeAA,AlBAA,CGAC6F,AeAA7F,AJAAf,AOEAoX,CrBFCjX,AcAD,AZHCwB,AmBKD,CTDE,CHCC,AGDAZ,AZDA,AyBAA,AXAA,AOEA,COFC,AjBAA,AFEAoE,AgBFApE,ALAA,CpBAC,AEHA,AGIA,AEAA,CsBFlB,ALCmB,AJAA,AGAA,ArBHA,C0BGC,AjBAAP,AWCAsL,CbCC,AaDD,AjBAC5D,AEAA,CsBFrBmB,ALCsB7I,ADAAA,CDCC,CMDC6Y,AnBEA,CNFC,CECC,CFDC,AOAA,AHCAhP,CIDC,ADAA,CmBD5B,AlBC6B1J,AOAA,CMAC,ANAA,AKAA,CCACA,ADAAA,CXCC,CAAC,AaDA,CAAC,GPAG,ERAE,AQACK,CNCA,CFDC,CkBAT,AhBCU,CgBDT,AjBAU,CiBAT,AjBAU,AOAC,AOAD,CDAC,AdAA,AaAA,CCAC,AdAA8L,AeAA,AFAA,EXCE,AMDE,GXCZ,CkBDc,AlBCbxC,IkBDiB,CAAC4B,IfAI,CAACD,CaAC,CAAC,EbAE,AHCb,CGDc,AeAA,AlBCb,CiBDc,ACAA,CdAC,AaAA,ACAA,CdAC,AcAA,CdACrL,ADAA,AHCb,CAACT,CGDc0M,CHCZ,CAAC,EGDe,CCAC,ADAA,CAAC;AmBA/E,AFDCjK,ArBEAA,EoBCCmJ,AzBAA,AwBDA,ANAAlL,ANDA,AdAA,E8BAFqb,ArBCIrX,AoBAA,AjBAA,AaAA,APDA,AGCA,AhBCA,AkBAAA,ACDA,ATAA,AZHA,AGIA,AEAA,AcCA,CJHC,AfFA,COIqB1E,ANDpB,AcDA,ALEA,AFDA0M,AQAA,AlBAAzH,AgBFA,CWAL,ArBEA,CsBAO,ADFPiU,AhBEO,AFCoB,AeDpB,AECAtN,AXFA,AKCA,AhBCA,AmBDA,ATAA,ATCA,AEAA,ADDP1B,AeEO,COFCiP,AjBAAxN,AaAAA,AECD,AzBAClG,ADDA,AoBAAgR,AGAAuB,ATAAzI,ATCAlI,AEAA0C,AcCA,CZDqB,AGApB,AFDA,CgBCC,AdAAsE,AFDAzN,ALCA,CFDC,ACCA,AYHA4R,ChBEE,AICDvL,AiBCA,CZDqB,AJApB,AgBCA1D,CZDqBiH,CDD1B,AmBFR,AxBEe7D,AmBCP,COFT,ArBCU5B,AcCAJ,ACDO,ATAA,APCA,CFAC0B,CsBHjB6S,AlBGsC,AHDtC,CuBDDhQ,ADCoB,AnBCoBlJ,ARApByF,AGAA,AYHA,AOEApF,ATAA,APCA0J,AcCA,CbFN,ALAO,AFCAxE,AWAA,AZDAP,AoBAA,ADAAtE,AEEA,CbFN,ALAO,ASCA,AODD,AbApBwJ,AeEqB,COFC7J,AhBCA,AUAP,ANHO,CIECwE,AhBCA6C,AeDA,AGCP,ARDOuH,AOEA,CrBFC,CAACjP,C6BD1B,AFDC,AhBE0B,AaAA,AdAA,CCAC,AaAA,AvBCA,ASDA,AVAC,AuBAD,AhBCA,CIDC,AaAA,ARFA,AOEAQ,CtBCC,ADDA,C4BAC,ARAA,CQACA,CZFC,AVEhC,CFCiC,AYHAiS,CREN,CJCQ,ACAV,CGDIjI,AHCHjB,CKDW,AYCP,EZDS,AYCP,CdDC,AHCH,CGDI,CeAQ,AlBCV,CKDW,AYCP,ACDO,AlBCVxB,CKDW6E,AYCP8K,CMDQ,CAAC,AzBAA,CAAC,CaFC,AXGV,CWHW7T,AFEd,ATCI,CSDH,CAAC,ATCIwE,CWHW,EAAErD,AOEA,CAAC,GbAG,AMFA,CNEC8G,AMFA,CYEC,CAAC,CNCN,CZDQ,AYCPA,CZDQ,GYCJ,CZDQ,AYCP,CZDQ,CAAC,EYCL,CAAC,AjBAf,CiBAgB,AjBAf;AwBDrD,A/BAA,EUCE,AgBAA,APDA,AQEAD,AHAA,EOFFmQ,ADCI,AjBAApR,AFAuC,AiBCvCA,AvBDA,AFCArF,ADDA,AoBAA,ADAA5E,AIAA,ATAA,AZFAwF,AGGA,AEAA,CEDwC,CGCtC,AFDAuG,AQAA,AdCAlE,AYHA,AKIA,EOFE,AbDA,AQCA,ATAA,CcAC4Q,ALAAnB,ATAAzM,CFCC,AFDA,ASAA,AdCA,CJAC,AWAA8C,AFDA1N,AUAA,ADAAA,AZCA,CNAC8E,AiBDAmQ,AFFA,CSGChK,AJCA,CNHC8F,AUED,ApBAC,CeDC,AfCAtK,AEAA,CkBAC,ALDA,AJFA,AdAA,AKGA0C,CaDC,AhBCA,AYHA2I,AFEA,AZFA1M,AGGA,AgBCA,CjBDC,ACAAU,CwBFlB,ANCmB,CTAC,CcAC,CCDrBwC,ANCsB7I,AlBCA,CaDC,AbCA,CuBDCA,AbDA,ADCA+M,AZFA,AGGA,AEAA,CLHC,CgBECvM,CHDCR,AdEA,ASDA,ASAA,ClBCC,ASDA,ASAA,CUD5B,AjBE6B,CAAC,AWDA,CXCC,AMDA,AFFA,AOEAG,CKAC,AjBAf,AeCA,ARDe2G,AFFAJ,CYECvG,AjBAf2K,AeCAA,ChBDgB,CKDC,CAAC3K,ALCA,CSAC,ClBCC,AiBDA,CjBCC,AiBDAsV,ACACjV,AHFD,CNEC,CAACgM,AMFA2F,CFET,CAAC,CKAY,ALAX,CSAW,CLAC,AKAA,CKAC,AjBAf,AeCA,ARDe,CUAC,AjBAf,AeCA,APDiB,CRAhB,AeCA,AVHe,CLEdnF,AeCAA,AXFe,CAACoE,ALCA,AQAA,AFFAY,CNECvG,AQAA4J,EPAb,AeCA,CfDElL,AeCAA,ChBDe,CAAC,ECAZ,AeCA,AHDc,CAAC,CbAC,AMFA,EYEE,AjBAb,AeCA,AhBDakC,AMFA6F,CYEC,CbDC,CAAC,AGCA,CHDCX,ALCA,AQAA,CRAC,CAAC,AMFA,CAAC,MDCM;AcC5E,A/BAA,EUEE,AgBAAjG,APDA2J,AGAA,AEEAoC,AjBDA,AEAA,AMFA,AdAA,E8BAFuE,ADCI,AnBAA,ANCA,AFAA,AWAA,AZDA7a,AyBCA,ATHA,AOEA,ATAA,AZFA4E,AmBIA,CTDC,AIHA,CLEC,AeCA,AdAA,AFDA0G,AQAA,ACAA,AHFA,EYEE,AnBAA,AMDA,AUEA,ArBDYpE,AmBAZ,ATAA,CcACsR,AnBAArU,AgBCAA,AFDA2S,ATAA3S,CHAC,AeCA,AhBDA,AQAAsQ,ACAAhV,CRAC2J,AeCAA,AvBAA,AFAA,ASDA5J,AVAA,AEFA,CFECqE,CgBFC5D,CdAC+E,CMGC0E,AGDA,AeCA,AvBAAlE,AFAA,ADDA,AmBAA,CVAC,ATAA3B,AyBCA,ArBDY,AeAZnE,ALAA,CLACqB,AgBCAA,CdDCqI,AeCAA,AVHA,ChBEC,AmBAA,ALAAnK,CUCCsL,AxBDA,AsBEA+L,ANJA,CQGA,ANDC,AIED,CXFE,AeCA,AvBAA,C0BFtB,ADCuB,AJCA,ArBAA,AeDA,AIEA,CnBDC7Q,AcDAyO,AEAA,AjBFA,CMGCxK,ASDAyK,AfFArP,C2BCzBgD,ArBE0BlE,AoBDA3E,AnBAA,AgBCA,AFDA,CdAC+B,ACAA,AeCAA,AXDA,CJAC,AIAA5B,CSAC,CfCC,ACDA,AgBCA,AvBHA,COEE,ANCD,AsBAA,CjBAC,AWDA,AjBFAuF,C2BChC,A1BEiCe,AoBDA,CKAC,AXAA,AEAA,AIAAqP,CKAC3V,CXACgV,AfFA,CQEC,ARFA,COEC,AgBCA,CtBAC,AODA,AeCA,AFDA,CAACvT,EdAE,AKAA,CLACuI,ACAA,AIAA,CXCC,AcDA,APAAsC,EOAE,CRAC,CAAC9M,CmBAC,CAAC,AnBAC,EAAC,AKAA,CLAC,AcAA,ATAA,CSAC,GbAG,CAAC8L,IAAI,CAAC,IAAI,CkBAC,AlBAA,CkBAC,AlBAA,OaAO,CAAC;AMC7E,A/BDA,EGEE,AWAA,AaAA,ALAA4K,AlBHA,AGIA,AEAA,AMHAzT,AdAA,CGDC,C2BEHiZ,ArBCI,AoBDA,AjBAA,AFAA,AeCA,APDA,APAA,AVAA,AsBEA,ACFA,ATAA,AOEA,CVFC,ADAA,AGDAjZ,CFCC,AeCA,AvBAA,AODA,AMFAqP,AHCAxR,ELEE,AoBDA,AnBAA2K,AeCA,ATFA,AGCA,AdDsBlE,AeCtB,AGEA,ACFA,ATAA,CNCCvC,AoBDA6U,AJCA9B,AFCAN,ACFAU,ATAA3I,ADDA,AdAAvM,C2BEC,A1BDApC,AoBCA6V,CMAChL,ANAA8K,APFqB,AQGrBtE,ClBDCnL,AgBDA,ApBDA9D,C8BCZ,ArBCa,AWDAlC,AHFA,AjBCAD,CgBAC+Q,AGCAkE,AFFAhP,CRGC,ARDA,AKEAQ,AEAArG,CsBFfgI,ApBAgB,AWCA,ArBFA,CoBCC,CnBAC,AoBCA,ADDA,AGEA,AvBHqB,CyBEpB,AEAA,AvBAA,AgBDA,AGEAwN,CEDC9V,AEAA4J,CjBDC,AOFA,CDCC,AZEAxD,AHDA9B,AcAA,CeAtB,AbFuB7D,CUGC,CjBDC,AMDAhB,ADCA,APEAa,CqBFC,AFCA6J,ARDA,AbEAxD,AEAD,CEFE,AaEA,AjBAAM,CiBACmP,ANJA,ATIA,CqBFC3W,AVAAwV,AFFA,AOEA,ATAA,CAACtQ,CYCC,AvBAA,AECA,AgBAX,CKDY,AvBAAmB,AoBDA,AFEXsO,CNHY,AfCA,AKEA,CUHCpG,AfCAhK,EwBCE,ArBAA,AoBDA,CKAC,AJCA,ArBAA,AoBDAuR,ATAA,CcAC3V,AdAAyB,EIAE,CfCC,AeDAA,AGEX,ClBDYqE,AmBCR,ACFQ,AFEX,CrBFY,AsBER4Q,ACFQjV,CCCC,CxBDC,CwBCC,AHCX,CNHY,AMGXsB,CNHY,AZEA,EqBAE,ArBAA,CqBACvC,AFCR,ARFQ,CcAC,ANER,ARFQ,CcAC,ANER,ADAH,ClBDY,AeDA,AIER,ADAH,CGDY,ArBAAwF,AeDA,AGEX,CGDYsF,ADDA,CAClD,AFCyCoJ,CNHW,CAAC,CSEC,CAAC,EHCR,EGDY,ArBAA,CqBAC,ArBAAjO,CqBAC,AHCT,GPFY,CAAC,EXCE,CAAC,CyBDC,CAAC,EVAE,CAAC,GKE3E,CAAC;AMHL,A/BCA,AIDA,ESEE,AVEA,AWAA,AFFA,AeEA8E,AHAA,EMFE,AJCArH,AEAA,ATDA,AGCA,AJHA,AOIA,ATFA,ATEA,AEAA,AMJ4B,AdAO,C2BGlC,ClBACM,ACDA,AiBCA,AvBCA+B,AHFAjC,AIFoC,AeEpC,AEEAkS,CjBJqC,CwBEnC,AbDAnF,AHGAxD,AMFA,AECA,AhBHoC,AmBIpC,ATFA,ADFGnL,AdAOA,C6BET4W,A3BEAnU,AmBDA6Q,AGCA4B,ATFA3I,CNCC,ACDA,AQAAlK,AVEA,CEFCA,AJEA,CaFCwQ,AlBAA,AyBEAhK,AJAA,CbDC,ALCA,AsBAD,AJACmJ,CbDC,ALCAhO,AHFAlC,AoBCA,AbCA,CCDC,AiBCA,AlBAAsD,CiBDN,ATFO,CSEN3D,ATFO/B,AECA,AGCA4T,AfCA,CIFC,AGEAnI,AZFA,CSAClM,AGED,ASAC,CJFC9B,AHAA,ADFG,AdAO,CIIT,AFAAsF,AWAA,APAA,CUHC,AdGAJ,ADFA,AoBCA,AfCA8B,AgBAA6N,CGDN,AxBDO,AcAA,APEA,AMJA3T,AdAOA,CyBGb,ArBCQV,AeFD,AlBAA,AKEA,AEAA,CQHC8Q,AVGApK,CuBFC,AVAA,CJAC,CLAC,AQAA,AMEA,ATFAhC,AOEA,COFClF,AnBAA+B,ANEC,AFAD,AgBFA5B,EhBEE,AsBAA,CdFC,AIFT,AdAO,CUEG,ANEEsG,AIAF,AMJVrH,AdAOA,EgBCK,AQGA,ATFA,APEA,CgBAC0W,ATFAlU,ATEA,AEAA,CqBFC,AvBEA,CuBFCzB,AJCP,CrBCU,AUJlB,AdAO,CyBGG,ArBCSK,CoBAD,AlBAA,CkBACoB,AlBAA2F,CIFC,AQAA,AVEA,CEFC,AeCP,APDO2N,AVEA,CiBDN7H,ArBCS,AIAF,CJAGvG,CUJzB5F,AdAOA,EeEmB,CAAC,CTEC,CuBFC,AzBEE,CyBFD,AzBEEF,AcFF,AZEAwG,CYFC,CMEC,CACjD,AVLiB,AdAO,CMI2B,CFAG,AEAF,CFAG,IqBDL,CAACiE,AXHlC3I,AdAOA,CeEmC,CAAC,EUCL,CAAC,IAAI,AXH3C,AdAO,CyBGqC,CIDQ,AJCP,CIDQ,AfFrD5B,AdAOA,IwBM1B,CAAC,IVNkB,AdAO,McAJ,AdAO,IcAH,AdAO;ADErC,EaEEoK,AaAA,AEAA,AhBAAgB,AYEAX,ANLA,AXIA,AEAA,ECDE,AoBDA,A3BEAzG,AgBFA,ALEA,AaAA,ALDA,AhBHA,AeEA,AIIA,ATJA,ADFA,AdAA,CoBEC,CVAC,ANEAwB,AHFA5B,AmBAA,AEEAzC,EOFE,AbDArC,AECA,AQEA,ALDA,AGGA,ATJA,ADFA,AdAA,C6BEC0Z,AXAAxU,AQEAA,ALDAqG,AEEAI,ACCAyL,ATJA/H,CFEC3I,AMFA,AIGAlC,CrBDC,CAACe,CEAC,AHFA,CGECwB,AeFA,CAAC4O,AlBAA,AoBCA,CLFC,AECA,AQEA,ALDA,CLFC1V,AHGA,AFDAqM,AeCAxK,ALDA,AEEA,CLHC,APCAuK,AaGA,CvBJC,AsBGA,CXFCf,ACCA,AZFC,CWCD,AIFC,AQKA,CRLCpJ,ALEA,CCAC,CVCC,ASDA,AIDA,AOEV,COFW,A3BEA,AiBFA,AKIAgV,AFFV5U,CTAW0H,AMFA0L,AOEA,CAACvT,AXFAnC,CcACA,APEV,ClBAW,AkBAV,GlBAcQ,CYHA,AUGA,CVHCgR,AUGA,CxBAC,AaFA,CcAC,AhBEN,AEFMrR,CcACA,AzBEC,AFAD,AWANwJ,ASAJ,CHFW,CAAC,AGEVgN,ElBAc,AsBAF,CVHC,AUGA,CVHC,AHGN,CAAC,CAAC,ASAJ,CAAC9B,CpBAW,AsBEZ,CtBFa,AsBEZ,ETJc,CcAC,AdAA,CcAC,APEV,CAAC,OEEK,EAAExS,KTJiB,CAAC,IcAI,CAAC,OLIf,CAACoB,QAAQ,CAAC,CAAC,CAAC;AMJtE,A/BAA,E0BGE9C,AEAA0K,ADAA,ALDA,AhBHA,AeEA,AHDA,AXIA,AEAA,ECFE,AoBDAd,AjBCAlG,AFDA,AREA,AWCAqC,AFFA,AVDA,AsBGA,ACCA,ATJA,CdAC,CwBEC/F,APFAI,AjBAA,AaFA,AQIAsD,AtBJA,CyBIA,ChBDE,ALCA,AODA,AQDA,AIGA,ANJA+N,AOKA,ATJA,ATGAlL,CGFCvC,AgBCA,AdDAuH,AYEAkL,ACCA9L,ATJAgE,CYECjE,CAACX,AzBAA,AWCA,CAACpD,ACLA/E,AdAAA,CSGC,ASDA,CTCCmI,ALCA1D,AcFAhG,ChBEC,AMCA+G,CIFN,AeCO,AvBAA,CQDNzD,AEHO,AdAA,C2BIC,AJCA,ADDP,CbDQ,ALCA9D,AcFA,AKGA4V,AjBAAlP,AgBDPxC,CJFQ,APCA,ALEA8C,AEAAO,AMLAtF,AdAAA,CSGC,AIEA,AEHA,APGD,EIFJ,ADAO4J,AMFA+F,ATIA,AcDP,CVDC,ARCO,ASCA,AIJA5O,AFCAxD,ATGA,AgBDP,ClBAQ8G,CECC,CKFC,AMFA,AOKA,CAAC,CPLCnC,AOKA,EpBFE,AmBCA,CMHd,AzBEesC,AWFA,ADFA,AdAA,C6BEd6D,AZDe,AFCA3K,ADFA4C,AdAAA,CuBKCyB,CNJC,CJIC,CDFN,CRCQ,AkBAP,CVDC,AMDO,CAAC,AJFA,AQIPmS,AtBJO,CuBKC,ATLAlW,AdAAA,EYGL,CAACwM,AEHO,AdAA,CcAC,AdAA,CsBIN,COFP,AdAe,AOEP4H,COFP,AdAe,CcAd,CAAC7H,GPEW,COFP,APEQ,COFN7C,IAAI,EjBCS,CAACsB,CiBDL,AdAa,CAAC,EHCL,CAAC,IAAI,CAAC,CAAC;AkBD3D,AJGP,A3BHA,EGGE,ASDA,AUCA6K,AhBHA,AeEA3V,ERAE0D,AFDA,AeEAsS,AEAA,A1BFArW,AsBGA,ANJA,AOKA,ATJA,ATGA,AEAA,AcDA,CAAC,CQHQwb,ArBEPnX,AoBDA,AXAA,ALGA,AMHA,ACCAhE,ANHA,AQIA,AtBJA,CoBGA,CVDE,AiBEA,AXHA,AZGA,AaHA,AOKA,ATJA,CeDQ,ApBCP0K,AiBEAnG,AtBHAkD,AeEA,AHFA0J,AOKAkG,ATJAzI,CeDQ,ArBEP,AoBDA,AhBGA5K,AZHA,AOGAkF,CCFCa,AoBDAP,A5BAApF,AsBGA,AjBAA,EeDEuR,APJA/T,AdAAA,CIIC2E,ASCA,AQDAkE,CQFC,ANGA,CdFC,AGAP,AeCO,AJCAgM,CXFN9S,AFDO,AiBEAzC,AdCA6E,APAA,CuBHCyD,AnBAA,AeER,AXJQ,AdAA,CSGC,ACDA,AeERyM,EDEU,AlBDA,CuBHC,AREA,AGEA,AlBDApX,CMFN,AaCD,ADEQ,AVNA,AdAA,CYGN,AaCD,AZCQ,AZHA,AoBEA,AJHA,CQGP,ArBAQ,ASCAyH,AZHAzG,AsBGA,CEDPwM,ApBHQ5E,AkBIA,ClBJCC,AkBIA,ANJA,AHDA,AdAA,C2BIC,AvBAA7H,AWFA,CNCC,CgBCP,AxBFQ,AaFAZ,AdAAA,CyBIP,AEAQ8K,AdCA,AZHA,AgBDA4H,AFCA,EXEE,AECA,CFDCnL,ACHA,ACIAD,AEAb,AMLa,AdAA,CeEC4G,APGb/F,AMLa/E,AdAAA,C2BIC,AtBHA,COEN,AaCD,EbDG,CeCQ,AnBCb,AMLa,AdAA,CQKZ,AMLaT,AdAAA,CQKZ,CIFO,CAAC2K,AeCO,CAACsL,ArBCA,CWJC,AXIAhR,AQLA,AdAA,CIIC,AaHA,AHDA,AdAA,CIICN,AaHA,EXIE,AQLArE,AdAAA,CMKC,MqBDM,EvBAE,EQDL,CAAC4I,AEHO,AdAA,IYGH,CAAC,IAAI,CAAC,CAAC,EGDZ,CAAC,CAAC;AbGxD,AwBDCrJ,A3BFD,E+BAE,AHGA,AhBAAmK,AVFA,AsBGA,ACCA,AlBDA,AgBDA,EbDE,AGAAlI,AFDA,AQAA,ACAA,AEEAtD,AhBHA,AeEA,AHFA,AFCA,APGA,AMLA,AdAA,CmBEC,ALFA,AdAA,C6BEC,AJEAwJ,ANFA,ALFA,AdAA,C0BGL,ChBDO,AMDAiH,AZGA,AsBDP6G,ANAO,ALDA,CeDC0D,ApBCAzQ,AUCAyK,ALDAvG,CcAC,AZDA,ATIA,CqBHCjE,AREA,CSHCwQ,A1BGA,AiBAAva,CSHA,A1BGC2E,AUJAxD,AdAAA,CcAC,AdAA,C8BCC,AtBIA,CIFN,AIFO,ALGA4J,AHCAxE,AMLA,AdAA,C6BEC,AjBCPzD,AIFOmN,ALGA9O,AeDhB,ALCgB,CQFC,AlBEA,AUAC,ANFD,CcAC,ATCA,CTCC,AeDnB0V,ANAmB,CAAC,ALDArY,APGA,CAAC,CIFN,AIFO,AZGA,AICA,CIFN,AIFO,AZGAoH,CYHC,ENCE,CAAC,AWEAgE,CXFC,AgBC5B,AXD4B,CAACjL,CXEC,CAAC6G,EqBAb,ArBAe,CqBAd8D,CrBAgB5D,AiBAC,ETDN,ASCO,CAAC,CTDN,IAAI,AGDO,CHCNiG,AGDO,EXEE,EqBAb,ArBAe3M,CqBAd,CAAC,CAACwM,ErBAiB,CAAC3F,CqBAd,CAAE8C,AVFc,CAAC,GUEX,EbDS,CAACsB,CaCL,ArBAa,CAAC,EQDL,CAAC,IAAI,CAAC,CAAC;AVCnErJ,ADDD,ESAE,AiBGAgO,ARHA,ACCA,AGGAmG,ACCAjL,AlBDA,AEDA,AcAA,EQJE/L,ArBEA,AoBDA,AjBCA8E,ADCA1B,AUAA,AhBHA0F,AUCA,CcAC,AlBEA,CkBFC,AzBEA,ASCA,AFDAqE,AMJM6F,AHANxR,AdAAA,C2BKCqP,AvBDA,AFDN,COAO,AgBCA,AECD,AXJCpQ,AdEPgF,AmBCO,ANFA,ATIAmE,CGHCxE,AYCAyG,ANFAqE,AOGA3H,CKAC,CzBFT,AGFU,CoBGC,ApBHAG,CIEC,AgBCAoF,AFEAkJ,ATNA,AdAA,CSGC5S,APAbqB,AqBGY,AjBACmE,AQNAnI,AdAAA,CMMA,AgBDC8G,CVFN,AIFO,AOKA,ADDD,CVFLxD,AIFOoN,AdEhB,AmBCgB,AfEA,CgBDC,CbFC,AKHA,AdAA,CWIC,AUAAtG,AhBHA,AmBMAE,ATLA,ADFA,AdAA,CSGC,AECA,ANHAhD,AmBMD,CbHE,CCDN,AYIO,ATLAtI,CHCN,IIFW,AKGA,CLHC,ESGE,AVFA,CUECmK,AVFAhK,EeDd,CAACU,AdAgB,CSGC,ATHA,CJEN,AaCO,CpBHC,COEN,APFO,IOEH,CAACuM,CkBFR,CAAC,AzBAgB,AUCA,CeDf,AfCgB,CVDC,KSDK,AdAA,EcAEzK,AdAAA,CcAC,AdAA,CcAC,AdAA,IYGH,AGDO,CHCN8I,AGDO,IHCH,CAAC,IAAI,CAAC,CAAC;AXDjErJ,AFAM,EWELmJ,ACCA,AQDAoK,ACCAjV,AZEA,EsBLE,ADCA,AjBCA2D,AeEA,ATHA,AGEA,AEEA,ANPe,AOQf,ATLA,ATIA,AgBDA,CLNgB,CRIdM,ALCA+B,ASCA,ARJA6B,AeGA7H,ArBHOnB,AeDP,AdAA,CCCL,AmBGK,CSFE,AnBCAgM,AeCA,AxBHPlH,AoBGO,AJLe,AOQf,ATLA,CcACiH,AnBCD,AWCCC,ADAA,AIGAoM,CMNCqE,ArBEA,AkBEAvD,AdAAvK,APCAzN,CGHCkD,ACAA,AaGA,ADDAgT,CZFC,AeCA,ANDAhB,AFJe,AFGf,CeDC,ALGAI,ArBAA,AeDAH,AlBFZ,AIAY,AYFe9D,AFGf5C,ATIA,AQNArM,AdAAA,CIICyE,CiBAC,AhBHA,AkBKA,AfAA1E,CsBLC,ArBEA,AGAP,AXFRyB,AoBGe,AEEA+S,AjBAA,CMHN9S,AOAO,AECA,AGGA,AFFA,CKAC,AdAA,AWEA/D,AhBDAqC,AcDAiS,CbFCxS,AUAA,AdFA,AGKA1C,CsBLCmc,A/BAO,C4BIN9b,AdAAJ,AZJpB,AcCoB,AhBDO,ASKP,COJCgD,ATIA,CwBLC,AlBEP,AaCO,ArBAA,AIEA,CsBLC,AlBEP,AaCO,AHCA,CQJC,ALGA,AZCA,AUCA,ARJA,ADFA,AdAA,CIIEpC,ASCDX,AUCAuL,ARJA,ATIA,CuBJC,AvBIA5L,CuBJC,AZHe,CYGd,AFGA,CAACkZ,CvBDE,GmBEE,ACCA,CpBHG,ASCF,AWEA,CXFC/T,CJFT,CAAClB,AGAG,ANGO,CAACuD,CMHN,ACEO,CWEC,AlBDA,CODC,APCAjF,CqBDC,AdAA,AWEA,CZJN,ACEO,CDFNsL,AGDO,ATIA,CGHT,AMDU,ATIA,CGHT,CAAC,AkBEU,CHEC,ClBDC,CSJC,ATIA7N,CqBDC,CAAC0F,EZHE,EAAE,GYGG,ErBCE,CMHN,ANGOqC,CMHNkE,IAAI,CAAC,GNGU,CMHN,CAAC,ANGO,CMHN,GNGU,CAAC;EuBH7E,AjBCA,AFCAH,ACCAkB,AUDA,AEEA,AxBLAhN,AuBIA,EQJE,ArBEA,AkBEA,ATHA,ACCAoW,ACCA,AHLA,AXOA,AEAA,AMNA,AdAA,EyBIE,ApBHApN,AmBMA,ATLA,CUEC,CAAC,AECA,AXJA,AZGA,AeDA,ACCA,AdEA,CqBDCiQ,ARFA3W,ACCAkU,AdEA,CYJC5V,ADHA+R,AFGA,APIAhI,CsBLC6R,AfCA9W,CXEC,AOCAsH,AaEAjK,CpBHC6D,AOCAiG,AZJA7M,AOKA,CwBLC,A/BAAC,AOKAE,AEAA,EFAE,CqBDC,ATHA,APGA,AaEA,AhBDA,CWHC,AFJA,AFGA,ATIA,CqBDC,AhBAA,AQFAmQ,AdFA,AeGA,ALFAhO,CLECwJ,AQFApG,AEEA,AIGA,CdHA,ALHC,AeGA,AHLA,AlBEA,EWGE,AXHAxF,ASKA,CgBCC,CpBHC,AeDA,AKIAiY,CLJC,CDDC,ADHAnF,AlBEA,CKGChS,AcFA+Q,AHAA,APIA,COJCxP,AhBDA,ASKAa,GSPG,AFGA,APIA,CJFC,AaLAY,AOQA,ATLA,APIA7D,CJFCmH,AeDA,AKIAvE,CLJC,AXGA,CSPC,ATOA,CUJC,CDHC,COQC,CpBHC,AoBGAkO,CpBHCxJ,GoBGG,ATLA,CSKC,ATLA,CSKC,CpBHC;AmBG/C,EOLE,ADEAsE,AjBCA,ASCAgL,ADDA,ANJA,AQMA,AtBNA,ESGE,ACCA,AeAA,AdCA,AQFAX,AdFA,AUCA,AhBDA,C0BGC,ApBHA,CoBGC,AECA,AdAA,ARJA,AYFArD,AOQAlQ,AlBDA,EuBHEkJ,AjBCAK,AFAA,AMHA5L,AZGAwG,AOCA6F,AQFA,CUAA,AnBCCnH,ASDApD,AGGA+U,CbHC1M,AkBEA,A5BJAxK,AOKA,CuBHC,AFEAuF,ArBCAvF,CKDC,AMNA,AlBEA,CsBIC4W,AfCA,CGHC,AYED,CjBDE,ALHAvX,CWGC,AMHA,AZGA,AiBCA,AfCAyB,CGHC,ACCAF,AMHAN,ALIA,AWCA4W,CVFCjL,AeCA,ARFA,AGGD,CVFExH,AeCAgM,ARFAN,AbGA,CFFC,AkBEA,CNLC,AZGA1J,AOCA,CKJCuL,ALIAzF,CFFC,CkBEC,AHEV,CZHW,AeCA,ARFA,AKIV3I,AzBNU,C4BIC,ARFA,ApBFA3D,CUECoK,AGCA,GbHG,CyBMT,AzBNUnK,CyBMT0C,CdHW,AMHA,AZGA,AOCA,CDDC,AMHAiP,AZGA,COCC,AQFA,CAAC,CVAL,AeIJ,CfJK7M,AeIJ,EzBNY,CAAClF,CUEL,AOFM,CPEL,AOFM,CPEL0J,CCCO,EAAE,CXHC,CAAC,CUEL,AVFM,CUEL,ACCM,CDDL,ACCMqC,WAAW,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;AaE1ErJ,EOHC5C,ALEA,ANDA,ACEAuW,EXFE1T,AoBAA,AjBCA,AFAA,AiBCA,ATHA,AGGA,AhBJA,AmBMA,ATLA,AhBDA,AOKA,AEAA,AcAA,CECC,CpBHC,ASCA,AFAA,AMNAoQ,AOQA,CpBHC,AmBCN,CbDO,AaCPyE,ARHO,AhBDA,CWGChS,AKFAoG,AhBDA5L,CaGC6K,ACCA4D,AFAAxB,CUAC,ACCAgK,CFDCZ,AHNA,CaGCvW,AVGD,ArBJC,C+BCA,AjBGC,AINA,CIMC,ADAA,CUHC,ApBEA,AWCA4L,AtBJA1L,CWGCa,AGCA,ASCA,CCDhB,ADCiBsU,ELPE,AlBEA,CcICzG,AFAA,AYApB8I,CdFW,CAAC/S,CEEWkI,AUAA,ACCA,CTDC,ASCA/C,CTDC,CAAC4E,AEHA,CJGC,AIHA,AOIA,CXDCtB,AIHA,AOICjJ,ECD7B,EbDgC,CAAC,AYEC,CTDA,CAAC,EDDb,ACCe,AFAA,AWCEA,CbHX,AGCLQ,CHDMgG,GaGe,CbHX,ACCU,AYEEjB,CbHXvJ,CCCW,CDDT,CAAC,AaGY,CAAC,CZFD,CAAC+L,IEAX,CAACtH,KFAoB,CEAd,AFAeqH,CEAd,GFAkB,CAAC,IAAI,CAAC,CAAC;ASAzE,AXGA,EIFE,AaCA4B,AEAA,ANAA,ANHA,ADFA,AQMA,AtBNA,E8BEE,ArBCAhJ,AoBAA,AnBCA,ANAA,AcFA,AbDA,AeIA,AIEA,AzBNA,AOKA,CFFC,CAAC,AOCAgI,AMNAqG,EaGE,ADCA,AnBCA,AMHA,AHGgChT,AOChC,AIEA,AzBNA,C+BCCuc,ADCAnD,AnBCA5T,AUCA4Q,AIEA+B,AzBNA/X,CmBCCqO,APGA,ANJA1F,CMICmE,ALCA,COFiC,CIL/B,CCGC,ALEgC,AOChC,ArBJA,CqBIC9K,AHNA,AXOA,CwBJC,ArBCP,ACCO,CDDN4C,ACCOnE,AQFA,AnBDC,E+BCC,CDCC,AJEA8M,AdAA,CFFN,AoBAOkE,AJEApH,APHAiE,CTCN,AJFO,CyBCCa,AnBGA,CSAC,CKAC,APHA,AbDA5G,AeIAtG,CFHC,AMKA,CCFC,APHA3B,APGA,AaEAG,CbFC2L,ASAA,CAAC,CSFC,ExBFE,CwBEC,AnBCA,ALHAjE,ANAAtI,CWGC,AQFA,CTCN,AoBAO,AXDA,AEGA,ArBJC,CqBIA,CXFNwK,ASDO,AnBDA,E+BCP,AnBGS,CmBHR,AnBGSyC,CmBHR,ArBCE,ACCO,ALHA,CIEN,AJFOtE,CKGC,AcGA,CAAC,GdHG,CAACqD,CCCC,CaEC,EAAE,GdHG,CAACF,EcGE,CnBNC,CKGC,ALHA,CKGC,IAAI,CAAC,CAAC,QLHQ,EAAE;AcE5ErJ,AXID,EIDE6K,AeCA3B,AvBFA,AiBEAC,ADDA,ALFAA,ATGA,AQNApJ,AQOA,AtBPA,E8BEE,ArBCAkC,AoBAA,AnBCA,AeCA,A1BJA,EmBAmC3E,ALE0B,AFE3D,ANJA6I,AmBMAlG,CXJ4D,AMDjE,CWAO,ApBEA,AeCA,ATJAuP,AHE2D,AMDlEwD,AEIO7J,AJRS,AFKTA,AhBFA,AeDApJ,CgBEC+Z,ApBEAhX,AeCAkS,AJCD,ANHA,AhBFCrX,AeDAU,AQOAqW,AtBPA3U,CkBCkC,APIjC,CAAC+J,AUCA,ANHA,CGFkC,AJDjC,CECC,AXAA,CWAC,AFDA,CTCC,ALDA/J,CSGN,ACCO,AVJA1B,C8BEC,ArBCPiE,ACEH9C,CeAW,A1BJA,CaICqL,APJA,ALDA,C8BEC,AlBGA9C,AeCAmB,ARJnB,CVCa,AgBEO,AECD,A5BLCtL,ACDA,CSGN,AEEO,AMPS,CUQR,AhBDA4M,AQHtBwI,CWAuBiE,AlBGA,AKPS,AOSnB,AFAUvC,CGFCI,ADEVrT,AFAUqF,CVFC,GbJG,AuBMA,CZFT,AXJUjJ,CWIT,AYEU,CXFC,EZJE,CYIC0M,AQHlC,CVC4B,EAAExC,EOFS,AQMV,CRNW,AQMV,CMLC,ArBCG,CqBDF,ArBCG,CqBDF,CNKC,CbFW,AaEV0N,CCFD,CAAC,EfAI,CAAC,CAClCtX,WcC8C,CAACgC,CCFD,EAAE4H,CfChC,CAAC,AcCmC,CAACsG,CCFD,CAAC9M,EDEI,CAAC,CdDlC,AcCmC,CCFD,ADEE,CdDlC,AeDiC,IfC7B,CAACkH,UAAU,CAACY,IAAI,CAAC,IAAI,CAAC,CAAC;AFC5D,EEAE,ANDA,AgBCAuK,AdCA,EwBLE,ArBCA,AoBAA,AjBEA,AaAA,AECA3R,ATNqD,AGMrD,AGCA,ATJA,AhBFA,AeDA,AQOA,AtBPA,CkBAsD,AMOrD,CRNC,AEDqD,ALGrD,AFEAtD,ANJAyH,AYJ8C,AOU9C,CPV+C,CaK7C,ADCA,AjBEA,AaAA,ArBAAtB,AiBCA,ANHA,AhBFA,AOMAkC,AQPA,AdAA,C8BEC+S,ADCAhS,AjBEAmD,AaAA8J,AJCArX,ANHAoL,AhBFAjL,CcECsD,CJAC2G,AaIAwM,CFDCX,AdCA5M,CuBJC,AhBAA,AFEA,ASCD,AdCA,CKFE5H,CFFC,AoBAA0I,ATGA,AdCA,CqBDN,AdHO7G,CcGNiB,AZHO,AhBFA,AuBMA,CQLC,ALGA,AJCA,ANHAiH,AOIAsJ,CVFC,AaAAlJ,ArBAAzE,ASFA,AFEA,AUCA0F,AhBLA,COICzC,ARAA5C,ASFA8G,AFEA,AZJArO,C+BCC,AzBDA,EsBKL,CfDQ,AeCP,AZHO,AOIA,CQLC6R,AfCA,AOIAkF,COJC,AjBEA,AaAA,AVFA,CcAC,AJEA,CIFC,ARGA,AtBLA,CKIC,ALJA5W,AuBMA,COJC6M,AjBEA,ADAA,AWECrJ,CVFA,ARAA6D,AOAA,AUCA,EIDG7D,AJCD,CQHC,ARGA,CQHE+F,AzBED,ASFA,AQGA,ACCC,CTJAyE,CcGN,AvBDO,CqBAE,CECP,ALCSxK,CTJD,CAAC,CYEG,CIFA,AFGR,A5BLO,C4BKNuJ,A5BLO,AuBME,CQLZ,ARKahE,CQLZ,CAAC,ADCa,EPIE,KAAKA,IAAI,CAAC,EKDP,CAACuC,IAAI,CAAC,A5BLO,CAAC,CAACrL,E4BKL,CAAC,CAAC,G5BLU;ASM5E,ECHE,AGEA,AFEAoL,AKJA,AOIA,EQLE,AHIAnH,AXLA,AZIA,AOAA,AUCA,AhBLA,AeKA,AICA,AzBNA,AOMA,CUNC,AXAA,CwBECqF,AJEAS,ATJA,AHGA,ARHA,AYJAlK,AHGAwC,AdAAA,E8BEE,AVIA,AICA,AzBNA,C+BCC2Z,AVIAtG,AICAgC,AzBNAzX,C0BIC,AZDAiO,AQEAkI,AJTA,CQQC7S,ArBAA,ASDA,APGA,CeDC,AJTA/D,CPUC4L,CmBJC,AnBID,AGHCxL,AOEA,CSHCoM,AzBEA,AiBCApM,ADAA8B,CVCC,AeFA,AECP,AvBDOsE,AaRA,CUSN9B,AVTOzE,AXUA,CQPC,AdAA,CyBKC8D,AXLAV,AdAAA,EMOE,CuBJC,AhBCA,APGAzD,CwBLC,ADCCC,AFGR,AdFO8O,AQEA,CIDC,AECP,ANAOA,ADAA,CAACpM,CUJC,AbLA,CAACwC,CbQC,ALJA,CKKrBuC,AoBCsB,AzBNA,AeDA,AdAA,C8BECuQ,ADCC,ALIDlX,AzBNA,AeDAE,AdAAA,CoBMC,AHTA,CGSC,CdCC,AQPA,AdAA,C6BGG,AvBIFuG,AQPA,AdAA,EaIE,APGA,COHC,AQEA,AfCAY,CqBDN,ANAO,ADAA,CAAC,COAN,AvBAf,ASFsB,APGA,CFDrB,ASFsB,APGA,CFDrBL,AiBAsB,CAAC,CMAN,CAAC8F,ArBCO,CkBAC,AlBAA7N,CkBAC,IpBDlB,CAAC,CoBCuB,CpBDrBgI,CoBCuB,ElBAE,CFDrB,AECsBD,CFDrB,C0BJO,A1BKrCE,C0BLsC,ANKgB,CMLf,CHIU,CAACgE,GrBCU,CqBDN,CAAC,ArBCO,EFAnD,CAAClE,CuBD+C,ArBCO,CqBDN,ArBCO,CqBDN,MvBCxC,CAAC;AIA7B,AcCA,EbHE,AGEA2F,AILA,AZMA,AOFA,ASCA,ALFA5B,AhBHA,AOMA,EwBLE,ApBKA,AiBDA,ATNA,AGMAkL,AhBLA/N,AYJA,AHGA,AdAA,CiBHC,AHGA,AdAA,CyBKC,AZDA6F,AQEA,AJTA,AOUA,AVPA,AdAA,CaIC,AQEAxM,CSJC,ADCA,AnBIA,AiBDA,AdFAwB,CiBFC+Y,ApBKAnX,AiBDAA,GEHG,AJEAiF,AZDA,AWGA5H,CKJCoX,AfHAhX,AdAAA,CcAC,AdAA,CSICgI,AIAAnH,CHGC,AeFA,AECA,ANAA,AhBLA,ASDA,AdAA,CUOC1B,AeFAsH,AECA7I,ANAAwB,AhBLA2G,AmBMA,CXHC,CDECwE,CAAC/C,ASAA,AGCA,ATHAmB,CUCC,AJCA,ANFD,CUCE,CAAC,AVDA,CHEC,AYCA,CAACwM,CZDC,AFCA,CoBLC,ApBKA/V,AWDA,CAAC,AhBLA,CwBEC,AxBFA,CyBCC,ADCAtC,AnBIA,CAAC,CDHCkL,CAACC,AkBEA,CGJCwN,AHIA,GEHG,CAAC,AnBIA,ALNA,CKMC,CiBDC,AtBLA,EIGE,AkBEA,ElBFE,CeGC,CGDC,AHCA7V,CGDCoW,CtBLC,EAAE,CmBMC,CAAClI,IAAI,CGDC,AHCA,CGDChF,AHCA,IGDI,CAAC,IAAI,CAAC,CAAC,GGJjB,CAAC,CAAC;AdAtD,AIKA,AZAA,AcACrJ,EZCC,ANCA,AOFAqK,AZJApM,AOMA,EwBNE,ArBEA,AGEA,AaDA,AECA,ATNA,AGMA,AJRA,AFMAgE,CUCC,CIFC,AJEA,AZDAiK,ARJ8C3F,AmBO9C,AVPA5H,AdAAA,C6BGC,AhBCA,ASEN,CQJO,ADCA,AjBGA,AeAA,AvBEAgB,ASJAyM,AQEA,AJRA,AXUA3G,AgBFP8O,CQJQ2F,AHIApX,ANAAiR,AJRAhE,CRMC1S,ASJA6O,AMOA/L,CpBCCR,AcRA,CNMC,AREAwF,ACR8C,COM7C4C,AENA,AdAA,CkBACnK,AGMA,AhBN8C,ACQ9C6H,AQRA7G,AQMb,AtBNaA,CWMCyL,AUAAL,AGCA,AlBCD,CqBFE,AdFA,AFED,AIFN,CNAQ,AGEA,AeAA7L,AVRA,AFMP+D,ATIO,AgBFhBqS,CXAiB,AMRAhE,CLQChT,ACFA,ACJA,AdAA,CSIC,AQNA,AOSA,AVPA,AdAA,CYMC,AREA,ALNAU,CmBFC,AGMA,AJRA,AOSA,AzBLD,C+BAE,A1BMAsE,AcRA4J,AGMClC,ANFR,AOEf,CECuB,ATHP,AhBFO,E+BAE,ArBEAxC,AGEAM,CREC,AiBFC,EjBEC,C0BNC4K,AlBIA,CAACpV,ACFA,AQEE,ETAA,AeAA,CAAC,CfAC,CMNC,CAAC,CHIN,EGJS,AHIP,CGJQ,GSMG,AZFP,CAAC0N,CYES1K,CAAC,GlBFX,CAACC,AkBEe,GlBFZ,AKJa,AdAA,CSIZgI,CKJcjI,AdAAA,CcAC,AdAA,CcAC,AdAA,E8BEd,CAAC,CAAC,CfEU,CNAL,AMAM,CNAL;AOHnDP,AIKAA,EVGCsJ,AeHA,EKHE,ArBEAjM,AoBDA,AzBKA,AcRA6O,APMA,ANP8D,AUK9D,AhBFAhO,AOMA,AQRA,AdAA,C6BGC,AXHA,AbD8D,CwBI7D,AjBGA,AeAA,ATNAgD,ALIAgL,AQEA,AhBP8D,AYD9D,CDEL,AHIM,AOCN,CUHO,AdFP6C,AHIO1C,AFEA,ASDPoH,AIEO,ATHA,CeFC+E,AnBIA1O,AIFAoD,CHEC,AeAA3M,AvBEA+E,AcRA,AnBEA,CUEC,AGEAyC,AeAA,A5BJA5J,AOMA,CGJCsH,ACIA6D,AiBFAjL,ANAAgW,AJRA,CPUA,AQRCpT,ALIA,AOCZ,CPDa,AQEA,CTAC,AFEA,AiBFA,AvBEA,ASJA,CKJC,AEKfwS,AHPevP,CCEC+H,AGMArO,AfEA,CGJC,AGEA,AINjB,AZQiB,C0BNC,ArBEA,CAAC,AkBEA,AhBAA,CKNnBmR,AIKA,AHPoB,AFMA,ATIA,CwBNC,AlBIA,AKRC,AFMD5Q,ATIAf,CKFC,CPEC,CiBFC,AJRAgE,CaIC2N,ATIA5C,CMAC,AhBAA,AZJA,CKMC,AaVC,AlBID,C4BIC,AvBEArH,EYR5B,CEA+B,CAACiH,AZQA,CAACnH,EAAE,CYRC,AnBEA,AOMAa,CYRC,AHIA,CMEC,ANFA,AhBFCrH,CKMA,AiBFA,CjBEC+G,EEAE,CeFC,AtBJC,AOOvC,CeHuC,CNFC,EeFV,AfEY,AhBFE,AOOxC,CwBP2B,AxBO1B/H,CwBP2B,A1BMY,CaVC2S,CbUC,AWJA,CAACzC,MENM,CAACkD,AXWtC,CAACrL,EFDwC,CAAC,CWJC,CENE,AFMDkE,EENE,CAAC,CFMC,ATKtC,CSLuC,CTMjE,GSNqE,CAAC,ATMlE,CSNmE,ATMlE9L,EACP,CAAC;AmBLL,EhBDE,AEEA,ANPA,ACYA,AQXA,AdAA,E8BEE,ADCA,AjBGA,AFEA,ANAA,AcRA2O,ADFA,AFMA,APEA,CUNC,CAACE,ALIAnL,AQEAoT,AGCA,AzBLA,E+BAE,ADCA,AnBKA,AiBFA9T,ANAA,ANFA,CeFC+S,ADCAkE,AnBKA1U,AiBFA,AdFA,AQEApD,ANFA2N,CYEC/C,AdFAgC,AdFAlO,CKMC,AIFA2J,GUNG,CdQC,ALNA,ASIA,CEEC,ANAAxC,ALNAlH,CWMCqB,AQRAqT,CGMC,CAACpT,AtBJA,C8BCC,AdCA,CeFC,ADCA,AdCAxB,CcDC,ARGA,CAAC,CSJC,AHIA,A5BJA,C4BIC,ATNA,ALIA,CHIC,AiBFA,AdFAiD,CHICrB,CoBNCiT,C1BMC,ASJA,CTIC,ASJA,EdFE,CWMC,CAAC,AWFA,AtBJA,CKMC,AiBFA,EjBEE1N,AWJA,CAC/B,GLGmC,CAAC,ANAA,CAAC3F,GAAG,CAAC4C,CWH/B,EACV,CXE6C,CAAC,CAAC,C0BNb,AfIlCa,CeJmC,CAAC,gBfI5B,EAAC,IAAI,CAACmK,aAAa,CAAClE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAC5C,CAAC;AUFJrJ,AdED,ANPA,ASCA,ELKE,ACGA,ANAA,AEIA,AENA,ARLA,E8BCE,ADCA,AjBGA,ACFA,AILA,AFQA,CFHC,CQEC,AGCA,CCHL,CKFO,ADCA,AjBGA,AaFPgW,AEEO,AZCA,AhBLA,C+BACmE,ADCAxD,AjBGA7T,AGCAuK,AfNAvM,CqBKCmJ,AGCA,CPRC8F,CUOC,A5BJA,C4BICjN,A5BJAxE,CsBIC,CZDCmK,AHOAjI,ANXAM,CYKC,AZLAC,CYKCvB,AbJA,CAAC,AOUAgB,CeNC,AJPA,AlBGA,AOUAjD,ANXA,C2BKC,AZCA,CcJC,AFGAiZ,AZCArY,ATKA,ANXA,C6BEC6P,CRGC,AfMA,CeNChF,CZDCP,AkBCA,ClBDCV,AgBDzB,AEEyB,CGJC,ADCA,AFGA,CGJC,ADCA,CCDC,ADCA,AJC5BiO,ChBC6B,AGCA,CAAE,CHDA,AYCA,EAAE,GNCG,CAC/B,CHFiCjO,IAAI,CAACxK,CGE/B,CHFkC,CaF9C,AVKK,CHH0C,CAAC,EAAEwC,AGG7CqD,MHHmD,CAAC,CAAC,UGG7C,EAAC,IAAI,CAACmK,aAAa,CAAClE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAC5C,CAAC;AJJJrJ,ANPAA,ASCAA,EeIC,AjBGA,AFGAuJ,ANAA,AaVA,ATQA,EsBLE,ArBGA,ASLA,ALKAjF,AEKA,ATEA,ANXA,E2BKE,A5BJA,CYGL,ANPA,ASCA,CgBGO,A1BOA9D,AOJPkJ,AUCO2K,AhBRPzO,AmBSO,ATGA,ADXP4G,AdEO,C8BCCtD,ApBOAK,AKCAwD,CNLChF,ACID,AWHC,AfMAxF,CFHC/B,ASJA,AQCAd,CXGC,ANAAyF,ASJAV,EJAE,AeEAoR,AlBKA,CGPCpQ,ADEAA,EFKE,CDdhB,CQOkB,AFAlB,CUCmB,APPnB,CLMoB,ALIA,AiBHA9F,AhBRpBiG,AGSoBH,CCFC,AIAA,AFArBiE,AIKqB,APHAnM,CCFC,ALIAA,AWCAY,ATEA,AQbtBqO,COOuB,AbCA,CJEC,AiBHA,AGCA,ChBAC,CsBLC,A1BOA,AEGA,CwBVC,ANKAhP,AlBKAoH,CwBVC,CxBUC,CDd7B,ACc8BpE,COPCpC,AWEA,CbF/B,AaEgCwC,ClBKC,CeNC,AfMA,AQblC,COOmC,CRDC,CWEC,CXFC,AWEAT,ATGA,ATEA,CSFC,ATEAgF,IkBLI,CAAC,ETGE,EAAE,ATEA,EAAE5H,ESFE,ATEA,CSFCiQ,ATEA,aSFa,CAACnE,IAAI,CAAC,IAAI,CAAC,CAAC;EcL7EH,AjBGA6B,AKPA,EaEE,ArBGA,ACIA,AiBHA,AvBGA,AcTAnN,AHUA,AhBRA,AOUA,AELA,CmBDC,A5BJA,C4BIC,AdDAe,AQCA,AtBJA,ACDA,E8BCE,ArBGAsB,ACIA,AOTAgQ,AOOA,ATGA,CeRCmK,ApBOArR,AKCAiE,CXDC1H,CEGC,CYZC,AlBCAtE,CkBDCnD,ALKA,CAACe,AWEAkX,CpBEC,AEGA,EIHE,AQTA,CRSCtM,ANAA,AcTA1J,CLKC,APOA,ANXA,C6BGCoJ,AjBGA6B,ACFA,AEKA,ATEAxI,CuBRA,AjBGA,AGGCpE,CEVC8R,AjBCAhQ,C6BGC,AjBGA,AKPAqE,CbSC,AoBFA,AlBKA,CAAC,CwBVC,ArBGV,CqBHW,ArBGVxC,AeEUtE,CMLC,ApBOA,ANAA,CMAC,ANAAsH,AcTA,CAACoH,ADAA,AjBCA,CkBDC,AMOA,AxBNA1L,CkBDC,ADAAuP,AOOAtS,CdEC,CAACsK,AVRA,CAAC,EeSE,CLDC,AKCA,CLDCxK,CNAC,AaTA,AjBCA,CUQC,ANAA4H,AoBFA,AxBNA,CUQC,AGJA,AILAyK,AOOAiG,CfFT,CAAC,AIAUzX,CJAT,AMKU,EAAE,EFLE,CJAT2J,ALIU,ASJArD,CEKC,CXDC,AaTA,AFUA+I,CSHC,CfFT,AQLUqC,CRKTvS,AeEU,CXFC,AWEA,CfFT,AIAUgP,AWEA,EfFR,CQLW,EbSE,AaTA,CbSC,AWCA,CAAClD,EFLE,CAAC,CEKC,CAAC,IAAI,CAAC,CAAC;ELAzE,AiBHA,A5BJA,AOUA,EwBVE,ADEApH,AjBGA,AREA,AcTAiK,ALKA,AILA,AFUA,APHA,CUPC,ALKA,CJACjM,ASLAoM,AGMAgI,ArBLA,E8BCE,ATIA,AGCApU,ATGA,CeRCkJ,ATIA1J,ANIAwN,CHHC9B,AKPAsF,ATOA,ARNA1P,CIQC,AcTA,CAAC,CAAC,AlBCA,E8BCE,A1BOA,AIFA,ARNA,C8BCC,ADEP,AzBKOwE,AaTA,ATOAE,CsBLC,ADEPvD,CjBGQ,CKPC6N,CIMC,CTCC,CJAC,CqBHN,AREO9F,AbCA1M,CCFT,AoBDG,AdMO,CNLTwE,AGEU,AGGA5D,APHA,CIAC2E,AYAV,AhBAU,CaDC,AJNA,AOOVlB,CPPW/D,CbSC,CAAC,EaTE,CLOC,AKPA6S,CLOC7G,CREC,EAAEvE,CyBLN,EAAE,CpBCF,AMKU,CNLT,ALIU,AaTA,AFUA,CXDC9E,AaTA,CYIN,AZJO,CYINyK,ALGH,CfFC,ALIU,AoBFV4K,CfFC,ALIUtY,EAAE,AWCA,CHHC,AREA,CQFC,AREA,AWCA,IAAI,CAACmQ,CSHT,CAAC,ITGc,CcNN,AdMOrE,CcNNA,GdMU,CcNN,AjBGO,AGGA,CcNN,AjBGO,GGGG,CcNN,AdMO,CcNN,AdMO,CcNN;ECDlE,ApBQAJ,AiBHAgC,AvBEA,ASJA,AEKA,AhBPA,AOUA,EGRE,AoBDAhJ,AjBGAkJ,AMPAvN,ADAA,EIMEyW,EAAE,AJNA1D,AOOA,AxBNA,CqBKC1G,AtBHA1L,CWOC0K,CAAA,CEHE,AMPA,AMOA,CZACe,AFGA,AQVAnM,AGMA,AGCA6X,AzBJAnX,CAAClB,COUCsI,ANZA,C6BGN,AREOsE,CQFN/H,AXJO,CAACqN,CDAC,AjBCAtO,CYMC,AeAAgK,ANDA,AfOAtF,CMNE7C,AeADiF,A5BJA,AOUD,CWbE,AjBCA,C6BGN,A9BDOzK,AOUA,ANZAyD,C6BGN,AZJO,CUOC,C3BNC,C2BMC,A5BJA,CaIE,AZNDC,CkBDC,AnBGA,CmBHCkL,CAAC,CNOGpJ,AMPF,CMOC,CAAC3C,CxBNC,CAAC,C6BGN,A7BHOe,E6BGL,AjBGS,AYAF,CZAGnB,CZND,CwBMC+V,CKHN,CAAChL,EjBGW,CAAC,CAAC,CAAC,GYAC,SKHE,CAACzB,IAAI,CAAC,IAAI,CAAC,CAAC;ECAhE8Q,AlBIA,ARGA,ASJA,EJDElY,AoBDA,AnBMA,AiBHA,AVPA,AlBGA,AOUA,AENA,EaDEoS,ArBLA,CAAC,C6BGC,AFGA,AvBGA7O,ASJAqG,AQAA,AJNA+E,AOOA,CKHCwG,AFGArP,ANDA5J,CXICsL,AXPAjL,CKOCgH,AEGA,CFHCL,AoBHA,CGAC,AHAAuQ,AxBNA,GSIJ,AkBEO3N,ClBFNzF,AHQO,EIHE,CoBPC6X,AHIA,CGJA,ArBEN,ALKO,AaVA,AXaA,CGRN,ACKO,AXPA,AOUAvV,CwBVC,A1BOArC,CaVC,AXaA,CePC,AtBHA,AOUAoD,CuBTC,AnBMA,AGJAkG,AQAA,CQFC1N,AnBMAH,ANAA,ASJD,ETIG,ASJA,AINA,AlBGAb,COUC,CAAC,EePE,AGCA,CdGC,AcHAuC,CfFN,ACKOF,AWJA,AfOA,CAAC2F,CGRN4C,IAAI,AYCO,CZDN,CoBDQ,ALGA,AzBJA,C8BErC,ALEsChI,AzBJA1C,COUC,CAAC,EIHE,CAAC,CcHC,CKFrC,ALEsC,AzBJA,E8BG7C,A9BH+CC,I8BG3C,A9BH+C,C8BG9Cma,ALC+C,AzBJA,CyBIC,GdGG,CAAC,MmBJzC,CAACpO,IAAI,CAAC,IAAI,CAC5B,CAAC;EpBDH,AGGA2B,AGEA,ATGA,EwBVE,ADIA,AnBGAvB,AiBHA,AvBGA,AcVA,ALMA,AILA,AlBEAjL,ASIA,EgBAE,CAAC,CKAC,AFAA,ANDA,AGCA,AxBNA,C6BMC6Y,AFAApO,CvBGC3D,ASJAhB,ALCAgD,CSNC,CIKC,AJLAsJ,CPSC,AWJAsD,CXICzU,CNAC,AoBHAb,AxBNAoC,CDEC,C4BIC,AdDA,AdHAzC,C4BICwJ,AvBGA,AIHA,CICCiD,CAACjD,ACFA,AWCA,CzBJC,ASIA,CmBAC,AHAA,AzBJA1K,ACFA,C2BMCiL,CfCC,AREA,AiBJA,CXIC,AWJA2B,AJLA,CYMC,AjBCA,ACFAxC,CgBCCtJ,AZNA,ATMAsJ,CEGC,AiBHA,AvBGA,CuBHC,AvBGA3C,AiBJA,AtBHA,CsBGC,AtBHA,EWOE,CAACiD,IAAI,CAACO,ENAE,CAACnD,EyBHE,AnBGA,CmBFrC,MzBE4C,ASJb,CgBExB,AhBFyBoC,ALCA,CJGc,AIHbG,CqBEjC,IAAI,AhBHkC,CgBGjC8P,AhBHkC,CAAC,ITIiB,CAAC,EIHX,CAACja,EqBEhC,ArBFkC,CqBEjC8L,ArBFkC,IqBE9B,CAAC,IAAI,CAC5B,CAAC;EpBHH,ACIA,AiBHA,AZGA4B,AhBPA,E+BAE,ADOA,AjBFA,AREA,AcVAhK,ALOAqD,ALAA,ESNE,AjBAA,CkBDC,CYGC,ADOA,AXVAgI,AGMA,AGCA,CMJCuK,ADOAM,ArBHA,CICC/L,CREC,ASHA,CAAClG,AQDA,AJLA,AOMAtG,GfDG8J,ALIA,AIHArL,CJGCkI,AiBJA,CAACyO,AGCA,CAAClN,EMJE,AfOA,CHFC,ACDA,CWAC,AhBAA,CsBJClJ,ADOA,AXVA,AHUCmK,CcAA5J,AjBFA,AMRA+N,ALOA,CKPC,CAAChL,AVOAoG,CgBAC,ATGC,CHFA,CHFCoB,AGEA5F,AREA,AiBJA,CZAA,ALIC,AcVA,CYGC,AZHA,AGMA,ANIE,CePD/E,ArBGA,EDCE,CJGC,CQFC,ACDA,ALAA,CICCyB,AREA8F,GyBAG,ALHA,CKIlC,CzBDoC,AoBHA,CpBGCE,G0BPG,A1BOA,C0BPC,A1BOAjD,CyBClC,EACP,AjBJ4C,CAC3C,ARC4C,CAAC,CAAC,CyBE3C,CAACmV,IjBHG3P,EkBN+C,CAAC,ClBM5C,CAACxK,EAAG,GiBGG,CAAC8L,IAAI,CAAC,IAAI,CAC/B,AjBHA,CiBGC,AjBHA;EFEHZ,AiBHAqC,AvBEA,AcVA,AnBIA,AOSA,EwBVE,ArBGA,AoBOA,AjBHA,AGAA,AfTA,CAAC,CaMC,ALAA,ARNA,E8BEE,ADUA,AjBHAM,AKVMyF,CaGL8F,ADUAW,A9BTA7Y,CUECuD,AICAO,AQDA,AGCA,ATGAoL,ELCElF,AOXM,ATONpL,CEIA,AVVCuB,CaMC,AQDA,AGCA,CdIC,AWLAoV,AGCA0B,CfDC,CICCpR,CEGC,AfTA,CSKC,AGIA,AeFAwG,A5BJArM,ASGA,CmBCCsJ,A5BJD,ASGCtC,ARNA,C8BEC,AlBOA,AGAA,ChBNC,CUEC,CqBHC7H,ArBGAkE,AkBEA,AdDA,CgBMC,AhBNA+C,AEGA,CcGC1G,AFLA,AZEA2E,APHA,CaDC,AbCA,CaDCmH,AbCA,GKAG,CiBJC,ATGA,CSHClM,ATGA,ANIA,CAACyB,CSHC,CAACE,IfDI,CAAC,CAAC,AoBOA,CACpC,ELPuC,CAACC,CMJC,AfOA,CePC,AfOC,CSHA,CKOpC,ALPqC,EKQ5C,GdLiDoI,CcK7C,CAAC4P,ALR8C,CAAC,CTGC,CAACpa,EAAG,CePA,CAAC,AfOA,CAAC,QcKtC,CAAC8L,IAAI,CAAC,IAAI,CACjC,CAAC;AXfL,EdWE,AEEA,EwBVE,ArBGA,AoBUA,AnBLAlB,AiBHA,AZEA,AhBNA,ASGA,EIGEiD,AZTA,E8BEE,ArBGApJ,AoBUA,AFRA+F,AvBGAtC,AiBLA,AJPYtF,AOQZ,ATGAwN,CePC+I,ADaAkB,ALTA,GGCG,CAACra,A3BPA,CSKC,ALKAkI,CuBHC,AvBGAN,AoBJA,AlBMAO,CGPC,AMIA,CHAC,AZTA,CYSCjG,AGAA,EePE,AHKA,CrBKCiG,CAAA,CwBVE9H,ADaA,CFRC,AvBGA,AEEA,CqBLCmK,CEQC,AzBLAxK,EAAE,CQDC,AeFA,CEQC,AFRAA,AvBGA,C0BRC,ADaAmZ,CCbC3Y,AlBOAgK,AFCf,AiBHe,CjBGdU,CiBHgB,EfEE,CAACH,KiBMK,AjBNA,CiBMC9I,AnBLf,CAAC,EoBRiB,CAAC,CpBQd,CAACuI,IAAI,CAAC,EmBKiB,CAAC,ICbI,CAAC,MDaM,CAAC;AXhBpE/H,EYIC,AtBIA,EqBSE,AjBNA,AFCA,ANAA,ALPA,AOSA,ANZA,ESKE,AkBEA,AdDA,AQDA,AJRoB,AFYpB2N,CGXL,AGOM,AJRoB,CPanB,AQZPgF,AGOO,CXKC7P,CiBHC,AvBGAwC,AaboB,AOSpB3G,AzBHAD,AOSAuI,CqBLCgC,ElBFE,CMIC,CXCC,AWDA2E,CLCC,AOboB6C,CPanB1Q,AcJA,AlBMA,CFFC,AoBJAnB,CfDCgJ,AkBEA,CAAC,ArBKA,EYdnB,ADDyC,CPanB,AOboBkJ,AOSpB,CdIC,AiBHA,AvBGA,AoBJAlS,CdIC,AiBHAwX,ATTxBzD,CZcyB,CWfqB,CbanB,AaboB,CRQzB,ALKM7N,AaboB,AOSpB,ATGA,CNJLtE,AeCM,ATGA,AhBNA,AOSA,CAACoE,EGPJ,AVFMjG,AOSA,CGPLqD,AHOM0D,GqBLG,CAAC,CTTrC,CTOiC,ALKM,ALPA,AOSA,CGPL,ALKMP,ALPAvG,AOSA,IAAI,CPTC,AOSAuG,IFFI,EAAE,GEEG,CAAC,OFFO,CAAC;AIHhE,EsBHEiV,AlBMA,AFCA,AVVA,ESKE,AoBUAxc,AFRA,AvBGA,AEEA,EONE,AQDAwW,AJRA,EIQE,AGCA,ATGAvG,CMJC/N,CRCCgM,AITA+E,CbaC,AEEA5J,CuBGC,CAAC9I,CZlBC,CbaC,CAACoH,AabA,AFYA,EFHE,AEGA,ATGA,CwBTC6U,AxBSAlT,CwBTA,ATEC,CRCC1J,AQDA6W,CSFC,AxBSA,CePC,AfOC9R,CePA,CRCC,CAAC9E,AEGA,CTGE,EuBGC,AzBLA,CyBKC,AzBLA,CEEG,IONE,APME,COND8E,ETIE,CyBKC,AvBHE,CFFD+C,ASJA,APME/C,CuBGAnE,ChBTA,CAAC,CAAC,APME,CFFD,AEEE,CuBGA,AzBLDqH,AEEE,IuBGI,EzBLA,CAAClI,EAAE,CAAC,CAAC;AMCzD,AFLCyC,EIKCiL,AeHA,AvBGA,AEEA,ANXA,E8BEE,ArBEA,AYAA,AtBFA,CsBEC,CQUC,ARVA,AGCA,ChBDL,CSRO6E,AFYAhC,APJPlG,CRJQzG,C8BECkZ,ADYAxC,CpBVC,CDAV,CsBFY,AfMA,CcMC,AZlBA,CRQC,AQRAvT,AFYA,APJdsD,ARJczG,C8BEE,ADYD2W,A7BdA1W,GQIf,ARJkB,CYSC6J,CAAClD,AZTA,CiBJC,AFYA,EcME,AZlBAgI,CLaC,EAAE,KKbK,CAAC;AaOjC,ApBMC/P,EDJC,AkBGA,AvBGA,EQDE,ASLA,AGCA,AzBHArB,ACFAsB,CwBKC,CKUC,AhBVA,AWAA,CdGL,CECO,AFDP6I,AiBDOyN,AvBGA7Q,AiBNA,AJRAkL,AFWgB,CMHfjT,CQWCS,C9BbC,CaOC,AbPAQ,ACFA,CYSCmJ,AZTA7H,CIUCwF,C0BRCzF,ADaA,AzBLAkF,CyBKC9G,A7BfA,CYSC,AbPA,ACFA,C2BOCkY,ANHA,CQWC,AjBNA,AeFD,ANHCzW,CXIlB,AXNmB,C4BKC,AVXA,CjBIC,CUQrBgJ,CmBOuB,AzBLA,AadA,AjBIA1H,EIUE,CJVC,CiBJC,AjBIA,EqBIE,CAACgT,CtBFQ,C+BAhB,ATEU,CSFT/S,ATEU,CQWC,AnBPlC,EmBOoC,KCbL,CAAC,CAAE;AACnC,ErBGE,AYDA,AfOA,ANXA,E2BOE,AvBGA,AoBLA,EZIE,ACJA,AdJiC,E8Bc/BwW,AFRAvP,AVXA,AOSA,ATEAyF,CNFCjM,AeAAkT,CpBKC1P,ASLAyG,EgBUE,AjBNAV,CeFC,CdFC,AEEA,CeLCpL,ADaA,AzBLA,ALTwBpB,C4BMvB,AZAA,CFFC,CTKC,AoBLA,CKUC,ALVA0K,AzBJoB,C8BcnBqO,AFRA,CAAC9U,AdFAkJ,CdJkBlN,EKSf,CKLCgD,AIAA,AEEA,CNFA,AIAC,AWAA,ATEC,CFFAgK,AWAA,CfAC,AkBEA,AvBGA,CuBHCrM,AvBGAqF,EQDE,AbRQ,CAAA9H,C+BChB,ANGU,CMHT8D,ADaU,AjBNA,CCJC,CAAC,CgBWxB,CjBP0B,ACJA,AdJC,CaQAgC,CkBPT,AHKU,AvBGA,ALTP/D,C+BCF,ADcf,AFTyBsP,AvBGAlJ,C0BRR,ADchByS,E9BfoB,C4BMQ,CfEC,AeFA,CfECpY,AeFA,GvBGG,CLTbR,CKSe,IyBMrB,A9BfM,C8BeL+Y,A9BfKlZ,GaQuB,CACnD,AbT4B,EKS0B,CAAC,ALT3BI,IAAA,CaSrB,IAAI,CAAC8I,AbTgB9I,C8Bea,GACtC,AjBPa,AbTY,CaSX1B,EAAG,AbTQsB,C8BgBrB,CAAC6X,AjBNX,CAAC,CbV8B,EAAAzX,IAAA,G8BgBT,CAAC+Y,iBAAiB;ACd9C,ATEA,AfOA,ENVE,ESIE,AkBEA,AvBGA,EQCE,AKfA,AOSA/X,ATEA,CAAC,CcUC,AFVAqI,AdHgChL,AEGhC,AhBPyByB,CCCxBsC,CYUCgK,CHNCpL,ALKA,CyBOC4X,AhBbgC,AdJP,C4BOxB,A5BPwB5Y,C4BOvBjC,AdHgC,CiBF/BiD,A1BQA,CyBOC,AzBPAsF,CLVqB,ACCpBlE,C6BgBC,A7BhBD,E2BMG,A3BNA,CDDiBvC,GyBKvB,CGEW,AHFVwC,CGEW,EAAE,ClBFT,AGMU,ARDA,CKLTd,ALKU,ALVO,CaWN,AbXMvB,E+BEd,ArBGA,AeAA,CMHC6C,ArBGA,AeAA,CzBLa,GKUC,AoBLV,CAACkT,CpBKW1P,KAAK,CAACI,EoBLR,CfAC,AeAAyO,CMHC,ArBGA,CqBHC,CAAE,A1BQS,CAAC,CAAC,CAAC,KoBLL,CAAC,CAAC,CAAC;AMFrD,ATCCnU,AfQD,EGNE,ALKA,EoBLE,ATEA,AfNA,CwBIC,CGECsI,AdJ2D,AIN3D,AOQA,AzBN+B,CcI6B,AQAjE,CTQO+C,ACR2D,AQAlEwI,EQcS,CFVC,A3BNA5T,CqBEV,AJNW8Q,EYoBE,AFVA,CGLCvT,ATCdqW,GQciB,AFVA,CGLC,ADeA+D,AFVAxB,ANJlB,ArBFkB,C8BCC3Y,A9BDA+C,CiBJC,EjBIE,CiBJC,AjBIA,GYUG,CAACd,AKdAsR,CaKC,CAAC/Q,CHKC,A3BNA,CAAC,C6BgBC,EACrB,EjBPyB,CAACF,CiBOtB,AZrBuB,CYqBtB6X,AZrBuB,CAAC,CAAC3G,ELcE,CAAC,GkBTP,AbLU,CaKTtP,AbLUxB,KYqBlB,AZrBuB,CYqBtBT,AjBPuB,AKdA,CLcC,QiBOf,CAACK,EChBe,CAAC,CAAC,CAAE,CDgBb,CAAC,OAAO,CAAC;ACfzD,AxBSA,CwBTC,CrBIC,ALKA,AWJA,AfNA,CeMC,CSFC,EZME,AeJA,AdJA,AINA,AlBEA5C,EKYEwI,AoBNA,CAAC2P,CKaCuC,AFXA,AdJAzW,CcIC0B,CVVCoO,CbcCvL,ASRA,CgBeC,AzBPAR,CKLCwD,AoBYAjJ,ChBfCuB,CINC,CUUC,CAACvB,AdJA,AWEA,CXFCuM,AINA,AOQA9N,AzBNA,CkBFCwS,AlBEApS,EKYE,CyBOC,CAACoB,AzBPA,ALZA,CAACZ,E8BmBE,AFXA,ClBDC4J,AoBYA,AFXAhJ,ClBDCoI,AVPA,CAAC,C4BQC,AVVA,CUUC,ClBDC,CIHC,AINAgJ,CRSC,AoBYA,AhBfAhF,AWEA,CKaC,ALbA,GGEG,AdJA,CcIC,AdJA,GING,AOQA,EPREoF,AOQA,IAAI,CPRC,AOQA5S,CPRC,GOQG,CPRC,AOQA8K,CPRC,GOQG,CAAC,IAAI,CAAC,CAAC;AlBOnE,ESHEiE,AfNA,E8BAE3O,ArBIAsB,AGKA,AeJA,AvBIA,AoBNA,CGEC,CdHC,AIPA0Q,AlBEA,EyBME,CAACgF,AxBHArU,C6BgBC,AzBPAgE,ASPA4G,CiBFC,AHKA,AdHA,CiBFC1J,EDgBE,AhBdA5E,AEIA0P,CeNC,ADgBAsK,AzBPA,AWHD,CeNEyC,CbLC,AFWA,AfNA/Y,CISC,AJTAC,C8BAC,CAAC,AbLA2P,ERSR,AIFU,CJETnP,AIFUoK,AbFA,CISC,CadC,AjBKA,CiBLCiF,EbcE,AoBNA,CKaC,AzBPAtM,AadA,AOQAjF,CPRC,CAAC,CYqBCgY,IAAI,AhBdA,AWCA,CKaC,AhBdA,CgBcC,CpBZT,AeDU,CfCT9P,ALKU,ASPA,CTOC5C,ASPA,GJEP,CAAC5H,AeDU,EfCR,CAAC,CeDW,CpBMC,AoBNAwY,EpBME,WAAW,AoBNA,CpBMC,AoBNA,CAAC;AlBOjE,EwBTE,ErBIE9T,AGKA,ARAA,AoBNA,ATGA,AfNAhC,E2BKE,AdHAiM,AINAgF,AlBCAxS,CcKC,CAACwC,AWCA,CAACtB,CKaC,AjBPA0L,AeJA,AZCA8B,CYDCtK,AvBIA,AabA,CJMC,AINAkH,AjBIA,CAAC9J,C6BgBC,CAAC0X,AzBPA,ASPAxW,CJEN,ALKOmE,AJTA,CSINjD,ATJO,C2BKC,AdHA,CcGC5C,AVTA,AFUA,CEVE2R,AOOD,CfCN,AeDOxR,CfCN,AMEOjC,EHGE,AKbC,AjBID,EDHE,ACGA2D,CYSC,AbZArC,C4BQC,AVTE,AOOF,CKaC,AFXAa,AvBIA,CyBOC6N,AzBPA,AWHA,CHGC,AYNA,ATGA7P,AfNA,CYSC+E,AbZA,ACGA,CDHCnE,E4BQE,ClBDN,AkBCO,CHFC,CfCNoJ,CGKQ,CAACvI,AbZA,CKYC,AoBNA,CfCN,AeDOlB,AzBNAS,CUON,AkBCO,AvBIAuG,CyBOC,AFXA,CEWC,AdVA,CSHC,ATGA,AhBTA,CyBMC,AzBNA,CKYC,AoBNA,CpBMCK,IQAI,CAAE,ARAD,CAAC,CAAC,CAAC,CWHC,CAAC,GHGGoC,IAAI,CAACxK,EAAG,EAAC,CAAC;EkBPtE4L,ArBGA,ALKA,AoBNA,AlBMA,ANTA,EYSE,AeJA,AZCAiE,AhBTA,CAAC,CcKClB,CAAC,CiBDC/C,AlBQAmC,ACPAc,AINA,CaKA,EAAG,CDeCyB,CdVC,CEVCyD,AFUA5R,CTGCyH,COPC,GAAG,CgBcC,EAAE,AjBPA,CGHC,CHGC,AGHAuG,EEVE,GAAGlQ,CYoBC,AdVA,CAAC,EEVE,AXaA2J,CWbCvG,AXaAwG,KOPK,AINA,AFUA,CEVCiK,AFUA,GTGG,CWbC,CAAC,AXaA9T,EAAE,EAAE;EGH/C,ALKAgI,AoBNAhH,AzBPA,ACIA,E8BAE,AHIA,AZCA,ATGA,EMAE+M,ACPAY,AWEA3N,CXFC,AWED,CMHE,AjBCA8N,AINA,AFUA,CeLCwN,ANGA,ATEAxM,AfLA7L,C2BICuG,EEWE+F,AZpBAuD,CJMC,CcGC,AdHA,CJGCtP,ALKAwD,ASRA,CiBDC,A1BSAjI,AadA,CaKC6L,ADeA,AFXA,AVTAkF,EYoBE,CjBPC,ARCA,AWJA,CHGC3O,AKbA,AFUAsO,CXIC1J,AadA,CaKC,AHIA6D,AVTA,CaKC,A9BAA3G,C8BAC,AbLA,AjBKD,CeKE,CAAC,AfLA,CeKC,CXIC,CQDC,CHJCO,AGIApC,ARCA,CKLCqC,EGIE,CAAC,GHJG,EAAE,KGIK,CAAC,KeJV,CAAC0G,cAAc,CAAC,CAAC;EZEnD,AhBRA,E+BGE,ArBIA,AGIA,AeJA,AvBKA,AoBNA6L,AlBKA,ANRA,EaCEtT,EiBDE,AHIA8G,CGJC+R,AjBCA,AdJA3a,CUOC4I,AoBWA,AhBdAuE,AINA,AXaAxH,CuBOC,AzBNA,AJTA7E,C6BeC,AFXA,CEWC,CpBXC,AoBWA,AFXA,CvBKCkE,E0BTE,ArBIA,CqBJCgF,ANGR,CAACqL,AxBHQ,CAAChU,CMQC,CFCC,CKLCoH,ALKA,AoBNR,AxBHQ,C8BAC,A1BSAxD,AoBNR,AlBKQ,ANRA,C8BAC,AjBCA,AWER,CMHS,AjBCAhD,GAAG,CAAC,APOA,CFCC,ALZAjC,CAACP,CUOL,ALKMyF,CKLL7D,AHIM,CAACsE,EGJJ,AVPM,CUOL9C,CLKO,ALZA,ACGA,CAAC,ISIF,ALKM,CKLL,CHIO,CAAC,UAAU,CAAC;EwBPxD,AfMAuL,AfNA,ESIE,AGIA,ACPA,AWEA,AzBNA5O,CcIC,CcGC,AvBKA2F,EKLEyD,AoBWA,ALZA,CAAC4L,CPRC,ClBEC,CUOC,AkBAAxL,A5BPA/I,CKYC,CKLC,ALKA8F,AadA,CAACqM,AFWAhE,CAAA,ChBTE,CgBSC,AhBTA,CyBMC,CAAC,CAAC,EpBME,GAAG,MAAMnJ,ALZA,CkBFC,AlBEA,CkBFCkN,KbcK,CuBLd,AvBKehN,CuBLd8D,KVToB,CbcC,AadA,CbcCvD,GuBLZ,CAACkD,EvBKiB,CAAC,CuBLd,EAAE;EGFzCmB,ANEA,AxBFA,EYOE,ACNA5E,AEIA,AhBTA3F,AOWA,EGJE,AoBWA,AzBLA2F,CyBKC,CjBPC,AeLqCgE,CfKpCP,AZPAtG,CiBNCmO,CJOC,AdLA,CUOC,AIFAnL,AdLA7F,C8BkBC,AjBPA,AREA,AWJAqP,CXICxJ,EKNE,AGIAsD,CHJCY,AoBWAvK,A9BlBA,CAACQ,CcKC,CiBDCsK,AlBOA,AKbA,CaMA,A1BSC,AafA5E,CYoBC,AhBbA,CiBDC,ADcAjG,A9BlBA,CKaED,ALbD,ACIAqD,CeKCwM,AfLAvM,C6BcC,AdTAwM,EEXE,CbeE,CafAoD,CRSC,AoBWA,CpBXCvJ,AIFA3J,AEIA,CXIG,CWJD,ENFE,CAAC,AIFA,AbDA,EaCE,AbDA,C6BcC,EAAE,AZpBA,CAACf,OAAO,CAACW,OAAO,CAAC;ELczD,AYJA+X,EMHE9T,ArBGA,AVPA9E,AOWA,ANPA,E2BC+C,AdA7CwB,AEIA,CYJ8C,CEa5CmZ,AFb6C,AvBQ7C,AafA,AjBMApW,EMOE2F,GONG,AEIA6G,CXICtP,ASRAA,CWECmX,AlBIA,CwBPN,ADcO,ALXD,CMHL7T,CNGQ,AzBPA,AOWA4C,CuBOC,AzBLA,ASRA,AEIA,AhBTAvG,CcKC,AEIA4P,AfLA,EISG,C0BTP,ADcO,A9BlBA,C+BIN,ADcOyJ,A9BlBAhZ,CCIC,EeKE,AfLA,CeKC,ChBTC,AOWA,ANPA,CDJC,AOWAyI,IFEI/J,CEFC,CAAC8J,EwBPL,ADcO,AzBLC,E0BTN,CDerB,ChBd8B,EiBDL,AjBCOhJ,CiBDN6M,ADetB,AvBR6B,CuBQ5B2M,AvBR6B,GONG,AEIA,CFJClT,CEIC,KFJK,CAAC6H,AEIA,CAAC,CAAC,CcU5B,AzBN6BnO,AWJA,CcU5B6Z,ECfwB,CAAC,C1BSQ,CAACvT,ASRA,CAAC,KTQK,CAAC9F,KAAK,CAACvB,IyBMzB,GAC1C,AzBP2E,EAAC,EyBOxE,CAACqZ,WAAW,CAACwB,gBAAgB;EpBZ3C,AGKA/O,AbZA,E+BIE,AHCA,AdAA,AWEA,ATEA,ATEA,CqBNC,AdAA,CIPC,AjBMAzH,CiBNC,CYsBC,AjBRAyH,ARCA9E,AafA,AOSA,CZKA,AYLCkQ,ClBICjQ,CMCC,AePA,CEeCwT,EzBPE,CAAC,EEFE,CNPC,CISC5T,CyBOC,AvBTAmD,CNPC,C6BgBC,CLbP,CpBMS,AoBNRvG,CpBMStD,AEFA,ANPA,CMOCkI,GFEG,CAACjI,AoBNR,CAAC,CAAC,AlBIQ,CAACF,CkBJP,ClBIS,CAAC,GFEG,CAACqB,KAAK,CAAC,CAAC,CAAC;EKJ9C,AIHA,AdJAL,E+BGE,AlBQA,AKdA,AFWA,ATGA,ANRA,E2BCE,AvBQA,AoBNApB,AzBNAoB,CKYC,ALZAlB,C+BGC,CAACwZ,CDgBC,AjBRAtL,AGHA6C,CTGC,CqBPCjG,EEeE,A9BnBA,CUOCS,AMCA,ATGAzE,CPXC,E8BmBE,AdXA8J,CcWC2J,CChBC,CAACzZ,CxBQC,CMAC,ANAA,CAACiG,CGJCwE,CAAA,AGICT,EHJE,EMCE,CAAC,ATGA,EuBQE,AvBRA9D,EuBSrB,AdZuB,CSFf,ATEgBgJ,CeLC,ANGhB9O,CMHiB,CDiBtB,AvBTuB,CuBStBqZ,AFhBQ,CAACvP,AHED,CAAC,ElBKkB,CwBRC,EAAE,AfKA,CAAClI,GeLG,AHCf,CGDgBma,AHCf,CZIgB,CcYtB,AjBTQ,AGHejM,CcYtB3O,AjBTQoC,GGHkB,CAAC,CAAC,CAAC,CAACqM,CeLC,CAAC9E,ADiBvB,CAACtJ,GCjB0B,CAAC,AfKA,CAC/D,CcW0C,AjBTQ,CiBSP,AjBTQ,CkBRgB,AlBQf,CkBRgB,CAAC,CfM/D,EACN,CcUkD,CAAC,EdTrD,CAAC,WSLyE,CAAC;AXD/E,IiBDI,ArBIAE,AGIA,ARCA,AadA,AOQA,ATKA,AhBXA,ACGAA,CISC,AoBNA,CpBMC,AEDAqE,EwBRE,AlBQA,AeR+BgE,AVL/BqI,CaKCgG,AlBQA7T,CiBSCgV,AdTAxJ,CSLC,CxBHC,CMQC,ANRApO,CMQCgF,EMAE,AZRA,CYQCsF,AZRA,C6BiBC,CAAC9K,AZtBA,CAAC2O,CaKC,CAAClQ,ArBIV,AMIU,CNJT4D,AHIU,CWbC,CAAC,AFaAqM,CHAC,AKbA,AXaA,EuBSE,AZtBA,CYsBCzO,AjBTA,CGAC,CHAC,AGAA3C,CcSC,AvBTA,ANRA,C6BiBC,C7BjBC0E,GeQG,CeRC,CAChC,ArBGuB,CAAC,AoBaU,AdTA,CcSC,AdTA,CAAC,CAAC,CNJT,CAAC,CTJW,CAAC,E8BC/B,EACV,IAAI,CAAC6Y,cAAc,CAAClR,IAAI,CAAC,IAAI,CAC/B,CAAC;AjBFJrJ,EiBGC,A1BMA,AJTA,ESIE,AGIA4H,AGAA,AhBXA,E4BEyC,AVJvCgI,AOQA2E,CGJwC,AdC7C,CgBiBO,AFlBuC,AdC9C7I,APQO,EGJE9D,AMIA2G,AhBXAlP,IaWF,CAACqG,AGAM,AhBXA,CkBFC,CAACpB,CFaC,AhBXA,EUOJ,AeDF,CfCGqB,AGIA,AYLF6O,CZKG,AGAMhG,AhBXA,CaWL,AbXM1Q,CaWL8M,AKbM,COQP,CfCG,AQTM+F,AOQR,CfCG,AIJpB,AWGkB,CfCG,AGIA,AGAM,CHAJnF,AGAK4C,CFR5B1C,CdH8B,CAACpM,EaWH,AGAK,EAAE,CEbC,CLaH,AKbI,CFaC,CAAC,CAAC,AhBXA,CgBWC,AhBXA,IAAI,CAAC,EcG9C;ATUD,E0BLE2L,A9BHA,ESGEhJ,AkBLA,AVJA,AOQA,ATKAtD,EHAE6M,EiBSE,AvBTA,CNPC7J,EYOE,AGAA,CcSC,AjBTAqI,AGAAxH,CcSCoV,CvBTCtQ,CSAC,CNJN,AMIQ,CNJPhF,EGIS,CkBJC,AlBICyF,CHJP,CAAC,AHIO,CwBJEA,ClBIC,CNAAzD,CSAC8J,CeJE,ADaD,A7BhBAzM,CYOG,AZPH,E6BgBGmW,A7BhBA,C8BGG,AfID,CTAA,CSAC,ATAAjT,CSAC,ENJL,CAAC,CoBaQ,CAAC,AvBTA,CuBSC,AvBTAqC,GAAG,CAAE3E,IAAI,IAAK,IAAI,IAAI,CAACA,IAAI,CAAC,CAAC;AFCpEvC,EKJC,AkBLA,AVJA,AOQA,EMCE9B,AfIA0J,AhBXA,ACIA,GIOH,CyBSO,AjBTA,ARAPhE,AEAOQ,EwBJE,CAACoW,A9BHAva,C6BgBC,CAAC2X,CjBTC5O,AGAN,CAACtD,ATAM,CFAd,AEAe4B,EwBJE,CAACmT,A1BIlB7W,AJPkB,CAACpD,CeOL,CHAO,AGAN,CAAC,AfPM,CeOLoK,ATAM,ANPA,CYOC7C,ANAA,EuBSE,AzBT1B,C0BJ2B,ADaA6F,AdTN,CeJO,AlBIA,AGALpC,CeJM,AlBIAjO,CkBJC,ClBIC,CkBJC,CfIJ,CeJM,EAAG,AlBIDgO,CGAH,IcSQ,A7BhBA,C6BgBC,A7BhBA,I8BGIxD,GlBIG,CkBJC,CAACxK,EAAG,EAAC,CAAC;ArBCzD,AkBLA,EGKE,AbRAiU,AOQAoE,AxBHA,C8BGC,C/BPC,EgBWE,ATAA,CWZCpE,AXYA,CMAC,AKZD,EYqBG3D,AZrBA,AlBCAtO,EaWE,AGAAkP,CHACvD,CYJC0K,CAAA,EAAG,CKaC,CdTC,CcSC,EdTEpK,CHAC,CAACzD,GGAG,CcSC,AjBTA,AGCnB2G,ChBZoB,CaWC1F,EbXE3J,EgBYjB,CAAE0I,EhBZoB,CaWC,AbXAvI,CaWC,AGClB,IAAK,QhBZyB,CAAC,eAAe,CAAC;AUOnEQ,AkBLAA,EGOCsa,A9BHA,EiBNE,AOQA,AzBPA,EaWE,ANAAhW,CGLL,AGKM,AeVN,ClBKA6D,AGKO,AeVPgO,AVFO,AOQA,ATKE,AhBZF,CyBOCZ,AzBPAhW,ACKAqC,C6BeCkM,EZrBE,AFaEa,CeJD,AbTAe,AXYA,CAACjL,CuBSC,CCZC6V,CAAA,ADYC,AFnBhB,AHMgB,ATKE,CSLDna,EGNjBgW,AZWqB5H,CNNrB,AHKoB,CwBHC,CNDC,CfDtBpG,AHKuB,CSCG,CSLDlI,ATKE2O,CfPDhN,CiBNC,AlBCA,ACKAC,C2BJ3B,CVF6B,AFaE,AhBZF,AOWA,CSCGkG,IAAI,CAACO,CNNrC,IMM0C,CAAC,CfPD,CwBET,CAACxH,AxBFU,MwBEJ,CAAC,CAAC;IMEvC,ANDA,AxBFA,EYME,AKZA,AlBCAnC,E+BQE,ADYA,AdRE,ATDF0F,ANNAxC,C8BGCkY,ADYA,CAAC,AjBTArQ,AKZA,AOQA7H,CKaC,AZrBA6N,CYqBC,AdREpB,ChBZD,CAAC1P,AOWA,CAAC0F,GwBHG,CAACkN,A/BRA,CAAC,EOWE,CAAC5S,ANNA,C8BGC,AfIE,CeJD,ANDA,CMCC,AbTA,AFaE,CEbD4S,COQCvR,AlBIA,ANNA,CMMC,CNNC,EiBNE,AjBMA,CiBNC,CLYZ,AKZa,CLYZ,WYJc,CAAC0B,KZIE,CAAC,YYJe,CAAC,CAAC,EzBPY,CAAC;I+BSlE,AlBGA,AKZA,AOQA,CZIC,CiBSC,AjBTA,AbXA,AOWA,ANNAE,CMMC,CwBHC,ANDAA,CMCC6Y,CfIG/L,KAAK,IeJE,CAAC,AfIEJ,CeJD,A9BHA,EwBEE,CxBFC,CwBEC,ATKE,CAACK,EfPA,EeOI,CAAC7G,IAAI,CAAC/J,OAAO,CAAC;EHA5C,AKZA,EaSEW,ADYA,A9BpBA,AOWA,ANNA,C6BeC,AvBTA,CuBSC,ALbA,AlBIA,ESCI,ESLA,CMCC,ANDA+W,CMCClT,GAAG,CAAC,eNDe,CAACrC,CMCC,CAAC,GNDG,GAAG3C,IAAI,CAACC,SAAS,CAACoE,eAAe,EAAE,CAAC,CAAC;EMExE,ADYA,AjBRAqJ,AKZAqG,AXWA,CwBHC,CNDC,AxBFAtR,IeOM,IHAEiL,AZPA,CYOCnD,AZPA7H,EeOIyO,CfPD,CYOC,AZPA,EYOE3F,CKZCuI,AFYE,CEZDhP,IAAI,ELYE,AKZA,ELYE,MZPM,EAAEV,eAAe,CAAC;E8BKnD0Y,ADYAhD,ALdA,AxBFA,EYOE,AKZA,AlBAA,EgBYI,CAAC,CEZD,AFYE,CEZDhV,AFaA2E,CHDCuE,EGCE,CEbC,AFaC1D,CEbA0J,EaSE,CfIE,CcQA8F,CCZEnZ,ADYDf,EdRI0K,CHDD,EkBHG,ClBGA,AGCE,CcQD,AdRExK,EeJE,ADYF,AZrBA,AFaE,CHDDuL,AGCE,CEbD,yBLYW,CAACf,IAAI,EAAE,IAAI,EAAEiB,QAAQ,CAAC;AYJ/D,ElBIE,ANLA,E8BGE,ADYA,AjBTA,AbZA3J,EkBAE,AFaA,EeJEjB,AlBGA,CAAC0E,AbZA,ACMAhB,C6BeCpE,AdRA,AhBbA8B,CgBaCsD,EeJE,CAACzE,CDYC,CjBTC,CkBHC,AlBGAyB,CiBSE,AdRD,CAAC+J,GeJG,C/BTC,CAAC,CCMC/H,CAAA,EYMG,AZNA,C8BGC,AlBGA2J,IkBHI,CAACrN,ADYAf,CdRC,CAAC,GeJG,CAACsd,CDYC,AjBTA,CiBSCpd,AjBTAuF,EiBSG,EAAC,C9BrBC,C+BSC,A/BTA,CaYC,AbZArD,C+BSC,AlBGA,GGCG,CAAC,CAACuK,KhBbK,EgBaE,CAAEC,AhBbD5M,IgBaK,GhBbE,CgBaG;ASNxE2C,ElBKC,EuBUE,AjBTA,AKZA,AlBCAT,ACKA,E8BGE,CNHL,CAAA8V,ATOO,EeJE,ADYA8C,CCZCyC,AlBGAnP,AZNAxL,CeOCwO,EcQE,CvBVClH,EuBUElK,EdRE,AfPA,CeOCwR,AfPArO,CMKC+G,CwBFC,ANHrB,AlBKoB,CwBFE,AlBGA,AbXA,ACKA,C8BGC,ADYA,A9BpBAhK,AOUA,ANLA,C6BeC4a,ALfxB9C,CzBLyB,EgBYE,CcQC,AdRApL,AhBZA,IgBYI,AhBZA,CgBYC1H,AhBZA7E,IgBYI,CSPrC,ATOsCH,AhBZA,ACKA,CDLC,ACKA,CeOC,AhBZA,CgBYC,EAAE;EHA1C,AZNA,E8BGE,ADYA,AZrBA,AlBCA,AOUA,IAAIuH,EuBUE9G,AdRA,OcQO,EvBVE,CuBUCX,EvBVE,KuBUK,CAACW,AvBVA,IAAI,CAAC4G,EuBUE,AvBVA,CAACE,WAAW,CAAC,IAAI,CAACK,SAAS,EAAE,UAAU,CAAC;AME3E,EkBHE,A9BFA,C8BEC,CDYC,AZrBA,AlBCA,AOUA,IPVI,AOUAG,CNJCvD,CiBPC2P,AFaAzH,EhBZE,CAAC3M,AOUA,CSEC,CAACoC,CTFC,CPVC,EAAE,GOUGoF,ESEE,CAAC/E,AfNAgC,CAACC,KeMK,CEbC,AFaA,AfNA,CMIC,CAAC8C,ANJA,CiBPCvC,IAAI,CAACkP,AFaA,CAAC,ITFI,CAACpM,QWXQ,GAAG,AXWA,CAAC,EWXE,EXWE,CAACF,SAAS,CAAC;AMCxEnF,EkBDC0a,EDWE,AZrBA,AXWA,ANJA,EDNEnb,CaUL,CAAAoL,AGEO,AfNA3I,CeMC,CcQClE,AZrBA6T,CXWCrM,CwBDCoV,CAAA,C9BHE,C8BGC,AfGA,CHFd,ANAe,CAAChV,CuBUC,CjBVjBiF,AZJkBjK,E6BcE9C,EvBVE,CAAC,CPVC,AOUA,CPVC8B,CaUzB,CZJ2B,C6BcC,CAAC3B,A7BdA,CiBPC,GAAGwE,ClBCC,CAAC5C,EkBDE,CAACiS,AlBCA,CAAE,I8BoBG,CAAC,OZrBO,GAAG,ClBCC,EkBDE,ElBCE,CAACtU,IAAK,EAAC,C8BoBC,A9BpBA,C8BoBC;EvBTnE,EwBDEsF,ADWA,AZrBA,AlBCA,ECMEZ,I6BcIoW,AZrBAvG,AFaA5H,EeHH,A9BHK,C8BGJlH,CfGM,CAACrD,AfNA,IAAI,G6BcG,ECXH,AfGK,CeHJ,ADWK5B,AdRA6B,GAAG,CeHJ,AfGK,CeHJkX,GDWQ,CAAC7Y,GZrBG,AFaA,CAAC,EEbEuE,CaUJ,ADWK,CCXJ,ADWKjD,CCXJ0D,CbVM,CAAC8O,MYqBM,CAAC,ECXH,CAAC,CDWM,CAAC,ECXH,CAAC6E,KbVU,GAAG,GAAG,CaUJ,CAAC;AxBEpE,IwBDI,ADWA,AZrBA,AjBOA,I8BGI,AfGA,CeHCA,CbVC5E,WaUW,CAAC/D,KAAK,CAAC,CAAC,UbVU,GAAGzL,IAAI,CAACyP,aAAa,GAAG,GAAG;AXWjEhS,EwBAC,EDWE,A9BpBA,ACMAC,EeME,CAAC,ATHN,CSGO,ATHP0G,EuBWS0R,E7BdE,CAACnY,GAAG,CMGf,ANHgB,G6BcG,AvBXnByG,GuBWsByR,MvBXtB,GNH+B,EAAEpW,C6BcC,CAACxC,I7BdI,CAAC,Q6BcQ,CAAC,eAAe,CAAC;ECThEqb,A9BJA,E6BcE,AZrBA,AFaA,AhBZA,CgBYC,CAAC,IcQIvC,A9BpBA1Y,G+BUGib,CAAA,EAAG,EDUE,GAAGzC,A9BpBA,GAAG/Y,KAAK,CAACG,G8BoBG,CAACA,S9BpBS,CAAC,G8BoBG,CAAC,oBAAoB,CAAC,G9BpBG,CAAC;ACOzE,EeME,EeFEoD,ADUA,AZrBA,AlBCAhD,M8BoBM2Y,AZrBAtG,EaWH,CAACpP,E/BVO,CAAChD,M8BoBM,C9BpBC,C+BUJ,CAAC,ADUKuY,AZrBA,ClBCC,EkBDE7V,CaWJ,CAACsU,EbXO,AlBCA,CkBDC3E,GlBCG,C8BoBC,A9BpBA5T,C8BoBCkB,GCVF,A/BVK,C+BUJ,A/BVK,C+BUJ0D,AbXK,AlBCA,GkBDG6O,KYqBK,CAC7C,GCX4C,CAAC,IAAI,CAAC4E,YAAY,CAAC,CbXM,MYuBvE,CAAC;A7BhBJ3W,E8BKC,AfGA0N,EcSE,AZvBA,GjBMH,CeQOA,AfRPzN,CeQO,CcSEuY,AZvBArG,CFcC,KEdK,AjBMf,GiBNmB,AjBMnBlS,C6BiBmB,GAAGmY,I7BjBtB,Q6BiBkC,CAAC5Y,aAAa,CAC3C,wCACF,CAAC;AZxBL,IYyBI,AdXA,AhBbA,IgBaI,CEdC+C,AFcAO,CcWC2V,GZzBG,CAAClX,EFcE,CAAC7B,EEdG,CYyBA,GAAG0Y,GdXG,CAAC1K,MAAM,CAAC,CcWC,CAAClO,SdXS,CAAC,GcWG,CAAC,2BAA2B,CAAC;AZxB9E,EaWE,EDcE,AdXA,AhBbA,IgBaI,AhBbA,CgBaCyN,AhBbArP,C8BwBC8a,IZzBInW,GlBCG,CkBDC,AlBCAxE,C8BwBC,AZzBAqU,GYyBGgG,EdXE,CAAC1Y,IEdK,GlBCE,CAAC,C8BwBC,AdXA,CcWCF,AdXAkO,EhBbE,CAAChQ,GgBaG,CAAC,ChBbC,CAAC,EAAE,E8BwBE,CAAC,IdXI,CAAC,qBcWqB,CAAC;AZxB5E,EaWE,EDcE,AdXA,EhBbE,E+BUEkd,AfGA,EcWEjC,EdXE,CAAC7V,MeHM8X,CAAA,ADcC,AdXA,CAAClb,CeHC,AbXAgS,CYyBC0G,OdXO,CAACtJ,IcWI,CAACtP,GdXG,CAAC,IEdI,CAAC6S,IYyBI,CAAC,CdXC,CEdC,AFcA,CEdC,CAAC,AFcA,CEdE,sBYyBqB,CAAC;AZxB9E,IaWI,EfGE,AhBbA,I+BUIyI,AfGA,AhBbA,CgBaChO,AhBbAnP,QgBaQ,CAACuC,AhBbA,C+BUC,AbXAyR,AlBCA7R,EgBaE,CeHC,AfGA,IeHI,CAAC6W,G/BVG,CAACtX,KAAK,CAAC,E+BUE,CAACc,AbXA,CAACkS,AFcA,EAAE,EeHE,CAAChE,CfGC,CEdC,AFcA,CEdC,CaWC,AbXA,CaWC,AbXC,CaWA;AbVtD,IaWI,ADcA,AdXA,AhBbA,CgBaC,MAAM,gBEdgB9L,IAAI,CAAC+P,iBAAkB;AAClD,ElBCE,E+BUE,ADcA+F,EdXE,EeHEtQ,EfGE,CAAC+E,CeHC,EDcE,CCdC,ADcApN,IdXI,CAACQ,CeHCiI,EfGE,CcWC,AdXA,CcWCxI,GAAG,CAAE,GAAEwY,EZzBEtG,EYyBG,OdXM,EAAE,IeHX,CAACnJ,AfGe,CcWC,AdXA,CcWC,SZzBS,CAAC2J,EaWb,CAAC,CAAC,GbXkB,CAAC,CAAC,CAAE;AACzE,ElBEE/T,E+BSE,ADcA+Z,AdXA,EhBZE/Z,CAAA,EAAG,C+BSC8C,GAAG,CDcC,CAAC7D,CCdC0C,CDcC,GAAGvC,KAAK,IZzBI6E,IAAI,CaWT,AbXU2P,CaWTpR,MAAM,CAAC,EbXa,SaWF,CAAC;AbV5C,EFcE,EeHE,ADcAwX,A9BvBA1a,I+BSI,CAACwD,GAAG,ADcA,A9BvBA,C8BuBC3B,A9BvBA1B,C+BSC,UDcU,GAAGC,A9BvBA,CAAC,IAAI,CAACN,C8BuBC,EZzBEqU,ElBEE,CAAC,EAAEhS,MAAM,CAAC,CAAC,gBkBFgB,CAACsS,OAAO,CAAC,CAAC,CAAE;AAC7E,EFeE,AhBbA,E8BuBEgG,ECdElb,EfIEqQ,McUM,CAACoL,MZzBM3G,AFeAzE,CAAA,EAAG,CcUC,GAAG,KAAK,GCdb,AbXgB,CaWfjP,AbXgB8T,IaWZ,CACjB,EbZoC,CAAC,CAAC,CAAE,gDaa1C,CAAC;AbZP,AlBEA,IgBaI,CEfC,CaaC,IfEIlK,GeFG,IAAI,qBfEM,CAACE,UAAU,CAAC,CAAC;AhBbnCrI,EgBcC,EeFE,ADYA,AZzBArB,GlBCH,CAAAxB,GkBDU,CAACqF,GAAG,CAAC2P,MAAM,AlBCrB,CkBDsB,ElBCtBhV,cAAA;EkBAC,AFgBA,EeHE,ADYA,ICZI2d,ADYA,AdTArN,CcSCiJ,UCZU,AfGAjJ,CcSC,AdTD,CeHE,ADYA3N,CdTC,UcSU,CAACuY,UAAU,CAAC;EZvB1C,EYwBEA,AdTA,EeHE,GbZG9F,CFeCpK,IcSI,CAAC0Q,GZxBGtG,CAACnR,GYwBG,AZxBA,CYwBC,CZxBCwO,GYwBG,CAAC,GAAGvS,GZxBG,EAAE,EYwBE,AdTf,CcSgBE,AdTfqL,EcSiB,QdTP,CAAC,CAAC;EAClC,EcSE,AZxBA,EaYE,EDYEqN,AZxBA,CAAC7U,CaYC,CAACuV,CbZC,EAAE,SaYS,CAACxW,IDYP,CCZY,ADYXkY,GCZc,EAAE,KDYN,CAAC;AdR7B,IcSIE,ECZE,AbZA,OAAO,GYwBG,CAACpa,AZxBA,gBYwBgB,CAAC,OAAO,EAAE,YAAY;AdTtD6B,IEdG,EaYE,ADYA,CdVL,CAAA6M,EeFS,CAAC9E,CDYCI,GCZG,AfEd,EeFgB,CfEhB0E,OAAA,ecUwB,CAACtE,iBAAiB,CAAClL,OAAO,CAACE,EAAE,CAAC;IZtBnD,EYuBE8a,ECZEtQ,GbXGqI,CaWC,GAAG,CDYC,AZvBA,CYuBCrQ,AZvBAqB,GAAG,CaWC+G,AbXA,CACdyC,CYsBgB,CAAC,CAAC,CZtBd,CAAEmF,QAAQ,IAAK,UaUQ,CAAC1H,UAAU,CAAC;IDa1C,CAAC,CAAC,AZtBE,IaUEC,AbVE,CAACyH,IaUE,EAAE,EbVI,CAACQ,EAAE,EAAE,GaUC;IDavBiI,IZtBM,EaUAjX,IDYI,AZtBE,CaUD,ADYAsX,ECZE5Y,CbVGiE,IYsBE,CAAC,AZtBE,CAAE,OYsBI,CAAC,GCZP,ADYUxG,CCZT2D,IDYc,ICZN,CAAC,UbVsBD,GAAI,EAAC,CAAC;IYuB3DuX,EZtBI,EaUA,CAAC,CAAC,IDYI,CAACxa,gBAAgB,CAAC,OAAO,EAAE,YAAY;MCX/C,ADYAQ,AZtBE,OYsBK,AZtBEoR,CYsBDvN,GAAG,CAAC,GZtBK,CAACgQ,IAAI,CYsBD,AZtBE,CYsBD,AZtBE;IACxB,CAAC,CaUD,ADYAnV,AZtBE,CACDuN,IAAI,CAAErI,CYqBA,CAACuW,EZrBG,IAAK,CYqBD,GAAG,SAAS;MCX3B,ADYA,AZrBElJ,MaSI7H,ADYA1K,ICZI,AbTE,CaSDwK,AbTEtF,EYqBA,CAACyE,CZrBG,CAACyL,EYqBA,CAAC,CAAC,CCZC,CAAC,AbTE,CAAC;IYsB3B,AZrBE,CYqBD,AZrBE,CYqBD,AZrBE,CACDC,CaQCyF,IAAI,AbRA,CAAEvZ,CaQA,IbRK,EaQC,EbRI;IYqBpB6Z,EZpBI9Z,EaQAX,KbRO,CYoBD,AZpBEoB,CaQD,ADYAjB,ECZE2c,EbRI,CAAClc,KAAK,CAAC,KYoBG,CAAC,OAAO,EAAE,YAAY;MCX/C,ADYAD,AZpBEA,CaQD,CAAC,KDYK,AZpBE,CYoBD6D,AZpBE5D,GYoBC,CAAC,CZpBG,CACV,IYmBa,CAAC,sCZnB4BwC,GAAI,qBACjD,CAAC;MaOH,ADYA/D,AZlBEuS,MaMIlO,CDYC,CAACoX,EZlBI,CAAC,EAAE,CAAC,CYkBD,GCZG,ADYA,GCZG7Y,GDYG,eCZK,CAACuB,eAAe,CAAC,CAAC;IbL/C,CAAC,CaMD,ADYA,AZlBE,MaMIK,ADYAxE,OAAO,CAAC2J,IAAI,CAAC,CAAC,CCZC,GAAG/G,kBAAQ,CAAC0B,kBAAkB,CAAC,CAAC;EbLzD,EYkBE,CAAC,CCZC,ADYA;AZjBN,IYkBI+W,ECZE,IAAI,CAACmC,EDYE,CAAC1c,QCZQ,CAAC,CAAC,MDYM,CAAC,OAAO,EAAE,YAAY;AZlBnD6B,MaOK,ADYArB,CZnBL,CAAA8Q,KYmBY,CAACjN,GAAG,AZnBhB,CYmBiB,EZnBjBiN,GYmBsB,CAAC,KZnBvB;MaQK,ADYApS,ICZI,CAAC0d,EDYE,CAACjC,OAAO,GAAG,ICZI,CAAC,ADYA;MACvB,ECbyB9a,IDanBX,GCb0B,EAAEyd,EDarB,CAAC9T,IAAI,CAAC,CAAC,ECbyB;IDc/C,CAAC,CAAC,ECd+CmR,IAAI,EAAE;IDevD,ECf8D,CAAC,CAAC,GDezDE,UAAU;EACnB,ICfI;EDiBJvN,IChBI,MAAMkQ,ODgBOlQ,CAAC/C,IAAI,EAAE,CChBC,GAAG,IAAI,CAACgT,iBAAiB,CAAC;IDiBjD,IChBI/c,ADgBA+J,IAAI,CAACxK,EChBE,ADgBA,EChBE,EAAE,CDgBC,IAAI,CAACwK,IAAI,EAAExK,EAAE,EAAE;MAC7B,EChBE4a,EDgBE,CAACpQ,CChBC,EAAE,CDgBC,GAAG,IAAI;IAClB,CAAC,CChBC,CAAC,CAAC,GDgBG;MCfL,ADgBA,IAAI,CAACA,CChBCkT,GDgBG,GAAGlT,IAAI,IChBI,GAAG;IDiBzB,IChBIA,IAAI;IDiBR,IChBI/J,ADgBA,CAACmL,MChBM,ADgBA,CAAC,CChBC,ADgBA,EChBE;EDiBjB,MCjBmB;EDmBnB8B,MClBM+P,YDkBY/P,CAAClD,IAAI,EAAE;IACvB,EClBE,CAAC,CDkBC,CAACA,IAAI,GAAGA,IAAI;IAChB,EClBE,EDkBE,CAACoB,GClBG+R,GDkBG,CAAC,CAAC,MClBM,GAAG;EDmBxB,MClBMC,MAAM,EAAEL,WAAW;EDoBzBpD,MCnBMnW,KAAK,EAAEwG,CDmBC2P,CAAA,ECnBG,ADmBA,CCnBCnW,KAAK;IDoBrB,ICnBI+F,ADmBA,CAACmC,OCnBO,EAAE,ADmBA,CCnBC,ADmBAuE,KAAK,CCnBCjG,ADmBA,CAAC,GCnBG,CAACD,WAAW,CAAC,CAAC,EAAEZ,GAAG,CAAE7J,OAAO,KAAM;IDoB3De,KAAK,CCnBC+Z,ADmBAY,ICnBI,EAAE1b,OAAO,CAAC8a,CDmBC,CAAC,CAAC,CCnBC;EDoB1B,QCnBQna,OAAO,EAAEX,OAAO,CAACW;EDqBzB,MCpBM,ADoBA2Z,CCpBC,CAAC,cDoBcA,CAAA,EAAG;IACvB,ECpBE,CAAC,GDoBG5P,IAAI,GAAG,MAAMI,4BAAa,CAACO,cAAc,CAAC,CAAC;IACjD,ECpBE,EDoBEX,IAAI,EAAE;MCnBR,ADoBA,ICpBIrG,EDoBEyG,UCpBU,EAAE,gBDoBC,CAACM,UAAU,CAACV,IAAI,CAAC;IACtC,ICpBImT,WAAW,CAACE,MAAM,GAAG1Z,YAAY;EDqBvC,ICpBI;EDsBJ+V,ICrBI,ODqBOA,CAAA,EAAG;IACZ,ECrBE,EDqBE,CAACf,CCrBC7U,UDqBU,CAACmX,ICrBI,EAAE,GDqBG,GAAG,CAAC;EAChC,MCrBMkC,WAAW,CAACG,OAAO,GAAGxZ,eAAe;EDuB3C2V,ICtBI,ODsBOA,CAAA,EAAG;IACZ,ECtBE,EDsBE,CAACd,WAAW,CAACsC,SAAS,GAAG,IAAI,CAACtC,WAAW,CAACuC,YAAY;EAC5D,ICtBI+B,eAAe,CAACxQ,SAAS,GAAG,6BAA6B;ADuB/D,MCtBM;ADsBLxK,MCrBK,CDqBL,CAAAiX,ECrBS,CAAC8C,KDqBV,GAAA9C,CCrBmB,CAACtH,IAAI,CACjBvO,CDoBP,ECpBU,EACH8Z,WAAW,EACX,CAAC5W,OAAO,EAAEyL,QAAQ,KAChB,IAAI,CAACE,cAAc,CAAC3L,OAAO,EAAEyL,QAAQ,EAAEkL,cAAc,CAAC,EACxD,CAAC3W,OAAO,EAAE1F,KAAK,KAAK,IAAI,CAAC0c,mBAAmB,CAAChX,OAAO,EAAE1F,KAAK,CAAC,EAC5D,CAAC0F,OAAO,EAAEyL,QAAQ,KAChB,IAAI,CAACwL,UAAU,CAACjX,OAAO,EAAEyL,QAAQ,EAAEkL,cAAc,CACrD,CAAC;IACH;EACF;EAEAF,iBAAiBA,CAAC1d,OAAO,EAAE;IACzB,OAAO,IAAI,CAACyc,QAAQ,CAACvC,gBAAgB,CAACla,OAAO,CAAC;EAChD;EAEA4S,cAAcA,CAAC3L,OAAO,EAAEyL,QAAQ,EAAE9J,OAAO,EAAE;IACzC,MAAM+U,eAAe,GAAG/U,OAAO,CAAC+U,eAAe;IAC/C,MAAMQ,gBAAgB,GAAG,IAAI,CAACC,eAAe,CAAC1L,QAAQ,CAAC;IACvD;IACA9J,OAAO,CAACjI,OAAO,IAAIwd,gBAAgB;IACnCR,eAAe,CAACvb,WAAW,IAAI+b,gBAAgB;IAC/C,IAAI,CAAC1B,QAAQ,CAACtC,WAAW,CAAC,CAAC;EAC7B;EAEA8D,mBAAmBA,CAAChX,OAAO,EAAE1F,KAAK,EAAE;IAClC;IACA,IAAIA,KAAK,CAACkI,IAAI,KAAK,YAAY,EAAE;MAC/BnI,OAAO,CAACC,KAAK,CAAE,UAASA,KAAK,CAACvB,OAAQ,EAAC,CAAC;IAC1C;IACA,IAAI,CAACyc,QAAQ,CAACtC,WAAW,CAAC,CAAC;IAC3B,IAAI,CAACkD,UAAU,CAAC,CAAC;EACnB;EAEA,MAAMa,UAAUA,CAACjX,OAAO,EAAEyL,QAAQ,EAAE9J,OAAO,EAAE;IAC3C,MAAM8B,IAAI,GAAG9B,OAAO,CAAC8B,IAAI;IACzBpJ,OAAO,CAAC6D,GAAG,CAAE,QAAOuF,IAAI,CAACxK,EAAG,OAAM,CAAC;IACnC,MAAMwK,IAAI,CAACF,UAAU,CAAC;MACpBsQ,IAAI,EAAE,WAAW;MACjBna,OAAO,EAAEiI,OAAO,CAACjI;IACnB,CAAC,CAAC;IACF,IAAI,CAAC0c,UAAU,CAAC,CAAC;EACnB;EAEAe,eAAe,GAAIzd,OAAO,IAAK;IAC7B;IACA,OAAOA,OAAO;EAChB,CAAC;EAED0d,UAAU,GAAGA,CAAA,KAAM;IACjB,OAAO,IAAIza,GAAG,CAAC/C,MAAM,CAACyd,QAAQ,CAACza,IAAI,CAAC,CAAC0a,QAAQ,CAACzK,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;EAChE,CAAC;AACH;AAACpR,OAAA,CAAA0Z,GAAA,GAAAA,GAAA","file":"script.d573be0b.js","sourceRoot":"..","sourcesContent":["function simpleHash(str) {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\n// Show all uncaught errors as UI notifications\n/*\nwindow.onerror = function (message, source, lineno, colno, error) {\n const errorDetails = `${message} at ${source}:${lineno}:${colno}`;\n UINotification.show(errorDetails, 'error');\n return true;\n};\n*/\n\nexport class UINotification {\n constructor(message, type) {\n const id = simpleHash(JSON.stringify(message));\n this.type = type;\n this.domId = `notification-${id}`;\n this.container = document.body;\n this.template = document.getElementById('notification-template').content;\n this._bindEventListeners();\n }\n\n _bindEventListeners() {\n window.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n this.hide();\n }\n });\n }\n\n static show(message, type) {\n const notification = new UINotification(message, type);\n notification.show(message);\n }\n\n static initialize() {\n // Store the original console.error function\n const originalConsoleError = console.error;\n\n // Override console.error\n console.error = function (...args) {\n UINotification.show(args);\n // Call the original console.error with all arguments\n originalConsoleError.apply(console, args);\n };\n }\n\n static handleApplicationError(error) {\n console.debug('caught error');\n console.error(error);\n UINotification.show(error);\n }\n\n show(message) {\n // Clone the template\n const clone = this.template.cloneNode(true);\n\n // Find the root element of the notification in the clone\n const notificationElement = clone.querySelector('.notification');\n if (!notificationElement) {\n console.error('Notification root element not found in template');\n return;\n }\n\n // Set the message\n clone.querySelector('.notification-message').textContent = message;\n\n notificationElement.id = this.domId; // Set ID on the actual element, not the fragment\n // Add type, for example, error\n if (this.type) {\n notificationElement.classList.add(`notification-${this.type}`);\n }\n\n // Add close functionality\n const closeButton = clone.querySelector('.close-notification-button');\n closeButton.onclick = () => this.hide();\n\n // Don't show the same notification twice\n if (!document.getElementById(this.domId)) {\n // Append to the container and display\n this.container.appendChild(clone);\n }\n }\n\n hide() {\n document.getElementById(this.domId)?.remove();\n }\n}\n","export class Settings {\n // Static method to set a value in localStorage\n static set(key, value) {\n try {\n const stringValue = JSON.stringify(value);\n localStorage.setItem(key, stringValue);\n } catch (e) {\n console.error('Error saving to localStorage', e);\n }\n }\n\n // Static method to get a value from localStorage\n static get(key, defaultValue = null) {\n try {\n const value = localStorage.getItem(key);\n return value !== null ? JSON.parse(value) : defaultValue;\n } catch (e) {\n console.error('Error reading from localStorage', e);\n return defaultValue;\n }\n }\n\n // Static method to remove a value from localStorage\n static remove(key) {\n try {\n localStorage.removeItem(key);\n } catch (e) {\n console.error('Error removing from localStorage', e);\n }\n }\n\n static getUrl(uri) {\n try {\n const baseUrl = Settings.get('url');\n if (uri) {\n return new URL(uri, baseUrl).href;\n } else {\n return baseUrl;\n }\n } catch (error) {\n return null;\n }\n }\n\n static setUrl(url) {\n Settings.set('url', url);\n }\n\n static getModel() {\n return Settings.get('model');\n }\n\n static setModel(model) {\n Settings.set('model', model);\n }\n\n static getSystemPrompt() {\n return Settings.get('system-prompt');\n }\n\n static setSystemPrompt(systemPrompt) {\n if (systemPrompt === '') {\n systemPrompt = null;\n }\n Settings.set('system-prompt', systemPrompt);\n }\n\n static getModelParameters() {\n return Settings.get('model-parameters');\n }\n\n static setModelParameters(modelParameters) {\n if (modelParameters === '') {\n modelParameters = null;\n }\n Settings.set('model-parameters', modelParameters);\n }\n\n static getCurrentChatId() {\n return Settings.get('currentChatId');\n }\n\n static setCurrentChatId(chatId) {\n if (chatId === undefined) {\n chatId = null;\n }\n Settings.set('currentChatId', chatId);\n }\n}\n","export class Event {\n static listen(eventName, handler) {\n window.addEventListener(eventName, (event) => {\n handler(event.detail);\n });\n }\n\n static emit(eventName, data) {\n let log = `${eventName}`;\n if (data?.id) {\n log += ` id: ${data.id}`;\n }\n console.log(log);\n const event = new CustomEvent(eventName, {\n detail: data || {},\n bubbles: true, // This makes the event bubble up through the DOM\n });\n window.dispatchEvent(event);\n }\n}\n","export class DOM {\n static showElement(element) {\n element.classList.remove('hidden');\n return this;\n }\n\n static hideElement(element) {\n element.classList.add('hidden');\n return this;\n }\n\n static enableInput(element) {\n element.removeAttribute('disabled');\n return this;\n }\n\n static disableInput(element) {\n element.setAttribute('disabled', 'disabled');\n return this;\n }\n}\n","export function debounce(func, wait) {\n let timeout;\n\n return function funcWrapper(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n}\n","export class Database {\n constructor(dbName, objectStores, migrations) {\n this.dbName = dbName;\n this.objectStores = objectStores;\n this.dbConnection = null; // Initialized in open\n this.migrations = migrations;\n }\n\n async open() {\n if (this.dbConnection) {\n throw new Error('Connection already open');\n }\n\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.migrations.version);\n\n request.onerror = (event) => reject(event.target.error);\n request.onupgradeneeded = (event) => {\n const db = event.target.result;\n const transaction = event.currentTarget.transaction;\n this.migrations.upgrade(db, transaction, event.oldVersion);\n };\n request.onsuccess = (event) => {\n this.dbConnection = event.target.result;\n resolve(this.dbConnection);\n };\n });\n }\n\n async transaction(storeName, mode) {\n return this.dbConnection\n .transaction([storeName], mode)\n .objectStore(storeName);\n }\n\n async add(storeName, data) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('add', store.add(data));\n }\n\n async get(storeName, id) {\n const store = await this.transaction(storeName, 'readonly');\n return this.handleRequest('get', store.get(id));\n }\n\n async put(storeName, data) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('put', store.put(data));\n }\n\n async delete(storeName, id) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('delete', store.delete(id));\n }\n\n async getAll(storeName) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('getAll', store.getAll());\n }\n\n async clear(storeName) {\n const store = await this.transaction(storeName, 'readwrite');\n return this.handleRequest('deleteAll', store.clear());\n }\n\n handleRequest(type, request) {\n return new Promise((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n\n request.onerror = (event) => {\n const error = `Database ${type} operation failed: ${event.target.error.message}`;\n reject(new Error(JSON.stringify(error)));\n };\n });\n }\n}\n","export class Migrations {\n static version = 2;\n static upgrade(database, transaction, oldVersion) {\n console.debug(\n `Migration needed. Old version ${oldVersion}. New version ${this.version}.`,\n );\n const funcName = `upgradeToVersion${this.version}`;\n const upgradeFunc = this[funcName];\n if (!upgradeFunc) {\n throw new Error(`Upgrade function missing for ${funcName}`);\n }\n if (this.version >= oldVersion) {\n upgradeFunc({ database, transaction });\n }\n }\n\n static upgradeToVersion2(context) {\n // Create chats\n context.database.createObjectStore('chats', {\n keyPath: 'id',\n autoIncrement: true,\n });\n // Create chat_messages\n const chatMessages = context.database.createObjectStore('chat_messages', {\n keyPath: 'id',\n autoIncrement: true,\n });\n chatMessages.createIndex('by_chat', 'chatId', { unique: false });\n }\n}\n","import { Database } from '../Database.js';\nimport { Migrations } from '../Migrations.js';\n\nexport class BaseModel {\n constructor(data) {\n Object.assign(this, data);\n }\n\n static async database(name, store) {\n this.dbName = name;\n this.storeName = store;\n this.db = new Database(name, [store], Migrations);\n await this.db.open();\n }\n\n static async transaction(mode) {\n return await this.db.transaction(this.storeName, mode);\n }\n\n async transaction(mode) {\n return await this.constructor.transaction(mode);\n }\n\n async create() {\n const key = await this.constructor.db.add(this.constructor.storeName, this);\n if (!this.id) {\n this.id = key;\n }\n return this;\n }\n\n async save() {\n return await this.constructor.db.put(this.constructor.storeName, this);\n }\n\n async delete() {\n return await this.constructor.db.delete(\n this.constructor.storeName,\n this.id,\n );\n }\n\n static async get(id) {\n const data = await this.db.get(this.storeName, id);\n return new this(data);\n }\n\n static async clear() {\n return await this.db.clear(this.storeName);\n }\n\n // TODO: sorting and selecting only certain attributes\n static async getAll() {\n const records = await this.db.getAll(this.storeName);\n return records.map((data) => new this(data));\n }\n\n /**\n * Retrieves all objects associated with a given ID and index.\n *\n * @param {number|string} chatId - The ID of the chat.\n * @returns {Promise} A promise that resolves to an array.\n */\n static async getAllByIndexAndId(indexName, id) {\n // Open a transaction and access the messages store\n const transaction = await this.transaction('readonly');\n\n // Use an index to find objects with the specified id\n const index = transaction.index(indexName);\n const request = index.getAll(id);\n\n return new Promise((resolve, reject) => {\n request.onsuccess = () => {\n // Convert the result into instances\n const messages = request.result.map((data) => new this(data));\n resolve(messages);\n };\n request.onerror = () => {\n reject(request.error);\n };\n });\n }\n\n // Exports the whole store\n static async export() {\n let transaction = await this.db.transaction(this.storeName, 'readonly');\n let store = await transaction.transaction.objectStore(this.storeName);\n return store.getAll();\n }\n}\n","import { BaseModel } from './BaseModel.js';\n\nexport class ChatMessage extends BaseModel {\n static async initialize() {\n await this.database('ChatApp', 'chat_messages');\n }\n\n static async getAllByChatId(chatId) {\n return this.getAllByIndexAndId('by_chat', chatId);\n }\n}\n","import { BaseModel } from './BaseModel.js';\nimport { ChatMessage } from './ChatMessage.js';\n\nexport class Chat extends BaseModel {\n async addMessage(data) {\n data.chatId = this.id;\n await new ChatMessage(data).create();\n }\n\n async getMessages() {\n const messages = await ChatMessage.getAllByChatId(this.id);\n this.messages = messages;\n return this.messages;\n }\n\n static async initialize() {\n await this.database('ChatApp', ['chats']);\n }\n\n static async clear() {\n await ChatMessage.clear();\n await super.clear();\n }\n\n static async get(id) {\n const chat = await super.get(id);\n\n /*\n if (chat) {\n // Fetch all messages for this chat\n const messages = await ChatMessage.getAllByChatId(id);\n chat.messages = messages;\n }\n */\n\n return chat;\n }\n\n static async delete(id) {\n // Delete the chat instance\n await super.delete(id);\n\n // Delete all associated messages\n const messages = await ChatMessage.getAllByChatId(id);\n for (const message of messages) {\n await message.delete();\n }\n }\n}\n","import { Event } from './Event.js';\nimport { Chat } from './models/Chat.js';\nimport { ChatMessage } from './models/ChatMessage.js';\nimport { Settings } from './models/Settings.js';\n\nexport class AppController {\n static async updateChat(chat, data) {\n Object.assign(chat, data);\n await chat.save();\n // TODO: Move to BaseModel\n Event.emit('chatUpdated', chat);\n }\n\n static async createChat(data) {\n if (!data) {\n data = {};\n }\n if (!data.title) {\n data.title = 'Untitled';\n }\n if (!data.model) {\n data.model = Settings.getModel();\n }\n const chat = await new Chat(data).create();\n Settings.setCurrentChatId(chat.id);\n Event.emit('chatCreated', chat);\n Event.emit('chatSelected', chat);\n return chat;\n }\n\n static async deleteChatMessage(messageId) {\n const message = await ChatMessage.get(messageId);\n message.delete();\n }\n\n static async deleteChat(chat) {\n await chat.delete();\n if (Settings.getCurrentChatId() === chat.id) {\n Settings.setCurrentChatId(null);\n }\n Event.emit('chatDeleted', chat);\n }\n\n static async getCurrentChat() {\n const chatId = this.getCurrentChatId();\n if (chatId) {\n return await Chat.get(chatId);\n }\n return null;\n }\n\n static getCurrentChatId() {\n return Settings.get('currentChatId');\n }\n\n static async setCurrentChat(chat) {\n Settings.setCurrentChatId(chat.id);\n Event.emit('chatSelected', chat);\n }\n\n static async setCurrentChatId(chatId) {\n const chat = await Chat.get(chatId);\n if (chat) {\n await this.setCurrentChat(chat);\n }\n }\n\n static async clearChats() {\n Settings.setCurrentChatId(null);\n await Chat.clear();\n Event.emit('chatsCleared');\n }\n}\n","import { AppController } from './AppController.js';\n\nexport class ChatListItem {\n constructor(chat, chatList, selected) {\n this.chat = chat;\n this.chatList = chatList;\n this.content = document\n .getElementById('chat-list-item-template')\n .content.cloneNode(true);\n this.element = this.content.querySelector('.chat-list-item');\n this.element.title = this.chat.title;\n this.element.data = { id: this.chat.id };\n this.element.classList.add(`chat${this.chat.id}`);\n if (selected === true) {\n this.element.classList.add('selected');\n // this.content.querySelector('.icon-selected').classList.remove('hidden')\n }\n this.setTitle();\n this.bindEventListeners();\n }\n\n render() {}\n\n bindEventListeners() {\n this.element.addEventListener('mouseover', this.onMouseover.bind(this));\n this.element.addEventListener('mouseout', this.onMouseout.bind(this));\n this.element.addEventListener('click', this.onClick.bind(this));\n this.element\n .querySelector('.list-item-delete')\n .addEventListener('click', this.deleteChat.bind(this));\n }\n\n onMouseover() {\n this.element.classList.add('hover');\n }\n\n onMouseout() {\n this.element.classList.remove('hover');\n }\n\n onClick() {\n this.chatList.selectChat(this.chat.id);\n }\n\n setTitle() {\n const chatTitle = this.content.querySelector('.chat-title');\n chatTitle.textContent = this.chat.title;\n }\n\n deleteChat() {\n AppController.deleteChat(this.chat);\n this.element.remove();\n }\n}\n","export class DragAndDrop {\n constructor(selector) {\n this.listItems = document.querySelectorAll(selector);\n this.draggedItem = null;\n this.initializeDragAndDrop();\n }\n\n initializeDragAndDrop() {\n this.listItems.forEach((item) => {\n item.addEventListener('dragstart', this.handleDragStart.bind(this, item));\n item.addEventListener('dragover', this.handleDragOver.bind(this));\n item.addEventListener('drop', this.handleDrop.bind(this, item));\n item.addEventListener('dragend', this.handleDragEnd.bind(this));\n });\n }\n\n handleDragStart(item) {\n this.draggedItem = item;\n }\n\n handleDragOver(e) {\n e.preventDefault();\n }\n\n handleDrop(item) {\n if (item !== this.draggedItem) {\n let currentHTML = item.innerHTML;\n item.innerHTML = this.draggedItem.innerHTML;\n this.draggedItem.innerHTML = currentHTML;\n console.debug('dnd drop');\n }\n }\n\n handleDragEnd() {\n this.draggedItem = null;\n }\n}\n","import { Event } from './Event.js';\nimport { ChatListItem } from './ChatListItem.js';\nimport { DragAndDrop } from './DragAndDrop.js';\nimport { Chat } from './models/Chat.js';\nimport { AppController } from './AppController.js';\n\nexport class ChatList {\n constructor() {\n this.element = document.getElementById('chat-list');\n this.template = document.getElementById('chat-list-item-template').content;\n this.bindEventListeners();\n AppController.getCurrentChat().then((chat) => {\n this.chat = chat;\n });\n }\n\n bindEventListeners() {\n Event.listen('chatCreated', this.handleChatCreated.bind(this));\n Event.listen('chatDeleted', this.handleChatDeleted.bind(this));\n Event.listen('chatsCleared', this.handleChatsCleared.bind(this));\n Event.listen('chatUpdated', this.handleChatUpdated.bind(this));\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n }\n\n async selectChat(chatId) {\n await AppController.setCurrentChatId(chatId);\n }\n\n handleChatCreated(chat) {\n this.appendChat(chat, true);\n }\n\n handleChatDeleted(chat) {\n if (this.chat?.id === chat.id) {\n this.chat = null;\n }\n this.element.querySelector(`.chat${chat.id}`)?.remove();\n }\n\n handleChatsCleared() {\n const elements = this.element.querySelectorAll('.chat-list-item');\n elements.forEach((element) => element.remove());\n }\n\n handleChatUpdated(chat) {\n const listElement = this.element.querySelector(\n `.chat${chat.id} .chat-title`,\n );\n if (listElement) {\n listElement.textContent = chat.title;\n }\n }\n\n handleChatSelected(chat) {\n if (this.chat) {\n const previousListElement = this.element.querySelector(\n `.chat${this.chat.id}`,\n );\n if (previousListElement) {\n previousListElement.classList.remove('selected');\n }\n }\n const newListElement = this.element.querySelector(`.chat${chat.id}`);\n if (newListElement) {\n newListElement.classList.add('selected');\n }\n // Remember selected chat\n this.chat = chat;\n }\n\n render() {\n const currentChatId = AppController.getCurrentChatId();\n this.element.innerHTML = '';\n Chat.getAll().then((chats) => {\n chats.forEach((chat) => {\n const selected = chat.id === currentChatId;\n this.appendChat(chat, selected);\n });\n new DragAndDrop('.chat-list-item');\n });\n }\n\n appendChat(chat, selected) {\n const chatListItem = new ChatListItem(chat, this, selected);\n this.element.appendChild(chatListItem.element);\n return chatListItem;\n }\n}\n","import { Chat } from './models/Chat.js';\nimport { ChatMessage } from './models/ChatMessage.js';\n\nexport class DownloadChatsButton {\n constructor() {\n this.button = document.querySelector('#export-button');\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n this.button.addEventListener('click', () => {\n this.exportChat();\n this.exportChatMessages();\n });\n }\n\n async exportChat() {\n const request = await Chat.export();\n\n request.onsuccess = function () {\n let data = request.result;\n\n // Convert the data to JSON format\n let jsonData = JSON.stringify(data, 2);\n\n // Export the JSON data by creating a file to download\n let blob = new Blob([jsonData], { type: 'application/json' });\n let url = URL.createObjectURL(blob);\n\n let a = document.createElement('a');\n a.href = url;\n a.download = 'chats.json';\n a.click();\n URL.revokeObjectURL(url);\n };\n\n request.onerror = function (event) {\n console.error('Error reading data: ', event.target.errorCode);\n };\n }\n\n async exportChatMessages() {\n const request = await ChatMessage.export();\n\n request.onsuccess = function () {\n let data = request.result;\n\n // Convert the data to JSON format\n let jsonData = JSON.stringify(data, 2);\n\n // Export the JSON data by creating a file to download\n let blob = new Blob([jsonData], { type: 'application/json' });\n let url = URL.createObjectURL(blob);\n\n let a = document.createElement('a');\n a.href = url;\n a.download = 'chat_messages.json';\n a.click();\n URL.revokeObjectURL(url);\n };\n\n request.onerror = function (event) {\n console.error('Error reading data: ', event.target.errorCode);\n };\n }\n}\n","export class LocalStorage {\n // Set a value in localStorage\n set(key, value) {\n try {\n const stringValue = JSON.stringify(value);\n localStorage.setItem(key, stringValue);\n } catch (e) {\n console.error('Error saving to localStorage', e);\n }\n }\n\n // Get a value from localStorage, return defaultValue if key doesn't exist\n get(key, defaultValue = null) {\n try {\n const value = localStorage.getItem(key);\n return value !== null ? JSON.parse(value) : defaultValue;\n } catch (e) {\n console.error('Error reading from localStorage', e);\n return defaultValue;\n }\n }\n\n // Remove a value from localStorage\n remove(key) {\n try {\n localStorage.removeItem(key);\n } catch (e) {\n console.error('Error removing from localStorage', e);\n }\n }\n}\n","import { debounce } from './debounce.js';\nimport { Event } from './Event.js';\nimport { Chat } from './models/Chat.js';\nimport { AppController } from './AppController.js';\nimport { ChatList } from './ChatList.js';\nimport { DownloadChatsButton } from './DownloadChatsButton.js';\nimport { LocalStorage } from './models/LocalStorage.js';\n\nexport class Sidebar {\n constructor() {\n this.settings = new LocalStorage();\n this.chatList = new ChatList();\n this.element = document.getElementById('sidebar');\n this.newChatButton = this.element.querySelector('#new-chat-button');\n this.clearButton = this.element.querySelector('#clear-button');\n this.hamburgerButton = document.getElementById('hamburger-menu');\n this.searchButton = document.getElementById('search-button');\n this.downloadChatsButton = new DownloadChatsButton();\n this.searchRow = document.getElementById('search-row');\n this.searchInput = document.getElementById('search-input');\n if (this.settings.get('sidebar-collapsed') === true) {\n this.element.classList.add('collapsed');\n }\n this.bindEventListeners();\n }\n\n render() {\n this.chatList.render();\n }\n\n bindEventListeners() {\n Event.listen('chatSelected', this.handleChatSelected);\n this.searchButton.addEventListener('click', this.toggleSearch.bind(this));\n this.searchInput.addEventListener(\n 'keypress',\n debounce(this.performSearch.bind(this), 50),\n );\n this.searchInput.addEventListener(\n 'keyup',\n debounce(this.performSearch.bind(this), 50),\n );\n this.newChatButton.addEventListener('click', this.handleNewChat.bind(this));\n this.clearButton.addEventListener('click', this.handleClear.bind(this));\n this.hamburgerButton.addEventListener('click', this.toggle.bind(this));\n }\n\n // TODO: Fix\n handleChatSelected = (chat) => {\n const listItem = this.element.querySelector(`chat${chat.id}`);\n if (listItem) {\n listItem.scrollIntoView({\n behavior: 'smooth',\n block: 'start', // \"start\" will bring the top of the element into view\n inline: 'nearest', // \"nearest\" will scroll to the nearest edge if partially visible\n });\n }\n };\n\n toggleSearch() {\n const searchRow = document.getElementById('search-row');\n searchRow.classList.toggle('hidden');\n this.searchInput.focus();\n }\n\n performSearch() {\n function escapeRegExp(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'); // Escapes special characters\n }\n const query = escapeRegExp(this.searchInput.value.trim()).replace(\n /\\s+/g,\n '.*',\n );\n const queryContent = query.length > 2; // Nobody wants to query content based on one character?\n const regex = new RegExp(query, 'i'); // 'i' for case-insensitive matching\n console.log(`Search ${query}`);\n Chat.getAll().then((chats) => {\n const matches = chats\n .filter((chat) => {\n let match = regex.test(chat.title);\n if (queryContent) {\n match ||= regex.test(chat.content);\n }\n return match;\n })\n .map((chat) => chat.id);\n this.element.querySelectorAll('.chat-list-item').forEach((item) => {\n if (matches.includes(item.data.id)) {\n // Now matches the type\n item.classList.remove('hidden');\n } else {\n item.classList.add('hidden');\n }\n });\n });\n }\n\n toggle() {\n this.element.classList.toggle('collapsed');\n this.hamburgerButton.classList.toggle('collapsed');\n if (this.element.classList.contains('collapsed')) {\n this.settings.set('sidebar-collapsed', true);\n } else {\n this.settings.set('sidebar-collapsed', false);\n }\n }\n\n async handleNewChat() {\n await AppController.createChat();\n }\n\n async handleClear() {\n await AppController.clearChats();\n }\n}\n","export class CopyButton {\n constructor() {\n document.addEventListener('click', (event) => {\n // Check if the clicked element has the class 'copy-button'\n if (event.target.classList.contains('copy-button')) {\n const targetSelector = event.target.getAttribute('data-target');\n if (!targetSelector) {\n console.error('The data-target attribute is not set');\n return;\n }\n const textToCopy = document.getElementById(targetSelector).innerText;\n // Create a temporary textarea element\n const textarea = document.createElement('textarea');\n textarea.value = textToCopy;\n document.body.appendChild(textarea);\n\n // Select the text and copy it\n textarea.select();\n document.execCommand('copy');\n\n // Remove the temporary textarea\n document.body.removeChild(textarea);\n\n // Optional: Display a message or change the button text/content\n alert('Text copied to clipboard');\n }\n });\n }\n}\n","export class OllamaApi {\n constructor() {\n this.abortController = null;\n }\n\n async send(url, data, onResponse, onError, onDone) {\n const request = { data };\n try {\n const response = await this.postChatMessage(url, data);\n await this.handleResponse(request, response, onResponse, onDone);\n } catch (error) {\n onError(request, error);\n }\n }\n\n async postChatMessage(url, data) {\n this.abortController = new AbortController();\n const { signal } = this.abortController;\n const response = await fetch(url, {\n signal,\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(data),\n });\n\n if (!response.ok) {\n throw new Error(`${url} failed with status ${response.status}`);\n }\n\n return response;\n }\n\n async handleResponse(request, response, onResponse, onDone) {\n const reader = response.body.getReader();\n let partialLine = '';\n var isRequestDone = false;\n\n while (!isRequestDone) {\n const { done, value } = await reader.read();\n if (done) {\n onDone(request, response);\n isRequestDone = true;\n continue;\n }\n\n const textChunk = new TextDecoder().decode(value);\n const lines = (partialLine + textChunk).split('\\n');\n partialLine = lines.pop();\n\n lines.forEach((line) => {\n const responseData = JSON.parse(line);\n if (line.trim()) {\n // TODO: Move this line:\n this.printResponseStats(responseData);\n onResponse(request, responseData.message.content);\n }\n });\n }\n\n if (partialLine.trim()) {\n onResponse(request, partialLine);\n }\n }\n\n abort() {\n if (this.abortController) {\n this.abortController.abort();\n }\n }\n\n printResponseStats(data) {\n if (!data.total_duration) {\n return;\n }\n // Convert nanoseconds to seconds for durations\n const totalDurationInSeconds = data.total_duration / 1e9;\n const loadDurationInSeconds = data.load_duration / 1e9;\n const promptEvalDurationInSeconds = data.prompt_eval_duration / 1e9;\n const responseEvalDurationInSeconds = data.eval_duration / 1e9;\n\n // Calculate tokens per second (token/s)\n const tokensPerSecond = data.eval_count / responseEvalDurationInSeconds;\n const output = `\nModel: ${data.model}\nCreated At: ${data.created_at}\nTotal Duration (s): ${totalDurationInSeconds.toFixed(2)}\nLoad Duration (s): ${loadDurationInSeconds.toFixed(2)}\nPrompt Evaluation Count: ${data.prompt_eval_count}\nPrompt Evaluation Duration (s): ${promptEvalDurationInSeconds.toFixed(2)}\nResponse Evaluation Count: ${data.eval_count}\nResponse Evaluation Duration (s): ${responseEvalDurationInSeconds.toFixed(2)}\nTokens Per Second: ${tokensPerSecond.toFixed(2)} token/s\n `;\n console.log(output);\n }\n\n static getModels(url, onResponse) {\n if (!url) {\n return null;\n }\n\n return fetch(url)\n .then((response) => {\n if (!response.ok) {\n throw new Error(`Unable to fetch models from ${url}`);\n }\n return response.json();\n })\n .then((data) => {\n onResponse(data.models);\n })\n .catch((error) => {\n console.debug(error);\n console.error(\n `Please ensure the server is running at: ${url}. Error code: 39847`,\n );\n onResponse([]);\n });\n }\n}\n","export class DownloadButton {\n constructor() {\n document.addEventListener('click', (event) => {\n // Check if the clicked element has the class 'copy-button'\n if (event.target.classList.contains('download-button')) {\n // Get the index from the data-target attribute\n const targetId = event.target.getAttribute('data-target');\n this.downloadElementContent(targetId, 'chat.html');\n }\n });\n }\n\n downloadElementContent(elementId, filename) {\n // Get the element\n const element = document.getElementById(elementId);\n if (!element) {\n console.error('Element not found');\n return;\n }\n\n // Get the contents of the element\n const content = element.innerText;\n\n // Create a Blob with the content\n const blob = new Blob([content], { type: 'text/html' });\n\n // Create an anchor element and set the href to the blob\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = filename;\n\n // Append the anchor to the document, trigger a click, and then remove it\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n\n // Revoke the blob URL\n URL.revokeObjectURL(a.href);\n }\n}\n","export class DropDownMenu {\n constructor() {\n this.buttonSelector = '.drop-down-menu';\n this.dropDownMenus = document.querySelectorAll(this.buttonSelector);\n this.init();\n }\n\n init() {\n // Add a click listener to the whole document\n document.addEventListener('click', (event) => {\n // Check if the clicked element or any of its parents has the 'drop-down-menu' class\n const menuElement = event.target.closest(this.buttonSelector);\n if (menuElement) {\n const dropDownMenu = menuElement.querySelector('.drop-down-menu-items');\n if (dropDownMenu) {\n this.toggleMenu(dropDownMenu);\n }\n }\n });\n }\n\n toggleMenu(menu) {\n menu.classList.toggle('hidden');\n menu.classList.toggle('visible');\n }\n}\n","// Modal base class\nexport class Modal {\n constructor(domId) {\n this.domId = domId;\n this.modal = document.getElementById(this.domId);\n this.closeButton = this.modal.querySelector('.button-close');\n this.closeButton.onclick = () => this.hide();\n this._bindEventListeners();\n }\n\n _bindEventListeners() {\n window.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n this.hide();\n }\n });\n }\n\n show() {\n this.handleShow();\n }\n\n hide() {\n this.handleHide();\n }\n\n handleShow() {\n this.modal.classList.add('show');\n }\n\n handleHide() {\n this.modal.classList.remove('show');\n }\n}\n","export class List {\n constructor(containerId, items, selected) {\n this.container = document.getElementById(containerId);\n this.items = items;\n this.selected = selected;\n this.render();\n this.clickHandler = null;\n }\n\n onClick(handler) {\n this.clickHandler = handler;\n return this; // Allow chaining\n }\n\n setItems(items) {\n this.items = items;\n this.render();\n }\n\n setSelected(selected) {\n console.debug(`Select ${selected}`);\n this.selected = selected;\n this.render();\n }\n\n getSelected() {\n return this.selected;\n }\n\n render() {\n this.container.innerHTML = ''; // Clear existing content\n const ul = document.createElement('ul');\n ul.classList.add('list');\n this.items.forEach((item) => {\n const li = document.createElement('li');\n li.classList.add('list-item');\n if (item === this.selected) {\n li.classList.add('selected');\n }\n li.textContent = item;\n li.item = item;\n li.addEventListener('click', () => {\n this.setSelected(item);\n if (this.clickHandler) {\n this.clickHandler(item);\n }\n });\n ul.appendChild(li);\n });\n this.container.appendChild(ul);\n }\n}\n","import { Event } from '../Event.js';\nimport { Settings } from './Settings.js';\nimport { OllamaApi } from '../OllamaApi.js';\n\nexport class Models {\n static models = [];\n\n static getUrl() {\n return Settings.getUrl('/api/tags');\n }\n\n static load() {\n if (!this.getUrl()) {\n return null;\n }\n return OllamaApi.getModels(this.getUrl(), (models) => {\n Models.models = models;\n Settings.set('models', Models.models);\n Event.emit('modelsLoaded', Models.models);\n });\n }\n\n static getAll() {\n return Models.models;\n }\n\n static getNames() {\n return Models.models.map((model) => model.name);\n }\n\n static findModelByName(name) {\n return Models.models.find((model) => model.name === name);\n }\n}\n","import { List } from './List.js';\nimport { Event } from './Event.js';\nimport { Models } from './models/Models.js';\n\nexport class ModelsList {\n constructor(selector, selectedModel) {\n this.modelList = new List(selector, Models.getNames(), selectedModel);\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n Event.listen('modelsLoaded', this.handleModelsLoaded.bind(this));\n }\n\n handleModelsLoaded() {\n this.modelList.setItems(Models.getNames());\n }\n\n onClick(handler) {\n this.modelList.clickHandler = handler;\n return this.modelList; // Allow chaining\n }\n\n getSelected() {\n return this.modelList.selected;\n }\n}\n","import { Modal } from './Modal.js';\nimport { UINotification } from './UINotification.js';\nimport { ModelsList } from './ModelsList.js';\nimport { Models } from './models/Models.js';\nimport { Settings } from './models/Settings.js';\n\nexport class SettingsDialog extends Modal {\n constructor() {\n super('settings-dialog');\n this.showButton = document.getElementById('settings-button');\n this.urlInput = document.getElementById('input-url');\n this.modelInput = document.getElementById('input-model');\n this.systemPromptInput = this.modal.querySelector('#input-system-prompt');\n this.modelParametersInput = this.modal.querySelector(\n '#input-model-parameters',\n );\n this.refreshModelsButton = this.modal.querySelector(\n '.refresh-models-button',\n );\n this.modelList = new ModelsList('model-list', Settings.getModel());\n this.bindEventListeners();\n this.loadSettings();\n }\n\n bindEventListeners() {\n this.urlInput.addEventListener('blur', () => {\n const value = this.urlInput.value.trim();\n Settings.setUrl(value);\n });\n this.systemPromptInput.addEventListener('blur', () => {\n Settings.setSystemPrompt(this.systemPromptInput.value.trim());\n });\n this.modelParametersInput.addEventListener('blur', () => {\n const value = this.modelParametersInput.value.trim();\n if (value === '') {\n return;\n }\n try {\n const parsedValue = JSON.parse(value);\n const prettyJSON = JSON.stringify(parsedValue, 2);\n Settings.setModelParameters(parsedValue);\n this.modelParametersInput.value = prettyJSON;\n this.modelParametersInput.classList.remove('error');\n } catch (error) {\n if (error.name === 'SyntaxError') {\n this.modelParametersInput.classList.add('error');\n } else {\n console.error(error);\n }\n }\n });\n this.modelList.onClick(() => {\n Settings.setModel(this.modelList.getSelected());\n });\n this.showButton.addEventListener('click', this.show.bind(this));\n this.refreshModelsButton.onclick = () => this.refreshModels();\n this.closeButton.onclick = () => this.hide();\n }\n\n show() {\n Models.load();\n this.handleShow();\n }\n\n refreshModels() {\n if (!Models.getUrl()) {\n UINotification.show('Please update the URL in the settings to continue.');\n } else {\n Models.load();\n }\n }\n\n loadSettings() {\n this.urlInput.value = Settings.getUrl();\n const modelParameters = Settings.getModelParameters();\n if (modelParameters) {\n this.modelParametersInput.value = JSON.stringify(modelParameters, 2);\n }\n }\n}\n","import { AppController } from './AppController.js';\nimport { Event } from './Event.js';\nimport { Modal } from './Modal.js';\nimport { Models } from './models/Models.js';\nimport { ModelsList } from './ModelsList.js';\n\nexport class ChatSettingsDialog extends Modal {\n constructor() {\n super('chat-settings-dialog');\n this.showButton = document.getElementById('chat-settings-button');\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n this.showButton.addEventListener('click', this.show.bind(this));\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n }\n\n show() {\n Models.load().then(() => {\n AppController.getCurrentChat().then((chat) => {\n this.handleChatSelected(chat);\n this.handleShow();\n });\n });\n }\n\n handleChatSelected(chat) {\n this.modelList = new ModelsList('chat-model-list', chat.model);\n this.modelList.onClick(async (model) => {\n chat.model = model;\n await chat.save();\n });\n }\n}\n","export class Hoverable {\n constructor(element) {\n this.element = element;\n element.hoverable = this;\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n this.element.addEventListener('mouseover', () => this.onMouseover());\n this.element.addEventListener('mouseout', () => this.onMouseout());\n }\n\n onMouseover() {\n this.element.classList.add('hover');\n }\n\n onMouseout() {\n this.element.classList.remove('hover');\n }\n}\n","import { Event } from './Event.js';\nimport { AppController } from './AppController.js';\n\nexport class ChatTitle {\n constructor() {\n this.defaultTitle = 'Untitled';\n this.element = document.getElementById('chat-title');\n this.bindEventListeners();\n this.render();\n }\n\n render() {\n AppController.getCurrentChat().then((chat) => {\n this.chat = chat;\n this.setTitle(chat?.title);\n });\n }\n\n setTitle(title) {\n this.element.textContent = title || this.defaultTitle;\n }\n\n focus() {\n const hasFocus = document.activeElement === this.element;\n if (!hasFocus) {\n this.element.focus();\n }\n }\n\n bindEventListeners() {\n Event.listen('chatDeleted', this.handleChatDeleted.bind(this));\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n this.element.addEventListener('blur', this.handleSave.bind(this));\n this.element.addEventListener('keypress', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.element.blur();\n }\n });\n }\n\n handleChatSelected(chat) {\n this.chat = chat;\n this.setTitle(chat.title);\n }\n\n handleChatDeleted(chat) {\n if (chat.id === this.chat.id) {\n this.setTitle(this.defaultTitle);\n }\n }\n\n async handleSave() {\n let title = this.element.textContent.trim();\n if (title.length === 0) {\n title = this.defaultTitle;\n this.element.classList.add('error');\n } else {\n this.element.classList.remove('error');\n }\n const chat = await AppController.getCurrentChat();\n if (chat) {\n await AppController.updateChat(chat, { title });\n } else {\n await AppController.createChat({ title });\n }\n }\n}\n","// TODO: Move code here from App.js\nexport class ChatForm {\n constructor() {\n this.chatHistory = document.getElementById('chat-history');\n this.messageInput = document.getElementById('message-input');\n this.sendButton = document.getElementById('send-button');\n this.abortButton = document.getElementById('abort-button');\n }\n}\n","import { AppController } from './AppController.js';\nimport { Event } from './Event.js';\nimport { Hoverable } from './Hoverable.js';\nimport { ChatTitle } from './ChatTitle.js';\nimport { ChatForm } from './ChatForm.js';\n\nexport class ChatArea {\n constructor() {\n this.chatTitle = new ChatTitle();\n this.chatForm = new ChatForm();\n this.chatHistory = document.getElementById('chat-history');\n this.messageInput = document.getElementById('message-input');\n this.editChatButton = document.getElementById('edit-chat-button');\n this.scrollToTopButton = document.getElementById('scroll-to-top-button');\n this.scrollToEndButton = document.getElementById('scroll-to-end-button');\n this.deleteChatButton = document.getElementById('delete-chat-button');\n AppController.getCurrentChat().then((chat) => {\n this.chat = chat;\n this.render();\n });\n this.bindEventListeners();\n }\n\n render() {\n // Clear history view\n this.chatHistory.innerText = '';\n // Render chat history\n this.chat?.getMessages()?.then((messages) => {\n messages.forEach((message) => {\n this.createMessageDiv(message);\n });\n });\n this.scrollToEnd();\n this.messageInput.focus();\n }\n\n bindEventListeners() {\n Event.listen('chatSelected', this.handleChatSelected.bind(this));\n Event.listen('chatDeleted', this.handleChatDeleted.bind(this));\n this.scrollToTopButton.addEventListener(\n 'click',\n this.scrollToTop.bind(this),\n );\n this.scrollToEndButton.addEventListener(\n 'click',\n this.scrollToEnd.bind(this),\n );\n this.editChatButton.addEventListener(\n 'click',\n this.handleEditChat.bind(this),\n );\n this.deleteChatButton.addEventListener(\n 'click',\n this.handleDeleteChat.bind(this),\n );\n this.currentMessage = this.chatHistory.querySelector('.selected');\n // Select chat message with arrow up and arrow down keys\n document.addEventListener('keydown', (event) => {\n let next, previous;\n\n if (event.key === 'ArrowDown') {\n next = this.currentMessage\n ? this.currentMessage.nextElementSibling\n : this.chatHistory.firstElementChild;\n if (next) {\n if (this.currentMessage)\n this.currentMessage.classList.remove('hover');\n next.classList.add('hover');\n this.currentMessage = next; // Update currentMessage\n this.currentMessage.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n }); // Scroll into view\n }\n } else if (event.key === 'ArrowUp') {\n previous = this.currentMessage\n ? this.currentMessage.previousElementSibling\n : this.chatHistory.lastElementChild;\n if (previous) {\n if (this.currentMessage)\n this.currentMessage.classList.remove('hover');\n previous.classList.add('hover');\n }\n this.currentMessage = previous; // Update currentMessage\n this.currentMessage.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n }); // Scroll into view\n }\n });\n }\n\n createMessageDiv(message) {\n const domId = `chat-message-${message.id}`;\n const role = message.role;\n const content = message.content;\n // Get the template and its content\n const template = document.getElementById('chat-message-template');\n const messageClone = template.content.cloneNode(true);\n // Find the div and span elements within the cloned template\n const messageDiv = messageClone.querySelector('.chat-message');\n const textSpan = messageClone.querySelector('.chat-message-text');\n const deleteButton = messageClone.querySelector(\n '.delete-chat-message-button',\n );\n const copyButton = messageClone.querySelector(\n '.copy-chat-message-button .copy-button',\n );\n const goodButton = messageClone.querySelector('.good-chat-message-button');\n const badButton = messageClone.querySelector('.bad-chat-message-button');\n const flagButton = messageClone.querySelector('.flag-chat-message-button');\n\n // Set the class for role and text content\n messageDiv.classList.add(`${role}-chat-message`);\n messageDiv.id = domId;\n textSpan.textContent = content;\n messageDiv.spellcheck = false;\n\n // Append to chatHistory and adjust scroll\n this.chatHistory.appendChild(messageDiv);\n messageDiv.dataset['id'] = message.id;\n new Hoverable(messageDiv);\n deleteButton.addEventListener('click', async () => {\n await AppController.deleteChatMessage(message.id);\n messageDiv.remove();\n });\n copyButton.dataset['target'] = domId;\n flagButton.addEventListener('click', async () => {\n console.log('flagged');\n message.quality = 'flagged';\n await message.save();\n });\n goodButton.addEventListener('click', async () => {\n console.log('good');\n message.quality = 'good';\n await message.save();\n });\n badButton.addEventListener('click', async () => {\n console.log('bad');\n message.quality = 'bad';\n await message.save();\n });\n return messageDiv;\n }\n\n handleChatDeleted(chat) {\n if (chat.id === this.chat?.id) {\n this.chat = null;\n } else {\n this.chat = chat;\n }\n this.render();\n }\n\n handleChatSelected(chat) {\n this.chat = chat;\n this.render();\n }\n\n handleEditChat() {\n this.chatTitle.focus();\n event.stopPropagation();\n }\n\n async handleDeleteChat() {\n const chat = await AppController.getCurrentChat();\n if (chat) {\n await AppController.deleteChat(chat);\n }\n }\n\n scrollToTop() {\n this.chatHistory.scrollTop = 0;\n }\n\n scrollToEnd() {\n this.chatHistory.scrollTop = this.chatHistory.scrollHeight;\n }\n}\n","import { UINotification } from './UINotification.js';\nimport { Settings } from './models/Settings.js';\nimport { Event } from './Event.js';\nimport { DOM } from './Dom.js';\nimport { Sidebar } from './Sidebar.js';\nimport { AppController } from './AppController.js';\nimport { CopyButton } from './CopyButton.js';\nimport { OllamaApi } from './OllamaApi.js';\nimport { DownloadButton } from './DownloadButton.js';\nimport { DropDownMenu } from './DropDownMenu.js';\nimport { SettingsDialog } from './SettingsDialog.js';\nimport { ChatSettingsDialog } from './ChatSettingsDialog.js';\n// import { MarkdownFormatter } from './MarkdownFormatter.js'\nimport { ChatArea } from './ChatArea.js';\n\n// TODO: Review and refactor\nexport class App {\n static run() {\n UINotification.initialize();\n const app = new App();\n return app;\n }\n\n constructor() {\n this.sidebar = new Sidebar();\n this.chatArea = new ChatArea();\n this.ollamaApi = new OllamaApi();\n this.settingsDialog = new SettingsDialog();\n this.chatSettingsDialog = new ChatSettingsDialog();\n this.downloadButton = new DownloadButton();\n this.copyButton = new CopyButton();\n this.dropDownMenu = new DropDownMenu();\n this.initializeElements();\n this.bindEventListeners();\n this.logInitialization();\n this.render();\n }\n\n initializeElements() {\n // this.sendButton = document.getElementById('send-button');\n this.abortButton = document.getElementById('abort-button');\n this.messageInput = document.getElementById('message-input');\n this.chatHistory = document.getElementById('chat-history');\n }\n\n logInitialization() {\n const msg = `~~~~\\nChat\\n~~~~\nModel: ${Settings.getModel()}\nURL: ${Settings.getUrl()}\nChat: ${Settings.getCurrentChatId()}\nParameters: ${JSON.stringify(Settings.getModelParameters())}\n`;\n console.log(msg);\n }\n\n render() {\n this.sidebar.render();\n this.chatArea.render();\n }\n\n bindEventListeners() {\n Event.listen('chatSelected', this.handleChatSelected);\n // this.sendButton.addEventListener('click', this.sendMessage.bind(this));\n this.abortButton.addEventListener('click', this.handleAbort.bind(this));\n this.messageInput.addEventListener(\n 'keypress',\n this.handleKeyPress.bind(this),\n );\n }\n\n handleChatSelected = (chat) => {\n window.history.pushState({}, '', `/chats/${chat.id}`);\n };\n\n handleAbort = () => {\n this.ollamaApi.abort();\n this.enableForm();\n console.log('Request aborted');\n };\n\n handleKeyPress = (event) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n this.sendMessage();\n }\n };\n\n enableForm() {\n DOM.hideElement(this.abortButton).enableInput(this.messageInput);\n this.messageInput.focus();\n }\n\n disableForm() {\n DOM.showElement(this.abortButton).disableInput(this.messageInput);\n }\n\n // https://github.com/jmorganca/ollama/blob/main/docs/api.md#generate-a-completion\n async sendMessage() {\n const userMessage = this.messageInput.value.trim();\n // Get the current chat\n let chat = await AppController.getCurrentChat();\n const url = Settings.getUrl('/api/chat');\n if (!url) {\n UINotification.show(\n 'Please update the URL in the settings to continue. ',\n );\n return null;\n }\n if (userMessage) {\n // Reset input\n this.messageInput.value = '';\n // Create new chat\n if (!chat) {\n chat = await AppController.createChat({\n title: 'Untitled',\n model: Settings.getModel(),\n });\n }\n // Store user message\n await chat.addMessage({\n role: 'user',\n content: userMessage,\n });\n const systemPrompt = Settings.getSystemPrompt();\n const modelParameters = Settings.getModelParameters();\n // Disable form\n this.disableForm();\n // Create user message\n this.createChatMessage({ content: userMessage, role: 'user' });\n // Create system message container\n const responseElement = this.createChatMessage({\n content: '',\n role: 'system',\n });\n const requestContext = {\n chat,\n content: '', // TODO: Move this to the response?\n responseElement,\n };\n const requestData = {\n prompt: userMessage,\n model: chat.model,\n messages: (await chat.getMessages()).map((message) => ({\n role: message.role,\n content: message.content,\n })),\n };\n // Add system prompt\n if (systemPrompt) {\n requestData.system = systemPrompt;\n }\n // Add model parameters\n if (modelParameters) {\n requestData.options = modelParameters;\n }\n // Show spinner\n responseElement.innerHTML = '
';\n // Make request\n this.ollamaApi.send(\n url,\n requestData,\n (request, response) =>\n this.handleResponse(request, response, requestContext),\n (request, error) => this.handleResponseError(request, error),\n (request, response) =>\n this.handleDone(request, response, requestContext),\n );\n }\n }\n\n createChatMessage(message) {\n return this.chatArea.createMessageDiv(message);\n }\n\n handleResponse(request, response, context) {\n const responseElement = context.responseElement;\n const sanitizedContent = this.sanitizeContent(response);\n // Remember original response\n context.content += sanitizedContent;\n responseElement.textContent += sanitizedContent;\n this.chatArea.scrollToEnd();\n }\n\n handleResponseError(request, error) {\n // Ignore \"Abort\" button\n if (error.name !== 'AbortError') {\n console.error(`Error: ${error.message}`);\n }\n this.chatArea.scrollToEnd();\n this.enableForm();\n }\n\n async handleDone(request, response, context) {\n const chat = context.chat;\n console.log(`Chat ${chat.id} done`);\n await chat.addMessage({\n role: 'assistant',\n content: context.content,\n });\n this.enableForm();\n }\n\n sanitizeContent = (content) => {\n // TODO: Sanitization logic here\n return content;\n };\n\n getIdParam = () => {\n return new URL(window.location.href).pathname.split('/').pop();\n };\n}\n","import { App } from './App.js';\nimport { Chat } from './models/Chat.js';\nimport { ChatMessage } from './models/ChatMessage.js';\n\n// TODO: refactor\nasync function initialize() {\n await Chat.initialize();\n await ChatMessage.initialize();\n}\n\ninitialize().then(() => {\n App.run();\n});\n"]} \ No newline at end of file diff --git a/dist/theme.7fcc2895.css b/dist/theme.7fcc2895.css index 2fb19ba..dac590e 100644 --- a/dist/theme.7fcc2895.css +++ b/dist/theme.7fcc2895.css @@ -140,7 +140,7 @@ html * { } html { - font-size: 16px; /* Standard font size for body, use rem to modify font-size */ + font-size: 14px; /* Standard font size for body, use rem to modify font-size */ } :root { @@ -206,8 +206,8 @@ html { box-shadow: 0 2px 5px var(--box-shadow-color); } -.list-item.hover, button:hover, -button.selected, input:focus, +.list-item.hover, .button:hover, +.button.selected, input:focus, textarea:focus, [contenteditable]:focus { box-shadow: 2px 0 6px var(--box-shadow-color) inset; @@ -287,6 +287,19 @@ svg { vertical-align: middle; } +.icon-flag::before { + content: "🚩"; /* Triangular Flag on Post */ + content: "⚠"; +} + +.icon-good::before { + content: "👎"; /* Thumbs Down */ +} + +.icon-bad::before { + content: "👍"; /* Thumbs Up */ +} + .icon-close::before { content: "×"; } @@ -332,10 +345,14 @@ svg { content: "📩"; } -.icon-delete::before { +.icon-delete-alt::before { content: "❌"; } +.icon-delete::before { + content: "✖"; +} + .icon-abort::before { content: "×"; color: var(--red); @@ -441,7 +458,8 @@ svg { border-bottom: 1px solid var(--border-color); } .modal-header .button { - background-color: var(--light-text-color); + color: var(--text-color); + background-color: var(--bg-color); padding: 0.35rem; line-height: 0.5rem; border-radius: 0.1rem; @@ -562,12 +580,14 @@ ul li.hover::after { button { background-color: var(--button-secondary-bgcolor); z-index: 1; - padding: 0.75rem 1rem; border: none; cursor: pointer; } -button i { - width: 1rem; + +.button { + padding: 0.75rem 1rem; +} +.button i { display: inline-block; } @@ -856,6 +876,9 @@ ul li { .chat-list-item .chat-title { mask-image: linear-gradient(90deg, var(--white) 95%, transparent); } +.chat-list-item .button { + padding: 0.25rem 0.75rem; +} .list-item.selected { background: var(--white); @@ -917,8 +940,13 @@ ul li { position: absolute; top: 100%; /* Position below the button */ display: none; /* Hide initially */ + font-size: 0.75rem; + white-space: nowrap; left: 0; } +.drop-down-menu-items i[class^=icon-]::before { + padding-right: 0.5rem; +} .drop-down-menu-items .text { padding: 0.5rem; } diff --git a/dist/theme.7fcc2895.css.map b/dist/theme.7fcc2895.css.map index c31d06d..fb06285 100644 --- a/dist/theme.7fcc2895.css.map +++ b/dist/theme.7fcc2895.css.map @@ -1 +1 @@ -{"version":3,"sources":["css/reset.scss","css/colors.scss","css/placeholders.scss","css/grid.scss","css/typography.scss","css/icons.scss","css/modal.scss","css/form.scss","css/list.scss","css/button.scss","css/utils.scss","css/spinner.scss","css/style.scss","css/animations.scss","css/responsive.scss","css/Hoverable.scss","css/Tabs.scss","css/ChatApp.scss","css/ChatHeader.scss","css/ChatHistory.scss","css/ChatForm.scss","css/ChatList.scss","css/ChatArea.scss","css/ChatTitle.scss","css/Sidebar.scss","css/DropDownMenu.scss","css/UINotification.scss","css/SpeechBubble.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAiFE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAIF;EACE;EACA;EACA;;;AAGF;EACE;;;AC3IF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;AC5CJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAAA;EACE;;;AAOF;EACE;;;AC7BF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACpBF;AACA;EACE;EAEA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA;EACA;;;AAGF;AACA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC5BF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKA;EACE;EACA;;AAGF;EACE;EACA;;;AAKJ;EAEI;IACE;IACA;;;AAKN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AC9HA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;;;AAMJ;EACE;EACA;EACA;EACA;EACA;;;AAMF;EACE;;;AAGF;EACE;EACA;;;ACxDF;EAGE;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;;;AAKF;AAAA;EAEE;;;AAGF;EACE;;;ACzCF;AACA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAYA;AAAA;AAAA;AAAA;AAAA;;AAVA;EACE;EACA;;AAGF;EACE;EACA;;AAUJ;EAIE;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAEA;EACE;;AAIJ;EACE;;;ACxDJ;EACE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;;AASJ;EACE;;;AAGF;EACE;;;AAGF;AAMA;EACE;;AAEA;EACE;EACA;;;AAIJ;EACE;;;AC1CF;AACA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AClBF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE;;EAGF;IACE;;;AAYJ;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAcJ;EACE;IAEE;IACA;;EAGF;IACE;IACA;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;;ACjFJ;AACA;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACxBE;EACI;;;AAKR;EACI;;;AAGJ;EACI;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;ACzBF;EACE;IACE;;;AAIJ;EACE;IACE;;;ACRJ;EACE;;;AAIA;EACE;;;ACNJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAOF;EACE;;;AClBF;AACA;EACE;EACA;EACA;;;ACJF;EAEE;EAIA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAOF;EACE;EACA;EACA;EACA;EACA;;;AC7BF;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AACA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;;AAIJ;AAKA;AACA;EACE;;;ACjCF;EACE;EACA;EACA;EAGA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;;;ACtCF;EACE;;AAEA;EAEE;;;AAQJ;EACE;EAIA;;;AAGF;EAGE;;;ACxBF;EACE;EACA;EACA;EACA;;;AAIF;EACE;;;ACTF;EAGE;EACA;EACA;EACA;EACA;;;ACPF;EAGE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;;ACvBF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EAIA;;AAEA;EACE;;;AAIJ;EACE;EACA;;;AAIA;EACE;EACA;;;AC3BJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAIA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;;;ACvBF;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"theme.7fcc2895.css","sourceRoot":"..","sourcesContent":["html,\nbody,\ndiv,\nspan,\napplet,\nobject,\niframe,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nblockquote,\npre,\na,\nabbr,\nacronym,\naddress,\nbig,\ncite,\ncode,\ndel,\ndfn,\nem,\nimg,\nins,\nkbd,\nq,\ns,\nsamp,\nsmall,\nstrike,\nstrong,\nsub,\nsup,\ntt,\nvar,\nb,\nu,\ni,\ncenter,\ndl,\ndt,\ndd,\nol,\nul,\nli,\nfieldset,\nform,\nlabel,\nlegend,\ntable,\ncaption,\ntbody,\ntfoot,\nthead,\ntr,\nth,\ntd,\narticle,\naside,\ncanvas,\ndetails,\nembed,\nfigure,\nfigcaption,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\noutput,\nruby,\nsection,\nsummary,\ntime,\nmark,\naudio,\nvideo {\n margin: 0;\n padding: 0;\n border: 0;\n font: inherit;\n font-size: 100%;\n vertical-align: baseline;\n}\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\nsection {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol,\nul {\n list-style: none;\n}\n\nblockquote,\nq {\n quotes: none;\n}\n\nblockquote::before,\nblockquote::after,\nq::before,\nq::after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ninput, button, textarea, select {\n font: inherit;\n}\n\n// Remove padding of everything and make border-box the default\nhtml * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nhtml {\n font-size: 16px; /* Standard font size for body, use rem to modify font-size */\n}\n","@use 'sass:color';\n\n// Light theme as default\n:root {\n --primary-color: #393e46;\n --secondary-color: #222831;\n --secondary-color-lighten-20: #{color.adjust(#222831, $lightness:20%)};\n --secondary-color-lighten-40: #{color.adjust(#222831, $lightness:40%)};\n --tertiary-color: #eee;\n --error-color: #ef4040;\n --bg-color: #fafafa;\n --secondary-bg-color: #f0f0f0;\n --text-color: #333;\n --text-color-lighten-20: #{color.adjust(#eee, $lightness:20%)};\n --icon-color: var(--primary-color);\n --light-text-color: #fff;\n --button-primary-color: var(--primary-color);\n --button-primary-bgcolor: #fff;\n --button-secondary-color: var(--text-color);\n --button-secondary-bgcolor: $bg-color;\n --border-color: #{color.adjust(#393e46, $lightness:60%)};\n --border-hover-color: #{color.adjust(#393e46, $lightness:40%)};\n --border-focus-color: #{color.adjust(#393e46, $lightness:30%)};\n --box-shadow-color: rgb(196 204 213 / 37%);\n --box-shadow-modal-color: #444;\n --modal-header-bg-color: var(--primary-color);\n}\n\n// Dark theme for users who prefer dark mode\n@media (prefers-color-scheme: dark) {\n :root {\n --primary-color: #4f5b66;\n --secondary-color: #1c2025;\n --secondary-color-lighten-20: #{color.adjust(#1c2025, $lightness:20%)};\n --secondary-color-lighten-40: #{color.adjust(#1c2025, $lightness:40%)};\n --tertiary-color: #d1d1d1;\n --error-color: #ff6b6b;\n --bg-color: #121212;\n --secondary-bg-color: #222;\n --text-color: #fafafa;\n --text-color-lighten-20: #{color.adjust(#fafafa, $lightness:20%)};\n --icon-color: var(--text-color);\n --light-text-color: #fff;\n --button-primary-color: #fff;\n --button-primary-bgcolor: var(--primary-color);\n --button-secondary-color: var(--text-color);\n --button-secondary-bgcolor: var(--bg-color);\n --border-color: #{color.adjust(#4f5b66, $lightness:30%)};\n --border-hover-color: #{color.adjust(#4f5b66, $lightness:50%)};\n --border-focus-color: #{color.adjust(#4f5b66, $lightness:60%)};\n --box-shadow-color: rgb(40 48 57 / 30%);\n --box-shadow-modal-color: #444;\n --modal-header-bg-color: var(--bg-color);\n }\n}\n","%font-weight-light {\n font-variation-settings: 'wght' 300;\n}\n\n%font-weight-bold {\n font-variation-settings: 'wght' 400;\n}\n\n%font-weight-bolder {\n font-variation-settings: 'wght' 600;\n}\n\n%font-weight-boldest {\n font-variation-settings: 'wght' 900;\n}\n\n%box-shadow {\n box-shadow: 0 2px 5px var(--box-shadow-color);\n}\n\n%box-shadow-hover {\n box-shadow: 2px 0 6px var(--box-shadow-color) inset;\n}\n\n%box-shadow-small {\n box-shadow: 0 5px 10px var(--box-shadow-color);\n}\n\n%box-shadow-modal {\n box-shadow: 0 0 15px var(--box-shadow-modal-color);\n}\n\n%text-title {\n @extend %font-weight-boldest;\n\n font-size: 2rem;\n}\n",".row {\n display: flex; /* Use flexbox layout */\n justify-content: space-between; /* Distribute space evenly between the buttons */\n align-items: center; /* Align items vertically */\n width: 100%; /* Container takes full width */\n}\n\n.grw {\n flex-grow: 1;\n}\n\n.grw-6 {\n flex-grow: 6;\n}\n\n.flex-align-end {\n align-self: flex-end;\n}\n\n.justify-left {\n justify-content: left;\n}\n","/* Basic Typography */\nhtml * {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Ubuntu, Roboto,\n 'Helvetica Neue', Arial, sans-serif;\n line-height: 1.6;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n font-weight: 600;\n}\n\n/* Heading styles */\nh1 {\n font-size: 2rem;\n}\n\nh2 {\n font-size: 1.5rem;\n}\n\nh3 {\n font-size: 1.25rem;\n}\n",".icon {\n margin-right: 0.25rem;\n}\n\ni[class^='icon-'] {\n color: var(--icon-color);\n font-size: 0.75rem;\n vertical-align: middle;\n filter: grayscale(100%); // Make icons grayscale\n}\n\nsvg {\n width: 1.5rem;\n height: 1.5rem;\n vertical-align: middle;\n}\n\n.icon-close::before {\n content: '\\00D7';\n}\n\n.icon-download::before {\n content: '\\1F4BE';\n}\n\n.icon-copy::before {\n content: '\\1F4CB';\n}\n\n.icon-selected::before {\n content: '\\203A';\n}\n\n.icon-edit::before {\n content: '\\1F58B';\n}\n\n.icon-new::before {\n content: '\\002B';\n font-size: 0.875rem;\n}\n\n.icon-search::before {\n content: '\\1F50D'; /* Unicode character for 🔍 */\n}\n\n.icon-clear::before {\n content: '\\1F5D1'; /* Unicode for wastebasket */\n}\n\n.icon-settings::before {\n content: '\\1F6E0'; /* Unicode for wrench */\n}\n\n.icon-refresh::before {\n content: '\\21BB';\n}\n\n.icon-send::before {\n content: '\\1F4E9';\n}\n\n.icon-delete::before {\n content: '\\274C';\n}\n\n.icon-abort::before {\n content: '\\00D7';\n color: var(--red);\n}\n\n.icon-save::before {\n content: '\\1F4BE'; /* Unicode for floppy */\n}\n\n.icon-menu::before {\n content: '\\22EF'; /* Unicode character for three dots */\n}\n\n.icon-user::before {\n content: '\\1F464'; /* Unicode for 👤 */\n}\n\n.icon-robot::before {\n content: '\\1F916'; /* Unicode for 🤖 */\n}\n\n.icon-speech::before {\n content: '\\1F4AC';\n}\n\n.icon-speech2::before {\n content: '\\1F5E8'; /* Unicode for 🗨️ */\n}\n\n.icon-scroll-to-top::before {\n content: '\\21A5';\n}\n\n.icon-scroll-to-end::before {\n content: '\\21A7';\n}\n\n// Light theme\n:root {\n svg rect {\n fill: var(--text-color);\n stroke: var(--bg-color);\n }\n\n .icon-settings rect {\n stroke: var(--text-color);\n fill: var(--bg-color);\n }\n}\n\n// Dark theme\n@media (prefers-color-scheme: dark) {\n :root {\n svg rect {\n fill: var(--text-color);\n stroke: var(--bg-color);\n }\n }\n}\n\n/*\n.icon-gpt {\n display: inline-block;\n width: 24px;\n height: 24px;\n background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBjbGFzcz0iaWNvbi1tZCI+PGNpcmNsZSBjeD0iNi43NSIgY3k9IjYuNzUiIHI9IjMuMjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjE3LjI1IiBjeT0iNi43NSIgcj0iMy4yNSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iNi43NSIgY3k9IjE3LjI1IiByPSIzLjI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48L2NpcmNsZT48Y2lyY2xlIGN4PSIxNy4yNSIgY3k9IjE3LjI1IiByPSIzLjI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48L2NpcmNsZT48L3N2Zz4=');\n}\n\n.icon-models {\n display: inline-block;\n width: 24px;\n height: 24px;\n background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBjbGFzcz0iaWNvbi1tZCI+CiAgPHJlY3QgeD0iNC4yNSIgeT0iNC4yNSIgd2lkdGg9IjUiIGhlaWdodD0iNSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+PC9yZWN0PgogIDxyZWN0IHg9IjE0Ljc1IiB5PSI0LjI1IiB3aWR0aD0iNSIgaGVpZ2h0PSI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48L3JlY3Q+CiAgPHJlY3QgeD0iNC4yNSIgeT0iMTQuNzUiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjwvcmVjdD4KICA8cmVjdCB4PSIxNC43NSIgeT0iMTQuNzUiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjwvcmVjdD4KPC9zdmc+Cg==');\n}\n\n.icon-chats {\n display: inline-block;\n\n //background-image: url('data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjUwIiBoZWlnaHQ9IjMwIiB2aWV3Qm94PSIwIDAgNTAgMzAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPCEtLSBSb3VuZGVkIFJlY3RhbmdsZSBmb3IgdGhlIEJ1YmJsZSAtLT4KICA8cmVjdCB4PSIxIiB5PSIxIiB3aWR0aD0iNDgiIGhlaWdodD0iMjAiIHJ4PSIxMCIgcnk9IjEwIiBzdHJva2U9ImJsYWNrIiBmaWxsPSJ0cmFuc3BhcmVudCIgc3Ryb2tlLXdpZHRoPSIyIi8+CgogIDwhLS0gVGFpbCBvZiB0aGUgU3BlZWNoIEJ1YmJsZSAtLT4KICA8cGF0aCBkPSJNIDIwLDIxIEwgMjUsMjUgTCAzMCwyMSBaIiBmaWxsPSJ0cmFuc3BhcmVudCIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIyIi8+Cjwvc3ZnPgo=');\n background-image: url('data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgY2xhc3M9Imljb24tbWQiPgogIDxwb2x5Z29uIHBvaW50cz0iNC4yNSw0LjI1IDkuMjUsNC4yNSA2Ljc1LDkuMjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPjwvcG9seWdvbj4KICA8cG9seWdvbiBwb2ludHM9IjE0Ljc1LDQuMjUgMTkuNzUsNC4yNSAxNy4yNSw5LjI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIj48L3BvbHlnb24+CiAgPHBvbHlnb24gcG9pbnRzPSI0LjI1LDE0Ljc1IDkuMjUsMTQuNzUgNi43NSwxOS43NSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0ibm9uZSI+PC9wb2x5Z29uPgogIDxwb2x5Z29uIHBvaW50cz0iMTQuNzUsMTQuNzUgMTkuNzUsMTQuNzUgMTcuMjUsMTkuNzUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPjwvcG9seWdvbj4KPC9zdmc+Cg==');\n width: 24px;\n height: 24px;\n}\n\n.icon-hamburger {\n background-image: url('data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDI0IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDwhLS0gVG9wIFN0cmlwZSAtLT4KICA8cmVjdCB4PSI0IiB5PSI2IiB3aWR0aD0iMTYiIGhlaWdodD0iMiIgZmlsbD0iYmxhY2siPjwvcmVjdD4KCiAgPCEtLSBNaWRkbGUgU3RyaXBlIC0tPgogIDxyZWN0IHg9IjQiIHk9IjExIiB3aWR0aD0iMTYiIGhlaWdodD0iMiIgZmlsbD0iYmxhY2siPjwvcmVjdD4KCiAgPCEtLSBCb3R0b20gU3RyaXBlIC0tPgogIDxyZWN0IHg9IjQiIHk9IjE2IiB3aWR0aD0iMTYiIGhlaWdodD0iMiIgZmlsbD0iYmxhY2siPjwvcmVjdD4KPC9zdmc+Cg==');\n width: 24px;\n height: 24px;\n background-size: contain;\n background-repeat: no-repeat;\n}\n*/\n",".modal {\n display: flex; // Positioned behind other elements so not visible\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgb(0 0 0 / 50%); /* semi-transparent background */\n z-index: -1; /* Start behind other elements */\n overflow: scroll;\n opacity: 0; /* Start invisible */\n pointer-events: none; /* Prevent interaction when modal is not visible */\n}\n\n.modal-header {\n font-weight: 700;\n background-color: var(--modal-header-bg-color);\n padding: 0 1rem;\n border-bottom: 1px solid var(--border-color);\n\n .button {\n background-color: var(--light-text-color);\n padding: 0.35rem;\n line-height: 0.5rem;\n border-radius: 0.1rem;\n }\n\n .button:hover {\n position: relative;\n top: 1px;\n }\n\n h2 {\n color: var(--light-text-color);\n\n @extend %font-weight-boldest;\n }\n}\n\n.modal-content {\n background: var(--bg-color);\n width: 640px;\n min-width: 320px;\n max-width: 50vw;\n margin: auto; /* Center the modal */\n // border-radius: 2px;\n // overflow: hidden; /* Ensures the border-radius applies to children */\n @extend %box-shadow-modal;\n}\n\n.modal-body {\n padding: 1rem;\n}\n\n.modal.show {\n z-index: 20000;\n opacity: 1; /* Fully visible */\n}\n","label {\n @extend %font-weight-boldest;\n\n padding-bottom: 0.5rem;\n display: block;\n}\n\ntextarea {\n padding: 0.5rem;\n resize: none;\n}\n\ninput,\ntextarea {\n width: 100%;\n padding: 0.5rem 0.75rem;\n display: inline-block;\n border: 1px solid var(--border-color);\n}\n\ninput.error,\ntextarea.error {\n border: 1px solid var(--error-color) !important;\n}\n\ninput:focus,\ntextarea:focus,\n[contenteditable]:focus {\n border: 1px solid var(--border-color);\n border-color: var(--secondary-color-lighten-40);\n outline: none !important;\n\n @extend %box-shadow-hover;\n}\n\ninput:hover,\ntextarea:hover {\n border: 1px solid var(--secondary-color-lighten-40);\n}\n\n.input {\n margin-bottom: 0.5rem;\n}\n","/* Styling for lists */\nul {\n display: flex;\n flex-direction: column;\n width: 100%;\n\n li {\n border: 1px solid transparent; /* Invisible border by default */\n position: relative;\n display: flex; /* Use flexbox layout */\n justify-content: left;\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n width: 100%;\n white-space: nowrap; /* Prevent text from wrapping */\n\n .col {\n overflow: hidden; /* Hide overflowing text */\n text-overflow: ''; /* Display ellipsis (...) for overflowing text */\n }\n\n button {\n padding: 0 0.5rem;\n visibility: hidden;\n }\n\n /*\n .list-item-edit:after {\n content: \"...\"; // \\00a0 is a non-breaking space\n }\n */\n }\n\n li.selected {\n @extend %font-weight-boldest;\n\n // NOTE: Should match #chat-header border-bottom\n border-top-color: #cccccc5e;\n }\n\n li.selected::after {\n position: absolute;\n right: 1rem;\n padding-left: 0.5rem;\n content: '\\203A\\00a0'; // \\00a0 is a non-breaking space\n }\n\n li.hover {\n border-top-color: #cccccc5e;\n\n button {\n visibility: visible;\n }\n }\n\n li.hover::after {\n display: none;\n }\n}\n","button {\n background-color: var(--button-secondary-bgcolor);\n z-index: 1;\n padding: 0.75rem 1rem;\n border: none;\n cursor: pointer;\n\n i {\n width: 1rem; // Center the icon\n display: inline-block;\n }\n}\n\nbutton:hover,\nbutton.selected {\n @extend %box-shadow-hover;\n}\n\n.button-small {\n padding: 0.25rem 1rem;\n}\n\n.button-mini {\n padding: 0;\n}\n\n/* Primary button */\n.button-primary {\n @extend %font-weight-boldest;\n @extend %box-shadow;\n}\n\n.buttons {\n display: flex;\n\n .button {\n border-radius: 0;\n width: 100%;\n }\n}\n\n.button-large {\n padding: 0 2rem;\n}\n","/* Utilities */\n.hidden {\n display: none;\n}\n\n.float-right {\n float: right;\n}\n\n.mt-1 {\n margin-top: 0.5rem;\n}\n\n.d-inline {\n display: inline-block;\n}\n\n.d-block {\n display: block;\n}\n","%spinner {\n border: 2px solid #f3f3f3;\n border-top: 2px solid var(--primary-color);\n border-radius: 50%;\n width: 20px;\n height: 20px;\n animation: spin 2s linear infinite;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n\n%dot {\n width: 1rem;\n height: 1rem;\n background-color: var(--blue);\n border-radius: 50%;\n animation: pulse 2s infinite;\n}\n\n@keyframes pulse {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n\n 50% {\n transform: scale(1.3);\n opacity: 0.7;\n }\n\n 100% {\n transform: scale(0.9);\n opacity: 0.8;\n }\n}\n\n%dot2 {\n width: 24px;\n height: 24px;\n background-color: blue;\n border-radius: 50%;\n animation:\n pulse 2s infinite,\n change-color 4s infinite;\n}\n\n@keyframes pulse {\n 0%,\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n\n 50% {\n transform: scale(1.2);\n opacity: 0.7;\n }\n}\n\n@keyframes change-color {\n 0% {\n background-color: blue;\n }\n\n 33% {\n background-color: red;\n }\n\n 67% {\n background-color: green;\n }\n\n 100% {\n background-color: blue;\n }\n}\n\n.waiting {\n @extend %spinner;\n}\n","/* General styling */\nbody,\nhtml {\n margin: 0;\n padding: 0;\n height: 100%;\n}\n\nbody {\n color: var(--text-color);\n background-color: var(--bg-color);\n}\n\n.chat-link {\n display: inline-block;\n}\n\na {\n text-decoration: none;\n}\n\n.max-width-80 {\n max-width: 80%;\n}\n\n.text-right {\n text-align: right;\n}\n","// Lists\nul {\n li {\n transition: all 0.3s;\n }\n}\n\n// Sidebar\n#sidebar {\n transition: min-width 0.5s ease-out, max-width 1s ease-out;\n}\n\n#sidebar.collapsed {\n transition: min-width 0.5s ease-in, max-width 1s ease-in;\n}\n\n// Modal dialogs\n.modal {\n transform: scale(0.9); /* Start slightly scaled down */\n transition: opacity 0.5s ease, transform 0.5s ease-in; /* Transition effect */\n}\n\n.modal.show {\n transition: opacity 0.5s ease, transform 1s ease-out; /* Transition effect */\n transform: scale(1); /* Scale to original size */\n pointer-events: auto; /* Allow interactions */\n}\n\n","@media (width <= 1024px) {\n html {\n font-size: 0.875rem;\n }\n}\n\n@media (width <= 768px) {\n html {\n font-size: 0.75rem;\n }\n}\n",".hoverable {\n visibility: collapse;\n}\n\n.hover {\n .hoverable {\n visibility: visible;\n }\n}\n",".tab-container {\n display: flex;\n border: 1px solid #ccc;\n}\n\n.tab-button {\n padding: 10px 20px;\n cursor: pointer;\n background-color: #f0f0f0;\n border: none;\n outline: none;\n}\n\n.active-tab-button {\n @extend %box-shadow;\n}\n\n.tab-content {\n display: none;\n}\n","/* Chat app container */\n#chat-app {\n display: flex;\n height: 100vh;\n flex-direction: column;\n}\n","#chat-header {\n // NOTE: Should match #chat-form border-top\n border-bottom: 1px solid #ddd;\n\n @extend %box-shadow;\n\n z-index: 4;\n\n .button {\n height: 100%;\n }\n}\n\n.hamburger-menu {\n cursor: pointer;\n padding-left: 0.75rem;\n padding-right: 0.5rem;\n display: inline-block;\n}\n\n.hamburger-menu:hover {\n @extend %box-shadow;\n}\n\n.hamburger-menu .bar {\n width: 1.5rem;\n height: 2px;\n background-color: #333;\n margin: 6px 0;\n transition: 0.4s;\n}\n","/* Chat history */\n#chat-history {\n mask-image: linear-gradient(180deg, var(--white) 95%, transparent);\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n padding: 1rem;\n max-width: 1024px;\n width: 100%; /* Full width of its parent */\n overflow-y: auto; /* Enable vertical scrolling */\n}\n\n/* Base styling for all messages */\n.chat-message {\n padding: 0.5rem;\n padding-top: 0;\n position: relative;\n\n .drop-down-menu {\n z-index: 100;\n position: absolute;\n top: 0;\n right: 0;\n }\n}\n\n/* Styling for user messages */\n.user-chat-message {\n @extend %font-weight-bolder;\n}\n\n/* Styling for system messages */\n.assistant-chat-message {\n margin-bottom: 0.5rem;\n}\n","#chat-form {\n flex: 0 0 60px; /* fixed height */\n display: flex;\n align-items: center;\n\n // NOTE: Should match #chat-header border-bottom\n border-top: 1px solid #cccccc5e;\n\n .textarea {\n height: 100%;\n width: 100%;\n display: flex;\n flex-grow: 1;\n }\n\n .buttons {\n display: flex;\n position: relative;\n height: 100%;\n }\n\n button {\n background-color: var(--bg-color);\n }\n\n textarea {\n padding: 1rem;\n resize: none;\n border: 0;\n }\n\n .icon-send {\n font-size: 1.2rem;\n }\n}\n\n#message-input {\n width: 100%;\n padding: 0.25rem;\n}\n",".chat-list-item {\n z-index: 2;\n\n .chat-title {\n // text-overflow: ellipsis;\n mask-image: linear-gradient(\n 90deg,\n var(--white) 95%,\n transparent\n ); // Fade out title instead of ellipsis\n }\n}\n\n.list-item.selected {\n background: var(--white);\n\n @extend %box-shadow;\n\n z-index: 2;\n}\n\n.list-item.hover {\n @extend %box-shadow-hover;\n\n z-index: 3;\n}\n","#chat-area {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n overflow: auto;\n\n}\n\n#chat-menu-button {\n background-color: var(--secondary-bg-color);\n}\n","#chat-title {\n @extend %font-weight-boldest;\n\n padding: 0.5rem 0.25rem;\n font-size: 1.2rem;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n","#sidebar {\n @extend %box-shadow;\n\n background-color: var(--secondary-bg-color);\n border-right: 1px solid #cccccc5e;\n min-width: 200px;\n max-width: 480px;\n overflow-y: auto;\n\n .buttons {\n width: 100%;\n display: flex;\n flex-grow: 1;\n }\n}\n\n#search-input {\n padding-left: 0.75rem;\n}\n\n#sidebar.collapsed {\n min-width: 0;\n max-width: 0;\n padding: 0;\n}\n",".drop-down-menu {\n position: relative;\n}\n\n.drop-down-menu-items {\n background: var(--bg-color);\n position: absolute;\n top: 100%; /* Position below the button */\n display: none; /* Hide initially */\n\n @extend %box-shadow;\n\n left: 0;\n\n .text {\n padding: 0.5rem;\n }\n}\n\n.drop-down-menu-items.visible {\n z-index: 10000;\n display: inline-block;\n}\n\n.drop-down-menu-right {\n .drop-down-menu-items {\n right: 0 !important;\n left: auto;\n }\n}\n",".notification {\n position: fixed;\n top: 0;\n left: 0;\n color: var(--bg-color);\n width: calc(100vw - 2rem);\n z-index: 30000;\n background-color: var(--bg-color);\n padding: 1rem;\n margin: 1rem;\n\n @extend %box-shadow-modal;\n\n border-radius: var(--border-radius);\n\n .button {\n border-radius: 2px;\n padding: 0.5rem;\n line-height: 0.5rem;\n }\n}\n\n.notification-error {\n background: var(--error-color);\n}\n",".speech {\n position: relative;\n background: #f0f0f0;\n border: var(--border) solid black;\n padding: 20px;\n border-radius: 10px;\n margin: 40px;\n max-width: 300px;\n}\n\n.speech::after {\n content: '';\n position: absolute;\n border-style: solid;\n border-width: 10px 20px 10px 0;\n border-color: transparent #f0f0f0 transparent transparent;\n display: block;\n width: 0;\n z-index: 1;\n left: -20px;\n top: calc(50% - 10px);\n}\n"]} \ No newline at end of file +{"version":3,"sources":["css/reset.scss","css/colors.scss","css/placeholders.scss","css/grid.scss","css/typography.scss","css/icons.scss","css/modal.scss","css/form.scss","css/list.scss","css/button.scss","css/utils.scss","css/spinner.scss","css/style.scss","css/animations.scss","css/responsive.scss","css/Hoverable.scss","css/Tabs.scss","css/ChatApp.scss","css/ChatHeader.scss","css/ChatHistory.scss","css/ChatForm.scss","css/ChatList.scss","css/ChatArea.scss","css/ChatTitle.scss","css/Sidebar.scss","css/DropDownMenu.scss","css/UINotification.scss","css/SpeechBubble.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAiFE;EACA;EACA;EACA;EACA;EACA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWE;;;AAGF;EACE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;AAAA;AAAA;EAIE;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAIF;EACE;EACA;EACA;;;AAGF;EACE;;;AC3IF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIF;EACE;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;AC5CJ;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;AAAA;AAAA;AAAA;EACE;;;AAOF;EACE;;;AC7BF;EACE;EACA;EACA;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACpBF;AACA;EACE;EAEA;;;AAGF;AAAA;AAAA;AAAA;AAAA;AAAA;EAME;EACA;EACA;;;AAGF;AACA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AC5BF;EACE;;;AAGF;EACE;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAKA;EACE;EACA;;AAGF;EACE;EACA;;;AAKJ;EAEI;IACE;IACA;;;AAKN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AC/IA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAGF;EACE;;;AAMJ;EACE;EACA;EACA;EACA;EACA;;;AAMF;EACE;;;AAGF;EACE;EACA;;;ACzDF;EAGE;EACA;;;AAGF;EACE;EACA;;;AAGF;AAAA;EAEE;EACA;EACA;EACA;;;AAGF;AAAA;EAEE;;;AAGF;AAAA;AAAA;EAGE;EACA;EACA;;;AAKF;AAAA;EAEE;;;AAGF;EACE;;;ACzCF;AACA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAYA;AAAA;AAAA;AAAA;AAAA;;AAVA;EACE;EACA;;AAGF;EACE;EACA;;AAUJ;EAIE;;AAGF;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAEA;EACE;;AAIJ;EACE;;;ACxDJ;EACE;EACA;EACA;EACA;;;AAGF;EACE;;AAEA;EACE;;;AASJ;EACE;;;AAGF;EACE;;;AAGF;AAMA;EACE;;AAEA;EACE;EACA;;;AAIJ;EACE;;;AC5CF;AACA;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AClBF;EACE;EACA;EACA;EACA;EACA;EACA;;;AAGF;EACE;IACE;;EAGF;IACE;;;AAYJ;EACE;IACE;IACA;;EAGF;IACE;IACA;;EAGF;IACE;IACA;;;AAcJ;EACE;IAEE;IACA;;EAGF;IACE;IACA;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;;ACjFJ;AACA;AAAA;EAEE;EACA;EACA;;;AAGF;EACE;EACA;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;AAGF;EACE;;;ACxBE;EACI;;;AAKR;EACI;;;AAGJ;EACI;;;AAIJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;;;ACzBF;EACE;IACE;;;AAIJ;EACE;IACE;;;ACRJ;EACE;;;AAIA;EACE;;;ACNJ;EACE;EACA;;;AAGF;EACE;EACA;EACA;EACA;EACA;;;AAOF;EACE;;;AClBF;AACA;EACE;EACA;EACA;;;ACJF;EAEE;EAIA;;AAEA;EACE;;;AAIJ;EACE;EACA;EACA;EACA;;;AAOF;EACE;EACA;EACA;EACA;EACA;;;AC7BF;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGF;AACA;EACE;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;;AAIJ;AAKA;AACA;EACE;;;ACjCF;EACE;EACA;EACA;EAGA;;AAEA;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;;AAIJ;EACE;EACA;;;ACtCF;EACE;;AAEA;EAEE;;AAOF;EACE;;;AAIJ;EACE;EAIA;;;AAGF;EAGE;;;AC5BF;EACE;EACA;EACA;EACA;;;AAIF;EACE;;;ACTF;EAGE;EACA;EACA;EACA;EACA;;;ACPF;EAGE;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;;;AAGF;EACE;EACA;EACA;;;ACvBF;EACE;;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EAQA;;AANA;EACE;;AAOF;EACE;;;AAIJ;EACE;EACA;;;AAIA;EACE;EACA;;;ACjCJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAIA;;AAEA;EACE;EACA;EACA;;;AAIJ;EACE;;;ACvBF;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA","file":"theme.7fcc2895.css","sourceRoot":"..","sourcesContent":["html,\nbody,\ndiv,\nspan,\napplet,\nobject,\niframe,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nblockquote,\npre,\na,\nabbr,\nacronym,\naddress,\nbig,\ncite,\ncode,\ndel,\ndfn,\nem,\nimg,\nins,\nkbd,\nq,\ns,\nsamp,\nsmall,\nstrike,\nstrong,\nsub,\nsup,\ntt,\nvar,\nb,\nu,\ni,\ncenter,\ndl,\ndt,\ndd,\nol,\nul,\nli,\nfieldset,\nform,\nlabel,\nlegend,\ntable,\ncaption,\ntbody,\ntfoot,\nthead,\ntr,\nth,\ntd,\narticle,\naside,\ncanvas,\ndetails,\nembed,\nfigure,\nfigcaption,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\noutput,\nruby,\nsection,\nsummary,\ntime,\nmark,\naudio,\nvideo {\n margin: 0;\n padding: 0;\n border: 0;\n font: inherit;\n font-size: 100%;\n vertical-align: baseline;\n}\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\nsection {\n display: block;\n}\n\nbody {\n line-height: 1;\n}\n\nol,\nul {\n list-style: none;\n}\n\nblockquote,\nq {\n quotes: none;\n}\n\nblockquote::before,\nblockquote::after,\nq::before,\nq::after {\n content: '';\n content: none;\n}\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ninput, button, textarea, select {\n font: inherit;\n}\n\n// Remove padding of everything and make border-box the default\nhtml * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\nhtml {\n font-size: 14px; /* Standard font size for body, use rem to modify font-size */\n}\n","@use 'sass:color';\n\n// Light theme as default\n:root {\n --primary-color: #393e46;\n --secondary-color: #222831;\n --secondary-color-lighten-20: #{color.adjust(#222831, $lightness:20%)};\n --secondary-color-lighten-40: #{color.adjust(#222831, $lightness:40%)};\n --tertiary-color: #eee;\n --error-color: #ef4040;\n --bg-color: #fafafa;\n --secondary-bg-color: #f0f0f0;\n --text-color: #333;\n --text-color-lighten-20: #{color.adjust(#eee, $lightness:20%)};\n --icon-color: var(--primary-color);\n --light-text-color: #fff;\n --button-primary-color: var(--primary-color);\n --button-primary-bgcolor: #fff;\n --button-secondary-color: var(--text-color);\n --button-secondary-bgcolor: $bg-color;\n --border-color: #{color.adjust(#393e46, $lightness:60%)};\n --border-hover-color: #{color.adjust(#393e46, $lightness:40%)};\n --border-focus-color: #{color.adjust(#393e46, $lightness:30%)};\n --box-shadow-color: rgb(196 204 213 / 37%);\n --box-shadow-modal-color: #444;\n --modal-header-bg-color: var(--primary-color);\n}\n\n// Dark theme for users who prefer dark mode\n@media (prefers-color-scheme: dark) {\n :root {\n --primary-color: #4f5b66;\n --secondary-color: #1c2025;\n --secondary-color-lighten-20: #{color.adjust(#1c2025, $lightness:20%)};\n --secondary-color-lighten-40: #{color.adjust(#1c2025, $lightness:40%)};\n --tertiary-color: #d1d1d1;\n --error-color: #ff6b6b;\n --bg-color: #121212;\n --secondary-bg-color: #222;\n --text-color: #fafafa;\n --text-color-lighten-20: #{color.adjust(#fafafa, $lightness:20%)};\n --icon-color: var(--text-color);\n --light-text-color: #fff;\n --button-primary-color: #fff;\n --button-primary-bgcolor: var(--primary-color);\n --button-secondary-color: var(--text-color);\n --button-secondary-bgcolor: var(--bg-color);\n --border-color: #{color.adjust(#4f5b66, $lightness:30%)};\n --border-hover-color: #{color.adjust(#4f5b66, $lightness:50%)};\n --border-focus-color: #{color.adjust(#4f5b66, $lightness:60%)};\n --box-shadow-color: rgb(40 48 57 / 30%);\n --box-shadow-modal-color: #444;\n --modal-header-bg-color: var(--bg-color);\n }\n}\n","%font-weight-light {\n font-variation-settings: 'wght' 300;\n}\n\n%font-weight-bold {\n font-variation-settings: 'wght' 400;\n}\n\n%font-weight-bolder {\n font-variation-settings: 'wght' 600;\n}\n\n%font-weight-boldest {\n font-variation-settings: 'wght' 900;\n}\n\n%box-shadow {\n box-shadow: 0 2px 5px var(--box-shadow-color);\n}\n\n%box-shadow-hover {\n box-shadow: 2px 0 6px var(--box-shadow-color) inset;\n}\n\n%box-shadow-small {\n box-shadow: 0 5px 10px var(--box-shadow-color);\n}\n\n%box-shadow-modal {\n box-shadow: 0 0 15px var(--box-shadow-modal-color);\n}\n\n%text-title {\n @extend %font-weight-boldest;\n\n font-size: 2rem;\n}\n",".row {\n display: flex; /* Use flexbox layout */\n justify-content: space-between; /* Distribute space evenly between the buttons */\n align-items: center; /* Align items vertically */\n width: 100%; /* Container takes full width */\n}\n\n.grw {\n flex-grow: 1;\n}\n\n.grw-6 {\n flex-grow: 6;\n}\n\n.flex-align-end {\n align-self: flex-end;\n}\n\n.justify-left {\n justify-content: left;\n}\n","/* Basic Typography */\nhtml * {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Ubuntu, Roboto,\n 'Helvetica Neue', Arial, sans-serif;\n line-height: 1.6;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n margin-top: 0.5em;\n margin-bottom: 0.5em;\n font-weight: 600;\n}\n\n/* Heading styles */\nh1 {\n font-size: 2rem;\n}\n\nh2 {\n font-size: 1.5rem;\n}\n\nh3 {\n font-size: 1.25rem;\n}\n",".icon {\n margin-right: 0.25rem;\n}\n\ni[class^='icon-'] {\n color: var(--icon-color);\n font-size: 0.75rem;\n vertical-align: middle;\n filter: grayscale(100%); // Make icons grayscale\n}\n\nsvg {\n width: 1.5rem;\n height: 1.5rem;\n vertical-align: middle;\n}\n\n.icon-flag::before {\n content: \"\\1F6A9\"; /* Triangular Flag on Post */\n content: \"\\26A0\";\n}\n\n.icon-good::before {\n content: \"\\1F44E\"; /* Thumbs Down */\n}\n\n.icon-bad::before {\n content: \"\\1F44D\"; /* Thumbs Up */\n}\n\n.icon-close::before {\n content: '\\00D7';\n}\n\n.icon-download::before {\n content: '\\1F4BE';\n}\n\n.icon-copy::before {\n content: '\\1F4CB';\n}\n\n.icon-selected::before {\n content: '\\203A';\n}\n\n.icon-edit::before {\n content: '\\1F58B';\n}\n\n.icon-new::before {\n content: '\\002B';\n font-size: 0.875rem;\n}\n\n.icon-search::before {\n content: '\\1F50D'; /* Unicode character for 🔍 */\n}\n\n.icon-clear::before {\n content: '\\1F5D1'; /* Unicode for wastebasket */\n}\n\n.icon-settings::before {\n content: '\\1F6E0'; /* Unicode for wrench */\n}\n\n.icon-refresh::before {\n content: '\\21BB';\n}\n\n.icon-send::before {\n content: '\\1F4E9';\n}\n\n.icon-delete-alt::before {\n content: '\\274C';\n}\n\n.icon-delete::before {\n content: '\\2716';\n}\n\n.icon-abort::before {\n content: '\\00D7';\n color: var(--red);\n}\n\n.icon-save::before {\n content: '\\1F4BE'; /* Unicode for floppy */\n}\n\n.icon-menu::before {\n content: '\\22EF'; /* Unicode character for three dots */\n}\n\n.icon-user::before {\n content: '\\1F464'; /* Unicode for 👤 */\n}\n\n.icon-robot::before {\n content: '\\1F916'; /* Unicode for 🤖 */\n}\n\n.icon-speech::before {\n content: '\\1F4AC';\n}\n\n.icon-speech2::before {\n content: '\\1F5E8'; /* Unicode for 🗨️ */\n}\n\n.icon-scroll-to-top::before {\n content: '\\21A5';\n}\n\n.icon-scroll-to-end::before {\n content: '\\21A7';\n}\n\n// Light theme\n:root {\n svg rect {\n fill: var(--text-color);\n stroke: var(--bg-color);\n }\n\n .icon-settings rect {\n stroke: var(--text-color);\n fill: var(--bg-color);\n }\n}\n\n// Dark theme\n@media (prefers-color-scheme: dark) {\n :root {\n svg rect {\n fill: var(--text-color);\n stroke: var(--bg-color);\n }\n }\n}\n\n/*\n.icon-gpt {\n display: inline-block;\n width: 24px;\n height: 24px;\n background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBjbGFzcz0iaWNvbi1tZCI+PGNpcmNsZSBjeD0iNi43NSIgY3k9IjYuNzUiIHI9IjMuMjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjE3LjI1IiBjeT0iNi43NSIgcj0iMy4yNSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iNi43NSIgY3k9IjE3LjI1IiByPSIzLjI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48L2NpcmNsZT48Y2lyY2xlIGN4PSIxNy4yNSIgY3k9IjE3LjI1IiByPSIzLjI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48L2NpcmNsZT48L3N2Zz4=');\n}\n\n.icon-models {\n display: inline-block;\n width: 24px;\n height: 24px;\n background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBjbGFzcz0iaWNvbi1tZCI+CiAgPHJlY3QgeD0iNC4yNSIgeT0iNC4yNSIgd2lkdGg9IjUiIGhlaWdodD0iNSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiI+PC9yZWN0PgogIDxyZWN0IHg9IjE0Ljc1IiB5PSI0LjI1IiB3aWR0aD0iNSIgaGVpZ2h0PSI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIj48L3JlY3Q+CiAgPHJlY3QgeD0iNC4yNSIgeT0iMTQuNzUiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjwvcmVjdD4KICA8cmVjdCB4PSIxNC43NSIgeT0iMTQuNzUiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiPjwvcmVjdD4KPC9zdmc+Cg==');\n}\n\n.icon-chats {\n display: inline-block;\n\n //background-image: url('data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjUwIiBoZWlnaHQ9IjMwIiB2aWV3Qm94PSIwIDAgNTAgMzAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgPCEtLSBSb3VuZGVkIFJlY3RhbmdsZSBmb3IgdGhlIEJ1YmJsZSAtLT4KICA8cmVjdCB4PSIxIiB5PSIxIiB3aWR0aD0iNDgiIGhlaWdodD0iMjAiIHJ4PSIxMCIgcnk9IjEwIiBzdHJva2U9ImJsYWNrIiBmaWxsPSJ0cmFuc3BhcmVudCIgc3Ryb2tlLXdpZHRoPSIyIi8+CgogIDwhLS0gVGFpbCBvZiB0aGUgU3BlZWNoIEJ1YmJsZSAtLT4KICA8cGF0aCBkPSJNIDIwLDIxIEwgMjUsMjUgTCAzMCwyMSBaIiBmaWxsPSJ0cmFuc3BhcmVudCIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIyIi8+Cjwvc3ZnPgo=');\n background-image: url('data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgY2xhc3M9Imljb24tbWQiPgogIDxwb2x5Z29uIHBvaW50cz0iNC4yNSw0LjI1IDkuMjUsNC4yNSA2Ljc1LDkuMjUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPjwvcG9seWdvbj4KICA8cG9seWdvbiBwb2ludHM9IjE0Ljc1LDQuMjUgMTkuNzUsNC4yNSAxNy4yNSw5LjI1IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJub25lIj48L3BvbHlnb24+CiAgPHBvbHlnb24gcG9pbnRzPSI0LjI1LDE0Ljc1IDkuMjUsMTQuNzUgNi43NSwxOS43NSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0ibm9uZSI+PC9wb2x5Z29uPgogIDxwb2x5Z29uIHBvaW50cz0iMTQuNzUsMTQuNzUgMTkuNzUsMTQuNzUgMTcuMjUsMTkuNzUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPjwvcG9seWdvbj4KPC9zdmc+Cg==');\n width: 24px;\n height: 24px;\n}\n\n.icon-hamburger {\n background-image: url('data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDI0IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDwhLS0gVG9wIFN0cmlwZSAtLT4KICA8cmVjdCB4PSI0IiB5PSI2IiB3aWR0aD0iMTYiIGhlaWdodD0iMiIgZmlsbD0iYmxhY2siPjwvcmVjdD4KCiAgPCEtLSBNaWRkbGUgU3RyaXBlIC0tPgogIDxyZWN0IHg9IjQiIHk9IjExIiB3aWR0aD0iMTYiIGhlaWdodD0iMiIgZmlsbD0iYmxhY2siPjwvcmVjdD4KCiAgPCEtLSBCb3R0b20gU3RyaXBlIC0tPgogIDxyZWN0IHg9IjQiIHk9IjE2IiB3aWR0aD0iMTYiIGhlaWdodD0iMiIgZmlsbD0iYmxhY2siPjwvcmVjdD4KPC9zdmc+Cg==');\n width: 24px;\n height: 24px;\n background-size: contain;\n background-repeat: no-repeat;\n}\n*/\n",".modal {\n display: flex; // Positioned behind other elements so not visible\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background-color: rgb(0 0 0 / 50%); /* semi-transparent background */\n z-index: -1; /* Start behind other elements */\n overflow: scroll;\n opacity: 0; /* Start invisible */\n pointer-events: none; /* Prevent interaction when modal is not visible */\n}\n\n.modal-header {\n font-weight: 700;\n background-color: var(--modal-header-bg-color);\n padding: 0 1rem;\n border-bottom: 1px solid var(--border-color);\n\n .button {\n color: var(--text-color);\n background-color: var(--bg-color);\n padding: 0.35rem;\n line-height: 0.5rem;\n border-radius: 0.1rem;\n }\n\n .button:hover {\n position: relative;\n top: 1px;\n }\n\n h2 {\n color: var(--light-text-color);\n\n @extend %font-weight-boldest;\n }\n}\n\n.modal-content {\n background: var(--bg-color);\n width: 640px;\n min-width: 320px;\n max-width: 50vw;\n margin: auto; /* Center the modal */\n // border-radius: 2px;\n // overflow: hidden; /* Ensures the border-radius applies to children */\n @extend %box-shadow-modal;\n}\n\n.modal-body {\n padding: 1rem;\n}\n\n.modal.show {\n z-index: 20000;\n opacity: 1; /* Fully visible */\n}\n","label {\n @extend %font-weight-boldest;\n\n padding-bottom: 0.5rem;\n display: block;\n}\n\ntextarea {\n padding: 0.5rem;\n resize: none;\n}\n\ninput,\ntextarea {\n width: 100%;\n padding: 0.5rem 0.75rem;\n display: inline-block;\n border: 1px solid var(--border-color);\n}\n\ninput.error,\ntextarea.error {\n border: 1px solid var(--error-color) !important;\n}\n\ninput:focus,\ntextarea:focus,\n[contenteditable]:focus {\n border: 1px solid var(--border-color);\n border-color: var(--secondary-color-lighten-40);\n outline: none !important;\n\n @extend %box-shadow-hover;\n}\n\ninput:hover,\ntextarea:hover {\n border: 1px solid var(--secondary-color-lighten-40);\n}\n\n.input {\n margin-bottom: 0.5rem;\n}\n","/* Styling for lists */\nul {\n display: flex;\n flex-direction: column;\n width: 100%;\n\n li {\n border: 1px solid transparent; /* Invisible border by default */\n position: relative;\n display: flex; /* Use flexbox layout */\n justify-content: left;\n padding: 0.5rem 0.75rem;\n cursor: pointer;\n width: 100%;\n white-space: nowrap; /* Prevent text from wrapping */\n\n .col {\n overflow: hidden; /* Hide overflowing text */\n text-overflow: ''; /* Display ellipsis (...) for overflowing text */\n }\n\n button {\n padding: 0 0.5rem;\n visibility: hidden;\n }\n\n /*\n .list-item-edit:after {\n content: \"...\"; // \\00a0 is a non-breaking space\n }\n */\n }\n\n li.selected {\n @extend %font-weight-boldest;\n\n // NOTE: Should match #chat-header border-bottom\n border-top-color: #cccccc5e;\n }\n\n li.selected::after {\n position: absolute;\n right: 1rem;\n padding-left: 0.5rem;\n content: '\\203A\\00a0'; // \\00a0 is a non-breaking space\n }\n\n li.hover {\n border-top-color: #cccccc5e;\n\n button {\n visibility: visible;\n }\n }\n\n li.hover::after {\n display: none;\n }\n}\n","button {\n background-color: var(--button-secondary-bgcolor);\n z-index: 1;\n border: none;\n cursor: pointer;\n}\n\n.button {\n padding: 0.75rem 1rem;\n\n i {\n display: inline-block;\n }\n}\n\n.button:hover,\n.button.selected {\n @extend %box-shadow-hover;\n}\n\n.button-small {\n padding: 0.25rem 1rem;\n}\n\n.button-mini {\n padding: 0;\n}\n\n/* Primary button */\n.button-primary {\n @extend %font-weight-boldest;\n @extend %box-shadow;\n}\n\n.buttons {\n display: flex;\n\n .button {\n border-radius: 0;\n width: 100%;\n }\n}\n\n.button-large {\n padding: 0 2rem;\n}\n","/* Utilities */\n.hidden {\n display: none;\n}\n\n.float-right {\n float: right;\n}\n\n.mt-1 {\n margin-top: 0.5rem;\n}\n\n.d-inline {\n display: inline-block;\n}\n\n.d-block {\n display: block;\n}\n","%spinner {\n border: 2px solid #f3f3f3;\n border-top: 2px solid var(--primary-color);\n border-radius: 50%;\n width: 20px;\n height: 20px;\n animation: spin 2s linear infinite;\n}\n\n@keyframes spin {\n 0% {\n transform: rotate(0deg);\n }\n\n 100% {\n transform: rotate(360deg);\n }\n}\n\n%dot {\n width: 1rem;\n height: 1rem;\n background-color: var(--blue);\n border-radius: 50%;\n animation: pulse 2s infinite;\n}\n\n@keyframes pulse {\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n\n 50% {\n transform: scale(1.3);\n opacity: 0.7;\n }\n\n 100% {\n transform: scale(0.9);\n opacity: 0.8;\n }\n}\n\n%dot2 {\n width: 24px;\n height: 24px;\n background-color: blue;\n border-radius: 50%;\n animation:\n pulse 2s infinite,\n change-color 4s infinite;\n}\n\n@keyframes pulse {\n 0%,\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n\n 50% {\n transform: scale(1.2);\n opacity: 0.7;\n }\n}\n\n@keyframes change-color {\n 0% {\n background-color: blue;\n }\n\n 33% {\n background-color: red;\n }\n\n 67% {\n background-color: green;\n }\n\n 100% {\n background-color: blue;\n }\n}\n\n.waiting {\n @extend %spinner;\n}\n","/* General styling */\nbody,\nhtml {\n margin: 0;\n padding: 0;\n height: 100%;\n}\n\nbody {\n color: var(--text-color);\n background-color: var(--bg-color);\n}\n\n.chat-link {\n display: inline-block;\n}\n\na {\n text-decoration: none;\n}\n\n.max-width-80 {\n max-width: 80%;\n}\n\n.text-right {\n text-align: right;\n}\n","// Lists\nul {\n li {\n transition: all 0.3s;\n }\n}\n\n// Sidebar\n#sidebar {\n transition: min-width 0.5s ease-out, max-width 1s ease-out;\n}\n\n#sidebar.collapsed {\n transition: min-width 0.5s ease-in, max-width 1s ease-in;\n}\n\n// Modal dialogs\n.modal {\n transform: scale(0.9); /* Start slightly scaled down */\n transition: opacity 0.5s ease, transform 0.5s ease-in; /* Transition effect */\n}\n\n.modal.show {\n transition: opacity 0.5s ease, transform 1s ease-out; /* Transition effect */\n transform: scale(1); /* Scale to original size */\n pointer-events: auto; /* Allow interactions */\n}\n\n","@media (width <= 1024px) {\n html {\n font-size: 0.875rem;\n }\n}\n\n@media (width <= 768px) {\n html {\n font-size: 0.75rem;\n }\n}\n",".hoverable {\n visibility: collapse;\n}\n\n.hover {\n .hoverable {\n visibility: visible;\n }\n}\n",".tab-container {\n display: flex;\n border: 1px solid #ccc;\n}\n\n.tab-button {\n padding: 10px 20px;\n cursor: pointer;\n background-color: #f0f0f0;\n border: none;\n outline: none;\n}\n\n.active-tab-button {\n @extend %box-shadow;\n}\n\n.tab-content {\n display: none;\n}\n","/* Chat app container */\n#chat-app {\n display: flex;\n height: 100vh;\n flex-direction: column;\n}\n","#chat-header {\n // NOTE: Should match #chat-form border-top\n border-bottom: 1px solid #ddd;\n\n @extend %box-shadow;\n\n z-index: 4;\n\n .button {\n height: 100%;\n }\n}\n\n.hamburger-menu {\n cursor: pointer;\n padding-left: 0.75rem;\n padding-right: 0.5rem;\n display: inline-block;\n}\n\n.hamburger-menu:hover {\n @extend %box-shadow;\n}\n\n.hamburger-menu .bar {\n width: 1.5rem;\n height: 2px;\n background-color: #333;\n margin: 6px 0;\n transition: 0.4s;\n}\n","/* Chat history */\n#chat-history {\n mask-image: linear-gradient(180deg, var(--white) 95%, transparent);\n display: flex;\n flex-grow: 1;\n flex-direction: column;\n padding: 1rem;\n max-width: 1024px;\n width: 100%; /* Full width of its parent */\n overflow-y: auto; /* Enable vertical scrolling */\n}\n\n/* Base styling for all messages */\n.chat-message {\n padding: 0.5rem;\n padding-top: 0;\n position: relative;\n\n .drop-down-menu {\n z-index: 100;\n position: absolute;\n top: 0;\n right: 0;\n }\n}\n\n/* Styling for user messages */\n.user-chat-message {\n @extend %font-weight-bolder;\n}\n\n/* Styling for system messages */\n.assistant-chat-message {\n margin-bottom: 0.5rem;\n}\n","#chat-form {\n flex: 0 0 60px; /* fixed height */\n display: flex;\n align-items: center;\n\n // NOTE: Should match #chat-header border-bottom\n border-top: 1px solid #cccccc5e;\n\n .textarea {\n height: 100%;\n width: 100%;\n display: flex;\n flex-grow: 1;\n }\n\n .buttons {\n display: flex;\n position: relative;\n height: 100%;\n }\n\n button {\n background-color: var(--bg-color);\n }\n\n textarea {\n padding: 1rem;\n resize: none;\n border: 0;\n }\n\n .icon-send {\n font-size: 1.2rem;\n }\n}\n\n#message-input {\n width: 100%;\n padding: 0.25rem;\n}\n",".chat-list-item {\n z-index: 2;\n\n .chat-title {\n // text-overflow: ellipsis;\n mask-image: linear-gradient(\n 90deg,\n var(--white) 95%,\n transparent\n ); // Fade out title instead of ellipsis\n }\n\n .button {\n padding: 0.25rem 0.75rem;\n }\n}\n\n.list-item.selected {\n background: var(--white);\n\n @extend %box-shadow;\n\n z-index: 2;\n}\n\n.list-item.hover {\n @extend %box-shadow-hover;\n\n z-index: 3;\n}\n","#chat-area {\n flex-grow: 1;\n display: flex;\n flex-direction: row;\n overflow: auto;\n\n}\n\n#chat-menu-button {\n background-color: var(--secondary-bg-color);\n}\n","#chat-title {\n @extend %font-weight-boldest;\n\n padding: 0.5rem 0.25rem;\n font-size: 1.2rem;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n}\n","#sidebar {\n @extend %box-shadow;\n\n background-color: var(--secondary-bg-color);\n border-right: 1px solid #cccccc5e;\n min-width: 200px;\n max-width: 480px;\n overflow-y: auto;\n\n .buttons {\n width: 100%;\n display: flex;\n flex-grow: 1;\n }\n}\n\n#search-input {\n padding-left: 0.75rem;\n}\n\n#sidebar.collapsed {\n min-width: 0;\n max-width: 0;\n padding: 0;\n}\n",".drop-down-menu {\n position: relative;\n}\n\n.drop-down-menu-items {\n background: var(--bg-color);\n position: absolute;\n top: 100%; /* Position below the button */\n display: none; /* Hide initially */\n font-size: 0.75rem;\n white-space: nowrap;\n\n i[class^='icon-']::before {\n padding-right: 0.5rem;\n }\n\n @extend %box-shadow;\n\n left: 0;\n\n .text {\n padding: 0.5rem;\n }\n}\n\n.drop-down-menu-items.visible {\n z-index: 10000;\n display: inline-block;\n}\n\n.drop-down-menu-right {\n .drop-down-menu-items {\n right: 0 !important;\n left: auto;\n }\n}\n",".notification {\n position: fixed;\n top: 0;\n left: 0;\n color: var(--bg-color);\n width: calc(100vw - 2rem);\n z-index: 30000;\n background-color: var(--bg-color);\n padding: 1rem;\n margin: 1rem;\n\n @extend %box-shadow-modal;\n\n border-radius: var(--border-radius);\n\n .button {\n border-radius: 2px;\n padding: 0.5rem;\n line-height: 0.5rem;\n }\n}\n\n.notification-error {\n background: var(--error-color);\n}\n",".speech {\n position: relative;\n background: #f0f0f0;\n border: var(--border) solid black;\n padding: 20px;\n border-radius: 10px;\n margin: 40px;\n max-width: 300px;\n}\n\n.speech::after {\n content: '';\n position: absolute;\n border-style: solid;\n border-width: 10px 20px 10px 0;\n border-color: transparent #f0f0f0 transparent transparent;\n display: block;\n width: 0;\n z-index: 1;\n left: -20px;\n top: calc(50% - 10px);\n}\n"]} \ No newline at end of file diff --git a/dist/theme.7fcc2895.js b/dist/theme.7fcc2895.js new file mode 100644 index 0000000..f6f47d0 --- /dev/null +++ b/dist/theme.7fcc2895.js @@ -0,0 +1,345 @@ +// modules are defined as an array +// [ module function, map of requires ] +// +// map of requires is short require name -> numeric require +// +// anything defined in a previous bundle is accessed via the +// orig method which is the require for previous bundles +parcelRequire = (function (modules, cache, entry, globalName) { + // Save the require from previous bundle to this closure if any + var previousRequire = typeof parcelRequire === 'function' && parcelRequire; + var nodeRequire = typeof require === 'function' && require; + + function newRequire(name, jumped) { + if (!cache[name]) { + if (!modules[name]) { + // if we cannot find the module within our internal map or + // cache jump to the current global require ie. the last bundle + // that was added to the page. + var currentRequire = typeof parcelRequire === 'function' && parcelRequire; + if (!jumped && currentRequire) { + return currentRequire(name, true); + } + + // If there are other bundles on this page the require from the + // previous one is saved to 'previousRequire'. Repeat this as + // many times as there are bundles until the module is found or + // we exhaust the require chain. + if (previousRequire) { + return previousRequire(name, true); + } + + // Try the node require function if it exists. + if (nodeRequire && typeof name === 'string') { + return nodeRequire(name); + } + + var err = new Error('Cannot find module \'' + name + '\''); + err.code = 'MODULE_NOT_FOUND'; + throw err; + } + + localRequire.resolve = resolve; + localRequire.cache = {}; + + var module = cache[name] = new newRequire.Module(name); + + modules[name][0].call(module.exports, localRequire, module, module.exports, this); + } + + return cache[name].exports; + + function localRequire(x){ + return newRequire(localRequire.resolve(x)); + } + + function resolve(x){ + return modules[name][1][x] || x; + } + } + + function Module(moduleName) { + this.id = moduleName; + this.bundle = newRequire; + this.exports = {}; + } + + newRequire.isParcelRequire = true; + newRequire.Module = Module; + newRequire.modules = modules; + newRequire.cache = cache; + newRequire.parent = previousRequire; + newRequire.register = function (id, exports) { + modules[id] = [function (require, module) { + module.exports = exports; + }, {}]; + }; + + var error; + for (var i = 0; i < entry.length; i++) { + try { + newRequire(entry[i]); + } catch (e) { + // Save first error but execute all entries + if (!error) { + error = e; + } + } + } + + if (entry.length) { + // Expose entry point to Node, AMD or browser globals + // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js + var mainExports = newRequire(entry[entry.length - 1]); + + // CommonJS + if (typeof exports === "object" && typeof module !== "undefined") { + module.exports = mainExports; + + // RequireJS + } else if (typeof define === "function" && define.amd) { + define(function () { + return mainExports; + }); + + //