{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/ts/config/production/Config.ts","webpack:///./src/ts/helpers/SilentLoginHelper.ts","webpack:///./src/ts/meetnowJoin/index.tsx","webpack:///./src/ts/helpers/LoggerHelper.ts","webpack:///./src/ts/helpers/RedirectHelper.ts","webpack:///./src/ts/meetnowJoin/JoinWidget.less?ae89","webpack:///./src/ts/meetnowJoin/MeetNowJoin.less?d7b5","webpack:///./src/ts/meetnowJoin/MeetNowJoin.less","webpack:///./src/ts/config/BaseConfig.ts","webpack:///./src/ts/models/SharedTypes.ts","webpack:///./src/ts/helpers/LocalizerHelper.ts","webpack:///./src/ts/meetnowJoin/index.less?2a37","webpack:///./src/ts/rest/MeetingsApiClientUtils.ts","webpack:///./src/ts/helpers/UrlHelper.ts","webpack:///./src/ts/components/common/ErrorModal.tsx","webpack:///./src/ts/contexts/ConfigContext.ts","webpack:///./src/ts/meetnowJoin/JoinWidget.less","webpack:///./src/ts/meetnow/MeetNowEdgeHandler.ts","webpack:///./src/ts/meetnow/FallbackFlow.ts","webpack:///./src/ts/helpers/SkypeTokenHelper.ts","webpack:///./src/ts/rest/BaseRestClient.ts","webpack:///./src/ts/meetnowJoin/index.less","webpack:///./src/ts/helpers/CookieHelper.ts","webpack:///./src/ts/meetnowJoin/JoinWidget.tsx","webpack:///./src/ts/rest/MeetingsApiClient.ts","webpack:///./src/ts/meetnow/MeetNowSettings.ts","webpack:///./src/ts/meetnowJoin/MeetNowJoin.tsx","webpack:///./src/ts/helpers/ErrorHelper.ts","webpack:///./src/ts/meetnowJoin/JoinHandler.ts","webpack:///./src/ts/helpers/DateHelper.ts","webpack:///./src/ts/components/common/ErrorDetails.tsx","webpack:///./src/ts/helpers/EnvironmentHelper.ts","webpack:///./vendor/silentLogin.js"],"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","4","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","BaseConfig_1","silentLogin","deferral","startTime","Date","getTime","SKYPE","login","Silent","SyncTasks","Defer","init","config_1","setCallback","response","skypetoken","resolve","expiration","expires_in","error","reject","errorDescription","error_description","load","promise","done","logger","status","LoggerHelper_1","Success","duration","fail","Fail","require","settings","MeetNowSettings_1","MeetNowEdgeAriaTenantId","sessionStarted","useUnifiedView","wasPreLoggedin","container","document","getElementById","language","getElementsByTagName","lang","basePath","dataset","LocalizerHelper_1","react_dom_1","render","react_1","MeetNowJoin_1","SilentLoginStatus","CommonProperty","_logger","webjs_sdk_1","getLogger","_commonProperties","_sessionStartDate","_wasLoggedIn","_wasUnifiedView","_prefix","getSessionId","event","priority","Normal","_this","_log","network","navigation","action","sessionIntermediateStep","wasLoggedIn","undefined","sessionFinished","sessionDurationInMs","DateHelper_1","meetNowFallbackFlow","getCorrelationId","correlationIdFromQuery","UrlHelper_1","getQueryParameterAsString","setName","eventProperties","setType","setCommonProperties","keys","forEach","piiKind","setPropertyWithPii","setProperty","EnvironmentHelper_1","env","setProperties","properties","propertyPrefix","setPiiProperties","piiProperties","NotSet","type","_onError","message","file","line","col","LoggerHelper","ariaTenantId","prefix","logging","ariaTenant","this","initialize","canSendStatEvent","enableAutoUserSession","onerror","removeEventListener","flushAndTeardown","addEventListener","skypeToken","isGuest","initCommonProperty","UserId","SkypeTokenHelper_1","Identity","String","MsaCidHex","setEventPriority","Array","isArray","logEvent","url","params","form","body","appendChild","submit","createElement","method","style","display","map_1","curry_1","input","content","options","transform","locals","config","cookies","skype","path","maxAge","domain","csrf","client_id","redirect_uri","urls","ecs","api","profile","huddle","meetings","invite","channels","captcha","flowId","rand","app","faq","redirectUri","state","encodeURIComponent","logout","s4lWeb","webSubDomain","threadId","inviteId","skypeId","channelId","botLogin","botId","useBotLauncherQueryParam","loginUri","download","downloadAndroid","downloadDesktop","cookiePolicy","skypeCom","join","launcher","skypeUri","sessionId","origin","intentUri","fallbackUri","universalUri","shortId","inviteLauncher","offSkypeInviteId","botLauncher","channelLauncher","doLauncher","meetNowJoinLauncher","source","exp","video","mic","Themes","AppIds","Actions","width","height","bew_localization_1","initSync","locale","localizedTable","I18NBUNDLE","fallback","fallbackTable","I18NBUNDLE_FALLBACK","model","id","longId","resource","_a","errResp","statusCode","simplerestclients_1","RetryCountedWithBackoff","DoNotRetry","UrlHelper","webSubdomainForRedirect","getQueryParameters","getWebClientUrl","includes","allowedParameters","map","param","getQueryParameter","filter","pair","location","search","substr","split","decodeURIComponent","reduce","prev","current","pathname","replace","pop","ErrorHelper_1","ShortIdFromUrl","__extends","ErrorModal","react_2","className","role","ErrorDetails_1","props","assetsBasePath","autoFocus","getString","onClick","onClose","PureComponent","context","createContext","Provider","Consumer","joinLink","meeting","ShortId","GenericData","ThreadId","addSkypeIdAndMsaCidHexCommonProperties","MeetingsApiClient_1","createGuestMeeting","title","DefaultMeetingTitle","MeetNowEdgeNumberOfFetchRetries","localizedGuestDefaultName","getAttribute","_b","meetnowGuest","displayName","loginResult","createAuthenticatedMeeting","SkypeToken","SharedTypes_1","Meetings","getConversation","then","conversion","conversationServiceModel","meetnowGuestServiceModel","completionType","isNewJoinFlowFromJoinLink","webClientRedirectParams","skypeid","CookieHelper_1","getCookie","singleValue","msacidhex","High","queryParams","MeetNowEdgeAllowedQueryParameters","RedirectHelper_1","fallbackCorrelationId","getAllowedQueryParameters","find","catch","triggerFallbackFlow","reason","showErrorMessage","handleReloadButton","handleNavigateToWebClientButton","pageTitle","querySelector","fallbackSection","reloadPageButton","preventDefault","reload","goToSkypeButton","href","parseSkypeToken","token","parts","header","JSON","parse","atob","payload","signature","e","tokenContent","cid","toUpperCase","unwrap","resp","contentType","acceptType","genericEventPath","customPropertiesProvider","eventPriority","endTime","responseUrl","_endpointUrl","eventUrl","responseTime","statusText","host","custom","BaseRestClient","apiPath","performApiGetDetailed","_super","networkCallback","objToPost","performApiPostDetailed","objToPatch","performApiPatchDetailed","objToPut","performApiPutDetailed","objToDelete","performApiDeleteDetailed","CookieHelper","hasCookie","cookieValuesObject","now","Math","round","TS","TM","cookieObjectToString","getExpirationDate","toUTCString","optionsString","cookie","setCookie","separatorPos","indexOf","substring","trim","parseCookieValues","cookieObject","cookieSeparator","cookieObjectKeys","cookieValue","cookieObjectKey","splitCookieValue","splitParams","seconds","createRef","stopPropagation","joinButton","click","JoinWidget","textBox","focus","src","alt","isJoinLinkValid","htmlFor","ref","placeholder","onKeyPress","handleKeyPress","onChange","onChangeHandler","disabled","isRequestInProgress","onSubmitHandler","linkCreate","createMeetingUrl","linkPrivacy","linkTerms","MeetNowEdgeHandler_1","allowedQueryParams","Component","MeetingsApiClient","retries","joinThread","headers","solution","challengeId","azureRegion","performApiPost","customErrorHandler","performApiGet","MeetingsApiClientUtils_1","createMeeting","BaseRestClient_1","allowedQueryParameters","currentSettings","MeetNowSettings","MeetNowEdgeJoinApiHost","rootElement","Error","parsedSettings","isLoginInProgress","joinButtonClicked","handleJoinError","MeetNowJoin","setState","SilentLoginHelper_1","newState","IsLoggedIn","IsUnsupportedPlatformOrBrowser","eventType","JoinWidget_1","joinLinkChangeHandler","joinMeetingHandler","ErrorModal_1","currentTarget","joinButtonRef","JoinHandler_1","err","handleButtonFocusAfterValidation","headerLocString","descriptionLocString","pageTitleLocString","emoticonPath","InviteIdFromUrl","TooManyUsers","Busy","InviteNotFound","JoinDisabled","Generic","BotNotFound","BotTooManyContacts","ChannelNotFound","ErrorHelper","arg","displayableError","webResponse","description","getErrorFromWebErrorResponse","joinLinkRegex","Resolved","redirectParams","joinAsGuest","guestUserServiceModel","enrichErrorFromWebResponse","normalizedJoinLink","match","joinLinkDomain","trimmedJoinLink","startsWith","startDate","endDate","valueOf","ErrorDetails","isDisplayableError","convertToGenericDisplayableError","React","showSkype","as","ConfigContext_1","configContext","size","OperatingSystems","Browsers","osRegExps","WinPhone","WinRT","Win","iOS","MacOS","Android","ChromeOS","Linux","DeviceTypes","browserRegExps","Opera","EdgeOld","Edge","MSIE","Chrome","Firefox","Safari","Facebook","EnvironmentHelper","minimumVersion","getBrowserName","version","getSafariBrowserVersion","major","minor","iOSVersionMatches","_uaParser","getUA","RegExp","osInformation","getOS","detectedOs","_getOsFallback","navigator","userAgent","maxTouchPoints","browserName","getBrowser","_getBrowserNameFallback","parseInt","bugfix","isSafariBrowserVersionAtLeast","Ubuntu","Desktop","AndroidX86","Mobile","Unknown","WebOS","Tizen","Other","_currentBrowserSupportsQuickJoinOnWeb","_screen","screen","_navigator","userLanguage","_os","_browser","knownInAppBrowsers","android","Chromium","Yandex","ios","SafariMobile","mac","windows","others","quickJoinFlowSupportedBrowsers","customUaParser","_quickJoinFlowSupportedBrowsers","ua_parser_js_1","getSupportedBrowsersDefault","currentBrowser","currentOs","supportedBrowsers","osKey","browserKey","getDeviceType","isQuickWebJoinSupported","getScreenResolution","getLanguage","platform","isIOSInAppBrowserFlow","isSafariBrowserEligibleForMeetingGuestFlow","ancestorElement","callback","loginDomains","ssoLoginDomains","originCheckMap","iFrameReference","timeoutObj","originCheckHosts","eventRegistered","processing","logEnabled","_messageListener","_destroySilentLogin","_callCallback","_handleTimeout","_getFrameSource","qa","live","isSsoCompatible","debug","tokens","prop","stringify","console","log","originCheckPassed","ex","receivedState","attr","clearTimeout","removeChild","timestamp","domainMap","query","response_type","partner","_accept","_nc","str","k","_createQuery","attachEvent","callbackFunction","protocol","_validateSettings","setTimeout","head","frameBorder","visibility","floor","random","setAttribute","getSkypetoken","getFullResponse"],"mappings":"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","file":"js/mnJoin.14fde63777bdce8aa2c5.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\t4: 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 = \"https://join.secure.skypeassets.com/static/14.475\";\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([\"1WOo\",0,1]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import config, { Config, CookieConfig } from '../BaseConfig';\r\n\r\nconst override: Partial = {\r\n};\r\n\r\n// Export here should mirror parent, so webpack can do his magic with alias\r\nexport { Config, CookieConfig };\r\nexport default { ...config, ...override };\r\n","import config from 'config';\r\nimport * as SyncTasks from 'synctasks';\r\nimport { logger, SilentLoginStatus } from './LoggerHelper';\r\n\r\nexport interface SilentLoginResult {\r\n skypetoken: string;\r\n expiration: number;\r\n}\r\n\r\nexport const silentLoginAsync = () => {\r\n const initLogin = (): SyncTasks.Promise => {\r\n\r\n const silentLogin = (window as any).SKYPE.login.Silent;\r\n const deferral = SyncTasks.Defer();\r\n\r\n silentLogin.init(config.silentLogin)\r\n .setCallback((response: any) => {\r\n if (response && response.skypetoken) {\r\n deferral.resolve({ skypetoken: response.skypetoken, expiration: response.expires_in });\r\n return;\r\n }\r\n if (response && response.error) {\r\n deferral.reject({ error: response.error, errorDescription: response.error_description || '' });\r\n return;\r\n }\r\n deferral.reject();\r\n })\r\n .load();\r\n\r\n return deferral.promise();\r\n };\r\n\r\n const startTime = new Date().getTime();\r\n\r\n return initLogin()\r\n .done(() => logger.silentLogin({ status: SilentLoginStatus.Success, duration: new Date().getTime() - startTime }))\r\n .fail((response) => logger.silentLogin({\r\n status: SilentLoginStatus.Fail,\r\n duration: new Date().getTime() - startTime,\r\n error: response.error,\r\n errorDescription: response.errorDescription,\r\n }));\r\n};\r\n","import React from 'react';\r\nimport ReactDOM from 'react-dom';\r\nimport '../../../vendor/silentLogin';\r\nimport { loadTranslation } from '../helpers/LocalizerHelper';\r\nimport { logger } from '../helpers/LoggerHelper';\r\nimport getMeetNowSettings from '../meetnow/MeetNowSettings';\r\nimport './index.less';\r\nimport { MeetNowJoin } from './MeetNowJoin';\r\n\r\nconst settings = getMeetNowSettings();\r\nlogger.init(settings.MeetNowEdgeAriaTenantId, 'meetnow_join_');\r\nlogger.sessionStarted({ useUnifiedView: false, wasPreLoggedin: false });\r\n\r\nconst container = document.getElementById('meetnowContainer')!;\r\nconst language = document.getElementsByTagName('html')[0].lang;\r\nconst basePath = container.dataset.basePath!;\r\n\r\nloadTranslation(language);\r\n\r\nReactDOM.render(, container);\r\n","import { AWTEventPriority, AWTEventProperties, AWTLogger, AWTLogManager, AWTPiiKind, AWTPropertyType } from '@aria/webjs-sdk';\r\nimport Config from 'config';\r\nimport { Dictionary } from '../models/SharedTypes';\r\nimport { getDiffInMS } from './DateHelper';\r\nimport { browser, deviceType, os } from './EnvironmentHelper';\r\nimport { getMsaCidHexFromSkypeToken, getSkypeIdFromSkypeToken } from './SkypeTokenHelper';\r\nimport { UrlHelper } from './UrlHelper';\r\n\r\nexport interface NetworkEvent {\r\n host: string;\r\n path: string;\r\n url: string;\r\n method: string;\r\n statusCode: number;\r\n statusText?: string;\r\n responseTime: number;\r\n custom?: any;\r\n}\r\n\r\nexport type NavigationEventType = 'push' | 'pop';\r\nexport interface NavigationEvent {\r\n view: string;\r\n type: NavigationEventType;\r\n isRoot: boolean;\r\n}\r\n\r\nexport interface SessionStartedEvent {\r\n useUnifiedView: boolean;\r\n wasPreLoggedin: boolean;\r\n}\r\n\r\nexport interface SessionFinishedEvent {\r\n useUnifiedView?: boolean;\r\n sessionDurationInMs?: number;\r\n completionType: string;\r\n wasLoggedIn?: boolean;\r\n}\r\n\r\nexport interface SessionIntermediateEvent {\r\n useUnifiedView?: boolean;\r\n wasLoggedIn?: boolean;\r\n eventType: string;\r\n}\r\n\r\nexport interface ActionEvent {\r\n name: string;\r\n}\r\n\r\nexport enum SilentLoginStatus {\r\n Success = 'success',\r\n Fail = 'fail',\r\n}\r\nexport interface SilentLoginEvent {\r\n status: SilentLoginStatus;\r\n duration: number;\r\n error?: string;\r\n errorDescription?: string;\r\n}\r\n\r\nexport interface FallbackFlowEvent {\r\n message: string;\r\n reason: string;\r\n}\r\n\r\nconst defaultPrefix = 'ui_';\r\n\r\nexport enum CommonProperty {\r\n SkypeId = 'UserInfo.SkypeId',\r\n ThreadId = 'Meeting.ThreadId',\r\n ShortId = 'Meeting.ShortId',\r\n InviteSkypeId = 'Invite.SkypeId',\r\n BotId = 'Bot.BotId',\r\n ChannelId = 'Channel.ChannelId',\r\n EntryPoint = 'Page.EntryPoint',\r\n CorrelationId = 'Page.CorrelationId',\r\n Source = 'Page.Source',\r\n Profile = 'Profile.SkypeId',\r\n IsLoggedIn = 'UserInfo.IsLoggedIn',\r\n UserId = 'UserInfo.Id',\r\n MsaCidHex = 'MSACIDHEX',\r\n IsUnsupportedPlatformOrBrowser = 'IsUnsupportedPlatformOrBrowser',\r\n}\r\n\r\nexport interface Property {\r\n key: CommonProperty;\r\n value: string | number | boolean | Date;\r\n piiKind?: AWTPiiKind;\r\n type?: AWTPropertyType;\r\n}\r\n\r\nclass LoggerHelper {\r\n private _logger: AWTLogger = AWTLogManager.getLogger();\r\n private _commonProperties: Dictionary = {};\r\n private _sessionStartDate: Date = new Date();\r\n private _wasLoggedIn: boolean = false;\r\n private _wasUnifiedView: boolean = false;\r\n private _prefix: string = defaultPrefix;\r\n\r\n init(ariaTenantId = Config.logging.ariaTenant, prefix?: string) {\r\n if (prefix) {\r\n this._prefix = prefix;\r\n }\r\n\r\n AWTLogManager.initialize(ariaTenantId, {\r\n canSendStatEvent: () => false,\r\n enableAutoUserSession: true,\r\n });\r\n\r\n window.onerror = this._onError;\r\n\r\n // Current implementation of the flushAndTeardown method has wrong context when used as callback\r\n // therefore asynchronous pending events would be lost, let's fix it\r\n window.removeEventListener('beforeunload', AWTLogManager.flushAndTeardown);\r\n window.addEventListener('beforeunload', AWTLogManager.flushAndTeardown.bind(AWTLogManager));\r\n }\r\n\r\n getSessionId = () => this._logger.getSessionId();\r\n\r\n public initCommonProperty(property: Property) {\r\n this._commonProperties[property.key] = property;\r\n }\r\n\r\n public addSkypeIdAndMsaCidHexCommonProperties(skypeToken: string | undefined, isGuest: boolean) {\r\n this.initCommonProperty({\r\n key: CommonProperty.UserId,\r\n value: getSkypeIdFromSkypeToken(skypeToken) || '',\r\n piiKind: isGuest ? AWTPiiKind.NotSet : AWTPiiKind.Identity, // guest skypeId is not considered PII as it's anonymous and valid for 24 hours\r\n type: AWTPropertyType.String,\r\n });\r\n\r\n this.initCommonProperty({\r\n key: CommonProperty.MsaCidHex,\r\n value: getMsaCidHexFromSkypeToken(skypeToken) || '',\r\n piiKind: AWTPiiKind.NotSet,\r\n type: AWTPropertyType.String,\r\n });\r\n }\r\n\r\n error = (event: Error, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n this._log(event, priority, 'error', 'Error');\r\n }\r\n\r\n network = (event: NetworkEvent, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n this._log(event, priority, 'network_event', 'Network');\r\n }\r\n\r\n navigation = (event: NavigationEvent, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n this._log(event, priority, 'navigation', 'Navigation');\r\n }\r\n\r\n action = (event: ActionEvent, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n this._log(event, priority, 'action', 'Action');\r\n }\r\n\r\n silentLogin = (event: SilentLoginEvent, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n this._log(event, priority, 'silent_login', 'SilentLogin');\r\n }\r\n\r\n sessionStarted = (event: SessionStartedEvent, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n this._sessionStartDate = new Date();\r\n this._wasLoggedIn = event.wasPreLoggedin;\r\n this._wasUnifiedView = event.useUnifiedView;\r\n this._log(event, priority, 'session_started', 'SessionStarted');\r\n }\r\n\r\n sessionIntermediateStep = (event: SessionIntermediateEvent, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n event.wasLoggedIn = event.wasLoggedIn === undefined ? this._wasLoggedIn : event.wasLoggedIn;\r\n event.useUnifiedView = this._wasUnifiedView;\r\n this._log(event, priority, 'session_intermediate', 'SessionIntermediateEvent');\r\n }\r\n\r\n sessionFinished = (event: SessionFinishedEvent, priority: AWTEventPriority = AWTEventPriority.Normal) => {\r\n event.sessionDurationInMs = getDiffInMS(this._sessionStartDate);\r\n event.wasLoggedIn = this._wasLoggedIn;\r\n event.useUnifiedView = this._wasUnifiedView;\r\n\r\n this._log(event, priority, 'session_finished', 'SessionFinished');\r\n }\r\n\r\n meetNowFallbackFlow = (event: FallbackFlowEvent) => {\r\n this._log(event, AWTEventPriority.Normal, 'fallback_flow_started', 'FallbackFlowStarted');\r\n }\r\n\r\n getCorrelationId = () => {\r\n const correlationIdFromQuery = UrlHelper.getQueryParameterAsString('correlationId');\r\n if (correlationIdFromQuery) {\r\n return correlationIdFromQuery;\r\n }\r\n\r\n return this.getSessionId();\r\n }\r\n\r\n private setName = (eventProperties: AWTEventProperties, name: string) => {\r\n eventProperties.setName(this._prefix + name);\r\n eventProperties.setType(name);\r\n }\r\n\r\n private setCommonProperties = (eventProperties: AWTEventProperties) => {\r\n Object.keys(this._commonProperties).forEach((key) => {\r\n const property = (this._commonProperties as any)[key] as Property;\r\n if (property.piiKind) {\r\n eventProperties.setPropertyWithPii(property.key, property.value, property.piiKind);\r\n } else {\r\n eventProperties.setProperty(property.key, property.value);\r\n }\r\n });\r\n eventProperties.setProperty('DeviceInfo.Custom.Os', os);\r\n eventProperties.setProperty('DeviceInfo.Custom.Browser', browser);\r\n eventProperties.setProperty('DeviceInfo.Custom.DeviceType', deviceType);\r\n eventProperties.setProperty('Config.Env', Config.env);\r\n eventProperties.setProperty('Source', UrlHelper.getQueryParameterAsString('source'));\r\n eventProperties.setProperty('Exp', UrlHelper.getQueryParameterAsString('exp'));\r\n eventProperties.setProperty('Call', UrlHelper.getQueryParameterAsString('call'));\r\n eventProperties.setProperty('Video', UrlHelper.getQueryParameterAsString('video'));\r\n eventProperties.setProperty('Mic', UrlHelper.getQueryParameterAsString('mic'));\r\n eventProperties.setProperty('CorrelationId', this.getCorrelationId());\r\n eventProperties.setProperty('session_id', this.getCorrelationId()); // this is used as an actor in Interana\r\n }\r\n\r\n private setProperties = (eventProperties: AWTEventProperties, properties: any, propertyPrefix: string) => {\r\n Object.keys(properties).forEach((property) => {\r\n if (typeof properties[property] === 'object' && properties[property]) {\r\n this.setProperties(eventProperties, properties[property], propertyPrefix + '.' + property);\r\n } else {\r\n eventProperties.setProperty(propertyPrefix + '.' + property, properties[property]);\r\n }\r\n });\r\n }\r\n\r\n private setPiiProperties = (eventProperties: AWTEventProperties, piiProperties: Property[], propertyPrefix: string) => {\r\n piiProperties.forEach((property: Property) => {\r\n eventProperties.setPropertyWithPii(propertyPrefix + '.' + property.key, property.value, property.piiKind || AWTPiiKind.NotSet, property.type);\r\n });\r\n }\r\n\r\n private _onError = (message: any, file: any, line: any, col: any, error: any) => {\r\n this._log({\r\n message,\r\n file,\r\n line,\r\n col,\r\n error,\r\n }, AWTEventPriority.Normal, 'js_onerror', 'Error');\r\n }\r\n\r\n private _log(event: any, priority: AWTEventPriority, name: string, propertyPrefix: string, piiProperties?: Property[]) {\r\n const eventProperties = new AWTEventProperties();\r\n eventProperties.setEventPriority(priority);\r\n this.setName(eventProperties, name);\r\n this.setCommonProperties(eventProperties);\r\n this.setProperties(eventProperties, event, propertyPrefix);\r\n\r\n if (piiProperties && Array.isArray(piiProperties)) {\r\n this.setPiiProperties(eventProperties, piiProperties, propertyPrefix);\r\n }\r\n\r\n this._logger.logEvent(eventProperties);\r\n }\r\n}\r\n\r\nexport const logger = new LoggerHelper();\r\n","import curry from 'lodash/curry';\r\nimport map from 'lodash/map';\r\n\r\nexport const doPostRedirect = (url: string, params: object) => {\r\n const form = buildForm(url, params);\r\n\r\n document.body.appendChild(form);\r\n form.submit();\r\n};\r\n\r\n/**\r\n * This helper is not using React to render the \"utility form\" because on Meet Now Edge page, React is not included in the package.\r\n *\r\n * @param url\r\n * @param params\r\n */\r\nexport const buildForm = (url: string, params: object): HTMLFormElement => {\r\n const form = document.createElement('form');\r\n form.method = 'POST';\r\n form.style.display = 'none';\r\n form.action = url;\r\n\r\n addParameters(form, params);\r\n\r\n return form;\r\n};\r\n\r\nexport const addParameters = (form: HTMLFormElement, params: object) => {\r\n map(params, addParameter(form));\r\n};\r\n\r\nexport const addParameter = curry((form: HTMLFormElement, value: string, key: string) => {\r\n const input = document.createElement('input');\r\n input.type = 'hidden';\r\n input.name = key;\r\n input.value = value;\r\n\r\n form.appendChild(input);\r\n});\r\n","\nvar content = require(\"!!../../../node_modules/css-loader/index.js??ref--6-1!../../../node_modules/postcss-loader/lib/index.js??ref--6-2!../../../node_modules/less-loader/dist/cjs.js!./JoinWidget.less\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../node_modules/css-loader/index.js??ref--6-1!../../../node_modules/postcss-loader/lib/index.js??ref--6-2!../../../node_modules/less-loader/dist/cjs.js!./JoinWidget.less\", function() {\n\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js??ref--6-1!../../../node_modules/postcss-loader/lib/index.js??ref--6-2!../../../node_modules/less-loader/dist/cjs.js!./JoinWidget.less\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","\nvar content = require(\"!!../../../node_modules/css-loader/index.js??ref--6-1!../../../node_modules/postcss-loader/lib/index.js??ref--6-2!../../../node_modules/less-loader/dist/cjs.js!./MeetNowJoin.less\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../node_modules/css-loader/index.js??ref--6-1!../../../node_modules/postcss-loader/lib/index.js??ref--6-2!../../../node_modules/less-loader/dist/cjs.js!./MeetNowJoin.less\", function() {\n\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js??ref--6-1!../../../node_modules/postcss-loader/lib/index.js??ref--6-2!../../../node_modules/less-loader/dist/cjs.js!./MeetNowJoin.less\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \".appWrapper{min-width:500px}.appWrapper,.appWrapper .joinWidgetFlex{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.appWrapper .joinWidgetFlex{-ms-flex-pack:distribute;justify-content:space-around}@media only screen and (max-width:500px){.appWrapper .joinWidgetFlex{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;height:100%}}@media only screen and (max-width:500px){.appWrapper{min-width:auto;width:100%;height:100%}}\", \"\"]);\n\n// exports\n","import { Actions } from '../models/SharedTypes';\r\n\r\nexport interface CookieConfig {\r\n name: string;\r\n key?: string;\r\n path?: string;\r\n maxAge?: number;\r\n domain?: string;\r\n}\r\n\r\nexport interface S4LParameters {\r\n threadId?: string;\r\n inviteId?: string;\r\n skypeId?: string;\r\n channelId?: string;\r\n}\r\n\r\nexport interface Config {\r\n env: 'dev' | 'latest' | 'qa' | 'dogfood' | 'production';\r\n cookies: {\r\n skype: CookieConfig;\r\n csrf: CookieConfig;\r\n };\r\n silentLogin: {\r\n env: string;\r\n client_id: string;\r\n redirect_uri: string;\r\n };\r\n logging: {\r\n ariaTenant: string;\r\n };\r\n urls: {\r\n ecs: string,\r\n api: {\r\n profile: string;\r\n huddle: string;\r\n meetings: string;\r\n invite: string;\r\n channels: string;\r\n captcha: (lang: string, flowId: string, rand: string) => string;\r\n }\r\n app: {\r\n faq: string;\r\n login: (redirectUri: string, state: string) => string;\r\n logout: (redirectUri: string, state: string) => string;\r\n s4lWeb: (params: S4LParameters, webSubDomain?: string) => string;\r\n botLogin: (botId: string, useBotLauncherQueryParam?: boolean) => string;\r\n download: string;\r\n downloadAndroid: (threadId?: string) => string;\r\n downloadDesktop: string; // Remove once we have access to goLink CMS, the first one should be enough\r\n cookiePolicy: string;\r\n skypeCom: string,\r\n join: string,\r\n },\r\n launcher: {\r\n skypeUri: (action: Actions, threadId: string, sessionId: string, origin: string) => string;\r\n intentUri: (action: Actions, threadId: string, sessionId: string, origin: string, fallbackUri: string) => string;\r\n universalUri: (shortId: string, sessionId: string) => string;\r\n },\r\n inviteLauncher: {\r\n skypeUri: (skypeId: string, sessionId: string, offSkypeInviteId: string, origin: string) => string;\r\n intentUri: (skypeId: string, sessionId: string, offSkypeInviteId: string, origin: string, fallbackUri: string) => string;\r\n },\r\n botLauncher: {\r\n skypeUri: (botId: string, sessionId: string, origin: string) => string;\r\n intentUri: (botId: string, sessionId: string, origin: string, fallbackUri: string) => string;\r\n },\r\n channelLauncher: {\r\n skypeUri: (channelId: string, sessionId: string, origin: string) => string;\r\n intentUri: (channelId: string, sessionId: string, origin: string, fallbackUri: string) => string;\r\n },\r\n doLauncher: {\r\n skypeUri: (action: Actions, skypeId: string, sessionId: string, origin: string) => string;\r\n intentUri: (action: Actions, skypeId: string, sessionId: string, origin: string, fallbackUri: string) => string;\r\n },\r\n meetNowJoinLauncher: {\r\n skypeUri: (action: Actions, source: string, exp: string, call: string, video: string, mic: string, sessionId: string, origin: string) => string;\r\n intentUri: (action: Actions, source: string, exp: string, call: string, video: string, mic: string, sessionId: string, origin: string, fallbackUri: string) => string;\r\n },\r\n };\r\n}\r\n\r\nconst config: Config = {\r\n env: 'production',\r\n cookies: {\r\n skype: {\r\n name: 'SC',\r\n path: '/',\r\n maxAge: 3600 * 24 * 90, // 90 days\r\n domain: '.skype.com',\r\n },\r\n csrf: {\r\n name: 'x-csrf-token',\r\n },\r\n },\r\n logging: {\r\n ariaTenant: '36f18b389f2543c0b54bf5c5555e3587-e50b4ede-9173-4805-ab3a-7c8564e50b52-6674',\r\n },\r\n silentLogin: {\r\n env: 'live',\r\n client_id: '371752',\r\n redirect_uri: 'https://join.skype.com',\r\n },\r\n urls: {\r\n ecs: 'https://a.config.skype.com',\r\n api: {\r\n profile: 'https://profile.skype.com/profile',\r\n huddle: 'https://join.skype.com/api',\r\n meetings: 'https://api.join.skype.com',\r\n invite: 'https://inviteconnector.skype.com',\r\n channels: 'https://channels.skype.com',\r\n captcha: (lang: string, flowId: string, rand: string) =>\r\n `https://client.hip.live.com/GetHIP/GetWLSPHIP0/WLSPHIP0?mkt=${ lang }&fid=${ flowId }&id=skypeguest&type=visual&rnd=${ rand }`,\r\n },\r\n app: {\r\n faq: 'https://go.skype.com/faq.invites',\r\n login: (redirectUri: string, state: string) =>\r\n `https://login.skype.com/login?client_id=578134&redirect_uri=${ encodeURIComponent(redirectUri) }&state=${ state }`,\r\n logout: (redirectUri: string, state: string) =>\r\n `https://login.skype.com/logout?client_id=578134&redirect_uri=${ encodeURIComponent(redirectUri) }&state=${ state }`,\r\n s4lWeb: (params, webSubDomain) => {\r\n const url = `https://${ !!webSubDomain ? `${ webSubDomain }.` : '' }web.skype.com`;\r\n if (params.threadId) {\r\n return `${ url }/${ params.threadId }`;\r\n }\r\n\r\n if (params.inviteId && params.skypeId) {\r\n return `${ url }/8:${ params.skypeId }?inviteId=${ params.inviteId }`;\r\n }\r\n\r\n if (params.channelId) {\r\n return `${ url }/channel/${ params.channelId }`;\r\n }\r\n\r\n return url;\r\n },\r\n botLogin: (botId: string, useBotLauncherQueryParam?: boolean) => {\r\n const loginUri = `https://login.skype.com/login?client_id=708557&redirect_uri=https%3A%2F%2Fjoin.skype.com%2Fbot%2F${ botId }`;\r\n if (useBotLauncherQueryParam) {\r\n return loginUri + '?botsLauncher=true';\r\n }\r\n\r\n return loginUri;\r\n },\r\n download: 'https://go.skype.com/spaces.getskype',\r\n downloadAndroid: (threadId?: string) =>\r\n `https://play.google.com/store/apps/details?id=com.skype.raider&referrer=${threadId && encodeURIComponent(\r\n `utm_source=invite&utm_thread=${threadId}`)}`,\r\n downloadDesktop: 'https://go.skype.com/download-skype/',\r\n cookiePolicy: 'https://go.skype.com/privacy',\r\n skypeCom: 'https://www.skype.com',\r\n join: 'https://join.skype.com',\r\n },\r\n launcher: {\r\n skypeUri: (action, threadId, sessionId, origin) => `skype:?${ action }&threadId=${ threadId }&correlationId=${ sessionId }&origin=${ origin }`,\r\n intentUri: (action, threadId, sessionId, origin, fallbackUri) =>\r\n `intent://?${ action }&threadId=${ threadId }&correlationId=${ sessionId }&origin=${ origin }`\r\n + `#Intent;scheme=skype;package=com.skype.raider;S.browser_fallback_url=${ encodeURIComponent(fallbackUri) };end;`,\r\n universalUri: (shortId, sessionId) => `https://www.skype.com/meetnow/${ shortId }?fallback=true&correlationId=${sessionId}`,\r\n },\r\n inviteLauncher: {\r\n skypeUri: (skypeId, sessionId, offSkypeInviteId, origin) =>\r\n `skype:${ skypeId }?chat&correlationId=${ sessionId }&utm_source=buddy&utm_content=${ offSkypeInviteId }&origin=${ origin }`,\r\n intentUri: (skypeId, sessionId, offSkypeInviteId, origin, fallbackUri) =>\r\n `intent://${ skypeId }?chat&correlationId=${ sessionId }&utm_source=buddy&utm_content=${ offSkypeInviteId }&origin=${ origin }`\r\n + `#Intent;scheme=skype;S.browser_fallback_url=${ encodeURIComponent(fallbackUri) };end;`,\r\n },\r\n botLauncher: {\r\n skypeUri: (botId, sessionId, origin) => `skype:${ botId }?chat&correlationId=${ sessionId }&origin=${ origin }`,\r\n intentUri: (botId, sessionId, origin, fallbackUri) =>\r\n `intent://${ botId }?chat&correlationId=${ sessionId }&origin=${ origin }#Intent;scheme=skype;S.browser_fallback_url=${ encodeURIComponent(fallbackUri) };end;`,\r\n },\r\n channelLauncher: {\r\n skypeUri: (channelId, sessionId, origin) => `skype:?channel=${ encodeURIComponent(channelId) }&correlationId=${ sessionId }&origin=${ origin }`,\r\n intentUri: (channelId, sessionId, origin, fallbackUri) =>\r\n `intent://?channel=${ encodeURIComponent(channelId) }&correlationId=${ sessionId }&origin=${ origin }`\r\n + `#Intent;scheme=skype;S.browser_fallback_url=${ encodeURIComponent(fallbackUri) };end;`,\r\n },\r\n doLauncher: {\r\n skypeUri: (action, skypeId, sessionId, origin) =>\r\n `skype:${ skypeId }?${ action }&correlationId=${ sessionId }&origin=${ origin }`,\r\n intentUri: (action, skypeId, sessionId, origin, fallbackUri) =>\r\n `intent://${ skypeId }?${ action }&correlationId=${ sessionId }&origin=${ origin }`\r\n + `#Intent;scheme=skype;S.browser_fallback_url=${ encodeURIComponent(fallbackUri) };end;`,\r\n },\r\n meetNowJoinLauncher: {\r\n skypeUri: (action, source, exp, call, video, mic, sessionId, origin) =>\r\n `skype:?action=${ action }&source=${ source }&exp=${ exp }&correlationId=${ sessionId }&origin=${ origin }&call=${ call }&video=${ video}&mic=${ mic }`,\r\n intentUri: (action, source, exp, call, video, mic, sessionId, origin, fallbackUri) =>\r\n `intent://?action=${ action }&source=${ source }&exp=${ exp }&correlationId=${ sessionId }&origin=${ origin }&call=${ call }&video=${ video}&mic=${ mic }`\r\n + `#Intent;scheme=skype;package=com.skype.raider;S.browser_fallback_url=${ encodeURIComponent(fallbackUri) };end;`,\r\n },\r\n },\r\n};\r\n\r\nexport default config;\r\n","export interface Dictionary {\r\n [index: string]: T;\r\n}\r\n\r\nexport enum Themes {\r\n Teams = 'teams',\r\n Light = 'light',\r\n}\r\n\r\nexport enum AppIds {\r\n Meetings = 'wl',\r\n OffSkypeInvites = 'oi',\r\n}\r\n\r\nexport enum Actions {\r\n Chat = 'chat',\r\n Call = 'call',\r\n MeetNowJoin = 'meetnowjoin',\r\n}\r\n\r\nexport interface Dimension { width: number; height: number; }\r\nexport const defaultDimension: Dimension = { width: 0, height: 0 };\r\nexport const mainContentId = 'mainContent';\r\nexport const COUNTRY_CHINA = 'cn';\r\n","import { localizer } from '@skype/bew-localization';\r\n\r\nexport const loadTranslation = (language: string) => {\r\n localizer.initSync({\r\n locale: language,\r\n localizedTable: (window as any).I18NBUNDLE,\r\n fallback: 'en',\r\n fallbackTable: (window as any).I18NBUNDLE_FALLBACK || (window as any).I18NBUNDLE,\r\n });\r\n};\r\n","\nvar content = require(\"!!../../../node_modules/css-loader/index.js??ref--6-1!../../../node_modules/postcss-loader/lib/index.js??ref--6-2!../../../node_modules/less-loader/dist/cjs.js!./index.less\");\n\nif(typeof content === 'string') content = [[module.id, content, '']];\n\nvar transform;\nvar insertInto;\n\n\n\nvar options = {\"hmr\":true}\n\noptions.transform = transform\noptions.insertInto = undefined;\n\nvar update = require(\"!../../../node_modules/style-loader/lib/addStyles.js\")(content, options);\n\nif(content.locals) module.exports = content.locals;\n\nif(module.hot) {\n\tmodule.hot.accept(\"!!../../../node_modules/css-loader/index.js??ref--6-1!../../../node_modules/postcss-loader/lib/index.js??ref--6-2!../../../node_modules/less-loader/dist/cjs.js!./index.less\", function() {\n\t\tvar newContent = require(\"!!../../../node_modules/css-loader/index.js??ref--6-1!../../../node_modules/postcss-loader/lib/index.js??ref--6-2!../../../node_modules/less-loader/dist/cjs.js!./index.less\");\n\n\t\tif(typeof newContent === 'string') newContent = [[module.id, newContent, '']];\n\n\t\tvar locals = (function(a, b) {\n\t\t\tvar key, idx = 0;\n\n\t\t\tfor(key in a) {\n\t\t\t\tif(!b || a[key] !== b[key]) return false;\n\t\t\t\tidx++;\n\t\t\t}\n\n\t\t\tfor(key in b) idx--;\n\n\t\t\treturn idx === 0;\n\t\t}(content.locals, newContent.locals));\n\n\t\tif(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');\n\n\t\tupdate(newContent);\n\t});\n\n\tmodule.hot.dispose(function() { update(); });\n}","import { ErrorHandlingType, WebErrorResponse } from 'simplerestclients';\r\nimport { ConversationServiceModel, RawConversationServiceModel } from '../models/ConversationServiceModel';\r\n\r\ntype Transform = (model: RawConversationServiceModel) => ConversationServiceModel;\r\n\r\nfunction transform(model: RawConversationServiceModel): ConversationServiceModel {\r\n return {\r\n action: 'Chat',\r\n flowId: model.flowId,\r\n id: model.longId,\r\n resource: model.threadId,\r\n };\r\n}\r\n\r\nexport const transformWrapper = (shortId: string): Transform =>\r\n (model: RawConversationServiceModel): ConversationServiceModel => ({\r\n ...transform(model),\r\n shortId,\r\n });\r\n\r\nconst shouldRetry = (statusCode: number): boolean =>\r\n statusCode === 0 || (statusCode >= 500 && statusCode < 600);\r\n\r\n// @todo: add logging if needed\r\nexport const customErrorHandler = ({ }, errResp: WebErrorResponse): ErrorHandlingType =>\r\n shouldRetry(errResp.statusCode) ? ErrorHandlingType.RetryCountedWithBackoff : ErrorHandlingType.DoNotRetry;\r\n","import config from 'config';\r\nimport { S4LParameters } from '../config/BaseConfig';\r\nimport { Dictionary } from '../models/SharedTypes';\r\nimport { displayableErrors } from './ErrorHelper';\r\nimport { logger } from './LoggerHelper';\r\n\r\ninterface KeyValuePair {\r\n key: string;\r\n value: string;\r\n}\r\n\r\nexport class UrlHelper {\r\n\r\n static getWebClientUrl(params: S4LParameters, webSubdomainForRedirect?: string | undefined) {\r\n // Websubdomain allow us to try out the integration with different version of webshell\r\n // Current up to date list is available: candidate, preview, dev, alpha, beta\r\n const { webSubDomain } = UrlHelper.getQueryParameters() as Dictionary;\r\n\r\n // webSubDomain passed by query param takes precedence to ECS config\r\n return config.urls.app.s4lWeb(params, webSubDomain || webSubdomainForRedirect);\r\n }\r\n\r\n static getWebClientUrlWithCorrelationId(params: S4LParameters, webSubdomainForRedirect?: string | undefined) {\r\n const url = UrlHelper.getWebClientUrl(params, webSubdomainForRedirect);\r\n\r\n return `${url}${url.includes('?') ? '&' : '?'}correlationId=${logger.getCorrelationId()}`;\r\n }\r\n\r\n static getAllowedQueryParameters(allowedParameters: string[]): KeyValuePair[] {\r\n return allowedParameters\r\n .map((param: string) => ({\r\n key: param,\r\n value: UrlHelper.getQueryParameter(param),\r\n } as KeyValuePair))\r\n .filter((pair: KeyValuePair) => pair.value);\r\n }\r\n\r\n static getQueryParameters() {\r\n if (!location.search || location.search.length < 1) {\r\n return {} as Dictionary;\r\n }\r\n\r\n return location.search\r\n .substr(1)\r\n .split('&')\r\n .map((value) => {\r\n const split = value.split('=');\r\n return {\r\n key: decodeURIComponent(split[0]),\r\n value: decodeURIComponent(split[1] || ''),\r\n } as KeyValuePair;\r\n })\r\n .reduce((prev, current) => {\r\n if (!!prev[current.key]) {\r\n const prevValue = prev[current.key];\r\n if (typeof prevValue === 'string') {\r\n prev[current.key] = [prev[current.key] as string];\r\n }\r\n (prev[current.key] as string[]).push(current.value);\r\n } else {\r\n prev[current.key] = current.value;\r\n }\r\n return prev;\r\n }, {} as Dictionary);\r\n }\r\n\r\n static getQueryParameter(key: string): string | string[] {\r\n return UrlHelper.getQueryParameters()[key];\r\n }\r\n\r\n static getQueryParameterAsString(key: string): string {\r\n return `${UrlHelper.getQueryParameter(key) || ''}`;\r\n }\r\n\r\n static getShortIdFromUrl(): string {\r\n const pathName = window.location.pathname.replace(/\\/+$/, '');\r\n const pathParts = pathName.split('/');\r\n const shortId = pathParts.pop();\r\n\r\n if (!shortId) {\r\n throw displayableErrors.ShortIdFromUrl;\r\n }\r\n\r\n return shortId;\r\n }\r\n}\r\n","import { localizer } from '@skype/bew-localization';\r\nimport { Button } from '@stardust-ui/react';\r\nimport React from 'react';\r\nimport { ErrorDetails } from './ErrorDetails';\r\n\r\nexport interface ErrorModalProps {\r\n error: Error;\r\n assetsBasePath?: string;\r\n onClose: () => void;\r\n}\r\n\r\nexport class ErrorModal extends React.PureComponent {\r\n render() {\r\n return (\r\n
\r\n
\r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n","import { Config } from 'config';\r\nimport * as React from 'react';\r\n\r\nexport interface ConfigContext extends Config {\r\n basePath: string;\r\n language: string;\r\n switchLanguage: (language: string) => void;\r\n}\r\n\r\n// Default context does not mean much sense here\r\nconst context = React.createContext({} as ConfigContext);\r\n\r\nexport const ConfigContextProvider = context.Provider;\r\n\r\nexport const ConfigContextConsumer = context.Consumer;\r\n","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \"body[data-platform=macIos],body[data-platform=macIos] button,body[data-platform=macIos] input,body[data-platform=macIos] select,body[data-platform=macIos] textarea{font-family:-apple-system,BlinkMacSystemFont,Tahoma,Helvetica Neue,Helvetica,Meiryo UI,Meiryo,Arial Unicode MS,sans-serif!important}body[data-platform=android],body[data-platform=android] button,body[data-platform=android] input,body[data-platform=android] select,body[data-platform=android] textarea{font-family:Roboto,Tahoma,Helvetica Neue,Helvetica,Meiryo UI,Meiryo,Arial Unicode MS,sans-serif!important}html[lang=bg] body,html[lang=bg] button,html[lang=bg] input,html[lang=bg] select,html[lang=bg] textarea,html[lang=ru] body,html[lang=ru] button,html[lang=ru] input,html[lang=ru] select,html[lang=ru] textarea,html[lang=uk] body,html[lang=uk] button,html[lang=uk] input,html[lang=uk] select,html[lang=uk] textarea{font-family:Segoe UI,Segoe WP,Segoe UI Cyrillic Web,Tahoma,Helvetica Neue,Helvetica,Meiryo UI,Meiryo,Arial Unicode MS,sans-serif}html[lang=el] body,html[lang=el] button,html[lang=el] input,html[lang=el] select,html[lang=el] textarea{font-family:Segoe UI,Segoe WP,Segoe UI Greek Web,Tahoma,Helvetica Neue,Helvetica,Meiryo UI,Meiryo,Arial Unicode MS,sans-serif}html[lang=he] body,html[lang=he] button,html[lang=he] input,html[lang=he] select textarea{font-family:Segoe UI,Segoe WP,Segoe UI Hebrew Web,Tahoma,Helvetica Neue,Helvetica,Meiryo UI,Meiryo,Arial Unicode MS,sans-serif}html[lang=hi] body,html[lang=hi] button,html[lang=hi] input,html[lang=hi] select,html[lang=hi] textarea{font-family:Local Hindi,Segoe UI,Segoe WP,Tahoma,Helvetica Neue,Helvetica,Meiryo UI,Meiryo,Arial Unicode MS,sans-serif}html[lang=ja] body,html[lang=ja] button,html[lang=ja] input,html[lang=ja] select,html[lang=ja] textarea{font-family:Meiryo,Segoe UI,Segoe WP,Tahoma,Verdana,Arial,sans-serif}html[lang=ko] body,html[lang=ko] button,html[lang=ko] input,html[lang=ko] select,html[lang=ko] textarea{font-family:Malgun Gothic,Gulim,Segoe UI,Segoe WP,Tahoma,Verdana,Arial,sans-serif}html[lang=zh-Hant] body,html[lang=zh-Hant] button,html[lang=zh-Hant] input,html[lang=zh-Hant] select,html[lang=zh-Hant] textarea{font-family:微軟正黑體Microsoft JhengHei,微軟正黑體 Microsoft JhengHei,Microsoft JhengHei,微軟正黑體,Segoe UI,Segoe WP,Tahoma,Verdana,Arial,sans-serif}html[lang=zh_CN] body,html[lang=zh_CN] button,html[lang=zh_CN] input,html[lang=zh_CN] select,html[lang=zh_CN] textarea{font-family:Microsoft yahei,微软雅黑,Segoe UI,Segoe WP,Tahoma,Verdana,Arial,sans-serif}b,strong{font-weight:600}.fontSizeH1{font-size:4em;margin-bottom:.48387em}.fontSizeH1,.fontSizeH2{font-weight:100;letter-spacing:normal;line-height:1.16129em}.fontSizeH2{font-size:60px;margin:0;font-size:2.5em}@media only screen and (max-width:600px){.fontSizeH2{font-size:40px}}.fontSizeH3{font-size:1.7em;font-weight:300;letter-spacing:.013em;line-height:1.4em;margin-bottom:.48387em;margin-top:0}@media only screen and (max-width:600px){.fontSizeH3{margin:0 auto;font-size:1.2em}}.fontSizeH4{font-size:1em;font-weight:400;letter-spacing:normal;line-height:1.33333em;margin-bottom:.83333em}.button{background-color:#008cc0;border:1px solid transparent;border-radius:50px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-size:18px;line-height:24px;margin:0;max-width:440px;min-width:150px;padding:5px 0 8px;text-align:center;text-decoration:none;vertical-align:middle;width:100%;word-wrap:break-word}@media only screen and (min-width:767px){.button{font-size:20px;padding:7px 0 10px;width:auto}}.button:focus{outline:1px dotted #333534}.button:focus,.button:hover{text-decoration:none;background-color:#0c7daf}.button--disabled{background-color:#a3d0ed!important;cursor:not-allowed}.buttonBlue,.buttonSimple,.buttonWhite,.newButton{box-sizing:border-box;border:1px solid transparent;border-radius:100px;cursor:pointer;display:inline-block;font-size:18px;font-weight:400;margin:0 7px 10px;position:relative;text-align:center;text-decoration:none;word-wrap:break-word;padding:19px 30px;min-width:260px;-webkit-transition:background-color .1s ease-in-out;transition:background-color .1s ease-in-out}.newButton .button__text{padding:0}@media only screen and (max-width:600px){.buttonBlue,.buttonSimple,.buttonWhite,.newButton{padding:9px 30px;min-width:190px;font-size:14px}}.buttonBlue{color:#fff;background-color:#0078ca}.buttonBlue:active,.buttonBlue:hover{background-color:#0b64a4}.buttonWhite{color:#2b2c33;border:1px solid #2b2c33}.buttonWhite:active,.buttonWhite:hover{background-color:#2b2c33;color:#fff}.buttonSimple{color:#0078ca;border:none}.buttonSimple:active,.buttonSimple:hover{color:#0b64a4}.joinWidgetWrapper{background-color:#fff;border-radius:11px;padding:50px 20px 30px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}@media only screen and (max-width:500px){.joinWidgetWrapper{border-radius:0;height:100%}}.joinWidgetWrapper .titleWrapper{margin-bottom:30px}.joinWidgetWrapper .titleWrapper img{height:100px}.joinWidgetWrapper .titleWrapper .widgetTitle{font-size:20px}.joinWidgetWrapper .inputWrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-bottom:10px}.joinWidgetWrapper .inputWrapper label{-ms-flex-item-align:start;align-self:flex-start;color:#637074;text-transform:uppercase;font-weight:700;font-size:14px;margin-bottom:5px}.joinWidgetWrapper .inputWrapper input{border:1px solid #f2f2f2;height:50px;font-size:18px;background-color:#f2f2f2;border-radius:11px;padding:0 20px}.joinWidgetWrapper .inputWrapper input.error{border-color:#f44336}.joinWidgetWrapper .inputWrapper .joinLinkErrorText{color:#f44336;font-size:13px;font-weight:600;height:24px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.joinWidgetWrapper .createNewMeeting{margin-top:15px}.joinWidgetWrapper .createNewMeeting .createMeetingLink{color:#0078ca;font-weight:600}.joinWidgetWrapper .buttonWrapper .buttonJoin{height:50px;margin:auto;padding:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;font-weight:600}.joinWidgetWrapper .buttonWrapper .buttonJoin[disabled]{background-color:#637074;cursor:not-allowed}.joinWidgetWrapper .termsAndConditions{display:block;font-size:13px;margin-top:20px}.joinWidgetWrapper .termsAndConditions a{color:#2b2c33}\", \"\"]);\n\n// exports\n","import { AWTEventPriority, AWTPiiKind, AWTPropertyType } from '@aria/webjs-sdk';\r\nimport config from 'config';\r\nimport curry from 'lodash/curry';\r\nimport { CookieHelper } from '../helpers/CookieHelper';\r\nimport { CommonProperty, logger } from '../helpers/LoggerHelper';\r\nimport { doPostRedirect } from '../helpers/RedirectHelper';\r\nimport { SilentLoginResult } from '../helpers/SilentLoginHelper';\r\nimport { getMsaCidHexFromSkypeToken, getSkypeIdFromSkypeToken } from '../helpers/SkypeTokenHelper';\r\nimport { UrlHelper } from '../helpers/UrlHelper';\r\nimport { ConversationServiceModel } from '../models/ConversationServiceModel';\r\nimport {\r\n CreateMeetingServiceModel,\r\n MeetnowGuestServiceModel,\r\n WebClientRedirectParams,\r\n} from '../models/GuestUserServiceModel';\r\nimport { AppIds } from '../models/SharedTypes';\r\nimport MeetingsApiClient from '../rest/MeetingsApiClient';\r\nimport { triggerFallbackFlow } from './FallbackFlow';\r\nimport { IMeetNowSettings } from './MeetNowSettings';\r\n\r\nexport const getShortIdFromJoinLink = (joinLink: string): string => joinLink.split('/').pop() || '';\r\n\r\nexport const getSource = () => {\r\n const source = UrlHelper.getQueryParameter('source');\r\n return source ? `${source}` : undefined;\r\n};\r\n\r\nexport const logShortIdAndThreadId = (meeting: CreateMeetingServiceModel): CreateMeetingServiceModel => {\r\n logger.initCommonProperty({\r\n key: CommonProperty.ShortId,\r\n value: getShortIdFromJoinLink(meeting.joinLink),\r\n piiKind: AWTPiiKind.GenericData,\r\n type: AWTPropertyType.String,\r\n });\r\n logger.initCommonProperty({\r\n key: CommonProperty.ThreadId,\r\n value: meeting.threadId,\r\n piiKind: AWTPiiKind.GenericData,\r\n type: AWTPropertyType.String,\r\n });\r\n\r\n return meeting;\r\n};\r\n\r\nexport const logUserId = (meeting: MeetnowGuestServiceModel): MeetnowGuestServiceModel => {\r\n logger.addSkypeIdAndMsaCidHexCommonProperties(meeting.skypetoken, true);\r\n\r\n return meeting;\r\n};\r\n\r\nexport const createConversationServiceModel = (meeting: CreateMeetingServiceModel): ConversationServiceModel => {\r\n return {\r\n shortId: getShortIdFromJoinLink(meeting.joinLink),\r\n resource: meeting.threadId,\r\n id: '',\r\n flowId: '',\r\n action: '',\r\n };\r\n};\r\n\r\nexport const createGuestMeeting = (settings: IMeetNowSettings, source = 'HuddleUi') => {\r\n return MeetingsApiClient.createGuestMeeting({ title: settings.DefaultMeetingTitle, source }, settings.MeetNowEdgeNumberOfFetchRetries);\r\n};\r\n\r\nexport const createMeetnowGuest = (settings: IMeetNowSettings, source = 'HuddleUi') => {\r\n const localizedGuestDefaultName = document.getElementById('meetnowContainer')?.getAttribute('data-guest-user-localized-text') ?? 'Guest user';\r\n return MeetingsApiClient.meetnowGuest({\r\n displayName: localizedGuestDefaultName,\r\n source,\r\n }, settings.MeetNowEdgeNumberOfFetchRetries);\r\n};\r\n\r\nexport const createAuthenticatedMeeting = (settings: IMeetNowSettings, loginResult: SilentLoginResult, source = 'HuddleUi') => {\r\n return MeetingsApiClient\r\n .createAuthenticatedMeeting({ title: settings.DefaultMeetingTitle, SkypeToken: loginResult.skypetoken, source }, settings.MeetNowEdgeNumberOfFetchRetries);\r\n};\r\n\r\nexport const getThreadId = curry((settings: IMeetNowSettings, shortId: string) => {\r\n const params = {\r\n shortId,\r\n type: AppIds.Meetings,\r\n };\r\n\r\n return MeetingsApiClient\r\n .getConversation(params, settings.MeetNowEdgeNumberOfFetchRetries)\r\n .then((conversion) => {\r\n logger.initCommonProperty({\r\n key: CommonProperty.ThreadId,\r\n value: conversion.resource,\r\n piiKind: AWTPiiKind.GenericData,\r\n type: AWTPropertyType.String,\r\n });\r\n return conversion;\r\n })\r\n .then((conversion) => ({ shortId, ...conversion }));\r\n});\r\n\r\nexport const buildWebClientRedirectParamsForAuthenticatedFlow =\r\n curry((loginResult: SilentLoginResult, conversationServiceModel: ConversationServiceModel): WebClientRedirectParams => {\r\n return {\r\n threadId: conversationServiceModel.resource,\r\n shortId: conversationServiceModel.shortId,\r\n skypetoken: loginResult.skypetoken,\r\n skypeId: getSkypeIdFromSkypeToken(loginResult.skypetoken) || '',\r\n };\r\n });\r\n\r\nexport const buildWebClientRedirectParamsFromMeetnowGuestServiceModel = (meetnowGuestServiceModel: MeetnowGuestServiceModel): WebClientRedirectParams => {\r\n return {\r\n skypetoken: meetnowGuestServiceModel.skypetoken,\r\n skypeId: meetnowGuestServiceModel.skypeId,\r\n threadId: meetnowGuestServiceModel.threadId,\r\n shortId: getShortIdFromJoinLink(meetnowGuestServiceModel.joinLink),\r\n };\r\n};\r\nexport const redirectToSkypeClient = curry((\r\n settings: IMeetNowSettings,\r\n completionType: string,\r\n action: string,\r\n isNewJoinFlowFromJoinLink: boolean,\r\n webClientRedirectParams: WebClientRedirectParams): void => {\r\n const params = {\r\n skypetoken: webClientRedirectParams.skypetoken,\r\n expires_in: 24 * 3600,\r\n skypeid: webClientRedirectParams.skypeId,\r\n state: CookieHelper.getCookie(config.cookies.csrf).singleValue,\r\n msacidhex: getMsaCidHexFromSkypeToken(webClientRedirectParams.skypetoken) || '',\r\n };\r\n\r\n logger.sessionFinished({ completionType }, AWTEventPriority.High);\r\n\r\n const queryParams = `action=${action}&${buildRedirectQueryParameters(settings.MeetNowEdgeAllowedQueryParameters, logger.getCorrelationId(), isNewJoinFlowFromJoinLink)}`;\r\n doPostRedirect(`${UrlHelper.getWebClientUrl({ threadId: webClientRedirectParams.threadId })}?${queryParams}`, params);\r\n});\r\n\r\nexport const buildRedirectQueryParameters = (allowedParameters: string[], fallbackCorrelationId: string, isNewJoinFlowFromJoinLink = false): string => {\r\n const params = UrlHelper.getAllowedQueryParameters(allowedParameters);\r\n\r\n if (!params.find((param) => param.key === 'correlationId')) {\r\n params.push({ key: 'correlationId', value: fallbackCorrelationId });\r\n }\r\n\r\n if (isNewJoinFlowFromJoinLink) {\r\n params.push({ key: 'source', value: 'NewJoinLinkFlow' });\r\n }\r\n\r\n return params\r\n .map((param) => `${encodeURIComponent(param.key)}=${encodeURIComponent(param.value)}`)\r\n .join('&');\r\n};\r\n\r\nexport const processMeetNowEdgeGuestRequest = (settings: IMeetNowSettings): void => {\r\n createMeetnowGuest(settings, getSource())\r\n .then(logShortIdAndThreadId)\r\n .then(logUserId)\r\n .then(buildWebClientRedirectParamsFromMeetnowGuestServiceModel)\r\n .then(redirectToSkypeClient(settings, 'MeetNowEdgeIntegration', 'createmeetnow', false))\r\n .catch((error) => triggerFallbackFlow(error, 'processMeetNowEdgeGuestRequest failure'));\r\n};\r\n\r\nexport const processMeetNowEdgeAuthenticatedRequest = (settings: IMeetNowSettings, loginResult: SilentLoginResult): void => {\r\n createAuthenticatedMeeting(settings, loginResult, getSource())\r\n .then(logShortIdAndThreadId)\r\n .then(createConversationServiceModel)\r\n .then(buildWebClientRedirectParamsForAuthenticatedFlow(loginResult))\r\n .then(redirectToSkypeClient(settings, 'MeetNowEdgeIntegration', 'createmeetnow', false))\r\n .catch((error) => triggerFallbackFlow(error, 'processMeetNowEdgeAuthenticatedRequest failure'));\r\n};\r\n","import Config from 'config';\r\nimport { logger } from '../helpers/LoggerHelper';\r\n\r\nexport const triggerFallbackFlow = (error: Error, reason: string) => {\r\n logger.init(Config.logging.ariaTenant, 'meetnow_edge_');\r\n logger.meetNowFallbackFlow({ message: error.message, reason });\r\n\r\n showErrorMessage();\r\n handleReloadButton();\r\n handleNavigateToWebClientButton();\r\n};\r\n\r\nconst showErrorMessage = () => {\r\n const pageTitle = document.querySelector('.splashScreen');\r\n if (pageTitle) {\r\n pageTitle.style.display = 'none';\r\n }\r\n\r\n const fallbackSection = document.getElementById('fallbackSection');\r\n if (fallbackSection) {\r\n fallbackSection.style.display = 'block';\r\n }\r\n};\r\n\r\nconst handleReloadButton = () => {\r\n const reloadPageButton = document.getElementById('reloadPageButton');\r\n if (reloadPageButton) {\r\n reloadPageButton.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n logger.action({ name: 'reloadFallback' });\r\n window.location.reload();\r\n });\r\n }\r\n};\r\n\r\nconst handleNavigateToWebClientButton = () => {\r\n const goToSkypeButton = document.getElementById('goToSkypeButton');\r\n if (goToSkypeButton) {\r\n goToSkypeButton.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n logger.action({ name: 'goToSkypeFallback' });\r\n window.location.href = Config.urls.app.s4lWeb({});\r\n });\r\n }\r\n};\r\n","export interface SkypeTokenContentHeader {\r\n alg: string;\r\n kid: string;\r\n typ: string;\r\n}\r\n\r\nexport interface SkypeTokenContentPayload {\r\n aat: number;\r\n cid: string;\r\n csi: string;\r\n exp: number;\r\n iat: number;\r\n scp: number;\r\n skypeid: string;\r\n}\r\n\r\nexport interface SkypeTokenContent {\r\n header: SkypeTokenContentHeader;\r\n payload: SkypeTokenContentPayload;\r\n signature: string;\r\n}\r\n\r\nexport function parseSkypeToken(token: string | undefined): SkypeTokenContent | undefined {\r\n if (!token) {\r\n return;\r\n }\r\n\r\n const parts = token.split('.');\r\n if (parts.length !== 3) {\r\n return;\r\n }\r\n\r\n try {\r\n const header: SkypeTokenContentHeader = JSON.parse(atob(parts[0]));\r\n const payload: SkypeTokenContentPayload = JSON.parse(atob(parts[1]));\r\n const signature = parts[2];\r\n\r\n if (!payload.skypeid) {\r\n return;\r\n }\r\n\r\n return { header, payload, signature };\r\n } catch (e) {\r\n return;\r\n }\r\n}\r\n\r\nexport function getSkypeIdFromSkypeToken(token: string | undefined): string | undefined {\r\n const tokenContent = parseSkypeToken(token);\r\n if (tokenContent) {\r\n return tokenContent.payload.skypeid;\r\n }\r\n\r\n return;\r\n}\r\n\r\nexport function getMsaCidHexFromSkypeToken(token: string | undefined): string | undefined {\r\n const tokenContent = parseSkypeToken(token);\r\n if (tokenContent && tokenContent.payload && tokenContent.payload.cid) {\r\n return tokenContent.payload.cid.toUpperCase();\r\n }\r\n\r\n return;\r\n}\r\n","import { AWTEventPriority } from '@aria/webjs-sdk';\r\nimport { ApiCallOptions as BaseApiCallOptions, GenericRestClient, WebResponse } from 'simplerestclients';\r\nimport * as SyncTasks from 'synctasks';\r\nimport { logger } from '../helpers/LoggerHelper';\r\n\r\nexport interface EventProperties {\r\n priority?: AWTEventPriority;\r\n genericEventPath?: string; // Override default path for telemtry if it contains sensitive information\r\n customPropertiesProvider?: ((response: WebResponse) => any); // Append any custom field from response to the event\r\n}\r\n\r\nexport interface ApiCallOptions extends BaseApiCallOptions {\r\n eventProperties?: EventProperties;\r\n}\r\n\r\nconst unwrap: (resp: WebResponse) => T = (resp) => resp.body;\r\nexport class BaseRestClient extends GenericRestClient {\r\n protected _defaultOptions: ApiCallOptions = {\r\n contentType: 'application/json',\r\n acceptType: 'application/json',\r\n };\r\n\r\n performApiGet(apiPath: string, options?: ApiCallOptions): SyncTasks.Promise {\r\n return this.performApiGetDetailed(apiPath, options).then(unwrap);\r\n }\r\n\r\n performApiGetDetailed(apiPath: string, options?: ApiCallOptions): SyncTasks.Promise> {\r\n const startTime = new Date().getTime();\r\n const promise = super.performApiGetDetailed(apiPath, options);\r\n promise.then(this.networkCallback(startTime, options), this.networkCallback(startTime, options));\r\n return promise;\r\n }\r\n\r\n performApiPost(apiPath: string, objToPost: any, options?: ApiCallOptions): SyncTasks.Promise {\r\n return this.performApiPostDetailed(apiPath, objToPost, options).then(unwrap);\r\n }\r\n\r\n performApiPostDetailed(apiPath: string, objToPost: any, options?: ApiCallOptions): SyncTasks.Promise> {\r\n const startTime = new Date().getTime();\r\n const promise = super.performApiPostDetailed(apiPath, objToPost, options);\r\n promise.then(this.networkCallback(startTime, options), this.networkCallback(startTime, options));\r\n return promise;\r\n }\r\n\r\n performApiPatch(apiPath: string, objToPatch: any, options?: ApiCallOptions): SyncTasks.Promise {\r\n return this.performApiPatchDetailed(apiPath, objToPatch, options).then(unwrap);\r\n }\r\n\r\n performApiPatchDetailed(apiPath: string, objToPatch: any, options?: ApiCallOptions): SyncTasks.Promise> {\r\n const startTime = new Date().getTime();\r\n const promise = super.performApiPatchDetailed(apiPath, objToPatch, options);\r\n promise.then(this.networkCallback(startTime, options), this.networkCallback(startTime, options));\r\n return promise;\r\n }\r\n\r\n performApiPut(apiPath: string, objToPut: any, options?: ApiCallOptions): SyncTasks.Promise {\r\n return this.performApiPutDetailed(apiPath, objToPut, options).then(unwrap);\r\n }\r\n\r\n performApiPutDetailed(apiPath: string, objToPut: any, options?: ApiCallOptions): SyncTasks.Promise> {\r\n const startTime = new Date().getTime();\r\n const promise = super.performApiPutDetailed(apiPath, objToPut, options);\r\n promise.then(this.networkCallback(startTime, options), this.networkCallback(startTime, options));\r\n return promise;\r\n }\r\n\r\n performApiDelete(apiPath: string, objToDelete?: any, options?: ApiCallOptions): SyncTasks.Promise {\r\n return this.performApiDeleteDetailed(apiPath, objToDelete, options).then(unwrap);\r\n }\r\n\r\n performApiDeleteDetailed(apiPath: string, objToDelete: any, options?: ApiCallOptions): SyncTasks.Promise> {\r\n const startTime = new Date().getTime();\r\n const promise = super.performApiDeleteDetailed(apiPath, objToDelete, options);\r\n promise.then(this.networkCallback(startTime, options), this.networkCallback(startTime, options));\r\n return promise;\r\n }\r\n\r\n protected networkCallback = (startTime: number, options?: ApiCallOptions): ((response: WebResponse) => void) => {\r\n const eventProperties = options && options.eventProperties;\r\n const genericEventPath = eventProperties && eventProperties.genericEventPath;\r\n const customPropertiesProvider = eventProperties && eventProperties.customPropertiesProvider;\r\n const eventPriority = eventProperties && eventProperties.priority;\r\n return (response: WebResponse) => {\r\n const endTime = new Date().getTime();\r\n const responseUrl = genericEventPath ? this._endpointUrl + genericEventPath : response.url;\r\n const eventUrl = responseUrl ? responseUrl.split('?', 1).join('') : responseUrl;\r\n const path = eventUrl ? eventUrl.replace(this._endpointUrl, '') : eventUrl;\r\n logger.network({\r\n method: response.method,\r\n responseTime: endTime - startTime,\r\n statusCode: response.statusCode,\r\n statusText: response.statusText,\r\n url: eventUrl,\r\n host: this._endpointUrl,\r\n path,\r\n custom: customPropertiesProvider ? customPropertiesProvider(response) : undefined,\r\n }, eventPriority);\r\n };\r\n }\r\n}\r\n","exports = module.exports = require(\"../../../node_modules/css-loader/lib/css-base.js\")(false);\n// imports\n\n\n// module\nexports.push([module.id, \"body[data-platform=macIos],body[data-platform=macIos] button,body[data-platform=macIos] input,body[data-platform=macIos] select,body[data-platform=macIos] textarea{font-family:-apple-system,BlinkMacSystemFont,Tahoma,Helvetica Neue,Helvetica,Meiryo UI,Meiryo,Arial Unicode MS,sans-serif!important}body[data-platform=android],body[data-platform=android] button,body[data-platform=android] input,body[data-platform=android] select,body[data-platform=android] textarea{font-family:Roboto,Tahoma,Helvetica Neue,Helvetica,Meiryo UI,Meiryo,Arial Unicode MS,sans-serif!important}html[lang=bg] body,html[lang=bg] button,html[lang=bg] input,html[lang=bg] select,html[lang=bg] textarea,html[lang=ru] body,html[lang=ru] button,html[lang=ru] input,html[lang=ru] select,html[lang=ru] textarea,html[lang=uk] body,html[lang=uk] button,html[lang=uk] input,html[lang=uk] select,html[lang=uk] textarea{font-family:Segoe UI,Segoe WP,Segoe UI Cyrillic Web,Tahoma,Helvetica Neue,Helvetica,Meiryo UI,Meiryo,Arial Unicode MS,sans-serif}html[lang=el] body,html[lang=el] button,html[lang=el] input,html[lang=el] select,html[lang=el] textarea{font-family:Segoe UI,Segoe WP,Segoe UI Greek Web,Tahoma,Helvetica Neue,Helvetica,Meiryo UI,Meiryo,Arial Unicode MS,sans-serif}html[lang=he] body,html[lang=he] button,html[lang=he] input,html[lang=he] select textarea{font-family:Segoe UI,Segoe WP,Segoe UI Hebrew Web,Tahoma,Helvetica Neue,Helvetica,Meiryo UI,Meiryo,Arial Unicode MS,sans-serif}html[lang=hi] body,html[lang=hi] button,html[lang=hi] input,html[lang=hi] select,html[lang=hi] textarea{font-family:Local Hindi,Segoe UI,Segoe WP,Tahoma,Helvetica Neue,Helvetica,Meiryo UI,Meiryo,Arial Unicode MS,sans-serif}html[lang=ja] body,html[lang=ja] button,html[lang=ja] input,html[lang=ja] select,html[lang=ja] textarea{font-family:Meiryo,Segoe UI,Segoe WP,Tahoma,Verdana,Arial,sans-serif}html[lang=ko] body,html[lang=ko] button,html[lang=ko] input,html[lang=ko] select,html[lang=ko] textarea{font-family:Malgun Gothic,Gulim,Segoe UI,Segoe WP,Tahoma,Verdana,Arial,sans-serif}html[lang=zh-Hant] body,html[lang=zh-Hant] button,html[lang=zh-Hant] input,html[lang=zh-Hant] select,html[lang=zh-Hant] textarea{font-family:微軟正黑體Microsoft JhengHei,微軟正黑體 Microsoft JhengHei,Microsoft JhengHei,微軟正黑體,Segoe UI,Segoe WP,Tahoma,Verdana,Arial,sans-serif}html[lang=zh_CN] body,html[lang=zh_CN] button,html[lang=zh_CN] input,html[lang=zh_CN] select,html[lang=zh_CN] textarea{font-family:Microsoft yahei,微软雅黑,Segoe UI,Segoe WP,Tahoma,Verdana,Arial,sans-serif}b,strong{font-weight:600}.fontSizeH1{font-size:4em;margin-bottom:.48387em}.fontSizeH1,.fontSizeH2{font-weight:100;letter-spacing:normal;line-height:1.16129em}.fontSizeH2{font-size:60px;margin:0;font-size:2.5em}@media only screen and (max-width:600px){.fontSizeH2{font-size:40px}}.fontSizeH3{font-size:1.7em;font-weight:300;letter-spacing:.013em;line-height:1.4em;margin-bottom:.48387em;margin-top:0}@media only screen and (max-width:600px){.fontSizeH3{margin:0 auto;font-size:1.2em}}.fontSizeH4{font-size:1em;font-weight:400;letter-spacing:normal;line-height:1.33333em;margin-bottom:.83333em}.button{background-color:#008cc0;border:1px solid transparent;border-radius:50px;box-sizing:border-box;color:#fff;cursor:pointer;display:inline-block;font-size:18px;line-height:24px;margin:0;max-width:440px;min-width:150px;padding:5px 0 8px;text-align:center;text-decoration:none;vertical-align:middle;width:100%;word-wrap:break-word}@media only screen and (min-width:767px){.button{font-size:20px;padding:7px 0 10px;width:auto}}.button:focus{outline:1px dotted #333534}.button:focus,.button:hover{text-decoration:none;background-color:#0c7daf}.button--disabled{background-color:#a3d0ed!important;cursor:not-allowed}.buttonBlue,.buttonSimple,.buttonWhite,.newButton,.portalContent .closeButton{box-sizing:border-box;border:1px solid transparent;border-radius:100px;cursor:pointer;display:inline-block;font-size:18px;font-weight:400;margin:0 7px 10px;position:relative;text-align:center;text-decoration:none;word-wrap:break-word;padding:19px 30px;min-width:260px;-webkit-transition:background-color .1s ease-in-out;transition:background-color .1s ease-in-out}.newButton .button__text{padding:0}@media only screen and (max-width:600px){.buttonBlue,.buttonSimple,.buttonWhite,.newButton,.portalContent .closeButton{padding:9px 30px;min-width:190px;font-size:14px}}.buttonBlue{color:#fff;background-color:#0078ca}.buttonBlue:active,.buttonBlue:hover{background-color:#0b64a4}.buttonWhite{color:#2b2c33;border:1px solid #2b2c33}.buttonWhite:active,.buttonWhite:hover{background-color:#2b2c33;color:#fff}.buttonSimple,.portalContent .closeButton{color:#0078ca;border:none}.buttonSimple:active,.buttonSimple:hover{color:#0b64a4}.portalContainer{position:absolute;top:0;bottom:0;right:0;left:0;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;z-index:1000;background-color:rgba(0,0,0,.5)}.portalContainer,.portalContent{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.portalContent{background-color:#fff;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding:15px;box-shadow:0 5px 10px rgba(0,0,0,.3);border:1px solid rgba(0,0,0,.3);border-radius:5px;max-width:450px}.portalContent .logo{width:96px;width:6rem;height:96px;height:6rem;-ms-flex-negative:0;flex-shrink:0}.portalContent .title{font-weight:400;text-align:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;max-width:100%;margin:1rem 0}.portalContent .closeButton{margin-top:20px;color:#000;background-color:#e5e4e8}.portalContent .closeButton:active,.portalContent .closeButton:hover{background-color:#cecdd0}body,html{height:100%}#meetnowContainer{width:100vw;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;overflow:scroll;background-color:#f1f1f4;color:#2b2c33}\", \"\"]);\n\n// exports\n","import { CookieConfig } from 'config';\r\nimport { Dictionary } from '../models/SharedTypes';\r\n\r\nconst defaultValueSeparator = ':';\r\n\r\nexport class CookieHelper {\r\n\r\n /**\r\n * Get the cookie\r\n *\r\n * param {string} name\r\n *\r\n * @return {object}\r\n */\r\n static getCookie(config: CookieConfig) {\r\n return (CookieHelper.hasCookie(config) === true) ? CookieHelper.parse()[config.name] : {};\r\n }\r\n\r\n /**\r\n * Set the cookie\r\n *\r\n * @param {string}\r\n *\r\n * @return void\r\n */\r\n static setCookie(config: CookieConfig, cookieValuesObject: object ) {\r\n const now = Math.round(Date.now() / 1000); // seconds\r\n let value = cookieValuesObject as any;\r\n\r\n // We have to add TS if cookie does not exist\r\n if (CookieHelper.hasCookie(config) === false) {\r\n value.TS = now;\r\n }\r\n\r\n // we need to add modification timestamp\r\n value.TM = now;\r\n\r\n value = CookieHelper.cookieObjectToString(value);\r\n\r\n const options = [];\r\n if (config.domain) {\r\n options.push('domain=' + config.domain);\r\n }\r\n if (config.path) {\r\n options.push('path=' + config.path);\r\n }\r\n if (config.maxAge) {\r\n options.push('expires=' + CookieHelper.getExpirationDate(config.maxAge).toUTCString());\r\n }\r\n\r\n const optionsString = options.length ? ';' + options.join(';') : '';\r\n\r\n document.cookie = config.name + '=' + value + optionsString;\r\n }\r\n\r\n /**\r\n * If cookie is present\r\n *\r\n * @return boolean\r\n */\r\n static hasCookie(config: CookieConfig) {\r\n return CookieHelper.parse().hasOwnProperty(config.name);\r\n }\r\n\r\n /**\r\n * Get cookie value\r\n *\r\n * @param {string} key\r\n *\r\n * @return {string} key value\r\n */\r\n static getCookieValue(config: CookieConfig, key: string = 'singleValue') {\r\n const params = CookieHelper.getCookie(config);\r\n\r\n return params && params[key] ? params[key] : undefined;\r\n }\r\n\r\n /**\r\n * Set cookie value\r\n *\r\n * @param {string} key\r\n * @param {string} value\r\n *\r\n */\r\n static setCookieValue(config: CookieConfig, value: string, key = 'singleValue') {\r\n const params = CookieHelper.getCookie(config);\r\n params[config.key || key] = value;\r\n\r\n CookieHelper.setCookie(config, params);\r\n }\r\n\r\n /**\r\n *\r\n */\r\n static removeCookie(config: CookieConfig) {\r\n if (!CookieHelper.hasCookie(config)) {\r\n return;\r\n }\r\n\r\n CookieHelper.setCookie({ name: config.name }, {});\r\n }\r\n\r\n /**\r\n * Parse document.cookie to JSON\r\n *\r\n * @example {'SC': 'LC=en:CCY=EUR', 'SWA':'webapp'}\r\n *\r\n *\r\n * @return {object}\r\n */\r\n static parse() {\r\n if (!document.cookie) {\r\n return {};\r\n }\r\n\r\n const cookies: any = {};\r\n document.cookie.split(';').forEach((cookie) => {\r\n const separatorPos = cookie.indexOf('=');\r\n\r\n const key = cookie.substring(0, separatorPos).trim();\r\n const value = cookie.substring(separatorPos + 1).trim();\r\n cookies[key] = CookieHelper.parseCookieValues(value);\r\n });\r\n\r\n return cookies;\r\n }\r\n /**\r\n * Turns object to string\r\n *\r\n * @param {object} cookieObject\r\n * @param {string} cookieSeparator\r\n *\r\n * @return {string}\r\n */\r\n private static cookieObjectToString(cookieObject: object, cookieSeparator = defaultValueSeparator) {\r\n const cookieObjectKeys = Object.keys(cookieObject);\r\n const cookieValue: string[] = [];\r\n\r\n if (cookieObject.hasOwnProperty('singleValue')) {\r\n return (cookieObject as any).singleValue;\r\n }\r\n\r\n cookieObjectKeys.forEach((cookieObjectKey) => {\r\n cookieValue.push(cookieObjectKey + '=' + (cookieObject as any)[cookieObjectKey]);\r\n });\r\n\r\n return cookieValue.join(cookieSeparator);\r\n }\r\n\r\n /**\r\n * Parse cookie values into JSON\r\n *\r\n * @example {'LC':'en','CCY':'EUR'}\r\n *\r\n * @param {string} cookieSeparator\r\n *\r\n * @return {object}\r\n */\r\n private static parseCookieValues(cookieValue: string, cookieSeparator = defaultValueSeparator) {\r\n const params: Dictionary = {};\r\n\r\n cookieValue.split(cookieSeparator).forEach((splitCookieValue) => {\r\n let splitParams: string[];\r\n if (splitCookieValue.indexOf('=') !== -1) {\r\n splitParams = splitCookieValue.split('=');\r\n } else {\r\n splitParams = ['singleValue', splitCookieValue];\r\n }\r\n\r\n params[splitParams[0].trim()] = splitParams[1].trim();\r\n });\r\n return params;\r\n }\r\n\r\n /**\r\n * Get the date object for expiration\r\n *\r\n * @param {int} seconds Number of seconds to add\r\n *\r\n * @return {Date}\r\n */\r\n private static getExpirationDate(seconds: number) {\r\n return new Date((seconds * 1000) + Date.now());\r\n }\r\n}\r\n","import { localizer } from '@skype/bew-localization';\r\nimport React, { SyntheticEvent } from 'react';\r\nimport { logger } from '../helpers/LoggerHelper';\r\nimport { buildRedirectQueryParameters } from '../meetnow/MeetNowEdgeHandler';\r\nimport './JoinWidget.less';\r\n\r\nexport interface JoinWidgetProps {\r\n basePath: string;\r\n isJoinLinkValid: boolean;\r\n isRequestInProgress: boolean;\r\n allowedQueryParams: string[];\r\n onChangeHandler: (event: React.FormEvent) => void;\r\n onSubmitHandler: (joinButtonRef: React.RefObject) => (event: SyntheticEvent) => void;\r\n}\r\n\r\nexport class JoinWidget extends React.Component {\r\n private textBox = React.createRef();\r\n private joinButton = React.createRef();\r\n\r\n componentDidMount() {\r\n if (this.textBox && this.textBox.current) {\r\n this.textBox.current.focus();\r\n }\r\n }\r\n\r\n render() {\r\n return (
\r\n
\r\n \r\n

{ localizer.getString('Meetings.hdr_join_page_title') }

\r\n
\r\n
\r\n \r\n \r\n
{ !this.props.isJoinLinkValid && localizer.getString('Meetings.txt_invalid_link_or_code') }
\r\n
\r\n
\r\n \r\n { localizer.getString('Common.btn_join') }\r\n \r\n
\r\n
\r\n { localizer.get('Meetings.txt_dont_have_meeting_link', {\r\n linkCreate: {\r\n type: 'a',\r\n href: this.createMeetingUrl,\r\n className: 'createMeetingLink',\r\n onClick: (event: MouseEvent) => {\r\n // The library always generates target=\"_blank\" attribute so this is an override\r\n event.preventDefault();\r\n logger.action({ name: 'createMeetingLinkClicked' });\r\n\r\n window.location.replace(this.createMeetingUrl);\r\n },\r\n },\r\n }) }\r\n
\r\n \r\n { localizer.get('txt_launch_guest_accept_tos', {\r\n linkPrivacy: { type: 'a', href: 'https://go.microsoft.com/fwlink/?LinkId=521839' },\r\n linkTerms: { type: 'a', href: 'https://go.microsoft.com/fwlink/?LinkID=246338' },\r\n }) }\r\n \r\n
);\r\n }\r\n\r\n private handleKeyPress = (event: React.KeyboardEvent) => {\r\n if (event.key === 'Enter') {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.joinButton.current?.click();\r\n }\r\n }\r\n\r\n private get createMeetingUrl() {\r\n return `/meetnow?${buildRedirectQueryParameters(this.props.allowedQueryParams, logger.getCorrelationId())}`;\r\n }\r\n}\r\n","import config from 'config';\r\nimport * as SyncTasks from 'synctasks';\r\nimport { CaptchaSolution } from '../components/common/Captcha';\r\nimport { logger } from '../helpers/LoggerHelper';\r\nimport { ConversationPayload, ConversationServiceModel, RawConversationServiceModel } from '../models/ConversationServiceModel';\r\nimport {\r\n CreateAuthenticatedMeetingPayloadMeetingsApi,\r\n CreateMeetingPayloadMeetingsApi,\r\n CreateMeetingServiceModel,\r\n GuestJoinPayloadMeetingsApi,\r\n GuestUserServiceModel,\r\n MeetnowGuestServiceModel,\r\n} from '../models/GuestUserServiceModel';\r\nimport { BaseRestClient } from './BaseRestClient';\r\nimport { customErrorHandler, transformWrapper } from './MeetingsApiClientUtils';\r\n\r\nconst SessionIdHeaderKey = 'x-sessionId';\r\nconst SupportsCaptchaHeader = 'X-Skype-SupportsCaptcha';\r\nconst CaptchaSolutionHeader = 'X-Skype-CaptchaSolution';\r\nconst CaptchaChallengeIdHeader = 'X-Skype-CaptchaChallengeId';\r\nconst CaptchaAzureRegionHeader = 'X-Skype-CaptchaAzureRegion';\r\n\r\nclass MeetingsApiClient extends BaseRestClient {\r\n joinAsGuest(\r\n payload: T,\r\n retries: number = 0,\r\n joinThread: boolean = false,\r\n captcha?: CaptchaSolution | undefined,\r\n customPropertiesProvider?: () => object): SyncTasks.Promise {\r\n const genericEventPath = joinThread ?\r\n `/v1/threads/{threadId}/members` : `/v1/meetings/{shortId}/members`;\r\n const apiPath = joinThread ?\r\n `/v1/threads/${payload.threadId}/members` : `/v1/meetings/${payload.shortId}/members`;\r\n const headers: { [key: string]: string } = {};\r\n headers[SessionIdHeaderKey] = logger.getCorrelationId();\r\n if (captcha?.solution) {\r\n headers[SupportsCaptchaHeader] = 'yes';\r\n headers[CaptchaSolutionHeader] = captcha.solution;\r\n headers[CaptchaChallengeIdHeader] = captcha.challengeId;\r\n headers[CaptchaAzureRegionHeader] = captcha.azureRegion;\r\n }\r\n\r\n return this.performApiPost(\r\n apiPath,\r\n {\r\n displayName: payload.displayName,\r\n },\r\n {\r\n customErrorHandler,\r\n eventProperties: {\r\n genericEventPath,\r\n customPropertiesProvider,\r\n },\r\n retries,\r\n headers,\r\n });\r\n }\r\n\r\n getConversation(payload: ConversationPayload, retries: number = 0): SyncTasks.Promise {\r\n const shortId = payload.shortId;\r\n const headers: { [key: string]: string } = {};\r\n headers[SessionIdHeaderKey] = logger.getCorrelationId();\r\n\r\n return this.performApiGet(\r\n `/v1/meetings/${ shortId }`,\r\n {\r\n customErrorHandler,\r\n eventProperties: {\r\n genericEventPath: '/v1/meetings/{shortId}',\r\n },\r\n retries,\r\n headers,\r\n },\r\n ).then(transformWrapper(shortId));\r\n }\r\n\r\n createGuestMeeting(payload: CreateMeetingPayloadMeetingsApi, retries: number = 0): SyncTasks.Promise {\r\n return this.createMeeting('/v1/meetnow/createjoinlinkguest', payload, retries);\r\n }\r\n\r\n createAuthenticatedMeeting(payload: CreateAuthenticatedMeetingPayloadMeetingsApi, retries: number = 0): SyncTasks.Promise {\r\n return this.createMeeting('/v1/meetnow/createjoinlink', payload, retries);\r\n }\r\n\r\n meetnowGuest(payload: CreateMeetingPayloadMeetingsApi, retries: number = 0): SyncTasks.Promise {\r\n return this.createMeeting('/v1/meetnow/guest', payload, retries);\r\n }\r\n\r\n private createMeeting(path: string, payload: CreateMeetingPayloadMeetingsApi, retries: number): SyncTasks.Promise {\r\n const headers: { [key: string]: string } = {};\r\n headers[SessionIdHeaderKey] = logger.getCorrelationId();\r\n\r\n return this.performApiPost(\r\n path,\r\n payload,\r\n {\r\n customErrorHandler,\r\n eventProperties: {\r\n genericEventPath: path,\r\n },\r\n retries,\r\n headers,\r\n },\r\n );\r\n }\r\n}\r\n\r\nexport default new MeetingsApiClient(config.urls.api.meetings);\r\n","export interface IMeetNowSettings {\r\n MeetNowEdgeJoinApiHost: string;\r\n MeetNowEdgeNumberOfFetchRetries: number;\r\n MeetNowEdgeAriaTenantId: string;\r\n MeetNowEdgeAllowedQueryParameters: string[];\r\n DefaultMeetingTitle: string;\r\n}\r\n\r\nconst rootElementId = 'meetnowContainer';\r\nconst settingsDataAttributeName = 'meetnowEdgeSettings';\r\nconst allowedQueryParameters = ['source', 'exp', 'correlationId', 'call', 'video', 'mic'];\r\nconst defaultMeetingTitle = 'Meet Now';\r\n\r\nlet settings: MeetNowSettings;\r\n\r\nconst init = () => {\r\n const rootElement = document.getElementById(rootElementId);\r\n if (rootElement) {\r\n const data = rootElement.dataset[settingsDataAttributeName] || '';\r\n const parsedSettings = JSON.parse(data) as IMeetNowSettings;\r\n settings = new MeetNowSettings(parsedSettings);\r\n } else {\r\n throw new Error('Config not found.');\r\n }\r\n};\r\n\r\nclass MeetNowSettings implements IMeetNowSettings {\r\n private readonly settings: IMeetNowSettings;\r\n\r\n constructor(currentSettings: IMeetNowSettings) {\r\n this.settings = currentSettings;\r\n }\r\n\r\n get MeetNowEdgeAriaTenantId() {\r\n return this.settings.MeetNowEdgeAriaTenantId;\r\n }\r\n get MeetNowEdgeJoinApiHost() {\r\n return this.settings.MeetNowEdgeJoinApiHost;\r\n }\r\n get MeetNowEdgeNumberOfFetchRetries() {\r\n return this.settings.MeetNowEdgeNumberOfFetchRetries;\r\n }\r\n get MeetNowEdgeAllowedQueryParameters() {\r\n return allowedQueryParameters;\r\n }\r\n get DefaultMeetingTitle() {\r\n return defaultMeetingTitle;\r\n }\r\n}\r\n\r\nconst getMeetNowSettings = (): MeetNowSettings => {\r\n if (settings) {\r\n return settings;\r\n }\r\n\r\n init();\r\n return settings;\r\n};\r\n\r\nexport default getMeetNowSettings;\r\n","import React, { SyntheticEvent } from 'react';\r\nimport { ErrorModal } from '../components/common/ErrorModal';\r\nimport { canJoinOnWeb } from '../helpers/EnvironmentHelper';\r\nimport { CommonProperty, logger } from '../helpers/LoggerHelper';\r\nimport { silentLoginAsync, SilentLoginResult } from '../helpers/SilentLoginHelper';\r\nimport { IMeetNowSettings } from '../meetnow/MeetNowSettings';\r\nimport { handleJoin, validateJoinLinkOrCode } from './JoinHandler';\r\nimport { JoinWidget } from './JoinWidget';\r\nimport './MeetNowJoin.less';\r\n\r\nexport interface MeetNowJoinProps {\r\n readonly language: string;\r\n readonly basePath: string;\r\n readonly settings: IMeetNowSettings;\r\n}\r\n\r\nexport interface MeetNowJoinState {\r\n isLoginInProgress: boolean;\r\n joinButtonClicked: boolean;\r\n handleJoinError?: Error;\r\n joinLink: string;\r\n isJoinLinkValid: boolean;\r\n skypeToken?: string;\r\n}\r\n\r\nexport class MeetNowJoin extends React.Component {\r\n constructor(props: MeetNowJoinProps) {\r\n super(props);\r\n this.state = {\r\n isLoginInProgress: true,\r\n joinButtonClicked: false,\r\n handleJoinError: undefined,\r\n joinLink: '',\r\n isJoinLinkValid: true,\r\n skypeToken: undefined,\r\n };\r\n }\r\n\r\n componentDidMount() {\r\n this.setState({ isLoginInProgress: true });\r\n silentLoginAsync()\r\n .then((loginResult: SilentLoginResult | undefined) => {\r\n const newState: MeetNowJoinState = { ...this.state, isLoginInProgress: false };\r\n if (!loginResult || !loginResult.skypetoken) {\r\n logger.initCommonProperty({ key: CommonProperty.IsLoggedIn, value: false });\r\n logger.initCommonProperty({\r\n key: CommonProperty.IsUnsupportedPlatformOrBrowser,\r\n value: canJoinOnWeb,\r\n });\r\n logger.sessionIntermediateStep({ eventType: 'silentLoginFinished' });\r\n } else {\r\n logger.initCommonProperty({ key: CommonProperty.IsLoggedIn, value: true });\r\n logger.initCommonProperty({\r\n key: CommonProperty.IsUnsupportedPlatformOrBrowser,\r\n value: canJoinOnWeb,\r\n });\r\n logger.sessionIntermediateStep({ eventType: 'silentLoginFinished' });\r\n logger.addSkypeIdAndMsaCidHexCommonProperties(loginResult.skypetoken, false);\r\n newState.skypeToken = loginResult.skypetoken;\r\n }\r\n this.setState(newState);\r\n })\r\n .catch((error) => {\r\n if (error.error === 'invalid_grant') { // User is not authenticated with MSA\r\n logger.initCommonProperty({ key: CommonProperty.IsLoggedIn, value: false });\r\n logger.initCommonProperty({\r\n key: CommonProperty.IsUnsupportedPlatformOrBrowser,\r\n value: canJoinOnWeb,\r\n });\r\n logger.sessionIntermediateStep({ eventType: 'silentLoginFinished' });\r\n }\r\n this.setState({ isLoginInProgress: false });\r\n });\r\n }\r\n\r\n render() {\r\n return (
\r\n
\r\n \r\n
\r\n {\r\n this.state.handleJoinError &&\r\n {\r\n this.setState({\r\n joinButtonClicked: false,\r\n isJoinLinkValid: false,\r\n handleJoinError: undefined,\r\n });\r\n }\r\n } />\r\n }\r\n
);\r\n }\r\n\r\n private joinLinkChangeHandler(event: React.FormEvent) {\r\n this.setState({ joinLink: event.currentTarget.value, isJoinLinkValid: true });\r\n }\r\n\r\n private joinMeetingHandler(joinButtonRef: React.RefObject) {\r\n return (event: SyntheticEvent) => {\r\n event.preventDefault();\r\n\r\n if (this.state.joinButtonClicked) {\r\n return;\r\n }\r\n\r\n logger.action({ name: 'joinButtonClicked' });\r\n this.setState({ joinButtonClicked: true });\r\n validateJoinLinkOrCode(this.props.settings, this.state.joinLink)\r\n .then((result) => {\r\n if (!result) {\r\n this.setState({ joinButtonClicked: false, isJoinLinkValid: false }, this.handleButtonFocusAfterValidation(joinButtonRef));\r\n } else {\r\n this.setState({ isJoinLinkValid: true });\r\n handleJoin(this.props.settings, result, this.state.skypeToken).catch((err) => {\r\n logger.error(err);\r\n this.setState({\r\n joinButtonClicked: false,\r\n handleJoinError: err,\r\n }, this.handleButtonFocusAfterValidation(joinButtonRef));\r\n });\r\n }\r\n })\r\n .catch(() => this.setState({ joinButtonClicked: false, isJoinLinkValid: false }, this.handleButtonFocusAfterValidation(joinButtonRef)));\r\n };\r\n }\r\n\r\n private handleButtonFocusAfterValidation(joinButtonRef: React.RefObject): () => void {\r\n return () => {\r\n if (joinButtonRef && joinButtonRef.current) {\r\n joinButtonRef.current.focus();\r\n }\r\n };\r\n }\r\n}\r\n","import { WebErrorResponse } from 'simplerestclients';\r\n\r\nexport interface DisplayableError extends Error {\r\n headerLocString: string;\r\n descriptionLocString: string;\r\n pageTitleLocString: string;\r\n emoticonPath?: string;\r\n}\r\n\r\nexport const displayableErrors = {\r\n ShortIdFromUrl: {\r\n name: 'ShortIdFromUrl',\r\n message: 'Cannot retrieve the shortId from url.',\r\n headerLocString: 'hdr_not_found_page_oops',\r\n descriptionLocString: 'txt_not_found_page_redirect',\r\n pageTitleLocString: 'hdr_not_found_page_title',\r\n emoticonPath: '/images/emoticons/error.png',\r\n } as DisplayableError,\r\n InviteIdFromUrl: {\r\n name: 'InviteIdFromUrl',\r\n message: 'Cannot retrieve the inviteId from url.',\r\n headerLocString: 'hdr_not_found_page_oops',\r\n descriptionLocString: 'txt_not_found_page_redirect',\r\n pageTitleLocString: 'hdr_not_found_page_title',\r\n emoticonPath: '/images/emoticons/error.png',\r\n } as DisplayableError,\r\n TooManyUsers: {\r\n name: 'TooManyUsers',\r\n message: 'TooManyUsers',\r\n headerLocString: 'hdr_toomanyusers_page_oops',\r\n descriptionLocString: 'txt_toomanyusers_page_explanation',\r\n emoticonPath: '/images/emoticons/busy.png',\r\n pageTitleLocString: 'hdr_toomanyusers_page_title',\r\n } as DisplayableError,\r\n Busy: {\r\n name: 'Busy',\r\n message: 'Busy',\r\n headerLocString: 'hdr_busy_page_oops',\r\n descriptionLocString: 'txt_busy_page_explanation',\r\n pageTitleLocString: 'hdr_busy_page_title',\r\n emoticonPath: '/images/emoticons/busy.png',\r\n } as DisplayableError,\r\n InviteNotFound: {\r\n name: 'InviteNotFound',\r\n message: 'InviteNotFound',\r\n headerLocString: 'hdr_not_found_page_oops',\r\n descriptionLocString: 'txt_not_found_offskypeinvite_page_redirect',\r\n pageTitleLocString: 'hdr_not_found_page_title',\r\n emoticonPath: '/images/emoticons/busy.png',\r\n } as DisplayableError,\r\n JoinDisabled: {\r\n name: 'JoinDisabled',\r\n message: 'JoinDisabled',\r\n headerLocString: 'hdr_joindisabled_page_oops',\r\n descriptionLocString: 'txt_joindisabled_page_explanation',\r\n pageTitleLocString: 'hdr_joindisabled_page_title',\r\n emoticonPath: '/images/emoticons/busy.png',\r\n } as DisplayableError,\r\n Generic: {\r\n name: 'Generic',\r\n message: 'Generic error',\r\n headerLocString: 'hdr_error_page_oops',\r\n descriptionLocString: 'txt_error_page_explanation',\r\n pageTitleLocString: 'hdr_error_page_title',\r\n emoticonPath: '/images/emoticons/error.png',\r\n } as DisplayableError,\r\n BotNotFound: {\r\n name: 'BotIdFromUrl',\r\n message: 'Cannot retrieve the bot id from url.',\r\n headerLocString: 'hdr_not_found_page_oops',\r\n descriptionLocString: 'bot_not_found',\r\n pageTitleLocString: 'hdr_not_found_page_title',\r\n emoticonPath: '/images/emoticons/error.png',\r\n } as DisplayableError,\r\n BotTooManyContacts: {\r\n name: 'BotTooManyContacts',\r\n message: 'BotTooManyContacts',\r\n headerLocString: 'bot_problem_page_oops',\r\n descriptionLocString: 'bot_too_many_contacts_page_redirect',\r\n pageTitleLocString: 'bot_too_many_contacts_page_title',\r\n emoticonPath: '/images/emoticons/error.png',\r\n } as DisplayableError,\r\n ChannelNotFound: {\r\n name: 'ChannelIdFromUrl',\r\n message: 'Cannot retrieve the channel short id from url.',\r\n headerLocString: 'hdr_not_found_page_oops',\r\n descriptionLocString: 'channels.channel_not_found',\r\n pageTitleLocString: 'hdr_not_found_page_title',\r\n emoticonPath: '/images/emoticons/error.png',\r\n } as DisplayableError,\r\n};\r\n\r\nexport class ErrorHelper {\r\n\r\n static convertToGenericDisplayableError(error: Error): DisplayableError {\r\n return {\r\n ...error,\r\n headerLocString: 'hdr_error_page_oops',\r\n descriptionLocString: 'txt_error_page_explanation',\r\n pageTitleLocString: 'hdr_error_page_title',\r\n emoticonPath: '/images/emoticons/error.png',\r\n };\r\n }\r\n\r\n static isDisplayableError(arg: any): arg is DisplayableError {\r\n return (arg as DisplayableError).headerLocString !== undefined && (arg as DisplayableError).descriptionLocString !== undefined;\r\n }\r\n\r\n static enrichErrorFromWebResponse(displayableError: DisplayableError, webResponse: WebErrorResponse, description?: string): DisplayableError {\r\n return {\r\n ...displayableError,\r\n ...ErrorHelper.getErrorFromWebErrorResponse(webResponse, description),\r\n };\r\n }\r\n\r\n private static getErrorFromWebErrorResponse(response: WebErrorResponse, description?: string): Error {\r\n return {\r\n name: description || `Request failed`,\r\n message: `${response.method} request failed: ${response.statusCode} ${response.statusText}`,\r\n };\r\n }\r\n}\r\n","import { AWTPiiKind, AWTPropertyType } from '@aria/webjs-sdk';\r\nimport { localizer } from '@skype/bew-localization';\r\nimport curry from 'lodash/curry';\r\nimport { WebErrorResponse } from 'simplerestclients';\r\nimport * as SyncTasks from 'synctasks';\r\nimport config from '../config/BaseConfig';\r\nimport { canJoinOnWeb } from '../helpers/EnvironmentHelper';\r\nimport { DisplayableError, displayableErrors, ErrorHelper } from '../helpers/ErrorHelper';\r\nimport { CommonProperty, logger } from '../helpers/LoggerHelper';\r\nimport { getSkypeIdFromSkypeToken } from '../helpers/SkypeTokenHelper';\r\nimport { buildRedirectQueryParameters, getShortIdFromJoinLink, getThreadId, redirectToSkypeClient } from '../meetnow/MeetNowEdgeHandler';\r\nimport { IMeetNowSettings } from '../meetnow/MeetNowSettings';\r\nimport { ConversationServiceModel } from '../models/ConversationServiceModel';\r\nimport { GuestJoinPayloadMeetingsApi, GuestUserServiceModel, WebClientRedirectParams } from '../models/GuestUserServiceModel';\r\nimport MeetingsApiClient from '../rest/MeetingsApiClient';\r\n\r\nconst joinLinkRegex = /^https:\\/\\/join\\.skype\\.com\\/[a-zA-Z0-9]{7,20}$/;\r\n\r\nexport const handleJoin = (\r\n settings: IMeetNowSettings,\r\n conversationServiceModel: ConversationServiceModel,\r\n skypeToken?: string,\r\n isNewJoinFlowFromJoinLink = false) => {\r\n logger.initCommonProperty({\r\n key: CommonProperty.ThreadId,\r\n value: conversationServiceModel.resource,\r\n piiKind: AWTPiiKind.GenericData,\r\n type: AWTPropertyType.String,\r\n });\r\n\r\n if (conversationServiceModel.shortId) {\r\n logger.initCommonProperty({\r\n key: CommonProperty.ShortId,\r\n value: conversationServiceModel.shortId,\r\n piiKind: AWTPiiKind.GenericData,\r\n type: AWTPropertyType.String,\r\n });\r\n }\r\n\r\n // For unsupported devices we navigate users to regular join flow where they an an opportunity to launch a desktop client or download it\r\n if (!canJoinOnWeb) {\r\n logger.action({ name: 'redirectToJoinPageUnsupportedDevice' });\r\n window.location.href =\r\n `/${ conversationServiceModel.shortId }?${\r\n buildRedirectQueryParameters(\r\n settings.MeetNowEdgeAllowedQueryParameters,\r\n logger.getCorrelationId(),\r\n isNewJoinFlowFromJoinLink)\r\n }`;\r\n return SyncTasks.Resolved();\r\n }\r\n\r\n if (skypeToken) {\r\n const redirectParams: WebClientRedirectParams = {\r\n threadId: conversationServiceModel.resource,\r\n skypetoken: skypeToken,\r\n shortId: conversationServiceModel.shortId,\r\n skypeId: getSkypeIdFromSkypeToken(skypeToken) || '',\r\n };\r\n\r\n redirectToSkypeClient(settings, 'MeetNowJoin', 'joinmeetnow', isNewJoinFlowFromJoinLink, redirectParams);\r\n return SyncTasks.Resolved();\r\n } else {\r\n return addUserToMeeting(settings, conversationServiceModel)\r\n .then(redirectToSkypeClient(settings, 'MeetNowJoin', 'joinmeetnow', isNewJoinFlowFromJoinLink));\r\n }\r\n};\r\n\r\nexport const addUserToMeeting = curry((settings: IMeetNowSettings, conversationServiceModel: ConversationServiceModel) => {\r\n if (!conversationServiceModel.shortId) {\r\n throw new Error('ShortId not provided to addUserToMeeting function');\r\n }\r\n\r\n const localizedGuestDefaultName = localizer.getString('Meetings.txt_guest_user_name') ?? 'Guest user';\r\n const params: GuestJoinPayloadMeetingsApi = {\r\n displayName: localizedGuestDefaultName,\r\n threadId: conversationServiceModel.resource,\r\n flowId: conversationServiceModel.flowId,\r\n shortId: conversationServiceModel.shortId,\r\n };\r\n\r\n return MeetingsApiClient\r\n .joinAsGuest(params, settings.MeetNowEdgeNumberOfFetchRetries, true)\r\n .then((guestUserServiceModel: GuestUserServiceModel) => ({\r\n threadId: conversationServiceModel.resource,\r\n shortId: conversationServiceModel.shortId,\r\n ...guestUserServiceModel,\r\n }))\r\n .catch((response: WebErrorResponse) => {\r\n let error: DisplayableError | undefined;\r\n const createGuestRequest = 'Create guest user';\r\n switch (response.statusCode) {\r\n case 403:\r\n error = ErrorHelper.enrichErrorFromWebResponse(displayableErrors.JoinDisabled, response, createGuestRequest);\r\n break;\r\n case 404:\r\n error = ErrorHelper.enrichErrorFromWebResponse(displayableErrors.InviteNotFound, response, createGuestRequest);\r\n break;\r\n case 412:\r\n error = ErrorHelper.enrichErrorFromWebResponse(displayableErrors.TooManyUsers, response, createGuestRequest);\r\n break;\r\n case 429:\r\n error = ErrorHelper.enrichErrorFromWebResponse(displayableErrors.TooManyUsers, response, createGuestRequest);\r\n break;\r\n case 500:\r\n error = ErrorHelper.enrichErrorFromWebResponse(displayableErrors.Generic, response, createGuestRequest);\r\n break;\r\n default:\r\n error = ErrorHelper.enrichErrorFromWebResponse(displayableErrors.Busy, response, createGuestRequest);\r\n break;\r\n }\r\n\r\n throw error;\r\n });\r\n});\r\n\r\nexport const validateJoinLinkOrCode = async (settings: IMeetNowSettings, joinLink: string) => {\r\n const normalizedJoinLink = normalizeJoinLink(config.urls.app.join, joinLink);\r\n\r\n if (!normalizedJoinLink.match(joinLinkRegex)) {\r\n return false;\r\n }\r\n\r\n const conversationServiceModel: ConversationServiceModel = await getThreadId(settings, getShortIdFromJoinLink(normalizedJoinLink));\r\n if (conversationServiceModel && conversationServiceModel.resource) {\r\n return conversationServiceModel;\r\n }\r\n\r\n return false;\r\n};\r\n\r\nexport const normalizeJoinLink = (joinLinkDomain: string, joinLink: string) => {\r\n const trimmedJoinLink = joinLink.replace(/(^\\s*)|(\\s*\\.*\\s*$)/g, '');\r\n\r\n if (!trimmedJoinLink.startsWith(joinLinkDomain)) {\r\n return `${ joinLinkDomain }/${ trimmedJoinLink }`;\r\n }\r\n return trimmedJoinLink;\r\n};\r\n","export const getDiffInMS = (startDate: Date, endDate = new Date()): number => endDate.valueOf() - startDate.valueOf();\r\n","import { localizer } from '@skype/bew-localization';\r\nimport { Header, Image, Text } from '@stardust-ui/react';\r\nimport * as React from 'react';\r\nimport { ConfigContextConsumer } from '../../contexts/ConfigContext';\r\nimport { DisplayableError, ErrorHelper } from '../../helpers/ErrorHelper';\r\n\r\nexport interface ErrorDetailsProps {\r\n error: Error;\r\n showSkype?: boolean;\r\n assetsBasePath?: string;\r\n}\r\n\r\nexport class ErrorDetails extends React.PureComponent {\r\n constructor(props: ErrorDetailsProps) {\r\n super(props);\r\n }\r\n\r\n render() {\r\n const displayableError: DisplayableError = ErrorHelper.isDisplayableError(this.props.error)\r\n ? this.props.error\r\n : ErrorHelper.convertToGenericDisplayableError(this.props.error);\r\n\r\n return
\r\n { this.props.showSkype &&
}\r\n \r\n { (configContext) => displayableError.emoticonPath &&\r\n \r\n }\r\n \r\n
\r\n \r\n { localizer.getString(displayableError.descriptionLocString) }\r\n \r\n
;\r\n }\r\n}\r\n","import UAParser from 'ua-parser-js';\r\nimport { QuickJoinFlowSupportedBrowsers } from '../contexts/EcsContext';\r\nimport { Dictionary } from '../models/SharedTypes';\r\n\r\nexport enum OperatingSystems {\r\n WinPhone = 'Windows Phone',\r\n WinRT = 'Windows RT',\r\n Win = 'Windows',\r\n iOS = 'iOS',\r\n MacOS = 'Mac OS',\r\n Android = 'Android',\r\n AndroidX86 = 'Android -x86',\r\n ChromeOS = 'ChromeOS',\r\n Linux = 'Linux',\r\n Tizen = 'Tizen',\r\n Ubuntu = 'Ubuntu',\r\n WebOS = 'WebOS',\r\n Unknown = 'Unknown',\r\n}\r\n\r\nexport enum Browsers {\r\n AndroidBrowser = 'Android Browser',\r\n Avast = 'Avast',\r\n AVG = 'AVG',\r\n Bolt = 'Bolt',\r\n ChromeWebView = 'Chrome WebView',\r\n Chrome = 'Chrome',\r\n Chromium = 'Chromium',\r\n Dolphin = 'Dolphin',\r\n EdgeOld = 'EdgeOld',\r\n Edge = 'Edge',\r\n Electron = 'Electron',\r\n Facebook = 'Facebook',\r\n Firefox = 'Firefox',\r\n Instagram = 'Instagram',\r\n Kindle = 'Kindle',\r\n Opera = 'Opera',\r\n OperaMini = 'Opera Mini',\r\n OperaMobile = 'Opera Mobile',\r\n MSIE = 'IE',\r\n Mozilla = 'Mozilla',\r\n Safari = 'Safari',\r\n SafariMobile = 'Mobile Safari',\r\n PhantomJS = 'PhantomJS',\r\n SamsungBrowser = 'Samsung Browser',\r\n SkypeShell = 'SkypeShell',\r\n Tesla = 'Tesla',\r\n Tizen = 'Tizen Browser',\r\n Yandex = 'Yandex',\r\n WeChat = 'WeChat',\r\n Baidu = 'baidu',\r\n Unknown = 'Unknown',\r\n}\r\n\r\nconst osRegExps: Dictionary = {};\r\nosRegExps[OperatingSystems.WinPhone] = /windows\\sphone/i;\r\nosRegExps[OperatingSystems.WinRT] = /arm;/i;\r\nosRegExps[OperatingSystems.Win] = /(windows|win32)/i;\r\nosRegExps[OperatingSystems.iOS] = /(iPad|iPhone|iPod)/i;\r\nosRegExps[OperatingSystems.MacOS] = /(macintosh|mac os x)/i;\r\nosRegExps[OperatingSystems.Android] = /android/i;\r\nosRegExps[OperatingSystems.ChromeOS] = /CrOS/i;\r\nosRegExps[OperatingSystems.Linux] = /(linux|x11)/i;\r\n\r\nconst browserRegExps: Dictionary = {};\r\nbrowserRegExps[Browsers.Opera] = /(OPR\\/|Opera)/i;\r\nbrowserRegExps[Browsers.EdgeOld] = /Edge/i;\r\nbrowserRegExps[Browsers.Edge] = /Edg/i;\r\nbrowserRegExps[Browsers.MSIE] = /Trident/i;\r\nbrowserRegExps[Browsers.Chrome] = /Chrome/i;\r\nbrowserRegExps[Browsers.Firefox] = /Firefox/i;\r\nbrowserRegExps[Browsers.Safari] = /Safari/i;\r\nbrowserRegExps[Browsers.Facebook] = /(FBAN|FBAV)/i;\r\n\r\nexport interface IBrowserVersion {\r\n major: number;\r\n minor: number;\r\n bugfix?: number;\r\n}\r\n\r\nexport enum DeviceTypes {\r\n Desktop = 'desktop',\r\n Mobile = 'mobile',\r\n Other = 'other',\r\n}\r\n\r\nexport class EnvironmentHelper {\r\n\r\n /**\r\n * Returns the Operating System the code is executed in\r\n *\r\n * @return {string}\r\n */\r\n static getOS = (): OperatingSystems => {\r\n const osInformation = EnvironmentHelper._uaParser.getOS();\r\n const detectedOs = osInformation?.name as OperatingSystems ?? EnvironmentHelper._getOsFallback(EnvironmentHelper._uaParser.getUA() || window.navigator.userAgent);\r\n // iPads send by default MacOS user agent to so correctly detect iPad we use this trick\r\n if (detectedOs === OperatingSystems.MacOS && (navigator?.maxTouchPoints ?? 0) > 1) {\r\n return OperatingSystems.iOS;\r\n }\r\n\r\n return detectedOs;\r\n }\r\n\r\n /**\r\n * Returns the browser name\r\n *\r\n * @return {string}\r\n */\r\n static getBrowserName = (): Browsers => {\r\n const browserName = EnvironmentHelper._uaParser.getBrowser();\r\n return browserName?.name as Browsers ?? EnvironmentHelper._getBrowserNameFallback(EnvironmentHelper._uaParser.getUA() || window.navigator.userAgent);\r\n }\r\n\r\n static getSafariBrowserVersion = (): IBrowserVersion | undefined => {\r\n const version = EnvironmentHelper._uaParser.getUA().match(/version\\/(\\d+)\\.(\\d+)(\\.(\\d+))?/i);\r\n\r\n if (!version) {\r\n return;\r\n }\r\n\r\n return {\r\n major: parseInt(version[1], 10),\r\n minor: parseInt(version[2], 10),\r\n bugfix: parseInt(version[4], 10) || undefined,\r\n };\r\n }\r\n\r\n static isSafariBrowserVersionAtLeast(minimumVersion: IBrowserVersion): boolean {\r\n if (EnvironmentHelper.getBrowserName() !== Browsers.Safari) {\r\n return false;\r\n }\r\n\r\n const version = EnvironmentHelper.getSafariBrowserVersion();\r\n\r\n if (!version) {\r\n return false;\r\n }\r\n\r\n return version.major > minimumVersion.major\r\n || (version.major === minimumVersion.major && version.minor >= minimumVersion.minor);\r\n }\r\n\r\n static isSafariBrowserEligibleForMeetingGuestFlow = (): boolean => {\r\n return EnvironmentHelper.isSafariBrowserVersionAtLeast({\r\n major: 13,\r\n minor: 1,\r\n });\r\n }\r\n\r\n /**\r\n * Returns the device type\r\n *\r\n * @return {string}\r\n */\r\n static getDeviceType = (): DeviceTypes => {\r\n switch (EnvironmentHelper.getOS()) {\r\n case OperatingSystems.Win:\r\n case OperatingSystems.MacOS:\r\n case OperatingSystems.WinRT:\r\n case OperatingSystems.ChromeOS:\r\n case OperatingSystems.Linux:\r\n case OperatingSystems.Ubuntu:\r\n return DeviceTypes.Desktop;\r\n\r\n case OperatingSystems.WinPhone:\r\n case OperatingSystems.iOS:\r\n case OperatingSystems.Android:\r\n case OperatingSystems.AndroidX86:\r\n return DeviceTypes.Mobile;\r\n\r\n case OperatingSystems.Unknown:\r\n case OperatingSystems.WebOS:\r\n case OperatingSystems.Tizen:\r\n default:\r\n return DeviceTypes.Other;\r\n }\r\n }\r\n\r\n static isQuickWebJoinSupported = (): boolean => {\r\n return EnvironmentHelper._currentBrowserSupportsQuickJoinOnWeb();\r\n }\r\n\r\n /**\r\n * Returns current screen resolution\r\n *\r\n * @return {string}\r\n */\r\n static getScreenResolution = (_screen = window.screen) => {\r\n if (_screen.width == null || typeof _screen.width === 'undefined' ||\r\n _screen.height == null || typeof _screen.height === 'undefined') {\r\n\r\n return 'Unknown';\r\n }\r\n\r\n return _screen.width + 'x' + _screen.height;\r\n }\r\n\r\n /**\r\n * Returns language from the browser\r\n *\r\n * @return {string}\r\n */\r\n static getLanguage = (_navigator = window.navigator) => {\r\n const lang = _navigator.language || (_navigator as any).userLanguage;\r\n\r\n if (lang !== undefined && lang.length > 2) {\r\n return lang.substr(0, 2);\r\n }\r\n\r\n return lang;\r\n }\r\n\r\n /**\r\n * Returns the iOS version\r\n * Based on detectDevice can returns iPhone/iPad or just version number\r\n *\r\n * @return {string}\r\n */\r\n static getIOSVersion() {\r\n\r\n const iOSVersionMatches = EnvironmentHelper._uaParser.getUA().match(\r\n new RegExp('(iPhone OS|CPU OS)' + ' ([\\\\d_]+)'),\r\n );\r\n\r\n if (iOSVersionMatches) {\r\n return iOSVersionMatches[2].replace(/_/g, '.');\r\n }\r\n\r\n return 'Unknown';\r\n }\r\n\r\n static isIOSInAppBrowserFlow = (_os: OperatingSystems = os, _browser: Browsers = browser): boolean => {\r\n const knownInAppBrowsers = [\r\n Browsers.Facebook,\r\n ];\r\n\r\n return _os === OperatingSystems.iOS && knownInAppBrowsers.indexOf(browser) > -1;\r\n }\r\n\r\n static getSupportedBrowsersDefault = (): QuickJoinFlowSupportedBrowsers => {\r\n return {\r\n android: [Browsers.Chrome, Browsers.Chromium, Browsers.Edge, Browsers.Firefox, Browsers.Opera, Browsers.Yandex],\r\n ios: [Browsers.Safari, Browsers.SafariMobile, Browsers.Chrome, Browsers.Chromium, Browsers.Edge, Browsers.Firefox, Browsers.Opera, Browsers.Yandex],\r\n mac: [Browsers.Safari, Browsers.Chrome, Browsers.Chromium, Browsers.Edge, Browsers.Firefox, Browsers.Opera, Browsers.Yandex],\r\n windows: [Browsers.Chrome, Browsers.Chromium, Browsers.Edge, Browsers.EdgeOld, Browsers.Firefox, Browsers.Opera, Browsers.Yandex],\r\n others: [Browsers.Chrome, Browsers.Chromium, Browsers.Edge, Browsers.Firefox, Browsers.Opera, Browsers.Yandex],\r\n };\r\n }\r\n\r\n static updateEnvironmentSettings = (quickJoinFlowSupportedBrowsers?: QuickJoinFlowSupportedBrowsers, customUaParser?: UAParser) => {\r\n EnvironmentHelper._quickJoinFlowSupportedBrowsers = quickJoinFlowSupportedBrowsers ?? EnvironmentHelper._quickJoinFlowSupportedBrowsers;\r\n if (customUaParser) {\r\n EnvironmentHelper._uaParser = customUaParser;\r\n }\r\n }\r\n\r\n private static _uaParser = new UAParser();\r\n private static _quickJoinFlowSupportedBrowsers = EnvironmentHelper.getSupportedBrowsersDefault();\r\n\r\n private static _currentBrowserSupportsQuickJoinOnWeb = (): boolean => {\r\n const currentBrowser = EnvironmentHelper.getBrowserName();\r\n const currentOs = EnvironmentHelper.getOS();\r\n const supportedBrowsers = EnvironmentHelper._quickJoinFlowSupportedBrowsers;\r\n switch (currentOs) {\r\n case OperatingSystems.Android:\r\n case OperatingSystems.AndroidX86:\r\n case OperatingSystems.ChromeOS:\r\n return supportedBrowsers.android.includes(currentBrowser);\r\n\r\n case OperatingSystems.iOS:\r\n return supportedBrowsers.ios.includes(currentBrowser);\r\n\r\n case OperatingSystems.MacOS:\r\n return supportedBrowsers.mac.includes(currentBrowser);\r\n\r\n case OperatingSystems.Win:\r\n case OperatingSystems.WinRT:\r\n return supportedBrowsers.windows.includes(currentBrowser);\r\n\r\n default:\r\n return supportedBrowsers.others.includes(currentBrowser);\r\n }\r\n }\r\n\r\n private static _getOsFallback = (userAgent: string): OperatingSystems => {\r\n for (const osKey in osRegExps) {\r\n if (userAgent.match(osRegExps[osKey])) {\r\n // iPads send by default MacOS user agent to so correctly detect iPad we use this trick\r\n if (osKey === OperatingSystems.MacOS && (navigator?.maxTouchPoints ?? 0) > 1) {\r\n return OperatingSystems.iOS;\r\n }\r\n\r\n return osKey as OperatingSystems;\r\n }\r\n }\r\n\r\n return OperatingSystems.Unknown;\r\n }\r\n\r\n private static _getBrowserNameFallback = (userAgent: string): Browsers => {\r\n for (const browserKey in browserRegExps) {\r\n if (userAgent.match(browserRegExps[browserKey])) {\r\n return browserKey as Browsers;\r\n }\r\n }\r\n\r\n return Browsers.Unknown;\r\n }\r\n}\r\n\r\n// PlatformVersion: Helpers.Environment.pureOSVersion,\r\n// Platform: Helpers.Environment.platform,\r\n// Language: Helpers.Environment.language,\r\n// ScreenResolution: Helpers.Environment.screenResolution\r\n\r\nexport const os = EnvironmentHelper.getOS();\r\nexport const browser = EnvironmentHelper.getBrowserName();\r\nexport const deviceType = EnvironmentHelper.getDeviceType();\r\nexport const canJoinOnWeb = EnvironmentHelper.isQuickWebJoinSupported();\r\nexport const screenResolution = EnvironmentHelper.getScreenResolution();\r\nexport const deviceLanguage = EnvironmentHelper.getLanguage();\r\nexport const platform = window.navigator.platform;\r\nexport const isIOSInAppBrowserFlow = EnvironmentHelper.isIOSInAppBrowserFlow();\r\nexport const isSafariBrowserEligibleForMeetingGuestFlow = EnvironmentHelper.isSafariBrowserEligibleForMeetingGuestFlow();\r\nexport const getSupportedBrowsersDefault = EnvironmentHelper.getSupportedBrowsersDefault();\r\n","/**\r\n * @copyright © Microsoft. All rights reserved.\r\n *\r\n * Skype Silent Login SDK\r\n */\r\n(function() {\r\n \"use strict\";\r\n\r\n if (typeof window.SKYPE === \"undefined\") {\r\n window.SKYPE = {};\r\n }\r\n window.SKYPE.login = window.SKYPE.login || {};\r\n\r\n window.SKYPE.login.Silent = (function() {\r\n var loginDomains = {\r\n qa: \"https://a.qa.lw.skype.net\",\r\n live: \"https://a.lw.skype.com\"\r\n },\r\n ssoLoginDomains = {\r\n qa: \"https://a.qalogin.skype.net\",\r\n live: \"https://a.login.skype.com\"\r\n },\r\n originCheckMap = {\r\n qa: [\"https://a.qa.lw.skype.net\", \"https://a.qalogin.skype.net\"],\r\n live: [\"https://a.lw.skype.com\", \"https://a.login.skype.com\"]\r\n },\r\n endpoint = \"/login/silent\", // Silent login endpoint uri\r\n endpointVersion = \"1.0\", // Endpoint version\r\n iFrameReference = null, // iFrame object reference\r\n ancestorElement, // iFrame's ancestor\r\n callback, // Callback function\r\n response = {}, // Response object\r\n timeout = 5000, // Timeout for the call in ms\r\n timeoutObj = null, // Timeout reference\r\n host = null, // Selected login hostname\r\n originCheckHosts = null, // Array of hosts for postmessage origin check\r\n state = \"\", // State passed through the silent login\r\n eventRegistered = false, // Post message event listener registered\r\n processing = false, // Processing the Silent login request\r\n logEnabled = null; // Debug logging enabled\r\n\r\n /**\r\n * Settings object. will be overriden by init()\r\n */\r\n var settings = {\r\n env: \"live\",\r\n client_id: null,\r\n redirect_uri: null,\r\n isSsoCompatible: false\r\n };\r\n\r\n /**\r\n * Simple debug logger\r\n *\r\n * @param string message Logged message\r\n * @param Object debug Optional debug data\r\n *\r\n * @return void\r\n */\r\n var _log = function(message, debug) {\r\n if (logEnabled === null) {\r\n logEnabled = (window.location.host.match(/^(pre|dev|qa).*\\.net$/) || document.cookie.indexOf(\"debug\") > -1 || window.location.search.indexOf(\"debug\") > -1);\r\n }\r\n if (!logEnabled) {\r\n return;\r\n }\r\n try {\r\n if (typeof debug === \"object\") {\r\n var tokens = [];\r\n\r\n for (var prop in debug) {\r\n if (prop === \"skypetoken\") {\r\n // Hide the skypetoken from console\r\n tokens.push(prop + \": \" + \"\");\r\n } else {\r\n tokens.push(prop + \": \" + JSON.stringify(debug[prop]));\r\n }\r\n }\r\n\r\n message += \" - \" + tokens.join(\", \");\r\n } else if (typeof debug === \"string\") {\r\n message += \" - \" + debug;\r\n }\r\n message = \"[silentlogin.js] - \" + message;\r\n console.log(message);\r\n } catch (e) {}\r\n };\r\n\r\n /**\r\n * Post message event listener\r\n *\r\n * @return void\r\n */\r\n var _messageListener = function(e) {\r\n _log(\"Received message from \" + e.origin);\r\n\r\n // Verify the message origin\r\n var originCheckPassed = false;\r\n\r\n if (!originCheckHosts) {\r\n return;\r\n }\r\n\r\n for (var i = 0; i < originCheckHosts.length; i++) {\r\n if (e.origin === originCheckHosts[i]) {\r\n originCheckPassed = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!originCheckPassed) {\r\n return;\r\n }\r\n\r\n var data = e.data;\r\n\r\n // If the postMessage sends just a string, try to JSON parse it\r\n if (typeof e.data === \"string\") {\r\n try {\r\n data = JSON.parse(e.data);\r\n } catch (ex) {}\r\n }\r\n _log(\"Message data\", data);\r\n\r\n // Verify the message state\r\n var receivedState = data.state || null;\r\n if (state !== receivedState) {\r\n _log(\"State \" + receivedState + \" doesn't match the last submitted state \" + state);\r\n return;\r\n }\r\n // Response is trusted\r\n window.clearTimeout(timeoutObj);\r\n // Clone the response data\r\n response = {};\r\n for (var attr in data) {\r\n if (data.hasOwnProperty(attr)) {\r\n response[attr] = data[attr];\r\n }\r\n }\r\n\r\n _callCallback();\r\n };\r\n\r\n /**\r\n * Create the silent login iframe and start loading\r\n *\r\n * @return void\r\n */\r\n var _createSilentLogin = function(source) {\r\n _destroySilentLogin();\r\n if (typeof ancestorElement === \"undefined\") {\r\n // Use body as the ancestor, but when it's not available yet, use head instead.\r\n // document.head is not available in IE8, so fallback is to get it by tag name.\r\n ancestorElement = document.body || document.head || document.getElementsByTagName('head')[0];\r\n }\r\n iFrameReference = document.createElement(\"iframe\");\r\n iFrameReference.frameBorder = 0;\r\n iFrameReference.width = \"1px\";\r\n iFrameReference.height = \"1px\";\r\n iFrameReference.style.display = \"none\";\r\n iFrameReference.style.visibility = \"hidden\";\r\n iFrameReference.id = \"silentLoginFrame\" + Math.floor((Math.random() * 10) + 1);\r\n iFrameReference.setAttribute(\"src\", source);\r\n ancestorElement.appendChild(iFrameReference);\r\n _log(\"Created iFrame: \" + source);\r\n };\r\n\r\n /**\r\n * Destroy the silent login iframe\r\n *\r\n * @return void\r\n */\r\n var _destroySilentLogin = function() {\r\n if (iFrameReference) {\r\n ancestorElement.removeChild(iFrameReference);\r\n iFrameReference = null;\r\n }\r\n };\r\n\r\n /**\r\n * Verify if the provided settings are valid. Initialize the redirect uri if missing.\r\n *\r\n * @return void\r\n */\r\n var _validateSettings = function() {\r\n if (!settings.client_id) {\r\n throw \"[silentlogin.js] client_id not initialized. Call init() first.\";\r\n }\r\n\r\n if (!settings.redirect_uri) {\r\n // If redirect_uri not set, use the page location (without parameters)\r\n settings.redirect_uri = window.location.protocol + \"//\" + window.location.host + window.location.pathname;\r\n }\r\n };\r\n\r\n /**\r\n * Check if the browser supports postMessage and JSON.parse\r\n *\r\n * @return boolean\r\n */\r\n var _isSupportedBrowser = function() {\r\n return (\"postMessage\" in window) && (typeof JSON === \"object\" && JSON.parse);\r\n };\r\n\r\n /**\r\n * Call the callback function and pass the response object to it.\r\n *\r\n * @return void\r\n */\r\n var _callCallback = function() {\r\n _log(\"Calling callback function\", response);\r\n\r\n // No longer processing request. Unlock.\r\n processing = false;\r\n\r\n if (typeof callback === \"function\") {\r\n callback(response);\r\n }\r\n };\r\n\r\n /**\r\n * Handle timeout event and call the callback function.\r\n *\r\n * @return void\r\n */\r\n var _handleTimeout = function() {\r\n _destroySilentLogin();\r\n response = {};\r\n response.error = \"timeout\";\r\n _callCallback();\r\n };\r\n\r\n /**\r\n * Serialize object into query parameters\r\n *\r\n * @param Object query Object holding the parameters to serialize\r\n * @return string Serialized query string\r\n */\r\n var _createQuery = function(query) {\r\n var str = [];\r\n for (var k in query) {\r\n if (query.hasOwnProperty(k)) {\r\n str.push(encodeURIComponent(k) + \"=\" + encodeURIComponent(query[k]));\r\n }\r\n }\r\n return str.join(\"&\");\r\n };\r\n\r\n /**\r\n * Get the iFrame source url\r\n *\r\n * @return string Frame url\r\n */\r\n var _getFrameSource = function() {\r\n var timestamp = new Date().getTime(),\r\n domainMap = settings.isSsoCompatible ? ssoLoginDomains : loginDomains;\r\n\r\n state = \"silentloginsdk_\" + timestamp;\r\n var query = {\r\n response_type: \"postmessage\",\r\n client_id: settings.client_id,\r\n partner: \"999\",\r\n redirect_uri: settings.redirect_uri,\r\n state: state,\r\n _accept: endpointVersion,\r\n _nc: timestamp\r\n };\r\n\r\n originCheckHosts = originCheckMap[settings.env] || originCheckMap.live;\r\n host = domainMap[settings.env] || domainMap.live;\r\n return host + endpoint + \"?\" + _createQuery(query);\r\n };\r\n\r\n /**\r\n * Initialize the Silent login before using it\r\n *\r\n * Pass in the settings object:\r\n *
\r\n         * {\r\n         *  env: \"\", // Skype environment to be used: Live (default), QA. Optional.\r\n         *  client_id: , // Client id of your application. Mandatory.\r\n         *  redirect_uri: , // Redirect uri of your application. If left empty, will be autodetected from current location. (Optional, recommended)\r\n         * }\r\n         * 
\r\n *\r\n * @param Object options Silent login options\r\n * @return SKYPE.login.Silent\r\n */\r\n var init = function(options) {\r\n if (typeof options === \"object\") {\r\n options = options || {};\r\n // If callback function passed into init method, set it correctly\r\n if (options.hasOwnProperty(\"callback\")) {\r\n setCallback(options.callback);\r\n }\r\n // Copy overrides to settings\r\n for (var k in settings) {\r\n if (options.hasOwnProperty(k)) {\r\n settings[k] = options[k];\r\n }\r\n }\r\n }\r\n // Register the message listener\r\n if (!eventRegistered) {\r\n eventRegistered = true;\r\n if (!window.addEventListener) {\r\n window.attachEvent(\"onmessage\", _messageListener);\r\n } else {\r\n window.addEventListener(\"message\", _messageListener, false);\r\n }\r\n }\r\n return this;\r\n };\r\n\r\n /**\r\n * Set the callback function, which will be called once we get the result.\r\n * Note the function parameter will contain the response object.\r\n *\r\n * @param function callbackFunction Callback function\r\n * @return SKYPE.login.Silent\r\n */\r\n var setCallback = function(callbackFunction) {\r\n if (typeof callbackFunction === \"function\") {\r\n callback = callbackFunction;\r\n }\r\n return this;\r\n };\r\n\r\n /**\r\n * Trigger loading the Silent login iFrame. Registered callback will be called once finished.\r\n *\r\n * @return void\r\n */\r\n var load = function() {\r\n // Prevent multiple simultaneous calls\r\n if (processing) {\r\n return;\r\n }\r\n _validateSettings();\r\n processing = true;\r\n // If this browser doesn't support postMessage, we're done.\r\n if (!_isSupportedBrowser()) {\r\n response = {error: \"unsupported_browser\"};\r\n _callCallback();\r\n return;\r\n }\r\n // Initialize timer\r\n window.clearTimeout(timeoutObj);\r\n timeoutObj = window.setTimeout(_handleTimeout, timeout);\r\n // Start loading the iFrame\r\n _createSilentLogin(_getFrameSource());\r\n };\r\n\r\n /**\r\n * Get the Skypetoken from response or null if not provided\r\n *\r\n * @return string|null Skypetoken or null\r\n */\r\n var getSkypetoken = function() {\r\n return response.skypetoken || null;\r\n };\r\n\r\n /**\r\n * Get the full response object\r\n *\r\n * @return Object Response object\r\n */\r\n var getFullResponse = function() {\r\n return response;\r\n };\r\n\r\n return {\r\n init: init,\r\n setCallback: setCallback,\r\n load: load,\r\n getSkypetoken: getSkypetoken,\r\n getFullResponse: getFullResponse\r\n };\r\n }());\r\n}());\r\n"],"sourceRoot":""}