This repository has been archived on 2020-11-02. You can view files and clone it, but cannot push or open issues or pull requests.
TripSit_Suite/public/js/bundle.js.map
2020-11-01 22:46:04 +00:00

1 line
664 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./client/js/settings.js","webpack:///./client/js/store-settings.js","webpack:///./client/js/store.js","webpack:///./client/js/socket.js","webpack:///./client/js/eventbus.js","webpack:///./client/components/Username.vue?dc9c","webpack:///./client/components/Username.vue?5bd4","webpack:///client/components/Username.vue","webpack:///./client/js/helpers/colorClass.js","webpack:///./client/components/Username.vue","webpack:///./client/js/helpers/ircmessageparser/parseStyle.js","webpack:///./client/js/helpers/ircmessageparser/findChannels.js","webpack:///./client/js/helpers/ircmessageparser/findEmoji.js","webpack:///./client/js/helpers/ircmessageparser/findNames.js","webpack:///./client/js/helpers/ircmessageparser/anyIntersection.js","webpack:///./client/js/helpers/ircmessageparser/fill.js","webpack:///./client/js/helpers/ircmessageparser/merge.js","webpack:///./client/components/LinkPreviewToggle.vue?77e2","webpack:///client/components/LinkPreviewToggle.vue","webpack:///./client/components/LinkPreviewToggle.vue","webpack:///./client/components/LinkPreviewToggle.vue?5a50","webpack:///./client/components/LinkPreviewFileSize.vue?caba","webpack:///client/components/LinkPreviewFileSize.vue","webpack:///./client/components/LinkPreviewFileSize.vue","webpack:///./client/components/LinkPreviewFileSize.vue?7839","webpack:///./client/components/InlineChannel.vue?4bda","webpack:///client/components/InlineChannel.vue","webpack:///./client/components/InlineChannel.vue","webpack:///./client/components/InlineChannel.vue?3835","webpack:///./client/js/helpers/parse.js","webpack:///./client/components/ParsedMessage.vue?0e82","webpack:///client/components/ParsedMessage.vue","webpack:///./client/components/ParsedMessage.vue","webpack:///./client/components/RevealPassword.vue?0222","webpack:///client/components/RevealPassword.vue","webpack:///./client/components/RevealPassword.vue","webpack:///./client/components/RevealPassword.vue?1579","webpack:///./client/components/Windows/SignIn.vue?e4a7","webpack:///client/components/Windows/SignIn.vue","webpack:///./client/components/Windows/SignIn.vue","webpack:///./client/components/Windows/SignIn.vue?53e6","webpack:///./client/components/SidebarToggle.vue?50f6","webpack:///client/components/SidebarToggle.vue","webpack:///./client/components/SidebarToggle.vue","webpack:///./client/components/SidebarToggle.vue?2f39","webpack:///./client/components/NetworkForm.vue?fcc5","webpack:///client/components/NetworkForm.vue","webpack:///./client/components/NetworkForm.vue","webpack:///./client/components/NetworkForm.vue?3447","webpack:///./client/components/Windows/Connect.vue?f870","webpack:///client/components/Windows/Connect.vue","webpack:///./client/components/Windows/Connect.vue","webpack:///./client/components/Windows/Connect.vue?93ce","webpack:///./client/components/Session.vue?f6ea","webpack:///client/components/Session.vue","webpack:///./client/components/Session.vue","webpack:///./client/components/Session.vue?4fb6","webpack:///client/components/Windows/Settings.vue","webpack:///./client/components/Windows/Settings.vue?e3be","webpack:///./client/components/Windows/Settings.vue","webpack:///./client/components/Windows/Settings.vue?c5ce","webpack:///./client/components/VersionChecker.vue?6044","webpack:///client/components/VersionChecker.vue","webpack:///./client/components/Windows/Help.vue?d720","webpack:///client/components/Windows/Help.vue","webpack:///./client/components/VersionChecker.vue","webpack:///./client/components/VersionChecker.vue?1af2","webpack:///./client/components/Windows/Help.vue","webpack:///./client/components/Windows/Help.vue?37b1","webpack:///./client/components/Windows/Changelog.vue?a486","webpack:///client/components/Windows/Changelog.vue","webpack:///./client/components/Windows/Changelog.vue","webpack:///./client/components/Windows/Changelog.vue?2ba7","webpack:///./client/components/Windows/NetworkEdit.vue?441c","webpack:///client/components/Windows/NetworkEdit.vue","webpack:///./client/components/Windows/NetworkEdit.vue","webpack:///./client/components/Windows/NetworkEdit.vue?86fa","webpack:///./client/components/LinkPreview.vue?bad0","webpack:///client/components/LinkPreview.vue","webpack:///./client/components/LinkPreview.vue","webpack:///./client/components/LinkPreview.vue?8d2e","webpack:///./client/components/MessageTypes/index.js","webpack:///client/components/Message.vue","webpack:///./client/components/Message.vue?e606","webpack:///./client/components/Message.vue","webpack:///./client/components/Message.vue?8eb3","webpack:///client/components/MessageCondensed.vue","webpack:///./client/components/MessageCondensed.vue?6602","webpack:///./client/components/MessageCondensed.vue","webpack:///./client/components/MessageCondensed.vue?75bf","webpack:///client/components/DateMarker.vue","webpack:///./client/components/DateMarker.vue?d4fb","webpack:///./client/components/DateMarker.vue","webpack:///./client/components/DateMarker.vue?3d78","webpack:///client/components/MessageList.vue","webpack:///./client/components/MessageList.vue?08ce","webpack:///./client/js/clipboard.js","webpack:///./client/components/MessageList.vue","webpack:///./client/components/MessageList.vue?09a7","webpack:///./client/js/autocompletion.js","webpack:///client/components/ChatInput.vue","webpack:///./client/components/ChatInput.vue?aec6","webpack:///./client/components/ChatInput.vue","webpack:///./client/components/ChatInput.vue?e405","webpack:///client/components/ChatUserList.vue","webpack:///./client/components/ChatUserList.vue?8e0a","webpack:///./client/components/ChatUserList.vue","webpack:///./client/components/ChatUserList.vue?50fe","webpack:///./client/components/Special/ListBans.vue?a60b","webpack:///client/components/Special/ListBans.vue","webpack:///./client/components/Special/ListBans.vue","webpack:///./client/components/Special/ListBans.vue?c611","webpack:///./client/components/Special/ListInvites.vue?0bc7","webpack:///client/components/Special/ListInvites.vue","webpack:///./client/components/Special/ListInvites.vue","webpack:///./client/components/Special/ListInvites.vue?9bc3","webpack:///./client/components/Special/ListChannels.vue?9a1c","webpack:///client/components/Special/ListChannels.vue","webpack:///./client/components/Special/ListChannels.vue","webpack:///./client/components/Special/ListChannels.vue?3d54","webpack:///./client/components/Special/ListIgnored.vue?62c4","webpack:///client/components/Special/ListIgnored.vue","webpack:///./client/components/Special/ListIgnored.vue","webpack:///./client/components/Special/ListIgnored.vue?5cfa","webpack:///./client/components/Chat.vue?e648","webpack:///client/components/Chat.vue","webpack:///./client/components/RoutedChat.vue?b32c","webpack:///client/components/RoutedChat.vue","webpack:///./client/components/Chat.vue","webpack:///./client/components/Chat.vue?c102","webpack:///./client/components/RoutedChat.vue","webpack:///./client/components/RoutedChat.vue?2df2","webpack:///./client/js/router.js","webpack:///./client/js/localStorage.js","webpack:///./client/js/helpers/localetime.js","webpack:///./scripts/noop.js","webpack:///./client/js/constants.js","webpack:///./client/js/upload.js","webpack:///./client/js/helpers/friendlysize.js","webpack:///./client/js/auth.js","webpack:///./client/js/location.js","webpack:///./client/js/commands/index.js","webpack:///./client/js/webpush.js","webpack:///./client/js/helpers/ircmessageparser/findLinks.js","webpack:///./client/js/helpers/ircmessageparser/cleanIrcMessage.js","webpack:///./client/components/NetworkList.vue?d036","webpack:///./client/components/ConfirmDialog.vue?709a","webpack:///./client/components/Mentions.vue?828a","webpack:///./client/components/NetworkForm.vue?3f29","webpack:///./client/components/Session.vue?2c08","webpack:///./client/components/Windows/Settings.vue?0d12","webpack:///./client/components/MessageTypes sync nonrecursive \\.vue$","webpack:///./client/js/commands sync \\.js$","webpack:///./client/js/commands/collapse.js","webpack:///./client/js/commands/expand.js","webpack:///./client/js/commands/join.js","webpack:///./client/js/helpers/isIgnoredKeybind.js","webpack:///./client/js/helpers/collapseNetwork.js","webpack:///./client/js/helpers/roundBadgeNumber.js","webpack:///./client/js/helpers/isChannelCollapsed.js","webpack:///./client/components/ChannelWrapper.vue?f321","webpack:///client/components/ChannelWrapper.vue","webpack:///./client/components/ChannelWrapper.vue","webpack:///./client/components/ChannelWrapper.vue?3c2b","webpack:///./client/components/NetworkLobby.vue?ba11","webpack:///client/components/NetworkLobby.vue","webpack:///./client/components/NetworkLobby.vue","webpack:///./client/components/NetworkLobby.vue?522a","webpack:///./client/components/Channel.vue?633d","webpack:///client/components/Channel.vue","webpack:///./client/components/Channel.vue","webpack:///./client/components/Channel.vue?de37","webpack:///./client/components/JoinChannel.vue?feab","webpack:///client/components/JoinChannel.vue","webpack:///./client/components/NetworkList.vue?6448","webpack:///client/components/NetworkList.vue","webpack:///./client/components/JoinChannel.vue","webpack:///./client/components/JoinChannel.vue?1c60","webpack:///./client/components/Sidebar.vue?e7b7","webpack:///client/components/Sidebar.vue","webpack:///./client/components/NetworkList.vue","webpack:///./client/components/NetworkList.vue?7ec9","webpack:///./client/components/Sidebar.vue","webpack:///./client/components/Sidebar.vue?5045","webpack:///./client/components/ImageViewer.vue?b851","webpack:///client/components/ImageViewer.vue","webpack:///./client/components/ImageViewer.vue","webpack:///./client/components/ImageViewer.vue?5ab6","webpack:///client/components/ContextMenu.vue","webpack:///./client/components/ContextMenu.vue?bb9f","webpack:///./client/js/helpers/contextMenu.js","webpack:///./client/components/ContextMenu.vue","webpack:///./client/components/ContextMenu.vue?8e02","webpack:///./client/components/ConfirmDialog.vue?03d8","webpack:///client/components/ConfirmDialog.vue","webpack:///./client/components/ConfirmDialog.vue","webpack:///./client/components/ConfirmDialog.vue?d8f2","webpack:///client/components/Mentions.vue","webpack:///./client/components/Mentions.vue?a45b","webpack:///./client/components/Mentions.vue","webpack:///./client/components/Mentions.vue?5b25","webpack:///client/components/App.vue","webpack:///./client/components/App.vue?bf2c","webpack:///./client/components/App.vue","webpack:///./client/components/App.vue?6115","webpack:///./client/js/socket-events/connection.js","webpack:///./client/js/socket-events/auth.js","webpack:///./client/js/socket-events/commands.js","webpack:///./client/js/socket-events/init.js","webpack:///./client/js/helpers/parseIrcUri.js","webpack:///./client/js/socket-events/join.js","webpack:///./client/js/socket-events/more.js","webpack:///./client/js/socket-events/msg.js","webpack:///./client/js/socket-events/msg_preview.js","webpack:///./client/js/socket-events/msg_special.js","webpack:///./client/js/socket-events/names.js","webpack:///./client/js/socket-events/network.js","webpack:///./client/js/socket-events/nick.js","webpack:///./client/js/socket-events/open.js","webpack:///./client/js/socket-events/part.js","webpack:///./client/js/socket-events/quit.js","webpack:///./client/js/socket-events/sync_sort.js","webpack:///./client/js/socket-events/topic.js","webpack:///./client/js/socket-events/users.js","webpack:///./client/js/socket-events/sign_out.js","webpack:///./client/js/socket-events/sessions_list.js","webpack:///./client/js/socket-events/configuration.js","webpack:///./client/js/socket-events/changelog.js","webpack:///./client/js/socket-events/setting.js","webpack:///./client/js/socket-events/history_clear.js","webpack:///./client/js/socket-events/mentions.js","webpack:///./client/js/keybinds.js","webpack:///./client/js/vue.js","webpack:///./client/components/MessageTypes/back.vue?7320","webpack:///./client/components/MessageTypes/back.vue?af94","webpack:///client/components/MessageTypes/back.vue","webpack:///./client/components/MessageTypes/back.vue","webpack:///./client/components/MessageTypes/kick.vue?eaa0","webpack:///./client/components/MessageTypes/kick.vue?86c1","webpack:///client/components/MessageTypes/kick.vue","webpack:///./client/components/MessageTypes/kick.vue","webpack:///./client/components/MessageTypes/mode_channel.vue?2e09","webpack:///./client/components/MessageTypes/mode_channel.vue?a191","webpack:///client/components/MessageTypes/mode_channel.vue","webpack:///./client/components/MessageTypes/mode_channel.vue","webpack:///./client/components/MessageTypes/error.vue?d6d0","webpack:///./client/components/MessageTypes/error.vue?4fb3","webpack:///client/components/MessageTypes/error.vue","webpack:///./client/components/MessageTypes/error.vue","webpack:///./client/components/MessageTypes/ctcp_request.vue?451c","webpack:///./client/components/MessageTypes/ctcp_request.vue?276e","webpack:///client/components/MessageTypes/ctcp_request.vue","webpack:///./client/components/MessageTypes/ctcp_request.vue","webpack:///./client/components/MessageTypes/ctcp.vue?76a6","webpack:///./client/components/MessageTypes/ctcp.vue?6129","webpack:///client/components/MessageTypes/ctcp.vue","webpack:///./client/components/MessageTypes/ctcp.vue","webpack:///./client/components/MessageTypes/chghost.vue?a471","webpack:///./client/components/MessageTypes/chghost.vue?1de4","webpack:///client/components/MessageTypes/chghost.vue","webpack:///./client/components/MessageTypes/chghost.vue","webpack:///./client/components/MessageTypes/topic.vue?f7da","webpack:///./client/components/MessageTypes/topic.vue?4c2f","webpack:///client/components/MessageTypes/topic.vue","webpack:///./client/components/MessageTypes/topic.vue","webpack:///./client/components/MessageTypes/topic_set_by.vue?52af","webpack:///./client/components/MessageTypes/topic_set_by.vue?9220","webpack:///client/components/MessageTypes/topic_set_by.vue","webpack:///./client/components/MessageTypes/topic_set_by.vue","webpack:///./client/components/MessageTypes/join.vue?e97c","webpack:///./client/components/MessageTypes/join.vue?bd54","webpack:///client/components/MessageTypes/join.vue","webpack:///./client/components/MessageTypes/join.vue","webpack:///./client/components/MessageTypes/invite.vue?690c","webpack:///./client/components/MessageTypes/invite.vue?64b9","webpack:///client/components/MessageTypes/invite.vue","webpack:///./client/components/MessageTypes/invite.vue","webpack:///./client/components/MessageTypes/quit.vue?5cde","webpack:///./client/components/MessageTypes/quit.vue?729d","webpack:///client/components/MessageTypes/quit.vue","webpack:///./client/components/MessageTypes/quit.vue","webpack:///./client/components/MessageTypes/part.vue?5d4a","webpack:///./client/components/MessageTypes/part.vue?1879","webpack:///client/components/MessageTypes/part.vue","webpack:///./client/components/MessageTypes/part.vue","webpack:///./client/components/MessageTypes/nick.vue?925d","webpack:///./client/components/MessageTypes/nick.vue?1710","webpack:///client/components/MessageTypes/nick.vue","webpack:///./client/components/MessageTypes/nick.vue","webpack:///./client/components/MessageTypes/raw.vue?cb31","webpack:///./client/components/MessageTypes/raw.vue?3d29","webpack:///client/components/MessageTypes/raw.vue","webpack:///./client/components/MessageTypes/raw.vue","webpack:///./client/components/MessageTypes/monospace_block.vue?2287","webpack:///./client/components/MessageTypes/monospace_block.vue?1872","webpack:///client/components/MessageTypes/monospace_block.vue","webpack:///./client/components/MessageTypes/monospace_block.vue","webpack:///./client/components/MessageTypes/mode.vue?0361","webpack:///./client/components/MessageTypes/mode.vue?4b15","webpack:///client/components/MessageTypes/mode.vue","webpack:///./client/components/MessageTypes/mode.vue","webpack:///./client/components/MessageTypes/whois.vue?a347","webpack:///./client/components/MessageTypes/whois.vue?3db8","webpack:///client/components/MessageTypes/whois.vue","webpack:///./client/components/MessageTypes/whois.vue","webpack:///./client/components/MessageTypes/away.vue?283e","webpack:///./client/components/MessageTypes/away.vue?c7b1","webpack:///client/components/MessageTypes/away.vue","webpack:///./client/components/MessageTypes/away.vue"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","0","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","defaultSettingConfig","default","sync","config","obj","newConfig","settingName","normalizeConfig","syncSettings","store","auto","socket","emit","advanced","autocomplete","nickPostfix","coloredNicks","desktopNotifications","commit","root","Notification","permission","requestPermission","highlights","highlightExceptions","awayMessage","links","motd","notification","notifyAllMessages","showSeconds","use12hClock","statusMessages","theme","document","getElementById","dataset","serverTheme","themeEl","themeUrl","attributes","href","themeColor","state","serverConfiguration","themes","filter","querySelector","content","media","uploadCanvas","userStyles","test","location","search","innerHTML","createState","loadFromLocalStorage","storedSettings","JSON","parse","storage","e","remove","join","assignStoredSettings","defaultSettings","newSettings","appName","title","detectDesktopNotificationState","Vue","use","Vuex","Store","appLoaded","activeChannel","currentUserVisibleError","desktopNotificationState","isAutoCompleting","isConnected","networks","mentions","hasServiceWorker","pushNotificationState","sessions","sidebarOpen","sidebarDragging","userlistOpen","versionData","versionStatus","versionDataExpired","serverHasSettings","mutations","channel","error","refreshDesktopNotificationState","payload","removeNetwork","networkId","findIndex","uuid","sortNetworks","sortFn","sort","toggleSidebar","toggleUserlist","getters","findChannelOnCurrentNetwork","toLowerCase","network","channels","find","findChannel","id","findNetwork","highlightCount","highlight","initChannel","pendingMessage","inputHistoryPosition","inputHistory","historyLoading","scrolledToBottom","editTopic","moreHistoryAvailable","totalMessages","messages","type","usersOutdated","registerModule","namespaced","set","actions","syncAll","force","applyAll","update","settingConfig","stringify","io","transports","body","path","pathname","autoConnect","reconnection","classList","contains","events","Map","on","handler","has","off","item","evt","map","str","hash","charCodeAt","component","_vm","this","_h","$createElement","_self","_c","_g","class","nickColor","active","attrs","user","nick","$event","preventDefault","openContextMenu","onHover","mouseenter","hover","_t","_v","_s","colorRx","hexColorRx","controlCodesRx","properties","prepare","text","colorCodes","bold","textColor","bgColor","hexColor","hexBgColor","italic","underline","strikethrough","monospace","start","position","resetStyle","undefined","emitFragment","processedText","replace","fragmentStart","end","match","Number","toUpperCase","tmp","parseStyle","reduce","prev","curr","lastEntry","every","concat","findChannels","channelPrefixes","userModes","userModePattern","escapeRegExp","channelPrefixPattern","channelPattern","channelRegExp","RegExp","exec","index","emojiRegExp","require","findEmoji","emoji","nickRegExp","findNames","users","indexOf","anyIntersection","a","b","fill","existingEntries","acc","textSegment","sortParts","merge","textParts","styleFragments","cleanText","some","textPart","fragments","fragment","fragStart","Math","max","min","assign","link","opened","shown","ariaLabel","onClick","_e","staticClass","previewSize","emojiModifiersRegex","createElement","message","serverOptions","CHANTYPES","PREFIX","channelParts","linkParts","findLinks","emojiParts","nameParts","parts","classes","hasData","style","color","createFragment","preview","previews","dir","target","rel","linkEls","size","LinkPreviewFileSize","props","LinkPreviewToggle","InlineChannel","emojiWithoutModifiers","emojiMap","role","Username","isVisible","ref","onSubmit","domProps","getStoredUser","scopedSlots","_u","fn","slotProps","inFlight","$store","defaults","directives","rawName","expression","composing","$set","lockNetwork","public","Array","isArray","password","_i","$$a","$$el","$$c","checked","$$i","_q","hasSTSPolicy","tls","rejectUnauthorized","onNickChanged","useHexIp","_m","commands","resizeCommandsInput","displayPasswordField","sasl","setSaslAuth","saslPassword","disabled","handleSubmit","session","agent","ip","current","lastUse","signOut","installPromptEvent","addEventListener","onChange","settings","canRegisterProtocol","hasInstallPromptEvent","nativeInstallPrompt","registerProtocol","onForceSyncClick","_l","displayName","fileUpload","onPushButtonClick","playNotification","ldapEnabled","passwordChangeStatus","success","passwordErrors","changePassword","currentSession","activeSessions","token","otherSessions","isApple","version","changelog","networkData","sourceLoaded","isContentShown","onThumbnailClick","thumb","onThumbnailError","onPreviewReady","head","moreButtonLabel","onMoreClick","mediaType","imageMaxSize","requireViews","keys","substring","constants","MessageTypes","ParsedMessage","LinkPreview","self","isPreviousSource","command","from","messageTimeLocale","messageTime","param","isAction","messageComponent","tag","keepScrollPosition","statusmsgGroup","closed","isCollapsed","onCollapseClick","condensedText","localeDate","friendlyDate","unreadMarkerShown","chat","InstallTrigger","selection","getSelection","anchorNode","focusNode","range","getRangeAt","documentFragment","cloneContents","div","appendChild","selectAllChildren","setTimeout","removeChild","removeAllRanges","addRange","onShowMoreClick","onCopy","shouldDisplayDateMarker","shouldDisplayUnreadMarker","onLinkPreviewToggle","enableAutocomplete","input","tabCount","lastMatch","currentMatches","detail","Mousetrap","selectionStart","split","pop","completeNicks","newMatch","replaceNick","remainder","substr","selectionEnd","dispatchEvent","CustomEvent","editor","Textarea","textcomplete","Textcomplete","dropdown","className","placement","register","emojiStrategy","nicksStrategy","chanStrategy","commandStrategy","foregroundColorStrategy","backgroundColorStrategy","items","activate","hide","destroy","emojiSearchTerms","term","callback","fuzzyGrep","template","string","original","val","word","words","completeChans","completeCommands","colorCodeMap","fuzzy","pre","post","rendered","parseInt","pair","array","el","isFuzzy","lastMessage","u","me","otherUser","rawNicks","w","formattingHotkeys","bracketWraps","autocompletionRef","getInputPlaceholder","setPendingMessage","_k","keyCode","ctrlKey","shiftKey","altKey","metaKey","openFileUpload","onUploadInputChange","modes","removeHoverUser","userSearchInput","setUserSearchInput","navigateUserList","selectUser","getModeClass","hoverUser","activeUser","ban","hostmask","banned_by","localetime","banned_at","invite","invited_by","invited_at","chan","num_users","topic","when","openMentions","specialComponent","$refs","messageList","jumpToBottom","hideUserVisibleError","VueRouter","router","routes","SignIn","beforeEnter","to","next","Connect","route","queryParams","query","Settings","Help","Changelog","NetworkEdit","RoutedChat","navigate","routeName","params","currentRoute","catch","switchToChannel","beforeEach","watch","matched","app","imageViewer","$root","closeViewer","afterEach","innerWidth","mobileViewportPixels","firstUnread","navigator","serviceWorker","event","channelTarget","localStorage","setItem","getItem","removeItem","clear","time","dayjs","format","condensedTypes","Set","timeFormats","msgDefault","msgWithSeconds","msg12h","msg12hWithSeconds","instance","init","xhr","fileQueue","tokenKeepAlive","dragEnter","dragOver","dragLeave","drop","paste","uploadNextFileInQueue","mounted","overlay","uploadProgressbar","relatedTarget","dataTransfer","types","includes","add","files","kind","getAsFile","triggerUpload","clipboardData","handleResponse","wasQueueEmpty","maxFileSize","fileUploadMaxFileSize","file","requestToken","setProgress","toggle","width","setInterval","startsWith","renderImage","newFile","performUpload","fileReader","FileReader","onabort","onerror","abort","onload","img","Image","canvas","height","getContext","drawImage","toBlob","blob","File","src","readAsDataURL","XMLHttpRequest","upload","percent","floor","loaded","total","onreadystatechange","readyState","DONE","response","responseText","err","status","formData","FormData","append","open","send","clearInterval","url","insertUploadUrl","fullURL","URL","toString","textbox","initStart","headToCursor","cursorToTail","textBeforeTail","updateCursor","initialize","sizes","log","fixedSize","parseFloat","pow","toFixed","Auth","reload","togglePushSubscription","ready","then","registration","pushManager","getSubscription","existingSubscription","unsubscribe","successful","subscribe","applicationServerKey","userVisibleOnly","subscription","toJSON","console","once","hasSubscriptionOnServer","protocol","hostname","LinkifyIt","normalize","schema","noschema","linkify","tlds","commonSchemes","returnUrl","lastIndex","matches","findLinksWithSchema","matchFormatting","trim","webpackContext","req","webpackContextResolve","Error","code","resolve","messageIds","toggled","args","chanTypes","channelList","tagName","delete","count","connected","secure","transition","opacity","getAriaLabel","click","_b","$props","getExpandLabel","stopPropagation","unreadCount","joinChannelLabel","isJoinChannelShown","$emit","close","inputChannel","inputPassword","searchText","setSearchText","navigateResults","selectResult","deactivateSearch","activateSearch","results","setActiveSearchItem","activeSearchItem","isCurrentlyInTouch","onNetworkSort","onDragStart","onDragEnd","collapsed","onChannelSort","isPublic","backgroundColor","padding","borderRadius","fontSize","$route","isUpdateAvailable","notified","onMouseWheel","onTouchStart","previous","onImageLoad","onImageMouseDown","onImageTouchStart","label","lobby","special","action","eventbus","button","closeChannel","currentChannelModes","whois","containerClick","navigateMenu","activeItem","clickActiveItem","hoverItem","clickItem","resolvedMessages","hideAllMentions","msgId","hideMention","viewportClasses","handleDisconnect","updateLoadingMessage","timeout","skipReconnect","connect","requestIdleCallback","loading","textContent","attempt","sendBuffer","lastServerHash","showSignIn","g_TheLoungeRemoveLoading","reloadPage","disconnect","serverHash","doFastAuth","openChannel","hasConfig","mergeChannelData","oldChannels","newChannels","currentChannel","newNetworks","collapsedNetworks","currentNetwork","forEach","mergeNetworkData","nextTick","URLSearchParams","cleanParams","cleanUri","origin","history","replaceState","stringUri","uri","port","host","parseIrcUri","fromEntries","entries","handleQueryParams","shouldOpen","unshift","Audio","play","receivingChannel","isActiveChannel","msg","showInActive","unread","targetId","hasFocus","exception","cleanIrcMessage","timestamp","Date","postMessage","chanId","badge","icon","focus","notifyMessage","messageLimit","getTime","now","idx","updateUserList","previewIndex","isCurrentNetworkBeingRemoved","order","signout","dispatch","currentTheme","defaultTheme","returnValue","latest","packages","expiresAt","expires","jumpToChannel","targetChannel","element","scrollIntoView","block","inline","isIgnoredKeybind","direction","flatChannels","isChannelCollapsed","outer_loop","ignoredKeys","8","9","12","16","17","18","19","20","27","35","36","37","38","39","40","45","46","112","113","114","115","116","117","118","119","120","121","122","123","144","145","224","which","favicon","faviconNormal","getAttribute","faviconAlerted","other","methods","render","App","_","setAttribute","setAppBadge","clearAppBadge","errorHandler","errorMessage","ctcpMessage","new_ident","new_host","new_nick","account","ident","actual_ip","actual_hostname","real_name","registered_nick","operator","away","certfp","server","server_info","logonTime","idleTime"],"mappings":"aACE,SAASA,EAAqBC,GAQ7B,IAPA,IAMIC,EAAUC,EANVC,EAAWH,EAAK,GAChBI,EAAcJ,EAAK,GACnBK,EAAiBL,EAAK,GAIHM,EAAI,EAAGC,EAAW,GACpCD,EAAIH,EAASK,OAAQF,IACzBJ,EAAUC,EAASG,GAChBG,OAAOC,UAAUC,eAAeC,KAAKC,EAAiBX,IAAYW,EAAgBX,IACpFK,EAASO,KAAKD,EAAgBX,GAAS,IAExCW,EAAgBX,GAAW,EAE5B,IAAID,KAAYG,EACZK,OAAOC,UAAUC,eAAeC,KAAKR,EAAaH,KACpDc,EAAQd,GAAYG,EAAYH,IAKlC,IAFGe,GAAqBA,EAAoBhB,GAEtCO,EAASC,QACdD,EAASU,OAATV,GAOD,OAHAW,EAAgBJ,KAAKK,MAAMD,EAAiBb,GAAkB,IAGvDe,IAER,SAASA,IAER,IADA,IAAIC,EACIf,EAAI,EAAGA,EAAIY,EAAgBV,OAAQF,IAAK,CAG/C,IAFA,IAAIgB,EAAiBJ,EAAgBZ,GACjCiB,GAAY,EACRC,EAAI,EAAGA,EAAIF,EAAed,OAAQgB,IAAK,CAC9C,IAAIC,EAAQH,EAAeE,GACG,IAA3BX,EAAgBY,KAAcF,GAAY,GAE3CA,IACFL,EAAgBQ,OAAOpB,IAAK,GAC5Be,EAASM,EAAoBA,EAAoBC,EAAIN,EAAe,KAItE,OAAOD,EAIR,IAAIQ,EAAmB,GAKnBhB,EAAkB,CACrBiB,EAAG,GAGAZ,EAAkB,GAGtB,SAASS,EAAoB1B,GAG5B,GAAG4B,EAAiB5B,GACnB,OAAO4B,EAAiB5B,GAAU8B,QAGnC,IAAIC,EAASH,EAAiB5B,GAAY,CACzCK,EAAGL,EACHgC,GAAG,EACHF,QAAS,IAUV,OANAhB,EAAQd,GAAUW,KAAKoB,EAAOD,QAASC,EAAQA,EAAOD,QAASJ,GAG/DK,EAAOC,GAAI,EAGJD,EAAOD,QAKfJ,EAAoBO,EAAInB,EAGxBY,EAAoBQ,EAAIN,EAGxBF,EAAoBS,EAAI,SAASL,EAASM,EAAMC,GAC3CX,EAAoBY,EAAER,EAASM,IAClC5B,OAAO+B,eAAeT,EAASM,EAAM,CAAEI,YAAY,EAAMC,IAAKJ,KAKhEX,EAAoBgB,EAAI,SAASZ,GACX,oBAAXa,QAA0BA,OAAOC,aAC1CpC,OAAO+B,eAAeT,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DrC,OAAO+B,eAAeT,EAAS,aAAc,CAAEe,OAAO,KAQvDnB,EAAoBoB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQnB,EAAoBmB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKzC,OAAO0C,OAAO,MAGvB,GAFAxB,EAAoBgB,EAAEO,GACtBzC,OAAO+B,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOnB,EAAoBS,EAAEc,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRvB,EAAoB2B,EAAI,SAAStB,GAChC,IAAIM,EAASN,GAAUA,EAAOiB,WAC7B,WAAwB,OAAOjB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAL,EAAoBS,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRX,EAAoBY,EAAI,SAASgB,EAAQC,GAAY,OAAO/C,OAAOC,UAAUC,eAAeC,KAAK2C,EAAQC,IAGzG7B,EAAoB8B,EAAI,IAExB,IAAIC,EAAaC,OAAqB,aAAIA,OAAqB,cAAK,GAChEC,EAAmBF,EAAW5C,KAAKuC,KAAKK,GAC5CA,EAAW5C,KAAOf,EAClB2D,EAAaA,EAAWG,QACxB,IAAI,IAAIvD,EAAI,EAAGA,EAAIoD,EAAWlD,OAAQF,IAAKP,EAAqB2D,EAAWpD,IAC3E,IAAIU,EAAsB4C,EAI1B1C,EAAgBJ,KAAK,CAAC,GAAG,IAElBM,I,wvBCrJT,MAAM0C,EAAuB,CAC5B3C,UACA4C,QAAS,KACTC,KAAM,MAGMC,EAmHb,SAAyBC,GACxB,MAAMC,EAAY,GAElB,IAAK,MAAMC,KAAeF,EACzBC,EAAUC,GAAV,OAA6BN,GAAyBI,EAAIE,IAG3D,OAAOD,EA1HcE,CAAgB,CACrCC,aAAc,CACbP,SAAS,EACTC,KAAM,QACN7C,MAAMoD,EAAOzB,EAAO0B,GAAO,GAEtB1B,IAAU0B,GACbC,IAAOC,KAAK,iBAIfC,SAAU,CACTZ,SAAS,GAEVa,aAAc,CACbb,SAAS,GAEVc,YAAa,CACZd,QAAS,IAEVe,aAAc,CACbf,SAAS,GAEVgB,qBAAsB,CACrBhB,SAAS,EACTC,KAAM,QACN7C,MAAMoD,EAAOzB,GACZyB,EAAMS,OAAO,kCAAmC,KAAM,CAACC,MAAM,IAEzD,iBAAkBtB,QAAUb,GAAqC,YAA5BoC,aAAaC,YACrDD,aAAaE,kBAAkB,IAC9Bb,EAAMS,OAAO,kCAAmC,KAAM,CAACC,MAAM,OAKjEI,WAAY,CACXtB,QAAS,GACTC,KAAM,UAEPsB,oBAAqB,CACpBvB,QAAS,GACTC,KAAM,UAEPuB,YAAa,CACZxB,QAAS,GACTC,KAAM,UAEPwB,MAAO,CACNzB,SAAS,GAEV0B,KAAM,CACL1B,SAAS,GAEV2B,aAAc,CACb3B,SAAS,EACTC,KAAM,SAEP2B,kBAAmB,CAClB5B,SAAS,GAEV6B,YAAa,CACZ7B,SAAS,GAEV8B,YAAa,CACZ9B,SAAS,GAEV+B,eAAgB,CACf/B,QAAS,aAEVgC,MAAO,CACNhC,QAASiC,SAASC,eAAe,SAASC,QAAQC,YAClDhF,MAAMoD,EAAOzB,GACZ,MAAMsD,EAAUJ,SAASC,eAAe,SAClCI,EAAW,UAAH,OAAavD,EAAb,QAEd,GAAIsD,EAAQE,WAAWC,KAAKzD,QAAUuD,EACrC,OAGDD,EAAQE,WAAWC,KAAKzD,MAAQuD,EAChC,MAGMG,EAHWjC,EAAMkC,MAAMC,oBAAoBC,OAAOC,OACtDb,GAAUA,EAAM1D,OAASS,GACzB,GAEQ0D,YAAcR,SAASa,cAAc,4BAA4BC,QAC3Ed,SAASa,cAAc,4BAA4BC,QAAUN,IAG/DO,MAAO,CACNhD,SAAS,GAEViD,aAAc,CACbjD,SAAS,GAEVkD,WAAY,CACXlD,QAAS,GACT5C,MAAMoD,EAAOzB,GACP,YAAYoE,KAAKvD,OAAOwD,SAASC,UACrCpB,SAASC,eAAe,sBAAsBoB,UAAYvE,OAMvD,SAASwE,IACf,MAAMb,EAAQ,GAEd,IAAK,MAAMrC,KAAeH,EACzBwC,EAAMrC,GAAeH,EAAOG,GAAaL,QAG1C,OAAO0C,E,sVClDR,SAASc,IACR,IAAIC,EAEJ,IACCA,EAAiBC,KAAKC,MAAMC,IAAQjF,IAAI,aACvC,MAAOkF,GACRD,IAAQE,OAAO,YAGhB,OAAKL,GAK6B,OAA9BA,EAAenC,YAA4D,iBAA9BmC,EAAenC,aAC/DmC,EAAenC,WAAamC,EAAenC,WAAWyC,KAAK,OAGrDN,GARC,GAkBT,SAASO,EAAqBC,EAAiBR,GAC9C,MAAMS,E,+VAAc,IAAID,GAExB,IAAK,MAAM5E,KAAO4E,OAGe,IAAxBR,EAAepE,WACf4E,EAAgB5E,WAAgBoE,EAAepE,KAEtD6E,EAAY7E,GAAOoE,EAAepE,IAIpC,OAAO6E,EC1GR,MAAMC,EAAUlC,SAASmC,MAIzB,SAASC,IACR,MAAM,iBAAkBzE,OAEe,YAA5BuB,aAAaC,WAChB,UAGD,UALC,cAJTkD,IAAIC,IAAIC,KAYR,MAAMhE,EAAQ,IAAIgE,IAAKC,MAAM,CAC5B/B,MAAO,CACNgC,WAAW,EACXC,cAAe,KACfC,wBAAyB,KACzBC,yBAA0BR,IAC1BS,kBAAkB,EAClBC,aAAa,EACbC,SAAU,GACVC,SAAU,GACVC,kBAAkB,EAClBC,sBAAuB,cACvBxC,oBAAqB,KACrByC,SAAU,GACVC,aAAa,EACbC,iBAAiB,EACjBC,aAA0D,UAA5C3B,IAAQjF,IAAI,4BAC1B6G,YAAa,KACbC,cAAe,UACfC,oBAAoB,EACpBC,mBAAmB,GAEpBC,UAAW,CACVlB,UAAUhC,GACTA,EAAMgC,WAAY,GAEnBC,cAAcjC,EAAOmD,GACpBnD,EAAMiC,cAAgBkB,GAEvBjB,wBAAwBlC,EAAOoD,GAC9BpD,EAAMkC,wBAA0BkB,GAEjCC,gCAAgCrD,GAC/BA,EAAMmC,yBAA2BR,KAElCS,iBAAiBpC,EAAOoC,GACvBpC,EAAMoC,iBAAmBA,GAE1BC,YAAYrC,EAAOsD,GAClBtD,EAAMqC,YAAciB,GAErBhB,SAAStC,EAAOsC,GACftC,EAAMsC,SAAWA,GAElBC,SAASvC,EAAOuC,GACfvC,EAAMuC,SAAWA,GAElBgB,cAAcvD,EAAOwD,GACpBxD,EAAMsC,SAASrH,OACd6C,EAAMkC,MAAMsC,SAASmB,UAAW5G,GAAMA,EAAE6G,OAASF,GACjD,IAGFG,aAAa3D,EAAO4D,GACnB5D,EAAMsC,SAASuB,KAAKD,IAErBpB,iBAAiBxC,GAChBA,EAAMwC,kBAAmB,GAE1BC,sBAAsBzC,EAAOyC,GAC5BzC,EAAMyC,sBAAwBA,GAE/BxC,oBAAoBD,EAAOC,GAC1BD,EAAMC,oBAAsBA,GAE7ByC,SAAS1C,EAAOsD,GACftD,EAAM0C,SAAWY,GAElBX,YAAY3C,EAAOsD,GAClBtD,EAAM2C,YAAcW,GAErBV,gBAAgB5C,EAAOsD,GACtBtD,EAAM4C,gBAAkBU,GAEzBQ,cAAc9D,GACbA,EAAM2C,aAAe3C,EAAM2C,aAE5BoB,eAAe/D,GACdA,EAAM6C,cAAgB7C,EAAM6C,cAE7BA,aAAa7C,EAAOsD,GACnBtD,EAAM6C,aAAeS,GAEtBR,YAAY9C,EAAOsD,GAClBtD,EAAM8C,YAAcQ,GAErBP,cAAc/C,EAAOsD,GACpBtD,EAAM+C,cAAgBO,GAEvBN,mBAAmBhD,EAAOsD,GACzBtD,EAAMgD,mBAAqBM,GAE5BL,kBAAkBjD,EAAO3D,GACxB2D,EAAMiD,kBAAoB5G,IAG5B2H,QAAS,CACRC,4BAA8BjE,GAAWpE,IACxCA,EAAOA,EAAKsI,cACLlE,EAAMiC,cAAckC,QAAQC,SAASC,KAAM3I,GAAMA,EAAEE,KAAKsI,gBAAkBtI,IAElF0I,YAActE,GAAWuE,IACxB,IAAK,MAAMJ,KAAWnE,EAAMsC,SAC3B,IAAK,MAAMa,KAAWgB,EAAQC,SAC7B,GAAIjB,EAAQoB,KAAOA,EAClB,MAAO,CAACJ,UAAShB,WAKpB,OAAO,MAERqB,YAAcxE,GAAW0D,IACxB,IAAK,MAAMS,KAAWnE,EAAMsC,SAC3B,GAAI6B,EAAQT,OAASA,EACpB,OAAOS,EAIT,OAAO,MAERM,eAAezE,GACd,IAAIyE,EAAiB,EAErB,IAAK,MAAMN,KAAWnE,EAAMsC,SAC3B,IAAK,MAAMa,KAAWgB,EAAQC,SAC7BK,GAAkBtB,EAAQuB,UAI5B,OAAOD,GAER/C,MAAK,CAAC1B,EAAOgE,KACYA,EAAQS,eAAR,WAA6BT,EAAQS,eAArC,MAA0D,KAE9DzE,EAAMiC,cAAN,UAAyBjC,EAAMiC,cAAckB,QAAQvH,KAArD,OAAiE,IAE9C6F,EAExCkD,YAAa,IAAOxB,IAEnBA,EAAQyB,eAAiB,GACzBzB,EAAQ0B,qBAAuB,EAC/B1B,EAAQ2B,aAAe,CAAC,IACxB3B,EAAQ4B,gBAAiB,EACzB5B,EAAQ6B,kBAAmB,EAC3B7B,EAAQ8B,WAAY,EAEpB9B,EAAQ+B,qBAAuB/B,EAAQgC,cAAgBhC,EAAQiC,SAASrL,cACjEoJ,EAAQgC,cAEM,YAAjBhC,EAAQkC,OACXlC,EAAQmC,eAAgB,GAGlBnC,MD1KH,IAA6BrF,ECiLpCA,EAAMyH,eAAe,YDjLezH,ECiLiBA,EDhL7C,CACN0H,YAAY,EACZxF,MAAOsB,EAAqBT,IAAeC,KAC3CoC,UAAW,CACVuC,IAAIzF,GAAO,KAACpE,EAAD,MAAOS,IACjB2D,EAAMpE,GAAQS,IAGhBqJ,QAAS,CACRC,SAAQ,MAAC3F,GAAQ4F,GAAQ,GACxB,IAA2B,IAAvB5F,EAAMnC,eAAoC,IAAV+H,EAApC,CAIA9H,EAAMS,OAAO,qBAAqB,GAElC,IAAK,MAAM3C,KAAQoE,EACQ,UAAtBxC,EAAO5B,GAAM2B,MAA0C,WAAtBC,EAAO5B,GAAM2B,MACjDS,IAAOC,KAAK,cAAe,CAACrC,OAAMS,MAAO2D,EAAMpE,OAIlDiK,UAAS,MAAC7F,IACT,IAAK,MAAMrC,KAAeH,EACzBA,EAAOG,GAAajD,MAAMoD,EAAOkC,EAAMrC,IAAc,IAGvDmI,QAAO,MAAC9F,EAAD,OAAQzB,IAAS,KAAC3C,EAAD,MAAOS,EAAP,KAAckB,GAAO,IAC5C,GAAIyC,EAAMpE,KAAUS,EACnB,OAGD,MAAM0J,EAAgBvI,EAAO5B,GAGxBmK,KAKK,IAATxI,IACwB,IAAvByC,EAAMnC,cAAiD,UAAvBkI,EAAcxI,QAKhDgB,EAAO,MAAO,CAAC3C,OAAMS,UACrB6E,IAAQuE,IAAI,WAAYzE,KAAKgF,UAAUhG,IACvC+F,EAAcrL,MAAMoD,EAAOzB,GAEtBkB,IAKHyC,EAAMnC,cAAuC,UAAvBkI,EAAcxI,MACd,WAAvBwI,EAAcxI,OAEdS,IAAOC,KAAK,cAAe,CAACrC,OAAMS,gBCwHxByB,O,6BCvLf,YAIA,MAAME,EAJN,MAIeiI,GAAG,CACjBC,WAAYlF,KAAKC,MAAM1B,SAAS4G,KAAK1G,QAAQyG,YAC7CE,KAAMlJ,OAAOwD,SAAS2F,SAAW,aACjCC,aAAa,EACbC,cAAehH,SAAS4G,KAAKK,UAAUC,SAAS,YAQlCzI,O,8BChBf,MAAM0I,EAAS,IAAIC,IAkDJ,QAhDf,MAOCC,GAAGvB,EAAMwB,GACJH,EAAOI,IAAIzB,GACdqB,EAAOzK,IAAIoJ,GAAMhL,KAAKwM,GAEtBH,EAAOjB,IAAIJ,EAAM,CAACwB,IAUpBE,IAAI1B,EAAMwB,GACLH,EAAOI,IAAIzB,IACdqB,EAAOjB,IACNJ,EACAqB,EAAOzK,IAAIoJ,GAAMlF,OAAQ6G,GAASA,IAASH,IAW9C5I,KAAKoH,KAAS4B,GACTP,EAAOI,IAAIzB,IACdqB,EACEzK,IAAIoJ,GACJjI,QACA8J,IAAKL,IACLA,KAAWI,Q,6BC5ChB,I,OCAgM,ECgBhM,CACA,gBACA,OACA,YACA,eACA,kBAEA,UACA,OAEA,uBACA,mBAGA,gBAEA,YACA,MC9BgBE,KACf,IAAIC,EAAO,EAEX,IAAK,IAAIvN,EAAI,EAAGA,EAAIsN,EAAIpN,OAAQF,IAC/BuN,GAAQD,EAAIE,WAAWxN,GAQxB,MAAO,UAAY,EAAKuN,EAAO,KDkBhC,mBAGA,SACA,QACA,gCAEA,mBACA,6BACA,QACA,oB,OEpCIE,EAAY,YACd,GJRW,WAAa,IAAIC,EAAIC,KAASC,EAAGF,EAAIG,eAAuC,OAAjBH,EAAII,MAAMC,IAAIH,GAAa,OAAOF,EAAIM,GAAG,CAACC,MAAM,CAAC,OAAQP,EAAIQ,UAAW,CAACC,OAAQT,EAAIS,SAASC,MAAM,CAAC,YAAYV,EAAIW,KAAKC,KAAK,KAAO,UAAUvB,GAAG,CAAC,MAAQ,SAASwB,GAAgC,OAAxBA,EAAOC,iBAAwBd,EAAIe,gBAAgBF,IAAS,YAAc,SAASA,GAAgC,OAAxBA,EAAOC,iBAAwBd,EAAIe,gBAAgBF,MAAWb,EAAIgB,QAAU,CAACC,WAAYjB,EAAIkB,OAAS,IAAI,CAAClB,EAAImB,GAAG,UAAU,CAACnB,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAIhL,MAAMgL,EAAIqB,GAAGrB,EAAIW,KAAKC,UAAU,KACze,IIUpB,EACA,KACA,KACA,MAIa,IAAAb,E,sCCff,MAYMuB,EAAU,4BAGVC,EAAa,qCAIbC,EAAiB,gCAqLvB,MAAMC,EAAa,CAClB,OACA,YACA,UACA,WACA,aACA,SACA,YACA,gBACA,aAwBcC,MArBf,SAAiBC,GAChB,OA5LD,SAAoBA,GACnB,MAAMtO,EAAS,GACf,IAKIuO,EACHC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAdGC,EAAQ,EACRC,EAAW,EAef,MAAMC,EAAa,KAClBX,GAAO,EACPC,OAAYW,EACZV,OAAUU,EACVT,OAAWS,EACXR,OAAaQ,EACbP,GAAS,EACTC,GAAY,EACZC,GAAgB,EAChBC,GAAY,GAGbG,IAKA,MAAME,EAAe,KAGpB,MAGMC,EAHWhB,EAAK9L,MAAMyM,EAAOC,GAGJK,QAAQpB,EAAgB,KAEvD,GAAImB,EAAcnQ,OAAQ,CAEzB,MAAMqQ,EAAgBxP,EAAOb,OAASa,EAAOA,EAAOb,OAAS,GAAGsQ,IAAM,EAEtEzP,EAAOP,KAAK,CACX+O,OACAC,YACAC,UACAC,WACAC,aACAC,SACAC,YACAC,gBACAC,YACAV,KAAMgB,EACNL,MAAOO,EACPC,IAAKD,EAAgBF,EAAcnQ,SAKrC8P,EAAQC,EAAW,GAOpB,KAAOA,EAAWZ,EAAKnP,QAAQ,CAC9B,OAAQmP,EAAKY,IACZ,IA/FW,IAgGVG,IACAF,IACA,MAMD,IA3GU,IA4GTE,IACAb,GAAQA,EACR,MAED,IA/GW,IAgHVa,IAGAd,EAAaD,EAAK9L,MAAM0M,EAAW,GAAGQ,MAAMzB,GAExCM,GACHE,EAAYkB,OAAOpB,EAAW,IAE1BA,EAAW,KACdG,EAAUiB,OAAOpB,EAAW,KAK7BW,GAAYX,EAAW,GAAGpP,OAC1B8P,EAAQC,EAAW,IAGnBT,OAAYW,EACZV,OAAUU,GAGX,MAED,IAvIe,IAwIdC,IAEAd,EAAaD,EAAK9L,MAAM0M,EAAW,GAAGQ,MAAMxB,GAExCK,GACHI,EAAWJ,EAAW,GAAGqB,cAErBrB,EAAW,KACdK,EAAaL,EAAW,GAAGqB,eAK5BV,GAAYX,EAAW,GAAGpP,OAC1B8P,EAAQC,EAAW,IAGnBP,OAAWS,EACXR,OAAaQ,GAGd,MAED,IA7Ja,IA6JC,CACbC,IACA,MAAMQ,EAAMnB,EACZA,EAAUD,EACVA,EAAYoB,EACZ,MAGD,IApKY,IAqKXR,IACAR,GAAUA,EACV,MAED,IAxKe,IAyKdQ,IACAP,GAAaA,EACb,MAED,IA5KmB,IA6KlBO,IACAN,GAAiBA,EACjB,MAED,IAhLe,IAiLdM,IACAL,GAAaA,EAKfE,GAAY,EAMb,OAFAG,IAEOrP,EAiBN8P,CAAWxB,GAGTyB,OAAO,CAACC,EAAMC,KACd,GAAID,EAAK7Q,OAAQ,CAChB,MAAM+Q,EAAYF,EAAKA,EAAK7Q,OAAS,GAErC,GAAIiP,EAAW+B,MAAOpO,GAAQkO,EAAKlO,KAASmO,EAAUnO,IAGrD,OAFAmO,EAAU5B,MAAQ2B,EAAK3B,KACvB4B,EAAUT,KAAOQ,EAAK3B,KAAKnP,OACpB6Q,EAIT,OAAOA,EAAKI,OAAO,CAACH,KAClB,K,iBC9LSI,MA9Bf,SAAsB/B,EAAMgC,EAAiBC,GAK5C,MAAMC,EAAkBD,EAAUjE,IAAImE,KAAchK,KAAK,IACnDiK,EAAuBJ,EAAgBhE,IAAImE,KAAchK,KAAK,IAC9DkK,EAAiB,aAAH,OAAgBH,EAAhB,eAAsCE,EAAtC,YACdE,EAAgB,IAAIC,OAAOF,EAAgB,KAE3C3Q,EAAS,GACf,IAAI0P,EAEJ,GAGCA,EAAQkB,EAAcE,KAAKxC,GAEvBoB,GACH1P,EAAOP,KAAK,CACXwP,MAAOS,EAAMqB,MAAQrB,EAAM,GAAGvQ,OAASuQ,EAAM,GAAGvQ,OAChDsQ,IAAKC,EAAMqB,MAAQrB,EAAM,GAAGvQ,OAC5BoJ,QAASmH,EAAM,WAGTA,GAET,OAAO1P,G,QCrCR,MAAMgR,EAAcC,EAAQ,IAARA,GAiBLC,MAff,SAAmB5C,GAClB,MAAMtO,EAAS,GACf,IAAI0P,EAEJ,KAAQA,EAAQsB,EAAYF,KAAKxC,IAChCtO,EAAOP,KAAK,CACXwP,MAAOS,EAAMqB,MACbtB,IAAKC,EAAMqB,MAAQrB,EAAM,GAAGvQ,OAC5BgS,MAAOzB,EAAM,KAIf,OAAO1P,GCdR,MAAMoR,EAAa,sBAyBJC,MAvBf,SAAmB/C,EAAMgD,GACxB,MAAMtR,EAAS,GAGf,GAAqB,IAAjBsR,EAAMnS,OACT,OAAOa,EAGR,IAAI0P,EAEJ,KAAQA,EAAQ0B,EAAWN,KAAKxC,IAC3BgD,EAAMC,QAAQ7B,EAAM,KAAO,GAC9B1P,EAAOP,KAAK,CACXwP,MAAOS,EAAMqB,MACbtB,IAAKC,EAAMqB,MAAQrB,EAAM,GAAGvQ,OAC5BoO,KAAMmC,EAAM,KAKf,OAAO1P,GCXOwR,MATf,SAAyBC,EAAGC,GAC3B,OACED,EAAExC,OAASyC,EAAEzC,OAASyC,EAAEzC,MAAQwC,EAAEhC,KAClCgC,EAAExC,MAAQyC,EAAEjC,KAAOiC,EAAEjC,KAAOgC,EAAEhC,KAC9BiC,EAAEzC,OAASwC,EAAExC,OAASwC,EAAExC,MAAQyC,EAAEjC,KAClCiC,EAAEzC,MAAQwC,EAAEhC,KAAOgC,EAAEhC,KAAOiC,EAAEjC,KCyBlBkC,MA7Bf,SAAcC,EAAiBtD,GAC9B,IAAIY,EAAW,EAKf,MAAMlP,EAAS4R,EAAgB7B,OAAO,CAAC8B,EAAKC,KACvCA,EAAY7C,MAAQC,GACvB2C,EAAIpS,KAAK,CACRwP,MAAOC,EACPO,IAAKqC,EAAY7C,QAInBC,EAAW4C,EAAYrC,IAChBoC,GACL,IAUH,OAPI3C,EAAWZ,EAAKnP,QACnBa,EAAOP,KAAK,CACXwP,MAAOC,EACPO,IAAKnB,EAAKnP,SAILa,GChBR,SAAS+R,EAAUN,EAAGC,GACrB,OAAOD,EAAExC,MAAQyC,EAAEzC,OAASyC,EAAEjC,IAAMgC,EAAEhC,IAqCxBuC,MA3Bf,SAAeC,EAAWC,EAAgBC,GAkBzC,OAhBAF,EAAYA,EAAUhJ,KAAK8I,GAAWhC,OAAO,CAACC,EAAMC,IAC9BD,EAAKoC,KAAMhQ,GAAMoP,EAAgBpP,EAAG6N,IAGjDD,EAGDA,EAAKI,OAAO,CAACH,IAClB,KAKwBG,OAAOuB,EAAKM,EAAWE,IAAYlJ,KAAK8I,GAGnDzF,IAAK+F,IACpBA,EAASC,UAAYJ,EACnB3M,OAAQgN,GAAaf,EAAgBa,EAAUE,IAC/CjG,IAAKiG,GAzCT,SAAgBF,EAAUE,GACzB,MAAMC,EAAYD,EAAStD,MACrBA,EAAQwD,KAAKC,IAAIH,EAAStD,MAAOoD,EAASpD,OAC1CQ,EAAMgD,KAAKE,IAAIJ,EAAS9C,IAAK4C,EAAS5C,KACtCnB,EAAOiE,EAASjE,KAAK9L,MAAMyM,EAAQuD,EAAW/C,EAAM+C,GAE1D,OAAOpT,OAAOwT,OAAO,GAAIL,EAAU,CAACtD,QAAOQ,MAAKnB,SAmC3BsE,CAAOP,EAAUE,IAE9BF,K,QCjDgM,ECUzM,CACA,yBACA,OACA,aAEA,UACA,YACA,6DAGA,SACA,UACA,iCAEA,4E,OCNe,EAXC,YACd,GCRW,WAAa,IAAiBxF,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,MAA0B,YAAjFD,KAAmEiG,KAAKpI,KAAoBuC,EAAG,SAAS,CAACE,MAAM,CAAC,gBAAiB,iBAAkB,CAAC4F,OAApJlG,KAAgKiG,KAAKE,QAAQ1F,MAAM,CAAC,aAApLT,KAAqMoG,WAAWhH,GAAG,CAAC,MAApNY,KAAgOqG,WAAhOrG,KAA+OsG,OAC3P,IDUpB,EACA,KACA,KACA,M,gBEdyM,ECO3M,CACA,2BACA,OACA,aAEA,UACA,cACA,iCCIe,EAXC,YACd,GCRW,WAAa,IAAiBrG,EAATD,KAAgBE,eAAuC,OAAvDF,KAA0CG,MAAMC,IAAIH,GAAa,OAAO,CAACsG,YAAY,gBAAgB,CAArGvG,KAA0GmB,GAAG,IAA7GnB,KAAqHoB,GAArHpB,KAA4HwG,aAAa,SACrJ,IDUpB,EACA,KACA,KACA,M,eEdmM,ECSrM,CACA,qBACA,OACA,gBAEA,SACA,UACA,sEAEA,GACA,8BAGA,kBACA,kDACA,gCCNe,EAXC,YACd,GCRW,WAAa,IAAiBvG,EAATD,KAAgBE,eAAuC,OAAvDF,KAA0CG,MAAMC,IAAIH,GAAa,OAAO,CAACsG,YAAY,iBAAiB9F,MAAM,CAAC,IAAM,OAAO,KAAO,SAAS,SAAW,KAAKrB,GAAG,CAAC,MAA9JY,KAA0KqG,UAAU,CAApLrG,KAAyLkB,GAAG,YAAY,KACpN,IDUpB,EACA,KACA,KACA,M,eEAF,MAAMuF,EAAsB,mCAyLbhN,MA/Hf,SAAeiN,EAAehF,EAAMiF,EAAqBhK,GAExD,MAAM2I,EAAiBpC,EAAWxB,GAC5B6D,EAAYD,EAAe5F,IAAKiG,GAAaA,EAASjE,MAAM7H,KAAK,IAKjE6J,EAAkB/G,EAAUA,EAAQiK,cAAcC,UAAY,CAAC,IAAK,KACpElD,EAAYhH,EAAUA,EAAQiK,cAAcE,OAAS,CAAC,IAAK,IAAK,IAAK,KACrEC,EAAetD,EAAa8B,EAAW7B,EAAiBC,GACxDqD,EAAYC,oBAAU1B,GACtB2B,EAAa5C,EAAUiB,GACvB4B,EAAY1C,EAAUc,EAAWoB,GAAUA,EAAQjC,OAAc,IAEjE0C,EAAQL,EAAavD,OAAOwD,GAAWxD,OAAO0D,GAAY1D,OAAO2D,GAIvE,OAAO/B,EAAMgC,EAAO9B,EAAgBC,GAAW7F,IAAK+F,IACnD,MAAMC,EAAYD,EAASC,UAAUhG,IAAKiG,GA3E5C,SAAwBA,EAAUe,GACjC,MAAMW,EAAU,GAEZ1B,EAAS/D,MACZyF,EAAQxU,KAAK,iBAGa2P,IAAvBmD,EAAS9D,WACZwF,EAAQxU,KAAK,SAAW8S,EAAS9D,gBAGTW,IAArBmD,EAAS7D,SACZuF,EAAQxU,KAAK,SAAW8S,EAAS7D,SAG9B6D,EAAS1D,QACZoF,EAAQxU,KAAK,cAGV8S,EAASzD,WACZmF,EAAQxU,KAAK,iBAGV8S,EAASxD,eACZkF,EAAQxU,KAAK,qBAGV8S,EAASvD,WACZiF,EAAQxU,KAAK,iBAGd,MAAMd,EAAO,GACb,IAAIuV,GAAU,EAkBd,OAhBID,EAAQ9U,OAAS,IACpB+U,GAAU,EACVvV,EAAKuO,MAAQ+G,GAGV1B,EAAS5D,WACZuF,GAAU,EACVvV,EAAKwV,MAAQ,CACZC,MAAO,IAAF,OAAM7B,EAAS5D,WAGjB4D,EAAS3D,aACZjQ,EAAKwV,MAAM,oBAAX,WAAqC5B,EAAS3D,cAIzCsF,EAAUZ,EAAc,OAAQ3U,EAAM4T,EAASjE,MAAQiE,EAASjE,KA0BrE+F,CAAe9B,EAAUe,IAI1B,GAAIjB,EAASQ,KAAM,CAClB,MAAMyB,EACLf,GACAA,EAAQgB,UACRhB,EAAQgB,SAAS9K,KAAMrH,GAAMA,EAAEyQ,OAASR,EAASQ,MAC5CA,EAAOS,EACZ,IACA,CACCjG,MAAO,CACNnI,KAAMmN,EAASQ,KACf2B,IAAKF,EAAU,KAAO,OACtBG,OAAQ,SACRC,IAAK,aAGPpC,GAGD,IAAKgC,EACJ,OAAOzB,EAGR,MAAM8B,EAAU,CAAC9B,GAsBjB,OApBIyB,EAAQM,KAAO,GAClBD,EAAQlV,KACP6T,EAAcuB,EAAqB,CAClCC,MAAO,CACNF,KAAMN,EAAQM,SAMlBD,EAAQlV,KACP6T,EAAcyB,EAAmB,CAChCD,MAAO,CACNjC,KAAMyB,MAOFhB,EACN,OACA,CACCjG,MAAO,CACNmH,IAAK,SAGPG,GAEK,GAAItC,EAAS9J,QACnB,OAAO+K,EACN0B,EACA,CACCF,MAAO,CACNvM,QAAS8J,EAAS9J,UAGpB+J,GAEK,GAAID,EAASlB,MAAO,CAC1B,MAAM8D,EAAwB5C,EAASlB,MAAM5B,QAAQ8D,EAAqB,IACpEvM,EAAQoO,EAASD,GAAT,iBACDC,EAASD,IACnB,KAEH,OAAO3B,EACN,OACA,CACCpG,MAAO,CAAC,SACRG,MAAO,CACN8H,KAAM,MACN,aAAcrO,EACdA,MAAOA,IAGTwL,GAEK,OAAID,EAAS9E,KACZ+F,EACN8B,IACA,CACCN,MAAO,CACNxH,KAAM,CACLC,KAAM8E,EAAS9E,OAGjBF,MAAO,CACNmH,IAAK,SAGPlC,GAIKA,KCnM4L,ECGrM,CACA,qBACA,cACA,OACA,YACA,eACA,gBAEA,cACA,EACA,OACA,iBACA,aACA,qBACA,gBACA,kBCXI,EAAY,YACd,OARE,OAAQ,GAWV,EACA,KACA,KACA,MAIa,M,iLClBuL,ECmBtM,CACA,sBACA,UACA,CACA,eAGA,SACA,UACA,kC,OCVe,EAXC,YACd,GCRW,WAAa,IAAiBzF,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAAvEJ,KAA4EkB,GAAG,UAAU,KAAK,CAAC,UAA/FlB,KAA+GyI,YAAYrI,EAAG,OAAO,CAACsI,IAAI,eAAepI,MAAM,CAC9L,8DACA,CAAC,0BAF8BN,KAECyI,YAAahI,MAAM,CAAC,KAAO,SAAS,aAFrCT,KAEsDyI,UAAY,gBAAkB,iBAAiBrJ,GAAG,CAAC,MAFzGY,KAEqHqG,UAAU,CAACjG,EAAG,OAAO,CAACK,MAAM,CAAC,aAFlJT,KAEmKyI,UAAY,gBAAkB,sBAAsB,KACnO,IDQpB,EACA,KACA,KACA,M,QEdkM,EC8DpM,CACA,cACA,YACA,kBAEA,UACA,CACA,YACA,gBAGA,UACA,yCAEA,gBACA,0CAEA,SACA,eACA,iBACA,oBAEA,YACA,mBAEA,iBACA,mBAEA,SACA,+BACA,oCAGA,uBAEA,4BAEA,kBACA,kBClFe,EAXC,YACd,GCRW,WAAa,IAAI1I,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,SAAS9F,MAAM,CAAC,GAAK,UAAU,KAAO,WAAW,aAAa,YAAY,CAACL,EAAG,OAAO,CAACmG,YAAY,YAAY9F,MAAM,CAAC,OAAS,OAAO,OAAS,IAAIrB,GAAG,CAAC,OAASW,EAAI4I,WAAW,CAACvI,EAAG,MAAM,CAACmG,YAAY,OAAO9F,MAAM,CAAC,IAAM,uCAAuC,IAAM,aAAa,MAAQ,MAAM,OAAS,SAASL,EAAG,MAAM,CAACmG,YAAY,gBAAgB9F,MAAM,CAAC,IAAM,gDAAgD,IAAM,aAAa,MAAQ,MAAM,OAAS,SAASL,EAAG,QAAQ,CAACK,MAAM,CAAC,IAAM,oBAAoB,CAACV,EAAIoB,GAAG,cAAcf,EAAG,QAAQ,CAACsI,IAAI,WAAWnC,YAAY,QAAQ9F,MAAM,CAAC,GAAK,kBAAkB,KAAO,OAAO,KAAO,WAAW,eAAiB,OAAO,YAAc,MAAM,aAAe,WAAW,SAAW,GAAG,UAAY,IAAImI,SAAS,CAAC,MAAQ7I,EAAI8I,mBAAmBzI,EAAG,MAAM,CAACmG,YAAY,sBAAsB,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,IAAM,oBAAoB,CAACV,EAAIoB,GAAG,cAAcf,EAAG,iBAAiB,CAAC0I,YAAY/I,EAAIgJ,GAAG,CAAC,CAAC5T,IAAI,UAAU6T,GAAG,SAASC,GAAW,MAAO,CAAC7I,EAAG,QAAQ,CAACsI,IAAI,WAAWnC,YAAY,QAAQ9F,MAAM,CAAC,GAAK,kBAAkB,KAAOwI,EAAUR,UAAY,OAAS,WAAW,KAAO,WAAW,eAAiB,OAAO,YAAc,MAAM,aAAe,mBAAmB,SAAW,cAAc,GAAI1I,EAAc,WAAEK,EAAG,MAAM,CAACmG,YAAY,SAAS,CAACxG,EAAIoB,GAAG,4BAA4BpB,EAAIuG,KAAKlG,EAAG,SAAS,CAACmG,YAAY,MAAM9F,MAAM,CAAC,SAAWV,EAAImJ,SAAS,KAAO,WAAW,CAACnJ,EAAIoB,GAAG,mBAC59C,IDUpB,EACA,KACA,KACA,M,QEdmM,ECKrM,CACA,sBCYe,EAXC,YACd,GCRW,WAAa,IAAIpB,EAAIC,KAASC,EAAGF,EAAIG,eAAuC,OAAjBH,EAAII,MAAMC,IAAIH,GAAa,SAAS,CAACsG,YAAY,KAAK9F,MAAM,CAAC,aAAa,uBAAuBrB,GAAG,CAAC,MAAQ,SAASwB,GAAQ,OAAOb,EAAIoJ,OAAOpS,OAAO,uBACzM,IDUpB,EACA,KACA,KACA,M,QEdiM,ECmWnM,CACA,mBACA,YACA,iBACA,iBAEA,OACA,sBACA,gBACA,kBAEA,OACA,OACA,6CACA,wCACA,0BAGA,OACA,wBACA,GACA,uDAGA,sBACA,0CAEA,kBACA,oBACA,QAIA,4BACA,6BAIA,SACA,eACA,sBAEA,iBAEA,2BAKA,gCACA,yDAEA,+CAGA,uCAEA,YACA,+BACA,KAEA,2BACA,aAGA,sBAEA,sBACA,2BAKA,yCAGA,sCACA,4DC7Ze,G,OAXC,YACd,GCTW,WAAa,IAAIgJ,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,SAAS9F,MAAM,CAAC,GAAK,UAAU,KAAO,WAAW,aAAa,YAAY,CAACL,EAAG,MAAM,CAACmG,YAAY,UAAU,CAACnG,EAAG,kBAAkB,GAAGA,EAAG,OAAO,CAACmG,YAAY,YAAY9F,MAAM,CAAC,OAAS,OAAO,OAAS,IAAIrB,GAAG,CAAC,OAAS,SAASwB,GAAgC,OAAxBA,EAAOC,iBAAwBd,EAAI4I,SAAS/H,MAAW,CAACR,EAAG,KAAK,CAACmG,YAAY,SAAS,CAAExG,EAAIqJ,SAAa,KAAE,CAAChJ,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAa,KAAEG,WAAW,kBAAkB9I,MAAM,CAAC,KAAO,SAAS,KAAO,QAAQmI,SAAS,CAAC,MAAS7I,EAAIqJ,SAAa,MAAGhK,GAAG,CAAC,MAAQ,SAASwB,GAAWA,EAAOiH,OAAO2B,WAAqBzJ,EAAI0J,KAAK1J,EAAIqJ,SAAU,OAAQxI,EAAOiH,OAAOhT,WAAWkL,EAAIoB,GAAG,oBAAoBpB,EAAIqB,GAAGrB,EAAIqJ,SAAShV,MAAM,eAAe,CAAC2L,EAAIoB,GAAG,mCAAoCpB,EAAI/J,OAAO0T,aAAe3J,EAAIoJ,OAAO3Q,MAAMC,oBAAoBkR,OAAQ,CAAC5J,EAAIoB,GAAG,wBAAwBpB,EAAIqB,GAAGrB,EAAIqJ,SAAShV,MAAM,0BAA0B2L,EAAIuG,OAAO,GAAKvG,EAAI/J,OAAO0T,YAAg5K3J,EAAI/J,OAAO0T,cAAgB3J,EAAIoJ,OAAO3Q,MAAMC,oBAAoBkR,OAAQ,CAACvJ,EAAG,KAAK,CAACL,EAAIoB,GAAG,sBAAsBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,IAAM,iBAAiB,CAACV,EAAIoB,GAAG,UAAUf,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAa,KAAEG,WAAW,kBAAkBhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,eAAe,KAAO,OAAO,UAAY,OAAOmI,SAAS,CAAC,MAAS7I,EAAIqJ,SAAa,MAAGhK,GAAG,CAAC,MAAQ,SAASwB,GAAWA,EAAOiH,OAAO2B,WAAqBzJ,EAAI0J,KAAK1J,EAAIqJ,SAAU,OAAQxI,EAAOiH,OAAOhT,aAAauL,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,IAAM,qBAAqB,CAACV,EAAIoB,GAAG,cAAcf,EAAG,iBAAiB,CAACmG,YAAY,gCAAgCuC,YAAY/I,EAAIgJ,GAAG,CAAC,CAAC5T,IAAI,UAAU6T,GAAG,SAASC,GAAW,MAAO,CAAgD,aAA7CA,EAAUR,UAAY,OAAS,YAA0BrI,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAiB,SAAEG,WAAW,sBAAsBhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,mBAAmB,YAAc,6BAA6B,KAAO,WAAW,UAAY,MAAM,KAAO,YAAYmI,SAAS,CAAC,QAAUgB,MAAMC,QAAQ9J,EAAIqJ,SAASU,UAAU/J,EAAIgK,GAAGhK,EAAIqJ,SAASU,SAAS,OAAO,EAAG/J,EAAIqJ,SAAiB,UAAGhK,GAAG,CAAC,OAAS,SAASwB,GAAQ,IAAIoJ,EAAIjK,EAAIqJ,SAASU,SAASG,EAAKrJ,EAAOiH,OAAOqC,IAAID,EAAKE,QAAuB,GAAGP,MAAMC,QAAQG,GAAK,CAAC,IAAaI,EAAIrK,EAAIgK,GAAGC,EAAhB,MAA4BC,EAAKE,QAASC,EAAI,GAAIrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAYY,EAAIxG,OAAO,CAAhG,QAA8G4G,GAAK,GAAIrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAYY,EAAIpU,MAAM,EAAEwU,GAAK5G,OAAOwG,EAAIpU,MAAMwU,EAAI,UAAYrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAYc,OAAyD,UAA7CjB,EAAUR,UAAY,OAAS,YAAuBrI,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAiB,SAAEG,WAAW,sBAAsBhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,mBAAmB,YAAc,6BAA6B,KAAO,WAAW,UAAY,MAAM,KAAO,SAASmI,SAAS,CAAC,QAAU7I,EAAIsK,GAAGtK,EAAIqJ,SAASU,SAAS,OAAO1K,GAAG,CAAC,OAAS,SAASwB,GAAQ,OAAOb,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAY,UAAUhJ,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAiB,SAAEG,WAAW,sBAAsBhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,mBAAmB,YAAc,6BAA6B,KAAO,WAAW,UAAY,MAAM,KAAOwI,EAAUR,UAAY,OAAS,YAAYG,SAAS,CAAC,MAAS7I,EAAIqJ,SAAiB,UAAGhK,GAAG,CAAC,MAAQ,SAASwB,GAAWA,EAAOiH,OAAO2B,WAAqBzJ,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAYxI,EAAOiH,OAAOhT,mBAAmB,IAAIkL,EAAIuG,KAA15P,CAAClG,EAAG,KAAK,CAACL,EAAIoB,GAAG,sBAAsBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,IAAM,iBAAiB,CAACV,EAAIoB,GAAG,UAAUf,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAa,KAAEG,WAAW,kBAAkBhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,eAAe,KAAO,OAAO,UAAY,OAAOmI,SAAS,CAAC,MAAS7I,EAAIqJ,SAAa,MAAGhK,GAAG,CAAC,MAAQ,SAASwB,GAAWA,EAAOiH,OAAO2B,WAAqBzJ,EAAI0J,KAAK1J,EAAIqJ,SAAU,OAAQxI,EAAOiH,OAAOhT,aAAauL,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,IAAM,iBAAiB,CAACV,EAAIoB,GAAG,YAAYf,EAAG,MAAM,CAACmG,YAAY,cAAc,CAACnG,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAa,KAAEG,WAAW,kBAAkBhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,eAAe,KAAO,OAAO,aAAa,iBAAiB,UAAY,MAAM,SAAW,IAAImI,SAAS,CAAC,MAAS7I,EAAIqJ,SAAa,MAAGhK,GAAG,CAAC,MAAQ,SAASwB,GAAWA,EAAOiH,OAAO2B,WAAqBzJ,EAAI0J,KAAK1J,EAAIqJ,SAAU,OAAQxI,EAAOiH,OAAOhT,WAAWuL,EAAG,OAAO,CAACK,MAAM,CAAC,GAAK,0BAA0B,CAACV,EAAIoB,GAAG,OAAOf,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAa,KAAEG,WAAW,kBAAkBhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,eAAe,KAAO,SAAS,IAAM,IAAI,IAAM,QAAQ,KAAO,OAAO,aAAa,eAAemI,SAAS,CAAC,MAAS7I,EAAIqJ,SAAa,MAAGhK,GAAG,CAAC,MAAQ,SAASwB,GAAWA,EAAOiH,OAAO2B,WAAqBzJ,EAAI0J,KAAK1J,EAAIqJ,SAAU,OAAQxI,EAAOiH,OAAOhT,eAAeuL,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,IAAM,qBAAqB,CAACV,EAAIoB,GAAG,cAAcf,EAAG,iBAAiB,CAACmG,YAAY,gCAAgCuC,YAAY/I,EAAIgJ,GAAG,CAAC,CAAC5T,IAAI,UAAU6T,GAAG,SAASC,GAAW,MAAO,CAAgD,aAA7CA,EAAUR,UAAY,OAAS,YAA0BrI,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAiB,SAAEG,WAAW,sBAAsBhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,mBAAmB,YAAc,6BAA6B,KAAO,WAAW,UAAY,MAAM,KAAO,YAAYmI,SAAS,CAAC,QAAUgB,MAAMC,QAAQ9J,EAAIqJ,SAASU,UAAU/J,EAAIgK,GAAGhK,EAAIqJ,SAASU,SAAS,OAAO,EAAG/J,EAAIqJ,SAAiB,UAAGhK,GAAG,CAAC,OAAS,SAASwB,GAAQ,IAAIoJ,EAAIjK,EAAIqJ,SAASU,SAASG,EAAKrJ,EAAOiH,OAAOqC,IAAID,EAAKE,QAAuB,GAAGP,MAAMC,QAAQG,GAAK,CAAC,IAAaI,EAAIrK,EAAIgK,GAAGC,EAAhB,MAA4BC,EAAKE,QAASC,EAAI,GAAIrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAYY,EAAIxG,OAAO,CAAhG,QAA8G4G,GAAK,GAAIrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAYY,EAAIpU,MAAM,EAAEwU,GAAK5G,OAAOwG,EAAIpU,MAAMwU,EAAI,UAAYrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAYc,OAAyD,UAA7CjB,EAAUR,UAAY,OAAS,YAAuBrI,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAiB,SAAEG,WAAW,sBAAsBhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,mBAAmB,YAAc,6BAA6B,KAAO,WAAW,UAAY,MAAM,KAAO,SAASmI,SAAS,CAAC,QAAU7I,EAAIsK,GAAGtK,EAAIqJ,SAASU,SAAS,OAAO1K,GAAG,CAAC,OAAS,SAASwB,GAAQ,OAAOb,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAY,UAAUhJ,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAiB,SAAEG,WAAW,sBAAsBhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,mBAAmB,YAAc,6BAA6B,KAAO,WAAW,UAAY,MAAM,KAAOwI,EAAUR,UAAY,OAAS,YAAYG,SAAS,CAAC,MAAS7I,EAAIqJ,SAAiB,UAAGhK,GAAG,CAAC,MAAQ,SAASwB,GAAWA,EAAOiH,OAAO2B,WAAqBzJ,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAYxI,EAAOiH,OAAOhT,eAAe,MAAK,EAAM,eAAe,GAAGuL,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,SAASA,EAAG,MAAM,CAACmG,YAAY,cAAc,CAACnG,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAY,IAAEG,WAAW,iBAAiB9I,MAAM,CAAC,KAAO,WAAW,KAAO,MAAM,SAAWV,EAAIqJ,SAASkB,cAAc1B,SAAS,CAAC,QAAUgB,MAAMC,QAAQ9J,EAAIqJ,SAASmB,KAAKxK,EAAIgK,GAAGhK,EAAIqJ,SAASmB,IAAI,OAAO,EAAGxK,EAAIqJ,SAAY,KAAGhK,GAAG,CAAC,OAAS,SAASwB,GAAQ,IAAIoJ,EAAIjK,EAAIqJ,SAASmB,IAAIN,EAAKrJ,EAAOiH,OAAOqC,IAAID,EAAKE,QAAuB,GAAGP,MAAMC,QAAQG,GAAK,CAAC,IAAaI,EAAIrK,EAAIgK,GAAGC,EAAhB,MAA4BC,EAAKE,QAASC,EAAI,GAAIrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,MAAOY,EAAIxG,OAAO,CAA3F,QAAyG4G,GAAK,GAAIrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,MAAOY,EAAIpU,MAAM,EAAEwU,GAAK5G,OAAOwG,EAAIpU,MAAMwU,EAAI,UAAYrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,MAAOc,OAAUnK,EAAIoB,GAAG,+DAAgEpB,EAAIqJ,SAAqB,aAAEhJ,EAAG,OAAO,CAACmG,YAAY,8CAA8C9F,MAAM,CAAC,aAAa,2FAA2F,CAACV,EAAIoB,GAAG,YAAYpB,EAAIuG,OAAOlG,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAA2B,mBAAEG,WAAW,gCAAgC9I,MAAM,CAAC,KAAO,WAAW,KAAO,sBAAsBmI,SAAS,CAAC,QAAUgB,MAAMC,QAAQ9J,EAAIqJ,SAASoB,oBAAoBzK,EAAIgK,GAAGhK,EAAIqJ,SAASoB,mBAAmB,OAAO,EAAGzK,EAAIqJ,SAA2B,oBAAGhK,GAAG,CAAC,OAAS,SAASwB,GAAQ,IAAIoJ,EAAIjK,EAAIqJ,SAASoB,mBAAmBP,EAAKrJ,EAAOiH,OAAOqC,IAAID,EAAKE,QAAuB,GAAGP,MAAMC,QAAQG,GAAK,CAAC,IAAaI,EAAIrK,EAAIgK,GAAGC,EAAhB,MAA4BC,EAAKE,QAASC,EAAI,GAAIrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,qBAAsBY,EAAIxG,OAAO,CAA1G,QAAwH4G,GAAK,GAAIrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,qBAAsBY,EAAIpU,MAAM,EAAEwU,GAAK5G,OAAOwG,EAAIpU,MAAMwU,EAAI,UAAYrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,qBAAsBc,OAAUnK,EAAIoB,GAAG,wEAAqmFf,EAAG,MAAMA,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,IAAM,iBAAiB,CAACV,EAAIoB,GAAG,cAAcf,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAa,KAAEG,WAAW,kBAAkBhD,YAAY,aAAa9F,MAAM,CAAC,GAAK,eAAe,KAAO,OAAO,QAAU,aAAa,UAAY,MAAM,SAAW,IAAImI,SAAS,CAAC,MAAS7I,EAAIqJ,SAAa,MAAGhK,GAAG,CAAC,MAAQ,CAAC,SAASwB,GAAWA,EAAOiH,OAAO2B,WAAqBzJ,EAAI0J,KAAK1J,EAAIqJ,SAAU,OAAQxI,EAAOiH,OAAOhT,QAAQkL,EAAI0K,oBAAsB1K,EAAI/J,OAAO0U,SAA8gB3K,EAAIuG,KAAxgB,CAAClG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,IAAM,qBAAqB,CAACV,EAAIoB,GAAG,cAAcf,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAiB,SAAEG,WAAW,sBAAsBb,IAAI,gBAAgBnC,YAAY,iBAAiB9F,MAAM,CAAC,GAAK,mBAAmB,KAAO,WAAW,UAAY,OAAOmI,SAAS,CAAC,MAAS7I,EAAIqJ,SAAiB,UAAGhK,GAAG,CAAC,MAAQ,SAASwB,GAAWA,EAAOiH,OAAO2B,WAAqBzJ,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAYxI,EAAOiH,OAAOhT,cAAwBkL,EAAIqJ,SAASlN,OAAS6D,EAAIoJ,OAAO3Q,MAAMC,oBAAoBkR,OAAQ,CAACvJ,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACxG,EAAI4K,GAAG,GAAGvK,EAAG,WAAW,CAACsI,IAAI,gBAAgBnC,YAAY,QAAQ9F,MAAM,CAAC,GAAK,mBAAmB,KAAO,YAAYmI,SAAS,CAAC,MAAQ7I,EAAIqJ,SAASwB,SAAW7K,EAAIqJ,SAASwB,SAAS/Q,KAAK,MAAQ,IAAIuF,GAAG,CAAC,MAAQW,EAAI8K,0BAA4B9K,EAAIqJ,SAASlN,KAAoc6D,EAAIuG,KAAlc,CAAClG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,IAAM,qBAAqB,CAACV,EAAIoB,GAAG,WAAWf,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAa,KAAEG,WAAW,kBAAkBhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,mBAAmB,KAAO,QAAQmI,SAAS,CAAC,MAAS7I,EAAIqJ,SAAa,MAAGhK,GAAG,CAAC,MAAQ,SAASwB,GAAWA,EAAOiH,OAAO2B,WAAqBzJ,EAAI0J,KAAK1J,EAAIqJ,SAAU,OAAQxI,EAAOiH,OAAOhT,cAAwBkL,EAAIoJ,OAAO3Q,MAAMC,oBAA0B,OAAE,CAAEsH,EAAI/J,OAAkB,YAAE,CAACoK,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,SAASA,EAAG,MAAM,CAACmG,YAAY,cAAc,CAACnG,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAwB,qBAAEwJ,WAAW,yBAAyB9I,MAAM,CAAC,KAAO,YAAYmI,SAAS,CAAC,QAAUgB,MAAMC,QAAQ9J,EAAI+K,sBAAsB/K,EAAIgK,GAAGhK,EAAI+K,qBAAqB,OAAO,EAAG/K,EAAwB,sBAAGX,GAAG,CAAC,OAAS,SAASwB,GAAQ,IAAIoJ,EAAIjK,EAAI+K,qBAAqBb,EAAKrJ,EAAOiH,OAAOqC,IAAID,EAAKE,QAAuB,GAAGP,MAAMC,QAAQG,GAAK,CAAC,IAAaI,EAAIrK,EAAIgK,GAAGC,EAAhB,MAA4BC,EAAKE,QAASC,EAAI,IAAIrK,EAAI+K,qBAAqBd,EAAIxG,OAAO,CAAtF,QAAmG4G,GAAK,IAAIrK,EAAI+K,qBAAqBd,EAAIpU,MAAM,EAAEwU,GAAK5G,OAAOwG,EAAIpU,MAAMwU,EAAI,UAAWrK,EAAI+K,qBAAqBZ,MAASnK,EAAIoB,GAAG,mEAAoEpB,EAAwB,qBAAEK,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,IAAM,qBAAqB,CAACV,EAAIoB,GAAG,cAAcf,EAAG,iBAAiB,CAACmG,YAAY,gCAAgCuC,YAAY/I,EAAIgJ,GAAG,CAAC,CAAC5T,IAAI,UAAU6T,GAAG,SAASC,GAAW,MAAO,CAAgD,aAA7CA,EAAUR,UAAY,OAAS,YAA0BrI,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAiB,SAAEG,WAAW,sBAAsBb,IAAI,iBAAiBnC,YAAY,QAAQ9F,MAAM,CAAC,GAAK,mBAAmB,YAAc,0BAA0B,KAAO,WAAW,UAAY,MAAM,KAAO,YAAYmI,SAAS,CAAC,QAAUgB,MAAMC,QAAQ9J,EAAIqJ,SAASU,UAAU/J,EAAIgK,GAAGhK,EAAIqJ,SAASU,SAAS,OAAO,EAAG/J,EAAIqJ,SAAiB,UAAGhK,GAAG,CAAC,OAAS,SAASwB,GAAQ,IAAIoJ,EAAIjK,EAAIqJ,SAASU,SAASG,EAAKrJ,EAAOiH,OAAOqC,IAAID,EAAKE,QAAuB,GAAGP,MAAMC,QAAQG,GAAK,CAAC,IAAaI,EAAIrK,EAAIgK,GAAGC,EAAhB,MAA4BC,EAAKE,QAASC,EAAI,GAAIrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAYY,EAAIxG,OAAO,CAAhG,QAA8G4G,GAAK,GAAIrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAYY,EAAIpU,MAAM,EAAEwU,GAAK5G,OAAOwG,EAAIpU,MAAMwU,EAAI,UAAYrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAYc,OAAyD,UAA7CjB,EAAUR,UAAY,OAAS,YAAuBrI,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAiB,SAAEG,WAAW,sBAAsBb,IAAI,iBAAiBnC,YAAY,QAAQ9F,MAAM,CAAC,GAAK,mBAAmB,YAAc,0BAA0B,KAAO,WAAW,UAAY,MAAM,KAAO,SAASmI,SAAS,CAAC,QAAU7I,EAAIsK,GAAGtK,EAAIqJ,SAASU,SAAS,OAAO1K,GAAG,CAAC,OAAS,SAASwB,GAAQ,OAAOb,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAY,UAAUhJ,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAiB,SAAEG,WAAW,sBAAsBb,IAAI,iBAAiBnC,YAAY,QAAQ9F,MAAM,CAAC,GAAK,mBAAmB,YAAc,0BAA0B,KAAO,WAAW,UAAY,MAAM,KAAOwI,EAAUR,UAAY,OAAS,YAAYG,SAAS,CAAC,MAAS7I,EAAIqJ,SAAiB,UAAGhK,GAAG,CAAC,MAAQ,SAASwB,GAAWA,EAAOiH,OAAO2B,WAAqBzJ,EAAI0J,KAAK1J,EAAIqJ,SAAU,WAAYxI,EAAOiH,OAAOhT,eAAe,MAAK,EAAM,eAAe,GAAGkL,EAAIuG,MAAMvG,EAAIuG,MAAM,CAAClG,EAAG,KAAK,CAACK,MAAM,CAAC,GAAK,eAAe,CAACV,EAAIoB,GAAG,oBAAoBf,EAAG,MAAM,CAACmG,YAAY,2BAA2B9F,MAAM,CAAC,KAAO,QAAQ,kBAAkB,eAAe,CAACL,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,QAAQ,KAAO,OAAO,MAAQ,IAAImI,SAAS,CAAC,SAAW7I,EAAIqJ,SAAS2B,MAAM3L,GAAG,CAAC,OAAS,SAASwB,GAAQ,OAAOb,EAAIiL,YAAY,QAAQjL,EAAIoB,GAAG,iDAAiDf,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,QAAQ,KAAO,OAAO,MAAQ,SAASmI,SAAS,CAAC,QAAgC,UAAtB7I,EAAIqJ,SAAS2B,MAAkB3L,GAAG,CAAC,OAAS,SAASwB,GAAQ,OAAOb,EAAIiL,YAAY,aAAajL,EAAIoB,GAAG,iEAAkEpB,EAAIoJ,OAAO3Q,MAAMC,oBAAoBkR,QAAU5J,EAAIqJ,SAASmB,IAAKnK,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,QAAQ,KAAO,OAAO,MAAQ,YAAYmI,SAAS,CAAC,QAAgC,aAAtB7I,EAAIqJ,SAAS2B,MAAqB3L,GAAG,CAAC,OAAS,SAASwB,GAAQ,OAAOb,EAAIiL,YAAY,gBAAgBjL,EAAIoB,GAAG,kEAAkEpB,EAAIuG,OAA8B,UAAtBvG,EAAIqJ,SAAS2B,KAAkB,CAAC3K,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,IAAM,qBAAqB,CAACV,EAAIoB,GAAG,aAAaf,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAoB,YAAEG,WAAW,yBAAyBhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,sBAAsB,KAAO,cAAc,UAAY,MAAM,SAAW,IAAImI,SAAS,CAAC,MAAS7I,EAAIqJ,SAAoB,aAAGhK,GAAG,CAAC,MAAQ,SAASwB,GAAWA,EAAOiH,OAAO2B,WAAqBzJ,EAAI0J,KAAK1J,EAAIqJ,SAAU,cAAexI,EAAOiH,OAAOhT,aAAauL,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,IAAM,qBAAqB,CAACV,EAAIoB,GAAG,cAAcf,EAAG,iBAAiB,CAACmG,YAAY,gCAAgCuC,YAAY/I,EAAIgJ,GAAG,CAAC,CAAC5T,IAAI,UAAU6T,GAAG,SAASC,GAAW,MAAO,CAAgD,aAA7CA,EAAUR,UAAY,OAAS,YAA0BrI,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAqB,aAAEG,WAAW,0BAA0BhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,uBAAuB,KAAO,eAAe,UAAY,MAAM,SAAW,GAAG,KAAO,YAAYmI,SAAS,CAAC,QAAUgB,MAAMC,QAAQ9J,EAAIqJ,SAAS6B,cAAclL,EAAIgK,GAAGhK,EAAIqJ,SAAS6B,aAAa,OAAO,EAAGlL,EAAIqJ,SAAqB,cAAGhK,GAAG,CAAC,OAAS,SAASwB,GAAQ,IAAIoJ,EAAIjK,EAAIqJ,SAAS6B,aAAahB,EAAKrJ,EAAOiH,OAAOqC,IAAID,EAAKE,QAAuB,GAAGP,MAAMC,QAAQG,GAAK,CAAC,IAAaI,EAAIrK,EAAIgK,GAAGC,EAAhB,MAA4BC,EAAKE,QAASC,EAAI,GAAIrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,eAAgBY,EAAIxG,OAAO,CAApG,QAAkH4G,GAAK,GAAIrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,eAAgBY,EAAIpU,MAAM,EAAEwU,GAAK5G,OAAOwG,EAAIpU,MAAMwU,EAAI,UAAYrK,EAAI0J,KAAK1J,EAAIqJ,SAAU,eAAgBc,OAAyD,UAA7CjB,EAAUR,UAAY,OAAS,YAAuBrI,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAqB,aAAEG,WAAW,0BAA0BhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,uBAAuB,KAAO,eAAe,UAAY,MAAM,SAAW,GAAG,KAAO,SAASmI,SAAS,CAAC,QAAU7I,EAAIsK,GAAGtK,EAAIqJ,SAAS6B,aAAa,OAAO7L,GAAG,CAAC,OAAS,SAASwB,GAAQ,OAAOb,EAAI0J,KAAK1J,EAAIqJ,SAAU,eAAgB,UAAUhJ,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAIqJ,SAAqB,aAAEG,WAAW,0BAA0BhD,YAAY,QAAQ9F,MAAM,CAAC,GAAK,uBAAuB,KAAO,eAAe,UAAY,MAAM,SAAW,GAAG,KAAOwI,EAAUR,UAAY,OAAS,YAAYG,SAAS,CAAC,MAAS7I,EAAIqJ,SAAqB,cAAGhK,GAAG,CAAC,MAAQ,SAASwB,GAAWA,EAAOiH,OAAO2B,WAAqBzJ,EAAI0J,KAAK1J,EAAIqJ,SAAU,eAAgBxI,EAAOiH,OAAOhT,eAAe,MAAK,EAAM,eAAe,IAA2B,aAAtBkL,EAAIqJ,SAAS2B,KAAqB3K,EAAG,MAAM,CAACmG,YAAY,yBAAyB,CAACnG,EAAG,IAAI,CAACL,EAAIoB,GAAG,4EAA4Ef,EAAG,IAAI,CAACL,EAAIoB,GAAG,+KAA+KpB,EAAI4K,GAAG,KAAK5K,EAAIuG,MAAMlG,EAAG,MAAM,CAACA,EAAG,SAAS,CAACmG,YAAY,MAAM9F,MAAM,CAAC,KAAO,SAAS,WAAWV,EAAImL,WAA0B,CAAEnL,EAAIqJ,SAAa,KAAE,CAACrJ,EAAIoB,GAAG,iBAAiB,CAACpB,EAAIoB,GAAG,aAAa,MAAM,OACp5jB,CAAC,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,QAAQ,CAACK,MAAM,CAAC,IAAM,qBAAqB,CAA5GT,KAAiHmB,GAAG,wCAAwCf,EAAG,OAAO,CAACmG,YAAY,+CAA+C9F,MAAM,CAAC,aAAa,+FAA+F,CAACL,EAAG,SAAS,CAACmG,YAAY,oBAAoB,WAAa,IAAiBtG,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACA,EAAG,OAAO,CAAlFJ,KAAuFmB,GAAG,iCDW5hB,EACA,KACA,KACA,M,SEfmM,ECQrM,CACA,eACA,YACA,eAEA,OACA,oBAEA,OAOA,OACA,YACA,SAPA,cACA,GACA,+CACA,8CAOA,SACA,gBACA,iBACA,2BAEA,uBACA,WAEA,6BACA,WAYA,GATA,mBACA,QAIA,iBACA,UAIA,qCACA,+CACA,MAQA,oDACA,+DAmBA,OAdA,aACA,IACA,WACA,OACA,mBAIA,EAHA,eAKA,mBAIA,mDACA,cAEA,KADA,wBAGA,EAGA,MACA,aACA,eACA,MACA,aACA,gBAKA,YChFe,EAXC,YACd,GCRW,WAAa,IAAiBlB,EAATD,KAAgBE,eAAuC,OAAvDF,KAA0CG,MAAMC,IAAIH,GAAa,cAAc,CAACQ,MAAM,CAAC,gBAAvFT,KAA2GmL,aAAa,SAAxHnL,KAAuIoJ,SAAS,SAAhJpJ,KAA+JkL,cAC3K,IDUpB,EACA,KACA,KACA,M,+BEd6L,ECoD/L,CACA,eACA,OACA,gBAEA,UACA,UACA,2CAGA,SACA,UACA,sBAGA,qBACA,eAHA,2CC9Ce,G,OAXC,YACd,GCTW,WAAa,IAAInL,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,gBAAgB,CAACnG,EAAG,MAAM,CAACmG,YAAY,qBAAqB,CAACnG,EAAG,SAAS,CAACL,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAIqL,QAAQC,UAAUjL,EAAG,IAAI,CAACK,MAAM,CAAC,KAAO,qBAAuBV,EAAIqL,QAAQE,GAAG,OAAS,SAAS,IAAM,aAAa,CAACvL,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAIqL,QAAQE,OAAQvL,EAAIqL,QAAQ5K,OAAS,EAAGJ,EAAG,IAAI,CAACmG,YAAY,iBAAiB,CAACxG,EAAIoB,GAAG,qBAAqBpB,EAAIqB,GAAGrB,EAAIqL,QAAQ5K,QAAQ,qBAAuBT,EAAIqL,QAAQG,SAAYxL,EAAIqL,QAAQ5K,OAAyHT,EAAIuG,KAArHlG,EAAG,IAAI,CAACmG,YAAY,iBAAiB,CAACxG,EAAIoB,GAAG,yBAAyBf,EAAG,OAAO,CAACL,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAIyL,gBAAyBpL,EAAG,MAAM,CAACmG,YAAY,oBAAoB,CAACnG,EAAG,SAAS,CAACmG,YAAY,MAAMnH,GAAG,CAAC,MAAQ,SAASwB,GAAgC,OAAxBA,EAAOC,iBAAwBd,EAAI0L,QAAQ7K,MAAW,CAAEb,EAAIqL,QAAe,QAAE,CAACrL,EAAIoB,GAAG,aAAa,CAACpB,EAAIoB,GAAG,YAAY,SACn2B,IDWpB,EACA,KACA,KACA,M,SE0fF,IAAIuK,EAAqB,KAEzBhW,OAAOiW,iBAAiB,sBAAuB,IAC/C,mBACA,MAGA,IChhBsM,EDghBtM,CACA,gBACA,YACA,iBACA,UACA,iBAEA,UACA,CACA,uBACA,0BACA,gBACA,6CACA,wDACA,mBACA,kEACA,gDAEA,4DAGA,UACA,0BAEA,SAEA,iBACA,sDAEA,iBACA,qEAEA,gBACA,qEAGA,UACA,yBAIA,yBACA,2CACA,mDAEA,SACA,YACA,MAEA,gBAEA,GAJA,kDAIA,YACA,OAGA,MAGA,EADA,2BACA,iBAEA,eAGA,kEAEA,iBACA,8CACA,GACA,mCACA,mCACA,0CAGA,kDAQA,oCAQA,+BACA,8BAGA,+BAXA,2BACA,WACA,2BAVA,2BACA,WACA,yBAmBA,mBACA,4CACA,wCACA,oBACA,SACA,WAGA,mBACA,sEAEA,+DACA,iEAEA,sBACA,WACA,QAEA,mBACA,kBACA,sBACA,UAEA,oBACA,gCEpnBe,G,OAXC,YACd,GCTW,WAAa,IAAI5L,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,SAAS9F,MAAM,CAAC,GAAK,WAAW,KAAO,WAAW,aAAa,aAAa,CAACL,EAAG,MAAM,CAACmG,YAAY,UAAU,CAACnG,EAAG,kBAAkB,GAAGA,EAAG,OAAO,CAACsI,IAAI,eAAenC,YAAY,YAAYnH,GAAG,CAAC,OAASW,EAAI6L,SAAS,OAAS,SAAShL,GAAQA,EAAOC,oBAAqB,CAACT,EAAG,KAAK,CAACmG,YAAY,SAAS,CAACxG,EAAIoB,GAAG,cAAcf,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,WAAW,KAAO,YAAYmI,SAAS,CAAC,QAAU7I,EAAIoJ,OAAO3Q,MAAMqT,SAASnV,YAAYqJ,EAAIoB,GAAG,+CAAgDpB,EAAI+L,qBAAuB/L,EAAIgM,sBAAuB3L,EAAG,MAAM,CAACA,EAAG,KAAK,CAACL,EAAIoB,GAAG,gBAAiBpB,EAAyB,sBAAEK,EAAG,SAAS,CAACmG,YAAY,MAAM9F,MAAM,CAAC,KAAO,UAAUrB,GAAG,CAAC,MAAQ,SAASwB,GAAgC,OAAxBA,EAAOC,iBAAwBd,EAAIiM,oBAAoBpL,MAAW,CAACb,EAAIoB,GAAG,yDAAyDpB,EAAIuG,KAAMvG,EAAuB,oBAAEK,EAAG,SAAS,CAACmG,YAAY,MAAM9F,MAAM,CAAC,KAAO,UAAUrB,GAAG,CAAC,MAAQ,SAASwB,GAAgC,OAAxBA,EAAOC,iBAAwBd,EAAIkM,iBAAiBrL,MAAW,CAACb,EAAIoB,GAAG,4DAA4DpB,EAAIuG,OAAOvG,EAAIuG,MAAOvG,EAAIoJ,OAAO3Q,MAAMC,oBAAoBkR,QAAU5J,EAAIoJ,OAAO3Q,MAAMqT,SAASnV,SAAU0J,EAAG,MAAM,CAACA,EAAG,KAAK,CAACL,EAAIoB,GAAG,8BAA8Bf,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,WAAW,KAAO,gBAAgBmI,SAAS,CAAC,QAAU7I,EAAIoJ,OAAO3Q,MAAMqT,SAASxV,gBAAgB0J,EAAIoB,GAAG,mEAAqEpB,EAAIoJ,OAAO3Q,MAAMqT,SAASxV,aAA0f0J,EAAIuG,KAAhf,CAAEvG,EAAIoJ,OAAO3Q,MAAuB,kBAAE4H,EAAG,MAAM,CAACmG,YAAY,uBAAuB,CAACxG,EAAI4K,GAAG,GAAGvK,EAAG,IAAI,CAACL,EAAIoB,GAAG,0JAA0Jf,EAAG,SAAS,CAACmG,YAAY,gBAAgB9F,MAAM,CAAC,KAAO,UAAUrB,GAAG,CAAC,MAAQW,EAAImM,mBAAmB,CAACnM,EAAIoB,GAAG,8DAA8Df,EAAG,MAAM,CAACmG,YAAY,uBAAuB,CAACxG,EAAI4K,GAAG,OAAgB,GAAG5K,EAAIuG,KAAKlG,EAAG,KAAK,CAACL,EAAIoB,GAAG,cAAcf,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,WAAW,KAAO,QAAQmI,SAAS,CAAC,QAAU7I,EAAIoJ,OAAO3Q,MAAMqT,SAASrU,QAAQuI,EAAIoB,GAAG,qBAAqBf,EAAG,OAAO,CAACK,MAAM,CAAC,MAAQ,uBAAuB,CAACV,EAAIoB,GAAG,cAAcf,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,WAAW,KAAO,eAAemI,SAAS,CAAC,QAAU7I,EAAIoJ,OAAO3Q,MAAMqT,SAASlU,eAAeoI,EAAIoB,GAAG,uDAAuDf,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,WAAW,KAAO,eAAemI,SAAS,CAAC,QAAU7I,EAAIoJ,OAAO3Q,MAAMqT,SAASjU,eAAemI,EAAIoB,GAAG,sDAAuDpB,EAAIoJ,OAAO3Q,MAAMC,oBAAoBkR,QAAU5J,EAAIoJ,OAAO3Q,MAAMqT,SAASnV,SAAU0J,EAAG,MAAM,CAACA,EAAG,KAAK,CAACL,EAAIoB,GAAG,4BAA4Bf,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACmG,YAAY,UAAU9F,MAAM,CAAC,IAAM,gBAAgB,CAACV,EAAIoB,GAAG,4BAA4Bf,EAAG,QAAQ,CAACmG,YAAY,QAAQ9F,MAAM,CAAC,GAAK,cAAc,KAAO,OAAO,KAAO,cAAc,YAAc,0CAA0CmI,SAAS,CAAC,MAAQ7I,EAAIoJ,OAAO3Q,MAAMqT,SAASvU,mBAAmByI,EAAIuG,KAAKvG,EAAI4K,GAAG,GAAGvK,EAAG,MAAM,CAACK,MAAM,CAAC,KAAO,QAAQ,kBAAkB,0BAA0B,CAACL,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,QAAQ,KAAO,iBAAiB,MAAQ,SAASmI,SAAS,CAAC,QAAuD,UAA7C7I,EAAIoJ,OAAO3Q,MAAMqT,SAAShU,kBAA8BkI,EAAIoB,GAAG,iEAAiEf,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,QAAQ,KAAO,iBAAiB,MAAQ,aAAamI,SAAS,CAAC,QAAuD,cAA7C7I,EAAIoJ,OAAO3Q,MAAMqT,SAAShU,kBAAkCkI,EAAIoB,GAAG,6DAA6Df,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,QAAQ,KAAO,iBAAiB,MAAQ,UAAUmI,SAAS,CAAC,QAAuD,WAA7C7I,EAAIoJ,OAAO3Q,MAAMqT,SAAShU,kBAA+BkI,EAAIoB,GAAG,sDAAsDf,EAAG,KAAK,CAACL,EAAIoB,GAAG,iBAAiBf,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,WAAW,KAAO,gBAAgBmI,SAAS,CAAC,QAAU7I,EAAIoJ,OAAO3Q,MAAMqT,SAAShV,gBAAgBkJ,EAAIoB,GAAG,oDAAoDf,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,WAAW,KAAO,gBAAgBmI,SAAS,CAAC,QAAU7I,EAAIoJ,OAAO3Q,MAAMqT,SAASlV,gBAAgBoJ,EAAIoB,GAAG,iDAAkDpB,EAAIoJ,OAAO3Q,MAAMqT,SAAiB,SAAEzL,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACmG,YAAY,UAAU9F,MAAM,CAAC,IAAM,gBAAgB,CAACV,EAAIoB,GAAG,+EAA+Ef,EAAG,QAAQ,CAACmG,YAAY,QAAQ9F,MAAM,CAAC,GAAK,cAAc,KAAO,OAAO,KAAO,cAAc,YAAc,yCAAyCmI,SAAS,CAAC,MAAQ7I,EAAIoJ,OAAO3Q,MAAMqT,SAASjV,mBAAmBmJ,EAAIuG,KAAKlG,EAAG,KAAK,CAACL,EAAIoB,GAAG,WAAWf,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,UAAU9F,MAAM,CAAC,IAAM,iBAAiB,CAACV,EAAIoB,GAAG,WAAWf,EAAG,SAAS,CAACmG,YAAY,QAAQ9F,MAAM,CAAC,GAAK,eAAe,KAAO,SAASmI,SAAS,CAAC,MAAQ7I,EAAIoJ,OAAO3Q,MAAMqT,SAAS/T,QAAQiI,EAAIoM,GAAIpM,EAAIoJ,OAAO3Q,MAAMC,oBAA0B,QAAE,SAASX,GAAO,OAAOsI,EAAG,SAAS,CAACjL,IAAI2C,EAAM1D,KAAKwU,SAAS,CAAC,MAAQ9Q,EAAM1D,OAAO,CAAC2L,EAAIoB,GAAG,iBAAiBpB,EAAIqB,GAAGtJ,EAAMsU,aAAa,qBAAoB,KAAMrM,EAAIoJ,OAAO3Q,MAAMC,oBAA4B,SAAE,CAAC2H,EAAG,KAAK,CAACL,EAAIoB,GAAG,mBAAmBf,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,WAAW,KAAO,SAASmI,SAAS,CAAC,QAAU7I,EAAIoJ,OAAO3Q,MAAMqT,SAAS/S,SAASiH,EAAIoB,GAAG,mDAAmDf,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,WAAW,KAAO,SAASmI,SAAS,CAAC,QAAU7I,EAAIoJ,OAAO3Q,MAAMqT,SAAStU,SAASwI,EAAIoB,GAAG,uDAAuDpB,EAAIuG,KAAMvG,EAAIoJ,OAAO3Q,MAAMqT,SAASnV,UAAYqJ,EAAIoJ,OAAO3Q,MAAMC,oBAAoB4T,WAAYjM,EAAG,MAAM,CAACA,EAAG,KAAK,CAACL,EAAIoB,GAAG,kBAAkBf,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,WAAW,KAAO,gBAAgBmI,SAAS,CAAC,QAAU7I,EAAIoJ,OAAO3Q,MAAMqT,SAAS9S,gBAAgBgH,EAAIoB,GAAG,uFAAuFpB,EAAI4K,GAAG,SAAS5K,EAAIuG,KAAOvG,EAAIoJ,OAAO3Q,MAAMC,oBAAoBkR,OACxoK5J,EAAIuG,KAD4oK,CAAClG,EAAG,KAAK,CAACL,EAAIoB,GAAG,wBAAwBf,EAAG,MAAM,CAACA,EAAG,SAAS,CAACmG,YAAY,MAAM9F,MAAM,CAAC,GAAK,oBAAoB,KAAO,SAAS,SAAsD,cAA3CV,EAAIoJ,OAAO3Q,MAAMyC,uBAC9iN,eAA3C8E,EAAIoJ,OAAO3Q,MAAMyC,uBAAwCmE,GAAG,CAAC,MAAQW,EAAIuM,oBAAoB,CAA6C,eAA3CvM,EAAIoJ,OAAO3Q,MAAMyC,sBAAwC,CAAC8E,EAAIoB,GAAG,sEAAkH,YAA3CpB,EAAIoJ,OAAO3Q,MAAMyC,sBAAqC,CAAC8E,EAAIoB,GAAG,2CAA2C,CAACpB,EAAIoB,GAAG,uCAAuC,GAA+C,YAA3CpB,EAAIoJ,OAAO3Q,MAAMyC,sBAAqCmF,EAAG,MAAM,CAACmG,YAAY,SAAS,CAACnG,EAAG,SAAS,CAACL,EAAIoB,GAAG,aAAapB,EAAIoB,GAAG,8FAA8FpB,EAAIuG,KAAiD,gBAA3CvG,EAAIoJ,OAAO3Q,MAAMyC,sBAAyCmF,EAAG,MAAM,CAACmG,YAAY,SAAS,CAACnG,EAAG,SAAS,CAACL,EAAIoB,GAAG,aAAapB,EAAIoB,GAAG,mBAAmBf,EAAG,OAAO,CAACL,EAAIoB,GAAG,2DAA4DpB,EAAS,MAAEK,EAAG,MAAM,CAACmG,YAAY,0BAA0B,CAACxG,EAAIoB,GAAG,+CAA+Cf,EAAG,IAAI,CAACK,MAAM,CAAC,KAAO,iDAAiD,OAAS,SAAS,IAAM,aAAa,CAACV,EAAIoB,GAAG,yDAAyDpB,EAAIoB,GAAG,kKAAkKpB,EAAIuG,OAAOvG,EAAIuG,QAAiBlG,EAAG,KAAK,CAACL,EAAIoB,GAAG,2BAA2Bf,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,GAAK,uBAAuB,KAAO,WAAW,KAAO,wBAAwBmI,SAAS,CAAC,QAAU7I,EAAIoJ,OAAO3Q,MAAMqT,SAAS/U,wBAAwBiJ,EAAIoB,GAAG,4CAA4Cf,EAAG,MAAqD,gBAA9CL,EAAIoJ,OAAO3Q,MAAMmC,yBAA4CyF,EAAG,MAAM,CAACmG,YAAY,SAAS,CAACnG,EAAG,SAAS,CAACL,EAAIoB,GAAG,aAAapB,EAAIoB,GAAG,oEAAoEpB,EAAIuG,KAAoD,YAA9CvG,EAAIoJ,OAAO3Q,MAAMmC,yBAAwCyF,EAAG,MAAM,CAACmG,YAAY,QAAQ9F,MAAM,CAAC,GAAK,oCAAoC,CAACL,EAAG,SAAS,CAACL,EAAIoB,GAAG,aAAapB,EAAIoB,GAAG,8DAA8DpB,EAAIuG,SAASlG,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,WAAW,KAAO,gBAAgBmI,SAAS,CAAC,QAAU7I,EAAIoJ,OAAO3Q,MAAMqT,SAASpU,gBAAgBsI,EAAIoB,GAAG,uDAAuDf,EAAG,MAAM,CAACA,EAAG,MAAM,CAACmG,YAAY,OAAO,CAACnG,EAAG,SAAS,CAACK,MAAM,CAAC,GAAK,QAAQrB,GAAG,CAAC,MAAQ,SAASwB,GAAgC,OAAxBA,EAAOC,iBAAwBd,EAAIwM,iBAAiB3L,MAAW,CAACb,EAAIoB,GAAG,oBAAqBpB,EAAIoJ,OAAO3Q,MAAMqT,SAAiB,SAAEzL,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACnG,EAAG,QAAQ,CAACK,MAAM,CAAC,KAAO,WAAW,KAAO,qBAAqBmI,SAAS,CAAC,QAAU7I,EAAIoJ,OAAO3Q,MAAMqT,SAASnU,qBAAqBqI,EAAIoB,GAAG,kEAAkEpB,EAAIuG,MAAOvG,EAAIoJ,OAAO3Q,MAAMC,oBAAoBkR,QAAU5J,EAAIoJ,OAAO3Q,MAAMqT,SAASnV,SAAU0J,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACxG,EAAI4K,GAAG,GAAGvK,EAAG,QAAQ,CAACmG,YAAY,QAAQ9F,MAAM,CAAC,GAAK,aAAa,KAAO,OAAO,KAAO,aAAa,YAAc,6DAA6DmI,SAAS,CAAC,MAAQ7I,EAAIoJ,OAAO3Q,MAAMqT,SAASzU,kBAAkB2I,EAAIuG,MAAOvG,EAAIoJ,OAAO3Q,MAAMC,oBAAoBkR,QAAU5J,EAAIoJ,OAAO3Q,MAAMqT,SAASnV,SAAU0J,EAAG,MAAM,CAACA,EAAG,QAAQ,CAACmG,YAAY,OAAO,CAACxG,EAAI4K,GAAG,GAAGvK,EAAG,QAAQ,CAACmG,YAAY,QAAQ9F,MAAM,CAAC,GAAK,sBAAsB,KAAO,OAAO,KAAO,sBAAsB,YAAc,6DAA6DmI,SAAS,CAAC,MAAQ7I,EAAIoJ,OAAO3Q,MAAMqT,SAASxU,2BAA2B0I,EAAIuG,KACrgHvG,EAAIoJ,OAAO3Q,MAAMC,oBAAoBkR,QACrC5J,EAAIoJ,OAAO3Q,MAAMC,oBAAoB+T,YAC4kEzM,EAAIuG,KAArnElG,EAAG,MAAM,CAACK,MAAM,CAAC,GAAK,kBAAkB,KAAO,QAAQ,kBAAkB,0BAA0B,CAACL,EAAG,KAAK,CAACK,MAAM,CAAC,GAAK,0BAA0B,CAACV,EAAIoB,GAAG,qBAAqBf,EAAG,MAAM,CAACmG,YAAY,sBAAsB,CAACnG,EAAG,QAAQ,CAACmG,YAAY,UAAU9F,MAAM,CAAC,IAAM,uBAAuB,CAACV,EAAIoB,GAAG,8BAA8Bf,EAAG,iBAAiB,CAAC0I,YAAY/I,EAAIgJ,GAAG,CAAC,CAAC5T,IAAI,UAAU6T,GAAG,SAASC,GAAW,MAAO,CAAC7I,EAAG,QAAQ,CAACmG,YAAY,QAAQ9F,MAAM,CAAC,GAAK,qBAAqB,KAAOwI,EAAUR,UAAY,OAAS,WAAW,KAAO,eAAe,YAAc,gCAAgC,MAAK,EAAM,eAAe,GAAGrI,EAAG,MAAM,CAACmG,YAAY,sBAAsB,CAACnG,EAAG,QAAQ,CAACmG,YAAY,UAAU9F,MAAM,CAAC,IAAM,uBAAuB,CAACV,EAAIoB,GAAG,0DAA0Df,EAAG,iBAAiB,CAAC0I,YAAY/I,EAAIgJ,GAAG,CAAC,CAAC5T,IAAI,UAAU6T,GAAG,SAASC,GAAW,MAAO,CAAC7I,EAAG,QAAQ,CAACmG,YAAY,QAAQ9F,MAAM,CAAC,GAAK,qBAAqB,KAAOwI,EAAUR,UAAY,OAAS,WAAW,KAAO,eAAe,YAAc,oCAAoC,MAAK,EAAM,eAAe,GAAGrI,EAAG,MAAM,CAACmG,YAAY,sBAAsB,CAACnG,EAAG,QAAQ,CAACmG,YAAY,UAAU9F,MAAM,CAAC,IAAM,0BAA0B,CAACV,EAAIoB,GAAG,2BAA2Bf,EAAG,iBAAiB,CAAC0I,YAAY/I,EAAIgJ,GAAG,CAAC,CAAC5T,IAAI,UAAU6T,GAAG,SAASC,GAAW,MAAO,CAAC7I,EAAG,QAAQ,CAACmG,YAAY,QAAQ9F,MAAM,CAAC,GAAK,wBAAwB,KAAOwI,EAAUR,UAAY,OAAS,WAAW,KAAO,kBAAkB,YAAc,6BAA6B,MAAK,EAAM,eAAe,GAAI1I,EAAI0M,sBAAwB1M,EAAI0M,qBAAqBC,QAAStM,EAAG,MAAM,CAACmG,YAAY,oBAAoB,CAACxG,EAAIoB,GAAG,8DAA+DpB,EAAI0M,sBAAwB1M,EAAI0M,qBAAqB7Q,MAAOwE,EAAG,MAAM,CAACmG,YAAY,kBAAkB,CAACxG,EAAIoB,GAAG,eAAepB,EAAIqB,GAAGrB,EAAI4M,eAAe5M,EAAI0M,qBAAqB7Q,QAAQ,gBAAgBmE,EAAIuG,KAAKlG,EAAG,MAAM,CAACA,EAAG,SAAS,CAACmG,YAAY,MAAM9F,MAAM,CAAC,KAAO,UAAUrB,GAAG,CAAC,MAAQ,SAASwB,GAAgC,OAAxBA,EAAOC,iBAAwBd,EAAI6M,eAAehM,MAAW,CAACb,EAAIoB,GAAG,mDAA6DpB,EAAIoJ,OAAO3Q,MAAMqT,SAAiB,SAAEzL,EAAG,MAAM,CAACA,EAAG,KAAK,CAACL,EAAIoB,GAAG,uBAAuBf,EAAG,QAAQ,CAACmG,YAAY,UAAU9F,MAAM,CAAC,IAAM,6BAA6B,CAACV,EAAIoB,GAAG,wFAAwFf,EAAG,WAAW,CAACmG,YAAY,QAAQ9F,MAAM,CAAC,GAAK,2BAA2B,KAAO,aAAa,YAAc,kDAAkDmI,SAAS,CAAC,MAAQ7I,EAAIoJ,OAAO3Q,MAAMqT,SAAS7S,gBAAgB+G,EAAIuG,KAAOvG,EAAIoJ,OAAO3Q,MAAMC,oBAAoBkR,OAAovB5J,EAAIuG,KAAhvBlG,EAAG,MAAM,CAACmG,YAAY,eAAe9F,MAAM,CAAC,KAAO,UAAU,CAACL,EAAG,KAAK,CAACL,EAAIoB,GAAG,cAAcf,EAAG,KAAK,CAACL,EAAIoB,GAAG,qBAAsBpB,EAAkB,eAAEK,EAAG,UAAU,CAACK,MAAM,CAAC,QAAUV,EAAI8M,kBAAkB9M,EAAIuG,KAAMvG,EAAI+M,eAAeva,OAAS,EAAG,CAAC6N,EAAG,KAAK,CAACL,EAAIoB,GAAG,qBAAqBpB,EAAIoM,GAAIpM,EAAkB,gBAAE,SAASqL,GAAS,OAAOhL,EAAG,UAAU,CAACjL,IAAIiW,EAAQ2B,MAAMtM,MAAM,CAAC,QAAU2K,SAAcrL,EAAIuG,KAAKlG,EAAG,KAAK,CAACL,EAAIoB,GAAG,oBAA0D,IAArCpB,EAAIoJ,OAAO3Q,MAAM0C,SAAS3I,OAAc6N,EAAG,IAAI,CAACL,EAAIoB,GAAG,cAA4C,IAA7BpB,EAAIiN,cAAcza,OAAc6N,EAAG,IAAI,CAACA,EAAG,KAAK,CAACL,EAAIoB,GAAG,4DAA4DpB,EAAIoM,GAAIpM,EAAiB,eAAE,SAASqL,GAAS,OAAOhL,EAAG,UAAU,CAACjL,IAAIiW,EAAQ2B,MAAMtM,MAAM,CAAC,QAAU2K,SAAc,IAAa,OACp3G,CAAC,WAAa,IAAiBnL,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,IAAI,CAACA,EAAG,SAAS,CAAlFJ,KAAuFmB,GAAG,cAA1FnB,KAA4GmB,GAAG,iIAAiI,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,IAAI,CAACA,EAAG,SAAS,CAAlFJ,KAAuFmB,GAAG,cAA1FnB,KAA4GmB,GAAG,2KAA2K,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,KAAK,CAACK,MAAM,CAAC,GAAK,0BAA0B,CAA7GT,KAAkHmB,GAAG,uCAAuCf,EAAG,OAAO,CAACmG,YAAY,8CAA8C9F,MAAM,CAAC,aAAa,+DAA+D,CAACL,EAAG,SAAS,CAACmG,YAAY,oBAAoB,WAAa,IAAiBtG,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,OAAO,CAACmG,YAAY,8CAA8C9F,MAAM,CAAC,aAAa,8JAA8J,CAACL,EAAG,SAAS,CAACmG,YAAY,kBAAkB,WAAa,IAAiBtG,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,QAAQ,CAACmG,YAAY,MAAM9F,MAAM,CAAC,IAAM,eAAe,CAAxHT,KAA6HmB,GAAG,iDAAiDf,EAAG,OAAO,CAACmG,YAAY,8CAA8C9F,MAAM,CAAC,aAAa,mGAAmG,CAACL,EAAG,SAAS,CAACmG,YAAY,oBAAoB,WAAa,IAAiBtG,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,QAAQ,CAACmG,YAAY,MAAM9F,MAAM,CAAC,IAAM,wBAAwB,CAAjIT,KAAsImB,GAAG,oDAAoDf,EAAG,OAAO,CAACmG,YAAY,8CAA8C9F,MAAM,CAAC,aAAa,uLAAuL,CAACL,EAAG,SAAS,CAACmG,YAAY,sBDOluE,EACA,KACA,KACA,M,SEfoM,ECwCtM,CACA,sBACA,UACA,+BACA,iBAGA,SACA,WACA,uCACA,8CACA,yBCnDkM,EC0uBlM,CACA,YACA,YACA,gBACA,eCvuBgB,YACd,GCRW,WAAa,IAAiBtG,EAATD,KAAgBE,eAAuC,OAAvDF,KAA0CG,MAAMC,IAAIH,GAAa,SAC7E,IDUpB,EACA,KACA,KACA,M,SDkuBF,UACA,CACA,mEGhuBe,EAXC,YACd,GCRW,WAAa,IAAIF,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,SAAS9F,MAAM,CAAC,GAAK,OAAO,KAAO,WAAW,aAAa,SAAS,CAACL,EAAG,MAAM,CAACmG,YAAY,UAAU,CAACnG,EAAG,kBAAkB,GAAGA,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,KAAK,CAACmG,YAAY,SAAS,CAACxG,EAAIoB,GAAG,UAAUpB,EAAI4K,GAAG,GAAGvK,EAAG,KAAK,CAACL,EAAIoB,GAAG,wBAAwBf,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAoG7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAAvKf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAASf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAWf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAgGpB,EAAI4K,GAAG,KAAKvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAoG7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAAvKf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAASf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAWf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAgGpB,EAAI4K,GAAG,KAAKvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAoG7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAAvKf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAASf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAWf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAgGpB,EAAI4K,GAAG,KAAKvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAoG7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAAvKf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAASf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAWf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAgGpB,EAAI4K,GAAG,KAAKvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAwE7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAAnHf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAASf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAwEpB,EAAI4K,GAAG,KAAKvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAwE7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAAnHf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAASf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAwEpB,EAAI4K,GAAG,KAAKvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAwE7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAAnHf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAASf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAwEpB,EAAI4K,GAAG,KAAKvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAwE7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAAnHf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAASf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAwEpB,EAAI4K,GAAG,KAAKvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAwE7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAAnHf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAASf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAwEpB,EAAI4K,GAAG,KAAKvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAwE7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAAnHf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAASf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAwEpB,EAAI4K,GAAG,MAAM5K,EAAI4K,GAAG,IAAIvK,EAAG,KAAK,CAACL,EAAIoB,GAAG,0BAA0Bf,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAyE7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAApHf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,UAAUf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAwEpB,EAAI4K,GAAG,MAAMvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAyE7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAApHf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,UAAUf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAwEpB,EAAI4K,GAAG,MAAMvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAyE7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAApHf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,UAAUf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAwEpB,EAAI4K,GAAG,MAAMvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAyE7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAApHf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,UAAUf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAwEpB,EAAI4K,GAAG,MAAMvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAyE7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAApHf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,UAAUf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAwEpB,EAAI4K,GAAG,MAAMvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAyE7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAApHf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,UAAUf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAwEpB,EAAI4K,GAAG,MAAMvK,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAAGxG,EAAIkN,QAAyE7M,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOf,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAApHf,EAAG,OAAO,CAACA,EAAG,MAAM,CAACL,EAAIoB,GAAG,UAAUf,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAwEpB,EAAI4K,GAAG,MAAMvK,EAAG,KAAK,CAACL,EAAIoB,GAAG,oBAAoBpB,EAAI4K,GAAG,IAAIvK,EAAG,IAAI,CAACL,EAAIoB,GAAG,iDAAiDpB,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAIvK,EAAG,KAAK,CAACL,EAAIoB,GAAG,cAAcpB,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,IAAI5K,EAAI4K,GAAG,UACl3J,CAAC,WAAa,IAAiB1K,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,KAAK,CAACmG,YAAY,sBAAsB,CAACnG,EAAG,OAAO,CAApHJ,KAAyHmB,GAAG,4BAA4Bf,EAAG,QAAQ,CAACA,EAAG,IAAI,CAA3KJ,KAAgLmB,GAAG,qGAAqGf,EAAG,IAAI,CAA/RJ,KAAoSmB,GAAG,iDAAiD,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,sDAAsD,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,0DAA0D,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,kCAAkC,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,gCAAgC,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,uDAAuD,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,2DAA2D,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,yDAAyD,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,wBAAwB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,kCAAkC,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,yCAAyC,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAACA,EAAG,MAAM,CAAxJJ,KAA6JmB,GAAG,aAAaf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA1NJ,KAA+NmB,GAAG,sJAAsJ,WAAa,IAAIpB,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAACL,EAAIoB,GAAG,wJAAwJf,EAAG,OAAO,CAACL,EAAIoB,GAAG,UAAUpB,EAAIoB,GAAG,2HAA2Hf,EAAG,IAAI,CAACL,EAAIoB,GAAG,iHAAiHf,EAAG,OAAO,CAACL,EAAIoB,GAAG,UAAUpB,EAAIoB,GAAG,yFAAyFf,EAAG,IAAI,CAACL,EAAIoB,GAAG,0DAA0Df,EAAG,IAAI,CAACK,MAAM,CAAC,KAAO,sDAAsD,OAAS,SAAS,IAAM,aAAa,CAACV,EAAIoB,GAAG,UAAUpB,EAAIoB,GAAG,oBAAoB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,sEAAsEf,EAAG,OAAO,CAACmG,YAAY,YAAY,CAA5NvG,KAAiOmB,GAAG,UAApOnB,KAAkPmB,GAAG,oBAAoB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,sEAAsEf,EAAG,OAAO,CAACmG,YAAY,iBAAiB,CAAjOvG,KAAsOmB,GAAG,gBAAzOnB,KAA6PmB,GAAG,oBAAoB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,sEAAsEf,EAAG,OAAO,CAACmG,YAAY,cAAc,CAA9NvG,KAAmOmB,GAAG,aAAtOnB,KAAuPmB,GAAG,oBAAoB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,sEAAsEf,EAAG,OAAO,CAACmG,YAAY,qBAAqB,CAArOvG,KAA0OmB,GAAG,oBAA7OnB,KAAqQmB,GAAG,oBAAoB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,sEAAsEf,EAAG,OAAO,CAACmG,YAAY,iBAAiB,CAAjOvG,KAAsOmB,GAAG,gBAAzOnB,KAA6PmB,GAAG,oBAAoB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA3GJ,KAAgHmB,GAAG,yHAAyH,WAAa,IAAIpB,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,IAAI,CAACL,EAAIoB,GAAG,kJAAkJf,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOpB,EAAIoB,GAAG,gBAAgBf,EAAG,MAAM,CAACL,EAAIoB,GAAG,OAAOpB,EAAIoB,GAAG,0DAA0Df,EAAG,MAAM,CAACL,EAAIoB,GAAG,SAASpB,EAAIoB,GAAG,eAAef,EAAG,MAAM,CAACL,EAAIoB,GAAG,WAAWpB,EAAIoB,GAAG,gDAAgD,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,SAASf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA5MJ,KAAiNmB,GAAG,mBAAmB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,SAASf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA5MJ,KAAiNmB,GAAG,kBAAkB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,SAASf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA5MJ,KAAiNmB,GAAG,gDAAgD,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,SAASf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA5MJ,KAAiNmB,GAAG,wHAAwHf,EAAG,OAAO,CAAtVJ,KAA2VmB,GAAG,QAA9VnB,KAA0WmB,GAAG,sBAAsB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,uBAAuBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA1NJ,KAA+NmB,GAAG,0DAA0D,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,aAAaf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAhNJ,KAAqNmB,GAAG,sCAAsCf,EAAG,OAAO,CAAxQJ,KAA6QmB,GAAG,WAAhRnB,KAA+RmB,GAAG,aAAa,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,iBAAiBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAApNJ,KAAyNmB,GAAG,qBAAqBf,EAAG,OAAO,CAA3PJ,KAAgQmB,GAAG,QAAnQnB,KAA+QmB,GAAG,wGAAwG,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,gBAAgBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAnNJ,KAAwNmB,GAAG,oDAAoD,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,iBAAiBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAApNJ,KAAyNmB,GAAG,qFAAqFf,EAAG,OAAO,CAA3TJ,KAAgUmB,GAAG,aAAnUnB,KAAoVmB,GAAG,sBAAsB,WAAa,IAAIpB,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAACL,EAAIoB,GAAG,4BAA4Bf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAACL,EAAIoB,GAAG,iDAAiDf,EAAG,OAAO,CAACL,EAAIoB,GAAG,UAAUpB,EAAIoB,GAAG,8BAA8Bf,EAAG,OAAO,CAACL,EAAIoB,GAAG,OAAOpB,EAAIoB,GAAG,oEAAoEf,EAAG,IAAI,CAACL,EAAIoB,GAAG,WAAWf,EAAG,OAAO,CAACL,EAAIoB,GAAG,oBAAoB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,+BAA+Bf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAlOJ,KAAuOmB,GAAG,uBAAuBf,EAAG,OAAO,CAACK,MAAM,CAAC,MAAQ,8BAA8B,CAAzTT,KAA8TmB,GAAG,UAAjUnB,KAA+UmB,GAAG,4DAA4Df,EAAG,IAAI,CAACK,MAAM,CAAC,KAAO,0DAA0D,OAAS,SAAS,IAAM,aAAa,CAAngBT,KAAwgBmB,GAAG,qCAA3gBnB,KAAojBmB,GAAG,sBAAsB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,4BAA4Bf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA/NJ,KAAoOmB,GAAG,2BAA2Bf,EAAG,OAAO,CAA5QJ,KAAiRmB,GAAG,QAApRnB,KAAgSmB,GAAG,mFAAmF,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,+BAA+Bf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAlOJ,KAAuOmB,GAAG,8BAA8Bf,EAAG,OAAO,CAAlRJ,KAAuRmB,GAAG,QAA1RnB,KAAsSmB,GAAG,mFAAmF,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,6BAA6Bf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAhOJ,KAAqOmB,GAAG,mFAAmF,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,eAAef,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAlNJ,KAAuNmB,GAAG,mFAAmFf,EAAG,OAAO,CAAvTJ,KAA4TmB,GAAG,eAA/TnB,KAAkVmB,GAAG,sBAAsB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,8BAA8Bf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAjOJ,KAAsOmB,GAAG,sEAAsEf,EAAG,OAAO,CAAzTJ,KAA8TmB,GAAG,aAAjUnB,KAAkVmB,GAAG,yFAAyF,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,oBAAoBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAvNJ,KAA4NmB,GAAG,oJAAoJ,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,mBAAmBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAtNJ,KAA2NmB,GAAG,kEAAkE,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,qBAAqBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAxNJ,KAA6NmB,GAAG,0BAA0B,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,kBAAkBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAArNJ,KAA0NmB,GAAG,gDAAgD,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,aAAaf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAhNJ,KAAqNmB,GAAG,iEAAiE,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,mBAAmBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAtNJ,KAA2NmB,GAAG,+KAA+K,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,0BAA0Bf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA7NJ,KAAkOmB,GAAG,yPAAyP,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,4BAA4Bf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA/NJ,KAAoOmB,GAAG,mDAAmD,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,qBAAqBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAxNJ,KAA6NmB,GAAG,uDAAuD,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,+BAA+Bf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAlOJ,KAAuOmB,GAAG,2DAA2D,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,0BAA0Bf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA7NJ,KAAkOmB,GAAG,aAAaf,EAAG,OAAO,CAA5PJ,KAAiQmB,GAAG,QAApQnB,KAAgRmB,GAAG,4DAA4D,WAAa,IAAIpB,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAACL,EAAIoB,GAAG,uBAAuBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAACL,EAAIoB,GAAG,4GAA4Gf,EAAG,OAAO,CAACL,EAAIoB,GAAG,aAAapB,EAAIoB,GAAG,4BAA4Bf,EAAG,IAAI,CAACL,EAAIoB,GAAG,aAAaf,EAAG,OAAO,CAACL,EAAIoB,GAAG,YAAYpB,EAAIoB,GAAG,MAAMf,EAAG,OAAO,CAACL,EAAIoB,GAAG,mBAAmB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,eAAef,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAlNJ,KAAuNmB,GAAG,iKAAiKf,EAAG,IAAI,CAAlYJ,KAAuYmB,GAAG,WAAWf,EAAG,OAAO,CAA/ZJ,KAAoamB,GAAG,mBAAmB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,mBAAmBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAtNJ,KAA2NmB,GAAG,wDAAwD,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,uBAAuBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA1NJ,KAA+NmB,GAAG,wEAAwE,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,oBAAoBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAvNJ,KAA4NmB,GAAG,oDAAoDf,EAAG,IAAI,CAA1RJ,KAA+RmB,GAAG,aAAaf,EAAG,OAAO,CAAzTJ,KAA8TmB,GAAG,YAAjUnB,KAAiVmB,GAAG,MAAMf,EAAG,OAAO,CAApWJ,KAAyWmB,GAAG,kBAAkB,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,kBAAkBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAArNJ,KAA0NmB,GAAG,4DAA4D,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,yBAAyBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAA5NJ,KAAiOmB,GAAG,yDAAyDf,EAAG,OAAO,CAAvSJ,KAA4SmB,GAAG,cAA/SnB,KAAiUmB,GAAG,qFAAqF,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,mBAAmBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAtNJ,KAA2NmB,GAAG,uBAAuBf,EAAG,OAAO,CAA/PJ,KAAoQmB,GAAG,QAAvQnB,KAAmRmB,GAAG,wGAAwG,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,sBAAsBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAzNJ,KAA8NmB,GAAG,kJAAkJ,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,6BAA6Bf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAhOJ,KAAqOmB,GAAG,4BAA4Bf,EAAG,OAAO,CAA9QJ,KAAmRmB,GAAG,QAAtRnB,KAAkSmB,GAAG,sEAAsE,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,MAAM,CAACmG,YAAY,WAAW,CAACnG,EAAG,OAAO,CAA9IJ,KAAmJmB,GAAG,mBAAmBf,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,IAAI,CAAtNJ,KAA2NmB,GAAG,8EDU1umB,EACA,KACA,KACA,M,QEdqM,ECgDvM,CACA,iBACA,YACA,iBAEA,UACA,+BACA,sBAGA,uBAEA,UACA,uBAEA,SACA,iBACA,yBACA,OAGA,mDAEA,iBAEA,kCACA,iCAEA,wBAEA,uCC5De,EAXC,YACd,GCRW,WAAa,IAAIpB,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,SAAS9F,MAAM,CAAC,GAAK,YAAY,aAAa,cAAc,CAACL,EAAG,MAAM,CAACmG,YAAY,UAAU,CAACnG,EAAG,kBAAkB,GAAGA,EAAG,MAAM,CAACmG,YAAY,aAAa,CAACnG,EAAG,cAAc,CAACK,MAAM,CAAC,GAAK,eAAe,GAAK,UAAU,CAACV,EAAIoB,GAAG,YAChVpB,EAAIoJ,OAAO3Q,MAAM8C,aACjByE,EAAIoJ,OAAO3Q,MAAM8C,YAAYiQ,SAC7BxL,EAAIoJ,OAAO3Q,MAAM8C,YAAYiQ,QAAQ2B,QACpC,CAAC9M,EAAG,KAAK,CAACmG,YAAY,SAAS,CAACxG,EAAIoB,GAAG,+BAA+BpB,EAAIqB,GAAGrB,EAAIoJ,OAAO3Q,MAAM8C,YAAYiQ,QAAQ2B,SAAS,cAAenN,EAAIoJ,OAAO3Q,MAAM8C,YAAYiQ,QAAiB,UAAE,CAACnL,EAAG,KAAK,CAACL,EAAIoB,GAAG,kBAAkBf,EAAG,MAAM,CAACsI,IAAI,YAAYnC,YAAY,iBAAiBqC,SAAS,CAAC,UAAY7I,EAAIqB,GAAGrB,EAAIoJ,OAAO3Q,MAAM8C,YAAYiQ,QAAQ4B,eAAe,CAAC/M,EAAG,IAAI,CAACL,EAAIoB,GAAG,mEAAmEf,EAAG,IAAI,CAACA,EAAG,IAAI,CAACK,MAAM,CAAC,KAAQ,wDAA2DV,EAAIoJ,OAAO3Q,MAAMC,oBAA2B,QAAG,OAAS,SAAS,IAAM,aAAa,CAACsH,EAAIoB,GAAG,uDAAuDf,EAAG,IAAI,CAACL,EAAIoB,GAAG,yBAAyB,OAC5rB,IDMpB,EACA,KACA,KACA,M,QEduM,ECazM,CACA,mBACA,YACA,eAEA,UACA,CACA,YACA,mBAGA,OACA,uBACA,wBAGA,UACA,uBAEA,SACA,iBACA,gDACA,2EAEA,gBACA,iBACA,2BAGA,gDACA,iCAEA,6CC3Be,EAXC,YACd,GCRW,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAvDD,KAA8E,YAAEI,EAAG,cAAc,CAACK,MAAM,CAAC,gBAAzGT,KAA6HmL,aAAa,SAA1InL,KAAyJoN,YAAY,SAArKpN,KAAoLkL,YAApLlL,KAAoMsG,OAChN,IDUpB,EACA,KACA,KACA,M,sDEdiM,ECuInM,CACA,mBACA,OACA,YACA,4BACA,gBAEA,UACA,CACA,kBACA,oBAGA,UACA,kBACA,0CAEA,eACA,qBAIA,wCAGA,OACA,cACA,wBACA,yBAGA,UACA,yBAEA,UACA,mCAEA,wBAEA,gBACA,qCAEA,YAGA,2BAEA,SACA,kBAEA,6BAKA,0BACA,sBAIA,0BACA,oBACA,6BAGA,iBACA,uCAEA,0BAEA,yBACA,qBAGA,mBAEA,mBACA,uBAEA,oBACA,mBAEA,+CACA,uBACA,kBAEA,cACA,yCACA,2BAEA,eACA,oBACA,qBAIA,oBACA,qEAGA,mBAEA,0BACA,OAGA,SAEA,uBACA,YAEA,oCACA,oCAGA,MAEA,WACA,mCACA,MAEA,QACA,mCAGA,qBClPe,EAXC,YACd,GCRW,WAAa,IAAIvG,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAQF,EAAIkG,KAAU,MAAE7F,EAAG,MAAM,CAACiJ,WAAW,CAAC,CAACjV,KAAK,OAAOkV,QAAQ,SAASzU,MAAOkL,EAAIkG,KAAKoH,cAAkC,SAAlBtN,EAAIkG,KAAKpI,KAAiB0L,WAAW,8CAA8Cb,IAAI,YAAYnC,YAAY,UAAU9F,MAAM,CAAC,IAAM,QAAQ,CAACL,EAAG,MAAM,CAACsI,IAAI,UAAUpI,MAAM,CAAC,iBAAkB,eAAiBP,EAAIkG,KAAKpI,KAAM,CAACqI,OAAQnG,EAAIuN,kBAAkB,CAAoB,SAAlBvN,EAAIkG,KAAKpI,KAAiB,CAAEkC,EAAIkG,KAAU,MAAE7F,EAAG,IAAI,CAACiJ,WAAW,CAAC,CAACjV,KAAK,OAAOkV,QAAQ,SAASzU,MAAOkL,EAAIkG,KAAiB,aAAEsD,WAAW,sBAAsBhD,YAAY,mBAAmB9F,MAAM,CAAC,KAAOV,EAAIkG,KAAKA,KAAK,OAAS,SAAS,IAAM,YAAY7G,GAAG,CAAC,MAAQW,EAAIwN,mBAAmB,CAACnN,EAAG,MAAM,CAACmG,YAAY,QAAQ9F,MAAM,CAAC,IAAMV,EAAIkG,KAAKuH,MAAM,SAAW,QAAQ,IAAM,IAAIpO,GAAG,CAAC,MAAQW,EAAI0N,iBAAiB,MAAQ1N,EAAI0N,iBAAiB,KAAO1N,EAAI2N,oBAAoB3N,EAAIuG,KAAKlG,EAAG,MAAM,CAACmG,YAAY,cAAc9F,MAAM,CAAC,IAAM,SAAS,CAACL,EAAG,MAAM,CAACmG,YAAY,QAAQ,CAACnG,EAAG,MAAM,CAACmG,YAAY,gBAAgB,CAACnG,EAAG,IAAI,CAACK,MAAM,CAAC,KAAOV,EAAIkG,KAAKA,KAAK,MAAQlG,EAAIkG,KAAK0H,KAAK,OAAS,SAAS,IAAM,aAAa,CAAC5N,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAIkG,KAAK0H,WAAY5N,EAAkB,eAAEK,EAAG,SAAS,CAACmG,YAAY,OAAO9F,MAAM,CAAC,gBAAgBV,EAAIuN,eAAe,aAAavN,EAAI6N,gBAAgB,IAAM,QAAQxO,GAAG,CAAC,MAAQW,EAAI8N,cAAc,CAACzN,EAAG,OAAO,CAACmG,YAAY,iBAAiBxG,EAAIuG,OAAOlG,EAAG,MAAM,CAACmG,YAAY,qBAAqB,CAACnG,EAAG,IAAI,CAACK,MAAM,CAAC,KAAOV,EAAIkG,KAAKA,KAAK,MAAQlG,EAAIkG,KAAKtH,KAAK,OAAS,SAAS,IAAM,aAAa,CAACoB,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAIkG,KAAKtH,cAAiC,UAAlBoB,EAAIkG,KAAKpI,KAAkB,CAACuC,EAAG,IAAI,CAACmG,YAAY,mBAAmB9F,MAAM,CAAC,KAAOV,EAAIkG,KAAKA,KAAK,OAAS,SAAS,IAAM,YAAY7G,GAAG,CAAC,MAAQW,EAAIwN,mBAAmB,CAACnN,EAAG,MAAM,CAACiJ,WAAW,CAAC,CAACjV,KAAK,OAAOkV,QAAQ,SAASzU,MAAOkL,EAAIkG,KAAiB,aAAEsD,WAAW,sBAAsB9I,MAAM,CAAC,IAAMV,EAAIkG,KAAKuH,MAAM,SAAW,QAAQ,IAAM,IAAIpO,GAAG,CAAC,KAAOW,EAAI2N,qBAAwC,UAAlB3N,EAAIkG,KAAKpI,KAAkB,CAACuC,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,OAAOkV,QAAQ,SAASzU,MAAOkL,EAAIkG,KAAiB,aAAEsD,WAAW,sBAAsB9I,MAAM,CAAC,QAAU,WAAW,SAAW,IAAIrB,GAAG,CAAC,QAAUW,EAAI2N,iBAAiB,CAACtN,EAAG,SAAS,CAACK,MAAM,CAAC,IAAMV,EAAIkG,KAAKnN,MAAM,KAAOiH,EAAIkG,KAAK6H,gBAAmC,UAAlB/N,EAAIkG,KAAKpI,KAAkB,CAACuC,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,OAAOkV,QAAQ,SAASzU,MAAOkL,EAAIkG,KAAiB,aAAEsD,WAAW,sBAAsB9I,MAAM,CAAC,SAAW,GAAG,QAAU,YAAYrB,GAAG,CAAC,QAAUW,EAAI2N,iBAAiB,CAACtN,EAAG,SAAS,CAACK,MAAM,CAAC,IAAMV,EAAIkG,KAAKnN,MAAM,KAAOiH,EAAIkG,KAAK6H,gBAAmC,UAAlB/N,EAAIkG,KAAKpI,KAAkB,CAAqB,kBAAnBkC,EAAIkG,KAAKrK,MAA2BwE,EAAG,KAAK,CAACL,EAAIoB,GAAG,uCAAuCpB,EAAIqB,GAAGrB,EAAIgO,cAAc,uCAAuC3N,EAAG,IAAI,CAACK,MAAM,CAAC,KAAOV,EAAIkG,KAAKA,KAAK,OAAS,SAAS,IAAM,aAAa,CAAClG,EAAIoB,GAAG,gBAAgBpB,EAAIoB,GAAG,mDAAuE,YAAnBpB,EAAIkG,KAAKrK,MAAqB,CAACwE,EAAG,MAAM,CAACA,EAAG,KAAK,CAACL,EAAIoB,GAAG,8DAA8Df,EAAG,IAAI,CAACK,MAAM,CAAC,KAAOV,EAAIkG,KAAKA,KAAK,OAAS,SAAS,IAAM,aAAa,CAAClG,EAAIoB,GAAG,gBAAgBpB,EAAIoB,GAAG,2DAA2Df,EAAG,MAAMA,EAAG,MAAM,CAACmG,YAAY,kBAAkB,CAACxG,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAIkG,KAAKU,cAAcvG,EAAG,SAAS,CAACmG,YAAY,OAAO9F,MAAM,CAAC,gBAAgBV,EAAIuN,eAAe,aAAavN,EAAI6N,iBAAiBxO,GAAG,CAAC,MAAQW,EAAI8N,cAAc,CAACzN,EAAG,OAAO,CAACmG,YAAY,kBAAkBxG,EAAIuG,MAAMvG,EAAIuG,MAAM,KAAKvG,EAAIuG,OACp4G,IDUpB,EACA,KACA,KACA,M,QERF,MAAM0H,EAAe3J,OAEN2J,QAAaC,OAAO9K,OAAO,CAAC8B,EAAKrG,KAC/CqG,EAAI,WAAarG,EAAKsP,UAAU,EAAGtP,EAAKrM,OAAS,IAAMyb,EAAapP,GAAM9I,QAEnEmP,GACL,IC4EH,MAAMkJ,EAAY,EAAlB,IAQAC,EAAaC,cAAgBA,EAA7B,EACAD,EAAaE,YAAcA,EAC3BF,EAAa5F,SAAWA,EAAxB,EAEA,ICpG+L,EDoG/L,CACA,eACA,aACA,OACA,eACA,eACA,eACA,4BACA,0BAEA,UACA,aACA,MAQA,OALA,EADA,uCACA,oEAEA,qEAGA,kBAEA,cACA,uDAEA,oBACA,uCAEA,mBACA,qCAGA,SACA,WACA,mDEpHe,EAXC,YACd,GCRW,WAAa,IAAIzI,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACE,MAAM,CAC9G,MACA,CAACiO,KAAMxO,EAAI4G,QAAQ4H,KAAMrR,UAAW6C,EAAI4G,QAAQzJ,UAAW,kBAAmB6C,EAAIyO,mBAAoB/N,MAAM,CAAC,GAAK,OAASV,EAAI4G,QAAQ5J,GAAG,YAAYgD,EAAI4G,QAAQ9I,KAAK,eAAekC,EAAI4G,QAAQ8H,QAAQ,YAAY1O,EAAI4G,QAAQ+H,MAAQ3O,EAAI4G,QAAQ+H,KAAK/N,OAAO,CAACP,EAAG,OAAO,CAACmG,YAAY,+BAA+B9F,MAAM,CAAC,aAAaV,EAAI4O,oBAAoB,CAAC5O,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAI6O,aAAa,UAAgC,cAArB7O,EAAI4G,QAAQ9I,KAAsB,CAACuC,EAAG,OAAO,CAACmG,YAAY,QAAQ,CAACxG,EAAIoB,GAAG,IAAIpB,EAAIqB,GAAGrB,EAAI4G,QAAQ8H,SAAS,OAAOrO,EAAG,OAAO,CAACmG,YAAY,WAAWxG,EAAIoM,GAAIpM,EAAI4G,QAAc,QAAE,SAASkI,EAAM9R,GAAI,OAAOqD,EAAG,OAAO,CAACjL,IAAI4H,GAAI,CAACgD,EAAIoB,GAAGpB,EAAIqB,GAAGyN,GAAO,UAAS,IAAK9O,EAAI+O,WAAY,CAAC/O,EAAI4K,GAAG,GAAGvK,EAAGL,EAAIgP,iBAAiB,CAACC,IAAI,YAAYvO,MAAM,CAAC,QAAUV,EAAIpD,QAAQ,QAAUoD,EAAI4G,YAAkC,WAArB5G,EAAI4G,QAAQ9I,KAAmB,CAACkC,EAAI4K,GAAG,GAAGvK,EAAG,OAAO,CAACmG,YAAY,UAAU9F,MAAM,CAAC,IAAM,SAAS,CAACL,EAAG,WAAW,CAACK,MAAM,CAAC,KAAOV,EAAI4G,QAAQ+H,KAAK,IAAM,UAAU3O,EAAIoB,GAAG,KAAKf,EAAG,gBAAgB,CAACK,MAAM,CAAC,QAAUV,EAAI4G,WAAW5G,EAAIoM,GAAIpM,EAAI4G,QAAgB,UAAE,SAASe,GAAS,OAAOtH,EAAG,cAAc,CAACjL,IAAIuS,EAAQzB,KAAKxF,MAAM,CAAC,uBAAuBV,EAAIkP,mBAAmB,KAAOvH,EAAQ,QAAU3H,EAAIpE,eAAc,IAAI,CAAuB,YAArBoE,EAAI4G,QAAQ9I,KAAoBuC,EAAG,OAAO,CAACmG,YAAY,QAAQ,CAAExG,EAAI4G,QAAQ+H,MAAQ3O,EAAI4G,QAAQ+H,KAAK/N,KAAM,CAACP,EAAG,OAAO,CAACmG,YAAY,aAAa,CAACxG,EAAIoB,GAAG,OAAOf,EAAG,WAAW,CAACK,MAAM,CAAC,KAAOV,EAAI4G,QAAQ+H,QAAQtO,EAAG,OAAO,CAACmG,YAAY,aAAa,CAACxG,EAAIoB,GAAG,SAASpB,EAAIuG,MAAM,GAAyB,WAArBvG,EAAI4G,QAAQ9I,KAAmBuC,EAAG,OAAO,CAACmG,YAAY,QAAQ,CAAExG,EAAI4G,QAAQ+H,MAAQ3O,EAAI4G,QAAQ+H,KAAK/N,KAAM,CAACP,EAAG,OAAO,CAACmG,YAAY,aAAa,CAACxG,EAAIoB,GAAG,OAAOpB,EAAIoB,GAAG,aAAapB,EAAIqB,GAAGrB,EAAI4G,QAAQ+H,KAAK/N,MAAM,cAAcP,EAAG,OAAO,CAACmG,YAAY,aAAa,CAACxG,EAAIoB,GAAG,SAASpB,EAAIuG,MAAM,GAAGlG,EAAG,OAAO,CAACmG,YAAY,QAAQ,CAAExG,EAAI4G,QAAQ+H,MAAQ3O,EAAI4G,QAAQ+H,KAAK/N,KAAM,CAACP,EAAG,OAAO,CAACmG,YAAY,aAAa,CAACxG,EAAIoB,GAAG,OAAOf,EAAG,WAAW,CAACK,MAAM,CAAC,KAAOV,EAAI4G,QAAQ+H,QAAQtO,EAAG,OAAO,CAACmG,YAAY,aAAa,CAACxG,EAAIoB,GAAG,SAASpB,EAAIuG,MAAM,GAAGlG,EAAG,OAAO,CAACmG,YAAY,UAAU9F,MAAM,CAAC,IAAM,SAAS,CAAEV,EAAI4G,QAAoB,aAAEvG,EAAG,OAAO,CAACmG,YAAY,8CAA8C9F,MAAM,CAAC,aAAa,kDAAkD,CAACL,EAAG,UAAUL,EAAIuG,KAAMvG,EAAI4G,QAAsB,eAAEvG,EAAG,OAAO,CAACmG,YAAY,wCAAwC9F,MAAM,CAAC,aAAc,6CAAgDV,EAAI4G,QAAsB,eAAI,UAAW,CAACvG,EAAG,OAAO,CAACL,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAI4G,QAAQuI,qBAAqBnP,EAAIuG,KAAKlG,EAAG,gBAAgB,CAACK,MAAM,CAAC,QAAUV,EAAIpD,QAAQ,QAAUoD,EAAI4G,WAAW5G,EAAIoM,GAAIpM,EAAI4G,QAAgB,UAAE,SAASe,GAAS,OAAOtH,EAAG,cAAc,CAACjL,IAAIuS,EAAQzB,KAAKxF,MAAM,CAAC,uBAAuBV,EAAIkP,mBAAmB,KAAOvH,EAAQ,QAAU3H,EAAIpE,eAAc,KAAK,KAC5sF,CAAC,WAAa,IAAiBsE,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,OAAO,CAACmG,YAAY,QAAQ,CAACnG,EAAG,OAAO,CAACmG,YAAY,aAAa,CAAlIvG,KAAuImB,GAAG,aAAa,WAAa,IAAiBlB,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,OAAO,CAACmG,YAAY,QAAQ,CAACnG,EAAG,OAAO,CAACmG,YAAY,aAAa,CAAlIvG,KAAuImB,GAAG,aDQhW,EACA,KACA,KACA,M,QEMF,MAAM,EAAN,MAGA,ICvBwM,EDuBxM,CACA,wBACA,YACA,WAEA,OACA,eACA,eACA,6BAEA,UACA,CACA,iBAGA,UACA,gBACA,WAEA,6BACA,SAGA,6BACA,YAIA,eAEA,WACA,6BACA,QACA,UACA,cACA,OACA,MACA,OACA,+BACA,+BAEA,MACA,WACA,OACA,MACA,iDAEA,MACA,WACA,OACA,mDAEA,MACA,WACA,OACA,MACA,OACA,2BACA,2BAEA,MACA,WACA,OACA,MACA,iDAEA,MACA,WACA,OACA,oDAOA,cAMA,OAJA,WACA,2BAGA,IAGA,SACA,kBACA,mCACA,6BE7Fe,EAXC,YACd,GCRW,WAAa,IAAIpB,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACE,MAAM,CAAC,MAAO,CAAC6O,OAAQpP,EAAIqP,cAAc3O,MAAM,CAAC,YAAY,cAAc,CAACL,EAAG,MAAM,CAACmG,YAAY,qBAAqB,CAACnG,EAAG,OAAO,CAACmG,YAAY,SAASnG,EAAG,OAAO,CAACmG,YAAY,SAASnG,EAAG,OAAO,CAACmG,YAAY,UAAUnH,GAAG,CAAC,MAAQW,EAAIsP,kBAAkB,CAACtP,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAIuP,gBAAgBlP,EAAG,SAAS,CAACmG,YAAY,gBAAgB9F,MAAM,CAAC,aAAa,gCAAgCV,EAAIoM,GAAIpM,EAAY,UAAE,SAAS4G,GAAS,OAAOvG,EAAG,UAAU,CAACjL,IAAIwR,EAAQ5J,GAAG0D,MAAM,CAAC,QAAUV,EAAIpD,QAAQ,QAAUgK,SAAc,KAC/kB,IDUpB,EACA,KACA,KACA,M,yBEDF,gBAEA,ICfkM,EDelM,CACA,kBACA,OACA,gBAEA,UACA,aACA,sDAGA,UACA,uBACA,oCAGA,gBACA,qCAEA,SACA,cACA,uDAEA,YACA,oBAEA,wBACA,qCAGA,eAEA,6CACA,kBACA,sBACA,uBACA,4BEhCe,EAXC,YACd,GCRW,WAAa,IAAiB1G,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,gDAAgD9F,MAAM,CAAC,aAA3IT,KAA4JuP,aAAa,CAACnP,EAAG,MAAM,CAACmG,YAAY,eAAe,CAACnG,EAAG,OAAO,CAACmG,YAAY,mBAAmB9F,MAAM,CAAC,aAAjQT,KAAkRwP,wBAC9R,IDUpB,EACA,KACA,KACA,M,QE2CF,MAAM,EAAN,MAQA,IAAIC,IAAoB,EAExB,ICnEmM,GDmEnM,CACA,mBACA,YACA,UACA,mBACA,cAEA,OACA,eACA,gBAEA,UACA,oBACA,iCACA,6BAIA,wDACA,oCACA,kCAKA,2DACA,6BAGA,WACA,WAEA,qCAIA,QACA,cACA,8BAEA,OAEA,YAKA,WACA,GACA,YACA,iBACA,aAGA,WAGA,mBAIA,UAGA,kCACA,SAIA,WAGA,OACA,eACA,iCAIA,uBACA,0DACA,0DAGA,qBACA,2BAEA,2BACA,oBAEA,8BAIA,UACA,oBACA,kBAIA,8BACA,gFACA,wBAIA,wBAGA,UACA,0EAEA,mCAEA,oBACA,sBACA,2DAIA,eACA,OAEA,gBACA,oCACA,iEAEA,YACA,sBACA,mCAGA,SACA,6BACA,oCAEA,MACA,SAGA,yBACA,mBAEA,OACA,2BACA,6BACA,mCAGA,6BACA,wCACA,OACA,IAKA,sBACA,oCACA,OACA,GACA,oBACA,oBACA,QACA,2BAGA,UEvOe,SAAUC,GAExB,QAAqC,IAA1Bha,OAAOia,eACjB,OAGD,MAAMC,EAAYla,OAAOma,eAGzB,GAAID,EAAUE,aAAeF,EAAUG,UACtC,OAGD,MAAMC,EAAQJ,EAAUK,WAAW,GAC7BC,EAAmBF,EAAMG,gBACzBC,EAAMrY,SAAS2O,cAAc,OAEnC0J,EAAIrT,GAAK,eACTqT,EAAIC,YAAYH,GAChBR,EAAKW,YAAYD,GAEjBR,EAAUU,kBAAkBF,GAE5B1a,OAAO6a,WAAW,KACjBb,EAAKc,YAAYJ,GACjBR,EAAUa,kBACVb,EAAUc,SAASV,IACjB,GF6MJ,YAEA,yBACA,0BAGA,+BACA,uBACA,WACA,YACA,iBAGA,kBACA,kCACA,OAGA,SAIA,qCACA,oBACA,OACA,MAIA,+BAEA,iBACA,uBACA,SACA,iEAGA,wBACA,cACA,kBAIA,0BAGA,qBAGA,6BACA,OAGA,wBAEA,KAIA,iCAeA,6BACA,oBACA,6BACA,2BAjBA,gCACA,mCAEA,6BACA,oBACA,6BACA,4BACA,iCAaA,eAGA,4BAEA,YADA,6BAIA,wBAEA,IAIA,8EAEA,eAEA,+BACA,qBAGA,eACA,4BACA,iCAEA,wBACA,8BGnUe,GAXC,YACd,ICRW,WAAa,IAAIjQ,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACsI,IAAI,OAAOnC,YAAY,OAAO9F,MAAM,CAAC,SAAW,OAAO,CAACL,EAAG,MAAM,CAACiJ,WAAW,CAAC,CAACjV,KAAK,OAAOkV,QAAQ,SAASzU,MAAOkL,EAAIpE,QAA4B,qBAAE4N,WAAW,iCAAiChD,YAAY,aAAa,CAACnG,EAAG,SAAS,CAACsI,IAAI,iBAAiBnC,YAAY,MAAM9F,MAAM,CAAC,SAAWV,EAAIpE,QAAQ4B,iBAAmBwC,EAAIoJ,OAAO3Q,MAAMqC,aAAauE,GAAG,CAAC,MAAQW,EAAI4Q,kBAAkB,CAAE5Q,EAAIpE,QAAsB,eAAEyE,EAAG,OAAO,CAACL,EAAIoB,GAAG,cAAcf,EAAG,OAAO,CAACL,EAAIoB,GAAG,6BAA6Bf,EAAG,MAAM,CAACmG,YAAY,WAAW9F,MAAM,CAAC,KAAO,MAAM,YAAY,SAAS,gBAAgB,aAAarB,GAAG,CAAC,KAAOW,EAAI6Q,SAAS,CAAC7Q,EAAIoM,GAAIpM,EAAqB,mBAAE,SAAS4G,EAAQ5J,GAAI,MAAO,CAAEgD,EAAI8Q,wBAAwBlK,EAAS5J,GAAKqD,EAAG,aAAa,CAACjL,IAAIwR,EAAQ5J,GAAK,QAAQ0D,MAAM,CAAC,QAAUkG,KAAW5G,EAAIuG,KAAMvG,EAAI+Q,0BAA0BnK,EAAQ5J,IAAKqD,EAAG,MAAM,CAACjL,IAAIwR,EAAQ5J,GAAK,UAAUwJ,YAAY,iBAAiB,CAACnG,EAAG,OAAO,CAACmG,YAAY,yBAAyBxG,EAAIuG,KAAuB,cAAjBK,EAAQ9I,KAAsBuC,EAAG,mBAAmB,CAACjL,IAAIwR,EAAQ/I,SAAS,GAAGb,GAAG0D,MAAM,CAAC,QAAUV,EAAIpD,QAAQ,uBAAuBoD,EAAIkP,mBAAmB,SAAWtI,EAAQ/I,YAAYwC,EAAG,UAAU,CAACjL,IAAIwR,EAAQ5J,GAAG0D,MAAM,CAAC,QAAUV,EAAIpE,QAAQ,QAAUoE,EAAIpD,QAAQ,QAAUgK,EAAQ,uBAAuB5G,EAAIkP,mBAAmB,qBAAqBlP,EAAIyO,iBAAiB7H,EAAS5J,IAAKqC,GAAG,CAAC,sBAAsBW,EAAIgR,4BAA2B,OAC39C,IDUpB,EACA,KACA,KACA,M,kFEZF,MAAM5C,GAAY9J,EAAQ,IASX2M,OA6If,SAA4BC,GAC3B,IAAIC,EAAW,EACXC,EAAY,GACZC,EAAiB,GAErBH,EAAMtF,iBAAiB,QAAUhS,IACf,iBAAbA,EAAE0X,SAINH,EAAW,EACXE,EAAiB,GACjBD,EAAY,MAGbG,KAAUL,GAAO7b,KAChB,MACCuE,IACA,GAAIrD,KAAMkC,MAAMoC,iBACf,OAGDjB,EAAEkH,iBAEF,MAAMa,EAAOuP,EAAMpc,MAEnB,GAAiB,IAAbqc,EAAgB,CAGnB,GAFAC,EAAYzP,EAAKwM,UAAU,EAAG+C,EAAMM,gBAAgBC,MAAM,MAAMC,MAEvC,IAArBN,EAAU5e,OACb,OAKD,GAFA6e,EAAiBM,GAAcP,GAAW,GAEZ,IAA1BC,EAAe7e,OAClB,OAIF,MAAM+P,EAAW2O,EAAMM,eAAiBJ,EAAU5e,OAC5Cof,EAAWC,GAChBR,EAAeF,EAAWE,EAAe7e,QACzC+P,GAEKuP,EAAYnQ,EAAKoQ,OAAOb,EAAMM,gBAEpCN,EAAMpc,MAAQ6M,EAAKoQ,OAAO,EAAGxP,GAAYqP,EAAWE,EACpDZ,EAAMM,gBAAkBM,EAAUtf,OAClC0e,EAAMc,aAAed,EAAMM,eAG3BN,EAAMe,cACL,IAAIC,YAAY,QAAS,CACxBZ,OAAQ,kBAIVF,EAAYQ,EACZT,KAED,WAGD,MAAMgB,EAAS,IAAIC,YAASlB,GACtBmB,EAAe,IAAIC,gBAAaH,EAAQ,CAC7CI,SAAU,CACTC,UAAW,oBACXC,UAAW,SA6Bb,OAzBAJ,EAAaK,SAAS,CACrBC,GACAC,GACAC,GACAC,GACAC,GACAC,KAKDX,EAAahT,GAAG,WAAY,KACvBgT,EAAaE,SAASU,MAAMzgB,OAAS,GACxC6f,EAAaE,SAASU,MAAM,GAAGC,aAIjCb,EAAahT,GAAG,OAAQ,KACvB9I,KAAMS,OAAO,oBAAoB,KAGlCqb,EAAahT,GAAG,SAAU,KACzB9I,KAAMS,OAAO,oBAAoB,KAG3B,CACNmc,OACCd,EAAac,QAEdC,UACCf,EAAae,UACb7c,KAAMS,OAAO,oBAAoB,MAlPpC,MAAMqc,GAAmB5gB,OAAOyb,KAAK3F,IAC/BoK,GAAgB,CACrB3V,GAAI,QACJ+F,MAAO,2BACP3J,OAAOka,EAAMC,GAIZA,EAASC,GADTF,EAAOA,EAAK1Q,QAAQ,KAAM,IACDyQ,MAE1BI,SAAQ,EAAEC,EAAQC,KACjB,8BAA8BpL,GAASoL,GAAvC,mBAA2DD,GAE5D9Q,QAAO,EAAE,CAAE+Q,KACH,KAAOpL,GAASoL,GAExBvP,MAAO,GAGFwO,GAAgB,CACrB5V,GAAI,QACJ+F,MAAO,4DACP3J,OAAOka,EAAMC,GAGI,OAFhBD,EAAOA,EAAKzd,MAAM,IAET,GACR0d,EAAS5B,GAAc2B,EAAKzd,MAAM,IAAI,GAAM8J,IAAKiU,GAAQ,CAAC,IAAMA,EAAI,GAAI,IAAMA,EAAI,MAElFL,EAAS5B,GAAc2B,GAAM,KAG/BG,SAAQ,EAAEC,KACFA,EAER9Q,QAAO,EAAE,CAAE+Q,KACH,KAAO9B,GAAY8B,GAE3BvP,MAAO,GAGFyO,GAAe,CACpB7V,GAAI,QACJ+F,MAAO,8CACP3J,OAAOka,EAAMC,GACZA,EAsQF,SAAuBM,GACtB,MAAMC,EAAQ,GAEd,IAAK,MAAMlY,KAAWrF,KAAMkC,MAAMiC,cAAckC,QAAQC,SAElC,YAAjBjB,EAAQkC,MAAsBlC,EAAQvH,KAAK,KAAOwf,EAAK,IAC1DC,EAAMhhB,KAAK8I,EAAQvH,MAIrB,OAAOmf,GAAUK,EAAMC,GAhRbC,CAAcT,KAExBG,SAAQ,EAAEC,KACFA,EAER9Q,QAAO,EAAE,CAAE+Q,KACH,KAAOA,EAEfvP,MAAO,GAGF0O,GAAkB,CACvB9V,GAAI,WACJ+F,MAAO,YACP3J,OAAOka,EAAMC,GACZA,EAiPF,SAA0BM,GACzB,MAAMC,EAAQ1F,GAAUvD,SAAShV,QAEjC,OAAO2d,GAAUK,EAAMC,GApPbE,CAAiB,IAAMV,KAEjCG,SAAQ,EAAEC,KACFA,EAER9Q,QAAO,EAAE,CAAE+Q,KACHA,EAERvP,MAAO,GAGF2O,GAA0B,CAC/B/V,GAAI,oBACJ+F,MAAO,iCACP3J,OAAOka,EAAMC,GACZD,EAAOA,EAAK3W,cAkBZ4W,EAhB2BnF,GAAU6F,aACnCrb,OAAQtG,GAAM4hB,KAAMhb,KAAKoa,EAAMhhB,EAAE,KAAO4hB,KAAMhb,KAAKoa,EAAMhhB,EAAE,KAC3DqN,IAAKrN,GACD4hB,KAAMhb,KAAKoa,EAAMhhB,EAAE,IACf,CACNA,EAAE,GACF4hB,KAAMnR,MAAMuQ,EAAMhhB,EAAE,GAAI,CACvB6hB,IAAK,MACLC,KAAM,SACJC,UAIE/hB,KAKVmhB,SAAS3e,GACR,6BAA6Bwf,SAASxf,EAAM,GAAI,IAAhD,aAAwDA,EAAM,GAA9D,WAED8N,QAAQ9N,GACA,IAASA,EAAM,GAEvBsP,MAAO,GAGF4O,GAA0B,CAC/BhW,GAAI,oBACJ+F,MAAO,yCACP3J,OAAOka,EAAMC,EAAUxQ,GACtBuQ,EAAOA,EAAK3W,cAkBZ4W,EAjB2BnF,GAAU6F,aACnCrb,OAAQtG,GAAM4hB,KAAMhb,KAAKoa,EAAMhhB,EAAE,KAAO4hB,KAAMhb,KAAKoa,EAAMhhB,EAAE,KAC3DqN,IAAK4U,GACDL,KAAMhb,KAAKoa,EAAMiB,EAAK,IAClB,CACNA,EAAK,GACLL,KAAMnR,MAAMuQ,EAAMiB,EAAK,GAAI,CAC1BJ,IAAK,MACLC,KAAM,SACJC,UAIEE,GAEP5U,IAAK4U,GAASA,EAAK9Q,OAAOV,EAAM,OAInC0Q,SAAS3e,GACR,6BAA6Bwf,SAASxf,EAAM,GAAI,IAAhD,yBAAoEwf,SACnExf,EAAM,GACN,IAFD,aAGMA,EAAM,GAHZ,WAKD8N,QAAQ9N,GACA,OAAYA,EAAM,GAE1BsP,MAAO,GA+GR,SAASyN,GAAY8B,EAAUpR,EAAW,GAEzC,OAAKhM,KAAMkC,MAAMqT,SAASjV,YAKtB0L,EAAW,GAAK,KAAKrJ,KAAK3C,KAAMkC,MAAMiC,cAAckB,QAAQyB,gBACxDsW,EAAW,IAIZA,EAAWpd,KAAMkC,MAAMqT,SAASjV,YAT/B8c,EAYT,SAASH,GAAUF,EAAMkB,GAKxB,OAJgBN,KAAMtb,OAAO0a,EAAMkB,EAAO,CACzCL,IAAK,MACLC,KAAM,SAEQzU,IAAK8U,GAAO,CAACA,EAAGf,OAAQe,EAAGd,WAsB3C,SAAShC,GAAckC,EAAMa,GAC5B,MAAM/P,EApBP,WACC,GAAIpO,KAAMkC,MAAMiC,cAAckB,QAAQ+I,MAAMnS,OAAS,EAAG,CAGvD,OAFc+D,KAAMkC,MAAMiC,cAAckB,QAAQ+I,MAAM9O,QAEzCyG,KAAK,CAACwI,EAAGC,IAAMA,EAAE4P,YAAc7P,EAAE6P,aAAahV,IAAKiV,GAAMA,EAAEhU,MAGzE,MAAMiU,EAAKte,KAAMkC,MAAMiC,cAAckC,QAAQgE,KACvCkU,EAAYve,KAAMkC,MAAMiC,cAAckB,QAAQvH,KAGpD,OAAIwgB,IAAOC,GAAwD,UAA3Cve,KAAMkC,MAAMiC,cAAckB,QAAQkC,KAClD,CAACgX,EAAWD,GAIb,CAACA,GAIME,GAGd,OAFAlB,EAAOA,EAAKlX,cAER+X,EACIlB,GAAUK,EAAMlP,GAGjBA,EAAM/L,OAAQoc,IAAOA,EAAErY,cAAciI,QAAQiP,I,sBCxPrD,MAAMoB,GAAoB,CAC1B,YACA,YACA,YACA,YACA,YACA,YACA,aAKMC,GAAe,CACrB,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,QACA,OAGA,IAAIC,GAAoB,KAExB,ICzFiM,GDyFjM,CACA,iBACA,OACA,eACA,gBAEA,OACA,eACA,IACA,WAGA,2BACA,sBAGA,UACA,mCAEA,0CACA,yBAGA,+BAEA,sCACA,cAQA,OANA,aACA,SACA,EACA,uDAGA,KAGA,sCACA,mDAGA,OAFA,gCAEA,KAIA,6BACA,GACA,oCACA,gDAEA,OAGA,sBAkBA,OAhBA,6BACA,yDAGA,SACA,gDACA,yBAEA,0BACA,yBAGA,wDACA,wCACA,qBAEA,IAGA,kDACA,gBAGA,YACA,oCAEA,KACA,aACA,SAGA,cAEA,SACA,qBACA,2CACA,oCACA,qBAEA,eACA,oBACA,kDACA,iCAIA,iCAKA,8BACA,qDAGA,uBACA,qCACA,2BAGA,GAEA,WAMA,GAHA,yBACA,0BAEA,8BACA,SAGA,wBACA,8BAEA,gBACA,SAsBA,GAnBA,IACA,UAGA,oCACA,+BACA,0BACA,oBAGA,kCACA,wCAIA,sCACA,gCAGA,YACA,+BACA,0BAEA,GACA,oDACA,uBAEA,SAIA,qCAEA,sBACA,iDACA,sBACA,iCAEA,iBACA,gCAEA,YACA,2BEvPe,GAXC,YACd,ICRW,WAAa,IAAInV,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,OAAO,CAACK,MAAM,CAAC,GAAK,OAAO,OAAS,OAAO,OAAS,IAAIrB,GAAG,CAAC,OAAS,SAASwB,GAAgC,OAAxBA,EAAOC,iBAAwBd,EAAI4I,SAAS/H,MAAW,CAACR,EAAG,OAAO,CAACK,MAAM,CAAC,GAAK,wBAAwBL,EAAG,OAAO,CAACK,MAAM,CAAC,GAAK,SAAS,CAACV,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAIpD,QAAQgE,SAASP,EAAG,WAAW,CAACsI,IAAI,QAAQnC,YAAY,YAAY9F,MAAM,CAAC,GAAK,QAAQ,IAAM,OAAO,aAAe,OAAO,YAAcV,EAAIoV,oBAAoBpV,EAAIpE,SAAS,aAAaoE,EAAIoV,oBAAoBpV,EAAIpE,UAAUiN,SAAS,CAAC,MAAQ7I,EAAIpE,QAAQyB,gBAAgBgC,GAAG,CAAC,MAAQW,EAAIqV,kBAAkB,SAAW,SAASxU,GAAQ,OAAIA,EAAO/C,KAAK8G,QAAQ,QAAQ5E,EAAIsV,GAAGzU,EAAO0U,QAAQ,QAAQ,GAAG1U,EAAOzL,IAAI,UAA4ByL,EAAO2U,SAAS3U,EAAO4U,UAAU5U,EAAO6U,QAAQ7U,EAAO8U,QAAjE,MAAyF9U,EAAOC,iBAAwBd,EAAI4I,SAAS/H,QAAab,EAAIoJ,OAAO3Q,MAAMC,oBAA8B,WAAE2H,EAAG,OAAO,CAACmG,YAAY,8CAA8C9F,MAAM,CAAC,GAAK,iBAAiB,aAAa,eAAerB,GAAG,CAAC,MAAQW,EAAI4V,iBAAiB,CAACvV,EAAG,QAAQ,CAACsI,IAAI,cAAcjI,MAAM,CAAC,GAAK,eAAe,KAAO,OAAO,kBAAkB,SAAS,SAAW,IAAIrB,GAAG,CAAC,OAASW,EAAI6V,uBAAuBxV,EAAG,SAAS,CAACK,MAAM,CAAC,GAAK,SAAS,KAAO,SAAS,aAAa,cAAc,UAAYV,EAAIoJ,OAAO3Q,MAAMqC,iBAAiBkF,EAAIuG,KAAKlG,EAAG,OAAO,CAACmG,YAAY,8CAA8C9F,MAAM,CAAC,GAAK,iBAAiB,aAAa,iBAAiB,CAACL,EAAG,SAAS,CAACK,MAAM,CAAC,GAAK,SAAS,KAAO,SAAS,aAAa,eAAe,UAAYV,EAAIoJ,OAAO3Q,MAAMqC,qBACplD,IDUpB,EACA,KACA,KACA,M,QEyCF,MAAMgb,GAAQ,CACd,YACA,YACA,YACA,SACA,cACA,YACA,aAGA,ICjEoM,GDiEpM,CACA,oBACA,YACA,cAEA,OACA,gBAEA,UACA,CACA,mBACA,kBAGA,UAGA,gBACA,wBAIA,kEACA,UACA,YACA,qBAGA,eACA,WAEA,yBACA,2BAEA,kBACA,gCAEA,OACA,SAIA,oBAEA,mBAGA,mCACA,uBAEA,KAGA,aAFA,SAOA,WAGA,SACA,sBACA,qCAEA,gBACA,MAEA,aAGA,oBACA,OAGA,qDACA,4BACA,0BACA,YACA,WACA,cACA,eACA,yBAEA,oBAEA,aACA,mBAEA,kBACA,sBAEA,sBAGA,6BACA,mBAEA,yBAQA,GALA,uBACA,0CAIA,SAEA,YADA,sBAIA,iCAGA,4BAGA,OAFA,0CACA,0BAQA,IAJA,KAIA,KACA,YAGA,mBACA,YAGA,qBACA,2BAEA,qBAEA,oBACA,6CACA,wDE1Le,GAXC,YACd,ICRW,WAAa,IAAI9V,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,QAAQ,CAACsI,IAAI,WAAWnC,YAAY,WAAWnH,GAAG,CAAC,WAAaW,EAAI+V,kBAAkB,CAAC1V,EAAG,MAAM,CAACmG,YAAY,SAAS,CAACnG,EAAG,QAAQ,CAACsI,IAAI,QAAQnC,YAAY,SAAS9F,MAAM,CAAC,YAAcV,EAAIpE,QAAQ+I,MAAMnS,OAAS,SAAwC,IAA7BwN,EAAIpE,QAAQ+I,MAAMnS,OAAe,GAAK,KAAK,KAAO,SAAS,aAAa,6BAA6B,SAAW,MAAMqW,SAAS,CAAC,MAAQ7I,EAAIgW,iBAAiB3W,GAAG,CAAC,MAAQW,EAAIiW,mBAAmB,QAAU,CAAC,SAASpV,GAAQ,OAAIA,EAAO/C,KAAK8G,QAAQ,QAAQ5E,EAAIsV,GAAGzU,EAAO0U,QAAQ,KAAK,GAAG1U,EAAOzL,IAAI,CAAC,KAAK,YAAqB,KAAc4K,EAAIkW,iBAAiBrV,GAAS,IAAI,SAASA,GAAQ,OAAIA,EAAO/C,KAAK8G,QAAQ,QAAQ5E,EAAIsV,GAAGzU,EAAO0U,QAAQ,OAAO,GAAG1U,EAAOzL,IAAI,CAAC,OAAO,cAAuB,KAAc4K,EAAIkW,iBAAiBrV,EAAQ,IAAI,SAASA,GAAQ,OAAIA,EAAO/C,KAAK8G,QAAQ,QAAQ5E,EAAIsV,GAAGzU,EAAO0U,QAAQ,eAAU9S,EAAU5B,EAAOzL,SAAIqN,GAAoB,KAAczC,EAAIkW,iBAAiBrV,GAAS,KAAK,SAASA,GAAQ,OAAIA,EAAO/C,KAAK8G,QAAQ,QAAQ5E,EAAIsV,GAAGzU,EAAO0U,QAAQ,iBAAY9S,EAAU5B,EAAOzL,SAAIqN,GAAoB,KAAczC,EAAIkW,iBAAiBrV,EAAQ,KAAK,SAASA,GAAQ,OAAIA,EAAO/C,KAAK8G,QAAQ,QAAQ5E,EAAIsV,GAAGzU,EAAO0U,QAAQ,QAAQ,GAAG1U,EAAOzL,IAAI,SAAkB,KAAc4K,EAAImW,WAAWtV,UAAeR,EAAG,MAAM,CAACmG,YAAY,SAASxG,EAAIoM,GAAIpM,EAAgB,cAAE,SAAS2E,EAAM3P,GAAM,OAAOqL,EAAG,MAAM,CAACjL,IAAIJ,EAAKuL,MAAM,CAAC,YAAaP,EAAIoW,aAAaphB,KAAQ,CAAEgL,EAAIgW,gBAAgBxjB,OAAS,EAAGwN,EAAIoM,GAAG,GAAQ,SAASzL,GAAM,OAAON,EAAG,WAAW,CAACjL,IAAIuL,EAAKgT,SAAS/S,KAAKF,MAAM,CAAC,WAAWV,EAAIqW,UAAU,OAAS1V,EAAKgT,WAAa3T,EAAIsW,WAAW,KAAO3V,EAAKgT,UAAU9K,SAAS,CAAC,UAAY7I,EAAIqB,GAAGV,EAAK+S,cAAa1T,EAAIoM,GAAG,GAAQ,SAASzL,GAAM,OAAON,EAAG,WAAW,CAACjL,IAAIuL,EAAKC,KAAKF,MAAM,CAAC,WAAWV,EAAIqW,UAAU,OAAS1V,IAASX,EAAIsW,WAAW,KAAO3V,SAAW,MAAK,OACn2D,IDUpB,EACA,KACA,KACA,M,QEdoM,GCsBtM,CACA,gBACA,OACA,eACA,gBAEA,SACA,cACA,iBCZe,GAXC,YACd,ICRW,WAAa,IAAIX,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,QAAQ,CAACmG,YAAY,YAAY,CAACxG,EAAI4K,GAAG,GAAGvK,EAAG,QAAQL,EAAIoM,GAAIpM,EAAIpE,QAAY,MAAE,SAAS2a,GAAK,OAAOlW,EAAG,KAAK,CAACjL,IAAImhB,EAAIC,UAAU,CAACnW,EAAG,KAAK,CAACmG,YAAY,YAAY,CAACxG,EAAIoB,GAAGpB,EAAIqB,GAAGkV,EAAIC,aAAanW,EAAG,KAAK,CAACmG,YAAY,aAAa,CAACxG,EAAIoB,GAAGpB,EAAIqB,GAAGkV,EAAIE,cAAcpW,EAAG,KAAK,CAACmG,YAAY,aAAa,CAACxG,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAI0W,WAAWH,EAAII,oBAAmB,OAC1a,CAAC,WAAa,IAAiBzW,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,QAAQ,CAACA,EAAG,KAAK,CAACA,EAAG,KAAK,CAACmG,YAAY,YAAY,CAApHvG,KAAyHmB,GAAG,YAAYf,EAAG,KAAK,CAACmG,YAAY,aAAa,CAA1KvG,KAA+KmB,GAAG,eAAef,EAAG,KAAK,CAACmG,YAAY,aAAa,CAAnOvG,KAAwOmB,GAAG,sBDUrR,EACA,KACA,KACA,M,QEduM,GCsBzM,CACA,mBACA,OACA,eACA,gBAEA,SACA,cACA,iBCZe,GAXC,YACd,ICRW,WAAa,IAAIpB,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,QAAQ,CAACmG,YAAY,eAAe,CAACxG,EAAI4K,GAAG,GAAGvK,EAAG,QAAQL,EAAIoM,GAAIpM,EAAIpE,QAAY,MAAE,SAASgb,GAAQ,OAAOvW,EAAG,KAAK,CAACjL,IAAIwhB,EAAOJ,UAAU,CAACnW,EAAG,KAAK,CAACmG,YAAY,YAAY,CAACxG,EAAIoB,GAAGpB,EAAIqB,GAAGuV,EAAOJ,aAAanW,EAAG,KAAK,CAACmG,YAAY,gBAAgB,CAACxG,EAAIoB,GAAGpB,EAAIqB,GAAGuV,EAAOC,eAAexW,EAAG,KAAK,CAACmG,YAAY,gBAAgB,CAACxG,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAI0W,WAAWE,EAAOE,qBAAoB,OACpc,CAAC,WAAa,IAAiB5W,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,QAAQ,CAACA,EAAG,KAAK,CAACA,EAAG,KAAK,CAACmG,YAAY,YAAY,CAApHvG,KAAyHmB,GAAG,aAAaf,EAAG,KAAK,CAACmG,YAAY,gBAAgB,CAA9KvG,KAAmLmB,GAAG,gBAAgBf,EAAG,KAAK,CAACmG,YAAY,gBAAgB,CAA3OvG,KAAgPmB,GAAG,uBDU7R,EACA,KACA,KACA,M,QEdwM,GCuB1M,CACA,oBACA,YACA,mBAEA,OACA,eACA,iBCZe,GAXC,YACd,ICRW,WAAa,IAAIpB,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAQF,EAAIpE,QAAQ5J,KAAS,KAAEqO,EAAG,OAAO,CAACL,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAIpE,QAAQ5J,KAAK2P,SAAStB,EAAG,QAAQ,CAACmG,YAAY,gBAAgB,CAACxG,EAAI4K,GAAG,GAAGvK,EAAG,QAAQL,EAAIoM,GAAIpM,EAAIpE,QAAY,MAAE,SAASmb,GAAM,OAAO1W,EAAG,KAAK,CAACjL,IAAI2hB,EAAKnb,SAAS,CAACyE,EAAG,KAAK,CAACmG,YAAY,WAAW,CAACnG,EAAG,gBAAgB,CAACK,MAAM,CAAC,QAAUV,EAAIpD,QAAQ,KAAOma,EAAKnb,YAAY,GAAGyE,EAAG,KAAK,CAACmG,YAAY,SAAS,CAACxG,EAAIoB,GAAGpB,EAAIqB,GAAG0V,EAAKC,cAAc3W,EAAG,KAAK,CAACmG,YAAY,SAAS,CAACnG,EAAG,gBAAgB,CAACK,MAAM,CAAC,QAAUV,EAAIpD,QAAQ,KAAOma,EAAKE,UAAU,QAAO,OACzjB,CAAC,WAAa,IAAiB/W,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,QAAQ,CAACA,EAAG,KAAK,CAACA,EAAG,KAAK,CAACmG,YAAY,WAAW,CAAnHvG,KAAwHmB,GAAG,aAAaf,EAAG,KAAK,CAACmG,YAAY,SAAS,CAAtKvG,KAA2KmB,GAAG,WAAWf,EAAG,KAAK,CAACmG,YAAY,SAAS,CAAvNvG,KAA4NmB,GAAG,kBDUzQ,EACA,KACA,KACA,M,QEduM,GCoBzM,CACA,mBACA,OACA,eACA,gBAEA,SACA,cACA,iBCVe,GAXC,YACd,ICRW,WAAa,IAAIpB,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,QAAQ,CAACmG,YAAY,eAAe,CAACxG,EAAI4K,GAAG,GAAGvK,EAAG,QAAQL,EAAIoM,GAAIpM,EAAIpE,QAAY,MAAE,SAAS+E,GAAM,OAAON,EAAG,KAAK,CAACjL,IAAIuL,EAAK6V,UAAU,CAACnW,EAAG,KAAK,CAACmG,YAAY,YAAY,CAACxG,EAAIoB,GAAGpB,EAAIqB,GAAGV,EAAK6V,aAAanW,EAAG,KAAK,CAACmG,YAAY,QAAQ,CAACxG,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAI0W,WAAW/V,EAAKuW,eAAc,OACpW,CAAC,WAAa,IAAiBhX,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAOG,EAAG,QAAQ,CAACA,EAAG,KAAK,CAACA,EAAG,KAAK,CAACmG,YAAY,YAAY,CAApHvG,KAAyHmB,GAAG,cAAcf,EAAG,KAAK,CAACmG,YAAY,QAAQ,CAAvKvG,KAA4KmB,GAAG,uBDUzN,EACA,KACA,KACA,M,QEd0L,GCoH5L,CACA,YACA,YACA,kBACA,eACA,aACA,gBACA,iBAEA,OACA,eACA,gBAEA,UACA,mBACA,6BACA,gBACA,UACA,mBACA,UACA,oBACA,UACA,mBACA,aAMA,OACA,UACA,uBAEA,uBACA,GACA,oBACA,kCAKA,UACA,sBAEA,wBACA,oBACA,iCAIA,SACA,iBAEA,yBACA,sBAEA,iCAEA,6BACA,8BAEA,kBACA,2BAIA,uBACA,oDAEA,YACA,gCACA,4BAGA,YACA,0BACA,oCAEA,2BACA,wBACA,yDACA,sCAGA,mBACA,gCACA,QACA,qBACA,wBAGA,eACA,4BACA,iBCjNkM,GCQlM,CACA,kBACA,YACA,KCJgB,YACd,ICRW,WAAa,IAAIpB,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACmG,YAAY,SAAS9F,MAAM,CAAC,GAAK,iBAAiB,uBAAuBV,EAAIpE,QAAQvH,KAAK,KAAO,KAAK,CAACgM,EAAG,MAAM,CAACE,MAAM,CAC9N,aAAcP,EAAIoJ,OAAO3Q,MAAMqT,SAASrU,KACxC,gBAAiBuI,EAAIoJ,OAAO3Q,MAAMqT,SAAShV,aAC3C,eAAgBkJ,EAAIoJ,OAAO3Q,MAAMqT,SAASlU,YAC1C,WAAYoI,EAAIoJ,OAAO3Q,MAAMqT,SAASjU,aACrC6I,MAAM,CAAC,GAAK,SAAS,CAACL,EAAG,MAAM,CAACmG,YAAY,YAAY9F,MAAM,CAAC,GAAK,QAAUV,EAAIpE,QAAQoB,GAAG,YAAYgD,EAAIpE,QAAQkC,KAAK,aAAakC,EAAIpE,QAAQvH,KAAK,KAAO,aAAa,CAACgM,EAAG,MAAM,CAACmG,YAAY,UAAU,CAACnG,EAAG,iBAAiBA,EAAG,OAAO,CAACmG,YAAY,SAAS,CAACxG,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAIpE,QAAQvH,SAASgM,EAAG,SAAS,CAACmG,YAAY,WAAW9F,MAAM,CAAC,aAAa,sBAAsBrB,GAAG,CAAC,MAAQW,EAAImX,gBAAgB9W,EAAG,SAAS,CAACmG,YAAY,OAAO9F,MAAM,CAAC,aAAa,yBAAyBrB,GAAG,CAAC,MAAQW,EAAIe,mBAAyC,YAArBf,EAAIpE,QAAQkC,KAAoBuC,EAAG,OAAO,CAACmG,YAAY,qCAAqC9F,MAAM,CAAC,aAAa,qBAAqB,CAACL,EAAG,SAAS,CAACmG,YAAY,KAAK9F,MAAM,CAAC,aAAa,oBAAoBrB,GAAG,CAAC,MAAQ,SAASwB,GAAQ,OAAOb,EAAIoJ,OAAOpS,OAAO,wBAAwBgJ,EAAIuG,MAAM,GAAyB,YAArBvG,EAAIpE,QAAQkC,KAAoBuC,EAAG,MAAM,CAACmG,YAAY,gBAAgB,CAACnG,EAAG,MAAM,CAACmG,YAAY,QAAQ,CAACnG,EAAG,MAAM,CAACmG,YAAY,YAAY,CAACnG,EAAG,MAAM,CAACmG,YAAY,OAAO,CAACnG,EAAGL,EAAIoX,iBAAiB,CAACnI,IAAI,YAAYvO,MAAM,CAAC,QAAUV,EAAIpD,QAAQ,QAAUoD,EAAIpE,YAAY,SAASyE,EAAG,MAAM,CAACmG,YAAY,gBAAgB,CAACnG,EAAG,MAAM,CAACE,MAAM,CAClnC,0DACA,CAAC,qBAAsBP,EAAIpE,QAAQ6B,mBAAoBiD,MAAM,CAAC,aAAa,2BAA2BrB,GAAG,CAAC,MAAQ,SAASwB,GAAQ,OAAOb,EAAIqX,MAAMC,YAAYC,kBAAkB,CAAClX,EAAG,MAAM,CAACmG,YAAY,wBAAwBnG,EAAG,cAAc,CAACsI,IAAI,cAAcjI,MAAM,CAAC,QAAUV,EAAIpD,QAAQ,QAAUoD,EAAIpE,WAAiC,YAArBoE,EAAIpE,QAAQkC,KAAoBuC,EAAG,eAAe,CAACK,MAAM,CAAC,QAAUV,EAAIpE,WAAWoE,EAAIuG,MAAM,OAAQtG,KAAKmJ,OAAO3Q,MAA6B,wBAAE4H,EAAG,MAAM,CAACK,MAAM,CAAC,GAAK,sBAAsBrB,GAAG,CAAC,MAAQW,EAAIwX,uBAAuB,CAACxX,EAAIoB,GAAG,SAASpB,EAAIqB,GAAGpB,KAAKmJ,OAAO3Q,MAAMkC,yBAAyB,UAAUqF,EAAIuG,KAAKlG,EAAG,YAAY,CAACK,MAAM,CAAC,QAAUV,EAAIpD,QAAQ,QAAUoD,EAAIpE,YAAY,KAC5qB,IDGpB,EACA,KACA,KACA,M,SDDF,UACA,gBACA,2CAEA,OADA,qCAIA,OACA,gBACA,0BAGA,UACA,yBAEA,SACA,mBACA,0DGZe,GAXC,YACd,ICRW,WAAa,IAAiBsE,EAATD,KAAgBE,eAAmBE,EAAnCJ,KAA0CG,MAAMC,IAAIH,EAAG,OAAvDD,KAAgF,cAAEI,EAAG,OAAO,CAACK,MAAM,CAAC,QAApGT,KAAkHvF,cAAckC,QAAQ,QAAxIqD,KAAsJvF,cAAckB,WAApKqE,KAAmLsG,OAC/L,IDUpB,EACA,KACA,KACA,M,QEZF,MAAM6H,GAAY9J,EAAQ,IAK1BjK,IAAIC,IAAImd,KAWR,MAAMC,GAAS,IAAID,IAAU,CAC5BE,OAAQ,CACP,CACCtjB,KAAM,SACNwK,KAAM,WACNkB,UAAW6X,EACXC,YAAYC,EAAInJ,EAAMoJ,GAEjBxhB,KAAMkC,MAAMgC,UACfsd,GAAK,GAINA,MAGF,CACC1jB,KAAM,UACNwK,KAAM,WACNkB,UAAWiY,EACX7P,MAAQ8P,IAAD,CAAaC,YAAaD,EAAME,SAExC,CACC9jB,KAAM,WACNwK,KAAM,YACNkB,UAAWqY,GAEZ,CACC/jB,KAAM,OACNwK,KAAM,QACNkB,UAAWsY,GAEZ,CACChkB,KAAM,YACNwK,KAAM,aACNkB,UAAWuY,GAEZ,CACCjkB,KAAM,cACNwK,KAAM,sBACNkB,UAAWwY,GAEZ,CACClkB,KAAM,aACNwK,KAAM,YACNkB,UAAWyY,OAkFd,SAASC,GAASC,EAAWC,EAAS,IACjCjB,GAAOkB,aAAavkB,KACvBqjB,GAAO5kB,KAAK,CAACuB,KAAMqkB,EAAWC,WAASE,MAAM,QAK7CnB,GAAO9U,QAAQ,CAACvO,KAAMqkB,EAAWC,WAASE,MAAM,QAIlD,SAASC,GAAgBld,GACxB,OAAO6c,GAAS,aAAc,CAACzb,GAAIpB,EAAQoB,KAzF5C0a,GAAOqB,WAAW,CAACjB,EAAInJ,EAAMoJ,KAGvBxhB,KAAMkC,MAAMgC,WAAyB,WAAZqd,EAAGzjB,KASjC0jB,IARCxhB,KAAMyiB,MACJvgB,GAAUA,EAAMgC,UACjB,IAAMsd,OASTL,GAAOqB,WAAW,CAACjB,EAAInJ,EAAMoJ,KAE5B,IAAKD,EAAGmB,QAAQzmB,OAEf,YADAulB,GAAK,GAKN,GAAgB,eAAZD,EAAGzjB,OAA0BkC,KAAMkG,QAAQM,YAAYiG,OAAO8U,EAAGa,OAAO3b,KAE3E,YADA+a,GAAK,GAKN,GAAgB,gBAAZD,EAAGzjB,OAA2BkC,KAAMkG,QAAQQ,YAAY6a,EAAGa,OAAOxc,MAErE,YADA4b,GAAK,GAKN,IAAKL,GAAOwB,IAAI7B,MAAM6B,IAErB,YADAnB,IAID,MAAMoB,EAAczB,GAAOwB,IAAIE,MAAM/B,MAAM6B,IAAI7B,MAAM8B,YAErD,GAAIA,GAAeA,EAAYjT,KAG9B,OAFAiT,EAAYE,mBACZtB,GAAK,GAINA,MAGDL,GAAO4B,UAAWxB,IAOjB,GANIvhB,KAAMkC,MAAMgC,WACX9E,OAAO4jB,YAAcnL,GAAUoL,sBAClCjjB,KAAMS,OAAO,eAAe,GAI1BT,KAAMkC,MAAMiC,cAAe,CAC9B,MAAMkB,EAAUrF,KAAMkC,MAAMiC,cAAckB,QAE1B,eAAZkc,EAAGzjB,MACNkC,KAAMS,OAAO,gBAAiB,MAI3B4E,EAAQiC,SAASrL,OAAS,IAC7BoJ,EAAQ6d,YAAc7d,EAAQiC,SAASjC,EAAQiC,SAASrL,OAAS,GAAGwK,IAGjEpB,EAAQiC,SAASrL,OAAS,MAC7BoJ,EAAQiC,SAASnK,OAAO,EAAGkI,EAAQiC,SAASrL,OAAS,KACrDoJ,EAAQ+B,sBAAuB,MAoB9B,kBAAmB+b,WACtBA,UAAUC,cAAc/N,iBAAiB,UAAYgO,IACpD,GAAIA,EAAM5nB,MAA4B,SAApB4nB,EAAM5nB,KAAK8L,KAAiB,CAC7C,MAAMd,EAAKsX,SAASsF,EAAM5nB,KAAK4J,QAAQmW,OAAO,GAAI,IAE5C8H,EAAgBtjB,KAAMkG,QAAQM,YAAYC,GAE5C6c,GACHf,GAAgBe,EAAcje,a,6BC5JnB,KACdsC,IAAI9I,EAAKN,GACR,IACCa,OAAOmkB,aAAaC,QAAQ3kB,EAAKN,GAChC,MAAO8E,MAIVlF,IAAIU,GACH,IACC,OAAOO,OAAOmkB,aAAaE,QAAQ5kB,GAClC,MAAOwE,GAER,OAAO,OAGTC,OAAOzE,GACN,IACCO,OAAOmkB,aAAaG,WAAW7kB,GAC9B,MAAOwE,MAIVsgB,QACC,IACCvkB,OAAOmkB,aAAaI,QACnB,MAAOtgB,Q,8BCtCX,qBAIgBugB,OAASC,IAAMD,GAAME,OAAO,0B,gCCF5CrmB,EAAOD,QAAU,WAChB,OAAO,e,6BCDR,MAmBMumB,EAAiB,IAAIC,IAAI,CAAC,UAAW,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,SAUnFvmB,EAAOD,QAAU,CAChBkgB,aA9BoB,CACpB,CAAC,KAAM,SACP,CAAC,KAAM,SACP,CAAC,KAAM,QACP,CAAC,KAAM,SACP,CAAC,KAAM,OACP,CAAC,KAAM,SACP,CAAC,KAAM,WACP,CAAC,KAAM,UACP,CAAC,KAAM,UACP,CAAC,KAAM,eACP,CAAC,KAAM,QACP,CAAC,KAAM,cACP,CAAC,KAAM,cACP,CAAC,KAAM,QACP,CAAC,KAAM,QACP,CAAC,KAAM,eAePpJ,SAAU,GACVyP,iBACAE,YAZmB,CACnBC,WAAY,QACZC,eAAgB,WAChBC,OAAQ,UACRC,kBAAmB,cAUnBpB,qBAAsB,M,iCCrCvB,0BAkRA,MAAMqB,EAAW,IA3QjB,MACCC,OACC7a,KAAK8a,IAAM,KACX9a,KAAK+a,UAAY,GACjB/a,KAAKgb,eAAiB,KAEtBjjB,SAAS4T,iBAAiB,YAAchS,GAAMqG,KAAKib,UAAUthB,IAC7D5B,SAAS4T,iBAAiB,WAAahS,GAAMqG,KAAKkb,SAASvhB,IAC3D5B,SAAS4T,iBAAiB,YAAchS,GAAMqG,KAAKmb,UAAUxhB,IAC7D5B,SAAS4T,iBAAiB,OAAShS,GAAMqG,KAAKob,KAAKzhB,IACnD5B,SAAS4T,iBAAiB,QAAUhS,GAAMqG,KAAKqb,MAAM1hB,IAErDnD,IAAO4I,GAAG,cAAgB2N,GAAU/M,KAAKsb,sBAAsBvO,IAGhEwO,UACCvb,KAAKwb,QAAUzjB,SAASC,eAAe,kBACvCgI,KAAKyb,kBAAoB1jB,SAASC,eAAe,sBAGlDkjB,SAASvB,GAGRA,EAAM9Y,iBAGPoa,UAAUtB,GACTA,EAAM9Y,kBAID8Y,EAAM+B,eAAiB/B,EAAMgC,aAAaC,MAAMC,SAAS,UAC7D7b,KAAKwb,QAAQxc,UAAU8c,IAAI,eAI7BX,UAAUxB,GACTA,EAAM9Y,iBAGD8Y,EAAM+B,eACV1b,KAAKwb,QAAQxc,UAAUpF,OAAO,eAIhCwhB,KAAKzB,GAIJ,IAAIoC,EAHJpC,EAAM9Y,iBACNb,KAAKwb,QAAQxc,UAAUpF,OAAO,eAK7BmiB,EADGpC,EAAMgC,aAAa3I,MACdpJ,MAAM8E,KAAKiL,EAAMgC,aAAa3I,OACpCra,OAAQ6G,GAAuB,SAAdA,EAAKwc,MACtBtc,IAAKF,GAASA,EAAKyc,aAEbrS,MAAM8E,KAAKiL,EAAMgC,aAAaI,OAGvC/b,KAAKkc,cAAcH,GAGpBV,MAAM1B,GACL,MAAM3G,EAAQ2G,EAAMwC,cAAcnJ,MAC5B+I,EAAQ,GAEd,IAAK,MAAMvc,KAAQwT,EACA,SAAdxT,EAAKwc,MACRD,EAAMlpB,KAAK2M,EAAKyc,aAIG,IAAjBF,EAAMxpB,SAIVonB,EAAM9Y,iBACNb,KAAKkc,cAAcH,IAGpBG,cAAcH,GACb,IAAKA,EAAMxpB,OACV,OAGD,IAAK+D,IAAMkC,MAAMqC,YAKhB,YAJAmF,KAAKoc,eAAe,CACnBxgB,MAAO,uEAMT,MAAMygB,EAA0C,IAA1Brc,KAAK+a,UAAUxoB,OAC/B+pB,EAAchmB,IAAMkC,MAAMC,oBAAoB8jB,sBAEpD,IAAK,MAAMC,KAAQT,EACdO,EAAc,GAAKE,EAAKxU,KAAOsU,EAClCtc,KAAKoc,eAAe,CACnBxgB,MAAO,QAAF,OAAU4gB,EAAKpoB,KAAf,uCAMP4L,KAAK+a,UAAUloB,KAAK2pB,GAKjBH,GAA8B,OAAbrc,KAAK8a,KAAgB9a,KAAK+a,UAAUxoB,OAAS,GACjEyN,KAAKyc,eAIPA,eACCjmB,IAAOC,KAAK,eAGbimB,YAAY7nB,GACXmL,KAAKyb,kBAAkBzc,UAAU2d,OAAO,6BAA8B9nB,EAAQ,GAC9EmL,KAAKyb,kBAAkBlU,MAAMqV,MAAQ/nB,EAAQ,IAG9CymB,sBAAsBvO,GACrB,MAAMyP,EAAOxc,KAAK+a,UAAU/nB,QAM5BgN,KAAKgb,eAAiB6B,YAAY,IAAMrmB,IAAOC,KAAK,cAAesW,GAAQ,KAG1EzW,IAAMkC,MAAMqT,SAAS9S,cACrByjB,EAAK3e,KAAKif,WAAW,YACpBN,EAAK3e,KAAKge,SAAS,OAEpB7b,KAAK+c,YAAYP,EAAOQ,GAAYhd,KAAKid,cAAclQ,EAAOiQ,IAE9Dhd,KAAKid,cAAclQ,EAAOyP,GAI5BO,YAAYP,EAAMlJ,GACjB,MAAM4J,EAAa,IAAIC,WAEvBD,EAAWE,QAAU,IAAM9J,EAASkJ,GACpCU,EAAWG,QAAU,IAAMH,EAAWI,QAEtCJ,EAAWK,OAAS,KACnB,MAAMC,EAAM,IAAIC,MAEhBD,EAAIH,QAAU,IAAM/J,EAASkJ,GAE7BgB,EAAID,OAAS,KACZ,MAAMG,EAAS3lB,SAAS2O,cAAc,UACtCgX,EAAOd,MAAQY,EAAIZ,MACnBc,EAAOC,OAASH,EAAIG,OACRD,EAAOE,WAAW,MAC1BC,UAAUL,EAAK,EAAG,GAEtBE,EAAOI,OAAQC,IACdzK,EAAS,IAAI0K,KAAK,CAACD,GAAOvB,EAAKpoB,QAC7BooB,EAAK3e,OAGT2f,EAAIS,IAAMf,EAAW9pB,QAGtB8pB,EAAWgB,cAAc1B,GAG1BS,cAAclQ,EAAOyP,GACpBxc,KAAK8a,IAAM,IAAIqD,eAEfne,KAAK8a,IAAIsD,OAAOzS,iBACf,WACChS,IACA,MAAM0kB,EAAUxY,KAAKyY,MAAO3kB,EAAE4kB,OAAS5kB,EAAE6kB,MAAS,KAAQ,GAC1Dxe,KAAK0c,YAAY2B,KAElB,GAGDre,KAAK8a,IAAI2D,mBAAqB,KAC7B,GAAIze,KAAK8a,IAAI4D,aAAeP,eAAeQ,KAAM,CAChD,IAAIC,EAEJ,IACCA,EAAWplB,KAAKC,MAAMuG,KAAK8a,IAAI+D,cAC9B,MAAOC,GAKRF,EAAW,CACVhjB,MAAO,wBAAF,OAA0BoE,KAAK8a,IAAIiE,SAI1C/e,KAAKoc,eAAewC,GAEpB5e,KAAK8a,IAAM,KAGP9a,KAAK+a,UAAUxoB,OAAS,GAC3ByN,KAAKyc,iBAKR,MAAMuC,EAAW,IAAIC,SACrBD,EAASE,OAAO,OAAQ1C,GACxBxc,KAAK8a,IAAIqE,KAAK,OAAd,sBAAqCpS,IACrC/M,KAAK8a,IAAIsE,KAAKJ,GAGf5C,eAAewC,GACd5e,KAAK0c,YAAY,GAEb1c,KAAKgb,iBACRqE,cAAcrf,KAAKgb,gBACnBhb,KAAKgb,eAAiB,MAGnB4D,EAAShjB,MACZtF,IAAMS,OAAO,0BAA2B6nB,EAAShjB,OAI9CgjB,EAASU,KACZtf,KAAKuf,gBAAgBX,EAASU,KAIhCC,gBAAgBD,GACf,MAAME,EAAU,IAAIC,IAAIH,EAAKpmB,UAAUwmB,WACjCC,EAAU5nB,SAASC,eAAe,SAClC4nB,EAAYD,EAAQpO,eAGpBsO,EAAeD,EAAY,EAAID,EAAQ9qB,MAAMid,OAAO,EAAG8N,GAAa,IAAM,GAG1EE,EAAeH,EAAQ9qB,MAAMid,OAAO8N,GAGpCG,EAAiBF,EAAeL,EAAU,IAEhDQ,YAAaL,EAASI,EAAiBD,GAGvCH,EAAQpO,eAAiBoO,EAAQ5N,aAAegO,EAAextB,OAIhE+qB,QACCtd,KAAK+a,UAAY,GAEb/a,KAAK8a,MACR9a,KAAK8a,IAAIwC,QACTtd,KAAK8a,IAAM,QAOC,KACdwC,MAAO,IAAM1C,EAAS0C,QACtB2C,WAAY,IAAMrF,EAASC,OAC3BU,QAAS,IAAMX,EAASW,UACxBW,cAAgBH,GAAUnB,EAASsB,cAAcH,K,8ICtRlD,MAAMmE,EAAQ,CAAC,QAAS,MAAO,MAAO,MAAO,MAAO,OAEpClY,QAEf,MAAM3V,EAAI2V,EAAO,EAAInC,KAAKyY,MAAMzY,KAAKsa,IAAInY,GAAQnC,KAAKsa,IAAI,OAAS,EAC7DC,EAAYC,YAAYrY,EAAOnC,KAAKya,IAAI,KAAMjuB,IAAIkuB,QAAQ,IAChE,gBAAUH,EAAV,YAAuBF,EAAM7tB,M,6BCR9B,qDAKe,MAAMmuB,EACpB,iBACC9mB,IAAQugB,QACR/gB,IAASunB,Y,6BCJI,KACdA,SACC/qB,OAAOwD,SAASunB,Y,6BCNlB,OAQA,MAAM7V,EAAWvG,OAEFuG,YAASqD,OAAO9K,OAAO,CAAC8B,EAAKrG,KAC3C,MAAM6P,EAAU7P,EAAKsP,UAAU,EAAGtP,EAAKrM,OAAS,GAEhD,MAAgB,UAAZkc,IAIJxJ,EAAIwJ,GAAW7D,EAAShM,GAAM9I,SAHtBmP,GAMN,K,qpkCCpBH,kBAKe,KAACyb,uBA6ChB,WACCpqB,IAAMS,OAAO,wBAAyB,WAEtC0iB,UAAUC,cAAciH,MACtBC,KAAMC,GACNA,EAAaC,YAAYC,kBAAkBH,KAAMI,GAC5CA,GACHxqB,IAAOC,KAAK,mBAELuqB,EAAqBC,cAAcL,KAAMM,IAC/C5qB,IAAMS,OACL,wBACAmqB,EAAa,YAAc,kBAKvBL,EAAaC,YAClBK,UAAU,CACVC,qBAAsB9qB,IAAMkC,MAAMC,oBAAoB2oB,qBACtDC,iBAAiB,IAEjBT,KAAMU,IACN9qB,IAAOC,KAAK,gBAAiB6qB,EAAaC,UAC1CjrB,IAAMS,OAAO,wBAAyB,cACtCT,IAAMS,OAAO,uCAIhB6hB,MAAOkG,IACPxoB,IAAMS,OAAO,wBAAyB,eACtCT,IAAMS,OAAO,mCACbyqB,QAAQ5lB,MAAMkjB,OA3EjBtoB,IAAOirB,KAAK,qBAAqB,SAAUC,GAiFnB,WAAtBxoB,SAASyoB,UACa,cAAtBzoB,SAAS0oB,UACa,cAAtB1oB,SAAS0oB,SA7EJ,kBAAmBnI,WAIzBA,UAAUC,cACRjH,SAAS,qBACTmO,KAAMC,IAGN,GAFAvqB,IAAMS,OAAO,oBAER8pB,EAAaC,YAIlB,OAAOD,EAAaC,YAAYC,kBAAkBH,KAAMU,IAGnDA,IAA4C,IAA5BI,EACnBJ,EAAaL,cAAcL,KAAMM,IAChC5qB,IAAMS,OACL,wBACAmqB,EAAa,YAAc,iBAI7B5qB,IAAMS,OACL,wBACAuqB,EAAe,aAAe,iBAKjC1I,MAAOkG,IACPxoB,IAAMS,OAAO,wBAAyB,eACtCyqB,QAAQ5lB,MAAMkjB,KArCfxoB,IAAMS,OAAO,wBAAyB,e,m4rCCPxC,MAAM8qB,EAAYxd,EAAQ,KAE1Bwd,EAAUpvB,UAAUqvB,UAAY,SAAmBhf,GAC7CA,EAAMif,SACVjf,EAAMif,OAAS,QACfjf,EAAMwc,IAAM,UAAYxc,EAAMwc,IAC9Bxc,EAAMkf,UAAW,GAGG,OAAjBlf,EAAMif,SACTjf,EAAMif,OAAS,QACfjf,EAAMwc,IAAM,QAAUxc,EAAMwc,IAC5Bxc,EAAMkf,UAAW,GAGG,YAAjBlf,EAAMif,QAAyB,YAAY9oB,KAAK6J,EAAMwc,OACzDxc,EAAMwc,IAAM,UAAYxc,EAAMwc,MAIhC,MAAM2C,EAAUJ,IAAYK,KAAK7d,EAAQ,MAAS6d,KAAK,SAAS,GAG1DC,EAAgB,CACrB,OACA,MACA,OACA,MACA,OACA,MACA,MACA,QACA,SACA,YACA,UACA,OAGD,IAAK,MAAMJ,KAAUI,EACpBF,EAAQnG,IAAIiG,EAAS,IAAK,SAuB3B,SAASK,EAAU9C,GAClB,MAAO,CACNjd,MAAOid,EAAInb,MACXtB,IAAKyc,EAAI+C,UACTpc,KAAMqZ,EAAIA,KAIZvrB,EAAOD,QAAU,CAChBmT,UA7BD,SAAmBvF,GAClB,MAAM4gB,EAAUL,EAAQnf,MAAMpB,GAE9B,OAAK4gB,EAIEA,EAAQ5iB,IAAI0iB,GAHX,IA0BRG,oBApBD,SAA6B7gB,GAC5B,MAAM4gB,EAAUL,EAAQnf,MAAMpB,GAE9B,OAAK4gB,EAIEA,EAAQ3pB,OAAQ2mB,IAASA,EAAI0C,UAAUtiB,IAAI0iB,GAH1C,M,+BCxDT,MAAMI,EAAkB,iHAExBzuB,EAAOD,QAAW6S,GAAYA,EAAQhE,QAAQ6f,EAAiB,IAAIC,Q,iICJnE,mBAAsY,G,6BCAtY,mBAAwY,G,yCCAxY,mBAAmY,G,6BCAnY,mBAAsY,G,6BCAtY,mBAAkY,G,6BCAlY,mBAAkZ,G,gBCAlZ,IAAI/iB,EAAM,CACT,aAAc,IACd,aAAc,IACd,gBAAiB,IACjB,aAAc,IACd,qBAAsB,IACtB,cAAe,IACf,eAAgB,IAChB,aAAc,IACd,aAAc,IACd,aAAc,IACd,qBAAsB,IACtB,wBAAyB,IACzB,aAAc,IACd,aAAc,IACd,aAAc,IACd,YAAa,IACb,cAAe,IACf,qBAAsB,IACtB,cAAe,KAIhB,SAASgjB,EAAeC,GACvB,IAAI5lB,EAAK6lB,EAAsBD,GAC/B,OAAOjvB,EAAoBqJ,GAE5B,SAAS6lB,EAAsBD,GAC9B,IAAIjvB,EAAoBY,EAAEoL,EAAKijB,GAAM,CACpC,IAAIhpB,EAAI,IAAIkpB,MAAM,uBAAyBF,EAAM,KAEjD,MADAhpB,EAAEmpB,KAAO,mBACHnpB,EAEP,OAAO+F,EAAIijB,GAEZD,EAAezU,KAAO,WACrB,OAAOzb,OAAOyb,KAAKvO,IAEpBgjB,EAAeK,QAAUH,EACzB7uB,EAAOD,QAAU4uB,EACjBA,EAAe3lB,GAAK,K,wBCxCpB,IAAI2C,EAAM,CACT,gBAAiB,IACjB,cAAe,IACf,aAAc,GACd,YAAa,KAId,SAASgjB,EAAeC,GACvB,IAAI5lB,EAAK6lB,EAAsBD,GAC/B,OAAOjvB,EAAoBqJ,GAE5B,SAAS6lB,EAAsBD,GAC9B,IAAIjvB,EAAoBY,EAAEoL,EAAKijB,GAAM,CACpC,IAAIhpB,EAAI,IAAIkpB,MAAM,uBAAyBF,EAAM,KAEjD,MADAhpB,EAAEmpB,KAAO,mBACHnpB,EAEP,OAAO+F,EAAIijB,GAEZD,EAAezU,KAAO,WACrB,OAAOzb,OAAOyb,KAAKvO,IAEpBgjB,EAAeK,QAAUH,EACzB7uB,EAAOD,QAAU4uB,EACjBA,EAAe3lB,GAAK,K,6BCzBpB,yBAmCe,WAACkU,MA9BhB,WACC,MAAM+R,EAAa,GAEnB,IAAK,MAAMrc,KAAWrQ,IAAMkC,MAAMiC,cAAckB,QAAQiC,SAAU,CACjE,IAAIqlB,GAAU,EAEd,IAAK,MAAMvb,KAAWf,EAAQgB,SACzBD,EAAQvB,QACXuB,EAAQvB,OAAQ,EAChB8c,GAAU,GAIRA,GACHD,EAAWnwB,KAAK8T,EAAQ5J,IAa1B,OARIimB,EAAWzwB,OAAS,GACvBiE,IAAOC,KAAK,qBAAsB,CACjCoR,OAAQvR,IAAMkC,MAAMiC,cAAckB,QAAQoB,GAC1CimB,WAAYA,EACZ7c,OAAO,KAIF,K,6BChCR,yBAmCe,WAAC8K,MA9BhB,WACC,MAAM+R,EAAa,GAEnB,IAAK,MAAMrc,KAAWrQ,IAAMkC,MAAMiC,cAAckB,QAAQiC,SAAU,CACjE,IAAIqlB,GAAU,EAEd,IAAK,MAAMvb,KAAWf,EAAQgB,SACxBD,EAAQvB,QACZuB,EAAQvB,OAAQ,EAChB8c,GAAU,GAIRA,GACHD,EAAWnwB,KAAK8T,EAAQ5J,IAa1B,OARIimB,EAAWzwB,OAAS,GACvBiE,IAAOC,KAAK,qBAAsB,CACjCoR,OAAQvR,IAAMkC,MAAMiC,cAAckB,QAAQoB,GAC1CimB,WAAYA,EACZ7c,OAAO,KAIF,K,6BChCR,gCAgDe,WAAC8K,MA1ChB,SAAeiS,GACd,GAAIA,EAAK3wB,OAAS,EAAG,CACpB,IAAIqK,EAAWsmB,EAAK,GAEpB,GAAItmB,EAASrK,OAAS,EAAG,CACxB,MAAM4wB,EAAY7sB,IAAMkC,MAAMiC,cAAckC,QAAQiK,cAAcC,UAC5Duc,EAAcF,EAAK,GAAG1R,MAAM,KAElC,GAAI2R,GAAaA,EAAU5wB,OAAS,EACnC,IAAK,IAAI2B,EAAI,EAAGA,EAAIkvB,EAAY7wB,OAAQ2B,IAClCivB,EAAUtH,SAASuH,EAAYlvB,GAAG,MACtCkvB,EAAYlvB,GAAKivB,EAAU,GAAKC,EAAYlvB,IAK/C0I,EAAWwmB,EAAYvpB,KAAK,KAE5B,MAAMid,EAAOxgB,IAAMkG,QAAQC,4BAA4BG,GAEvD,IAAIka,EAQH,OALAtgB,IAAOC,KAAK,QAAS,CACpBiL,KAAM,SAAF,OAAW9E,EAAX,YAAuBsmB,EAAK3wB,OAAS,EAAI2wB,EAAK,GAAK,IACvDrb,OAAQvR,IAAMkC,MAAMiC,cAAckB,QAAQoB,MAGpC,EAPP8b,YAAgB/B,SAUZ,GAA+C,YAA3CxgB,IAAMkC,MAAMiC,cAAckB,QAAQkC,KAO5C,OALArH,IAAOC,KAAK,QAAS,CACpBoR,OAAQvR,IAAMkC,MAAMiC,cAAckB,QAAQoB,GAC1C2E,KAAM,SAAF,OAAWpL,IAAMkC,MAAMiC,cAAckB,QAAQvH,SAG3C,K,4GC1COulB,MACc,aAAzBA,EAAM9R,OAAOwb,SAAmD,UAAzB1J,EAAM9R,OAAOwb,YAO/C1J,EAAM9R,OAAOhT,M,yBCNR,GAAC8H,EAASyS,KACxB,MAAMtU,EAAW,IAAIwf,IAAI9gB,KAAKC,MAAMC,IAAQjF,IAAI,kCAChDkI,EAAQyS,YAAcA,EAElBA,EACHtU,EAASghB,IAAInf,EAAQT,MAErBpB,EAASwoB,OAAO3mB,EAAQT,MAGzBxC,IAAQuE,IAAI,+BAAgCzE,KAAKgF,UAAU,IAAI1D,MCZhDyoB,KACXA,EAAQ,IACJA,EAAM7D,YAGN6D,EAAQ,KAAMhD,QAAQ,GAAG3qB,MAAM,GAAI,GAAK,ICHlC,GAAC+G,EAAShB,OACnBgB,EAAQyS,aAAezT,EAAQuB,WAA8B,UAAjBvB,EAAQkC,SAIrDvH,IAAMkC,MAAMiC,eAAiBkB,IAAYrF,IAAMkC,MAAMiC,cAAckB,SCT8H,ECmCtM,CACA,sBACA,OACA,eACA,eACA,eACA,qBAEA,UACA,gBACA,wCAEA,mBACA,yDAGA,SACA,eACA,WAUA,OARA,uBACA,iDAGA,0BACA,qDAGA,WACA,2DAGA,mBAEA,QACA,kBAIA,0CAEA,mBACA,gCACA,QACA,qBACA,0B,OC9De,EAXC,YACd,GCRW,WAAa,IAAIoE,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAQF,EAAoB,iBAAEK,EAAG,MAAM,CAACsI,IAAI,UAAUpI,MAAM,CACnJ,oBACA,CAACE,OAAQT,EAAIS,QACb,CAAC,iBAAuC,YAArBT,EAAIpE,QAAQkC,MAA4C,IAAtBkC,EAAIpE,QAAQnD,OACjE,CAAC,YAAauH,EAAIpE,QAAQyB,gBAC1B,CACC,aACsB,UAArB2C,EAAIpE,QAAQkC,MAAoBkC,EAAIpD,QAAQoiB,OAAOyE,YAAczjB,EAAIpD,QAAQoiB,OAAO0E,QAEtF,CAAC,gBAAsC,UAArB1jB,EAAIpE,QAAQkC,OAAqBkC,EAAIpD,QAAQoiB,OAAOyE,YAAajc,MAAOxH,EAAIpE,QAAQwT,OAAS,CAACuU,WAAY,OAAQC,QAAS,IAAO,KAAMljB,MAAM,CAAC,aAAaV,EAAI6jB,eAAe,MAAQ7jB,EAAI6jB,eAAe,YAAY7jB,EAAIpE,QAAQvH,KAAK,YAAY2L,EAAIpE,QAAQkC,KAAK,gBAAgB,SAAWkC,EAAIpE,QAAQoB,GAAG,gBAAgBgD,EAAIS,OAAO,KAAO,OAAOpB,GAAG,CAAC,MAAQW,EAAI8jB,MAAM,YAAc,SAASjjB,GAAgC,OAAxBA,EAAOC,iBAAwBd,EAAIe,gBAAgBF,MAAW,CAACb,EAAImB,GAAG,UAAU,KAAK,CAAC,QAAUnB,EAAIpD,QAAQ,QAAUoD,EAAIpE,QAAQ,cAAgBoE,EAAItF,iBAAiB,GAAGsF,EAAIuG,OACxjB,IDCpB,EACA,KACA,KACA,M,QEdkM,ECoDpM,CACA,eACA,YACA,kBAEA,OACA,eACA,2BACA,eACA,qBAEA,UACA,UACA,iCAEA,mBACA,2DAEA,cACA,gCAGA,SACA,kBACA,2CAEA,kBACA,oCC7De,EAXC,YACd,GCRW,WAAa,IAAIvG,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,iBAAiBL,EAAI+jB,GAAG,CAACrjB,MAAM,CAAC,QAAUV,EAAIpE,UAAU,iBAAiBoE,EAAIgkB,QAAO,GAAO,CAAEhkB,EAAIpD,QAAQC,SAASrK,OAAS,EAAG6N,EAAG,SAAS,CAACmG,YAAY,mBAAmB9F,MAAM,CAAC,gBAAgB,WAAaV,EAAIpD,QAAQT,KAAK,aAAa6D,EAAIikB,eAAejkB,EAAIpD,SAAS,iBAAiBoD,EAAIpD,QAAQyS,aAAahQ,GAAG,CAAC,MAAQ,SAASwB,GAAiC,OAAzBA,EAAOqjB,kBAAyBlkB,EAAIsP,gBAAgBzO,MAAW,CAACR,EAAG,OAAO,CAACmG,YAAY,4BAA4BnG,EAAG,OAAO,CAACmG,YAAY,qBAAqBnG,EAAG,MAAM,CAACmG,YAAY,cAAc,CAACnG,EAAG,OAAO,CAACmG,YAAY,OAAO9F,MAAM,CAAC,MAAQV,EAAIpE,QAAQvH,OAAO,CAAC2L,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAIpE,QAAQvH,SAAU2L,EAAIpD,QAAQoiB,OAAOyE,YAAczjB,EAAIpD,QAAQoiB,OAAO0E,OAAQrjB,EAAG,OAAO,CAACmG,YAAY,6CAA6C9F,MAAM,CAAC,aAAa,wBAAwB,CAACL,EAAG,OAAO,CAACmG,YAAY,sBAAsBxG,EAAIuG,KAAOvG,EAAIpD,QAAQoiB,OAAOyE,UAAwKzjB,EAAIuG,KAAjKlG,EAAG,OAAO,CAACmG,YAAY,gDAAgD9F,MAAM,CAAC,aAAa,iBAAiB,CAACL,EAAG,OAAO,CAACmG,YAAY,yBAAmCxG,EAAIpE,QAAc,OAAEyE,EAAG,OAAO,CAACmG,YAAY,QAAQjG,MAAM,CAACpD,UAAW6C,EAAIpE,QAAQuB,YAAY,CAAC6C,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAImkB,gBAAgBnkB,EAAIuG,OAAOlG,EAAG,OAAO,CAACmG,YAAY,kEAAkE9F,MAAM,CAAC,aAAaV,EAAIokB,mBAAmB,CAAC/jB,EAAG,SAAS,CAACE,MAAM,CAAC,cAAe,CAAC4F,OAAQnG,EAAIqkB,qBAAqB3jB,MAAM,CAAC,gBAAgB,gBAAkBV,EAAIpE,QAAQoB,GAAG,aAAagD,EAAIokB,kBAAkB/kB,GAAG,CAAC,MAAQ,SAASwB,GAAiC,OAAzBA,EAAOqjB,kBAAyBlkB,EAAIskB,MAAM,iCAC1mD,IDUpB,EACA,KACA,KACA,M,QEd6L,EC8B/L,CACA,eACA,YACA,kBAEA,OACA,eACA,eACA,eACA,qBAEA,UACA,cACA,gCAGA,SACA,QACA,yCC9Be,EAXC,YACd,GCRW,WAAa,IAAItkB,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,iBAAiBL,EAAI+jB,GAAG,CAACpb,IAAI,WAAW,iBAAiB3I,EAAIgkB,QAAO,GAAO,CAAC3jB,EAAG,OAAO,CAACmG,YAAY,QAAQ,CAACxG,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAIpE,QAAQvH,SAAU2L,EAAIpE,QAAc,OAAEyE,EAAG,OAAO,CAACmG,YAAY,QAAQjG,MAAM,CAACpD,UAAW6C,EAAIpE,QAAQuB,YAAY,CAAC6C,EAAIoB,GAAGpB,EAAIqB,GAAGrB,EAAImkB,gBAAgBnkB,EAAIuG,KAA2B,YAArBvG,EAAIpE,QAAQkC,KAAoB,CAAwB,IAAtBkC,EAAIpE,QAAQnD,MAAa4H,EAAG,OAAO,CAACmG,YAAY,iDAAiD9F,MAAM,CAAC,aAAa,yBAAyB,CAACL,EAAG,OAAO,CAACmG,YAAY,0BAA0BxG,EAAIuG,KAAKlG,EAAG,OAAO,CAACmG,YAAY,wCAAwC9F,MAAM,CAAC,aAAa,UAAU,CAACL,EAAG,SAAS,CAACmG,YAAY,QAAQ9F,MAAM,CAAC,aAAa,SAASrB,GAAG,CAAC,MAAQ,SAASwB,GAAiC,OAAzBA,EAAOqjB,kBAAyBlkB,EAAIukB,MAAM1jB,UAAe,CAACR,EAAG,OAAO,CAACmG,YAAY,wCAAwC9F,MAAM,CAAC,aAAa,UAAU,CAACL,EAAG,SAAS,CAACmG,YAAY,QAAQ9F,MAAM,CAAC,aAAa,SAASrB,GAAG,CAAC,MAAQ,SAASwB,GAAiC,OAAzBA,EAAOqjB,kBAAyBlkB,EAAIukB,MAAM1jB,WAAgB,KACxjC,IDUpB,EACA,KACA,KACA,M,eEdiM,ECwCnM,CACA,mBACA,YACA,OACA,YACA,aAIA,OACA,eACA,gBAEA,UACA,CACA,gBACA,mBAGA,SACA,WACA,wDACA,mBAGA,KACA,kCACA,CACA,6CACA,wBAEA,mCACA,UAGA,kBACA,uDACA,yBAIA,qBACA,sBACA,qCCnFmM,ECoMnM,CACA,mBACA,YACA,YChMgB,YACd,GCRW,WAAa,IAAIb,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,OAAO,CAACmG,YAAY,YAAY9F,MAAM,CAAC,GAAK,gBAAkBV,EAAIpE,QAAQoB,GAAG,OAAS,OAAO,OAAS,GAAG,aAAe,OAAOqC,GAAG,CAAC,QAAU,SAASwB,GAAQ,OAAIA,EAAO/C,KAAK8G,QAAQ,QAAQ5E,EAAIsV,GAAGzU,EAAO0U,QAAQ,MAAM,GAAG1U,EAAOzL,IAAI,CAAC,MAAM,WAAoB,MAAOyL,EAAOC,iBAAwBd,EAAIskB,MAAM,yBAAwB,OAAS,SAASzjB,GAAgC,OAAxBA,EAAOC,iBAAwBd,EAAI4I,SAAS/H,MAAW,CAACR,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAgB,aAAEwJ,WAAW,gBAAgB,CAACnV,KAAK,QAAQkV,QAAQ,YAAY/C,YAAY,QAAQ9F,MAAM,CAAC,KAAO,OAAO,KAAO,UAAU,YAAc,UAAU,QAAU,UAAU,UAAY,MAAM,MAAQ,0CAA0C,SAAW,IAAImI,SAAS,CAAC,MAAS7I,EAAgB,cAAGX,GAAG,CAAC,MAAQ,SAASwB,GAAWA,EAAOiH,OAAO2B,YAAqBzJ,EAAIwkB,aAAa3jB,EAAOiH,OAAOhT,WAAUuL,EAAG,QAAQ,CAACiJ,WAAW,CAAC,CAACjV,KAAK,QAAQkV,QAAQ,UAAUzU,MAAOkL,EAAiB,cAAEwJ,WAAW,kBAAkBhD,YAAY,QAAQ9F,MAAM,CAAC,KAAO,WAAW,KAAO,MAAM,YAAc,sBAAsB,QAAU,UAAU,UAAY,MAAM,MAAQ,8CAA8C,aAAe,gBAAgBmI,SAAS,CAAC,MAAS7I,EAAiB,eAAGX,GAAG,CAAC,MAAQ,SAASwB,GAAWA,EAAOiH,OAAO2B,YAAqBzJ,EAAIykB,cAAc5jB,EAAOiH,OAAOhT,WAAUuL,EAAG,SAAS,CAACmG,YAAY,gBAAgB9F,MAAM,CAAC,KAAO,WAAW,CAACV,EAAIoB,GAAG,cACz+C,IDUpB,EACA,KACA,KACA,M,QD0LF,eACA,UACA,eAEA,UACA,CACA,cACA,wBAGA,UACA,QACA,WAEA,0CACA,0BAEA,iCACA,6CAKA,8BAIA,UAEA,UAKA,OAJA,6CACA,4BACA,qBAKA,OACA,aACA,6BAGA,UACA,+CACA,gDACA,qCAEA,gBACA,iDACA,kDACA,uCAEA,SACA,iBACA,eAIA,iCACA,+CAGA,IAEA,mBACA,eAIA,iCACA,+CAGA,IAEA,sBAEA,wBAEA,eACA,8CAEA,aACA,iDAEA,iBACA,SAIA,iBACA,gBACA,mDAGA,iBACA,YACA,OAGA,4DAEA,GAIA,iBACA,gBACA,sBACA,yCAGA,gBACA,eAIA,iDACA,yBACA,IAGA,uBACA,KAEA,iBACA,kDAIA,qDACA,qCACA,oBACA,mCAGA,mBACA,2BACA,mBACA,8BAEA,uBACA,sCAGA,iBACA,gCAEA,uBACA,sBAIA,IACA,2BAGA,0BAEA,eACA,uCAIA,kDACA,wBACA,wBAEA,qBAMA,GAHA,6BACA,oBAEA,gBACA,OAGA,uCAGA,aAEA,YADA,4BAIA,uCAGA,kCAGA,OAFA,gDACA,sBAQA,IAJA,KAIA,KACA,YAGA,mBACA,YAGA,2BACA,uBAEA,iBAEA,oBACA,0EAEA,GACA,0DGha+L,G,OCkF/L,CACA,eACA,YACA,YC7EgB,YACd,GCTW,WAAa,IAAIpB,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAA6C,IAArCF,EAAIoJ,OAAO3Q,MAAMsC,SAASvI,OAAc6N,EAAG,MAAM,CAACmG,YAAY,SAAS,CAACxG,EAAIoB,GAAG,sDAAsDf,EAAG,MAAM,CAACsI,IAAI,eAAe,CAACtI,EAAG,MAAM,CAACmG,YAAY,iBAAiB,CAACnG,EAAG,QAAQ,CAACsI,IAAI,cAAcnC,YAAY,yBAAyB9F,MAAM,CAAC,YAAc,aAAa,KAAO,SAAS,aAAa,gCAAgC,SAAW,MAAMmI,SAAS,CAAC,MAAQ7I,EAAI0kB,YAAYrlB,GAAG,CAAC,MAAQW,EAAI2kB,cAAc,QAAU,CAAC,SAAS9jB,GAAQ,OAAIA,EAAO/C,KAAK8G,QAAQ,QAAQ5E,EAAIsV,GAAGzU,EAAO0U,QAAQ,KAAK,GAAG1U,EAAOzL,IAAI,CAAC,KAAK,YAAqB,KAAc4K,EAAI4kB,gBAAgB/jB,GAAS,IAAI,SAASA,GAAQ,OAAIA,EAAO/C,KAAK8G,QAAQ,QAAQ5E,EAAIsV,GAAGzU,EAAO0U,QAAQ,OAAO,GAAG1U,EAAOzL,IAAI,CAAC,OAAO,cAAuB,KAAc4K,EAAI4kB,gBAAgB/jB,EAAQ,IAAI,SAASA,GAAQ,OAAIA,EAAO/C,KAAK8G,QAAQ,QAAQ5E,EAAIsV,GAAGzU,EAAO0U,QAAQ,eAAU9S,EAAU5B,EAAOzL,SAAIqN,GAAoB,KAAczC,EAAI4kB,gBAAgB/jB,GAAS,KAAK,SAASA,GAAQ,OAAIA,EAAO/C,KAAK8G,QAAQ,QAAQ5E,EAAIsV,GAAGzU,EAAO0U,QAAQ,iBAAY9S,EAAU5B,EAAOzL,SAAIqN,GAAoB,KAAczC,EAAI4kB,gBAAgB/jB,EAAQ,KAAK,SAASA,GAAQ,OAAIA,EAAO/C,KAAK8G,QAAQ,QAAQ5E,EAAIsV,GAAGzU,EAAO0U,QAAQ,QAAQ,GAAG1U,EAAOzL,IAAI,SAAkB,KAAc4K,EAAI6kB,aAAahkB,IAAS,SAASA,GAAQ,OAAIA,EAAO/C,KAAK8G,QAAQ,QAAQ5E,EAAIsV,GAAGzU,EAAO0U,QAAQ,cAAS9S,EAAU5B,EAAOzL,SAAIqN,GAAoB,KAAczC,EAAI8kB,iBAAiBjkB,KAAU,MAAQb,EAAI+kB,oBAAqB/kB,EAAc,WAAEK,EAAG,MAAM,CAACmG,YAAY,mBAAmB,CAAExG,EAAIglB,QAAc,OAAE3kB,EAAG,MAAML,EAAIoM,GAAIpM,EAAW,SAAE,SAASP,GAAM,OAAOY,EAAG,MAAM,CAACjL,IAAIqK,EAAK7D,QAAQoB,GAAGqC,GAAG,CAAC,WAAa,SAASwB,GAAQ,OAAOb,EAAIilB,oBAAoBxlB,EAAK7D,UAAU,MAAQ,SAASiF,GAAgC,OAAxBA,EAAOC,iBAAwBd,EAAI6kB,aAAahkB,MAAW,CAAwB,UAAtBpB,EAAK7D,QAAQkC,KAAkBuC,EAAG,UAAU,CAACK,MAAM,CAAC,QAAUjB,EAAK7D,QAAQ,QAAU6D,EAAK7C,QAAQ,OAAS6C,EAAK7D,UAAYoE,EAAIklB,iBAAiB,gBAAe,KAAQ7kB,EAAG,eAAe,CAACK,MAAM,CAAC,QAAUjB,EAAK7D,QAAQ,QAAU6D,EAAK7C,QAAQ,OAAS6C,EAAK7D,UAAYoE,EAAIklB,iBAAiB,gBAAe,MAAS,MAAK,GAAG7kB,EAAG,MAAM,CAACmG,YAAY,cAAc,CAACxG,EAAIoB,GAAG,yBAAyBf,EAAG,YAAY,CAACmG,YAAY,WAAW9F,MAAM,CAAC,KAAOV,EAAIoJ,OAAO3Q,MAAMsC,SAAS,OAASiF,EAAImlB,mBAAmB,qBAAoB,EAAM,OAAS,wCAAwC,UAAY,WAAW,cAAc,oBAAoB,aAAa,sBAAsB,MAAQ,YAAY9lB,GAAG,CAAC,OAASW,EAAIolB,cAAc,MAAQplB,EAAIqlB,YAAY,IAAMrlB,EAAIslB,YAAYtlB,EAAIoM,GAAIpM,EAAIoJ,OAAO3Q,MAAc,UAAE,SAASmE,GAAS,OAAOyD,EAAG,MAAM,CAACjL,IAAIwH,EAAQT,KAAKqK,YAAY,UAAUjG,MAAM,CAC3tFglB,UAAW3oB,EAAQyS,YACnB,iBAAkBzS,EAAQoiB,OAAOyE,UACjC,cAAe7mB,EAAQoiB,OAAO0E,QAC7BhjB,MAAM,CAAC,GAAK,WAAa9D,EAAQT,KAAK,KAAO,WAAW,CAACkE,EAAG,eAAe,CAACK,MAAM,CAAC,QAAU9D,EAAQ,wBAAwBA,EAAQynB,mBAAmB,OAASrkB,EAAIoJ,OAAO3Q,MAAMiC,eAClLkC,EAAQC,SAAS,KAAOmD,EAAIoJ,OAAO3Q,MAAMiC,cAAckB,SAASyD,GAAG,CAAC,sBAAsB,SAASwB,GAAQjE,EAAQynB,oBAAsBznB,EAAQynB,uBAAwBznB,EAA0B,mBAAEyD,EAAG,cAAc,CAACK,MAAM,CAAC,QAAU9D,EAAQ,QAAUA,EAAQC,SAAS,IAAIwC,GAAG,CAAC,sBAAsB,SAASwB,GAAQjE,EAAQynB,oBAAsBznB,EAAQynB,uBAAuBrkB,EAAIuG,KAAKlG,EAAG,YAAY,CAACmG,YAAY,WAAW9F,MAAM,CAAC,UAAY,qBAAqB,cAAc,oBAAoB,aAAa,sBAAsB,MAAQ9D,EAAQT,KAAK,OAAS6D,EAAImlB,mBAAmB,qBAAoB,EAAM,KAAOvoB,EAAQC,UAAUwC,GAAG,CAAC,OAASW,EAAIwlB,cAAc,MAAQxlB,EAAIqlB,YAAY,IAAMrlB,EAAIslB,YAAY,CAACtlB,EAAIoM,GAAIxP,EAAgB,UAAE,SAAShB,EAAQwI,GAAO,MAAO,CAAEA,EAAQ,EAAG/D,EAAG,UAAU,CAACjL,IAAIwG,EAAQoB,GAAG0D,MAAM,CAAC,QAAU9E,EAAQ,QAAUgB,EAAQ,OAASoD,EAAIoJ,OAAO3Q,MAAMiC,eACh3BkB,IAAYoE,EAAIoJ,OAAO3Q,MAAMiC,cAAckB,WAAWoE,EAAIuG,UAAS,IAAI,MAAK,IAAI,KACjE,IDKpB,EACA,KACA,KACA,M,SDwEF,OACA,qBAEA,UACA,CACA,mBAGA,UACA,wBACA,sBACA,sBACA,iBACA,qBACA,uBAEA,sBAGA,GAFA,sDAEA,qBAEA,YADA,kBAIA,oDAEA,mCACA,8CAEA,4EACA,+BAEA,0EACA,0EAIA,qBACA,2CACA,2CACA,6CAEA,uBAIA,oBAEA,YADA,kBAIA,mCAEA,gBACA,yCACA,sBAKA,sBAIA,gCACA,mBAGA,iBACA,iBACA,MACA,KAGA,gEACA,8CAGA,qBACA,4DACA,eAGA,oBACA,2CAEA,iBAGA,gEACA,8DACA,yCAEA,wCACA,gCAEA,wBACA,sBACA,sBACA,sBAGA,gBACA,qCAGA,6EAEA,SACA,2DGlLe,EAXC,YACd,GCRW,WAAa,IAAIvG,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,QAAQ,CAACsI,IAAI,UAAUjI,MAAM,CAAC,GAAK,YAAY,CAACL,EAAG,MAAM,CAACmG,YAAY,mBAAmB,CAACnG,EAAG,MAAM,CAACmG,YAAY,kBAAkB,CAACnG,EAAG,MAAM,CAACmG,YAAY,OAAO9F,MAAM,CAAC,IAAO,aAAeV,EAAIylB,WAAa,cAAgB,IAAM,qBAAsB,IAAM,iBAAiBplB,EAAG,MAAM,CAACmG,YAAY,gBAAgB9F,MAAM,CAAC,IAAO,aAAeV,EAAIylB,WAAa,cAAgB,IAAM,8BAA+B,IAAM,iBAAkBzlB,EAAiB,cAAEK,EAAG,OAAO,CAACmH,MAAM,CACpjBke,gBAAiB,UACjBje,MAAO,OACPke,QAAS,MACTC,aAAc,MACdC,SAAU,QACRnlB,MAAM,CAAC,MAAQ,kDAAkD,CAACV,EAAIoB,GAAG,eAAepB,EAAIuG,OAAOlG,EAAG,gBAAgB,GAAGA,EAAG,SAAS,CAACK,MAAM,CAAC,GAAK,WAAW,CAACL,EAAG,OAAO,CAACmG,YAAY,8CAA8C9F,MAAM,CAAC,aAAa,aAAa,CAACL,EAAG,cAAc,CAACE,MAAM,CAAC,OAAQ,YAAYG,MAAM,CAAC,GAAK,YAAY,IAAM,SAAS,eAAe,SAAS,aAAa,WAAW,KAAO,MAAM,gBAAgB,WAAW,gBAAoC,aAApBV,EAAI8lB,OAAOzxB,SAAwB,GAAGgM,EAAG,OAAO,CAACmG,YAAY,8CAA8C9F,MAAM,CAAC,aAAaV,EAAIoJ,OAAO3Q,MAAMC,oBAAoBqtB,kBACrmB,2BACA,SAAS,CAAC1lB,EAAG,cAAc,CAACE,MAAM,CACpC,OACA,OACA,CAACylB,SAAUhmB,EAAIoJ,OAAO3Q,MAAMC,oBAAoBqtB,oBAAqBrlB,MAAM,CAAC,GAAK,QAAQ,IAAM,SAAS,eAAe,SAAS,aAAa,OAAO,KAAO,MAAM,gBAAgB,OAAO,gBAAoC,SAApBV,EAAI8lB,OAAOzxB,SAAoB,SACtN,IDDpB,EACA,KACA,KACA,M,QEdiM,EC4CnM,CACA,mBACA,UACA,CACA,UACA,mBACA,eACA,aAEA,UACA,IACA,KAEA,WACA,IACA,IACA,WAIA,UACA,qBAGA,qCACA,+BAEA,OACA,qCACA,oCACA,+IAIA,OACA,UAEA,YAKA,OAJA,sCACA,uCACA,sCACA,8BAIA,yBAEA,IACA,qCACA,sCACA,+BACA,+BAIA,SACA,cACA,mBAIA,kBACA,wBACA,oBACA,iBAEA,oBACA,iBACA,YAGA,8BACA,mBACA,OACA,mBAEA,uBAEA,gCACA,6BAEA,WACA,qBACA,+BAGA,OACA,iBACA,2BAGA,cACA,qBAEA,eACA,0BACA,mBACA,gBACA,iBACA,mCAEA,8CACA,+CACA,oCACA,qBACA,sBAEA,4BACA,+BACA,kCACA,mCAEA,OACA,EACA,GACA,iBACA,MACA,EACA,GACA,iBACA,QAGA,kBACA,yBACA,+BACA,gCACA,gCACA,iCAEA,IACA,qBACA,uBACA,qBACA,yBACA,wBAGA,IACA,qBACA,uBACA,qBACA,yBACA,yBAIA,iBACA,QACA,IACA,IAEA,4BACA,qBACA,eAEA,KACA,KAEA,2BACA,UACA,qBACA,eACA,uCASA,OAJA,QACA,KAGA,CACA,aACA,aACA,mBAGA,gBAEA,8BAKA,qBACA,yBACA,oCACA,YACA,IAEA,SACA,MACA,MACA,eAGA,GACA,mBACA,mBACA,4BAGA,MACA,gCAEA,8BACA,QACA,QACA,gBACA,qBACA,qBACA,8BAGA,gBACA,UACA,kBACA,YACA,IAEA,2CACA,0BACA,EACA,QACA,IACA,KAGA,uBACA,uBACA,uBACA,wBAGA,MACA,gCAEA,aACA,MAYA,uBAEA,kDACA,mDAGA,+CACA,+CAKA,oBAGA,eACA,OAGA,oBACA,mBAEA,0BACA,mBAEA,YACA,YACA,mBACA,mBACA,+BACA,gCACA,gBACA,iBACA,uBACA,uBACA,QAEA,YACA,oBACA,mBAEA,oBACA,cAEA,uCAEA,cACA,uBAGA,cACA,sBAGA,wBAGA,MACA,uBAEA,mBACA,mBAGA,qCACA,oCAGA,kCACA,iCAGA,gBAGA,qBAMA,GAFA,mBAEA,UACA,+BACA,CACA,0BACA,kDACA,0BACA,EACA,qBACA,iBACA,kBAEA,uBACA,qBACA,qBAGA,yBAEA,WAEA,6BAIA,sBC9Xe,EAXC,YACd,GCRW,WAAa,IAAI2L,EAAIC,KAASC,EAAGF,EAAIG,eAAmBE,EAAGL,EAAII,MAAMC,IAAIH,EAAG,OAAOG,EAAG,MAAM,CAACsI,IAAI,SAASpI,MAAM,CAAC4F,OAAqB,OAAbnG,EAAIkG,MAAexF,MAAM,CAAC,GAAK,gBAAgBrB,GAAG,CAAC,MAAQW,EAAIimB,aAAa,cAAc,SAASplB,GAAQ,OAAOb,EAAIkmB,aAAarlB,IAAS,MAAQb,EAAIsG,UAAU,CAAe,OAAbtG,EAAIkG,KAAe,CAAC7F,E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","file":"js/bundle.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t0: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([72,1]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import socket from \"./socket\";\n\nconst defaultSettingConfig = {\n\tapply() {},\n\tdefault: null,\n\tsync: null,\n};\n\nexport const config = normalizeConfig({\n\tsyncSettings: {\n\t\tdefault: true,\n\t\tsync: \"never\",\n\t\tapply(store, value, auto = false) {\n\t\t\t// If applied by settings/applyAll, do not emit to server\n\t\t\tif (value && !auto) {\n\t\t\t\tsocket.emit(\"setting:get\");\n\t\t\t}\n\t\t},\n\t},\n\tadvanced: {\n\t\tdefault: false,\n\t},\n\tautocomplete: {\n\t\tdefault: true,\n\t},\n\tnickPostfix: {\n\t\tdefault: \"\",\n\t},\n\tcoloredNicks: {\n\t\tdefault: true,\n\t},\n\tdesktopNotifications: {\n\t\tdefault: false,\n\t\tsync: \"never\",\n\t\tapply(store, value) {\n\t\t\tstore.commit(\"refreshDesktopNotificationState\", null, {root: true});\n\n\t\t\tif (\"Notification\" in window && value && Notification.permission !== \"granted\") {\n\t\t\t\tNotification.requestPermission(() =>\n\t\t\t\t\tstore.commit(\"refreshDesktopNotificationState\", null, {root: true})\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t},\n\thighlights: {\n\t\tdefault: \"\",\n\t\tsync: \"always\",\n\t},\n\thighlightExceptions: {\n\t\tdefault: \"\",\n\t\tsync: \"always\",\n\t},\n\tawayMessage: {\n\t\tdefault: \"\",\n\t\tsync: \"always\",\n\t},\n\tlinks: {\n\t\tdefault: true,\n\t},\n\tmotd: {\n\t\tdefault: true,\n\t},\n\tnotification: {\n\t\tdefault: true,\n\t\tsync: \"never\",\n\t},\n\tnotifyAllMessages: {\n\t\tdefault: false,\n\t},\n\tshowSeconds: {\n\t\tdefault: false,\n\t},\n\tuse12hClock: {\n\t\tdefault: false,\n\t},\n\tstatusMessages: {\n\t\tdefault: \"condensed\",\n\t},\n\ttheme: {\n\t\tdefault: document.getElementById(\"theme\").dataset.serverTheme,\n\t\tapply(store, value) {\n\t\t\tconst themeEl = document.getElementById(\"theme\");\n\t\t\tconst themeUrl = `themes/${value}.css`;\n\n\t\t\tif (themeEl.attributes.href.value === themeUrl) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthemeEl.attributes.href.value = themeUrl;\n\t\t\tconst newTheme = store.state.serverConfiguration.themes.filter(\n\t\t\t\t(theme) => theme.name === value\n\t\t\t)[0];\n\t\t\tconst themeColor =\n\t\t\t\tnewTheme.themeColor || document.querySelector('meta[name=\"theme-color\"]').content;\n\t\t\tdocument.querySelector('meta[name=\"theme-color\"]').content = themeColor;\n\t\t},\n\t},\n\tmedia: {\n\t\tdefault: true,\n\t},\n\tuploadCanvas: {\n\t\tdefault: true,\n\t},\n\tuserStyles: {\n\t\tdefault: \"\",\n\t\tapply(store, value) {\n\t\t\tif (!/[?&]nocss/.test(window.location.search)) {\n\t\t\t\tdocument.getElementById(\"user-specified-css\").innerHTML = value;\n\t\t\t}\n\t\t},\n\t},\n});\n\nexport function createState() {\n\tconst state = {};\n\n\tfor (const settingName in config) {\n\t\tstate[settingName] = config[settingName].default;\n\t}\n\n\treturn state;\n}\n\nfunction normalizeConfig(obj) {\n\tconst newConfig = {};\n\n\tfor (const settingName in obj) {\n\t\tnewConfig[settingName] = {...defaultSettingConfig, ...obj[settingName]};\n\t}\n\n\treturn newConfig;\n}\n","import storage from \"./localStorage\";\nimport socket from \"./socket\";\nimport {config, createState} from \"./settings\";\n\nexport function createSettingsStore(store) {\n\treturn {\n\t\tnamespaced: true,\n\t\tstate: assignStoredSettings(createState(), loadFromLocalStorage()),\n\t\tmutations: {\n\t\t\tset(state, {name, value}) {\n\t\t\t\tstate[name] = value;\n\t\t\t},\n\t\t},\n\t\tactions: {\n\t\t\tsyncAll({state}, force = false) {\n\t\t\t\tif (state.syncSettings === false && force === false) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tstore.commit(\"serverHasSettings\", true);\n\n\t\t\t\tfor (const name in state) {\n\t\t\t\t\tif (config[name].sync !== \"never\" || config[name].sync === \"always\") {\n\t\t\t\t\t\tsocket.emit(\"setting:set\", {name, value: state[name]});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tapplyAll({state}) {\n\t\t\t\tfor (const settingName in config) {\n\t\t\t\t\tconfig[settingName].apply(store, state[settingName], true);\n\t\t\t\t}\n\t\t\t},\n\t\t\tupdate({state, commit}, {name, value, sync = false}) {\n\t\t\t\tif (state[name] === value) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst settingConfig = config[name];\n\n\t\t\t\t// Trying to update a non existing setting (e.g. server has an old key)\n\t\t\t\tif (!settingConfig) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tsync === false &&\n\t\t\t\t\t(state.syncSettings === false || settingConfig.sync === \"never\")\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcommit(\"set\", {name, value});\n\t\t\t\tstorage.set(\"settings\", JSON.stringify(state));\n\t\t\t\tsettingConfig.apply(store, value);\n\n\t\t\t\tif (!sync) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t(state.syncSettings && settingConfig.sync !== \"never\") ||\n\t\t\t\t\tsettingConfig.sync === \"always\"\n\t\t\t\t) {\n\t\t\t\t\tsocket.emit(\"setting:set\", {name, value});\n\t\t\t\t}\n\t\t\t},\n\t\t},\n\t};\n}\n\nfunction loadFromLocalStorage() {\n\tlet storedSettings;\n\n\ttry {\n\t\tstoredSettings = JSON.parse(storage.get(\"settings\"));\n\t} catch (e) {\n\t\tstorage.remove(\"settings\");\n\t}\n\n\tif (!storedSettings) {\n\t\treturn {};\n\t}\n\n\t// Older The Lounge versions converted highlights to an array, turn it back into a string\n\tif (storedSettings.highlights !== null && typeof storedSettings.highlights === \"object\") {\n\t\tstoredSettings.highlights = storedSettings.highlights.join(\", \");\n\t}\n\n\treturn storedSettings;\n}\n\n/**\n * Essentially Object.assign but does not overwrite and only assigns\n * if key exists in both supplied objects and types match\n *\n * @param {object} defaultSettings\n * @param {object} storedSettings\n */\nfunction assignStoredSettings(defaultSettings, storedSettings) {\n\tconst newSettings = {...defaultSettings};\n\n\tfor (const key in defaultSettings) {\n\t\t// Make sure the setting in local storage has the same type that the code expects\n\t\tif (\n\t\t\ttypeof storedSettings[key] !== \"undefined\" &&\n\t\t\ttypeof defaultSettings[key] === typeof storedSettings[key]\n\t\t) {\n\t\t\tnewSettings[key] = storedSettings[key];\n\t\t}\n\t}\n\n\treturn newSettings;\n}\n","import Vue from \"vue\";\nimport Vuex from \"vuex\";\nimport {createSettingsStore} from \"./store-settings\";\nimport storage from \"./localStorage\";\n\nconst appName = document.title;\n\nVue.use(Vuex);\n\nfunction detectDesktopNotificationState() {\n\tif (!(\"Notification\" in window)) {\n\t\treturn \"unsupported\";\n\t} else if (Notification.permission === \"granted\") {\n\t\treturn \"granted\";\n\t}\n\n\treturn \"blocked\";\n}\n\nconst store = new Vuex.Store({\n\tstate: {\n\t\tappLoaded: false,\n\t\tactiveChannel: null,\n\t\tcurrentUserVisibleError: null,\n\t\tdesktopNotificationState: detectDesktopNotificationState(),\n\t\tisAutoCompleting: false,\n\t\tisConnected: false,\n\t\tnetworks: [],\n\t\tmentions: [],\n\t\thasServiceWorker: false,\n\t\tpushNotificationState: \"unsupported\",\n\t\tserverConfiguration: null,\n\t\tsessions: [],\n\t\tsidebarOpen: false,\n\t\tsidebarDragging: false,\n\t\tuserlistOpen: storage.get(\"thelounge.state.userlist\") !== \"false\",\n\t\tversionData: null,\n\t\tversionStatus: \"loading\",\n\t\tversionDataExpired: false,\n\t\tserverHasSettings: false,\n\t},\n\tmutations: {\n\t\tappLoaded(state) {\n\t\t\tstate.appLoaded = true;\n\t\t},\n\t\tactiveChannel(state, channel) {\n\t\t\tstate.activeChannel = channel;\n\t\t},\n\t\tcurrentUserVisibleError(state, error) {\n\t\t\tstate.currentUserVisibleError = error;\n\t\t},\n\t\trefreshDesktopNotificationState(state) {\n\t\t\tstate.desktopNotificationState = detectDesktopNotificationState();\n\t\t},\n\t\tisAutoCompleting(state, isAutoCompleting) {\n\t\t\tstate.isAutoCompleting = isAutoCompleting;\n\t\t},\n\t\tisConnected(state, payload) {\n\t\t\tstate.isConnected = payload;\n\t\t},\n\t\tnetworks(state, networks) {\n\t\t\tstate.networks = networks;\n\t\t},\n\t\tmentions(state, mentions) {\n\t\t\tstate.mentions = mentions;\n\t\t},\n\t\tremoveNetwork(state, networkId) {\n\t\t\tstate.networks.splice(\n\t\t\t\tstore.state.networks.findIndex((n) => n.uuid === networkId),\n\t\t\t\t1\n\t\t\t);\n\t\t},\n\t\tsortNetworks(state, sortFn) {\n\t\t\tstate.networks.sort(sortFn);\n\t\t},\n\t\thasServiceWorker(state) {\n\t\t\tstate.hasServiceWorker = true;\n\t\t},\n\t\tpushNotificationState(state, pushNotificationState) {\n\t\t\tstate.pushNotificationState = pushNotificationState;\n\t\t},\n\t\tserverConfiguration(state, serverConfiguration) {\n\t\t\tstate.serverConfiguration = serverConfiguration;\n\t\t},\n\t\tsessions(state, payload) {\n\t\t\tstate.sessions = payload;\n\t\t},\n\t\tsidebarOpen(state, payload) {\n\t\t\tstate.sidebarOpen = payload;\n\t\t},\n\t\tsidebarDragging(state, payload) {\n\t\t\tstate.sidebarDragging = payload;\n\t\t},\n\t\ttoggleSidebar(state) {\n\t\t\tstate.sidebarOpen = !state.sidebarOpen;\n\t\t},\n\t\ttoggleUserlist(state) {\n\t\t\tstate.userlistOpen = !state.userlistOpen;\n\t\t},\n\t\tuserlistOpen(state, payload) {\n\t\t\tstate.userlistOpen = payload;\n\t\t},\n\t\tversionData(state, payload) {\n\t\t\tstate.versionData = payload;\n\t\t},\n\t\tversionStatus(state, payload) {\n\t\t\tstate.versionStatus = payload;\n\t\t},\n\t\tversionDataExpired(state, payload) {\n\t\t\tstate.versionDataExpired = payload;\n\t\t},\n\t\tserverHasSettings(state, value) {\n\t\t\tstate.serverHasSettings = value;\n\t\t},\n\t},\n\tgetters: {\n\t\tfindChannelOnCurrentNetwork: (state) => (name) => {\n\t\t\tname = name.toLowerCase();\n\t\t\treturn state.activeChannel.network.channels.find((c) => c.name.toLowerCase() === name);\n\t\t},\n\t\tfindChannel: (state) => (id) => {\n\t\t\tfor (const network of state.networks) {\n\t\t\t\tfor (const channel of network.channels) {\n\t\t\t\t\tif (channel.id === id) {\n\t\t\t\t\t\treturn {network, channel};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\tfindNetwork: (state) => (uuid) => {\n\t\t\tfor (const network of state.networks) {\n\t\t\t\tif (network.uuid === uuid) {\n\t\t\t\t\treturn network;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn null;\n\t\t},\n\t\thighlightCount(state) {\n\t\t\tlet highlightCount = 0;\n\n\t\t\tfor (const network of state.networks) {\n\t\t\t\tfor (const channel of network.channels) {\n\t\t\t\t\thighlightCount += channel.highlight;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn highlightCount;\n\t\t},\n\t\ttitle(state, getters) {\n\t\t\tconst alertEventCount = getters.highlightCount ? `(${getters.highlightCount}) ` : \"\";\n\n\t\t\tconst channelname = state.activeChannel ? `${state.activeChannel.channel.name} — ` : \"\";\n\n\t\t\treturn alertEventCount + channelname + appName;\n\t\t},\n\t\tinitChannel: () => (channel) => {\n\t\t\t// TODO: This should be a mutation\n\t\t\tchannel.pendingMessage = \"\";\n\t\t\tchannel.inputHistoryPosition = 0;\n\t\t\tchannel.inputHistory = [\"\"];\n\t\t\tchannel.historyLoading = false;\n\t\t\tchannel.scrolledToBottom = true;\n\t\t\tchannel.editTopic = false;\n\n\t\t\tchannel.moreHistoryAvailable = channel.totalMessages > channel.messages.length;\n\t\t\tdelete channel.totalMessages;\n\n\t\t\tif (channel.type === \"channel\") {\n\t\t\t\tchannel.usersOutdated = true;\n\t\t\t}\n\n\t\t\treturn channel;\n\t\t},\n\t},\n});\n\n// Settings module is registered dynamically because it benefits\n// from a direct reference to the store\nstore.registerModule(\"settings\", createSettingsStore(store));\n\nexport default store;\n","\"use strict\";\n\nimport io from \"socket.io-client\";\n\nconst socket = io({\n\ttransports: JSON.parse(document.body.dataset.transports),\n\tpath: window.location.pathname + \"socket.io/\",\n\tautoConnect: false,\n\treconnection: !document.body.classList.contains(\"public\"),\n});\n\n// Ease debugging socket during development\nif (process.env.NODE_ENV === \"development\") {\n\twindow.socket = socket;\n}\n\nexport default socket;\n","const events = new Map();\n\nclass EventBus {\n\t/**\n\t * Register an event handler for the given type.\n\t *\n\t * @param {String} type Type of event to listen for.\n\t * @param {Function} handler Function to call in response to given event.\n\t */\n\ton(type, handler) {\n\t\tif (events.has(type)) {\n\t\t\tevents.get(type).push(handler);\n\t\t} else {\n\t\t\tevents.set(type, [handler]);\n\t\t}\n\t}\n\n\t/**\n\t * Remove an event handler for the given type.\n\t *\n\t * @param {String} type Type of event to unregister `handler` from.\n\t * @param {Function} handler Handler function to remove.\n\t */\n\toff(type, handler) {\n\t\tif (events.has(type)) {\n\t\t\tevents.set(\n\t\t\t\ttype,\n\t\t\t\tevents.get(type).filter((item) => item !== handler)\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Invoke all handlers for the given type.\n\t *\n\t * @param {String} type The event type to invoke.\n\t * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler.\n\t */\n\temit(type, ...evt) {\n\t\tif (events.has(type)) {\n\t\t\tevents\n\t\t\t\t.get(type)\n\t\t\t\t.slice()\n\t\t\t\t.map((handler) => {\n\t\t\t\t\thandler(...evt);\n\t\t\t\t});\n\t\t}\n\t}\n}\n\nexport default new EventBus();\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',_vm._g({class:['user', _vm.nickColor, {active: _vm.active}],attrs:{\"data-name\":_vm.user.nick,\"role\":\"button\"},on:{\"click\":function($event){$event.preventDefault();return _vm.openContextMenu($event)},\"contextmenu\":function($event){$event.preventDefault();return _vm.openContextMenu($event)}}},_vm.onHover ? {mouseenter: _vm.hover} : {}),[_vm._t(\"default\",[_vm._v(_vm._s(_vm.mode)+_vm._s(_vm.user.nick))])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Username.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Username.vue?vue&type=script&lang=js&\"","<template>\n\t<span\n\t\t:class=\"['user', nickColor, {active: active}]\"\n\t\t:data-name=\"user.nick\"\n\t\trole=\"button\"\n\t\tv-on=\"onHover ? {mouseenter: hover} : {}\"\n\t\t@click.prevent=\"openContextMenu\"\n\t\t@contextmenu.prevent=\"openContextMenu\"\n\t\t><slot>{{ mode }}{{ user.nick }}</slot></span\n\t>\n</template>\n\n<script>\nimport eventbus from \"../js/eventbus\";\nimport colorClass from \"../js/helpers/colorClass\";\n\nexport default {\n\tname: \"Username\",\n\tprops: {\n\t\tuser: Object,\n\t\tactive: Boolean,\n\t\tonHover: Function,\n\t},\n\tcomputed: {\n\t\tmode() {\n\t\t\t// Message objects have a singular mode, but user objects have modes array\n\t\t\tif (this.user.modes) {\n\t\t\t\treturn this.user.modes[0];\n\t\t\t}\n\n\t\t\treturn this.user.mode;\n\t\t},\n\t\tnickColor() {\n\t\t\treturn colorClass(this.user.nick);\n\t\t},\n\t},\n\tmethods: {\n\t\thover() {\n\t\t\treturn this.onHover(this.user);\n\t\t},\n\t\topenContextMenu(event) {\n\t\t\teventbus.emit(\"contextmenu:user\", {\n\t\t\t\tevent: event,\n\t\t\t\tuser: this.user,\n\t\t\t});\n\t\t},\n\t},\n};\n</script>\n","\"use strict\";\n\n// Generates a string from \"color-1\" to \"color-32\" based on an input string\nexport default (str) => {\n\tlet hash = 0;\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\thash += str.charCodeAt(i);\n\t}\n\n\t/*\n\t\tModulo 32 lets us be case insensitive for ascii\n\t\tdue to A being ascii 65 (100 0001)\n\t\t while a being ascii 97 (110 0001)\n\t*/\n\treturn \"color-\" + (1 + (hash % 32));\n};\n","import { render, staticRenderFns } from \"./Username.vue?vue&type=template&id=495380de&\"\nimport script from \"./Username.vue?vue&type=script&lang=js&\"\nexport * from \"./Username.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","\"use strict\";\n\n// Styling control codes\nconst BOLD = \"\\x02\";\nconst COLOR = \"\\x03\";\nconst HEX_COLOR = \"\\x04\";\nconst RESET = \"\\x0f\";\nconst REVERSE = \"\\x16\";\nconst ITALIC = \"\\x1d\";\nconst UNDERLINE = \"\\x1f\";\nconst STRIKETHROUGH = \"\\x1e\";\nconst MONOSPACE = \"\\x11\";\n\n// Color code matcher, with format `XX,YY` where both `XX` and `YY` are\n// integers, `XX` is the text color and `YY` is an optional background color.\nconst colorRx = /^(\\d{1,2})(?:,(\\d{1,2}))?/;\n\n// 6-char Hex color code matcher\nconst hexColorRx = /^([0-9a-f]{6})(?:,([0-9a-f]{6}))?/i;\n\n// Represents all other control codes that to be ignored/filtered from the text\n// This regex allows line feed character\nconst controlCodesRx = /[\\u0000-\\u0009\\u000B-\\u001F]/g;\n\n// Converts a given text into an array of objects, each of them representing a\n// similarly styled section of the text. Each object carries the `text`, style\n// information (`bold`, `textColor`, `bgcolor`, `italic`,\n// `underline`, `strikethrough`, `monospace`), and `start`/`end` cursors.\nfunction parseStyle(text) {\n\tconst result = [];\n\tlet start = 0;\n\tlet position = 0;\n\n\t// At any given time, these carry style information since last time a styling\n\t// control code was met.\n\tlet colorCodes,\n\t\tbold,\n\t\ttextColor,\n\t\tbgColor,\n\t\thexColor,\n\t\thexBgColor,\n\t\titalic,\n\t\tunderline,\n\t\tstrikethrough,\n\t\tmonospace;\n\n\tconst resetStyle = () => {\n\t\tbold = false;\n\t\ttextColor = undefined;\n\t\tbgColor = undefined;\n\t\thexColor = undefined;\n\t\thexBgColor = undefined;\n\t\titalic = false;\n\t\tunderline = false;\n\t\tstrikethrough = false;\n\t\tmonospace = false;\n\t};\n\n\tresetStyle();\n\n\t// When called, this \"closes\" the current fragment by adding an entry to the\n\t// `result` array using the styling information set last time a control code\n\t// was met.\n\tconst emitFragment = () => {\n\t\t// Uses the text fragment starting from the last control code position up to\n\t\t// the current position\n\t\tconst textPart = text.slice(start, position);\n\n\t\t// Filters out all non-style related control codes present in this text\n\t\tconst processedText = textPart.replace(controlCodesRx, \" \");\n\n\t\tif (processedText.length) {\n\t\t\t// Current fragment starts where the previous one ends, or at 0 if none\n\t\t\tconst fragmentStart = result.length ? result[result.length - 1].end : 0;\n\n\t\t\tresult.push({\n\t\t\t\tbold,\n\t\t\t\ttextColor,\n\t\t\t\tbgColor,\n\t\t\t\thexColor,\n\t\t\t\thexBgColor,\n\t\t\t\titalic,\n\t\t\t\tunderline,\n\t\t\t\tstrikethrough,\n\t\t\t\tmonospace,\n\t\t\t\ttext: processedText,\n\t\t\t\tstart: fragmentStart,\n\t\t\t\tend: fragmentStart + processedText.length,\n\t\t\t});\n\t\t}\n\n\t\t// Now that a fragment has been \"closed\", the next one will start after that\n\t\tstart = position + 1;\n\t};\n\n\t// This loop goes through each character of the given text one by one by\n\t// bumping the `position` cursor. Every time a new special \"styling\" character\n\t// is met, an object gets created (with `emitFragment()`)information on text\n\t// encountered since the previous styling character.\n\twhile (position < text.length) {\n\t\tswitch (text[position]) {\n\t\t\tcase RESET:\n\t\t\t\temitFragment();\n\t\t\t\tresetStyle();\n\t\t\t\tbreak;\n\n\t\t\t// Meeting a BOLD character means that the ongoing text is either going to\n\t\t\t// be in bold or that the previous one was in bold and the following one\n\t\t\t// must be reset.\n\t\t\t// This same behavior applies to COLOR, REVERSE, ITALIC, and UNDERLINE.\n\t\t\tcase BOLD:\n\t\t\t\temitFragment();\n\t\t\t\tbold = !bold;\n\t\t\t\tbreak;\n\n\t\t\tcase COLOR:\n\t\t\t\temitFragment();\n\n\t\t\t\t// Go one step further to find the corresponding color\n\t\t\t\tcolorCodes = text.slice(position + 1).match(colorRx);\n\n\t\t\t\tif (colorCodes) {\n\t\t\t\t\ttextColor = Number(colorCodes[1]);\n\n\t\t\t\t\tif (colorCodes[2]) {\n\t\t\t\t\t\tbgColor = Number(colorCodes[2]);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Color code length is > 1, so bump the current position cursor by as\n\t\t\t\t\t// much (and reset the start cursor for the current text block as well)\n\t\t\t\t\tposition += colorCodes[0].length;\n\t\t\t\t\tstart = position + 1;\n\t\t\t\t} else {\n\t\t\t\t\t// If no color codes were found, toggles back to no colors (like BOLD).\n\t\t\t\t\ttextColor = undefined;\n\t\t\t\t\tbgColor = undefined;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase HEX_COLOR:\n\t\t\t\temitFragment();\n\n\t\t\t\tcolorCodes = text.slice(position + 1).match(hexColorRx);\n\n\t\t\t\tif (colorCodes) {\n\t\t\t\t\thexColor = colorCodes[1].toUpperCase();\n\n\t\t\t\t\tif (colorCodes[2]) {\n\t\t\t\t\t\thexBgColor = colorCodes[2].toUpperCase();\n\t\t\t\t\t}\n\n\t\t\t\t\t// Color code length is > 1, so bump the current position cursor by as\n\t\t\t\t\t// much (and reset the start cursor for the current text block as well)\n\t\t\t\t\tposition += colorCodes[0].length;\n\t\t\t\t\tstart = position + 1;\n\t\t\t\t} else {\n\t\t\t\t\t// If no color codes were found, toggles back to no colors (like BOLD).\n\t\t\t\t\thexColor = undefined;\n\t\t\t\t\thexBgColor = undefined;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase REVERSE: {\n\t\t\t\temitFragment();\n\t\t\t\tconst tmp = bgColor;\n\t\t\t\tbgColor = textColor;\n\t\t\t\ttextColor = tmp;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase ITALIC:\n\t\t\t\temitFragment();\n\t\t\t\titalic = !italic;\n\t\t\t\tbreak;\n\n\t\t\tcase UNDERLINE:\n\t\t\t\temitFragment();\n\t\t\t\tunderline = !underline;\n\t\t\t\tbreak;\n\n\t\t\tcase STRIKETHROUGH:\n\t\t\t\temitFragment();\n\t\t\t\tstrikethrough = !strikethrough;\n\t\t\t\tbreak;\n\n\t\t\tcase MONOSPACE:\n\t\t\t\temitFragment();\n\t\t\t\tmonospace = !monospace;\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// Evaluate the next character at the next iteration\n\t\tposition += 1;\n\t}\n\n\t// The entire text has been parsed, so we finalize the current text fragment.\n\temitFragment();\n\n\treturn result;\n}\n\nconst properties = [\n\t\"bold\",\n\t\"textColor\",\n\t\"bgColor\",\n\t\"hexColor\",\n\t\"hexBgColor\",\n\t\"italic\",\n\t\"underline\",\n\t\"strikethrough\",\n\t\"monospace\",\n];\n\nfunction prepare(text) {\n\treturn (\n\t\tparseStyle(text)\n\t\t\t// This optimizes fragments by combining them together when all their values\n\t\t\t// for the properties defined above are equal.\n\t\t\t.reduce((prev, curr) => {\n\t\t\t\tif (prev.length) {\n\t\t\t\t\tconst lastEntry = prev[prev.length - 1];\n\n\t\t\t\t\tif (properties.every((key) => curr[key] === lastEntry[key])) {\n\t\t\t\t\t\tlastEntry.text += curr.text;\n\t\t\t\t\t\tlastEntry.end += curr.text.length;\n\t\t\t\t\t\treturn prev;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn prev.concat([curr]);\n\t\t\t}, [])\n\t);\n}\n\nexport default prepare;\n","\"use strict\";\n\n// Escapes the RegExp special characters \"^\", \"$\", \"\", \".\", \"*\", \"+\", \"?\", \"(\",\n// \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in string.\n// See https://lodash.com/docs/#escapeRegExp\nimport escapeRegExp from \"lodash/escapeRegExp\";\n\n// Given an array of channel prefixes (such as \"#\" and \"&\") and an array of user\n// modes (such as \"@\" and \"+\"), this function extracts channels and nicks from a\n// text.\n// It returns an array of objects for each channel found with their start index,\n// end index and channel name.\nfunction findChannels(text, channelPrefixes, userModes) {\n\t// `userModePattern` is necessary to ignore user modes in /whois responses.\n\t// For example, a voiced user in #thelounge will have a /whois response of:\n\t// > foo is on the following channels: +#thelounge\n\t// We need to explicitly ignore user modes to parse such channels correctly.\n\tconst userModePattern = userModes.map(escapeRegExp).join(\"\");\n\tconst channelPrefixPattern = channelPrefixes.map(escapeRegExp).join(\"\");\n\tconst channelPattern = `(?:^|\\\\s)[${userModePattern}]*([${channelPrefixPattern}][^ \\u0007]+)`;\n\tconst channelRegExp = new RegExp(channelPattern, \"g\");\n\n\tconst result = [];\n\tlet match;\n\n\tdo {\n\t\t// With global (\"g\") regexes, calling `exec` multiple times will find\n\t\t// successive matches in the same string.\n\t\tmatch = channelRegExp.exec(text);\n\n\t\tif (match) {\n\t\t\tresult.push({\n\t\t\t\tstart: match.index + match[0].length - match[1].length,\n\t\t\t\tend: match.index + match[0].length,\n\t\t\t\tchannel: match[1],\n\t\t\t});\n\t\t}\n\t} while (match);\n\n\treturn result;\n}\n\nexport default findChannels;\n","\"use strict\";\n\nconst emojiRegExp = require(\"emoji-regex\")();\n\nfunction findEmoji(text) {\n\tconst result = [];\n\tlet match;\n\n\twhile ((match = emojiRegExp.exec(text))) {\n\t\tresult.push({\n\t\t\tstart: match.index,\n\t\t\tend: match.index + match[0].length,\n\t\t\temoji: match[0],\n\t\t});\n\t}\n\n\treturn result;\n}\n\nexport default findEmoji;\n","\"use strict\";\n\nconst nickRegExp = /([\\w[\\]\\\\`^{|}-]+)/g;\n\nfunction findNames(text, users) {\n\tconst result = [];\n\n\t// Return early if we don't have any nicknames to find\n\tif (users.length === 0) {\n\t\treturn result;\n\t}\n\n\tlet match;\n\n\twhile ((match = nickRegExp.exec(text))) {\n\t\tif (users.indexOf(match[1]) > -1) {\n\t\t\tresult.push({\n\t\t\t\tstart: match.index,\n\t\t\t\tend: match.index + match[1].length,\n\t\t\t\tnick: match[1],\n\t\t\t});\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport default findNames;\n","\"use strict\";\n\n// Return true if any section of \"a\" or \"b\" parts (defined by their start/end\n// markers) intersect each other, false otherwise.\nfunction anyIntersection(a, b) {\n\treturn (\n\t\t(a.start <= b.start && b.start < a.end) ||\n\t\t(a.start < b.end && b.end <= a.end) ||\n\t\t(b.start <= a.start && a.start < b.end) ||\n\t\t(b.start < a.end && a.end <= b.end)\n\t);\n}\n\nexport default anyIntersection;\n","\"use strict\";\n\n// Create plain text entries corresponding to areas of the text that match no\n// existing entries. Returns an empty array if all parts of the text have been\n// parsed into recognizable entries already.\nfunction fill(existingEntries, text) {\n\tlet position = 0;\n\n\t// Fill inner parts of the text. For example, if text is `foobarbaz` and both\n\t// `foo` and `baz` have matched into an entry, this will return a dummy entry\n\t// corresponding to `bar`.\n\tconst result = existingEntries.reduce((acc, textSegment) => {\n\t\tif (textSegment.start > position) {\n\t\t\tacc.push({\n\t\t\t\tstart: position,\n\t\t\t\tend: textSegment.start,\n\t\t\t});\n\t\t}\n\n\t\tposition = textSegment.end;\n\t\treturn acc;\n\t}, []);\n\n\t// Complete the unmatched end of the text with a dummy entry\n\tif (position < text.length) {\n\t\tresult.push({\n\t\t\tstart: position,\n\t\t\tend: text.length,\n\t\t});\n\t}\n\n\treturn result;\n}\n\nexport default fill;\n","\"use strict\";\n\nimport anyIntersection from \"./anyIntersection\";\nimport fill from \"./fill\";\n\n// Merge text part information within a styling fragment\nfunction assign(textPart, fragment) {\n\tconst fragStart = fragment.start;\n\tconst start = Math.max(fragment.start, textPart.start);\n\tconst end = Math.min(fragment.end, textPart.end);\n\tconst text = fragment.text.slice(start - fragStart, end - fragStart);\n\n\treturn Object.assign({}, fragment, {start, end, text});\n}\n\nfunction sortParts(a, b) {\n\treturn a.start - b.start || b.end - a.end;\n}\n\n// Merge the style fragments within the text parts, taking into account\n// boundaries and text sections that have not matched to links or channels.\n// For example, given a string \"foobar\" where \"foo\" and \"bar\" have been\n// identified as parts (channels, links, etc.) and \"fo\", \"ob\" and \"ar\" have 3\n// different styles, the first resulting part will contain fragments \"fo\" and\n// \"o\", and the second resulting part will contain \"b\" and \"ar\". \"o\" and \"b\"\n// fragments will contain duplicate styling attributes.\nfunction merge(textParts, styleFragments, cleanText) {\n\t// Remove overlapping parts\n\ttextParts = textParts.sort(sortParts).reduce((prev, curr) => {\n\t\tconst intersection = prev.some((p) => anyIntersection(p, curr));\n\n\t\tif (intersection) {\n\t\t\treturn prev;\n\t\t}\n\n\t\treturn prev.concat([curr]);\n\t}, []);\n\n\t// Every section of the original text that has not been captured in a \"part\"\n\t// is filled with \"text\" parts, dummy objects with start/end but no extra\n\t// metadata.\n\tconst allParts = textParts.concat(fill(textParts, cleanText)).sort(sortParts); // Sort all parts identified based on their position in the original text\n\n\t// Distribute the style fragments within the text parts\n\treturn allParts.map((textPart) => {\n\t\ttextPart.fragments = styleFragments\n\t\t\t.filter((fragment) => anyIntersection(textPart, fragment))\n\t\t\t.map((fragment) => assign(textPart, fragment));\n\n\t\treturn textPart;\n\t});\n}\n\nexport default merge;\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LinkPreviewToggle.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LinkPreviewToggle.vue?vue&type=script&lang=js&\"","<template>\n\t<button\n\t\tv-if=\"link.type !== 'loading'\"\n\t\t:class=\"['toggle-button', 'toggle-preview', {opened: link.shown}]\"\n\t\t:aria-label=\"ariaLabel\"\n\t\t@click=\"onClick\"\n\t/>\n</template>\n\n<script>\nexport default {\n\tname: \"LinkPreviewToggle\",\n\tprops: {\n\t\tlink: Object,\n\t},\n\tcomputed: {\n\t\tariaLabel() {\n\t\t\treturn this.link.shown ? \"Collapse preview\" : \"Expand preview\";\n\t\t},\n\t},\n\tmethods: {\n\t\tonClick() {\n\t\t\tthis.link.shown = !this.link.shown;\n\n\t\t\tthis.$parent.$emit(\"toggle-link-preview\", this.link, this.$parent.message);\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./LinkPreviewToggle.vue?vue&type=template&id=e8a67ce6&\"\nimport script from \"./LinkPreviewToggle.vue?vue&type=script&lang=js&\"\nexport * from \"./LinkPreviewToggle.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.link.type !== 'loading')?_c('button',{class:['toggle-button', 'toggle-preview', {opened: _vm.link.shown}],attrs:{\"aria-label\":_vm.ariaLabel},on:{\"click\":_vm.onClick}}):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LinkPreviewFileSize.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LinkPreviewFileSize.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"preview-size\">({{ previewSize }})</span>\n</template>\n\n<script>\nimport friendlysize from \"../js/helpers/friendlysize\";\n\nexport default {\n\tname: \"LinkPreviewFileSize\",\n\tprops: {\n\t\tsize: Number,\n\t},\n\tcomputed: {\n\t\tpreviewSize() {\n\t\t\treturn friendlysize(this.size);\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./LinkPreviewFileSize.vue?vue&type=template&id=59a37444&\"\nimport script from \"./LinkPreviewFileSize.vue?vue&type=script&lang=js&\"\nexport * from \"./LinkPreviewFileSize.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"preview-size\"},[_vm._v(\"(\"+_vm._s(_vm.previewSize)+\")\")])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InlineChannel.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./InlineChannel.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"inline-channel\" dir=\"auto\" role=\"button\" tabindex=\"0\" @click=\"onClick\"\n\t\t><slot></slot\n\t></span>\n</template>\n\n<script>\nimport socket from \"../js/socket\";\n\nexport default {\n\tname: \"InlineChannel\",\n\tprops: {\n\t\tchannel: String,\n\t},\n\tmethods: {\n\t\tonClick() {\n\t\t\tconst existingChannel = this.$store.getters.findChannelOnCurrentNetwork(this.channel);\n\n\t\t\tif (existingChannel) {\n\t\t\t\tthis.$root.switchToChannel(existingChannel);\n\t\t\t}\n\n\t\t\tsocket.emit(\"input\", {\n\t\t\t\ttarget: this.$store.state.activeChannel.channel.id,\n\t\t\t\ttext: \"/join \" + this.channel,\n\t\t\t});\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./InlineChannel.vue?vue&type=template&id=67c31d5d&\"\nimport script from \"./InlineChannel.vue?vue&type=script&lang=js&\"\nexport * from \"./InlineChannel.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"inline-channel\",attrs:{\"dir\":\"auto\",\"role\":\"button\",\"tabindex\":\"0\"},on:{\"click\":_vm.onClick}},[_vm._t(\"default\")],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\"use strict\";\n\nimport parseStyle from \"./ircmessageparser/parseStyle\";\nimport findChannels from \"./ircmessageparser/findChannels\";\nimport {findLinks} from \"./ircmessageparser/findLinks\";\nimport findEmoji from \"./ircmessageparser/findEmoji\";\nimport findNames from \"./ircmessageparser/findNames\";\nimport merge from \"./ircmessageparser/merge\";\nimport emojiMap from \"./fullnamemap.json\";\nimport LinkPreviewToggle from \"../../components/LinkPreviewToggle.vue\";\nimport LinkPreviewFileSize from \"../../components/LinkPreviewFileSize.vue\";\nimport InlineChannel from \"../../components/InlineChannel.vue\";\nimport Username from \"../../components/Username.vue\";\n\nconst emojiModifiersRegex = /[\\u{1f3fb}-\\u{1f3ff}]|\\u{fe0f}/gu;\n\n// Create an HTML `span` with styling information for a given fragment\nfunction createFragment(fragment, createElement) {\n\tconst classes = [];\n\n\tif (fragment.bold) {\n\t\tclasses.push(\"irc-bold\");\n\t}\n\n\tif (fragment.textColor !== undefined) {\n\t\tclasses.push(\"irc-fg\" + fragment.textColor);\n\t}\n\n\tif (fragment.bgColor !== undefined) {\n\t\tclasses.push(\"irc-bg\" + fragment.bgColor);\n\t}\n\n\tif (fragment.italic) {\n\t\tclasses.push(\"irc-italic\");\n\t}\n\n\tif (fragment.underline) {\n\t\tclasses.push(\"irc-underline\");\n\t}\n\n\tif (fragment.strikethrough) {\n\t\tclasses.push(\"irc-strikethrough\");\n\t}\n\n\tif (fragment.monospace) {\n\t\tclasses.push(\"irc-monospace\");\n\t}\n\n\tconst data = {};\n\tlet hasData = false;\n\n\tif (classes.length > 0) {\n\t\thasData = true;\n\t\tdata.class = classes;\n\t}\n\n\tif (fragment.hexColor) {\n\t\thasData = true;\n\t\tdata.style = {\n\t\t\tcolor: `#${fragment.hexColor}`,\n\t\t};\n\n\t\tif (fragment.hexBgColor) {\n\t\t\tdata.style[\"background-color\"] = `#${fragment.hexBgColor}`;\n\t\t}\n\t}\n\n\treturn hasData ? createElement(\"span\", data, fragment.text) : fragment.text;\n}\n\n// Transform an IRC message potentially filled with styling control codes, URLs,\n// nicknames, and channels into a string of HTML elements to display on the client.\nfunction parse(createElement, text, message = undefined, network = undefined) {\n\t// Extract the styling information and get the plain text version from it\n\tconst styleFragments = parseStyle(text);\n\tconst cleanText = styleFragments.map((fragment) => fragment.text).join(\"\");\n\n\t// On the plain text, find channels and URLs, returned as \"parts\". Parts are\n\t// arrays of objects containing start and end markers, as well as metadata\n\t// depending on what was found (channel or link).\n\tconst channelPrefixes = network ? network.serverOptions.CHANTYPES : [\"#\", \"&\"];\n\tconst userModes = network ? network.serverOptions.PREFIX : [\"!\", \"@\", \"%\", \"+\"];\n\tconst channelParts = findChannels(cleanText, channelPrefixes, userModes);\n\tconst linkParts = findLinks(cleanText);\n\tconst emojiParts = findEmoji(cleanText);\n\tconst nameParts = findNames(cleanText, message ? message.users || [] : []);\n\n\tconst parts = channelParts.concat(linkParts).concat(emojiParts).concat(nameParts);\n\n\t// Merge the styling information with the channels / URLs / nicks / text objects and\n\t// generate HTML strings with the resulting fragments\n\treturn merge(parts, styleFragments, cleanText).map((textPart) => {\n\t\tconst fragments = textPart.fragments.map((fragment) =>\n\t\t\tcreateFragment(fragment, createElement)\n\t\t);\n\n\t\t// Wrap these potentially styled fragments with links and channel buttons\n\t\tif (textPart.link) {\n\t\t\tconst preview =\n\t\t\t\tmessage &&\n\t\t\t\tmessage.previews &&\n\t\t\t\tmessage.previews.find((p) => p.link === textPart.link);\n\t\t\tconst link = createElement(\n\t\t\t\t\"a\",\n\t\t\t\t{\n\t\t\t\t\tattrs: {\n\t\t\t\t\t\thref: textPart.link,\n\t\t\t\t\t\tdir: preview ? null : \"auto\",\n\t\t\t\t\t\ttarget: \"_blank\",\n\t\t\t\t\t\trel: \"noopener\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tfragments\n\t\t\t);\n\n\t\t\tif (!preview) {\n\t\t\t\treturn link;\n\t\t\t}\n\n\t\t\tconst linkEls = [link];\n\n\t\t\tif (preview.size > 0) {\n\t\t\t\tlinkEls.push(\n\t\t\t\t\tcreateElement(LinkPreviewFileSize, {\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tsize: preview.size,\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tlinkEls.push(\n\t\t\t\tcreateElement(LinkPreviewToggle, {\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tlink: preview,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t);\n\n\t\t\t// We wrap the link, size, and the toggle button into <span dir=\"auto\">\n\t\t\t// to correctly keep the left-to-right order of these elements\n\t\t\treturn createElement(\n\t\t\t\t\"span\",\n\t\t\t\t{\n\t\t\t\t\tattrs: {\n\t\t\t\t\t\tdir: \"auto\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tlinkEls\n\t\t\t);\n\t\t} else if (textPart.channel) {\n\t\t\treturn createElement(\n\t\t\t\tInlineChannel,\n\t\t\t\t{\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tchannel: textPart.channel,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tfragments\n\t\t\t);\n\t\t} else if (textPart.emoji) {\n\t\t\tconst emojiWithoutModifiers = textPart.emoji.replace(emojiModifiersRegex, \"\");\n\t\t\tconst title = emojiMap[emojiWithoutModifiers]\n\t\t\t\t? `Emoji: ${emojiMap[emojiWithoutModifiers]}`\n\t\t\t\t: null;\n\n\t\t\treturn createElement(\n\t\t\t\t\"span\",\n\t\t\t\t{\n\t\t\t\t\tclass: [\"emoji\"],\n\t\t\t\t\tattrs: {\n\t\t\t\t\t\trole: \"img\",\n\t\t\t\t\t\t\"aria-label\": title,\n\t\t\t\t\t\ttitle: title,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tfragments\n\t\t\t);\n\t\t} else if (textPart.nick) {\n\t\t\treturn createElement(\n\t\t\t\tUsername,\n\t\t\t\t{\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tuser: {\n\t\t\t\t\t\t\tnick: textPart.nick,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tattrs: {\n\t\t\t\t\t\tdir: \"auto\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tfragments\n\t\t\t);\n\t\t}\n\n\t\treturn fragments;\n\t});\n}\n\nexport default parse;\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ParsedMessage.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ParsedMessage.vue?vue&type=script&lang=js&\"","<script>\nimport parse from \"../js/helpers/parse\";\n\nexport default {\n\tname: \"ParsedMessage\",\n\tfunctional: true,\n\tprops: {\n\t\ttext: String,\n\t\tmessage: Object,\n\t\tnetwork: Object,\n\t},\n\trender(createElement, context) {\n\t\treturn parse(\n\t\t\tcreateElement,\n\t\t\ttypeof context.props.text !== \"undefined\"\n\t\t\t\t? context.props.text\n\t\t\t\t: context.props.message.text,\n\t\t\tcontext.props.message,\n\t\t\tcontext.props.network\n\t\t);\n\t},\n};\n</script>\n","var render, staticRenderFns\nimport script from \"./ParsedMessage.vue?vue&type=script&lang=js&\"\nexport * from \"./ParsedMessage.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RevealPassword.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RevealPassword.vue?vue&type=script&lang=js&\"","<template>\n\t<div>\n\t\t<slot :isVisible=\"isVisible\" />\n\t\t<span\n\t\t\tref=\"revealButton\"\n\t\t\ttype=\"button\"\n\t\t\t:class=\"[\n\t\t\t\t'reveal-password tooltipped tooltipped-n tooltipped-no-delay',\n\t\t\t\t{'reveal-password-visible': isVisible},\n\t\t\t]\"\n\t\t\t:aria-label=\"isVisible ? 'Hide password' : 'Show password'\"\n\t\t\t@click=\"onClick\"\n\t\t>\n\t\t\t<span :aria-label=\"isVisible ? 'Hide password' : 'Show password'\" />\n\t\t</span>\n\t</div>\n</template>\n\n<script>\nexport default {\n\tname: \"RevealPassword\",\n\tdata() {\n\t\treturn {\n\t\t\tisVisible: false,\n\t\t};\n\t},\n\tmethods: {\n\t\tonClick() {\n\t\t\tthis.isVisible = !this.isVisible;\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./RevealPassword.vue?vue&type=template&id=7321477c&\"\nimport script from \"./RevealPassword.vue?vue&type=script&lang=js&\"\nexport * from \"./RevealPassword.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_vm._t(\"default\",null,{\"isVisible\":_vm.isVisible}),_c('span',{ref:\"revealButton\",class:[\n\t\t\t'reveal-password tooltipped tooltipped-n tooltipped-no-delay',\n\t\t\t{'reveal-password-visible': _vm.isVisible} ],attrs:{\"type\":\"button\",\"aria-label\":_vm.isVisible ? 'Hide password' : 'Show password'},on:{\"click\":_vm.onClick}},[_c('span',{attrs:{\"aria-label\":_vm.isVisible ? 'Hide password' : 'Show password'}})])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SignIn.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SignIn.vue?vue&type=script&lang=js&\"","<template>\n\t<div id=\"sign-in\" class=\"window\" role=\"tabpanel\" aria-label=\"Sign-in\">\n\t\t<form class=\"container\" method=\"post\" action=\"\" @submit=\"onSubmit\">\n\t\t\t<img\n\t\t\t\tsrc=\"img/logo-vertical-transparent-bg.svg\"\n\t\t\t\tclass=\"logo\"\n\t\t\t\talt=\"The Lounge\"\n\t\t\t\twidth=\"256\"\n\t\t\t\theight=\"170\"\n\t\t\t/>\n\t\t\t<img\n\t\t\t\tsrc=\"img/logo-vertical-transparent-bg-inverted.svg\"\n\t\t\t\tclass=\"logo-inverted\"\n\t\t\t\talt=\"The Lounge\"\n\t\t\t\twidth=\"256\"\n\t\t\t\theight=\"170\"\n\t\t\t/>\n\n\t\t\t<label for=\"signin-username\">Username</label>\n\t\t\t<input\n\t\t\t\tid=\"signin-username\"\n\t\t\t\tref=\"username\"\n\t\t\t\tclass=\"input\"\n\t\t\t\ttype=\"text\"\n\t\t\t\tname=\"username\"\n\t\t\t\tautocapitalize=\"none\"\n\t\t\t\tautocorrect=\"off\"\n\t\t\t\tautocomplete=\"username\"\n\t\t\t\t:value=\"getStoredUser()\"\n\t\t\t\trequired\n\t\t\t\tautofocus\n\t\t\t/>\n\n\t\t\t<div class=\"password-container\">\n\t\t\t\t<label for=\"signin-password\">Password</label>\n\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"signin-password\"\n\t\t\t\t\t\tref=\"password\"\n\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tautocapitalize=\"none\"\n\t\t\t\t\t\tautocorrect=\"off\"\n\t\t\t\t\t\tautocomplete=\"current-password\"\n\t\t\t\t\t\trequired\n\t\t\t\t\t/>\n\t\t\t\t</RevealPassword>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"errorShown\" class=\"error\">Authentication failed.</div>\n\n\t\t\t<button :disabled=\"inFlight\" type=\"submit\" class=\"btn\">Sign in</button>\n\t\t</form>\n\t</div>\n</template>\n\n<script>\nimport storage from \"../../js/localStorage\";\nimport socket from \"../../js/socket\";\nimport RevealPassword from \"../RevealPassword.vue\";\n\nexport default {\n\tname: \"SignIn\",\n\tcomponents: {\n\t\tRevealPassword,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tinFlight: false,\n\t\t\terrorShown: false,\n\t\t};\n\t},\n\tmounted() {\n\t\tsocket.on(\"auth:failed\", this.onAuthFailed);\n\t},\n\tbeforeDestroy() {\n\t\tsocket.off(\"auth:failed\", this.onAuthFailed);\n\t},\n\tmethods: {\n\t\tonAuthFailed() {\n\t\t\tthis.inFlight = false;\n\t\t\tthis.errorShown = true;\n\t\t},\n\t\tonSubmit(event) {\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.inFlight = true;\n\t\t\tthis.errorShown = false;\n\n\t\t\tconst values = {\n\t\t\t\tuser: this.$refs.username.value,\n\t\t\t\tpassword: this.$refs.password.value,\n\t\t\t};\n\n\t\t\tstorage.set(\"user\", values.user);\n\n\t\t\tsocket.emit(\"auth:perform\", values);\n\t\t},\n\t\tgetStoredUser() {\n\t\t\treturn storage.get(\"user\");\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./SignIn.vue?vue&type=template&id=0ecf5446&\"\nimport script from \"./SignIn.vue?vue&type=script&lang=js&\"\nexport * from \"./SignIn.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"window\",attrs:{\"id\":\"sign-in\",\"role\":\"tabpanel\",\"aria-label\":\"Sign-in\"}},[_c('form',{staticClass:\"container\",attrs:{\"method\":\"post\",\"action\":\"\"},on:{\"submit\":_vm.onSubmit}},[_c('img',{staticClass:\"logo\",attrs:{\"src\":\"img/logo-vertical-transparent-bg.svg\",\"alt\":\"The Lounge\",\"width\":\"256\",\"height\":\"170\"}}),_c('img',{staticClass:\"logo-inverted\",attrs:{\"src\":\"img/logo-vertical-transparent-bg-inverted.svg\",\"alt\":\"The Lounge\",\"width\":\"256\",\"height\":\"170\"}}),_c('label',{attrs:{\"for\":\"signin-username\"}},[_vm._v(\"Username\")]),_c('input',{ref:\"username\",staticClass:\"input\",attrs:{\"id\":\"signin-username\",\"type\":\"text\",\"name\":\"username\",\"autocapitalize\":\"none\",\"autocorrect\":\"off\",\"autocomplete\":\"username\",\"required\":\"\",\"autofocus\":\"\"},domProps:{\"value\":_vm.getStoredUser()}}),_c('div',{staticClass:\"password-container\"},[_c('label',{attrs:{\"for\":\"signin-password\"}},[_vm._v(\"Password\")]),_c('RevealPassword',{scopedSlots:_vm._u([{key:\"default\",fn:function(slotProps){return [_c('input',{ref:\"password\",staticClass:\"input\",attrs:{\"id\":\"signin-password\",\"type\":slotProps.isVisible ? 'text' : 'password',\"name\":\"password\",\"autocapitalize\":\"none\",\"autocorrect\":\"off\",\"autocomplete\":\"current-password\",\"required\":\"\"}})]}}])})],1),(_vm.errorShown)?_c('div',{staticClass:\"error\"},[_vm._v(\"Authentication failed.\")]):_vm._e(),_c('button',{staticClass:\"btn\",attrs:{\"disabled\":_vm.inFlight,\"type\":\"submit\"}},[_vm._v(\"Sign in\")])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SidebarToggle.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./SidebarToggle.vue?vue&type=script&lang=js&\"","<template>\n\t<button class=\"lt\" aria-label=\"Toggle channel list\" @click=\"$store.commit('toggleSidebar')\" />\n</template>\n\n<script>\nexport default {\n\tname: \"SidebarToggle\",\n};\n</script>\n","import { render, staticRenderFns } from \"./SidebarToggle.vue?vue&type=template&id=40731500&\"\nimport script from \"./SidebarToggle.vue?vue&type=script&lang=js&\"\nexport * from \"./SidebarToggle.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('button',{staticClass:\"lt\",attrs:{\"aria-label\":\"Toggle channel list\"},on:{\"click\":function($event){return _vm.$store.commit('toggleSidebar')}}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NetworkForm.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NetworkForm.vue?vue&type=script&lang=js&\"","<template>\n\t<div id=\"connect\" class=\"window\" role=\"tabpanel\" aria-label=\"Connect\">\n\t\t<div class=\"header\">\n\t\t\t<SidebarToggle />\n\t\t</div>\n\t\t<form class=\"container\" method=\"post\" action=\"\" @submit.prevent=\"onSubmit\">\n\t\t\t<h1 class=\"title\">\n\t\t\t\t<template v-if=\"defaults.uuid\">\n\t\t\t\t\t<input v-model=\"defaults.uuid\" type=\"hidden\" name=\"uuid\" />\n\t\t\t\t\tEdit {{ defaults.name }}\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\tWelcome\n\t\t\t\t\t<template v-if=\"config.lockNetwork && $store.state.serverConfiguration.public\">\n\t\t\t\t\t\tto the {{ defaults.name }} Web Chat\n\t\t\t\t\t</template>\n\t\t\t\t</template>\n\t\t\t</h1>\n\t\t\t<template v-if=\"!config.lockNetwork\">\n\t\t\t\t<h2>Network settings</h2>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:name\">Name</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"connect:name\"\n\t\t\t\t\t\tv-model=\"defaults.name\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:host\">Server</label>\n\t\t\t\t\t<div class=\"input-wrap\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:host\"\n\t\t\t\t\t\t\tv-model=\"defaults.host\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\tname=\"host\"\n\t\t\t\t\t\t\taria-label=\"Server address\"\n\t\t\t\t\t\t\tmaxlength=\"255\"\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span id=\"connect:portseparator\">:</span>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:port\"\n\t\t\t\t\t\t\tv-model=\"defaults.port\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\tmin=\"1\"\n\t\t\t\t\t\t\tmax=\"65535\"\n\t\t\t\t\t\t\tname=\"port\"\n\t\t\t\t\t\t\taria-label=\"Server port\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:password\">Password</label>\n\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:password\"\n\t\t\t\t\t\t\tv-model=\"defaults.password\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\tplaceholder=\"Server password (optional)\"\n\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</RevealPassword>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label></label>\n\t\t\t\t\t<div class=\"input-wrap\">\n\t\t\t\t\t\t<label class=\"tls\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tv-model=\"defaults.tls\"\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\tname=\"tls\"\n\t\t\t\t\t\t\t\t:disabled=\"defaults.hasSTSPolicy\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\tUse secure connection (TLS)\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tv-if=\"defaults.hasSTSPolicy\"\n\t\t\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\t\t\taria-label=\"This network has a strict transport security policy, you will be unable to disable TLS\"\n\t\t\t\t\t\t\t\t>🔒 STS</span\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</label>\n\t\t\t\t\t\t<label class=\"tls\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tv-model=\"defaults.rejectUnauthorized\"\n\t\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\t\tname=\"rejectUnauthorized\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\tOnly allow trusted certificates\n\t\t\t\t\t\t</label>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"config.lockNetwork && !$store.state.serverConfiguration.public\">\n\t\t\t\t<h2>Network settings</h2>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:name\">Name</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"connect:name\"\n\t\t\t\t\t\tv-model=\"defaults.name\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:password\">Password</label>\n\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:password\"\n\t\t\t\t\t\t\tv-model=\"defaults.password\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\tplaceholder=\"Server password (optional)\"\n\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</RevealPassword>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<h2></h2>\n\t\t\t<div class=\"connect-row\">\n\t\t\t\t<label for=\"connect:nick\">Nickname</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"connect:nick\"\n\t\t\t\t\tv-model=\"defaults.nick\"\n\t\t\t\t\tclass=\"input nick\"\n\t\t\t\t\tname=\"nick\"\n\t\t\t\t\tpattern=\"[^\\s:!@]+\"\n\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\trequired\n\t\t\t\t\t@input=\"onNickChanged\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<template v-if=\"!config.useHexIp\">\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:username\">Username</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"connect:username\"\n\t\t\t\t\t\tref=\"usernameInput\"\n\t\t\t\t\t\tv-model=\"defaults.username\"\n\t\t\t\t\t\tclass=\"input username\"\n\t\t\t\t\t\tname=\"username\"\n\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<!--div class=\"connect-row\">\n\t\t\t\t<label for=\"connect:realname\">Real name</label>\n\t\t\t\t<input\n\t\t\t\t\tid=\"connect:realname\"\n\t\t\t\t\tv-model=\"defaults.realname\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tname=\"realname\"\n\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t/>\n\t\t\t</div-->\n\t\t\t<template v-if=\"defaults.uuid && !$store.state.serverConfiguration.public\">\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:commands\">\n\t\t\t\t\t\tCommands\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"tooltipped tooltipped-ne tooltipped-no-delay\"\n\t\t\t\t\t\t\taria-label=\"One /command per line.\nEach command will be executed in\nthe server tab on new connection\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</label>\n\t\t\t\t\t<textarea\n\t\t\t\t\t\tid=\"connect:commands\"\n\t\t\t\t\t\tref=\"commandsInput\"\n\t\t\t\t\t\t:value=\"defaults.commands ? defaults.commands.join('\\n') : ''\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tname=\"commands\"\n\t\t\t\t\t\t@input=\"resizeCommandsInput\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"!defaults.uuid\">\n\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t<label for=\"connect:channels\">Rooms</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"connect:channels\"\n\t\t\t\t\t\tv-model=\"defaults.join\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tname=\"join\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"$store.state.serverConfiguration.public\">\n\t\t\t\t<template v-if=\"config.lockNetwork\">\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label></label>\n\t\t\t\t\t\t<div class=\"input-wrap\">\n\t\t\t\t\t\t\t<label class=\"tls\">\n\t\t\t\t\t\t\t\t<input v-model=\"displayPasswordField\" type=\"checkbox\" />\n\t\t\t\t\t\t\t\tI am already registered\n\t\t\t\t\t\t\t</label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-if=\"displayPasswordField\" class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:password\">Password</label>\n\t\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:password\"\n\t\t\t\t\t\t\t\tref=\"publicPassword\"\n\t\t\t\t\t\t\t\tv-model=\"defaults.password\"\n\t\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\t\tplaceholder=\"Your Passwort Goes here\"\n\t\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</RevealPassword>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t\t<template v-else>\n\t\t\t\t<h2 id=\"label-auth\">Authentication</h2>\n\t\t\t\t<div class=\"connect-row connect-auth\" role=\"group\" aria-labelledby=\"label-auth\">\n\t\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"!defaults.sasl\"\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"sasl\"\n\t\t\t\t\t\t\tvalue=\"\"\n\t\t\t\t\t\t\t@change=\"setSaslAuth('')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tNo authentication\n\t\t\t\t\t</label>\n\t\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"defaults.sasl === 'plain'\"\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"sasl\"\n\t\t\t\t\t\t\tvalue=\"plain\"\n\t\t\t\t\t\t\t@change=\"setSaslAuth('plain')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tUsername + password (SASL PLAIN)\n\t\t\t\t\t</label>\n\t\t\t\t\t<label\n\t\t\t\t\t\tv-if=\"!$store.state.serverConfiguration.public && defaults.tls\"\n\t\t\t\t\t\tclass=\"opt\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"defaults.sasl === 'external'\"\n\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\tname=\"sasl\"\n\t\t\t\t\t\t\tvalue=\"external\"\n\t\t\t\t\t\t\t@change=\"setSaslAuth('external')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tClient certificate (SASL EXTERNAL)\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\n\t\t\t\t<template v-if=\"defaults.sasl === 'plain'\">\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:username\">Account</label>\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"connect:saslAccount\"\n\t\t\t\t\t\t\tv-model=\"defaults.saslAccount\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\tname=\"saslAccount\"\n\t\t\t\t\t\t\tmaxlength=\"100\"\n\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"connect-row\">\n\t\t\t\t\t\t<label for=\"connect:password\">Password</label>\n\t\t\t\t\t\t<RevealPassword\n\t\t\t\t\t\t\tv-slot:default=\"slotProps\"\n\t\t\t\t\t\t\tclass=\"input-wrap password-container\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\tid=\"connect:saslPassword\"\n\t\t\t\t\t\t\t\tv-model=\"defaults.saslPassword\"\n\t\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\t\tname=\"saslPassword\"\n\t\t\t\t\t\t\t\tmaxlength=\"300\"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</RevealPassword>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t\t<div v-else-if=\"defaults.sasl === 'external'\" class=\"connect-sasl-external\">\n\t\t\t\t\t<p>The Lounge automatically generates and manages the client certificate.</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tOn the IRC server, you will need to tell the services to attach the\n\t\t\t\t\t\tcertificate fingerprint (certfp) to your account, for example:\n\t\t\t\t\t</p>\n\t\t\t\t\t<pre><code>/msg NickServ CERT ADD</code></pre>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<div>\n\t\t\t\t<button type=\"submit\" class=\"btn\" :disabled=\"disabled ? true : false\">\n\t\t\t\t\t<template v-if=\"defaults.uuid\">Save network</template>\n\t\t\t\t\t<template v-else>Connect</template>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</form>\n\t</div>\n</template>\n\n<style>\n#connect .connect-auth {\n\tdisplay: block;\n\tmargin-bottom: 10px;\n}\n\n#connect .connect-auth .opt {\n\tdisplay: block;\n\twidth: 100%;\n}\n\n#connect .connect-auth input {\n\tmargin: 3px 10px 0 0;\n}\n\n#connect .connect-sasl-external {\n\tpadding: 10px;\n\tborder-radius: 2px;\n\tbackground-color: #d9edf7;\n\tcolor: #31708f;\n}\n\n#connect .connect-sasl-external pre {\n\tmargin: 0;\n\tuser-select: text;\n}\n</style>\n\n<script>\nimport RevealPassword from \"./RevealPassword.vue\";\nimport SidebarToggle from \"./SidebarToggle.vue\";\n\nexport default {\n\tname: \"NetworkForm\",\n\tcomponents: {\n\t\tRevealPassword,\n\t\tSidebarToggle,\n\t},\n\tprops: {\n\t\thandleSubmit: Function,\n\t\tdefaults: Object,\n\t\tdisabled: Boolean,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tconfig: this.$store.state.serverConfiguration,\n\t\t\tpreviousUsername: this.defaults.username,\n\t\t\tdisplayPasswordField: false,\n\t\t};\n\t},\n\twatch: {\n\t\tdisplayPasswordField(value) {\n\t\t\tif (value) {\n\t\t\t\tthis.$nextTick(() => this.$refs.publicPassword.focus());\n\t\t\t}\n\t\t},\n\t\t\"defaults.commands\"() {\n\t\t\tthis.$nextTick(this.resizeCommandsInput);\n\t\t},\n\t\t\"defaults.tls\"(isSecureChecked) {\n\t\t\tconst ports = [6667, 6697];\n\t\t\tconst newPort = isSecureChecked ? 0 : 1;\n\n\t\t\t// If you disable TLS and current port is 6697,\n\t\t\t// set it to 6667, and vice versa\n\t\t\tif (this.defaults.port === ports[newPort]) {\n\t\t\t\tthis.defaults.port = ports[1 - newPort];\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\tsetSaslAuth(type) {\n\t\t\tthis.defaults.sasl = type;\n\t\t},\n\t\tonNickChanged(event) {\n\t\t\t// Username input is not available when useHexIp is set\n\t\t\tif (!this.$refs.usernameInput) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t!this.$refs.usernameInput.value ||\n\t\t\t\tthis.$refs.usernameInput.value === this.previousUsername\n\t\t\t) {\n\t\t\t\tthis.$refs.usernameInput.value = event.target.value;\n\t\t\t}\n\n\t\t\tthis.previousUsername = event.target.value;\n\t\t},\n\t\tonSubmit(event) {\n\t\t\tconst formData = new FormData(event.target);\n\t\t\tconst data = {};\n\n\t\t\tfor (const item of formData.entries()) {\n\t\t\t\tdata[item[0]] = item[1];\n\t\t\t}\n\n\t\t\tthis.handleSubmit(data);\n\t\t},\n\t\tresizeCommandsInput() {\n\t\t\tif (!this.$refs.commandsInput) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Reset height first so it can down size\n\t\t\tthis.$refs.commandsInput.style.height = \"\";\n\n\t\t\t// 2 pixels to account for the border\n\t\t\tthis.$refs.commandsInput.style.height =\n\t\t\t\tMath.ceil(this.$refs.commandsInput.scrollHeight + 2) + \"px\";\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./NetworkForm.vue?vue&type=template&id=23be80a2&\"\nimport script from \"./NetworkForm.vue?vue&type=script&lang=js&\"\nexport * from \"./NetworkForm.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NetworkForm.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"window\",attrs:{\"id\":\"connect\",\"role\":\"tabpanel\",\"aria-label\":\"Connect\"}},[_c('div',{staticClass:\"header\"},[_c('SidebarToggle')],1),_c('form',{staticClass:\"container\",attrs:{\"method\":\"post\",\"action\":\"\"},on:{\"submit\":function($event){$event.preventDefault();return _vm.onSubmit($event)}}},[_c('h1',{staticClass:\"title\"},[(_vm.defaults.uuid)?[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.uuid),expression:\"defaults.uuid\"}],attrs:{\"type\":\"hidden\",\"name\":\"uuid\"},domProps:{\"value\":(_vm.defaults.uuid)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.defaults, \"uuid\", $event.target.value)}}}),_vm._v(\"\\n\\t\\t\\t\\t\\tEdit \"+_vm._s(_vm.defaults.name)+\"\\n\\t\\t\\t\\t\")]:[_vm._v(\"\\n\\t\\t\\t\\t\\tWelcome\\n\\t\\t\\t\\t\\t\"),(_vm.config.lockNetwork && _vm.$store.state.serverConfiguration.public)?[_vm._v(\"\\n\\t\\t\\t\\t\\t\\tto the \"+_vm._s(_vm.defaults.name)+\" Web Chat\\n\\t\\t\\t\\t\\t\")]:_vm._e()]],2),(!_vm.config.lockNetwork)?[_c('h2',[_vm._v(\"Network settings\")]),_c('div',{staticClass:\"connect-row\"},[_c('label',{attrs:{\"for\":\"connect:name\"}},[_vm._v(\"Name\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.name),expression:\"defaults.name\"}],staticClass:\"input\",attrs:{\"id\":\"connect:name\",\"name\":\"name\",\"maxlength\":\"100\"},domProps:{\"value\":(_vm.defaults.name)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.defaults, \"name\", $event.target.value)}}})]),_c('div',{staticClass:\"connect-row\"},[_c('label',{attrs:{\"for\":\"connect:host\"}},[_vm._v(\"Server\")]),_c('div',{staticClass:\"input-wrap\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.host),expression:\"defaults.host\"}],staticClass:\"input\",attrs:{\"id\":\"connect:host\",\"name\":\"host\",\"aria-label\":\"Server address\",\"maxlength\":\"255\",\"required\":\"\"},domProps:{\"value\":(_vm.defaults.host)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.defaults, \"host\", $event.target.value)}}}),_c('span',{attrs:{\"id\":\"connect:portseparator\"}},[_vm._v(\":\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.port),expression:\"defaults.port\"}],staticClass:\"input\",attrs:{\"id\":\"connect:port\",\"type\":\"number\",\"min\":\"1\",\"max\":\"65535\",\"name\":\"port\",\"aria-label\":\"Server port\"},domProps:{\"value\":(_vm.defaults.port)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.defaults, \"port\", $event.target.value)}}})])]),_c('div',{staticClass:\"connect-row\"},[_c('label',{attrs:{\"for\":\"connect:password\"}},[_vm._v(\"Password\")]),_c('RevealPassword',{staticClass:\"input-wrap password-container\",scopedSlots:_vm._u([{key:\"default\",fn:function(slotProps){return [((slotProps.isVisible ? 'text' : 'password')==='checkbox')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.password),expression:\"defaults.password\"}],staticClass:\"input\",attrs:{\"id\":\"connect:password\",\"placeholder\":\"Server password (optional)\",\"name\":\"password\",\"maxlength\":\"300\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.defaults.password)?_vm._i(_vm.defaults.password,null)>-1:(_vm.defaults.password)},on:{\"change\":function($event){var $$a=_vm.defaults.password,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.defaults, \"password\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.defaults, \"password\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.defaults, \"password\", $$c)}}}}):((slotProps.isVisible ? 'text' : 'password')==='radio')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.password),expression:\"defaults.password\"}],staticClass:\"input\",attrs:{\"id\":\"connect:password\",\"placeholder\":\"Server password (optional)\",\"name\":\"password\",\"maxlength\":\"300\",\"type\":\"radio\"},domProps:{\"checked\":_vm._q(_vm.defaults.password,null)},on:{\"change\":function($event){return _vm.$set(_vm.defaults, \"password\", null)}}}):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.password),expression:\"defaults.password\"}],staticClass:\"input\",attrs:{\"id\":\"connect:password\",\"placeholder\":\"Server password (optional)\",\"name\":\"password\",\"maxlength\":\"300\",\"type\":slotProps.isVisible ? 'text' : 'password'},domProps:{\"value\":(_vm.defaults.password)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.defaults, \"password\", $event.target.value)}}})]}}],null,false,2649577346)})],1),_c('div',{staticClass:\"connect-row\"},[_c('label'),_c('div',{staticClass:\"input-wrap\"},[_c('label',{staticClass:\"tls\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.tls),expression:\"defaults.tls\"}],attrs:{\"type\":\"checkbox\",\"name\":\"tls\",\"disabled\":_vm.defaults.hasSTSPolicy},domProps:{\"checked\":Array.isArray(_vm.defaults.tls)?_vm._i(_vm.defaults.tls,null)>-1:(_vm.defaults.tls)},on:{\"change\":function($event){var $$a=_vm.defaults.tls,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.defaults, \"tls\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.defaults, \"tls\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.defaults, \"tls\", $$c)}}}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\tUse secure connection (TLS)\\n\\t\\t\\t\\t\\t\\t\\t\"),(_vm.defaults.hasSTSPolicy)?_c('span',{staticClass:\"tooltipped tooltipped-n tooltipped-no-delay\",attrs:{\"aria-label\":\"This network has a strict transport security policy, you will be unable to disable TLS\"}},[_vm._v(\"🔒 STS\")]):_vm._e()]),_c('label',{staticClass:\"tls\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.rejectUnauthorized),expression:\"defaults.rejectUnauthorized\"}],attrs:{\"type\":\"checkbox\",\"name\":\"rejectUnauthorized\"},domProps:{\"checked\":Array.isArray(_vm.defaults.rejectUnauthorized)?_vm._i(_vm.defaults.rejectUnauthorized,null)>-1:(_vm.defaults.rejectUnauthorized)},on:{\"change\":function($event){var $$a=_vm.defaults.rejectUnauthorized,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.defaults, \"rejectUnauthorized\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.defaults, \"rejectUnauthorized\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.defaults, \"rejectUnauthorized\", $$c)}}}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\tOnly allow trusted certificates\\n\\t\\t\\t\\t\\t\\t\")])])])]:(_vm.config.lockNetwork && !_vm.$store.state.serverConfiguration.public)?[_c('h2',[_vm._v(\"Network settings\")]),_c('div',{staticClass:\"connect-row\"},[_c('label',{attrs:{\"for\":\"connect:name\"}},[_vm._v(\"Name\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.name),expression:\"defaults.name\"}],staticClass:\"input\",attrs:{\"id\":\"connect:name\",\"name\":\"name\",\"maxlength\":\"100\"},domProps:{\"value\":(_vm.defaults.name)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.defaults, \"name\", $event.target.value)}}})]),_c('div',{staticClass:\"connect-row\"},[_c('label',{attrs:{\"for\":\"connect:password\"}},[_vm._v(\"Password\")]),_c('RevealPassword',{staticClass:\"input-wrap password-container\",scopedSlots:_vm._u([{key:\"default\",fn:function(slotProps){return [((slotProps.isVisible ? 'text' : 'password')==='checkbox')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.password),expression:\"defaults.password\"}],staticClass:\"input\",attrs:{\"id\":\"connect:password\",\"placeholder\":\"Server password (optional)\",\"name\":\"password\",\"maxlength\":\"300\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.defaults.password)?_vm._i(_vm.defaults.password,null)>-1:(_vm.defaults.password)},on:{\"change\":function($event){var $$a=_vm.defaults.password,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.defaults, \"password\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.defaults, \"password\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.defaults, \"password\", $$c)}}}}):((slotProps.isVisible ? 'text' : 'password')==='radio')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.password),expression:\"defaults.password\"}],staticClass:\"input\",attrs:{\"id\":\"connect:password\",\"placeholder\":\"Server password (optional)\",\"name\":\"password\",\"maxlength\":\"300\",\"type\":\"radio\"},domProps:{\"checked\":_vm._q(_vm.defaults.password,null)},on:{\"change\":function($event){return _vm.$set(_vm.defaults, \"password\", null)}}}):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.password),expression:\"defaults.password\"}],staticClass:\"input\",attrs:{\"id\":\"connect:password\",\"placeholder\":\"Server password (optional)\",\"name\":\"password\",\"maxlength\":\"300\",\"type\":slotProps.isVisible ? 'text' : 'password'},domProps:{\"value\":(_vm.defaults.password)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.defaults, \"password\", $event.target.value)}}})]}}])})],1)]:_vm._e(),_c('h2'),_c('div',{staticClass:\"connect-row\"},[_c('label',{attrs:{\"for\":\"connect:nick\"}},[_vm._v(\"Nickname\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.nick),expression:\"defaults.nick\"}],staticClass:\"input nick\",attrs:{\"id\":\"connect:nick\",\"name\":\"nick\",\"pattern\":\"[^\\\\s:!@]+\",\"maxlength\":\"100\",\"required\":\"\"},domProps:{\"value\":(_vm.defaults.nick)},on:{\"input\":[function($event){if($event.target.composing){ return; }_vm.$set(_vm.defaults, \"nick\", $event.target.value)},_vm.onNickChanged]}})]),(!_vm.config.useHexIp)?[_c('div',{staticClass:\"connect-row\"},[_c('label',{attrs:{\"for\":\"connect:username\"}},[_vm._v(\"Username\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.username),expression:\"defaults.username\"}],ref:\"usernameInput\",staticClass:\"input username\",attrs:{\"id\":\"connect:username\",\"name\":\"username\",\"maxlength\":\"100\"},domProps:{\"value\":(_vm.defaults.username)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.defaults, \"username\", $event.target.value)}}})])]:_vm._e(),(_vm.defaults.uuid && !_vm.$store.state.serverConfiguration.public)?[_c('div',{staticClass:\"connect-row\"},[_vm._m(0),_c('textarea',{ref:\"commandsInput\",staticClass:\"input\",attrs:{\"id\":\"connect:commands\",\"name\":\"commands\"},domProps:{\"value\":_vm.defaults.commands ? _vm.defaults.commands.join('\\n') : ''},on:{\"input\":_vm.resizeCommandsInput}})])]:(!_vm.defaults.uuid)?[_c('div',{staticClass:\"connect-row\"},[_c('label',{attrs:{\"for\":\"connect:channels\"}},[_vm._v(\"Rooms\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.join),expression:\"defaults.join\"}],staticClass:\"input\",attrs:{\"id\":\"connect:channels\",\"name\":\"join\"},domProps:{\"value\":(_vm.defaults.join)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.defaults, \"join\", $event.target.value)}}})])]:_vm._e(),(_vm.$store.state.serverConfiguration.public)?[(_vm.config.lockNetwork)?[_c('div',{staticClass:\"connect-row\"},[_c('label'),_c('div',{staticClass:\"input-wrap\"},[_c('label',{staticClass:\"tls\"},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.displayPasswordField),expression:\"displayPasswordField\"}],attrs:{\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.displayPasswordField)?_vm._i(_vm.displayPasswordField,null)>-1:(_vm.displayPasswordField)},on:{\"change\":function($event){var $$a=_vm.displayPasswordField,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.displayPasswordField=$$a.concat([$$v]))}else{$$i>-1&&(_vm.displayPasswordField=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.displayPasswordField=$$c}}}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\t\\tI am already registered\\n\\t\\t\\t\\t\\t\\t\\t\")])])]),(_vm.displayPasswordField)?_c('div',{staticClass:\"connect-row\"},[_c('label',{attrs:{\"for\":\"connect:password\"}},[_vm._v(\"Password\")]),_c('RevealPassword',{staticClass:\"input-wrap password-container\",scopedSlots:_vm._u([{key:\"default\",fn:function(slotProps){return [((slotProps.isVisible ? 'text' : 'password')==='checkbox')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.password),expression:\"defaults.password\"}],ref:\"publicPassword\",staticClass:\"input\",attrs:{\"id\":\"connect:password\",\"placeholder\":\"Your Passwort Goes here\",\"name\":\"password\",\"maxlength\":\"300\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.defaults.password)?_vm._i(_vm.defaults.password,null)>-1:(_vm.defaults.password)},on:{\"change\":function($event){var $$a=_vm.defaults.password,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.defaults, \"password\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.defaults, \"password\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.defaults, \"password\", $$c)}}}}):((slotProps.isVisible ? 'text' : 'password')==='radio')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.password),expression:\"defaults.password\"}],ref:\"publicPassword\",staticClass:\"input\",attrs:{\"id\":\"connect:password\",\"placeholder\":\"Your Passwort Goes here\",\"name\":\"password\",\"maxlength\":\"300\",\"type\":\"radio\"},domProps:{\"checked\":_vm._q(_vm.defaults.password,null)},on:{\"change\":function($event){return _vm.$set(_vm.defaults, \"password\", null)}}}):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.password),expression:\"defaults.password\"}],ref:\"publicPassword\",staticClass:\"input\",attrs:{\"id\":\"connect:password\",\"placeholder\":\"Your Passwort Goes here\",\"name\":\"password\",\"maxlength\":\"300\",\"type\":slotProps.isVisible ? 'text' : 'password'},domProps:{\"value\":(_vm.defaults.password)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.defaults, \"password\", $event.target.value)}}})]}}],null,false,1931221684)})],1):_vm._e()]:_vm._e()]:[_c('h2',{attrs:{\"id\":\"label-auth\"}},[_vm._v(\"Authentication\")]),_c('div',{staticClass:\"connect-row connect-auth\",attrs:{\"role\":\"group\",\"aria-labelledby\":\"label-auth\"}},[_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"radio\",\"name\":\"sasl\",\"value\":\"\"},domProps:{\"checked\":!_vm.defaults.sasl},on:{\"change\":function($event){return _vm.setSaslAuth('')}}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\tNo authentication\\n\\t\\t\\t\\t\\t\")]),_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"radio\",\"name\":\"sasl\",\"value\":\"plain\"},domProps:{\"checked\":_vm.defaults.sasl === 'plain'},on:{\"change\":function($event){return _vm.setSaslAuth('plain')}}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\tUsername + password (SASL PLAIN)\\n\\t\\t\\t\\t\\t\")]),(!_vm.$store.state.serverConfiguration.public && _vm.defaults.tls)?_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"radio\",\"name\":\"sasl\",\"value\":\"external\"},domProps:{\"checked\":_vm.defaults.sasl === 'external'},on:{\"change\":function($event){return _vm.setSaslAuth('external')}}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\tClient certificate (SASL EXTERNAL)\\n\\t\\t\\t\\t\\t\")]):_vm._e()]),(_vm.defaults.sasl === 'plain')?[_c('div',{staticClass:\"connect-row\"},[_c('label',{attrs:{\"for\":\"connect:username\"}},[_vm._v(\"Account\")]),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.saslAccount),expression:\"defaults.saslAccount\"}],staticClass:\"input\",attrs:{\"id\":\"connect:saslAccount\",\"name\":\"saslAccount\",\"maxlength\":\"100\",\"required\":\"\"},domProps:{\"value\":(_vm.defaults.saslAccount)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.defaults, \"saslAccount\", $event.target.value)}}})]),_c('div',{staticClass:\"connect-row\"},[_c('label',{attrs:{\"for\":\"connect:password\"}},[_vm._v(\"Password\")]),_c('RevealPassword',{staticClass:\"input-wrap password-container\",scopedSlots:_vm._u([{key:\"default\",fn:function(slotProps){return [((slotProps.isVisible ? 'text' : 'password')==='checkbox')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.saslPassword),expression:\"defaults.saslPassword\"}],staticClass:\"input\",attrs:{\"id\":\"connect:saslPassword\",\"name\":\"saslPassword\",\"maxlength\":\"300\",\"required\":\"\",\"type\":\"checkbox\"},domProps:{\"checked\":Array.isArray(_vm.defaults.saslPassword)?_vm._i(_vm.defaults.saslPassword,null)>-1:(_vm.defaults.saslPassword)},on:{\"change\":function($event){var $$a=_vm.defaults.saslPassword,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.$set(_vm.defaults, \"saslPassword\", $$a.concat([$$v])))}else{$$i>-1&&(_vm.$set(_vm.defaults, \"saslPassword\", $$a.slice(0,$$i).concat($$a.slice($$i+1))))}}else{_vm.$set(_vm.defaults, \"saslPassword\", $$c)}}}}):((slotProps.isVisible ? 'text' : 'password')==='radio')?_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.saslPassword),expression:\"defaults.saslPassword\"}],staticClass:\"input\",attrs:{\"id\":\"connect:saslPassword\",\"name\":\"saslPassword\",\"maxlength\":\"300\",\"required\":\"\",\"type\":\"radio\"},domProps:{\"checked\":_vm._q(_vm.defaults.saslPassword,null)},on:{\"change\":function($event){return _vm.$set(_vm.defaults, \"saslPassword\", null)}}}):_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.defaults.saslPassword),expression:\"defaults.saslPassword\"}],staticClass:\"input\",attrs:{\"id\":\"connect:saslPassword\",\"name\":\"saslPassword\",\"maxlength\":\"300\",\"required\":\"\",\"type\":slotProps.isVisible ? 'text' : 'password'},domProps:{\"value\":(_vm.defaults.saslPassword)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.$set(_vm.defaults, \"saslPassword\", $event.target.value)}}})]}}],null,false,3144405648)})],1)]:(_vm.defaults.sasl === 'external')?_c('div',{staticClass:\"connect-sasl-external\"},[_c('p',[_vm._v(\"The Lounge automatically generates and manages the client certificate.\")]),_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\t\\tOn the IRC server, you will need to tell the services to attach the\\n\\t\\t\\t\\t\\t\\tcertificate fingerprint (certfp) to your account, for example:\\n\\t\\t\\t\\t\\t\")]),_vm._m(1)]):_vm._e()],_c('div',[_c('button',{staticClass:\"btn\",attrs:{\"type\":\"submit\",\"disabled\":_vm.disabled ? true : false}},[(_vm.defaults.uuid)?[_vm._v(\"Save network\")]:[_vm._v(\"Connect\")]],2)])],2)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('label',{attrs:{\"for\":\"connect:commands\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\tCommands\\n\\t\\t\\t\\t\\t\\t\"),_c('span',{staticClass:\"tooltipped tooltipped-ne tooltipped-no-delay\",attrs:{\"aria-label\":\"One /command per line.\\nEach command will be executed in\\nthe server tab on new connection\"}},[_c('button',{staticClass:\"extra-help\"})])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('pre',[_c('code',[_vm._v(\"/msg NickServ CERT ADD\")])])}]\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Connect.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Connect.vue?vue&type=script&lang=js&\"","<template>\n\t<NetworkForm :handle-submit=\"handleSubmit\" :defaults=\"defaults\" :disabled=\"disabled\" />\n</template>\n\n<script>\nimport socket from \"../../js/socket\";\nimport NetworkForm from \"../NetworkForm.vue\";\n\nexport default {\n\tname: \"Connect\",\n\tcomponents: {\n\t\tNetworkForm,\n\t},\n\tprops: {\n\t\tqueryParams: Object,\n\t},\n\tdata() {\n\t\t// Merge settings from url params into default settings\n\t\tconst defaults = Object.assign(\n\t\t\t{},\n\t\t\tthis.$store.state.serverConfiguration.defaults,\n\t\t\tthis.parseOverrideParams(this.queryParams)\n\t\t);\n\t\treturn {\n\t\t\tdisabled: false,\n\t\t\tdefaults,\n\t\t};\n\t},\n\tmethods: {\n\t\thandleSubmit(data) {\n\t\t\tthis.disabled = true;\n\t\t\tsocket.emit(\"network:new\", data);\n\t\t},\n\t\tparseOverrideParams(params) {\n\t\t\tconst parsedParams = {};\n\n\t\t\tfor (let key of Object.keys(params)) {\n\t\t\t\tlet value = params[key];\n\n\t\t\t\t// Param can contain multiple values in an array if its supplied more than once\n\t\t\t\tif (Array.isArray(value)) {\n\t\t\t\t\tvalue = value[0];\n\t\t\t\t}\n\n\t\t\t\t// Support `channels` as a compatibility alias with other clients\n\t\t\t\tif (key === \"channels\") {\n\t\t\t\t\tkey = \"join\";\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t!Object.prototype.hasOwnProperty.call(\n\t\t\t\t\t\tthis.$store.state.serverConfiguration.defaults,\n\t\t\t\t\t\tkey\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// When the network is locked, URL overrides should not affect disabled fields\n\t\t\t\tif (\n\t\t\t\t\tthis.$store.state.serverConfiguration.lockNetwork &&\n\t\t\t\t\t[\"name\", \"host\", \"port\", \"tls\", \"rejectUnauthorized\"].includes(key)\n\t\t\t\t) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (key === \"join\") {\n\t\t\t\t\tvalue = value\n\t\t\t\t\t\t.split(\",\")\n\t\t\t\t\t\t.map((chan) => {\n\t\t\t\t\t\t\tif (!chan.match(/^[#&!+]/)) {\n\t\t\t\t\t\t\t\treturn `#${chan}`;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn chan;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join(\", \");\n\t\t\t\t}\n\n\t\t\t\t// Override server provided defaults with parameters passed in the URL if they match the data type\n\t\t\t\tswitch (typeof this.$store.state.serverConfiguration.defaults[key]) {\n\t\t\t\t\tcase \"boolean\":\n\t\t\t\t\t\tif (value === \"0\" || value === \"false\") {\n\t\t\t\t\t\t\tparsedParams[key] = false;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tparsedParams[key] = !!value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\tparsedParams[key] = Number(value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"string\":\n\t\t\t\t\t\tparsedParams[key] = String(value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn parsedParams;\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./Connect.vue?vue&type=template&id=46574b3b&\"\nimport script from \"./Connect.vue?vue&type=script&lang=js&\"\nexport * from \"./Connect.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('NetworkForm',{attrs:{\"handle-submit\":_vm.handleSubmit,\"defaults\":_vm.defaults,\"disabled\":_vm.disabled}})}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Session.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Session.vue?vue&type=script&lang=js&\"","<template>\n\t<div class=\"session-item\">\n\t\t<div class=\"session-item-info\">\n\t\t\t<strong>{{ session.agent }}</strong>\n\n\t\t\t<a :href=\"'https://ipinfo.io/' + session.ip\" target=\"_blank\" rel=\"noopener\">{{\n\t\t\t\tsession.ip\n\t\t\t}}</a>\n\n\t\t\t<p v-if=\"session.active > 1\" class=\"session-usage\">\n\t\t\t\tActive in {{ session.active }} browsers\n\t\t\t</p>\n\t\t\t<p v-else-if=\"!session.current && !session.active\" class=\"session-usage\">\n\t\t\t\tLast used on <time>{{ lastUse }}</time>\n\t\t\t</p>\n\t\t</div>\n\t\t<div class=\"session-item-btn\">\n\t\t\t<button class=\"btn\" @click.prevent=\"signOut\">\n\t\t\t\t<template v-if=\"session.current\">Sign out</template>\n\t\t\t\t<template v-else>Revoke</template>\n\t\t\t</button>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n.session-list .session-item {\n\tdisplay: flex;\n\tfont-size: 14px;\n}\n\n.session-list .session-item-info {\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex-grow: 1;\n}\n\n.session-list .session-item-btn {\n\tflex-shrink: 0;\n}\n\n.session-list .session-usage {\n\tfont-style: italic;\n\tcolor: var(--body-color-muted);\n}\n</style>\n\n<script>\nimport localetime from \"../js/helpers/localetime\";\nimport Auth from \"../js/auth\";\nimport socket from \"../js/socket\";\n\nexport default {\n\tname: \"Session\",\n\tprops: {\n\t\tsession: Object,\n\t},\n\tcomputed: {\n\t\tlastUse() {\n\t\t\treturn localetime(this.session.lastUse);\n\t\t},\n\t},\n\tmethods: {\n\t\tsignOut() {\n\t\t\tif (!this.session.current) {\n\t\t\t\tsocket.emit(\"sign-out\", this.session.token);\n\t\t\t} else {\n\t\t\t\tsocket.emit(\"sign-out\");\n\t\t\t\tAuth.signout();\n\t\t\t}\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./Session.vue?vue&type=template&id=afec1f10&\"\nimport script from \"./Session.vue?vue&type=script&lang=js&\"\nexport * from \"./Session.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Session.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"session-item\"},[_c('div',{staticClass:\"session-item-info\"},[_c('strong',[_vm._v(_vm._s(_vm.session.agent))]),_c('a',{attrs:{\"href\":'https://ipinfo.io/' + _vm.session.ip,\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(_vm._s(_vm.session.ip))]),(_vm.session.active > 1)?_c('p',{staticClass:\"session-usage\"},[_vm._v(\"\\n\\t\\t\\tActive in \"+_vm._s(_vm.session.active)+\" browsers\\n\\t\\t\")]):(!_vm.session.current && !_vm.session.active)?_c('p',{staticClass:\"session-usage\"},[_vm._v(\"\\n\\t\\t\\tLast used on \"),_c('time',[_vm._v(_vm._s(_vm.lastUse))])]):_vm._e()]),_c('div',{staticClass:\"session-item-btn\"},[_c('button',{staticClass:\"btn\",on:{\"click\":function($event){$event.preventDefault();return _vm.signOut($event)}}},[(_vm.session.current)?[_vm._v(\"Sign out\")]:[_vm._v(\"Revoke\")]],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<div id=\"settings\" class=\"window\" role=\"tabpanel\" aria-label=\"Settings\">\n\t\t<div class=\"header\">\n\t\t\t<SidebarToggle />\n\t\t</div>\n\t\t<form ref=\"settingsForm\" class=\"container\" @change=\"onChange\" @submit.prevent>\n\t\t\t<h1 class=\"title\">Settings</h1>\n\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.advanced\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"advanced\"\n\t\t\t\t\t/>\n\t\t\t\t\tAdvanced settings\n\t\t\t\t</label>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"canRegisterProtocol || hasInstallPromptEvent\">\n\t\t\t\t<h2>Native app</h2>\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"hasInstallPromptEvent\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"btn\"\n\t\t\t\t\t@click.prevent=\"nativeInstallPrompt\"\n\t\t\t\t>\n\t\t\t\t\tAdd The Lounge to Home screen\n\t\t\t\t</button>\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"canRegisterProtocol\"\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclass=\"btn\"\n\t\t\t\t\t@click.prevent=\"registerProtocol\"\n\t\t\t\t>\n\t\t\t\t\tOpen irc:// URLs with The Lounge\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"!$store.state.serverConfiguration.public && $store.state.settings.advanced\">\n\t\t\t\t<h2>Settings synchronisation</h2>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.syncSettings\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"syncSettings\"\n\t\t\t\t\t/>\n\t\t\t\t\tSynchronize settings with other clients\n\t\t\t\t</label>\n\t\t\t\t<template v-if=\"!$store.state.settings.syncSettings\">\n\t\t\t\t\t<div v-if=\"$store.state.serverHasSettings\" class=\"settings-sync-panel\">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<strong>Warning:</strong> Checking this box will override the settings\n\t\t\t\t\t\t\tof this client with those stored on the server.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\tUse the button below to enable synchronization, and override any\n\t\t\t\t\t\t\tsettings already synced to the server.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<button type=\"button\" class=\"btn btn-small\" @click=\"onForceSyncClick\">\n\t\t\t\t\t\t\tSync settings and enable\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-else class=\"settings-sync-panel\">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t<strong>Warning:</strong> No settings have been synced before. Enabling\n\t\t\t\t\t\t\tthis will sync all settings of this client as the base for other\n\t\t\t\t\t\t\tclients.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</template>\n\t\t\t</div>\n\n\t\t\t<h2>Messages</h2>\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input :checked=\"$store.state.settings.motd\" type=\"checkbox\" name=\"motd\" />\n\t\t\t\t\tShow <abbr title=\"Message Of The Day\">MOTD</abbr>\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.showSeconds\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"showSeconds\"\n\t\t\t\t\t/>\n\t\t\t\t\tShow seconds in timestamp\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.use12hClock\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"use12hClock\"\n\t\t\t\t\t/>\n\t\t\t\t\tShow 12-hour timestamps\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<div v-if=\"!$store.state.serverConfiguration.public && $store.state.settings.advanced\">\n\t\t\t\t<h2>Automatic away message</h2>\n\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<label for=\"awayMessage\" class=\"sr-only\">Automatic away message</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"awayMessage\"\n\t\t\t\t\t\t:value=\"$store.state.settings.awayMessage\"\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tname=\"awayMessage\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tplaceholder=\"Away message if The Lounge is not open\"\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<h2 id=\"label-status-messages\">\n\t\t\t\tStatus messages\n\t\t\t\t<span\n\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\taria-label=\"Joins, parts, quits, kicks, nick changes, and mode changes\"\n\t\t\t\t>\n\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t</span>\n\t\t\t</h2>\n\t\t\t<div role=\"group\" aria-labelledby=\"label-status-messages\">\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.statusMessages === 'shown'\"\n\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\tname=\"statusMessages\"\n\t\t\t\t\t\tvalue=\"shown\"\n\t\t\t\t\t/>\n\t\t\t\t\tShow all status messages individually\n\t\t\t\t</label>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.statusMessages === 'condensed'\"\n\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\tname=\"statusMessages\"\n\t\t\t\t\t\tvalue=\"condensed\"\n\t\t\t\t\t/>\n\t\t\t\t\tCondense status messages together\n\t\t\t\t</label>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.statusMessages === 'hidden'\"\n\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\tname=\"statusMessages\"\n\t\t\t\t\t\tvalue=\"hidden\"\n\t\t\t\t\t/>\n\t\t\t\t\tHide all status messages\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<h2>Visual Aids</h2>\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.coloredNicks\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"coloredNicks\"\n\t\t\t\t\t/>\n\t\t\t\t\tEnable colored nicknames\n\t\t\t\t</label>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.autocomplete\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"autocomplete\"\n\t\t\t\t\t/>\n\t\t\t\t\tEnable autocomplete\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<div v-if=\"$store.state.settings.advanced\">\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<label for=\"nickPostfix\" class=\"sr-only\">\n\t\t\t\t\t\tNick autocomplete postfix (for example a comma)\n\t\t\t\t\t</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"nickPostfix\"\n\t\t\t\t\t\t:value=\"$store.state.settings.nickPostfix\"\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tname=\"nickPostfix\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tplaceholder=\"Nick autocomplete postfix (e.g. ', ')\"\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\t\t\t</div>\n\n\t\t\t<h2>Theme</h2>\n\t\t\t<div>\n\t\t\t\t<label for=\"theme-select\" class=\"sr-only\">Theme</label>\n\t\t\t\t<select\n\t\t\t\t\tid=\"theme-select\"\n\t\t\t\t\t:value=\"$store.state.settings.theme\"\n\t\t\t\t\tname=\"theme\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t>\n\t\t\t\t\t<option\n\t\t\t\t\t\tv-for=\"theme in $store.state.serverConfiguration.themes\"\n\t\t\t\t\t\t:key=\"theme.name\"\n\t\t\t\t\t\t:value=\"theme.name\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{{ theme.displayName }}\n\t\t\t\t\t</option>\n\t\t\t\t</select>\n\t\t\t</div>\n\n\t\t\t<template v-if=\"$store.state.serverConfiguration.prefetch\">\n\t\t\t\t<h2>Link previews</h2>\n\t\t\t\t<div>\n\t\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"$store.state.settings.media\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tname=\"media\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tAuto-expand media\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"$store.state.settings.links\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tname=\"links\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tAuto-expand websites\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<div\n\t\t\t\tv-if=\"$store.state.settings.advanced && $store.state.serverConfiguration.fileUpload\"\n\t\t\t>\n\t\t\t\t<h2>File uploads</h2>\n\t\t\t\t<div>\n\t\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t:checked=\"$store.state.settings.uploadCanvas\"\n\t\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\t\tname=\"uploadCanvas\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\tAttempt to remove metadata from images before uploading\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\t\taria-label=\"This option renders the image into a canvas element to remove metadata from the image.\nThis may break orientation if your browser does not support that.\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</label>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<template v-if=\"!$store.state.serverConfiguration.public\">\n\t\t\t\t<h2>Push Notifications</h2>\n\t\t\t\t<div>\n\t\t\t\t\t<button\n\t\t\t\t\t\tid=\"pushNotifications\"\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tclass=\"btn\"\n\t\t\t\t\t\t:disabled=\"\n\t\t\t\t\t\t\t$store.state.pushNotificationState !== 'supported' &&\n\t\t\t\t\t\t\t$store.state.pushNotificationState !== 'subscribed'\n\t\t\t\t\t\t\"\n\t\t\t\t\t\t@click=\"onPushButtonClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<template v-if=\"$store.state.pushNotificationState === 'subscribed'\">\n\t\t\t\t\t\t\tUnsubscribe from push notifications\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-else-if=\"$store.state.pushNotificationState === 'loading'\">\n\t\t\t\t\t\t\tLoading…\n\t\t\t\t\t\t</template>\n\t\t\t\t\t\t<template v-else> Subscribe to push notifications </template>\n\t\t\t\t\t</button>\n\t\t\t\t\t<div v-if=\"$store.state.pushNotificationState === 'nohttps'\" class=\"error\">\n\t\t\t\t\t\t<strong>Warning</strong>: Push notifications are only supported over HTTPS\n\t\t\t\t\t\tconnections.\n\t\t\t\t\t</div>\n\t\t\t\t\t<div v-if=\"$store.state.pushNotificationState === 'unsupported'\" class=\"error\">\n\t\t\t\t\t\t<strong>Warning</strong>:\n\t\t\t\t\t\t<span>Push notifications are not supported by your browser.</span>\n\n\t\t\t\t\t\t<div v-if=\"isIOS\" class=\"apple-push-unsupported\">\n\t\t\t\t\t\t\tSafari does\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref=\"https://bugs.webkit.org/show_bug.cgi?id=182566\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t\t>not support the web push notification specification</a\n\t\t\t\t\t\t\t>, and because all browsers on iOS use Safari under the hood, The Lounge\n\t\t\t\t\t\t\tis unable to provide push notifications on iOS devices.\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\n\t\t\t<h2>Browser Notifications</h2>\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"desktopNotifications\"\n\t\t\t\t\t\t:checked=\"$store.state.settings.desktopNotifications\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"desktopNotifications\"\n\t\t\t\t\t/>\n\t\t\t\t\tEnable browser notifications<br />\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"$store.state.desktopNotificationState === 'unsupported'\"\n\t\t\t\t\t\tclass=\"error\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<strong>Warning</strong>: Notifications are not supported by your browser.\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tv-if=\"$store.state.desktopNotificationState === 'blocked'\"\n\t\t\t\t\t\tid=\"warnBlockedDesktopNotifications\"\n\t\t\t\t\t\tclass=\"error\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<strong>Warning</strong>: Notifications are blocked by your browser.\n\t\t\t\t\t</div>\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.notification\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"notification\"\n\t\t\t\t\t/>\n\t\t\t\t\tEnable notification sound\n\t\t\t\t</label>\n\t\t\t</div>\n\t\t\t<div>\n\t\t\t\t<div class=\"opt\">\n\t\t\t\t\t<button id=\"play\" @click.prevent=\"playNotification\">Play sound</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"$store.state.settings.advanced\">\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<input\n\t\t\t\t\t\t:checked=\"$store.state.settings.notifyAllMessages\"\n\t\t\t\t\t\ttype=\"checkbox\"\n\t\t\t\t\t\tname=\"notifyAllMessages\"\n\t\t\t\t\t/>\n\t\t\t\t\tEnable notification for all messages\n\t\t\t\t</label>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"!$store.state.serverConfiguration.public && $store.state.settings.advanced\">\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<label for=\"highlights\" class=\"opt\">\n\t\t\t\t\t\tCustom highlights\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\t\taria-label=\"If a message contains any of these comma-separated \nexpressions, it will trigger a highlight.\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"highlights\"\n\t\t\t\t\t\t:value=\"$store.state.settings.highlights\"\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tname=\"highlights\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tplaceholder=\"Comma-separated, e.g.: word, some more words, anotherword\"\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"!$store.state.serverConfiguration.public && $store.state.settings.advanced\">\n\t\t\t\t<label class=\"opt\">\n\t\t\t\t\t<label for=\"highlightExceptions\" class=\"opt\">\n\t\t\t\t\t\tHighlight exceptions\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-delay\"\n\t\t\t\t\t\t\taria-label=\"If a message contains any of these comma-separated \nexpressions, it will not trigger a highlight even if it contains \nyour nickname or expressions defined in custom highlights.\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<button class=\"extra-help\" />\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</label>\n\t\t\t\t\t<input\n\t\t\t\t\t\tid=\"highlightExceptions\"\n\t\t\t\t\t\t:value=\"$store.state.settings.highlightExceptions\"\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tname=\"highlightExceptions\"\n\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\tplaceholder=\"Comma-separated, e.g.: word, some more words, anotherword\"\n\t\t\t\t\t/>\n\t\t\t\t</label>\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tv-if=\"\n\t\t\t\t\t!$store.state.serverConfiguration.public &&\n\t\t\t\t\t!$store.state.serverConfiguration.ldapEnabled\n\t\t\t\t\"\n\t\t\t\tid=\"change-password\"\n\t\t\t\trole=\"group\"\n\t\t\t\taria-labelledby=\"label-change-password\"\n\t\t\t>\n\t\t\t\t<h2 id=\"label-change-password\">Change password</h2>\n\t\t\t\t<div class=\"password-container\">\n\t\t\t\t\t<label for=\"old_password_input\" class=\"sr-only\"> Enter current password </label>\n\t\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"old_password_input\"\n\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\tname=\"old_password\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\tplaceholder=\"Enter current password\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</RevealPassword>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"password-container\">\n\t\t\t\t\t<label for=\"new_password_input\" class=\"sr-only\">\n\t\t\t\t\t\tEnter desired new password\n\t\t\t\t\t</label>\n\t\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"new_password_input\"\n\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\tname=\"new_password\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\tplaceholder=\"Enter desired new password\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</RevealPassword>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"password-container\">\n\t\t\t\t\t<label for=\"verify_password_input\" class=\"sr-only\"> Repeat new password </label>\n\t\t\t\t\t<RevealPassword v-slot:default=\"slotProps\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tid=\"verify_password_input\"\n\t\t\t\t\t\t\t:type=\"slotProps.isVisible ? 'text' : 'password'\"\n\t\t\t\t\t\t\tname=\"verify_password\"\n\t\t\t\t\t\t\tclass=\"input\"\n\t\t\t\t\t\t\tplaceholder=\"Repeat new password\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</RevealPassword>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"passwordChangeStatus && passwordChangeStatus.success\"\n\t\t\t\t\tclass=\"feedback success\"\n\t\t\t\t>\n\t\t\t\t\tSuccessfully updated your password\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tv-else-if=\"passwordChangeStatus && passwordChangeStatus.error\"\n\t\t\t\t\tclass=\"feedback error\"\n\t\t\t\t>\n\t\t\t\t\t{{ passwordErrors[passwordChangeStatus.error] }}\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<button type=\"submit\" class=\"btn\" @click.prevent=\"changePassword\">\n\t\t\t\t\t\tChange password\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"$store.state.settings.advanced\">\n\t\t\t\t<h2>Custom Stylesheet</h2>\n\t\t\t\t<label for=\"user-specified-css-input\" class=\"sr-only\">\n\t\t\t\t\tCustom stylesheet. You can override any style with CSS here.\n\t\t\t\t</label>\n\t\t\t\t<textarea\n\t\t\t\t\tid=\"user-specified-css-input\"\n\t\t\t\t\t:value=\"$store.state.settings.userStyles\"\n\t\t\t\t\tclass=\"input\"\n\t\t\t\t\tname=\"userStyles\"\n\t\t\t\t\tplaceholder=\"/* You can override any style with CSS here */\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div v-if=\"!$store.state.serverConfiguration.public\" class=\"session-list\" role=\"group\">\n\t\t\t\t<h2>Sessions</h2>\n\n\t\t\t\t<h3>Current session</h3>\n\t\t\t\t<Session v-if=\"currentSession\" :session=\"currentSession\" />\n\n\t\t\t\t<template v-if=\"activeSessions.length > 0\">\n\t\t\t\t\t<h3>Active sessions</h3>\n\t\t\t\t\t<Session\n\t\t\t\t\t\tv-for=\"session in activeSessions\"\n\t\t\t\t\t\t:key=\"session.token\"\n\t\t\t\t\t\t:session=\"session\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\n\t\t\t\t<h3>Other sessions</h3>\n\t\t\t\t<p v-if=\"$store.state.sessions.length === 0\">Loading…</p>\n\t\t\t\t<p v-else-if=\"otherSessions.length === 0\">\n\t\t\t\t\t<em>You are not currently logged in to any other device.</em>\n\t\t\t\t</p>\n\t\t\t\t<Session\n\t\t\t\t\tv-for=\"session in otherSessions\"\n\t\t\t\t\tv-else\n\t\t\t\t\t:key=\"session.token\"\n\t\t\t\t\t:session=\"session\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</form>\n\t</div>\n</template>\n\n<style>\ntextarea#user-specified-css-input {\n\theight: 100px;\n}\n</style>\n\n<script>\nimport socket from \"../../js/socket\";\nimport webpush from \"../../js/webpush\";\nimport RevealPassword from \"../RevealPassword.vue\";\nimport Session from \"../Session.vue\";\nimport SidebarToggle from \"../SidebarToggle.vue\";\n\nlet installPromptEvent = null;\n\nwindow.addEventListener(\"beforeinstallprompt\", (e) => {\n\te.preventDefault();\n\tinstallPromptEvent = e;\n});\n\nexport default {\n\tname: \"Settings\",\n\tcomponents: {\n\t\tRevealPassword,\n\t\tSession,\n\t\tSidebarToggle,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tcanRegisterProtocol: false,\n\t\t\tpasswordChangeStatus: null,\n\t\t\tpasswordErrors: {\n\t\t\t\tmissing_fields: \"Please enter a new password\",\n\t\t\t\tpassword_mismatch: \"Both new password fields must match\",\n\t\t\t\tpassword_incorrect:\n\t\t\t\t\t\"The current password field does not match your account password\",\n\t\t\t\tupdate_failed: \"Failed to update your password\",\n\t\t\t},\n\t\t\tisIOS: navigator.platform.match(/(iPhone|iPod|iPad)/i) || false,\n\t\t};\n\t},\n\tcomputed: {\n\t\thasInstallPromptEvent() {\n\t\t\t// TODO: This doesn't hide the button after clicking\n\t\t\treturn installPromptEvent !== null;\n\t\t},\n\t\tcurrentSession() {\n\t\t\treturn this.$store.state.sessions.find((item) => item.current);\n\t\t},\n\t\tactiveSessions() {\n\t\t\treturn this.$store.state.sessions.filter((item) => !item.current && item.active > 0);\n\t\t},\n\t\totherSessions() {\n\t\t\treturn this.$store.state.sessions.filter((item) => !item.current && !item.active);\n\t\t},\n\t},\n\tmounted() {\n\t\tsocket.emit(\"sessions:get\");\n\n\t\t// Enable protocol handler registration if supported,\n\t\t// and the network configuration is not locked\n\t\tthis.canRegisterProtocol =\n\t\t\twindow.navigator.registerProtocolHandler &&\n\t\t\t!this.$store.state.serverConfiguration.lockNetwork;\n\t},\n\tmethods: {\n\t\tonChange(event) {\n\t\t\tconst ignore = [\"old_password\", \"new_password\", \"verify_password\"];\n\n\t\t\tconst name = event.target.name;\n\n\t\t\tif (ignore.includes(name)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet value;\n\n\t\t\tif (event.target.type === \"checkbox\") {\n\t\t\t\tvalue = event.target.checked;\n\t\t\t} else {\n\t\t\t\tvalue = event.target.value;\n\t\t\t}\n\n\t\t\tthis.$store.dispatch(\"settings/update\", {name, value, sync: true});\n\t\t},\n\t\tchangePassword() {\n\t\t\tconst allFields = new FormData(this.$refs.settingsForm);\n\t\t\tconst data = {\n\t\t\t\told_password: allFields.get(\"old_password\"),\n\t\t\t\tnew_password: allFields.get(\"new_password\"),\n\t\t\t\tverify_password: allFields.get(\"verify_password\"),\n\t\t\t};\n\n\t\t\tif (!data.old_password || !data.new_password || !data.verify_password) {\n\t\t\t\tthis.passwordChangeStatus = {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: \"missing_fields\",\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (data.new_password !== data.verify_password) {\n\t\t\t\tthis.passwordChangeStatus = {\n\t\t\t\t\tsuccess: false,\n\t\t\t\t\terror: \"password_mismatch\",\n\t\t\t\t};\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsocket.once(\"change-password\", (response) => {\n\t\t\t\tthis.passwordChangeStatus = response;\n\t\t\t});\n\n\t\t\tsocket.emit(\"change-password\", data);\n\t\t},\n\t\tonForceSyncClick() {\n\t\t\tthis.$store.dispatch(\"settings/syncAll\", true);\n\t\t\tthis.$store.dispatch(\"settings/update\", {\n\t\t\t\tname: \"syncSettings\",\n\t\t\t\tvalue: true,\n\t\t\t\tsync: true,\n\t\t\t});\n\t\t},\n\t\tregisterProtocol() {\n\t\t\tconst uri = document.location.origin + document.location.pathname + \"?uri=%s\";\n\n\t\t\twindow.navigator.registerProtocolHandler(\"irc\", uri, \"The Lounge\");\n\t\t\twindow.navigator.registerProtocolHandler(\"ircs\", uri, \"The Lounge\");\n\t\t},\n\t\tnativeInstallPrompt() {\n\t\t\tinstallPromptEvent.prompt();\n\t\t\tinstallPromptEvent = null;\n\t\t},\n\t\tplayNotification() {\n\t\t\tconst pop = new Audio();\n\t\t\tpop.src = \"audio/pop.wav\";\n\t\t\tpop.play();\n\t\t},\n\t\tonPushButtonClick() {\n\t\t\twebpush.togglePushSubscription();\n\t\t},\n\t},\n};\n</script>\n","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Settings.vue?vue&type=template&id=1d1bd252&\"\nimport script from \"./Settings.vue?vue&type=script&lang=js&\"\nexport * from \"./Settings.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Settings.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"window\",attrs:{\"id\":\"settings\",\"role\":\"tabpanel\",\"aria-label\":\"Settings\"}},[_c('div',{staticClass:\"header\"},[_c('SidebarToggle')],1),_c('form',{ref:\"settingsForm\",staticClass:\"container\",on:{\"change\":_vm.onChange,\"submit\":function($event){$event.preventDefault();}}},[_c('h1',{staticClass:\"title\"},[_vm._v(\"Settings\")]),_c('div',[_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"checkbox\",\"name\":\"advanced\"},domProps:{\"checked\":_vm.$store.state.settings.advanced}}),_vm._v(\"\\n\\t\\t\\t\\t\\tAdvanced settings\\n\\t\\t\\t\\t\")])]),(_vm.canRegisterProtocol || _vm.hasInstallPromptEvent)?_c('div',[_c('h2',[_vm._v(\"Native app\")]),(_vm.hasInstallPromptEvent)?_c('button',{staticClass:\"btn\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){$event.preventDefault();return _vm.nativeInstallPrompt($event)}}},[_vm._v(\"\\n\\t\\t\\t\\t\\tAdd The Lounge to Home screen\\n\\t\\t\\t\\t\")]):_vm._e(),(_vm.canRegisterProtocol)?_c('button',{staticClass:\"btn\",attrs:{\"type\":\"button\"},on:{\"click\":function($event){$event.preventDefault();return _vm.registerProtocol($event)}}},[_vm._v(\"\\n\\t\\t\\t\\t\\tOpen irc:// URLs with The Lounge\\n\\t\\t\\t\\t\")]):_vm._e()]):_vm._e(),(!_vm.$store.state.serverConfiguration.public && _vm.$store.state.settings.advanced)?_c('div',[_c('h2',[_vm._v(\"Settings synchronisation\")]),_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"checkbox\",\"name\":\"syncSettings\"},domProps:{\"checked\":_vm.$store.state.settings.syncSettings}}),_vm._v(\"\\n\\t\\t\\t\\t\\tSynchronize settings with other clients\\n\\t\\t\\t\\t\")]),(!_vm.$store.state.settings.syncSettings)?[(_vm.$store.state.serverHasSettings)?_c('div',{staticClass:\"settings-sync-panel\"},[_vm._m(0),_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\tUse the button below to enable synchronization, and override any\\n\\t\\t\\t\\t\\t\\t\\tsettings already synced to the server.\\n\\t\\t\\t\\t\\t\\t\")]),_c('button',{staticClass:\"btn btn-small\",attrs:{\"type\":\"button\"},on:{\"click\":_vm.onForceSyncClick}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\tSync settings and enable\\n\\t\\t\\t\\t\\t\\t\")])]):_c('div',{staticClass:\"settings-sync-panel\"},[_vm._m(1)])]:_vm._e()],2):_vm._e(),_c('h2',[_vm._v(\"Messages\")]),_c('div',[_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"checkbox\",\"name\":\"motd\"},domProps:{\"checked\":_vm.$store.state.settings.motd}}),_vm._v(\"\\n\\t\\t\\t\\t\\tShow \"),_c('abbr',{attrs:{\"title\":\"Message Of The Day\"}},[_vm._v(\"MOTD\")])])]),_c('div',[_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"checkbox\",\"name\":\"showSeconds\"},domProps:{\"checked\":_vm.$store.state.settings.showSeconds}}),_vm._v(\"\\n\\t\\t\\t\\t\\tShow seconds in timestamp\\n\\t\\t\\t\\t\")])]),_c('div',[_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"checkbox\",\"name\":\"use12hClock\"},domProps:{\"checked\":_vm.$store.state.settings.use12hClock}}),_vm._v(\"\\n\\t\\t\\t\\t\\tShow 12-hour timestamps\\n\\t\\t\\t\\t\")])]),(!_vm.$store.state.serverConfiguration.public && _vm.$store.state.settings.advanced)?_c('div',[_c('h2',[_vm._v(\"Automatic away message\")]),_c('label',{staticClass:\"opt\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"awayMessage\"}},[_vm._v(\"Automatic away message\")]),_c('input',{staticClass:\"input\",attrs:{\"id\":\"awayMessage\",\"type\":\"text\",\"name\":\"awayMessage\",\"placeholder\":\"Away message if The Lounge is not open\"},domProps:{\"value\":_vm.$store.state.settings.awayMessage}})])]):_vm._e(),_vm._m(2),_c('div',{attrs:{\"role\":\"group\",\"aria-labelledby\":\"label-status-messages\"}},[_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"radio\",\"name\":\"statusMessages\",\"value\":\"shown\"},domProps:{\"checked\":_vm.$store.state.settings.statusMessages === 'shown'}}),_vm._v(\"\\n\\t\\t\\t\\t\\tShow all status messages individually\\n\\t\\t\\t\\t\")]),_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"radio\",\"name\":\"statusMessages\",\"value\":\"condensed\"},domProps:{\"checked\":_vm.$store.state.settings.statusMessages === 'condensed'}}),_vm._v(\"\\n\\t\\t\\t\\t\\tCondense status messages together\\n\\t\\t\\t\\t\")]),_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"radio\",\"name\":\"statusMessages\",\"value\":\"hidden\"},domProps:{\"checked\":_vm.$store.state.settings.statusMessages === 'hidden'}}),_vm._v(\"\\n\\t\\t\\t\\t\\tHide all status messages\\n\\t\\t\\t\\t\")])]),_c('h2',[_vm._v(\"Visual Aids\")]),_c('div',[_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"checkbox\",\"name\":\"coloredNicks\"},domProps:{\"checked\":_vm.$store.state.settings.coloredNicks}}),_vm._v(\"\\n\\t\\t\\t\\t\\tEnable colored nicknames\\n\\t\\t\\t\\t\")]),_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"checkbox\",\"name\":\"autocomplete\"},domProps:{\"checked\":_vm.$store.state.settings.autocomplete}}),_vm._v(\"\\n\\t\\t\\t\\t\\tEnable autocomplete\\n\\t\\t\\t\\t\")])]),(_vm.$store.state.settings.advanced)?_c('div',[_c('label',{staticClass:\"opt\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"nickPostfix\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\tNick autocomplete postfix (for example a comma)\\n\\t\\t\\t\\t\\t\")]),_c('input',{staticClass:\"input\",attrs:{\"id\":\"nickPostfix\",\"type\":\"text\",\"name\":\"nickPostfix\",\"placeholder\":\"Nick autocomplete postfix (e.g. ', ')\"},domProps:{\"value\":_vm.$store.state.settings.nickPostfix}})])]):_vm._e(),_c('h2',[_vm._v(\"Theme\")]),_c('div',[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"theme-select\"}},[_vm._v(\"Theme\")]),_c('select',{staticClass:\"input\",attrs:{\"id\":\"theme-select\",\"name\":\"theme\"},domProps:{\"value\":_vm.$store.state.settings.theme}},_vm._l((_vm.$store.state.serverConfiguration.themes),function(theme){return _c('option',{key:theme.name,domProps:{\"value\":theme.name}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\"+_vm._s(theme.displayName)+\"\\n\\t\\t\\t\\t\\t\")])}),0)]),(_vm.$store.state.serverConfiguration.prefetch)?[_c('h2',[_vm._v(\"Link previews\")]),_c('div',[_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"checkbox\",\"name\":\"media\"},domProps:{\"checked\":_vm.$store.state.settings.media}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\tAuto-expand media\\n\\t\\t\\t\\t\\t\")])]),_c('div',[_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"checkbox\",\"name\":\"links\"},domProps:{\"checked\":_vm.$store.state.settings.links}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\tAuto-expand websites\\n\\t\\t\\t\\t\\t\")])])]:_vm._e(),(_vm.$store.state.settings.advanced && _vm.$store.state.serverConfiguration.fileUpload)?_c('div',[_c('h2',[_vm._v(\"File uploads\")]),_c('div',[_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"checkbox\",\"name\":\"uploadCanvas\"},domProps:{\"checked\":_vm.$store.state.settings.uploadCanvas}}),_vm._v(\"\\n\\t\\t\\t\\t\\t\\tAttempt to remove metadata from images before uploading\\n\\t\\t\\t\\t\\t\\t\"),_vm._m(3)])])]):_vm._e(),(!_vm.$store.state.serverConfiguration.public)?[_c('h2',[_vm._v(\"Push Notifications\")]),_c('div',[_c('button',{staticClass:\"btn\",attrs:{\"id\":\"pushNotifications\",\"type\":\"button\",\"disabled\":_vm.$store.state.pushNotificationState !== 'supported' &&\n\t\t\t\t\t\t\t_vm.$store.state.pushNotificationState !== 'subscribed'},on:{\"click\":_vm.onPushButtonClick}},[(_vm.$store.state.pushNotificationState === 'subscribed')?[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\tUnsubscribe from push notifications\\n\\t\\t\\t\\t\\t\\t\")]:(_vm.$store.state.pushNotificationState === 'loading')?[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\tLoading…\\n\\t\\t\\t\\t\\t\\t\")]:[_vm._v(\" Subscribe to push notifications \")]],2),(_vm.$store.state.pushNotificationState === 'nohttps')?_c('div',{staticClass:\"error\"},[_c('strong',[_vm._v(\"Warning\")]),_vm._v(\": Push notifications are only supported over HTTPS\\n\\t\\t\\t\\t\\t\\tconnections.\\n\\t\\t\\t\\t\\t\")]):_vm._e(),(_vm.$store.state.pushNotificationState === 'unsupported')?_c('div',{staticClass:\"error\"},[_c('strong',[_vm._v(\"Warning\")]),_vm._v(\":\\n\\t\\t\\t\\t\\t\\t\"),_c('span',[_vm._v(\"Push notifications are not supported by your browser.\")]),(_vm.isIOS)?_c('div',{staticClass:\"apple-push-unsupported\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\tSafari does\\n\\t\\t\\t\\t\\t\\t\\t\"),_c('a',{attrs:{\"href\":\"https://bugs.webkit.org/show_bug.cgi?id=182566\",\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(\"not support the web push notification specification\")]),_vm._v(\", and because all browsers on iOS use Safari under the hood, The Lounge\\n\\t\\t\\t\\t\\t\\t\\tis unable to provide push notifications on iOS devices.\\n\\t\\t\\t\\t\\t\\t\")]):_vm._e()]):_vm._e()])]:_vm._e(),_c('h2',[_vm._v(\"Browser Notifications\")]),_c('div',[_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"id\":\"desktopNotifications\",\"type\":\"checkbox\",\"name\":\"desktopNotifications\"},domProps:{\"checked\":_vm.$store.state.settings.desktopNotifications}}),_vm._v(\"\\n\\t\\t\\t\\t\\tEnable browser notifications\"),_c('br'),(_vm.$store.state.desktopNotificationState === 'unsupported')?_c('div',{staticClass:\"error\"},[_c('strong',[_vm._v(\"Warning\")]),_vm._v(\": Notifications are not supported by your browser.\\n\\t\\t\\t\\t\\t\")]):_vm._e(),(_vm.$store.state.desktopNotificationState === 'blocked')?_c('div',{staticClass:\"error\",attrs:{\"id\":\"warnBlockedDesktopNotifications\"}},[_c('strong',[_vm._v(\"Warning\")]),_vm._v(\": Notifications are blocked by your browser.\\n\\t\\t\\t\\t\\t\")]):_vm._e()])]),_c('div',[_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"checkbox\",\"name\":\"notification\"},domProps:{\"checked\":_vm.$store.state.settings.notification}}),_vm._v(\"\\n\\t\\t\\t\\t\\tEnable notification sound\\n\\t\\t\\t\\t\")])]),_c('div',[_c('div',{staticClass:\"opt\"},[_c('button',{attrs:{\"id\":\"play\"},on:{\"click\":function($event){$event.preventDefault();return _vm.playNotification($event)}}},[_vm._v(\"Play sound\")])])]),(_vm.$store.state.settings.advanced)?_c('div',[_c('label',{staticClass:\"opt\"},[_c('input',{attrs:{\"type\":\"checkbox\",\"name\":\"notifyAllMessages\"},domProps:{\"checked\":_vm.$store.state.settings.notifyAllMessages}}),_vm._v(\"\\n\\t\\t\\t\\t\\tEnable notification for all messages\\n\\t\\t\\t\\t\")])]):_vm._e(),(!_vm.$store.state.serverConfiguration.public && _vm.$store.state.settings.advanced)?_c('div',[_c('label',{staticClass:\"opt\"},[_vm._m(4),_c('input',{staticClass:\"input\",attrs:{\"id\":\"highlights\",\"type\":\"text\",\"name\":\"highlights\",\"placeholder\":\"Comma-separated, e.g.: word, some more words, anotherword\"},domProps:{\"value\":_vm.$store.state.settings.highlights}})])]):_vm._e(),(!_vm.$store.state.serverConfiguration.public && _vm.$store.state.settings.advanced)?_c('div',[_c('label',{staticClass:\"opt\"},[_vm._m(5),_c('input',{staticClass:\"input\",attrs:{\"id\":\"highlightExceptions\",\"type\":\"text\",\"name\":\"highlightExceptions\",\"placeholder\":\"Comma-separated, e.g.: word, some more words, anotherword\"},domProps:{\"value\":_vm.$store.state.settings.highlightExceptions}})])]):_vm._e(),(\n\t\t\t\t\t!_vm.$store.state.serverConfiguration.public &&\n\t\t\t\t\t!_vm.$store.state.serverConfiguration.ldapEnabled\n\t\t\t\t)?_c('div',{attrs:{\"id\":\"change-password\",\"role\":\"group\",\"aria-labelledby\":\"label-change-password\"}},[_c('h2',{attrs:{\"id\":\"label-change-password\"}},[_vm._v(\"Change password\")]),_c('div',{staticClass:\"password-container\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"old_password_input\"}},[_vm._v(\" Enter current password \")]),_c('RevealPassword',{scopedSlots:_vm._u([{key:\"default\",fn:function(slotProps){return [_c('input',{staticClass:\"input\",attrs:{\"id\":\"old_password_input\",\"type\":slotProps.isVisible ? 'text' : 'password',\"name\":\"old_password\",\"placeholder\":\"Enter current password\"}})]}}],null,false,3021935278)})],1),_c('div',{staticClass:\"password-container\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"new_password_input\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\tEnter desired new password\\n\\t\\t\\t\\t\\t\")]),_c('RevealPassword',{scopedSlots:_vm._u([{key:\"default\",fn:function(slotProps){return [_c('input',{staticClass:\"input\",attrs:{\"id\":\"new_password_input\",\"type\":slotProps.isVisible ? 'text' : 'password',\"name\":\"new_password\",\"placeholder\":\"Enter desired new password\"}})]}}],null,false,1521376723)})],1),_c('div',{staticClass:\"password-container\"},[_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"verify_password_input\"}},[_vm._v(\" Repeat new password \")]),_c('RevealPassword',{scopedSlots:_vm._u([{key:\"default\",fn:function(slotProps){return [_c('input',{staticClass:\"input\",attrs:{\"id\":\"verify_password_input\",\"type\":slotProps.isVisible ? 'text' : 'password',\"name\":\"verify_password\",\"placeholder\":\"Repeat new password\"}})]}}],null,false,1508332196)})],1),(_vm.passwordChangeStatus && _vm.passwordChangeStatus.success)?_c('div',{staticClass:\"feedback success\"},[_vm._v(\"\\n\\t\\t\\t\\t\\tSuccessfully updated your password\\n\\t\\t\\t\\t\")]):(_vm.passwordChangeStatus && _vm.passwordChangeStatus.error)?_c('div',{staticClass:\"feedback error\"},[_vm._v(\"\\n\\t\\t\\t\\t\\t\"+_vm._s(_vm.passwordErrors[_vm.passwordChangeStatus.error])+\"\\n\\t\\t\\t\\t\")]):_vm._e(),_c('div',[_c('button',{staticClass:\"btn\",attrs:{\"type\":\"submit\"},on:{\"click\":function($event){$event.preventDefault();return _vm.changePassword($event)}}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\tChange password\\n\\t\\t\\t\\t\\t\")])])]):_vm._e(),(_vm.$store.state.settings.advanced)?_c('div',[_c('h2',[_vm._v(\"Custom Stylesheet\")]),_c('label',{staticClass:\"sr-only\",attrs:{\"for\":\"user-specified-css-input\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\tCustom stylesheet. You can override any style with CSS here.\\n\\t\\t\\t\\t\")]),_c('textarea',{staticClass:\"input\",attrs:{\"id\":\"user-specified-css-input\",\"name\":\"userStyles\",\"placeholder\":\"/* You can override any style with CSS here */\"},domProps:{\"value\":_vm.$store.state.settings.userStyles}})]):_vm._e(),(!_vm.$store.state.serverConfiguration.public)?_c('div',{staticClass:\"session-list\",attrs:{\"role\":\"group\"}},[_c('h2',[_vm._v(\"Sessions\")]),_c('h3',[_vm._v(\"Current session\")]),(_vm.currentSession)?_c('Session',{attrs:{\"session\":_vm.currentSession}}):_vm._e(),(_vm.activeSessions.length > 0)?[_c('h3',[_vm._v(\"Active sessions\")]),_vm._l((_vm.activeSessions),function(session){return _c('Session',{key:session.token,attrs:{\"session\":session}})})]:_vm._e(),_c('h3',[_vm._v(\"Other sessions\")]),(_vm.$store.state.sessions.length === 0)?_c('p',[_vm._v(\"Loading…\")]):(_vm.otherSessions.length === 0)?_c('p',[_c('em',[_vm._v(\"You are not currently logged in to any other device.\")])]):_vm._l((_vm.otherSessions),function(session){return _c('Session',{key:session.token,attrs:{\"session\":session}})})],2):_vm._e()],2)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',[_c('strong',[_vm._v(\"Warning:\")]),_vm._v(\" Checking this box will override the settings\\n\\t\\t\\t\\t\\t\\t\\tof this client with those stored on the server.\\n\\t\\t\\t\\t\\t\\t\")])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',[_c('strong',[_vm._v(\"Warning:\")]),_vm._v(\" No settings have been synced before. Enabling\\n\\t\\t\\t\\t\\t\\t\\tthis will sync all settings of this client as the base for other\\n\\t\\t\\t\\t\\t\\t\\tclients.\\n\\t\\t\\t\\t\\t\\t\")])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('h2',{attrs:{\"id\":\"label-status-messages\"}},[_vm._v(\"\\n\\t\\t\\t\\tStatus messages\\n\\t\\t\\t\\t\"),_c('span',{staticClass:\"tooltipped tooltipped-n tooltipped-no-delay\",attrs:{\"aria-label\":\"Joins, parts, quits, kicks, nick changes, and mode changes\"}},[_c('button',{staticClass:\"extra-help\"})])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"tooltipped tooltipped-n tooltipped-no-delay\",attrs:{\"aria-label\":\"This option renders the image into a canvas element to remove metadata from the image.\\nThis may break orientation if your browser does not support that.\"}},[_c('button',{staticClass:\"extra-help\"})])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('label',{staticClass:\"opt\",attrs:{\"for\":\"highlights\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\tCustom highlights\\n\\t\\t\\t\\t\\t\\t\"),_c('span',{staticClass:\"tooltipped tooltipped-n tooltipped-no-delay\",attrs:{\"aria-label\":\"If a message contains any of these comma-separated \\nexpressions, it will trigger a highlight.\"}},[_c('button',{staticClass:\"extra-help\"})])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('label',{staticClass:\"opt\",attrs:{\"for\":\"highlightExceptions\"}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\tHighlight exceptions\\n\\t\\t\\t\\t\\t\\t\"),_c('span',{staticClass:\"tooltipped tooltipped-n tooltipped-no-delay\",attrs:{\"aria-label\":\"If a message contains any of these comma-separated \\nexpressions, it will not trigger a highlight even if it contains \\nyour nickname or expressions defined in custom highlights.\"}},[_c('button',{staticClass:\"extra-help\"})])])}]\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VersionChecker.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./VersionChecker.vue?vue&type=script&lang=js&\"","<template>\n\t<!--div id=\"version-checker\" :class=\"[$store.state.versionStatus]\">\n\t\t<p v-if=\"$store.state.versionStatus === 'loading'\">Checking for updates…</p>\n\t\t<p v-if=\"$store.state.versionStatus === 'new-version'\">\n\t\t\tThe Lounge <b>{{ $store.state.versionData.latest.version }}</b>\n\t\t\t<template v-if=\"$store.state.versionData.latest.prerelease\"> (pre-release) </template>\n\t\t\tis now available.\n\t\t\t<br />\n\n\t\t\t<a :href=\"$store.state.versionData.latest.url\" target=\"_blank\" rel=\"noopener\">\n\t\t\t\tRead more on GitHub\n\t\t\t</a>\n\t\t</p>\n\t\t<p v-if=\"$store.state.versionStatus === 'new-packages'\">\n\t\t\tThe TripSit Lounge is up to date, but there are out of date packages Run\n\t\t\t<code>thelounge upgrade</code> on the server to upgrade packages.\n\t\t</p>\n\t\t<template v-if=\"$store.state.versionStatus === 'up-to-date'\">\n\t\t\t<p>The Lounge, the software TripSit relies on, is up to date!</p>\n\n\t\t\t<button\n\t\t\t\tv-if=\"$store.state.versionDataExpired\"\n\t\t\t\tid=\"check-now\"\n\t\t\t\tclass=\"btn btn-small\"\n\t\t\t\t@click=\"checkNow\"\n\t\t\t>\n\t\t\t\tCheck now\n\t\t\t</button>\n\t\t</template>\n\t\t<template v-if=\"$store.state.versionStatus === 'error'\">\n\t\t\t<p>Information about latest release could not be retrieved.</p>\n\n\t\t\t<button id=\"check-now\" class=\"btn btn-small\" @click=\"checkNow\">Try again</button>\n\t\t</template>\n\t</div-->\n</template>\n\n<script>\nimport socket from \"../js/socket\";\n\nexport default {\n\tname: \"VersionChecker\",\n\tmounted() {\n\t\tif (!this.$store.state.versionData) {\n\t\t\tthis.checkNow();\n\t\t}\n\t},\n\tmethods: {\n\t\tcheckNow() {\n\t\t\tthis.$store.commit(\"versionData\", null);\n\t\t\tthis.$store.commit(\"versionStatus\", \"loading\");\n\t\t\tsocket.emit(\"changelog\");\n\t\t},\n\t},\n};\n</script>\n","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Help.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Help.vue?vue&type=script&lang=js&\"","<template>\n\t<div id=\"help\" class=\"window\" role=\"tabpanel\" aria-label=\"Help\">\n\t\t<div class=\"header\">\n\t\t\t<SidebarToggle />\n\t\t</div>\n\t\t<div class=\"container\">\n\t\t\t<h1 class=\"title\">Help</h1>\n\n\t\t\t<!--h2 class=\"help-version-title\">\n\t\t\t\t<span>About The Lounge</span>\n\t\t\t\t<small>\n\t\t\t\t\tv{{ $store.state.serverConfiguration.version }} (<router-link\n\t\t\t\t\t\tid=\"view-changelog\"\n\t\t\t\t\t\tto=\"/changelog\"\n\t\t\t\t\t\t>release notes</router-link\n\t\t\t\t\t>)\n\t\t\t\t</small>\n\t\t\t</h2-->\n\t\t\t\n\t\t\t<h2 class=\"help-version-title\">\n\t\t\t\t<span>The TripSit Web Client</span>\n\t\t\t\t<small>\n\t\t\t\t\t<p>This Client is powered by The Lounge and was modified to fit the TripSit harm reduction network</p>\n\t\t\t\t\t<p>Please share your feedback in #contrib</p>\n\t\t\t\t</small>\n\t\t\t</h2>\n\n\t\t\t<!--div class=\"about\">\n\t\t\t\t<VersionChecker />\n\n\t\t\t\t<template v-if=\"$store.state.serverConfiguration.gitCommit\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tThe Lounge is running from source (<a\n\t\t\t\t\t\t\t:href=\"`https://github.com/thelounge/thelounge/tree/${$store.state.serverConfiguration.gitCommit}`\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t>commit <code>{{ $store.state.serverConfiguration.gitCommit }}</code></a\n\t\t\t\t\t\t>).\n\t\t\t\t\t</p>\n\n\t\t\t\t\t<ul>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\tCompare\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t:href=\"`https://github.com/thelounge/thelounge/compare/${$store.state.serverConfiguration.gitCommit}...master`\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t\t>between\n\t\t\t\t\t\t\t\t<code>{{ $store.state.serverConfiguration.gitCommit }}</code> and\n\t\t\t\t\t\t\t\t<code>master</code></a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\tto see what you are missing\n\t\t\t\t\t\t</li>\n\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\tCompare\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t:href=\"`https://github.com/thelounge/thelounge/compare/${$store.state.serverConfiguration.version}...${$store.state.serverConfiguration.gitCommit}`\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t\t>between\n\t\t\t\t\t\t\t\t<code>{{ $store.state.serverConfiguration.version }}</code> and\n\t\t\t\t\t\t\t\t<code>{{ $store.state.serverConfiguration.gitCommit }}</code></a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\tto see your local changes\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t</template>\n\n\t\t\t\t<p>\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"https://thelounge.chat/\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\tclass=\"website-link\"\n\t\t\t\t\t\t>Website</a\n\t\t\t\t\t>\n\t\t\t\t</p>\n\t\t\t\t<p>\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"https://thelounge.chat/docs/\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\tclass=\"documentation-link\"\n\t\t\t\t\t\t>Documentation</a\n\t\t\t\t\t>\n\t\t\t\t</p>\n\t\t\t\t<p>\n\t\t\t\t\t<a\n\t\t\t\t\t\thref=\"https://github.com/thelounge/thelounge/issues/new\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\tclass=\"report-issue-link\"\n\t\t\t\t\t\t>Report an issue…</a\n\t\t\t\t\t>\n\t\t\t\t</p>\n\t\t\t</div-->\n\n\t\t\t<h2>Keyboard Shortcuts</h2>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>↓</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>↓</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the next lobby in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>↑</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>↑</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the previous lobby in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>←</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>←</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Collapse current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>→</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>→</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Expand current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>↓</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>↓</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the next window in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>↑</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>↑</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the previous window in the channel list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>A</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>A</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Switch to the first window with unread messages.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>S</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>S</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Toggle sidebar.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>U</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>U</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Toggle channel user list.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Alt</kbd> <kbd>J</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌥</kbd> <kbd>J</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Toggle jump to channel switcher.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span><kbd>Esc</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tClose current contextual window (context menu, image viewer, topic edit,\n\t\t\t\t\t\tetc) and remove focus from input.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<h2>Formatting Shortcuts</h2>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>K</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>K</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark any text typed after this shortcut to be colored. After hitting this\n\t\t\t\t\t\tshortcut, enter an integer in the range\n\t\t\t\t\t\t<code>0—15</code> to select the desired color, or use the autocompletion\n\t\t\t\t\t\tmenu to choose a color name (see below).\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tBackground color can be specified by putting a comma and another integer in\n\t\t\t\t\t\tthe range <code>0—15</code> after the foreground color number\n\t\t\t\t\t\t(autocompletion works too).\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\tA color reference can be found\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://modern.ircdocs.horse/formatting.html#colors\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t>here</a\n\t\t\t\t\t\t>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>B</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>B</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-bold\">bold</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>U</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>U</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-underline\">underlined</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>I</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>I</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-italic\">italics</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>S</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>S</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-strikethrough\">struck through</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>M</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>M</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut as\n\t\t\t\t\t\t<span class=\"irc-monospace\">monospaced</span>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<span v-if=\"!isApple\"><kbd>Ctrl</kbd> <kbd>O</kbd></span>\n\t\t\t\t\t<span v-else><kbd>⌘</kbd> <kbd>O</kbd></span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tMark all text typed after this shortcut to be reset to its original\n\t\t\t\t\t\tformatting.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<h2>Autocompletion</h2>\n\n\t\t\t<p>\n\t\t\t\tTo auto-complete nicknames, channels, commands, and emoji, type one of the\n\t\t\t\tcharacters below to open a suggestion list. Use the <kbd>↑</kbd> and\n\t\t\t\t<kbd>↓</kbd> keys to highlight an item, and insert it by pressing <kbd>Tab</kbd> or\n\t\t\t\t<kbd>Enter</kbd> (or by clicking the desired item).\n\t\t\t</p>\n\t\t\t<p>Autocompletion can be disabled in settings.</p>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>@</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Nickname</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>#</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Channel</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Commands (see list of commands below)</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>:</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tEmoji (note: requires two search characters, to avoid conflicting with\n\t\t\t\t\t\tcommon emoticons like <code>:)</code>)\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<h2>Commands</h2>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/away [message]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Mark yourself as away with an optional message.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/back</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Remove your away status (set with <code>/away</code>).</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/ban nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tBan (<code>+b</code>) a user from the current channel. This can be a\n\t\t\t\t\t\tnickname or a hostmask.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/banlist</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Load the banlist for the current channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/collapse</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tCollapse all previews in the current channel (opposite of\n\t\t\t\t\t\t<code>/expand</code>)\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/connect host [port]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tConnect to a new IRC network. If <code>port</code> starts with a\n\t\t\t\t\t\t<code>+</code> sign, the connection will be made secure using TLS.\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>Alias: <code>/server</code></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/ctcp target cmd [args]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tSend a <abbr title=\"Client-to-client protocol\">CTCP</abbr>\n\t\t\t\t\t\trequest. Read more about this on\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://en.wikipedia.org/wiki/Client-to-client_protocol\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t>the dedicated Wikipedia article</a\n\t\t\t\t\t\t>.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/deop nick [...nick]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tRemove op (<code>-o</code>) from one or several users in the current\n\t\t\t\t\t\tchannel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/devoice nick [...nick]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tRemove voice (<code>-v</code>) from one or several users in the current\n\t\t\t\t\t\tchannel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/disconnect [message]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Disconnect from the current network with an optionally-provided message.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/expand</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tExpand all previews in the current channel (opposite of\n\t\t\t\t\t\t<code>/collapse</code>)\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/invite nick [channel]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tInvite a user to the specified channel. If\n\t\t\t\t\t\t<code>channel</code> is omitted, user will be invited to the current\n\t\t\t\t\t\tchannel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/ignore nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tBlock any messages from the specified user on the current network. This can\n\t\t\t\t\t\tbe a nickname or a hostmask.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/ignorelist</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Load the list of ignored users for the current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/join channel</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Join a channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/kick nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Kick a user from the current channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/list</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Retrieve a list of available channels on this network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/me message</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tSend an action message to the current channel. The Lounge will display it\n\t\t\t\t\t\tinline, as if the message was posted in the third person.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/mode flags [args]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tSet the given flags to the current channel if the active window is a\n\t\t\t\t\t\tchannel, another user if the active window is a private message window, or\n\t\t\t\t\t\tyourself if the current window is a server window.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/msg channel message</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Send a message to the specified channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/nick newnick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Change your nickname on the current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/notice channel message</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Sends a notice message to the specified channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/op nick [...nick]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Give op (<code>+o</code>) to one or several users in the current channel.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/part [channel]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tClose the specified channel or private message window, or the current\n\t\t\t\t\t\tchannel if <code>channel</code> is omitted.\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>Aliases: <code>/close</code>, <code>/leave</code></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/rejoin</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tLeave and immediately rejoin the current channel. Useful to quickly get op\n\t\t\t\t\t\tfrom ChanServ in an empty channel, for example.\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>Alias: <code>/cycle</code></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/query nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Send a private message to the specified user.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/quit [message]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Disconnect from the current network with an optional message.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/raw message</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Send a raw message to the current IRC network.</p>\n\t\t\t\t\t<p>Aliases: <code>/quote</code>, <code>/send</code></p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/slap nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Slap someone in the current channel with a trout!</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/topic [newtopic]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tGet the topic in the current channel. If <code>newtopic</code> is specified,\n\t\t\t\t\t\tsets the topic in the current channel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/unban nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tUnban (<code>-b</code>) a user from the current channel. This can be a\n\t\t\t\t\t\tnickname or a hostmask.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/unignore nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tUnblock messages from the specified user on the current network. This can be\n\t\t\t\t\t\ta nickname or a hostmask.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/voice nick [...nick]</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tGive voice (<code>+v</code>) to one or several users in the current channel.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"help-item\">\n\t\t\t\t<div class=\"subject\">\n\t\t\t\t\t<code>/whois nick</code>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"description\">\n\t\t\t\t\t<p>Retrieve information about the given user on the current network.</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport SidebarToggle from \"../SidebarToggle.vue\";\nimport VersionChecker from \"../VersionChecker.vue\";\n\nexport default {\n\tname: \"Help\",\n\tcomponents: {\n\t\tSidebarToggle,\n\t\tVersionChecker,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisApple: navigator.platform.match(/(Mac|iPhone|iPod|iPad)/i) || false,\n\t\t};\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./VersionChecker.vue?vue&type=template&id=2ac19c9e&\"\nimport script from \"./VersionChecker.vue?vue&type=script&lang=js&\"\nexport * from \"./VersionChecker.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c(\"div\")}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Help.vue?vue&type=template&id=81ed6c40&\"\nimport script from \"./Help.vue?vue&type=script&lang=js&\"\nexport * from \"./Help.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"window\",attrs:{\"id\":\"help\",\"role\":\"tabpanel\",\"aria-label\":\"Help\"}},[_c('div',{staticClass:\"header\"},[_c('SidebarToggle')],1),_c('div',{staticClass:\"container\"},[_c('h1',{staticClass:\"title\"},[_vm._v(\"Help\")]),_vm._m(0),_c('h2',[_vm._v(\"Keyboard Shortcuts\")]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Alt\")]),_c('kbd',[_vm._v(\"Shift\")]),_c('kbd',[_vm._v(\"↓\")])]):_c('span',[_c('kbd',[_vm._v(\"⌥\")]),_c('kbd',[_vm._v(\"⇧\")]),_c('kbd',[_vm._v(\"↓\")])])]),_vm._m(1)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Alt\")]),_c('kbd',[_vm._v(\"Shift\")]),_c('kbd',[_vm._v(\"↑\")])]):_c('span',[_c('kbd',[_vm._v(\"⌥\")]),_c('kbd',[_vm._v(\"⇧\")]),_c('kbd',[_vm._v(\"↑\")])])]),_vm._m(2)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Alt\")]),_c('kbd',[_vm._v(\"Shift\")]),_c('kbd',[_vm._v(\"←\")])]):_c('span',[_c('kbd',[_vm._v(\"⌥\")]),_c('kbd',[_vm._v(\"⇧\")]),_c('kbd',[_vm._v(\"←\")])])]),_vm._m(3)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Alt\")]),_c('kbd',[_vm._v(\"Shift\")]),_c('kbd',[_vm._v(\"→\")])]):_c('span',[_c('kbd',[_vm._v(\"⌥\")]),_c('kbd',[_vm._v(\"⇧\")]),_c('kbd',[_vm._v(\"→\")])])]),_vm._m(4)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Alt\")]),_c('kbd',[_vm._v(\"↓\")])]):_c('span',[_c('kbd',[_vm._v(\"⌥\")]),_c('kbd',[_vm._v(\"↓\")])])]),_vm._m(5)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Alt\")]),_c('kbd',[_vm._v(\"↑\")])]):_c('span',[_c('kbd',[_vm._v(\"⌥\")]),_c('kbd',[_vm._v(\"↑\")])])]),_vm._m(6)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Alt\")]),_c('kbd',[_vm._v(\"A\")])]):_c('span',[_c('kbd',[_vm._v(\"⌥\")]),_c('kbd',[_vm._v(\"A\")])])]),_vm._m(7)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Alt\")]),_c('kbd',[_vm._v(\"S\")])]):_c('span',[_c('kbd',[_vm._v(\"⌥\")]),_c('kbd',[_vm._v(\"S\")])])]),_vm._m(8)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Alt\")]),_c('kbd',[_vm._v(\"U\")])]):_c('span',[_c('kbd',[_vm._v(\"⌥\")]),_c('kbd',[_vm._v(\"U\")])])]),_vm._m(9)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Alt\")]),_c('kbd',[_vm._v(\"J\")])]):_c('span',[_c('kbd',[_vm._v(\"⌥\")]),_c('kbd',[_vm._v(\"J\")])])]),_vm._m(10)]),_vm._m(11),_c('h2',[_vm._v(\"Formatting Shortcuts\")]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Ctrl\")]),_c('kbd',[_vm._v(\"K\")])]):_c('span',[_c('kbd',[_vm._v(\"⌘\")]),_c('kbd',[_vm._v(\"K\")])])]),_vm._m(12)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Ctrl\")]),_c('kbd',[_vm._v(\"B\")])]):_c('span',[_c('kbd',[_vm._v(\"⌘\")]),_c('kbd',[_vm._v(\"B\")])])]),_vm._m(13)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Ctrl\")]),_c('kbd',[_vm._v(\"U\")])]):_c('span',[_c('kbd',[_vm._v(\"⌘\")]),_c('kbd',[_vm._v(\"U\")])])]),_vm._m(14)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Ctrl\")]),_c('kbd',[_vm._v(\"I\")])]):_c('span',[_c('kbd',[_vm._v(\"⌘\")]),_c('kbd',[_vm._v(\"I\")])])]),_vm._m(15)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Ctrl\")]),_c('kbd',[_vm._v(\"S\")])]):_c('span',[_c('kbd',[_vm._v(\"⌘\")]),_c('kbd',[_vm._v(\"S\")])])]),_vm._m(16)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Ctrl\")]),_c('kbd',[_vm._v(\"M\")])]):_c('span',[_c('kbd',[_vm._v(\"⌘\")]),_c('kbd',[_vm._v(\"M\")])])]),_vm._m(17)]),_c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[(!_vm.isApple)?_c('span',[_c('kbd',[_vm._v(\"Ctrl\")]),_c('kbd',[_vm._v(\"O\")])]):_c('span',[_c('kbd',[_vm._v(\"⌘\")]),_c('kbd',[_vm._v(\"O\")])])]),_vm._m(18)]),_c('h2',[_vm._v(\"Autocompletion\")]),_vm._m(19),_c('p',[_vm._v(\"Autocompletion can be disabled in settings.\")]),_vm._m(20),_vm._m(21),_vm._m(22),_vm._m(23),_c('h2',[_vm._v(\"Commands\")]),_vm._m(24),_vm._m(25),_vm._m(26),_vm._m(27),_vm._m(28),_vm._m(29),_vm._m(30),_vm._m(31),_vm._m(32),_vm._m(33),_vm._m(34),_vm._m(35),_vm._m(36),_vm._m(37),_vm._m(38),_vm._m(39),_vm._m(40),_vm._m(41),_vm._m(42),_vm._m(43),_vm._m(44),_vm._m(45),_vm._m(46),_vm._m(47),_vm._m(48),_vm._m(49),_vm._m(50),_vm._m(51),_vm._m(52),_vm._m(53),_vm._m(54),_vm._m(55),_vm._m(56),_vm._m(57)])])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('h2',{staticClass:\"help-version-title\"},[_c('span',[_vm._v(\"The TripSit Web Client\")]),_c('small',[_c('p',[_vm._v(\"This Client is powered by The Lounge and was modified to fit the TripSit harm reduction network\")]),_c('p',[_vm._v(\"Please share your feedback in #contrib\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Switch to the next lobby in the channel list.\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Switch to the previous lobby in the channel list.\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Collapse current network.\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Expand current network.\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Switch to the next window in the channel list.\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Switch to the previous window in the channel list.\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Switch to the first window with unread messages.\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Toggle sidebar.\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Toggle channel user list.\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Toggle jump to channel switcher.\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('span',[_c('kbd',[_vm._v(\"Esc\")])])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tClose current contextual window (context menu, image viewer, topic edit,\\n\\t\\t\\t\\t\\tetc) and remove focus from input.\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tMark any text typed after this shortcut to be colored. After hitting this\\n\\t\\t\\t\\t\\tshortcut, enter an integer in the range\\n\\t\\t\\t\\t\\t\"),_c('code',[_vm._v(\"0—15\")]),_vm._v(\" to select the desired color, or use the autocompletion\\n\\t\\t\\t\\t\\tmenu to choose a color name (see below).\\n\\t\\t\\t\\t\")]),_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tBackground color can be specified by putting a comma and another integer in\\n\\t\\t\\t\\t\\tthe range \"),_c('code',[_vm._v(\"0—15\")]),_vm._v(\" after the foreground color number\\n\\t\\t\\t\\t\\t(autocompletion works too).\\n\\t\\t\\t\\t\")]),_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tA color reference can be found\\n\\t\\t\\t\\t\\t\"),_c('a',{attrs:{\"href\":\"https://modern.ircdocs.horse/formatting.html#colors\",\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(\"here\")]),_vm._v(\".\\n\\t\\t\\t\\t\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tMark all text typed after this shortcut as\\n\\t\\t\\t\\t\\t\"),_c('span',{staticClass:\"irc-bold\"},[_vm._v(\"bold\")]),_vm._v(\".\\n\\t\\t\\t\\t\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tMark all text typed after this shortcut as\\n\\t\\t\\t\\t\\t\"),_c('span',{staticClass:\"irc-underline\"},[_vm._v(\"underlined\")]),_vm._v(\".\\n\\t\\t\\t\\t\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tMark all text typed after this shortcut as\\n\\t\\t\\t\\t\\t\"),_c('span',{staticClass:\"irc-italic\"},[_vm._v(\"italics\")]),_vm._v(\".\\n\\t\\t\\t\\t\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tMark all text typed after this shortcut as\\n\\t\\t\\t\\t\\t\"),_c('span',{staticClass:\"irc-strikethrough\"},[_vm._v(\"struck through\")]),_vm._v(\".\\n\\t\\t\\t\\t\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tMark all text typed after this shortcut as\\n\\t\\t\\t\\t\\t\"),_c('span',{staticClass:\"irc-monospace\"},[_vm._v(\"monospaced\")]),_vm._v(\".\\n\\t\\t\\t\\t\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tMark all text typed after this shortcut to be reset to its original\\n\\t\\t\\t\\t\\tformatting.\\n\\t\\t\\t\\t\")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('p',[_vm._v(\"\\n\\t\\t\\tTo auto-complete nicknames, channels, commands, and emoji, type one of the\\n\\t\\t\\tcharacters below to open a suggestion list. Use the \"),_c('kbd',[_vm._v(\"↑\")]),_vm._v(\" and\\n\\t\\t\\t\"),_c('kbd',[_vm._v(\"↓\")]),_vm._v(\" keys to highlight an item, and insert it by pressing \"),_c('kbd',[_vm._v(\"Tab\")]),_vm._v(\" or\\n\\t\\t\\t\"),_c('kbd',[_vm._v(\"Enter\")]),_vm._v(\" (or by clicking the desired item).\\n\\t\\t\")])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"@\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Nickname\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"#\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Channel\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Commands (see list of commands below)\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\":\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tEmoji (note: requires two search characters, to avoid conflicting with\\n\\t\\t\\t\\t\\tcommon emoticons like \"),_c('code',[_vm._v(\":)\")]),_vm._v(\")\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/away [message]\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Mark yourself as away with an optional message.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/back\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Remove your away status (set with \"),_c('code',[_vm._v(\"/away\")]),_vm._v(\").\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/ban nick\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tBan (\"),_c('code',[_vm._v(\"+b\")]),_vm._v(\") a user from the current channel. This can be a\\n\\t\\t\\t\\t\\tnickname or a hostmask.\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/banlist\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Load the banlist for the current channel.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/collapse\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tCollapse all previews in the current channel (opposite of\\n\\t\\t\\t\\t\\t\"),_c('code',[_vm._v(\"/expand\")]),_vm._v(\")\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/connect host [port]\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tConnect to a new IRC network. If \"),_c('code',[_vm._v(\"port\")]),_vm._v(\" starts with a\\n\\t\\t\\t\\t\\t\"),_c('code',[_vm._v(\"+\")]),_vm._v(\" sign, the connection will be made secure using TLS.\\n\\t\\t\\t\\t\")]),_c('p',[_vm._v(\"Alias: \"),_c('code',[_vm._v(\"/server\")])])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/ctcp target cmd [args]\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tSend a \"),_c('abbr',{attrs:{\"title\":\"Client-to-client protocol\"}},[_vm._v(\"CTCP\")]),_vm._v(\"\\n\\t\\t\\t\\t\\trequest. Read more about this on\\n\\t\\t\\t\\t\\t\"),_c('a',{attrs:{\"href\":\"https://en.wikipedia.org/wiki/Client-to-client_protocol\",\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(\"the dedicated Wikipedia article\")]),_vm._v(\".\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/deop nick [...nick]\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tRemove op (\"),_c('code',[_vm._v(\"-o\")]),_vm._v(\") from one or several users in the current\\n\\t\\t\\t\\t\\tchannel.\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/devoice nick [...nick]\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tRemove voice (\"),_c('code',[_vm._v(\"-v\")]),_vm._v(\") from one or several users in the current\\n\\t\\t\\t\\t\\tchannel.\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/disconnect [message]\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Disconnect from the current network with an optionally-provided message.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/expand\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tExpand all previews in the current channel (opposite of\\n\\t\\t\\t\\t\\t\"),_c('code',[_vm._v(\"/collapse\")]),_vm._v(\")\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/invite nick [channel]\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tInvite a user to the specified channel. If\\n\\t\\t\\t\\t\\t\"),_c('code',[_vm._v(\"channel\")]),_vm._v(\" is omitted, user will be invited to the current\\n\\t\\t\\t\\t\\tchannel.\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/ignore nick\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tBlock any messages from the specified user on the current network. This can\\n\\t\\t\\t\\t\\tbe a nickname or a hostmask.\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/ignorelist\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Load the list of ignored users for the current network.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/join channel\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Join a channel.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/kick nick\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Kick a user from the current channel.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/list\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Retrieve a list of available channels on this network.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/me message\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tSend an action message to the current channel. The Lounge will display it\\n\\t\\t\\t\\t\\tinline, as if the message was posted in the third person.\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/mode flags [args]\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tSet the given flags to the current channel if the active window is a\\n\\t\\t\\t\\t\\tchannel, another user if the active window is a private message window, or\\n\\t\\t\\t\\t\\tyourself if the current window is a server window.\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/msg channel message\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Send a message to the specified channel.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/nick newnick\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Change your nickname on the current network.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/notice channel message\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Sends a notice message to the specified channel.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/op nick [...nick]\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Give op (\"),_c('code',[_vm._v(\"+o\")]),_vm._v(\") to one or several users in the current channel.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/part [channel]\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tClose the specified channel or private message window, or the current\\n\\t\\t\\t\\t\\tchannel if \"),_c('code',[_vm._v(\"channel\")]),_vm._v(\" is omitted.\\n\\t\\t\\t\\t\")]),_c('p',[_vm._v(\"Aliases: \"),_c('code',[_vm._v(\"/close\")]),_vm._v(\", \"),_c('code',[_vm._v(\"/leave\")])])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/rejoin\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tLeave and immediately rejoin the current channel. Useful to quickly get op\\n\\t\\t\\t\\t\\tfrom ChanServ in an empty channel, for example.\\n\\t\\t\\t\\t\")]),_c('p',[_vm._v(\"Alias: \"),_c('code',[_vm._v(\"/cycle\")])])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/query nick\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Send a private message to the specified user.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/quit [message]\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Disconnect from the current network with an optional message.\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/raw message\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Send a raw message to the current IRC network.\")]),_c('p',[_vm._v(\"Aliases: \"),_c('code',[_vm._v(\"/quote\")]),_vm._v(\", \"),_c('code',[_vm._v(\"/send\")])])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/slap nick\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Slap someone in the current channel with a trout!\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/topic [newtopic]\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tGet the topic in the current channel. If \"),_c('code',[_vm._v(\"newtopic\")]),_vm._v(\" is specified,\\n\\t\\t\\t\\t\\tsets the topic in the current channel.\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/unban nick\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tUnban (\"),_c('code',[_vm._v(\"-b\")]),_vm._v(\") a user from the current channel. This can be a\\n\\t\\t\\t\\t\\tnickname or a hostmask.\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/unignore nick\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tUnblock messages from the specified user on the current network. This can be\\n\\t\\t\\t\\t\\ta nickname or a hostmask.\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/voice nick [...nick]\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"\\n\\t\\t\\t\\t\\tGive voice (\"),_c('code',[_vm._v(\"+v\")]),_vm._v(\") to one or several users in the current channel.\\n\\t\\t\\t\\t\")])])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"help-item\"},[_c('div',{staticClass:\"subject\"},[_c('code',[_vm._v(\"/whois nick\")])]),_c('div',{staticClass:\"description\"},[_c('p',[_vm._v(\"Retrieve information about the given user on the current network.\")])])])}]\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Changelog.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Changelog.vue?vue&type=script&lang=js&\"","<template>\n\t<div id=\"changelog\" class=\"window\" aria-label=\"Changelog\">\n\t\t<div class=\"header\">\n\t\t\t<SidebarToggle />\n\t\t</div>\n\t\t<div class=\"container\">\n\t\t\t<router-link id=\"back-to-help\" to=\"/help\">« Help</router-link>\n\n\t\t\t<template\n\t\t\t\tv-if=\"\n\t\t\t\t\t$store.state.versionData &&\n\t\t\t\t\t$store.state.versionData.current &&\n\t\t\t\t\t$store.state.versionData.current.version\n\t\t\t\t\"\n\t\t\t>\n\t\t\t\t<h1 class=\"title\">\n\t\t\t\t\tRelease notes for {{ $store.state.versionData.current.version }}\n\t\t\t\t</h1>\n\n\t\t\t\t<template v-if=\"$store.state.versionData.current.changelog\">\n\t\t\t\t\t<h3>Introduction</h3>\n\t\t\t\t\t<div\n\t\t\t\t\t\tref=\"changelog\"\n\t\t\t\t\t\tclass=\"changelog-text\"\n\t\t\t\t\t\tv-html=\"$store.state.versionData.current.changelog\"\n\t\t\t\t\t></div>\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t<p>Unable to retrieve changelog for current release from GitHub.</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t:href=\"`https://github.com/thelounge/thelounge/releases/tag/v${$store.state.serverConfiguration.version}`\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t>View release notes for this version on GitHub</a\n\t\t\t\t\t\t>\n\t\t\t\t\t</p>\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t\t<p v-else>Loading changelog…</p>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport socket from \"../../js/socket\";\nimport SidebarToggle from \"../SidebarToggle.vue\";\n\nexport default {\n\tname: \"Changelog\",\n\tcomponents: {\n\t\tSidebarToggle,\n\t},\n\tmounted() {\n\t\tif (!this.$store.state.versionData) {\n\t\t\tsocket.emit(\"changelog\");\n\t\t}\n\n\t\tthis.patchChangelog();\n\t},\n\tupdated() {\n\t\tthis.patchChangelog();\n\t},\n\tmethods: {\n\t\tpatchChangelog() {\n\t\t\tif (!this.$refs.changelog) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst links = this.$refs.changelog.querySelectorAll(\"a\");\n\n\t\t\tfor (const link of links) {\n\t\t\t\t// Make sure all links will open a new tab instead of exiting the application\n\t\t\t\tlink.setAttribute(\"target\", \"_blank\");\n\t\t\t\tlink.setAttribute(\"rel\", \"noopener\");\n\n\t\t\t\tif (link.querySelector(\"img\")) {\n\t\t\t\t\t// Add required metadata to image links, to support built-in image viewer\n\t\t\t\t\tlink.classList.add(\"toggle-thumbnail\");\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./Changelog.vue?vue&type=template&id=5f2edce1&\"\nimport script from \"./Changelog.vue?vue&type=script&lang=js&\"\nexport * from \"./Changelog.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"window\",attrs:{\"id\":\"changelog\",\"aria-label\":\"Changelog\"}},[_c('div',{staticClass:\"header\"},[_c('SidebarToggle')],1),_c('div',{staticClass:\"container\"},[_c('router-link',{attrs:{\"id\":\"back-to-help\",\"to\":\"/help\"}},[_vm._v(\"« Help\")]),(\n\t\t\t\t_vm.$store.state.versionData &&\n\t\t\t\t_vm.$store.state.versionData.current &&\n\t\t\t\t_vm.$store.state.versionData.current.version\n\t\t\t)?[_c('h1',{staticClass:\"title\"},[_vm._v(\"\\n\\t\\t\\t\\tRelease notes for \"+_vm._s(_vm.$store.state.versionData.current.version)+\"\\n\\t\\t\\t\")]),(_vm.$store.state.versionData.current.changelog)?[_c('h3',[_vm._v(\"Introduction\")]),_c('div',{ref:\"changelog\",staticClass:\"changelog-text\",domProps:{\"innerHTML\":_vm._s(_vm.$store.state.versionData.current.changelog)}})]:[_c('p',[_vm._v(\"Unable to retrieve changelog for current release from GitHub.\")]),_c('p',[_c('a',{attrs:{\"href\":(\"https://github.com/thelounge/thelounge/releases/tag/v\" + (_vm.$store.state.serverConfiguration.version)),\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(\"View release notes for this version on GitHub\")])])]]:_c('p',[_vm._v(\"Loading changelog…\")])],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NetworkEdit.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NetworkEdit.vue?vue&type=script&lang=js&\"","<template>\n\t<NetworkForm\n\t\tv-if=\"networkData\"\n\t\t:handle-submit=\"handleSubmit\"\n\t\t:defaults=\"networkData\"\n\t\t:disabled=\"disabled\"\n\t/>\n</template>\n\n<script>\nimport socket from \"../../js/socket\";\nimport NetworkForm from \"../NetworkForm.vue\";\n\nexport default {\n\tname: \"NetworkEdit\",\n\tcomponents: {\n\t\tNetworkForm,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tdisabled: false,\n\t\t\tnetworkData: null,\n\t\t};\n\t},\n\twatch: {\n\t\t\"$route.params.uuid\"() {\n\t\t\tthis.setNetworkData();\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.setNetworkData();\n\t},\n\tmethods: {\n\t\tsetNetworkData() {\n\t\t\tsocket.emit(\"network:get\", this.$route.params.uuid);\n\t\t\tthis.networkData = this.$store.getters.findNetwork(this.$route.params.uuid);\n\t\t},\n\t\thandleSubmit(data) {\n\t\t\tthis.disabled = true;\n\t\t\tsocket.emit(\"network:edit\", data);\n\n\t\t\t// TODO: move networks to vuex and update state when the network info comes in\n\t\t\tconst network = this.$store.getters.findNetwork(data.uuid);\n\t\t\tnetwork.name = network.channels[0].name = data.name;\n\n\t\t\tthis.$root.switchToChannel(network.channels[0]);\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./NetworkEdit.vue?vue&type=template&id=62f461d7&\"\nimport script from \"./NetworkEdit.vue?vue&type=script&lang=js&\"\nexport * from \"./NetworkEdit.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.networkData)?_c('NetworkForm',{attrs:{\"handle-submit\":_vm.handleSubmit,\"defaults\":_vm.networkData,\"disabled\":_vm.disabled}}):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LinkPreview.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./LinkPreview.vue?vue&type=script&lang=js&\"","<template>\n\t<div\n\t\tv-if=\"link.shown\"\n\t\tv-show=\"link.sourceLoaded || link.type === 'link'\"\n\t\tref=\"container\"\n\t\tclass=\"preview\"\n\t\tdir=\"ltr\"\n\t>\n\t\t<div\n\t\t\tref=\"content\"\n\t\t\t:class=\"['toggle-content', 'toggle-type-' + link.type, {opened: isContentShown}]\"\n\t\t>\n\t\t\t<template v-if=\"link.type === 'link'\">\n\t\t\t\t<a\n\t\t\t\t\tv-if=\"link.thumb\"\n\t\t\t\t\tv-show=\"link.sourceLoaded\"\n\t\t\t\t\t:href=\"link.link\"\n\t\t\t\t\tclass=\"toggle-thumbnail\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t@click=\"onThumbnailClick\"\n\t\t\t\t>\n\t\t\t\t\t<img\n\t\t\t\t\t\t:src=\"link.thumb\"\n\t\t\t\t\t\tdecoding=\"async\"\n\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\tclass=\"thumb\"\n\t\t\t\t\t\t@error=\"onThumbnailError\"\n\t\t\t\t\t\t@abort=\"onThumbnailError\"\n\t\t\t\t\t\t@load=\"onPreviewReady\"\n\t\t\t\t\t/>\n\t\t\t\t</a>\n\t\t\t\t<div class=\"toggle-text\" dir=\"auto\">\n\t\t\t\t\t<div class=\"head\">\n\t\t\t\t\t\t<div class=\"overflowable\">\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t:href=\"link.link\"\n\t\t\t\t\t\t\t\t:title=\"link.head\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t\t\t>{{ link.head }}</a\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tv-if=\"showMoreButton\"\n\t\t\t\t\t\t\t:aria-expanded=\"isContentShown\"\n\t\t\t\t\t\t\t:aria-label=\"moreButtonLabel\"\n\t\t\t\t\t\t\tdir=\"auto\"\n\t\t\t\t\t\t\tclass=\"more\"\n\t\t\t\t\t\t\t@click=\"onMoreClick\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<span class=\"more-caret\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"body overflowable\">\n\t\t\t\t\t\t<a :href=\"link.link\" :title=\"link.body\" target=\"_blank\" rel=\"noopener\">{{\n\t\t\t\t\t\t\tlink.body\n\t\t\t\t\t\t}}</a>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"link.type === 'image'\">\n\t\t\t\t<a\n\t\t\t\t\t:href=\"link.link\"\n\t\t\t\t\tclass=\"toggle-thumbnail\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t@click=\"onThumbnailClick\"\n\t\t\t\t>\n\t\t\t\t\t<img\n\t\t\t\t\t\tv-show=\"link.sourceLoaded\"\n\t\t\t\t\t\t:src=\"link.thumb\"\n\t\t\t\t\t\tdecoding=\"async\"\n\t\t\t\t\t\talt=\"\"\n\t\t\t\t\t\t@load=\"onPreviewReady\"\n\t\t\t\t\t/>\n\t\t\t\t</a>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"link.type === 'video'\">\n\t\t\t\t<video\n\t\t\t\t\tv-show=\"link.sourceLoaded\"\n\t\t\t\t\tpreload=\"metadata\"\n\t\t\t\t\tcontrols\n\t\t\t\t\t@canplay=\"onPreviewReady\"\n\t\t\t\t>\n\t\t\t\t\t<source :src=\"link.media\" :type=\"link.mediaType\" />\n\t\t\t\t</video>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"link.type === 'audio'\">\n\t\t\t\t<audio\n\t\t\t\t\tv-show=\"link.sourceLoaded\"\n\t\t\t\t\tcontrols\n\t\t\t\t\tpreload=\"metadata\"\n\t\t\t\t\t@canplay=\"onPreviewReady\"\n\t\t\t\t>\n\t\t\t\t\t<source :src=\"link.media\" :type=\"link.mediaType\" />\n\t\t\t\t</audio>\n\t\t\t</template>\n\t\t\t<template v-else-if=\"link.type === 'error'\">\n\t\t\t\t<em v-if=\"link.error === 'image-too-big'\">\n\t\t\t\t\tThis image is larger than {{ imageMaxSize }} and cannot be previewed.\n\t\t\t\t\t<a :href=\"link.link\" target=\"_blank\" rel=\"noopener\">Click here</a>\n\t\t\t\t\tto open it in a new window.\n\t\t\t\t</em>\n\t\t\t\t<template v-else-if=\"link.error === 'message'\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<em>\n\t\t\t\t\t\t\tA preview could not be loaded.\n\t\t\t\t\t\t\t<a :href=\"link.link\" target=\"_blank\" rel=\"noopener\">Click here</a>\n\t\t\t\t\t\t\tto open it in a new window.\n\t\t\t\t\t\t</em>\n\t\t\t\t\t\t<br />\n\t\t\t\t\t\t<pre class=\"prefetch-error\">{{ link.message }}</pre>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<button\n\t\t\t\t\t\t:aria-expanded=\"isContentShown\"\n\t\t\t\t\t\t:aria-label=\"moreButtonLabel\"\n\t\t\t\t\t\tclass=\"more\"\n\t\t\t\t\t\t@click=\"onMoreClick\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<span class=\"more-caret\" />\n\t\t\t\t\t</button>\n\t\t\t\t</template>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport eventbus from \"../js/eventbus\";\nimport friendlysize from \"../js/helpers/friendlysize\";\n\nexport default {\n\tname: \"LinkPreview\",\n\tprops: {\n\t\tlink: Object,\n\t\tkeepScrollPosition: Function,\n\t\tchannel: Object,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tshowMoreButton: false,\n\t\t\tisContentShown: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\tmoreButtonLabel() {\n\t\t\treturn this.isContentShown ? \"Less\" : \"More\";\n\t\t},\n\t\timageMaxSize() {\n\t\t\tif (!this.link.maxSize) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn friendlysize(this.link.maxSize);\n\t\t},\n\t},\n\twatch: {\n\t\t\"link.type\"() {\n\t\t\tthis.updateShownState();\n\t\t\tthis.onPreviewUpdate();\n\t\t},\n\t},\n\tcreated() {\n\t\tthis.updateShownState();\n\t},\n\tmounted() {\n\t\teventbus.on(\"resize\", this.handleResize);\n\n\t\tthis.onPreviewUpdate();\n\t},\n\tbeforeDestroy() {\n\t\teventbus.off(\"resize\", this.handleResize);\n\t},\n\tdestroyed() {\n\t\t// Let this preview go through load/canplay events again,\n\t\t// Otherwise the browser can cause a resize on video elements\n\t\tthis.link.sourceLoaded = false;\n\t},\n\tmethods: {\n\t\tonPreviewUpdate() {\n\t\t\t// Don't display previews while they are loading on the server\n\t\t\tif (this.link.type === \"loading\") {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Error does not have any media to render\n\t\t\tif (this.link.type === \"error\") {\n\t\t\t\tthis.onPreviewReady();\n\t\t\t}\n\n\t\t\t// If link doesn't have a thumbnail, render it\n\t\t\tif (this.link.type === \"link\") {\n\t\t\t\tthis.handleResize();\n\t\t\t\tthis.keepScrollPosition();\n\t\t\t}\n\t\t},\n\t\tonPreviewReady() {\n\t\t\tthis.$set(this.link, \"sourceLoaded\", true);\n\n\t\t\tthis.keepScrollPosition();\n\n\t\t\tif (this.link.type === \"link\") {\n\t\t\t\tthis.handleResize();\n\t\t\t}\n\t\t},\n\t\tonThumbnailError() {\n\t\t\t// If thumbnail fails to load, hide it and show the preview without it\n\t\t\tthis.link.thumb = \"\";\n\t\t\tthis.onPreviewReady();\n\t\t},\n\t\tonThumbnailClick(e) {\n\t\t\te.preventDefault();\n\n\t\t\tconst imageViewer = this.$root.$refs.app.$refs.imageViewer;\n\t\t\timageViewer.channel = this.channel;\n\t\t\timageViewer.link = this.link;\n\t\t},\n\t\tonMoreClick() {\n\t\t\tthis.isContentShown = !this.isContentShown;\n\t\t\tthis.keepScrollPosition();\n\t\t},\n\t\thandleResize() {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tif (!this.$refs.content) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.showMoreButton =\n\t\t\t\t\tthis.$refs.content.offsetWidth >= this.$refs.container.offsetWidth;\n\t\t\t});\n\t\t},\n\t\tupdateShownState() {\n\t\t\t// User has manually toggled the preview, do not apply default\n\t\t\tif (this.link.shown !== null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet defaultState = false;\n\n\t\t\tswitch (this.link.type) {\n\t\t\t\tcase \"error\":\n\t\t\t\t\t// Collapse all errors by default unless its a message about image being too big\n\t\t\t\t\tif (this.link.error === \"image-too-big\") {\n\t\t\t\t\t\tdefaultState = this.$store.state.settings.media;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"link\":\n\t\t\t\t\tdefaultState = this.$store.state.settings.links;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdefaultState = this.$store.state.settings.media;\n\t\t\t}\n\n\t\t\tthis.link.shown = defaultState;\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./LinkPreview.vue?vue&type=template&id=96c3f280&\"\nimport script from \"./LinkPreview.vue?vue&type=script&lang=js&\"\nexport * from \"./LinkPreview.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.link.shown)?_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.link.sourceLoaded || _vm.link.type === 'link'),expression:\"link.sourceLoaded || link.type === 'link'\"}],ref:\"container\",staticClass:\"preview\",attrs:{\"dir\":\"ltr\"}},[_c('div',{ref:\"content\",class:['toggle-content', 'toggle-type-' + _vm.link.type, {opened: _vm.isContentShown}]},[(_vm.link.type === 'link')?[(_vm.link.thumb)?_c('a',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.link.sourceLoaded),expression:\"link.sourceLoaded\"}],staticClass:\"toggle-thumbnail\",attrs:{\"href\":_vm.link.link,\"target\":\"_blank\",\"rel\":\"noopener\"},on:{\"click\":_vm.onThumbnailClick}},[_c('img',{staticClass:\"thumb\",attrs:{\"src\":_vm.link.thumb,\"decoding\":\"async\",\"alt\":\"\"},on:{\"error\":_vm.onThumbnailError,\"abort\":_vm.onThumbnailError,\"load\":_vm.onPreviewReady}})]):_vm._e(),_c('div',{staticClass:\"toggle-text\",attrs:{\"dir\":\"auto\"}},[_c('div',{staticClass:\"head\"},[_c('div',{staticClass:\"overflowable\"},[_c('a',{attrs:{\"href\":_vm.link.link,\"title\":_vm.link.head,\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(_vm._s(_vm.link.head))])]),(_vm.showMoreButton)?_c('button',{staticClass:\"more\",attrs:{\"aria-expanded\":_vm.isContentShown,\"aria-label\":_vm.moreButtonLabel,\"dir\":\"auto\"},on:{\"click\":_vm.onMoreClick}},[_c('span',{staticClass:\"more-caret\"})]):_vm._e()]),_c('div',{staticClass:\"body overflowable\"},[_c('a',{attrs:{\"href\":_vm.link.link,\"title\":_vm.link.body,\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(_vm._s(_vm.link.body))])])])]:(_vm.link.type === 'image')?[_c('a',{staticClass:\"toggle-thumbnail\",attrs:{\"href\":_vm.link.link,\"target\":\"_blank\",\"rel\":\"noopener\"},on:{\"click\":_vm.onThumbnailClick}},[_c('img',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.link.sourceLoaded),expression:\"link.sourceLoaded\"}],attrs:{\"src\":_vm.link.thumb,\"decoding\":\"async\",\"alt\":\"\"},on:{\"load\":_vm.onPreviewReady}})])]:(_vm.link.type === 'video')?[_c('video',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.link.sourceLoaded),expression:\"link.sourceLoaded\"}],attrs:{\"preload\":\"metadata\",\"controls\":\"\"},on:{\"canplay\":_vm.onPreviewReady}},[_c('source',{attrs:{\"src\":_vm.link.media,\"type\":_vm.link.mediaType}})])]:(_vm.link.type === 'audio')?[_c('audio',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.link.sourceLoaded),expression:\"link.sourceLoaded\"}],attrs:{\"controls\":\"\",\"preload\":\"metadata\"},on:{\"canplay\":_vm.onPreviewReady}},[_c('source',{attrs:{\"src\":_vm.link.media,\"type\":_vm.link.mediaType}})])]:(_vm.link.type === 'error')?[(_vm.link.error === 'image-too-big')?_c('em',[_vm._v(\"\\n\\t\\t\\t\\tThis image is larger than \"+_vm._s(_vm.imageMaxSize)+\" and cannot be previewed.\\n\\t\\t\\t\\t\"),_c('a',{attrs:{\"href\":_vm.link.link,\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(\"Click here\")]),_vm._v(\"\\n\\t\\t\\t\\tto open it in a new window.\\n\\t\\t\\t\")]):(_vm.link.error === 'message')?[_c('div',[_c('em',[_vm._v(\"\\n\\t\\t\\t\\t\\t\\tA preview could not be loaded.\\n\\t\\t\\t\\t\\t\\t\"),_c('a',{attrs:{\"href\":_vm.link.link,\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(\"Click here\")]),_vm._v(\"\\n\\t\\t\\t\\t\\t\\tto open it in a new window.\\n\\t\\t\\t\\t\\t\")]),_c('br'),_c('pre',{staticClass:\"prefetch-error\"},[_vm._v(_vm._s(_vm.link.message))])]),_c('button',{staticClass:\"more\",attrs:{\"aria-expanded\":_vm.isContentShown,\"aria-label\":_vm.moreButtonLabel},on:{\"click\":_vm.onMoreClick}},[_c('span',{staticClass:\"more-caret\"})])]:_vm._e()]:_vm._e()],2)]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\"use strict\";\n\n// This creates a version of `require()` in the context of the current\n// directory, so we iterate over its content, which is a map statically built by\n// Webpack.\n// Second argument says it's recursive, third makes sure we only load templates.\nconst requireViews = require.context(\".\", false, /\\.vue$/);\n\nexport default requireViews.keys().reduce((acc, path) => {\n\tacc[\"message-\" + path.substring(2, path.length - 4)] = requireViews(path).default;\n\n\treturn acc;\n}, {});\n","<template>\n\t<div\n\t\t:id=\"'msg-' + message.id\"\n\t\t:class=\"[\n\t\t\t'msg',\n\t\t\t{self: message.self, highlight: message.highlight, 'previous-source': isPreviousSource},\n\t\t]\"\n\t\t:data-type=\"message.type\"\n\t\t:data-command=\"message.command\"\n\t\t:data-from=\"message.from && message.from.nick\"\n\t>\n\t\t<span :aria-label=\"messageTimeLocale\" class=\"time tooltipped tooltipped-e\"\n\t\t\t>{{ messageTime }}\n\t\t</span>\n\t\t<template v-if=\"message.type === 'unhandled'\">\n\t\t\t<span class=\"from\">[{{ message.command }}]</span>\n\t\t\t<span class=\"content\">\n\t\t\t\t<span v-for=\"(param, id) in message.params\" :key=\"id\">{{ param }} </span>\n\t\t\t</span>\n\t\t</template>\n\t\t<template v-else-if=\"isAction()\">\n\t\t\t<span class=\"from\"><span class=\"only-copy\">*** </span></span>\n\t\t\t<component :is=\"messageComponent\" :network=\"network\" :message=\"message\" />\n\t\t</template>\n\t\t<template v-else-if=\"message.type === 'action'\">\n\t\t\t<span class=\"from\"><span class=\"only-copy\">* </span></span>\n\t\t\t<span class=\"content\" dir=\"auto\">\n\t\t\t\t<Username :user=\"message.from\" dir=\"auto\" />&#32;<ParsedMessage\n\t\t\t\t\t:message=\"message\"\n\t\t\t\t/>\n\t\t\t\t<LinkPreview\n\t\t\t\t\tv-for=\"preview in message.previews\"\n\t\t\t\t\t:key=\"preview.link\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:link=\"preview\"\n\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t/>\n\t\t\t</span>\n\t\t</template>\n\t\t<template v-else>\n\t\t\t<span v-if=\"message.type === 'message'\" class=\"from\">\n\t\t\t\t<template v-if=\"message.from && message.from.nick\">\n\t\t\t\t\t<span class=\"only-copy\">&lt;</span>\n\t\t\t\t\t<Username :user=\"message.from\" />\n\t\t\t\t\t<span class=\"only-copy\">&gt; </span>\n\t\t\t\t</template>\n\t\t\t</span>\n\t\t\t<span v-else-if=\"message.type === 'plugin'\" class=\"from\">\n\t\t\t\t<template v-if=\"message.from && message.from.nick\">\n\t\t\t\t\t<span class=\"only-copy\">[</span>\n\t\t\t\t\t{{ message.from.nick }}\n\t\t\t\t\t<span class=\"only-copy\">] </span>\n\t\t\t\t</template>\n\t\t\t</span>\n\t\t\t<span v-else class=\"from\">\n\t\t\t\t<template v-if=\"message.from && message.from.nick\">\n\t\t\t\t\t<span class=\"only-copy\">-</span>\n\t\t\t\t\t<Username :user=\"message.from\" />\n\t\t\t\t\t<span class=\"only-copy\">- </span>\n\t\t\t\t</template>\n\t\t\t</span>\n\t\t\t<span class=\"content\" dir=\"auto\">\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"message.showInActive\"\n\t\t\t\t\taria-label=\"This message was shown in your active channel\"\n\t\t\t\t\tclass=\"msg-shown-in-active tooltipped tooltipped-e\"\n\t\t\t\t\t><span></span\n\t\t\t\t></span>\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"message.statusmsgGroup\"\n\t\t\t\t\t:aria-label=\"`This message was only shown to users with ${message.statusmsgGroup} mode`\"\n\t\t\t\t\tclass=\"msg-statusmsg tooltipped tooltipped-e\"\n\t\t\t\t\t><span>{{ message.statusmsgGroup }}</span></span\n\t\t\t\t>\n\t\t\t\t<ParsedMessage :network=\"network\" :message=\"message\" />\n\t\t\t\t<LinkPreview\n\t\t\t\t\tv-for=\"preview in message.previews\"\n\t\t\t\t\t:key=\"preview.link\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:link=\"preview\"\n\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t/>\n\t\t\t</span>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nconst constants = require(\"../js/constants\");\nimport localetime from \"../js/helpers/localetime\";\nimport dayjs from \"dayjs\";\nimport Username from \"./Username.vue\";\nimport LinkPreview from \"./LinkPreview.vue\";\nimport ParsedMessage from \"./ParsedMessage.vue\";\nimport MessageTypes from \"./MessageTypes\";\n\nMessageTypes.ParsedMessage = ParsedMessage;\nMessageTypes.LinkPreview = LinkPreview;\nMessageTypes.Username = Username;\n\nexport default {\n\tname: \"Message\",\n\tcomponents: MessageTypes,\n\tprops: {\n\t\tmessage: Object,\n\t\tchannel: Object,\n\t\tnetwork: Object,\n\t\tkeepScrollPosition: Function,\n\t\tisPreviousSource: Boolean,\n\t},\n\tcomputed: {\n\t\ttimeFormat() {\n\t\t\tlet format;\n\n\t\t\tif (this.$store.state.settings.use12hClock) {\n\t\t\t\tformat = this.$store.state.settings.showSeconds ? \"msg12hWithSeconds\" : \"msg12h\";\n\t\t\t} else {\n\t\t\t\tformat = this.$store.state.settings.showSeconds ? \"msgWithSeconds\" : \"msgDefault\";\n\t\t\t}\n\n\t\t\treturn constants.timeFormats[format];\n\t\t},\n\t\tmessageTime() {\n\t\t\treturn dayjs(this.message.time).format(this.timeFormat);\n\t\t},\n\t\tmessageTimeLocale() {\n\t\t\treturn localetime(this.message.time);\n\t\t},\n\t\tmessageComponent() {\n\t\t\treturn \"message-\" + this.message.type;\n\t\t},\n\t},\n\tmethods: {\n\t\tisAction() {\n\t\t\treturn typeof MessageTypes[\"message-\" + this.message.type] !== \"undefined\";\n\t\t},\n\t},\n};\n</script>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Message.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Message.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Message.vue?vue&type=template&id=1bffcf2e&\"\nimport script from \"./Message.vue?vue&type=script&lang=js&\"\nexport * from \"./Message.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:[\n\t\t'msg',\n\t\t{self: _vm.message.self, highlight: _vm.message.highlight, 'previous-source': _vm.isPreviousSource} ],attrs:{\"id\":'msg-' + _vm.message.id,\"data-type\":_vm.message.type,\"data-command\":_vm.message.command,\"data-from\":_vm.message.from && _vm.message.from.nick}},[_c('span',{staticClass:\"time tooltipped tooltipped-e\",attrs:{\"aria-label\":_vm.messageTimeLocale}},[_vm._v(_vm._s(_vm.messageTime)+\"\\n\\t\")]),(_vm.message.type === 'unhandled')?[_c('span',{staticClass:\"from\"},[_vm._v(\"[\"+_vm._s(_vm.message.command)+\"]\")]),_c('span',{staticClass:\"content\"},_vm._l((_vm.message.params),function(param,id){return _c('span',{key:id},[_vm._v(_vm._s(param)+\" \")])}),0)]:(_vm.isAction())?[_vm._m(0),_c(_vm.messageComponent,{tag:\"component\",attrs:{\"network\":_vm.network,\"message\":_vm.message}})]:(_vm.message.type === 'action')?[_vm._m(1),_c('span',{staticClass:\"content\",attrs:{\"dir\":\"auto\"}},[_c('Username',{attrs:{\"user\":_vm.message.from,\"dir\":\"auto\"}}),_vm._v(\" \"),_c('ParsedMessage',{attrs:{\"message\":_vm.message}}),_vm._l((_vm.message.previews),function(preview){return _c('LinkPreview',{key:preview.link,attrs:{\"keep-scroll-position\":_vm.keepScrollPosition,\"link\":preview,\"channel\":_vm.channel}})})],2)]:[(_vm.message.type === 'message')?_c('span',{staticClass:\"from\"},[(_vm.message.from && _vm.message.from.nick)?[_c('span',{staticClass:\"only-copy\"},[_vm._v(\"<\")]),_c('Username',{attrs:{\"user\":_vm.message.from}}),_c('span',{staticClass:\"only-copy\"},[_vm._v(\"> \")])]:_vm._e()],2):(_vm.message.type === 'plugin')?_c('span',{staticClass:\"from\"},[(_vm.message.from && _vm.message.from.nick)?[_c('span',{staticClass:\"only-copy\"},[_vm._v(\"[\")]),_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.message.from.nick)+\"\\n\\t\\t\\t\\t\"),_c('span',{staticClass:\"only-copy\"},[_vm._v(\"] \")])]:_vm._e()],2):_c('span',{staticClass:\"from\"},[(_vm.message.from && _vm.message.from.nick)?[_c('span',{staticClass:\"only-copy\"},[_vm._v(\"-\")]),_c('Username',{attrs:{\"user\":_vm.message.from}}),_c('span',{staticClass:\"only-copy\"},[_vm._v(\"- \")])]:_vm._e()],2),_c('span',{staticClass:\"content\",attrs:{\"dir\":\"auto\"}},[(_vm.message.showInActive)?_c('span',{staticClass:\"msg-shown-in-active tooltipped tooltipped-e\",attrs:{\"aria-label\":\"This message was shown in your active channel\"}},[_c('span')]):_vm._e(),(_vm.message.statusmsgGroup)?_c('span',{staticClass:\"msg-statusmsg tooltipped tooltipped-e\",attrs:{\"aria-label\":(\"This message was only shown to users with \" + (_vm.message.statusmsgGroup) + \" mode\")}},[_c('span',[_vm._v(_vm._s(_vm.message.statusmsgGroup))])]):_vm._e(),_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"message\":_vm.message}}),_vm._l((_vm.message.previews),function(preview){return _c('LinkPreview',{key:preview.link,attrs:{\"keep-scroll-position\":_vm.keepScrollPosition,\"link\":preview,\"channel\":_vm.channel}})})],2)]],2)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"from\"},[_c('span',{staticClass:\"only-copy\"},[_vm._v(\"*** \")])])},function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"from\"},[_c('span',{staticClass:\"only-copy\"},[_vm._v(\"* \")])])}]\n\nexport { render, staticRenderFns }","<template>\n\t<div :class=\"['msg', {closed: isCollapsed}]\" data-type=\"condensed\">\n\t\t<div class=\"condensed-summary\">\n\t\t\t<span class=\"time\" />\n\t\t\t<span class=\"from\" />\n\t\t\t<span class=\"content\" @click=\"onCollapseClick\"\n\t\t\t\t>{{ condensedText\n\t\t\t\t}}<button class=\"toggle-button\" aria-label=\"Toggle status messages\"\n\t\t\t/></span>\n\t\t</div>\n\t\t<Message\n\t\t\tv-for=\"message in messages\"\n\t\t\t:key=\"message.id\"\n\t\t\t:network=\"network\"\n\t\t\t:message=\"message\"\n\t\t/>\n\t</div>\n</template>\n\n<script>\nconst constants = require(\"../js/constants\");\nimport Message from \"./Message.vue\";\n\nexport default {\n\tname: \"MessageCondensed\",\n\tcomponents: {\n\t\tMessage,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessages: Array,\n\t\tkeepScrollPosition: Function,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisCollapsed: true,\n\t\t};\n\t},\n\tcomputed: {\n\t\tcondensedText() {\n\t\t\tconst obj = {};\n\n\t\t\tconstants.condensedTypes.forEach((type) => {\n\t\t\t\tobj[type] = 0;\n\t\t\t});\n\n\t\t\tfor (const message of this.messages) {\n\t\t\t\tobj[message.type]++;\n\t\t\t}\n\n\t\t\t// Count quits as parts in condensed messages to reduce information density\n\t\t\tobj.part += obj.quit;\n\n\t\t\tconst strings = [];\n\t\t\tconstants.condensedTypes.forEach((type) => {\n\t\t\t\tif (obj[type]) {\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase \"chghost\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tobj[type] +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1\n\t\t\t\t\t\t\t\t\t\t? \" users have changed hostname\"\n\t\t\t\t\t\t\t\t\t\t: \" user has changed hostname\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"join\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tobj[type] +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1 ? \" users have joined\" : \" user has joined\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"part\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tobj[type] + (obj[type] > 1 ? \" users have left\" : \" user has left\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"nick\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tobj[type] +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1\n\t\t\t\t\t\t\t\t\t\t? \" users have changed nick\"\n\t\t\t\t\t\t\t\t\t\t: \" user has changed nick\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"kick\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tobj[type] +\n\t\t\t\t\t\t\t\t\t(obj[type] > 1 ? \" users were kicked\" : \" user was kicked\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"mode\":\n\t\t\t\t\t\t\tstrings.push(\n\t\t\t\t\t\t\t\tobj[type] + (obj[type] > 1 ? \" modes were set\" : \" mode was set\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tlet text = strings.pop();\n\n\t\t\tif (strings.length) {\n\t\t\t\ttext = strings.join(\", \") + \", and \" + text;\n\t\t\t}\n\n\t\t\treturn text;\n\t\t},\n\t},\n\tmethods: {\n\t\tonCollapseClick() {\n\t\t\tthis.isCollapsed = !this.isCollapsed;\n\t\t\tthis.keepScrollPosition();\n\t\t},\n\t},\n};\n</script>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MessageCondensed.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MessageCondensed.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./MessageCondensed.vue?vue&type=template&id=024bf79a&\"\nimport script from \"./MessageCondensed.vue?vue&type=script&lang=js&\"\nexport * from \"./MessageCondensed.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:['msg', {closed: _vm.isCollapsed}],attrs:{\"data-type\":\"condensed\"}},[_c('div',{staticClass:\"condensed-summary\"},[_c('span',{staticClass:\"time\"}),_c('span',{staticClass:\"from\"}),_c('span',{staticClass:\"content\",on:{\"click\":_vm.onCollapseClick}},[_vm._v(_vm._s(_vm.condensedText)),_c('button',{staticClass:\"toggle-button\",attrs:{\"aria-label\":\"Toggle status messages\"}})])]),_vm._l((_vm.messages),function(message){return _c('Message',{key:message.id,attrs:{\"network\":_vm.network,\"message\":message}})})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<div :aria-label=\"localeDate\" class=\"date-marker-container tooltipped tooltipped-s\">\n\t\t<div class=\"date-marker\">\n\t\t\t<span :aria-label=\"friendlyDate()\" class=\"date-marker-text\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nimport dayjs from \"dayjs\";\nimport calendar from \"dayjs/plugin/calendar\";\nimport eventbus from \"../js/eventbus\";\n\ndayjs.extend(calendar);\n\nexport default {\n\tname: \"DateMarker\",\n\tprops: {\n\t\tmessage: Object,\n\t},\n\tcomputed: {\n\t\tlocaleDate() {\n\t\t\treturn dayjs(this.message.time).format(\"D MMMM YYYY\");\n\t\t},\n\t},\n\tmounted() {\n\t\tif (this.hoursPassed() < 48) {\n\t\t\teventbus.on(\"daychange\", this.dayChange);\n\t\t}\n\t},\n\tbeforeDestroy() {\n\t\teventbus.off(\"daychange\", this.dayChange);\n\t},\n\tmethods: {\n\t\thoursPassed() {\n\t\t\treturn (Date.now() - Date.parse(this.message.time)) / 3600000;\n\t\t},\n\t\tdayChange() {\n\t\t\tthis.$forceUpdate();\n\n\t\t\tif (this.hoursPassed() >= 48) {\n\t\t\t\teventbus.off(\"daychange\", this.dayChange);\n\t\t\t}\n\t\t},\n\t\tfriendlyDate() {\n\t\t\t// See http://momentjs.com/docs/#/displaying/calendar-time/\n\t\t\treturn dayjs(this.message.time).calendar(null, {\n\t\t\t\tsameDay: \"[Today]\",\n\t\t\t\tlastDay: \"[Yesterday]\",\n\t\t\t\tlastWeek: \"D MMMM YYYY\",\n\t\t\t\tsameElse: \"D MMMM YYYY\",\n\t\t\t});\n\t\t},\n\t},\n};\n</script>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DateMarker.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./DateMarker.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./DateMarker.vue?vue&type=template&id=f394bb00&\"\nimport script from \"./DateMarker.vue?vue&type=script&lang=js&\"\nexport * from \"./DateMarker.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"date-marker-container tooltipped tooltipped-s\",attrs:{\"aria-label\":_vm.localeDate}},[_c('div',{staticClass:\"date-marker\"},[_c('span',{staticClass:\"date-marker-text\",attrs:{\"aria-label\":_vm.friendlyDate()}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<div ref=\"chat\" class=\"chat\" tabindex=\"-1\">\n\t\t<div v-show=\"channel.moreHistoryAvailable\" class=\"show-more\">\n\t\t\t<button\n\t\t\t\tref=\"loadMoreButton\"\n\t\t\t\t:disabled=\"channel.historyLoading || !$store.state.isConnected\"\n\t\t\t\tclass=\"btn\"\n\t\t\t\t@click=\"onShowMoreClick\"\n\t\t\t>\n\t\t\t\t<span v-if=\"channel.historyLoading\">Loading…</span>\n\t\t\t\t<span v-else>Show older messages</span>\n\t\t\t</button>\n\t\t</div>\n\t\t<div\n\t\t\tclass=\"messages\"\n\t\t\trole=\"log\"\n\t\t\taria-live=\"polite\"\n\t\t\taria-relevant=\"additions\"\n\t\t\t@copy=\"onCopy\"\n\t\t>\n\t\t\t<template v-for=\"(message, id) in condensedMessages\">\n\t\t\t\t<DateMarker\n\t\t\t\t\tv-if=\"shouldDisplayDateMarker(message, id)\"\n\t\t\t\t\t:key=\"message.id + '-date'\"\n\t\t\t\t\t:message=\"message\"\n\t\t\t\t/>\n\t\t\t\t<div\n\t\t\t\t\tv-if=\"shouldDisplayUnreadMarker(message.id)\"\n\t\t\t\t\t:key=\"message.id + '-unread'\"\n\t\t\t\t\tclass=\"unread-marker\"\n\t\t\t\t>\n\t\t\t\t\t<span class=\"unread-marker-text\" />\n\t\t\t\t</div>\n\n\t\t\t\t<MessageCondensed\n\t\t\t\t\tv-if=\"message.type === 'condensed'\"\n\t\t\t\t\t:key=\"message.messages[0].id\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:messages=\"message.messages\"\n\t\t\t\t/>\n\t\t\t\t<Message\n\t\t\t\t\tv-else\n\t\t\t\t\t:key=\"message.id\"\n\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:message=\"message\"\n\t\t\t\t\t:keep-scroll-position=\"keepScrollPosition\"\n\t\t\t\t\t:is-previous-source=\"isPreviousSource(message, id)\"\n\t\t\t\t\t@toggle-link-preview=\"onLinkPreviewToggle\"\n\t\t\t\t/>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nconst constants = require(\"../js/constants\");\nimport eventbus from \"../js/eventbus\";\nimport clipboard from \"../js/clipboard\";\nimport socket from \"../js/socket\";\nimport Message from \"./Message.vue\";\nimport MessageCondensed from \"./MessageCondensed.vue\";\nimport DateMarker from \"./DateMarker.vue\";\n\nlet unreadMarkerShown = false;\n\nexport default {\n\tname: \"MessageList\",\n\tcomponents: {\n\t\tMessage,\n\t\tMessageCondensed,\n\t\tDateMarker,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t},\n\tcomputed: {\n\t\tcondensedMessages() {\n\t\t\tif (this.channel.type !== \"channel\") {\n\t\t\t\treturn this.channel.messages;\n\t\t\t}\n\n\t\t\t// If actions are hidden, just return a message list with them excluded\n\t\t\tif (this.$store.state.settings.statusMessages === \"hidden\") {\n\t\t\t\treturn this.channel.messages.filter(\n\t\t\t\t\t(message) => !constants.condensedTypes.has(message.type)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// If actions are not condensed, just return raw message list\n\t\t\tif (this.$store.state.settings.statusMessages !== \"condensed\") {\n\t\t\t\treturn this.channel.messages;\n\t\t\t}\n\n\t\t\tconst condensed = [];\n\t\t\tlet lastCondensedContainer = null;\n\n\t\t\tfor (const message of this.channel.messages) {\n\t\t\t\t// If this message is not condensable, or its an action affecting our user,\n\t\t\t\t// then just append the message to container and be done with it\n\t\t\t\tif (\n\t\t\t\t\tmessage.self ||\n\t\t\t\t\tmessage.highlight ||\n\t\t\t\t\t!constants.condensedTypes.has(message.type)\n\t\t\t\t) {\n\t\t\t\t\tlastCondensedContainer = null;\n\n\t\t\t\t\tcondensed.push(message);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (lastCondensedContainer === null) {\n\t\t\t\t\tlastCondensedContainer = {\n\t\t\t\t\t\ttime: message.time,\n\t\t\t\t\t\ttype: \"condensed\",\n\t\t\t\t\t\tmessages: [],\n\t\t\t\t\t};\n\n\t\t\t\t\tcondensed.push(lastCondensedContainer);\n\t\t\t\t}\n\n\t\t\t\tlastCondensedContainer.messages.push(message);\n\n\t\t\t\t// Set id of the condensed container to last message id,\n\t\t\t\t// which is required for the unread marker to work correctly\n\t\t\t\tlastCondensedContainer.id = message.id;\n\n\t\t\t\t// If this message is the unread boundary, create a split condensed container\n\t\t\t\tif (message.id === this.channel.firstUnread) {\n\t\t\t\t\tlastCondensedContainer = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn condensed;\n\t\t},\n\t},\n\twatch: {\n\t\t\"channel.id\"() {\n\t\t\tthis.channel.scrolledToBottom = true;\n\n\t\t\t// Re-add the intersection observer to trigger the check again on channel switch\n\t\t\t// Otherwise if last channel had the button visible, switching to a new channel won't trigger the history\n\t\t\tif (this.historyObserver) {\n\t\t\t\tthis.historyObserver.unobserve(this.$refs.loadMoreButton);\n\t\t\t\tthis.historyObserver.observe(this.$refs.loadMoreButton);\n\t\t\t}\n\t\t},\n\t\t\"channel.messages\"() {\n\t\t\tthis.keepScrollPosition();\n\t\t},\n\t\t\"channel.pendingMessage\"() {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\t// Keep the scroll stuck when input gets resized while typing\n\t\t\t\tthis.keepScrollPosition();\n\t\t\t});\n\t\t},\n\t},\n\tcreated() {\n\t\tthis.$nextTick(() => {\n\t\t\tif (!this.$refs.chat) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (window.IntersectionObserver) {\n\t\t\t\tthis.historyObserver = new window.IntersectionObserver(this.onLoadButtonObserved, {\n\t\t\t\t\troot: this.$refs.chat,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.jumpToBottom();\n\t\t});\n\t},\n\tmounted() {\n\t\tthis.$refs.chat.addEventListener(\"scroll\", this.handleScroll, {passive: true});\n\n\t\teventbus.on(\"resize\", this.handleResize);\n\n\t\tthis.$nextTick(() => {\n\t\t\tif (this.historyObserver) {\n\t\t\t\tthis.historyObserver.observe(this.$refs.loadMoreButton);\n\t\t\t}\n\t\t});\n\t},\n\tbeforeUpdate() {\n\t\tunreadMarkerShown = false;\n\t},\n\tbeforeDestroy() {\n\t\teventbus.off(\"resize\", this.handleResize);\n\t\tthis.$refs.chat.removeEventListener(\"scroll\", this.handleScroll);\n\t},\n\tdestroyed() {\n\t\tif (this.historyObserver) {\n\t\t\tthis.historyObserver.disconnect();\n\t\t}\n\t},\n\tmethods: {\n\t\tshouldDisplayDateMarker(message, id) {\n\t\t\tconst previousMessage = this.condensedMessages[id - 1];\n\n\t\t\tif (!previousMessage) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst oldDate = new Date(previousMessage.time);\n\t\t\tconst newDate = new Date(message.time);\n\n\t\t\treturn (\n\t\t\t\toldDate.getDate() !== newDate.getDate() ||\n\t\t\t\toldDate.getMonth() !== newDate.getMonth() ||\n\t\t\t\toldDate.getFullYear() !== newDate.getFullYear()\n\t\t\t);\n\t\t},\n\t\tshouldDisplayUnreadMarker(id) {\n\t\t\tif (!unreadMarkerShown && id > this.channel.firstUnread) {\n\t\t\t\tunreadMarkerShown = true;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tisPreviousSource(currentMessage, id) {\n\t\t\tconst previousMessage = this.condensedMessages[id - 1];\n\t\t\treturn (\n\t\t\t\tpreviousMessage &&\n\t\t\t\tcurrentMessage.type === \"message\" &&\n\t\t\t\tpreviousMessage.type === \"message\" &&\n\t\t\t\tpreviousMessage.from &&\n\t\t\t\tcurrentMessage.from.nick === previousMessage.from.nick\n\t\t\t);\n\t\t},\n\t\tonCopy() {\n\t\t\tclipboard(this.$el);\n\t\t},\n\t\tonLinkPreviewToggle(preview, message) {\n\t\t\tthis.keepScrollPosition();\n\n\t\t\t// Tell the server we're toggling so it remembers at page reload\n\t\t\tsocket.emit(\"msg:preview:toggle\", {\n\t\t\t\ttarget: this.channel.id,\n\t\t\t\tmsgId: message.id,\n\t\t\t\tlink: preview.link,\n\t\t\t\tshown: preview.shown,\n\t\t\t});\n\t\t},\n\t\tonShowMoreClick() {\n\t\t\tif (!this.$store.state.isConnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet lastMessage = -1;\n\n\t\t\t// Find the id of first message that isn't showInActive\n\t\t\t// If showInActive is set, this message is actually in another channel\n\t\t\tfor (const message of this.channel.messages) {\n\t\t\t\tif (!message.showInActive) {\n\t\t\t\t\tlastMessage = message.id;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.channel.historyLoading = true;\n\n\t\t\tsocket.emit(\"more\", {\n\t\t\t\ttarget: this.channel.id,\n\t\t\t\tlastId: lastMessage,\n\t\t\t\tcondensed: this.$store.state.settings.statusMessages !== \"shown\",\n\t\t\t});\n\t\t},\n\t\tonLoadButtonObserved(entries) {\n\t\t\tentries.forEach((entry) => {\n\t\t\t\tif (!entry.isIntersecting) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.onShowMoreClick();\n\t\t\t});\n\t\t},\n\t\tkeepScrollPosition() {\n\t\t\t// If we are already waiting for the next tick to force scroll position,\n\t\t\t// we have no reason to perform more checks and set it again in the next tick\n\t\t\tif (this.isWaitingForNextTick) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst el = this.$refs.chat;\n\n\t\t\tif (!el) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.channel.scrolledToBottom) {\n\t\t\t\tif (this.channel.historyLoading) {\n\t\t\t\t\tconst heightOld = el.scrollHeight - el.scrollTop;\n\n\t\t\t\t\tthis.isWaitingForNextTick = true;\n\t\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\t\tthis.isWaitingForNextTick = false;\n\t\t\t\t\t\tthis.skipNextScrollEvent = true;\n\t\t\t\t\t\tel.scrollTop = el.scrollHeight - heightOld;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.isWaitingForNextTick = true;\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.isWaitingForNextTick = false;\n\t\t\t\tthis.jumpToBottom();\n\t\t\t});\n\t\t},\n\t\thandleScroll() {\n\t\t\t// Setting scrollTop also triggers scroll event\n\t\t\t// We don't want to perform calculations for that\n\t\t\tif (this.skipNextScrollEvent) {\n\t\t\t\tthis.skipNextScrollEvent = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst el = this.$refs.chat;\n\n\t\t\tif (!el) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.channel.scrolledToBottom = el.scrollHeight - el.scrollTop - el.offsetHeight <= 30;\n\t\t},\n\t\thandleResize() {\n\t\t\t// Keep message list scrolled to bottom on resize\n\t\t\tif (this.channel.scrolledToBottom) {\n\t\t\t\tthis.jumpToBottom();\n\t\t\t}\n\t\t},\n\t\tjumpToBottom() {\n\t\t\tthis.skipNextScrollEvent = true;\n\t\t\tthis.channel.scrolledToBottom = true;\n\n\t\t\tconst el = this.$refs.chat;\n\t\t\tel.scrollTop = el.scrollHeight;\n\t\t},\n\t},\n};\n</script>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MessageList.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./MessageList.vue?vue&type=script&lang=js&\"","\"use strict\";\n\nexport default function (chat) {\n\t// Disable in Firefox as it already copies flex text correctly\n\tif (typeof window.InstallTrigger !== \"undefined\") {\n\t\treturn;\n\t}\n\n\tconst selection = window.getSelection();\n\n\t// If selection does not span multiple elements, do nothing\n\tif (selection.anchorNode === selection.focusNode) {\n\t\treturn;\n\t}\n\n\tconst range = selection.getRangeAt(0);\n\tconst documentFragment = range.cloneContents();\n\tconst div = document.createElement(\"div\");\n\n\tdiv.id = \"js-copy-hack\";\n\tdiv.appendChild(documentFragment);\n\tchat.appendChild(div);\n\n\tselection.selectAllChildren(div);\n\n\twindow.setTimeout(() => {\n\t\tchat.removeChild(div);\n\t\tselection.removeAllRanges();\n\t\tselection.addRange(range);\n\t}, 0);\n}\n","import { render, staticRenderFns } from \"./MessageList.vue?vue&type=template&id=770182a6&\"\nimport script from \"./MessageList.vue?vue&type=script&lang=js&\"\nexport * from \"./MessageList.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"chat\",staticClass:\"chat\",attrs:{\"tabindex\":\"-1\"}},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.channel.moreHistoryAvailable),expression:\"channel.moreHistoryAvailable\"}],staticClass:\"show-more\"},[_c('button',{ref:\"loadMoreButton\",staticClass:\"btn\",attrs:{\"disabled\":_vm.channel.historyLoading || !_vm.$store.state.isConnected},on:{\"click\":_vm.onShowMoreClick}},[(_vm.channel.historyLoading)?_c('span',[_vm._v(\"Loading…\")]):_c('span',[_vm._v(\"Show older messages\")])])]),_c('div',{staticClass:\"messages\",attrs:{\"role\":\"log\",\"aria-live\":\"polite\",\"aria-relevant\":\"additions\"},on:{\"copy\":_vm.onCopy}},[_vm._l((_vm.condensedMessages),function(message,id){return [(_vm.shouldDisplayDateMarker(message, id))?_c('DateMarker',{key:message.id + '-date',attrs:{\"message\":message}}):_vm._e(),(_vm.shouldDisplayUnreadMarker(message.id))?_c('div',{key:message.id + '-unread',staticClass:\"unread-marker\"},[_c('span',{staticClass:\"unread-marker-text\"})]):_vm._e(),(message.type === 'condensed')?_c('MessageCondensed',{key:message.messages[0].id,attrs:{\"network\":_vm.network,\"keep-scroll-position\":_vm.keepScrollPosition,\"messages\":message.messages}}):_c('Message',{key:message.id,attrs:{\"channel\":_vm.channel,\"network\":_vm.network,\"message\":message,\"keep-scroll-position\":_vm.keepScrollPosition,\"is-previous-source\":_vm.isPreviousSource(message, id)},on:{\"toggle-link-preview\":_vm.onLinkPreviewToggle}})]})],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\"use strict\";\n\nconst constants = require(\"./constants\");\n\nimport Mousetrap from \"mousetrap\";\nimport {Textcomplete, Textarea} from \"textcomplete\";\nimport fuzzy from \"fuzzy\";\n\nimport emojiMap from \"./helpers/simplemap.json\";\nimport store from \"./store\";\n\nexport default enableAutocomplete;\n\nconst emojiSearchTerms = Object.keys(emojiMap);\nconst emojiStrategy = {\n\tid: \"emoji\",\n\tmatch: /(^|\\s):([-+\\w:?]{2,}):?$/,\n\tsearch(term, callback) {\n\t\t// Trim colon from the matched term,\n\t\t// as we are unable to get a clean string from match regex\n\t\tterm = term.replace(/:$/, \"\");\n\t\tcallback(fuzzyGrep(term, emojiSearchTerms));\n\t},\n\ttemplate([string, original]) {\n\t\treturn `<span class=\"emoji\">${emojiMap[original]}</span> ${string}`;\n\t},\n\treplace([, original]) {\n\t\treturn \"$1\" + emojiMap[original];\n\t},\n\tindex: 2,\n};\n\nconst nicksStrategy = {\n\tid: \"nicks\",\n\tmatch: /(^|\\s)(@([a-zA-Z_[\\]\\\\^{}|`@][a-zA-Z0-9_[\\]\\\\^{}|`-]*)?)$/,\n\tsearch(term, callback) {\n\t\tterm = term.slice(1);\n\n\t\tif (term[0] === \"@\") {\n\t\t\tcallback(completeNicks(term.slice(1), true).map((val) => [\"@\" + val[0], \"@\" + val[1]]));\n\t\t} else {\n\t\t\tcallback(completeNicks(term, true));\n\t\t}\n\t},\n\ttemplate([string]) {\n\t\treturn string;\n\t},\n\treplace([, original]) {\n\t\treturn \"$1\" + replaceNick(original);\n\t},\n\tindex: 2,\n};\n\nconst chanStrategy = {\n\tid: \"chans\",\n\tmatch: /(^|\\s)((?:#|\\+|&|![A-Z0-9]{5})(?:[^\\s]+)?)$/,\n\tsearch(term, callback) {\n\t\tcallback(completeChans(term));\n\t},\n\ttemplate([string]) {\n\t\treturn string;\n\t},\n\treplace([, original]) {\n\t\treturn \"$1\" + original;\n\t},\n\tindex: 2,\n};\n\nconst commandStrategy = {\n\tid: \"commands\",\n\tmatch: /^\\/(\\w*)$/,\n\tsearch(term, callback) {\n\t\tcallback(completeCommands(\"/\" + term));\n\t},\n\ttemplate([string]) {\n\t\treturn string;\n\t},\n\treplace([, original]) {\n\t\treturn original;\n\t},\n\tindex: 1,\n};\n\nconst foregroundColorStrategy = {\n\tid: \"foreground-colors\",\n\tmatch: /\\x03(\\d{0,2}|[A-Za-z ]{0,10})$/,\n\tsearch(term, callback) {\n\t\tterm = term.toLowerCase();\n\n\t\tconst matchingColorCodes = constants.colorCodeMap\n\t\t\t.filter((i) => fuzzy.test(term, i[0]) || fuzzy.test(term, i[1]))\n\t\t\t.map((i) => {\n\t\t\t\tif (fuzzy.test(term, i[1])) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\ti[0],\n\t\t\t\t\t\tfuzzy.match(term, i[1], {\n\t\t\t\t\t\t\tpre: \"<b>\",\n\t\t\t\t\t\t\tpost: \"</b>\",\n\t\t\t\t\t\t}).rendered,\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\treturn i;\n\t\t\t});\n\n\t\tcallback(matchingColorCodes);\n\t},\n\ttemplate(value) {\n\t\treturn `<span class=\"irc-fg${parseInt(value[0], 10)}\">${value[1]}</span>`;\n\t},\n\treplace(value) {\n\t\treturn \"\\x03\" + value[0];\n\t},\n\tindex: 1,\n};\n\nconst backgroundColorStrategy = {\n\tid: \"background-colors\",\n\tmatch: /\\x03(\\d{2}),(\\d{0,2}|[A-Za-z ]{0,10})$/,\n\tsearch(term, callback, match) {\n\t\tterm = term.toLowerCase();\n\t\tconst matchingColorCodes = constants.colorCodeMap\n\t\t\t.filter((i) => fuzzy.test(term, i[0]) || fuzzy.test(term, i[1]))\n\t\t\t.map((pair) => {\n\t\t\t\tif (fuzzy.test(term, pair[1])) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tpair[0],\n\t\t\t\t\t\tfuzzy.match(term, pair[1], {\n\t\t\t\t\t\t\tpre: \"<b>\",\n\t\t\t\t\t\t\tpost: \"</b>\",\n\t\t\t\t\t\t}).rendered,\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\treturn pair;\n\t\t\t})\n\t\t\t.map((pair) => pair.concat(match[1])); // Needed to pass fg color to `template`...\n\n\t\tcallback(matchingColorCodes);\n\t},\n\ttemplate(value) {\n\t\treturn `<span class=\"irc-fg${parseInt(value[2], 10)} irc-bg irc-bg${parseInt(\n\t\t\tvalue[0],\n\t\t\t10\n\t\t)}\">${value[1]}</span>`;\n\t},\n\treplace(value) {\n\t\treturn \"\\x03$1,\" + value[0];\n\t},\n\tindex: 2,\n};\n\nfunction enableAutocomplete(input) {\n\tlet tabCount = 0;\n\tlet lastMatch = \"\";\n\tlet currentMatches = [];\n\n\tinput.addEventListener(\"input\", (e) => {\n\t\tif (e.detail === \"autocomplete\") {\n\t\t\treturn;\n\t\t}\n\n\t\ttabCount = 0;\n\t\tcurrentMatches = [];\n\t\tlastMatch = \"\";\n\t});\n\n\tMousetrap(input).bind(\n\t\t\"tab\",\n\t\t(e) => {\n\t\t\tif (store.state.isAutoCompleting) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault();\n\n\t\t\tconst text = input.value;\n\n\t\t\tif (tabCount === 0) {\n\t\t\t\tlastMatch = text.substring(0, input.selectionStart).split(/\\s/).pop();\n\n\t\t\t\tif (lastMatch.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcurrentMatches = completeNicks(lastMatch, false);\n\n\t\t\t\tif (currentMatches.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst position = input.selectionStart - lastMatch.length;\n\t\t\tconst newMatch = replaceNick(\n\t\t\t\tcurrentMatches[tabCount % currentMatches.length],\n\t\t\t\tposition\n\t\t\t);\n\t\t\tconst remainder = text.substr(input.selectionStart);\n\n\t\t\tinput.value = text.substr(0, position) + newMatch + remainder;\n\t\t\tinput.selectionStart -= remainder.length;\n\t\t\tinput.selectionEnd = input.selectionStart;\n\n\t\t\t// Propagate change to Vue model\n\t\t\tinput.dispatchEvent(\n\t\t\t\tnew CustomEvent(\"input\", {\n\t\t\t\t\tdetail: \"autocomplete\",\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tlastMatch = newMatch;\n\t\t\ttabCount++;\n\t\t},\n\t\t\"keydown\"\n\t);\n\n\tconst editor = new Textarea(input);\n\tconst textcomplete = new Textcomplete(editor, {\n\t\tdropdown: {\n\t\t\tclassName: \"textcomplete-menu\",\n\t\t\tplacement: \"top\",\n\t\t},\n\t});\n\n\ttextcomplete.register([\n\t\temojiStrategy,\n\t\tnicksStrategy,\n\t\tchanStrategy,\n\t\tcommandStrategy,\n\t\tforegroundColorStrategy,\n\t\tbackgroundColorStrategy,\n\t]);\n\n\t// Activate the first item by default\n\t// https://github.com/yuku-t/textcomplete/issues/93\n\ttextcomplete.on(\"rendered\", () => {\n\t\tif (textcomplete.dropdown.items.length > 0) {\n\t\t\ttextcomplete.dropdown.items[0].activate();\n\t\t}\n\t});\n\n\ttextcomplete.on(\"show\", () => {\n\t\tstore.commit(\"isAutoCompleting\", true);\n\t});\n\n\ttextcomplete.on(\"hidden\", () => {\n\t\tstore.commit(\"isAutoCompleting\", false);\n\t});\n\n\treturn {\n\t\thide() {\n\t\t\ttextcomplete.hide();\n\t\t},\n\t\tdestroy() {\n\t\t\ttextcomplete.destroy();\n\t\t\tstore.commit(\"isAutoCompleting\", false);\n\t\t},\n\t};\n}\n\nfunction replaceNick(original, position = 1) {\n\t// If no postfix specified, return autocompleted nick as-is\n\tif (!store.state.settings.nickPostfix) {\n\t\treturn original;\n\t}\n\n\t// If there is whitespace in the input already, append space to nick\n\tif (position > 0 && /\\s/.test(store.state.activeChannel.channel.pendingMessage)) {\n\t\treturn original + \" \";\n\t}\n\n\t// If nick is first in the input, append specified postfix\n\treturn original + store.state.settings.nickPostfix;\n}\n\nfunction fuzzyGrep(term, array) {\n\tconst results = fuzzy.filter(term, array, {\n\t\tpre: \"<b>\",\n\t\tpost: \"</b>\",\n\t});\n\treturn results.map((el) => [el.string, el.original]);\n}\n\nfunction rawNicks() {\n\tif (store.state.activeChannel.channel.users.length > 0) {\n\t\tconst users = store.state.activeChannel.channel.users.slice();\n\n\t\treturn users.sort((a, b) => b.lastMessage - a.lastMessage).map((u) => u.nick);\n\t}\n\n\tconst me = store.state.activeChannel.network.nick;\n\tconst otherUser = store.state.activeChannel.channel.name;\n\n\t// If this is a query, add their name to autocomplete\n\tif (me !== otherUser && store.state.activeChannel.channel.type === \"query\") {\n\t\treturn [otherUser, me];\n\t}\n\n\t// Return our own name by default for anything that isn't a channel or query\n\treturn [me];\n}\n\nfunction completeNicks(word, isFuzzy) {\n\tconst users = rawNicks();\n\tword = word.toLowerCase();\n\n\tif (isFuzzy) {\n\t\treturn fuzzyGrep(word, users);\n\t}\n\n\treturn users.filter((w) => !w.toLowerCase().indexOf(word));\n}\n\nfunction completeCommands(word) {\n\tconst words = constants.commands.slice();\n\n\treturn fuzzyGrep(word, words);\n}\n\nfunction completeChans(word) {\n\tconst words = [];\n\n\tfor (const channel of store.state.activeChannel.network.channels) {\n\t\t// Push all channels that start with the same CHANTYPE\n\t\tif (channel.type === \"channel\" && channel.name[0] === word[0]) {\n\t\t\twords.push(channel.name);\n\t\t}\n\t}\n\n\treturn fuzzyGrep(word, words);\n}\n","<template>\n\t<form id=\"form\" method=\"post\" action=\"\" @submit.prevent=\"onSubmit\">\n\t\t<span id=\"upload-progressbar\" />\n\t\t<span id=\"nick\">{{ network.nick }}</span>\n\t\t<textarea\n\t\t\tid=\"input\"\n\t\t\tref=\"input\"\n\t\t\tdir=\"auto\"\n\t\t\tclass=\"mousetrap\"\n\t\t\tenterkeyhint=\"send\"\n\t\t\t:value=\"channel.pendingMessage\"\n\t\t\t:placeholder=\"getInputPlaceholder(channel)\"\n\t\t\t:aria-label=\"getInputPlaceholder(channel)\"\n\t\t\t@input=\"setPendingMessage\"\n\t\t\t@keypress.enter.exact.prevent=\"onSubmit\"\n\t\t/>\n\t\t<span\n\t\t\tv-if=\"$store.state.serverConfiguration.fileUpload\"\n\t\t\tid=\"upload-tooltip\"\n\t\t\tclass=\"tooltipped tooltipped-w tooltipped-no-touch\"\n\t\t\taria-label=\"Upload file\"\n\t\t\t@click=\"openFileUpload\"\n\t\t>\n\t\t\t<input\n\t\t\t\tid=\"upload-input\"\n\t\t\t\tref=\"uploadInput\"\n\t\t\t\ttype=\"file\"\n\t\t\t\taria-labelledby=\"upload\"\n\t\t\t\tmultiple\n\t\t\t\t@change=\"onUploadInputChange\"\n\t\t\t/>\n\t\t\t<button\n\t\t\t\tid=\"upload\"\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label=\"Upload file\"\n\t\t\t\t:disabled=\"!$store.state.isConnected\"\n\t\t\t/>\n\t\t</span>\n\t\t<span\n\t\t\tid=\"submit-tooltip\"\n\t\t\tclass=\"tooltipped tooltipped-w tooltipped-no-touch\"\n\t\t\taria-label=\"Send message\"\n\t\t>\n\t\t\t<button\n\t\t\t\tid=\"submit\"\n\t\t\t\ttype=\"submit\"\n\t\t\t\taria-label=\"Send message\"\n\t\t\t\t:disabled=\"!$store.state.isConnected\"\n\t\t\t/>\n\t\t</span>\n\t</form>\n</template>\n\n<script>\nimport Mousetrap from \"mousetrap\";\nimport {wrapCursor} from \"undate\";\nimport autocompletion from \"../js/autocompletion\";\nimport commands from \"../js/commands/index\";\nimport socket from \"../js/socket\";\nimport upload from \"../js/upload\";\nimport eventbus from \"../js/eventbus\";\n\nconst formattingHotkeys = {\n\t\"mod+k\": \"\\x03\",\n\t\"mod+b\": \"\\x02\",\n\t\"mod+u\": \"\\x1F\",\n\t\"mod+i\": \"\\x1D\",\n\t\"mod+o\": \"\\x0F\",\n\t\"mod+s\": \"\\x1e\",\n\t\"mod+m\": \"\\x11\",\n};\n\n// Autocomplete bracket and quote characters like in a modern IDE\n// For example, select `text`, press `[` key, and it becomes `[text]`\nconst bracketWraps = {\n\t'\"': '\"',\n\t\"'\": \"'\",\n\t\"(\": \")\",\n\t\"<\": \">\",\n\t\"[\": \"]\",\n\t\"{\": \"}\",\n\t\"*\": \"*\",\n\t\"`\": \"`\",\n\t\"~\": \"~\",\n\t_: \"_\",\n};\n\nlet autocompletionRef = null;\n\nexport default {\n\tname: \"ChatInput\",\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t},\n\twatch: {\n\t\t\"channel.id\"() {\n\t\t\tif (autocompletionRef) {\n\t\t\t\tautocompletionRef.hide();\n\t\t\t}\n\t\t},\n\t\t\"channel.pendingMessage\"() {\n\t\t\tthis.setInputSize();\n\t\t},\n\t},\n\tmounted() {\n\t\teventbus.on(\"escapekey\", this.blurInput);\n\n\t\tif (this.$store.state.settings.autocomplete) {\n\t\t\tautocompletionRef = autocompletion(this.$refs.input);\n\t\t}\n\n\t\tconst inputTrap = Mousetrap(this.$refs.input);\n\n\t\tinputTrap.bind(Object.keys(formattingHotkeys), function (e, key) {\n\t\t\tconst modifier = formattingHotkeys[key];\n\n\t\t\twrapCursor(\n\t\t\t\te.target,\n\t\t\t\tmodifier,\n\t\t\t\te.target.selectionStart === e.target.selectionEnd ? \"\" : modifier\n\t\t\t);\n\n\t\t\treturn false;\n\t\t});\n\n\t\tinputTrap.bind(Object.keys(bracketWraps), function (e, key) {\n\t\t\tif (e.target.selectionStart !== e.target.selectionEnd) {\n\t\t\t\twrapCursor(e.target, key, bracketWraps[key]);\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\t\tinputTrap.bind([\"up\", \"down\"], (e, key) => {\n\t\t\tif (\n\t\t\t\tthis.$store.state.isAutoCompleting ||\n\t\t\t\te.target.selectionStart !== e.target.selectionEnd\n\t\t\t) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst {channel} = this;\n\n\t\t\tif (channel.inputHistoryPosition === 0) {\n\t\t\t\tchannel.inputHistory[channel.inputHistoryPosition] = channel.pendingMessage;\n\t\t\t}\n\n\t\t\tif (key === \"up\") {\n\t\t\t\tif (channel.inputHistoryPosition < channel.inputHistory.length - 1) {\n\t\t\t\t\tchannel.inputHistoryPosition++;\n\t\t\t\t}\n\t\t\t} else if (channel.inputHistoryPosition > 0) {\n\t\t\t\tchannel.inputHistoryPosition--;\n\t\t\t}\n\n\t\t\tchannel.pendingMessage = channel.inputHistory[channel.inputHistoryPosition];\n\t\t\tthis.$refs.input.value = channel.pendingMessage;\n\t\t\tthis.setInputSize();\n\n\t\t\treturn false;\n\t\t});\n\n\t\tif (this.$store.state.serverConfiguration.fileUpload) {\n\t\t\tupload.mounted();\n\t\t}\n\t},\n\tdestroyed() {\n\t\teventbus.off(\"escapekey\", this.blurInput);\n\n\t\tif (autocompletionRef) {\n\t\t\tautocompletionRef.destroy();\n\t\t\tautocompletionRef = null;\n\t\t}\n\n\t\tupload.abort();\n\t},\n\tmethods: {\n\t\tsetPendingMessage(e) {\n\t\t\tthis.channel.pendingMessage = e.target.value;\n\t\t\tthis.channel.inputHistoryPosition = 0;\n\t\t\tthis.setInputSize();\n\t\t},\n\t\tsetInputSize() {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tconst style = window.getComputedStyle(this.$refs.input);\n\t\t\t\tconst lineHeight = parseFloat(style.lineHeight, 10) || 1;\n\n\t\t\t\t// Start by resetting height before computing as scrollHeight does not\n\t\t\t\t// decrease when deleting characters\n\t\t\t\tthis.$refs.input.style.height = \"\";\n\n\t\t\t\t// Use scrollHeight to calculate how many lines there are in input, and ceil the value\n\t\t\t\t// because some browsers tend to incorrently round the values when using high density\n\t\t\t\t// displays or using page zoom feature\n\t\t\t\tthis.$refs.input.style.height =\n\t\t\t\t\tMath.ceil(this.$refs.input.scrollHeight / lineHeight) * lineHeight + \"px\";\n\t\t\t});\n\t\t},\n\t\tgetInputPlaceholder(channel) {\n\t\t\tif (channel.type === \"channel\" || channel.type === \"query\") {\n\t\t\t\treturn `Write to ${channel.name}`;\n\t\t\t}\n\n\t\t\treturn \"\";\n\t\t},\n\t\tonSubmit() {\n\t\t\t// Triggering click event opens the virtual keyboard on mobile\n\t\t\t// This can only be called from another interactive event (e.g. button click)\n\t\t\tthis.$refs.input.click();\n\t\t\tthis.$refs.input.focus();\n\n\t\t\tif (!this.$store.state.isConnected) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst target = this.channel.id;\n\t\t\tconst text = this.channel.pendingMessage;\n\n\t\t\tif (text.length === 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (autocompletionRef) {\n\t\t\t\tautocompletionRef.hide();\n\t\t\t}\n\n\t\t\tthis.channel.inputHistoryPosition = 0;\n\t\t\tthis.channel.pendingMessage = \"\";\n\t\t\tthis.$refs.input.value = \"\";\n\t\t\tthis.setInputSize();\n\n\t\t\t// Store new message in history if last message isn't already equal\n\t\t\tif (this.channel.inputHistory[1] !== text) {\n\t\t\t\tthis.channel.inputHistory.splice(1, 0, text);\n\t\t\t}\n\n\t\t\t// Limit input history to a 100 entries\n\t\t\tif (this.channel.inputHistory.length > 100) {\n\t\t\t\tthis.channel.inputHistory.pop();\n\t\t\t}\n\n\t\t\tif (text[0] === \"/\") {\n\t\t\t\tconst args = text.substr(1).split(\" \");\n\t\t\t\tconst cmd = args.shift().toLowerCase();\n\n\t\t\t\tif (\n\t\t\t\t\tObject.prototype.hasOwnProperty.call(commands, cmd) &&\n\t\t\t\t\tcommands[cmd].input(args)\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsocket.emit(\"input\", {target, text});\n\t\t},\n\t\tonUploadInputChange() {\n\t\t\tconst files = Array.from(this.$refs.uploadInput.files);\n\t\t\tupload.triggerUpload(files);\n\t\t\tthis.$refs.uploadInput.value = \"\"; // Reset <input> element so you can upload the same file\n\t\t},\n\t\topenFileUpload() {\n\t\t\tthis.$refs.uploadInput.click();\n\t\t},\n\t\tblurInput() {\n\t\t\tthis.$refs.input.blur();\n\t\t},\n\t},\n};\n</script>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatInput.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatInput.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ChatInput.vue?vue&type=template&id=3cc00791&\"\nimport script from \"./ChatInput.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatInput.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('form',{attrs:{\"id\":\"form\",\"method\":\"post\",\"action\":\"\"},on:{\"submit\":function($event){$event.preventDefault();return _vm.onSubmit($event)}}},[_c('span',{attrs:{\"id\":\"upload-progressbar\"}}),_c('span',{attrs:{\"id\":\"nick\"}},[_vm._v(_vm._s(_vm.network.nick))]),_c('textarea',{ref:\"input\",staticClass:\"mousetrap\",attrs:{\"id\":\"input\",\"dir\":\"auto\",\"enterkeyhint\":\"send\",\"placeholder\":_vm.getInputPlaceholder(_vm.channel),\"aria-label\":_vm.getInputPlaceholder(_vm.channel)},domProps:{\"value\":_vm.channel.pendingMessage},on:{\"input\":_vm.setPendingMessage,\"keypress\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }$event.preventDefault();return _vm.onSubmit($event)}}}),(_vm.$store.state.serverConfiguration.fileUpload)?_c('span',{staticClass:\"tooltipped tooltipped-w tooltipped-no-touch\",attrs:{\"id\":\"upload-tooltip\",\"aria-label\":\"Upload file\"},on:{\"click\":_vm.openFileUpload}},[_c('input',{ref:\"uploadInput\",attrs:{\"id\":\"upload-input\",\"type\":\"file\",\"aria-labelledby\":\"upload\",\"multiple\":\"\"},on:{\"change\":_vm.onUploadInputChange}}),_c('button',{attrs:{\"id\":\"upload\",\"type\":\"button\",\"aria-label\":\"Upload file\",\"disabled\":!_vm.$store.state.isConnected}})]):_vm._e(),_c('span',{staticClass:\"tooltipped tooltipped-w tooltipped-no-touch\",attrs:{\"id\":\"submit-tooltip\",\"aria-label\":\"Send message\"}},[_c('button',{attrs:{\"id\":\"submit\",\"type\":\"submit\",\"aria-label\":\"Send message\",\"disabled\":!_vm.$store.state.isConnected}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<aside ref=\"userlist\" class=\"userlist\" @mouseleave=\"removeHoverUser\">\n\t\t<div class=\"count\">\n\t\t\t<input\n\t\t\t\tref=\"input\"\n\t\t\t\t:value=\"userSearchInput\"\n\t\t\t\t:placeholder=\"\n\t\t\t\t\tchannel.users.length + ' user' + (channel.users.length === 1 ? '' : 's')\n\t\t\t\t\"\n\t\t\t\ttype=\"search\"\n\t\t\t\tclass=\"search\"\n\t\t\t\taria-label=\"Search among the user list\"\n\t\t\t\ttabindex=\"-1\"\n\t\t\t\t@input=\"setUserSearchInput\"\n\t\t\t\t@keydown.up=\"navigateUserList($event, -1)\"\n\t\t\t\t@keydown.down=\"navigateUserList($event, 1)\"\n\t\t\t\t@keydown.page-up=\"navigateUserList($event, -10)\"\n\t\t\t\t@keydown.page-down=\"navigateUserList($event, 10)\"\n\t\t\t\t@keydown.enter=\"selectUser\"\n\t\t\t/>\n\t\t</div>\n\t\t<div class=\"names\">\n\t\t\t<div\n\t\t\t\tv-for=\"(users, mode) in groupedUsers\"\n\t\t\t\t:key=\"mode\"\n\t\t\t\t:class=\"['user-mode', getModeClass(mode)]\"\n\t\t\t>\n\t\t\t\t<template v-if=\"userSearchInput.length > 0\">\n\t\t\t\t\t<Username\n\t\t\t\t\t\tv-for=\"user in users\"\n\t\t\t\t\t\t:key=\"user.original.nick\"\n\t\t\t\t\t\t:on-hover=\"hoverUser\"\n\t\t\t\t\t\t:active=\"user.original === activeUser\"\n\t\t\t\t\t\t:user=\"user.original\"\n\t\t\t\t\t\tv-html=\"user.string\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t\t<template v-else>\n\t\t\t\t\t<Username\n\t\t\t\t\t\tv-for=\"user in users\"\n\t\t\t\t\t\t:key=\"user.nick\"\n\t\t\t\t\t\t:on-hover=\"hoverUser\"\n\t\t\t\t\t\t:active=\"user === activeUser\"\n\t\t\t\t\t\t:user=\"user\"\n\t\t\t\t\t/>\n\t\t\t\t</template>\n\t\t\t</div>\n\t\t</div>\n\t</aside>\n</template>\n\n<script>\nimport {filter as fuzzyFilter} from \"fuzzy\";\nimport Username from \"./Username.vue\";\n\nconst modes = {\n\t\"~\": \"owner\",\n\t\"&\": \"admin\",\n\t\"!\": \"admin\",\n\t\"@\": \"op\",\n\t\"%\": \"half-op\",\n\t\"+\": \"voice\",\n\t\"\": \"normal\",\n};\n\nexport default {\n\tname: \"ChatUserList\",\n\tcomponents: {\n\t\tUsername,\n\t},\n\tprops: {\n\t\tchannel: Object,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tuserSearchInput: \"\",\n\t\t\tactiveUser: null,\n\t\t};\n\t},\n\tcomputed: {\n\t\t// filteredUsers is computed, to avoid unnecessary filtering\n\t\t// as it is shared between filtering and keybindings.\n\t\tfilteredUsers() {\n\t\t\tif (!this.userSearchInput) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn fuzzyFilter(this.userSearchInput, this.channel.users, {\n\t\t\t\tpre: \"<b>\",\n\t\t\t\tpost: \"</b>\",\n\t\t\t\textract: (u) => u.nick,\n\t\t\t});\n\t\t},\n\t\tgroupedUsers() {\n\t\t\tconst groups = {};\n\n\t\t\tif (this.userSearchInput) {\n\t\t\t\tconst result = this.filteredUsers;\n\n\t\t\t\tfor (const user of result) {\n\t\t\t\t\tconst mode = user.original.modes[0] || \"\";\n\n\t\t\t\t\tif (!groups[mode]) {\n\t\t\t\t\t\tgroups[mode] = [];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prepend user mode to search result\n\t\t\t\t\tuser.string = mode + user.string;\n\n\t\t\t\t\tgroups[mode].push(user);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (const user of this.channel.users) {\n\t\t\t\t\tconst mode = user.modes[0] || \"\";\n\n\t\t\t\t\tif (!groups[mode]) {\n\t\t\t\t\t\tgroups[mode] = [user];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgroups[mode].push(user);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn groups;\n\t\t},\n\t},\n\tmethods: {\n\t\tsetUserSearchInput(e) {\n\t\t\tthis.userSearchInput = e.target.value;\n\t\t},\n\t\tgetModeClass(mode) {\n\t\t\treturn modes[mode];\n\t\t},\n\t\tselectUser() {\n\t\t\t// Simulate a click on the active user to open the context menu.\n\t\t\t// Coordinates are provided to position the menu correctly.\n\t\t\tif (!this.activeUser) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst el = this.$refs.userlist.querySelector(\".active\");\n\t\t\tconst rect = el.getBoundingClientRect();\n\t\t\tconst ev = new MouseEvent(\"click\", {\n\t\t\t\tview: window,\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t\tclientX: rect.left,\n\t\t\t\tclientY: rect.top + rect.height,\n\t\t\t});\n\t\t\tel.dispatchEvent(ev);\n\t\t},\n\t\thoverUser(user) {\n\t\t\tthis.activeUser = user;\n\t\t},\n\t\tremoveHoverUser() {\n\t\t\tthis.activeUser = null;\n\t\t},\n\t\tnavigateUserList(event, direction) {\n\t\t\t// Prevent propagation to stop global keybind handler from capturing pagedown/pageup\n\t\t\t// and redirecting it to the message list container for scrolling\n\t\t\tevent.stopImmediatePropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\tlet users = this.channel.users;\n\n\t\t\t// Only using filteredUsers when we have to avoids filtering when it's not needed\n\t\t\tif (this.userSearchInput) {\n\t\t\t\tusers = this.filteredUsers.map((result) => result.original);\n\t\t\t}\n\n\t\t\t// Bail out if there's no users to select\n\t\t\tif (!users.length) {\n\t\t\t\tthis.activeUser = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet currentIndex = users.indexOf(this.activeUser);\n\n\t\t\t// If there's no active user select the first or last one depending on direction\n\t\t\tif (!this.activeUser || currentIndex === -1) {\n\t\t\t\tthis.activeUser = direction ? users[0] : users[users.length - 1];\n\t\t\t\tthis.scrollToActiveUser();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcurrentIndex += direction;\n\n\t\t\t// Wrap around the list if necessary. Normaly each loop iterates once at most,\n\t\t\t// but might iterate more often if pgup or pgdown are used in a very short user list\n\t\t\twhile (currentIndex < 0) {\n\t\t\t\tcurrentIndex += users.length;\n\t\t\t}\n\n\t\t\twhile (currentIndex > users.length - 1) {\n\t\t\t\tcurrentIndex -= users.length;\n\t\t\t}\n\n\t\t\tthis.activeUser = users[currentIndex];\n\t\t\tthis.scrollToActiveUser();\n\t\t},\n\t\tscrollToActiveUser() {\n\t\t\t// Scroll the list if needed after the active class is applied\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tconst el = this.$refs.userlist.querySelector(\".active\");\n\t\t\t\tel.scrollIntoView({block: \"nearest\", inline: \"nearest\"});\n\t\t\t});\n\t\t},\n\t},\n};\n</script>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatUserList.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChatUserList.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./ChatUserList.vue?vue&type=template&id=6aa4577e&\"\nimport script from \"./ChatUserList.vue?vue&type=script&lang=js&\"\nexport * from \"./ChatUserList.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('aside',{ref:\"userlist\",staticClass:\"userlist\",on:{\"mouseleave\":_vm.removeHoverUser}},[_c('div',{staticClass:\"count\"},[_c('input',{ref:\"input\",staticClass:\"search\",attrs:{\"placeholder\":_vm.channel.users.length + ' user' + (_vm.channel.users.length === 1 ? '' : 's'),\"type\":\"search\",\"aria-label\":\"Search among the user list\",\"tabindex\":\"-1\"},domProps:{\"value\":_vm.userSearchInput},on:{\"input\":_vm.setUserSearchInput,\"keydown\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"up\",38,$event.key,[\"Up\",\"ArrowUp\"])){ return null; }return _vm.navigateUserList($event, -1)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"down\",40,$event.key,[\"Down\",\"ArrowDown\"])){ return null; }return _vm.navigateUserList($event, 1)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"page-up\",undefined,$event.key,undefined)){ return null; }return _vm.navigateUserList($event, -10)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"page-down\",undefined,$event.key,undefined)){ return null; }return _vm.navigateUserList($event, 10)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.selectUser($event)}]}})]),_c('div',{staticClass:\"names\"},_vm._l((_vm.groupedUsers),function(users,mode){return _c('div',{key:mode,class:['user-mode', _vm.getModeClass(mode)]},[(_vm.userSearchInput.length > 0)?_vm._l((users),function(user){return _c('Username',{key:user.original.nick,attrs:{\"on-hover\":_vm.hoverUser,\"active\":user.original === _vm.activeUser,\"user\":user.original},domProps:{\"innerHTML\":_vm._s(user.string)}})}):_vm._l((users),function(user){return _c('Username',{key:user.nick,attrs:{\"on-hover\":_vm.hoverUser,\"active\":user === _vm.activeUser,\"user\":user}})})],2)}),0)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ListBans.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ListBans.vue?vue&type=script&lang=js&\"","<template>\n\t<table class=\"ban-list\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"hostmask\">Banned</th>\n\t\t\t\t<th class=\"banned_by\">Banned By</th>\n\t\t\t\t<th class=\"banned_at\">Banned At</th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr v-for=\"ban in channel.data\" :key=\"ban.hostmask\">\n\t\t\t\t<td class=\"hostmask\">{{ ban.hostmask }}</td>\n\t\t\t\t<td class=\"banned_by\">{{ ban.banned_by }}</td>\n\t\t\t\t<td class=\"banned_at\">{{ localetime(ban.banned_at) }}</td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script>\nimport localetime from \"../../js/helpers/localetime\";\n\nexport default {\n\tname: \"ListBans\",\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t},\n\tmethods: {\n\t\tlocaletime(date) {\n\t\t\treturn localetime(date);\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./ListBans.vue?vue&type=template&id=ed51eff0&\"\nimport script from \"./ListBans.vue?vue&type=script&lang=js&\"\nexport * from \"./ListBans.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('table',{staticClass:\"ban-list\"},[_vm._m(0),_c('tbody',_vm._l((_vm.channel.data),function(ban){return _c('tr',{key:ban.hostmask},[_c('td',{staticClass:\"hostmask\"},[_vm._v(_vm._s(ban.hostmask))]),_c('td',{staticClass:\"banned_by\"},[_vm._v(_vm._s(ban.banned_by))]),_c('td',{staticClass:\"banned_at\"},[_vm._v(_vm._s(_vm.localetime(ban.banned_at)))])])}),0)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('thead',[_c('tr',[_c('th',{staticClass:\"hostmask\"},[_vm._v(\"Banned\")]),_c('th',{staticClass:\"banned_by\"},[_vm._v(\"Banned By\")]),_c('th',{staticClass:\"banned_at\"},[_vm._v(\"Banned At\")])])])}]\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ListInvites.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ListInvites.vue?vue&type=script&lang=js&\"","<template>\n\t<table class=\"invite-list\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"hostmask\">Invited</th>\n\t\t\t\t<th class=\"invitened_by\">Invited By</th>\n\t\t\t\t<th class=\"invitened_at\">Invited At</th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr v-for=\"invite in channel.data\" :key=\"invite.hostmask\">\n\t\t\t\t<td class=\"hostmask\">{{ invite.hostmask }}</td>\n\t\t\t\t<td class=\"invitened_by\">{{ invite.invited_by }}</td>\n\t\t\t\t<td class=\"invitened_at\">{{ localetime(invite.invited_at) }}</td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script>\nimport localetime from \"../../js/helpers/localetime\";\n\nexport default {\n\tname: \"ListInvites\",\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t},\n\tmethods: {\n\t\tlocaletime(date) {\n\t\t\treturn localetime(date);\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./ListInvites.vue?vue&type=template&id=2b335573&\"\nimport script from \"./ListInvites.vue?vue&type=script&lang=js&\"\nexport * from \"./ListInvites.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('table',{staticClass:\"invite-list\"},[_vm._m(0),_c('tbody',_vm._l((_vm.channel.data),function(invite){return _c('tr',{key:invite.hostmask},[_c('td',{staticClass:\"hostmask\"},[_vm._v(_vm._s(invite.hostmask))]),_c('td',{staticClass:\"invitened_by\"},[_vm._v(_vm._s(invite.invited_by))]),_c('td',{staticClass:\"invitened_at\"},[_vm._v(_vm._s(_vm.localetime(invite.invited_at)))])])}),0)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('thead',[_c('tr',[_c('th',{staticClass:\"hostmask\"},[_vm._v(\"Invited\")]),_c('th',{staticClass:\"invitened_by\"},[_vm._v(\"Invited By\")]),_c('th',{staticClass:\"invitened_at\"},[_vm._v(\"Invited At\")])])])}]\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ListChannels.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ListChannels.vue?vue&type=script&lang=js&\"","<template>\n\t<span v-if=\"channel.data.text\">{{ channel.data.text }}</span>\n\t<table v-else class=\"channel-list\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"channel\">Channel</th>\n\t\t\t\t<th class=\"users\">Users</th>\n\t\t\t\t<th class=\"topic\">Topic</th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr v-for=\"chan in channel.data\" :key=\"chan.channel\">\n\t\t\t\t<td class=\"channel\"><ParsedMessage :network=\"network\" :text=\"chan.channel\" /></td>\n\t\t\t\t<td class=\"users\">{{ chan.num_users }}</td>\n\t\t\t\t<td class=\"topic\"><ParsedMessage :network=\"network\" :text=\"chan.topic\" /></td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script>\nimport ParsedMessage from \"../ParsedMessage.vue\";\n\nexport default {\n\tname: \"ListChannels\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./ListChannels.vue?vue&type=template&id=0f297395&\"\nimport script from \"./ListChannels.vue?vue&type=script&lang=js&\"\nexport * from \"./ListChannels.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.channel.data.text)?_c('span',[_vm._v(_vm._s(_vm.channel.data.text))]):_c('table',{staticClass:\"channel-list\"},[_vm._m(0),_c('tbody',_vm._l((_vm.channel.data),function(chan){return _c('tr',{key:chan.channel},[_c('td',{staticClass:\"channel\"},[_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"text\":chan.channel}})],1),_c('td',{staticClass:\"users\"},[_vm._v(_vm._s(chan.num_users))]),_c('td',{staticClass:\"topic\"},[_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"text\":chan.topic}})],1)])}),0)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('thead',[_c('tr',[_c('th',{staticClass:\"channel\"},[_vm._v(\"Channel\")]),_c('th',{staticClass:\"users\"},[_vm._v(\"Users\")]),_c('th',{staticClass:\"topic\"},[_vm._v(\"Topic\")])])])}]\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ListIgnored.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ListIgnored.vue?vue&type=script&lang=js&\"","<template>\n\t<table class=\"ignore-list\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"hostmask\">Hostmask</th>\n\t\t\t\t<th class=\"when\">Ignored At</th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t\t<tr v-for=\"user in channel.data\" :key=\"user.hostmask\">\n\t\t\t\t<td class=\"hostmask\">{{ user.hostmask }}</td>\n\t\t\t\t<td class=\"when\">{{ localetime(user.when) }}</td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script>\nimport localetime from \"../../js/helpers/localetime\";\n\nexport default {\n\tname: \"ListIgnored\",\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t},\n\tmethods: {\n\t\tlocaletime(date) {\n\t\t\treturn localetime(date);\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./ListIgnored.vue?vue&type=template&id=71b8f4ed&\"\nimport script from \"./ListIgnored.vue?vue&type=script&lang=js&\"\nexport * from \"./ListIgnored.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('table',{staticClass:\"ignore-list\"},[_vm._m(0),_c('tbody',_vm._l((_vm.channel.data),function(user){return _c('tr',{key:user.hostmask},[_c('td',{staticClass:\"hostmask\"},[_vm._v(_vm._s(user.hostmask))]),_c('td',{staticClass:\"when\"},[_vm._v(_vm._s(_vm.localetime(user.when)))])])}),0)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('thead',[_c('tr',[_c('th',{staticClass:\"hostmask\"},[_vm._v(\"Hostmask\")]),_c('th',{staticClass:\"when\"},[_vm._v(\"Ignored At\")])])])}]\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Chat.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Chat.vue?vue&type=script&lang=js&\"","<template>\n\t<div id=\"chat-container\" class=\"window\" :data-current-channel=\"channel.name\" lang=\"\">\n\t\t<div\n\t\t\tid=\"chat\"\n\t\t\t:class=\"{\n\t\t\t\t'hide-motd': !$store.state.settings.motd,\n\t\t\t\t'colored-nicks': $store.state.settings.coloredNicks,\n\t\t\t\t'time-seconds': $store.state.settings.showSeconds,\n\t\t\t\t'time-12h': $store.state.settings.use12hClock,\n\t\t\t}\"\n\t\t>\n\t\t\t<div\n\t\t\t\t:id=\"'chan-' + channel.id\"\n\t\t\t\tclass=\"chat-view\"\n\t\t\t\t:data-type=\"channel.type\"\n\t\t\t\t:aria-label=\"channel.name\"\n\t\t\t\trole=\"tabpanel\"\n\t\t\t>\n\t\t\t\t<div class=\"header\">\n\t\t\t\t\t<SidebarToggle />\n\t\t\t\t\t<span class=\"title\">{{ channel.name }}</span>\n\t\t\t\t\t<!--div v-if=\"channel.editTopic === true\" class=\"topic-container\">\n\t\t\t\t\t\t<input\n\t\t\t\t\t\t\tref=\"topicInput\"\n\t\t\t\t\t\t\t:value=\"channel.topic\"\n\t\t\t\t\t\t\tclass=\"topic-input\"\n\t\t\t\t\t\t\tplaceholder=\"Set channel topic\"\n\t\t\t\t\t\t\tenterkeyhint=\"done\"\n\t\t\t\t\t\t\t@keyup.enter=\"saveTopic\"\n\t\t\t\t\t\t\t@keyup.esc=\"channel.editTopic = false\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span aria-label=\"Save topic\" class=\"save-topic\" @click=\"saveTopic\">\n\t\t\t\t\t\t\t<span type=\"button\" aria-label=\"Save topic\"></span>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div-->\n\t\t\t\t\t<span v-else :title=\"channel.topic\" class=\"topic\"\"\n\t\t\t\t\t\t><ParsedMessage\n\t\t\t\t\t\t\tv-if=\"channel.topic\"\n\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t:text=\"channel.topic\"\n\t\t\t\t\t/></span>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"mentions\"\n\t\t\t\t\t\taria-label=\"Open your mentions\"\n\t\t\t\t\t\t@click=\"openMentions\"\n\t\t\t\t\t/>\n\t\t\t\t\t<button\n\t\t\t\t\t\tclass=\"menu\"\n\t\t\t\t\t\taria-label=\"Open the context menu\"\n\t\t\t\t\t\t@click=\"openContextMenu\"\n\t\t\t\t\t/>\n\t\t\t\t\t<span\n\t\t\t\t\t\tv-if=\"channel.type === 'channel'\"\n\t\t\t\t\t\tclass=\"rt-tooltip tooltipped tooltipped-w\"\n\t\t\t\t\t\taria-label=\"Toggle user list\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"rt\"\n\t\t\t\t\t\t\taria-label=\"Toggle user list\"\n\t\t\t\t\t\t\t@click=\"$store.commit('toggleUserlist')\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<div v-if=\"channel.type === 'special'\" class=\"chat-content\">\n\t\t\t\t\t<div class=\"chat\">\n\t\t\t\t\t\t<div class=\"messages\">\n\t\t\t\t\t\t\t<div class=\"msg\">\n\t\t\t\t\t\t\t\t<component\n\t\t\t\t\t\t\t\t\t:is=\"specialComponent\"\n\t\t\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div v-else class=\"chat-content\">\n\t\t\t\t\t<div\n\t\t\t\t\t\t:class=\"[\n\t\t\t\t\t\t\t'scroll-down tooltipped tooltipped-w tooltipped-no-touch',\n\t\t\t\t\t\t\t{'scroll-down-shown': !channel.scrolledToBottom},\n\t\t\t\t\t\t]\"\n\t\t\t\t\t\taria-label=\"Jump to recent messages\"\n\t\t\t\t\t\t@click=\"$refs.messageList.jumpToBottom()\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div class=\"scroll-down-arrow\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<MessageList ref=\"messageList\" :network=\"network\" :channel=\"channel\" />\n\t\t\t\t\t<ChatUserList v-if=\"channel.type === 'channel'\" :channel=\"channel\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div\n\t\t\tv-if=\"this.$store.state.currentUserVisibleError\"\n\t\t\tid=\"user-visible-error\"\n\t\t\t@click=\"hideUserVisibleError\"\n\t\t>\n\t\t\t{{ this.$store.state.currentUserVisibleError }}\n\t\t</div>\n\t\t<ChatInput :network=\"network\" :channel=\"channel\" />\n\t</div>\n</template>\n\n<script>\nimport socket from \"../js/socket\";\nimport eventbus from \"../js/eventbus\";\nimport ParsedMessage from \"./ParsedMessage.vue\";\nimport MessageList from \"./MessageList.vue\";\nimport ChatInput from \"./ChatInput.vue\";\nimport ChatUserList from \"./ChatUserList.vue\";\nimport SidebarToggle from \"./SidebarToggle.vue\";\nimport ListBans from \"./Special/ListBans.vue\";\nimport ListInvites from \"./Special/ListInvites.vue\";\nimport ListChannels from \"./Special/ListChannels.vue\";\nimport ListIgnored from \"./Special/ListIgnored.vue\";\n\nexport default {\n\tname: \"Chat\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tMessageList,\n\t\tChatInput,\n\t\tChatUserList,\n\t\tSidebarToggle,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t},\n\tcomputed: {\n\t\tspecialComponent() {\n\t\t\tswitch (this.channel.special) {\n\t\t\t\tcase \"list_bans\":\n\t\t\t\t\treturn ListBans;\n\t\t\t\tcase \"list_invites\":\n\t\t\t\t\treturn ListInvites;\n\t\t\t\tcase \"list_channels\":\n\t\t\t\t\treturn ListChannels;\n\t\t\t\tcase \"list_ignored\":\n\t\t\t\t\treturn ListIgnored;\n\t\t\t}\n\n\t\t\treturn undefined;\n\t\t},\n\t},\n\twatch: {\n\t\tchannel() {\n\t\t\tthis.channelChanged();\n\t\t},\n\t\t\"channel.editTopic\"(newValue) {\n\t\t\tif (newValue) {\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tthis.$refs.topicInput.focus();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.channelChanged();\n\n\t\tif (this.channel.editTopic) {\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.$refs.topicInput.focus();\n\t\t\t});\n\t\t}\n\t},\n\tmethods: {\n\t\tchannelChanged() {\n\t\t\t// Triggered when active channel is set or changed\n\t\t\tthis.channel.highlight = 0;\n\t\t\tthis.channel.unread = 0;\n\n\t\t\tsocket.emit(\"open\", this.channel.id);\n\n\t\t\tif (this.channel.usersOutdated) {\n\t\t\t\tthis.channel.usersOutdated = false;\n\n\t\t\t\tsocket.emit(\"names\", {\n\t\t\t\t\ttarget: this.channel.id,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\thideUserVisibleError() {\n\t\t\tthis.$store.commit(\"currentUserVisibleError\", null);\n\t\t},\n\t\teditTopic() {\n\t\t\tif (this.channel.type === \"channel\") {\n\t\t\t\tthis.channel.editTopic = true;\n\t\t\t}\n\t\t},\n\t\tsaveTopic() {\n\t\t\tthis.channel.editTopic = false;\n\t\t\tconst newTopic = this.$refs.topicInput.value;\n\n\t\t\tif (this.channel.topic !== newTopic) {\n\t\t\t\tconst target = this.channel.id;\n\t\t\t\tconst text = `/raw TOPIC ${this.channel.name} :${newTopic}`;\n\t\t\t\tsocket.emit(\"input\", {target, text});\n\t\t\t}\n\t\t},\n\t\topenContextMenu(event) {\n\t\t\teventbus.emit(\"contextmenu:channel\", {\n\t\t\t\tevent: event,\n\t\t\t\tchannel: this.channel,\n\t\t\t\tnetwork: this.network,\n\t\t\t});\n\t\t},\n\t\topenMentions() {\n\t\t\teventbus.emit(\"mentions:toggle\", {\n\t\t\t\tevent: event,\n\t\t\t});\n\t\t},\n\t},\n};\n</script>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RoutedChat.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RoutedChat.vue?vue&type=script&lang=js&\"","<template>\n\t<Chat v-if=\"activeChannel\" :network=\"activeChannel.network\" :channel=\"activeChannel.channel\" />\n</template>\n\n<script>\n// Temporary component for routing channels and lobbies\nimport Chat from \"./Chat.vue\";\n\nexport default {\n\tname: \"RoutedChat\",\n\tcomponents: {\n\t\tChat,\n\t},\n\tcomputed: {\n\t\tactiveChannel() {\n\t\t\tconst chanId = parseInt(this.$route.params.id, 10);\n\t\t\tconst channel = this.$store.getters.findChannel(chanId);\n\t\t\treturn channel;\n\t\t},\n\t},\n\twatch: {\n\t\tactiveChannel() {\n\t\t\tthis.setActiveChannel();\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.setActiveChannel();\n\t},\n\tmethods: {\n\t\tsetActiveChannel() {\n\t\t\tthis.$store.commit(\"activeChannel\", this.activeChannel);\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./Chat.vue?vue&type=template&id=079ecd52&\"\nimport script from \"./Chat.vue?vue&type=script&lang=js&\"\nexport * from \"./Chat.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"window\",attrs:{\"id\":\"chat-container\",\"data-current-channel\":_vm.channel.name,\"lang\":\"\"}},[_c('div',{class:{\n\t\t\t'hide-motd': !_vm.$store.state.settings.motd,\n\t\t\t'colored-nicks': _vm.$store.state.settings.coloredNicks,\n\t\t\t'time-seconds': _vm.$store.state.settings.showSeconds,\n\t\t\t'time-12h': _vm.$store.state.settings.use12hClock,\n\t\t},attrs:{\"id\":\"chat\"}},[_c('div',{staticClass:\"chat-view\",attrs:{\"id\":'chan-' + _vm.channel.id,\"data-type\":_vm.channel.type,\"aria-label\":_vm.channel.name,\"role\":\"tabpanel\"}},[_c('div',{staticClass:\"header\"},[_c('SidebarToggle'),_c('span',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.channel.name))]),_c('button',{staticClass:\"mentions\",attrs:{\"aria-label\":\"Open your mentions\"},on:{\"click\":_vm.openMentions}}),_c('button',{staticClass:\"menu\",attrs:{\"aria-label\":\"Open the context menu\"},on:{\"click\":_vm.openContextMenu}}),(_vm.channel.type === 'channel')?_c('span',{staticClass:\"rt-tooltip tooltipped tooltipped-w\",attrs:{\"aria-label\":\"Toggle user list\"}},[_c('button',{staticClass:\"rt\",attrs:{\"aria-label\":\"Toggle user list\"},on:{\"click\":function($event){return _vm.$store.commit('toggleUserlist')}}})]):_vm._e()],1),(_vm.channel.type === 'special')?_c('div',{staticClass:\"chat-content\"},[_c('div',{staticClass:\"chat\"},[_c('div',{staticClass:\"messages\"},[_c('div',{staticClass:\"msg\"},[_c(_vm.specialComponent,{tag:\"component\",attrs:{\"network\":_vm.network,\"channel\":_vm.channel}})],1)])])]):_c('div',{staticClass:\"chat-content\"},[_c('div',{class:[\n\t\t\t\t\t\t'scroll-down tooltipped tooltipped-w tooltipped-no-touch',\n\t\t\t\t\t\t{'scroll-down-shown': !_vm.channel.scrolledToBottom} ],attrs:{\"aria-label\":\"Jump to recent messages\"},on:{\"click\":function($event){return _vm.$refs.messageList.jumpToBottom()}}},[_c('div',{staticClass:\"scroll-down-arrow\"})]),_c('MessageList',{ref:\"messageList\",attrs:{\"network\":_vm.network,\"channel\":_vm.channel}}),(_vm.channel.type === 'channel')?_c('ChatUserList',{attrs:{\"channel\":_vm.channel}}):_vm._e()],1)])]),(this.$store.state.currentUserVisibleError)?_c('div',{attrs:{\"id\":\"user-visible-error\"},on:{\"click\":_vm.hideUserVisibleError}},[_vm._v(\"\\n\\t\\t\"+_vm._s(this.$store.state.currentUserVisibleError)+\"\\n\\t\")]):_vm._e(),_c('ChatInput',{attrs:{\"network\":_vm.network,\"channel\":_vm.channel}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./RoutedChat.vue?vue&type=template&id=41b89bd6&\"\nimport script from \"./RoutedChat.vue?vue&type=script&lang=js&\"\nexport * from \"./RoutedChat.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.activeChannel)?_c('Chat',{attrs:{\"network\":_vm.activeChannel.network,\"channel\":_vm.activeChannel.channel}}):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\"use strict\";\n\nconst constants = require(\"./constants\");\n\nimport Vue from \"vue\";\nimport VueRouter from \"vue-router\";\n\nVue.use(VueRouter);\n\nimport SignIn from \"../components/Windows/SignIn.vue\";\nimport Connect from \"../components/Windows/Connect.vue\";\nimport Settings from \"../components/Windows/Settings.vue\";\nimport Help from \"../components/Windows/Help.vue\";\nimport Changelog from \"../components/Windows/Changelog.vue\";\nimport NetworkEdit from \"../components/Windows/NetworkEdit.vue\";\nimport RoutedChat from \"../components/RoutedChat.vue\";\nimport store from \"./store\";\n\nconst router = new VueRouter({\n\troutes: [\n\t\t{\n\t\t\tname: \"SignIn\",\n\t\t\tpath: \"/sign-in\",\n\t\t\tcomponent: SignIn,\n\t\t\tbeforeEnter(to, from, next) {\n\t\t\t\t// Prevent navigating to sign-in when already signed in\n\t\t\t\tif (store.state.appLoaded) {\n\t\t\t\t\tnext(false);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tnext();\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Connect\",\n\t\t\tpath: \"/connect\",\n\t\t\tcomponent: Connect,\n\t\t\tprops: (route) => ({queryParams: route.query}),\n\t\t},\n\t\t{\n\t\t\tname: \"Settings\",\n\t\t\tpath: \"/settings\",\n\t\t\tcomponent: Settings,\n\t\t},\n\t\t{\n\t\t\tname: \"Help\",\n\t\t\tpath: \"/help\",\n\t\t\tcomponent: Help,\n\t\t},\n\t\t{\n\t\t\tname: \"Changelog\",\n\t\t\tpath: \"/changelog\",\n\t\t\tcomponent: Changelog,\n\t\t},\n\t\t{\n\t\t\tname: \"NetworkEdit\",\n\t\t\tpath: \"/edit-network/:uuid\",\n\t\t\tcomponent: NetworkEdit,\n\t\t},\n\t\t{\n\t\t\tname: \"RoutedChat\",\n\t\t\tpath: \"/chan-:id\",\n\t\t\tcomponent: RoutedChat,\n\t\t},\n\t],\n});\n\nrouter.beforeEach((to, from, next) => {\n\t// If user is not yet signed in, wait for appLoaded state to change\n\t// unless they are trying to open SignIn (which can be triggered in auth.js)\n\tif (!store.state.appLoaded && to.name !== \"SignIn\") {\n\t\tstore.watch(\n\t\t\t(state) => state.appLoaded,\n\t\t\t() => next()\n\t\t);\n\n\t\treturn;\n\t}\n\n\tnext();\n});\n\nrouter.beforeEach((to, from, next) => {\n\t// Disallow navigating to non-existing routes\n\tif (!to.matched.length) {\n\t\tnext(false);\n\t\treturn;\n\t}\n\n\t// Disallow navigating to invalid channels\n\tif (to.name === \"RoutedChat\" && !store.getters.findChannel(Number(to.params.id))) {\n\t\tnext(false);\n\t\treturn;\n\t}\n\n\t// Disallow navigating to invalid networks\n\tif (to.name === \"NetworkEdit\" && !store.getters.findNetwork(to.params.uuid)) {\n\t\tnext(false);\n\t\treturn;\n\t}\n\n\t// Handle closing image viewer with the browser back button\n\tif (!router.app.$refs.app) {\n\t\tnext();\n\t\treturn;\n\t}\n\n\tconst imageViewer = router.app.$root.$refs.app.$refs.imageViewer;\n\n\tif (imageViewer && imageViewer.link) {\n\t\timageViewer.closeViewer();\n\t\tnext(false);\n\t\treturn;\n\t}\n\n\tnext();\n});\n\nrouter.afterEach((to) => {\n\tif (store.state.appLoaded) {\n\t\tif (window.innerWidth <= constants.mobileViewportPixels) {\n\t\t\tstore.commit(\"sidebarOpen\", false);\n\t\t}\n\t}\n\n\tif (store.state.activeChannel) {\n\t\tconst channel = store.state.activeChannel.channel;\n\n\t\tif (to.name !== \"RoutedChat\") {\n\t\t\tstore.commit(\"activeChannel\", null);\n\t\t}\n\n\t\t// When switching out of a channel, mark everything as read\n\t\tif (channel.messages.length > 0) {\n\t\t\tchannel.firstUnread = channel.messages[channel.messages.length - 1].id;\n\t\t}\n\n\t\tif (channel.messages.length > 100) {\n\t\t\tchannel.messages.splice(0, channel.messages.length - 100);\n\t\t\tchannel.moreHistoryAvailable = true;\n\t\t}\n\t}\n});\n\nfunction navigate(routeName, params = {}) {\n\tif (router.currentRoute.name) {\n\t\trouter.push({name: routeName, params}).catch(() => {});\n\t} else {\n\t\t// If current route is null, replace the history entry\n\t\t// This prevents invalid entries from lingering in history,\n\t\t// and then the route guard preventing proper navigation\n\t\trouter.replace({name: routeName, params}).catch(() => {});\n\t}\n}\n\nfunction switchToChannel(channel) {\n\treturn navigate(\"RoutedChat\", {id: channel.id});\n}\n\nif (\"serviceWorker\" in navigator) {\n\tnavigator.serviceWorker.addEventListener(\"message\", (event) => {\n\t\tif (event.data && event.data.type === \"open\") {\n\t\t\tconst id = parseInt(event.data.channel.substr(5), 10); // remove \"chan-\" prefix\n\n\t\t\tconst channelTarget = store.getters.findChannel(id);\n\n\t\t\tif (channelTarget) {\n\t\t\t\tswitchToChannel(channelTarget.channel);\n\t\t\t}\n\t\t}\n\t});\n}\n\nexport {router, navigate, switchToChannel};\n","\"use strict\";\n\n// This is a simple localStorage wrapper because browser can throw errors\n// in different situations, including:\n// - Unable to store data if storage is full\n// - Local storage is blocked if \"third-party cookies and site data\" is disabled\n//\n// For more details, see:\n// https://stackoverflow.com/q/14555347/1935861\n// https://github.com/thelounge/thelounge/issues/2699\n// https://www.chromium.org/for-testers/bug-reporting-guidelines/uncaught-securityerror-failed-to-read-the-localstorage-property-from-window-access-is-denied-for-this-document\n\nexport default {\n\tset(key, value) {\n\t\ttry {\n\t\t\twindow.localStorage.setItem(key, value);\n\t\t} catch (e) {\n\t\t\t//\n\t\t}\n\t},\n\tget(key) {\n\t\ttry {\n\t\t\treturn window.localStorage.getItem(key);\n\t\t} catch (e) {\n\t\t\t// Return null as if data is not set\n\t\t\treturn null;\n\t\t}\n\t},\n\tremove(key) {\n\t\ttry {\n\t\t\twindow.localStorage.removeItem(key);\n\t\t} catch (e) {\n\t\t\t//\n\t\t}\n\t},\n\tclear() {\n\t\ttry {\n\t\t\twindow.localStorage.clear();\n\t\t} catch (e) {\n\t\t\t//\n\t\t}\n\t},\n};\n","\"use strict\";\n\nimport dayjs from \"dayjs\";\n\nexport default (time) => dayjs(time).format(\"D MMMM YYYY, HH:mm:ss\");\n","\"use strict\";\n\nmodule.exports = function () {\n\treturn function () {};\n};\n","\"use strict\";\n\nconst colorCodeMap = [\n\t[\"00\", \"White\"],\n\t[\"01\", \"Black\"],\n\t[\"02\", \"Blue\"],\n\t[\"03\", \"Green\"],\n\t[\"04\", \"Red\"],\n\t[\"05\", \"Brown\"],\n\t[\"06\", \"Magenta\"],\n\t[\"07\", \"Orange\"],\n\t[\"08\", \"Yellow\"],\n\t[\"09\", \"Light Green\"],\n\t[\"10\", \"Cyan\"],\n\t[\"11\", \"Light Cyan\"],\n\t[\"12\", \"Light Blue\"],\n\t[\"13\", \"Pink\"],\n\t[\"14\", \"Grey\"],\n\t[\"15\", \"Light Grey\"],\n];\n\nconst condensedTypes = new Set([\"chghost\", \"join\", \"part\", \"quit\", \"nick\", \"kick\", \"mode\"]);\n\nconst timeFormats = {\n\tmsgDefault: \"HH:mm\",\n\tmsgWithSeconds: \"HH:mm:ss\",\n\tmsg12h: \"hh:mm A\",\n\tmsg12hWithSeconds: \"hh:mm:ss A\",\n};\n\n// This file is required by server, can't use es6 export\nmodule.exports = {\n\tcolorCodeMap,\n\tcommands: [],\n\tcondensedTypes,\n\ttimeFormats,\n\t// Same value as media query in CSS that forces sidebars to become overlays\n\tmobileViewportPixels: 768,\n};\n","\"use strict\";\n\nimport {update as updateCursor} from \"undate\";\n\nimport socket from \"./socket\";\nimport store from \"./store\";\n\nclass Uploader {\n\tinit() {\n\t\tthis.xhr = null;\n\t\tthis.fileQueue = [];\n\t\tthis.tokenKeepAlive = null;\n\n\t\tdocument.addEventListener(\"dragenter\", (e) => this.dragEnter(e));\n\t\tdocument.addEventListener(\"dragover\", (e) => this.dragOver(e));\n\t\tdocument.addEventListener(\"dragleave\", (e) => this.dragLeave(e));\n\t\tdocument.addEventListener(\"drop\", (e) => this.drop(e));\n\t\tdocument.addEventListener(\"paste\", (e) => this.paste(e));\n\n\t\tsocket.on(\"upload:auth\", (token) => this.uploadNextFileInQueue(token));\n\t}\n\n\tmounted() {\n\t\tthis.overlay = document.getElementById(\"upload-overlay\");\n\t\tthis.uploadProgressbar = document.getElementById(\"upload-progressbar\");\n\t}\n\n\tdragOver(event) {\n\t\t// Prevent dragover event completely and do nothing with it\n\t\t// This stops the browser from trying to guess which cursor to show\n\t\tevent.preventDefault();\n\t}\n\n\tdragEnter(event) {\n\t\tevent.preventDefault();\n\n\t\t// relatedTarget is the target where we entered the drag from\n\t\t// when dragging from another window, the target is null, otherwise its a DOM element\n\t\tif (!event.relatedTarget && event.dataTransfer.types.includes(\"Files\")) {\n\t\t\tthis.overlay.classList.add(\"is-dragover\");\n\t\t}\n\t}\n\n\tdragLeave(event) {\n\t\tevent.preventDefault();\n\n\t\t// If relatedTarget is null, that means we are no longer dragging over the page\n\t\tif (!event.relatedTarget) {\n\t\t\tthis.overlay.classList.remove(\"is-dragover\");\n\t\t}\n\t}\n\n\tdrop(event) {\n\t\tevent.preventDefault();\n\t\tthis.overlay.classList.remove(\"is-dragover\");\n\n\t\tlet files;\n\n\t\tif (event.dataTransfer.items) {\n\t\t\tfiles = Array.from(event.dataTransfer.items)\n\t\t\t\t.filter((item) => item.kind === \"file\")\n\t\t\t\t.map((item) => item.getAsFile());\n\t\t} else {\n\t\t\tfiles = Array.from(event.dataTransfer.files);\n\t\t}\n\n\t\tthis.triggerUpload(files);\n\t}\n\n\tpaste(event) {\n\t\tconst items = event.clipboardData.items;\n\t\tconst files = [];\n\n\t\tfor (const item of items) {\n\t\t\tif (item.kind === \"file\") {\n\t\t\t\tfiles.push(item.getAsFile());\n\t\t\t}\n\t\t}\n\n\t\tif (files.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tthis.triggerUpload(files);\n\t}\n\n\ttriggerUpload(files) {\n\t\tif (!files.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!store.state.isConnected) {\n\t\t\tthis.handleResponse({\n\t\t\t\terror: `You are currently disconnected, unable to initiate upload process.`,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst wasQueueEmpty = this.fileQueue.length === 0;\n\t\tconst maxFileSize = store.state.serverConfiguration.fileUploadMaxFileSize;\n\n\t\tfor (const file of files) {\n\t\t\tif (maxFileSize > 0 && file.size > maxFileSize) {\n\t\t\t\tthis.handleResponse({\n\t\t\t\t\terror: `File ${file.name} is over the maximum allowed size`,\n\t\t\t\t});\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tthis.fileQueue.push(file);\n\t\t}\n\n\t\t// if the queue was empty and we added some files to it, and there currently\n\t\t// is no upload in process, request a token to start the upload process\n\t\tif (wasQueueEmpty && this.xhr === null && this.fileQueue.length > 0) {\n\t\t\tthis.requestToken();\n\t\t}\n\t}\n\n\trequestToken() {\n\t\tsocket.emit(\"upload:auth\");\n\t}\n\n\tsetProgress(value) {\n\t\tthis.uploadProgressbar.classList.toggle(\"upload-progressbar-visible\", value > 0);\n\t\tthis.uploadProgressbar.style.width = value + \"%\";\n\t}\n\n\tuploadNextFileInQueue(token) {\n\t\tconst file = this.fileQueue.shift();\n\n\t\t// Tell the server that we are still upload to this token\n\t\t// so it does not become invalidated and fail the upload.\n\t\t// This issue only happens if The Lounge is proxied through other software\n\t\t// as it may buffer the upload before the upload request will be processed by The Lounge.\n\t\tthis.tokenKeepAlive = setInterval(() => socket.emit(\"upload:ping\", token), 40 * 1000);\n\n\t\tif (\n\t\t\tstore.state.settings.uploadCanvas &&\n\t\t\tfile.type.startsWith(\"image/\") &&\n\t\t\t!file.type.includes(\"svg\")\n\t\t) {\n\t\t\tthis.renderImage(file, (newFile) => this.performUpload(token, newFile));\n\t\t} else {\n\t\t\tthis.performUpload(token, file);\n\t\t}\n\t}\n\n\trenderImage(file, callback) {\n\t\tconst fileReader = new FileReader();\n\n\t\tfileReader.onabort = () => callback(file);\n\t\tfileReader.onerror = () => fileReader.abort();\n\n\t\tfileReader.onload = () => {\n\t\t\tconst img = new Image();\n\n\t\t\timg.onerror = () => callback(file);\n\n\t\t\timg.onload = () => {\n\t\t\t\tconst canvas = document.createElement(\"canvas\");\n\t\t\t\tcanvas.width = img.width;\n\t\t\t\tcanvas.height = img.height;\n\t\t\t\tconst ctx = canvas.getContext(\"2d\");\n\t\t\t\tctx.drawImage(img, 0, 0);\n\n\t\t\t\tcanvas.toBlob((blob) => {\n\t\t\t\t\tcallback(new File([blob], file.name));\n\t\t\t\t}, file.type);\n\t\t\t};\n\n\t\t\timg.src = fileReader.result;\n\t\t};\n\n\t\tfileReader.readAsDataURL(file);\n\t}\n\n\tperformUpload(token, file) {\n\t\tthis.xhr = new XMLHttpRequest();\n\n\t\tthis.xhr.upload.addEventListener(\n\t\t\t\"progress\",\n\t\t\t(e) => {\n\t\t\t\tconst percent = Math.floor((e.loaded / e.total) * 1000) / 10;\n\t\t\t\tthis.setProgress(percent);\n\t\t\t},\n\t\t\tfalse\n\t\t);\n\n\t\tthis.xhr.onreadystatechange = () => {\n\t\t\tif (this.xhr.readyState === XMLHttpRequest.DONE) {\n\t\t\t\tlet response;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponse = JSON.parse(this.xhr.responseText);\n\t\t\t\t} catch (err) {\n\t\t\t\t\t// This is just a safe guard and should not happen if server doesn't throw any errors.\n\t\t\t\t\t// Browsers break the HTTP spec by aborting the request without reading any response data,\n\t\t\t\t\t// if there is still data to be uploaded. Servers will only error in extreme cases like bad\n\t\t\t\t\t// authentication or server-side errors.\n\t\t\t\t\tresponse = {\n\t\t\t\t\t\terror: `Upload aborted: HTTP ${this.xhr.status}`,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tthis.handleResponse(response);\n\n\t\t\t\tthis.xhr = null;\n\n\t\t\t\t// this file was processed, if we still have files in the queue, upload the next one\n\t\t\t\tif (this.fileQueue.length > 0) {\n\t\t\t\t\tthis.requestToken();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tconst formData = new FormData();\n\t\tformData.append(\"file\", file);\n\t\tthis.xhr.open(\"POST\", `uploads/new/${token}`);\n\t\tthis.xhr.send(formData);\n\t}\n\n\thandleResponse(response) {\n\t\tthis.setProgress(0);\n\n\t\tif (this.tokenKeepAlive) {\n\t\t\tclearInterval(this.tokenKeepAlive);\n\t\t\tthis.tokenKeepAlive = null;\n\t\t}\n\n\t\tif (response.error) {\n\t\t\tstore.commit(\"currentUserVisibleError\", response.error);\n\t\t\treturn;\n\t\t}\n\n\t\tif (response.url) {\n\t\t\tthis.insertUploadUrl(response.url);\n\t\t}\n\t}\n\n\tinsertUploadUrl(url) {\n\t\tconst fullURL = new URL(url, location).toString();\n\t\tconst textbox = document.getElementById(\"input\");\n\t\tconst initStart = textbox.selectionStart;\n\n\t\t// Get the text before the cursor, and add a space if it's not in the beginning\n\t\tconst headToCursor = initStart > 0 ? textbox.value.substr(0, initStart) + \" \" : \"\";\n\n\t\t// Get the remaining text after the cursor\n\t\tconst cursorToTail = textbox.value.substr(initStart);\n\n\t\t// Construct the value until the point where we want the cursor to be\n\t\tconst textBeforeTail = headToCursor + fullURL + \" \";\n\n\t\tupdateCursor(textbox, textBeforeTail + cursorToTail);\n\n\t\t// Set the cursor after the link and a space\n\t\ttextbox.selectionStart = textbox.selectionEnd = textBeforeTail.length;\n\t}\n\n\t// TODO: This is a temporary hack while Vue porting is finalized\n\tabort() {\n\t\tthis.fileQueue = [];\n\n\t\tif (this.xhr) {\n\t\t\tthis.xhr.abort();\n\t\t\tthis.xhr = null;\n\t\t}\n\t}\n}\n\nconst instance = new Uploader();\n\nexport default {\n\tabort: () => instance.abort(),\n\tinitialize: () => instance.init(),\n\tmounted: () => instance.mounted(),\n\ttriggerUpload: (files) => instance.triggerUpload(files),\n};\n","\"use strict\";\n\nconst sizes = [\"Bytes\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\"];\n\nexport default (size) => {\n\t// Loosely inspired from https://stackoverflow.com/a/18650828/1935861\n\tconst i = size > 0 ? Math.floor(Math.log(size) / Math.log(1024)) : 0;\n\tconst fixedSize = parseFloat((size / Math.pow(1024, i)).toFixed(1));\n\treturn `${fixedSize} ${sizes[i]}`;\n};\n","\"use strict\";\n\nimport storage from \"./localStorage\";\nimport location from \"./location\";\n\nexport default class Auth {\n\tstatic signout() {\n\t\tstorage.clear();\n\t\tlocation.reload();\n\t}\n}\n","\"use strict\";\n\n// This is a thin wrapper around `window.location`, in order to contain the\n// side-effects. Do not add logic to it as it cannot be tested, only mocked.\nexport default {\n\treload() {\n\t\twindow.location.reload();\n\t},\n};\n","\"use strict\";\n\n// Taken from views/index.js\n\n// This creates a version of `require()` in the context of the current\n// directory, so we iterate over its content, which is a map statically built by\n// Webpack.\n// Second argument says it's recursive, third makes sure we only load javascript.\nconst commands = require.context(\"./\", true, /\\.js$/);\n\nexport default commands.keys().reduce((acc, path) => {\n\tconst command = path.substring(2, path.length - 3);\n\n\tif (command === \"index\") {\n\t\treturn acc;\n\t}\n\n\tacc[command] = commands(path).default;\n\n\treturn acc;\n}, {});\n","\"use strict\";\n\nimport socket from \"./socket\";\nimport store from \"./store\";\n\nexport default {togglePushSubscription};\n\nsocket.once(\"push:issubscribed\", function (hasSubscriptionOnServer) {\n\tif (!isAllowedServiceWorkersHost()) {\n\t\tstore.commit(\"pushNotificationState\", \"nohttps\");\n\t\treturn;\n\t}\n\n\tif (!(\"serviceWorker\" in navigator)) {\n\t\treturn;\n\t}\n\n\tnavigator.serviceWorker\n\t\t.register(\"service-worker.js\")\n\t\t.then((registration) => {\n\t\t\tstore.commit(\"hasServiceWorker\");\n\n\t\t\tif (!registration.pushManager) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\treturn registration.pushManager.getSubscription().then((subscription) => {\n\t\t\t\t// If client has push registration but the server knows nothing about it,\n\t\t\t\t// this subscription is broken and client has to register again\n\t\t\t\tif (subscription && hasSubscriptionOnServer === false) {\n\t\t\t\t\tsubscription.unsubscribe().then((successful) => {\n\t\t\t\t\t\tstore.commit(\n\t\t\t\t\t\t\t\"pushNotificationState\",\n\t\t\t\t\t\t\tsuccessful ? \"supported\" : \"unsupported\"\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tstore.commit(\n\t\t\t\t\t\t\"pushNotificationState\",\n\t\t\t\t\t\tsubscription ? \"subscribed\" : \"supported\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t})\n\t\t.catch((err) => {\n\t\t\tstore.commit(\"pushNotificationState\", \"unsupported\");\n\t\t\tconsole.error(err); // eslint-disable-line no-console\n\t\t});\n});\n\nfunction togglePushSubscription() {\n\tstore.commit(\"pushNotificationState\", \"loading\");\n\n\tnavigator.serviceWorker.ready\n\t\t.then((registration) =>\n\t\t\tregistration.pushManager.getSubscription().then((existingSubscription) => {\n\t\t\t\tif (existingSubscription) {\n\t\t\t\t\tsocket.emit(\"push:unregister\");\n\n\t\t\t\t\treturn existingSubscription.unsubscribe().then((successful) => {\n\t\t\t\t\t\tstore.commit(\n\t\t\t\t\t\t\t\"pushNotificationState\",\n\t\t\t\t\t\t\tsuccessful ? \"supported\" : \"unsupported\"\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn registration.pushManager\n\t\t\t\t\t.subscribe({\n\t\t\t\t\t\tapplicationServerKey: store.state.serverConfiguration.applicationServerKey,\n\t\t\t\t\t\tuserVisibleOnly: true,\n\t\t\t\t\t})\n\t\t\t\t\t.then((subscription) => {\n\t\t\t\t\t\tsocket.emit(\"push:register\", subscription.toJSON());\n\t\t\t\t\t\tstore.commit(\"pushNotificationState\", \"subscribed\");\n\t\t\t\t\t\tstore.commit(\"refreshDesktopNotificationState\");\n\t\t\t\t\t});\n\t\t\t})\n\t\t)\n\t\t.catch((err) => {\n\t\t\tstore.commit(\"pushNotificationState\", \"unsupported\");\n\t\t\tstore.commit(\"refreshDesktopNotificationState\");\n\t\t\tconsole.error(err); // eslint-disable-line no-console\n\t\t});\n}\n\nfunction isAllowedServiceWorkersHost() {\n\treturn (\n\t\tlocation.protocol === \"https:\" ||\n\t\tlocation.hostname === \"localhost\" ||\n\t\tlocation.hostname === \"127.0.0.1\"\n\t);\n}\n","\"use strict\";\n\nconst LinkifyIt = require(\"linkify-it\");\n\nLinkifyIt.prototype.normalize = function normalize(match) {\n\tif (!match.schema) {\n\t\tmatch.schema = \"http:\";\n\t\tmatch.url = \"http://\" + match.url;\n\t\tmatch.noschema = true;\n\t}\n\n\tif (match.schema === \"//\") {\n\t\tmatch.schema = \"http:\";\n\t\tmatch.url = \"http:\" + match.url;\n\t\tmatch.noschema = true;\n\t}\n\n\tif (match.schema === \"mailto:\" && !/^mailto:/i.test(match.url)) {\n\t\tmatch.url = \"mailto:\" + match.url;\n\t}\n};\n\nconst linkify = LinkifyIt().tlds(require(\"tlds\")).tlds(\"onion\", true);\n\n// Known schemes to detect in text\nconst commonSchemes = [\n\t\"sftp\",\n\t\"smb\",\n\t\"file\",\n\t\"irc\",\n\t\"ircs\",\n\t\"svn\",\n\t\"git\",\n\t\"steam\",\n\t\"mumble\",\n\t\"ts3server\",\n\t\"svn+ssh\",\n\t\"ssh\",\n];\n\nfor (const schema of commonSchemes) {\n\tlinkify.add(schema + \":\", \"http:\");\n}\n\nfunction findLinks(text) {\n\tconst matches = linkify.match(text);\n\n\tif (!matches) {\n\t\treturn [];\n\t}\n\n\treturn matches.map(returnUrl);\n}\n\nfunction findLinksWithSchema(text) {\n\tconst matches = linkify.match(text);\n\n\tif (!matches) {\n\t\treturn [];\n\t}\n\n\treturn matches.filter((url) => !url.noschema).map(returnUrl);\n}\n\nfunction returnUrl(url) {\n\treturn {\n\t\tstart: url.index,\n\t\tend: url.lastIndex,\n\t\tlink: url.url,\n\t};\n}\n\nmodule.exports = {\n\tfindLinks,\n\tfindLinksWithSchema,\n};\n","\"use strict\";\n\nconst matchFormatting = /\\x02|\\x1D|\\x1F|\\x16|\\x0F|\\x11|\\x1E|\\x03(?:[0-9]{1,2}(?:,[0-9]{1,2})?)?|\\x04(?:[0-9a-f]{6}(?:,[0-9a-f]{6})?)?/gi;\n\nmodule.exports = (message) => message.replace(matchFormatting, \"\").trim();\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--1-0!../../node_modules/css-loader/dist/cjs.js??ref--1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js??ref--1-2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NetworkList.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--1-0!../../node_modules/css-loader/dist/cjs.js??ref--1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js??ref--1-2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NetworkList.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--1-0!../../node_modules/css-loader/dist/cjs.js??ref--1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js??ref--1-2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfirmDialog.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--1-0!../../node_modules/css-loader/dist/cjs.js??ref--1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js??ref--1-2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfirmDialog.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--1-0!../../node_modules/css-loader/dist/cjs.js??ref--1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js??ref--1-2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Mentions.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--1-0!../../node_modules/css-loader/dist/cjs.js??ref--1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js??ref--1-2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Mentions.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--1-0!../../node_modules/css-loader/dist/cjs.js??ref--1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js??ref--1-2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NetworkForm.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--1-0!../../node_modules/css-loader/dist/cjs.js??ref--1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js??ref--1-2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NetworkForm.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--1-0!../../node_modules/css-loader/dist/cjs.js??ref--1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js??ref--1-2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Session.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--1-0!../../node_modules/css-loader/dist/cjs.js??ref--1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/dist/cjs.js??ref--1-2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Session.vue?vue&type=style&index=0&lang=css&\"","import mod from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--1-0!../../../node_modules/css-loader/dist/cjs.js??ref--1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/dist/cjs.js??ref--1-2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=style&index=0&lang=css&\"; export default mod; export * from \"-!../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--1-0!../../../node_modules/css-loader/dist/cjs.js??ref--1-1!../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../node_modules/postcss-loader/dist/cjs.js??ref--1-2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Settings.vue?vue&type=style&index=0&lang=css&\"","var map = {\n\t\"./away.vue\": 157,\n\t\"./back.vue\": 139,\n\t\"./chghost.vue\": 145,\n\t\"./ctcp.vue\": 144,\n\t\"./ctcp_request.vue\": 143,\n\t\"./error.vue\": 142,\n\t\"./invite.vue\": 149,\n\t\"./join.vue\": 148,\n\t\"./kick.vue\": 140,\n\t\"./mode.vue\": 155,\n\t\"./mode_channel.vue\": 141,\n\t\"./monospace_block.vue\": 154,\n\t\"./nick.vue\": 152,\n\t\"./part.vue\": 151,\n\t\"./quit.vue\": 150,\n\t\"./raw.vue\": 153,\n\t\"./topic.vue\": 146,\n\t\"./topic_set_by.vue\": 147,\n\t\"./whois.vue\": 156\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 125;","var map = {\n\t\"./collapse.js\": 135,\n\t\"./expand.js\": 136,\n\t\"./index.js\": 34,\n\t\"./join.js\": 137\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 134;","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\nfunction input() {\n\tconst messageIds = [];\n\n\tfor (const message of store.state.activeChannel.channel.messages) {\n\t\tlet toggled = false;\n\n\t\tfor (const preview of message.previews) {\n\t\t\tif (preview.shown) {\n\t\t\t\tpreview.shown = false;\n\t\t\t\ttoggled = true;\n\t\t\t}\n\t\t}\n\n\t\tif (toggled) {\n\t\t\tmessageIds.push(message.id);\n\t\t}\n\t}\n\n\t// Tell the server we're toggling so it remembers at page reload\n\tif (messageIds.length > 0) {\n\t\tsocket.emit(\"msg:preview:toggle\", {\n\t\t\ttarget: store.state.activeChannel.channel.id,\n\t\t\tmessageIds: messageIds,\n\t\t\tshown: false,\n\t\t});\n\t}\n\n\treturn true;\n}\n\nexport default {input};\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\nfunction input() {\n\tconst messageIds = [];\n\n\tfor (const message of store.state.activeChannel.channel.messages) {\n\t\tlet toggled = false;\n\n\t\tfor (const preview of message.previews) {\n\t\t\tif (!preview.shown) {\n\t\t\t\tpreview.shown = true;\n\t\t\t\ttoggled = true;\n\t\t\t}\n\t\t}\n\n\t\tif (toggled) {\n\t\t\tmessageIds.push(message.id);\n\t\t}\n\t}\n\n\t// Tell the server we're toggling so it remembers at page reload\n\tif (messageIds.length > 0) {\n\t\tsocket.emit(\"msg:preview:toggle\", {\n\t\t\ttarget: store.state.activeChannel.channel.id,\n\t\t\tmessageIds: messageIds,\n\t\t\tshown: true,\n\t\t});\n\t}\n\n\treturn true;\n}\n\nexport default {input};\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\nimport {switchToChannel} from \"../router\";\n\nfunction input(args) {\n\tif (args.length > 0) {\n\t\tlet channels = args[0];\n\n\t\tif (channels.length > 0) {\n\t\t\tconst chanTypes = store.state.activeChannel.network.serverOptions.CHANTYPES;\n\t\t\tconst channelList = args[0].split(\",\");\n\n\t\t\tif (chanTypes && chanTypes.length > 0) {\n\t\t\t\tfor (let c = 0; c < channelList.length; c++) {\n\t\t\t\t\tif (!chanTypes.includes(channelList[c][0])) {\n\t\t\t\t\t\tchannelList[c] = chanTypes[0] + channelList[c];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tchannels = channelList.join(\",\");\n\n\t\t\tconst chan = store.getters.findChannelOnCurrentNetwork(channels);\n\n\t\t\tif (chan) {\n\t\t\t\tswitchToChannel(chan);\n\t\t\t} else {\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttext: `/join ${channels} ${args.length > 1 ? args[1] : \"\"}`,\n\t\t\t\t\ttarget: store.state.activeChannel.channel.id,\n\t\t\t\t});\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t} else if (store.state.activeChannel.channel.type === \"channel\") {\n\t\t// If `/join` command is used without any arguments, re-join current channel\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: store.state.activeChannel.channel.id,\n\t\t\ttext: `/join ${store.state.activeChannel.channel.name}`,\n\t\t});\n\n\t\treturn true;\n\t}\n}\n\nexport default {input};\n","\"use strict\";\n\nexport default (event) => {\n\tif (event.target.tagName !== \"TEXTAREA\" && event.target.tagName !== \"INPUT\") {\n\t\treturn false;\n\t}\n\n\t// If focus is in a textarea, do not handle keybinds if user has typed anything\n\t// This is done to prevent keyboard layout binds conflicting with ours\n\t// For example alt+shift+left on macos selects a word\n\treturn !!event.target.value;\n};\n","\"use strict\";\n\nimport storage from \"../localStorage\";\n\nexport default (network, isCollapsed) => {\n\tconst networks = new Set(JSON.parse(storage.get(\"thelounge.networks.collapsed\")));\n\tnetwork.isCollapsed = isCollapsed;\n\n\tif (isCollapsed) {\n\t\tnetworks.add(network.uuid);\n\t} else {\n\t\tnetworks.delete(network.uuid);\n\t}\n\n\tstorage.set(\"thelounge.networks.collapsed\", JSON.stringify([...networks]));\n};\n","\"use strict\";\n\nexport default (count) => {\n\tif (count < 1000) {\n\t\treturn count.toString();\n\t}\n\n\treturn (count / 1000).toFixed(2).slice(0, -1) + \"k\";\n};\n","\"use strict\";\n\nimport store from \"../store\";\n\nexport default (network, channel) => {\n\tif (!network.isCollapsed || channel.highlight || channel.type === \"lobby\") {\n\t\treturn false;\n\t}\n\n\tif (store.state.activeChannel && channel === store.state.activeChannel.channel) {\n\t\treturn false;\n\t}\n\n\treturn true;\n};\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChannelWrapper.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ChannelWrapper.vue?vue&type=script&lang=js&\"","<template>\n\t<!-- TODO: move closed style to it's own class -->\n\t<div\n\t\tv-if=\"isChannelVisible\"\n\t\tref=\"element\"\n\t\t:class=\"[\n\t\t\t'channel-list-item',\n\t\t\t{active: active},\n\t\t\t{'parted-channel': channel.type === 'channel' && channel.state === 0},\n\t\t\t{'has-draft': channel.pendingMessage},\n\t\t\t{\n\t\t\t\t'not-secure':\n\t\t\t\t\tchannel.type === 'lobby' && network.status.connected && !network.status.secure,\n\t\t\t},\n\t\t\t{'not-connected': channel.type === 'lobby' && !network.status.connected},\n\t\t]\"\n\t\t:aria-label=\"getAriaLabel()\"\n\t\t:title=\"getAriaLabel()\"\n\t\t:data-name=\"channel.name\"\n\t\t:data-type=\"channel.type\"\n\t\t:aria-controls=\"'#chan-' + channel.id\"\n\t\t:aria-selected=\"active\"\n\t\t:style=\"channel.closed ? {transition: 'none', opacity: 0.4} : null\"\n\t\trole=\"tab\"\n\t\t@click=\"click\"\n\t\t@contextmenu.prevent=\"openContextMenu\"\n\t>\n\t\t<slot :network=\"network\" :channel=\"channel\" :activeChannel=\"activeChannel\" />\n\t</div>\n</template>\n\n<script>\nimport eventbus from \"../js/eventbus\";\nimport isChannelCollapsed from \"../js/helpers/isChannelCollapsed\";\n\nexport default {\n\tname: \"ChannelWrapper\",\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t\tactive: Boolean,\n\t\tisFiltering: Boolean,\n\t},\n\tcomputed: {\n\t\tactiveChannel() {\n\t\t\treturn this.$store.state.activeChannel;\n\t\t},\n\t\tisChannelVisible() {\n\t\t\treturn this.isFiltering || !isChannelCollapsed(this.network, this.channel);\n\t\t},\n\t},\n\tmethods: {\n\t\tgetAriaLabel() {\n\t\t\tconst extra = [];\n\n\t\t\tif (this.channel.unread > 0) {\n\t\t\t\textra.push(`${this.channel.unread} unread`);\n\t\t\t}\n\n\t\t\tif (this.channel.highlight > 0) {\n\t\t\t\textra.push(`${this.channel.highlight} mention`);\n\t\t\t}\n\n\t\t\tif (extra.length > 0) {\n\t\t\t\treturn `${this.channel.name} (${extra.join(\", \")})`;\n\t\t\t}\n\n\t\t\treturn this.channel.name;\n\t\t},\n\t\tclick() {\n\t\t\tif (this.isFiltering) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$root.switchToChannel(this.channel);\n\t\t},\n\t\topenContextMenu(event) {\n\t\t\teventbus.emit(\"contextmenu:channel\", {\n\t\t\t\tevent: event,\n\t\t\t\tchannel: this.channel,\n\t\t\t\tnetwork: this.network,\n\t\t\t});\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./ChannelWrapper.vue?vue&type=template&id=67c88f8c&\"\nimport script from \"./ChannelWrapper.vue?vue&type=script&lang=js&\"\nexport * from \"./ChannelWrapper.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.isChannelVisible)?_c('div',{ref:\"element\",class:[\n\t\t'channel-list-item',\n\t\t{active: _vm.active},\n\t\t{'parted-channel': _vm.channel.type === 'channel' && _vm.channel.state === 0},\n\t\t{'has-draft': _vm.channel.pendingMessage},\n\t\t{\n\t\t\t'not-secure':\n\t\t\t\t_vm.channel.type === 'lobby' && _vm.network.status.connected && !_vm.network.status.secure,\n\t\t},\n\t\t{'not-connected': _vm.channel.type === 'lobby' && !_vm.network.status.connected} ],style:(_vm.channel.closed ? {transition: 'none', opacity: 0.4} : null),attrs:{\"aria-label\":_vm.getAriaLabel(),\"title\":_vm.getAriaLabel(),\"data-name\":_vm.channel.name,\"data-type\":_vm.channel.type,\"aria-controls\":'#chan-' + _vm.channel.id,\"aria-selected\":_vm.active,\"role\":\"tab\"},on:{\"click\":_vm.click,\"contextmenu\":function($event){$event.preventDefault();return _vm.openContextMenu($event)}}},[_vm._t(\"default\",null,{\"network\":_vm.network,\"channel\":_vm.channel,\"activeChannel\":_vm.activeChannel})],2):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NetworkLobby.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NetworkLobby.vue?vue&type=script&lang=js&\"","<template>\n\t<ChannelWrapper v-bind=\"$props\" :channel=\"channel\">\n\t\t<button\n\t\t\tv-if=\"network.channels.length > 1\"\n\t\t\t:aria-controls=\"'network-' + network.uuid\"\n\t\t\t:aria-label=\"getExpandLabel(network)\"\n\t\t\t:aria-expanded=\"!network.isCollapsed\"\n\t\t\tclass=\"collapse-network\"\n\t\t\t@click.stop=\"onCollapseClick\"\n\t\t>\n\t\t\t<span class=\"collapse-network-icon\" />\n\t\t</button>\n\t\t<span v-else class=\"collapse-network\" />\n\t\t<div class=\"lobby-wrap\">\n\t\t\t<span :title=\"channel.name\" class=\"name\">{{ channel.name }}</span>\n\t\t\t<span\n\t\t\t\tv-if=\"network.status.connected && !network.status.secure\"\n\t\t\t\tclass=\"not-secure-tooltip tooltipped tooltipped-w\"\n\t\t\t\taria-label=\"Insecure connection\"\n\t\t\t>\n\t\t\t\t<span class=\"not-secure-icon\" />\n\t\t\t</span>\n\t\t\t<span\n\t\t\t\tv-if=\"!network.status.connected\"\n\t\t\t\tclass=\"not-connected-tooltip tooltipped tooltipped-w\"\n\t\t\t\taria-label=\"Disconnected\"\n\t\t\t>\n\t\t\t\t<span class=\"not-connected-icon\" />\n\t\t\t</span>\n\t\t\t<span v-if=\"channel.unread\" :class=\"{highlight: channel.highlight}\" class=\"badge\">{{\n\t\t\t\tunreadCount\n\t\t\t}}</span>\n\t\t</div>\n\t\t<span\n\t\t\t:aria-label=\"joinChannelLabel\"\n\t\t\tclass=\"add-channel-tooltip tooltipped tooltipped-w tooltipped-no-touch\"\n\t\t>\n\t\t\t<button\n\t\t\t\t:class=\"['add-channel', {opened: isJoinChannelShown}]\"\n\t\t\t\t:aria-controls=\"'join-channel-' + channel.id\"\n\t\t\t\t:aria-label=\"joinChannelLabel\"\n\t\t\t\t@click.stop=\"$emit('toggle-join-channel')\"\n\t\t\t/>\n\t\t</span>\n\t</ChannelWrapper>\n</template>\n\n<script>\nimport collapseNetwork from \"../js/helpers/collapseNetwork\";\nimport roundBadgeNumber from \"../js/helpers/roundBadgeNumber\";\nimport ChannelWrapper from \"./ChannelWrapper.vue\";\n\nexport default {\n\tname: \"Channel\",\n\tcomponents: {\n\t\tChannelWrapper,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tisJoinChannelShown: Boolean,\n\t\tactive: Boolean,\n\t\tisFiltering: Boolean,\n\t},\n\tcomputed: {\n\t\tchannel() {\n\t\t\treturn this.network.channels[0];\n\t\t},\n\t\tjoinChannelLabel() {\n\t\t\treturn this.isJoinChannelShown ? \"Cancel\" : \"Join a channel…\";\n\t\t},\n\t\tunreadCount() {\n\t\t\treturn roundBadgeNumber(this.channel.unread);\n\t\t},\n\t},\n\tmethods: {\n\t\tonCollapseClick() {\n\t\t\tcollapseNetwork(this.network, !this.network.isCollapsed);\n\t\t},\n\t\tgetExpandLabel(network) {\n\t\t\treturn network.isCollapsed ? \"Expand\" : \"Collapse\";\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./NetworkLobby.vue?vue&type=template&id=1e800a94&\"\nimport script from \"./NetworkLobby.vue?vue&type=script&lang=js&\"\nexport * from \"./NetworkLobby.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ChannelWrapper',_vm._b({attrs:{\"channel\":_vm.channel}},'ChannelWrapper',_vm.$props,false),[(_vm.network.channels.length > 1)?_c('button',{staticClass:\"collapse-network\",attrs:{\"aria-controls\":'network-' + _vm.network.uuid,\"aria-label\":_vm.getExpandLabel(_vm.network),\"aria-expanded\":!_vm.network.isCollapsed},on:{\"click\":function($event){$event.stopPropagation();return _vm.onCollapseClick($event)}}},[_c('span',{staticClass:\"collapse-network-icon\"})]):_c('span',{staticClass:\"collapse-network\"}),_c('div',{staticClass:\"lobby-wrap\"},[_c('span',{staticClass:\"name\",attrs:{\"title\":_vm.channel.name}},[_vm._v(_vm._s(_vm.channel.name))]),(_vm.network.status.connected && !_vm.network.status.secure)?_c('span',{staticClass:\"not-secure-tooltip tooltipped tooltipped-w\",attrs:{\"aria-label\":\"Insecure connection\"}},[_c('span',{staticClass:\"not-secure-icon\"})]):_vm._e(),(!_vm.network.status.connected)?_c('span',{staticClass:\"not-connected-tooltip tooltipped tooltipped-w\",attrs:{\"aria-label\":\"Disconnected\"}},[_c('span',{staticClass:\"not-connected-icon\"})]):_vm._e(),(_vm.channel.unread)?_c('span',{staticClass:\"badge\",class:{highlight: _vm.channel.highlight}},[_vm._v(_vm._s(_vm.unreadCount))]):_vm._e()]),_c('span',{staticClass:\"add-channel-tooltip tooltipped tooltipped-w tooltipped-no-touch\",attrs:{\"aria-label\":_vm.joinChannelLabel}},[_c('button',{class:['add-channel', {opened: _vm.isJoinChannelShown}],attrs:{\"aria-controls\":'join-channel-' + _vm.channel.id,\"aria-label\":_vm.joinChannelLabel},on:{\"click\":function($event){$event.stopPropagation();return _vm.$emit('toggle-join-channel')}}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Channel.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Channel.vue?vue&type=script&lang=js&\"","<template>\n\t<ChannelWrapper ref=\"wrapper\" v-bind=\"$props\">\n\t\t<span class=\"name\">{{ channel.name }}</span>\n\t\t<span v-if=\"channel.unread\" :class=\"{highlight: channel.highlight}\" class=\"badge\">{{\n\t\t\tunreadCount\n\t\t}}</span>\n\t\t<template v-if=\"channel.type === 'channel'\">\n\t\t\t<span\n\t\t\t\tv-if=\"channel.state === 0\"\n\t\t\t\tclass=\"parted-channel-tooltip tooltipped tooltipped-w\"\n\t\t\t\taria-label=\"Not currently joined\"\n\t\t\t>\n\t\t\t\t<span class=\"parted-channel-icon\" />\n\t\t\t</span>\n\t\t\t<span class=\"close-tooltip tooltipped tooltipped-w\" aria-label=\"Leave\">\n\t\t\t\t<button class=\"close\" aria-label=\"Leave\" @click.stop=\"close\" />\n\t\t\t</span>\n\t\t</template>\n\t\t<template v-else>\n\t\t\t<span class=\"close-tooltip tooltipped tooltipped-w\" aria-label=\"Close\">\n\t\t\t\t<button class=\"close\" aria-label=\"Close\" @click.stop=\"close\" />\n\t\t\t</span>\n\t\t</template>\n\t</ChannelWrapper>\n</template>\n\n<script>\nimport roundBadgeNumber from \"../js/helpers/roundBadgeNumber\";\nimport ChannelWrapper from \"./ChannelWrapper.vue\";\n\nexport default {\n\tname: \"Channel\",\n\tcomponents: {\n\t\tChannelWrapper,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t\tactive: Boolean,\n\t\tisFiltering: Boolean,\n\t},\n\tcomputed: {\n\t\tunreadCount() {\n\t\t\treturn roundBadgeNumber(this.channel.unread);\n\t\t},\n\t},\n\tmethods: {\n\t\tclose() {\n\t\t\tthis.$root.closeChannel(this.channel);\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./Channel.vue?vue&type=template&id=417dc2b0&\"\nimport script from \"./Channel.vue?vue&type=script&lang=js&\"\nexport * from \"./Channel.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ChannelWrapper',_vm._b({ref:\"wrapper\"},'ChannelWrapper',_vm.$props,false),[_c('span',{staticClass:\"name\"},[_vm._v(_vm._s(_vm.channel.name))]),(_vm.channel.unread)?_c('span',{staticClass:\"badge\",class:{highlight: _vm.channel.highlight}},[_vm._v(_vm._s(_vm.unreadCount))]):_vm._e(),(_vm.channel.type === 'channel')?[(_vm.channel.state === 0)?_c('span',{staticClass:\"parted-channel-tooltip tooltipped tooltipped-w\",attrs:{\"aria-label\":\"Not currently joined\"}},[_c('span',{staticClass:\"parted-channel-icon\"})]):_vm._e(),_c('span',{staticClass:\"close-tooltip tooltipped tooltipped-w\",attrs:{\"aria-label\":\"Leave\"}},[_c('button',{staticClass:\"close\",attrs:{\"aria-label\":\"Leave\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.close($event)}}})])]:[_c('span',{staticClass:\"close-tooltip tooltipped tooltipped-w\",attrs:{\"aria-label\":\"Close\"}},[_c('button',{staticClass:\"close\",attrs:{\"aria-label\":\"Close\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.close($event)}}})])]],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JoinChannel.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./JoinChannel.vue?vue&type=script&lang=js&\"","<template>\n\t<form\n\t\t:id=\"'join-channel-' + channel.id\"\n\t\tclass=\"join-form\"\n\t\tmethod=\"post\"\n\t\taction=\"\"\n\t\tautocomplete=\"off\"\n\t\t@keydown.esc.prevent=\"$emit('toggle-join-channel')\"\n\t\t@submit.prevent=\"onSubmit\"\n\t>\n\t\t<input\n\t\t\tv-model=\"inputChannel\"\n\t\t\tv-focus\n\t\t\ttype=\"text\"\n\t\t\tclass=\"input\"\n\t\t\tname=\"channel\"\n\t\t\tplaceholder=\"Channel\"\n\t\t\tpattern=\"[^\\s]+\"\n\t\t\tmaxlength=\"200\"\n\t\t\ttitle=\"The channel name may not contain spaces\"\n\t\t\trequired\n\t\t/>\n\t\t<input\n\t\t\tv-model=\"inputPassword\"\n\t\t\ttype=\"password\"\n\t\t\tclass=\"input\"\n\t\t\tname=\"key\"\n\t\t\tplaceholder=\"Password (optional)\"\n\t\t\tpattern=\"[^\\s]+\"\n\t\t\tmaxlength=\"200\"\n\t\t\ttitle=\"The channel password may not contain spaces\"\n\t\t\tautocomplete=\"new-password\"\n\t\t/>\n\t\t<button type=\"submit\" class=\"btn btn-small\">Join</button>\n\t</form>\n</template>\n\n<script>\nimport socket from \"../js/socket\";\n\nexport default {\n\tname: \"JoinChannel\",\n\tdirectives: {\n\t\tfocus: {\n\t\t\tinserted(el) {\n\t\t\t\tel.focus();\n\t\t\t},\n\t\t},\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tinputChannel: \"\",\n\t\t\tinputPassword: \"\",\n\t\t};\n\t},\n\tmethods: {\n\t\tonSubmit() {\n\t\t\tconst existingChannel = this.$store.getters.findChannelOnCurrentNetwork(\n\t\t\t\tthis.inputChannel\n\t\t\t);\n\n\t\t\tif (existingChannel) {\n\t\t\t\tthis.$root.switchToChannel(existingChannel);\n\t\t\t} else {\n\t\t\t\tconst chanTypes = this.network.serverOptions.CHANTYPES;\n\t\t\t\tlet channel = this.inputChannel;\n\n\t\t\t\tif (chanTypes && chanTypes.length > 0 && !chanTypes.includes(channel[0])) {\n\t\t\t\t\tchannel = chanTypes[0] + channel;\n\t\t\t\t}\n\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttext: `/join ${channel} ${this.inputPassword}`,\n\t\t\t\t\ttarget: this.channel.id,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis.inputChannel = \"\";\n\t\t\tthis.inputPassword = \"\";\n\t\t\tthis.$emit(\"toggle-join-channel\");\n\t\t},\n\t},\n};\n</script>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NetworkList.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./NetworkList.vue?vue&type=script&lang=js&\"","<template>\n\t<div v-if=\"$store.state.networks.length === 0\" class=\"empty\">\n\t\tYou are not connected to any networks yet.\n\t</div>\n\t<div v-else ref=\"networklist\">\n\t\t<div class=\"jump-to-input\">\n\t\t\t<input\n\t\t\t\tref=\"searchInput\"\n\t\t\t\t:value=\"searchText\"\n\t\t\t\tplaceholder=\"Jump to...\"\n\t\t\t\ttype=\"search\"\n\t\t\t\tclass=\"search input mousetrap\"\n\t\t\t\taria-label=\"Search among the channel list\"\n\t\t\t\ttabindex=\"-1\"\n\t\t\t\t@input=\"setSearchText\"\n\t\t\t\t@keydown.up=\"navigateResults($event, -1)\"\n\t\t\t\t@keydown.down=\"navigateResults($event, 1)\"\n\t\t\t\t@keydown.page-up=\"navigateResults($event, -10)\"\n\t\t\t\t@keydown.page-down=\"navigateResults($event, 10)\"\n\t\t\t\t@keydown.enter=\"selectResult\"\n\t\t\t\t@keydown.escape=\"deactivateSearch\"\n\t\t\t\t@focus=\"activateSearch\"\n\t\t\t/>\n\t\t</div>\n\t\t<div v-if=\"searchText\" class=\"jump-to-results\">\n\t\t\t<div v-if=\"results.length\">\n\t\t\t\t<div\n\t\t\t\t\tv-for=\"item in results\"\n\t\t\t\t\t:key=\"item.channel.id\"\n\t\t\t\t\t@mouseenter=\"setActiveSearchItem(item.channel)\"\n\t\t\t\t\t@click.prevent=\"selectResult\"\n\t\t\t\t>\n\t\t\t\t\t<Channel\n\t\t\t\t\t\tv-if=\"item.channel.type !== 'lobby'\"\n\t\t\t\t\t\t:channel=\"item.channel\"\n\t\t\t\t\t\t:network=\"item.network\"\n\t\t\t\t\t\t:active=\"item.channel === activeSearchItem\"\n\t\t\t\t\t\t:is-filtering=\"true\"\n\t\t\t\t\t/>\n\t\t\t\t\t<NetworkLobby\n\t\t\t\t\t\tv-else\n\t\t\t\t\t\t:channel=\"item.channel\"\n\t\t\t\t\t\t:network=\"item.network\"\n\t\t\t\t\t\t:active=\"item.channel === activeSearchItem\"\n\t\t\t\t\t\t:is-filtering=\"true\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div v-else class=\"no-results\">No results found.</div>\n\t\t</div>\n\t\t<Draggable\n\t\t\tv-else\n\t\t\t:list=\"$store.state.networks\"\n\t\t\t:filter=\"isCurrentlyInTouch\"\n\t\t\t:prevent-on-filter=\"false\"\n\t\t\thandle=\".channel-list-item[data-type='lobby']\"\n\t\t\tdraggable=\".network\"\n\t\t\tghost-class=\"ui-sortable-ghost\"\n\t\t\tdrag-class=\"ui-sortable-dragged\"\n\t\t\tgroup=\"networks\"\n\t\t\tclass=\"networks\"\n\t\t\t@change=\"onNetworkSort\"\n\t\t\t@start=\"onDragStart\"\n\t\t\t@end=\"onDragEnd\"\n\t\t>\n\t\t\t<div\n\t\t\t\tv-for=\"network in $store.state.networks\"\n\t\t\t\t:id=\"'network-' + network.uuid\"\n\t\t\t\t:key=\"network.uuid\"\n\t\t\t\t:class=\"{\n\t\t\t\t\tcollapsed: network.isCollapsed,\n\t\t\t\t\t'not-connected': !network.status.connected,\n\t\t\t\t\t'not-secure': !network.status.secure,\n\t\t\t\t}\"\n\t\t\t\tclass=\"network\"\n\t\t\t\trole=\"region\"\n\t\t\t>\n\t\t\t\t<NetworkLobby\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:is-join-channel-shown=\"network.isJoinChannelShown\"\n\t\t\t\t\t:active=\"\n\t\t\t\t\t\t$store.state.activeChannel &&\n\t\t\t\t\t\tnetwork.channels[0] === $store.state.activeChannel.channel\n\t\t\t\t\t\"\n\t\t\t\t\t@toggle-join-channel=\"network.isJoinChannelShown = !network.isJoinChannelShown\"\n\t\t\t\t/>\n\t\t\t\t<JoinChannel\n\t\t\t\t\tv-if=\"network.isJoinChannelShown\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:channel=\"network.channels[0]\"\n\t\t\t\t\t@toggle-join-channel=\"network.isJoinChannelShown = !network.isJoinChannelShown\"\n\t\t\t\t/>\n\n\t\t\t\t<Draggable\n\t\t\t\t\tdraggable=\".channel-list-item\"\n\t\t\t\t\tghost-class=\"ui-sortable-ghost\"\n\t\t\t\t\tdrag-class=\"ui-sortable-dragged\"\n\t\t\t\t\t:group=\"network.uuid\"\n\t\t\t\t\t:filter=\"isCurrentlyInTouch\"\n\t\t\t\t\t:prevent-on-filter=\"false\"\n\t\t\t\t\t:list=\"network.channels\"\n\t\t\t\t\tclass=\"channels\"\n\t\t\t\t\t@change=\"onChannelSort\"\n\t\t\t\t\t@start=\"onDragStart\"\n\t\t\t\t\t@end=\"onDragEnd\"\n\t\t\t\t>\n\t\t\t\t\t<template v-for=\"(channel, index) in network.channels\">\n\t\t\t\t\t\t<Channel\n\t\t\t\t\t\t\tv-if=\"index > 0\"\n\t\t\t\t\t\t\t:key=\"channel.id\"\n\t\t\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t\t\t:active=\"\n\t\t\t\t\t\t\t\t$store.state.activeChannel &&\n\t\t\t\t\t\t\t\tchannel === $store.state.activeChannel.channel\n\t\t\t\t\t\t\t\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</template>\n\t\t\t\t</Draggable>\n\t\t\t</div>\n\t\t</Draggable>\n\t</div>\n</template>\n\n<style>\n.jump-to-input {\n\tmargin: 8px;\n\tposition: relative;\n}\n\n.jump-to-input .input {\n\tmargin: 0;\n\twidth: 100%;\n\tborder: 0;\n\tcolor: #fff;\n\tbackground-color: rgba(255, 255, 255, 0.1);\n\tpadding-right: 35px;\n}\n\n.jump-to-input .input::placeholder {\n\tcolor: rgba(255, 255, 255, 0.35);\n}\n\n.jump-to-input::before {\n\tcontent: \"\\f002\"; /* http://fontawesome.io/icon/search/ */\n\tcolor: rgba(255, 255, 255, 0.35);\n\tposition: absolute;\n\tright: 8px;\n\ttop: 0;\n\tbottom: 0;\n\tpointer-events: none;\n\tline-height: 35px !important;\n}\n\n.jump-to-results {\n\tmargin: 0;\n\tpadding: 0;\n\tlist-style: none;\n\toverflow: auto;\n}\n\n.jump-to-results .no-results {\n\tmargin: 14px 8px;\n\ttext-align: center;\n}\n\n.jump-to-results .channel-list-item.active {\n\tcursor: pointer;\n}\n\n.jump-to-results .channel-list-item .add-channel,\n.jump-to-results .channel-list-item .close-tooltip {\n\tdisplay: none;\n}\n\n.jump-to-results .channel-list-item[data-type=\"lobby\"] {\n\tpadding: 8px 14px;\n}\n\n.jump-to-results .channel-list-item[data-type=\"lobby\"]::before {\n\tcontent: \"\\f233\";\n}\n</style>\n\n<script>\nimport Mousetrap from \"mousetrap\";\nimport Draggable from \"vuedraggable\";\nimport {filter as fuzzyFilter} from \"fuzzy\";\nimport NetworkLobby from \"./NetworkLobby.vue\";\nimport Channel from \"./Channel.vue\";\nimport JoinChannel from \"./JoinChannel.vue\";\n\nimport socket from \"../js/socket\";\nimport collapseNetwork from \"../js/helpers/collapseNetwork\";\nimport isIgnoredKeybind from \"../js/helpers/isIgnoredKeybind\";\n\nexport default {\n\tname: \"NetworkList\",\n\tcomponents: {\n\t\tJoinChannel,\n\t\tNetworkLobby,\n\t\tChannel,\n\t\tDraggable,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tsearchText: \"\",\n\t\t\tactiveSearchItem: null,\n\t\t};\n\t},\n\tcomputed: {\n\t\titems() {\n\t\t\tconst items = [];\n\n\t\t\tfor (const network of this.$store.state.networks) {\n\t\t\t\tfor (const channel of network.channels) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tthis.$store.state.activeChannel &&\n\t\t\t\t\t\tchannel === this.$store.state.activeChannel.channel\n\t\t\t\t\t) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\titems.push({network, channel});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn items;\n\t\t},\n\t\tresults() {\n\t\t\tconst results = fuzzyFilter(this.searchText, this.items, {\n\t\t\t\textract: (item) => item.channel.name,\n\t\t\t}).map((item) => item.original);\n\n\t\t\treturn results;\n\t\t},\n\t},\n\twatch: {\n\t\tsearchText() {\n\t\t\tthis.setActiveSearchItem();\n\t\t},\n\t},\n\tmounted() {\n\t\tMousetrap.bind(\"alt+shift+right\", this.expandNetwork);\n\t\tMousetrap.bind(\"alt+shift+left\", this.collapseNetwork);\n\t\tMousetrap.bind(\"alt+j\", this.toggleSearch);\n\t},\n\tbeforeDestroy() {\n\t\tMousetrap.unbind(\"alt+shift+right\", this.expandNetwork);\n\t\tMousetrap.unbind(\"alt+shift+left\", this.collapseNetwork);\n\t\tMousetrap.unbind(\"alt+j\", this.toggleSearch);\n\t},\n\tmethods: {\n\t\texpandNetwork(event) {\n\t\t\tif (isIgnoredKeybind(event)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (this.$store.state.activeChannel) {\n\t\t\t\tcollapseNetwork(this.$store.state.activeChannel.network, false);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tcollapseNetwork(event) {\n\t\t\tif (isIgnoredKeybind(event)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (this.$store.state.activeChannel) {\n\t\t\t\tcollapseNetwork(this.$store.state.activeChannel.network, true);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t},\n\t\tisCurrentlyInTouch(e) {\n\t\t\t// TODO: Implement a way to sort on touch devices\n\t\t\treturn e.pointerType !== \"mouse\";\n\t\t},\n\t\tonDragStart(e) {\n\t\t\te.target.classList.add(\"ui-sortable-active\");\n\t\t},\n\t\tonDragEnd(e) {\n\t\t\te.target.classList.remove(\"ui-sortable-active\");\n\t\t},\n\t\tonNetworkSort(e) {\n\t\t\tif (!e.moved) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsocket.emit(\"sort\", {\n\t\t\t\ttype: \"networks\",\n\t\t\t\torder: this.$store.state.networks.map((n) => n.uuid),\n\t\t\t});\n\t\t},\n\t\tonChannelSort(e) {\n\t\t\tif (!e.moved) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst channel = this.$store.getters.findChannel(e.moved.element.id);\n\n\t\t\tif (!channel) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsocket.emit(\"sort\", {\n\t\t\t\ttype: \"channels\",\n\t\t\t\ttarget: channel.network.uuid,\n\t\t\t\torder: channel.network.channels.map((c) => c.id),\n\t\t\t});\n\t\t},\n\t\ttoggleSearch(event) {\n\t\t\tif (isIgnoredKeybind(event)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (this.$refs.searchInput === document.activeElement) {\n\t\t\t\tthis.deactivateSearch();\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.activateSearch();\n\t\t\treturn false;\n\t\t},\n\t\tactivateSearch() {\n\t\t\tif (this.$refs.searchInput === document.activeElement) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.sidebarWasClosed = this.$store.state.sidebarOpen ? false : true;\n\t\t\tthis.$store.commit(\"sidebarOpen\", true);\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tthis.$refs.searchInput.focus();\n\t\t\t});\n\t\t},\n\t\tdeactivateSearch() {\n\t\t\tthis.activeSearchItem = null;\n\t\t\tthis.searchText = \"\";\n\t\t\tthis.$refs.searchInput.blur();\n\n\t\t\tif (this.sidebarWasClosed) {\n\t\t\t\tthis.$store.commit(\"sidebarOpen\", false);\n\t\t\t}\n\t\t},\n\t\tsetSearchText(e) {\n\t\t\tthis.searchText = e.target.value;\n\t\t},\n\t\tsetActiveSearchItem(channel) {\n\t\t\tif (!this.results.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!channel) {\n\t\t\t\tchannel = this.results[0].channel;\n\t\t\t}\n\n\t\t\tthis.activeSearchItem = channel;\n\t\t},\n\t\tselectResult() {\n\t\t\tif (!this.searchText || !this.results.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.$root.switchToChannel(this.activeSearchItem);\n\t\t\tthis.deactivateSearch();\n\t\t\tthis.scrollToActive();\n\t\t},\n\t\tnavigateResults(event, direction) {\n\t\t\t// Prevent propagation to stop global keybind handler from capturing pagedown/pageup\n\t\t\t// and redirecting it to the message list container for scrolling\n\t\t\tevent.stopImmediatePropagation();\n\t\t\tevent.preventDefault();\n\n\t\t\tif (!this.searchText) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst channels = this.results.map((r) => r.channel);\n\n\t\t\t// Bail out if there's no channels to select\n\t\t\tif (!channels.length) {\n\t\t\t\tthis.activeSearchItem = null;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet currentIndex = channels.indexOf(this.activeSearchItem);\n\n\t\t\t// If there's no active channel select the first or last one depending on direction\n\t\t\tif (!this.activeSearchItem || currentIndex === -1) {\n\t\t\t\tthis.activeSearchItem = direction ? channels[0] : channels[channels.length - 1];\n\t\t\t\tthis.scrollToActive();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcurrentIndex += direction;\n\n\t\t\t// Wrap around the list if necessary. Normaly each loop iterates once at most,\n\t\t\t// but might iterate more often if pgup or pgdown are used in a very short list\n\t\t\twhile (currentIndex < 0) {\n\t\t\t\tcurrentIndex += channels.length;\n\t\t\t}\n\n\t\t\twhile (currentIndex > channels.length - 1) {\n\t\t\t\tcurrentIndex -= channels.length;\n\t\t\t}\n\n\t\t\tthis.activeSearchItem = channels[currentIndex];\n\t\t\tthis.scrollToActive();\n\t\t},\n\t\tscrollToActive() {\n\t\t\t// Scroll the list if needed after the active class is applied\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tconst el = this.$refs.networklist.querySelector(\".channel-list-item.active\");\n\n\t\t\t\tif (el) {\n\t\t\t\t\tel.scrollIntoView({block: \"nearest\", inline: \"nearest\"});\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./JoinChannel.vue?vue&type=template&id=5016d392&\"\nimport script from \"./JoinChannel.vue?vue&type=script&lang=js&\"\nexport * from \"./JoinChannel.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('form',{staticClass:\"join-form\",attrs:{\"id\":'join-channel-' + _vm.channel.id,\"method\":\"post\",\"action\":\"\",\"autocomplete\":\"off\"},on:{\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }$event.preventDefault();return _vm.$emit('toggle-join-channel')},\"submit\":function($event){$event.preventDefault();return _vm.onSubmit($event)}}},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.inputChannel),expression:\"inputChannel\"},{name:\"focus\",rawName:\"v-focus\"}],staticClass:\"input\",attrs:{\"type\":\"text\",\"name\":\"channel\",\"placeholder\":\"Channel\",\"pattern\":\"[^\\\\s]+\",\"maxlength\":\"200\",\"title\":\"The channel name may not contain spaces\",\"required\":\"\"},domProps:{\"value\":(_vm.inputChannel)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.inputChannel=$event.target.value}}}),_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.inputPassword),expression:\"inputPassword\"}],staticClass:\"input\",attrs:{\"type\":\"password\",\"name\":\"key\",\"placeholder\":\"Password (optional)\",\"pattern\":\"[^\\\\s]+\",\"maxlength\":\"200\",\"title\":\"The channel password may not contain spaces\",\"autocomplete\":\"new-password\"},domProps:{\"value\":(_vm.inputPassword)},on:{\"input\":function($event){if($event.target.composing){ return; }_vm.inputPassword=$event.target.value}}}),_c('button',{staticClass:\"btn btn-small\",attrs:{\"type\":\"submit\"}},[_vm._v(\"Join\")])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Sidebar.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Sidebar.vue?vue&type=script&lang=js&\"","<template>\n\t<aside id=\"sidebar\" ref=\"sidebar\">\n\t\t<div class=\"scrollable-area\">\n\t\t\t<div class=\"logo-container\">\n\t\t\t\t<img\n\t\t\t\t\t:src=\"`img/logo-${isPublic() ? 'horizontal-' : ''}transparent-bg.svg`\"\n\t\t\t\t\tclass=\"logo\"\n\t\t\t\t\talt=\"TripSit Web\"\n\t\t\t\t/>\n\t\t\t\t<img\n\t\t\t\t\t:src=\"`img/logo-${isPublic() ? 'horizontal-' : ''}transparent-bg-inverted.svg`\"\n\t\t\t\t\tclass=\"logo-inverted\"\n\t\t\t\t\talt=\"TripSit Web\"\n\t\t\t\t/>\n\t\t\t\t<span\n\t\t\t\t\tv-if=\"isDevelopment\"\n\t\t\t\t\ttitle=\"The Lounge has been built in development mode\"\n\t\t\t\t\t:style=\"{\n\t\t\t\t\t\tbackgroundColor: '#ff9e18',\n\t\t\t\t\t\tcolor: '#000',\n\t\t\t\t\t\tpadding: '2px',\n\t\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\t\tfontSize: '12px',\n\t\t\t\t\t}\"\n\t\t\t\t\t>DEVELOPER</span\n\t\t\t\t>\n\t\t\t</div>\n\t\t\t<NetworkList />\n\t\t</div>\n\t\t<footer id=\"footer\">\n\t\t\t<!--span\n\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-touch\"\n\t\t\t\taria-label=\"Connect to network\"\n\t\t\t\t><router-link\n\t\t\t\t\tto=\"/connect\"\n\t\t\t\t\ttag=\"button\"\n\t\t\t\t\tactive-class=\"active\"\n\t\t\t\t\t:class=\"['icon', 'connect']\"\n\t\t\t\t\taria-label=\"Connect to TripSit\"\n\t\t\t\t\trole=\"tab\"\n\t\t\t\t\taria-controls=\"connect\"\n\t\t\t\t\t:aria-selected=\"$route.name === 'Connect'\"\n\t\t\t/></span-->\n\t\t\t<span class=\"tooltipped tooltipped-n tooltipped-no-touch\" aria-label=\"Settings\"\n\t\t\t\t><router-link\n\t\t\t\t\tto=\"/settings\"\n\t\t\t\t\ttag=\"button\"\n\t\t\t\t\tactive-class=\"active\"\n\t\t\t\t\t:class=\"['icon', 'settings']\"\n\t\t\t\t\taria-label=\"Settings\"\n\t\t\t\t\trole=\"tab\"\n\t\t\t\t\taria-controls=\"settings\"\n\t\t\t\t\t:aria-selected=\"$route.name === 'Settings'\"\n\t\t\t/></span>\n\t\t\t<span\n\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-touch\"\n\t\t\t\t:aria-label=\"\n\t\t\t\t\t$store.state.serverConfiguration.isUpdateAvailable\n\t\t\t\t\t\t? 'Help\\n(update available)'\n\t\t\t\t\t\t: 'Help'\n\t\t\t\t\"\n\t\t\t\t><router-link\n\t\t\t\t\tto=\"/help\"\n\t\t\t\t\ttag=\"button\"\n\t\t\t\t\tactive-class=\"active\"\n\t\t\t\t\t:class=\"[\n\t\t\t\t\t\t'icon',\n\t\t\t\t\t\t'help',\n\t\t\t\t\t\t{notified: $store.state.serverConfiguration.isUpdateAvailable},\n\t\t\t\t\t]\"\n\t\t\t\t\taria-label=\"Help\"\n\t\t\t\t\trole=\"tab\"\n\t\t\t\t\taria-controls=\"help\"\n\t\t\t\t\t:aria-selected=\"$route.name === 'Help'\"\n\t\t\t/></span>\n\t\t</footer>\n\t</aside>\n</template>\n\n<script>\nimport NetworkList from \"./NetworkList.vue\";\n\nexport default {\n\tname: \"Sidebar\",\n\tcomponents: {\n\t\tNetworkList,\n\t},\n\tprops: {\n\t\toverlay: HTMLElement,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisDevelopment: process.env.NODE_ENV !== \"production\",\n\t\t};\n\t},\n\tmounted() {\n\t\tthis.touchStartPos = null;\n\t\tthis.touchCurPos = null;\n\t\tthis.touchStartTime = 0;\n\t\tthis.menuWidth = 0;\n\t\tthis.menuIsMoving = false;\n\t\tthis.menuIsAbsolute = false;\n\n\t\tthis.onTouchStart = (e) => {\n\t\t\tthis.touchStartPos = this.touchCurPos = e.touches.item(0);\n\n\t\t\tif (e.touches.length !== 1) {\n\t\t\t\tthis.onTouchEnd();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst styles = window.getComputedStyle(this.$refs.sidebar);\n\n\t\t\tthis.menuWidth = parseFloat(styles.width);\n\t\t\tthis.menuIsAbsolute = styles.position === \"absolute\";\n\n\t\t\tif (!this.$store.state.sidebarOpen || this.touchStartPos.screenX > this.menuWidth) {\n\t\t\t\tthis.touchStartTime = Date.now();\n\n\t\t\t\tdocument.body.addEventListener(\"touchmove\", this.onTouchMove, {passive: true});\n\t\t\t\tdocument.body.addEventListener(\"touchend\", this.onTouchEnd, {passive: true});\n\t\t\t}\n\t\t};\n\n\t\tthis.onTouchMove = (e) => {\n\t\t\tconst touch = (this.touchCurPos = e.touches.item(0));\n\t\t\tlet distX = touch.screenX - this.touchStartPos.screenX;\n\t\t\tconst distY = touch.screenY - this.touchStartPos.screenY;\n\n\t\t\tif (!this.menuIsMoving) {\n\t\t\t\t// tan(45°) is 1. Gestures in 0°-45° (< 1) are considered horizontal, so\n\t\t\t\t// menu must be open; gestures in 45°-90° (>1) are considered vertical, so\n\t\t\t\t// chat windows must be scrolled.\n\t\t\t\tif (Math.abs(distY / distX) >= 1) {\n\t\t\t\t\tthis.onTouchEnd();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst devicePixelRatio = window.devicePixelRatio || 2;\n\n\t\t\t\tif (Math.abs(distX) > devicePixelRatio) {\n\t\t\t\t\tthis.$store.commit(\"sidebarDragging\", true);\n\t\t\t\t\tthis.menuIsMoving = true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Do not animate the menu on desktop view\n\t\t\tif (!this.menuIsAbsolute) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this.$store.state.sidebarOpen) {\n\t\t\t\tdistX += this.menuWidth;\n\t\t\t}\n\n\t\t\tif (distX > this.menuWidth) {\n\t\t\t\tdistX = this.menuWidth;\n\t\t\t} else if (distX < 0) {\n\t\t\t\tdistX = 0;\n\t\t\t}\n\n\t\t\tthis.$refs.sidebar.style.transform = \"translate3d(\" + distX + \"px, 0, 0)\";\n\t\t\tthis.overlay.style.opacity = distX / this.menuWidth;\n\t\t};\n\n\t\tthis.onTouchEnd = () => {\n\t\t\tconst diff = this.touchCurPos.screenX - this.touchStartPos.screenX;\n\t\t\tconst absDiff = Math.abs(diff);\n\n\t\t\tif (\n\t\t\t\tabsDiff > this.menuWidth / 2 ||\n\t\t\t\t(Date.now() - this.touchStartTime < 180 && absDiff > 50)\n\t\t\t) {\n\t\t\t\tthis.toggle(diff > 0);\n\t\t\t}\n\n\t\t\tdocument.body.removeEventListener(\"touchmove\", this.onTouchMove);\n\t\t\tdocument.body.removeEventListener(\"touchend\", this.onTouchEnd);\n\t\t\tthis.$store.commit(\"sidebarDragging\", false);\n\n\t\t\tthis.$refs.sidebar.style.transform = null;\n\t\t\tthis.overlay.style.opacity = null;\n\n\t\t\tthis.touchStartPos = null;\n\t\t\tthis.touchCurPos = null;\n\t\t\tthis.touchStartTime = 0;\n\t\t\tthis.menuIsMoving = false;\n\t\t};\n\n\t\tthis.toggle = (state) => {\n\t\t\tthis.$store.commit(\"sidebarOpen\", state);\n\t\t};\n\n\t\tdocument.body.addEventListener(\"touchstart\", this.onTouchStart, {passive: true});\n\t},\n\tmethods: {\n\t\tisPublic: () => document.body.classList.contains(\"public\"),\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./NetworkList.vue?vue&type=template&id=b4eb1fba&\"\nimport script from \"./NetworkList.vue?vue&type=script&lang=js&\"\nexport * from \"./NetworkList.vue?vue&type=script&lang=js&\"\nimport style0 from \"./NetworkList.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.$store.state.networks.length === 0)?_c('div',{staticClass:\"empty\"},[_vm._v(\"\\n\\tYou are not connected to any networks yet.\\n\")]):_c('div',{ref:\"networklist\"},[_c('div',{staticClass:\"jump-to-input\"},[_c('input',{ref:\"searchInput\",staticClass:\"search input mousetrap\",attrs:{\"placeholder\":\"Jump to...\",\"type\":\"search\",\"aria-label\":\"Search among the channel list\",\"tabindex\":\"-1\"},domProps:{\"value\":_vm.searchText},on:{\"input\":_vm.setSearchText,\"keydown\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"up\",38,$event.key,[\"Up\",\"ArrowUp\"])){ return null; }return _vm.navigateResults($event, -1)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"down\",40,$event.key,[\"Down\",\"ArrowDown\"])){ return null; }return _vm.navigateResults($event, 1)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"page-up\",undefined,$event.key,undefined)){ return null; }return _vm.navigateResults($event, -10)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"page-down\",undefined,$event.key,undefined)){ return null; }return _vm.navigateResults($event, 10)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.selectResult($event)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"escape\",undefined,$event.key,undefined)){ return null; }return _vm.deactivateSearch($event)}],\"focus\":_vm.activateSearch}})]),(_vm.searchText)?_c('div',{staticClass:\"jump-to-results\"},[(_vm.results.length)?_c('div',_vm._l((_vm.results),function(item){return _c('div',{key:item.channel.id,on:{\"mouseenter\":function($event){return _vm.setActiveSearchItem(item.channel)},\"click\":function($event){$event.preventDefault();return _vm.selectResult($event)}}},[(item.channel.type !== 'lobby')?_c('Channel',{attrs:{\"channel\":item.channel,\"network\":item.network,\"active\":item.channel === _vm.activeSearchItem,\"is-filtering\":true}}):_c('NetworkLobby',{attrs:{\"channel\":item.channel,\"network\":item.network,\"active\":item.channel === _vm.activeSearchItem,\"is-filtering\":true}})],1)}),0):_c('div',{staticClass:\"no-results\"},[_vm._v(\"No results found.\")])]):_c('Draggable',{staticClass:\"networks\",attrs:{\"list\":_vm.$store.state.networks,\"filter\":_vm.isCurrentlyInTouch,\"prevent-on-filter\":false,\"handle\":\".channel-list-item[data-type='lobby']\",\"draggable\":\".network\",\"ghost-class\":\"ui-sortable-ghost\",\"drag-class\":\"ui-sortable-dragged\",\"group\":\"networks\"},on:{\"change\":_vm.onNetworkSort,\"start\":_vm.onDragStart,\"end\":_vm.onDragEnd}},_vm._l((_vm.$store.state.networks),function(network){return _c('div',{key:network.uuid,staticClass:\"network\",class:{\n\t\t\t\tcollapsed: network.isCollapsed,\n\t\t\t\t'not-connected': !network.status.connected,\n\t\t\t\t'not-secure': !network.status.secure,\n\t\t\t},attrs:{\"id\":'network-' + network.uuid,\"role\":\"region\"}},[_c('NetworkLobby',{attrs:{\"network\":network,\"is-join-channel-shown\":network.isJoinChannelShown,\"active\":_vm.$store.state.activeChannel &&\n\t\t\t\t\tnetwork.channels[0] === _vm.$store.state.activeChannel.channel},on:{\"toggle-join-channel\":function($event){network.isJoinChannelShown = !network.isJoinChannelShown}}}),(network.isJoinChannelShown)?_c('JoinChannel',{attrs:{\"network\":network,\"channel\":network.channels[0]},on:{\"toggle-join-channel\":function($event){network.isJoinChannelShown = !network.isJoinChannelShown}}}):_vm._e(),_c('Draggable',{staticClass:\"channels\",attrs:{\"draggable\":\".channel-list-item\",\"ghost-class\":\"ui-sortable-ghost\",\"drag-class\":\"ui-sortable-dragged\",\"group\":network.uuid,\"filter\":_vm.isCurrentlyInTouch,\"prevent-on-filter\":false,\"list\":network.channels},on:{\"change\":_vm.onChannelSort,\"start\":_vm.onDragStart,\"end\":_vm.onDragEnd}},[_vm._l((network.channels),function(channel,index){return [(index > 0)?_c('Channel',{key:channel.id,attrs:{\"channel\":channel,\"network\":network,\"active\":_vm.$store.state.activeChannel &&\n\t\t\t\t\t\t\tchannel === _vm.$store.state.activeChannel.channel}}):_vm._e()]})],2)],1)}),0)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./Sidebar.vue?vue&type=template&id=7554df5f&\"\nimport script from \"./Sidebar.vue?vue&type=script&lang=js&\"\nexport * from \"./Sidebar.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('aside',{ref:\"sidebar\",attrs:{\"id\":\"sidebar\"}},[_c('div',{staticClass:\"scrollable-area\"},[_c('div',{staticClass:\"logo-container\"},[_c('img',{staticClass:\"logo\",attrs:{\"src\":(\"img/logo-\" + (_vm.isPublic() ? 'horizontal-' : '') + \"transparent-bg.svg\"),\"alt\":\"TripSit Web\"}}),_c('img',{staticClass:\"logo-inverted\",attrs:{\"src\":(\"img/logo-\" + (_vm.isPublic() ? 'horizontal-' : '') + \"transparent-bg-inverted.svg\"),\"alt\":\"TripSit Web\"}}),(_vm.isDevelopment)?_c('span',{style:({\n\t\t\t\t\tbackgroundColor: '#ff9e18',\n\t\t\t\t\tcolor: '#000',\n\t\t\t\t\tpadding: '2px',\n\t\t\t\t\tborderRadius: '4px',\n\t\t\t\t\tfontSize: '12px',\n\t\t\t\t}),attrs:{\"title\":\"The Lounge has been built in development mode\"}},[_vm._v(\"DEVELOPER\")]):_vm._e()]),_c('NetworkList')],1),_c('footer',{attrs:{\"id\":\"footer\"}},[_c('span',{staticClass:\"tooltipped tooltipped-n tooltipped-no-touch\",attrs:{\"aria-label\":\"Settings\"}},[_c('router-link',{class:['icon', 'settings'],attrs:{\"to\":\"/settings\",\"tag\":\"button\",\"active-class\":\"active\",\"aria-label\":\"Settings\",\"role\":\"tab\",\"aria-controls\":\"settings\",\"aria-selected\":_vm.$route.name === 'Settings'}})],1),_c('span',{staticClass:\"tooltipped tooltipped-n tooltipped-no-touch\",attrs:{\"aria-label\":_vm.$store.state.serverConfiguration.isUpdateAvailable\n\t\t\t\t\t? 'Help\\n(update available)'\n\t\t\t\t\t: 'Help'}},[_c('router-link',{class:[\n\t\t\t\t\t'icon',\n\t\t\t\t\t'help',\n\t\t\t\t\t{notified: _vm.$store.state.serverConfiguration.isUpdateAvailable} ],attrs:{\"to\":\"/help\",\"tag\":\"button\",\"active-class\":\"active\",\"aria-label\":\"Help\",\"role\":\"tab\",\"aria-controls\":\"help\",\"aria-selected\":_vm.$route.name === 'Help'}})],1)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageViewer.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ImageViewer.vue?vue&type=script&lang=js&\"","<template>\n\t<div\n\t\tid=\"image-viewer\"\n\t\tref=\"viewer\"\n\t\t:class=\"{opened: link !== null}\"\n\t\t@wheel=\"onMouseWheel\"\n\t\t@touchstart.passive=\"onTouchStart\"\n\t\t@click=\"onClick\"\n\t>\n\t\t<template v-if=\"link !== null\">\n\t\t\t<button class=\"close-btn\" aria-label=\"Close\"></button>\n\n\t\t\t<button\n\t\t\t\tv-if=\"previousImage\"\n\t\t\t\tclass=\"previous-image-btn\"\n\t\t\t\taria-label=\"Previous image\"\n\t\t\t\t@click.stop=\"previous\"\n\t\t\t></button>\n\t\t\t<button\n\t\t\t\tv-if=\"nextImage\"\n\t\t\t\tclass=\"next-image-btn\"\n\t\t\t\taria-label=\"Next image\"\n\t\t\t\t@click.stop=\"next\"\n\t\t\t></button>\n\n\t\t\t<a class=\"open-btn\" :href=\"link.link\" target=\"_blank\" rel=\"noopener\"></a>\n\n\t\t\t<img\n\t\t\t\tref=\"image\"\n\t\t\t\t:src=\"link.thumb\"\n\t\t\t\talt=\"\"\n\t\t\t\t:style=\"computeImageStyles\"\n\t\t\t\t@load=\"onImageLoad\"\n\t\t\t\t@mousedown=\"onImageMouseDown\"\n\t\t\t\t@touchstart.passive=\"onImageTouchStart\"\n\t\t\t/>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport Mousetrap from \"mousetrap\";\nimport eventbus from \"../js/eventbus\";\n\nexport default {\n\tname: \"ImageViewer\",\n\tdata() {\n\t\treturn {\n\t\t\tlink: null,\n\t\t\tpreviousImage: null,\n\t\t\tnextImage: null,\n\t\t\tchannel: null,\n\n\t\t\tposition: {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t},\n\t\t\ttransform: {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\tscale: 0,\n\t\t\t},\n\t\t};\n\t},\n\tcomputed: {\n\t\tcomputeImageStyles() {\n\t\t\t// Sub pixels may cause the image to blur in certain browsers\n\t\t\t// round it down to prevent that\n\t\t\tconst transformX = Math.floor(this.transform.x);\n\t\t\tconst transformY = Math.floor(this.transform.y);\n\n\t\t\treturn {\n\t\t\t\tleft: `${this.position.x}px`,\n\t\t\t\ttop: `${this.position.y}px`,\n\t\t\t\ttransform: `translate3d(${transformX}px, ${transformY}px, 0) scale3d(${this.transform.scale}, ${this.transform.scale}, 1)`,\n\t\t\t};\n\t\t},\n\t},\n\twatch: {\n\t\tlink(newLink, oldLink) {\n\t\t\t// TODO: history.pushState\n\t\t\tif (newLink === null) {\n\t\t\t\teventbus.off(\"escapekey\", this.closeViewer);\n\t\t\t\teventbus.off(\"resize\", this.correctPosition);\n\t\t\t\tMousetrap.unbind(\"left\", this.previous);\n\t\t\t\tMousetrap.unbind(\"right\", this.next);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.setPrevNextImages();\n\n\t\t\tif (!oldLink) {\n\t\t\t\teventbus.on(\"escapekey\", this.closeViewer);\n\t\t\t\teventbus.on(\"resize\", this.correctPosition);\n\t\t\t\tMousetrap.bind(\"left\", this.previous);\n\t\t\t\tMousetrap.bind(\"right\", this.next);\n\t\t\t}\n\t\t},\n\t},\n\tmethods: {\n\t\tcloseViewer() {\n\t\t\tif (this.link === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.channel = null;\n\t\t\tthis.previousImage = null;\n\t\t\tthis.nextImage = null;\n\t\t\tthis.link = null;\n\t\t},\n\t\tsetPrevNextImages() {\n\t\t\tif (!this.channel) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst links = this.channel.messages\n\t\t\t\t.map((msg) => msg.previews)\n\t\t\t\t.flat()\n\t\t\t\t.filter((preview) => preview.thumb);\n\n\t\t\tconst currentIndex = links.indexOf(this.link);\n\n\t\t\tthis.previousImage = links[currentIndex - 1] || null;\n\t\t\tthis.nextImage = links[currentIndex + 1] || null;\n\t\t},\n\t\tprevious() {\n\t\t\tif (this.previousImage) {\n\t\t\t\tthis.link = this.previousImage;\n\t\t\t}\n\t\t},\n\t\tnext() {\n\t\t\tif (this.nextImage) {\n\t\t\t\tthis.link = this.nextImage;\n\t\t\t}\n\t\t},\n\t\tonImageLoad() {\n\t\t\tthis.prepareImage();\n\t\t},\n\t\tprepareImage() {\n\t\t\tconst viewer = this.$refs.viewer;\n\t\t\tconst image = this.$refs.image;\n\t\t\tconst width = viewer.offsetWidth;\n\t\t\tconst height = viewer.offsetHeight;\n\t\t\tconst scale = Math.min(1, width / image.width, height / image.height);\n\n\t\t\tthis.position.x = Math.floor(-image.naturalWidth / 2);\n\t\t\tthis.position.y = Math.floor(-image.naturalHeight / 2);\n\t\t\tthis.transform.scale = Math.max(scale, 0.1);\n\t\t\tthis.transform.x = width / 2;\n\t\t\tthis.transform.y = height / 2;\n\t\t},\n\t\tcalculateZoomShift(newScale, x, y, oldScale) {\n\t\t\tconst imageWidth = this.$refs.image.width;\n\t\t\tconst centerX = this.$refs.viewer.offsetWidth / 2;\n\t\t\tconst centerY = this.$refs.viewer.offsetHeight / 2;\n\n\t\t\treturn {\n\t\t\t\tx:\n\t\t\t\t\tcenterX -\n\t\t\t\t\t((centerX - (y - (imageWidth * x) / 2)) / x) * newScale +\n\t\t\t\t\t(imageWidth * newScale) / 2,\n\t\t\t\ty:\n\t\t\t\t\tcenterY -\n\t\t\t\t\t((centerY - (oldScale - (imageWidth * x) / 2)) / x) * newScale +\n\t\t\t\t\t(imageWidth * newScale) / 2,\n\t\t\t};\n\t\t},\n\t\tcorrectPosition() {\n\t\t\tconst image = this.$refs.image;\n\t\t\tconst widthScaled = image.width * this.transform.scale;\n\t\t\tconst heightScaled = image.height * this.transform.scale;\n\t\t\tconst containerWidth = this.$refs.viewer.offsetWidth;\n\t\t\tconst containerHeight = this.$refs.viewer.offsetHeight;\n\n\t\t\tif (widthScaled < containerWidth) {\n\t\t\t\tthis.transform.x = containerWidth / 2;\n\t\t\t} else if (this.transform.x - widthScaled / 2 > 0) {\n\t\t\t\tthis.transform.x = widthScaled / 2;\n\t\t\t} else if (this.transform.x + widthScaled / 2 < containerWidth) {\n\t\t\t\tthis.transform.x = containerWidth - widthScaled / 2;\n\t\t\t}\n\n\t\t\tif (heightScaled < containerHeight) {\n\t\t\t\tthis.transform.y = containerHeight / 2;\n\t\t\t} else if (this.transform.y - heightScaled / 2 > 0) {\n\t\t\t\tthis.transform.y = heightScaled / 2;\n\t\t\t} else if (this.transform.y + heightScaled / 2 < containerHeight) {\n\t\t\t\tthis.transform.y = containerHeight - heightScaled / 2;\n\t\t\t}\n\t\t},\n\t\t// Reduce multiple touch points into a single x/y/scale\n\t\treduceTouches(touches) {\n\t\t\tlet totalX = 0;\n\t\t\tlet totalY = 0;\n\t\t\tlet totalScale = 0;\n\n\t\t\tfor (let i = 0; i < touches.length; i++) {\n\t\t\t\tconst x = touches[i].clientX;\n\t\t\t\tconst y = touches[i].clientY;\n\n\t\t\t\ttotalX += x;\n\t\t\t\ttotalY += y;\n\n\t\t\t\tfor (let i2 = 0; i2 < touches.length; i2++) {\n\t\t\t\t\tif (i !== i2) {\n\t\t\t\t\t\tconst x2 = touches[i2].clientX;\n\t\t\t\t\t\tconst y2 = touches[i2].clientY;\n\t\t\t\t\t\ttotalScale += Math.sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (totalScale === 0) {\n\t\t\t\ttotalScale = 1;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tx: totalX / touches.length,\n\t\t\t\ty: totalY / touches.length,\n\t\t\t\tscale: totalScale / touches.length,\n\t\t\t};\n\t\t},\n\t\tonTouchStart(e) {\n\t\t\t// prevent sidebar touchstart event, we don't want to interact with sidebar while in image viewer\n\t\t\te.stopImmediatePropagation();\n\t\t},\n\t\t// Touch image manipulation:\n\t\t// 1. Move around by dragging it with one finger\n\t\t// 2. Change image scale by using two fingers\n\t\tonImageTouchStart(e) {\n\t\t\tconst image = this.$refs.image;\n\t\t\tlet touch = this.reduceTouches(e.touches);\n\t\t\tlet currentTouches = e.touches;\n\t\t\tlet touchEndFingers = 0;\n\n\t\t\tconst currentTransform = {\n\t\t\t\tx: touch.x,\n\t\t\t\ty: touch.y,\n\t\t\t\tscale: touch.scale,\n\t\t\t};\n\n\t\t\tconst startTransform = {\n\t\t\t\tx: this.transform.x,\n\t\t\t\ty: this.transform.y,\n\t\t\t\tscale: this.transform.scale,\n\t\t\t};\n\n\t\t\tconst touchMove = (moveEvent) => {\n\t\t\t\ttouch = this.reduceTouches(moveEvent.touches);\n\n\t\t\t\tif (currentTouches.length !== moveEvent.touches.length) {\n\t\t\t\t\tcurrentTransform.x = touch.x;\n\t\t\t\t\tcurrentTransform.y = touch.y;\n\t\t\t\t\tcurrentTransform.scale = touch.scale;\n\t\t\t\t\tstartTransform.x = this.transform.x;\n\t\t\t\t\tstartTransform.y = this.transform.y;\n\t\t\t\t\tstartTransform.scale = this.transform.scale;\n\t\t\t\t}\n\n\t\t\t\tconst deltaX = touch.x - currentTransform.x;\n\t\t\t\tconst deltaY = touch.y - currentTransform.y;\n\t\t\t\tconst deltaScale = touch.scale / currentTransform.scale;\n\t\t\t\tcurrentTouches = moveEvent.touches;\n\t\t\t\ttouchEndFingers = 0;\n\n\t\t\t\tconst newScale = Math.min(3, Math.max(0.1, startTransform.scale * deltaScale));\n\t\t\t\tconst fixedPosition = this.calculateZoomShift(\n\t\t\t\t\tnewScale,\n\t\t\t\t\tstartTransform.scale,\n\t\t\t\t\tstartTransform.x,\n\t\t\t\t\tstartTransform.y\n\t\t\t\t);\n\n\t\t\t\tthis.transform.x = fixedPosition.x + deltaX;\n\t\t\t\tthis.transform.y = fixedPosition.y + deltaY;\n\t\t\t\tthis.transform.scale = newScale;\n\t\t\t\tthis.correctPosition();\n\t\t\t};\n\n\t\t\tconst touchEnd = (endEvent) => {\n\t\t\t\tconst changedTouches = endEvent.changedTouches.length;\n\n\t\t\t\tif (currentTouches.length > changedTouches + touchEndFingers) {\n\t\t\t\t\ttouchEndFingers += changedTouches;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// todo: this is swipe to close, but it's not working very well due to unfinished delta calculation\n\t\t\t\t/* if (\n\t\t\t\t\tthis.transform.scale <= 1 &&\n\t\t\t\t\tendEvent.changedTouches[0].clientY - startTransform.y <= -70\n\t\t\t\t) {\n\t\t\t\t\treturn this.closeViewer();\n\t\t\t\t}*/\n\n\t\t\t\tthis.correctPosition();\n\n\t\t\t\timage.removeEventListener(\"touchmove\", touchMove, {passive: true});\n\t\t\t\timage.removeEventListener(\"touchend\", touchEnd, {passive: true});\n\t\t\t};\n\n\t\t\timage.addEventListener(\"touchmove\", touchMove, {passive: true});\n\t\t\timage.addEventListener(\"touchend\", touchEnd, {passive: true});\n\t\t},\n\t\t// Image mouse manipulation:\n\t\t// 1. Mouse wheel scrolling will zoom in and out\n\t\t// 2. If image is zoomed in, simply dragging it will move it around\n\t\tonImageMouseDown(e) {\n\t\t\t// todo: ignore if in touch event currently?\n\t\t\t// only left mouse\n\t\t\tif (e.which !== 1) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\n\t\t\tconst viewer = this.$refs.viewer;\n\t\t\tconst image = this.$refs.image;\n\n\t\t\tconst startX = e.clientX;\n\t\t\tconst startY = e.clientY;\n\t\t\tconst startTransformX = this.transform.x;\n\t\t\tconst startTransformY = this.transform.y;\n\t\t\tconst widthScaled = image.width * this.transform.scale;\n\t\t\tconst heightScaled = image.height * this.transform.scale;\n\t\t\tconst containerWidth = viewer.offsetWidth;\n\t\t\tconst containerHeight = viewer.offsetHeight;\n\t\t\tconst centerX = this.transform.x - widthScaled / 2;\n\t\t\tconst centerY = this.transform.y - heightScaled / 2;\n\t\t\tlet movedDistance = 0;\n\n\t\t\tconst mouseMove = (moveEvent) => {\n\t\t\t\tmoveEvent.stopPropagation();\n\t\t\t\tmoveEvent.preventDefault();\n\n\t\t\t\tconst newX = moveEvent.clientX - startX;\n\t\t\t\tconst newY = moveEvent.clientY - startY;\n\n\t\t\t\tmovedDistance = Math.max(movedDistance, Math.abs(newX), Math.abs(newY));\n\n\t\t\t\tif (centerX < 0 || widthScaled + centerX > containerWidth) {\n\t\t\t\t\tthis.transform.x = startTransformX + newX;\n\t\t\t\t}\n\n\t\t\t\tif (centerY < 0 || heightScaled + centerY > containerHeight) {\n\t\t\t\t\tthis.transform.y = startTransformY + newY;\n\t\t\t\t}\n\n\t\t\t\tthis.correctPosition();\n\t\t\t};\n\n\t\t\tconst mouseUp = (upEvent) => {\n\t\t\t\tthis.correctPosition();\n\n\t\t\t\tif (movedDistance < 2 && upEvent.button === 0) {\n\t\t\t\t\tthis.closeViewer();\n\t\t\t\t}\n\n\t\t\t\timage.removeEventListener(\"mousemove\", mouseMove);\n\t\t\t\timage.removeEventListener(\"mouseup\", mouseUp);\n\t\t\t};\n\n\t\t\timage.addEventListener(\"mousemove\", mouseMove);\n\t\t\timage.addEventListener(\"mouseup\", mouseUp);\n\t\t},\n\t\t// If image is zoomed in, holding ctrl while scrolling will move the image up and down\n\t\tonMouseWheel(e) {\n\t\t\t// if image viewer is closing (css animation), you can still trigger mousewheel\n\t\t\t// TODO: Figure out a better fix for this\n\t\t\tif (this.link === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault(); // TODO: Can this be passive?\n\n\t\t\tif (e.ctrlKey) {\n\t\t\t\tthis.transform.y += e.deltaY;\n\t\t\t} else {\n\t\t\t\tconst delta = e.deltaY > 0 ? 0.1 : -0.1;\n\t\t\t\tconst newScale = Math.min(3, Math.max(0.1, this.transform.scale + delta));\n\t\t\t\tconst fixedPosition = this.calculateZoomShift(\n\t\t\t\t\tnewScale,\n\t\t\t\t\tthis.transform.scale,\n\t\t\t\t\tthis.transform.x,\n\t\t\t\t\tthis.transform.y\n\t\t\t\t);\n\t\t\t\tthis.transform.scale = newScale;\n\t\t\t\tthis.transform.x = fixedPosition.x;\n\t\t\t\tthis.transform.y = fixedPosition.y;\n\t\t\t}\n\n\t\t\tthis.correctPosition();\n\t\t},\n\t\tonClick(e) {\n\t\t\t// If click triggers on the image, ignore it\n\t\t\tif (e.target === this.$refs.image) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.closeViewer();\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./ImageViewer.vue?vue&type=template&id=49bcfaee&\"\nimport script from \"./ImageViewer.vue?vue&type=script&lang=js&\"\nexport * from \"./ImageViewer.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:\"viewer\",class:{opened: _vm.link !== null},attrs:{\"id\":\"image-viewer\"},on:{\"wheel\":_vm.onMouseWheel,\"&touchstart\":function($event){return _vm.onTouchStart($event)},\"click\":_vm.onClick}},[(_vm.link !== null)?[_c('button',{staticClass:\"close-btn\",attrs:{\"aria-label\":\"Close\"}}),(_vm.previousImage)?_c('button',{staticClass:\"previous-image-btn\",attrs:{\"aria-label\":\"Previous image\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.previous($event)}}}):_vm._e(),(_vm.nextImage)?_c('button',{staticClass:\"next-image-btn\",attrs:{\"aria-label\":\"Next image\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.next($event)}}}):_vm._e(),_c('a',{staticClass:\"open-btn\",attrs:{\"href\":_vm.link.link,\"target\":\"_blank\",\"rel\":\"noopener\"}}),_c('img',{ref:\"image\",style:(_vm.computeImageStyles),attrs:{\"src\":_vm.link.thumb,\"alt\":\"\"},on:{\"load\":_vm.onImageLoad,\"mousedown\":_vm.onImageMouseDown,\"&touchstart\":function($event){return _vm.onImageTouchStart($event)}}})]:_vm._e()],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<div\n\t\tv-if=\"isOpen\"\n\t\tid=\"context-menu-container\"\n\t\t@click=\"containerClick\"\n\t\t@contextmenu.prevent=\"containerClick\"\n\t\t@keydown.exact.up.prevent=\"navigateMenu(-1)\"\n\t\t@keydown.exact.down.prevent=\"navigateMenu(1)\"\n\t\t@keydown.exact.tab.prevent=\"navigateMenu(1)\"\n\t\t@keydown.shift.tab.prevent=\"navigateMenu(-1)\"\n\t>\n\t\t<ul\n\t\t\tid=\"context-menu\"\n\t\t\tref=\"contextMenu\"\n\t\t\trole=\"menu\"\n\t\t\t:style=\"style\"\n\t\t\ttabindex=\"-1\"\n\t\t\t@mouseleave=\"activeItem = -1\"\n\t\t\t@keydown.enter.prevent=\"clickActiveItem\"\n\t\t>\n\t\t\t<template v-for=\"(item, id) of items\">\n\t\t\t\t<li\n\t\t\t\t\t:key=\"item.name\"\n\t\t\t\t\t:class=\"[\n\t\t\t\t\t\t'context-menu-' + item.type,\n\t\t\t\t\t\titem.class ? 'context-menu-' + item.class : null,\n\t\t\t\t\t\t{active: id === activeItem},\n\t\t\t\t\t]\"\n\t\t\t\t\trole=\"menuitem\"\n\t\t\t\t\t@mouseenter=\"hoverItem(id)\"\n\t\t\t\t\t@click=\"clickItem(item)\"\n\t\t\t\t>\n\t\t\t\t\t{{ item.label }}\n\t\t\t\t</li>\n\t\t\t</template>\n\t\t</ul>\n\t</div>\n</template>\n\n<script>\nimport {generateUserContextMenu, generateChannelContextMenu} from \"../js/helpers/contextMenu.js\";\nimport eventbus from \"../js/eventbus\";\n\nexport default {\n\tname: \"ContextMenu\",\n\tprops: {\n\t\tmessage: Object,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisOpen: false,\n\t\t\tpreviousActiveElement: null,\n\t\t\titems: [],\n\t\t\tactiveItem: -1,\n\t\t\tstyle: {\n\t\t\t\tleft: 0,\n\t\t\t\ttop: 0,\n\t\t\t},\n\t\t};\n\t},\n\tmounted() {\n\t\teventbus.on(\"escapekey\", this.close);\n\t\teventbus.on(\"contextmenu:user\", this.openUserContextMenu);\n\t\teventbus.on(\"contextmenu:channel\", this.openChannelContextMenu);\n\t},\n\tdestroyed() {\n\t\teventbus.off(\"escapekey\", this.close);\n\t\teventbus.off(\"contextmenu:user\", this.openUserContextMenu);\n\t\teventbus.off(\"contextmenu:channel\", this.openChannelContextMenu);\n\n\t\tthis.close();\n\t},\n\tmethods: {\n\t\topenChannelContextMenu(data) {\n\t\t\tconst items = generateChannelContextMenu(this.$root, data.channel, data.network);\n\t\t\tthis.open(data.event, items);\n\t\t},\n\t\topenUserContextMenu(data) {\n\t\t\tconst {network, channel} = this.$store.state.activeChannel;\n\n\t\t\tconst items = generateUserContextMenu(\n\t\t\t\tthis.$root,\n\t\t\t\tchannel,\n\t\t\t\tnetwork,\n\t\t\t\tchannel.users.find((u) => u.nick === data.user.nick) || {\n\t\t\t\t\tnick: data.user.nick,\n\t\t\t\t\tmodes: [],\n\t\t\t\t}\n\t\t\t);\n\t\t\tthis.open(data.event, items);\n\t\t},\n\t\topen(event, items) {\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.previousActiveElement = document.activeElement;\n\t\t\tthis.items = items;\n\t\t\tthis.activeItem = 0;\n\t\t\tthis.isOpen = true;\n\n\t\t\t// Position the menu and set the focus on the first item after it's size has updated\n\t\t\tthis.$nextTick(() => {\n\t\t\t\tconst pos = this.positionContextMenu(event);\n\t\t\t\tthis.style.left = pos.left + \"px\";\n\t\t\t\tthis.style.top = pos.top + \"px\";\n\t\t\t\tthis.$refs.contextMenu.focus();\n\t\t\t});\n\t\t},\n\t\tclose() {\n\t\t\tif (!this.isOpen) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.isOpen = false;\n\t\t\tthis.items = [];\n\n\t\t\tif (this.previousActiveElement) {\n\t\t\t\tthis.previousActiveElement.focus();\n\t\t\t\tthis.previousActiveElement = null;\n\t\t\t}\n\t\t},\n\t\thoverItem(id) {\n\t\t\tthis.activeItem = id;\n\t\t},\n\t\tclickItem(item) {\n\t\t\tthis.close();\n\n\t\t\tif (item.action) {\n\t\t\t\titem.action();\n\t\t\t} else if (item.link) {\n\t\t\t\tthis.$router.push(item.link);\n\t\t\t}\n\t\t},\n\t\tclickActiveItem() {\n\t\t\tif (this.items[this.activeItem]) {\n\t\t\t\tthis.clickItem(this.items[this.activeItem]);\n\t\t\t}\n\t\t},\n\t\tnavigateMenu(direction) {\n\t\t\tlet currentIndex = this.activeItem;\n\n\t\t\tcurrentIndex += direction;\n\n\t\t\tconst nextItem = this.items[currentIndex];\n\n\t\t\t// If the next item we would select is a divider, skip over it\n\t\t\tif (nextItem && nextItem.type === \"divider\") {\n\t\t\t\tcurrentIndex += direction;\n\t\t\t}\n\n\t\t\tif (currentIndex < 0) {\n\t\t\t\tcurrentIndex += this.items.length;\n\t\t\t}\n\n\t\t\tif (currentIndex > this.items.length - 1) {\n\t\t\t\tcurrentIndex -= this.items.length;\n\t\t\t}\n\n\t\t\tthis.activeItem = currentIndex;\n\t\t},\n\t\tcontainerClick(event) {\n\t\t\tif (event.currentTarget === event.target) {\n\t\t\t\tthis.close();\n\t\t\t}\n\t\t},\n\t\tpositionContextMenu(event) {\n\t\t\tconst element = event.target;\n\t\t\tconst menuWidth = this.$refs.contextMenu.offsetWidth;\n\t\t\tconst menuHeight = this.$refs.contextMenu.offsetHeight;\n\n\t\t\tif (element && element.classList.contains(\"menu\")) {\n\t\t\t\treturn {\n\t\t\t\t\tleft: element.getBoundingClientRect().left - (menuWidth - element.offsetWidth),\n\t\t\t\t\ttop: element.getBoundingClientRect().top + element.offsetHeight,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tconst offset = {left: event.pageX, top: event.pageY};\n\n\t\t\tif (window.innerWidth - offset.left < menuWidth) {\n\t\t\t\toffset.left = window.innerWidth - menuWidth;\n\t\t\t}\n\n\t\t\tif (window.innerHeight - offset.top < menuHeight) {\n\t\t\t\toffset.top = window.innerHeight - menuHeight;\n\t\t\t}\n\n\t\t\treturn offset;\n\t\t},\n\t},\n};\n</script>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ContextMenu.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ContextMenu.vue?vue&type=script&lang=js&\"","\"use strict\";\n\nimport socket from \"../socket\";\nimport eventbus from \"../eventbus\";\n\nexport function generateChannelContextMenu($root, channel, network) {\n\tconst typeMap = {\n\t\tlobby: \"network\",\n\t\tchannel: \"chan\",\n\t\tquery: \"query\",\n\t\tspecial: \"chan\",\n\t};\n\n\tconst closeMap = {\n\t\tlobby: \"Remove\",\n\t\tchannel: \"Leave\",\n\t\tquery: \"Close\",\n\t\tspecial: \"Close\",\n\t};\n\n\tlet items = [\n\t\t{\n\t\t\tlabel: channel.name,\n\t\t\ttype: \"item\",\n\t\t\tclass: typeMap[channel.type],\n\t\t\tlink: `/chan-${channel.id}`,\n\t\t},\n\t\t{\n\t\t\ttype: \"divider\",\n\t\t},\n\t];\n\n\t// Add menu items for lobbies\n\tif (channel.type === \"lobby\") {\n\t\titems = [\n\t\t\t...items,\n\t\t\t{\n\t\t\t\tlabel: \"Edit this network…\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"edit\",\n\t\t\t\tlink: `/edit-network/${network.uuid}`,\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"Join a channel…\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"join\",\n\t\t\t\taction: () => (network.isJoinChannelShown = true),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"List all channels\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"list\",\n\t\t\t\taction: () =>\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/list\",\n\t\t\t\t\t}),\n\t\t\t},\n\t\t\t{\n\t\t\t\tlabel: \"List ignored users\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"list\",\n\t\t\t\taction: () =>\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/ignorelist\",\n\t\t\t\t\t}),\n\t\t\t},\n\t\t\tnetwork.status.connected\n\t\t\t\t? {\n\t\t\t\t\t\tlabel: \"Disconnect\",\n\t\t\t\t\t\ttype: \"item\",\n\t\t\t\t\t\tclass: \"disconnect\",\n\t\t\t\t\t\taction: () =>\n\t\t\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\t\t\ttext: \"/disconnect\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t }\n\t\t\t\t: {\n\t\t\t\t\t\tlabel: \"Connect\",\n\t\t\t\t\t\ttype: \"item\",\n\t\t\t\t\t\tclass: \"connect\",\n\t\t\t\t\t\taction: () =>\n\t\t\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\t\t\ttext: \"/connect\",\n\t\t\t\t\t\t\t}),\n\t\t\t\t },\n\t\t];\n\t}\n\n\t// Add menu items for channels\n\tif (channel.type === \"channel\") {\n\t\titems.push({\n\t\t\tlabel: \"Edit topic\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"edit\",\n\t\t\taction() {\n\t\t\t\tchannel.editTopic = true;\n\t\t\t\t$root.switchToChannel(channel);\n\t\t\t},\n\t\t});\n\t\titems.push({\n\t\t\tlabel: \"List banned users\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"list\",\n\t\t\taction() {\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\ttext: \"/banlist\",\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\t// Add menu items for queries\n\tif (channel.type === \"query\") {\n\t\titems.push({\n\t\t\tlabel: \"User information\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"action-whois\",\n\t\t\taction() {\n\t\t\t\t$root.switchToChannel(channel);\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\ttext: \"/whois \" + channel.name,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\t}\n\n\tif (channel.type === \"channel\" || channel.type === \"query\") {\n\t\titems.push({\n\t\t\tlabel: \"Clear history\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"clear-history\",\n\t\t\taction() {\n\t\t\t\teventbus.emit(\n\t\t\t\t\t\"confirm-dialog\",\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Clear history\",\n\t\t\t\t\t\ttext: `Are you sure you want to clear history for ${channel.name}? This cannot be undone.`,\n\t\t\t\t\t\tbutton: \"Clear history\",\n\t\t\t\t\t},\n\t\t\t\t\t(result) => {\n\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsocket.emit(\"history:clear\", {\n\t\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t}\n\n\t// Add close menu item\n\titems.push({\n\t\tlabel: closeMap[channel.type],\n\t\ttype: \"item\",\n\t\tclass: \"close\",\n\t\taction() {\n\t\t\t$root.closeChannel(channel);\n\t\t},\n\t});\n\n\treturn items;\n}\n\nexport function generateUserContextMenu($root, channel, network, user) {\n\tconst currentChannelUser = channel.users.find((u) => u.nick === network.nick) || {};\n\tconst currentChannelModes = currentChannelUser.modes || [];\n\n\tconst whois = () => {\n\t\tconst chan = $root.$store.getters.findChannelOnCurrentNetwork(user.nick);\n\n\t\tif (chan) {\n\t\t\t$root.switchToChannel(chan);\n\t\t}\n\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: channel.id,\n\t\t\ttext: \"/whois \" + user.nick,\n\t\t});\n\t};\n\n\tconst items = [\n\t\t{\n\t\t\tlabel: user.nick,\n\t\t\ttype: \"item\",\n\t\t\tclass: \"user\",\n\t\t\taction: whois,\n\t\t},\n\t\t{\n\t\t\ttype: \"divider\",\n\t\t},\n\t\t{\n\t\t\tlabel: \"User information\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"action-whois\",\n\t\t\taction: whois,\n\t\t},\n\t\t{\n\t\t\tlabel: \"Direct messages\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"action-query\",\n\t\t\taction() {\n\t\t\t\tconst chan = $root.$store.getters.findChannelOnCurrentNetwork(user.nick);\n\n\t\t\t\tif (chan) {\n\t\t\t\t\t$root.switchToChannel(chan);\n\t\t\t\t}\n\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\ttext: \"/query \" + user.nick,\n\t\t\t\t});\n\t\t\t},\n\t\t},\n\t];\n\n\tif (currentChannelModes.includes(\"@\")) {\n\t\titems.push({\n\t\t\tlabel: \"Kick\",\n\t\t\ttype: \"item\",\n\t\t\tclass: \"action-kick\",\n\t\t\taction() {\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\ttext: \"/kick \" + user.nick,\n\t\t\t\t});\n\t\t\t},\n\t\t});\n\n\t\tif (user.modes.includes(\"@\")) {\n\t\t\titems.push({\n\t\t\t\tlabel: \"Revoke operator (-o)\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-op\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/deop \" + user.nick,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\titems.push({\n\t\t\t\tlabel: \"Give operator (+o)\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-op\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/op \" + user.nick,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tif (user.modes.includes(\"+\")) {\n\t\t\titems.push({\n\t\t\t\tlabel: \"Revoke voice (-v)\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-voice\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/devoice \" + user.nick,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\t\t} else {\n\t\t\titems.push({\n\t\t\t\tlabel: \"Give voice (+v)\",\n\t\t\t\ttype: \"item\",\n\t\t\t\tclass: \"action-voice\",\n\t\t\t\taction() {\n\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\ttext: \"/voice \" + user.nick,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n\n\treturn items;\n}\n","import { render, staticRenderFns } from \"./ContextMenu.vue?vue&type=template&id=078d919f&\"\nimport script from \"./ContextMenu.vue?vue&type=script&lang=js&\"\nexport * from \"./ContextMenu.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.isOpen)?_c('div',{attrs:{\"id\":\"context-menu-container\"},on:{\"click\":_vm.containerClick,\"contextmenu\":function($event){$event.preventDefault();return _vm.containerClick($event)},\"keydown\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"up\",38,$event.key,[\"Up\",\"ArrowUp\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }$event.preventDefault();return _vm.navigateMenu(-1)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"down\",40,$event.key,[\"Down\",\"ArrowDown\"])){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }$event.preventDefault();return _vm.navigateMenu(1)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"tab\",9,$event.key,\"Tab\")){ return null; }if($event.ctrlKey||$event.shiftKey||$event.altKey||$event.metaKey){ return null; }$event.preventDefault();return _vm.navigateMenu(1)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"tab\",9,$event.key,\"Tab\")){ return null; }if(!$event.shiftKey){ return null; }$event.preventDefault();return _vm.navigateMenu(-1)}]}},[_c('ul',{ref:\"contextMenu\",style:(_vm.style),attrs:{\"id\":\"context-menu\",\"role\":\"menu\",\"tabindex\":\"-1\"},on:{\"mouseleave\":function($event){_vm.activeItem = -1},\"keydown\":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }$event.preventDefault();return _vm.clickActiveItem($event)}}},[_vm._l((_vm.items),function(item,id){return [_c('li',{key:item.name,class:[\n\t\t\t\t\t'context-menu-' + item.type,\n\t\t\t\t\titem.class ? 'context-menu-' + item.class : null,\n\t\t\t\t\t{active: id === _vm.activeItem} ],attrs:{\"role\":\"menuitem\"},on:{\"mouseenter\":function($event){return _vm.hoverItem(id)},\"click\":function($event){return _vm.clickItem(item)}}},[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(item.label)+\"\\n\\t\\t\\t\")])]})],2)]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfirmDialog.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ConfirmDialog.vue?vue&type=script&lang=js&\"","<template>\n\t<div id=\"confirm-dialog-overlay\" :class=\"{opened: data !== null}\">\n\t\t<div v-if=\"data !== null\" id=\"confirm-dialog\">\n\t\t\t<div class=\"confirm-text\">\n\t\t\t\t<div class=\"confirm-text-title\">{{ data.title }}</div>\n\t\t\t\t<p>{{ data.text }}</p>\n\t\t\t</div>\n\t\t\t<div class=\"confirm-buttons\">\n\t\t\t\t<button class=\"btn btn-cancel\" @click=\"close(false)\">Cancel</button>\n\t\t\t\t<button class=\"btn btn-danger\" @click=\"close(true)\">{{ data.button }}</button>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n#confirm-dialog {\n\tbackground: var(--body-bg-color);\n\tcolor: #fff;\n\tmargin: 10px;\n\tborder-radius: 5px;\n\tmax-width: 500px;\n}\n\n#confirm-dialog .confirm-text {\n\tpadding: 15px;\n\tuser-select: text;\n}\n\n#confirm-dialog .confirm-text-title {\n\tfont-size: 20px;\n\tfont-weight: 700;\n\tmargin-bottom: 10px;\n}\n\n#confirm-dialog .confirm-buttons {\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\tpadding: 15px;\n\tbackground: rgba(0, 0, 0, 0.3);\n}\n\n#confirm-dialog .confirm-buttons .btn {\n\tmargin-bottom: 0;\n\tmargin-left: 10px;\n}\n\n#confirm-dialog .confirm-buttons .btn-cancel {\n\tborder-color: transparent;\n}\n</style>\n\n<script>\nimport eventbus from \"../js/eventbus\";\n\nexport default {\n\tname: \"ConfirmDialog\",\n\tdata() {\n\t\treturn {\n\t\t\tdata: null,\n\t\t\tcallback: null,\n\t\t};\n\t},\n\tmounted() {\n\t\teventbus.on(\"escapekey\", this.close);\n\t\teventbus.on(\"confirm-dialog\", this.open);\n\t},\n\tdestroyed() {\n\t\teventbus.off(\"escapekey\", this.close);\n\t\teventbus.off(\"confirm-dialog\", this.open);\n\t},\n\tmethods: {\n\t\topen(data, callback) {\n\t\t\tthis.data = data;\n\t\t\tthis.callback = callback;\n\t\t},\n\t\tclose(result) {\n\t\t\tthis.data = null;\n\n\t\t\tif (this.callback) {\n\t\t\t\tthis.callback(!!result);\n\t\t\t}\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./ConfirmDialog.vue?vue&type=template&id=35b177fe&\"\nimport script from \"./ConfirmDialog.vue?vue&type=script&lang=js&\"\nexport * from \"./ConfirmDialog.vue?vue&type=script&lang=js&\"\nimport style0 from \"./ConfirmDialog.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:{opened: _vm.data !== null},attrs:{\"id\":\"confirm-dialog-overlay\"}},[(_vm.data !== null)?_c('div',{attrs:{\"id\":\"confirm-dialog\"}},[_c('div',{staticClass:\"confirm-text\"},[_c('div',{staticClass:\"confirm-text-title\"},[_vm._v(_vm._s(_vm.data.title))]),_c('p',[_vm._v(_vm._s(_vm.data.text))])]),_c('div',{staticClass:\"confirm-buttons\"},[_c('button',{staticClass:\"btn btn-cancel\",on:{\"click\":function($event){return _vm.close(false)}}},[_vm._v(\"Cancel\")]),_c('button',{staticClass:\"btn btn-danger\",on:{\"click\":function($event){return _vm.close(true)}}},[_vm._v(_vm._s(_vm.data.button))])])]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<div\n\t\tv-if=\"isOpen\"\n\t\tid=\"mentions-popup-container\"\n\t\t@click=\"containerClick\"\n\t\t@contextmenu=\"containerClick\"\n\t>\n\t\t<div class=\"mentions-popup\">\n\t\t\t<div class=\"mentions-popup-title\">\n\t\t\t\tRecent mentions\n\t\t\t\t<button\n\t\t\t\t\tv-if=\"resolvedMessages.length\"\n\t\t\t\t\tclass=\"btn hide-all-mentions\"\n\t\t\t\t\t@click=\"hideAllMentions()\"\n\t\t\t\t>\n\t\t\t\t\tHide all\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<template v-if=\"resolvedMessages.length === 0\">\n\t\t\t\t<p v-if=\"isLoading\">Loading…</p>\n\t\t\t\t<p v-else>You have no recent mentions.</p>\n\t\t\t</template>\n\t\t\t<template v-for=\"message in resolvedMessages\" v-else>\n\t\t\t\t<div :key=\"message.msgId\" :class=\"['msg', message.type]\">\n\t\t\t\t\t<div class=\"mentions-info\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<span class=\"from\">\n\t\t\t\t\t\t\t\t<Username :user=\"message.from\" />\n\t\t\t\t\t\t\t\t<template v-if=\"message.channel\">\n\t\t\t\t\t\t\t\t\tin {{ message.channel.channel.name }} on\n\t\t\t\t\t\t\t\t\t{{ message.channel.network.name }}\n\t\t\t\t\t\t\t\t</template>\n\t\t\t\t\t\t\t\t<template v-else> in unknown channel </template>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span :title=\"message.localetime\" class=\"time\">\n\t\t\t\t\t\t\t\t{{ messageTime(message.time) }}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<span class=\"close-tooltip tooltipped tooltipped-w\" aria-label=\"Close\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"msg-hide\"\n\t\t\t\t\t\t\t\t\taria-label=\"Hide this mention\"\n\t\t\t\t\t\t\t\t\t@click=\"hideMention(message)\"\n\t\t\t\t\t\t\t\t></button>\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"content\" dir=\"auto\">\n\t\t\t\t\t\t<ParsedMessage :network=\"null\" :message=\"message\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<style>\n#mentions-popup-container {\n\tz-index: 8;\n}\n\n.mentions-popup {\n\tbackground-color: var(--window-bg-color);\n\tposition: absolute;\n\twidth: 400px;\n\tright: 80px;\n\ttop: 55px;\n\tmax-height: 400px;\n\toverflow-y: auto;\n\tz-index: 2;\n\tpadding: 10px;\n}\n\n.mentions-popup > .mentions-popup-title {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\tmargin-bottom: 10px;\n\tfont-size: 20px;\n}\n\n.mentions-popup .mentions-info {\n\tdisplay: flex;\n\tjustify-content: space-between;\n}\n\n.mentions-popup .msg {\n\tmargin-bottom: 15px;\n\tuser-select: text;\n}\n\n.mentions-popup .msg:last-child {\n\tmargin-bottom: 0;\n}\n\n.mentions-popup .msg .content {\n\tbackground-color: var(--highlight-bg-color);\n\tborder-radius: 5px;\n\tpadding: 6px;\n\tmargin-top: 2px;\n\tword-wrap: break-word;\n\tword-break: break-word; /* Webkit-specific */\n}\n\n.mentions-popup .msg-hide::before {\n\tfont-size: 20px;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tline-height: 16px;\n\ttext-align: center;\n\tcontent: \"×\";\n}\n\n.mentions-popup .msg-hide:hover {\n\tcolor: var(--link-color);\n}\n\n.mentions-popup .hide-all-mentions {\n\tmargin: 0;\n\tpadding: 4px 6px;\n}\n\n@media (min-height: 500px) {\n\t.mentions-popup {\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (max-width: 768px) {\n\t.mentions-popup {\n\t\tborder-radius: 0;\n\t\tborder: 0;\n\t\tbox-shadow: none;\n\t\twidth: 100%;\n\t\tmax-height: none;\n\t\tright: 0;\n\t\tleft: 0;\n\t\tbottom: 0;\n\t\ttop: 45px; /* header height */\n\t}\n}\n</style>\n\n<script>\nimport Username from \"./Username.vue\";\nimport ParsedMessage from \"./ParsedMessage.vue\";\nimport socket from \"../js/socket\";\nimport eventbus from \"../js/eventbus\";\nimport localetime from \"../js/helpers/localetime\";\nimport dayjs from \"dayjs\";\nimport relativeTime from \"dayjs/plugin/relativeTime\";\n\ndayjs.extend(relativeTime);\n\nexport default {\n\tname: \"Mentions\",\n\tcomponents: {\n\t\tUsername,\n\t\tParsedMessage,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tisOpen: false,\n\t\t\tisLoading: false,\n\t\t};\n\t},\n\tcomputed: {\n\t\tresolvedMessages() {\n\t\t\tconst messages = this.$store.state.mentions.slice().reverse();\n\n\t\t\tfor (const message of messages) {\n\t\t\t\tmessage.localetime = localetime(message.time);\n\t\t\t\tmessage.channel = this.$store.getters.findChannel(message.chanId);\n\t\t\t}\n\n\t\t\treturn messages;\n\t\t},\n\t},\n\twatch: {\n\t\t\"$store.state.mentions\"() {\n\t\t\tthis.isLoading = false;\n\t\t},\n\t},\n\tmounted() {\n\t\teventbus.on(\"mentions:toggle\", this.openPopup);\n\t},\n\tdestroyed() {\n\t\teventbus.off(\"mentions:toggle\", this.openPopup);\n\t},\n\tmethods: {\n\t\tmessageTime(time) {\n\t\t\treturn dayjs(time).fromNow();\n\t\t},\n\t\thideMention(message) {\n\t\t\tthis.$store.state.mentions.splice(\n\t\t\t\tthis.$store.state.mentions.findIndex((m) => m.msgId === message.msgId),\n\t\t\t\t1\n\t\t\t);\n\n\t\t\tsocket.emit(\"mentions:hide\", message.msgId);\n\t\t},\n\t\thideAllMentions() {\n\t\t\tthis.$store.state.mentions = [];\n\t\t\tsocket.emit(\"mentions:hide_all\");\n\t\t},\n\t\tcontainerClick(event) {\n\t\t\tif (event.currentTarget === event.target) {\n\t\t\t\tthis.isOpen = false;\n\t\t\t}\n\t\t},\n\t\topenPopup() {\n\t\t\tthis.isOpen = !this.isOpen;\n\n\t\t\tif (this.isOpen) {\n\t\t\t\tthis.isLoading = true;\n\t\t\t\tsocket.emit(\"mentions:get\");\n\t\t\t}\n\t\t},\n\t},\n};\n</script>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Mentions.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Mentions.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Mentions.vue?vue&type=template&id=1fae5439&\"\nimport script from \"./Mentions.vue?vue&type=script&lang=js&\"\nexport * from \"./Mentions.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Mentions.vue?vue&type=style&index=0&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.isOpen)?_c('div',{attrs:{\"id\":\"mentions-popup-container\"},on:{\"click\":_vm.containerClick,\"contextmenu\":_vm.containerClick}},[_c('div',{staticClass:\"mentions-popup\"},[_c('div',{staticClass:\"mentions-popup-title\"},[_vm._v(\"\\n\\t\\t\\tRecent mentions\\n\\t\\t\\t\"),(_vm.resolvedMessages.length)?_c('button',{staticClass:\"btn hide-all-mentions\",on:{\"click\":function($event){return _vm.hideAllMentions()}}},[_vm._v(\"\\n\\t\\t\\t\\tHide all\\n\\t\\t\\t\")]):_vm._e()]),(_vm.resolvedMessages.length === 0)?[(_vm.isLoading)?_c('p',[_vm._v(\"Loading…\")]):_c('p',[_vm._v(\"You have no recent mentions.\")])]:_vm._l((_vm.resolvedMessages),function(message){return [_c('div',{key:message.msgId,class:['msg', message.type]},[_c('div',{staticClass:\"mentions-info\"},[_c('div',[_c('span',{staticClass:\"from\"},[_c('Username',{attrs:{\"user\":message.from}}),(message.channel)?[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\t\\tin \"+_vm._s(message.channel.channel.name)+\" on\\n\\t\\t\\t\\t\\t\\t\\t\\t\"+_vm._s(message.channel.network.name)+\"\\n\\t\\t\\t\\t\\t\\t\\t\")]:[_vm._v(\" in unknown channel \")]],2),_c('span',{staticClass:\"time\",attrs:{\"title\":message.localetime}},[_vm._v(\"\\n\\t\\t\\t\\t\\t\\t\\t\"+_vm._s(_vm.messageTime(message.time))+\"\\n\\t\\t\\t\\t\\t\\t\")])]),_c('div',[_c('span',{staticClass:\"close-tooltip tooltipped tooltipped-w\",attrs:{\"aria-label\":\"Close\"}},[_c('button',{staticClass:\"msg-hide\",attrs:{\"aria-label\":\"Hide this mention\"},on:{\"click\":function($event){return _vm.hideMention(message)}}})])])]),_c('div',{staticClass:\"content\",attrs:{\"dir\":\"auto\"}},[_c('ParsedMessage',{attrs:{\"network\":null,\"message\":message}})],1)])]})],2)]):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<div id=\"viewport\" :class=\"viewportClasses\" role=\"tablist\">\n\t\t<Sidebar v-if=\"$store.state.appLoaded\" :overlay=\"$refs.overlay\" />\n\t\t<div id=\"sidebar-overlay\" ref=\"overlay\" @click=\"$store.commit('sidebarOpen', false)\" />\n\t\t<router-view ref=\"window\"></router-view>\n\t\t<Mentions />\n\t\t<ImageViewer ref=\"imageViewer\" />\n\t\t<ContextMenu ref=\"contextMenu\" />\n\t\t<ConfirmDialog ref=\"confirmDialog\" />\n\t\t<div id=\"upload-overlay\"></div>\n\t</div>\n</template>\n\n<script>\nconst constants = require(\"../js/constants\");\nimport eventbus from \"../js/eventbus\";\nimport Mousetrap from \"mousetrap\";\nimport throttle from \"lodash/throttle\";\nimport storage from \"../js/localStorage\";\nimport isIgnoredKeybind from \"../js/helpers/isIgnoredKeybind\";\n\nimport Sidebar from \"./Sidebar.vue\";\nimport ImageViewer from \"./ImageViewer.vue\";\nimport ContextMenu from \"./ContextMenu.vue\";\nimport ConfirmDialog from \"./ConfirmDialog.vue\";\nimport Mentions from \"./Mentions.vue\";\n\nexport default {\n\tname: \"App\",\n\tcomponents: {\n\t\tSidebar,\n\t\tImageViewer,\n\t\tContextMenu,\n\t\tConfirmDialog,\n\t\tMentions,\n\t},\n\tcomputed: {\n\t\tviewportClasses() {\n\t\t\treturn {\n\t\t\t\tnotified: this.$store.getters.highlightCount > 0,\n\t\t\t\t\"menu-open\": this.$store.state.appLoaded && this.$store.state.sidebarOpen,\n\t\t\t\t\"menu-dragging\": this.$store.state.sidebarDragging,\n\t\t\t\t\"userlist-open\": this.$store.state.userlistOpen,\n\t\t\t};\n\t\t},\n\t},\n\tcreated() {\n\t\tthis.prepareOpenStates();\n\t},\n\tmounted() {\n\t\tMousetrap.bind(\"esc\", this.escapeKey);\n\t\tMousetrap.bind(\"alt+u\", this.toggleUserList);\n\t\tMousetrap.bind(\"alt+s\", this.toggleSidebar);\n\n\t\t// Make a single throttled resize listener available to all components\n\t\tthis.debouncedResize = throttle(() => {\n\t\t\teventbus.emit(\"resize\");\n\t\t}, 100);\n\n\t\twindow.addEventListener(\"resize\", this.debouncedResize, {passive: true});\n\n\t\t// Emit a daychange event every time the day changes so date markers know when to update themselves\n\t\tconst emitDayChange = () => {\n\t\t\teventbus.emit(\"daychange\");\n\t\t\t// This should always be 24h later but re-computing exact value just in case\n\t\t\tthis.dayChangeTimeout = setTimeout(emitDayChange, this.msUntilNextDay());\n\t\t};\n\n\t\tthis.dayChangeTimeout = setTimeout(emitDayChange, this.msUntilNextDay());\n\t},\n\tbeforeDestroy() {\n\t\tMousetrap.unbind(\"esc\", this.escapeKey);\n\t\tMousetrap.unbind(\"alt+u\", this.toggleUserList);\n\t\tMousetrap.unbind(\"alt+s\", this.toggleSidebar);\n\n\t\twindow.removeEventListener(\"resize\", this.debouncedResize);\n\t\tclearTimeout(this.dayChangeTimeout);\n\t},\n\tmethods: {\n\t\tescapeKey() {\n\t\t\teventbus.emit(\"escapekey\");\n\t\t},\n\t\ttoggleSidebar(e) {\n\t\t\tif (isIgnoredKeybind(e)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tthis.$store.commit(\"toggleSidebar\");\n\n\t\t\treturn false;\n\t\t},\n\t\ttoggleUserList(e) {\n\t\t\tif (isIgnoredKeybind(e)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tthis.$store.commit(\"toggleUserlist\");\n\n\t\t\treturn false;\n\t\t},\n\t\tmsUntilNextDay() {\n\t\t\t// Compute how many milliseconds are remaining until the next day starts\n\t\t\tconst today = new Date();\n\t\t\tconst tommorow = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1);\n\n\t\t\treturn tommorow - today;\n\t\t},\n\t\tprepareOpenStates() {\n\t\t\tconst viewportWidth = window.innerWidth;\n\t\t\tlet isUserlistOpen = storage.get(\"thelounge.state.userlist\");\n\n\t\t\tif (viewportWidth > constants.mobileViewportPixels) {\n\t\t\t\tthis.$store.commit(\n\t\t\t\t\t\"sidebarOpen\",\n\t\t\t\t\tstorage.get(\"thelounge.state.sidebar\") !== \"false\"\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// If The Lounge is opened on a small screen (less than 1024px), and we don't have stored\n\t\t\t// user list state, close it by default\n\t\t\tif (viewportWidth >= 1024 && isUserlistOpen !== \"true\" && isUserlistOpen !== \"false\") {\n\t\t\t\tisUserlistOpen = \"true\";\n\t\t\t}\n\n\t\t\tthis.$store.commit(\"userlistOpen\", isUserlistOpen === \"true\");\n\t\t},\n\t},\n};\n</script>\n","import mod from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/babel-loader/lib/index.js??ref--2!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=4969ecf8&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:_vm.viewportClasses,attrs:{\"id\":\"viewport\",\"role\":\"tablist\"}},[(_vm.$store.state.appLoaded)?_c('Sidebar',{attrs:{\"overlay\":_vm.$refs.overlay}}):_vm._e(),_c('div',{ref:\"overlay\",attrs:{\"id\":\"sidebar-overlay\"},on:{\"click\":function($event){return _vm.$store.commit('sidebarOpen', false)}}}),_c('router-view',{ref:\"window\"}),_c('Mentions'),_c('ImageViewer',{ref:\"imageViewer\"}),_c('ContextMenu',{ref:\"contextMenu\"}),_c('ConfirmDialog',{ref:\"confirmDialog\"}),_c('div',{attrs:{\"id\":\"upload-overlay\"}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import store from \"../store\";\nimport socket from \"../socket\";\n\nsocket.on(\"disconnect\", handleDisconnect);\nsocket.on(\"connect_error\", handleDisconnect);\nsocket.on(\"error\", handleDisconnect);\n\nsocket.on(\"reconnecting\", function (attempt) {\n\tstore.commit(\"currentUserVisibleError\", `Reconnecting… (attempt ${attempt})`);\n\tupdateLoadingMessage();\n});\n\nsocket.on(\"connecting\", function () {\n\tstore.commit(\"currentUserVisibleError\", \"Connecting…\");\n\tupdateLoadingMessage();\n});\n\nsocket.on(\"connect\", function () {\n\t// Clear send buffer when reconnecting, socket.io would emit these\n\t// immediately upon connection and it will have no effect, so we ensure\n\t// nothing is sent to the server that might have happened.\n\tsocket.sendBuffer = [];\n\n\tstore.commit(\"currentUserVisibleError\", \"Finalizing connection…\");\n\tupdateLoadingMessage();\n});\n\nfunction handleDisconnect(data) {\n\tconst message = data.message || data;\n\n\tstore.commit(\"isConnected\", false);\n\n\tif (!socket.io.reconnection()) {\n\t\tstore.commit(\n\t\t\t\"currentUserVisibleError\",\n\t\t\t`Disconnected from the server (${message}), The Lounge does not reconnect in public mode.`\n\t\t);\n\t\tupdateLoadingMessage();\n\t\treturn;\n\t}\n\n\tstore.commit(\"currentUserVisibleError\", `Waiting to reconnect… (${message})`);\n\tupdateLoadingMessage();\n\n\t// If the server shuts down, socket.io skips reconnection\n\t// and we have to manually call connect to start the process\n\t// However, do not reconnect if TL client manually closed the connection\n\tif (socket.io.skipReconnect && message !== \"io client disconnect\") {\n\t\trequestIdleCallback(() => socket.connect(), 2000);\n\t}\n}\n\nfunction requestIdleCallback(callback, timeout) {\n\tif (window.requestIdleCallback) {\n\t\t// During an idle period the user agent will run idle callbacks in FIFO order\n\t\t// until either the idle period ends or there are no more idle callbacks eligible to be run.\n\t\twindow.requestIdleCallback(callback, {timeout});\n\t} else {\n\t\tcallback();\n\t}\n}\n\nfunction updateLoadingMessage() {\n\tconst loading = document.getElementById(\"loading-page-message\");\n\n\tif (loading) {\n\t\tloading.textContent = store.state.currentUserVisibleError;\n\t}\n}\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport storage from \"../localStorage\";\nimport {router, navigate} from \"../router\";\nimport store from \"../store\";\nimport location from \"../location\";\nlet lastServerHash = null;\n\nsocket.on(\"auth:success\", function () {\n\tstore.commit(\"currentUserVisibleError\", \"Loading messages…\");\n\tupdateLoadingMessage();\n});\n\nsocket.on(\"auth:failed\", function () {\n\tstorage.remove(\"token\");\n\n\tif (store.state.appLoaded) {\n\t\treturn reloadPage(\"Authentication failed, reloading…\");\n\t}\n\n\tshowSignIn();\n});\n\nsocket.on(\"auth:start\", function (serverHash) {\n\t// If we reconnected and serverHash differs, that means the server restarted\n\t// And we will reload the page to grab the latest version\n\tif (lastServerHash && serverHash !== lastServerHash) {\n\t\treturn reloadPage(\"Server restarted, reloading…\");\n\t}\n\n\tlastServerHash = serverHash;\n\n\tconst user = storage.get(\"user\");\n\tconst token = storage.get(\"token\");\n\tconst doFastAuth = user && token;\n\n\t// If we reconnect and no longer have a stored token, reload the page\n\tif (store.state.appLoaded && !doFastAuth) {\n\t\treturn reloadPage(\"Authentication failed, reloading…\");\n\t}\n\n\t// If we have user and token stored, perform auth without showing sign-in first\n\tif (doFastAuth) {\n\t\tstore.commit(\"currentUserVisibleError\", \"Authorizing…\");\n\t\tupdateLoadingMessage();\n\n\t\tlet lastMessage = -1;\n\n\t\tfor (const network of store.state.networks) {\n\t\t\tfor (const chan of network.channels) {\n\t\t\t\tif (chan.messages.length > 0) {\n\t\t\t\t\tconst id = chan.messages[chan.messages.length - 1].id;\n\n\t\t\t\t\tif (lastMessage < id) {\n\t\t\t\t\t\tlastMessage = id;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst openChannel =\n\t\t\t(store.state.activeChannel && store.state.activeChannel.channel.id) || null;\n\n\t\tsocket.emit(\"auth:perform\", {\n\t\t\tuser,\n\t\t\ttoken,\n\t\t\tlastMessage,\n\t\t\topenChannel,\n\t\t\thasConfig: store.state.serverConfiguration !== null,\n\t\t});\n\t} else {\n\t\tshowSignIn();\n\t}\n});\n\nfunction showSignIn() {\n\t// TODO: this flashes grey background because it takes a little time for vue to mount signin\n\tif (window.g_TheLoungeRemoveLoading) {\n\t\twindow.g_TheLoungeRemoveLoading();\n\t}\n\n\tif (router.currentRoute.name !== \"SignIn\") {\n\t\tnavigate(\"SignIn\");\n\t}\n}\n\nfunction reloadPage(message) {\n\tsocket.disconnect();\n\tstore.commit(\"currentUserVisibleError\", message);\n\tlocation.reload(true);\n}\n\nfunction updateLoadingMessage() {\n\tconst loading = document.getElementById(\"loading-page-message\");\n\n\tif (loading) {\n\t\tloading.textContent = store.state.currentUserVisibleError;\n\t}\n}\n","const constants = require(\"../constants\");\nimport socket from \"../socket\";\n\nsocket.on(\"commands\", function (commands) {\n\tif (commands) {\n\t\tconstants.commands = commands;\n\t}\n});\n","\"use strict\";\n\nimport Vue from \"vue\";\nimport socket from \"../socket\";\nimport storage from \"../localStorage\";\nimport {router, switchToChannel, navigate} from \"../router\";\nimport store from \"../store\";\nimport parseIrcUri from \"../helpers/parseIrcUri\";\n\nsocket.on(\"init\", function (data) {\n\tstore.commit(\"networks\", mergeNetworkData(data.networks));\n\tstore.commit(\"isConnected\", true);\n\tstore.commit(\"currentUserVisibleError\", null);\n\n\tif (data.token) {\n\t\tstorage.set(\"token\", data.token);\n\t}\n\n\tif (!store.state.appLoaded) {\n\t\tstore.commit(\"appLoaded\");\n\n\t\tsocket.emit(\"setting:get\");\n\n\t\tif (window.g_TheLoungeRemoveLoading) {\n\t\t\twindow.g_TheLoungeRemoveLoading();\n\t\t}\n\n\t\tVue.nextTick(() => {\n\t\t\t// If we handled query parameters like irc:// links or just general\n\t\t\t// connect parameters in public mode, then nothing to do here\n\t\t\tif (!handleQueryParams()) {\n\t\t\t\t// If we are on an unknown route or still on SignIn component\n\t\t\t\t// then we can open last known channel on server, or Connect window if none\n\t\t\t\tif (!router.currentRoute.name || router.currentRoute.name === \"SignIn\") {\n\t\t\t\t\tconst channel = store.getters.findChannel(data.active);\n\n\t\t\t\t\tif (channel) {\n\t\t\t\t\t\tswitchToChannel(channel.channel);\n\t\t\t\t\t} else if (store.state.networks.length > 0) {\n\t\t\t\t\t\t// Server is telling us to open a channel that does not exist\n\t\t\t\t\t\t// For example, it can be unset if you first open the page after server start\n\t\t\t\t\t\tswitchToChannel(store.state.networks[0].channels[0]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnavigate(\"Connect\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n});\n\nfunction mergeNetworkData(newNetworks) {\n\tconst collapsedNetworks = new Set(JSON.parse(storage.get(\"thelounge.networks.collapsed\")));\n\n\tfor (let n = 0; n < newNetworks.length; n++) {\n\t\tconst network = newNetworks[n];\n\t\tconst currentNetwork = store.getters.findNetwork(network.uuid);\n\n\t\t// If this network is new, set some default variables and initalize channel variables\n\t\tif (!currentNetwork) {\n\t\t\tnetwork.isJoinChannelShown = false;\n\t\t\tnetwork.isCollapsed = collapsedNetworks.has(network.uuid);\n\t\t\tnetwork.channels.forEach(store.getters.initChannel);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Merge received network object into existing network object on the client\n\t\t// so the object reference stays the same (e.g. for currentChannel state)\n\t\tfor (const key in network) {\n\t\t\tif (!Object.prototype.hasOwnProperty.call(network, key)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Channels require extra care to be merged correctly\n\t\t\tif (key === \"channels\") {\n\t\t\t\tcurrentNetwork.channels = mergeChannelData(\n\t\t\t\t\tcurrentNetwork.channels,\n\t\t\t\t\tnetwork.channels\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tcurrentNetwork[key] = network[key];\n\t\t\t}\n\t\t}\n\n\t\tnewNetworks[n] = currentNetwork;\n\t}\n\n\treturn newNetworks;\n}\n\nfunction mergeChannelData(oldChannels, newChannels) {\n\tfor (let c = 0; c < newChannels.length; c++) {\n\t\tconst channel = newChannels[c];\n\t\tconst currentChannel = oldChannels.find((chan) => chan.id === channel.id);\n\n\t\t// This is a new channel that was joined while client was disconnected, initialize it\n\t\tif (!currentChannel) {\n\t\t\tstore.getters.initChannel(channel);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Merge received channel object into existing currentChannel\n\t\t// so the object references are exactly the same (e.g. in store.state.activeChannel)\n\t\tfor (const key in channel) {\n\t\t\tif (!Object.prototype.hasOwnProperty.call(channel, key)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Server sends an empty users array, client requests it whenever needed\n\t\t\tif (key === \"users\") {\n\t\t\t\tif (channel.type === \"channel\") {\n\t\t\t\t\tif (\n\t\t\t\t\t\tstore.state.activeChannel &&\n\t\t\t\t\t\tstore.state.activeChannel.channel === currentChannel\n\t\t\t\t\t) {\n\t\t\t\t\t\t// For currently open channel, request the user list straight away\n\t\t\t\t\t\tsocket.emit(\"names\", {\n\t\t\t\t\t\t\ttarget: channel.id,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// For all other channels, mark the user list as outdated\n\t\t\t\t\t\t// so an update will be requested whenever user switches to these channels\n\t\t\t\t\t\tcurrentChannel.usersOutdated = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Server sends total count of messages in memory, we compare it to amount of messages\n\t\t\t// on the client, and decide whether theres more messages to load from server\n\t\t\tif (key === \"totalMessages\") {\n\t\t\t\tcurrentChannel.moreHistoryAvailable =\n\t\t\t\t\tchannel.totalMessages > currentChannel.messages.length;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Reconnection only sends new messages, so merge it on the client\n\t\t\t// Only concat if server sent us less than 100 messages so we don't introduce gaps\n\t\t\tif (key === \"messages\" && currentChannel.messages && channel.messages.length < 100) {\n\t\t\t\tcurrentChannel.messages = currentChannel.messages.concat(channel.messages);\n\t\t\t} else {\n\t\t\t\tcurrentChannel[key] = channel[key];\n\t\t\t}\n\t\t}\n\n\t\tnewChannels[c] = currentChannel;\n\t}\n\n\treturn newChannels;\n}\n\nfunction handleQueryParams() {\n\tif (!(\"URLSearchParams\" in window)) {\n\t\treturn false;\n\t}\n\n\tconst params = new URLSearchParams(document.location.search);\n\n\tconst cleanParams = () => {\n\t\t// Remove query parameters from url without reloading the page\n\t\tconst cleanUri = window.location.origin + window.location.pathname + window.location.hash;\n\t\twindow.history.replaceState({}, document.title, cleanUri);\n\t};\n\n\tif (params.has(\"uri\")) {\n\t\t// Set default connection settings from IRC protocol links\n\t\tconst uri = params.get(\"uri\");\n\t\tconst queryParams = parseIrcUri(uri);\n\n\t\tcleanParams();\n\t\trouter.push({name: \"Connect\", query: queryParams});\n\n\t\treturn true;\n\t} else if (document.body.classList.contains(\"public\") && document.location.search) {\n\t\t// Set default connection settings from url params\n\t\tconst queryParams = Object.fromEntries(params.entries());\n\n\t\tcleanParams();\n\t\trouter.push({name: \"Connect\", query: queryParams});\n\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n","\"use strict\";\n\nexport default (stringUri) => {\n\tconst data = {};\n\n\ttry {\n\t\t// https://tools.ietf.org/html/draft-butcher-irc-url-04\n\t\tconst uri = new URL(stringUri);\n\n\t\t// Replace protocol with a \"special protocol\" (that's what it's called in WHATWG spec)\n\t\t// So that the uri can be properly parsed\n\t\tif (uri.protocol === \"irc:\") {\n\t\t\turi.protocol = \"http:\";\n\n\t\t\tif (!uri.port) {\n\t\t\t\turi.port = 6667;\n\t\t\t}\n\n\t\t\tdata.tls = false;\n\t\t} else if (uri.protocol === \"ircs:\") {\n\t\t\turi.protocol = \"https:\";\n\n\t\t\tif (!uri.port) {\n\t\t\t\turi.port = 6697;\n\t\t\t}\n\n\t\t\tdata.tls = true;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!uri.hostname) {\n\t\t\treturn {};\n\t\t}\n\n\t\tdata.host = data.name = uri.hostname;\n\t\tdata.port = uri.port;\n\n\t\tlet channel = \"\";\n\n\t\tif (uri.pathname.length > 1) {\n\t\t\tchannel = uri.pathname.substr(1); // Remove slash\n\t\t}\n\n\t\tif (uri.hash.length > 1) {\n\t\t\tchannel += uri.hash;\n\t\t}\n\n\t\t// We don't split channels or append # here because the connect window takes care of that\n\t\tdata.join = channel;\n\t} catch (e) {\n\t\t// do nothing on invalid uri\n\t}\n\n\treturn data;\n};\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\nimport {switchToChannel} from \"../router\";\n\nsocket.on(\"join\", function (data) {\n\tstore.getters.initChannel(data.chan);\n\n\tconst network = store.getters.findNetwork(data.network);\n\n\tif (!network) {\n\t\treturn;\n\t}\n\n\tnetwork.channels.splice(data.index || -1, 0, data.chan);\n\n\t// Queries do not automatically focus, unless the user did a whois\n\tif (data.chan.type === \"query\" && !data.shouldOpen) {\n\t\treturn;\n\t}\n\n\tswitchToChannel(store.getters.findChannel(data.chan.id).channel);\n});\n","\"use strict\";\n\nimport Vue from \"vue\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\nsocket.on(\"more\", function (data) {\n\tconst channel = store.getters.findChannel(data.chan);\n\n\tif (!channel) {\n\t\treturn;\n\t}\n\n\tchannel.channel.moreHistoryAvailable =\n\t\tdata.totalMessages > channel.channel.messages.length + data.messages.length;\n\tchannel.channel.messages.unshift(...data.messages);\n\n\tVue.nextTick(() => {\n\t\tchannel.channel.historyLoading = false;\n\t});\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport cleanIrcMessage from \"../helpers/ircmessageparser/cleanIrcMessage\";\nimport store from \"../store\";\nimport {switchToChannel} from \"../router\";\n\nlet pop;\n\ntry {\n\tpop = new Audio();\n\tpop.src = \"audio/pop.wav\";\n} catch (e) {\n\tpop = {\n\t\tplay() {},\n\t};\n}\n\nsocket.on(\"msg\", function (data) {\n\tconst receivingChannel = store.getters.findChannel(data.chan);\n\n\tif (!receivingChannel) {\n\t\treturn;\n\t}\n\n\tlet channel = receivingChannel.channel;\n\tlet isActiveChannel =\n\t\tstore.state.activeChannel && store.state.activeChannel.channel === channel;\n\n\t// Display received notices and errors in currently active channel.\n\t// Reloading the page will put them back into the lobby window.\n\tif (data.msg.showInActive) {\n\t\t// We only want to put errors/notices in active channel if they arrive on the same network\n\t\tif (\n\t\t\tstore.state.activeChannel &&\n\t\t\tstore.state.activeChannel.network === receivingChannel.network\n\t\t) {\n\t\t\tchannel = store.state.activeChannel.channel;\n\n\t\t\t// Do not update unread/highlight counters for this channel\n\t\t\t// as we are putting this message in the active channel\n\t\t\tisActiveChannel = true;\n\n\t\t\tif (data.chan === channel.id) {\n\t\t\t\t// If active channel is the intended channel for this message,\n\t\t\t\t// remove the showInActive flag\n\t\t\t\tdelete data.msg.showInActive;\n\t\t\t} else {\n\t\t\t\tdata.chan = channel.id;\n\t\t\t}\n\t\t} else {\n\t\t\tdelete data.msg.showInActive;\n\t\t}\n\t}\n\n\t// Do not set unread counter for channel if it is currently active on this client\n\t// It may increase on the server before it processes channel open event from this client\n\tif (!isActiveChannel) {\n\t\tif (typeof data.highlight !== \"undefined\") {\n\t\t\tchannel.highlight = data.highlight;\n\t\t}\n\n\t\tif (typeof data.unread !== \"undefined\") {\n\t\t\tchannel.unread = data.unread;\n\t\t}\n\t}\n\n\tchannel.messages.push(data.msg);\n\n\tif (data.msg.self) {\n\t\tchannel.firstUnread = data.msg.id;\n\t} else {\n\t\tnotifyMessage(data.chan, channel, store.state.activeChannel, data.msg);\n\t}\n\n\tlet messageLimit = 0;\n\n\tif (!isActiveChannel) {\n\t\t// If message arrives in non active channel, keep only 100 messages\n\t\tmessageLimit = 100;\n\t} else if (channel.scrolledToBottom) {\n\t\t// If message arrives in active channel, keep 1500 messages if scroll is currently at the bottom\n\t\t// One history load may load up to 1000 messages at once if condendesed or hidden events are enabled\n\t\tmessageLimit = 1500;\n\t}\n\n\tif (messageLimit > 0 && channel.messages.length > messageLimit) {\n\t\tchannel.messages.splice(0, channel.messages.length - messageLimit);\n\t\tchannel.moreHistoryAvailable = true;\n\t}\n\n\tif (channel.type === \"channel\") {\n\t\tupdateUserList(channel, data.msg);\n\t}\n});\n\nfunction notifyMessage(targetId, channel, activeChannel, msg) {\n\tif (msg.highlight || (store.state.settings.notifyAllMessages && msg.type === \"message\")) {\n\t\tif (!document.hasFocus() || !activeChannel || activeChannel.channel !== channel) {\n\t\t\tif (store.state.settings.notification) {\n\t\t\t\ttry {\n\t\t\t\t\tpop.play();\n\t\t\t\t} catch (exception) {\n\t\t\t\t\t// On mobile, sounds can not be played without user interaction.\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tstore.state.settings.desktopNotifications &&\n\t\t\t\t\"Notification\" in window &&\n\t\t\t\tNotification.permission === \"granted\"\n\t\t\t) {\n\t\t\t\tlet title;\n\t\t\t\tlet body;\n\n\t\t\t\tif (msg.type === \"invite\") {\n\t\t\t\t\ttitle = \"New channel invite:\";\n\t\t\t\t\tbody = msg.from.nick + \" invited you to \" + msg.channel;\n\t\t\t\t} else {\n\t\t\t\t\ttitle = msg.from.nick;\n\n\t\t\t\t\tif (channel.type !== \"query\") {\n\t\t\t\t\t\ttitle += ` (${channel.name})`;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (msg.type === \"message\") {\n\t\t\t\t\t\ttitle += \" says:\";\n\t\t\t\t\t}\n\n\t\t\t\t\tbody = cleanIrcMessage(msg.text);\n\t\t\t\t}\n\n\t\t\t\tconst timestamp = Date.parse(msg.time);\n\n\t\t\t\ttry {\n\t\t\t\t\tif (store.state.hasServiceWorker) {\n\t\t\t\t\t\tnavigator.serviceWorker.ready.then((registration) => {\n\t\t\t\t\t\t\tregistration.active.postMessage({\n\t\t\t\t\t\t\t\ttype: \"notification\",\n\t\t\t\t\t\t\t\tchanId: targetId,\n\t\t\t\t\t\t\t\ttimestamp: timestamp,\n\t\t\t\t\t\t\t\ttitle: title,\n\t\t\t\t\t\t\t\tbody: body,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst notify = new Notification(title, {\n\t\t\t\t\t\t\ttag: `chan-${targetId}`,\n\t\t\t\t\t\t\tbadge: \"img/icon-alerted-black-transparent-bg-72x72px.png\",\n\t\t\t\t\t\t\ticon: \"img/icon-alerted-grey-bg-192x192px.png\",\n\t\t\t\t\t\t\tbody: body,\n\t\t\t\t\t\t\ttimestamp: timestamp,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tnotify.addEventListener(\"click\", function () {\n\t\t\t\t\t\t\tthis.close();\n\t\t\t\t\t\t\twindow.focus();\n\n\t\t\t\t\t\t\tconst channelTarget = store.getters.findChannel(targetId);\n\n\t\t\t\t\t\t\tif (channelTarget) {\n\t\t\t\t\t\t\t\tswitchToChannel(channelTarget);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} catch (exception) {\n\t\t\t\t\t// `new Notification(...)` is not supported and should be silenced.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction updateUserList(channel, msg) {\n\tif (msg.type === \"message\" || msg.type === \"action\") {\n\t\tconst user = channel.users.find((u) => u.nick === msg.from.nick);\n\n\t\tif (user) {\n\t\t\tuser.lastMessage = new Date(msg.time).getTime() || Date.now();\n\t\t}\n\t} else if (msg.type === \"quit\" || msg.type === \"part\") {\n\t\tconst idx = channel.users.findIndex((u) => u.nick === msg.from.nick);\n\n\t\tif (idx > -1) {\n\t\t\tchannel.users.splice(idx, 1);\n\t\t}\n\t} else if (msg.type === \"kick\") {\n\t\tconst idx = channel.users.findIndex((u) => u.nick === msg.target.nick);\n\n\t\tif (idx > -1) {\n\t\t\tchannel.users.splice(idx, 1);\n\t\t}\n\t}\n}\n","\"use strict\";\n\nimport Vue from \"vue\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\nsocket.on(\"msg:preview\", function (data) {\n\tconst {channel} = store.getters.findChannel(data.chan);\n\tconst message = channel.messages.find((m) => m.id === data.id);\n\n\tif (!message) {\n\t\treturn;\n\t}\n\n\tconst previewIndex = message.previews.findIndex((m) => m.link === data.preview.link);\n\n\tif (previewIndex > -1) {\n\t\tVue.set(message.previews, previewIndex, data.preview);\n\t}\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\nimport {switchToChannel} from \"../router\";\n\nsocket.on(\"msg:special\", function (data) {\n\tconst channel = store.getters.findChannel(data.chan);\n\tchannel.channel.data = data.data;\n\tswitchToChannel(channel.channel);\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\nsocket.on(\"names\", function (data) {\n\tconst channel = store.getters.findChannel(data.id);\n\n\tif (channel) {\n\t\tchannel.channel.users = data.users;\n\t}\n});\n","\"use strict\";\n\nimport Vue from \"vue\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\nimport {switchToChannel} from \"../router\";\n\nsocket.on(\"network\", function (data) {\n\tconst network = data.networks[0];\n\n\tnetwork.isJoinChannelShown = false;\n\tnetwork.isCollapsed = false;\n\tnetwork.channels.forEach(store.getters.initChannel);\n\n\tstore.commit(\"networks\", [...store.state.networks, network]);\n\n\t// Open last channel specified in `join`\n\tswitchToChannel(network.channels[network.channels.length - 1]);\n});\n\nsocket.on(\"network:options\", function (data) {\n\tconst network = store.getters.findNetwork(data.network);\n\n\tif (network) {\n\t\tnetwork.serverOptions = data.serverOptions;\n\t}\n});\n\nsocket.on(\"network:status\", function (data) {\n\tconst network = store.getters.findNetwork(data.network);\n\n\tif (!network) {\n\t\treturn;\n\t}\n\n\tnetwork.status.connected = data.connected;\n\tnetwork.status.secure = data.secure;\n\n\tif (!data.connected) {\n\t\tnetwork.channels.forEach((channel) => {\n\t\t\tchannel.users = [];\n\t\t\tchannel.state = 0;\n\t\t});\n\t}\n});\n\nsocket.on(\"channel:state\", function (data) {\n\tconst channel = store.getters.findChannel(data.chan);\n\n\tif (channel) {\n\t\tchannel.channel.state = data.state;\n\t}\n});\n\nsocket.on(\"network:info\", function (data) {\n\tconst network = store.getters.findNetwork(data.uuid);\n\n\tif (!network) {\n\t\treturn;\n\t}\n\n\tfor (const key in data) {\n\t\tVue.set(network, key, data[key]);\n\t}\n});\n\nsocket.on(\"network:name\", function (data) {\n\tconst network = store.getters.findNetwork(data.uuid);\n\tnetwork.name = network.channels[0].name = data.name;\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\nsocket.on(\"nick\", function (data) {\n\tconst network = store.getters.findNetwork(data.network);\n\n\tif (network) {\n\t\tnetwork.nick = data.nick;\n\t}\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\n// Sync unread badge and marker when other clients open a channel\nsocket.on(\"open\", function (id) {\n\tif (id < 1) {\n\t\treturn;\n\t}\n\n\t// Don't do anything if the channel is active on this client\n\tif (store.state.activeChannel && store.state.activeChannel.channel.id === id) {\n\t\treturn;\n\t}\n\n\t// Clear the unread badge\n\tconst channel = store.getters.findChannel(id);\n\n\tif (channel) {\n\t\tchannel.channel.highlight = 0;\n\t\tchannel.channel.unread = 0;\n\n\t\tif (channel.channel.messages.length > 0) {\n\t\t\tchannel.channel.firstUnread =\n\t\t\t\tchannel.channel.messages[channel.channel.messages.length - 1].id;\n\t\t}\n\t}\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\nimport {switchToChannel} from \"../router\";\n\nsocket.on(\"part\", function (data) {\n\t// When parting from the active channel/query, jump to the network's lobby\n\tif (store.state.activeChannel && store.state.activeChannel.channel.id === data.chan) {\n\t\tswitchToChannel(store.state.activeChannel.network.channels[0]);\n\t}\n\n\tconst channel = store.getters.findChannel(data.chan);\n\n\tif (channel) {\n\t\tchannel.network.channels.splice(\n\t\t\tchannel.network.channels.findIndex((c) => c.id === data.chan),\n\t\t\t1\n\t\t);\n\t}\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport {switchToChannel, navigate} from \"../router\";\nimport store from \"../store\";\n\nsocket.on(\"quit\", function (data) {\n\t// If we're in a channel, and it's on the network that is being removed,\n\t// then open another channel window\n\tconst isCurrentNetworkBeingRemoved =\n\t\tstore.state.activeChannel && store.state.activeChannel.network.uuid === data.network;\n\n\tstore.commit(\"removeNetwork\", data.network);\n\n\tif (!isCurrentNetworkBeingRemoved) {\n\t\treturn;\n\t}\n\n\tif (store.state.networks.length > 0) {\n\t\tswitchToChannel(store.state.networks[0].channels[0]);\n\t} else {\n\t\tnavigate(\"Connect\");\n\t}\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\nsocket.on(\"sync_sort\", function (data) {\n\tconst order = data.order;\n\n\tswitch (data.type) {\n\t\tcase \"networks\":\n\t\t\tstore.commit(\"sortNetworks\", (a, b) => order.indexOf(a.uuid) - order.indexOf(b.uuid));\n\n\t\t\tbreak;\n\n\t\tcase \"channels\": {\n\t\t\tconst network = store.getters.findNetwork(data.target);\n\n\t\t\tif (!network) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tnetwork.channels.sort((a, b) => order.indexOf(a.id) - order.indexOf(b.id));\n\n\t\t\tbreak;\n\t\t}\n\t}\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\nsocket.on(\"topic\", function (data) {\n\tconst channel = store.getters.findChannel(data.chan);\n\n\tif (channel) {\n\t\tchannel.channel.topic = data.topic;\n\t}\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\nsocket.on(\"users\", function (data) {\n\tif (store.state.activeChannel && store.state.activeChannel.channel.id === data.chan) {\n\t\treturn socket.emit(\"names\", {\n\t\t\ttarget: data.chan,\n\t\t});\n\t}\n\n\tconst channel = store.getters.findChannel(data.chan);\n\n\tif (channel) {\n\t\tchannel.channel.usersOutdated = true;\n\t}\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport Auth from \"../auth\";\n\nsocket.on(\"sign-out\", function () {\n\tAuth.signout();\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\nsocket.on(\"sessions:list\", function (data) {\n\tdata.sort((a, b) => b.lastUse - a.lastUse);\n\tstore.commit(\"sessions\", data);\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport upload from \"../upload\";\nimport store from \"../store\";\n\nsocket.once(\"configuration\", function (data) {\n\tstore.commit(\"serverConfiguration\", data);\n\n\t// 'theme' setting depends on serverConfiguration.themes so\n\t// settings cannot be applied before this point\n\tstore.dispatch(\"settings/applyAll\");\n\n\tif (data.fileUpload) {\n\t\tupload.initialize();\n\t}\n\n\t// If localStorage contains a theme that does not exist on this server, switch\n\t// back to its default theme.\n\tconst currentTheme = data.themes.find((t) => t.name === store.state.settings.theme);\n\n\tif (currentTheme === undefined) {\n\t\tstore.dispatch(\"settings/update\", {name: \"theme\", value: data.defaultTheme, sync: true});\n\t} else if (currentTheme.themeColor) {\n\t\tdocument.querySelector('meta[name=\"theme-color\"]').content = currentTheme.themeColor;\n\t}\n\n\tif (document.body.classList.contains(\"public\")) {\n\t\twindow.addEventListener(\"beforeunload\", (e) => {\n\t\t\te.preventDefault();\n\t\t\te.returnValue = \"Are you sure you want to navigate away from this page?\";\n\t\t});\n\t}\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\nsocket.on(\"changelog\", function (data) {\n\tstore.commit(\"versionData\", data);\n\tstore.commit(\"versionDataExpired\", false);\n\n\tlet status;\n\n\tif (data.latest) {\n\t\tstatus = \"new-version\";\n\t} else if (data.packages) {\n\t\tstatus = \"new-packages\";\n\t} else if (data.current.changelog) {\n\t\tstatus = \"up-to-date\";\n\t} else {\n\t\tstatus = \"error\";\n\t}\n\n\tstore.commit(\"versionStatus\", status);\n\n\t// When there is a button to refresh the checker available, display it when\n\t// data is expired. Before that, server would return same information anyway.\n\tif (data.expiresAt) {\n\t\tconst expires = data.expiresAt - Date.now();\n\n\t\tif (expires > 0) {\n\t\t\tsetTimeout(() => store.commit(\"versionDataExpired\", true), expires);\n\t\t} else {\n\t\t\tstore.commit(\"versionDataExpired\", true);\n\t\t}\n\t}\n});\n\nsocket.on(\"changelog:newversion\", () => {\n\tstore.state.serverConfiguration.isUpdateAvailable = true;\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\nsocket.on(\"setting:new\", function (data) {\n\tconst name = data.name;\n\tconst value = data.value;\n\tstore.dispatch(\"settings/update\", {name, value, sync: false});\n});\n\nsocket.on(\"setting:all\", function (settings) {\n\tconst serverHasSettings = Object.keys(settings).length > 0;\n\n\tstore.commit(\"serverHasSettings\", serverHasSettings);\n\n\tif (serverHasSettings) {\n\t\tfor (const name in settings) {\n\t\t\tstore.dispatch(\"settings/update\", {name, value: settings[name], sync: false});\n\t\t}\n\t} else {\n\t\tstore.dispatch(\"settings/syncAll\");\n\t}\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\nsocket.on(\"history:clear\", function (data) {\n\tconst {channel} = store.getters.findChannel(data.target);\n\n\tchannel.messages = [];\n\tchannel.unread = 0;\n\tchannel.highlight = 0;\n\tchannel.firstUnread = 0;\n\tchannel.moreHistoryAvailable = false;\n});\n","\"use strict\";\n\nimport socket from \"../socket\";\nimport store from \"../store\";\n\nsocket.on(\"mentions:list\", function (data) {\n\tstore.commit(\"mentions\", data);\n});\n","\"use strict\";\n\nimport Mousetrap from \"mousetrap\";\n\nimport store from \"./store\";\nimport {switchToChannel} from \"./router\";\nimport isChannelCollapsed from \"./helpers/isChannelCollapsed\";\nimport isIgnoredKeybind from \"./helpers/isIgnoredKeybind\";\n\n// Switch to the next/previous window in the channel list.\nMousetrap.bind([\"alt+up\", \"alt+down\"], function (e, keys) {\n\tif (isIgnoredKeybind(e)) {\n\t\treturn true;\n\t}\n\n\tif (store.state.networks.length === 0) {\n\t\treturn false;\n\t}\n\n\tconst direction = keys.split(\"+\").pop() === \"up\" ? -1 : 1;\n\tconst flatChannels = [];\n\tlet index = -1;\n\n\tfor (const network of store.state.networks) {\n\t\tfor (const channel of network.channels) {\n\t\t\tif (isChannelCollapsed(network, channel)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tindex === -1 &&\n\t\t\t\tstore.state.activeChannel &&\n\t\t\t\tstore.state.activeChannel.channel === channel\n\t\t\t) {\n\t\t\t\tindex = flatChannels.length;\n\t\t\t}\n\n\t\t\tflatChannels.push(channel);\n\t\t}\n\t}\n\n\t// Circular array, and a modulo bug workaround because in JS it stays negative\n\tconst length = flatChannels.length;\n\tindex = (((index + direction) % length) + length) % length;\n\n\tjumpToChannel(flatChannels[index]);\n\n\treturn false;\n});\n\n// Switch to the next/previous lobby in the channel list\nMousetrap.bind([\"alt+shift+up\", \"alt+shift+down\"], function (e, keys) {\n\tif (isIgnoredKeybind(e)) {\n\t\treturn true;\n\t}\n\n\tconst length = store.state.networks.length;\n\n\tif (length === 0) {\n\t\treturn false;\n\t}\n\n\tconst direction = keys.split(\"+\").pop() === \"up\" ? -1 : 1;\n\tlet index = 0;\n\n\t// If we're in another window, jump to first lobby\n\tif (store.state.activeChannel) {\n\t\tindex = store.state.networks.findIndex((n) => n === store.state.activeChannel.network);\n\n\t\t// If we're in a channel, and it's not the lobby, jump to lobby of this network when going up\n\t\tif (direction !== -1 || store.state.activeChannel.channel.type === \"lobby\") {\n\t\t\tindex = (((index + direction) % length) + length) % length;\n\t\t}\n\t}\n\n\tjumpToChannel(store.state.networks[index].channels[0]);\n\n\treturn false;\n});\n\n// Jump to the first window with a highlight in it, or the first with unread\n// activity if there are none with highlights.\nMousetrap.bind([\"alt+a\"], function (e) {\n\tif (isIgnoredKeybind(e)) {\n\t\treturn true;\n\t}\n\n\tlet targetChannel;\n\n\touter_loop: for (const network of store.state.networks) {\n\t\tfor (const chan of network.channels) {\n\t\t\tif (chan.highlight) {\n\t\t\t\ttargetChannel = chan;\n\t\t\t\tbreak outer_loop;\n\t\t\t}\n\n\t\t\tif (chan.unread && !targetChannel) {\n\t\t\t\ttargetChannel = chan;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (targetChannel) {\n\t\tjumpToChannel(targetChannel);\n\t}\n\n\treturn false;\n});\n\nfunction jumpToChannel(targetChannel) {\n\tswitchToChannel(targetChannel);\n\n\tconst element = document.querySelector(\n\t\t`#sidebar .channel-list-item[aria-controls=\"#chan-${targetChannel.id}\"]`\n\t);\n\n\tif (element) {\n\t\tscrollIntoViewNicely(element);\n\t}\n}\n\n// Ignored keys which should not automatically focus the input bar\nconst ignoredKeys = {\n\t8: true, // Backspace\n\t9: true, // Tab\n\t12: true, // Clear\n\t16: true, // Shift\n\t17: true, // Control\n\t18: true, // Alt\n\t19: true, // Pause\n\t20: true, // CapsLock\n\t27: true, // Escape\n\t35: true, // End\n\t36: true, // Home\n\t37: true, // ArrowLeft\n\t38: true, // ArrowUp\n\t39: true, // ArrowRight\n\t40: true, // ArrowDown\n\t45: true, // Insert\n\t46: true, // Delete\n\t112: true, // F1\n\t113: true, // F2\n\t114: true, // F3\n\t115: true, // F4\n\t116: true, // F5\n\t117: true, // F6\n\t118: true, // F7\n\t119: true, // F8\n\t120: true, // F9\n\t121: true, // F10\n\t122: true, // F11\n\t123: true, // F12\n\t144: true, // NumLock\n\t145: true, // ScrollLock\n\t224: true, // Meta\n};\n\ndocument.addEventListener(\"keydown\", (e) => {\n\t// Ignore any key that uses alt modifier\n\t// Ignore keys defined above\n\tif (e.altKey || ignoredKeys[e.which]) {\n\t\treturn;\n\t}\n\n\t// Ignore all ctrl keys except for ctrl+v to allow pasting\n\tif ((e.ctrlKey || e.metaKey) && e.which !== 86) {\n\t\treturn;\n\t}\n\n\t// Redirect pagedown/pageup keys to messages container so it scrolls\n\tif (e.which === 33 || e.which === 34) {\n\t\tconst chat = document.querySelector(\".window .chat-content .chat\");\n\n\t\tif (chat) {\n\t\t\tchat.focus();\n\t\t}\n\n\t\treturn;\n\t}\n\n\tconst tagName = e.target.tagName;\n\n\t// Ignore if we're already typing into <input> or <textarea>\n\tif (tagName === \"INPUT\" || tagName === \"TEXTAREA\") {\n\t\treturn;\n\t}\n\n\tconst input = document.getElementById(\"input\");\n\n\tif (!input) {\n\t\treturn;\n\t}\n\n\tinput.focus();\n\n\t// On enter, focus the input but do not propagate the event\n\t// This way, a new line is not inserted\n\tif (e.which === 13) {\n\t\te.preventDefault();\n\t}\n});\n\nfunction scrollIntoViewNicely(el) {\n\t// Ideally this would use behavior: \"smooth\", but that does not consistently work in e.g. Chrome\n\t// https://github.com/iamdustan/smoothscroll/issues/28#issuecomment-364061459\n\tel.scrollIntoView({block: \"center\", inline: \"nearest\"});\n}\n","\"use strict\";\n\nconst constants = require(\"./constants\");\n\nimport \"../css/style.css\";\nimport Vue from \"vue\";\nimport store from \"./store\";\nimport App from \"../components/App.vue\";\nimport storage from \"./localStorage\";\nimport {router, navigate} from \"./router\";\nimport socket from \"./socket\";\nimport eventbus from \"./eventbus\";\n\nimport \"./socket-events\";\nimport \"./webpush\";\nimport \"./keybinds\";\n\nconst favicon = document.getElementById(\"favicon\");\nconst faviconNormal = favicon.getAttribute(\"href\");\nconst faviconAlerted = favicon.dataset.other;\n\nnew Vue({\n\tel: \"#viewport\",\n\trouter,\n\tmounted() {\n\t\tsocket.open();\n\t},\n\tmethods: {\n\t\tswitchToChannel(channel) {\n\t\t\tnavigate(\"RoutedChat\", {id: channel.id});\n\t\t},\n\t\tcloseChannel(channel) {\n\t\t\tif (channel.type === \"lobby\") {\n\t\t\t\teventbus.emit(\n\t\t\t\t\t\"confirm-dialog\",\n\t\t\t\t\t{\n\t\t\t\t\t\ttitle: \"Remove network\",\n\t\t\t\t\t\ttext: `Are you sure you want to quit and remove ${channel.name}? This cannot be undone.`,\n\t\t\t\t\t\tbutton: \"Remove network\",\n\t\t\t\t\t},\n\t\t\t\t\t(result) => {\n\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchannel.closed = true;\n\t\t\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\t\t\ttarget: Number(channel.id),\n\t\t\t\t\t\t\ttext: \"/quit\",\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tchannel.closed = true;\n\n\t\t\tsocket.emit(\"input\", {\n\t\t\t\ttarget: Number(channel.id),\n\t\t\t\ttext: \"/close\",\n\t\t\t});\n\t\t},\n\t},\n\trender(createElement) {\n\t\treturn createElement(App, {\n\t\t\tref: \"app\",\n\t\t\tprops: this,\n\t\t});\n\t},\n\tstore,\n});\n\nstore.watch(\n\t(state) => state.sidebarOpen,\n\t(sidebarOpen) => {\n\t\tif (window.innerWidth > constants.mobileViewportPixels) {\n\t\t\tstorage.set(\"thelounge.state.sidebar\", sidebarOpen);\n\t\t\teventbus.emit(\"resize\");\n\t\t}\n\t}\n);\n\nstore.watch(\n\t(state) => state.userlistOpen,\n\t(userlistOpen) => {\n\t\tstorage.set(\"thelounge.state.userlist\", userlistOpen);\n\t\teventbus.emit(\"resize\");\n\t}\n);\n\nstore.watch(\n\t(_, getters) => getters.title,\n\t(title) => {\n\t\tdocument.title = title;\n\t}\n);\n\n// Toggles the favicon to red when there are unread notifications\nstore.watch(\n\t(_, getters) => getters.highlightCount,\n\t(highlightCount) => {\n\t\tfavicon.setAttribute(\"href\", highlightCount > 0 ? faviconAlerted : faviconNormal);\n\n\t\tif (navigator.setAppBadge) {\n\t\t\tif (highlightCount > 0) {\n\t\t\t\tnavigator.setAppBadge(highlightCount);\n\t\t\t} else {\n\t\t\t\tnavigator.clearAppBadge();\n\t\t\t}\n\t\t}\n\t}\n);\n\nVue.config.errorHandler = function (e) {\n\tstore.commit(\"currentUserVisibleError\", `Vue error: ${e.message}`);\n\tconsole.error(e); // eslint-disable-line\n};\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[(_vm.message.self)?_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"message\":_vm.message}}):[_c('Username',{attrs:{\"user\":_vm.message.from}}),_vm._v(\"\\n\\t\\tis back\\n\\t\")]],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./back.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./back.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<ParsedMessage v-if=\"message.self\" :network=\"network\" :message=\"message\" />\n\t\t<template v-else>\n\t\t\t<Username :user=\"message.from\" />\n\t\t\tis back\n\t\t</template>\n\t</span>\n</template>\n\n<script>\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeBack\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./back.vue?vue&type=template&id=8dc5a218&\"\nimport script from \"./back.vue?vue&type=script&lang=js&\"\nexport * from \"./back.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_c('Username',{attrs:{\"user\":_vm.message.from}}),_vm._v(\"\\n\\thas kicked\\n\\t\"),_c('Username',{attrs:{\"user\":_vm.message.target}}),(_vm.message.text)?_c('i',{staticClass:\"part-reason\"},[_vm._v(\" (\"),_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"message\":_vm.message}}),_vm._v(\")\")],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./kick.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./kick.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from\" />\n\t\thas kicked\n\t\t<Username :user=\"message.target\" />\n\t\t<i v-if=\"message.text\" class=\"part-reason\"\n\t\t\t>&#32;(<ParsedMessage :network=\"network\" :message=\"message\" />)</i\n\t\t>\n\t</span>\n</template>\n\n<script>\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeKick\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./kick.vue?vue&type=template&id=76b1c2a8&\"\nimport script from \"./kick.vue?vue&type=script&lang=js&\"\nexport * from \"./kick.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_vm._v(\"\\n\\tChannel mode is \"),_c('b',[_vm._v(_vm._s(_vm.message.text))])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./mode_channel.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./mode_channel.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\tChannel mode is <b>{{ message.text }}</b>\n\t</span>\n</template>\n\n<script>\nexport default {\n\tname: \"MessageChannelMode\",\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./mode_channel.vue?vue&type=template&id=415ba981&\"\nimport script from \"./mode_channel.vue?vue&type=script&lang=js&\"\nexport * from \"./mode_channel.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"message\":_vm.message,\"text\":_vm.errorMessage}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./error.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./error.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<ParsedMessage :network=\"network\" :message=\"message\" :text=\"errorMessage\" />\n\t</span>\n</template>\n\n<script>\nimport ParsedMessage from \"../ParsedMessage.vue\";\n\nexport default {\n\tname: \"MessageTypeError\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n\tcomputed: {\n\t\terrorMessage() {\n\t\t\tswitch (this.message.error) {\n\t\t\t\tcase \"bad_channel_key\":\n\t\t\t\t\treturn `Cannot join ${this.message.channel} - Bad channel key.`;\n\t\t\t\tcase \"banned_from_channel\":\n\t\t\t\t\treturn `Cannot join ${this.message.channel} - You have been banned from the channel.`;\n\t\t\t\tcase \"cannot_send_to_channel\":\n\t\t\t\t\treturn `Cannot send to channel ${this.message.channel}`;\n\t\t\t\tcase \"channel_is_full\":\n\t\t\t\t\treturn `Cannot join ${this.message.channel} - Channel is full.`;\n\t\t\t\tcase \"chanop_privs_needed\":\n\t\t\t\t\treturn \"Cannot perform action: You're not a channel operator.\";\n\t\t\t\tcase \"invite_only_channel\":\n\t\t\t\t\treturn `Cannot join ${this.message.channel} - Channel is invite only.`;\n\t\t\t\tcase \"no_such_nick\":\n\t\t\t\t\treturn `User ${this.message.nick} hasn't logged in or does not exist.`;\n\t\t\t\tcase \"not_on_channel\":\n\t\t\t\t\treturn \"Cannot perform action: You're not on the channel.\";\n\t\t\t\tcase \"password_mismatch\":\n\t\t\t\t\treturn \"Password mismatch.\";\n\t\t\t\tcase \"too_many_channels\":\n\t\t\t\t\treturn `Cannot join ${this.message.channel} - You've already reached the maximum number of channels allowed.`;\n\t\t\t\tcase \"unknown_command\":\n\t\t\t\t\treturn `Unknown command: ${this.message.command}`;\n\t\t\t\tcase \"user_not_in_channel\":\n\t\t\t\t\treturn `User ${this.message.nick} is not on the channel.`;\n\t\t\t\tcase \"user_on_channel\":\n\t\t\t\t\treturn `User ${this.message.nick} is already on the channel.`;\n\t\t\t\tdefault:\n\t\t\t\t\tif (this.message.reason) {\n\t\t\t\t\t\treturn `${this.message.reason} (${this.message.error})`;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this.message.error;\n\t\t\t}\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./error.vue?vue&type=template&id=2ef73a42&\"\nimport script from \"./error.vue?vue&type=script&lang=js&\"\nexport * from \"./error.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_c('Username',{attrs:{\"user\":_vm.message.from}}),_vm._v(\"\\n\\tsent a \"),_c('abbr',{attrs:{\"title\":\"Client-to-client protocol\"}},[_vm._v(\"CTCP\")]),_vm._v(\" request:\\n\\t\"),_c('span',{staticClass:\"ctcp-message\"},[_c('ParsedMessage',{attrs:{\"text\":_vm.message.ctcpMessage}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ctcp_request.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ctcp_request.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from\" />\n\t\tsent a <abbr title=\"Client-to-client protocol\">CTCP</abbr> request:\n\t\t<span class=\"ctcp-message\"><ParsedMessage :text=\"message.ctcpMessage\" /></span>\n\t</span>\n</template>\n\n<script>\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeRequestCTCP\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./ctcp_request.vue?vue&type=template&id=5c5fdfa2&\"\nimport script from \"./ctcp_request.vue?vue&type=script&lang=js&\"\nexport * from \"./ctcp_request.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_c('Username',{attrs:{\"user\":_vm.message.from}}),_vm._v(\" \\n\\t\"),_c('span',{staticClass:\"ctcp-message\"},[_c('ParsedMessage',{attrs:{\"text\":_vm.message.ctcpMessage}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ctcp.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ctcp.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from\" />&#32;\n\t\t<span class=\"ctcp-message\"><ParsedMessage :text=\"message.ctcpMessage\" /></span>\n\t</span>\n</template>\n\n<script>\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeCTCP\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./ctcp.vue?vue&type=template&id=08b5bbdd&\"\nimport script from \"./ctcp.vue?vue&type=script&lang=js&\"\nexport * from \"./ctcp.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_c('Username',{attrs:{\"user\":_vm.message.from}}),_vm._v(\"\\n\\thas changed\\n\\t\"),(_vm.message.new_ident)?_c('span',[_vm._v(\"username to \"),_c('b',[_vm._v(_vm._s(_vm.message.new_ident))])]):_vm._e(),(_vm.message.new_host)?_c('span',[_vm._v(\"hostname to \"),_c('i',{staticClass:\"hostmask\"},[_vm._v(_vm._s(_vm.message.new_host))])]):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./chghost.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./chghost.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from\" />\n\t\thas changed\n\t\t<span v-if=\"message.new_ident\"\n\t\t\t>username to <b>{{ message.new_ident }}</b></span\n\t\t>\n\t\t<span v-if=\"message.new_host\"\n\t\t\t>hostname to <i class=\"hostmask\">{{ message.new_host }}</i></span\n\t\t>\n\t</span>\n</template>\n\n<script>\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeChangeHost\",\n\tcomponents: {\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./chghost.vue?vue&type=template&id=2000d028&\"\nimport script from \"./chghost.vue?vue&type=script&lang=js&\"\nexport * from \"./chghost.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[(_vm.message.from && _vm.message.from.nick)?[_c('Username',{attrs:{\"user\":_vm.message.from}}),_vm._v(\" has changed the topic to:\\n\\t\")]:[_vm._v(\"The topic is: \")],(_vm.message.text)?_c('span',{staticClass:\"new-topic\"},[_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"message\":_vm.message}})],1):_vm._e()],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./topic.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./topic.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<template v-if=\"message.from && message.from.nick\"\n\t\t\t><Username :user=\"message.from\" /> has changed the topic to:\n\t\t</template>\n\t\t<template v-else>The topic is: </template>\n\t\t<span v-if=\"message.text\" class=\"new-topic\"\n\t\t\t><ParsedMessage :network=\"network\" :message=\"message\"\n\t\t/></span>\n\t</span>\n</template>\n\n<script>\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeTopic\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./topic.vue?vue&type=template&id=782a5996&\"\nimport script from \"./topic.vue?vue&type=script&lang=js&\"\nexport * from \"./topic.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_vm._v(\"\\n\\tTopic set by\\n\\t\"),_c('Username',{attrs:{\"user\":_vm.message.from}}),_vm._v(\"\\n\\ton \"+_vm._s(_vm.messageTimeLocale)+\"\\n\")],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./topic_set_by.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./topic_set_by.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\tTopic set by\n\t\t<Username :user=\"message.from\" />\n\t\ton {{ messageTimeLocale }}\n\t</span>\n</template>\n\n<script>\nimport localetime from \"../../js/helpers/localetime\";\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeTopicSetBy\",\n\tcomponents: {\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n\tcomputed: {\n\t\tmessageTimeLocale() {\n\t\t\treturn localetime(this.message.when);\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./topic_set_by.vue?vue&type=template&id=35106a66&\"\nimport script from \"./topic_set_by.vue?vue&type=script&lang=js&\"\nexport * from \"./topic_set_by.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_c('Username',{attrs:{\"user\":_vm.message.from}}),_c('i',{staticClass:\"hostmask\"},[_vm._v(\" (\"+_vm._s(_vm.message.hostmask)+\")\")]),_vm._v(\"\\n\\thas joined the channel\\n\")],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./join.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./join.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from\" />\n\t\t<i class=\"hostmask\"> ({{ message.hostmask }})</i>\n\t\thas joined the channel\n\t</span>\n</template>\n\n<script>\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeJoin\",\n\tcomponents: {\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./join.vue?vue&type=template&id=2dbf2229&\"\nimport script from \"./join.vue?vue&type=script&lang=js&\"\nexport * from \"./join.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_c('Username',{attrs:{\"user\":_vm.message.from}}),_vm._v(\"\\n\\tinvited\\n\\t\"),(_vm.message.invitedYou)?_c('span',[_vm._v(\"you\")]):_c('Username',{attrs:{\"user\":_vm.message.target}}),_vm._v(\"\\n\\tto \"),_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"text\":_vm.message.channel}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./invite.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./invite.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from\" />\n\t\tinvited\n\t\t<span v-if=\"message.invitedYou\">you</span>\n\t\t<Username v-else :user=\"message.target\" />\n\t\tto <ParsedMessage :network=\"network\" :text=\"message.channel\" />\n\t</span>\n</template>\n\n<script>\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeInvite\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./invite.vue?vue&type=template&id=6b808b9a&\"\nimport script from \"./invite.vue?vue&type=script&lang=js&\"\nexport * from \"./invite.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_c('Username',{attrs:{\"user\":_vm.message.from}}),_c('i',{staticClass:\"hostmask\"},[_vm._v(\" (\"+_vm._s(_vm.message.hostmask)+\")\")]),_vm._v(\" has quit\\n\\t\"),(_vm.message.text)?_c('i',{staticClass:\"quit-reason\"},[_vm._v(\"(\"),_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"message\":_vm.message}}),_vm._v(\")\")],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./quit.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./quit.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from\" />\n\t\t<i class=\"hostmask\"> ({{ message.hostmask }})</i> has quit\n\t\t<i v-if=\"message.text\" class=\"quit-reason\"\n\t\t\t>(<ParsedMessage :network=\"network\" :message=\"message\" />)</i\n\t\t>\n\t</span>\n</template>\n\n<script>\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeQuit\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./quit.vue?vue&type=template&id=53fcaa48&\"\nimport script from \"./quit.vue?vue&type=script&lang=js&\"\nexport * from \"./quit.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_c('Username',{attrs:{\"user\":_vm.message.from}}),_c('i',{staticClass:\"hostmask\"},[_vm._v(\" (\"+_vm._s(_vm.message.hostmask)+\")\")]),_vm._v(\" has left the channel\\n\\t\"),(_vm.message.text)?_c('i',{staticClass:\"part-reason\"},[_vm._v(\"(\"),_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"message\":_vm.message}}),_vm._v(\")\")],1):_vm._e()],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./part.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./part.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from\" />\n\t\t<i class=\"hostmask\"> ({{ message.hostmask }})</i> has left the channel\n\t\t<i v-if=\"message.text\" class=\"part-reason\"\n\t\t\t>(<ParsedMessage :network=\"network\" :message=\"message\" />)</i\n\t\t>\n\t</span>\n</template>\n\n<script>\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypePart\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./part.vue?vue&type=template&id=770a3e80&\"\nimport script from \"./part.vue?vue&type=script&lang=js&\"\nexport * from \"./part.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_c('Username',{attrs:{\"user\":_vm.message.from}}),_vm._v(\"\\n\\tis now known as\\n\\t\"),_c('Username',{attrs:{\"user\":{nick: _vm.message.new_nick, mode: _vm.message.from.mode}}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./nick.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./nick.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from\" />\n\t\tis now known as\n\t\t<Username :user=\"{nick: message.new_nick, mode: message.from.mode}\" />\n\t</span>\n</template>\n\n<script>\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeNick\",\n\tcomponents: {\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./nick.vue?vue&type=template&id=0fc5b659&\"\nimport script from \"./nick.vue?vue&type=script&lang=js&\"\nexport * from \"./nick.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_vm._v(_vm._s(_vm.message.text))])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./raw.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./raw.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">{{ message.text }}</span>\n</template>\n\n<script>\nexport default {\n\tname: \"MessageTypeRaw\",\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./raw.vue?vue&type=template&id=7f8e938c&\"\nimport script from \"./raw.vue?vue&type=script&lang=js&\"\nexport * from \"./raw.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_c('span',{staticClass:\"text\"},[_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"text\":_vm.cleanText}})],1)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./monospace_block.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./monospace_block.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<span class=\"text\"><ParsedMessage :network=\"network\" :text=\"cleanText\" /></span>\n\t</span>\n</template>\n\n<script>\nimport ParsedMessage from \"../ParsedMessage.vue\";\n\nexport default {\n\tname: \"MessageTypeMonospaceBlock\",\n\tcomponents: {\n\t\tParsedMessage,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n\tcomputed: {\n\t\tcleanText() {\n\t\t\tlet lines = this.message.text.split(\"\\n\");\n\n\t\t\t// If all non-empty lines of the MOTD start with a hyphen (which is common\n\t\t\t// across MOTDs), remove all the leading hyphens.\n\t\t\tif (lines.every((line) => line === \"\" || line[0] === \"-\")) {\n\t\t\t\tlines = lines.map((line) => line.substr(2));\n\t\t\t}\n\n\t\t\t// Remove empty lines around the MOTD (but not within it)\n\t\t\treturn lines\n\t\t\t\t.map((line) => line.replace(/\\s*$/, \"\"))\n\t\t\t\t.join(\"\\n\")\n\t\t\t\t.replace(/^[\\r\\n]+|[\\r\\n]+$/g, \"\");\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./monospace_block.vue?vue&type=template&id=36bc97c1&\"\nimport script from \"./monospace_block.vue?vue&type=script&lang=js&\"\nexport * from \"./monospace_block.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_c('Username',{attrs:{\"user\":_vm.message.from}}),_vm._v(\"\\n\\tsets mode\\n\\t\"),_c('ParsedMessage',{attrs:{\"message\":_vm.message}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./mode.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./mode.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from\" />\n\t\tsets mode\n\t\t<ParsedMessage :message=\"message\" />\n\t</span>\n</template>\n\n<script>\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeMode\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./mode.vue?vue&type=template&id=1e88a6e3&\"\nimport script from \"./mode.vue?vue&type=script&lang=js&\"\nexport * from \"./mode.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[_c('p',[_c('Username',{attrs:{\"user\":{nick: _vm.message.whois.nick}}}),(_vm.message.whois.whowas)?_c('span',[_vm._v(\" is offline, last information:\")]):_vm._e()],1),_c('dl',{staticClass:\"whois\"},[(_vm.message.whois.account)?[_c('dt',[_vm._v(\"Logged in as:\")]),_c('dd',[_vm._v(_vm._s(_vm.message.whois.account))])]:_vm._e(),_c('dt',[_vm._v(\"Host mask:\")]),_c('dd',{staticClass:\"hostmask\"},[_vm._v(_vm._s(_vm.message.whois.ident)+\"@\"+_vm._s(_vm.message.whois.hostname))]),(_vm.message.whois.actual_hostname)?[_c('dt',[_vm._v(\"Actual host:\")]),_c('dd',{staticClass:\"hostmask\"},[_c('a',{attrs:{\"href\":'https://ipinfo.io/' + _vm.message.whois.actual_ip,\"target\":\"_blank\",\"rel\":\"noopener\"}},[_vm._v(_vm._s(_vm.message.whois.actual_ip))]),(_vm.message.whois.actual_hostname != _vm.message.whois.actual_ip)?_c('i',[_vm._v(\"\\n\\t\\t\\t\\t\\t(\"+_vm._s(_vm.message.whois.actual_hostname)+\")\")]):_vm._e()])]:_vm._e(),(_vm.message.whois.real_name)?[_c('dt',[_vm._v(\"Real name:\")]),_c('dd',[_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"text\":_vm.message.whois.real_name}})],1)]:_vm._e(),(_vm.message.whois.registered_nick)?[_c('dt',[_vm._v(\"Registered nick:\")]),_c('dd',[_vm._v(_vm._s(_vm.message.whois.registered_nick))])]:_vm._e(),(_vm.message.whois.channels)?[_c('dt',[_vm._v(\"Channels:\")]),_c('dd',[_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"text\":_vm.message.whois.channels}})],1)]:_vm._e(),(_vm.message.whois.modes)?[_c('dt',[_vm._v(\"Modes:\")]),_c('dd',[_vm._v(_vm._s(_vm.message.whois.modes))])]:_vm._e(),(_vm.message.whois.special)?[_vm._l((_vm.message.whois.special),function(special){return [_c('dt',{key:special},[_vm._v(\"Special:\")]),_c('dd',{key:special},[_vm._v(_vm._s(special))])]})]:_vm._e(),(_vm.message.whois.operator)?[_c('dt',[_vm._v(\"Operator:\")]),_c('dd',[_vm._v(_vm._s(_vm.message.whois.operator))])]:_vm._e(),(_vm.message.whois.helpop)?[_c('dt',[_vm._v(\"Available for help:\")]),_c('dd',[_vm._v(\"Yes\")])]:_vm._e(),(_vm.message.whois.bot)?[_c('dt',[_vm._v(\"Is a bot:\")]),_c('dd',[_vm._v(\"Yes\")])]:_vm._e(),(_vm.message.whois.away)?[_c('dt',[_vm._v(\"Away:\")]),_c('dd',[_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"text\":_vm.message.whois.away}})],1)]:_vm._e(),(_vm.message.whois.secure)?[_c('dt',[_vm._v(\"Secure connection:\")]),_c('dd',[_vm._v(\"Yes\")])]:_vm._e(),(_vm.message.whois.certfp)?[_c('dt',[_vm._v(\"Certificate:\")]),_c('dd',[_vm._v(_vm._s(_vm.message.whois.certfp))])]:_vm._e(),(_vm.message.whois.server)?[_c('dt',[_vm._v(\"Connected to:\")]),_c('dd',[_vm._v(\"\\n\\t\\t\\t\\t\"+_vm._s(_vm.message.whois.server)+\" \"),_c('i',[_vm._v(\"(\"+_vm._s(_vm.message.whois.server_info)+\")\")])])]:_vm._e(),(_vm.message.whois.logonTime)?[_c('dt',[_vm._v(\"Connected at:\")]),_c('dd',[_vm._v(_vm._s(_vm.localetime(_vm.message.whois.logonTime)))])]:_vm._e(),(_vm.message.whois.idle)?[_c('dt',[_vm._v(\"Idle since:\")]),_c('dd',[_vm._v(_vm._s(_vm.localetime(_vm.message.whois.idleTime)))])]:_vm._e()],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./whois.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./whois.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<p>\n\t\t\t<Username :user=\"{nick: message.whois.nick}\" />\n\t\t\t<span v-if=\"message.whois.whowas\"> is offline, last information:</span>\n\t\t</p>\n\n\t\t<dl class=\"whois\">\n\t\t\t<template v-if=\"message.whois.account\">\n\t\t\t\t<dt>Logged in as:</dt>\n\t\t\t\t<dd>{{ message.whois.account }}</dd>\n\t\t\t</template>\n\n\t\t\t<dt>Host mask:</dt>\n\t\t\t<dd class=\"hostmask\">{{ message.whois.ident }}@{{ message.whois.hostname }}</dd>\n\n\t\t\t<template v-if=\"message.whois.actual_hostname\">\n\t\t\t\t<dt>Actual host:</dt>\n\t\t\t\t<dd class=\"hostmask\">\n\t\t\t\t\t<a\n\t\t\t\t\t\t:href=\"'https://ipinfo.io/' + message.whois.actual_ip\"\n\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\trel=\"noopener\"\n\t\t\t\t\t\t>{{ message.whois.actual_ip }}</a\n\t\t\t\t\t>\n\t\t\t\t\t<i v-if=\"message.whois.actual_hostname != message.whois.actual_ip\">\n\t\t\t\t\t\t({{ message.whois.actual_hostname }})</i\n\t\t\t\t\t>\n\t\t\t\t</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois.real_name\">\n\t\t\t\t<dt>Real name:</dt>\n\t\t\t\t<dd><ParsedMessage :network=\"network\" :text=\"message.whois.real_name\" /></dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois.registered_nick\">\n\t\t\t\t<dt>Registered nick:</dt>\n\t\t\t\t<dd>{{ message.whois.registered_nick }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois.channels\">\n\t\t\t\t<dt>Channels:</dt>\n\t\t\t\t<dd><ParsedMessage :network=\"network\" :text=\"message.whois.channels\" /></dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois.modes\">\n\t\t\t\t<dt>Modes:</dt>\n\t\t\t\t<dd>{{ message.whois.modes }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois.special\">\n\t\t\t\t<template v-for=\"special in message.whois.special\">\n\t\t\t\t\t<dt :key=\"special\">Special:</dt>\n\t\t\t\t\t<dd :key=\"special\">{{ special }}</dd>\n\t\t\t\t</template>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois.operator\">\n\t\t\t\t<dt>Operator:</dt>\n\t\t\t\t<dd>{{ message.whois.operator }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois.helpop\">\n\t\t\t\t<dt>Available for help:</dt>\n\t\t\t\t<dd>Yes</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois.bot\">\n\t\t\t\t<dt>Is a bot:</dt>\n\t\t\t\t<dd>Yes</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois.away\">\n\t\t\t\t<dt>Away:</dt>\n\t\t\t\t<dd><ParsedMessage :network=\"network\" :text=\"message.whois.away\" /></dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois.secure\">\n\t\t\t\t<dt>Secure connection:</dt>\n\t\t\t\t<dd>Yes</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois.certfp\">\n\t\t\t\t<dt>Certificate:</dt>\n\t\t\t\t<dd>{{ message.whois.certfp }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois.server\">\n\t\t\t\t<dt>Connected to:</dt>\n\t\t\t\t<dd>\n\t\t\t\t\t{{ message.whois.server }} <i>({{ message.whois.server_info }})</i>\n\t\t\t\t</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois.logonTime\">\n\t\t\t\t<dt>Connected at:</dt>\n\t\t\t\t<dd>{{ localetime(message.whois.logonTime) }}</dd>\n\t\t\t</template>\n\n\t\t\t<template v-if=\"message.whois.idle\">\n\t\t\t\t<dt>Idle since:</dt>\n\t\t\t\t<dd>{{ localetime(message.whois.idleTime) }}</dd>\n\t\t\t</template>\n\t\t</dl>\n\t</span>\n</template>\n\n<script>\nimport localetime from \"../../js/helpers/localetime\";\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeWhois\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n\tmethods: {\n\t\tlocaletime(date) {\n\t\t\treturn localetime(date);\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./whois.vue?vue&type=template&id=6c103ef6&\"\nimport script from \"./whois.vue?vue&type=script&lang=js&\"\nexport * from \"./whois.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('span',{staticClass:\"content\"},[(_vm.message.self)?_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"message\":_vm.message}}):[_c('Username',{attrs:{\"user\":_vm.message.from}}),_vm._v(\"\\n\\t\\tis away\\n\\t\\t\"),_c('i',{staticClass:\"away-message\"},[_vm._v(\"(\"),_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"message\":_vm.message}}),_vm._v(\")\")],1)]],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./away.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./away.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<ParsedMessage v-if=\"message.self\" :network=\"network\" :message=\"message\" />\n\t\t<template v-else>\n\t\t\t<Username :user=\"message.from\" />\n\t\t\tis away\n\t\t\t<i class=\"away-message\">(<ParsedMessage :network=\"network\" :message=\"message\" />)</i>\n\t\t</template>\n\t</span>\n</template>\n\n<script>\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeAway\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./away.vue?vue&type=template&id=85018528&\"\nimport script from \"./away.vue?vue&type=script&lang=js&\"\nexport * from \"./away.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports"],"sourceRoot":""}