1 line
664 KiB
Plaintext
1 line
664 KiB
Plaintext
{"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":"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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\" /> <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\"><</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 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> (<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\" /> \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":""} |