UNPKG

522 kBSource Map (JSON)View Raw
1{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./client/js/socket.js","webpack:///./client/components/Username.vue?c5ea","webpack:///./client/components/Username.vue?5bd4","webpack:///client/components/Username.vue","webpack:///./client/components/Username.vue","webpack:///client/components/ParsedMessage.vue","webpack:///./client/components/ParsedMessage.vue?0e82","webpack:///./client/components/ParsedMessage.vue","webpack:///./client/js/vue.js","webpack:///./client/js/utils.js","webpack:///./scripts/noop.js","webpack:///./client/js/localStorage.js","webpack:///./client/views/index.js","webpack:///./client/js/libs/handlebars/equal.js","webpack:///./client/views/reveal-password.tpl","webpack:///./client/components/MessageTypes/index.js","webpack:///./client/js/constants.js","webpack:///./client/js/webpush.js","webpack:///./client/js/autocompletion.js","webpack:///./client/js/options.js","webpack:///./client/js/libs/handlebars/colorClass.js","webpack:///./client/js/libs/handlebars/localetime.js","webpack:///./client/js/commands/index.js","webpack:///./client/js/upload.js","webpack:///./client/js/slideout.js","webpack:///./client/js/auth.js","webpack:///./client/js/lounge.js","webpack:///./client/js/libs/handlebars/parse.js","webpack:///./client/js/libs/handlebars/ircmessageparser/parseStyle.js","webpack:///./client/js/libs/handlebars/ircmessageparser/findChannels.js","webpack:///./client/js/libs/handlebars/ircmessageparser/findLinks.js","webpack:///./client/js/libs/handlebars/ircmessageparser/findEmoji.js","webpack:///./client/js/libs/handlebars/ircmessageparser/findNames.js","webpack:///./client/js/libs/handlebars/ircmessageparser/merge.js","webpack:///./client/js/libs/handlebars/ircmessageparser/anyIntersection.js","webpack:///./client/js/libs/handlebars/ircmessageparser/fill.js","webpack:///./client/js/clipboard.js","webpack:///./client/components/MessageTypes sync nonrecursive \\.vue$","webpack:///./client/js/renderPreview.js","webpack:///./client/views sync \\.tpl$","webpack:///./client/views/contextmenu_divider.tpl","webpack:///./client/views/contextmenu_item.tpl","webpack:///./client/views/image_viewer.tpl","webpack:///./client/views/session.tpl","webpack:///./client/views/version_checker.tpl","webpack:///./client/views/windows/changelog.tpl","webpack:///./client/views/windows/connect.tpl","webpack:///./client/views/windows/help.tpl","webpack:///./client/views/windows/settings.tpl","webpack:///./client/views/windows/sign_in.tpl","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/libs/handlebars/roundBadgeNumber.js","webpack:///./client/js/libs/handlebars/friendlysize.js","webpack:///./client/js/socket-events/index.js","webpack:///./client/js/socket-events/auth.js","webpack:///./client/js/socket-events/change_password.js","webpack:///./client/js/socket-events/commands.js","webpack:///./client/js/socket-events/init.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/libs/handlebars/ircmessageparser/cleanIrcMessage.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/location.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/contextMenuFactory.js","webpack:///./client/js/contextMenu.js","webpack:///./client/js/keybinds.js","webpack:///./client/components/App.vue?1d66","webpack:///./client/components/ChannelWrapper.vue?f321","webpack:///client/components/ChannelWrapper.vue","webpack:///./client/components/ChannelWrapper.vue","webpack:///./client/components/ChannelWrapper.vue?5af0","webpack:///client/components/NetworkLobby.vue","webpack:///./client/components/NetworkLobby.vue?ba11","webpack:///./client/components/NetworkLobby.vue","webpack:///./client/components/NetworkLobby.vue?3aea","webpack:///./client/components/Channel.vue?633d","webpack:///client/components/Channel.vue","webpack:///./client/components/Channel.vue","webpack:///./client/components/Channel.vue?f5f6","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?b2b2","webpack:///./client/components/NetworkList.vue","webpack:///./client/components/NetworkList.vue?88d9","webpack:///./client/components/LinkPreview.vue?bad0","webpack:///client/components/LinkPreview.vue","webpack:///./client/components/LinkPreview.vue","webpack:///./client/components/LinkPreview.vue?cd29","webpack:///client/components/Message.vue","webpack:///./client/components/Message.vue?e606","webpack:///./client/components/Message.vue","webpack:///./client/components/Message.vue?29d1","webpack:///client/components/MessageCondensed.vue","webpack:///./client/components/MessageCondensed.vue?6602","webpack:///./client/components/MessageCondensed.vue","webpack:///./client/components/MessageCondensed.vue?7e23","webpack:///client/components/DateMarker.vue","webpack:///./client/components/DateMarker.vue?d4fb","webpack:///./client/components/DateMarker.vue","webpack:///./client/components/DateMarker.vue?e09b","webpack:///client/components/MessageList.vue","webpack:///./client/components/MessageList.vue?08ce","webpack:///./client/components/MessageList.vue","webpack:///./client/components/MessageList.vue?7bfa","webpack:///client/components/ChatInput.vue","webpack:///./client/components/ChatInput.vue?aec6","webpack:///./client/components/ChatInput.vue","webpack:///./client/components/ChatInput.vue?399b","webpack:///./client/components/UsernameFiltered.vue?f317","webpack:///client/components/UsernameFiltered.vue","webpack:///./client/components/UsernameFiltered.vue","webpack:///./client/components/UsernameFiltered.vue?0939","webpack:///client/components/ChatUserList.vue","webpack:///./client/components/ChatUserList.vue?8e0a","webpack:///./client/components/ChatUserList.vue","webpack:///./client/components/ChatUserList.vue?071a","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?5807","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?f64b","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?4477","webpack:///client/components/Chat.vue","webpack:///./client/components/Chat.vue?e648","webpack:///./client/components/Chat.vue","webpack:///./client/components/Chat.vue?7689","webpack:///client/components/App.vue","webpack:///./client/components/App.vue?bf2c","webpack:///./client/components/App.vue","webpack:///./client/components/MessageTypes/kick.vue?69d1","webpack:///./client/components/MessageTypes/kick.vue?86c1","webpack:///client/components/MessageTypes/kick.vue","webpack:///./client/components/MessageTypes/kick.vue","webpack:///./client/components/LinkPreviewToggle.vue?5dab","webpack:///./client/components/LinkPreviewToggle.vue?77e2","webpack:///client/components/LinkPreviewToggle.vue","webpack:///./client/components/LinkPreviewToggle.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/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/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/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/topic.vue?1737","webpack:///./client/components/MessageTypes/topic.vue?4c2f","webpack:///client/components/MessageTypes/topic.vue","webpack:///./client/components/MessageTypes/topic.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/topic_set_by.vue?7b3f","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/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/whois.vue?1e3e","webpack:///./client/components/MessageTypes/whois.vue?3db8","webpack:///client/components/MessageTypes/whois.vue","webpack:///./client/components/MessageTypes/whois.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/ctcp_request.vue?b9dd","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/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/ctcp.vue?8eba","webpack:///./client/components/MessageTypes/ctcp.vue?6129","webpack:///client/components/MessageTypes/ctcp.vue","webpack:///./client/components/MessageTypes/ctcp.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/motd.vue?0024","webpack:///./client/components/MessageTypes/motd.vue?4071","webpack:///client/components/MessageTypes/motd.vue","webpack:///./client/components/MessageTypes/motd.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","1","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","$","require","socket","io","transports","document","body","path","location","pathname","autoConnect","reconnection","hasClass","vueApp","requestIdleCallback","handleDisconnect","message","isConnected","currentUserVisibleError","concat","text","skipReconnect","connect","on","attempt","sendBuffer","components_Usernamevue_type_script_lang_js_","props","user","active","Boolean","onHover","Function","methods","[object Object]","this","component","componentNormalizer","_vm","_h","$createElement","_self","_c","_g","class","$options","filters","colorClass","nick","attrs","data-name","role","mouseover","hover","_v","_s","__webpack_exports__","parse","components_ParsedMessagevue_type_script_lang_js_","functional","String","network","render","createElement","context","staticRenderFns","Vue","default","App","roundBadgeNumber","localetime","friendlysize","filter","el","activeChannel","appName","title","initialized","isAutoCompleting","isFileUploadEnabled","isNotified","networks","settings","syncSettings","advanced","autocomplete","nickPostfix","coloredNicks","desktopNotifications","highlights","links","motd","notification","notifyAllMessages","showSeconds","statusMessages","theme","getElementById","dataset","serverTheme","media","userStyles","mounted","nextTick","vueMounted","config","errorHandler","e","console","error","findChannel","id","channel","channels","initChannel","pendingMessage","inputHistoryPosition","inputHistory","historyLoading","scrolledToBottom","editTopic","type","usersOutdated","escape","viewport","mobileViewportPixels","findCurrentNetworkChan","toLowerCase","find","serverHash","confirmExit","onbeforeunload","scrollIntoViewNicely","scrollIntoView","block","inline","hasRoleInChannel","roles","channelID","attr","has","target","first","parent","is","join","move","array","old_index","new_index","k","undefined","closeChan","chan","cmd","server","html","confirm","emit","Number","css","transition","opacity","synchronizeNotifiedState","alertEventCount","highlight","updateTitle","hasAnyHighlights","newState","old","favicon","prop","toggleClass","toggleNotificationMarkers","togglePasswordField","elem","$this","input","closest","swapLabel","callback","timeout","element","altText","set","localStorage","setItem","getItem","remove","removeItem","clear","requireViews","keys","reduce","acc","tmp","substr","split","forEach","endsWith","a","b","opt","arguments","Error","toString","fn","inverse","Handlebars","template","compiler","main","container","depth0","helpers","partials","useData","substring","condensedTypes","condensedTypesQuery","colorCodeMap","commands","timeFormats","msgDefault","msgWithSeconds","storage","pushNotificationsButton","applicationServerKey","clientSubscribed","onPushButton","navigator","serviceWorker","ready","then","registration","pushManager","getSubscription","existingSubscription","unsubscribe","subscribe","urlBase64ToUint8Array","userVisibleOnly","subscription","rawKey","getKey","btoa","fromCharCode","Uint8Array","rawAuthSecret","authSecret","token","endpoint","p256dh","auth","successful","alternatePushButton","catch","err","end","show","base64String","base64","repeat","replace","rawData","atob","outputArray","charCodeAt","addEventListener","event","trigger","hasServiceWorker","configurePushNotifications","subscribedOnServer","initialize","protocol","hostname","hide","register","fuzzy","Mousetrap","Textcomplete","Textarea","emojiMap","constants","textcomplete","enabled","enable","inputRef","tabCount","lastMatch","currentMatches","detail","preventDefault","val","selectionStart","pop","completeNicks","position","newMatch","nicksStrategy","dispatchEvent","CustomEvent","editor","dropdown","className","placement","emojiStrategy","chanStrategy","commandStrategy","foregroundColorStrategy","backgroundColorStrategy","items","activate","disable","off","unbind","destroy","emojiSearchTerms","match","search","term","fuzzyGrep","string","original","index","map","test","word","words","completeChans","completeCommands","pre","post","rendered","parseInt","pair","isFuzzy","users","sort","lastMessage","u","me","otherUser","rawNicks","grep","w","indexOf","$windows","$settings","$theme","$userStyles","noCSSparamReg","$syncWarningOverride","$syncWarningBase","$forceSyncButton","$warningUnsupported","$warningBlocked","noSync","alwaysSync","defaultThemeColor","querySelector","content","userSettings","JSON","updateDesktopNotificationStatus","Notification","permission","applySetting","themeUrl","newTheme","themeColor","requestPermission","toggle","settingSetEmit","updateSetting","sync","stringify","includes","syncAllSettings","force","processSetting","save","originalEvent","$self","defaultClientButton","registerProtocolHandler","uri","origin","str","hash","moment","time","format","command","updateCursor","update","instance","init","xhr","fileQueue","overlay","uploadInput","uploadProgressbar","filesChanged","dragEnter","dragOver","dragLeave","drop","paste","uploadNextFileInQueue","relatedTarget","dataTransfer","types","classList","add","files","Array","from","item","kind","getAsFile","triggerUpload","clipboardData","handleResponse","wasQueueEmpty","file","maxFileSize","size","requestToken","setProgress","style","width","XMLHttpRequest","upload","percent","Math","floor","loaded","total","onreadystatechange","readyState","DONE","response","responseText","status","formData","FormData","append","open","send","url","insertUploadUrl","fullURL","URL","textbox","initStart","headToCursor","cursorToTail","textBeforeTail","selectionEnd","abort","setMaxFileSize","kb","menu","sidebarOverlay","touchStartPos","touchCurPos","touchStartTime","menuWidth","menuIsOpen","menuIsMoving","menuIsAbsolute","SlideoutMenu","onTouchStart","passive","state","touches","onTouchEnd","styles","getComputedStyle","parseFloat","screenX","Date","now","onTouchMove","touch","distX","distY","screenY","abs","devicePixelRatio","transform","diff","absDiff","removeEventListener","reload","slideoutMenu","contextMenuFactory","utils","sidebar","storeSidebarVisibility","$emit","outerWidth","isOpen","createContextMenu","getSelection","isCollapsed","currentTarget","platform","addClass","openWindow","pushState","replaceHistory","self","inSidebar","parents","lastChannel","messages","firstUnread","moreHistoryAvailable","unread","removeClass","$nextTick","clickTarget","history","replaceState","parseStyle","findChannels","findLinks","findEmoji","findNames","merge","LinkPreviewToggle","emojiModifiersRegex","styleFragments","cleanText","fragment","channelPrefixes","serverOptions","CHANTYPES","userModes","PREFIX","channelParts","linkParts","emojiParts","nameParts","parts","textPart","fragments","classes","bold","textColor","bgColor","italic","underline","strikethrough","monospace","hasData","hexColor","color","hexBgColor","createFragment","link","preview","previews","href","rel","tabindex","data-chan","emoji","emojiWithoutModifiers","aria-label","BOLD","COLOR","HEX_COLOR","RESET","REVERSE","ITALIC","UNDERLINE","STRIKETHROUGH","MONOSPACE","colorRx","hexColorRx","controlCodesRx","properties","colorCodes","start","resetStyle","emitFragment","processedText","fragmentStart","toUpperCase","prev","curr","lastEntry","every","escapeRegExp","userModePattern","channelPrefixPattern","channelPattern","channelRegExp","RegExp","exec","LinkifyIt","normalize","schema","linkify","tlds","commonSchemes","matches","lastIndex","emojiRegExp","nickRegExp","anyIntersection","fill","sortParts","textParts","some","fragStart","max","min","assign","existingEntries","textSegment","chat","selection","anchorNode","focusNode","range","getRangeAt","documentFragment","cloneContents","div","appendChild","selectAllChildren","setTimeout","removeChild","removeAllRanges","addRange","./away.vue","./back.vue","./chghost.vue","./ctcp.vue","./ctcp_request.vue","./invite.vue","./join.vue","./kick.vue","./mode.vue","./mode_channel.vue","./motd.vue","./nick.vue","./part.vue","./quit.vue","./raw.vue","./topic.vue","./topic_set_by.vue","./whois.vue","webpackContext","req","webpackContextResolve","code","resolve","templates","imageViewer","closeImageViewer","one","empty","previousImage","last","prevAll","nextImage","next","nextAll","image_viewer","image","hasPreviousImage","hasNextImage","openImageViewer","direction","./contextmenu_divider.tpl","./contextmenu_item.tpl","./image_viewer.tpl","./reveal-password.tpl","./session.tpl","./version_checker.tpl","./windows/changelog.tpl","./windows/connect.tpl","./windows/help.tpl","./windows/settings.tpl","./windows/sign_in.tpl","helper","escapeExpression","helperMissing","nullContext","stack1","alias1","alias2","alias4","action","program","noop","3","5","7","obj","lambda","alias3","8","10","lastUse","unless","current","agent","ip","__default","4","latest","version","prerelease","11","13","14","changelog","2","6","defaults","uuid","displayNetwork","lockNetwork","host","port","tls","rejectUnauthorized","16","18","username","20","each","21","23","useHexIp","password","invokePartial","decorators","realname","usePartial","gitCommit","displayName","9","ldapEnabled","12","themes","prefetch","./collapse.js","./expand.js","./index.js","./join.js","click","args","count","toFixed","sizes","log","fixedSize","pow","disconnect","login","windows","sign_in","form","values","serializeArray","success","msg","passwordForm","feedback","webpush","mergeChannelData","oldChannels","newChannels","currentChannel","previousActive","newNetworks","collapsedNetworks","Set","currentNetwork","net","isJoinChannelShown","mergeNetworkData","pushSubscription","viewportWidth","isUserlistOpen","g_LoungeErrorHandler","clientActive","serverActive","openCorrectChannel","shouldOpen","unshift","options","cleanIrcMessage","Audio","src","play","receivingChannel","isActiveChannel","showInActive","targetId","button","hasFocus","exception","timestamp","postMessage","chanId","notify","tag","badge","icon","focus","close","notifyMessage","messageLimit","getTime","matchFormatting","trim","previewIndex","findIndex","$set","connected","secure","newName","eq","order","topic","Auth","signout","connection","session","installPromptEvent","prompt","fileUpload","help","fileUploadMaxFileSize","currentTheme","handleFormSubmit","defaultTheme","usernameInput","lastValue","params","URLSearchParams","stringUri","decodeURIComponent","parseIrcUri","parseOverrideParams","requestIfNeeded","renderVersionChecker","version_checker","packages","expiresAt","evaluateSetting","ContextMenu","contextMenuActions","contextMenuItems","addContextMenuItem","opts","check","actionId","addContextDivider","divider","that","itemData","whois","addWhoisItem","contextMenuContainer","constructor","selectedElement","previousActiveElement","activeElement","contextMenu","contextmenu_divider","contextmenu_item","offset","menuHeight","outerHeight","left","top","pageX","pageY","innerWidth","innerHeight","positionContextMenu","showContextMenu","bindEvents","execute","clickItem","contextAction","trap","toArray","not","lobbies","siblings","targetchan","outer_loop","ignoredKeys","17","19","27","35","36","37","38","39","40","45","46","112","113","114","115","116","117","118","119","120","121","122","123","144","145","224","altKey","which","ctrlKey","metaKey","tagName","components_ChannelWrappervue_type_script_lang_js_","extra","ChannelWrapper","parted-channel","getAriaLabel","data-id","data-target","aria-controls","aria-selected","_t","_e","components_NetworkLobbyvue_type_script_lang_js_","components","computed","delete","getExpandLabel","NetworkLobby","active-channel","staticClass","aria-expanded","$event","stopPropagation","onCollapseClick","_f","joinChannelLabel","opened","components_Channelvue_type_script_lang_js_","Channel","components_JoinChannelvue_type_script_lang_js_","directives","inputChannel","inputPassword","channelToFind","existingChannel","socket_default","components_NetworkListvue_type_script_lang_js_","JoinChannel","method","keydown","_k","keyCode","submit","onSubmit","rawName","expression","placeholder","pattern","maxlength","required","domProps","composing","Draggable","vuedraggable_common_default","isCurrentlyInTouch","pointerType","moved","NetworkList","list","prevent-on-filter","handle","draggable","ghost-class","drag-class","group","change","onNetworkSort","onDragStart","onDragEnd","_l","collapsed","not-connected","not-secure","data-uuid","data-nick","is-join-channel-shown","toggleJoinChannel","onChannelSort","components_LinkPreviewvue_type_script_lang_js_","keepScrollPosition","showMoreButton","isContentShown","watch","updateShownState","onPreviewUpdate","$root","$on","handleResize","$off","canDisplay","onPreviewReady","thumb","$refs","offsetWidth","defaultState","shown","LinkPreview","ref","decoding","alt","onThumbnailError","load","head","moreButtonLabel","onMoreClick","preload","controls","canplay","mediaType","maxSize","MessageTypes_default","ParsedMessage","Username","components_Messagevue_type_script_lang_js_","Message","data-from","messageTime","param","isAction","_m","messageComponent","keep-scroll-position","MessageCondensedvue_type_script_lang_js_constants","components_MessageCondensedvue_type_script_lang_js_","part","quit","strings","MessageCondensed","closed","condensedText","DateMarkervue_type_script_lang_js_moment","components_DateMarkervue_type_script_lang_js_","hoursPassed","dayChange","$forceUpdate","calendar","sameDay","lastDay","lastWeek","sameElse","DateMarker","localeDate","data-label","friendlyDate","MessageListvue_type_script_lang_js_constants","clipboard","components_MessageListvue_type_script_lang_js_","condensed","lastCondensedContainer","historyObserver","unobserve","loadMoreButton","observe","IntersectionObserver","onLoadButtonObserved","root","jumpToBottom","handleScroll","unreadMarkerShown","previousMessage","condensedMessages","getDay","$el","msgId","lastId","entries","entry","isIntersecting","onShowMoreClick","isWaitingForNextTick","heightOld","scrollHeight","scrollTop","skipNextScrollEvent","offsetHeight","MessageList","disabled","aria-live","aria-relevant","copy","onCopy","shouldDisplayDateMarker","shouldDisplayUnreadMarker","linkPreviewToggle","onLinkPreviewToggle","ChatInputvue_type_script_lang_js_socket","wrapCursor","formattingHotkeys","mod+k","mod+b","mod+u","mod+i","mod+o","mod+s","mod+m","bracketWraps","\"","'","(","<","[","{","*","`","~","_","components_ChatInputvue_type_script_lang_js_","setInputSize","inputTrap","modifier","lineHeight","height","ceil","getInputPlaceholder","ChatInput","setPendingMessage","keypress","shiftKey","openFileUpload","multiple","components_UsernameFilteredvue_type_script_lang_js_","UsernameFiltered","innerHTML","modes","&","!","@","%","+","","components_ChatUserListvue_type_script_lang_js_","userSearchInput","activeUser","extract","groups","filteredUsers","getModeClass","userlist","rect","getBoundingClientRect","ev","MouseEvent","view","bubbles","cancelable","clientX","x","clientY","y","stopImmediatePropagation","currentIndex","scrollToActiveUser","ChatUserList","mouseleave","removeHoverUser","setUserSearchInput","navigateUserList","selectUser","on-hover","hoverUser","Special_ListBansvue_type_script_lang_js_","ListBans","ban","hostmask","banned_by","banned_at","Special_ListInvitesvue_type_script_lang_js_","ListInvites","invite","invited_by","invited_at","Special_ListChannelsvue_type_script_lang_js_","ListChannels","num_users","Special_ListIgnoredvue_type_script_lang_js_","ListIgnored","when","Chatvue_type_script_lang_js_socket","components_Chatvue_type_script_lang_js_","special","newTopic","Chat","hide-motd","colored-nicks","show-seconds","data-type","keyup","saveTopic","dblclick","specialComponent","scroll-down-shown","messageList","hideUserVisibleError","throttle","components_Appvue_type_script_lang_js_","debouncedResize","emitDayChange","dayChangeTimeout","msUntilNextDay","clearTimeout","isPublic","contains","today","getFullYear","getMonth","getDate","App_component","MessageTypes_kickvue_type_script_lang_js_","components_LinkPreviewTogglevue_type_script_lang_js_","$parent","ariaLabel","onClick","MessageTypes_rawvue_type_script_lang_js_","MessageTypes_backvue_type_script_lang_js_","MessageTypes_nickvue_type_script_lang_js_","new_nick","MessageTypes_mode_channelvue_type_script_lang_js_","MessageTypes_topicvue_type_script_lang_js_","MessageTypes_modevue_type_script_lang_js_","MessageTypes_topic_set_byvue_type_script_lang_js_","MessageTypes_chghostvue_type_script_lang_js_","new_ident","new_host","MessageTypes_whoisvue_type_script_lang_js_","account","ident","actual_ip","actual_hostname","real_name","registered_nick","operator","away","server_info","logonTime","idleTime","MessageTypes_partvue_type_script_lang_js_","MessageTypes_ctcp_requestvue_type_script_lang_js_","ctcpMessage","MessageTypes_joinvue_type_script_lang_js_","MessageTypes_invitevue_type_script_lang_js_","MessageTypes_ctcpvue_type_script_lang_js_","MessageTypes_quitvue_type_script_lang_js_","MessageTypes_motdvue_type_script_lang_js_","lines","line","MessageTypes_awayvue_type_script_lang_js_"],"mappings":"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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\t1: 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([63,2]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst io = require(\"socket.io-client\");\n\nconst socket = io({\n\ttransports: $(document.body).data(\"transports\"),\n\tpath: window.location.pathname + \"socket.io/\",\n\tautoConnect: false,\n\treconnection: !$(document.body).hasClass(\"public\"),\n});\n\nmodule.exports = socket;\n\nconst {vueApp} = require(\"./vue\");\nconst {requestIdleCallback} = require(\"./utils\");\n\nsocket.on(\"disconnect\", handleDisconnect);\nsocket.on(\"connect_error\", handleDisconnect);\nsocket.on(\"error\", handleDisconnect);\n\nsocket.on(\"reconnecting\", function(attempt) {\n\tvueApp.currentUserVisibleError = `Reconnecting… (attempt ${attempt})`;\n\t$(\"#loading-page-message\").text(vueApp.currentUserVisibleError);\n});\n\nsocket.on(\"connecting\", function() {\n\tvueApp.currentUserVisibleError = \"Connecting…\";\n\t$(\"#loading-page-message\").text(vueApp.currentUserVisibleError);\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\tvueApp.currentUserVisibleError = \"Finalizing connection…\";\n\t$(\"#loading-page-message\").text(vueApp.currentUserVisibleError);\n});\n\nsocket.on(\"authorized\", function() {\n\tvueApp.currentUserVisibleError = \"Loading messages…\";\n\t$(\"#loading-page-message\").text(vueApp.currentUserVisibleError);\n});\n\nfunction handleDisconnect(data) {\n\tconst message = data.message || data;\n\n\tvueApp.isConnected = false;\n\tvueApp.currentUserVisibleError = `Waiting to reconnect… (${message})`;\n\t$(\"#loading-page-message\").text(vueApp.currentUserVisibleError);\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\tif (socket.io.skipReconnect) {\n\t\trequestIdleCallback(() => socket.connect(), 2000);\n\t}\n}\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.$options.filters.colorClass(_vm.user.nick), {active: _vm.active}],attrs:{\"data-name\":_vm.user.nick,\"role\":\"button\"}},_vm.onHover ? {mouseover: _vm.hover} : {}),[_vm._v(_vm._s(_vm.user.mode)+_vm._s(_vm.user.nick))])}\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', $options.filters.colorClass(user.nick), {active: active}]\"\n\t\t:data-name=\"user.nick\"\n\t\trole=\"button\"\n\t\tv-on=\"onHover ? {mouseover: hover} : {}\"\n\t\t>{{ user.mode }}{{ user.nick }}</span\n\t>\n</template>\n\n<script>\nexport default {\n\tname: \"Username\",\n\tprops: {\n\t\tuser: Object,\n\t\tactive: Boolean,\n\t\tonHover: Function,\n\t},\n\tmethods: {\n\t\thover() {\n\t\t\treturn this.onHover(this.user);\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./Username.vue?vue&type=template&id=6ee10c2e&\"\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","<script>\nconst parse = require(\"../js/libs/handlebars/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","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&\"","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","\"use strict\";\n\nconst Vue = require(\"vue\").default;\nconst App = require(\"../components/App.vue\").default;\nconst roundBadgeNumber = require(\"./libs/handlebars/roundBadgeNumber\");\nconst localetime = require(\"./libs/handlebars/localetime\");\nconst friendlysize = require(\"./libs/handlebars/friendlysize\");\nconst colorClass = require(\"./libs/handlebars/colorClass\");\n\nVue.filter(\"localetime\", localetime);\nVue.filter(\"friendlysize\", friendlysize);\nVue.filter(\"colorClass\", colorClass);\nVue.filter(\"roundBadgeNumber\", roundBadgeNumber);\n\nconst vueApp = new Vue({\n\tel: \"#viewport\",\n\tdata: {\n\t\tactiveChannel: null,\n\t\tappName: document.title,\n\t\tcurrentUserVisibleError: null,\n\t\tinitialized: false,\n\t\tisAutoCompleting: false,\n\t\tisConnected: false,\n\t\tisFileUploadEnabled: false,\n\t\tisNotified: false,\n\t\tnetworks: [],\n\t\tsettings: {\n\t\t\tsyncSettings: false,\n\t\t\tadvanced: false,\n\t\t\tautocomplete: true,\n\t\t\tnickPostfix: \"\",\n\t\t\tcoloredNicks: true,\n\t\t\tdesktopNotifications: false,\n\t\t\thighlights: \"\",\n\t\t\tlinks: true,\n\t\t\tmotd: true,\n\t\t\tnotification: true,\n\t\t\tnotifyAllMessages: false,\n\t\t\tshowSeconds: false,\n\t\t\tstatusMessages: \"condensed\",\n\t\t\ttheme: document.getElementById(\"theme\").dataset.serverTheme,\n\t\t\tmedia: true,\n\t\t\tuserStyles: \"\",\n\t\t},\n\t},\n\tmounted() {\n\t\tVue.nextTick(() => window.vueMounted());\n\t},\n\trender(createElement) {\n\t\treturn createElement(App, {\n\t\t\tprops: this,\n\t\t});\n\t},\n});\n\nVue.config.errorHandler = function(e) {\n\tconsole.error(e); // eslint-disable-line\n\tvueApp.currentUserVisibleError = `Vue error: ${e.message}. Please check devtools and report it in #thelounge`;\n};\n\nfunction findChannel(id) {\n\tfor (const network of vueApp.networks) {\n\t\tfor (const channel of network.channels) {\n\t\t\tif (channel.id === id) {\n\t\t\t\treturn {network, channel};\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n}\n\nfunction initChannel(channel) {\n\tchannel.pendingMessage = \"\";\n\tchannel.inputHistoryPosition = 0;\n\tchannel.inputHistory = [\"\"];\n\tchannel.historyLoading = false;\n\tchannel.scrolledToBottom = true;\n\tchannel.editTopic = false;\n\n\tif (channel.type === \"channel\") {\n\t\tchannel.usersOutdated = true;\n\t}\n}\n\nmodule.exports = {\n\tvueApp,\n\tfindChannel,\n\tinitChannel,\n};\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst escape = require(\"css.escape\");\nconst viewport = $(\"#viewport\");\nconst {vueApp} = require(\"./vue\");\n\nvar serverHash = -1; // eslint-disable-line no-var\n\nmodule.exports = {\n\t// Same value as media query in CSS that forces sidebars to become overlays\n\tmobileViewportPixels: 768,\n\tfindCurrentNetworkChan,\n\tserverHash,\n\tconfirmExit,\n\tscrollIntoViewNicely,\n\thasRoleInChannel,\n\tmove,\n\tcloseChan,\n\tsynchronizeNotifiedState,\n\ttogglePasswordField,\n\trequestIdleCallback,\n};\n\nfunction findCurrentNetworkChan(name) {\n\tname = name.toLowerCase();\n\n\treturn vueApp.activeChannel.network.channels.find((c) => c.name.toLowerCase() === name);\n}\n\n// Given a channel element will determine if the lounge user or a given nick is one of the supplied roles.\nfunction hasRoleInChannel(channel, roles, nick) {\n\tif (!channel || !roles) {\n\t\treturn false;\n\t}\n\n\tconst channelID = channel.attr(\"data-id\");\n\tconst network = $(\"#sidebar .network\").has(`.chan[data-id=\"${channelID}\"]`);\n\tconst target = nick || network.attr(\"data-nick\");\n\tconst user = channel.find(`.names .user[data-name=\"${escape(target)}\"]`).first();\n\treturn user.parent().is(\".\" + roles.join(\", .\"));\n}\n\n// Reusable scrollIntoView parameters for channel list / user list\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\nconst favicon = $(\"#favicon\");\n\nfunction synchronizeNotifiedState() {\n\tupdateTitle();\n\n\tlet hasAnyHighlights = false;\n\n\tfor (const network of vueApp.networks) {\n\t\tfor (const chan of network.channels) {\n\t\t\tif (chan.highlight > 0) {\n\t\t\t\thasAnyHighlights = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\ttoggleNotificationMarkers(hasAnyHighlights);\n}\n\nfunction toggleNotificationMarkers(newState) {\n\t// Toggles the favicon to red when there are unread notifications\n\tif (vueApp.isNotified !== newState) {\n\t\tvueApp.isNotified = newState;\n\n\t\tconst old = favicon.prop(\"href\");\n\t\tfavicon.prop(\"href\", favicon.data(\"other\"));\n\t\tfavicon.data(\"other\", old);\n\t}\n\n\t// Toggles a dot on the menu icon when there are unread notifications\n\tviewport.toggleClass(\"notified\", newState);\n}\n\nfunction updateTitle() {\n\tlet title = vueApp.appName;\n\n\tif (vueApp.activeChannel) {\n\t\ttitle = `${vueApp.activeChannel.channel.name} — ${title}`;\n\t}\n\n\t// add highlight count to title\n\tlet alertEventCount = 0;\n\n\tfor (const network of vueApp.networks) {\n\t\tfor (const channel of network.channels) {\n\t\t\talertEventCount += channel.highlight;\n\t\t}\n\t}\n\n\tif (alertEventCount > 0) {\n\t\ttitle = `(${alertEventCount}) ${title}`;\n\t}\n\n\tdocument.title = title;\n}\n\nfunction togglePasswordField(elem) {\n\t$(elem).on(\"click\", function() {\n\t\tconst $this = $(this);\n\t\tconst input = $this.closest(\"div\").find(\"input\");\n\n\t\tinput.attr(\"type\", input.attr(\"type\") === \"password\" ? \"text\" : \"password\");\n\n\t\tswapLabel($this);\n\t\tswapLabel($this.find(\"span\"));\n\t\t$this.toggleClass(\"visible\");\n\t});\n}\n\n// Given a element, swap its aria-label with the content of `data-alt-label`\nfunction swapLabel(element) {\n\tconst altText = element.data(\"alt-label\");\n\telement.data(\"alt-label\", element.attr(\"aria-label\")).attr(\"aria-label\", altText);\n}\n\nfunction confirmExit() {\n\tif ($(document.body).hasClass(\"public\")) {\n\t\twindow.onbeforeunload = function() {\n\t\t\treturn \"Are you sure you want to navigate away from this page?\";\n\t\t};\n\t}\n}\n\nfunction move(array, old_index, new_index) {\n\tif (new_index >= array.length) {\n\t\tlet k = new_index - array.length;\n\n\t\twhile (k-- + 1) {\n\t\t\tthis.push(undefined);\n\t\t}\n\t}\n\n\tarray.splice(new_index, 0, array.splice(old_index, 1)[0]);\n\treturn array;\n}\n\nfunction closeChan(chan) {\n\tconst socket = require(\"./socket\");\n\tlet cmd = \"/close\";\n\n\tif (chan.hasClass(\"lobby\")) {\n\t\tcmd = \"/quit\";\n\t\tconst server = chan.find(\".name\").html();\n\n\t\t// eslint-disable-next-line no-alert\n\t\tif (!confirm(`Are you sure you want to remove ${server}?`)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tsocket.emit(\"input\", {\n\t\ttarget: Number(chan.attr(\"data-id\")),\n\t\ttext: cmd,\n\t});\n\tchan.css({\n\t\ttransition: \"none\",\n\t\topacity: 0.4,\n\t});\n\treturn false;\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","\"use strict\";\n\nmodule.exports = function() {\n\treturn function() {};\n};\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\nmodule.exports = {\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\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(\".\", true, /\\.tpl$/);\n\nmodule.exports = requireViews.keys().reduce((acc, path) => {\n\t// We are going to create nested properties on the accumulator object.\n\tlet tmp = acc;\n\n\t// Split path by folders, and create a new property if necessary/\n\t// First 2 characters are \"./\"/\n\t// Last element in the array ends with `.tpl` and needs to be `require`d.\n\tpath.substr(2)\n\t\t.split(\"/\")\n\t\t.forEach((key) => {\n\t\t\tif (key.endsWith(\".tpl\")) {\n\t\t\t\t//\n\t\t\t\ttmp[key.substr(0, key.length - 4)] = requireViews(path);\n\t\t\t} else {\n\t\t\t\ttmp[key] = tmp[key] || {};\n\t\t\t}\n\n\t\t\ttmp = tmp[key];\n\t\t});\n\n\treturn acc;\n}, {});\n","\"use strict\";\n\nmodule.exports = function(a, b, opt) {\n\tif (arguments.length !== 3) {\n\t\tthrow new Error(\"Handlebars helper `equal` expects 3 arguments\");\n\t}\n\n\ta = a.toString();\n\tb = b.toString();\n\n\tif (a === b) {\n\t\treturn opt.fn(this);\n\t}\n\n\treturn opt.inverse(this);\n};\n","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n return \"<span class=\\\"reveal-password tooltipped tooltipped-n tooltipped-no-delay\\\" aria-label=\\\"Show password\\\" data-alt-label=\\\"Hide password\\\"><span type=\\\"button\\\" aria-label=\\\"Show password\\\" data-alt-label=\\\"Hide password\\\"></span></span>\";\n},\"useData\":true});","\"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\nmodule.exports = requireViews.keys().reduce((acc, path) => {\n\tacc[\"message-\" + path.substring(2, path.length - 4)] = requireViews(path).default;\n\n\treturn acc;\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 = [\"away\", \"back\", \"chghost\", \"join\", \"part\", \"quit\", \"nick\", \"kick\", \"mode\"];\nconst condensedTypesQuery = \".\" + condensedTypes.join(\", .\");\n\nconst timeFormats = {\n\tmsgDefault: \"HH:mm\",\n\tmsgWithSeconds: \"HH:mm:ss\",\n};\n\nmodule.exports = {\n\tcolorCodeMap,\n\tcommands: [],\n\tcondensedTypes,\n\tcondensedTypesQuery,\n\ttimeFormats,\n};\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst storage = require(\"./localStorage\");\nconst socket = require(\"./socket\");\n\nlet pushNotificationsButton;\nlet clientSubscribed = null;\nlet applicationServerKey;\n\nif (\"serviceWorker\" in navigator) {\n\tnavigator.serviceWorker.addEventListener(\"message\", (event) => {\n\t\tif (event.data && event.data.type === \"open\") {\n\t\t\t$(\"#sidebar\")\n\t\t\t\t.find(`.chan[data-target=\"#${event.data.channel}\"]`)\n\t\t\t\t.trigger(\"click\");\n\t\t}\n\t});\n}\n\nmodule.exports.hasServiceWorker = false;\n\nmodule.exports.configurePushNotifications = (subscribedOnServer, key) => {\n\tapplicationServerKey = key;\n\n\t// If client has push registration but the server knows nothing about it,\n\t// this subscription is broken and client has to register again\n\tif (clientSubscribed === true && subscribedOnServer === false) {\n\t\tpushNotificationsButton.prop(\"disabled\", true);\n\n\t\tnavigator.serviceWorker.ready\n\t\t\t.then((registration) => registration.pushManager.getSubscription())\n\t\t\t.then((subscription) => subscription && subscription.unsubscribe())\n\t\t\t.then((successful) => {\n\t\t\t\tif (successful) {\n\t\t\t\t\talternatePushButton().prop(\"disabled\", false);\n\t\t\t\t}\n\t\t\t});\n\t}\n};\n\nmodule.exports.initialize = () => {\n\tpushNotificationsButton = $(\"#pushNotifications\");\n\n\tif (!isAllowedServiceWorkersHost()) {\n\t\treturn;\n\t}\n\n\t$(\"#pushNotificationsHttps\").hide();\n\n\tif (\"serviceWorker\" in navigator) {\n\t\tnavigator.serviceWorker\n\t\t\t.register(\"service-worker.js\")\n\t\t\t.then((registration) => {\n\t\t\t\tmodule.exports.hasServiceWorker = true;\n\n\t\t\t\tif (!registration.pushManager) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\treturn registration.pushManager.getSubscription().then((subscription) => {\n\t\t\t\t\t$(\"#pushNotificationsUnsupported\").hide();\n\n\t\t\t\t\tpushNotificationsButton.prop(\"disabled\", false).on(\"click\", onPushButton);\n\n\t\t\t\t\tclientSubscribed = !!subscription;\n\n\t\t\t\t\tif (clientSubscribed) {\n\t\t\t\t\t\talternatePushButton();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\t$(\"#pushNotificationsUnsupported span\").text(err);\n\t\t\t});\n\t}\n};\n\nfunction onPushButton() {\n\tpushNotificationsButton.prop(\"disabled\", true);\n\n\tnavigator.serviceWorker.ready\n\t\t.then((registration) =>\n\t\t\tregistration.pushManager\n\t\t\t\t.getSubscription()\n\t\t\t\t.then((existingSubscription) => {\n\t\t\t\t\tif (existingSubscription) {\n\t\t\t\t\t\tsocket.emit(\"push:unregister\");\n\n\t\t\t\t\t\treturn existingSubscription.unsubscribe();\n\t\t\t\t\t}\n\n\t\t\t\t\treturn registration.pushManager\n\t\t\t\t\t\t.subscribe({\n\t\t\t\t\t\t\tapplicationServerKey: urlBase64ToUint8Array(applicationServerKey),\n\t\t\t\t\t\t\tuserVisibleOnly: true,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.then((subscription) => {\n\t\t\t\t\t\t\tconst rawKey = subscription.getKey ? subscription.getKey(\"p256dh\") : \"\";\n\t\t\t\t\t\t\tconst key = rawKey\n\t\t\t\t\t\t\t\t? window.btoa(String.fromCharCode(...new Uint8Array(rawKey)))\n\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\t\tconst rawAuthSecret = subscription.getKey\n\t\t\t\t\t\t\t\t? subscription.getKey(\"auth\")\n\t\t\t\t\t\t\t\t: \"\";\n\t\t\t\t\t\t\tconst authSecret = rawAuthSecret\n\t\t\t\t\t\t\t\t? window.btoa(String.fromCharCode(...new Uint8Array(rawAuthSecret)))\n\t\t\t\t\t\t\t\t: \"\";\n\n\t\t\t\t\t\t\tsocket.emit(\"push:register\", {\n\t\t\t\t\t\t\t\ttoken: storage.get(\"token\"),\n\t\t\t\t\t\t\t\tendpoint: subscription.endpoint,\n\t\t\t\t\t\t\t\tkeys: {\n\t\t\t\t\t\t\t\t\tp256dh: key,\n\t\t\t\t\t\t\t\t\tauth: authSecret,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.then((successful) => {\n\t\t\t\t\tif (successful) {\n\t\t\t\t\t\talternatePushButton().prop(\"disabled\", false);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t)\n\t\t.catch((err) => {\n\t\t\t$(\"#pushNotificationsUnsupported\")\n\t\t\t\t.find(\"span\")\n\t\t\t\t.text(`An error has occurred: ${err}`)\n\t\t\t\t.end()\n\t\t\t\t.show();\n\t\t});\n\n\treturn false;\n}\n\nfunction alternatePushButton() {\n\tconst text = pushNotificationsButton.text();\n\n\treturn pushNotificationsButton\n\t\t.text(pushNotificationsButton.data(\"text-alternate\"))\n\t\t.data(\"text-alternate\", text);\n}\n\nfunction urlBase64ToUint8Array(base64String) {\n\tconst padding = \"=\".repeat((4 - (base64String.length % 4)) % 4);\n\tconst base64 = (base64String + padding).replace(/-/g, \"+\").replace(/_/g, \"/\");\n\n\tconst rawData = window.atob(base64);\n\tconst outputArray = new Uint8Array(rawData.length);\n\n\tfor (let i = 0; i < rawData.length; ++i) {\n\t\toutputArray[i] = rawData.charCodeAt(i);\n\t}\n\n\treturn outputArray;\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 $ = require(\"jquery\");\nconst fuzzy = require(\"fuzzy\");\nconst Mousetrap = require(\"mousetrap\");\nconst {Textcomplete, Textarea} = require(\"textcomplete\");\nconst emojiMap = require(\"./libs/simplemap.json\");\nconst constants = require(\"./constants\");\nconst {vueApp} = require(\"./vue\");\n\nlet input;\nlet textcomplete;\nlet enabled = false;\n\nmodule.exports = {\n\tenable: enableAutocomplete,\n\tdisable() {\n\t\tif (enabled) {\n\t\t\t$(\"#form\").off(\"submit.tabcomplete\");\n\t\t\tinput.off(\"input.tabcomplete\");\n\t\t\tMousetrap(input.get(0)).unbind(\"tab\", \"keydown\");\n\t\t\ttextcomplete.destroy();\n\t\t\tenabled = false;\n\t\t\tvueApp.isAutoCompleting = false;\n\t\t}\n\t},\n};\n\nconst emojiSearchTerms = Object.keys(emojiMap);\nconst emojiStrategy = {\n\tid: \"emoji\",\n\tmatch: /\\B:([-+\\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\t(term = term.replace(/:$/, \"\")), callback(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 emojiMap[original];\n\t},\n\tindex: 1,\n};\n\nconst nicksStrategy = {\n\tid: \"nicks\",\n\tmatch: /\\B(@([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], position = 1) {\n\t\t// If no postfix specified, return autocompleted nick as-is\n\t\tif (!vueApp.settings.nickPostfix) {\n\t\t\treturn original;\n\t\t}\n\n\t\t// If there is whitespace in the input already, append space to nick\n\t\tif (position > 0 && /\\s/.test($(\"#input\").val())) {\n\t\t\treturn original + \" \";\n\t\t}\n\n\t\t// If nick is first in the input, append specified postfix\n\t\treturn original + vueApp.settings.nickPostfix;\n\t},\n\tindex: 1,\n};\n\nconst chanStrategy = {\n\tid: \"chans\",\n\tmatch: /\\B((#|\\+|&|![A-Z0-9]{5})([^\\x00\\x0A\\x0D\\x20\\x2C\\x3A]+(:[^\\x00\\x0A\\x0D\\x20\\x2C\\x3A]*)?)?)$/,\n\tsearch(term, callback, match) {\n\t\tcallback(completeChans(match[0]));\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 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(inputRef) {\n\tenabled = true;\n\tlet tabCount = 0;\n\tlet lastMatch = \"\";\n\tlet currentMatches = [];\n\tinput = $(inputRef);\n\n\tinput.on(\"input.tabcomplete\", (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.get(0)).bind(\n\t\t\"tab\",\n\t\t(e) => {\n\t\t\tif (vueApp.isAutoCompleting) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\te.preventDefault();\n\n\t\t\tconst text = input.val();\n\n\t\t\tif (input.get(0).selectionStart !== text.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (tabCount === 0) {\n\t\t\t\tlastMatch = text.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.get(0).selectionStart - lastMatch.length;\n\t\t\tconst newMatch = nicksStrategy.replace(\n\t\t\t\t[0, currentMatches[tabCount % currentMatches.length]],\n\t\t\t\tposition\n\t\t\t);\n\n\t\t\tinput.val(text.substr(0, position) + newMatch);\n\n\t\t\t// Propagate change to Vue model\n\t\t\tinput.get(0).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.get(0));\n\ttextcomplete = 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\tvueApp.isAutoCompleting = true;\n\t});\n\n\ttextcomplete.on(\"hidden\", () => {\n\t\tvueApp.isAutoCompleting = false;\n\t});\n\n\t$(\"#form\").on(\"submit.tabcomplete\", () => {\n\t\ttextcomplete.hide();\n\t});\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 (vueApp.activeChannel.channel.users.length > 0) {\n\t\tconst users = vueApp.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 = vueApp.activeChannel.network.nick;\n\tconst otherUser = vueApp.activeChannel.channel.name;\n\n\t// If this is a query, add their name to autocomplete\n\tif (me !== otherUser && vueApp.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 $.grep(users, (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 vueApp.activeChannel.network.channels) {\n\t\tif (channel.type === \"channel\") {\n\t\t\twords.push(channel.name);\n\t\t}\n\t}\n\n\treturn fuzzyGrep(word, words);\n}\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst storage = require(\"./localStorage\");\nconst socket = require(\"./socket\");\nconst {vueApp} = require(\"./vue\");\nrequire(\"../js/autocompletion\");\n\nconst $windows = $(\"#windows\");\nconst $settings = $(\"#settings\");\nconst $theme = $(\"#theme\");\nconst $userStyles = $(\"#user-specified-css\");\n\nconst noCSSparamReg = /[?&]nocss/;\n\n// Not yet available at this point but used in various functionaly.\n// Will be assigned when `initialize` is called.\nlet $syncWarningOverride;\nlet $syncWarningBase;\nlet $forceSyncButton;\nlet $warningUnsupported;\nlet $warningBlocked;\n\n// Default settings\nconst settings = vueApp.settings;\n\nconst noSync = [\"syncSettings\"];\n\n// alwaysSync is reserved for settings that should be synced\n// to the server regardless of the clients sync setting.\nconst alwaysSync = [\"highlights\"];\n\nconst defaultThemeColor = document.querySelector('meta[name=\"theme-color\"]').content;\n\n// Process usersettings from localstorage.\nlet userSettings = JSON.parse(storage.get(\"settings\")) || false;\n\nif (!userSettings) {\n\t// Enable sync by default if there are no user defined settings.\n\tsettings.syncSettings = true;\n} else {\n\tfor (const key in settings) {\n\t\t// Older The Lounge versions converted highlights to an array, turn it back into a string\n\t\tif (key === \"highlights\" && typeof userSettings[key] === \"object\") {\n\t\t\tuserSettings[key] = userSettings[key].join(\", \");\n\t\t}\n\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 userSettings[key] !== \"undefined\" &&\n\t\t\ttypeof settings[key] === typeof userSettings[key]\n\t\t) {\n\t\t\tsettings[key] = userSettings[key];\n\t\t}\n\t}\n}\n\n// Apply custom CSS and themes on page load\n// Done here and not on init because on slower devices and connections\n// it can take up to several seconds before init is called.\nif (typeof userSettings.userStyles === \"string\" && !noCSSparamReg.test(window.location.search)) {\n\t$userStyles.html(userSettings.userStyles);\n}\n\nif (\n\ttypeof userSettings.theme === \"string\" &&\n\t$theme.attr(\"href\") !== `themes/${userSettings.theme}.css`\n) {\n\t$theme.attr(\"href\", `themes/${userSettings.theme}.css`);\n}\n\nuserSettings = null;\n\nmodule.exports = {\n\talwaysSync,\n\tnoSync,\n\tinitialized: false,\n\tsettings,\n\tsyncAllSettings,\n\tprocessSetting,\n\tinitialize,\n};\n\n// Updates the checkbox and warning in settings.\n// When notifications are not supported, this is never called (because\n// checkbox state can not be changed).\nfunction updateDesktopNotificationStatus() {\n\tif (Notification.permission === \"denied\") {\n\t\t$warningBlocked.show();\n\t} else {\n\t\t$warningBlocked.hide();\n\t}\n}\n\nfunction applySetting(name, value) {\n\tif (name === \"syncSettings\" && value) {\n\t\t$syncWarningOverride.hide();\n\t\t$forceSyncButton.hide();\n\t} else if (name === \"theme\") {\n\t\tconst themeUrl = `themes/${value}.css`;\n\n\t\tif ($theme.attr(\"href\") !== themeUrl) {\n\t\t\t$theme.attr(\"href\", themeUrl);\n\n\t\t\tconst newTheme = $settings.find(\"#theme-select option[value='\" + value + \"']\");\n\t\t\tlet themeColor = defaultThemeColor;\n\n\t\t\tif (newTheme.length > 0 && newTheme[0].dataset.themeColor) {\n\t\t\t\tthemeColor = newTheme[0].dataset.themeColor;\n\t\t\t}\n\n\t\t\tdocument.querySelector('meta[name=\"theme-color\"]').content = themeColor;\n\t\t}\n\t} else if (name === \"userStyles\" && !noCSSparamReg.test(window.location.search)) {\n\t\t$userStyles.html(value);\n\t} else if (name === \"desktopNotifications\") {\n\t\tif (\"Notification\" in window && value && Notification.permission !== \"granted\") {\n\t\t\tNotification.requestPermission(updateDesktopNotificationStatus);\n\t\t} else if (!value) {\n\t\t\t$warningBlocked.hide();\n\t\t}\n\t} else if (name === \"advanced\") {\n\t\t$(\"#settings [data-advanced]\").toggle(settings[name]);\n\t}\n}\n\nfunction settingSetEmit(name, value) {\n\tsocket.emit(\"setting:set\", {name, value});\n}\n\n// When sync is `true` the setting will also be send to the backend for syncing.\nfunction updateSetting(name, value, sync) {\n\tconst currentOption = settings[name];\n\n\t// Only update and process when the setting is actually changed.\n\tif (currentOption !== value) {\n\t\tsettings[name] = value;\n\t\tstorage.set(\"settings\", JSON.stringify(settings));\n\t\tapplySetting(name, value);\n\n\t\t// Sync is checked, request settings from server.\n\t\tif (name === \"syncSettings\" && value) {\n\t\t\tsocket.emit(\"setting:get\");\n\t\t\t$syncWarningOverride.hide();\n\t\t\t$syncWarningBase.hide();\n\t\t\t$forceSyncButton.hide();\n\t\t} else if (name === \"syncSettings\") {\n\t\t\t$syncWarningOverride.show();\n\t\t\t$forceSyncButton.show();\n\t\t}\n\n\t\tif (settings.syncSettings && !noSync.includes(name) && sync) {\n\t\t\tsettingSetEmit(name, value);\n\t\t} else if (alwaysSync.includes(name) && sync) {\n\t\t\tsettingSetEmit(name, value);\n\t\t}\n\t}\n}\n\nfunction syncAllSettings(force = false) {\n\t// Sync all settings if sync is enabled or force is true.\n\tif (settings.syncSettings || force) {\n\t\tfor (const name in settings) {\n\t\t\tif (!noSync.includes(name)) {\n\t\t\t\tsettingSetEmit(name, settings[name]);\n\t\t\t} else if (alwaysSync.includes(name)) {\n\t\t\t\tsettingSetEmit(name, settings[name]);\n\t\t\t}\n\t\t}\n\n\t\t$syncWarningOverride.hide();\n\t\t$syncWarningBase.hide();\n\t\t$forceSyncButton.hide();\n\t} else {\n\t\t$syncWarningOverride.hide();\n\t\t$forceSyncButton.hide();\n\t\t$syncWarningBase.show();\n\t}\n}\n\n// If `save` is set to true it will pass the setting to `updateSetting()` processSetting\nfunction processSetting(name, value, save) {\n\tif (name === \"userStyles\") {\n\t\t$settings.find(\"#user-specified-css-input\").val(value);\n\t} else if (name === \"highlights\") {\n\t\t$settings.find(`input[name=${name}]`).val(value);\n\t} else if (name === \"nickPostfix\") {\n\t\t$settings.find(`input[name=${name}]`).val(value);\n\t} else if (name === \"statusMessages\") {\n\t\t$settings.find(`input[name=${name}][value=${value}]`).prop(\"checked\", true);\n\t} else if (name === \"theme\") {\n\t\t$settings.find(\"#theme-select\").val(value);\n\t} else if (typeof value === \"boolean\") {\n\t\t$settings.find(`input[name=${name}]`).prop(\"checked\", value);\n\t}\n\n\t// No need to also call processSetting when `save` is true.\n\t// updateSetting does take care of that.\n\tif (save) {\n\t\t// Sync is false as applySetting is never called as the result of a user changing the setting.\n\t\tupdateSetting(name, value, false);\n\t} else {\n\t\tapplySetting(name, value);\n\t}\n}\n\nfunction initialize() {\n\t$warningBlocked = $settings.find(\"#warnBlockedDesktopNotifications\");\n\t$warningUnsupported = $settings.find(\"#warnUnsupportedDesktopNotifications\");\n\n\t$syncWarningOverride = $settings.find(\".sync-warning-override\");\n\t$syncWarningBase = $settings.find(\".sync-warning-base\");\n\t$forceSyncButton = $settings.find(\".force-sync-button\");\n\n\t$warningBlocked.hide();\n\tmodule.exports.initialized = true;\n\n\t// Settings have now entirely updated, apply settings to the client.\n\tfor (const name in settings) {\n\t\tprocessSetting(name, settings[name], false);\n\t}\n\n\t// If browser does not support notifications\n\t// display proper message in settings.\n\tif (\"Notification\" in window) {\n\t\t$warningUnsupported.hide();\n\t\t$windows.on(\"show\", \"#settings\", updateDesktopNotificationStatus);\n\t} else {\n\t\t$warningUnsupported.show();\n\t}\n\n\t$settings.on(\"change\", \"input, select, textarea\", function(e) {\n\t\t// We only want to trigger on human triggered changes.\n\t\tif (e.originalEvent) {\n\t\t\tconst $self = $(this);\n\t\t\tconst type = $self.prop(\"type\");\n\t\t\tconst name = $self.prop(\"name\");\n\n\t\t\tif (type === \"radio\") {\n\t\t\t\tif ($self.prop(\"checked\")) {\n\t\t\t\t\tupdateSetting(name, $self.val(), true);\n\t\t\t\t}\n\t\t\t} else if (type === \"checkbox\") {\n\t\t\t\tupdateSetting(name, $self.prop(\"checked\"), true);\n\t\t\t\tsettings[name] = $self.prop(\"checked\");\n\t\t\t} else if (type !== \"password\") {\n\t\t\t\tupdateSetting(name, $self.val(), true);\n\t\t\t}\n\t\t}\n\t});\n\n\t$settings.find(\"#forceSync\").on(\"click\", () => {\n\t\tsyncAllSettings(true);\n\t});\n\n\t// Local init is done, let's sync\n\t// We always ask for synced settings even if it is disabled.\n\t// Settings can be mandatory to sync and it is used to determine sync base state.\n\tsocket.emit(\"setting:get\");\n\n\t// Protocol handler\n\tconst defaultClientButton = $(\"#make-default-client\");\n\n\tif (window.navigator.registerProtocolHandler) {\n\t\tdefaultClientButton.on(\"click\", function() {\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\n\t\t\treturn false;\n\t\t});\n\n\t\t$(\"#native-app\").prop(\"hidden\", false);\n\t} else {\n\t\tdefaultClientButton.hide();\n\t}\n}\n","\"use strict\";\n\n// Generates a string from \"color-1\" to \"color-32\" based on an input string\nmodule.exports = function(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","\"use strict\";\n\nconst moment = require(\"moment\");\n\nmodule.exports = function(time) {\n\treturn moment(time).format(\"D MMMM YYYY, HH:mm:ss\");\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\nmodule.exports = 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);\n\n\treturn acc;\n}, {});\n","\"use strict\";\n\nconst socket = require(\"./socket\");\nconst updateCursor = require(\"undate\").update;\n\nclass Uploader {\n\tinit() {\n\t\tthis.vueApp = require(\"./vue\").vueApp;\n\t\tthis.xhr = null;\n\t\tthis.fileQueue = [];\n\t\tthis.overlay = document.getElementById(\"upload-overlay\");\n\t\tthis.uploadInput = document.getElementById(\"upload-input\");\n\t\tthis.uploadProgressbar = document.getElementById(\"upload-progressbar\");\n\n\t\tthis.uploadInput.addEventListener(\"change\", (e) => this.filesChanged(e));\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\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\tfilesChanged() {\n\t\tconst files = Array.from(this.uploadInput.files);\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 (!this.vueApp.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\n\t\tfor (const file of files) {\n\t\t\tif (this.maxFileSize > 0 && file.size > this.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, start uploading them\n\t\tif (wasQueueEmpty && 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\t\tconst xhr = new XMLHttpRequest();\n\t\tthis.xhr = xhr;\n\n\t\txhr.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\txhr.onreadystatechange = () => {\n\t\t\tif (xhr.readyState === XMLHttpRequest.DONE) {\n\t\t\t\tthis.xhr = null;\n\n\t\t\t\tlet response;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponse = JSON.parse(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 ${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\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\txhr.open(\"POST\", `uploads/new/${token}`);\n\t\txhr.send(formData);\n\t}\n\n\thandleResponse(response) {\n\t\tthis.setProgress(0);\n\n\t\tif (response.error) {\n\t\t\t// require here due to circular dependency\n\t\t\tconst {vueApp} = require(\"./vue\");\n\t\t\tvueApp.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\nfunction initialize() {\n\tinstance.init();\n\treturn instance;\n}\n\n/**\n * Called in the `configuration` socket event.\n * Makes it so the user can be notified if a file is too large without waiting for the upload to finish server-side.\n **/\nfunction setMaxFileSize(kb) {\n\tinstance.maxFileSize = kb;\n}\n\nmodule.exports = {\n\tabort: () => instance.abort(),\n\tinitialize,\n\tsetMaxFileSize,\n};\n","\"use strict\";\n\nconst viewport = document.getElementById(\"viewport\");\nconst menu = document.getElementById(\"sidebar\");\nconst sidebarOverlay = document.getElementById(\"sidebar-overlay\");\n\nlet touchStartPos = null;\nlet touchCurPos = null;\nlet touchStartTime = 0;\nlet menuWidth = 0;\nlet menuIsOpen = false;\nlet menuIsMoving = false;\nlet menuIsAbsolute = false;\n\nclass SlideoutMenu {\n\tstatic enable() {\n\t\tdocument.body.addEventListener(\"touchstart\", onTouchStart, {passive: true});\n\t}\n\n\tstatic toggle(state) {\n\t\tmenuIsOpen = state;\n\t\tviewport.classList.toggle(\"menu-open\", state);\n\t}\n\n\tstatic isOpen() {\n\t\treturn menuIsOpen;\n\t}\n}\n\nfunction onTouchStart(e) {\n\ttouchStartPos = touchCurPos = e.touches.item(0);\n\n\tif (e.touches.length !== 1) {\n\t\tonTouchEnd();\n\t\treturn;\n\t}\n\n\tconst styles = window.getComputedStyle(menu);\n\n\tmenuWidth = parseFloat(styles.width);\n\tmenuIsAbsolute = styles.position === \"absolute\";\n\n\tif (!menuIsOpen || touchStartPos.screenX > menuWidth) {\n\t\ttouchStartTime = Date.now();\n\n\t\tdocument.body.addEventListener(\"touchmove\", onTouchMove, {passive: true});\n\t\tdocument.body.addEventListener(\"touchend\", onTouchEnd, {passive: true});\n\t}\n}\n\nfunction onTouchMove(e) {\n\tconst touch = (touchCurPos = e.touches.item(0));\n\tlet distX = touch.screenX - touchStartPos.screenX;\n\tconst distY = touch.screenY - touchStartPos.screenY;\n\n\tif (!menuIsMoving) {\n\t\t// tan(45°) is 1. Gestures in 0°-45° (< 1) are considered horizontal, so\n\t\t// menu must be open; gestures in 45°-90° (>1) are considered vertical, so\n\t\t// chat windows must be scrolled.\n\t\tif (Math.abs(distY / distX) >= 1) {\n\t\t\tonTouchEnd();\n\t\t\treturn;\n\t\t}\n\n\t\tconst devicePixelRatio = window.devicePixelRatio || 2;\n\n\t\tif (Math.abs(distX) > devicePixelRatio) {\n\t\t\tviewport.classList.toggle(\"menu-dragging\", true);\n\t\t\tmenuIsMoving = true;\n\t\t}\n\t}\n\n\t// Do not animate the menu on desktop view\n\tif (!menuIsAbsolute) {\n\t\treturn;\n\t}\n\n\tif (menuIsOpen) {\n\t\tdistX += menuWidth;\n\t}\n\n\tif (distX > menuWidth) {\n\t\tdistX = menuWidth;\n\t} else if (distX < 0) {\n\t\tdistX = 0;\n\t}\n\n\tmenu.style.transform = \"translate3d(\" + distX + \"px, 0, 0)\";\n\tsidebarOverlay.style.opacity = distX / menuWidth;\n}\n\nfunction onTouchEnd() {\n\tconst diff = touchCurPos.screenX - touchStartPos.screenX;\n\tconst absDiff = Math.abs(diff);\n\n\tif (absDiff > menuWidth / 2 || (Date.now() - touchStartTime < 180 && absDiff > 50)) {\n\t\tSlideoutMenu.toggle(diff > 0);\n\t}\n\n\tdocument.body.removeEventListener(\"touchmove\", onTouchMove);\n\tdocument.body.removeEventListener(\"touchend\", onTouchEnd);\n\tviewport.classList.toggle(\"menu-dragging\", false);\n\tmenu.style.transform = null;\n\tsidebarOverlay.style.opacity = null;\n\n\ttouchStartPos = null;\n\ttouchCurPos = null;\n\ttouchStartTime = 0;\n\tmenuIsMoving = false;\n}\n\nmodule.exports = SlideoutMenu;\n","\"use strict\";\n\nconst localStorage = require(\"./localStorage\");\nconst location = require(\"./location\");\n\nmodule.exports = class Auth {\n\tstatic signout() {\n\t\tlocalStorage.clear();\n\t\tlocation.reload();\n\t}\n};\n","\"use strict\";\n\n// vendor libraries\nconst $ = require(\"jquery\");\n\n// our libraries\nconst socket = require(\"./socket\");\n\nconst {vueApp, findChannel} = require(\"./vue\");\n\nwindow.vueMounted = () => {\n\trequire(\"./socket-events\");\n\tconst slideoutMenu = require(\"./slideout\");\n\tconst contextMenuFactory = require(\"./contextMenuFactory\");\n\tconst storage = require(\"./localStorage\");\n\tconst utils = require(\"./utils\");\n\trequire(\"./webpush\");\n\trequire(\"./keybinds\");\n\n\tconst sidebar = $(\"#sidebar, #footer\");\n\tconst viewport = $(\"#viewport\");\n\n\tfunction storeSidebarVisibility(name, state) {\n\t\tstorage.set(name, state);\n\n\t\tvueApp.$emit(\"resize\");\n\t}\n\n\t// If sidebar overlay is visible and it is clicked, close the sidebar\n\t$(\"#sidebar-overlay\").on(\"click\", () => {\n\t\tslideoutMenu.toggle(false);\n\n\t\tif ($(window).outerWidth() > utils.mobileViewportPixels) {\n\t\t\tstoreSidebarVisibility(\"thelounge.state.sidebar\", false);\n\t\t}\n\t});\n\n\t$(\"#windows\").on(\"click\", \"button.lt\", () => {\n\t\tconst isOpen = !slideoutMenu.isOpen();\n\n\t\tslideoutMenu.toggle(isOpen);\n\n\t\tif ($(window).outerWidth() > utils.mobileViewportPixels) {\n\t\t\tstoreSidebarVisibility(\"thelounge.state.sidebar\", isOpen);\n\t\t}\n\t});\n\n\tviewport.on(\"click\", \".rt\", function() {\n\t\tconst isOpen = !viewport.hasClass(\"userlist-open\");\n\n\t\tviewport.toggleClass(\"userlist-open\", isOpen);\n\t\tstoreSidebarVisibility(\"thelounge.state.userlist\", isOpen);\n\n\t\treturn false;\n\t});\n\n\tviewport.on(\"contextmenu\", \".network .chan\", function(e) {\n\t\treturn contextMenuFactory.createContextMenu($(this), e).show();\n\t});\n\n\tviewport.on(\"click contextmenu\", \".user\", function(e) {\n\t\t// If user is selecting text, do not open context menu\n\t\t// This primarily only targets mobile devices where selection is performed with touch\n\t\tif (!window.getSelection().isCollapsed) {\n\t\t\treturn true;\n\t\t}\n\n\t\treturn contextMenuFactory.createContextMenu($(this), e).show();\n\t});\n\n\tviewport.on(\"click\", \"#chat .menu\", function(e) {\n\t\te.currentTarget = $(\n\t\t\t`#sidebar .chan[data-id=\"${$(this)\n\t\t\t\t.closest(\".chan\")\n\t\t\t\t.attr(\"data-id\")}\"]`\n\t\t)[0];\n\t\treturn contextMenuFactory.createContextMenu($(this), e).show();\n\t});\n\n\tif (navigator.platform.match(/(Mac|iPhone|iPod|iPad)/i)) {\n\t\t$(document.body).addClass(\"is-apple\");\n\t}\n\n\tviewport.on(\"click\", \".inline-channel\", function() {\n\t\tconst name = $(this).attr(\"data-chan\");\n\t\tconst chan = utils.findCurrentNetworkChan(name);\n\n\t\tif (chan) {\n\t\t\t$(`#sidebar .chan[data-id=\"${chan.id}\"]`).trigger(\"click\");\n\t\t}\n\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: vueApp.activeChannel.channel.id,\n\t\t\ttext: \"/join \" + name,\n\t\t});\n\t});\n\n\tconst openWindow = function openWindow(e, {pushState, replaceHistory} = {}) {\n\t\tconst self = $(this);\n\t\tconst target = self.attr(\"data-target\");\n\n\t\tif (!target) {\n\t\t\treturn;\n\t\t}\n\n\t\t// This is a rather gross hack to account for sources that are in the\n\t\t// sidebar specifically. Needs to be done better when window management gets\n\t\t// refactored.\n\t\tconst inSidebar = self.parents(\"#sidebar, #footer\").length > 0;\n\t\tconst channel = inSidebar ? findChannel(Number(self.attr(\"data-id\"))) : null;\n\n\t\tif (vueApp.activeChannel) {\n\t\t\tconst {channel: lastChannel} = vueApp.activeChannel;\n\n\t\t\t// If user clicks on the currently active channel, do nothing\n\t\t\tif (channel && lastChannel === channel.channel) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (lastChannel.messages.length > 0) {\n\t\t\t\tlastChannel.firstUnread = lastChannel.messages[lastChannel.messages.length - 1].id;\n\t\t\t}\n\n\t\t\tif (lastChannel.messages.length > 100) {\n\t\t\t\tlastChannel.messages.splice(0, lastChannel.messages.length - 100);\n\t\t\t\tlastChannel.moreHistoryAvailable = true;\n\t\t\t}\n\t\t}\n\n\t\tif (inSidebar) {\n\t\t\tvueApp.activeChannel = channel;\n\n\t\t\tif (channel) {\n\t\t\t\tchannel.channel.highlight = 0;\n\t\t\t\tchannel.channel.unread = 0;\n\t\t\t}\n\n\t\t\tsocket.emit(\"open\", channel ? channel.channel.id : null);\n\n\t\t\tif ($(window).outerWidth() <= utils.mobileViewportPixels) {\n\t\t\t\tslideoutMenu.toggle(false);\n\t\t\t}\n\t\t}\n\n\t\tconst lastActive = $(\"#windows > .active\");\n\n\t\tlastActive.removeClass(\"active\");\n\n\t\tconst chan = $(target)\n\t\t\t.addClass(\"active\")\n\t\t\t.trigger(\"show\");\n\n\t\tutils.synchronizeNotifiedState();\n\n\t\tif (self.hasClass(\"chan\")) {\n\t\t\tvueApp.$nextTick(() => $(\"#chat-container\").addClass(\"active\"));\n\t\t}\n\n\t\tconst chanChat = chan.find(\".chat\");\n\n\t\tif (chanChat.length > 0 && channel.type !== \"special\") {\n\t\t\t// On touch devices unfocus (blur) the input to correctly close the virtual keyboard\n\t\t\t// An explicit blur is required, as the keyboard may open back up if the focus remains\n\t\t\t// See https://github.com/thelounge/thelounge/issues/2257\n\t\t\t$(\"#input\").trigger(\"ontouchstart\" in window ? \"blur\" : \"focus\");\n\t\t}\n\n\t\tif (channel && channel.channel.usersOutdated) {\n\t\t\tchannel.channel.usersOutdated = false;\n\n\t\t\tsocket.emit(\"names\", {\n\t\t\t\ttarget: channel.channel.id,\n\t\t\t});\n\t\t}\n\n\t\t// Pushes states to history web API when clicking elements with a data-target attribute.\n\t\t// States are very trivial and only contain a single `clickTarget` property which\n\t\t// contains a CSS selector that targets elements which takes the user to a different view\n\t\t// when clicked. The `popstate` event listener will trigger synthetic click events using that\n\t\t// selector and thus take the user to a different view/state.\n\t\tif (pushState === false) {\n\t\t\treturn false;\n\t\t}\n\n\t\tconst state = {};\n\n\t\tif (self.prop(\"id\")) {\n\t\t\tstate.clickTarget = `#${self.prop(\"id\")}`;\n\t\t} else if (self.hasClass(\"chan\")) {\n\t\t\tstate.clickTarget = `#sidebar .chan[data-id=\"${self.attr(\"data-id\")}\"]`;\n\t\t} else {\n\t\t\tstate.clickTarget = `#footer button[data-target=\"${target}\"]`;\n\t\t}\n\n\t\tif (history && history.pushState) {\n\t\t\tif (replaceHistory && history.replaceState) {\n\t\t\t\thistory.replaceState(state, null, target);\n\t\t\t} else {\n\t\t\t\thistory.pushState(state, null, target);\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t};\n\n\tsidebar.on(\"click\", \".chan, button\", openWindow);\n\t$(\"#help\").on(\"click\", \"#view-changelog, #back-to-help\", openWindow);\n\t$(\"#changelog\").on(\"click\", \"#back-to-help\", openWindow);\n\n\tsidebar.on(\"click\", \".close\", function() {\n\t\tutils.closeChan($(this).closest(\".chan\"));\n\t});\n\n\t$(document).on(\"visibilitychange focus click\", () => {\n\t\tutils.synchronizeNotifiedState();\n\t});\n\n\twindow.addEventListener(\"popstate\", (e) => {\n\t\tconst {state} = e;\n\n\t\tif (!state) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet {clickTarget} = state;\n\n\t\tif (clickTarget) {\n\t\t\t// This will be true when click target corresponds to opening a thumbnail,\n\t\t\t// browsing to the previous/next thumbnail, or closing the image viewer.\n\t\t\tconst imageViewerRelated = clickTarget.includes(\".toggle-thumbnail\");\n\n\t\t\t// If the click target is not related to the image viewer but the viewer\n\t\t\t// is currently opened, we need to close it.\n\t\t\tif (!imageViewerRelated && $(\"#image-viewer\").hasClass(\"opened\")) {\n\t\t\t\tclickTarget += \", #image-viewer\";\n\t\t\t}\n\n\t\t\t// Emit the click to the target, while making sure it is not going to be\n\t\t\t// added to the state again.\n\t\t\t$(clickTarget).trigger(\"click\", {\n\t\t\t\tpushState: false,\n\t\t\t});\n\t\t}\n\t});\n\n\t// Only start opening socket.io connection after all events have been registered\n\tsocket.open();\n};\n","\"use strict\";\n\nconst parseStyle = require(\"./ircmessageparser/parseStyle\");\nconst findChannels = require(\"./ircmessageparser/findChannels\");\nconst findLinks = require(\"./ircmessageparser/findLinks\");\nconst findEmoji = require(\"./ircmessageparser/findEmoji\");\nconst findNames = require(\"./ircmessageparser/findNames\");\nconst merge = require(\"./ircmessageparser/merge\");\nconst colorClass = require(\"./colorClass\");\nconst emojiMap = require(\"../fullnamemap.json\");\nconst LinkPreviewToggle = require(\"../../../components/LinkPreviewToggle.vue\").default;\nconst emojiModifiersRegex = /[\\u{1f3fb}-\\u{1f3ff}]/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.\nmodule.exports = function 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\n\t\t.concat(linkParts)\n\t\t.concat(emojiParts)\n\t\t.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 = message && message.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\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\treturn [\n\t\t\t\tlink,\n\t\t\t\tcreateElement(\n\t\t\t\t\tLinkPreviewToggle,\n\t\t\t\t\t{\n\t\t\t\t\t\tclass: [\"toggle-button\", \"toggle-preview\"],\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tlink: preview,\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tfragments\n\t\t\t\t),\n\t\t\t];\n\t\t} else if (textPart.channel) {\n\t\t\treturn createElement(\n\t\t\t\t\"span\",\n\t\t\t\t{\n\t\t\t\t\tclass: [\"inline-channel\"],\n\t\t\t\t\tattrs: {\n\t\t\t\t\t\trole: \"button\",\n\t\t\t\t\t\ttabindex: 0,\n\t\t\t\t\t\t\"data-chan\": 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\t\"span\",\n\t\t\t\t{\n\t\t\t\t\tclass: [\"user\", colorClass(textPart.nick)],\n\t\t\t\t\tattrs: {\n\t\t\t\t\t\trole: \"button\",\n\t\t\t\t\t\t\"data-name\": textPart.nick,\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","\"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\nmodule.exports = prepare;\n","\"use strict\";\n\n// Escapes the RegExp special characters \"^\", \"$\", \"\", \".\", \"*\", \"+\", \"?\", \"(\",\n// \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in string.\n// See https://lodash.com/docs/#escapeRegExp\nconst escapeRegExp = require(\"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\nmodule.exports = findChannels;\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}\n\n\tif (match.schema === \"//\") {\n\t\tmatch.schema = \"http:\";\n\t\tmatch.url = \"http:\" + match.url;\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()\n\t.tlds(require(\"tlds\"))\n\t.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((url) => ({\n\t\tstart: url.index,\n\t\tend: url.lastIndex,\n\t\tlink: url.url,\n\t}));\n}\n\nmodule.exports = findLinks;\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\nmodule.exports = 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\nmodule.exports = findNames;\n","\"use strict\";\n\nconst anyIntersection = require(\"./anyIntersection\");\nconst fill = require(\"./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\nmodule.exports = merge;\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\nmodule.exports = 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\nmodule.exports = fill;\n","\"use strict\";\n\nmodule.exports = function(chat) {\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","var map = {\n\t\"./away.vue\": 219,\n\t\"./back.vue\": 204,\n\t\"./chghost.vue\": 210,\n\t\"./ctcp.vue\": 216,\n\t\"./ctcp_request.vue\": 213,\n\t\"./invite.vue\": 215,\n\t\"./join.vue\": 214,\n\t\"./kick.vue\": 201,\n\t\"./mode.vue\": 208,\n\t\"./mode_channel.vue\": 206,\n\t\"./motd.vue\": 218,\n\t\"./nick.vue\": 205,\n\t\"./part.vue\": 212,\n\t\"./quit.vue\": 217,\n\t\"./raw.vue\": 203,\n\t\"./topic.vue\": 207,\n\t\"./topic_set_by.vue\": 209,\n\t\"./whois.vue\": 211\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;","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst Mousetrap = require(\"mousetrap\");\nconst templates = require(\"../views\");\n\n/* Image viewer */\n\nconst imageViewer = $(\"#image-viewer\");\n\n$(\"#windows\").on(\"click\", \".toggle-thumbnail\", function(event, data = {}) {\n\tconst link = $(this);\n\n\t// Passing `data`, specifically `data.pushState`, to not add the action to the\n\t// history state if back or forward buttons were pressed.\n\topenImageViewer(link, data);\n\n\t// Prevent the link to open a new page since we're opening the image viewer,\n\t// but keep it a link to allow for Ctrl/Cmd+click.\n\t// By binding this event on #chat we prevent input gaining focus after clicking.\n\treturn false;\n});\n\nimageViewer.on(\"click\", function(event, data = {}) {\n\t// Passing `data`, specifically `data.pushState`, to not add the action to the\n\t// history state if back or forward buttons were pressed.\n\tcloseImageViewer(data);\n});\n\nMousetrap.bind(\"esc\", () => closeImageViewer());\n\nMousetrap.bind([\"left\", \"right\"], (e, key) => {\n\tif (imageViewer.hasClass(\"opened\")) {\n\t\tconst direction = key === \"left\" ? \"previous\" : \"next\";\n\t\timageViewer.find(`.${direction}-image-btn`).trigger(\"click\");\n\t}\n});\n\nfunction openImageViewer(link, {pushState = true} = {}) {\n\t$(\".previous-image\").removeClass(\"previous-image\");\n\t$(\".next-image\").removeClass(\"next-image\");\n\n\t// The next two blocks figure out what are the previous/next images. We first\n\t// look within the same message, as there can be multiple thumbnails per\n\t// message, and if not, we look at previous/next messages and take the\n\t// last/first thumbnail available.\n\t// Only expanded thumbnails are being cycled through.\n\n\t// Previous image\n\tlet previousImage = link\n\t\t.closest(\".preview\")\n\t\t.prev(\".preview\")\n\t\t.find(\".toggle-content .toggle-thumbnail\")\n\t\t.last();\n\n\tif (!previousImage.length) {\n\t\tpreviousImage = link\n\t\t\t.closest(\".msg\")\n\t\t\t.prevAll()\n\t\t\t.find(\".toggle-content .toggle-thumbnail\")\n\t\t\t.last();\n\t}\n\n\tpreviousImage.addClass(\"previous-image\");\n\n\t// Next image\n\tlet nextImage = link\n\t\t.closest(\".preview\")\n\t\t.next(\".preview\")\n\t\t.find(\".toggle-content .toggle-thumbnail\")\n\t\t.first();\n\n\tif (!nextImage.length) {\n\t\tnextImage = link\n\t\t\t.closest(\".msg\")\n\t\t\t.nextAll()\n\t\t\t.find(\".toggle-content .toggle-thumbnail\")\n\t\t\t.first();\n\t}\n\n\tnextImage.addClass(\"next-image\");\n\n\timageViewer.html(\n\t\ttemplates.image_viewer({\n\t\t\timage: link.find(\"img\").prop(\"src\"),\n\t\t\tlink: link.prop(\"href\"),\n\t\t\ttype: link.parent().hasClass(\"toggle-type-link\") ? \"link\" : \"image\",\n\t\t\thasPreviousImage: previousImage.length > 0,\n\t\t\thasNextImage: nextImage.length > 0,\n\t\t})\n\t);\n\n\t// Turn off transitionend listener before opening the viewer,\n\t// which caused image viewer to become empty in rare cases\n\timageViewer.off(\"transitionend\").addClass(\"opened\");\n\n\t// History management\n\tif (pushState) {\n\t\tlet clickTarget = \"\";\n\n\t\t// Images can be in a message (channel URL previews) or not (window URL\n\t\t// preview, e.g. changelog). This is sub-optimal and needs improvement to\n\t\t// make image preview more generic and not specific for channel previews.\n\t\tif (link.closest(\".msg\").length > 0) {\n\t\t\tclickTarget = `#${link.closest(\".msg\").prop(\"id\")} `;\n\t\t}\n\n\t\tclickTarget += `a.toggle-thumbnail[href=\"${link.prop(\"href\")}\"] img`;\n\t\thistory.pushState({clickTarget}, null, null);\n\t}\n}\n\nimageViewer.on(\"click\", \".previous-image-btn\", function() {\n\t$(\".previous-image\").trigger(\"click\");\n\treturn false;\n});\n\nimageViewer.on(\"click\", \".next-image-btn\", function() {\n\t$(\".next-image\").trigger(\"click\");\n\treturn false;\n});\n\nfunction closeImageViewer({pushState = true} = {}) {\n\timageViewer.removeClass(\"opened\").one(\"transitionend\", function() {\n\t\timageViewer.empty();\n\t});\n\n\t// History management\n\tif (pushState) {\n\t\tconst clickTarget =\n\t\t\t\"#sidebar \" + `.chan[data-id=\"${$(\"#sidebar .chan.active\").attr(\"data-id\")}\"]`;\n\t\thistory.pushState({clickTarget}, null, null);\n\t}\n}\n","var map = {\n\t\"./contextmenu_divider.tpl\": 129,\n\t\"./contextmenu_item.tpl\": 145,\n\t\"./image_viewer.tpl\": 146,\n\t\"./reveal-password.tpl\": 17,\n\t\"./session.tpl\": 147,\n\t\"./version_checker.tpl\": 148,\n\t\"./windows/changelog.tpl\": 149,\n\t\"./windows/connect.tpl\": 150,\n\t\"./windows/help.tpl\": 151,\n\t\"./windows/settings.tpl\": 152,\n\t\"./windows/sign_in.tpl\": 153\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 = 128;","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n return \"<li class=\\\"context-menu-divider\\\" aria-hidden=\\\"true\\\"></li>\";\n},\"useData\":true});","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n var helper;\n\n return \" data-data=\\\"\"\n + container.escapeExpression(((helper = (helper = helpers.data || (depth0 != null ? depth0.data : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"data\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\" \";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \"<li class=\\\"context-menu-item context-menu-\"\n + alias4(((helper = (helper = helpers[\"class\"] || (depth0 != null ? depth0[\"class\"] : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"class\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\" data-action=\\\"\"\n + alias4(((helper = (helper = helpers.action || (depth0 != null ? depth0.action : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"action\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\" \"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.data : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" tabindex=\\\"0\\\" role=\\\"menuitem\\\"> \"\n + alias4(((helper = (helper = helpers.text || (depth0 != null ? depth0.text : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"text\",\"hash\":{},\"data\":data}) : helper)))\n + \" </li>\";\n},\"useData\":true});","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n return \" <button class=\\\"previous-image-btn\\\" aria-label=\\\"Previous image\\\"></button> \";\n},\"3\":function(container,depth0,helpers,partials,data) {\n return \" <button class=\\\"next-image-btn\\\" aria-label=\\\"Next image\\\"></button> \";\n},\"5\":function(container,depth0,helpers,partials,data) {\n return \" Open image \";\n},\"7\":function(container,depth0,helpers,partials,data) {\n return \" Visit page \";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.lambda, alias3=container.escapeExpression;\n\n return \"<button class=\\\"close-btn\\\" aria-label=\\\"Close\\\"></button> \"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.hasPreviousImage : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" \"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.hasNextImage : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" <a class=\\\"image-link\\\" href=\\\"\"\n + alias3(alias2((depth0 != null ? depth0.link : depth0), depth0))\n + \"\\\" target=\\\"_blank\\\"><img src=\\\"\"\n + alias3(alias2((depth0 != null ? depth0.image : depth0), depth0))\n + \"\\\" decoding=\\\"async\\\" alt=\\\"\\\"> </a><a class=\\\"btn open-btn\\\" href=\\\"\"\n + alias3(alias2((depth0 != null ? depth0.link : depth0), depth0))\n + \"\\\" target=\\\"_blank\\\"> \"\n + ((stack1 = __default(require(\"../js/libs/handlebars/equal.js\")).call(alias1,(depth0 != null ? depth0.type : depth0),\"image\",{\"name\":\"equal\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.program(7, data, 0),\"data\":data})) != null ? stack1 : \"\")\n + \" </a>\";\n},\"useData\":true});","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n return \" data-token=\\\"\"\n + container.escapeExpression(container.lambda((depth0 != null ? depth0.token : depth0), depth0))\n + \"\\\" \";\n},\"3\":function(container,depth0,helpers,partials,data) {\n return \" Sign out \";\n},\"5\":function(container,depth0,helpers,partials,data) {\n return \" Revoke \";\n},\"7\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \" <br> \"\n + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.active : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(8, data, 0),\"inverse\":container.program(10, data, 0),\"data\":data})) != null ? stack1 : \"\")\n + \" \";\n},\"8\":function(container,depth0,helpers,partials,data) {\n return \" <em>Currently active</em> \";\n},\"10\":function(container,depth0,helpers,partials,data) {\n return \" Last used on <time>\"\n + container.escapeExpression(__default(require(\"../js/libs/handlebars/localetime.js\")).call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.lastUse : depth0),{\"name\":\"localetime\",\"hash\":{},\"data\":data}))\n + \"</time> \";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.lambda, alias3=container.escapeExpression;\n\n return \"<p><button class=\\\"btn pull-right remove-session\\\" \"\n + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.current : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" > \"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.current : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.program(5, data, 0),\"data\":data})) != null ? stack1 : \"\")\n + \" </button> <strong>\"\n + alias3(alias2((depth0 != null ? depth0.agent : depth0), depth0))\n + \"</strong><a href=\\\"https://ipinfo.io/\"\n + alias3(alias2((depth0 != null ? depth0.ip : depth0), depth0))\n + \"\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\">\"\n + alias3(alias2((depth0 != null ? depth0.ip : depth0), depth0))\n + \"</a> \"\n + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.current : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(7, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" </p>\";\n},\"useData\":true});","var Handlebars = require(\"../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n return \" <p>Checking for updates...</p> \";\n},\"3\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return ((stack1 = __default(require(\"../js/libs/handlebars/equal.js\")).call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.status : depth0),\"new-version\",{\"name\":\"equal\",\"hash\":{},\"fn\":container.program(4, data, 0),\"inverse\":container.program(7, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"4\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=container.lambda, alias2=container.escapeExpression;\n\n return \" <p>The Lounge <b>\"\n + alias2(alias1(((stack1 = (depth0 != null ? depth0.latest : depth0)) != null ? stack1.version : stack1), depth0))\n + \"</b>\"\n + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.latest : depth0)) != null ? stack1.prerelease : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" is now available.<br><a href=\\\"\"\n + alias2(alias1(((stack1 = (depth0 != null ? depth0.latest : depth0)) != null ? stack1.url : stack1), depth0))\n + \"\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\">Read more on GitHub</a></p> \";\n},\"5\":function(container,depth0,helpers,partials,data) {\n return \" (pre-release)\";\n},\"7\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return ((stack1 = __default(require(\"../js/libs/handlebars/equal.js\")).call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.status : depth0),\"new-packages\",{\"name\":\"equal\",\"hash\":{},\"fn\":container.program(8, data, 0),\"inverse\":container.program(10, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"8\":function(container,depth0,helpers,partials,data) {\n return \" <p>The Lounge is up to date, but there are out of date packages Run <code>thelounge upgrade</code> on the server to upgrade packages.</p> \";\n},\"10\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return ((stack1 = __default(require(\"../js/libs/handlebars/equal.js\")).call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.status : depth0),\"up-to-date\",{\"name\":\"equal\",\"hash\":{},\"fn\":container.program(11, data, 0),\"inverse\":container.program(13, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"11\":function(container,depth0,helpers,partials,data) {\n return \" <p>The Lounge is up to date!</p><button id=\\\"check-now\\\" class=\\\"btn btn-small\\\">Check now</button> \";\n},\"13\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return ((stack1 = __default(require(\"../js/libs/handlebars/equal.js\")).call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.status : depth0),\"error\",{\"name\":\"equal\",\"hash\":{},\"fn\":container.program(14, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\");\n},\"14\":function(container,depth0,helpers,partials,data) {\n return \" <p>Information about latest releases could not be retrieved.</p><button id=\\\"check-now\\\" class=\\\"btn btn-small\\\">Try again</button> \";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return ((stack1 = __default(require(\"../js/libs/handlebars/equal.js\")).call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.status : depth0),\"loading\",{\"name\":\"equal\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(3, data, 0),\"data\":data})) != null ? stack1 : \"\");\n},\"useData\":true});","var Handlebars = require(\"../../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return \" <h1 class=\\\"title\\\">Release notes for \"\n + container.escapeExpression(((helper = (helper = helpers.version || (depth0 != null ? depth0.version : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(alias1,{\"name\":\"version\",\"hash\":{},\"data\":data}) : helper)))\n + \"</h1> \"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.changelog : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(2, data, 0),\"inverse\":container.program(4, data, 0),\"data\":data})) != null ? stack1 : \"\")\n + \" \";\n},\"2\":function(container,depth0,helpers,partials,data) {\n var stack1, helper;\n\n return \" <h3>Introduction</h3><div class=\\\"changelog-text\\\">\"\n + ((stack1 = ((helper = (helper = helpers.changelog || (depth0 != null ? depth0.changelog : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"changelog\",\"hash\":{},\"data\":data}) : helper))) != null ? stack1 : \"\")\n + \"</div> \";\n},\"4\":function(container,depth0,helpers,partials,data) {\n var helper;\n\n return \" <p>Unable to retrieve releases from GitHub.</p><p><a href=\\\"https://github.com/thelounge/thelounge/releases/tag/v\"\n + container.escapeExpression(((helper = (helper = helpers.version || (depth0 != null ? depth0.version : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{\"name\":\"version\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\">View release notes for this version on GitHub</a></p> \";\n},\"6\":function(container,depth0,helpers,partials,data) {\n return \" <p>Loading changelog…</p> \";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \"<div class=\\\"header\\\"><button class=\\\"lt\\\" aria-label=\\\"Toggle channel list\\\"></button></div><div class=\\\"container\\\"><a href=\\\"#\\\" id=\\\"back-to-help\\\" data-target=\\\"#help\\\">« Help</a> \"\n + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.version : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(6, data, 0),\"data\":data})) != null ? stack1 : \"\")\n + \" </div>\";\n},\"useData\":true});","var Handlebars = require(\"../../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n return \"network:edit\";\n},\"3\":function(container,depth0,helpers,partials,data) {\n return \"network:new\";\n},\"5\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=container.lambda, alias2=container.escapeExpression;\n\n return \" <input type=\\\"hidden\\\" name=\\\"uuid\\\" value=\\\"\"\n + alias2(alias1(((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.uuid : stack1), depth0))\n + \"\\\"> Edit \"\n + alias2(alias1(((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.name : stack1), depth0))\n + \" \";\n},\"7\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return \" \"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0[\"public\"] : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(8, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" Connect \"\n + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.displayNetwork : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(10, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" \";\n},\"8\":function(container,depth0,helpers,partials,data) {\n return \"The Lounge - \";\n},\"10\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \" \"\n + ((stack1 = helpers[\"if\"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.lockNetwork : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(11, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" \";\n},\"11\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \" to \"\n + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.name : stack1), depth0))\n + \" \";\n},\"13\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=container.lambda, alias2=container.escapeExpression, alias3=depth0 != null ? depth0 : (container.nullContext || {});\n\n return \" <div><div class=\\\"col-sm-12\\\"><h2>Network settings</h2></div><div class=\\\"col-sm-3\\\"><label for=\\\"connect:name\\\">Name</label></div><div class=\\\"col-sm-9\\\"><input class=\\\"input\\\" id=\\\"connect:name\\\" name=\\\"name\\\" value=\\\"\"\n + alias2(alias1(((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.name : stack1), depth0))\n + \"\\\" maxlength=\\\"100\\\"></div><div class=\\\"col-sm-3\\\"><label for=\\\"connect:host\\\">Server</label></div><div class=\\\"col-sm-6 col-xs-8\\\"><input class=\\\"input\\\" id=\\\"connect:host\\\" name=\\\"host\\\" value=\\\"\"\n + alias2(alias1(((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.host : stack1), depth0))\n + \"\\\" aria-label=\\\"Server address\\\" maxlength=\\\"255\\\" required \"\n + ((stack1 = helpers[\"if\"].call(alias3,(depth0 != null ? depth0.lockNetwork : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(14, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"></div><div class=\\\"col-sm-3 col-xs-4\\\"><div class=\\\"port\\\"><input class=\\\"input\\\" type=\\\"number\\\" min=\\\"1\\\" max=\\\"65535\\\" name=\\\"port\\\" value=\\\"\"\n + alias2(alias1(((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.port : stack1), depth0))\n + \"\\\" aria-label=\\\"Server port\\\" \"\n + ((stack1 = helpers[\"if\"].call(alias3,(depth0 != null ? depth0.lockNetwork : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(14, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"></div></div><div class=\\\"clearfix\\\"></div><div class=\\\"col-sm-9 col-sm-offset-3\\\"><label class=\\\"tls\\\"><input type=\\\"checkbox\\\" name=\\\"tls\\\" \"\n + ((stack1 = helpers[\"if\"].call(alias3,((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.tls : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(16, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" \"\n + ((stack1 = helpers[\"if\"].call(alias3,(depth0 != null ? depth0.lockNetwork : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(14, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"> Use secure connection (TLS)</label></div><div class=\\\"col-sm-9 col-sm-offset-3\\\"><label class=\\\"tls\\\"><input type=\\\"checkbox\\\" name=\\\"rejectUnauthorized\\\" \"\n + ((stack1 = helpers[\"if\"].call(alias3,((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.rejectUnauthorized : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(16, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" \"\n + ((stack1 = helpers[\"if\"].call(alias3,(depth0 != null ? depth0.lockNetwork : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(14, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"> Only allow trusted certificates</label></div><div class=\\\"clearfix\\\"></div></div> \";\n},\"14\":function(container,depth0,helpers,partials,data) {\n return \" disabled=\\\"disabled\\\" \";\n},\"16\":function(container,depth0,helpers,partials,data) {\n return \" checked=\\\"checked\\\" \";\n},\"18\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \" <div class=\\\"col-sm-3\\\"><label for=\\\"connect:username\\\">Username</label></div><div class=\\\"col-sm-9\\\"><input class=\\\"input username\\\" id=\\\"connect:username\\\" name=\\\"username\\\" value=\\\"\"\n + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.username : stack1), depth0))\n + \"\\\" maxlength=\\\"512\\\"></div> \";\n},\"20\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \" <div class=\\\"col-sm-3\\\"><label for=\\\"connect:commands\\\">Commands</label></div><div class=\\\"col-sm-9\\\"><textarea class=\\\"input\\\" id=\\\"connect:commands\\\" name=\\\"commands\\\" placeholder=\\\"One raw command per line, each command will be executed on new connection\\\">\"\n + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.commands : stack1),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(21, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \"</textarea></div><div class=\\\"col-sm-9 col-sm-offset-3\\\"><button type=\\\"submit\\\" class=\\\"btn\\\">Save</button></div> \";\n},\"21\":function(container,depth0,helpers,partials,data) {\n return container.escapeExpression(container.lambda(depth0, depth0))\n + \"\\n\";\n},\"23\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \" <div class=\\\"col-sm-3\\\"><label for=\\\"connect:channels\\\">Channels</label></div><div class=\\\"col-sm-9\\\"><input class=\\\"input\\\" id=\\\"connect:channels\\\" name=\\\"join\\\" value=\\\"\"\n + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.join : stack1), depth0))\n + \"\\\"></div><div class=\\\"col-sm-9 col-sm-offset-3\\\"><button type=\\\"submit\\\" class=\\\"btn\\\">Connect</button></div> \";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.lambda, alias3=container.escapeExpression;\n\n return \"<div class=\\\"header\\\"><button class=\\\"lt\\\" aria-label=\\\"Toggle channel list\\\"></button></div><form class=\\\"container\\\" method=\\\"post\\\" action=\\\"\\\" data-event=\\\"\"\n + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.uuid : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.program(3, data, 0),\"data\":data})) != null ? stack1 : \"\")\n + \"\\\"><div class=\\\"row\\\"><div class=\\\"col-sm-12\\\"><h1 class=\\\"title\\\"> \"\n + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.uuid : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.program(7, data, 0),\"data\":data})) != null ? stack1 : \"\")\n + \" </h1></div> \"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.displayNetwork : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(13, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" <div class=\\\"col-sm-12\\\"><h2>User preferences</h2></div><div class=\\\"col-sm-3\\\"><label for=\\\"connect:nick\\\">Nick</label></div><div class=\\\"col-sm-9\\\"><input class=\\\"input nick\\\" id=\\\"connect:nick\\\" name=\\\"nick\\\" value=\\\"\"\n + alias3(alias2(((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.nick : stack1), depth0))\n + \"\\\" maxlength=\\\"100\\\" required></div> \"\n + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.useHexIp : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(18, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" <div class=\\\"col-sm-3\\\"><label for=\\\"connect:password\\\">Password</label></div><div class=\\\"col-sm-9 password-container\\\"><input class=\\\"input\\\" id=\\\"connect:password\\\" type=\\\"password\\\" name=\\\"password\\\" value=\\\"\"\n + alias3(alias2(((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.password : stack1), depth0))\n + \"\\\" maxlength=\\\"512\\\"> \"\n + ((stack1 = container.invokePartial(require(\"../reveal-password.tpl\"),depth0,{\"name\":\"../reveal-password\",\"data\":data,\"helpers\":helpers,\"partials\":partials,\"decorators\":container.decorators})) != null ? stack1 : \"\")\n + \" </div><div class=\\\"col-sm-3\\\"><label for=\\\"connect:realname\\\">Real name</label></div><div class=\\\"col-sm-9\\\"><input class=\\\"input\\\" id=\\\"connect:realname\\\" name=\\\"realname\\\" value=\\\"\"\n + alias3(alias2(((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.realname : stack1), depth0))\n + \"\\\" maxlength=\\\"512\\\"></div> \"\n + ((stack1 = helpers[\"if\"].call(alias1,((stack1 = (depth0 != null ? depth0.defaults : depth0)) != null ? stack1.uuid : stack1),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(20, data, 0),\"inverse\":container.program(23, data, 0),\"data\":data})) != null ? stack1 : \"\")\n + \" </div></form>\";\n},\"usePartial\":true,\"useData\":true});","var Handlebars = require(\"../../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=\"function\", alias4=container.escapeExpression;\n\n return \" <p>The Lounge is running from source (<a href=\\\"https://github.com/thelounge/thelounge/tree/\"\n + alias4(((helper = (helper = helpers.gitCommit || (depth0 != null ? depth0.gitCommit : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"gitCommit\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\">commit <code>\"\n + alias4(((helper = (helper = helpers.gitCommit || (depth0 != null ? depth0.gitCommit : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"gitCommit\",\"hash\":{},\"data\":data}) : helper)))\n + \"</code></a>).</p><ul><li>Compare <a href=\\\"https://github.com/thelounge/thelounge/compare/\"\n + alias4(((helper = (helper = helpers.gitCommit || (depth0 != null ? depth0.gitCommit : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"gitCommit\",\"hash\":{},\"data\":data}) : helper)))\n + \"...master\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\">between <code>\"\n + alias4(((helper = (helper = helpers.gitCommit || (depth0 != null ? depth0.gitCommit : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"gitCommit\",\"hash\":{},\"data\":data}) : helper)))\n + \"</code> and <code>master</code></a> to see what you are missing</li><li>Compare <a href=\\\"https://github.com/thelounge/thelounge/compare/\"\n + alias4(((helper = (helper = helpers.version || (depth0 != null ? depth0.version : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"version\",\"hash\":{},\"data\":data}) : helper)))\n + \"...\"\n + alias4(((helper = (helper = helpers.gitCommit || (depth0 != null ? depth0.gitCommit : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"gitCommit\",\"hash\":{},\"data\":data}) : helper)))\n + \"\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\">between <code>\"\n + alias4(((helper = (helper = helpers.version || (depth0 != null ? depth0.version : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"version\",\"hash\":{},\"data\":data}) : helper)))\n + \"</code> and <code>\"\n + alias4(((helper = (helper = helpers.gitCommit || (depth0 != null ? depth0.gitCommit : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{\"name\":\"gitCommit\",\"hash\":{},\"data\":data}) : helper)))\n + \"</code></a> to see your local changes</li></ul> \";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return \"<div class=\\\"header\\\"><button class=\\\"lt\\\" aria-label=\\\"Toggle channel list\\\"></button></div><div class=\\\"container\\\"><h1 class=\\\"title\\\">Help</h1><h2><small class=\\\"pull-right\\\">v\"\n + container.escapeExpression(((helper = (helper = helpers.version || (depth0 != null ? depth0.version : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === \"function\" ? helper.call(alias1,{\"name\":\"version\",\"hash\":{},\"data\":data}) : helper)))\n + \" (<a href=\\\"#\\\" id=\\\"view-changelog\\\" data-target=\\\"#changelog\\\">release notes</a>) </small>About The Lounge</h2><div class=\\\"about\\\"><div id=\\\"version-checker\\\"></div> \"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.gitCommit : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" <p><a href=\\\"https://thelounge.chat/\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\" class=\\\"website-link\\\">Website</a></p><p><a href=\\\"https://thelounge.chat/docs/\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\" class=\\\"documentation-link\\\">Documentation</a></p><p><a href=\\\"https://github.com/thelounge/thelounge/issues/new\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\" class=\\\"report-issue-link\\\">Report an issue…</a></p></div><h2>Keyboard Shortcuts</h2><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><span class=\\\"key-all\\\"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>↓</kbd></span> <span class=\\\"key-apple\\\"><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>↓</kbd></span></div><div class=\\\"description\\\"><p>Switch to the next lobby in the channel list.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><span class=\\\"key-all\\\"><kbd>Alt</kbd> <kbd>Shift</kbd> <kbd>↑</kbd></span> <span class=\\\"key-apple\\\"><kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>↑</kbd></span></div><div class=\\\"description\\\"><p>Switch to the previous lobby in the channel list.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><span class=\\\"key-all\\\"><kbd>Alt</kbd> <kbd>↓</kbd></span> <span class=\\\"key-apple\\\"><kbd>⌥</kbd> <kbd>↓</kbd></span></div><div class=\\\"description\\\"><p>Switch to the next window in the channel list.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><span class=\\\"key-all\\\"><kbd>Alt</kbd> <kbd>↑</kbd></span> <span class=\\\"key-apple\\\"><kbd>⌥</kbd> <kbd>↑</kbd></span></div><div class=\\\"description\\\"><p>Switch to the previous window in the channel list.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><span class=\\\"key-all\\\"><kbd>Alt</kbd> <kbd>A</kbd></span> <span class=\\\"key-apple\\\"><kbd>⌥</kbd> <kbd>A</kbd></span></div><div class=\\\"description\\\"><p>Switch to the first window with unread messages.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><span class=\\\"key-all\\\"><kbd>Ctrl</kbd> <kbd>K</kbd></span> <span class=\\\"key-apple\\\"><kbd>⌘</kbd> <kbd>K</kbd></span></div><div class=\\\"description\\\"><p>Mark any text typed after this shortcut to be colored. After hitting this shortcut, enter an integer in the range <code>0—15</code> to select the desired color, or use the autocompletion menu to choose a color name (see below).</p><p>Background color can be specified by putting a comma and another integer in the range <code>0—15</code> after the foreground color number (autocompletion works too).</p><p>A color reference can be found <a href=\\\"https://modern.ircdocs.horse/formatting.html#colors\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\">here</a>.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><span class=\\\"key-all\\\"><kbd>Ctrl</kbd> <kbd>B</kbd></span> <span class=\\\"key-apple\\\"><kbd>⌘</kbd> <kbd>B</kbd></span></div><div class=\\\"description\\\"><p>Mark all text typed after this shortcut as <span class=\\\"irc-bold\\\">bold</span>.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><span class=\\\"key-all\\\"><kbd>Ctrl</kbd> <kbd>U</kbd></span> <span class=\\\"key-apple\\\"><kbd>⌘</kbd> <kbd>U</kbd></span></div><div class=\\\"description\\\"><p>Mark all text typed after this shortcut as <span class=\\\"irc-underline\\\">underlined</span>.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><span class=\\\"key-all\\\"><kbd>Ctrl</kbd> <kbd>I</kbd></span> <span class=\\\"key-apple\\\"><kbd>⌘</kbd> <kbd>I</kbd></span></div><div class=\\\"description\\\"><p>Mark all text typed after this shortcut as <span class=\\\"irc-italic\\\">italics</span>.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><span class=\\\"key-all\\\"><kbd>Ctrl</kbd> <kbd>S</kbd></span> <span class=\\\"key-apple\\\"><kbd>⌘</kbd> <kbd>S</kbd></span></div><div class=\\\"description\\\"><p>Mark all text typed after this shortcut as <span class=\\\"irc-strikethrough\\\">struck through</span>.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><span class=\\\"key-all\\\"><kbd>Ctrl</kbd> <kbd>M</kbd></span> <span class=\\\"key-apple\\\"><kbd>⌘</kbd> <kbd>M</kbd></span></div><div class=\\\"description\\\"><p>Mark all text typed after this shortcut as <span class=\\\"irc-monospace\\\">monospaced</span>.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><span class=\\\"key-all\\\"><kbd>Ctrl</kbd> <kbd>O</kbd></span> <span class=\\\"key-apple\\\"><kbd>⌘</kbd> <kbd>O</kbd></span></div><div class=\\\"description\\\"><p>Mark all text typed after this shortcut to be reset to its original formatting.</p></div></div><h2>Autocompletion</h2><p>To auto-complete nicknames, channels, commands, and emoji, type one of the characters below to open a suggestion list. Use the <kbd>↑</kbd> and <kbd>↓</kbd> keys to highlight an item, and insert it by pressing <kbd>Tab</kbd> or <kbd>Enter</kbd> (or by clicking the desired item).</p><p>Autocompletion can be disabled in settings.</p><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>@</code></div><div class=\\\"description\\\"><p>Nickname</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>#</code></div><div class=\\\"description\\\"><p>Channel</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/</code></div><div class=\\\"description\\\"><p>Commands (see list of commands below)</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>:</code></div><div class=\\\"description\\\"><p>Emoji (note: requires two search characters, to avoid conflicting with common emoticons like <code>:)</code>)</p></div></div><h2>Commands</h2><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/away [message]</code></div><div class=\\\"description\\\"><p>Mark yourself as away with an optional message.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/back</code></div><div class=\\\"description\\\"><p>Remove your away status (set with <code>/away</code>).</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/ban nick</code></div><div class=\\\"description\\\"><p>Ban (<code>+b</code>) a user from the current channel. This can be a nickname or a hostmask.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/banlist</code></div><div class=\\\"description\\\"><p>Load the banlist for the current channel.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/collapse</code></div><div class=\\\"description\\\"><p>Collapse all previews in the current channel (opposite of <code>/expand</code>)</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/connect host [port]</code></div><div class=\\\"description\\\"><p>Connect to a new IRC network. If <code>port</code> starts with a <code>+</code> sign, the connection will be made secure using TLS.</p><p>Alias: <code>/server</code></p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/ctcp target cmd [args]</code></div><div class=\\\"description\\\"><p>Send a <abbr title=\\\"Client-to-client protocol\\\">CTCP</abbr> request. Read more about this on <a href=\\\"https://en.wikipedia.org/wiki/Client-to-client_protocol\\\" target=\\\"_blank\\\" rel=\\\"noopener\\\">the dedicated Wikipedia article</a>.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/deop nick [...nick]</code></div><div class=\\\"description\\\"><p>Remove op (<code>-o</code>) from one or several users in the current channel.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/devoice nick [...nick]</code></div><div class=\\\"description\\\"><p>Remove voice (<code>-v</code>) from one or several users in the current channel.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/disconnect [message]</code></div><div class=\\\"description\\\"><p>Disconnect from the current network with an optionally-provided message.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/expand</code></div><div class=\\\"description\\\"><p>Expand all previews in the current channel (opposite of <code>/collapse</code>)</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/invite nick [channel]</code></div><div class=\\\"description\\\"><p>Invite a user to the specified channel. If <code>channel</code> is omitted, user will be invited to the current channel.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/ignore nick</code></div><div class=\\\"description\\\"><p>Block any messages from the specified user on the current network. This can be a nickname or a hostmask.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/ignorelist</code></div><div class=\\\"description\\\"><p>Load the list of ignored users for the current network.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/join channel</code></div><div class=\\\"description\\\"><p>Join a channel.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/kick nick</code></div><div class=\\\"description\\\"><p>Kick a user from the current channel.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/list</code></div><div class=\\\"description\\\"><p>Retrieve a list of available channels on this network.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/me message</code></div><div class=\\\"description\\\"><p>Send an action message to the current channel. The Lounge will display it inline, as if the message was posted in the third person.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/mode flags [args]</code></div><div class=\\\"description\\\"><p>Set the given flags to the current channel if the active window is a channel, another user if the active window is a private message window, or yourself if the current window is a server window.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/msg channel message</code></div><div class=\\\"description\\\"><p>Send a message to the specified channel.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/nick newnick</code></div><div class=\\\"description\\\"><p>Change your nickname on the current network.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/notice channel message</code></div><div class=\\\"description\\\"><p>Sends a notice message to the specified channel.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/op nick [...nick]</code></div><div class=\\\"description\\\"><p>Give op (<code>+o</code>) to one or several users in the current channel.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/part [channel]</code></div><div class=\\\"description\\\"><p>Close the specified channel or private message window, or the current channel if <code>channel</code> is omitted.</p><p>Aliases: <code>/close</code>, <code>/leave</code></p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/rejoin</code></div><div class=\\\"description\\\"><p>Leave and immediately rejoin the current channel. Useful to quickly get op from ChanServ in an empty channel, for example.</p><p>Alias: <code>/cycle</code></p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/query nick</code></div><div class=\\\"description\\\"><p>Send a private message to the specified user.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/quit [message]</code></div><div class=\\\"description\\\"><p>Disconnect from the current network with an optional message.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/raw message</code></div><div class=\\\"description\\\"><p>Send a raw message to the current IRC network.</p><p>Aliases: <code>/quote</code>, <code>/send</code></p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/slap nick</code></div><div class=\\\"description\\\"><p>Slap someone in the current channel with a trout!</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/topic [newtopic]</code></div><div class=\\\"description\\\"><p>Get the topic in the current channel. If <code>newtopic</code> is specified, sets the topic in the current channel.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/unban nick</code></div><div class=\\\"description\\\"><p>Unban (<code>-b</code>) a user from the current channel. This can be a nickname or a hostmask.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/unignore nick</code></div><div class=\\\"description\\\"><p>Unblock messages from the specified user on the current network. This can be a nickname or a hostmask.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/voice nick [...nick]</code></div><div class=\\\"description\\\"><p>Give voice (<code>+v</code>) to one or several users in the current channel.</p></div></div><div class=\\\"help-item\\\"><div class=\\\"subject\\\"><code>/whois nick</code></div><div class=\\\"description\\\"><p>Retrieve information about the given user on the current network.</p></div></div></div>\";\n},\"useData\":true});","var Handlebars = require(\"../../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"1\":function(container,depth0,helpers,partials,data) {\n return \" <div class=\\\"col-sm-12\\\" data-advanced><h2>Settings synchronisation <span class=\\\"tooltipped tooltipped-n tooltipped-no-delay\\\" aria-label=\\\"Note: This is an experimental feature and may change in future releases.\\\"><button class=\\\"extra-experimental\\\" aria-label=\\\"Note: This is an experimental feature and may change in future releases.\\\"></button></span></h2><label class=\\\"opt\\\"><input type=\\\"checkbox\\\" name=\\\"syncSettings\\\"> Synchronize settings with other clients.</label><p class=\\\"sync-warning-override\\\"><strong>Warning</strong> Checking this box will override the settings of this client with those stored on the server.</p><p class=\\\"sync-warning-base\\\"><strong>Warning</strong> No settings have been synced before. Enabling this will sync all settings of this client as the base for other clients.</p><div class=\\\"opt force-sync-button\\\"><button type=\\\"button\\\" class=\\\"btn\\\" id=\\\"forceSync\\\">Force sync settings</button><p>This will override any settings already synced to the server.</p></div></div> \";\n},\"3\":function(container,depth0,helpers,partials,data) {\n var alias1=container.lambda, alias2=container.escapeExpression;\n\n return \" <option value=\\\"\"\n + alias2(alias1((depth0 != null ? depth0.name : depth0), depth0))\n + \"\\\" data-theme-color=\\\"\"\n + alias2(alias1((depth0 != null ? depth0.themeColor : depth0), depth0))\n + \"\\\"> \"\n + alias2(alias1((depth0 != null ? depth0.displayName : depth0), depth0))\n + \" </option> \";\n},\"5\":function(container,depth0,helpers,partials,data) {\n return \" <div class=\\\"col-sm-12\\\"><h2>Link previews</h2></div><div class=\\\"col-sm-6\\\"><label class=\\\"opt\\\"><input type=\\\"checkbox\\\" name=\\\"media\\\"> Auto-expand media</label></div><div class=\\\"col-sm-6\\\"><label class=\\\"opt\\\"><input type=\\\"checkbox\\\" name=\\\"links\\\"> Auto-expand websites</label></div> \";\n},\"7\":function(container,depth0,helpers,partials,data) {\n return \" <div class=\\\"col-sm-12\\\"><h2>Push Notifications</h2></div><div class=\\\"col-sm-12\\\"><button type=\\\"button\\\" class=\\\"btn\\\" id=\\\"pushNotifications\\\" disabled=\\\"disabled\\\" data-text-alternate=\\\"Unsubscribe from push notifications\\\">Subscribe to push notifications</button><div class=\\\"error\\\" id=\\\"pushNotificationsHttps\\\"><strong>Warning</strong>: Push notifications are only supported over HTTPS connections.</div><div class=\\\"error\\\" id=\\\"pushNotificationsUnsupported\\\"><strong>Warning</strong>: <span>Push notifications are not supported by your browser.</span></div></div> \";\n},\"9\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \" \"\n + ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.ldapEnabled : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(10, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" \";\n},\"10\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \" <div id=\\\"change-password\\\"><form action=\\\"\\\" method=\\\"post\\\" data-event=\\\"change-password\\\"><div class=\\\"col-sm-12\\\"><h2>Change password</h2></div><div class=\\\"col-sm-12 password-container\\\"><label for=\\\"old_password_input\\\" class=\\\"sr-only\\\">Enter current password</label> <input type=\\\"password\\\" id=\\\"old_password_input\\\" name=\\\"old_password\\\" class=\\\"input\\\" placeholder=\\\"Enter current password\\\"> \"\n + ((stack1 = container.invokePartial(require(\"../reveal-password.tpl\"),depth0,{\"name\":\"../reveal-password\",\"data\":data,\"helpers\":helpers,\"partials\":partials,\"decorators\":container.decorators})) != null ? stack1 : \"\")\n + \" </div><div class=\\\"col-sm-12 password-container\\\"><label for=\\\"new_password_input\\\" class=\\\"sr-only\\\">Enter desired new password</label> <input type=\\\"password\\\" id=\\\"new_password_input\\\" name=\\\"new_password\\\" class=\\\"input\\\" placeholder=\\\"Enter desired new password\\\"> \"\n + ((stack1 = container.invokePartial(require(\"../reveal-password.tpl\"),depth0,{\"name\":\"../reveal-password\",\"data\":data,\"helpers\":helpers,\"partials\":partials,\"decorators\":container.decorators})) != null ? stack1 : \"\")\n + \" </div><div class=\\\"col-sm-12 password-container\\\"><label for=\\\"verify_password_input\\\" class=\\\"sr-only\\\">Repeat new password</label> <input type=\\\"password\\\" id=\\\"verify_password_input\\\" name=\\\"verify_password\\\" class=\\\"input\\\" placeholder=\\\"Repeat new password\\\"> \"\n + ((stack1 = container.invokePartial(require(\"../reveal-password.tpl\"),depth0,{\"name\":\"../reveal-password\",\"data\":data,\"helpers\":helpers,\"partials\":partials,\"decorators\":container.decorators})) != null ? stack1 : \"\")\n + \" </div><div class=\\\"col-sm-12 feedback\\\"></div><div class=\\\"col-sm-12\\\"><button type=\\\"submit\\\" class=\\\"btn\\\">Change password</button></div></form></div> \";\n},\"12\":function(container,depth0,helpers,partials,data) {\n return \" <div class=\\\"session-list\\\"><h2>Sessions</h2><h3>Current session</h3><div id=\\\"session-current\\\"></div><h3>Other sessions</h3><div id=\\\"session-list\\\"></div></div> \";\n},\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {});\n\n return \"<div class=\\\"header\\\"><button class=\\\"lt\\\" aria-label=\\\"Toggle channel list\\\"></button></div><div class=\\\"container\\\"><h1 class=\\\"title\\\">Settings</h1><div class=\\\"row\\\"><div class=\\\"col-sm-6\\\"><label class=\\\"opt\\\"><input type=\\\"checkbox\\\" name=\\\"advanced\\\"> Advanced settings</label></div></div><div class=\\\"row\\\"><div class=\\\"col-sm-12\\\" id=\\\"native-app\\\" hidden><h2>Native app</h2><button type=\\\"button\\\" class=\\\"btn\\\" id=\\\"webapp-install-button\\\" hidden>Add The Lounge to Home screen</button> <button type=\\\"button\\\" class=\\\"btn\\\" id=\\\"make-default-client\\\">Open irc:// URLs with The Lounge</button></div> \"\n + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0[\"public\"] : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(1, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" <div class=\\\"col-sm-12\\\"><h2>Messages</h2></div><div class=\\\"col-sm-6\\\"><label class=\\\"opt\\\"><input type=\\\"checkbox\\\" name=\\\"motd\\\"> Show <abbr title=\\\"Message Of The Day\\\">MOTD</abbr></label></div><div class=\\\"col-sm-6\\\"><label class=\\\"opt\\\"><input type=\\\"checkbox\\\" name=\\\"showSeconds\\\"> Show seconds in timestamp</label></div><div class=\\\"col-sm-12\\\"><h2>Status messages <span class=\\\"tooltipped tooltipped-n tooltipped-no-delay\\\" aria-label=\\\"Joins, parts, kicks, nick changes, away changes, and mode changes\\\"><button class=\\\"extra-help\\\" aria-label=\\\"Joins, parts, kicks, nick changes, away changes, and mode changes\\\"></button></span></h2></div><div class=\\\"col-sm-12\\\"><label class=\\\"opt\\\"><input type=\\\"radio\\\" name=\\\"statusMessages\\\" value=\\\"shown\\\"> Show all status messages individually</label> <label class=\\\"opt\\\"><input type=\\\"radio\\\" name=\\\"statusMessages\\\" value=\\\"condensed\\\"> Condense status messages together</label> <label class=\\\"opt\\\"><input type=\\\"radio\\\" name=\\\"statusMessages\\\" value=\\\"hidden\\\"> Hide all status messages</label></div><div class=\\\"col-sm-12\\\"><h2>Visual Aids</h2></div><div class=\\\"col-sm-12\\\"><label class=\\\"opt\\\"><input type=\\\"checkbox\\\" name=\\\"coloredNicks\\\"> Enable colored nicknames</label> <label class=\\\"opt\\\"><input type=\\\"checkbox\\\" name=\\\"autocomplete\\\"> Enable autocomplete</label></div><div class=\\\"col-sm-12\\\" data-advanced><label class=\\\"opt\\\"><label for=\\\"nickPostfix\\\" class=\\\"sr-only\\\">Nick autocomplete postfix (e.g. <code>,</code>)</label> <input type=\\\"text\\\" id=\\\"nickPostfix\\\" name=\\\"nickPostfix\\\" class=\\\"input\\\" placeholder=\\\"Nick autocomplete postfix (e.g. ', ')\\\"></label></div><div class=\\\"col-sm-12\\\"><h2>Theme</h2></div><div class=\\\"col-sm-12\\\"><label for=\\\"theme-select\\\" class=\\\"sr-only\\\">Theme</label> <select id=\\\"theme-select\\\" name=\\\"theme\\\" class=\\\"input\\\"> \"\n + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.themes : depth0),{\"name\":\"each\",\"hash\":{},\"fn\":container.program(3, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" </select></div> \"\n + ((stack1 = helpers[\"if\"].call(alias1,(depth0 != null ? depth0.prefetch : depth0),{\"name\":\"if\",\"hash\":{},\"fn\":container.program(5, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" \"\n + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0[\"public\"] : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(7, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" <div class=\\\"col-sm-12\\\"><h2>Browser Notifications</h2></div><div class=\\\"col-sm-12\\\"><label class=\\\"opt\\\"><input id=\\\"desktopNotifications\\\" type=\\\"checkbox\\\" name=\\\"desktopNotifications\\\"> Enable browser notifications<br><div class=\\\"error\\\" id=\\\"warnUnsupportedDesktopNotifications\\\"><strong>Warning</strong>: Notifications are not supported by your browser.</div><div class=\\\"error\\\" id=\\\"warnBlockedDesktopNotifications\\\"><strong>Warning</strong>: Notifications are blocked by your browser.</div></label></div><div class=\\\"col-sm-12\\\"><label class=\\\"opt\\\"><input type=\\\"checkbox\\\" name=\\\"notification\\\"> Enable notification sound</label></div><div class=\\\"col-sm-12\\\"><div class=\\\"opt\\\"><button id=\\\"play\\\">Play sound</button></div></div><div class=\\\"col-sm-12\\\" data-advanced><label class=\\\"opt\\\"><input type=\\\"checkbox\\\" name=\\\"notifyAllMessages\\\"> Enable notification for all messages</label></div><div class=\\\"col-sm-12\\\" data-advanced><label class=\\\"opt\\\"><label for=\\\"highlights\\\" class=\\\"sr-only\\\">Custom highlights (comma-separated keywords)</label> <input type=\\\"text\\\" id=\\\"highlights\\\" name=\\\"highlights\\\" class=\\\"input\\\" placeholder=\\\"Custom highlights (comma-separated keywords)\\\"></label></div> \"\n + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0[\"public\"] : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(9, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" <div class=\\\"col-sm-12\\\" data-advanced><h2>Custom Stylesheet</h2></div><div class=\\\"col-sm-12\\\" data-advanced><label for=\\\"user-specified-css-input\\\" class=\\\"sr-only\\\">Custom stylesheet. You can override any style with CSS here.</label> <textarea class=\\\"input\\\" name=\\\"userStyles\\\" id=\\\"user-specified-css-input\\\" placeholder=\\\"/* You can override any style with CSS here */\\\"></textarea></div></div> \"\n + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0[\"public\"] : depth0),{\"name\":\"unless\",\"hash\":{},\"fn\":container.program(12, data, 0),\"inverse\":container.noop,\"data\":data})) != null ? stack1 : \"\")\n + \" </div>\";\n},\"usePartial\":true,\"useData\":true});","var Handlebars = require(\"../../../node_modules/handlebars/runtime.js\");\nfunction __default(obj) { return obj && (obj.__esModule ? obj[\"default\"] : obj); }\nmodule.exports = (Handlebars[\"default\"] || Handlebars).template({\"compiler\":[7,\">= 4.0.0\"],\"main\":function(container,depth0,helpers,partials,data) {\n var stack1;\n\n return \"<form class=\\\"container\\\" method=\\\"post\\\" action=\\\"\\\"><img src=\\\"img/logo-vertical-transparent-bg.svg\\\" class=\\\"logo\\\" alt=\\\"The Lounge\\\" width=\\\"256\\\" height=\\\"170\\\"> <img src=\\\"img/logo-vertical-transparent-bg-inverted.svg\\\" class=\\\"logo-inverted\\\" alt=\\\"The Lounge\\\" width=\\\"256\\\" height=\\\"170\\\"> <label>Username</label> <input class=\\\"input\\\" type=\\\"text\\\" name=\\\"user\\\" autocapitalize=\\\"none\\\" autocorrect=\\\"off\\\" autocomplete=\\\"username\\\" required autofocus><div class=\\\"password-container\\\"><label>Password</label> <input class=\\\"input\\\" type=\\\"password\\\" name=\\\"password\\\" autocapitalize=\\\"none\\\" autocorrect=\\\"off\\\" autocomplete=\\\"current-password\\\" required> \"\n + ((stack1 = container.invokePartial(require(\"../reveal-password.tpl\"),depth0,{\"name\":\"../reveal-password\",\"data\":data,\"helpers\":helpers,\"partials\":partials,\"decorators\":container.decorators})) != null ? stack1 : \"\")\n + \" </div><div class=\\\"error\\\">Authentication failed.</div><button type=\\\"submit\\\" class=\\\"btn\\\">Sign in</button></form>\";\n},\"usePartial\":true,\"useData\":true});","var map = {\n\t\"./collapse.js\": 155,\n\t\"./expand.js\": 156,\n\t\"./index.js\": 54,\n\t\"./join.js\": 157\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 = 154;","\"use strict\";\n\nconst $ = require(\"jquery\");\n\nexports.input = function() {\n\t$(\".chan.active .toggle-button.toggle-preview.opened\").click();\n\treturn true;\n};\n","\"use strict\";\n\nconst $ = require(\"jquery\");\n\nexports.input = function() {\n\t$(\".chan.active .toggle-button.toggle-preview:not(.opened)\").click();\n\treturn true;\n};\n","\"use strict\";\n\nconst $ = require(\"jquery\");\n\nexports.input = function(args) {\n\tconst utils = require(\"../utils\");\n\tconst socket = require(\"../socket\");\n\tconst {vueApp} = require(\"../vue\");\n\n\tif (args.length > 0) {\n\t\tconst channel = args[0];\n\n\t\tif (channel.length > 0) {\n\t\t\tconst chan = utils.findCurrentNetworkChan(channel);\n\n\t\t\tif (chan) {\n\t\t\t\t$(`#sidebar .chan[data-id=\"${chan.id}\"]`).trigger(\"click\");\n\t\t\t}\n\t\t}\n\t} else if (vueApp.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: vueApp.activeChannel.channel.id,\n\t\t\ttext: `/join ${vueApp.activeChannel.channel.name}`,\n\t\t});\n\n\t\treturn true;\n\t}\n};\n","\"use strict\";\n\nmodule.exports = function(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\nconst sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\n\nmodule.exports = function(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\nrequire(\"./auth\");\nrequire(\"./change_password\");\nrequire(\"./commands\");\nrequire(\"./init\");\nrequire(\"./join\");\nrequire(\"./more\");\nrequire(\"./msg\");\nrequire(\"./msg_preview\");\nrequire(\"./msg_special\");\nrequire(\"./names\");\nrequire(\"./network\");\nrequire(\"./nick\");\nrequire(\"./open\");\nrequire(\"./part\");\nrequire(\"./quit\");\nrequire(\"./sync_sort\");\nrequire(\"./topic\");\nrequire(\"./users\");\nrequire(\"./sign_out\");\nrequire(\"./sessions_list\");\nrequire(\"./configuration\");\nrequire(\"./changelog\");\nrequire(\"./setting\");\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst socket = require(\"../socket\");\nconst storage = require(\"../localStorage\");\nconst utils = require(\"../utils\");\nconst templates = require(\"../../views\");\nconst {vueApp} = require(\"../vue\");\n\nsocket.on(\"auth\", function(data) {\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 (utils.serverHash > -1 && data.serverHash > -1 && data.serverHash !== utils.serverHash) {\n\t\tsocket.disconnect();\n\t\tvueApp.isConnected = false;\n\t\tvueApp.currentUserVisibleError = \"Server restarted, reloading…\";\n\t\tlocation.reload(true);\n\t\treturn;\n\t}\n\n\tconst login = $(\"#sign-in\");\n\n\tif (data.serverHash > -1) {\n\t\tutils.serverHash = data.serverHash;\n\n\t\tlogin.html(templates.windows.sign_in());\n\n\t\tutils.togglePasswordField(\"#sign-in .reveal-password\");\n\n\t\tlogin.find(\"form\").on(\"submit\", function() {\n\t\t\tconst form = $(this);\n\n\t\t\tform.find(\".btn\").prop(\"disabled\", true);\n\n\t\t\tconst values = {};\n\t\t\t$.each(form.serializeArray(), function(i, obj) {\n\t\t\t\tvalues[obj.name] = obj.value;\n\t\t\t});\n\n\t\t\tstorage.set(\"user\", values.user);\n\n\t\t\tsocket.emit(\"auth\", values);\n\n\t\t\treturn false;\n\t\t});\n\t} else {\n\t\tlogin.find(\".btn\").prop(\"disabled\", false);\n\t}\n\n\tlet token;\n\tconst user = storage.get(\"user\");\n\n\tif (!data.success) {\n\t\tif (login.length === 0) {\n\t\t\tsocket.disconnect();\n\t\t\tvueApp.isConnected = false;\n\t\t\tvueApp.currentUserVisibleError = \"Authentication failed, reloading…\";\n\t\t\tlocation.reload();\n\t\t\treturn;\n\t\t}\n\n\t\tstorage.remove(\"token\");\n\n\t\tconst error = login.find(\".error\");\n\t\terror\n\t\t\t.show()\n\t\t\t.closest(\"form\")\n\t\t\t.one(\"submit\", function() {\n\t\t\t\terror.hide();\n\t\t\t});\n\t} else if (user) {\n\t\ttoken = storage.get(\"token\");\n\n\t\tif (token) {\n\t\t\tvueApp.currentUserVisibleError = \"Authorizing…\";\n\t\t\t$(\"#loading-page-message\").text(vueApp.currentUserVisibleError);\n\n\t\t\tlet lastMessage = -1;\n\n\t\t\tfor (const network of vueApp.networks) {\n\t\t\t\tfor (const chan of network.channels) {\n\t\t\t\t\tfor (const msg of chan.messages) {\n\t\t\t\t\t\tif (msg.id > lastMessage) {\n\t\t\t\t\t\t\tlastMessage = msg.id;\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\tsocket.emit(\"auth\", {user, token, lastMessage});\n\t\t}\n\t}\n\n\tif (user) {\n\t\tlogin.find(\"input[name='user']\").val(user);\n\t}\n\n\tif (token) {\n\t\treturn;\n\t}\n\n\t$(\"#loading\").remove();\n\t$(\"#footer\")\n\t\t.find(\".sign-in\")\n\t\t.trigger(\"click\", {\n\t\t\tpushState: false,\n\t\t});\n});\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst socket = require(\"../socket\");\n\nsocket.on(\"change-password\", function(data) {\n\tconst passwordForm = $(\"#change-password\");\n\n\tif (data.error || data.success) {\n\t\tconst message = data.success ? data.success : data.error;\n\t\tconst feedback = passwordForm.find(\".feedback\");\n\n\t\tif (data.success) {\n\t\t\tfeedback.addClass(\"success\").removeClass(\"error\");\n\t\t} else {\n\t\t\tfeedback.addClass(\"error\").removeClass(\"success\");\n\t\t}\n\n\t\tfeedback.text(message).show();\n\t\tfeedback.closest(\"form\").one(\"submit\", function() {\n\t\t\tfeedback.hide();\n\t\t});\n\t}\n\n\tpasswordForm\n\t\t.find(\"input\")\n\t\t.val(\"\")\n\t\t.end()\n\t\t.find(\".btn\")\n\t\t.prop(\"disabled\", false);\n});\n","const constants = require(\"../constants\");\nconst socket = require(\"../socket\");\n\nsocket.on(\"commands\", function(commands) {\n\tif (commands) {\n\t\tconstants.commands = commands;\n\t}\n});\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst escape = require(\"css.escape\");\nconst socket = require(\"../socket\");\nconst webpush = require(\"../webpush\");\nconst slideoutMenu = require(\"../slideout\");\nconst sidebar = $(\"#sidebar\");\nconst storage = require(\"../localStorage\");\nconst utils = require(\"../utils\");\nconst {vueApp, initChannel} = require(\"../vue\");\n\nsocket.on(\"init\", function(data) {\n\tvueApp.currentUserVisibleError = \"Rendering…\";\n\t$(\"#loading-page-message\").text(vueApp.currentUserVisibleError);\n\n\tconst previousActive = vueApp.activeChannel && vueApp.activeChannel.channel.id;\n\n\tvueApp.networks = mergeNetworkData(data.networks);\n\tvueApp.isConnected = true;\n\tvueApp.currentUserVisibleError = null;\n\n\tif (!vueApp.initialized) {\n\t\tvueApp.initialized = true;\n\n\t\tif (data.token) {\n\t\t\tstorage.set(\"token\", data.token);\n\t\t}\n\n\t\twebpush.configurePushNotifications(data.pushSubscription, data.applicationServerKey);\n\n\t\tslideoutMenu.enable();\n\n\t\tconst viewport = $(\"#viewport\");\n\t\tconst viewportWidth = $(window).outerWidth();\n\t\tlet isUserlistOpen = storage.get(\"thelounge.state.userlist\");\n\n\t\tif (viewportWidth > utils.mobileViewportPixels) {\n\t\t\tslideoutMenu.toggle(storage.get(\"thelounge.state.sidebar\") !== \"false\");\n\t\t}\n\n\t\t// If The Lounge is opened on a small screen (less than 1024px), and we don't have stored\n\t\t// user list state, close it by default\n\t\tif (viewportWidth >= 1024 && isUserlistOpen !== \"true\" && isUserlistOpen !== \"false\") {\n\t\t\tisUserlistOpen = \"true\";\n\t\t}\n\n\t\tviewport.toggleClass(\"userlist-open\", isUserlistOpen === \"true\");\n\n\t\t$(document.body).removeClass(\"signed-out\");\n\t\t$(\"#loading\").remove();\n\t\t$(\"#sign-in\").remove();\n\n\t\tif (window.g_LoungeErrorHandler) {\n\t\t\twindow.removeEventListener(\"error\", window.g_LoungeErrorHandler);\n\t\t\twindow.g_LoungeErrorHandler = null;\n\t\t}\n\t}\n\n\tvueApp.$nextTick(() => openCorrectChannel(previousActive, data.active));\n\n\tutils.confirmExit();\n\tutils.synchronizeNotifiedState();\n});\n\nfunction openCorrectChannel(clientActive, serverActive) {\n\tlet target = $();\n\n\t// Open last active channel\n\tif (clientActive > 0) {\n\t\ttarget = sidebar.find(`.chan[data-id=\"${clientActive}\"]`);\n\t}\n\n\t// Open window provided in location.hash\n\tif (target.length === 0 && window.location.hash) {\n\t\ttarget = $(`[data-target=\"${escape(window.location.hash)}\"]`).first();\n\t}\n\n\t// Open last active channel according to the server\n\tif (serverActive > 0 && target.length === 0) {\n\t\ttarget = sidebar.find(`.chan[data-id=\"${serverActive}\"]`);\n\t}\n\n\t// Open first available channel\n\tif (target.length === 0) {\n\t\ttarget = sidebar.find(\".chan\").first();\n\t}\n\n\t// If target channel is found, open it\n\tif (target.length > 0) {\n\t\ttarget.trigger(\"click\", {\n\t\t\treplaceHistory: true,\n\t\t});\n\n\t\treturn;\n\t}\n\n\t// Open the connect window\n\t$(\"#footer .connect\").trigger(\"click\", {\n\t\tpushState: false,\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 = vueApp.networks.find((net) => net.uuid === 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(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 vueApp.currentChannel)\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\tinitChannel(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 vueApp.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\tchannel.usersOutdated = true;\n\t\t\t\t}\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","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst socket = require(\"../socket\");\nconst {vueApp, initChannel} = require(\"../vue\");\n\nsocket.on(\"join\", function(data) {\n\tinitChannel(data.chan);\n\n\tvueApp.networks\n\t\t.find((n) => n.uuid === data.network)\n\t\t.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\tvueApp.$nextTick(() => {\n\t\t$(`#sidebar .chan[data-id=\"${data.chan.id}\"]`).trigger(\"click\");\n\t});\n});\n","\"use strict\";\n\nconst socket = require(\"../socket\");\nconst {vueApp, findChannel} = require(\"../vue\");\n\nsocket.on(\"more\", function(data) {\n\tconst channel = findChannel(data.chan);\n\n\tif (!channel) {\n\t\treturn;\n\t}\n\n\tchannel.channel.moreHistoryAvailable = data.moreHistoryAvailable;\n\tchannel.channel.messages.unshift(...data.messages);\n\n\tvueApp.$nextTick(() => {\n\t\tchannel.channel.historyLoading = false;\n\t});\n});\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst socket = require(\"../socket\");\nconst utils = require(\"../utils\");\nconst options = require(\"../options\");\nconst cleanIrcMessage = require(\"../libs/handlebars/ircmessageparser/cleanIrcMessage\");\nconst webpush = require(\"../webpush\");\nconst {vueApp, findChannel} = require(\"../vue\");\n\nlet pop;\n\ntry {\n\tpop = new Audio();\n\tpop.src = \"audio/pop.wav\";\n} catch (e) {\n\tpop = {\n\t\tplay: $.noop,\n\t};\n}\n\nsocket.on(\"msg\", function(data) {\n\tconst receivingChannel = findChannel(data.chan);\n\n\tif (!receivingChannel) {\n\t\treturn;\n\t}\n\n\tlet channel = receivingChannel.channel;\n\tconst isActiveChannel = vueApp.activeChannel && vueApp.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\t// We only want to put errors/notices in active channel if they arrive on the same network\n\tif (\n\t\tdata.msg.showInActive &&\n\t\tvueApp.activeChannel &&\n\t\tvueApp.activeChannel.network === receivingChannel.network\n\t) {\n\t\tchannel = vueApp.activeChannel.channel;\n\n\t\tdata.chan = channel.id;\n\t} else if (!isActiveChannel) {\n\t\t// Do not set unread counter for channel if it is currently active on this client\n\t\t// It may increase on the server before it processes channel open event from this client\n\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, vueApp.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 500 messages if scroll is currently at the bottom\n\t\tmessageLimit = 500;\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 ((data.msg.type === \"message\" || data.msg.type === \"action\") && channel.type === \"channel\") {\n\t\tconst user = channel.users.find((u) => u.nick === data.msg.from.nick);\n\n\t\tif (user) {\n\t\t\tuser.lastMessage = new Date(data.msg.time).getTime() || Date.now();\n\t\t}\n\t}\n\n\tif (data.msg.self || data.msg.highlight) {\n\t\tutils.synchronizeNotifiedState();\n\t}\n});\n\nfunction notifyMessage(targetId, channel, activeChannel, msg) {\n\tconst button = $(\"#sidebar .chan[data-id='\" + targetId + \"']\");\n\n\tif (msg.highlight || (options.settings.notifyAllMessages && msg.type === \"message\")) {\n\t\tif (!document.hasFocus() || !activeChannel || activeChannel.channel !== channel) {\n\t\t\tif (options.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\toptions.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 (webpush.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\twindow.focus();\n\t\t\t\t\t\t\tbutton.trigger(\"click\");\n\t\t\t\t\t\t\tthis.close();\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","\"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","\"use strict\";\n\nconst socket = require(\"../socket\");\nconst {vueApp, findChannel} = require(\"../vue\");\n\nsocket.on(\"msg:preview\", function(data) {\n\tconst {channel} = 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\tvueApp.$set(message.previews, previewIndex, data.preview);\n\t}\n});\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst socket = require(\"../socket\");\nconst {vueApp, findChannel} = require(\"../vue\");\n\nsocket.on(\"msg:special\", function(data) {\n\tfindChannel(data.chan).channel.data = data.data;\n\n\tvueApp.$nextTick(() => {\n\t\t$(`#sidebar .chan[data-id=\"${data.chan}\"]`).trigger(\"click\");\n\t});\n});\n","\"use strict\";\n\nconst socket = require(\"../socket\");\nconst {findChannel} = require(\"../vue\");\n\nsocket.on(\"names\", function(data) {\n\tconst channel = findChannel(data.id);\n\n\tif (channel) {\n\t\tchannel.channel.users = data.users;\n\t}\n});\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst socket = require(\"../socket\");\nconst templates = require(\"../../views\");\nconst sidebar = $(\"#sidebar\");\nconst utils = require(\"../utils\");\nconst {vueApp, initChannel, findChannel} = require(\"../vue\");\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(initChannel);\n\n\tvueApp.networks.push(network);\n\n\tvueApp.$nextTick(() => {\n\t\tsidebar\n\t\t\t.find(\".chan\")\n\t\t\t.last()\n\t\t\t.trigger(\"click\");\n\t});\n\n\t$(\"#connect\")\n\t\t.find(\".btn\")\n\t\t.prop(\"disabled\", false);\n});\n\nsocket.on(\"network:options\", function(data) {\n\tvueApp.networks.find((n) => n.uuid === data.network).serverOptions = data.serverOptions;\n});\n\nsocket.on(\"network:status\", function(data) {\n\tconst network = vueApp.networks.find((n) => n.uuid === 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 = 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\t$(\"#connect\")\n\t\t.html(templates.windows.connect(data))\n\t\t.find(\"form\")\n\t\t.on(\"submit\", function() {\n\t\t\tconst uuid = $(this)\n\t\t\t\t.find(\"input[name=uuid]\")\n\t\t\t\t.val();\n\t\t\tconst newName = $(this)\n\t\t\t\t.find(\"#connect\\\\:name\")\n\t\t\t\t.val();\n\n\t\t\tconst network = vueApp.networks.find((n) => n.uuid === uuid);\n\t\t\tnetwork.name = network.channels[0].name = newName;\n\n\t\t\tsidebar.find(`.network[data-uuid=\"${uuid}\"] .chan.lobby .name`).click();\n\t\t});\n\n\tutils.togglePasswordField(\"#connect .reveal-password\");\n});\n","\"use strict\";\n\nconst socket = require(\"../socket\");\nconst {vueApp} = require(\"../vue\");\n\nsocket.on(\"nick\", function(data) {\n\tconst network = vueApp.networks.find((n) => n.uuid === data.network);\n\n\tif (network) {\n\t\tnetwork.nick = data.nick;\n\t}\n});\n","\"use strict\";\n\nconst socket = require(\"../socket\");\nconst utils = require(\"../utils\");\nconst {vueApp, findChannel} = require(\"../vue\");\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 (vueApp.activeChannel && vueApp.activeChannel.channel.id === id) {\n\t\treturn;\n\t}\n\n\t// Clear the unread badge\n\tconst channel = 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\tutils.synchronizeNotifiedState();\n});\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst socket = require(\"../socket\");\nconst utils = require(\"../utils\");\nconst {vueApp, findChannel} = require(\"../vue\");\n\nsocket.on(\"part\", function(data) {\n\t// When parting from the active channel/query, jump to the network's lobby\n\tif (vueApp.activeChannel && vueApp.activeChannel.channel.id === data.chan) {\n\t\t$(\"#sidebar .chan[data-id='\" + data.chan + \"']\")\n\t\t\t.closest(\".network\")\n\t\t\t.find(\".lobby\")\n\t\t\t.trigger(\"click\");\n\t}\n\n\tconst channel = 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\tutils.synchronizeNotifiedState();\n});\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst socket = require(\"../socket\");\nconst sidebar = $(\"#sidebar\");\nconst {vueApp} = require(\"../vue\");\n\nsocket.on(\"quit\", function(data) {\n\tvueApp.networks.splice(vueApp.networks.findIndex((n) => n.uuid === data.network), 1);\n\n\tvueApp.$nextTick(() => {\n\t\tconst chan = sidebar.find(\".chan\");\n\n\t\tif (chan.length === 0) {\n\t\t\t// Open the connect window\n\t\t\t$(\"#footer .connect\").trigger(\"click\", {\n\t\t\t\tpushState: false,\n\t\t\t});\n\t\t} else {\n\t\t\tchan.eq(0).trigger(\"click\");\n\t\t}\n\t});\n});\n","\"use strict\";\n\nconst socket = require(\"../socket\");\nconst {vueApp} = require(\"../vue\");\n\nsocket.on(\"sync_sort\", function(data) {\n\tconst order = data.order;\n\n\tswitch (data.type) {\n\t\tcase \"networks\":\n\t\t\tvueApp.networks.sort((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 = vueApp.networks.find((n) => n.uuid === 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\nconst socket = require(\"../socket\");\nconst {findChannel} = require(\"../vue\");\n\nsocket.on(\"topic\", function(data) {\n\tconst channel = findChannel(data.chan);\n\n\tif (channel) {\n\t\tchannel.channel.topic = data.topic;\n\t}\n});\n","\"use strict\";\n\nconst socket = require(\"../socket\");\nconst {vueApp, findChannel} = require(\"../vue\");\n\nsocket.on(\"users\", function(data) {\n\tif (vueApp.activeChannel && vueApp.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 = findChannel(data.chan);\n\n\tif (channel) {\n\t\tchannel.channel.usersOutdated = true;\n\t}\n});\n","\"use strict\";\n\nconst socket = require(\"../socket\");\nconst Auth = require(\"../auth\");\n\nsocket.on(\"sign-out\", function() {\n\tAuth.signout();\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.\nmodule.exports = {\n\treload() {\n\t\twindow.location.reload();\n\t},\n};\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst Auth = require(\"../auth\");\nconst socket = require(\"../socket\");\nconst templates = require(\"../../views\");\n\nsocket.on(\"sessions:list\", function(data) {\n\tdata.sort((a, b) => b.lastUse - a.lastUse);\n\n\tlet html = \"\";\n\tdata.forEach((connection) => {\n\t\tif (connection.current) {\n\t\t\t$(\"#session-current\").html(templates.session(connection));\n\t\t\treturn;\n\t\t}\n\n\t\thtml += templates.session(connection);\n\t});\n\n\tif (html.length === 0) {\n\t\thtml = \"<p><em>You are not currently logged in to any other device.</em></p>\";\n\t}\n\n\t$(\"#session-list\").html(html);\n});\n\n$(\"#settings\").on(\"click\", \".remove-session\", function() {\n\tconst token = $(this).data(\"token\");\n\n\tif (token) {\n\t\tsocket.emit(\"sign-out\", token);\n\t} else {\n\t\tsocket.emit(\"sign-out\");\n\t\tAuth.signout();\n\t}\n});\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst socket = require(\"../socket\");\nconst templates = require(\"../../views\");\nconst options = require(\"../options\");\nconst webpush = require(\"../webpush\");\nconst connect = $(\"#connect\");\nconst utils = require(\"../utils\");\nconst upload = require(\"../upload\");\nconst {vueApp} = require(\"../vue\");\n\nwindow.addEventListener(\"beforeinstallprompt\", (installPromptEvent) => {\n\t$(\"#webapp-install-button\")\n\t\t.on(\"click\", function() {\n\t\t\tif (installPromptEvent && installPromptEvent.prompt) {\n\t\t\t\tinstallPromptEvent.prompt();\n\t\t\t}\n\n\t\t\t$(this).prop(\"hidden\", true);\n\t\t})\n\t\t.prop(\"hidden\", false);\n\n\t$(\"#native-app\").prop(\"hidden\", false);\n});\n\nsocket.on(\"configuration\", function(data) {\n\tvueApp.isFileUploadEnabled = data.fileUpload;\n\n\tif (options.initialized) {\n\t\t// Likely a reconnect, request sync for possibly missed settings.\n\t\tsocket.emit(\"setting:get\");\n\t\treturn;\n\t}\n\n\t$(\"#settings\").html(templates.windows.settings(data));\n\t$(\"#help\").html(templates.windows.help(data));\n\t$(\"#changelog\").html(templates.windows.changelog());\n\n\t$(\"#settings\").on(\"show\", () => {\n\t\t$(\"#session-list\").html(\"<p>Loading…</p>\");\n\t\tsocket.emit(\"sessions:get\");\n\t});\n\n\t$(\"#play\").on(\"click\", () => {\n\t\tconst pop = new Audio();\n\t\tpop.src = \"audio/pop.wav\";\n\t\tpop.play();\n\t});\n\n\tif (data.fileUpload) {\n\t\tupload.setMaxFileSize(data.fileUploadMaxFileSize);\n\t}\n\n\tutils.togglePasswordField(\"#change-password .reveal-password\");\n\n\toptions.initialize();\n\twebpush.initialize();\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 === options.settings.theme);\n\n\tif (currentTheme === undefined) {\n\t\toptions.processSetting(\"theme\", data.defaultTheme, true);\n\t} else if (currentTheme.themeColor) {\n\t\tdocument.querySelector('meta[name=\"theme-color\"]').content = currentTheme.themeColor;\n\t}\n\n\tfunction handleFormSubmit() {\n\t\tconst form = $(this);\n\t\tconst event = form.data(\"event\");\n\n\t\tform.find(\".btn\").prop(\"disabled\", true);\n\n\t\tconst values = {};\n\t\t$.each(form.serializeArray(), function(i, obj) {\n\t\t\tif (obj.value !== \"\") {\n\t\t\t\tvalues[obj.name] = obj.value;\n\t\t\t}\n\t\t});\n\n\t\tsocket.emit(event, values);\n\n\t\treturn false;\n\t}\n\n\t$(\"#change-password form\").on(\"submit\", handleFormSubmit);\n\tconnect.on(\"submit\", \"form\", handleFormSubmit);\n\n\tconnect.on(\"show\", function() {\n\t\tconnect\n\t\t\t.html(templates.windows.connect(data))\n\t\t\t.find(\"#connect\\\\:nick\")\n\t\t\t.on(\"focusin\", function() {\n\t\t\t\t// Need to set the first \"lastvalue\", so it can be used in the below function\n\t\t\t\tconst nick = $(this);\n\t\t\t\tnick.data(\"lastvalue\", nick.val());\n\t\t\t})\n\t\t\t.on(\"input\", function() {\n\t\t\t\tconst nick = $(this).val();\n\t\t\t\tconst usernameInput = connect.find(\".username\");\n\n\t\t\t\t// Because this gets called /after/ it has already changed, we need use the previous value\n\t\t\t\tconst lastValue = $(this).data(\"lastvalue\");\n\n\t\t\t\t// They were the same before the change, so update the username field\n\t\t\t\tif (usernameInput.val() === lastValue) {\n\t\t\t\t\tusernameInput.val(nick);\n\t\t\t\t}\n\n\t\t\t\t// Store the \"previous\" value, for next time\n\t\t\t\t$(this).data(\"lastvalue\", nick);\n\t\t\t});\n\n\t\tutils.togglePasswordField(\"#connect .reveal-password\");\n\t});\n\n\tif (\"URLSearchParams\" in window) {\n\t\tconst params = new URLSearchParams(document.location.search);\n\n\t\tif (params.has(\"uri\")) {\n\t\t\tparseIrcUri(params.get(\"uri\") + location.hash, data);\n\t\t} else if ($(document.body).hasClass(\"public\")) {\n\t\t\tparseOverrideParams(params, data);\n\t\t}\n\t}\n});\n\nfunction parseIrcUri(stringUri, defaults) {\n\tconst data = Object.assign({}, defaults.defaults);\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\tdata.host = data.name = uri.hostname;\n\t\tdata.port = uri.port;\n\t\tdata.username = window.decodeURIComponent(uri.username) || data.username;\n\t\tdata.password = window.decodeURIComponent(uri.password) || data.password;\n\n\t\tlet channel = (uri.pathname + uri.hash).substr(1);\n\t\tconst index = channel.indexOf(\",\");\n\n\t\tif (index > -1) {\n\t\t\tchannel = channel.substring(0, index);\n\t\t}\n\n\t\tdata.join = channel;\n\n\t\t// TODO: Need to show connect window with uri params without overriding defaults\n\t\tdefaults.defaults = data;\n\n\t\t$('button[data-target=\"#connect\"]').trigger(\"click\");\n\t} catch (e) {\n\t\t// do nothing on invalid uri\n\t}\n}\n\nfunction parseOverrideParams(params, data) {\n\tfor (let [key, value] of params) {\n\t\t// Support `channels` as a compatibility alias with other clients\n\t\tif (key === \"channels\") {\n\t\t\tkey = \"join\";\n\t\t}\n\n\t\tif (!Object.prototype.hasOwnProperty.call(data.defaults, key)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// When the network is locked, URL overrides should not affect disabled fields\n\t\tif (data.lockNetwork && [\"host\", \"port\", \"tls\", \"rejectUnauthorized\"].includes(key)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// When the network is not displayed, its name in the UI is not customizable\n\t\tif (!data.displayNetwork && key === \"name\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (key === \"join\") {\n\t\t\tvalue = value\n\t\t\t\t.split(\",\")\n\t\t\t\t.map((chan) => {\n\t\t\t\t\tif (!chan.match(/^[#&!+]/)) {\n\t\t\t\t\t\treturn `#${chan}`;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn chan;\n\t\t\t\t})\n\t\t\t\t.join(\", \");\n\t\t}\n\n\t\t// Override server provided defaults with parameters passed in the URL if they match the data type\n\t\tswitch (typeof data.defaults[key]) {\n\t\t\tcase \"boolean\":\n\t\t\t\tdata.defaults[key] = value === \"1\" || value === \"true\";\n\t\t\t\tbreak;\n\t\t\tcase \"number\":\n\t\t\t\tdata.defaults[key] = Number(value);\n\t\t\t\tbreak;\n\t\t\tcase \"string\":\n\t\t\t\tdata.defaults[key] = String(value);\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst socket = require(\"../socket\");\nconst templates = require(\"../../views\");\n\n// Requests version information if it hasn't been retrieved before (or if it has\n// been removed from the page, i.e. when clicking on \"Check now\". Displays a\n// loading state until received.\nfunction requestIfNeeded() {\n\tif ($(\"#version-checker\").is(\":empty\")) {\n\t\trenderVersionChecker({status: \"loading\"});\n\t\tsocket.emit(\"changelog\");\n\t}\n}\n\nsocket.on(\"changelog\", function(data) {\n\t// 1. Release notes window for the current version\n\t$(\"#changelog\").html(templates.windows.changelog(data.current));\n\n\tconst links = $(\"#changelog .changelog-text a\");\n\t// Make sure all links will open a new tab instead of exiting the application\n\tlinks.prop(\"target\", \"_blank\");\n\t// Add required metadata to image links, to support built-in image viewer\n\tlinks.has(\"img\").addClass(\"toggle-thumbnail\");\n\n\t// 2. Version checker visible in Help window\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\trenderVersionChecker({\n\t\tlatest: data.latest,\n\t\tstatus,\n\t});\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\tsetTimeout(() => $(\"#version-checker #check-now\").show(), data.expiresAt - Date.now());\n\t}\n});\n\n$(\"#help, #changelog\").on(\"show\", requestIfNeeded);\n\n// When clicking the \"Check now\" button, remove current checker information and\n// request a new one. Loading will be displayed in the meantime.\n$(\"#help\").on(\"click\", \"#check-now\", () => {\n\t$(\"#version-checker\").empty();\n\trequestIfNeeded();\n});\n\n// Given a status and latest release information, update the version checker\n// (CSS class and content)\nfunction renderVersionChecker({status, latest}) {\n\t$(\"#version-checker\")\n\t\t.prop(\"class\", status)\n\t\t.html(templates.version_checker({latest, status}));\n}\n","\"use strict\";\n\nconst socket = require(\"../socket\");\nconst options = require(\"../options\");\n\nfunction evaluateSetting(name, value) {\n\tif (\n\t\toptions.settings.syncSettings &&\n\t\toptions.settings[name] !== value &&\n\t\t!options.noSync.includes(name)\n\t) {\n\t\toptions.processSetting(name, value, true);\n\t} else if (options.alwaysSync.includes(name)) {\n\t\toptions.processSetting(name, value, true);\n\t}\n}\n\nsocket.on(\"setting:new\", function(data) {\n\tconst name = data.name;\n\tconst value = data.value;\n\tevaluateSetting(name, value);\n});\n\nsocket.on(\"setting:all\", function(settings) {\n\tif (Object.keys(settings).length === 0) {\n\t\toptions.syncAllSettings();\n\t} else {\n\t\tfor (const name in settings) {\n\t\t\tevaluateSetting(name, settings[name]);\n\t\t}\n\t}\n});\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst socket = require(\"./socket\");\nconst utils = require(\"./utils\");\nconst ContextMenu = require(\"./contextMenu\");\nconst contextMenuActions = [];\nconst contextMenuItems = [];\nconst {vueApp, findChannel} = require(\"./vue\");\n\nmodule.exports = {\n\taddContextMenuItem,\n\tcreateContextMenu,\n};\n\naddDefaultItems();\n\n/**\n * Used for adding context menu items. eg:\n *\n * addContextMenuItem({\n * \t\tcheck: (target) => target.hasClass(\"user\"),\n * \t\tclassName: \"customItemName\",\n * \t \tdata: (target) => target.attr(\"data-name\"),\n * \t \tdisplayName: \"Do something\",\n * \t \tcallback: (name) => console.log(name), // print the name of the user to console\n * });\n *\n * @param opts\n * @param {function(Object)} [opts.check] - Function to check whether item should show on the context menu, called with the target jquery element, shows if return is truthy\n * @param {string|function(Object)} opts.className - class name for the menu item, should be prefixed for non-default menu items (if function, called with jquery element, and uses return value)\n * @param {string|function(Object)} opts.data - data that will be sent to the callback function (if function, called with jquery element, and uses return value)\n * @param {string|function(Object)} opts.displayName - text to display on the menu item (if function, called with jquery element, and uses return value)\n * @param {function(Object)} opts.callback - Function to call when the context menu item is clicked, called with the data requested in opts.data\n */\nfunction addContextMenuItem(opts) {\n\topts.check = opts.check || (() => true);\n\topts.actionId = contextMenuActions.push(opts.callback) - 1;\n\tcontextMenuItems.push(opts);\n}\n\nfunction addContextDivider(opts) {\n\topts.check = opts.check || (() => true);\n\topts.divider = true;\n\tcontextMenuItems.push(opts);\n}\n\nfunction createContextMenu(that, event) {\n\treturn new ContextMenu(contextMenuItems, contextMenuActions, that, event);\n}\n\nfunction addWhoisItem() {\n\tfunction whois(itemData) {\n\t\tconst chan = utils.findCurrentNetworkChan(itemData);\n\n\t\tif (chan) {\n\t\t\t$(`#sidebar .chan[data-id=\"${chan.id}\"]`).trigger(\"click\");\n\t\t}\n\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: Number($(\"#chat\").attr(\"data-id\")),\n\t\t\ttext: \"/whois \" + itemData,\n\t\t});\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) => target.hasClass(\"user\"),\n\t\tclassName: \"user\",\n\t\tdisplayName: (target) => target.attr(\"data-name\"),\n\t\tdata: (target) => target.attr(\"data-name\"),\n\t\tcallback: whois,\n\t});\n\n\taddContextDivider({\n\t\tcheck: (target) => target.hasClass(\"user\"),\n\t});\n\n\taddContextMenuItem({\n\t\tcheck: (target) => target.hasClass(\"user\") || target.hasClass(\"query\"),\n\t\tclassName: \"action-whois\",\n\t\tdisplayName: \"User information\",\n\t\tdata: (target) => target.attr(\"data-name\") || target.attr(\"aria-label\"),\n\t\tcallback: whois,\n\t});\n}\n\nfunction addQueryItem() {\n\tfunction query(itemData) {\n\t\tconst chan = utils.findCurrentNetworkChan(itemData);\n\n\t\tif (chan) {\n\t\t\t$(`#sidebar .chan[data-id=\"${chan.id}\"]`).trigger(\"click\");\n\t\t}\n\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: Number($(\"#chat\").attr(\"data-id\")),\n\t\t\ttext: \"/query \" + itemData,\n\t\t});\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) => target.hasClass(\"user\"),\n\t\tclassName: \"action-query\",\n\t\tdisplayName: \"Direct messages\",\n\t\tdata: (target) => target.attr(\"data-name\"),\n\t\tcallback: query,\n\t});\n}\n\nfunction addCloseItem() {\n\tfunction getCloseDisplay(target) {\n\t\tif (target.hasClass(\"lobby\")) {\n\t\t\treturn \"Remove\";\n\t\t} else if (target.hasClass(\"channel\")) {\n\t\t\treturn \"Leave\";\n\t\t}\n\n\t\treturn \"Close\";\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) => target.hasClass(\"chan\"),\n\t\tclassName: \"close\",\n\t\tdisplayName: getCloseDisplay,\n\t\tdata: (target) => target.attr(\"data-target\"),\n\t\tcallback: (itemData) => utils.closeChan($(`.networks .chan[data-target=\"${itemData}\"]`)),\n\t});\n}\n\nfunction addConnectItem() {\n\tfunction connect(itemData) {\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: Number(itemData),\n\t\t\ttext: \"/connect\",\n\t\t});\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) => target.hasClass(\"lobby\") && target.parent().hasClass(\"not-connected\"),\n\t\tclassName: \"connect\",\n\t\tdisplayName: \"Connect\",\n\t\tdata: (target) => target.attr(\"data-id\"),\n\t\tcallback: connect,\n\t});\n}\n\nfunction addDisconnectItem() {\n\tfunction disconnect(itemData) {\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: Number(itemData),\n\t\t\ttext: \"/disconnect\",\n\t\t});\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) => target.hasClass(\"lobby\") && !target.parent().hasClass(\"not-connected\"),\n\t\tclassName: \"disconnect\",\n\t\tdisplayName: \"Disconnect\",\n\t\tdata: (target) => target.attr(\"data-id\"),\n\t\tcallback: disconnect,\n\t});\n}\n\nfunction addKickItem() {\n\tfunction kick(itemData) {\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: Number($(\"#chat\").attr(\"data-id\")),\n\t\t\ttext: \"/kick \" + itemData,\n\t\t});\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) =>\n\t\t\tutils.hasRoleInChannel(target.closest(\".chan\"), [\"op\"]) &&\n\t\t\ttarget.closest(\".chan\").attr(\"data-type\") === \"channel\",\n\t\tclassName: \"action-kick\",\n\t\tdisplayName: \"Kick\",\n\t\tdata: (target) => target.attr(\"data-name\"),\n\t\tcallback: kick,\n\t});\n}\n\nfunction addOpItem() {\n\tfunction op(itemData) {\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: Number($(\"#chat\").attr(\"data-id\")),\n\t\t\ttext: \"/op \" + itemData,\n\t\t});\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) =>\n\t\t\tutils.hasRoleInChannel(target.closest(\".chan\"), [\"op\"]) &&\n\t\t\t!utils.hasRoleInChannel(target.closest(\".chan\"), [\"op\"], target.attr(\"data-name\")),\n\t\tclassName: \"action-op\",\n\t\tdisplayName: \"Give operator (+o)\",\n\t\tdata: (target) => target.attr(\"data-name\"),\n\t\tcallback: op,\n\t});\n}\n\nfunction addDeopItem() {\n\tfunction deop(itemData) {\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: Number($(\"#chat\").attr(\"data-id\")),\n\t\t\ttext: \"/deop \" + itemData,\n\t\t});\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) =>\n\t\t\tutils.hasRoleInChannel(target.closest(\".chan\"), [\"op\"]) &&\n\t\t\tutils.hasRoleInChannel(target.closest(\".chan\"), [\"op\"], target.attr(\"data-name\")),\n\t\tclassName: \"action-op\",\n\t\tdisplayName: \"Revoke operator (-o)\",\n\t\tdata: (target) => target.attr(\"data-name\"),\n\t\tcallback: deop,\n\t});\n}\n\nfunction addVoiceItem() {\n\tfunction voice(itemData) {\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: Number($(\"#chat\").attr(\"data-id\")),\n\t\t\ttext: \"/voice \" + itemData,\n\t\t});\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) =>\n\t\t\tutils.hasRoleInChannel(target.closest(\".chan\"), [\"op\"]) &&\n\t\t\t!utils.hasRoleInChannel(target.closest(\".chan\"), [\"voice\"], target.attr(\"data-name\")),\n\t\tclassName: \"action-voice\",\n\t\tdisplayName: \"Give voice (+v)\",\n\t\tdata: (target) => target.attr(\"data-name\"),\n\t\tcallback: voice,\n\t});\n}\n\nfunction addDevoiceItem() {\n\tfunction devoice(itemData) {\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: Number($(\"#chat\").attr(\"data-id\")),\n\t\t\ttext: \"/devoice \" + itemData,\n\t\t});\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) =>\n\t\t\tutils.hasRoleInChannel(target.closest(\".chan\"), [\"op\"]) &&\n\t\t\tutils.hasRoleInChannel(target.closest(\".chan\"), [\"voice\"], target.attr(\"data-name\")),\n\t\tclassName: \"action-voice\",\n\t\tdisplayName: \"Revoke voice (-v)\",\n\t\tdata: (target) => target.attr(\"data-name\"),\n\t\tcallback: devoice,\n\t});\n}\n\nfunction addFocusItem() {\n\tfunction focusChan(itemData) {\n\t\t$(`.networks .chan[data-target=\"${itemData}\"]`).click();\n\t}\n\n\tconst getClass = (target) => {\n\t\tif (target.hasClass(\"lobby\")) {\n\t\t\treturn \"network\";\n\t\t} else if (target.hasClass(\"query\")) {\n\t\t\treturn \"query\";\n\t\t}\n\n\t\treturn \"chan\";\n\t};\n\n\taddContextMenuItem({\n\t\tcheck: (target) => target.hasClass(\"chan\"),\n\t\tclassName: getClass,\n\t\tdisplayName: (target) => target.attr(\"data-name\") || target.attr(\"aria-label\"),\n\t\tdata: (target) => target.attr(\"data-target\"),\n\t\tcallback: focusChan,\n\t});\n\n\taddContextDivider({\n\t\tcheck: (target) => target.hasClass(\"chan\"),\n\t});\n}\n\nfunction addEditNetworkItem() {\n\tfunction edit(itemData) {\n\t\tsocket.emit(\"network:get\", itemData);\n\t\t$('button[data-target=\"#connect\"]').trigger(\"click\");\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) => target.hasClass(\"lobby\"),\n\t\tclassName: \"edit\",\n\t\tdisplayName: \"Edit this network…\",\n\t\tdata: (target) => target.closest(\".network\").attr(\"data-uuid\"),\n\t\tcallback: edit,\n\t});\n}\n\nfunction addChannelListItem() {\n\tfunction list(itemData) {\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: parseInt(itemData, 10),\n\t\t\ttext: \"/list\",\n\t\t});\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) => target.hasClass(\"lobby\"),\n\t\tclassName: \"list\",\n\t\tdisplayName: \"List all channels\",\n\t\tdata: (target) => target.attr(\"data-id\"),\n\t\tcallback: list,\n\t});\n}\n\nfunction addEditTopicItem() {\n\tfunction setEditTopic(itemData) {\n\t\tfindChannel(Number(itemData)).channel.editTopic = true;\n\t\tdocument.querySelector(`#sidebar .chan[data-id=\"${Number(itemData)}\"]`).click();\n\n\t\tvueApp.$nextTick(() => {\n\t\t\tdocument.querySelector(`#chan-${Number(itemData)} .topic-input`).focus();\n\t\t});\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) => target.hasClass(\"channel\"),\n\t\tclassName: \"edit\",\n\t\tdisplayName: \"Edit topic\",\n\t\tdata: (target) => target.attr(\"data-id\"),\n\t\tcallback: setEditTopic,\n\t});\n}\n\nfunction addBanListItem() {\n\tfunction banlist(itemData) {\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: parseInt(itemData, 10),\n\t\t\ttext: \"/banlist\",\n\t\t});\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) => target.hasClass(\"channel\"),\n\t\tclassName: \"list\",\n\t\tdisplayName: \"List banned users\",\n\t\tdata: (target) => target.attr(\"data-id\"),\n\t\tcallback: banlist,\n\t});\n}\n\nfunction addJoinItem() {\n\tfunction openJoinForm(itemData) {\n\t\tfindChannel(Number(itemData)).network.isJoinChannelShown = true;\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) => target.hasClass(\"lobby\"),\n\t\tclassName: \"join\",\n\t\tdisplayName: \"Join a channel…\",\n\t\tdata: (target) => target.attr(\"data-id\"),\n\t\tcallback: openJoinForm,\n\t});\n}\n\nfunction addIgnoreListItem() {\n\tfunction ignorelist(itemData) {\n\t\tsocket.emit(\"input\", {\n\t\t\ttarget: parseInt(itemData, 10),\n\t\t\ttext: \"/ignorelist\",\n\t\t});\n\t}\n\n\taddContextMenuItem({\n\t\tcheck: (target) => target.hasClass(\"lobby\"),\n\t\tclassName: \"list\",\n\t\tdisplayName: \"List ignored users\",\n\t\tdata: (target) => target.attr(\"data-id\"),\n\t\tcallback: ignorelist,\n\t});\n}\n\nfunction addDefaultItems() {\n\taddFocusItem();\n\taddWhoisItem();\n\taddQueryItem();\n\taddKickItem();\n\taddOpItem();\n\taddDeopItem();\n\taddVoiceItem();\n\taddDevoiceItem();\n\taddEditNetworkItem();\n\taddJoinItem();\n\taddChannelListItem();\n\taddEditTopicItem();\n\taddBanListItem();\n\taddIgnoreListItem();\n\taddConnectItem();\n\taddDisconnectItem();\n\taddCloseItem();\n}\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst Mousetrap = require(\"mousetrap\");\nconst templates = require(\"../views\");\n\nconst contextMenuContainer = $(\"#context-menu-container\");\n\nmodule.exports = class ContextMenu {\n\tconstructor(contextMenuItems, contextMenuActions, selectedElement, event) {\n\t\tthis.previousActiveElement = document.activeElement;\n\t\tthis.contextMenuItems = contextMenuItems;\n\t\tthis.contextMenuActions = contextMenuActions;\n\t\tthis.selectedElement = selectedElement;\n\t\tthis.event = event;\n\t}\n\n\tshow() {\n\t\tconst contextMenu = showContextMenu(\n\t\t\tthis.contextMenuItems,\n\t\t\tthis.selectedElement,\n\t\t\tthis.event\n\t\t);\n\t\tthis.bindEvents(contextMenu);\n\t\treturn false;\n\t}\n\n\thide() {\n\t\tcontextMenuContainer\n\t\t\t.hide()\n\t\t\t.empty()\n\t\t\t.off(\".contextMenu\");\n\n\t\tMousetrap.unbind(\"escape\");\n\t}\n\n\tbindEvents(contextMenu) {\n\t\tconst contextMenuActions = this.contextMenuActions;\n\n\t\tcontextMenuActions.execute = (id, ...args) =>\n\t\t\tcontextMenuActions[id] && contextMenuActions[id](...args);\n\n\t\tconst clickItem = (item) => {\n\t\t\tconst itemData = item.attr(\"data-data\");\n\t\t\tconst contextAction = item.attr(\"data-action\");\n\n\t\t\tthis.hide();\n\n\t\t\tcontextMenuActions.execute(contextAction, itemData);\n\t\t};\n\n\t\tcontextMenu.on(\"click\", \".context-menu-item\", function() {\n\t\t\tclickItem($(this));\n\t\t});\n\n\t\tconst trap = Mousetrap(contextMenu.get(0));\n\n\t\ttrap.bind([\"up\", \"down\"], (e, key) => {\n\t\t\tconst items = contextMenu.find(\".context-menu-item\");\n\n\t\t\tlet index = items.toArray().findIndex((item) => $(item).is(\":focus\"));\n\n\t\t\tif (key === \"down\") {\n\t\t\t\tindex = (index + 1) % items.length;\n\t\t\t} else {\n\t\t\t\tindex = Math.max(index, 0) - 1;\n\t\t\t}\n\n\t\t\titems.eq(index).trigger(\"focus\");\n\t\t});\n\n\t\ttrap.bind(\"enter\", () => {\n\t\t\tconst item = contextMenu.find(\".context-menu-item:focus\");\n\n\t\t\tif (item.length) {\n\t\t\t\tclickItem(item);\n\t\t\t}\n\n\t\t\treturn false;\n\t\t});\n\n\t\t// Hide context menu when clicking or right clicking outside of it\n\t\tcontextMenuContainer.on(\"click.contextMenu contextmenu.contextMenu\", (e) => {\n\t\t\t// Do not close the menu when clicking inside of the context menu (e.g. on a divider)\n\t\t\tif ($(e.target).prop(\"id\") === \"context-menu\") {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.hide();\n\t\t\treturn false;\n\t\t});\n\n\t\t// Hide the context menu when pressing escape within the context menu container\n\t\tMousetrap.bind(\"escape\", () => {\n\t\t\tthis.hide();\n\n\t\t\t// Return focus to the previously focused element\n\t\t\t$(this.previousActiveElement).trigger(\"focus\");\n\n\t\t\treturn false;\n\t\t});\n\t}\n};\n\nfunction showContextMenu(contextMenuItems, selectedElement, event) {\n\tconst target = $(event.currentTarget);\n\tconst contextMenu = $(\"<ul>\", {\n\t\tid: \"context-menu\",\n\t\trole: \"menu\",\n\t});\n\n\tfor (const item of contextMenuItems) {\n\t\tif (item.check(target)) {\n\t\t\tif (item.divider) {\n\t\t\t\tcontextMenu.append(templates.contextmenu_divider());\n\t\t\t} else {\n\t\t\t\tcontextMenu.append(\n\t\t\t\t\ttemplates.contextmenu_item({\n\t\t\t\t\t\tclass:\n\t\t\t\t\t\t\ttypeof item.className === \"function\"\n\t\t\t\t\t\t\t\t? item.className(target)\n\t\t\t\t\t\t\t\t: item.className,\n\t\t\t\t\t\taction: item.actionId,\n\t\t\t\t\t\ttext:\n\t\t\t\t\t\t\ttypeof item.displayName === \"function\"\n\t\t\t\t\t\t\t\t? item.displayName(target)\n\t\t\t\t\t\t\t\t: item.displayName,\n\t\t\t\t\t\tdata: typeof item.data === \"function\" ? item.data(target) : item.data,\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tcontextMenuContainer.html(contextMenu).show();\n\n\tcontextMenu\n\t\t.css(positionContextMenu(contextMenu, selectedElement, event))\n\t\t.find(\".context-menu-item:first-child\")\n\t\t.trigger(\"focus\");\n\n\treturn contextMenu;\n}\n\nfunction positionContextMenu(contextMenu, selectedElement, e) {\n\tlet offset;\n\tconst menuWidth = contextMenu.outerWidth();\n\tconst menuHeight = contextMenu.outerHeight();\n\n\tif (selectedElement.hasClass(\"menu\")) {\n\t\toffset = selectedElement.offset();\n\t\toffset.left -= menuWidth - selectedElement.outerWidth();\n\t\toffset.top += selectedElement.outerHeight();\n\t\treturn offset;\n\t}\n\n\toffset = {left: e.pageX, top: e.pageY};\n\n\tif (window.innerWidth - offset.left < menuWidth) {\n\t\toffset.left = window.innerWidth - menuWidth;\n\t}\n\n\tif (window.innerHeight - offset.top < menuHeight) {\n\t\toffset.top = window.innerHeight - menuHeight;\n\t}\n\n\treturn offset;\n}\n","\"use strict\";\n\nconst $ = require(\"jquery\");\nconst Mousetrap = require(\"mousetrap\");\nconst utils = require(\"./utils\");\nconst {vueApp} = require(\"./vue\");\n\nMousetrap.bind([\"alt+up\", \"alt+down\"], function(e, keys) {\n\tconst sidebar = $(\"#sidebar\");\n\tconst channels = sidebar.find(\".chan\").not(\".network.collapsed :not(.lobby)\");\n\tconst index = channels.index(channels.filter(\".active\"));\n\tconst direction = keys.split(\"+\").pop();\n\tlet target;\n\n\tswitch (direction) {\n\t\tcase \"up\":\n\t\t\ttarget = (channels.length + (index - 1 + channels.length)) % channels.length;\n\t\t\tbreak;\n\n\t\tcase \"down\":\n\t\t\ttarget = (channels.length + (index + 1 + channels.length)) % channels.length;\n\t\t\tbreak;\n\t}\n\n\ttarget = channels.eq(target).click();\n\tutils.scrollIntoViewNicely(target[0]);\n\n\treturn false;\n});\n\nMousetrap.bind([\"alt+shift+up\", \"alt+shift+down\"], function(e, keys) {\n\tconst sidebar = $(\"#sidebar\");\n\tconst lobbies = sidebar.find(\".lobby\");\n\tconst direction = keys.split(\"+\").pop();\n\tlet index = lobbies.index(lobbies.filter(\".active\"));\n\tlet target;\n\n\tswitch (direction) {\n\t\tcase \"up\":\n\t\t\tif (index < 0) {\n\t\t\t\ttarget = lobbies.index(\n\t\t\t\t\tsidebar\n\t\t\t\t\t\t.find(\".channel\")\n\t\t\t\t\t\t.filter(\".active\")\n\t\t\t\t\t\t.siblings(\".lobby\")[0]\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\ttarget = (lobbies.length + (index - 1 + lobbies.length)) % lobbies.length;\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase \"down\":\n\t\t\tif (index < 0) {\n\t\t\t\tindex = lobbies.index(\n\t\t\t\t\tsidebar\n\t\t\t\t\t\t.find(\".channel\")\n\t\t\t\t\t\t.filter(\".active\")\n\t\t\t\t\t\t.siblings(\".lobby\")[0]\n\t\t\t\t);\n\t\t\t}\n\n\t\t\ttarget = (lobbies.length + (index + 1 + lobbies.length)) % lobbies.length;\n\n\t\t\tbreak;\n\t}\n\n\ttarget = lobbies.eq(target).click();\n\tutils.scrollIntoViewNicely(target[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() {\n\tlet targetchan;\n\n\touter_loop: for (const network of vueApp.networks) {\n\t\tfor (const chan of network.channels) {\n\t\t\tif (chan.highlight) {\n\t\t\t\ttargetchan = chan;\n\t\t\t\tbreak outer_loop;\n\t\t\t}\n\n\t\t\tif (chan.unread && !targetchan) {\n\t\t\t\ttargetchan = chan;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (targetchan) {\n\t\t$(`#sidebar .chan[data-id=\"${targetchan.id}\"]`).trigger(\"click\");\n\t}\n\n\treturn false;\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\n$(document).on(\"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\t$(\"#windows .window.active .chan.active .chat\").trigger(\"focus\");\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 = $(\"#input\");\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\tinput.trigger(\"focus\");\n\t\treturn false;\n\t}\n\n\tinput.trigger(\"focus\");\n});\n","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"viewport\",\"role\":\"tablist\"}},[_c('aside',{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\":\"The Lounge\"}}),_c('img',{staticClass:\"logo-inverted\",attrs:{\"src\":(\"img/logo-\" + (_vm.isPublic() ? 'horizontal-' : '') + \"transparent-bg-inverted.svg\"),\"alt\":\"The Lounge\"}})]),_c('NetworkList',{attrs:{\"networks\":_vm.networks,\"active-channel\":_vm.activeChannel}})],1),_vm._m(0)]),_c('div',{attrs:{\"id\":\"sidebar-overlay\"}}),_c('article',{attrs:{\"id\":\"windows\"}},[(_vm.activeChannel)?_c('Chat',{attrs:{\"network\":_vm.activeChannel.network,\"channel\":_vm.activeChannel.channel}}):_vm._e(),_c('div',{staticClass:\"window\",attrs:{\"id\":\"sign-in\",\"role\":\"tabpanel\",\"aria-label\":\"Sign-in\"}}),_c('div',{staticClass:\"window\",attrs:{\"id\":\"connect\",\"role\":\"tabpanel\",\"aria-label\":\"Connect\"}}),_c('div',{staticClass:\"window\",attrs:{\"id\":\"settings\",\"role\":\"tabpanel\",\"aria-label\":\"Settings\"}}),_c('div',{staticClass:\"window\",attrs:{\"id\":\"help\",\"role\":\"tabpanel\",\"aria-label\":\"Help\"}}),_c('div',{staticClass:\"window\",attrs:{\"id\":\"changelog\",\"aria-label\":\"Changelog\"}})],1)])}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('footer',{attrs:{\"id\":\"footer\"}},[_c('span',{staticClass:\"tooltipped tooltipped-n tooltipped-no-touch\",attrs:{\"aria-label\":\"Sign in\"}},[_c('button',{staticClass:\"icon sign-in\",attrs:{\"data-target\":\"#sign-in\",\"aria-label\":\"Sign in\",\"role\":\"tab\",\"aria-controls\":\"sign-in\",\"aria-selected\":\"false\"}})]),_c('span',{staticClass:\"tooltipped tooltipped-n tooltipped-no-touch\",attrs:{\"aria-label\":\"Connect to network\"}},[_c('button',{staticClass:\"icon connect\",attrs:{\"data-target\":\"#connect\",\"aria-label\":\"Connect to network\",\"role\":\"tab\",\"aria-controls\":\"connect\",\"aria-selected\":\"false\"}})]),_c('span',{staticClass:\"tooltipped tooltipped-n tooltipped-no-touch\",attrs:{\"aria-label\":\"Settings\"}},[_c('button',{staticClass:\"icon settings\",attrs:{\"data-target\":\"#settings\",\"aria-label\":\"Settings\",\"role\":\"tab\",\"aria-controls\":\"settings\",\"aria-selected\":\"false\"}})]),_c('span',{staticClass:\"tooltipped tooltipped-n tooltipped-no-touch\",attrs:{\"aria-label\":\"Help\"}},[_c('button',{staticClass:\"icon help\",attrs:{\"data-target\":\"#help\",\"aria-label\":\"Help\",\"role\":\"tab\",\"aria-controls\":\"help\",\"aria-selected\":\"false\"}})])])}]\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!./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<div\n\t\tv-if=\"\n\t\t\t!network.isCollapsed ||\n\t\t\t\tchannel.highlight ||\n\t\t\t\tchannel.type === 'lobby' ||\n\t\t\t\t(activeChannel && channel === activeChannel.channel)\n\t\t\"\n\t\t:class=\"[\n\t\t\t'chan',\n\t\t\tchannel.type,\n\t\t\t{active: activeChannel && channel === activeChannel.channel},\n\t\t\t{'parted-channel': channel.type === 'channel' && channel.state === 0},\n\t\t]\"\n\t\t:aria-label=\"getAriaLabel()\"\n\t\t:title=\"getAriaLabel()\"\n\t\t:data-id=\"channel.id\"\n\t\t:data-target=\"'#chan-' + channel.id\"\n\t\t:data-name=\"channel.name\"\n\t\t:aria-controls=\"'#chan-' + channel.id\"\n\t\t:aria-selected=\"activeChannel && channel === activeChannel.channel\"\n\t\trole=\"tab\"\n\t>\n\t\t<slot :network=\"network\" :channel=\"channel\" :activeChannel=\"activeChannel\" />\n\t</div>\n</template>\n\n<script>\nexport default {\n\tname: \"ChannelWrapper\",\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t\tactiveChannel: Object,\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},\n};\n</script>\n","import { render, staticRenderFns } from \"./ChannelWrapper.vue?vue&type=template&id=02f0e89d&\"\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 (\n\t\t!_vm.network.isCollapsed ||\n\t\t\t_vm.channel.highlight ||\n\t\t\t_vm.channel.type === 'lobby' ||\n\t\t\t(_vm.activeChannel && _vm.channel === _vm.activeChannel.channel)\n\t)?_c('div',{class:[\n\t\t'chan',\n\t\t_vm.channel.type,\n\t\t{active: _vm.activeChannel && _vm.channel === _vm.activeChannel.channel},\n\t\t{'parted-channel': _vm.channel.type === 'channel' && _vm.channel.state === 0} ],attrs:{\"aria-label\":_vm.getAriaLabel(),\"title\":_vm.getAriaLabel(),\"data-id\":_vm.channel.id,\"data-target\":'#chan-' + _vm.channel.id,\"data-name\":_vm.channel.name,\"aria-controls\":'#chan-' + _vm.channel.id,\"aria-selected\":_vm.activeChannel && _vm.channel === _vm.activeChannel.channel,\"role\":\"tab\"}},[_vm._t(\"default\",null,{\"network\":_vm.network,\"channel\":_vm.channel,\"activeChannel\":_vm.activeChannel})],2):_vm._e()}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<ChannelWrapper :network=\"network\" :channel=\"channel\" :active-channel=\"activeChannel\">\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\tchannel.unread | roundBadgeNumber\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('toggleJoinChannel')\"\n\t\t\t/>\n\t\t</span>\n\t</ChannelWrapper>\n</template>\n\n<script>\nimport ChannelWrapper from \"./ChannelWrapper.vue\";\nconst storage = require(\"../js/localStorage\");\n\nexport default {\n\tname: \"Channel\",\n\tcomponents: {\n\t\tChannelWrapper,\n\t},\n\tprops: {\n\t\tactiveChannel: Object,\n\t\tnetwork: Object,\n\t\tisJoinChannelShown: 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},\n\tmethods: {\n\t\tonCollapseClick() {\n\t\t\tconst networks = new Set(JSON.parse(storage.get(\"thelounge.networks.collapsed\")));\n\t\t\tthis.network.isCollapsed = !this.network.isCollapsed;\n\n\t\t\tif (this.network.isCollapsed) {\n\t\t\t\tnetworks.add(this.network.uuid);\n\t\t\t} else {\n\t\t\t\tnetworks.delete(this.network.uuid);\n\t\t\t}\n\n\t\t\tstorage.set(\"thelounge.networks.collapsed\", JSON.stringify([...networks]));\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 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&\"","import { render, staticRenderFns } from \"./NetworkLobby.vue?vue&type=template&id=3c0e9d3d&\"\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',{attrs:{\"network\":_vm.network,\"channel\":_vm.channel,\"active-channel\":_vm.activeChannel}},[(_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._f(\"roundBadgeNumber\")(_vm.channel.unread)))]):_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('toggleJoinChannel')}}})])])}\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 :network=\"network\" :channel=\"channel\" :active-channel=\"activeChannel\">\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\tchannel.unread | roundBadgeNumber\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\" />\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\" />\n\t\t\t</span>\n\t\t</template>\n\t</ChannelWrapper>\n</template>\n\n<script>\nimport ChannelWrapper from \"./ChannelWrapper.vue\";\n\nexport default {\n\tname: \"Channel\",\n\tcomponents: {\n\t\tChannelWrapper,\n\t},\n\tprops: {\n\t\tactiveChannel: Object,\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./Channel.vue?vue&type=template&id=3c36ea64&\"\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',{attrs:{\"network\":_vm.network,\"channel\":_vm.channel,\"active-channel\":_vm.activeChannel}},[_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._f(\"roundBadgeNumber\")(_vm.channel.unread)))]):_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\"}})])]:[_c('span',{staticClass:\"close-tooltip tooltipped tooltipped-w\",attrs:{\"aria-label\":\"Close\"}},[_c('button',{staticClass:\"close\",attrs:{\"aria-label\":\"Close\"}})])]],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('toggleJoinChannel')\"\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 channelToFind = this.inputChannel.toLowerCase();\n\t\t\tconst existingChannel = this.network.channels.find(\n\t\t\t\t(c) => c.name.toLowerCase() === channelToFind\n\t\t\t);\n\n\t\t\tif (existingChannel) {\n\t\t\t\tconst $ = require(\"jquery\");\n\t\t\t\t$(`#sidebar .chan[data-id=\"${existingChannel.id}\"]`).trigger(\"click\");\n\t\t\t} else {\n\t\t\t\tsocket.emit(\"input\", {\n\t\t\t\t\ttext: `/join ${this.inputChannel} ${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(\"toggleJoinChannel\");\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=\"networks.length === 0\" class=\"empty\">\n\t\tYou are not connected to any networks yet.\n\t</div>\n\t<Draggable\n\t\tv-else\n\t\t:list=\"networks\"\n\t\t:filter=\"isCurrentlyInTouch\"\n\t\t:prevent-on-filter=\"false\"\n\t\thandle=\".lobby\"\n\t\tdraggable=\".network\"\n\t\tghost-class=\"ui-sortable-ghost\"\n\t\tdrag-class=\"ui-sortable-dragged\"\n\t\tgroup=\"networks\"\n\t\tclass=\"networks\"\n\t\t@change=\"onNetworkSort\"\n\t\t@start=\"onDragStart\"\n\t\t@end=\"onDragEnd\"\n\t>\n\t\t<div\n\t\t\tv-for=\"network in networks\"\n\t\t\t:id=\"'network-' + network.uuid\"\n\t\t\t:key=\"network.uuid\"\n\t\t\t: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}\"\n\t\t\t:data-uuid=\"network.uuid\"\n\t\t\t:data-nick=\"network.nick\"\n\t\t\tclass=\"network\"\n\t\t\trole=\"region\"\n\t\t>\n\t\t\t<NetworkLobby\n\t\t\t\t:network=\"network\"\n\t\t\t\t:active-channel=\"activeChannel\"\n\t\t\t\t:is-join-channel-shown=\"network.isJoinChannelShown\"\n\t\t\t\t@toggleJoinChannel=\"network.isJoinChannelShown = !network.isJoinChannelShown\"\n\t\t\t/>\n\t\t\t<JoinChannel\n\t\t\t\tv-if=\"network.isJoinChannelShown\"\n\t\t\t\t:network=\"network\"\n\t\t\t\t:channel=\"network.channels[0]\"\n\t\t\t\t@toggleJoinChannel=\"network.isJoinChannelShown = !network.isJoinChannelShown\"\n\t\t\t/>\n\n\t\t\t<Draggable\n\t\t\t\tdraggable=\".chan\"\n\t\t\t\tghost-class=\"ui-sortable-ghost\"\n\t\t\t\tdrag-class=\"ui-sortable-dragged\"\n\t\t\t\t:group=\"network.uuid\"\n\t\t\t\t:filter=\"isCurrentlyInTouch\"\n\t\t\t\t:prevent-on-filter=\"false\"\n\t\t\t\t:list=\"network.channels\"\n\t\t\t\tclass=\"channels\"\n\t\t\t\t@change=\"onChannelSort\"\n\t\t\t\t@start=\"onDragStart\"\n\t\t\t\t@end=\"onDragEnd\"\n\t\t\t>\n\t\t\t\t<Channel\n\t\t\t\t\tv-for=\"(channel, index) in network.channels\"\n\t\t\t\t\tv-if=\"index > 0\"\n\t\t\t\t\t:key=\"channel.id\"\n\t\t\t\t\t:channel=\"channel\"\n\t\t\t\t\t:network=\"network\"\n\t\t\t\t\t:active-channel=\"activeChannel\"\n\t\t\t\t/>\n\t\t\t</Draggable>\n\t\t</div>\n\t</Draggable>\n</template>\n\n<script>\nimport Draggable from \"vuedraggable\";\nimport NetworkLobby from \"./NetworkLobby.vue\";\nimport Channel from \"./Channel.vue\";\nimport JoinChannel from \"./JoinChannel.vue\";\n\nimport socket from \"../js/socket\";\n\nexport default {\n\tname: \"NetworkList\",\n\tcomponents: {\n\t\tJoinChannel,\n\t\tNetworkLobby,\n\t\tChannel,\n\t\tDraggable,\n\t},\n\tprops: {\n\t\tactiveChannel: Object,\n\t\tnetworks: Array,\n\t},\n\tmethods: {\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.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 {findChannel} = require(\"../js/vue\");\n\t\t\tconst channel = 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},\n};\n</script>\n","import { render, staticRenderFns } from \"./JoinChannel.vue?vue&type=template&id=2e8960ea&\"\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('toggleJoinChannel')},\"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 { render, staticRenderFns } from \"./NetworkList.vue?vue&type=template&id=9c85d020&\"\nimport script from \"./NetworkList.vue?vue&type=script&lang=js&\"\nexport * from \"./NetworkList.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.networks.length === 0)?_c('div',{staticClass:\"empty\"},[_vm._v(\"\\n\\tYou are not connected to any networks yet.\\n\")]):_c('Draggable',{staticClass:\"networks\",attrs:{\"list\":_vm.networks,\"filter\":_vm.isCurrentlyInTouch,\"prevent-on-filter\":false,\"handle\":\".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.networks),function(network){return _c('div',{key:network.uuid,staticClass:\"network\",class:{\n\t\t\tcollapsed: network.isCollapsed,\n\t\t\t'not-connected': !network.status.connected,\n\t\t\t'not-secure': !network.status.secure,\n\t\t},attrs:{\"id\":'network-' + network.uuid,\"data-uuid\":network.uuid,\"data-nick\":network.nick,\"role\":\"region\"}},[_c('NetworkLobby',{attrs:{\"network\":network,\"active-channel\":_vm.activeChannel,\"is-join-channel-shown\":network.isJoinChannelShown},on:{\"toggleJoinChannel\":function($event){network.isJoinChannelShown = !network.isJoinChannelShown}}}),(network.isJoinChannelShown)?_c('JoinChannel',{attrs:{\"network\":network,\"channel\":network.channels[0]},on:{\"toggleJoinChannel\":function($event){network.isJoinChannelShown = !network.isJoinChannelShown}}}):_vm._e(),_c('Draggable',{staticClass:\"channels\",attrs:{\"draggable\":\".chan\",\"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-channel\":_vm.activeChannel}}):_vm._e()}),1)],1)}),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!./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 v-if=\"link.shown\" v-show=\"link.canDisplay\" ref=\"container\" class=\"preview\">\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\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>\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\">\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\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 :href=\"link.link\" class=\"toggle-thumbnail\" target=\"_blank\" rel=\"noopener\">\n\t\t\t\t\t<img :src=\"link.thumb\" decoding=\"async\" alt=\"\" @load=\"onPreviewReady\" />\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 preload=\"metadata\" controls @canplay=\"onPreviewReady\">\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 controls preload=\"metadata\" @canplay=\"onPreviewReady\">\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 {{ link.maxSize | friendlysize }} and cannot be\n\t\t\t\t\tpreviewed.\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>\nexport default {\n\tname: \"LinkPreview\",\n\tprops: {\n\t\tlink: Object,\n\t\tkeepScrollPosition: Function,\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},\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\tthis.$root.$on(\"resize\", this.handleResize);\n\n\t\tthis.onPreviewUpdate();\n\t},\n\tbeforeDestroy() {\n\t\tthis.$root.$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.canDisplay = 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 don't 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\" && !this.link.thumb) {\n\t\t\t\tthis.onPreviewReady();\n\t\t\t}\n\t\t},\n\t\tonPreviewReady() {\n\t\t\tthis.$set(this.link, \"canDisplay\", true);\n\n\t\t\tthis.keepScrollPosition();\n\n\t\t\tif (this.link.type !== \"link\") {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.handleResize();\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\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\tlet defaultState = true;\n\n\t\t\tswitch (this.link.type) {\n\t\t\t\tcase \"error\":\n\t\t\t\t\tdefaultState =\n\t\t\t\t\t\tthis.link.error === \"image-too-big\"\n\t\t\t\t\t\t\t? this.$root.settings.media\n\t\t\t\t\t\t\t: this.$root.settings.links;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"loading\":\n\t\t\t\t\tdefaultState = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"link\":\n\t\t\t\t\tdefaultState = this.$root.settings.links;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdefaultState = this.$root.settings.media;\n\t\t\t}\n\n\t\t\tthis.link.shown = this.link.shown && defaultState;\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./LinkPreview.vue?vue&type=template&id=7e772c22&\"\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.canDisplay),expression:\"link.canDisplay\"}],ref:\"container\",staticClass:\"preview\"},[_c('div',{ref:\"content\",class:['toggle-content', 'toggle-type-' + _vm.link.type, {opened: _vm.isContentShown}]},[(_vm.link.type === 'link')?[(_vm.link.thumb)?_c('a',{staticClass:\"toggle-thumbnail\",attrs:{\"href\":_vm.link.link,\"target\":\"_blank\",\"rel\":\"noopener\"}},[_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\"},[_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},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\"}},[_c('img',{attrs:{\"src\":_vm.link.thumb,\"decoding\":\"async\",\"alt\":\"\"},on:{\"load\":_vm.onPreviewReady}})])]:(_vm.link.type === 'video')?[_c('video',{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',{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._f(\"friendlysize\")(_vm.link.maxSize))+\" and cannot be\\n\\t\\t\\t\\tpreviewed.\\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 }","<template>\n\t<div\n\t\t:id=\"'msg-' + message.id\"\n\t\t:class=\"['msg', message.type, {self: message.self, highlight: message.highlight}]\"\n\t\t:data-from=\"message.from && message.from.nick\"\n\t>\n\t\t<span :aria-label=\"message.time | localetime\" 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\">\n\t\t\t\t<Username :user=\"message.from\" />&#32;<ParsedMessage\n\t\t\t\t\t:network=\"network\"\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/>\n\t\t\t</span>\n\t\t</template>\n\t\t<template v-else>\n\t\t\t<span v-if=\"message.type === 'message'\" class=\"from\">\n\t\t\t\t<template v-if=\"message.from && message.from.nick\">\n\t\t\t\t\t<span class=\"only-copy\">&lt;</span>\n\t\t\t\t\t<Username :user=\"message.from\" />\n\t\t\t\t\t<span class=\"only-copy\">&gt; </span>\n\t\t\t\t</template>\n\t\t\t</span>\n\t\t\t<span v-else 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\">\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/>\n\t\t\t</span>\n\t\t</template>\n\t</div>\n</template>\n\n<script>\nimport Username from \"./Username.vue\";\nimport LinkPreview from \"./LinkPreview.vue\";\nimport ParsedMessage from \"./ParsedMessage.vue\";\nimport MessageTypes from \"./MessageTypes\";\n\nconst moment = require(\"moment\");\nconst constants = require(\"../js/constants\");\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\tnetwork: Object,\n\t\tkeepScrollPosition: Function,\n\t},\n\tcomputed: {\n\t\tmessageTime() {\n\t\t\tconst format = this.$root.settings.showSeconds\n\t\t\t\t? constants.timeFormats.msgWithSeconds\n\t\t\t\t: constants.timeFormats.msgDefault;\n\n\t\t\treturn moment(this.message.time).format(format);\n\t\t},\n\t\tmessageComponent() {\n\t\t\treturn \"message-\" + this.message.type;\n\t\t},\n\t},\n\tmounted() {\n\t\trequire(\"../js/renderPreview\");\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=2a69a636&\"\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:['msg', _vm.message.type, {self: _vm.message.self, highlight: _vm.message.highlight}],attrs:{\"id\":'msg-' + _vm.message.id,\"data-from\":_vm.message.from && _vm.message.from.nick}},[_c('span',{staticClass:\"time tooltipped tooltipped-e\",attrs:{\"aria-label\":_vm._f(\"localetime\")(_vm.message.time)}},[_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\"},[_c('Username',{attrs:{\"user\":_vm.message.from}}),_vm._v(\" \"),_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}})})],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):_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\"},[_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}})})],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', 'condensed', {closed: isCollapsed}]\">\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 \"away\":\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 gone away\"\n\t\t\t\t\t\t\t\t\t\t: \" user has gone away\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase \"back\":\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 come back\"\n\t\t\t\t\t\t\t\t\t\t: \" user has come back\")\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\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=4e18d545&\"\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', 'condensed', {closed: _vm.isCollapsed}]},[_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 :data-label=\"friendlyDate()\" class=\"date-marker-text\" />\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nconst moment = require(\"moment\");\n\nexport default {\n\tname: \"DateMarker\",\n\tprops: {\n\t\tmessage: Object,\n\t},\n\tcomputed: {\n\t\tlocaleDate() {\n\t\t\treturn moment(this.message.time).format(\"D MMMM YYYY\");\n\t\t},\n\t},\n\tmounted() {\n\t\tif (this.hoursPassed() < 48) {\n\t\t\tthis.$root.$on(\"daychange\", this.dayChange);\n\t\t}\n\t},\n\tbeforeDestroy() {\n\t\tthis.$root.$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\tthis.$root.$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 moment(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=076edecc&\"\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:{\"data-label\":_vm.friendlyDate()}})])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<div ref=\"chat\" class=\"chat\" tabindex=\"-1\">\n\t\t<div :class=\"['show-more', {show: channel.moreHistoryAvailable}]\">\n\t\t\t<button\n\t\t\t\tref=\"loadMoreButton\"\n\t\t\t\t:disabled=\"channel.historyLoading || !$root.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.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: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@linkPreviewToggle=\"onLinkPreviewToggle\"\n\t\t\t\t/>\n\t\t\t</template>\n\t\t</div>\n\t</div>\n</template>\n\n<script>\nrequire(\"intersection-observer\");\n\nconst constants = require(\"../js/constants\");\nconst clipboard = require(\"../js/clipboard\");\nimport socket from \"../js/socket\";\nimport Message from \"./Message.vue\";\nimport MessageCondensed from \"./MessageCondensed.vue\";\nimport DateMarker from \"./DateMarker.vue\";\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.$root.settings.statusMessages === \"hidden\") {\n\t\t\t\treturn this.channel.messages.filter(\n\t\t\t\t\t(message) => !constants.condensedTypes.includes(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.$root.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.includes(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\tthis.$root.$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\tthis.unreadMarkerShown = false;\n\t},\n\tbeforeDestroy() {\n\t\tthis.$root.$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\treturn new Date(previousMessage.time).getDay() !== new Date(message.time).getDay();\n\t\t},\n\t\tshouldDisplayUnreadMarker(id) {\n\t\t\tif (!this.unreadMarkerShown && id > this.channel.firstUnread) {\n\t\t\t\tthis.unreadMarkerShown = true;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn false;\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\t// TODO Avoid sending many single events when using `/collapse` or `/expand`\n\t\t\t// See https://github.com/thelounge/thelounge/issues/1377\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\tlet lastMessage = this.channel.messages[0];\n\t\t\tlastMessage = lastMessage ? lastMessage.id : -1;\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});\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&\"","import { render, staticRenderFns } from \"./MessageList.vue?vue&type=template&id=4678ac3f&\"\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',{class:['show-more', {show: _vm.channel.moreHistoryAvailable}]},[_c('button',{ref:\"loadMoreButton\",staticClass:\"btn\",attrs:{\"disabled\":_vm.channel.historyLoading || !_vm.$root.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.id,attrs:{\"network\":_vm.network,\"keep-scroll-position\":_vm.keepScrollPosition,\"messages\":message.messages}}):_c('Message',{key:message.id,attrs:{\"network\":_vm.network,\"message\":message,\"keep-scroll-position\":_vm.keepScrollPosition},on:{\"linkPreviewToggle\":_vm.onLinkPreviewToggle}})]})],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<form id=\"form\" method=\"post\" action=\"\" @submit.prevent=\"onSubmit\">\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\t:value=\"channel.pendingMessage\"\n\t\t\t:placeholder=\"getInputPlaceholder(channel)\"\n\t\t\t:aria-label=\"getInputPlaceholder(channel)\"\n\t\t\tclass=\"mousetrap\"\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=\"this.$root.isFileUploadEnabled\"\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 id=\"upload-input\" ref=\"uploadInput\" type=\"file\" multiple />\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=\"!this.$root.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=\"!this.$root.isConnected\"\n\t\t\t/>\n\t\t</span>\n\t</form>\n</template>\n\n<script>\nconst commands = require(\"../js/commands/index\");\nconst socket = require(\"../js/socket\");\nconst upload = require(\"../js/upload\");\nconst Mousetrap = require(\"mousetrap\");\nconst {wrapCursor} = require(\"undate\");\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\nexport default {\n\tname: \"ChatInput\",\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t},\n\twatch: {\n\t\t\"channel.pendingMessage\"() {\n\t\t\tthis.setInputSize();\n\t\t},\n\t},\n\tmounted() {\n\t\tif (this.$root.settings.autocomplete) {\n\t\t\trequire(\"../js/autocompletion\").enable(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 (this.$root.isAutoCompleting || e.target.selectionStart !== e.target.selectionEnd) {\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.$root.isFileUploadEnabled) {\n\t\t\tupload.initialize();\n\t\t}\n\t},\n\tdestroyed() {\n\t\trequire(\"../js/autocompletion\").disable();\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.$root.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\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\topenFileUpload() {\n\t\t\tthis.$refs.uploadInput.click();\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=3e4bbf0a&\"\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\":\"nick\"}},[_vm._v(_vm._s(_vm.network.nick))]),_c('textarea',{ref:\"input\",staticClass:\"mousetrap\",attrs:{\"id\":\"input\",\"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)}}}),(this.$root.isFileUploadEnabled)?_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\",\"multiple\":\"\"}}),_c('button',{attrs:{\"id\":\"upload\",\"type\":\"button\",\"aria-label\":\"Upload file\",\"disabled\":!this.$root.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\":!this.$root.isConnected}})])])}\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!./UsernameFiltered.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!./UsernameFiltered.vue?vue&type=script&lang=js&\"","<template>\n\t<span\n\t\t:class=\"['user', $options.filters.colorClass(user.original.nick), {active: active}]\"\n\t\t:data-name=\"user.original.nick\"\n\t\trole=\"button\"\n\t\t@mouseover=\"hover\"\n\t\tv-html=\"user.original.mode + user.string\"\n\t/>\n</template>\n\n<script>\nexport default {\n\tname: \"UsernameFiltered\",\n\tprops: {\n\t\tuser: Object,\n\t\tactive: Boolean,\n\t\tonHover: Function,\n\t},\n\tmethods: {\n\t\thover() {\n\t\t\tthis.onHover ? this.onHover(this.user.original) : null;\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./UsernameFiltered.vue?vue&type=template&id=2f3a2442&\"\nimport script from \"./UsernameFiltered.vue?vue&type=script&lang=js&\"\nexport * from \"./UsernameFiltered.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',{class:['user', _vm.$options.filters.colorClass(_vm.user.original.nick), {active: _vm.active}],attrs:{\"data-name\":_vm.user.original.nick,\"role\":\"button\"},domProps:{\"innerHTML\":_vm._s(_vm.user.original.mode + _vm.user.string)},on:{\"mouseover\":_vm.hover}})}\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<UsernameFiltered\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\"\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>\nconst fuzzy = require(\"fuzzy\");\nimport Username from \"./Username.vue\";\nimport UsernameFiltered from \"./UsernameFiltered.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\tUsernameFiltered,\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\treturn fuzzy.filter(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\tif (!groups[user.original.mode]) {\n\t\t\t\t\t\tgroups[user.original.mode] = [];\n\t\t\t\t\t}\n\n\t\t\t\t\tgroups[user.original.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\tif (!groups[user.mode]) {\n\t\t\t\t\t\tgroups[user.mode] = [user];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tgroups[user.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.x,\n\t\t\t\tclientY: rect.y + 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\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=bcec4648&\"\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('UsernameFiltered',{key:user.original.nick,attrs:{\"on-hover\":_vm.hoverUser,\"active\":user.original === _vm.activeUser,\"user\":user}})}):_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\">{{ ban.banned_at | localetime }}</td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script>\nexport default {\n\tname: \"ListBans\",\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./ListBans.vue?vue&type=template&id=68646be2&\"\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._f(\"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\">{{ invite.invited_at | localetime }}</td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script>\nexport default {\n\tname: \"ListInvites\",\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./ListInvites.vue?vue&type=template&id=32bf1bf4&\"\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._f(\"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\">{{ user.when | localetime }}</td>\n\t\t\t</tr>\n\t\t</tbody>\n\t</table>\n</template>\n\n<script>\nexport default {\n\tname: \"ListIgnored\",\n\tprops: {\n\t\tnetwork: Object,\n\t\tchannel: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./ListIgnored.vue?vue&type=template&id=5942c862&\"\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._f(\"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 }","<template>\n\t<div id=\"chat-container\" class=\"window\">\n\t\t<div\n\t\t\tid=\"chat\"\n\t\t\t:data-id=\"channel.id\"\n\t\t\t:class=\"{\n\t\t\t\t'hide-motd': !this.$root.settings.motd,\n\t\t\t\t'colored-nicks': this.$root.settings.coloredNicks,\n\t\t\t\t'show-seconds': this.$root.settings.showSeconds,\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\t:class=\"[channel.type, 'chan', 'active']\"\n\t\t\t\t:data-id=\"channel.id\"\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<button class=\"lt\" aria-label=\"Toggle channel list\" />\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\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\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\" @dblclick=\"editTopic\"\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 class=\"menu\" aria-label=\"Open the context menu\" />\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 class=\"rt\" aria-label=\"Toggle user list\" />\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.$root.currentUserVisibleError\"\n\t\t\tid=\"user-visible-error\"\n\t\t\t@click=\"hideUserVisibleError\"\n\t\t>\n\t\t\t{{ this.$root.currentUserVisibleError }}\n\t\t</div>\n\t\t<span id=\"upload-progressbar\" />\n\t\t<ChatInput :network=\"network\" :channel=\"channel\" />\n\t</div>\n</template>\n\n<script>\nconst socket = require(\"../js/socket\");\nimport ParsedMessage from \"./ParsedMessage.vue\";\nimport MessageList from \"./MessageList.vue\";\nimport ChatInput from \"./ChatInput.vue\";\nimport ChatUserList from \"./ChatUserList.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},\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\tmethods: {\n\t\thideUserVisibleError() {\n\t\t\tthis.$root.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\n\t\t\t\tthis.$nextTick(() => {\n\t\t\t\t\tdocument.querySelector(`#chan-${this.channel.id} .topic-input`).focus();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tsaveTopic() {\n\t\t\tthis.channel.editTopic = false;\n\t\t\tconst newTopic = document.querySelector(`#chan-${this.channel.id} .topic-input`).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},\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!./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&\"","import { render, staticRenderFns } from \"./Chat.vue?vue&type=template&id=10550a9a&\"\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\"}},[_c('div',{class:{\n\t\t\t'hide-motd': !this.$root.settings.motd,\n\t\t\t'colored-nicks': this.$root.settings.coloredNicks,\n\t\t\t'show-seconds': this.$root.settings.showSeconds,\n\t\t},attrs:{\"id\":\"chat\",\"data-id\":_vm.channel.id}},[_c('div',{class:[_vm.channel.type, 'chan', 'active'],attrs:{\"id\":'chan-' + _vm.channel.id,\"data-id\":_vm.channel.id,\"data-type\":_vm.channel.type,\"aria-label\":_vm.channel.name,\"role\":\"tabpanel\"}},[_c('div',{staticClass:\"header\"},[_c('button',{staticClass:\"lt\",attrs:{\"aria-label\":\"Toggle channel list\"}}),_c('span',{staticClass:\"title\"},[_vm._v(_vm._s(_vm.channel.name))]),(_vm.channel.editTopic === true)?_c('div',{staticClass:\"topic-container\"},[_c('input',{staticClass:\"topic-input\",attrs:{\"placeholder\":\"Set channel topic\"},domProps:{\"value\":_vm.channel.topic},on:{\"keyup\":[function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"enter\",13,$event.key,\"Enter\")){ return null; }return _vm.saveTopic($event)},function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,\"esc\",27,$event.key,[\"Esc\",\"Escape\"])){ return null; }_vm.channel.editTopic = false}]}}),_c('span',{staticClass:\"save-topic\",attrs:{\"aria-label\":\"Save topic\"},on:{\"click\":_vm.saveTopic}},[_c('span',{attrs:{\"type\":\"button\",\"aria-label\":\"Save topic\"}})])]):_c('span',{staticClass:\"topic\",attrs:{\"title\":_vm.channel.topic},on:{\"dblclick\":_vm.editTopic}},[(_vm.channel.topic)?_c('ParsedMessage',{attrs:{\"network\":_vm.network,\"text\":_vm.channel.topic}}):_vm._e()],1),_c('button',{staticClass:\"menu\",attrs:{\"aria-label\":\"Open the context menu\"}}),(_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\"}})]):_vm._e()]),(_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.$root.currentUserVisibleError)?_c('div',{attrs:{\"id\":\"user-visible-error\"},on:{\"click\":_vm.hideUserVisibleError}},[_vm._v(\"\\n\\t\\t\"+_vm._s(this.$root.currentUserVisibleError)+\"\\n\\t\")]):_vm._e(),_c('span',{attrs:{\"id\":\"upload-progressbar\"}}),_c('ChatInput',{attrs:{\"network\":_vm.network,\"channel\":_vm.channel}})],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n\t<div id=\"viewport\" role=\"tablist\">\n\t\t<aside id=\"sidebar\">\n\t\t\t<div class=\"scrollable-area\">\n\t\t\t\t<div class=\"logo-container\">\n\t\t\t\t\t<img\n\t\t\t\t\t\t:src=\"`img/logo-${isPublic() ? 'horizontal-' : ''}transparent-bg.svg`\"\n\t\t\t\t\t\tclass=\"logo\"\n\t\t\t\t\t\talt=\"The Lounge\"\n\t\t\t\t\t/>\n\t\t\t\t\t<img\n\t\t\t\t\t\t:src=\"\n\t\t\t\t\t\t\t`img/logo-${isPublic() ? 'horizontal-' : ''}transparent-bg-inverted.svg`\n\t\t\t\t\t\t\"\n\t\t\t\t\t\tclass=\"logo-inverted\"\n\t\t\t\t\t\talt=\"The Lounge\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<NetworkList :networks=\"networks\" :active-channel=\"activeChannel\" />\n\t\t\t</div>\n\t\t\t<footer id=\"footer\">\n\t\t\t\t<span class=\"tooltipped tooltipped-n tooltipped-no-touch\" aria-label=\"Sign in\"\n\t\t\t\t\t><button\n\t\t\t\t\t\tclass=\"icon sign-in\"\n\t\t\t\t\t\tdata-target=\"#sign-in\"\n\t\t\t\t\t\taria-label=\"Sign in\"\n\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\taria-controls=\"sign-in\"\n\t\t\t\t\t\taria-selected=\"false\"\n\t\t\t\t/></span>\n\t\t\t\t<span\n\t\t\t\t\tclass=\"tooltipped tooltipped-n tooltipped-no-touch\"\n\t\t\t\t\taria-label=\"Connect to network\"\n\t\t\t\t\t><button\n\t\t\t\t\t\tclass=\"icon connect\"\n\t\t\t\t\t\tdata-target=\"#connect\"\n\t\t\t\t\t\taria-label=\"Connect to network\"\n\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\taria-controls=\"connect\"\n\t\t\t\t\t\taria-selected=\"false\"\n\t\t\t\t/></span>\n\t\t\t\t<span class=\"tooltipped tooltipped-n tooltipped-no-touch\" aria-label=\"Settings\"\n\t\t\t\t\t><button\n\t\t\t\t\t\tclass=\"icon settings\"\n\t\t\t\t\t\tdata-target=\"#settings\"\n\t\t\t\t\t\taria-label=\"Settings\"\n\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\taria-controls=\"settings\"\n\t\t\t\t\t\taria-selected=\"false\"\n\t\t\t\t/></span>\n\t\t\t\t<span class=\"tooltipped tooltipped-n tooltipped-no-touch\" aria-label=\"Help\"\n\t\t\t\t\t><button\n\t\t\t\t\t\tclass=\"icon help\"\n\t\t\t\t\t\tdata-target=\"#help\"\n\t\t\t\t\t\taria-label=\"Help\"\n\t\t\t\t\t\trole=\"tab\"\n\t\t\t\t\t\taria-controls=\"help\"\n\t\t\t\t\t\taria-selected=\"false\"\n\t\t\t\t/></span>\n\t\t\t</footer>\n\t\t</aside>\n\t\t<div id=\"sidebar-overlay\" />\n\t\t<article id=\"windows\">\n\t\t\t<Chat\n\t\t\t\tv-if=\"activeChannel\"\n\t\t\t\t:network=\"activeChannel.network\"\n\t\t\t\t:channel=\"activeChannel.channel\"\n\t\t\t/>\n\t\t\t<div id=\"sign-in\" class=\"window\" role=\"tabpanel\" aria-label=\"Sign-in\" />\n\t\t\t<div id=\"connect\" class=\"window\" role=\"tabpanel\" aria-label=\"Connect\" />\n\t\t\t<div id=\"settings\" class=\"window\" role=\"tabpanel\" aria-label=\"Settings\" />\n\t\t\t<div id=\"help\" class=\"window\" role=\"tabpanel\" aria-label=\"Help\" />\n\t\t\t<div id=\"changelog\" class=\"window\" aria-label=\"Changelog\" />\n\t\t</article>\n\t</div>\n</template>\n\n<script>\nconst throttle = require(\"lodash/throttle\");\n\nimport NetworkList from \"./NetworkList.vue\";\nimport Chat from \"./Chat.vue\";\n\nexport default {\n\tname: \"App\",\n\tcomponents: {\n\t\tNetworkList,\n\t\tChat,\n\t},\n\tprops: {\n\t\tactiveChannel: Object,\n\t\tnetworks: Array,\n\t},\n\tmounted() {\n\t\t// Make a single throttled resize listener available to all components\n\t\tthis.debouncedResize = throttle(() => {\n\t\t\tthis.$root.$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\tthis.$root.$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\twindow.removeEventListener(\"resize\", this.debouncedResize);\n\t\tclearTimeout(this.dayChangeTimeout);\n\t},\n\tmethods: {\n\t\tisPublic: () => document.body.classList.contains(\"public\"),\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},\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=67a9c57f&\"\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('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(\"\\n\\t\\t(\"),_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=2f9db9b7&\"\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 (_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!./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(\"linkPreviewToggle\", this.link, this.$parent.message);\n\t\t},\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./LinkPreviewToggle.vue?vue&type=template&id=6c50da8e&\"\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 _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\"},[(_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\\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(\"\\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\"},[(_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:\\n\\t\")],(_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\n\t\t\t>The topic is:\n\t\t</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=78e1883e&\"\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\"},[_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\"},[_vm._v(\"\\n\\tTopic set by\\n\\t\"),_c('Username',{attrs:{\"user\":_vm.message.from}}),_vm._v(\"\\n\\ton \"+_vm._s(_vm._f(\"localetime\")(_vm.message.when))+\"\\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 {{ message.when | localetime }}\n\t</span>\n</template>\n\n<script>\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};\n</script>\n","import { render, staticRenderFns } from \"./topic_set_by.vue?vue&type=template&id=c554f522&\"\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}}),_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\"},[_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.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._f(\"localetime\")(_vm.message.whois.logonTime)))])]:_vm._e(),(_vm.message.whois.idle)?[_c('dt',[_vm._v(\"Idle since:\")]),_c('dd',[_vm._v(_vm._s(_vm._f(\"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.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>{{ message.whois.logonTime | localetime }}</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>{{ message.whois.idleTime | localetime }}</dd>\n\t\t\t</template>\n\t\t</dl>\n\t</span>\n</template>\n\n<script>\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};\n</script>\n","import { render, staticRenderFns } from \"./whois.vue?vue&type=template&id=383c508e&\"\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\"},[_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\\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=70a67190&\"\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}}),_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}}),_vm._v(\" \\n\\t\"),_c('span',{staticClass:\"ctcp-message\"},[_c('ParsedMessage',{attrs:{\"text\":_vm.message.ctcpMessage}})],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import mod from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ctcp.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../../node_modules/babel-loader/lib/index.js??ref--2!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./ctcp.vue?vue&type=script&lang=js&\"","<template>\n\t<span class=\"content\">\n\t\t<Username :user=\"message.from\" />&#32;\n\t\t<span class=\"ctcp-message\"><ParsedMessage :text=\"message.ctcpMessage\"/></span>\n\t</span>\n</template>\n\n<script>\nimport ParsedMessage from \"../ParsedMessage.vue\";\nimport Username from \"../Username.vue\";\n\nexport default {\n\tname: \"MessageTypeCTCP\",\n\tcomponents: {\n\t\tParsedMessage,\n\t\tUsername,\n\t},\n\tprops: {\n\t\tnetwork: Object,\n\t\tmessage: Object,\n\t},\n};\n</script>\n","import { render, staticRenderFns } from \"./ctcp.vue?vue&type=template&id=595c47eb&\"\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}}),_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('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!./motd.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!./motd.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: \"MessageTypeMOTD\",\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 \"./motd.vue?vue&type=template&id=43ab48cc&\"\nimport script from \"./motd.vue?vue&type=script&lang=js&\"\nexport * from \"./motd.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":""}
\No newline at end of file