diff --git a/css/videolayout_default.css b/css/videolayout_default.css index b6d0c3c86..f298d05be 100644 --- a/css/videolayout_default.css +++ b/css/videolayout_default.css @@ -157,16 +157,6 @@ text-align: center; } -#remoteVideos .nick { - display: none; /* enable when you want nicks to be shown */ - position: absolute; - left: 0px; - bottom: -20px; - z-index: 0; - width: 100%; - font-size: 10pt; -} - .videocontainer>span.displayname, .videocontainer>input.displayname { display: none; diff --git a/index.html b/index.html index 1e6099e4c..7e76891e7 100644 --- a/index.html +++ b/index.html @@ -179,7 +179,6 @@
- @@ -221,7 +220,6 @@
-
diff --git a/interface_config.js b/interface_config.js index 1509f40b4..aae97d279 100644 --- a/interface_config.js +++ b/interface_config.js @@ -29,5 +29,6 @@ var interfaceConfig = { */ filmStripOnly: false, RANDOM_AVATAR_URL_PREFIX: false, - RANDOM_AVATAR_URL_SUFFIX: false + RANDOM_AVATAR_URL_SUFFIX: false, + FILM_STRIP_MAX_HEIGHT: 160 }; diff --git a/modules/UI/UI.js b/modules/UI/UI.js index ff803bf02..601dc7aba 100644 --- a/modules/UI/UI.js +++ b/modules/UI/UI.js @@ -16,6 +16,7 @@ import PreziManager from './prezi/Prezi'; import EtherpadManager from './etherpad/Etherpad'; import VideoLayout from "./videolayout/VideoLayout"; +import FilmStrip from "./videolayout/FilmStrip"; import SettingsMenu from "./side_pannels/settings/SettingsMenu"; import Settings from "./../settings/Settings"; import { reload } from '../util/helpers'; @@ -225,11 +226,6 @@ UI.changeDisplayName = function (id, displayName) { UI.initConference = function () { let id = APP.conference.localId; Toolbar.updateRoomUrl(window.location.href); - let meHTML = APP.translation.generateTranslationHTML("me"); - - let email = Settings.getEmail(); - let uid = Settings.getUserId(); - $("#localNick").html(email || `${uid} (${meHTML})`); // Add myself to the contact list. ContactList.addContact(id); @@ -244,7 +240,7 @@ UI.initConference = function () { } // Make sure we configure our avatar id, before creating avatar for us - UI.setUserAvatar(id, email); + UI.setUserAvatar(id, Settings.getEmail()); Toolbar.checkAutoEnableDesktopSharing(); if(!interfaceConfig.filmStripOnly) { @@ -293,7 +289,7 @@ function registerListeners() { function bindEvents() { function onResize() { PanelToggler.resizeChat(); - VideoLayout.resizeLargeVideoContainer(PanelToggler.isVisible()); + VideoLayout.resizeVideoArea(PanelToggler.isVisible()); } // Resize and reposition videos in full screen mode. @@ -334,12 +330,13 @@ UI.start = function () { registerListeners(); BottomToolbar.init(); + FilmStrip.init(); VideoLayout.init(eventEmitter); if (!interfaceConfig.filmStripOnly) { VideoLayout.initLargeVideo(PanelToggler.isVisible()); } - VideoLayout.resizeLargeVideoContainer(PanelToggler.isVisible(), true); + VideoLayout.resizeVideoArea(PanelToggler.isVisible(), true, true); ContactList.init(eventEmitter); @@ -367,9 +364,9 @@ UI.start = function () { }); } else { $("#header").css("display", "none"); - $("#bottomToolbar").css("display", "none"); $("#downloadlog").css("display", "none"); - BottomToolbar.setupFilmStripOnly(); + BottomToolbar.hide(); + FilmStrip.setupFilmStripOnly(); messageHandler.disableNotifications(); $('body').popover("disable"); JitsiPopover.enabled = false; @@ -586,19 +583,11 @@ UI.toggleSmileys = function () { Chat.toggleSmileys(); }; -/** - * Get current settings. - * @returns {object} settings - */ -UI.getSettings = function () { - return Settings.getSettings(); -}; - /** * Toggles film strip. */ UI.toggleFilmStrip = function () { - BottomToolbar.toggleFilmStrip(); + FilmStrip.toggleFilmStrip(); }; /** diff --git a/modules/UI/audio_levels/AudioLevels.js b/modules/UI/audio_levels/AudioLevels.js index 437216501..7e1bc68dd 100644 --- a/modules/UI/audio_levels/AudioLevels.js +++ b/modules/UI/audio_levels/AudioLevels.js @@ -2,7 +2,7 @@ /* jshint -W101 */ import CanvasUtil from './CanvasUtils'; -import BottomToolbar from '../toolbars/BottomToolbar'; +import FilmStrip from '../videolayout/FilmStrip'; const LOCAL_LEVEL = 'local'; @@ -228,7 +228,7 @@ const AudioLevels = { let canvasWidth = thumbWidth + interfaceConfig.CANVAS_EXTRA; let canvasHeight = thumbHeight + interfaceConfig.CANVAS_EXTRA; - BottomToolbar.getThumbs().children('canvas').each(function () { + FilmStrip.getThumbs().children('canvas').each(function () { $(this).attr('width', canvasWidth); $(this).attr('height', canvasHeight); }); diff --git a/modules/UI/etherpad/Etherpad.js b/modules/UI/etherpad/Etherpad.js index 1ae49289f..f5f58f921 100644 --- a/modules/UI/etherpad/Etherpad.js +++ b/modules/UI/etherpad/Etherpad.js @@ -4,7 +4,7 @@ import VideoLayout from "../videolayout/VideoLayout"; import LargeContainer from '../videolayout/LargeContainer'; import UIUtil from "../util/UIUtil"; import SidePanelToggler from "../side_pannels/SidePanelToggler"; -import BottomToolbar from '../toolbars/BottomToolbar'; +import FilmStrip from '../videolayout/FilmStrip'; /** * Etherpad options. @@ -101,7 +101,7 @@ class Etherpad extends LargeContainer { } resize (containerWidth, containerHeight, animate) { - let height = containerHeight - BottomToolbar.getFilmStripHeight(); + let height = containerHeight - FilmStrip.getFilmStripHeight(); let width = containerWidth; $(this.iframe).width(width).height(height); diff --git a/modules/UI/prezi/Prezi.js b/modules/UI/prezi/Prezi.js index c9526b891..da2b41cb5 100644 --- a/modules/UI/prezi/Prezi.js +++ b/modules/UI/prezi/Prezi.js @@ -9,7 +9,7 @@ import UIEvents from '../../../service/UI/UIEvents'; import messageHandler from '../util/MessageHandler'; import ToolbarToggler from "../toolbars/ToolbarToggler"; import SidePanelToggler from "../side_pannels/SidePanelToggler"; -import BottomToolbar from '../toolbars/BottomToolbar'; +import FilmStrip from '../videolayout/FilmStrip'; /** * Example of Prezi link. @@ -287,7 +287,7 @@ class PreziContainer extends LargeContainer { } resize (containerWidth, containerHeight) { - let height = containerHeight - BottomToolbar.getFilmStripHeight(); + let height = containerHeight - FilmStrip.getFilmStripHeight(); let width = containerWidth; diff --git a/modules/UI/side_pannels/SidePanelToggler.js b/modules/UI/side_pannels/SidePanelToggler.js index 55836556c..bf925daba 100644 --- a/modules/UI/side_pannels/SidePanelToggler.js +++ b/modules/UI/side_pannels/SidePanelToggler.js @@ -22,11 +22,16 @@ var currentlyOpen = null; * @param onOpenComplete function to be called when the panel is opened * @param onOpen function to be called if the window is going to be opened * @param onClose function to be called if the window is going to be closed + * @param onVideoResizeComplete function to be called after the video area + * is resized */ -function toggle (object, selector, onOpenComplete, onOpen, onClose) { +function toggle (object, selector, onOpenComplete, + onOpen, onClose, onVideoResizeComplete) { + let isSideBarVisible = object.isVisible(); + UIUtil.buttonClick(buttons[selector], "active"); - if (object.isVisible()) { + if (isSideBarVisible) { $("#toast-container").animate({ right: 5 }, { @@ -38,12 +43,17 @@ function toggle (object, selector, onOpenComplete, onOpen, onClose) { queue: false, duration: 500 }); + + resizeVideoArea(isSideBarVisible, onVideoResizeComplete); + if(typeof onClose === "function") { onClose(); } currentlyOpen = null; } else { + resizeVideoArea(isSideBarVisible, onVideoResizeComplete); + // Undock the toolbar when the chat is shown and if we're in a // video mode. if (VideoLayout.isLargeVideoVisible()) { @@ -80,6 +90,13 @@ function toggle (object, selector, onOpenComplete, onOpen, onClose) { } } +function resizeVideoArea(isSidePanelVisible, completeFunction) { + VideoLayout.resizeVideoArea(!isSidePanelVisible, + false, + true, + completeFunction); +} + /** * Toggler for the chat, contact list, settings menu, etc.. */ @@ -96,11 +113,9 @@ var PanelToggler = { $('#chatspace').trigger('shown'); }; - VideoLayout.resizeVideoArea(!Chat.isVisible(), chatCompleteFunction); - - toggle(Chat, - '#chatspace', - function () { + toggle(Chat, //Object + '#chatspace', // Selector + function () { //onOpenComplete // Request the focus in the nickname field or the chat input // field. if ($('#nickname').css('visibility') === 'visible') { @@ -109,9 +124,9 @@ var PanelToggler = { $('#usermsg').focus(); } }, + () => this.resizeChat(), //OnOpen null, - () => this.resizeChat(), - null); + chatCompleteFunction); //OnClose }, resizeChat () { @@ -128,7 +143,6 @@ var PanelToggler = { : function () { $('#contactlist').trigger('shown'); }; - VideoLayout.resizeVideoArea(!ContactList.isVisible(), completeFunction); toggle(ContactList, '#contactlist', @@ -136,14 +150,14 @@ var PanelToggler = { function() { ContactList.setVisualNotification(false); }, - null); + null, + completeFunction); }, /** * Opens / closes the settings menu */ toggleSettingsMenu () { - VideoLayout.resizeVideoArea(!SettingsMenu.isVisible(), function (){}); toggle(SettingsMenu, '#settingsmenu', null, diff --git a/modules/UI/toolbars/BottomToolbar.js b/modules/UI/toolbars/BottomToolbar.js index eff37614b..eae97444a 100644 --- a/modules/UI/toolbars/BottomToolbar.js +++ b/modules/UI/toolbars/BottomToolbar.js @@ -1,4 +1,4 @@ -/* global $ */ +/* global $, APP, interfaceConfig*/ import UIUtil from '../util/UIUtil'; import UIEvents from '../../../service/UI/UIEvents'; import AnalyticsAdapter from '../../statistics/AnalyticsAdapter'; @@ -11,7 +11,6 @@ const defaultBottomToolbarButtons = { const BottomToolbar = { init () { - this.filmStrip = $('#remoteVideos'); this.toolbar = $('#bottomToolbar'); }, @@ -38,71 +37,43 @@ const BottomToolbar = { ); }, - toggleFilmStrip () { - this.filmStrip.toggleClass("hidden"); - }, - - isFilmStripVisible () { - return !this.filmStrip.hasClass('hidden'); - }, - - setupFilmStripOnly () { - this.filmStrip.css({ - padding: "0px 0px 18px 0px", - right: 0 - }); - }, - - getFilmStripHeight () { - if (this.isFilmStripVisible()) { - return this.filmStrip.outerHeight(); - } else { - return 0; - } - }, - - getFilmStripWidth () { - return this.filmStrip.width(); - }, - - resizeThumbnails (thumbWidth, thumbHeight, - animate = false, forceUpdate = false) { - return new Promise(resolve => { - this.filmStrip.animate({ - // adds 2 px because of small video 1px border - height: thumbHeight + 2 - }, { - queue: false, - duration: animate ? 500 : 0 - }); - - this.getThumbs(!forceUpdate).animate({ - height: thumbHeight, - width: thumbWidth - }, { - queue: false, - duration: animate ? 500 : 0, - complete: resolve - }); - - if (!animate) { - resolve(); - } - }); - }, - resizeToolbar (thumbWidth, thumbHeight) { let bottom = (thumbHeight - this.toolbar.outerHeight())/2 + 18; this.toolbar.css({bottom}); }, - getThumbs (only_visible = false) { - let selector = 'span'; - if (only_visible) { - selector += ':visible'; - } + /** + * Returns true if this toolbar is currently visible, or false otherwise. + * @return true if currently visible, false - otherwise + */ + isVisible() { + return this.toolbar.is(":visible"); + }, - return this.filmStrip.children(selector); + /** + * Hides the bottom toolbar with animation or not depending on the animate + * parameter. + * @param animate true to hide the bottom toolbar with animation, + * false or nothing to hide it without animation. + */ + hide(animate) { + if (animate) + this.toolbar.hide("slide", {direction: "right", duration: 300}); + else + this.toolbar.css("display", "none"); + }, + + /** + * Shows the bottom toolbar with animation or not depending on the animate + * parameter. + * @param animate true to show the bottom toolbar with animation, + * false or nothing to show it without animation. + */ + show(animate) { + if (animate) + this.toolbar.show("slide", {direction: "right", duration: 300}); + else + this.toolbar.css("display", "block"); } }; diff --git a/modules/UI/toolbars/ToolbarToggler.js b/modules/UI/toolbars/ToolbarToggler.js index 16c6bb94e..698aef269 100644 --- a/modules/UI/toolbars/ToolbarToggler.js +++ b/modules/UI/toolbars/ToolbarToggler.js @@ -2,6 +2,7 @@ import UIUtil from '../util/UIUtil'; import BottomToolbar from './BottomToolbar'; +import FilmStrip from '../videolayout/FilmStrip.js'; let toolbarTimeoutObject; let toolbarTimeout = interfaceConfig.INITIAL_TOOLBAR_TIMEOUT; @@ -28,7 +29,6 @@ function hideToolbar() { } let header = $("#header"); - let bottomToolbar = $("#bottomToolbar"); let isToolbarHover = false; header.find('*').each(function () { let id = $(this).attr('id'); @@ -48,10 +48,8 @@ function hideToolbar() { } else { header.hide("slide", { direction: "up", duration: 300}); $('#subject').animate({top: "-=40"}, 300); - if (!BottomToolbar.isFilmStripVisible()) { - bottomToolbar.hide( - "slide", {direction: "right", duration: 300} - ); + if (!FilmStrip.isFilmStripVisible()) { + BottomToolbar.hide(true); } } } @@ -65,14 +63,11 @@ const ToolbarToggler = { return; } let header = $("#header"); - let bottomToolbar = $("#bottomToolbar"); - if (!header.is(':visible') || !bottomToolbar.is(":visible")) { + if (!header.is(':visible') || !BottomToolbar.isVisible()) { header.show("slide", { direction: "up", duration: 300}); $('#subject').animate({top: "+=40"}, 300); - if (!bottomToolbar.is(":visible")) { - bottomToolbar.show( - "slide", {direction: "right", duration: 300} - ); + if (!BottomToolbar.isVisible()) { + BottomToolbar.show(true); } if (toolbarTimeoutObject) { diff --git a/modules/UI/util/UIUtil.js b/modules/UI/util/UIUtil.js index 50d9f85fa..b31589e7b 100644 --- a/modules/UI/util/UIUtil.js +++ b/modules/UI/util/UIUtil.js @@ -32,6 +32,7 @@ return window.innerWidth - rightPanelWidth; }, + /** * Changes the style class of the element given by id. */ diff --git a/modules/UI/videolayout/FilmStrip.js b/modules/UI/videolayout/FilmStrip.js new file mode 100644 index 000000000..2e0a8ce50 --- /dev/null +++ b/modules/UI/videolayout/FilmStrip.js @@ -0,0 +1,138 @@ +/* global $, APP, interfaceConfig, config*/ + +import UIUtil from "../util/UIUtil"; + +const thumbAspectRatio = 16.0 / 9.0; + +const FilmStrip = { + init () { + this.filmStrip = $('#remoteVideos'); + }, + + toggleFilmStrip () { + this.filmStrip.toggleClass("hidden"); + }, + + isFilmStripVisible () { + return !this.filmStrip.hasClass('hidden'); + }, + + setupFilmStripOnly () { + this.filmStrip.css({ + padding: "0px 0px 18px 0px", + right: 0 + }); + }, + + getFilmStripHeight () { + if (this.isFilmStripVisible()) { + return this.filmStrip.outerHeight(); + } else { + return 0; + } + }, + + getFilmStripWidth () { + return this.filmStrip.innerWidth() + - parseInt(this.filmStrip.css('paddingLeft'), 10) + - parseInt(this.filmStrip.css('paddingRight'), 10); + }, + + /** + * Calculates the thumbnail size. + * @param videoAreaAvailableWidth the currently available video area width + * that we want to take into account when calculating the film strip width. + */ + calculateThumbnailSize (isSideBarVisible) { + // Calculate the available height, which is the inner window height + // minus 39px for the header minus 2px for the delimiter lines on the + // top and bottom of the large video, minus the 36px space inside the + // remoteVideos container used for highlighting shadow. + let availableHeight = 100; + + let numvids = this.getThumbs(true).length; + + let localVideoContainer = $("#localVideoContainer"); + + /** + * If the videoAreaAvailableWidth is set we use this one to calculate + * the filmStrip width, because we're probably in a state where the + * film strip size hasn't been updated yet, but it will be. + */ + let videoAreaAvailableWidth + = UIUtil.getAvailableVideoWidth(isSideBarVisible) + - parseInt(this.filmStrip.css('right'), 10) + - parseInt(this.filmStrip.css('paddingLeft'), 10) + - parseInt(this.filmStrip.css('paddingRight'), 10) + - parseInt(this.filmStrip.css('borderLeftWidth'), 10) + - parseInt(this.filmStrip.css('borderRightWidth'), 10) - 5; + + let availableWidth = Math.floor( + (videoAreaAvailableWidth - numvids * ( + parseInt(localVideoContainer.css('borderLeftWidth'), 10) + + parseInt(localVideoContainer.css('borderRightWidth'), 10) + + parseInt(localVideoContainer.css('paddingLeft'), 10) + + parseInt(localVideoContainer.css('paddingRight'), 10) + + parseInt(localVideoContainer.css('marginLeft'), 10) + + parseInt(localVideoContainer.css('marginRight'), 10))) + / numvids); + + let maxHeight + // If the MAX_HEIGHT property hasn't been specified + // we have the static value. + = Math.min( interfaceConfig.FILM_STRIP_MAX_HEIGHT || 160, + availableHeight); + + availableHeight + = Math.min( maxHeight, + availableWidth / thumbAspectRatio, + window.innerHeight - 18); + + if (availableHeight < availableWidth / thumbAspectRatio) { + availableWidth = Math.floor(availableHeight * thumbAspectRatio); + } + + return { + thumbWidth: availableWidth, + thumbHeight: availableHeight + }; + }, + + resizeThumbnails (thumbWidth, thumbHeight, + animate = false, forceUpdate = false) { + + return new Promise(resolve => { + this.getThumbs(!forceUpdate).animate({ + height: thumbHeight, + width: thumbWidth + }, { + queue: false, + duration: animate ? 500 : 0, + complete: resolve + }); + + this.filmStrip.animate({ + // adds 2 px because of small video 1px border + height: thumbHeight + 2 + }, { + queue: false, + duration: animate ? 500 : 0 + }); + + if (!animate) { + resolve(); + } + }); + }, + + getThumbs (only_visible = false) { + let selector = 'span'; + if (only_visible) { + selector += ':visible'; + } + + return this.filmStrip.children(selector); + } +}; + +export default FilmStrip; diff --git a/modules/UI/videolayout/LargeVideo.js b/modules/UI/videolayout/LargeVideo.js index 40148449c..9f27bb8b2 100644 --- a/modules/UI/videolayout/LargeVideo.js +++ b/modules/UI/videolayout/LargeVideo.js @@ -4,7 +4,7 @@ import UIUtil from "../util/UIUtil"; import UIEvents from "../../../service/UI/UIEvents"; import LargeContainer from './LargeContainer'; -import BottomToolbar from '../toolbars/BottomToolbar'; +import FilmStrip from './FilmStrip'; import Avatar from "../avatar/Avatar"; import {createDeferred} from '../../util/helpers'; @@ -43,7 +43,7 @@ function getDesktopVideoSize(videoWidth, let availableWidth = Math.max(videoWidth, videoSpaceWidth); let availableHeight = Math.max(videoHeight, videoSpaceHeight); - videoSpaceHeight -= BottomToolbar.getFilmStripHeight(); + videoSpaceHeight -= FilmStrip.getFilmStripHeight(); if (availableWidth / aspectRatio >= videoSpaceHeight) { availableHeight = videoSpaceHeight; diff --git a/modules/UI/videolayout/RemoteVideo.js b/modules/UI/videolayout/RemoteVideo.js index f0bb32155..d9f4dae10 100644 --- a/modules/UI/videolayout/RemoteVideo.js +++ b/modules/UI/videolayout/RemoteVideo.js @@ -15,10 +15,6 @@ function RemoteVideo(id, VideoLayout, emitter) { this.addRemoteVideoContainer(); this.connectionIndicator = new ConnectionIndicator(this, id); this.setDisplayName(); - var nickfield = document.createElement('span'); - nickfield.className = "nick"; - nickfield.appendChild(document.createTextNode(id)); - this.container.appendChild(nickfield); this.bindHoverHandler(); this.flipX = false; this.isLocal = false; @@ -33,7 +29,7 @@ RemoteVideo.prototype.addRemoteVideoContainer = function() { if (APP.conference.isModerator) { this.addRemoteVideoMenu(); } - let {thumbWidth, thumbHeight} = this.VideoLayout.calculateThumbnailSize(); + let {thumbWidth, thumbHeight} = this.VideoLayout.resizeThumbnails(); AudioLevels.updateAudioLevelCanvas(this.id, thumbWidth, thumbHeight); return this.container; @@ -46,7 +42,6 @@ RemoteVideo.prototype.addRemoteVideoContainer = function() { * @param id the id indicating the video for which we're adding a menu. * @param parentElement the parent element where this menu will be added */ - if (!interfaceConfig.filmStripOnly) { RemoteVideo.prototype.addRemoteVideoMenu = function () { var spanElement = document.createElement('span'); diff --git a/modules/UI/videolayout/VideoLayout.js b/modules/UI/videolayout/VideoLayout.js index b7f20e1e2..730a55dc3 100644 --- a/modules/UI/videolayout/VideoLayout.js +++ b/modules/UI/videolayout/VideoLayout.js @@ -4,7 +4,7 @@ import AudioLevels from "../audio_levels/AudioLevels"; import Avatar from "../avatar/Avatar"; import BottomToolbar from "../toolbars/BottomToolbar"; - +import FilmStrip from "./FilmStrip"; import UIEvents from "../../../service/UI/UIEvents"; import UIUtil from "../util/UIUtil"; @@ -12,6 +12,7 @@ import RemoteVideo from "./RemoteVideo"; import LargeVideoManager, {VideoContainerType} from "./LargeVideo"; import {PreziContainerType} from '../prezi/Prezi'; import LocalVideo from "./LocalVideo"; +import PanelToggler from "../side_pannels/SidePanelToggler"; const RTCUIUtil = JitsiMeetJS.util.RTCUIHelper; @@ -20,7 +21,6 @@ var remoteVideoTypes = {}; var localVideoThumbnail = null; var currentDominantSpeaker = null; -var lastNCount = config.channelLastN; var localLastNCount = config.channelLastN; var localLastNSet = []; var lastNEndpointsCache = []; @@ -34,8 +34,6 @@ var eventEmitter = null; */ var focusedVideoResourceJid = null; -const thumbAspectRatio = 16.0 / 9.0; - /** * On contact list item clicked. */ @@ -98,6 +96,7 @@ var VideoLayout = { localVideoThumbnail = new LocalVideo(VideoLayout, emitter); emitter.addListener(UIEvents.CONTACT_CLICKED, onContactClicked); + this.lastNCount = config.channelLastN; }, initLargeVideo (isSideBarVisible) { @@ -116,9 +115,9 @@ var VideoLayout = { }, isInLastN (resource) { - return lastNCount < 0 || // lastN is disabled + return this.lastNCount < 0 || // lastN is disabled // lastNEndpoints cache not built yet - (lastNCount > 0 && !lastNEndpointsCache.length) || + (this.lastNCount > 0 && !lastNEndpointsCache.length) || (lastNEndpointsCache && lastNEndpointsCache.indexOf(resource) !== -1); }, @@ -149,9 +148,8 @@ var VideoLayout = { let localId = APP.conference.localId; this.onVideoTypeChanged(localId, stream.videoType); - let {thumbWidth, thumbHeight} = this.calculateThumbnailSize(); - AudioLevels.updateAudioLevelCanvas( - null, thumbWidth, thumbHeight); + let {thumbWidth, thumbHeight} = this.resizeThumbnails(false, true); + AudioLevels.updateAudioLevelCanvas(null, thumbWidth, thumbHeight); if (!stream.isMuted()) { localVideoThumbnail.changeVideo(stream); @@ -221,7 +219,7 @@ var VideoLayout = { electLastVisibleVideo () { // pick the last visible video in the row // if nobody else is left, this picks the local video - let thumbs = BottomToolbar.getThumbs(true).filter('[id!="mixedstream"]'); + let thumbs = FilmStrip.getThumbs(true).filter('[id!="mixedstream"]'); let lastVisible = thumbs.filter(':visible:last'); if (lastVisible.length) { @@ -235,7 +233,7 @@ var VideoLayout = { } console.info("Last visible video no longer exists"); - thumbs = BottomToolbar.getThumbs(); + thumbs = FilmStrip.getThumbs(); if (thumbs.length) { let id = getPeerContainerResourceId(thumbs[0]); if (remoteVideos[id]) { @@ -271,7 +269,10 @@ var VideoLayout = { onRemoteStreamRemoved (stream) { let id = stream.getParticipantId(); - remoteVideos[id].removeRemoteStreamElement(stream); + let remoteVideo = remoteVideos[id]; + if (remoteVideo) { // remote stream may be removed after participant left the conference + remoteVideo.removeRemoteStreamElement(stream); + } }, /** @@ -345,7 +346,7 @@ var VideoLayout = { // In case this is not currently in the last n we don't show it. if (localLastNCount && localLastNCount > 0 && - BottomToolbar.getThumbs().length >= localLastNCount + 2) { + FilmStrip.getThumbs().length >= localLastNCount + 2) { remoteVideo.showPeerContainer('hide'); } else { VideoLayout.resizeThumbnails(false, true); @@ -356,8 +357,8 @@ var VideoLayout = { console.info(resourceJid + " video is now active", videoelem); - $(videoelem).show(); - VideoLayout.resizeThumbnails(); + VideoLayout.resizeThumbnails( + false, false, false, function() {$(videoelem).show();}); // Update the large video to the last added video only if there's no // current dominant, focused speaker or prezi playing or update it to @@ -411,74 +412,33 @@ var VideoLayout = { localVideoThumbnail.showAudioIndicator(isMuted); }, - /** - * Resizes the large video container. - */ - resizeLargeVideoContainer (isSideBarVisible, forceUpdate) { - let animate = false; - if (largeVideo) { - largeVideo.updateContainerSize(isSideBarVisible); - largeVideo.resize(animate); - } - this.resizeVideoSpace(animate, isSideBarVisible); - this.resizeThumbnails(false, forceUpdate); - }, - /** * Resizes thumbnails. */ - resizeThumbnails (animate = false, forceUpdate = false) { - let {thumbWidth, thumbHeight} = this.calculateThumbnailSize(); + resizeThumbnails ( animate = false, + forceUpdate = false, + isSideBarVisible = null, + onComplete = null) { + isSideBarVisible + = (isSideBarVisible !== null) + ? isSideBarVisible : PanelToggler.isVisible(); + + let {thumbWidth, thumbHeight} + = FilmStrip.calculateThumbnailSize(isSideBarVisible); $('.userAvatar').css('left', (thumbWidth - thumbHeight) / 2); - BottomToolbar.resizeThumbnails(thumbWidth, thumbHeight, + FilmStrip.resizeThumbnails(thumbWidth, thumbHeight, animate, forceUpdate) .then(function () { BottomToolbar.resizeToolbar(thumbWidth, thumbHeight); AudioLevels.updateCanvasSize(thumbWidth, thumbHeight); + if (onComplete && typeof onComplete === "function") + onComplete(); }); + return {thumbWidth, thumbHeight}; }, - /** - * Calculates the thumbnail size. - * - */ - calculateThumbnailSize () { - let videoSpaceWidth = BottomToolbar.getFilmStripWidth(); - // Calculate the available height, which is the inner window height - // minus 39px for the header minus 2px for the delimiter lines on the - // top and bottom of the large video, minus the 36px space inside the - // remoteVideos container used for highlighting shadow. - let availableHeight = 100; - - let numvids = BottomToolbar.getThumbs().length; - if (localLastNCount && localLastNCount > 0) { - numvids = Math.min(localLastNCount + 1, numvids); - } - - // Remove the 3px borders arround videos and border around the remote - // videos area and the 4 pixels between the local video and the others - //TODO: Find out where the 4 pixels come from and remove them - let availableWinWidth = videoSpaceWidth - 2 * 3 * numvids - 70 - 4; - - let availableWidth = availableWinWidth / numvids; - let maxHeight = Math.min(160, availableHeight); - availableHeight - = Math.min( maxHeight, - availableWidth / thumbAspectRatio, - window.innerHeight - 18); - - if (availableHeight < availableWidth / thumbAspectRatio) { - availableWidth = Math.floor(availableHeight * thumbAspectRatio); - } - - return { - thumbWidth: availableWidth, - thumbHeight: availableHeight - }; - }, - /** * On audio muted event. */ @@ -575,8 +535,8 @@ var VideoLayout = { * endpoints */ onLastNEndpointsChanged (lastNEndpoints, endpointsEnteringLastN) { - if (lastNCount !== lastNEndpoints.length) - lastNCount = lastNEndpoints.length; + if (this.lastNCount !== lastNEndpoints.length) + this.lastNCount = lastNEndpoints.length; lastNEndpointsCache = lastNEndpoints; @@ -591,8 +551,8 @@ var VideoLayout = { // enters E's local LastN ejecting C. // Increase the local LastN set size, if necessary. - if (lastNCount > localLastNCount) { - localLastNCount = lastNCount; + if (this.lastNCount > localLastNCount) { + localLastNCount = this.lastNCount; } // Update the local LastN set preserving the order in which the @@ -613,7 +573,7 @@ var VideoLayout = { var updateLargeVideo = false; // Handle LastN/local LastN changes. - BottomToolbar.getThumbs().each(( index, element ) => { + FilmStrip.getThumbs().each(( index, element ) => { var resourceJid = getPeerContainerResourceId(element); var smallVideo = remoteVideos[resourceJid]; @@ -667,7 +627,8 @@ var VideoLayout = { endpointsEnteringLastN.forEach(function (resourceJid) { var remoteVideo = remoteVideos[resourceJid]; - remoteVideo.showPeerContainer('show'); + if (remoteVideo) + remoteVideo.showPeerContainer('show'); if (!remoteVideo.isVisible()) { console.log("Add to last N", resourceJid); @@ -840,40 +801,31 @@ var VideoLayout = { * Resizes the video area. * * @param isSideBarVisible indicates if the side bar is currently visible - * @param callback a function to be called when the video space is + * @param forceUpdate indicates that hidden thumbnails will be shown + * @param completeFunction a function to be called when the video area is * resized. - */ - resizeVideoArea (isSideBarVisible, callback) { - let animate = true; + */resizeVideoArea (isSideBarVisible, + forceUpdate = false, + animate = false, + completeFunction = null) { if (largeVideo) { largeVideo.updateContainerSize(isSideBarVisible); largeVideo.resize(animate); - this.resizeVideoSpace(animate, isSideBarVisible, callback); } - VideoLayout.resizeThumbnails(animate); - }, - - /** - * Resizes the #videospace html element - * @param animate boolean property that indicates whether the resize should - * be animated or not. - * @param isChatVisible boolean property that indicates whether the chat - * area is displayed or not. - * If that parameter is null the method will check the chat panel - * visibility. - * @param completeFunction a function to be called when the video space - * is resized. - */ - resizeVideoSpace (animate, isChatVisible, completeFunction) { + // Calculate available width and height. let availableHeight = window.innerHeight; - let availableWidth = UIUtil.getAvailableVideoWidth(isChatVisible); + let availableWidth = UIUtil.getAvailableVideoWidth(isSideBarVisible); if (availableWidth < 0 || availableHeight < 0) { return; } + // Resize the thumbnails first. + this.resizeThumbnails(false, forceUpdate, isSideBarVisible); + + // Resize the video area element. $('#videospace').animate({ right: window.innerWidth - availableWidth, width: availableWidth, diff --git a/modules/keyboardshortcut/keyboardshortcut.js b/modules/keyboardshortcut/keyboardshortcut.js index c43e8c43d..4f48af97d 100644 --- a/modules/keyboardshortcut/keyboardshortcut.js +++ b/modules/keyboardshortcut/keyboardshortcut.js @@ -47,7 +47,6 @@ function initShortcutHandlers() { }; } - var KeyboardShortcut = { init: function () { initShortcutHandlers(); diff --git a/modules/settings/Settings.js b/modules/settings/Settings.js index 3b4deb369..8b9a545f7 100644 --- a/modules/settings/Settings.js +++ b/modules/settings/Settings.js @@ -1,9 +1,7 @@ -import {generateUsername} from '../util/UsernameGenerator'; import UIUtil from '../UI/util/UIUtil'; let email = ''; let displayName = ''; -let userId; let language = null; let cameraDeviceId = ''; let micDeviceId = ''; @@ -32,7 +30,6 @@ if (supportsLocalStorage()) { console.log("generated id", window.localStorage.jitsiMeetId); } - userId = window.localStorage.jitsiMeetId || ''; email = window.localStorage.email || ''; displayName = UIUtil.unescapeHtml(window.localStorage.displayname || ''); language = window.localStorage.language; @@ -43,7 +40,6 @@ if (supportsLocalStorage()) { ); } else { console.log("local storage is not supported"); - userId = generateUniqueId(); } export default { @@ -67,31 +63,23 @@ export default { }, /** - * Returns id of the user. - * @returns {string} user id + * Sets new email for local user and saves it to the local storage. + * @param {string} newEmail new email for the local user */ - getUserId () { - return userId; - }, - setEmail: function (newEmail) { email = newEmail; window.localStorage.email = newEmail; return email; }, + /** + * Returns email address of the local user. + * @returns {string} email + */ getEmail: function () { return email; }, - getSettings: function () { - return { - email: email, - displayName: displayName, - uid: userId, - language: language - }; - }, getLanguage () { return language; }, diff --git a/modules/util/UsernameGenerator.js b/modules/util/UsernameGenerator.js deleted file mode 100644 index f894f57ff..000000000 --- a/modules/util/UsernameGenerator.js +++ /dev/null @@ -1,425 +0,0 @@ -import RandomUtil from './RandomUtil'; - -/** - * from faker.js - Copyright (c) 2014-2015 Matthew Bergman & Marak Squires - * MIT License - * http://github.com/marak/faker.js/ - * - * @const - */ -var names = [ - "Aaliyah", "Aaron", "Abagail", "Abbey", "Abbie", "Abbigail", - "Abby", "Abdiel", "Abdul", "Abdullah", "Abe", "Abel", "Abelardo", "Abigail", - "Abigale", "Abigayle", "Abner", "Abraham", "Ada", "Adah", "Adalberto", - "Adaline", "Adam", "Adan", "Addie", "Addison", "Adela", "Adelbert", "Adele", - "Adelia", "Adeline", "Adell", "Adella", "Adelle", "Aditya", "Adolf", "Adolfo", - "Adolph", "Adolphus", "Adonis", "Adrain", "Adrian", "Adriana", "Adrianna", - "Adriel", "Adrien", "Adrienne", "Afton", "Aglae", "Agnes", "Agustin", - "Agustina", "Ahmad", "Ahmed", "Aida", "Aidan", "Aiden", "Aileen", "Aimee", - "Aisha", "Aiyana", "Akeem", "Al", "Alaina", "Alan", "Alana", "Alanis", - "Alanna", "Alayna", "Alba", "Albert", "Alberta", "Albertha", "Alberto", - "Albin", "Albina", "Alda", "Alden", "Alec", "Aleen", "Alejandra", - "Alejandrin", "Alek", "Alena", "Alene", "Alessandra", "Alessandro", "Alessia", - "Aletha", "Alex", "Alexa", "Alexander", "Alexandra", "Alexandre", - "Alexandrea", "Alexandria", "Alexandrine", "Alexandro", "Alexane", "Alexanne", - "Alexie", "Alexis", "Alexys", "Alexzander", "Alf", "Alfonso", "Alfonzo", - "Alford", "Alfred", "Alfreda", "Alfredo", "Ali", "Alia", "Alice", "Alicia", - "Alisa", "Alisha", "Alison", "Alivia", "Aliya", "Aliyah", "Aliza", "Alize", - "Allan", "Allen", "Allene", "Allie", "Allison", "Ally", "Alphonso", "Alta", - "Althea", "Alva", "Alvah", "Alvena", "Alvera", "Alverta", "Alvina", "Alvis", - "Alyce", "Alycia", "Alysa", "Alysha", "Alyson", "Alysson", "Amalia", "Amanda", - "Amani", "Amara", "Amari", "Amaya", "Amber", "Ambrose", "Amelia", "Amelie", - "Amely", "America", "Americo", "Amie", "Amina", "Amir", "Amira", "Amiya", - "Amos", "Amparo", "Amy", "Amya", "Ana", "Anabel", "Anabelle", "Anahi", - "Anais", "Anastacio", "Anastasia", "Anderson", "Andre", "Andreane", - "Andreanne", "Andres", "Andrew", "Andy", "Angel", "Angela", "Angelica", - "Angelina", "Angeline", "Angelita", "Angelo", "Angie", "Angus", "Anibal", - "Anika", "Anissa", "Anita", "Aniya", "Aniyah", "Anjali", "Anna", "Annabel", - "Annabell", "Annabelle", "Annalise", "Annamae", "Annamarie", "Anne", - "Annetta", "Annette", "Annie", "Ansel", "Ansley", "Anthony", "Antoinette", - "Antone", "Antonetta", "Antonette", "Antonia", "Antonietta", "Antonina", - "Antonio", "Antwan", "Antwon", "Anya", "April", "Ara", "Araceli", "Aracely", - "Arch", "Archibald", "Ardella", "Arden", "Ardith", "Arely", "Ari", "Ariane", - "Arianna", "Aric", "Ariel", "Arielle", "Arjun", "Arlene", "Arlie", "Arlo", - "Armand", "Armando", "Armani", "Arnaldo", "Arne", "Arno", "Arnold", "Arnoldo", - "Arnulfo", "Aron", "Art", "Arthur", "Arturo", "Arvel", "Arvid", "Arvilla", - "Aryanna", "Asa", "Asha", "Ashlee", "Ashleigh", "Ashley", "Ashly", "Ashlynn", - "Ashton", "Ashtyn", "Asia", "Assunta", "Astrid", "Athena", "Aubree", "Aubrey", - "Audie", "Audra", "Audreanne", "Audrey", "August", "Augusta", "Augustine", - "Augustus", "Aurelia", "Aurelie", "Aurelio", "Aurore", "Austen", "Austin", - "Austyn", "Autumn", "Ava", "Avery", "Avis", "Axel", "Ayana", "Ayden", "Ayla", - "Aylin", "Baby", "Bailee", "Bailey", "Barbara", "Barney", "Baron", "Barrett", - "Barry", "Bart", "Bartholome", "Barton", "Baylee", "Beatrice", "Beau", - "Beaulah", "Bell", "Bella", "Belle", "Ben", "Benedict", "Benjamin", "Bennett", - "Bennie", "Benny", "Benton", "Berenice", "Bernadette", "Bernadine", "Bernard", - "Bernardo", "Berneice", "Bernhard", "Bernice", "Bernie", "Berniece", - "Bernita", "Berry", "Bert", "Berta", "Bertha", "Bertram", "Bertrand", "Beryl", - "Bessie", "Beth", "Bethany", "Bethel", "Betsy", "Bette", "Bettie", "Betty", - "Bettye", "Beulah", "Beverly", "Bianka", "Bill", "Billie", "Billy", "Birdie", - "Blair", "Blaise", "Blake", "Blanca", "Blanche", "Blaze", "Bo", "Bobbie", - "Bobby", "Bonita", "Bonnie", "Boris", "Boyd", "Brad", "Braden", "Bradford", - "Bradley", "Bradly", "Brady", "Braeden", "Brain", "Brandi", "Brando", - "Brandon", "Brandt", "Brandy", "Brandyn", "Brannon", "Branson", "Brant", - "Braulio", "Braxton", "Brayan", "Breana", "Breanna", "Breanne", "Brenda", - "Brendan", "Brenden", "Brendon", "Brenna", "Brennan", "Brennon", "Brent", - "Bret", "Brett", "Bria", "Brian", "Briana", "Brianne", "Brice", "Bridget", - "Bridgette", "Bridie", "Brielle", "Brigitte", "Brionna", "Brisa", "Britney", - "Brittany", "Brock", "Broderick", "Brody", "Brook", "Brooke", "Brooklyn", - "Brooks", "Brown", "Bruce", "Bryana", "Bryce", "Brycen", "Bryon", "Buck", - "Bud", "Buddy", "Buford", "Bulah", "Burdette", "Burley", "Burnice", "Buster", - "Cade", "Caden", "Caesar", "Caitlyn", "Cale", "Caleb", "Caleigh", "Cali", - "Calista", "Callie", "Camden", "Cameron", "Camila", "Camilla", "Camille", - "Camren", "Camron", "Camryn", "Camylle", "Candace", "Candelario", "Candice", - "Candida", "Candido", "Cara", "Carey", "Carissa", "Carlee", "Carleton", - "Carley", "Carli", "Carlie", "Carlo", "Carlos", "Carlotta", "Carmel", - "Carmela", "Carmella", "Carmelo", "Carmen", "Carmine", "Carol", "Carolanne", - "Carole", "Carolina", "Caroline", "Carolyn", "Carolyne", "Carrie", "Carroll", - "Carson", "Carter", "Cary", "Casandra", "Casey", "Casimer", "Casimir", - "Casper", "Cassandra", "Cassandre", "Cassidy", "Cassie", "Catalina", - "Caterina", "Catharine", "Catherine", "Cathrine", "Cathryn", "Cathy", "Cayla", - "Ceasar", "Cecelia", "Cecil", "Cecile", "Cecilia", "Cedrick", "Celestine", - "Celestino", "Celia", "Celine", "Cesar", "Chad", "Chadd", "Chadrick", "Chaim", - "Chance", "Chandler", "Chanel", "Chanelle", "Charity", "Charlene", "Charles", - "Charley", "Charlie", "Charlotte", "Chase", "Chasity", "Chauncey", "Chaya", - "Chaz", "Chelsea", "Chelsey", "Chelsie", "Chesley", "Chester", "Chet", - "Cheyanne", "Cheyenne", "Chloe", "Chris", "Christ", "Christa", "Christelle", - "Christian", "Christiana", "Christina", "Christine", "Christop", "Christophe", - "Christopher", "Christy", "Chyna", "Ciara", "Cicero", "Cielo", "Cierra", - "Cindy", "Citlalli", "Clair", "Claire", "Clara", "Clarabelle", "Clare", - "Clarissa", "Clark", "Claud", "Claude", "Claudia", "Claudie", "Claudine", - "Clay", "Clemens", "Clement", "Clementina", "Clementine", "Clemmie", "Cleo", - "Cleora", "Cleta", "Cletus", "Cleve", "Cleveland", "Clifford", "Clifton", - "Clint", "Clinton", "Clotilde", "Clovis", "Cloyd", "Clyde", "Coby", "Cody", - "Colby", "Cole", "Coleman", "Colin", "Colleen", "Collin", "Colt", "Colten", - "Colton", "Columbus", "Concepcion", "Conner", "Connie", "Connor", "Conor", - "Conrad", "Constance", "Constantin", "Consuelo", "Cooper", "Cora", "Coralie", - "Corbin", "Cordelia", "Cordell", "Cordia", "Cordie", "Corene", "Corine", - "Cornelius", "Cornell", "Corrine", "Cortez", "Cortney", "Cory", "Coty", - "Courtney", "Coy", "Craig", "Crawford", "Creola", "Cristal", "Cristian", - "Cristina", "Cristobal", "Cristopher", "Cruz", "Crystal", "Crystel", "Cullen", - "Curt", "Curtis", "Cydney", "Cynthia", "Cyril", "Cyrus", "Dagmar", "Dahlia", - "Daija", "Daisha", "Daisy", "Dakota", "Dale", "Dallas", "Dallin", "Dalton", - "Damaris", "Dameon", "Damian", "Damien", "Damion", "Damon", "Dan", "Dana", - "Dandre", "Dane", "D'angelo", "Dangelo", "Danial", "Daniela", "Daniella", - "Danielle", "Danika", "Dannie", "Danny", "Dante", "Danyka", "Daphne", - "Daphnee", "Daphney", "Darby", "Daren", "Darian", "Dariana", "Darien", - "Dario", "Darion", "Darius", "Darlene", "Daron", "Darrel", "Darrell", - "Darren", "Darrick", "Darrin", "Darrion", "Darron", "Darryl", "Darwin", - "Daryl", "Dashawn", "Dasia", "Dave", "David", "Davin", "Davion", "Davon", - "Davonte", "Dawn", "Dawson", "Dax", "Dayana", "Dayna", "Dayne", "Dayton", - "Dean", "Deangelo", "Deanna", "Deborah", "Declan", "Dedric", "Dedrick", "Dee", - "Deion", "Deja", "Dejah", "Dejon", "Dejuan", "Delaney", "Delbert", "Delfina", - "Delia", "Delilah", "Dell", "Della", "Delmer", "Delores", "Delpha", "Delphia", - "Delphine", "Delta", "Demarco", "Demarcus", "Demario", "Demetris", - "Demetrius", "Demond", "Dena", "Denis", "Dennis", "Deon", "Deondre", - "Deontae", "Deonte", "Dereck", "Derek", "Derick", "Deron", "Derrick", - "Deshaun", "Deshawn", "Desiree", "Desmond", "Dessie", "Destany", "Destin", - "Destinee", "Destiney", "Destini", "Destiny", "Devan", "Devante", "Deven", - "Devin", "Devon", "Devonte", "Devyn", "Dewayne", "Dewitt", "Dexter", - "Diamond", "Diana", "Dianna", "Diego", "Dillan", "Dillon", "Dimitri", "Dina", - "Dino", "Dion", "Dixie", "Dock", "Dolly", "Dolores", "Domenic", "Domenica", - "Domenick", "Domenico", "Domingo", "Dominic", "Dominique", "Don", "Donald", - "Donato", "Donavon", "Donna", "Donnell", "Donnie", "Donny", "Dora", "Dorcas", - "Dorian", "Doris", "Dorothea", "Dorothy", "Dorris", "Dortha", "Dorthy", - "Doug", "Douglas", "Dovie", "Doyle", "Drake", "Drew", "Duane", "Dudley", - "Dulce", "Duncan", "Durward", "Dustin", "Dusty", "Dwight", "Dylan", "Earl", - "Earlene", "Earline", "Earnest", "Earnestine", "Easter", "Easton", "Ebba", - "Ebony", "Ed", "Eda", "Edd", "Eddie", "Eden", "Edgar", "Edgardo", "Edison", - "Edmond", "Edmund", "Edna", "Eduardo", "Edward", "Edwardo", "Edwin", "Edwina", - "Edyth", "Edythe", "Effie", "Efrain", "Efren", "Eileen", "Einar", "Eino", - "Eladio", "Elaina", "Elbert", "Elda", "Eldon", "Eldora", "Eldred", "Eldridge", - "Eleanora", "Eleanore", "Eleazar", "Electa", "Elena", "Elenor", "Elenora", - "Eleonore", "Elfrieda", "Eli", "Elian", "Eliane", "Elias", "Eliezer", - "Elijah", "Elinor", "Elinore", "Elisa", "Elisabeth", "Elise", "Eliseo", - "Elisha", "Elissa", "Eliza", "Elizabeth", "Ella", "Ellen", "Ellie", "Elliot", - "Elliott", "Ellis", "Ellsworth", "Elmer", "Elmira", "Elmo", "Elmore", "Elna", - "Elnora", "Elody", "Eloisa", "Eloise", "Elouise", "Eloy", "Elroy", "Elsa", - "Else", "Elsie", "Elta", "Elton", "Elva", "Elvera", "Elvie", "Elvis", "Elwin", - "Elwyn", "Elyse", "Elyssa", "Elza", "Emanuel", "Emelia", "Emelie", "Emely", - "Emerald", "Emerson", "Emery", "Emie", "Emil", "Emile", "Emilia", "Emiliano", - "Emilie", "Emilio", "Emily", "Emma", "Emmalee", "Emmanuel", "Emmanuelle", - "Emmet", "Emmett", "Emmie", "Emmitt", "Emmy", "Emory", "Ena", "Enid", "Enoch", - "Enola", "Enos", "Enrico", "Enrique", "Ephraim", "Era", "Eriberto", "Eric", - "Erica", "Erich", "Erick", "Ericka", "Erik", "Erika", "Erin", "Erling", - "Erna", "Ernest", "Ernestina", "Ernestine", "Ernesto", "Ernie", "Ervin", - "Erwin", "Eryn", "Esmeralda", "Esperanza", "Esta", "Esteban", "Estefania", - "Estel", "Estell", "Estella", "Estelle", "Estevan", "Esther", "Estrella", - "Etha", "Ethan", "Ethel", "Ethelyn", "Ethyl", "Ettie", "Eudora", "Eugene", - "Eugenia", "Eula", "Eulah", "Eulalia", "Euna", "Eunice", "Eusebio", "Eva", - "Evalyn", "Evan", "Evangeline", "Evans", "Eve", "Eveline", "Evelyn", - "Everardo", "Everett", "Everette", "Evert", "Evie", "Ewald", "Ewell", - "Ezekiel", "Ezequiel", "Ezra", "Fabian", "Fabiola", "Fae", "Fannie", "Fanny", - "Fatima", "Faustino", "Fausto", "Favian", "Fay", "Faye", "Federico", - "Felicia", "Felicita", "Felicity", "Felipa", "Felipe", "Felix", "Felton", - "Fermin", "Fern", "Fernando", "Ferne", "Fidel", "Filiberto", "Filomena", - "Finn", "Fiona", "Flavie", "Flavio", "Fleta", "Fletcher", "Flo", "Florence", - "Florencio", "Florian", "Florida", "Florine", "Flossie", "Floy", "Floyd", - "Ford", "Forest", "Forrest", "Foster", "Frances", "Francesca", "Francesco", - "Francis", "Francisca", "Francisco", "Franco", "Frank", "Frankie", "Franz", - "Fred", "Freda", "Freddie", "Freddy", "Frederic", "Frederick", "Frederik", - "Frederique", "Fredrick", "Fredy", "Freeda", "Freeman", "Freida", "Frida", - "Frieda", "Friedrich", "Fritz", "Furman", "Gabe", "Gabriel", "Gabriella", - "Gabrielle", "Gaetano", "Gage", "Gail", "Gardner", "Garett", "Garfield", - "Garland", "Garnet", "Garnett", "Garret", "Garrett", "Garrick", "Garrison", - "Garry", "Garth", "Gaston", "Gavin", "Gay", "Gayle", "Gaylord", "Gene", - "General", "Genesis", "Genevieve", "Gennaro", "Genoveva", "Geo", "Geoffrey", - "George", "Georgette", "Georgiana", "Georgianna", "Geovanni", "Geovanny", - "Geovany", "Gerald", "Geraldine", "Gerard", "Gerardo", "Gerda", "Gerhard", - "Germaine", "German", "Gerry", "Gerson", "Gertrude", "Gia", "Gianni", - "Gideon", "Gilbert", "Gilberto", "Gilda", "Giles", "Gillian", "Gina", "Gino", - "Giovani", "Giovanna", "Giovanni", "Giovanny", "Gisselle", "Giuseppe", - "Gladyce", "Gladys", "Glen", "Glenda", "Glenna", "Glennie", "Gloria", - "Godfrey", "Golda", "Golden", "Gonzalo", "Gordon", "Grace", "Gracie", - "Graciela", "Grady", "Graham", "Grant", "Granville", "Grayce", "Grayson", - "Green", "Greg", "Gregg", "Gregoria", "Gregorio", "Gregory", "Greta", - "Gretchen", "Greyson", "Griffin", "Grover", "Guadalupe", "Gudrun", "Guido", - "Guillermo", "Guiseppe", "Gunnar", "Gunner", "Gus", "Gussie", "Gust", - "Gustave", "Guy", "Gwen", "Gwendolyn", "Hadley", "Hailee", "Hailey", "Hailie", - "Hal", "Haleigh", "Haley", "Halie", "Halle", "Hallie", "Hank", "Hanna", - "Hannah", "Hans", "Hardy", "Harley", "Harmon", "Harmony", "Harold", - "Harrison", "Harry", "Harvey", "Haskell", "Hassan", "Hassie", "Hattie", - "Haven", "Hayden", "Haylee", "Hayley", "Haylie", "Hazel", "Hazle", "Heath", - "Heather", "Heaven", "Heber", "Hector", "Heidi", "Helen", "Helena", "Helene", - "Helga", "Hellen", "Helmer", "Heloise", "Henderson", "Henri", "Henriette", - "Henry", "Herbert", "Herman", "Hermann", "Hermina", "Herminia", "Herminio", - "Hershel", "Herta", "Hertha", "Hester", "Hettie", "Hilario", "Hilbert", - "Hilda", "Hildegard", "Hillard", "Hillary", "Hilma", "Hilton", "Hipolito", - "Hiram", "Hobart", "Holden", "Hollie", "Hollis", "Holly", "Hope", "Horace", - "Horacio", "Hortense", "Hosea", "Houston", "Howard", "Howell", "Hoyt", - "Hubert", "Hudson", "Hugh", "Hulda", "Humberto", "Hunter", "Hyman", "Ian", - "Ibrahim", "Icie", "Ida", "Idell", "Idella", "Ignacio", "Ignatius", "Ike", - "Ila", "Ilene", "Iliana", "Ima", "Imani", "Imelda", "Immanuel", "Imogene", - "Ines", "Irma", "Irving", "Irwin", "Isaac", "Isabel", "Isabell", "Isabella", - "Isabelle", "Isac", "Isadore", "Isai", "Isaiah", "Isaias", "Isidro", "Ismael", - "Isobel", "Isom", "Israel", "Issac", "Itzel", "Iva", "Ivah", "Ivory", "Ivy", - "Izabella", "Izaiah", "Jabari", "Jace", "Jacey", "Jacinthe", "Jacinto", - "Jack", "Jackeline", "Jackie", "Jacklyn", "Jackson", "Jacky", "Jaclyn", - "Jacquelyn", "Jacques", "Jacynthe", "Jada", "Jade", "Jaden", "Jadon", "Jadyn", - "Jaeden", "Jaida", "Jaiden", "Jailyn", "Jaime", "Jairo", "Jakayla", "Jake", - "Jakob", "Jaleel", "Jalen", "Jalon", "Jalyn", "Jamaal", "Jamal", "Jamar", - "Jamarcus", "Jamel", "Jameson", "Jamey", "Jamie", "Jamil", "Jamir", "Jamison", - "Jammie", "Jan", "Jana", "Janae", "Jane", "Janelle", "Janessa", "Janet", - "Janice", "Janick", "Janie", "Janis", "Janiya", "Jannie", "Jany", "Jaquan", - "Jaquelin", "Jaqueline", "Jared", "Jaren", "Jarod", "Jaron", "Jarred", - "Jarrell", "Jarret", "Jarrett", "Jarrod", "Jarvis", "Jasen", "Jasmin", - "Jason", "Jasper", "Jaunita", "Javier", "Javon", "Javonte", "Jay", "Jayce", - "Jaycee", "Jayda", "Jayde", "Jayden", "Jaydon", "Jaylan", "Jaylen", "Jaylin", - "Jaylon", "Jayme", "Jayne", "Jayson", "Jazlyn", "Jazmin", "Jazmyn", "Jazmyne", - "Jean", "Jeanette", "Jeanie", "Jeanne", "Jed", "Jedediah", "Jedidiah", "Jeff", - "Jefferey", "Jeffery", "Jeffrey", "Jeffry", "Jena", "Jenifer", "Jennie", - "Jennifer", "Jennings", "Jennyfer", "Jensen", "Jerad", "Jerald", "Jeramie", - "Jeramy", "Jerel", "Jeremie", "Jeremy", "Jermain", "Jermaine", "Jermey", - "Jerod", "Jerome", "Jeromy", "Jerrell", "Jerrod", "Jerrold", "Jerry", "Jess", - "Jesse", "Jessica", "Jessie", "Jessika", "Jessy", "Jessyca", "Jesus", "Jett", - "Jettie", "Jevon", "Jewel", "Jewell", "Jillian", "Jimmie", "Jimmy", "Jo", - "Joan", "Joana", "Joanie", "Joanne", "Joannie", "Joanny", "Joany", "Joaquin", - "Jocelyn", "Jodie", "Jody", "Joe", "Joel", "Joelle", "Joesph", "Joey", - "Johan", "Johann", "Johanna", "Johathan", "John", "Johnathan", "Johnathon", - "Johnnie", "Johnny", "Johnpaul", "Johnson", "Jolie", "Jon", "Jonas", - "Jonatan", "Jonathan", "Jonathon", "Jordan", "Jordane", "Jordi", "Jordon", - "Jordy", "Jordyn", "Jorge", "Jose", "Josefa", "Josefina", "Joseph", - "Josephine", "Josh", "Joshua", "Joshuah", "Josiah", "Josiane", "Josianne", - "Josie", "Josue", "Jovan", "Jovani", "Jovanny", "Jovany", "Joy", "Joyce", - "Juana", "Juanita", "Judah", "Judd", "Jude", "Judge", "Judson", "Judy", - "Jules", "Julia", "Julian", "Juliana", "Julianne", "Julie", "Julien", - "Juliet", "Julio", "Julius", "June", "Junior", "Junius", "Justen", "Justice", - "Justina", "Justine", "Juston", "Justus", "Justyn", "Juvenal", "Juwan", - "Kacey", "Kaci", "Kacie", "Kade", "Kaden", "Kadin", "Kaela", "Kaelyn", "Kaia", - "Kailee", "Kailey", "Kailyn", "Kaitlin", "Kaitlyn", "Kale", "Kaleb", - "Kaleigh", "Kaley", "Kali", "Kallie", "Kameron", "Kamille", "Kamren", - "Kamron", "Kamryn", "Kane", "Kara", "Kareem", "Karelle", "Karen", "Kari", - "Kariane", "Karianne", "Karina", "Karine", "Karl", "Karlee", "Karley", - "Karli", "Karlie", "Karolann", "Karson", "Kasandra", "Kasey", "Kassandra", - "Katarina", "Katelin", "Katelyn", "Katelynn", "Katharina", "Katherine", - "Katheryn", "Kathleen", "Kathlyn", "Kathryn", "Kathryne", "Katlyn", "Katlynn", - "Katrina", "Katrine", "Kattie", "Kavon", "Kay", "Kaya", "Kaycee", "Kayden", - "Kayla", "Kaylah", "Kaylee", "Kayleigh", "Kayley", "Kayli", "Kaylie", - "Kaylin", "Keagan", "Keanu", "Keara", "Keaton", "Keegan", "Keeley", "Keely", - "Keenan", "Keira", "Keith", "Kellen", "Kelley", "Kelli", "Kellie", "Kelly", - "Kelsi", "Kelsie", "Kelton", "Kelvin", "Ken", "Kendall", "Kendra", "Kendrick", - "Kenna", "Kennedi", "Kennedy", "Kenneth", "Kennith", "Kenny", "Kenton", - "Kenya", "Kenyatta", "Kenyon", "Keon", "Keshaun", "Keshawn", "Keven", "Kevin", - "Kevon", "Keyon", "Keyshawn", "Khalid", "Khalil", "Kian", "Kiana", "Kianna", - "Kiara", "Kiarra", "Kiel", "Kiera", "Kieran", "Kiley", "Kim", "Kimberly", - "King", "Kip", "Kira", "Kirk", "Kirsten", "Kirstin", "Kitty", "Kobe", "Koby", - "Kody", "Kolby", "Kole", "Korbin", "Korey", "Kory", "Kraig", "Kris", "Krista", - "Kristian", "Kristin", "Kristina", "Kristofer", "Kristoffer", "Kristopher", - "Kristy", "Krystal", "Krystel", "Krystina", "Kurt", "Kurtis", "Kyla", "Kyle", - "Kylee", "Kyleigh", "Kyler", "Kylie", "Kyra", "Lacey", "Lacy", "Ladarius", - "Lafayette", "Laila", "Laisha", "Lamar", "Lambert", "Lamont", "Lance", - "Landen", "Lane", "Laney", "Larissa", "Laron", "Larry", "Larue", "Laura", - "Laurel", "Lauren", "Laurence", "Lauretta", "Lauriane", "Laurianne", "Laurie", - "Laurine", "Laury", "Lauryn", "Lavada", "Lavern", "Laverna", "Laverne", - "Lavina", "Lavinia", "Lavon", "Lavonne", "Lawrence", "Lawson", "Layla", - "Layne", "Lazaro", "Lea", "Leann", "Leanna", "Leanne", "Leatha", "Leda", - "Lee", "Leif", "Leila", "Leilani", "Lela", "Lelah", "Leland", "Lelia", - "Lempi", "Lemuel", "Lenna", "Lennie", "Lenny", "Lenora", "Lenore", "Leo", - "Leola", "Leon", "Leonard", "Leonardo", "Leone", "Leonel", "Leonie", "Leonor", - "Leonora", "Leopold", "Leopoldo", "Leora", "Lera", "Lesley", "Leslie", - "Lesly", "Lessie", "Lester", "Leta", "Letha", "Letitia", "Levi", "Lew", - "Lewis", "Lexi", "Lexie", "Lexus", "Lia", "Liam", "Liana", "Libbie", "Libby", - "Lila", "Lilian", "Liliana", "Liliane", "Lilla", "Lillian", "Lilliana", - "Lillie", "Lilly", "Lily", "Lilyan", "Lina", "Lincoln", "Linda", "Lindsay", - "Lindsey", "Linnea", "Linnie", "Linwood", "Lionel", "Lisa", "Lisandro", - "Lisette", "Litzy", "Liza", "Lizeth", "Lizzie", "Llewellyn", "Lloyd", "Logan", - "Lois", "Lola", "Lolita", "Loma", "Lon", "London", "Lonie", "Lonnie", "Lonny", - "Lonzo", "Lora", "Loraine", "Loren", "Lorena", "Lorenz", "Lorenza", "Lorenzo", - "Lori", "Lorine", "Lorna", "Lottie", "Lou", "Louie", "Louisa", "Lourdes", - "Louvenia", "Lowell", "Loy", "Loyal", "Loyce", "Lucas", "Luciano", "Lucie", - "Lucienne", "Lucile", "Lucinda", "Lucio", "Lucious", "Lucius", "Lucy", - "Ludie", "Ludwig", "Lue", "Luella", "Luigi", "Luis", "Luisa", "Lukas", "Lula", - "Lulu", "Luna", "Lupe", "Lura", "Lurline", "Luther", "Luz", "Lyda", "Lydia", - "Lyla", "Lynn", "Lyric", "Lysanne", "Mabel", "Mabelle", "Mable", "Mac", - "Macey", "Maci", "Macie", "Mack", "Mackenzie", "Macy", "Madaline", "Madalyn", - "Maddison", "Madeline", "Madelyn", "Madelynn", "Madge", "Madie", "Madilyn", - "Madisen", "Madison", "Madisyn", "Madonna", "Madyson", "Mae", "Maegan", - "Maeve", "Mafalda", "Magali", "Magdalen", "Magdalena", "Maggie", "Magnolia", - "Magnus", "Maia", "Maida", "Maiya", "Major", "Makayla", "Makenna", "Makenzie", - "Malachi", "Malcolm", "Malika", "Malinda", "Mallie", "Mallory", "Malvina", - "Mandy", "Manley", "Manuel", "Manuela", "Mara", "Marc", "Marcel", "Marcelina", - "Marcelino", "Marcella", "Marcelle", "Marcellus", "Marcelo", "Marcia", - "Marco", "Marcos", "Marcus", "Margaret", "Margarete", "Margarett", - "Margaretta", "Margarette", "Margarita", "Marge", "Margie", "Margot", - "Margret", "Marguerite", "Maria", "Mariah", "Mariam", "Marian", "Mariana", - "Mariane", "Marianna", "Marianne", "Mariano", "Maribel", "Marie", "Mariela", - "Marielle", "Marietta", "Marilie", "Marilou", "Marilyne", "Marina", "Mario", - "Marion", "Marisa", "Marisol", "Maritza", "Marjolaine", "Marjorie", "Marjory", - "Mark", "Markus", "Marlee", "Marlen", "Marlene", "Marley", "Marlin", "Marlon", - "Marques", "Marquis", "Marquise", "Marshall", "Marta", "Martin", "Martina", - "Martine", "Marty", "Marvin", "Mary", "Maryam", "Maryjane", "Maryse", "Mason", - "Mateo", "Mathew", "Mathias", "Mathilde", "Matilda", "Matilde", "Matt", - "Matteo", "Mattie", "Maud", "Maude", "Maudie", "Maureen", "Maurice", - "Mauricio", "Maurine", "Maverick", "Mavis", "Max", "Maxie", "Maxime", - "Maximilian", "Maximillia", "Maximillian", "Maximo", "Maximus", "Maxine", - "Maxwell", "May", "Maya", "Maybell", "Maybelle", "Maye", "Maymie", "Maynard", - "Mayra", "Mazie", "Mckayla", "Mckenna", "Mckenzie", "Meagan", "Meaghan", - "Meda", "Megane", "Meggie", "Meghan", "Mekhi", "Melany", "Melba", "Melisa", - "Melissa", "Mellie", "Melody", "Melvin", "Melvina", "Melyna", "Melyssa", - "Mercedes", "Meredith", "Merl", "Merle", "Merlin", "Merritt", "Mertie", - "Mervin", "Meta", "Mia", "Micaela", "Micah", "Michael", "Michaela", "Michale", - "Micheal", "Michel", "Michele", "Michelle", "Miguel", "Mikayla", "Mike", - "Mikel", "Milan", "Miles", "Milford", "Miller", "Millie", "Milo", "Milton", - "Mina", "Minerva", "Minnie", "Miracle", "Mireille", "Mireya", "Misael", - "Missouri", "Misty", "Mitchel", "Mitchell", "Mittie", "Modesta", "Modesto", - "Mohamed", "Mohammad", "Mohammed", "Moises", "Mollie", "Molly", "Mona", - "Monica", "Monique", "Monroe", "Monserrat", "Monserrate", "Montana", "Monte", - "Monty", "Morgan", "Moriah", "Morris", "Mortimer", "Morton", "Mose", "Moses", - "Moshe", "Mossie", "Mozell", "Mozelle", "Muhammad", "Muriel", "Murl", - "Murphy", "Murray", "Mustafa", "Mya", "Myah", "Mylene", "Myles", "Myra", - "Myriam", "Myrl", "Myrna", "Myron", "Myrtice", "Myrtie", "Myrtis", "Myrtle", - "Nadia", "Nakia", "Name", "Nannie", "Naomi", "Naomie", "Napoleon", "Narciso", - "Nash", "Nasir", "Nat", "Natalia", "Natalie", "Natasha", "Nathan", - "Nathanael", "Nathanial", "Nathaniel", "Nathen", "Nayeli", "Neal", "Ned", - "Nedra", "Neha", "Neil", "Nelda", "Nella", "Nelle", "Nellie", "Nels", - "Nelson", "Neoma", "Nestor", "Nettie", "Neva", "Newell", "Newton", "Nia", - "Nicholas", "Nicholaus", "Nichole", "Nick", "Nicklaus", "Nickolas", "Nico", - "Nicola", "Nicolas", "Nicole", "Nicolette", "Nigel", "Nikita", "Nikki", - "Nikko", "Niko", "Nikolas", "Nils", "Nina", "Noah", "Noble", "Noe", "Noel", - "Noelia", "Noemi", "Noemie", "Noemy", "Nola", "Nolan", "Nona", "Nora", - "Norbert", "Norberto", "Norene", "Norma", "Norris", "Norval", "Norwood", - "Nova", "Novella", "Nya", "Nyah", "Nyasia", "Obie", "Oceane", "Ocie", - "Octavia", "Oda", "Odell", "Odessa", "Odie", "Ofelia", "Okey", "Ola", "Olaf", - "Ole", "Olen", "Oleta", "Olga", "Olin", "Oliver", "Ollie", "Oma", "Omari", - "Omer", "Ona", "Onie", "Opal", "Ophelia", "Ora", "Oral", "Oran", "Oren", - "Orie", "Orin", "Orion", "Orland", "Orlando", "Orlo", "Orpha", "Orrin", - "Orval", "Orville", "Osbaldo", "Osborne", "Oscar", "Osvaldo", "Oswald", - "Oswaldo", "Otha", "Otho", "Otilia", "Otis", "Ottilie", "Ottis", "Otto", - "Ova", "Owen", "Ozella", "Pablo", "Paige", "Palma", "Pamela", "Pansy", - "Paolo", "Paris", "Parker", "Pascale", "Pasquale", "Pat", "Patience", - "Patricia", "Patrick", "Patsy", "Pattie", "Paul", "Paula", "Pauline", - "Paxton", "Payton", "Pearl", "Pearlie", "Pearline", "Pedro", "Peggie", - "Penelope", "Percival", "Percy", "Perry", "Pete", "Peter", "Petra", "Peyton", - "Philip", "Phoebe", "Phyllis", "Pierce", "Pierre", "Pietro", "Pink", "Pinkie", - "Piper", "Polly", "Porter", "Precious", "Presley", "Preston", "Price", - "Prince", "Princess", "Priscilla", "Providenci", "Prudence", "Queen", - "Queenie", "Quentin", "Quincy", "Quinn", "Quinten", "Quinton", "Rachael", - "Rachel", "Rachelle", "Rae", "Raegan", "Rafael", "Rafaela", "Raheem", - "Rahsaan", "Rahul", "Raina", "Raleigh", "Ralph", "Ramiro", "Ramon", "Ramona", - "Randal", "Randall", "Randi", "Randy", "Ransom", "Raoul", "Raphael", - "Raphaelle", "Raquel", "Rashad", "Rashawn", "Rasheed", "Raul", "Raven", "Ray", - "Raymond", "Raymundo", "Reagan", "Reanna", "Reba", "Rebeca", "Rebecca", - "Rebeka", "Rebekah", "Reece", "Reed", "Reese", "Regan", "Reggie", "Reginald", - "Reid", "Reilly", "Reina", "Reinhold", "Remington", "Rene", "Renee", "Ressie", - "Reta", "Retha", "Retta", "Reuben", "Reva", "Rex", "Rey", "Reyes", "Reymundo", - "Reyna", "Reynold", "Rhea", "Rhett", "Rhianna", "Rhiannon", "Rhoda", - "Ricardo", "Richard", "Richie", "Richmond", "Rick", "Rickey", "Rickie", - "Ricky", "Rico", "Rigoberto", "Riley", "Rita", "River", "Robb", "Robbie", - "Robert", "Roberta", "Roberto", "Robin", "Robyn", "Rocio", "Rocky", "Rod", - "Roderick", "Rodger", "Rodolfo", "Rodrick", "Rodrigo", "Roel", "Rogelio", - "Roger", "Rogers", "Rolando", "Rollin", "Roma", "Romaine", "Roman", "Ron", - "Ronaldo", "Ronny", "Roosevelt", "Rory", "Rosa", "Rosalee", "Rosalia", - "Rosalind", "Rosalinda", "Rosalyn", "Rosamond", "Rosanna", "Rosario", - "Roscoe", "Rose", "Rosella", "Roselyn", "Rosemarie", "Rosemary", "Rosendo", - "Rosetta", "Rosie", "Rosina", "Roslyn", "Ross", "Rossie", "Rowan", "Rowena", - "Rowland", "Roxane", "Roxanne", "Roy", "Royal", "Royce", "Rozella", "Ruben", - "Rubie", "Ruby", "Rubye", "Rudolph", "Rudy", "Rupert", "Russ", "Russel", - "Russell", "Rusty", "Ruth", "Ruthe", "Ruthie", "Ryan", "Ryann", "Ryder", - "Rylan", "Rylee", "Ryleigh", "Ryley", "Sabina", "Sabrina", "Sabryna", "Sadie", - "Sadye", "Sage", "Saige", "Sallie", "Sally", "Salma", "Salvador", "Salvatore", - "Sam", "Samanta", "Samantha", "Samara", "Samir", "Sammie", "Sammy", "Samson", - "Sandra", "Sandrine", "Sandy", "Sanford", "Santa", "Santiago", "Santina", - "Santino", "Santos", "Sarah", "Sarai", "Sarina", "Sasha", "Saul", "Savanah", - "Savanna", "Savannah", "Savion", "Scarlett", "Schuyler", "Scot", "Scottie", - "Scotty", "Seamus", "Sean", "Sebastian", "Sedrick", "Selena", "Selina", - "Selmer", "Serena", "Serenity", "Seth", "Shad", "Shaina", "Shakira", "Shana", - "Shane", "Shanel", "Shanelle", "Shania", "Shanie", "Shaniya", "Shanna", - "Shannon", "Shanny", "Shanon", "Shany", "Sharon", "Shaun", "Shawn", "Shawna", - "Shaylee", "Shayna", "Shayne", "Shea", "Sheila", "Sheldon", "Shemar", - "Sheridan", "Sherman", "Sherwood", "Shirley", "Shyann", "Shyanne", "Sibyl", - "Sid", "Sidney", "Sienna", "Sierra", "Sigmund", "Sigrid", "Sigurd", "Silas", - "Sim", "Simeon", "Simone", "Sincere", "Sister", "Skye", "Skyla", "Skylar", - "Sofia", "Soledad", "Solon", "Sonia", "Sonny", "Sonya", "Sophia", "Sophie", - "Spencer", "Stacey", "Stacy", "Stan", "Stanford", "Stanley", "Stanton", - "Stefan", "Stefanie", "Stella", "Stephan", "Stephania", "Stephanie", - "Stephany", "Stephen", "Stephon", "Sterling", "Steve", "Stevie", "Stewart", - "Stone", "Stuart", "Summer", "Sunny", "Susan", "Susana", "Susanna", "Susie", - "Suzanne", "Sven", "Syble", "Sydnee", "Sydney", "Sydni", "Sydnie", "Sylvan", - "Sylvester", "Sylvia", "Tabitha", "Tad", "Talia", "Talon", "Tamara", "Tamia", - "Tania", "Tanner", "Tanya", "Tara", "Taryn", "Tate", "Tatum", "Tatyana", - "Taurean", "Tavares", "Taya", "Taylor", "Teagan", "Ted", "Telly", "Terence", - "Teresa", "Terrance", "Terrell", "Terrence", "Terrill", "Terry", "Tess", - "Tessie", "Tevin", "Thad", "Thaddeus", "Thalia", "Thea", "Thelma", "Theo", - "Theodora", "Theodore", "Theresa", "Therese", "Theresia", "Theron", "Thomas", - "Thora", "Thurman", "Tia", "Tiana", "Tianna", "Tiara", "Tierra", "Tiffany", - "Tillman", "Timmothy", "Timmy", "Timothy", "Tina", "Tito", "Titus", "Tobin", - "Toby", "Tod", "Tom", "Tomas", "Tomasa", "Tommie", "Toney", "Toni", "Tony", - "Torey", "Torrance", "Torrey", "Toy", "Trace", "Tracey", "Tracy", "Travis", - "Travon", "Tre", "Tremaine", "Tremayne", "Trent", "Trenton", "Tressa", - "Tressie", "Treva", "Trever", "Trevion", "Trevor", "Trey", "Trinity", - "Trisha", "Tristian", "Tristin", "Triston", "Troy", "Trudie", "Trycia", - "Trystan", "Turner", "Twila", "Tyler", "Tyra", "Tyree", "Tyreek", "Tyrel", - "Tyrell", "Tyrese", "Tyrique", "Tyshawn", "Tyson", "Ubaldo", "Ulices", - "Ulises", "Una", "Unique", "Urban", "Uriah", "Uriel", "Ursula", "Vada", - "Valentin", "Valentina", "Valentine", "Valerie", "Vallie", "Van", "Vance", - "Vanessa", "Vaughn", "Veda", "Velda", "Vella", "Velma", "Velva", "Vena", - "Verda", "Verdie", "Vergie", "Verla", "Verlie", "Vern", "Verna", "Verner", - "Vernice", "Vernie", "Vernon", "Verona", "Veronica", "Vesta", "Vicenta", - "Vicente", "Vickie", "Vicky", "Victor", "Victoria", "Vida", "Vidal", "Vilma", - "Vince", "Vincent", "Vincenza", "Vincenzo", "Vinnie", "Viola", "Violet", - "Violette", "Virgie", "Virgil", "Virginia", "Virginie", "Vita", "Vito", - "Viva", "Vivian", "Viviane", "Vivianne", "Vivien", "Vivienne", "Vladimir", - "Wade", "Waino", "Waldo", "Walker", "Wallace", "Walter", "Walton", "Wanda", - "Ward", "Warren", "Watson", "Wava", "Waylon", "Wayne", "Webster", "Weldon", - "Wellington", "Wendell", "Wendy", "Werner", "Westley", "Weston", "Whitney", - "Wilber", "Wilbert", "Wilburn", "Wiley", "Wilford", "Wilfred", "Wilfredo", - "Wilfrid", "Wilhelm", "Wilhelmine", "Will", "Willa", "Willard", "William", - "Willie", "Willis", "Willow", "Willy", "Wilma", "Wilmer", "Wilson", "Wilton", - "Winfield", "Winifred", "Winnifred", "Winona", "Winston", "Woodrow", "Wyatt", - "Wyman", "Xander", "Xavier", "Xzavier", "Yadira", "Yasmeen", "Yasmin", - "Yasmine", "Yazmin", "Yesenia", "Yessenia", "Yolanda", "Yoshiko", "Yvette", - "Yvonne", "Zachariah", "Zachary", "Zachery", "Zack", "Zackary", "Zackery", - "Zakary", "Zander", "Zane", "Zaria", "Zechariah", "Zelda", "Zella", "Zelma", - "Zena", "Zetta", "Zion", "Zita", "Zoe", "Zoey", "Zoie", "Zoila", "Zola", - "Zora", "Zula" -]; - -/** - * Generate random username. - * @returns {string} random username - */ -export function generateUsername () { - var name = RandomUtil.randomElement(names); - var suffix = RandomUtil.randomAlphanumStr(3); - - return name + '-' + suffix; -}