{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/visibility.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/trackInfo.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/diagnostics/src/AppError/AppErrorTracker.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/isomorphic-util/src/DOMHelpers.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/constants/Constants.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/telemetryDataTypes.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/app/HeadData.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/reducers/ActionDispatchHelper.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/reducers/ActionDispatchCancellationToken.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/reducers/ActionSenderBase.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/reducers/ActionSender.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/reducers/GlobalActionSender.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/reducers/ActionMap.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/telemetryconstants.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/utilities/UrlUtility.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/render-cache/src/Constants.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/dom.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/constants/ConnectorConstants.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/mediator.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/isomorphic-util/src/requestData.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/diagnostics/src/AppError/AppErrors.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/app/AppEnvironment.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/utilities/Parsing.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/extend.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/diagnostics/src/logging/Logger.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/pageInstance.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-constants/src/AppTypes.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-constants/src/SignedInStatus.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/utilities/Utility.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/milestone-data/src/MilestoneData.actions.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/milestone-data/src/data-model/ExperienceLoadingState.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/telemetryReadyCallback.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/reducers/DynamicReducer.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/pages/PageHelper.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/pages/PageBase.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/utilities/CookieUtility.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/utilities/WebStorage.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/app/Environment.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-base/src/utilities/ColumnWidths.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/auth/src/AadAuthHelper.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/pages/index.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/diagnostics/src/performance/PageTimings.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-base/src/utilities/BreakpointManager.ts","webpack:///./src/integration/RequireAsync.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/reducers/DataConnectorInjector.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/render-cache/src/Helper.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/app/Enterprise.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-constants/src/PageTypes.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/diagnostics/src/performance/AppPerfTrace.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/diagnostics/src/performance/PerfTimeline.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/diagnostics/src/performance/ExperienceDiagnostics.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-constants/src/ConnectorNamespaces.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/oneservice/src/OneServiceUtility.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/app/Market.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/src/icons/GlyphInline.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/src/Icon.props.ts","webpack:///./src/integration/SubnavTabId.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/src/index.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/src/Icon.styles.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/src/Icon.tsx","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/app/HostPage.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/guidGen.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-constants/src/AuthCookieNames.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/utilities/WebWorkerUtility.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/utilities/UserNavigation.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/utilities/ServerCacheMock.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/diagnostics/src/performance/PerfMarker.ts","webpack:///./src/integration/PrimeTrack.ts","webpack:///./src/integration/MediatorEventNames.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/views-helpers/src/IntraArticle.types.ts","webpack:///./src/integration/PrimeTrackExtensionComplete.ts","webpack:///./src/integration/PrimeTelemetry.ts","webpack:///./src/integration/PrimeMediator.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/reducers/ActionHandler.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-base/src/tracking/Telemetry.ts","webpack:///./src/integration/SubnavTabName.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/events.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/escape.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/navigation.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/trackingHelper.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/telemetry-transitional/src/msnews-telemetry-transitional/track.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/views-helpers/src/ViewsStringResource.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/AdChoices.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/BingCardDefaultHotelImage.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/BingHotelSeePrice.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/BingLogo.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/BingRatingDarkLightStar.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/BingRatingDarkStar.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/BingRatingLightStar.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/BlowingHail.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/BlowingHailWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/BlowingSnow.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/BlowingSnowWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Check.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Chevron.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/CircleClose.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/ClearNight.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/ClearNightWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Close.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Cloudy.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/CloudyWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Copy.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/DarkModeHotel.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/DayTime.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Delete.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Dislike.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/DislikeText.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Disliked.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/DislikedLight.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/DislikedText.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Docx.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Download.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/DownloadNoFill.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Edit.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/EditNoFill.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Edited.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/EditedNoFill.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Ellipses.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/EllipsesLight.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Excel.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Facebook.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/FacebookText.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/FacebookTextBlack.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Fog.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/FogWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Folder.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/FolderNoFill.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/FolderOpen.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Form.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/FreezingRain.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/FreezingRainWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/GalleryFullscreen.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/GalleryMediaIcon.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/GenericFile.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/GridView.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/HailDay.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/HailDayWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/HailNight.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/HailNightWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/HazeSmoke.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/HazeSmokeWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/HeavySnow.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/HeavySnowWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Hide.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/HideStory.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Hotel.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Information.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/InteractionRequiredDark.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/InteractionRequiredLight.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Interested.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/LightRain.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/LightRainWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/LightSnow.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/LightSnowWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Like.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/LikeText.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Liked.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/LikedText.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Line.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/LinkedIn.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/LinkedInBlack.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/LinkedInText.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Mail.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/MailBlack.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/MailNoFill.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/ManagedBriefcase.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Message.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/MessageNoFill.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Messages.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/MicrosoftNews.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/MicrosoftNewsFull.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/MicrosoftNewsFull_FR.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/MicrosoftNewsFull_ZH.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/ModerateRain.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/ModerateRainWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Movie.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/NightTime.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/OfficeFormsLogo.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/OneDrive.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/OneNote.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Onetoc.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Outlook.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/PartlyCloudyDay.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/PartlyCloudyDayWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/PartlyCloudyNight.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/PartlyCloudyNightWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Pdf.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/People.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Pin.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/PowerPoint.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Pptx.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/RainShowersDay.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/RainShowersDayWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/RainShowersNight.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/RainShowersNightWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/RainSnow.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/RainSnowShowersDay.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/RainSnowShowersDayWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/RainSnowShowersNight.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/RainSnowShowersNightWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/RainSnowWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Refresh.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Remove.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Save.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Saved.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Search.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Share.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/ShareLight.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Sharepoint.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Skype.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/SkypeOffice.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/SnowShowersDay.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/SnowShowersDayWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/SnowShowersNight.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/SnowShowersNightWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/SunnyDay.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/SunnyDayWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Sway.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/SwayApp.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Teams.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/ThumbnailView.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Thunderstorms.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/ThunderstormsWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Trending.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Twitter.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/TwitterBlack.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/TwitterText.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Unpin.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Upload.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/VerticalSeparator.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/VideoMediaIcon.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/VideoPlay.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Visio.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Vsdx.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/WeatherAlert.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/WhatsApp.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/WhatsAppBlack.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Windy.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/WindyWhite.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Word.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/World.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Xlsx.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/icon/icons/Yammer.svg","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/telemetry-base/TelemetryBase.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-base/src/tracking/Telemetry.types.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/PublicPath/index.ts","webpack:///./src/publicPath.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/config/configs/ExperienceState.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/config/configs/ChildExperiencesDeferRenderType.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/actions/CommonActions.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/config/configs/ChildExperienceValidator.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/config-validator/src/ConfigProcessor.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-connector/src/experience-loader/ExperienceLoader.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-connector/src/connectors/ComponentConnector.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-connector/src/connectors/ExperiencePerfTimeline.tsx","webpack:///./src/integration/Constants.ts","webpack:///./src/integration/Mediator.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/utilities/IndexedDb.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/services/ExponentialBackoffRetry.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/oneservice/src/ServiceRequest.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-base/src/utilities/FastBreakpointManager.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/oneservice/src/UrlUtility.ts","webpack:///./src/integration/SubnavTabHelper.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/utilities/SingletonResetManager.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/render-cache/src/PersistHelpers.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/render-cache/src/PersistRenderCache.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/utilities/ServerCache.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-redux/src/connectors/DataConnector.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/milestone-data/src/data-model/ExperienceDeferralHandlerSignature.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/milestone-data/src/data-model/ExperienceMilestoneEventTypes.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/config/configs/ExperienceCompositionTypes.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/config/configs/composition/ChildrenTypes.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/app/ScreenWidth.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/bundles/Bundles.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/milestone-data/src/data-model/ExperienceDeferralEventTypes.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/milestone-data/src/MilestoneData.Constants.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/milestone-data/src/data-management/ExperienceDeferralDependencyTracker.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/milestone-data/src/MilestoneData.Helper.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experimentation-helpers/src/GetPeregrineFlights.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/config/Resolver.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/diagnostics/src/performance/PerfTracker.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/experiences-base/src/base/BaseExperience.tsx","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/diagnostics/src/performance/PerfMarkerConstants.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/diagnostics/src/performance/PerfMarkerWait.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/image-url-generator/ImageUrlGenerator.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/views-helpers/src/SocialMediaConfig.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/views-helpers/src/ViewsUtility.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/services/ImageServiceConfig.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/utilities/UrlSearchParamsHelper.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/pop-over/src/PopOver.tsx","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/pop-over/src/PopOver.styles.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/pop-over/src/index.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/utilities/ZIndex.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/card-context-menu/src/index.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/card-context-menu/src/CardContextMenu.style.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/card-context-menu/src/CardContextMenu.tsx","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/social-media-icon/src/SocialMediaIcon.styles.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/social-media-icon/src/index.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/social-media-icon/src/SocialMediaIcon.tsx","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/core/src/utilities/ShallowCompare.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/share-dialog/src/ShareDialog.styles.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/share-dialog/src/StringResource.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/share-dialog/src/ShareDialog.tsx","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/share-dialog/src/index.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/components/article-card/src/ArticleCard.tsx","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/libs/views-helpers/src/SocialMediaHelper.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/ContentActionsToolbar.constants.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/components/sharing-toolbar/SharingToolbar.props.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/ContentActionsToolbar.actions.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/components/sharing-toolbar/SharingToolbar.constants.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/ContentActionsToolbar.inspector.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/services/ContentActionsToolbarServiceClient.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/ContentActionsToolbar.telemetry.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/ContentActionsToolbar.connector.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/ContentActionsToolbar.props.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/ContentActionsToolbar.reducer.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/components/sharing-toolbar/SharingToolbar.styles.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/components/dialog-article-card/DialogArticleCard.styles.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/components/dialog-article-card/index.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/components/dialog-article-card/DialogArticleCard.tsx","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/components/sharing-toolbar/index.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/components/sharing-toolbar/SharingToolbar.tsx","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/ContentActionsToolbar.tsx","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/ContentActionsToolbar.styles.ts","webpack:///C:/agents/peregrineAgent_selfhostw00000W_a0/_work/1/s/experiences/content-actions-toolbar/src/index.ts","webpack:///./src/content-actions-toolbar/ContentActionsToolbar.ts"],"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","15","exports","module","l","e","promises","installedChunkData","promise","Promise","resolve","reject","onScriptComplete","script","document","createElement","charset","timeout","nc","setAttribute","src","p","jsonpScriptSrc","error","Error","event","onerror","onload","clearTimeout","chunk","errorType","type","realSrc","target","message","name","request","undefined","setTimeout","head","appendChild","all","m","c","d","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","oe","err","console","jsonpArray","window","oldJsonpFunction","slice","Deferred","callbacks","isResolved","resolvedArgs","flushCallbacks","errors","index","then","callback","always","this","arguments","visibilityDeferred","visibilityProperty","prefixes","hidden","prospectivePropertyName","getHiddenPropertyName","isUnloadEventInProgress","addEventListener","wasBrowserHidden","evtname","replace","visibilityChanged","isHidden","clientClientId","browserWidth","browserHeight","notifyWhenPageVisible","isElementTrulyVisible","element","windowRight","windowLeft","windowHeight","contentArea","getElementById","contentRect","getBoundingClientRect","right","left","rec","elementHeightVisible","top","bottom","elementWidthVisible","height","width","wasBrowserHiddenAtLeastOnce","clientIdTypeValue","eventIndex","isFirstEventIndex","eventTransientCustomTags","baseUrl","userDefinedCustomTags","Module","visible","compress","moduleTelemetryData","getAttribute","JSON","parse","getBrowserSize","outerWidth","documentElement","clientWidth","outerHeight","clientHeight","joinTelemetryValuesForTmpl","separator","currentTmplValue","newTmplValue","combinedTelemetryVal","isDuplicateKeyExist","newTmplValueSplited","split","newKeyVal","indexOf","currentTmplValueSplited","currentKeyVal","val","defaultCustomTags","trackInfo","notrack","cmSeparator","defaultModule","defaultFormHeadline","piitxt","piiurl","wrapperId","MUIDCookie","gestureKey","gestureType","tap","rightclick","eventTypes","click","nonNavClckEvt","submit","contextmenu","mouseenter","imprUpdate","adPlay","contentPlay","videoClickNonNav","imprUpdateMechanisms","load","scroll","auto","resize","swipe","partial","view","sitePage","userStatic","overrideClientParams","persistOverriddenParams","customTags","adsEnabled","adoni","trackingDisabled","shouldFireTelemetry","appErrorEnabled","shouldFireAppError","getCurrentTime","Date","timeToInteract","eventTime","eventTiming","performance","timing","navigationStart","telemetryModuleTypes","Undefined","Header","Footer","topNavBar","navBar","dropDown","Section","Carousel","searchBox","inputBox","actionButton","Interaction","Headline","Navigation","Entity","structuredData","appStore","appLaunch","cmsPromotions","microsoftWebStore","xboxStore","officeStore","appInstall","PartnerLinks","SponsoredContent","contentPlacedBySource","Editorial","PersonalizationAlgo","BingAlgo","Taboola","Outbrain","telemetryDataAttribute","telemetryHLAttribute","client","clientId","requestId","clientIdType","gesture","dom","getTarget","trackInfoEvent","originalEvent","ctrlKey","shiftKey","getMuid","getAnonCookieName","AnonCookieName","AuthCookieName","getSsoComplete","SsoComplete","toLowerCase","getAadAuthentication","AadState","AadAccount","NonAadAccount","AccountType","AAD","orientation","screen","OTFTelemetry","mechanism","telemetryData","body","querySelectorAll","innerHeight","innerWidth","infopane","querySelector","infopaneVisible","telemetryTracking","isVisible","visibles","context","formatModules","vc","sendImprUpdateEvent","pageTitle","title","pageUrl","ocid","msnocid","hasQueryString","referrer","referrerOverride","screenResolution","join","userAgent","navigator","visibility","userDynamic","timeStamp","slideType","elem","containsClass","parent","firstEventIndex","currentEventIndex","pageInstance","getRequestId","resetEventIndex","custom","addCustomTags","combinedTags","extend","stringify","addCustomTagsForClickEvent","setupParameters","evt","trackInfoSitePage","anonckName","rid","di","domainId","clid","issso","aadState","afd","anoncknm","page_product","page_type","page_name","page_configuration","topLevelContainerType","parameters","winht","docht","Math","max","scrollHeight","offsetHeight","scrollOff","pageYOffset","scrollTop","wbh","tmpl","templ","mkt","localeCode","TTI","feedId","fid","fn","feedName","ft","feedType","flightid","tlcType","sendUpdate","formattedModules","mData","y","ct","telemetryDataTypes","getTelemetryContentType","telemetryReadyCallback","otfURL","idx","beaconData","url","requestType","POST","eventType","impressionUpdate","params","trackingType","OTF","mediator","pub","FireTelemetry","updateTemplValue","templToAdd","updateSitePage","flightId","currentSitePage","leftTmplValue","rightTemplValue","currentFlightIds","updatePageName","pageName","overridePageType","doOverridePageType","telemetryPageName","getTelemetryPageInfo","PageName","PageType","updateFeedMetadata","updatePagePivot","pagePivot","TelemetryPagePivot","validateTelemetryDataType","updateReferrer","referrerType","TelemetryContentType","setCustomTagsForClickEvent","updatePageUserTypeAndUserId","userType","userId","pageUserId","pageUserType","TelemetryUserType","trackCustomProperty","updateExtendedFlightId","namespace","flightIds","TelemetryPartnerNamespace","extflightid","Severity","canUseDOM","getLocationHref","location","href","getLocationHostname","hostname","getLocationHost","host","getLocationOrigin","origin","getLocationSearch","search","getLocationProtocol","protocol","getDocumentElementById","elementId","getDocumentElementsByTagName","tagName","getElementsByTagName","getIndexedDB","indexedDB","getInnerWidth","getInnerHeight","getDevicePixelRatio","devicePixelRatio","ariaLabelAttribute","rootElementId","htmlElementIds","html","applicationCacheConstants","manifestAttributeName","pagesRefreshData","storedHeadDataKey","storedLastUsedActivityIdKey","clientSettings","pagetypeSettings","info","js","lang","dir","serviceUrl","telemetryId","trackPageProduct","trackPageType","minimumHostPagePathSegments","anonCookieName","appAnonCookieExistsCookieName","childCookieName","oneServiceHeaders","activityId","authorization","oneServiceQueryStringKeys","apiKey","complexInfoPaneEnabled","contentType","delta","disableTypeSerialization","infopaneCount","fdhead","feedLayoutRequestType","filter","ids","market","parentContentId","parentNamespace","parentTitle","query","queryType","qScope","responseSchema","select","session","signInCookieName","skip","source","timeOut","user","wrapOData","AriaRoles","DeviceOrientation","EnterpriseOneServiceApi","PageNamePageTypeMappingList","TelemetryTypeContentTypeMappingList","TelemetryTypeBehaviorTypeMappingList","TelemetryPageType","Unspecified","DHP","NTP","HomePage","VerticalHomePage","StructuredDataPage","SectionFront","SiteSearch","Article","Gallery","Video","SubjectSection","CustomColumn","TelemetryType","TopNavBar","NavBar","DropDown","SearchBox","InputBox","ActionButton","StructuredData","AppStore","AppLaunch","CmsPromotions","MicrosoftWebStore","XboxStore","OfficeStore","AppInstall","Follow","Unfollow","MoreFrom","Topic","Provider","Spotlight","ShareClose","Share","Like","Dislike","Unlike","Undislike","Mute","Unmute","MuteCancel","Manage","NewStories","AutoSuggest","BingCard","Tile","TrendingNews","AllCoverage","Report","AdChoice","Hide","Unhide","App","Feed","AppStorePromo","Settings","StructuredDataCard","Webview","Activity","Win32","OfficeDocument","LocalFile","CardAction","TelemetryBehaviorType","Navigate","ContextMenu","Pin","Unpin","Rearrange","Remove","Add","Open","View","More","Close","Cancel","Launch","Install","Show","Save","Customize","TelemetryPageName","StartPage","DefaultPage","EduPage","ChildModePage","Office","Discover","MyInterests","CombinedInterests","ArticlePageNames","ArticleVNext","ArticleListicle","ArticleCollection","ArticleFullScreen","FlexibleArticle","FlexibleArticleMobile","ArticleGalleryFullScreen","GalleryPageNames","GalleryVNext","GalleryFullScreen","GalleryClassic","GalleryClassicFullScreen","GallerySearch","GallerySearchFullScreen","FlexibleGallery","FlexibleGalleryMobile","GalleryImmersive","GalleryImmersiveFullScreen","GallerySponsored","GallerySponsoredFullScreen","GalleryInline","VideoPageNames","ChannelPlayerPage","PartnerPlayerPage","VerticalHomePageNames","HomePageToday","StructuredDataPageNames","Gamecenter","Schedule","Scores","Stocksummary","Stocksummaryoneriver","Weatherxplatmaps","Standings","Markets","Watchlistpage","Data_modelpage","Immersivechartspage","Currencies","Indexdetailspage","Data_makepage","Weatherfullscreenmaps","Weatherthresholdmaps","Stockanalysisdetails","Data_yearoverview","Data_segmenthub","Weathermaps","Playerstats","Funddetailspage","Exercisedetails","Teams","Etfdetailspage","Binganswermaps","Workoutdetails","Competitionstats","Polls","Data_photos","Videocategorylistpage","Stockfinancialsdetails","Commoditydetailspage","Data_yearoverview_trim","Worldwidepage","Data_photos_trim","Stockcompanydetails","Retirementplanner","Livecoverage","Teamroster","Stockhistorydetails","Filterresultspage","Data_carcompare","Stockownershipdetails","Driverstandings","Timevalueofmoney","Savingscalculator","Iccmatches","Other_flightsearchresult","Stockrelateddetails","Data_specs_trim","Stockoptionsdetails","HomepageAlerts","HomepageRecordsandAverages","HomepageWeatherTraffic","Data_specs","Data_pricing","Mortgagecalculator","Data_performance_trim","Theatershowtimes","Data_pricing_trim","Data_photosInterior","Indexdetailsanalysispage","Data_photosInterior_trim","Data_photosColors","Data_carReviews_trim","Data_carReviews","Racecalendar","Teamstandings","Data_photosColors_trim","Stockdetails","Data_interiorFeatures_trim","Data_exteriorFeatures_trim","Calendar","TeamStats","Movieshowtimes","Drafts","Data_technologyFeatures_trim","Data_workoutdetails_collection","Data_photosExterior","Data_photosExterior_trim","Data_photos360Interior","Immersivechartsmarketspage","Returnoninvestment","Indexdetailsrelatedpage","Gonepage","Data_compare","Data_compare_trim","Data_options_trim","Entitiespage","Workoutdetailsprint","Data_photos360Exterior","HomepageDatacarfinder","Data_photos360Interior_trim","Data_skeleton","Mortgagerates","Brackets","Data_photos360Exterior_trim","Data_photocompare","HomepageWeather10day","Data_performance","HomepageWeatherextendedforecast","Savings","Data_exteriorFeatures","Data_interiorFeatures","Data_options","Travelgonepage","Recipe","Getportfoliodatapage","Brokercenterpage","Data_technologyFeatures","Tvlistings","Ownerstandings","Entitydetailspage","Creditcards","Cmssitemap","Externalnativeadpage","Autoloans","Externalcontent","Htmlsitemap","CustomColumnPageNames","TrendingTopics","GlobalSettingsPage","MyTopics","WeatherPlaces","MyFavorites","TopicResult","Collections","Rouxbe","ShoppingList","MyHealthReportsPage","Error404page","AppsPromotion","Error500page","DietTrackerPreSigninPage","ExerciseTrackerPreSigninPage","WebSlicePage","Error200Page","AboutUsPage","UnSupport","Disclaimer","TermsOfService","SevereWeather","SubjectSectionPageNames","TeamhomePage","PlayerPage","MarketMoversPage","CommoditiesPage","ChefPage","NutritionIndexPage","FinanceTechnologyPage","MedicalindexPage","SiteSearchPageNames","SearchResultsPage","VideoSearchResultsPage","PartnerVideolistPage","HomepageBingserpIframepage","SitesearchSitesearch","SearchResults","SerpPage","FindaMoviePage","SectionFrontPageNames","Competitionhub","Local","Stockscreener","Toolslandingpage","Showtimes","FinanceRealEstatepage","CookingSchool","Allcompetitions","Newspage","CocktailHub","Travelflightsearchhubpage","Hotelshubpage","WineHub","ChefHub","Travelflightstatushubpage","HomepageCompetitionhub","SecfrontHotel","SecfrontTNews","TelemetryProduct","Spartan","Prime","PrimeMobile","IEext","SpartanMobile","TabbedShell","ChromeExt","Downlevel","Xbox","ContentPlacedBySource","Editor","Bing","AutoCuration","User","AppNexus","OtherSponconProvider","TelemetryPageConfiguration","NoContent","OneBox","TopSites","Suggested","ContentFeed","WinFre","StripeLayout","TelemetryPageMode","Default","Trial","Subscription","Apps","News","Timeline","StartMenu","MMX","Shell","Edge","Cortana","Aad","Msa","MsaKids","telemetryType","prop","getTelemetryBehavior","TelemetryActionType","Click","Hover","Submit","RightClick","pageType","telemetryPageNameObject","EnterpiseFlightId","OfficeDefaultPivotFlightId","HeadData","clientData","enableCMSPPEConfigs","initializeHeadData","locale","marketDir","currentFlights","userIsSignedIn","isPreload","isAppcache","isEnterprise","isOfficeDefaultPivot","isServiceWorkerCache","ssoComplete","_instance","headData","initializeFromData","locationSearch","htmlElement","headElement","initializeFromDom","initializeFromStorage","serviceWorker","controller","updateStorageActivityId","language","toLocaleLowerCase","setQueryItemProvidedValues","headDataJs","headJs","anonckname","signedin","getQueryParameterByName","setIsEnterprise","setIsOfficeDefaultPivot","storedActivities","getItem","storedActivityIds","ClientSettings","pagetype","setFlights","clientInfo","dataClientSettings","pageTypeFromSettings","responseFromStorage","parsedResponseFromStorage","currentPageStoredHeadData","storedClientSettings","storedFlights","aid","existingLastUsedActivityIds","currentPageLastUsedActivityId","id","previouslyUsed","activityIdToStore","ts","getTime","setItem","flightString","exec","IsEnterprise","includes","audienceMode","Enterprise","queryItems","getParamsWithItems","cmsItem","find","item","setCurrentFlightsTestOverride","flights","IsOfficeDefaultPivot","getHeadData","getInstance","resetInstance","getActionPayload","connector","args","experienceInstanceId","stateKey","dispatchAction","payload","store","dispatch","PageBase","ActionDispatchCancellationToken","isCancelled","cancellationToken","isCancellationRequested","observers","perfTimeline","tryGetPerfTimeline","actionEndMeasure","startMeasure","endMeasure","dispatchResult","getDispatchResult","Array","forEach","observer","log","renderActionPayload","ConnectorConstants","renderAction","super","connectorInstance","rootReducer","logSamplingRate","GET","Ctag","Comscore","Exp","ResetIdx","UrlUtility","primeForbiddenCharacters","getParamsFromUrl","decodeComponents","getParams","decodeURIComponentWithPlusSign","decodeURIComponent","queryString","startsWith","substring","queryArray","ndx","parts","queryKey","queryValue","newParam","existingParam","entry","encodeURIComponentForPrime","uriComponent","encodeURIComponent","findIndex","paramsObj","paramArray","keyValuePair","getParamsObj","isValidUrl","validateScheme","keyValueArrayToQueryString","kv","isKeyValuePair","map","joinSubpathToURL","subPath","trimmedEndSlashFromHref","trimmedStartSlashFromSubpath","URL","updateSearchParam","searchParams","set","appendSearchParam","fallback","append","getAbsoluteUrl","partialUrl","locationHref","jssMapKey","renderCacheKey","renderCacheExpirationKey","defaultExpirationTimeMs","riverRcClassName","doc","otherWhitespaceRegex","trimRegex","attr","nodeName","text","textContent","innerText","children","parentNode","className","customTarget","srcElement","connectorStateKey","dataConnectorMergeInitAction","defaultPubSub","PublishSubscribe","channels","getChannel","channel","pubMap","sub","listeners","unsub","pubChannel","subChannel","unsubChannel","RequestData","canUseCssGrid","global","resetRequestData","getRequestData","severity","Alert","pb","build","BUILD_NUMBER","ServiceUiError","OneServiceCardProviderAppErrors","NoAlert","OneServiceResponseWasNullOrErroneous","ErrorFetchingOneServiceResponse","HighImpact","InvalidJsonInOneServiceResponse","InvalidFeedListInOneServiceResponse","RiverConfigurationIssue","QueryInterestContentFetchError","StaticContentLoaded","ContentPreviewAppErrors","ErrorWhileFetchingContentPreviewContent","InvalidResponseFromContentPreviewFetch","InvalidResponseFromContentPreviewResponseJson","ErrorWhileInitializingAsyncContentPreviewContent","InvalidOrMissingContentId","MissingDataForExternalContent","RiverAppErrors","UnknownMetadataReceivedFromRiverCardProvider","RiverContentProviderFetchException","UnableToSelectSectionTemplateForGivenChildExperiences","InvalidConfig","ChildLoadError","InitialDataLoadError","DuplicateInstanceIdWarning","UserInitiatedPageRefreshErrors","SportsCardError","SportsLeaguePdpFetchError","SportsLeaguePdpInvalidResponse","SportsPlayersPdpFetchError","SportsPlayersPdpInvalidResponse","SportsTeamsPdpFetchError","SportsTeamsPdpInvalidResponse","SportsCardConfigFetchError","SportsCardGetFavoriteTeamDataError","SportsCardGetPlayerBioError","SportsCardGetLeaguesGamesArrayError","SportsCardGetPdpDataFailure","SportsCardGetLeagueSeasonYearDataFailure","SportsCardGetLocalizedTeamNameDataFailure","SportsCardGetTeamDataFailure","SportsCardGetLeagueDataFailure","MoneyCardError","MoneyQuoteSummaryGetError","MoneyQuoteSummariesGetError","MoneyPdpDataGetErrorFromService","MoneyPdpInvalidResponseFromService","MoneyQuoteSummaryGetErrorFromService","MoneyQuoteSummaryInvalidResponseFromService","TrendingNewsErrors","DataFetchError","BackupDataFetchError","GridSectionAppErrors","GridSectionCardGenerationError","PageClickTrackerErrors","InvalidResponse","FetchFailure","CoachmarkAppErrors","GeneralError","NotPlaceable","NotFoundComponent","CoachmarkDataConnectorUndefined","CoachmarkDataAppErrors","InvalidCoachmarkMessage","IrisDataConnectorUndefined","NoSurfaceFoundForCampaign","ErrorFoundForSurface","TelemetryInfoUndefined","EventTypeUndefined","IrisActionUndefined","SpotlightPreviewAppErrors","ErrorWhileFetchingSpotlightPreviewCardInfo","NoServiceContextMetadata","SpotlightErrors","UnknownError","ContentFetchError","CardActionErrors","CardActionBaseExperienceError","CardActionPostActionError","CardActionDeleteActionError","CardActionGetActionError","CookieRelatedErrors","SharedStateConnectorNull","OverlayErrors","LoadExperienceError","ViewsCommonAppErrors","InvalidIntraArticleDataError","InvalidDocumentContentError","ViewsPaddleDataLoadError","ViewsErrorPage","ProviderMapperError","ContentActionsToolbarAppErrors","ContentActionsSharingToolbarLoadError","ContentActionsArticleDatafetchError","ContentActionsBaseExperienceError","ContentActionsGetDocumentDataError","ContentActionsGetContentStatusActionError","ContentActionsDeleteActionError","ContentActionsPostActionError","ContentActionsExperienceLoadError","ContentActionsFlipToolbarError","ContentActionsContentStatusFetchError","ContentActionsContentPreviewFetchError","ContentSharingToolbarAppErrors","ContentSharingToolbarInitializationError","ContentProviderAppErrors","InvalidSourceIdError","ProviderDetailsFetchError","ProviderFeedFetchError","InvalidLayoutTemplate","ViewsGalleryAppErrors","InvalidGalleryIdError","GalleryDataLoadError","GalleryImagesLoadError","VideoListAppErrors","VideoListDataLoadError","ViewsArticleAppErrors","InvalidArticleIdError","ArticleDataLoadError","IntraArticleComponentLoadError","InlineGalleryInvokeError","InterestsSearchAppErrors","ErrorResponseFromOneService","ErrorResponseFromOneServiceIsInvalid","InvalidUrlFoundForElement","SelectedItemNotFoundInSuggestions","SelectedItemIsInvalid","InterestsAppErrors","InterestsRetrieveTopicsError","InterestsRetrieveFollowedTopicsError","InterestsRetrieveMutedPublishersError","InterestsUnMutePublisherError","InterestsFollowTopicError","InterestsUnfollowTopicError","InterestsTopicStateUndefined","InterestsShouldHaveRendered","InterestsRetrieveTopicError","InterestsRetrieveSavedStoriesError","InterestsSavedStoriesInvalidConfigError","InterestsSavedStoriesChildLoadError","InterestsSavedStoriesInvalidJsonError","InterestsSavedStoriesInvalidListError","InterestsRetrieveRecommendedTopicsError","UndefinedTopicDataConnector","InterestsRetrieveReadStoriesError","InterestsReadStoriesInvalidConfigError","InterestsReadStoriesChildLoadError","InterestsReadStoriesInvalidJsonError","InterestsReadStoriesInvalidListError","FailedRestoringDefaultTopicsError","TopicsFailedIndexedDBConnection","TopicsFailedGettingIndexedDB","TopicsFailedUpdatingIndexedDB","ComponentConnectorAppErrors","DuplicateChildInstanceFound","BundleLoadError","ChildConfigInfoListNull","ListStartPositionInvalid","ChildDelayLoadError","ExperienceDependencyTimeout","ExperienceLoaderAppErrors","InsufficientLoadArgs","SearchError","PollsCardAppErrors","PollsListFetchError","PollDataFetchError","PollsCardInvalidPoll","PollsCardInvalidQuizPoll","PollsCardVoteError","PollsCardMapStateToPropsError","PollsUnknownError","MonetizationAppErrors","PlacementManagerLoadError","ArrangementPositionLoadError","GetCMSContentError","GetSAMRTBResponseError","MediaNetEOABError","InvalidPromoModuleConfig","CookieSyncDownloadExternalScriptError","CookieSyncMissingExternalScriptUrl","CookieSyncTimeout","CookieSyncPartnerScriptError","CookieSyncPixelPartnerDownloadError","CMSOrBackfillNativeAdLoadError","MissingRequiredPropertyPlacementManagerConfig","NativeAdTargetScopeError","RiverVideoAdPartnerError","JsTrackerPartnerScriptLoadError","ViglinkError","MissingTopicId","TopicIdNotFound","GetSAMRTBResponseErrorNoAlert","DisplayAdsOathLoadError","DisplayAdsApnLoadError","DisplayAdsApnEmptyProvider","DisplayAdsAdsDetectionNotInit","DisplayAdsMoatLoadError","DisplayAdsNoAdObjects","DisplayAdsProviderIdEncode","TaboolaRiverAppErrors","TaboolaRiverFetchError","CoreLibAppErrors","DeprecatedCompositionLayoutUsed","InvalidColumnInGridConfig","ErrorLoadingBundle","GenericJSException","LocalStorageDoesntExist","SessionStorageDoesntExist","ResolverAppErrors","IndexedDbWriteFailed","IndexedDbReadFailed","CrsFetchFailed","ReceivedConfigFromCdnAsCrsFetchFailed","GetConfigException","IndexedDbBulkReadFailed","IndexedDbFailedToRemoveCachedConfig","IndexedDbFailedToClearAllCachedConfigs","RenderCachePurgedDueToChangesInConfig","FailedToPurgeRenderCache","RefreshConfigCacheFailed","IndexedDbInitFailed","DifferentCbid","BingCardsAppErrors","BingCardGetHotelAnswersError","BingCardGetHotelErrorFromService","BingCardGetAnswersError","BingCardInvalidEntityType","BingCardErrorOut","BingAnswersAppErrors","FailedToLoadData","NoCardsContentType","NoCardsRelated","BingShoppingLifestyleCardError","LifestyleShopCardServiceFetchError","LifestyleShopCardServiceFetchInvalidResponse","LifestyleShopCardServiceEmptyResponse","LifestyleShopCardServiceInvalidResponse","LifestyleShopCardCdnServiceFetchError","LifestyleShopCardCdnServiceFetchInvalidResponse","LifestyleShopCardCdnServiceInvalidResponse","LifestyleShopAutosuggestServiceFetchError","LifestyleShopAutosuggestServiceFetchInvalidResponse","LifestyleShopAutosuggestServiceEmptyResponse","LifestyleShopAutosuggestServiceInvalidResponse","LifestyleShopAutosuggestInvalidSuggestionUrl","OneServiceContentDataConnector","FailedToUpdateBypassValueConnectorNotInitialized","FailedToGetBypassValueConnectorNotInitialized","NotificationBellErrors","JsonParseError","NewsItemDataFetchError","MalformedNewsItemResponseError","RecommendedSearchErrors","ResponseParsingFailed","InvalidJsonResponse","ServiceCallFailed","RenderFailed","Timeout","ElectionResultMapConnectorErrors","ElectionResultMapInspectorErrors","EmptyResultSummaryError","ElectionResultMapErrors","FetchAndUpdateElectionDataError","ElectionDelegateCounterErrors","WebWorkerErrors","FileNotFound","RuntimeError","MessageTimeout","HandledError","IrisErrors","IrisUnknown","InvalidQParams","ArcCallFailed","ArcResponseNotOk","ArcResponseUnparsable","MissingAppEnv","UnknownIrisErrorFound","TimeoutIrisErrorFound","TemplateIrisErrorFound","ClientErrorIrisErrorFound","DSourceIrisErrorFound","ActionCallFailure","ActionFetchFailure","ActionResponseFailure","UncaughtErrorDetected","UnconvertableCreative","InvalidResponseFormat","AbortErrorDiscovered","UnparsableSingleResponseJSON","IrisDataConnectorErrors","SubscriberNotFound","CreativeCountNegativeOrZero","ErrorFetchingSurfaceInfo","SubscriberNotFoundInIrisPlacementDictionary","RenderCacheErrors","JssStyleMismatchWarning","JssStyleCriticalMismatchError","PreloadReportingMessages","TtvrMissing","TfprMissing","TtvrSearchBoxMissing","TtfSearchBoxMissing","PushNotificationsLibErrors","FetchKeyError","SubscribeUnsubscribeError","ContentTruncationErrors","OverTruncationError","AppEnvironment","_serviceUrl","_configServiceUrlBase","initializeAppEnvironment","environmentConfigUrl","process","env","WEBPACK_DEV_SERVER","URLSearchParams","searchParam","contentServiceUrlBase","currentRequestTargetScope","currentMarket","environment","assetsHost","hostPage","appType","authCookieName","accountType","aadDataPromise","buildVersion","isDebug","showMnsCreatorDashboard","currentContentLinkHost","serviceUrlBase","feedServiceUrlBase","isFrePage","rootTelemetryId","disableCachingConfigs","enableConfigService","EnableCMSPPEConfigs","isMultiConfigRetrievalEnabled","disableContentPreviewCache","sendFeedCallActivityIdInHeader","queryParamOverride","disableContentCacheIDBRead","disableContentListCache","disableContentListCacheIDBRead","configServiceBaseUrl","featureFlags","configRootUrl","cacheBustingIdentifier","countryCode","latitude","longitude","configServiceUrlBase","appEnvironment","environmentFromHeadData","tryReformatGuid","v","Locale","apps_locale","geo_country","geo_lat","geo_long","setAccountType","apptype","getAuthCookieName","disableActivityIdInHeader","cbid","rootElement","locationOrigin","envQSOverwrite","prod","feedBaseDomain","getHostPageFromUrl","endsWith","muidCookie","Number","trackPageProd","trackPageTypeVal","createContentLinkHost","setTargetScope","useMultiConfigsRetrieval","getConfigServiceBaseUrl","relativePath","int","urlQuery","param","Hub","MicrosoftNews","Views","Anon","EdgeChromium","AppAnon","chrome","authPrivate","getPrimaryAccountInfo","accountInfo","SignedOut","account_type","setAadDataPromise","MSA","AadDataPromise","tokenAcquireParameters","account_id","client_id","scope_or_resource","acquireAccessTokenSilently","acquireResult","token","access_token","errorInfo","error_info","isSuccess","is_success","isValid","is_token_valid","ZHCN","guid","matches","match","Kids","Adult","browser","deviceFormFactor","domain","os","platform","Web","stringHasData","CurrentFlights","pageExperiments","getAppEnvironment","tryParseJson","jsonString","tryParseInt","defaultValue","parseInt","isNaN","obj","isRecursive","arr","isArray","toString","Logger","setupBrowserEnvironment","isDebugEnabled","webpackRequire","setupNodeEnvironment","windowObj","logger","Info","Browser","setupLogLevel","NodeJs","getMessage","infoCallback","setLevel","setupAppenders","removeAllAppenders","addAppender","getLevel","nameRegEx","queryNameValueMatches","RegExp","defaultInstance","updatePageInstance","form","refigInputs","setRequestId","newRequestId","eventName","AppType","SignedInStatus","AadAccountType","Utility","isNotNullOrUndefined","isDefined","potentialKeyValuePair","isKey","isValue","isNonNullObject","isNotNull","isNullOrWhiteSpace","trim","toNumber","arrayHasData","constructor","objectToString","firstRun","attribute","MilestoneDataActions","_updateAboveTheFoldVisuallyReady","_updateBelowTheFoldTransitionStart","_updateExperienceLoadDeferralState","_updateExperienceCurrentState","_updateExperienceRenderDeferralState","_updateInitTiming","_updatePageComplete","_updateRenderTiming","_updateVisuallyReadyTiming","_updateDomCompleteTiming","_updateMilestonePlugins","ExperienceLoadingState","queuedCalls","pageRevealed","trackValuesUpdated","checkAndFireQueuedCalls","visibilityState","onVisibilityChange","removeEventListener","_connectorMap","_globalConnectors","_allConnectors","_getDataConnectorPendingPromises","Map","reduce","dataConnector","pendingPromise","resolveCallback","rejectCallback","state","actionPayload","newState","stateChanged","typeIsString","statePropertyKey","connectorState","experienceFullNamespace","dataConnectorName","initializeExperience","isGlobal","merge","connectorReducerResult","computeNextStateForConnector","reportStateChange","keys","fullNamespace","has","delete","connectorPreviousState","nextStateForConnector","subReduce","reducer","connectorStateChanged","previousState","reducedState","designSystemMap","WeakMap","designSystemIndexMap","createGenerateClassName","designSystem","dsName","dsIndex","rulesMap","rule","sheet","initialState","enhancer","middlewares","__REDUX_DEVTOOLS_EXTENSION_COMPOSE__","trace","traceLimit","_rootReducer","needsHydrate","_store","connectors","onApplicationStart","connectedTopLevelElement","hostElement","updateJssManagerInstance","pageTimings","hydrate","SSR","startMark","render","jssInstance","plugins","jss","savedMuid","getCookie","cookie","getMuidCookie","setRequireFunctionalCookie","expiryDays","path","secure","expiryDate","builder","date","setTime","toUTCString","WebStorage","storage","supported","parsedObj","removeItem","logError","matchingKeys","storageKey","localStorage","ex","trackAppErrorEvent","sessionStorage","Environment","getEnvironmentFromString","int1","intpr","intpef","Size1ColumnWidth","Size2ColumnWidth","Size3ColumnWidth","Size4ColumnWidth","GutterSize","aadTokenQsKey","aadTokenQsVal","useEnterpriseCompliance","sharedStateConnector","SharedState","getCurrentState","resolveAadToken","aadData","resolveAadData","useEnterpriseDomain","_pageTimings","getPageTimings","incrementCounter","counterName","existingCount","ColumnArrangement","minViewportWidthOverrides","ColumnArrangementDefinition","arrangement","contentSizePx","isFirstBreakpoint","widthOverride","contentBufferPx","columnArrangements","c1","c2","c3","c4","columnArrangementMap","columnArrangementDefinition","getMediaQuery","minArragement","maxArrangement","queries","minWidthPx","minViewportWidthPx","maxArrangementDefinition","maxArrangementIndex","getMediaQueryFor","columnArrangement","getMediaQuerySelector","mediaQuery","getMediaQuerySelectorFor","requireAsync","moduleName","require","dataConnectorToExperienceKeyMap","createStatePropertyKey","dataConnectorInjector","registerInjection","experienceSet","Set","add","appState","experienceStatePropertyKey","initialDataConnectorState","dataConnectorNamespace","newDataConnectorState","experienceKeys","experienceKey","experiencePreviousState","renderCacheObject","batchCSS","batchCss","styles","dataset","innerHTML","scrapeDom","includeNewsFeed","root","rivers","getElementsByClassName","river","outerHTML","getStateFromRenderCache","renderCache","cacheExpirationTimestamp","parsedCacheExpirationTimestamp","renderCacheStorage","batch_css","getRenderCache","reduxStoreStringifyReviver","dataType","oneServiceScope","AudienceModeType","chromeMetadata","metadataType","pid","threadId","metadata","ph","tid","chromeInstantMarker","category","timeStampMs","chromeMarker","auxData","marker","cat","calculateTimelines","measures","async","timelineGroups","groupBy","measure","timelineName","timelineList","maxValue","groupName","timeline","sort","info1","info2","from","to","timeline1","timeline2","mergePageTimings","asyncExperiences","matchRegex","startSuffixRegex","endSuffixLookup","processedKeysToRemove","startSuffixMatch","measureName","endKey","endValue","thisTimelineName","prefixSuffixMatch","keyToRemove","tryCreateAsyncPID","nextPID","KeyCounter","timelineCount","count","getCount","timelineKeyCount","startSuffix","endSuffix","instanceId","addPerfMarks","addPageTimings","markerCount","qualifyKey","oldMeasureName","qualifyMeasureName","newMeasureName","coreMarkerName","dynamicMeasureName","startTime","now","timelineNameAtStart","measureNameCore","formatMeasureName","startMarkerName","singleMark","updatedDynamicMeasureName","endTime","endMarkerName","funcName","func","bindingContext","_this","promiseName","getPromise","coreMeasureName","dynamicMeasureSuffix","markerName","mark","startMarker","endMarker","experiencesForPerf","experiencesExcludedForPerf","addPerformanceMarks","trackAllExp","enablePerfTimeline","perfTimelineInstances","experienceName","shouldTrackPerfTimeline","instanceKey","getInstanceKeyCore","renamePerfTimeline","newExperienceName","oldInstanceKey","getInstanceKey","rename","newInstanceKey","getExperienceMeasures","pageMeasures","getPageMeasures","_getAppPerfTrace","nonZeroResources","getEntriesByType","duration","regex","resourceGroup","remainingResources","entryIndex","pathname","mergeResourceTimings","destinationMeasures","sourceMeasures","mergePageMeasures","_appTimings","chromeTrace","key1","key2","sort_index","timelineIndex","measureIndex","substr","fromMs","toMs","showInParentThread","chromeAsyncMeasure","dur","chromeSyncMeasure","expPerfQsp","expName","expPerfSkipQsp","initExperienceDiagnostics","ConnectorNamespaces","OneServiceUtility","getOneServiceParamsWithoutAuth","ocidSpecifier","addPageInfoToOcid","ActivityId","getOneServiceOCID","TrackInfo","CurrentMarket","runningExperiments","getOneServiceHeaders","headers","aadToken","authenticationTicketType","signedInCookieNameHeader","userLocationHeader","serviceRequestOnComplete","serviceRequest","callbackMethod","getOneServiceParamsWithAuth","toUpperCase","getOneServiceFeedCallHeaders","SendFeedCallActivityIdInHeader","getLocationParams","Latitude","Longitude","getBaseRequestData","method","getCommonParams","UserIsSignedIn","UserId","Market","DoubleTap","EmptyMruDark","EmptyMruLight","EmptyPinnedDark","EmptyPinnedLight","EmptySharedDark","EmptySharedLight","NotificationFivePlusSign","NotificationRefreshArrow","SubnavTabId","icon","icon_inline","props","handledProps","ariaLabel","fill","glyphType","managedClasses","onError","wrapperClassName","svgComponent","setState","ReactComponent","prevProps","LazyLoadedSvgComponent","attrProps","generateClassNames","role","style","wrapperCss","renderSvgComponent","HostPage","pathnameSegments","topDomainName","originalUrl","categoryKey","verticalKey","hostName","topDomain","indexOffset","subcategoryKey","guidGen","timestampSeed","seededRandom","random","floor","AuthCookieExistsCookieName","isWebWorkerPresent","messages","logAppError","getFromWebWorker","timeoutInMs","defaultResponse","fetched","promiseTimeout","timeOutPromise","endGetFromWebWorker","errorMessage","customMessage","webWorkerPromise","response","webWorker","postMessage","race","sendToWebWorker","subscribeWebWorkerNotification","override","_isWebWorkerPresent","onmessage","pendingMessage","userNavigatingAway","isUserNavigatingAway","MockLRUCache","cacheMap","maxAge","StartMarkSuffix","PerfMarker","endMarkSuffix","initialize","instance","measureStartEnd","endMark","perfMarkers","perfEntries","perfMarkerDetail","PerfMarkerDetail","processPerfEntry","perfMarker","perfEntry","firstStartTime","getTrack","MediatorEventNames","ContentActionsUpdated","FeedFollowed","ForcePageReload","FollowedTopicsUpdated","MediatedCoachMark","TabNavigation","TabNavigateTo","TopicAction","Msn360","CardActionInit","CardActionPost","InterestsRenderComplete","RenderXFeed","ShowPivotById","ResumeInfopaneAutoRotate","IntraArticleComponentPosition","IntraArticleComponentType","getTrackExtCompleteCanary","trackingResolved","trackingObject","trackExtCompleted","trackEventBuffer","trackImpressionBuffer","trackAppErrorEventBuffer","trackingPromiseCalled","sendTrackingCall","destination","headline","trackEvent","sendPartialPageRequest","visibilityCheck","trackPartialImpression","sendTrackAppErrorEvent","appError","errId","errSource","errMsg","processPendingTrackingCall","eventObj","handleTelemetryCall","handlePartialPageImpressionCall","handleAppErrorEventCall","getMediator","ActionHandler","actionMap","actionMaps","actionPayloadType","String","Telemetry","parentTelemetry","childTelemetry","parentIndex","telemetryName","initTelemetryProps","resultTelemetryProps","createProps","setChildProps","rootTelemetryIndex","rootIndex","getNewIndex","ordinalTracker","ordinal","childIndices","childOrdinalCounter","savedProps","componentProps","initializationProps","resetChildProps","f","h","headlineIndex","vertical","filteredResult","tags","userFacingText","telemetryIndex","oldProps","newProps","telemetry","0","SubnavTabName","Interests","MyFeed","XFeed","handler","unbind","sequenceTokens","sequenceValues","\"","urlPart","ch","navigation","getUrl","relativeUrl","navigate","getHostName","parseUrl","isLocal","supportMultiple","mergeQueryStringParams","newParams","urlParts","decodeURIComponentAndPlusSign","anchor","port","hash","locationHost","domainParts","reverse","hostDomain","windowsStoreHost","domainMatchPattern","ocidMatchPattern","ccidMatchPattern","msnOcid","storeOcid","storeocid","addCcidToStoreUrl","tHref","emsAdId","ccidMatch","ccidOnUrl","hashIndex","hashValue","storeUrl","ccidData","webig","muid","addOcidToHref","emsOnUrl","endOfScheme","locationOfStore","isStoreUrl","ocidMatch","ocidOnUrl","initStoreUrl","emsMatch","domainMatch","hrefHostName","linkUrl","modifyValuesForTrackPage","preventComscore","personalization","attachTaglineClickHandler","getActionResult","action","isSuccessful","refreshPageLoad","domName","getParent","getChildren","recipients","lastClickedTarget","clickTargetResetTimeoutInMs","tEvtTag","regExpEventName","impressionCache","trackAll","implementationMethod","implementation","defOpts","defaultOpts","disableOnAutoRefresh","names","isInList","AR","isGeneratedEarly","depthFirstChildAttribute","attributeName","skipElement","altValue","localName","countAllTrackableLinks","getChildByTargetElement","depth","dataLength","subChild","trackAppErrorEventInternal","errorParams","report","msg","isError","setAppErrorTrackInfo","trackFormSubmitEvent","campaign","getSearchTerm","contentAction","jquery","customHandled","elemHref","dataHlValue","headlineElement","findCMValue","previousCM","curId","getContentElementIndex","clsGT1","$1","moduleInfo","nameLineage","ordinalLineage","lineageDelimiter","actionType","behaviorType","moduleInfoJson","elementTelemetryLineage","nameLineageArray","ordinalLineageArray","telemetryObject","parseDomAttributeJson","getLineage","time","duHostname","track","filterUrlParams","destinationUrl","contentModule","contentElement","campaignId","sourceIndex","nLineage","oLineage","trackPageInternal","overrideParams","telemetryPageType","ar","trackingHelper","preventBeacon","errorObject","onContextMenu","trackClickEvents","onClick","button","trackAdEvent","adParams","adWidth","w","adHeight","dst","den","pg","status","anAd","seqid","sdk","fen","trackVideoEvent","isInline","defaultParams","canvas","serverImpressionGuid","department","subDepartment","cleanParam","removeNullOrEmptyParams","eventSource","trackFeedbackEvent","feedbackParams","submitValue","otfPackage","getFeedbackTrackingParams","createEvent","createEvt","sendPageViewCandidate","pvUrl","sendSinglePageViewBeacon","beaconId","clearImpressionCache","blackList","splitedUrl","outputUrl","paramsString","contains","trackPartialImpressionInternal","trackPage","trackThirdPartyUpdate","register","trackingImplementation","samplingRate","getCurrentPageRequestId","mapTelemetryParams","common","commonMap","paramsMap","groupKey","groupValue","trackInfoGroupKey","clientParams","formElem","events","trackPageRefresh","dataAttr","array","elements","domElement","telemetryChildren","findTelemetryElements","impressionContent","mech","getClickEventFromUrl","targetUrl","evtName","curUrl","getEventFromUrl","targetElem","initEvent","createEventObject","useMap","activeElement","ServiceWaffleAutomaticClickTrackingDisabled","appLauncherElement","hasAttribute","currentTarget","isClickedTwice","preventDefault","returnValue","preventEventDefault","isPropagationStopped","overrideClickTelemetry","scr","d_dgk","subcvs","cvs","contentid","entityId","cu","isSignedIn","ViewsStringResource","article","image","video","gallery","exitFullscreen","fullscreen","nextSlide","previousSlide","publishedSecondAgo","publishedSecondsAgo","publishedMinuteAgo","publishedMinutesAgo","publishedHourAgo","publishedHoursAgo","publishedDayAgo","publishedDaysAgo","gallerySlideError","sharingToolbarLoadFailure","invalidCMSIdErrorFormat","documentDataFetchErrorFormat","intraArticleComponentErrorFormat","gallerySlideCountFormat","gallerySlideCountFullScreenFormat","seeOnProviderSite","socialFeedNotSupported","articleReadMoreText","TelemetryBase","TelemetryTypes","ContentTypes","prodAssets","cnProdAssets","ENV","segments","initializeHybridPublicPath","ExperienceState","ChildExperiencesDeferRenderType","CommonActions","renderExperience","ActionMap","dataConnectorMergeInit","ValidatorSectionName","apptypeValidator","expValidatorMap","getAllValidators","expConfig","size","childExpValidatorMap","expMap","originalConfig","tempConfig","validatorName","childExpValidator","validator","expConfigMap","cloneDeep","filterConfig","riverGridChildren","childElems","childExp","configInfo","childExperienceConfigInfo","experienceType","sectionName","removeFromRiverGridChildren","configIndexHref","parentStore","experienceConnector","experienceComponent","$experienceType","isDataConnector","uniqueId","configResult","configPromise","instrumentPromise","getConfig","properties","loaderPromises","bundlePromise","loadExperience","bundleModule","initMeasureEnd","updateExperienceLoadedMilestone","config","ExperienceConnector","ExperienceReducer","app","experienceNamespace","experienceConfigInfo","experienceParentNamespace","experienceStore","configHref","connectorProps","loadConnector","connectComponent","milestoneDataConnector","updateExperienceCurrentState","getActionSender","send","loaded","ConfiglessConnectors","BingImageData","OneServiceContent","TelemetryData","TopicData","PageClickTrackerData","DataConnector","childMap","telemetryProps","telemetryTags","$experienceGroup","$connectedComponent","$componentInstance","$renderIfOffline","$maxWaitToBatchRenderChildExperiences","$milestoneDataConnector","onExperienceMilestoneTimingUpdate","milestoneType","ExperienceMilestoneEventTypes","domComplete","updateDomCompleteTiming","initialized","updateInitTiming","rendered","updateRenderTiming","visuallyReady","updateVisuallyReadyTiming","onAppError","selectComponentState","namespaceArray","configNamespace","processConfig","childComponentList","componentInstance","ownProps","stateProps","dispatchProps","mnsDashBoardProps","ShowMnsCreatorDashboard","componentToConnect","onLine","connectMeasureEnd","WrappedComponent","onComponentConnect","Component","lastRenderEndMeasure","mapStateToProps","instrumentFunc","mapDispatchToProps","mergeProps","connectedComponent","pure","experienceInfoList","mergeStartPosition","additionalChildExperiences","ordinalBlockForCurrentColumn","getOrdinalObjectForCurrentBreakpoint","mergeEndPos","childArrangementMetadata","childExpArrangement","positionProps","experienceArrangement","startPosition","insertAt","experienceInfo","initialProps","$connectorProps","isEmpty","getChildTelemetryItem","onAppErrorCallback","loadDataConnectors","injectedDataConnector","injectedDataConnectors","onLoadChildExperiences","baseExperienceConfig","childrenConfigInfo","composition","ExperienceCompositionTypes","horizontalStack","layout","page","grid","column","childType","ChildrenTypes","peregrineExperience","child","rows","row","columns","itemType","customExperience","customConfig","experience","loadChildrenExperiences","childConnectorProps","childExpsToLoadImmediately","reRenderCallback","readyExperienceToRender","promiseDependency","startProcessingChildExperience","dataConnectors","dataConnectorForCurrentScreenType","loadDataConnector","childConnector","getChildExperienceConnector","Failed","addConnectorToChildMap","childExperienceType","childExperienceInstanceId","screenTypeObjList","currentColumnArrangement","getMetadataByScreenWidth","ScreenWidth","OneColumn","TwoColumn","ThreeColumn","FourColumn","Any","screenWidth","loader","getConnectedExperience","getChildExperienceConnectorProps","getNewComponentInstance","removeCachedConfig","milestoneDependencyToLoadChildExp","shouldResolve","addTimeout","deferralType","CustomEventBasedDeferral","Unknown","resolveDependency","loadAndRenderExperience","childExpInfo","delayLoaded","milestoneDependencyToRenderChildExp","ReadyToRender","reRender","childExperiencesRenderType","batch","reRenderExperience","dependency","pending","timer","PrimeIntegrationConstants","userActionErrorCoachMarkId","Mediator","getActiveTabValue","activeTabValue","activeTab","tabNameToTabId","registerForTabChangeEvent","shouldCallCallbackImmediately","sendActiveTabToCallback","None","tab","_perfMarker","tabIdToTabName","registerContentActionsUpdatedEvent","registerCardActionEnableEvent","initData","registerCardActionPostEvent","postData","registerForFollowButtonClickEvent","followButtonData","topicId","isFollowed","registerForInterestsRenderCompleteEvent","publishEventForPrime","renderUserActionErrorCoachmark","refElement","hideCoachMark","coachMarkId","IndexedDb","idb","searchObj","IDBObjectStore","getAll","idbPromise","req","withIdbStore","storeCallback","isGetAllAllowed","returnArray","openCursor","onsuccess","cursor","continue","put","clear","idbVersion","idbStoreName","dbName","preInitializedIdbPromise","storeName","endOpen","openreq","open","onupgradeneeded","createObjectStore","operationName","db","endOperation","transaction","oncomplete","onabort","objectStore","loggingService","maxRetries","baseRetryDelayInMs","maxRetryDelayInMs","factor","minOffsetInMs","maxOffsetInMs","loggedExceptionManager","LoggedExceptionManager","logInvalidParams","defaultMaxRetries","defaultBaseRetryDelayInMs","maxAllowedRetryDelayInMs","defaultFactor","defaultMinOffsetInMs","defaultMaxOffsetInMs","minTimeout","maxTimeout","serviceCall","requestInfo","activity","tryRequest","maxAllowedRetries","fatal","currentRetry","timeoutServiceRequest","fractionDigit","offset","parseFloat","toFixed","half","plusOrMinus","delayWithOffset","min","pow","warnCallback","errorCallback","timeoutId","instrumentationService","exponentialBackoffRetry","retryCount","sendRequest","activityName","getInstrumentationService","activityLoggingService","createActivity","getExponentialBackoffRetry","executeRequest","endActivity","activityService","ActivityLoggingService","BrowserConsoleAppender","LogLevel","InstrumentationService","getLoggingService","FastBreakpointManager","callbackMap","refreshBreakpoints","defaultBreakpoint","breakpoints","indexToStandardConverter","currentBreakpoint","pop","breakpoint","update","managerCallback","subscribe","unsubscribe","_fastBreakpointManager","fastBreakpointManager","recreate","feedServiceUrl","getServiceUrl","initializationLogs","initializeServiceRequest","EnterpriseServiceUrlBase","ServiceUrlBase","getFeedServiceUrl","initializeFeedServiceRequest","FeedServiceUrlBase","getServiceUrlForSubpath","getFeedServiceUrlForSubpath","authEnabled","TabsHelper","tabId","tabName","resetCallbacks","registerResetCallback","forceStorageTimestampKey","jssGeneratedClassesMap","jssCaptureCompleted","removeRenderCache","removeObject","captureJssGeneratedClasses","renderCacheEnabled","serverCache","ServerCache","cache","reset","del","itemCount","_fullNamespace","selectState","_subspace","_perfTimeline","addSubReducerForConnector","_configHref","getState","globalConnectors","globalConnector","namespaceParts","connectorType","DeferralEventType","DynamicBundles","dynamicBundles","bundle","registerExperience","es6Import","CustomDeferralEventTypes","ExperienceDeferralEventTypes","defaultInstanceKeyName","defaultTimeValue","experienceDeferralDependencyMap","isExperienceDependencyResolved","experienceDependency","deferralEventType","deferralIdentifier","currentState","getMilestoneDataConnector","MilestoneData","getDefaultExperienceInstance","milestones","perExperienceMilestones","perInstanceMilestones","getExperienceLoadDelegate","deferralEventReady","loadAfter","aboveTheFoldVisuallyReady","isAboveTheFoldVisuallyReady","belowTheFoldTransitionStart","isBelowTheFoldTransitionStarted","getDeferralLoadEventReadyState","shouldLoad","getDeferralEventMetadata","waitForAboveTheFoldVisuallyReadyAsync","updateAboveTheFoldVisuallyReady","registerObserver","getExperienceRenderDelegate","renderAfter","getDeferralRenderEventReadyState","shouldRender","Boolean","deferralInfo","StandardEventBasedDeferral","peregrineFlightPrefix","getPeregrineFlights","cleanedUpFlights","lowercaseItem","SERVER_CACHE_TTL","SERVER_CACHE_CONFIG_STALENESS_TIMEOUT","currentTargetScope","CurrentRequestTargetScope","configMap","promiseMap","stalenessCheckTimestamp","localOverrideMap","initializeIndexedDb","memoize","_initializeIndexedDb","populateConfigMapFromIndexedDbAsync","_populateConfigMapFromIndexedDbAsync","initializeCaching","cdnConfigBaseUrl","ConfigRootUrl","EnvironmentConfigUrl","ConfigServiceBaseUrl","resolverErrors","configTimings","useWebWorkerToCache","indexedDb","useIndexedDb","enableIndexedDbInMainResolver","DisableCachingConfigs","isCachingAllowed","useServerCache","useConfigService","scopeWithPeregrineFlights","configServiceParameters","IsMultiConfigRetrievalEnabled","CacheBustingIdentifier","getConfigRetrievalMaxDepth","_cbid","containsDevOnlyQueryParameters","generateKey","configs","mergeWith","customizer","configIndex","configPaths","experienceRef","targetScopeMatched","overrideConfig","targetScope","audienceModeMatched","browserTypeMatched","deviceTypeMatched","domainMatched","experimentMatched","marketMatched","osMatched","pageTypeMatched","platformMatched","browserType","version","isString","experimentId","lhs","rhs","localeCompare","sensitivity","targetLocale","currentLocale","stringsEqualCaseInsensitive","srcValue","objValue","overrideEnv","typeVersion","_name","cacheKey","getCacheKey","startGetConfig","configFromMemory","addConfigTiming","existingPromise","processed","configEndMeasure","configSource","serializedConfig","configFromServerCache","cacheFetchDuration","isServerCacheConfigStale","storageTimestamp","logPrefix","networkReadPromise","getConfigFromNetwork","networkConfig","readPromises","configFromMemoryAfterRace","mergedConfigsMap","configServiceRelativeUrl","removeCmsPathFromRelativeUrl","crsResponse","downloadFile","rootConfigIndexId","crsMergedConfig","configIndexKey","addConfigToConfigMap","crsConfig","cdnConfig","downloadMergeConfig","areConfigsEqual","removeSubstringKeys","experienceIndex","resolveConfigIndex","configObjects","downloadExperienceConfig","mergeConfig","baseConfigUrl","hrefs","promiseArray","fetch","ok","statusText","json","EnableConfigService","FeatureFlags","crsMaxDepth","segment","wwResponse","refreshConfigResponse","purgeRenderCacheUponConfigChanges","configsEqual","liveCbId","liveCbid","writeCbidInLocalStorage","pcsCbid","highestCbid","clearConfigCache","clearObjects","getAllConfigTimingsOverride","allConfigsCacheDuration","allConfigsNetworkDuration","configTiming","networkFetchDuration","IsDebug","round","configFetchTimings","clientSettingsCbid","cachedCbid","cacheSource","startBulkConfig","cachedConfigs","_idbConfigReadPromise","_idbConfigLookup","getObject","populateConfigMapFromCachedConfigs","_idbConfigOpenPromise","unusableCount","cachedConfig","isConfigStale","cbidKey","resolver","getConfigTimings","getResolverErrors","refreshConfigCache","overrideCurrentRequestTargetScope","overrideCurrentRequestEnvironment","clearInternalState","getConfigServiceParameters","setConfigTimingsObject","getHighestCbid","PerfTracker","visuallyReadyTracker","initializedTracker","domCompleteTracker","startInitializeMilestone","startVisuallyReadyMilestone","startDomCompleteMilestone","incrementExpCount","endDomCompleteMilestone","prevState","snapshot","endInitializeMilestone","shouldMarkTelemetryTtvr","aliasName","endVisuallyReadyMilestone","setStart","getStart","getEnd","setEnd","markerPrefix","renderCounterPrefix","timeToVisuallyReady","timeToVideoStart","remainingMarkers","remainingTtvrMarkers","resolveTtvrCallback","perfMarkerResolveCallback","resolveTtvsCallback","markers","ttfPrefix","ttvrPrefix","ttvsPrefix","markTtf","markTimeNA","setMark","markTtvr","markTtvrRaf","requestAnimationFrame","prefix","markerFullName","existingMarker","getEntriesByName","getTtvrMarkers","getMarkers","getMarkersWithType","cachedDevicePixelRatio","ImageResizeMode","generateImageUrlFromId","generateImageUrlFromBaseUrl","focalRegion","backgroundColor","auxQsp","focusX","midPoint","x1","x2","focusY","y1","y2","enableDpiScaling","pixelRatio","ceil","quality","SocialMediaProviderConfig","SocialMedia","SocialMediaTarget","apiUrl","attribution","FacebookEmbed","InstagramEmbed","TwitterEmbed","SocialMediaDefaultConfig","Email","color","Mail","label","_self","Facebook","_blank","Line","LinkedIn","Skype","Twitter","WhatsApp","defaultImageWidth","htmlTagsRegEx","ViewsUtility","imgObj","alt","caption","imageCaption","altPrefix","altText","stripHtmlTags","linksCount","markup","partnerLinksCount","additionalProps","safeAny","list","dateTime","currentTime","publishTime","timeSpanInSeconds","trunc","timeSpanInMinutes","timeSpanInHours","timeSpanInDays","toLocaleDateString","cmsId","parser","nsParts","sections","charReplaceTable","charRegExp","pair","removeRegExp","dashRegExp","urlTitle","cc","urlData","getFriendlyTitleForUrl","q","input","replaceWith","applyTextTruncationStyles","numLines","display","inViewportPercentage","inViewportTopOffset","inViewportBottomOffset","allowZeroHeight","currentReference","current","bounds","ImageServiceConfig","UrlSearchParamsHelper","parseQueryString","charAt","keyValuePairs","autoFlipX","autoFocus","enable","onDismiss","staticPosition","zIndex","tabEventHandler","keyCode","popOverRef","tabbable","focus","determinePosition","scrollY","scrollX","createRef","zIndexStyle","direction","unhandledProps","onKeyDown","tabIndex","ref","popOver","getPlacementStyle","popOverPlaceholder","createPortal","pageDirection","position","windowWidth","documentHeight","displayOnLeft","displayOnRight","displayOnPrioritySide","displayOnNonPrioritySide","rtl","canFitPrioritySide","canFitNonPrioritySide","PopOverStyles","Flyout","outline","opacity","transform","ZIndex","settingButton","border","background","padding","outlineWidth","settingButtonIcon","contextMenuItem","margin","contextMenuItem_contentRegion","contextMenuItem_image","contextMenu","menuItems","enabled","buttonLabel","positionOffset","telemetryTag","handleUnfocus","node","containerRef","buttonContainerContainsNode","menuRef","menuPopoverContainsNode","closeMenu","buttonRef","menuOpened","menuContainer","onSettingClick","renderPopOver","dropDownLocation","isNil","enableAutoFocus","renderContextMenu","itemProps","onInvoke","onMenuItemClick","onSelect","onSelectCallback","posOffset","offsetX","x","offsetY","ButtonStyle","button__justified","iconContainer","iconImage","iconLabel","socialMedia","contentUrl","contentTitle","hideLabel","socialMediaItemConfigOverride","onClickNewWindow","shareUrl","newWindowOptions","newWindowTelemetryCall","openNewWindow","itemConfig","getSocialMediaShareUrl","targetRelatedAtributes","newWindow","attributes","appearance","justified","jssStyleSheet","ShallowCompare","a","b","ShareDialogColors","setStyleByZIndex","overrides","dialog_modalOverlay","dialog_contentRegion","StringResource","dialogStrings","dialogButtonClose","dialogTitle","copyButton","copiedButton","copyButtonAriaLabel","copiedButtonAriaLabel","Dialog","dialog","Above","linkCopiedDisplayDuration","fallbackStyles","backgroundStyle","closeButton","closeIcon","copyLinkButton","copyLinkInput","dialogContainer","header","headerText","semibold","iconListContainer","iconListItem","float","inputContainer","baseDialogProps","closeButtonTelemetryTags","copyButtonAttributes","copyButtonTelemetryProps","copyButtonTelemetryTags","copyLinkOcid","onClose","socialMediaConfigOverride","socialMediaItems","shareIconTelemetryProps","shareIconTelemetryTags","baseDialogStyleOverride","inputRef","onCopyLinkToClipboard","isLinkCopied","execCommand","setSocialMediaItemsConfig","coerceDialogProps","_7","tag","h3","renderSocialIconsList","renderCopyLink","buttonText","copyTelemetryTag","readOnly","socialMediaIcons","renderSocialIcon","socialMediaItem","media","mediaKey","iconTelemetryTags","socialMediaItemsConfig","keyLower","modal","contentHeight","contentWidth","anchorRef","headlineTitle","provider","nextProps","articleCard","renderContent","content","articleCard_content","renderImage","articleCard_textWrapper","renderTitle","renderProvider","articleCard_imageWrapper","articleCard_image","articleCard_imageOverlay","articleCard_headline","articleCard_headlineText","articleCard_headlineMask","providerImage","articleCard_providerImage","articleCard_provider","articleCard_providerTitle","SharedDocumentType","SharingHelper","sharingInfo","appId","getAppId","getSharingUrlBase","sharingUrl","shortUrlPathFormat","documentType","documentId","AppKeys","Base36AppIdString","articleUrl","currentBaseUrl","SharingProductionHosts","SharingBaseUrlDefault","overrideShareUrl","socialMediaItemConfig","appendQueryStringFormat","Format","refererUrl","options","finalOptions","entries","BreakpointIndexToPx","ToolbarBreakpoints","TelemetryConstants","PlaceHolderId","LikeDislikeActionKey","SelectPropKey","Status","ButtonType","ContentActionsToolbarActions","initializeToolbar","ContentStatuReady","documentDataReady","likeContent","unlikeContent","dislikeContent","undislikeContent","sharingToolbarError","ViewportUpdate","moreOptionsIconColors","likeDislikeIconBackroundColor","moreOptionsMenuDefaultOffsetPos","OptionItemLike","like","OptionItemDislike","dislike","Disliked","OptionItemUndoLike","undoliked","OptionItemUndoDislike","undodisliked","inspect","localizedStrings","sharingToolbar","sharingButtons","contentStatus","sharingError","sharingShortUrl","documentData","articleTitle","articleImageUrl","providerName","providerLogoUrl","buttonItem","newButtonItem","buttonType","buttonData","ShareDialog","shareDialogProps","shareDialogTitleText","shareDialogCopyButtonText","shareDialogCopyButtonAriaLabelText","shareDialogCopiedButtonText","shareDialogCopiedButtonAriaLabelText","dialogArticleCardProps","articleId","shareDialogButtonAriaLabelText","LikeDislike","likeDislikeButtonAriaLabelText","MoreOptions","moreOptionsUnlikeText","moreOptionsUnlikeAriaLabelText","moreOptionsDislikeText","moreOptionsDislikeAriaLabelText","DisLike","moreOptionsUndislikeText","moreOptionsUndislikeAriaLabelText","moreOptionsLikeText","moreOptionsLikeAriaLabelText","moreOptionsButtonAriaLabelText","offsetPos","missingChildren","fetchImpl","contentActionsServiceEndpoint","contentPreviewApiEndpoint","targetId","GetContentStatusRequest","isLike","isDislike","contentPreviewData","GetContentPreviewData","TranslateContentPreviewDocumentData","PostContentActionRequest","DeleteContentActionRequest","requestParams","credentials","contentStatusData","ContentServiceUrlBase","deleteQueryParam","deleteResponse","targetType","postResponse","articleDataResponse","articleImageId","providerLogoId","sharingToolbarTelemetryProps","buttonTelemetryName","mediaType","mediaTelemetryProps","copyLinkTelemetryName","closeButtonTelemetryProps","closeDialogTelemetryName","mediaItem","mediaItemOverride","shareDialogTelemetryProps","shareDialogTelemetryName","articleTelemetryTags","shareArticleTelemetryName","ComponentConnector","inspectorArgs","contentActionsToolbarProps","inspectorResponse","BuildLikeDislikeCallbacks","InjectCallbacksToMoreOptionsMenu","InjectTelemetry","onDislike","onLike","rootTelemetryTags","sharingToolbarTelemetryTags","contentId","isRSThree","CMS","actionServiceClient","generateTelemetryTags","getContentStatus","getDocumentData","initializeBreakpointTracker","GetPreferenceInitialState","GetDocumentData","shortUrlBuilder","moreOptionsButton","socialToolbarTelemetryName","moreOptionsTelemetryTags","UndoLike","UndoDislike","ToolbarPosition","handleAction","breakpointIndex","isRSThreeDevice","getToolbarPosition","Breakpoint3_2","Breakpoint3_3","horizontal","SharingToolbarStyles","icon_none","icon_like","icon_dislike","iconListHorizontal","iconListVertical","shareDialog","highContrast","moreOptions","iconContainerDimension","contextMenuStyles","e11","flex","articleCard_noImage","Scale","ArticleCard","coerceTitleProps","coerceProviderProps","coercedProps","_6","coercedProviderNameProps","_8","h5","onShareDialogOpen","shareDialogOpened","onShareDialogClose","managedClass","appendHighContrastStyle","getPositioningClassName","renderSharingButtons","renderShareDialog","buttonId","listItem","renderSocialMediaIcon","renderShareDialogIcon","renderLikeDislikeIcon","renderMoreOptionsIcon","shareDialogItem","articleCardStylesheet","LikedText","LikeText","DislikeText","iconClassName","BaseExperience","customField","firstRenderCompleted","contentActionsToolbar","componentDidUpdate","shouldFlip","flipToolbar","stack","contentActionsToolbar_horizontal","contentActionsToolbar_vertical","currentHostId","hostElem","prevHostId","newHostId","prevHostElem","newHostElem","childNodes","defaultProps","mockDocumentId","start","appTelemetry","createRootProps","RootTelemetryId","setupContentActionsInitialState","cmsDocumentId","documentid","isrsthree","verticalkey","categorykey","connectContentActionsComponent","contentActionsToolbarConfig","contentActionsExperience","renderRootElement","contentActionsConfig","experienceConfig","catch"],"mappings":"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uB,GAAK,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAAuB,IAAM,uBAA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AAU,IAA0B,qB,gBCA3CC,EAAOD,QAAU,IAA0B,oB,gBCA3CC,EAAOD,QAAU,IAA0B,Y,gBCA3CC,EAAOD,QAAU,IAA0B,gB,gBCA3CC,EAAOD,QAAU,IAA0B,sB,gBCA3CC,EAAOD,QAAU,IAA0B,Y,gBCA3CC,EAAOD,QAAU,IAA0B,kB,gBCA3CC,EAAOD,QAAU,IAA0B,c,gBCA3CC,EAAOD,QAAU,IAA0B,oB,gBCA3CC,EAAOD,QAAU,IAA0B,gB,gBCA3CC,EAAOD,QAAU,IAA0B,qB,gBCA3CC,EAAOD,QAAU,IAA0B,a,gBCA3CC,EAAOD,QAAU,IAA0B,gB,gBCA3CC,EAAOD,QAAU,IAA0B,oB,gBCA3CC,EAAOD,QAAU,IAA0B,yB,gBCA3CC,EAAOD,QAAU,IAA0B,W,gBCA3CC,EAAOD,QAAU,IAA0B,gB,gBCA3CC,EAAOD,QAAU,IAA0B,c,gBCA3CC,EAAOD,QAAU,IAA0B,oB,gBCA3CC,EAAOD,QAAU,IAA0B,kB,gBCA3CC,EAAOD,QAAU,IAA0B,Y,gBCA3CC,EAAOD,QAAU,IAA0B,oB,gBCA3CC,EAAOD,QAAU,IAA0B,yB,gBCA3CC,EAAOD,QAAU,IAA0B,yB,gBCA3CC,EAAOD,QAAU,IAA0B,wB,gBCA3CC,EAAOD,QAAU,IAA0B,mB,gBCA3CC,EAAOD,QAAU,IAA0B,gB,gBCA3CC,EAAOD,QAAU,IAA0B,e,gBCA3CC,EAAOD,QAAU,IAA0B,oB,gBCA3CC,EAAOD,QAAU,IAA0B,iB,gBCA3CC,EAAOD,QAAU,IAA0B,sB,gBCA3CC,EAAOD,QAAU,IAA0B,iB,gBCA3CC,EAAOD,QAAU,IAA0B,sB,gBCA3CC,EAAOD,QAAU,IAA0B,iB,gBCA3CC,EAAOD,QAAU,IAA0B,sB,gBCA3CC,EAAOD,QAAU,IAA0B,Y,gBCA3CC,EAAOD,QAAU,IAA0B,iB,gBCA3CC,EAAOD,QAAU,IAA0B,a,gBCA3CC,EAAOD,QAAU,IAA0B,mB,gBCA3CC,EAAOD,QAAU,IAA0B,+B,gBCA3CC,EAAOD,QAAU,IAA0B,gC,gBCA3CC,EAAOD,QAAU,IAA0B,kB,gBCA3CC,EAAOD,QAAU,IAA0B,iB,gBCA3CC,EAAOD,QAAU,IAA0B,sB,gBCA3CC,EAAOD,QAAU,IAA0B,iB,gBCA3CC,EAAOD,QAAU,IAA0B,sB,gBCA3CC,EAAOD,QAAU,IAA0B,Y,gBCA3CC,EAAOD,QAAU,IAA0B,gB,gBCA3CC,EAAOD,QAAU,IAA0B,a,gBCA3CC,EAAOD,QAAU,IAA0B,iB,gBCA3CC,EAAOD,QAAU,IAA0B,Y,gBCA3CC,EAAOD,QAAU,IAA0B,gB,gBCA3CC,EAAOD,QAAU,IAA0B,qB,gBCA3CC,EAAOD,QAAU,IAA0B,oB,gBCA3CC,EAAOD,QAAU,IAA0B,Y,gBCA3CC,EAAOD,QAAU,IAA0B,iB,gBCA3CC,EAAOD,QAAU,IAA0B,kB,gBCA3CC,EAAOD,QAAU,IAA0B,wB,gBCA3CC,EAAOD,QAAU,IAA0B,e,gBCA3CC,EAAOD,QAAU,IAA0B,qB,gBCA3CC,EAAOD,QAAU,IAA0B,gB,gBCA3CC,EAAOD,QAAU,IAA0B,qB,gBCA3CC,EAAOD,QAAU,IAA0B,yB,gBCA3CC,EAAOD,QAAU,IAA0B,4B,gBCA3CC,EAAOD,QAAU,IAA0B,4B,gBCA3CC,EAAOD,QAAU,IAA0B,oB,gBCA3CC,EAAOD,QAAU,IAA0B,yB,gBCA3CC,EAAOD,QAAU,IAA0B,a,gBCA3CC,EAAOD,QAAU,IAA0B,iB,gBCA3CC,EAAOD,QAAU,IAA0B,uB,gBCA3CC,EAAOD,QAAU,IAA0B,gB,gBCA3CC,EAAOD,QAAU,IAA0B,e,gBCA3CC,EAAOD,QAAU,IAA0B,c,gBCA3CC,EAAOD,QAAU,IAA0B,e,gBCA3CC,EAAOD,QAAU,IAA0B,uB,gBCA3CC,EAAOD,QAAU,IAA0B,4B,gBCA3CC,EAAOD,QAAU,IAA0B,yB,gBCA3CC,EAAOD,QAAU,IAA0B,8B,gBCA3CC,EAAOD,QAAU,IAA0B,W,gBCA3CC,EAAOD,QAAU,IAA0B,c,gBCA3CC,EAAOD,QAAU,IAA0B,W,gBCA3CC,EAAOD,QAAU,IAA0B,kB,gBCA3CC,EAAOD,QAAU,IAA0B,Y,gBCA3CC,EAAOD,QAAU,IAA0B,sB,gBCA3CC,EAAOD,QAAU,IAA0B,2B,gBCA3CC,EAAOD,QAAU,IAA0B,wB,gBCA3CC,EAAOD,QAAU,IAA0B,6B,gBCA3CC,EAAOD,QAAU,IAA0B,gB,gBCA3CC,EAAOD,QAAU,IAA0B,0B,gBCA3CC,EAAOD,QAAU,IAA0B,+B,gBCA3CC,EAAOD,QAAU,IAA0B,4B,gBCA3CC,EAAOD,QAAU,IAA0B,iC,gBCA3CC,EAAOD,QAAU,IAA0B,qB,gBCA3CC,EAAOD,QAAU,IAA0B,e,gBCA3CC,EAAOD,QAAU,IAA0B,c,gBCA3CC,EAAOD,QAAU,IAA0B,Y,gBCA3CC,EAAOD,QAAU,IAA0B,a,gBCA3CC,EAAOD,QAAU,IAA0B,c,gBCA3CC,EAAOD,QAAU,IAA0B,a,gBCA3CC,EAAOD,QAAU,IAA0B,kB,gBCA3CC,EAAOD,QAAU,IAA0B,kB,gBCA3CC,EAAOD,QAAU,IAA0B,a,gBCA3CC,EAAOD,QAAU,IAA0B,mB,gBCA3CC,EAAOD,QAAU,IAA0B,sB,gBCA3CC,EAAOD,QAAU,IAA0B,2B,gBCA3CC,EAAOD,QAAU,IAA0B,wB,gBCA3CC,EAAOD,QAAU,IAA0B,6B,gBCA3CC,EAAOD,QAAU,IAA0B,gB,gBCA3CC,EAAOD,QAAU,IAA0B,qB,gBCA3CC,EAAOD,QAAU,IAA0B,Y,gBCA3CC,EAAOD,QAAU,IAA0B,e,gBCA3CC,EAAOD,QAAU,IAA0B,a,gBCA3CC,EAAOD,QAAU,IAA0B,qB,gBCA3CC,EAAOD,QAAU,IAA0B,qB,gBCA3CC,EAAOD,QAAU,IAA0B,0B,gBCA3CC,EAAOD,QAAU,IAA0B,gB,gBCA3CC,EAAOD,QAAU,IAA0B,e,gBCA3CC,EAAOD,QAAU,IAA0B,oB,gBCA3CC,EAAOD,QAAU,IAA0B,mB,gBCA3CC,EAAOD,QAAU,IAA0B,a,gBCA3CC,EAAOD,QAAU,IAA0B,c,gBCA3CC,EAAOD,QAAU,IAA0B,yB,gBCA3CC,EAAOD,QAAU,IAA0B,sB,gBCA3CC,EAAOD,QAAU,IAA0B,iB,gBCA3CC,EAAOD,QAAU,IAA0B,a,gBCA3CC,EAAOD,QAAU,IAA0B,Y,gBCA3CC,EAAOD,QAAU,IAA0B,oB,gBCA3CC,EAAOD,QAAU,IAA0B,gB,gBCA3CC,EAAOD,QAAU,IAA0B,qB,gBCA3CC,EAAOD,QAAU,IAA0B,a,gBCA3CC,EAAOD,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","file":"content-actions-toolbar.c4e74a94ff4120c4f86d.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\t15: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// script path function\n \tfunction jsonpScriptSrc(chunkId) {\n \t\treturn __webpack_require__.p + \"\" + ({\"88\":\"icon-assets-AdChoices\",\"89\":\"icon-assets-BingCardDefaultHotelImage\",\"90\":\"icon-assets-BingHotelSeePrice\",\"91\":\"icon-assets-BingLogo\",\"92\":\"icon-assets-BingRatingDarkLightStar\",\"93\":\"icon-assets-BingRatingDarkStar\",\"94\":\"icon-assets-BingRatingLightStar\",\"95\":\"icon-assets-BlowingHail\",\"96\":\"icon-assets-BlowingHailWhite\",\"97\":\"icon-assets-BlowingSnow\",\"98\":\"icon-assets-BlowingSnowWhite\",\"99\":\"icon-assets-Check\",\"100\":\"icon-assets-Chevron\",\"101\":\"icon-assets-CircleClose\",\"102\":\"icon-assets-ClearNight\",\"103\":\"icon-assets-ClearNightWhite\",\"104\":\"icon-assets-Close\",\"105\":\"icon-assets-Cloudy\",\"106\":\"icon-assets-CloudyWhite\",\"107\":\"icon-assets-Copy\",\"108\":\"icon-assets-DarkModeHotel\",\"109\":\"icon-assets-DayTime\",\"110\":\"icon-assets-Delete\",\"111\":\"icon-assets-Dislike\",\"112\":\"icon-assets-DislikeText\",\"113\":\"icon-assets-Disliked\",\"114\":\"icon-assets-DislikedLight\",\"115\":\"icon-assets-DislikedText\",\"116\":\"icon-assets-Docx\",\"117\":\"icon-assets-DoubleTap\",\"118\":\"icon-assets-Download\",\"119\":\"icon-assets-DownloadNoFill\",\"120\":\"icon-assets-Edit\",\"121\":\"icon-assets-EditNoFill\",\"122\":\"icon-assets-Edited\",\"123\":\"icon-assets-EditedNoFill\",\"124\":\"icon-assets-Ellipses\",\"125\":\"icon-assets-EllipsesLight\",\"126\":\"icon-assets-EmptyMruDark\",\"127\":\"icon-assets-EmptyMruLight\",\"128\":\"icon-assets-EmptyPinnedDark\",\"129\":\"icon-assets-EmptyPinnedLight\",\"130\":\"icon-assets-EmptySharedDark\",\"131\":\"icon-assets-EmptySharedLight\",\"132\":\"icon-assets-Excel\",\"133\":\"icon-assets-Facebook\",\"134\":\"icon-assets-FacebookText\",\"135\":\"icon-assets-FacebookTextBlack\",\"136\":\"icon-assets-Fog\",\"137\":\"icon-assets-FogWhite\",\"138\":\"icon-assets-Folder\",\"139\":\"icon-assets-FolderNoFill\",\"140\":\"icon-assets-FolderOpen\",\"141\":\"icon-assets-Form\",\"142\":\"icon-assets-FreezingRain\",\"143\":\"icon-assets-FreezingRainWhite\",\"144\":\"icon-assets-GalleryFullscreen\",\"145\":\"icon-assets-GalleryMediaIcon\",\"146\":\"icon-assets-GenericFile\",\"147\":\"icon-assets-GridView\",\"148\":\"icon-assets-HailDay\",\"149\":\"icon-assets-HailDayWhite\",\"150\":\"icon-assets-HailNight\",\"151\":\"icon-assets-HailNightWhite\",\"152\":\"icon-assets-HazeSmoke\",\"153\":\"icon-assets-HazeSmokeWhite\",\"154\":\"icon-assets-HeavySnow\",\"155\":\"icon-assets-HeavySnowWhite\",\"156\":\"icon-assets-Hide\",\"157\":\"icon-assets-HideStory\",\"158\":\"icon-assets-Hotel\",\"159\":\"icon-assets-Information\",\"160\":\"icon-assets-InteractionRequiredDark\",\"161\":\"icon-assets-InteractionRequiredLight\",\"162\":\"icon-assets-Interested\",\"163\":\"icon-assets-LightRain\",\"164\":\"icon-assets-LightRainWhite\",\"165\":\"icon-assets-LightSnow\",\"166\":\"icon-assets-LightSnowWhite\",\"167\":\"icon-assets-Like\",\"168\":\"icon-assets-LikeText\",\"169\":\"icon-assets-Liked\",\"170\":\"icon-assets-LikedText\",\"171\":\"icon-assets-Line\",\"172\":\"icon-assets-LinkedIn\",\"173\":\"icon-assets-LinkedInBlack\",\"174\":\"icon-assets-LinkedInText\",\"175\":\"icon-assets-Mail\",\"176\":\"icon-assets-MailBlack\",\"177\":\"icon-assets-MailNoFill\",\"178\":\"icon-assets-ManagedBriefcase\",\"179\":\"icon-assets-Message\",\"180\":\"icon-assets-MessageNoFill\",\"181\":\"icon-assets-Messages\",\"182\":\"icon-assets-MicrosoftNews\",\"183\":\"icon-assets-MicrosoftNews_FR\",\"184\":\"icon-assets-MicrosoftNews_ZH\",\"185\":\"icon-assets-ModerateRain\",\"186\":\"icon-assets-ModerateRainWhite\",\"187\":\"icon-assets-Movie\",\"188\":\"icon-assets-NightTime\",\"189\":\"icon-assets-Notification-Five-Plus-Sign\",\"190\":\"icon-assets-OfficeFormsLogo\",\"191\":\"icon-assets-OneDrive\",\"192\":\"icon-assets-OneNote\",\"193\":\"icon-assets-Onetoc\",\"194\":\"icon-assets-Outlook\",\"195\":\"icon-assets-PartlyCloudyDay\",\"196\":\"icon-assets-PartlyCloudyDayWhite\",\"197\":\"icon-assets-PartlyCloudyNight\",\"198\":\"icon-assets-PartlyCloudyNightWhite\",\"199\":\"icon-assets-Pdf\",\"200\":\"icon-assets-People\",\"201\":\"icon-assets-Pin\",\"202\":\"icon-assets-PowerPoint\",\"203\":\"icon-assets-Pptx\",\"204\":\"icon-assets-RainShowersDay\",\"205\":\"icon-assets-RainShowersDayWhite\",\"206\":\"icon-assets-RainShowersNight\",\"207\":\"icon-assets-RainShowersNightWhite\",\"208\":\"icon-assets-RainSnow\",\"209\":\"icon-assets-RainSnowShowersDay\",\"210\":\"icon-assets-RainSnowShowersDayWhite\",\"211\":\"icon-assets-RainSnowShowersNight\",\"212\":\"icon-assets-RainSnowShowersNightWhite\",\"213\":\"icon-assets-RainSnowWhite\",\"214\":\"icon-assets-Refresh\",\"215\":\"icon-assets-Remove\",\"216\":\"icon-assets-Save\",\"217\":\"icon-assets-Saved\",\"218\":\"icon-assets-Search\",\"219\":\"icon-assets-Share\",\"220\":\"icon-assets-ShareLight\",\"221\":\"icon-assets-Sharepoint\",\"222\":\"icon-assets-Skype\",\"223\":\"icon-assets-SkypeOffice\",\"224\":\"icon-assets-SnowShowersDay\",\"225\":\"icon-assets-SnowShowersDayWhite\",\"226\":\"icon-assets-SnowShowersNight\",\"227\":\"icon-assets-SnowShowersNightWhite\",\"228\":\"icon-assets-SunnyDay\",\"229\":\"icon-assets-SunnyDayWhite\",\"230\":\"icon-assets-Sway\",\"231\":\"icon-assets-SwayApp\",\"232\":\"icon-assets-Teams\",\"233\":\"icon-assets-ThumbnailView\",\"234\":\"icon-assets-Thunderstorms\",\"235\":\"icon-assets-ThunderstormsWhite\",\"236\":\"icon-assets-Trending\",\"237\":\"icon-assets-Twitter\",\"238\":\"icon-assets-TwitterBlack\",\"239\":\"icon-assets-TwitterText\",\"240\":\"icon-assets-Unpin\",\"241\":\"icon-assets-VerticalSeparator\",\"242\":\"icon-assets-VideoMediaIcon\",\"243\":\"icon-assets-VideoPlay\",\"244\":\"icon-assets-Visio\",\"245\":\"icon-assets-Vsdx\",\"246\":\"icon-assets-WeatherAlert\",\"247\":\"icon-assets-WhatsApp\",\"248\":\"icon-assets-WhatsAppBlack\",\"249\":\"icon-assets-Windy\",\"250\":\"icon-assets-WindyWhite\",\"251\":\"icon-assets-Word\",\"252\":\"icon-assets-World\",\"253\":\"icon-assets-Xlsx\",\"254\":\"icon-assets-Yammer\"}[chunkId]||chunkId) + \".\" + {\"88\":\"ba272f5d8f090f681591\",\"89\":\"1c8cc9eb71bbd7fa4d7e\",\"90\":\"de5c16d61abe214fb4c3\",\"91\":\"eaf1787bc3b268498f9e\",\"92\":\"f37700eb7bbd7edb8929\",\"93\":\"dc83bcf0e8cb98fc48d6\",\"94\":\"9617cd03b061f36d4c45\",\"95\":\"ddf216114fdb96c7ccb2\",\"96\":\"d5e540810f302a720866\",\"97\":\"5f4635ed7c1097111eca\",\"98\":\"602685532f74dd947c3d\",\"99\":\"de2009fe3f86aa914ce8\",\"100\":\"7e0e3db0f7df9980d187\",\"101\":\"dfc349e71d3e780e2d6d\",\"102\":\"1003c422e3ac571c29fb\",\"103\":\"910d8efa1a2767dbf07d\",\"104\":\"90ad97c0a3136b930689\",\"105\":\"db84a2dea56015fba805\",\"106\":\"f8d051604d33c4b5609e\",\"107\":\"bbd37d93d61c2ce0d786\",\"108\":\"066096926ecd86c0c939\",\"109\":\"8736bec43a624158e219\",\"110\":\"6475a389e293b2a5ac57\",\"111\":\"6d300599f67c48a47a39\",\"112\":\"975c2537769576b84266\",\"113\":\"e7bf0076f0997adf7170\",\"114\":\"e1c7ed3c827a0b6adedb\",\"115\":\"d183ca4fc48bb36fed23\",\"116\":\"39dd2af3fd709e48d06c\",\"117\":\"1d856d5ec0a23c5161d0\",\"118\":\"c65473d3c3c321c211a4\",\"119\":\"38d63f91ed6275bc41ec\",\"120\":\"48715fc9fa52eaadf1eb\",\"121\":\"b56b106a4cf19f8e715f\",\"122\":\"6d89a762e0d6c8b07094\",\"123\":\"24b7a95720df568b8a7b\",\"124\":\"3c0bc636fa7ee37c58ab\",\"125\":\"ad5a71ee4f175475362f\",\"126\":\"013f8ad44f597534110e\",\"127\":\"d1ebc13b83f819265cae\",\"128\":\"3436671cbcfe5bb51722\",\"129\":\"f031fc6a0b6be9110ca8\",\"130\":\"de49d6d1c52e0abb0cbc\",\"131\":\"c513f8c39a1499be32a4\",\"132\":\"a7f5aac538ff7b56eccc\",\"133\":\"0dc6310ea59d082d9250\",\"134\":\"342b7774a7fa9bd1666f\",\"135\":\"17ef6573c41461da3a1f\",\"136\":\"915a72a80bc6feb7a3cf\",\"137\":\"86cc5fcca259b2e4ed87\",\"138\":\"6de425963b5c4cc0e224\",\"139\":\"e9623014e966be220381\",\"140\":\"a2cd7d4b856841e62833\",\"141\":\"7fbba8a4c34acd66d4ac\",\"142\":\"a608a8adfa17b968977e\",\"143\":\"c3b36f70bcf31bc29a2f\",\"144\":\"472619e0a489b4feaca0\",\"145\":\"5d73218c2f98715262f7\",\"146\":\"af66a93dc46060f4283f\",\"147\":\"08e7b7a18f96401b5f42\",\"148\":\"d0df64e8dee1d1fa14a3\",\"149\":\"776d0683d28c786c4867\",\"150\":\"3831963ba01193969eed\",\"151\":\"cbde45eead1dacd76a4e\",\"152\":\"d227296484958737c2e8\",\"153\":\"24084e8c40ed666b5f45\",\"154\":\"2fc5f05dece72e78e816\",\"155\":\"0d95a30711c7538db09c\",\"156\":\"961c0e64391484f2303c\",\"157\":\"27f812a3c3e4905a80df\",\"158\":\"86e910eb6847a35c9287\",\"159\":\"f7124f5aec4b3b284d1d\",\"160\":\"a37dc0f61ff73ff8fd5e\",\"161\":\"fa8af9357522ed91b98c\",\"162\":\"a596e6b03f99ea38059c\",\"163\":\"d5185e596e94e9d0475c\",\"164\":\"c68291101b5291c622b9\",\"165\":\"fbbaf1438a01cb0d322b\",\"166\":\"2dcf8827ca621edad14c\",\"167\":\"f882539833dd6f65d4c9\",\"168\":\"f49ff8ecadb835dcd975\",\"169\":\"1aeaee2e6aad894c1dbc\",\"170\":\"07849142e65c4625c726\",\"171\":\"8af389ce40c302af0f04\",\"172\":\"35a97904a1377bb9c266\",\"173\":\"09af9e9e52d0ae70fd07\",\"174\":\"431367adff13f9db1aa2\",\"175\":\"0b33522a957541d29a60\",\"176\":\"5114e730c17ec900576b\",\"177\":\"dba61db8b91ad02b10a2\",\"178\":\"50a0760c4661ab5e35cf\",\"179\":\"65ed54b0aac8585900df\",\"180\":\"2830d37980f774078291\",\"181\":\"6f2601a4b724a90322bd\",\"182\":\"b1007b777d8960c72f25\",\"183\":\"50095b450f38ec5359ec\",\"184\":\"8ecde0c06a1341682e1f\",\"185\":\"b4f8db0fe2aeabec8d81\",\"186\":\"5271528882725962b1d0\",\"187\":\"d8da488c59fc3b5e93be\",\"188\":\"76b00d7eaa1966b3decc\",\"189\":\"d8b5cfd2ce83330a2d7d\",\"190\":\"a5f949870e49f3499941\",\"191\":\"6858b37f55e96730d597\",\"192\":\"bdb02a1cefa2995cca38\",\"193\":\"c91b9fc3e4f79c29bf44\",\"194\":\"df8adf63fc060e03bd74\",\"195\":\"91c18673be92eddda93b\",\"196\":\"f4894f819333b8fcbbbf\",\"197\":\"11ee5798506bd81cba56\",\"198\":\"42b55213bcc5a4e8785c\",\"199\":\"cbb7588943c6a3aa698b\",\"200\":\"e3c97b45506d5f8ef881\",\"201\":\"85f11271b1a8cd02df3d\",\"202\":\"78558d2d3f800465c962\",\"203\":\"4cd410b40bfc886f8291\",\"204\":\"cb01eafb449a9c1dc7fe\",\"205\":\"c28e8d74ddd5e900ec75\",\"206\":\"39b22d6ce0b8257639a4\",\"207\":\"047d717ee810daead0ad\",\"208\":\"2b920990ec0532f01623\",\"209\":\"c28cf04e5729502cf828\",\"210\":\"1cc4ba949528143f5e13\",\"211\":\"fd8926efbd8796b07d8c\",\"212\":\"0b2305f9706a27296cbd\",\"213\":\"5cbb85b5079b25df10be\",\"214\":\"a52accee2277d94009f8\",\"215\":\"313a91b3dd9550afe9f5\",\"216\":\"604370759612be410334\",\"217\":\"874a65b7645a46f6e52c\",\"218\":\"a5f49e2eb1ea45cc3657\",\"219\":\"a6f8fec218acc1fa7bd7\",\"220\":\"472bd3dd657bde45c28e\",\"221\":\"55eb644e10154e237843\",\"222\":\"ac5ac45f5fc0de964fec\",\"223\":\"6d795377f6d8dce5aaa0\",\"224\":\"d2a92dfe3e91b260a75b\",\"225\":\"b5663326bc0d423c4e0d\",\"226\":\"b9471c01c3ff5a90b92b\",\"227\":\"bdd2d98eccf4c1642f50\",\"228\":\"a083b715839a576284af\",\"229\":\"2360f61a57b8dcc2c3b8\",\"230\":\"ddc911e739818dc83588\",\"231\":\"519163ebc2377e95a87e\",\"232\":\"8890581507f41cae3910\",\"233\":\"140c56057839893a3957\",\"234\":\"097cb93429a1f7587d4e\",\"235\":\"9fb38427ff57e9f22e06\",\"236\":\"05865b203b170d58c939\",\"237\":\"151f7b1fca3e6859e8ba\",\"238\":\"7370726598466038a05e\",\"239\":\"561ec33e3d5671e32bf5\",\"240\":\"93f5101234dfca255f82\",\"241\":\"ef65f0099cea0a496a60\",\"242\":\"8e04dabff0dc7b4fbf64\",\"243\":\"9466070e555bc69233fd\",\"244\":\"2f29de6594820c1a90de\",\"245\":\"97a74d040c7dc8365a25\",\"246\":\"cab63036d7d4020ad03c\",\"247\":\"31a8e9a5af964f133831\",\"248\":\"37df1314facfbbbed3fa\",\"249\":\"ec4cfe546f42f6deaf69\",\"250\":\"7a26ce4a7e84542a85cd\",\"251\":\"d7c8025ad7c77ee60415\",\"252\":\"cea30fe10e9bdc5c7601\",\"253\":\"14fa4860afc06465c465\",\"254\":\"355d5fbb440eba014bb2\"}[chunkId] + \".js\"\n \t}\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 \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar promises = [];\n\n\n \t\t// JSONP chunk loading for javascript\n\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n \t\t\t// a Promise means \"currently loading\".\n \t\t\tif(installedChunkData) {\n \t\t\t\tpromises.push(installedChunkData[2]);\n \t\t\t} else {\n \t\t\t\t// setup Promise in chunk cache\n \t\t\t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t\t\t});\n \t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n \t\t\t\t// start chunk loading\n \t\t\t\tvar script = document.createElement('script');\n \t\t\t\tvar onScriptComplete;\n\n \t\t\t\tscript.charset = 'utf-8';\n \t\t\t\tscript.timeout = 120;\n \t\t\t\tif (__webpack_require__.nc) {\n \t\t\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t\t\t}\n \t\t\t\tscript.src = jsonpScriptSrc(chunkId);\n\n \t\t\t\t// create error before stack unwound to get useful stacktrace later\n \t\t\t\tvar error = new Error();\n \t\t\t\tonScriptComplete = function (event) {\n \t\t\t\t\t// avoid mem leaks in IE.\n \t\t\t\t\tscript.onerror = script.onload = null;\n \t\t\t\t\tclearTimeout(timeout);\n \t\t\t\t\tvar chunk = installedChunks[chunkId];\n \t\t\t\t\tif(chunk !== 0) {\n \t\t\t\t\t\tif(chunk) {\n \t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n \t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n \t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n \t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n \t\t\t\t\t\t\terror.type = errorType;\n \t\t\t\t\t\t\terror.request = realSrc;\n \t\t\t\t\t\t\tchunk[1](error);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t\t\t}\n \t\t\t\t};\n \t\t\t\tvar timeout = setTimeout(function(){\n \t\t\t\t\tonScriptComplete({ type: 'timeout', target: script });\n \t\t\t\t}, 120000);\n \t\t\t\tscript.onerror = script.onload = onScriptComplete;\n \t\t\t\tdocument.head.appendChild(script);\n \t\t\t}\n \t\t}\n \t\treturn Promise.all(promises);\n \t};\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 = \"/bundles/v1/hybrid/20200515.65/\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\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([892,0]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { canUseDOM, getInnerHeight, getInnerWidth } from \"@msnews/isomorphic-util\";\r\n\r\n// Wraps modern visibility api, as well as defines visibility for elements based on viewbox.\r\n\r\n// a simple deferred promise object that delays execution of callbacks until the owner resolves. (see $.Deferred for jQuery's implementation, this is a subset)\r\nfunction Deferred() {\r\n // the callbacks to execute when resolved\r\n var callbacks = [];\r\n\r\n // the state of the promise. If we have already resolved we execute the delegates immediately.\r\n var isResolved = false;\r\n\r\n // the arguments used to resolve the promise.\r\n var resolvedArgs = null;\r\n\r\n // executes all the callbacks that need to be notified, giving them a ref to the arguments supplied.\r\n function flushCallbacks() {\r\n // we only flush if we are resolved\r\n if (isResolved) {\r\n var errors = [];\r\n\r\n // loop through the callbacks and execute.\r\n for (var index = 0; index < callbacks.length; index++) {\r\n try {\r\n callbacks[index](resolvedArgs);\r\n } catch (e) {\r\n // delay propagation of errors until all callbacks have been notified\r\n errors.push(e);\r\n }\r\n }\r\n\r\n // clear the callbacks array\r\n callbacks = [];\r\n\r\n // throw the error collection if we received any.\r\n if (errors.length) {\r\n throw errors;\r\n }\r\n }\r\n }\r\n\r\n // resolves the promise\r\n function resolve() {\r\n isResolved = true;\r\n resolvedArgs = arguments;\r\n flushCallbacks();\r\n }\r\n\r\n // the promise function\r\n function promise() {\r\n return {\r\n\r\n // the happy path for callbacks\r\n then:\r\n function (callback) {\r\n callbacks.push(callback);\r\n flushCallbacks();\r\n },\r\n\r\n // subscribers listen here for when the promise was denied or resolved.\r\n always:\r\n function () {\r\n return this.then(arguments);\r\n }\r\n };\r\n }\r\n\r\n // lets return our deferred object that.\r\n return {\r\n // the promise object\r\n promise: promise,\r\n // the resolve method.\r\n resolve: resolve\r\n };\r\n}\r\n\r\n// create our visibility deferred\r\n// @ts-ignore\r\nvar visibilityDeferred = new Deferred();\r\n\r\n// initialize the visibility property name\r\nvar visibilityProperty = getHiddenPropertyName();\r\n\r\n// Flag to check if unload event has been triggered\r\n// Page Visibility API removed 'unloaded' visbility state and now reports 'hidden' when browser is being unloaded.This breaks the wasBrowserHiddenAtLeastOnce logic.\r\n// Flag is used to detect & ignore state change if unload event caused the 'hidden' visibilityState.\r\n// Chrome 56 (as of 2/21/2017) has implemented the spec change and would probably land in Edge in the future releases.\r\n// Link to spec - https://w3c.github.io/page-visibility/\r\n\r\nvar isUnloadEventInProgress = false;\r\n\r\nif (canUseDOM() && window.addEventListener) {\r\n window.addEventListener('beforeunload', function () {\r\n isUnloadEventInProgress = true;\r\n });\r\n}\r\n\r\n//flag to indicate if Browser was hidden even once in a page impression\r\nvar wasBrowserHidden = false;\r\n\r\nif (canUseDOM() && visibilityProperty) {\r\n // this preserves our vendor prefix\r\n var evtname = visibilityProperty.replace(/[H|h]idden/, '') + 'visibilitychange';\r\n document.addEventListener(evtname, visibilityChanged);\r\n}\r\n\r\n// call it immediately to prime the deferred if we are already visibile.\r\nvisibilityChanged();\r\n\r\n// returns the property name for document.hidden, which can contain the browser specific prefix, or null if not defined.\r\n// hidden is part of modern browsers visibility api.\r\nfunction getHiddenPropertyName() {\r\n if (!canUseDOM()) {\r\n return null;\r\n }\r\n\r\n var prefixes = ['webkit', 'moz', 'ms', 'o'];\r\n\r\n // if 'hidden' is natively supported just return it\r\n if (typeof document.hidden !== 'undefined') {\r\n return 'hidden';\r\n }\r\n\r\n // otherwise loop over all the known prefixes until we find one\r\n for (var index = 0; index < prefixes.length; index++) {\r\n var prospectivePropertyName = prefixes[index] + 'Hidden';\r\n if ((prospectivePropertyName) in document) {\r\n return prospectivePropertyName;\r\n }\r\n }\r\n}\r\n\r\n// determines if the page is hidden.\r\nfunction isHidden() {\r\n if (!canUseDOM() || !visibilityProperty) {\r\n return false;\r\n }\r\n\r\n return document[visibilityProperty];\r\n}\r\n\r\n// handler for visibility changes. Determines if we should resolve the promise.\r\nfunction visibilityChanged() {\r\n if (!isHidden()) {\r\n visibilityDeferred.resolve();\r\n } else {\r\n // create a new one so we can fire when we are back.\r\n // @ts-ignore\r\n visibilityDeferred = new Deferred();\r\n //flag indicates that browser was minimised or hidden during the page impression\r\n\r\n if (!isUnloadEventInProgress) {\r\n wasBrowserHidden = true;\r\n }\r\n }\r\n}\r\n\r\n// returns if the browser was hidden at least once\r\nfunction wasBrowserHiddenAtLeastOnce() {\r\n return (wasBrowserHidden ? 1 : 0);\r\n}\r\n\r\n// determines if an element is currently visible to the user\r\nfunction isElementTrulyVisible(element, windowRight, windowLeft, windowHeight) {\r\n if (isHidden() || !element) {\r\n return false;\r\n }\r\n\r\n windowHeight = windowHeight || getInnerHeight();\r\n windowRight = windowRight || getInnerWidth();\r\n\r\n if (!windowLeft && windowLeft !== 0) {\r\n windowLeft = 0;\r\n var contentArea = document.getElementById('content');\r\n\r\n if (contentArea) {\r\n var contentRect = contentArea.getBoundingClientRect();\r\n windowRight = contentRect.right;\r\n windowLeft = contentRect.left;\r\n }\r\n }\r\n\r\n var boxVisible = false;\r\n\r\n var rec = element.getBoundingClientRect();\r\n\r\n var elementHeightVisible = (rec.top >= 0 || rec.bottom >= 0) && (rec.top < windowHeight || rec.bottom < windowHeight);\r\n var elementWidthVisible = (rec.left >= windowLeft || rec.right > windowLeft) && (rec.left < windowRight || rec.right <= windowRight);\r\n\r\n boxVisible = rec.height !== 0 || rec.width !== 0;\r\n\r\n return boxVisible && (elementHeightVisible && elementWidthVisible);\r\n}\r\n\r\n///Notifies the callee when we return to visibile state. Returns immediately if we are currently visible\r\n///A JQuery Promise that resolves when visible\r\nfunction notifyWhenPageVisible() {\r\n // return our current promise.\r\n return visibilityDeferred.promise();\r\n}\r\n\r\n// return the visibility object being returned\r\nexport default {\r\n // returns true if the document is hidden\r\n isHidden: isHidden,\r\n // returns a jquery promise that resolves the next time (or immediately) the page becomes visible\r\n notifyWhenPageVisible: notifyWhenPageVisible,\r\n // returns true if the page is visible && element within viewport\r\n isElementTrulyVisible: isElementTrulyVisible,\r\n //returns true if page was hidden even once\r\n wasBrowserHiddenAtLeastOnce: wasBrowserHiddenAtLeastOnce\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n// Tracking information aggregate object.\r\n// used by all the tracking systems to get common info sent via tracking\r\n\r\nimport dom from \"./dom\";\r\nimport extend from \"./extend\";\r\nimport { headData, getCookie, appEnvironment } from \"@msnews/core\";\r\nimport mediator from \"./mediator\";\r\nimport pageInstance from \"./pageInstance\";\r\nimport telemetryConstants from \"./telemetryconstants\";\r\nimport { telemetryDataTypes } from \"./telemetryDataTypes\";\r\nimport { telemetryReadyCallback } from \"./telemetryReadyCallback\";\r\nimport visibilityService from \"./visibility\";\r\nimport { AccountType, AadAccountType } from \"@msnews/experiences-constants\";\r\nimport { canUseDOM, getLocationHref } from \"@msnews/isomorphic-util\";\r\n\r\nvar clientClientId;\r\nvar browserWidth;\r\nvar browserHeight;\r\n// eventIndex[0] is for the first rid and eventIndex[1] is for the current rid\r\nvar eventIndex = [0, 0];\r\nvar isFirstEventIndex = true;\r\nvar eventTransientCustomTags = {}; //eventTransientCustomTags is applied to each specific events.\r\n\r\nvar modules = [];\r\nvar baseUrl = \"\";\r\nvar clientIdTypeValue;\r\n\r\nvar userDefinedCustomTags = {};\r\n\r\nfunction Module(element, visible) {\r\n this.element = element;\r\n this.visible = visible;\r\n\r\n if (this.visible) {\r\n this.compress = function () {\r\n var moduleTelemetryData = this.element.getAttribute(\"data-m\");\r\n try {\r\n return JSON.parse(moduleTelemetryData);\r\n } catch (e) {\r\n return moduleTelemetryData;\r\n }\r\n };\r\n }\r\n}\r\n\r\nfunction getBrowserSize() {\r\n /// \r\n /// Helper function used to get the browser height and width\r\n /// \r\n\r\n browserWidth = (canUseDOM()) ? (window.outerWidth || document.documentElement.clientWidth) : 0;\r\n browserHeight = (canUseDOM()) ? (window.outerHeight || document.documentElement.clientHeight) : 0;\r\n\r\n}\r\n\r\nfunction getWindowHeight() {\r\n /// \r\n /// Get current browser viewpane height\r\n /// \r\n\r\n if (!canUseDOM()) {\r\n return 0;\r\n }\r\n\r\n return window.innerHeight ||\r\n document.documentElement.clientHeight ||\r\n document.body.clientHeight || 0;\r\n}\r\n\r\nfunction getWindowYscroll() {\r\n /// \r\n /// Get current absolute window scroll position\r\n /// \r\n\r\n if (!canUseDOM()) {\r\n return 0;\r\n }\r\n\r\n return window.pageYOffset ||\r\n document.body.scrollTop ||\r\n document.documentElement.scrollTop || 0;\r\n}\r\n\r\nfunction getDocHeight() {\r\n /// \r\n /// Get current absolute document height\r\n /// \r\n\r\n if (!canUseDOM()) {\r\n return 0;\r\n }\r\n\r\n return Math.max(\r\n document.body.scrollHeight || 0,\r\n document.documentElement.scrollHeight || 0,\r\n document.body.offsetHeight || 0,\r\n document.documentElement.offsetHeight || 0,\r\n document.body.clientHeight || 0,\r\n document.documentElement.clientHeight || 0\r\n );\r\n}\r\n\r\nfunction getDefaultCustomTags() {\r\n /// \r\n /// Get the default custom tags.\r\n /// \r\n var defaultCustomTags = {};\r\n\r\n if (!canUseDOM()) {\r\n return defaultCustomTags;\r\n }\r\n\r\n // @ts-ignore\r\n if (window && window.adsEnabled != null) {\r\n // @ts-ignore\r\n defaultCustomTags.adoni = +window.adsEnabled;\r\n }\r\n\r\n return defaultCustomTags;\r\n}\r\n\r\nfunction joinTelemetryValues(separator, leftTmplValue, rightTemplValue) {\r\n /// Composes a new template value from an exisiting one and a new one.\r\n /// The separator.\r\n /// The left tmpl value string, may be null or empty.\r\n /// The right tmpl value string, may be null or empty.\r\n /// \r\n /// A new string composed of the right and left values with a semi-colon separator if both values are non-null and not empty.\r\n /// If the right templ value is null or empty (or otherwise falsey), the left templ value is returned.\r\n /// If only the left templ value is falsey, only the right templ value is returned.\r\n /// \r\n\r\n return rightTemplValue\r\n ? leftTmplValue\r\n ? [leftTmplValue, rightTemplValue].join(separator)\r\n : rightTemplValue\r\n : leftTmplValue;\r\n}\r\n\r\nfunction joinTelemetryValuesForTmpl(separator, currentTmplValue, newTmplValue) {\r\n /// Composes a new template value from an exisiting one and a new one.\r\n /// The separator.\r\n /// The currentTmplValue, may be null or empty.\r\n /// The newTmplValue, may be null or empty.\r\n /// \r\n /// A new string composed of the newTmplValue and currentTmplValue with a semi-colon separator if both values are non-null and not empty.\r\n /// If the newTmplValue is null or empty (or otherwise falsey), the currentTmplValue is returned.\r\n /// If only the currentTmplValue is falsey, only the newTmplValue is returned.\r\n /// Duplicate key will override the value even if the value is empty string.\r\n /// Value without any key will be ignored.\r\n /// \r\n\r\n if (!newTmplValue) {\r\n return currentTmplValue ? currentTmplValue : \"\";\r\n }\r\n if (!currentTmplValue) {\r\n return newTmplValue ? newTmplValue : \"\";\r\n }\r\n var combinedTelemetryVal = {};\r\n var array = [];\r\n var isDuplicateKeyExist = false;\r\n var newTmplValueSplited = newTmplValue.split(separator);\r\n for (var i = 0; i < newTmplValueSplited.length; i++) {\r\n var newKeyVal = newTmplValueSplited[i].split(\":\");\r\n if (newKeyVal[0]) {\r\n if (!isDuplicateKeyExist) {\r\n // 'currentTmplValue' will be split out only if 'newTmplValue' contains any key which is exist in 'currentTmplValue'\r\n if (newKeyVal[0] && (currentTmplValue.indexOf(newKeyVal[0]) != -1)) {\r\n var currentTmplValueSplited = currentTmplValue.split(separator);\r\n for (var j = 0; j < currentTmplValueSplited.length; j++) {\r\n if (currentTmplValueSplited[j]) {\r\n var currentKeyVal = currentTmplValueSplited[j].split(\":\");\r\n combinedTelemetryVal[currentKeyVal[0]] = currentKeyVal[1];\r\n }\r\n }\r\n isDuplicateKeyExist = true;\r\n }\r\n }\r\n combinedTelemetryVal[newKeyVal[0]] = newKeyVal[1];\r\n }\r\n }\r\n\r\n var val = \"\";\r\n for (var key in combinedTelemetryVal) {\r\n if (key) {\r\n if (val !== \"\") {\r\n val += separator;\r\n }\r\n\r\n val += key;\r\n if (combinedTelemetryVal[key]) {\r\n val += \":\" + combinedTelemetryVal[key];\r\n }\r\n }\r\n }\r\n\r\n if (!isDuplicateKeyExist && currentTmplValue) {\r\n val = val ? val + separator + currentTmplValue : currentTmplValue;\r\n }\r\n\r\n return val;\r\n}\r\n\r\nexport var trackInfo = {\r\n notrack: \"notrack\",\r\n cmSeparator: \">\",\r\n // TODO: (nubenja) To be removed. Make sure all dependecies get removed\r\n defaultModule: \"body\",\r\n defaultFormHeadline: \"[form submit]\",\r\n piitxt: \"data-piitxt\",\r\n piiurl: \"piiurl\",\r\n wrapperId: \"wrapper\",\r\n MUIDCookie: \"MUID\", // This is used for client id. If MUID exists, then we will use MUID as client id otherwise use request id.\r\n gestureKey: \"touch_gesture\",\r\n gestureType:\r\n {\r\n tap: \"tap\",\r\n rightclick: \"rightclick\"\r\n },\r\n eventTypes:\r\n {\r\n click: \"click\",\r\n nonNavClckEvt: \"click_nonnav\",\r\n submit: \"submit\",\r\n contextmenu: \"contextmenu\",\r\n mouseenter: \"mouseenter\",\r\n imprUpdate: \"impr_update\",\r\n adPlay: \"AdPlay\",\r\n contentPlay: \"ContentPlay\",\r\n videoClickNonNav: \"Click_Non-nav\"\r\n },\r\n imprUpdateMechanisms:\r\n {\r\n load: \"load\",\r\n scroll: \"scroll\",\r\n auto: \"auto\",\r\n tap: \"tap\",\r\n resize: \"resize\",\r\n swipe: \"swipe\",\r\n partial: \"partial\",\r\n view: \"view\"\r\n },\r\n event: {},\r\n sitePage: {},\r\n userStatic: {},\r\n overrideClientParams: {},\r\n persistOverriddenParams: false,\r\n customTags: getDefaultCustomTags() || {}, //customTags is applied to all events.\r\n trackingDisabled: false, // used by NTP/DHP to disable tracking in \"enterprise mode\",\r\n shouldFireTelemetry: function () {\r\n /// \r\n /// Return whether telemetry beacons should get fired or not.\r\n /// \r\n\r\n return !this.trackingDisabled;\r\n },\r\n appErrorEnabled: true, // should not send app error when user is navigating away from page.\r\n shouldFireAppError: function () {\r\n /// \r\n /// Return whether app error beacons should get fired or not.\r\n /// \r\n\r\n return this.appErrorEnabled;\r\n },\r\n getCurrentTime: function () {\r\n /// \r\n /// gets the current timestamp\r\n /// \r\n /// \r\n /// \r\n return +new Date();\r\n },\r\n timeToInteract: function (eventTime?) {\r\n /// \r\n /// gets the time to interact for the event by substracting it from navigationStart.\r\n /// https://developer.mozilla.org/en-US/docs/Web/API/PerformanceTiming/navigationStart\r\n /// \r\n /// \r\n /// \r\n if (!canUseDOM()) {\r\n return 0;\r\n }\r\n\r\n var eventTiming;\r\n if (eventTime) {\r\n eventTiming = eventTime;\r\n } else {\r\n eventTiming = trackInfo.getCurrentTime();\r\n }\r\n if (eventTiming && window.performance && window.performance.timing && window.performance.timing.navigationStart) {\r\n return (eventTiming - window.performance.timing.navigationStart);\r\n }\r\n },\r\n // This will be deprecated in upcoming iterations, so please use telemetryDataTypes.TelemetryType. Please follow these new definitions: https://microsoft.sharepoint.com/:x:/t/IDXTelemetryandDatafabric/EbMw_1_6OCtNtyXkbb2YcjoBxY2iFtWOW-kfQZLJmnErEw\r\n telemetryModuleTypes:\r\n {\r\n Undefined: 0,\r\n Header: 1,\r\n Footer: 2,\r\n topNavBar: 3,\r\n navBar: 4,\r\n dropDown: 5,\r\n Section: 6,\r\n Carousel: 7,\r\n Module: 8,\r\n searchBox: 9,\r\n inputBox: 10,\r\n actionButton: 11,\r\n Interaction: 12,\r\n Headline: 13,\r\n Navigation: 14,\r\n Entity: 15,\r\n structuredData: 16,\r\n appStore: 17,\r\n appLaunch: 18,\r\n cmsPromotions: 19,\r\n microsoftWebStore: 20,\r\n xboxStore: 21,\r\n officeStore: 22,\r\n appInstall: 23,\r\n PartnerLinks: 24,\r\n SponsoredContent: 25\r\n },\r\n contentPlacedBySource:\r\n {\r\n Editorial: 0,\r\n PersonalizationAlgo: 1,\r\n BingAlgo: 2,\r\n Taboola: 3,\r\n Outbrain: 4\r\n },\r\n telemetryDataAttribute: \"data-m\",\r\n telemetryHLAttribute: \"data-hl\",\r\n client:\r\n {\r\n // client id\r\n clientId: function () {\r\n if (!clientClientId && clientClientId !== \"\") {\r\n // @ts-ignore\r\n clientClientId = getCookie(trackInfo.MUIDCookie) || trackInfo.sitePage.requestId || \"\";\r\n }\r\n\r\n return clientClientId;\r\n },\r\n clientIdType: function () {\r\n // @ts-ignore\r\n if (clientClientId === trackInfo.sitePage.requestId) {\r\n clientIdTypeValue = \"activityId\";\r\n } else if (clientClientId !== \"\") {\r\n clientIdTypeValue = \"muid\";\r\n }\r\n\r\n return clientIdTypeValue;\r\n },\r\n gesture: function () {\r\n var element = dom.getTarget(trackInfo.event);\r\n if (element && element[trackInfo.gestureKey]) {\r\n return element[trackInfo.gestureKey]\r\n }\r\n var trackInfoEvent: any = trackInfo.event;\r\n if (trackInfoEvent) {\r\n if ((trackInfoEvent.originalEvent && trackInfoEvent.originalEvent == 'contextmenu') || trackInfoEvent.ctrlKey || trackInfoEvent.shiftKey) {\r\n return trackInfo.gestureType.rightclick\r\n }\r\n }\r\n return ''\r\n },\r\n\r\n getMuid: function () {\r\n return getCookie(trackInfo.MUIDCookie);\r\n },\r\n\r\n getAnonCookieName: function () {\r\n /// \r\n /// Gets the anonCookieName from the headData (hybrid) or the appEnvironment. ANON for Pages with manual sign in, else APP_ANON.\r\n /// \r\n /// \r\n /// \r\n return headData.AnonCookieName || appEnvironment.AuthCookieName;\r\n },\r\n\r\n getSsoComplete: function () {\r\n /// \r\n /// Gets the SsoComplete state from the headData. true if sso completes otherwise false.\r\n /// Used only for prime. DHP/NTP does not have anon.\r\n /// \r\n /// \r\n /// \r\n\r\n if (headData.SsoComplete && (headData.SsoComplete + '').toLowerCase() === 'true') {\r\n return 1;\r\n }\r\n\r\n return 0;\r\n },\r\n\r\n /**\r\n * Gets the Aad state from the headData or appEnvironment\r\n * @returns {number} The AAD authenticated state.\r\n */\r\n getAadAuthentication: function (): AadAccountType {\r\n // Check the head data for the hybrid page\r\n if (headData.AadState === true) {\r\n // AAD AuthenticatedState\r\n return AadAccountType.AadAccount;\r\n } else if (headData.AadState === false) {\r\n // AAD UnauthenticatedState\r\n return AadAccountType.NonAadAccount;\r\n }\r\n\r\n // Check the headData first for the Hybrid page, else use appEnvironment\r\n const accountType: AccountType = appEnvironment.AccountType;\r\n const isAadAccount: boolean = (accountType === AccountType.AAD)\r\n return isAadAccount ? AadAccountType.AadAccount : AadAccountType.NonAadAccount;\r\n },\r\n\r\n /**\r\n * Gets the device orientation\r\n */\r\n orientation: function () {\r\n if (!canUseDOM()) {\r\n return \"\";\r\n }\r\n return screen.width > screen.height ? \"landscape\" : \"portrait\";\r\n },\r\n\r\n OTFTelemetry: function (mechanism?: string): void {\r\n {\r\n if (!canUseDOM()) {\r\n return;\r\n }\r\n\r\n if (typeof mechanism === \"undefined\") {\r\n // mechanism is only undefined on page load.\r\n // Peregrine already sends an impression update on page load through\r\n // EntryPoint.connector#onVisuallyReady, so this one can be skipped.\r\n return;\r\n }\r\n\r\n if (mechanism == null) {\r\n mechanism = \"\";\r\n }\r\n\r\n modules = [];\r\n var telemetryData = document.body.querySelectorAll(\"[data-m]\");\r\n\r\n // calculate windowRight, windowLeft, and windowHeight upfront to avoid multiple calls to getBoundingClientRect() and\r\n // reduce performance impact\r\n var windowHeight;\r\n var windowRight;\r\n\r\n windowHeight = window.innerHeight;\r\n windowRight = window.innerWidth;\r\n\r\n var windowLeft = 0;\r\n var contentArea = document.getElementById(\"content\");\r\n\r\n if (contentArea) {\r\n var contentRect = contentArea.getBoundingClientRect();\r\n windowRight = contentRect.right;\r\n windowLeft = contentRect.left;\r\n }\r\n\r\n // Everything inside infopane is considered visible as long as infopane itself is visible due to auto rotation\r\n // First get infopane itself (\"mip\" is for infopane in mid-level, \"sip\" is for spartan infopane).\r\n var infopane = document.body.querySelector(\".ip\") || document.body.querySelector(\".mip\") || document.body.querySelector(\".sip\");\r\n var infopaneVisible = infopane && trackInfo.telemetryTracking.isVisible(infopane, windowRight, windowLeft, windowHeight);\r\n\r\n // cache result of IsVisible() to reduce performance impact caused by getBoundingClientRect()\r\n var visibles = [];\r\n for (var i = 0; i < telemetryData.length; i++) {\r\n // if otfUseViewportForVisibility is true, we will use the whole viewport to determine the visibility of the element\r\n if (telemetryData[i].getAttribute(\"data-otfUseViewportForVisibility\") === \"true\") {\r\n // @ts-ignore window.width\r\n visibles.push(trackInfo.telemetryTracking.isVisible(telemetryData[i], window.width, 0, windowHeight, infopaneVisible));\r\n } else {\r\n visibles.push(trackInfo.telemetryTracking.isVisible(telemetryData[i], windowRight, windowLeft, windowHeight, infopaneVisible));\r\n }\r\n }\r\n\r\n for (var j = 0; j < telemetryData.length; j++) {\r\n modules.push(new Module(telemetryData[j], visibles[j]));\r\n }\r\n var context = trackInfo.telemetryTracking.formatModules();\r\n // @ts-ignore\r\n if (context && ((context.e && context.e.length > 0) || (context.vc && context.vc.length > 0))) {\r\n trackInfo.telemetryTracking.sendImprUpdateEvent(mechanism, context);\r\n }\r\n }\r\n },\r\n\r\n // browser height\r\n height: function () {\r\n if (!browserHeight) {\r\n getBrowserSize();\r\n }\r\n return browserHeight;\r\n },\r\n\r\n pageTitle: function () {\r\n /**\r\n * returns the page title\r\n */\r\n if (!canUseDOM()) {\r\n return \"\";\r\n }\r\n\r\n return document.title;\r\n },\r\n\r\n // entire url of the current page\r\n // use a function because we may virtually change the page by manipulating the history stack\r\n // (for example, in a gallery when changing slides).\r\n pageUrl: function () {\r\n var pageUrl = getLocationHref();\r\n // @ts-ignore\r\n var ocid = trackInfo.sitePage.msnocid;\r\n if (ocid) {\r\n // This is the DHP or NTP page - need to add the OCID to pageUrl.\r\n var hasQueryString = pageUrl.indexOf(\"?\") >= 0;\r\n pageUrl = hasQueryString ? pageUrl + \"&\" : pageUrl + \"?\";\r\n pageUrl = pageUrl + \"ocid=\" + ocid;\r\n }\r\n\r\n return pageUrl;\r\n },\r\n\r\n // URL of the document that loaded the current document\r\n // first check for an override property that we may set during virtual page changes, and if\r\n // that's not set, use the real referrer.\r\n // @ts-ignore\r\n referrer: function () {\r\n if (!canUseDOM()) {\r\n return \"\";\r\n }\r\n\r\n // @ts-ignore\r\n return document.referrerOverride || document.referrer;\r\n },\r\n // screen resolution\r\n screenResolution: function () {\r\n if (!canUseDOM()) {\r\n return \"\";\r\n }\r\n\r\n var screenResolution = [screen.width, screen.height].join(\"x\");\r\n\r\n return screenResolution;\r\n },\r\n\r\n userAgent: function () {\r\n /**\r\n * gets the user agent\r\n */\r\n if (!canUseDOM()) {\r\n return \"\";\r\n }\r\n\r\n return navigator.userAgent;\r\n },\r\n\r\n // browser width\r\n width: function () {\r\n if (!browserWidth) {\r\n getBrowserSize();\r\n }\r\n return browserWidth;\r\n },\r\n //sends the Browser Hidden Field on window\r\n wasBrowserHiddenAtLeastOnce: function () {\r\n return visibilityService.wasBrowserHiddenAtLeastOnce();\r\n }\r\n },\r\n userDynamic:\r\n {\r\n timeStamp: function () {\r\n /// \r\n /// generates the timestamp for the url\r\n /// \r\n /// \r\n /// \r\n return trackInfo.getCurrentTime();\r\n },\r\n slideType: function () {\r\n /// \r\n /// Finds the slide type if any (and if a slide)\r\n /// \r\n /// \"halfpane\" or null\r\n if (!canUseDOM()) {\r\n return null;\r\n }\r\n\r\n // @ts-ignore\r\n var elem = trackInfo.event.target;\r\n var halfpaneClass = \"halfpane\";\r\n while (elem && dom.name(elem) != \"SECTION\") {\r\n if (dom.name(elem) == \"LI\" && dom.containsClass(elem, halfpaneClass)) {\r\n return halfpaneClass;\r\n }\r\n elem = dom.parent(elem);\r\n }\r\n return null;\r\n },\r\n firstEventIndex: function () {\r\n /// \r\n /// The first rid event index.\r\n /// This value gets incremented for each event of the first rid that is triggered\r\n /// \r\n /// \r\n /// Sequential number of the current event\r\n /// \r\n\r\n return ++eventIndex[0];\r\n },\r\n currentEventIndex: function () {\r\n /// \r\n /// The current event index.\r\n /// This value gets incremented for each event that is triggered\r\n /// \r\n /// \r\n /// Sequential number of the current event\r\n /// \r\n if (isFirstEventIndex) {\r\n return ++eventIndex[0];\r\n } else {\r\n return ++eventIndex[1];\r\n }\r\n },\r\n requestId: function () {\r\n /// \r\n /// return the requestId\r\n /// \r\n return pageInstance.getRequestId() || (trackInfo.sitePage).requestId;\r\n },\r\n resetEventIndex: function () {\r\n /// \r\n /// reset the event index\r\n /// \r\n eventIndex[1] = 0;\r\n isFirstEventIndex = false;\r\n }\r\n },\r\n custom:\r\n {\r\n addCustomTags: function () {\r\n /// \r\n /// Adds the custom tags inside the otf beacon url.\r\n /// \r\n /// \r\n /// \r\n\r\n var combinedTags = trackInfo.customTags;\r\n combinedTags = extend({}, trackInfo.customTags, eventTransientCustomTags);\r\n //reset so the next events gets its own transient custom tags\r\n eventTransientCustomTags = {};\r\n return JSON.stringify(combinedTags);\r\n },\r\n addCustomTagsForClickEvent: function () {\r\n /// \r\n /// Adds the custom tags for click event inside the otf beacon url.\r\n /// \r\n /// \r\n /// \r\n\r\n var customTags = \"\";\r\n if (typeof userDefinedCustomTags === \"object\") {\r\n for (var key in userDefinedCustomTags) {\r\n customTags = JSON.stringify(userDefinedCustomTags);\r\n break;\r\n }\r\n }\r\n //reset so the next events gets its own custom tags\r\n userDefinedCustomTags = {};\r\n return customTags;\r\n }\r\n },\r\n telemetryTracking:\r\n {\r\n setupParameters: function (evt) {\r\n var trackInfoSitePage = trackInfo.sitePage;\r\n const anonckName: string = appEnvironment.AuthCookieName as string;\r\n\r\n var result = {\r\n evt: evt,\r\n // @ts-ignore\r\n rid: pageInstance.getRequestId() || trackInfoSitePage.requestId,\r\n // @ts-ignore\r\n di: trackInfoSitePage.domainId,\r\n clid: trackInfo.client.clientId(),\r\n issso: trackInfo.client.getSsoComplete(),\r\n aadState: trackInfo.client.getAadAuthentication()\r\n };\r\n\r\n // @ts-ignore\r\n if (trackInfoSitePage.afd) {\r\n // @ts-ignore\r\n result.afd = trackInfoSitePage.afd;\r\n }\r\n\r\n if (anonckName) {\r\n // @ts-ignore\r\n result.anoncknm = anonckName;\r\n }\r\n\r\n // Set the new page parameters for all post events\r\n // @ts-ignore\r\n result[\"pg.p\"] = trackInfo.sitePage.page_product;\r\n // @ts-ignore\r\n result[\"pg.t\"] = trackInfo.sitePage.page_type;\r\n // @ts-ignore\r\n result[\"pg.n\"] = trackInfo.sitePage.page_name;\r\n // @ts-ignore\r\n result[\"pg.c\"] = trackInfo.sitePage.page_configuration;\r\n\r\n return result;\r\n },\r\n sendImprUpdateEvent: function (mechanism, modules, topLevelContainerType?) {\r\n // Prevent empty impr_update\r\n if (!canUseDOM() || modules == undefined || ((modules.e == undefined || modules.e.length <= 0) && (modules.vc == undefined || modules.vc.length <= 0))) {\r\n return;\r\n }\r\n\r\n var parameters = this.setupParameters(trackInfo.eventTypes.imprUpdate);\r\n if (parameters) {\r\n // mechanism to trigger the viewability event. ex: load, swipe, click, tap, scroll, and resize\r\n parameters[\"mech\"] = mechanism;\r\n\r\n parameters.winht = getWindowHeight();\r\n parameters.docht = getDocHeight();\r\n parameters.scrollOff = getWindowYscroll();\r\n\r\n parameters.wbh = visibilityService.wasBrowserHiddenAtLeastOnce();\r\n parameters[\"e1\"] = modules;\r\n // @ts-ignore\r\n parameters.tmpl = trackInfo.sitePage.templ;\r\n // @ts-ignore\r\n parameters.mkt = trackInfo.sitePage.localeCode;\r\n if (mechanism === trackInfo.imprUpdateMechanisms.scroll) {\r\n parameters.TTI = trackInfo.timeToInteract();\r\n }\r\n\r\n // @ts-ignore\r\n if (window && window.adsEnabled != null) {\r\n // @ts-ignore\r\n parameters.adoni = +window.adsEnabled;\r\n }\r\n\r\n // Feed parameters\r\n // @ts-ignore\r\n if (trackInfo.sitePage.feedId) {\r\n // @ts-ignore\r\n parameters.fid = trackInfo.sitePage.feedId;\r\n // @ts-ignore\r\n parameters.fn = trackInfo.sitePage.feedName;\r\n // @ts-ignore\r\n parameters.ft = trackInfo.sitePage.feedType;\r\n }\r\n\r\n // @ts-ignore\r\n if (trackInfo.sitePage.flightid) {\r\n // @ts-ignore\r\n parameters.flightid = trackInfo.sitePage.flightid;\r\n }\r\n\r\n // If toplevel container is passed to impression update then create a new parameter which will eventually be replaced by tlc.\r\n if (topLevelContainerType) {\r\n parameters.tlcType = topLevelContainerType;\r\n }\r\n\r\n this.sendUpdate(parameters);\r\n }\r\n },\r\n isVisible: function (element, windowRight?, windowLeft?, windowHeight?, infopaneVisible?) {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n return visibilityService.isElementTrulyVisible(element, windowRight, windowLeft, windowHeight);\r\n },\r\n formatModules: function () {\r\n var formattedModules = [];\r\n\r\n for (var index in modules) {\r\n var module = modules[index];\r\n if (module && module.compress) {\r\n var mData = module.compress();\r\n\r\n // TODO: (nubenja) Remove this once data-m.y is deprecated\r\n // Convertion from telemetryType (data-m.y) to telemetryContentType and telemetryContentAction (data-m.ct/ca)\r\n if (mData && mData.y && !mData.ct) {\r\n var ct = telemetryDataTypes.getTelemetryContentType(mData.y);\r\n\r\n if (ct) {\r\n mData.ct = ct;\r\n }\r\n }\r\n\r\n formattedModules.push(mData);\r\n }\r\n\r\n }\r\n\r\n var context = {};\r\n if (formattedModules && formattedModules.length > 0) {\r\n // @ts-ignore\r\n context.e = formattedModules;\r\n }\r\n\r\n return context;\r\n },\r\n sendUpdate: function (parameters) {\r\n // For the preloaded pages, the code inside requestPageRevealAsync is called when page is revealed,\r\n // otherwise it is called right away.\r\n telemetryReadyCallback((): void => {\r\n if (!trackInfo.shouldFireTelemetry()) {\r\n return;\r\n }\r\n\r\n // An ad call may send this without setting up the baseUrl correctly.\r\n // @ts-ignore\r\n baseUrl = baseUrl || (trackInfo.sitePage || {}).otfURL;\r\n if (!baseUrl) {\r\n // The value of sitePage.otfURL was empty!\r\n return;\r\n }\r\n\r\n if (!parameters) {\r\n return;\r\n }\r\n\r\n // increment the event index and set the idx parameter\r\n parameters.idx = trackInfo.userDynamic.currentEventIndex();\r\n\r\n // An ad call may send this without setting up the baseUrl correctly.\r\n var beaconData = {\r\n url: baseUrl,\r\n requestType: telemetryConstants.POST,\r\n // @ts-ignore\r\n eventType: parameters.evt || trackInfo.eventTypes.impressionUpdate,\r\n params: parameters,\r\n trackingType: telemetryConstants.OTF\r\n };\r\n\r\n mediator.pub(telemetryConstants.FireTelemetry, beaconData);\r\n });\r\n }\r\n },\r\n updateTemplValue: function (templToAdd) {\r\n /// Updates the templ value with the specified value\r\n /// The templ value to add\r\n\r\n trackInfo.updateSitePage(templToAdd);\r\n },\r\n updateSitePage: function (templ, flightId?, requestId?) {\r\n /// Updates the trackInfo.sitePage values with the specified values\r\n /// The new templ value to add\r\n /// The new flightId to add\r\n /// The new trackInfo object\r\n\r\n var currentSitePage = trackInfo.sitePage;\r\n if (!currentSitePage) {\r\n currentSitePage = trackInfo.sitePage = {};\r\n }\r\n\r\n // @ts-ignore\r\n var currentFlightIds = currentSitePage.flightid;\r\n if (flightId && (!currentFlightIds || (currentFlightIds.indexOf(flightId) < 0))) {\r\n // @ts-ignore\r\n currentSitePage.flightid = joinTelemetryValues(\",\", currentFlightIds, flightId);\r\n }\r\n // @ts-ignore\r\n currentSitePage.templ = joinTelemetryValuesForTmpl(\";\", currentSitePage.templ, templ);\r\n\r\n if (requestId) {\r\n // @ts-ignore\r\n currentSitePage.requestId = requestId;\r\n }\r\n },\r\n updatePageName: function (pageName, overridePageType) {\r\n /// Updates the pageName and pageType in the trackInfo.SitePage for the given pageName\r\n /// The pageName to update\r\n /// Boolean flag to determine to override pagetype or not. Default is true\r\n var doOverridePageType = overridePageType;\r\n if (overridePageType === undefined) {\r\n doOverridePageType = true;\r\n }\r\n\r\n var telemetryPageName = telemetryDataTypes.getTelemetryPageInfo(pageName);\r\n if (telemetryPageName && trackInfo.sitePage) {\r\n // @ts-ignore\r\n trackInfo.sitePage.page_name = telemetryPageName.PageName;\r\n if (doOverridePageType) {\r\n // @ts-ignore\r\n trackInfo.sitePage.page_type = telemetryPageName.PageType;\r\n }\r\n }\r\n },\r\n updateFeedMetadata: function (feedId, feedName, feedType) {\r\n /// Updates the feedid, feedname and feedType in the trackInfo.SitePage for the given feed\r\n /// The feedId to update\r\n /// The feedName to update\r\n /// The feedType to update\r\n if (feedId) {\r\n // @ts-ignore\r\n trackInfo.sitePage.feedId = feedId;\r\n if (feedName) {\r\n // @ts-ignore\r\n trackInfo.sitePage.feedName = feedName;\r\n }\r\n\r\n if (feedType) {\r\n // @ts-ignore\r\n trackInfo.sitePage.feedType = feedType;\r\n }\r\n }\r\n },\r\n updatePagePivot: function (pagePivot) {\r\n /// Updates the pagePivot in the trackInfo.SitePage\r\n /// The pagePivot to update\r\n if (pagePivot === telemetryDataTypes.TelemetryPagePivot.Undefined) {\r\n // @ts-ignore\r\n trackInfo.sitePage.pagePivot = null;\r\n } else if (telemetryDataTypes.validateTelemetryDataType(telemetryDataTypes.TelemetryPagePivot, pagePivot)) {\r\n // @ts-ignore\r\n trackInfo.sitePage.pagePivot = pagePivot;\r\n }\r\n },\r\n updateReferrer: function (referrer, referrerType) {\r\n /// Updates referrer and referrerType\r\n /// referrer\r\n /// TelemetryContentType of the referrer\r\n if (canUseDOM() && referrer) {\r\n // @ts-ignore\r\n document.referrerOverride = referrer;\r\n\r\n if (referrerType && telemetryDataTypes.validateTelemetryDataType(telemetryDataTypes.TelemetryContentType, referrerType) &&\r\n referrerType != telemetryDataTypes.TelemetryContentType.Undefined) {\r\n // @ts-ignore\r\n trackInfo.sitePage.referrerType = referrerType;\r\n }\r\n }\r\n },\r\n setCustomTagsForClickEvent: function (key, value) {\r\n /// \r\n /// Set user defined custom tags.\r\n /// \r\n /// The key\r\n /// The value\r\n if (key && value && value != undefined) {\r\n userDefinedCustomTags[key] = value;\r\n }\r\n },\r\n updatePageUserTypeAndUserId: function (userType, userId) {\r\n /// \r\n /// Set user id and user id type.\r\n /// \r\n /// The user id type\r\n /// The user id\r\n\r\n // @ts-ignore\r\n trackInfo.sitePage.pageUserId = null;\r\n // @ts-ignore\r\n trackInfo.sitePage.pageUserType = null;\r\n\r\n if (telemetryDataTypes.validateTelemetryDataType(telemetryDataTypes.TelemetryUserType, userType)) {\r\n // @ts-ignore\r\n trackInfo.sitePage.pageUserType = userType;\r\n\r\n if (userId) {\r\n // @ts-ignore\r\n trackInfo.sitePage.pageUserId = userId;\r\n }\r\n }\r\n },\r\n trackCustomProperty: function (key, value) {\r\n /// Adds or updates the transient per event custom tags properties\r\n /// key to add\r\n /// value to add\r\n if (key && value != undefined) {\r\n key = key.toLowerCase();\r\n eventTransientCustomTags[key] = value;\r\n }\r\n },\r\n updateExtendedFlightId: function (namespace, flightIds) {\r\n /// Adds or updates extended flightId\r\n /// Partner namespace enum\r\n /// flightIds to add\r\n\r\n var currentSitePage = trackInfo.sitePage;\r\n\r\n if (currentSitePage && flightIds && namespace &&\r\n telemetryDataTypes.validateTelemetryDataType(telemetryDataTypes.TelemetryPartnerNamespace, namespace)) {\r\n // @ts-ignore\r\n currentSitePage.extflightid = joinTelemetryValuesForTmpl(\"|\", currentSitePage.extflightid, namespace + \":\" + flightIds);\r\n }\r\n }\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * The app error object that contains the data of an app error\r\n */\r\nexport interface AppError {\r\n /** error id */\r\n id: number,\r\n\r\n /** source file */\r\n source?: string,\r\n\r\n /** Message or data */\r\n message?: string,\r\n\r\n /** severity */\r\n severity?: Severity,\r\n\r\n /** Property Bag */\r\n pb?: AppErrorPropertyBag\r\n}\r\n\r\n/**\r\n * The app error property bag that will be used for build number etc.\r\n */\r\nexport interface AppErrorPropertyBag {\r\n /** build number */\r\n build?: string,\r\n\r\n /** custom message */\r\n customMessage?: string\r\n}\r\n\r\n/**\r\n * The interface that defines a generic app error tracker\r\n */\r\nexport interface AppErrorTracker {\r\n /**\r\n * Report an app error\r\n * @param {AppError} error - the app error to report\r\n */\r\n trackError(error: AppError): Promise;\r\n}\r\n\r\n/**\r\n * This will decide whether to create Alert for this app error or no alert. This can generate IcM ticket.\r\n * Alerts ones are tracked at http://aka.ms/AppErrors\r\n * NoAlerts will have separate tab just next to Errors aka Warnings. IcM ticket won't be generated when NoAlert is set.\r\n */\r\nexport enum Severity {\r\n Alert,\r\n NoAlert,\r\n HighImpact\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { getRequestData } from \"./requestData\";\r\n\r\n/**\r\n * Checks if the DOM is available to access and use.\r\n * @returns {boolean} - true if DOM is available, or false if it is not. This is typically true for\r\n * client side rendering and false for server side rendering.\r\n */\r\nexport function canUseDOM(): boolean {\r\n return !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\r\n}\r\n\r\n/**\r\n * Get window.location.href in an isomorphic manner.\r\n */\r\nexport function getLocationHref(): string {\r\n return canUseDOM() ? window.location.href : getRequestData().url.href;\r\n}\r\n\r\n/**\r\n * Get window.location.hostname in an isomorphic manner.\r\n */\r\nexport function getLocationHostname(): string {\r\n return canUseDOM() ? window.location.hostname : getRequestData().url.hostname;\r\n}\r\n\r\n/**\r\n * Get window.location.host in an isomorphic manner.\r\n */\r\nexport function getLocationHost(): string {\r\n return canUseDOM() ? window.location.host : getRequestData().url.host;\r\n}\r\n\r\n/**\r\n * Get window.location.origin in an isomorphic manner.\r\n */\r\nexport function getLocationOrigin(): string {\r\n return canUseDOM() ? window.location.origin : getRequestData().url.origin;\r\n}\r\n\r\n/**\r\n * Get window.location.search in an isomorphic manner.\r\n */\r\nexport function getLocationSearch(): string {\r\n return canUseDOM() ? window.location.search : getRequestData().url.search;\r\n}\r\n\r\n/**\r\n * Get window.location.pathname in an isomorphic manner.\r\n */\r\nexport function getLocationPathname(): string {\r\n return canUseDOM() ? window.location.pathname : getRequestData().url.pathname;\r\n}\r\n\r\n/**\r\n * Get window.location.protocol in an isomorphic manner.\r\n */\r\nexport function getLocationProtocol(): string {\r\n return canUseDOM() ? window.location.protocol : getRequestData().url.protocol;\r\n}\r\n\r\n/**\r\n * Get window.location.hash in an isomorphic manner.\r\n */\r\nexport function getLocationHash(): string {\r\n return canUseDOM() ? window.location.hash : getRequestData().url.hash;\r\n}\r\n\r\n/**\r\n * Get window.document.getElementById(elementId).\r\n */\r\nexport function getDocumentElementById(elementId: string): HTMLElement {\r\n if (!canUseDOM()) {\r\n throw new Error(\"getDocumentElementById is unsupported server side. This call should be wrapped in canUseDOM().\");\r\n }\r\n\r\n return window.document.getElementById(elementId);\r\n}\r\n\r\n/**\r\n * Get window.document.getDocumentElementsByTagName(elementId).\r\n */\r\nexport function getDocumentElementsByTagName(tagName: string): HTMLCollectionOf {\r\n if (!canUseDOM()) {\r\n throw new Error(\"getDocumentElementsByTagName is unsupported server side. This call should be wrapped in canUseDOM().\");\r\n }\r\n\r\n return window.document.getElementsByTagName(tagName);\r\n}\r\n\r\n/**\r\n * Get localStorage in an isomorphic manner.\r\n * Todo (http://osgvsowi/23753462), provide actual functionality for localStorage on the server side.\r\n */\r\nexport function getLocalStorage(): Storage {\r\n return canUseDOM() ? window.localStorage : null;\r\n}\r\n\r\n/**\r\n * Get indexedDB in an isomorphic manner.\r\n * Todo (http://osgvsowi/23753462), provide actual functionality for indexedDB on the server side.\r\n */\r\nexport function getIndexedDB(): IDBFactory {\r\n return canUseDOM() ? window.indexedDB : null;\r\n}\r\n\r\n/**\r\n * Get window.innerWidth in an isomorphic manner.\r\n * Todo (http://osgvsowi/23876778), remove the need for server to know about innerWidth by limiting layout options or use CSS based solution.\r\n */\r\nexport function getInnerWidth(): number {\r\n return canUseDOM() ? window.innerWidth : getRequestData().innerWidth;\r\n}\r\n\r\n/**\r\n * Get window.innerWidth in an isomorphic manner.\r\n * Todo (http://osgvsowi/23876778), remove the need for server to know about innerWidth by limiting layout options or use CSS based solution.\r\n */\r\nexport function getInnerHeight(): number {\r\n return canUseDOM() ? window.innerHeight : getRequestData().innerHeight;\r\n}\r\n\r\n/**\r\n * Get window.devicePixelRatio in an isomorphic manner.\r\n */\r\nexport function getDevicePixelRatio(): number {\r\n return canUseDOM() ? window.devicePixelRatio : getRequestData().devicePixelRatio;\r\n}\r\n\r\n/**\r\n * Get CSS Grid support in an isomorphic manner\r\n */\r\nexport function getCssGridSupport(): boolean {\r\n return !!(canUseDOM() ? (window.CSS && window.CSS.supports && CSS.supports(\"display\", \"grid\")) : getRequestData().canUseCssGrid);\r\n}\r\n\r\n/**\r\n * Get variable font support in an isomorphic manner\r\n * TODO: SSR currently does not support custom fonts.\r\n */\r\nexport function getVariableFontSupport(): boolean {\r\n if (!canUseDOM()) {\r\n throw new Error(\"SSR currently does not support custom fonts.\");\r\n }\r\n\r\n return !!(window.CSS && window.CSS.supports && CSS.supports(\"(font-variation-settings: normal)\"));\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * The aria-label html attribute\r\n * @type {string}\r\n */\r\nexport const ariaLabelAttribute: string = \"aria-label\";\r\n\r\n/**\r\n * The id attribute on the
element that is the root element for Peregrine Pages / Experiences.\r\n * There is only ever 1 root element on a page\r\n * @type {string}\r\n */\r\nexport const rootElementId: string = \"msnewsroot\";\r\n\r\n/**\r\n * Element names that are commonly used in Peregrine pages and experiences\r\n * @type {object}\r\n */\r\nexport const htmlElementIds: any = {\r\n html: \"html\",\r\n head: \"head\",\r\n body: \"body\"\r\n};\r\n\r\n/**\r\n * Constants used by application cache related scenarios\r\n */\r\nexport const applicationCacheConstants = {\r\n /**\r\n * Attribute name on html tag that is set when appcache is being used on the page\r\n */\r\n manifestAttributeName: \"manifest\",\r\n\r\n /**\r\n * Local storage key that holds the appcache info used to determine page refresh needs\r\n * for different page types.\r\n */\r\n pagesRefreshData: \"ac_prd\",\r\n\r\n /**\r\n * Local storage key that holds the appcache stored head data entries\r\n */\r\n storedHeadDataKey: \"ac_shd\",\r\n\r\n /**\r\n * Local storage key that holds the appcache stored activity IDs\r\n */\r\n storedLastUsedActivityIdKey: \"ac_sai\"\r\n\r\n};\r\n\r\n/**\r\n * The attributes that are part of markup elements that we care about\r\n */\r\nexport const clientSettings = \"data-client-settings\";\r\nexport const pagetypeSettings = \"data-pagetype\";\r\nexport const id = \"data-id\";\r\nexport const info = \"data-info\";\r\nexport const js = \"data-js\";\r\nexport const m = \"data-m\";\r\nexport const lang = \"lang\";\r\nexport const dir = \"dir\";\r\nexport const serviceUrl = \"data-service-url\";\r\nexport const telemetryId = \"data-telemetry-id\";\r\nexport const trackPageProduct = \"data-page-product\";\r\nexport const trackPageType = \"data-page-type\";\r\n\r\n/**\r\n * The number of characters that our Service Request Ids must have. This is currently defined by OneService\r\n * @type {number}\r\n */\r\nexport const numberOfCharactersNeededForUniqueRequestId: number = 32;\r\n\r\n/**\r\n * The minimum number of path segments that will be in the URL which hosts MS News Experience pages.\r\n * The first path segment should be the vertical key, e.g. spartan and the second path segment\r\n * should be the the category key, e.g. ntp\r\n * @type {number}\r\n */\r\nexport const minimumHostPagePathSegments: number = 2;\r\n\r\n/**\r\n * Default value we use for the name of the cookie that holds the ANID\r\n */\r\nexport const anonCookieName = \"APP_ANON\";\r\n\r\n/**\r\n * App Anon Cookie Exists Cookie Name. This cookie is a marker if APP_ANON exist or not.\r\n * This is necessary because APP_ANON is HTTP cookie and not accessible by JS.\r\n */\r\nexport const appAnonCookieExistsCookieName = \"aace\";\r\n\r\n/**\r\n * Child cookie name, used to signal if rpsUser is child account.\r\n */\r\nexport const childCookieName = \"child\";\r\n\r\n/**\r\n * Migration consent state cookie, indicates user has already granted or denied migration consent\r\n */\r\nexport const migrationConsentStateKey = \"migration-state\";\r\n\r\n/**\r\n * Id of MSCC cookie banner container element.\r\n */\r\nexport const msccCookieBannerElementId = \"consent-banner-container\";\r\n\r\n/**\r\n * Headers used for one service requests\r\n */\r\nexport const oneServiceHeaders = {\r\n activityId: \"x-client-activityid\",\r\n authorization: \"Authorization\"\r\n};\r\n\r\n/**\r\n * used query string params in OneService requests\r\n */\r\nexport const oneServiceQueryStringKeys = {\r\n activityId: \"activityId\",\r\n apiKey: \"apikey\",\r\n complexInfoPaneEnabled: \"cipenabled\",\r\n contentType: \"contentType\",\r\n delta: \"delta\",\r\n disableTypeSerialization: \"DisableTypeSerialization\",\r\n infopaneCount: \"infopaneCount\",\r\n fdhead: \"fdhead\",\r\n feedLayoutRequestType: \"t\",\r\n filter: \"$filter\",\r\n ids: \"ids\",\r\n location: \"location\",\r\n market: \"market\",\r\n ocid: \"ocid\",\r\n parentContentId: \"parent-content-id\",\r\n parentNamespace: \"parent-ns\",\r\n parentTitle: \"parent-title\",\r\n query: \"query\",\r\n queryType: \"queryType\",\r\n qScope: \"qscope\",\r\n responseSchema: \"responseschema\",\r\n select: \"$select\",\r\n session: \"session\",\r\n signInCookieName: \"scn\",\r\n skip: \"$skip\",\r\n source: \"source\",\r\n timeOut: \"timeOut\",\r\n top: \"$top\",\r\n user: \"user\",\r\n wrapOData: \"wrapodata\"\r\n};\r\n\r\n/**\r\n * Constants to use as role attribute value for elements\r\n */\r\nexport enum AriaRoles {\r\n /**\r\n * Presentation role is used to remove semantic meaning from an element and any of its related child elements.\r\n */\r\n Presentation = \"presentation\"\r\n}\r\n\r\n/**\r\n * Basic enum values for mobile device orientation\r\n */\r\nexport enum DeviceOrientation {\r\n Unknown = \"Unknown\",\r\n Portrait = \"Portrait\",\r\n Landscape = \"Landscape\"\r\n}\r\n\r\n/**\r\n * Enterprise compliant domain for One Service api\r\n */\r\nexport const EnterpriseOneServiceApi = \"https://ent-api.msn.com/\";\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n// Defines constants used in telemetry beacons\r\n// \r\n// This is a auto-generated file using MSNTelemetryCodeGen (https://microsoft.visualstudio.com/DefaultCollection/Universal%20Store/_git/MSN.Tool.Telemetry?path=%2FMSNTelemetryDimensionsCodeGen/)\r\n// \r\n\r\n// \r\n// This is a auto-generated file using MSNTelemetryDimensionsCodeGen (https://microsoft.visualstudio.com/DefaultCollection/Universal%20Store/_git/MSN.Tool.Telemetry?path=%2FMSNTelemetryDimensionsCodeGen/)\r\n// \r\nvar PageNamePageTypeMappingList = {};\r\nvar TelemetryTypeContentTypeMappingList = {};\r\nvar TelemetryTypeBehaviorTypeMappingList = {};\r\n\r\n/// Telemetry Product \r\nvar TelemetryProduct = {\r\n Spartan: \"spartan\",\r\n Prime: \"prime\",\r\n PrimeMobile: \"prime_mobile\",\r\n IEext: \"ieext\",\r\n SpartanMobile: \"spartan_mobile\",\r\n TabbedShell: \"tabbedshell\",\r\n ChromeExt: \"chromeext\",\r\n Downlevel: \"downlevel\",\r\n Xbox: \"xbox\"\r\n};\r\n\r\n/// Telemetry PageType \r\nvar TelemetryPageType = {\r\n Unspecified: \"unspecified\",\r\n DHP: \"dhp\",\r\n NTP: \"ntp\",\r\n HomePage: \"hp\",\r\n VerticalHomePage: \"verthp\",\r\n StructuredDataPage: \"data\",\r\n SectionFront: \"secfront\",\r\n SiteSearch: \"sitesearch\",\r\n Article: \"article\",\r\n Gallery: \"gallery\",\r\n Video: \"video\",\r\n SubjectSection: \"subjectsec\",\r\n CustomColumn: \"custcol\"\r\n};\r\n\r\n// TODO: (nubenja) Remove this once all partners moves from TelemetryType to ContentType and ContentAction\r\n/// Telemetry Type \r\nvar TelemetryType = {\r\n Undefined: 0,\r\n Header: 1,\r\n Footer: 2,\r\n TopNavBar: 3,\r\n NavBar: 4,\r\n DropDown: 5,\r\n Section: 6,\r\n Carousel: 7,\r\n Module: 8,\r\n SearchBox: 9,\r\n InputBox: 10,\r\n ActionButton: 11,\r\n Interaction: 12,\r\n Headline: 13,\r\n Navigation: 14,\r\n Entity: 15,\r\n StructuredData: 16,\r\n AppStore: 17,\r\n AppLaunch: 18,\r\n CmsPromotions: 19,\r\n MicrosoftWebStore: 20,\r\n XboxStore: 21,\r\n OfficeStore: 22,\r\n AppInstall: 23,\r\n PartnerLinks: 24,\r\n SponsoredContent: 25,\r\n Follow: 26,\r\n Unfollow: 27,\r\n MoreFrom: 28,\r\n Topic: 29,\r\n Provider: 30,\r\n Spotlight: 33,\r\n ShareClose: 36,\r\n Share: 37,\r\n Like: 38,\r\n Dislike: 39,\r\n Unlike: 40,\r\n Undislike: 41,\r\n Mute: 42,\r\n Unmute: 43,\r\n MuteCancel: 44,\r\n Manage: 45,\r\n NewStories: 46,\r\n AutoSuggest: 47,\r\n BingCard: 48,\r\n Tile: 49,\r\n TrendingNews: 50,\r\n AllCoverage: 51,\r\n Report: 52,\r\n AdChoice: 53,\r\n Hide: 55,\r\n Unhide: 56\r\n};\r\n\r\n/// Telemetry Content Type \r\nvar TelemetryContentType = {\r\n Undefined: 0,\r\n App: 1,\r\n Article: 2,\r\n Feed: 3,\r\n Gallery: 4,\r\n AppStorePromo: 5,\r\n Settings: 6,\r\n SponsoredContent: 7,\r\n StructuredDataCard: 8,\r\n Video: 9,\r\n Webview: 10,\r\n Activity: 11,\r\n Win32: 12,\r\n OfficeDocument: 13,\r\n LocalFile: 14,\r\n CardAction: 15\r\n};\r\n\r\n/// Telemetry Behavior Type \r\nconst TelemetryBehaviorType = {\r\n Undefined: 0,\r\n Navigate: 1,\r\n ContextMenu: 2,\r\n Pin: 3,\r\n Unpin: 4,\r\n Rearrange: 5,\r\n Remove: 6,\r\n Add: 7,\r\n Open: 8,\r\n View: 9,\r\n Follow: 10,\r\n Unfollow: 11,\r\n More: 12,\r\n Close: 13,\r\n Share: 14,\r\n Like: 15,\r\n Dislike: 16,\r\n Unlike: 17,\r\n Undislike: 18,\r\n Mute: 19,\r\n Unmute: 20,\r\n Cancel: 21,\r\n Launch: 22,\r\n Install: 23,\r\n Manage: 24,\r\n Show: 25,\r\n MuteCancel: 26,\r\n Save: 27,\r\n Hide: 28,\r\n Unhide: 29,\r\n Customize: 30\r\n};\r\n\r\n/// Telemetry ContentPlacedBySource \r\nvar ContentPlacedBySource = {\r\n Editor: 0,\r\n PersonalizationAlgo: 1,\r\n Bing: 2,\r\n Taboola: 3,\r\n Outbrain: 4,\r\n AutoCuration: 5,\r\n User: 6,\r\n AppNexus: 7,\r\n OtherSponconProvider: 8\r\n};\r\n\r\n/// Telemetry Page Configuration \r\nvar TelemetryPageConfiguration = {\r\n NoContent: 0,\r\n OneBox: 1,\r\n TopSites: 2,\r\n Suggested: 4,\r\n ContentFeed: 8,\r\n WinFre: 16,\r\n StripeLayout: 1024\r\n};\r\n\r\n/// Telemetry Partner Namespace \r\nvar TelemetryPartnerNamespace = {\r\n MMX: \"m\",\r\n Shell: \"s\",\r\n Edge: \"e\",\r\n Office: \"o\",\r\n Activity: \"a\",\r\n Cortana: \"c\"\r\n};\r\n\r\n/// Telemetry PageName \r\nvar TelemetryPageName = {\r\n StartPage: telemetryPageName(\"startpage\", TelemetryPageType.HomePage),\r\n // @ts-ignore\r\n DefaultPage: telemetryPageName(\"default\"),\r\n // @ts-ignore\r\n EduPage: telemetryPageName(\"edu\"),\r\n // @ts-ignore\r\n ChildModePage: telemetryPageName(\"child\"),\r\n // @ts-ignore\r\n Office: telemetryPageName(\"office\"),\r\n // @ts-ignore\r\n Feed: telemetryPageName(\"xfeed\"),\r\n // @ts-ignore\r\n Discover: telemetryPageName(\"discover\"),\r\n // @ts-ignore\r\n MyInterests: telemetryPageName(\"myinterests\"),\r\n // @ts-ignore\r\n CombinedInterests: telemetryPageName(\"cinterests\"),\r\n ArticlePageNames:\r\n {\r\n Article: telemetryPageName(\"article\", TelemetryPageType.Article),\r\n ArticleVNext: telemetryPageName(\"articlevnext\", TelemetryPageType.Article),\r\n ArticleListicle: telemetryPageName(\"article_listicle\", TelemetryPageType.Article),\r\n ArticleCollection: telemetryPageName(\"articlecollection\", TelemetryPageType.Article),\r\n ArticleFullScreen: telemetryPageName(\"articlefullscreen\", TelemetryPageType.Article),\r\n FlexibleArticle: telemetryPageName(\"articleflex\", TelemetryPageType.Article),\r\n FlexibleArticleMobile: telemetryPageName(\"articleflexmobile\", TelemetryPageType.Article),\r\n ArticleGalleryFullScreen: telemetryPageName(\"article_galleryfs\", TelemetryPageType.Article)\r\n },\r\n GalleryPageNames:\r\n {\r\n Gallery: telemetryPageName(\"gallery\", TelemetryPageType.Gallery),\r\n GalleryVNext: telemetryPageName(\"galleryvnext\", TelemetryPageType.Gallery),\r\n GalleryFullScreen: telemetryPageName(\"gallery_fullscreen\", TelemetryPageType.Gallery),\r\n GalleryClassic: telemetryPageName(\"gallery_classic\", TelemetryPageType.Gallery),\r\n GalleryClassicFullScreen: telemetryPageName(\"gallery_classicfs\", TelemetryPageType.Gallery),\r\n GallerySearch: telemetryPageName(\"gallery_search\", TelemetryPageType.Gallery),\r\n GallerySearchFullScreen: telemetryPageName(\"gallery_searchfs\", TelemetryPageType.Gallery),\r\n FlexibleGallery: telemetryPageName(\"galleryflex\", TelemetryPageType.Gallery),\r\n FlexibleGalleryMobile: telemetryPageName(\"galleryflexmobile\", TelemetryPageType.Gallery),\r\n GalleryImmersive: telemetryPageName(\"gallery_immersive\", TelemetryPageType.Gallery),\r\n GalleryImmersiveFullScreen: telemetryPageName(\"gallery_immersivefs\", TelemetryPageType.Gallery),\r\n GallerySponsored: telemetryPageName(\"gallery_sponsor\", TelemetryPageType.Gallery),\r\n GallerySponsoredFullScreen: telemetryPageName(\"gallery_sponsorfs\", TelemetryPageType.Gallery),\r\n GalleryInline: telemetryPageName(\"gallery_inline\", TelemetryPageType.Gallery)\r\n },\r\n VideoPageNames:\r\n {\r\n ChannelPlayerPage: telemetryPageName(\"channelplayerpage\", TelemetryPageType.Video),\r\n PartnerPlayerPage: telemetryPageName(\"partnerplayerpage\", TelemetryPageType.Video)\r\n },\r\n VerticalHomePageNames:\r\n {\r\n HomePage: telemetryPageName(\"homepage\", TelemetryPageType.VerticalHomePage),\r\n HomePageToday: telemetryPageName(\"homepage-today\", TelemetryPageType.VerticalHomePage)\r\n },\r\n StructuredDataPageNames:\r\n {\r\n Gamecenter: telemetryPageName(\"gamecenter\", TelemetryPageType.StructuredDataPage),\r\n Schedule: telemetryPageName(\"schedule\", TelemetryPageType.StructuredDataPage),\r\n Scores: telemetryPageName(\"scores\", TelemetryPageType.StructuredDataPage),\r\n Stocksummary: telemetryPageName(\"stocksummary\", TelemetryPageType.StructuredDataPage),\r\n Stocksummaryoneriver: telemetryPageName(\"stocksummaryoneriver\", TelemetryPageType.StructuredDataPage),\r\n Weatherxplatmaps: telemetryPageName(\"weatherxplatmaps\", TelemetryPageType.StructuredDataPage),\r\n Standings: telemetryPageName(\"standings\", TelemetryPageType.StructuredDataPage),\r\n Markets: telemetryPageName(\"markets\", TelemetryPageType.StructuredDataPage),\r\n Watchlistpage: telemetryPageName(\"watchlistpage\", TelemetryPageType.StructuredDataPage),\r\n Data_modelpage: telemetryPageName(\"data_modelpage\", TelemetryPageType.StructuredDataPage),\r\n Immersivechartspage: telemetryPageName(\"immersivechartspage\", TelemetryPageType.StructuredDataPage),\r\n Currencies: telemetryPageName(\"currencies\", TelemetryPageType.StructuredDataPage),\r\n Indexdetailspage: telemetryPageName(\"indexdetailspage\", TelemetryPageType.StructuredDataPage),\r\n Data_makepage: telemetryPageName(\"data_makepage\", TelemetryPageType.StructuredDataPage),\r\n Weatherfullscreenmaps: telemetryPageName(\"weatherfullscreenmaps\", TelemetryPageType.StructuredDataPage),\r\n Weatherthresholdmaps: telemetryPageName(\"weatherthresholdmaps\", TelemetryPageType.StructuredDataPage),\r\n Stockanalysisdetails: telemetryPageName(\"stockanalysisdetails\", TelemetryPageType.StructuredDataPage),\r\n Data_yearoverview: telemetryPageName(\"data_yearoverview\", TelemetryPageType.StructuredDataPage),\r\n Data_segmenthub: telemetryPageName(\"data_segmenthub\", TelemetryPageType.StructuredDataPage),\r\n Weathermaps: telemetryPageName(\"weathermaps\", TelemetryPageType.StructuredDataPage),\r\n Playerstats: telemetryPageName(\"playerstats\", TelemetryPageType.StructuredDataPage),\r\n Funddetailspage: telemetryPageName(\"funddetailspage\", TelemetryPageType.StructuredDataPage),\r\n Exercisedetails: telemetryPageName(\"exercisedetails\", TelemetryPageType.StructuredDataPage),\r\n Teams: telemetryPageName(\"teams\", TelemetryPageType.StructuredDataPage),\r\n Etfdetailspage: telemetryPageName(\"etfdetailspage\", TelemetryPageType.StructuredDataPage),\r\n Binganswermaps: telemetryPageName(\"binganswermaps\", TelemetryPageType.StructuredDataPage),\r\n Workoutdetails: telemetryPageName(\"workoutdetails\", TelemetryPageType.StructuredDataPage),\r\n Competitionstats: telemetryPageName(\"competitionstats\", TelemetryPageType.StructuredDataPage),\r\n Polls: telemetryPageName(\"polls\", TelemetryPageType.StructuredDataPage),\r\n Data_photos: telemetryPageName(\"data_photos\", TelemetryPageType.StructuredDataPage),\r\n Videocategorylistpage: telemetryPageName(\"videocategorylistpage\", TelemetryPageType.StructuredDataPage),\r\n Stockfinancialsdetails: telemetryPageName(\"stockfinancialsdetails\", TelemetryPageType.StructuredDataPage),\r\n Commoditydetailspage: telemetryPageName(\"commoditydetailspage\", TelemetryPageType.StructuredDataPage),\r\n Data_yearoverview_trim: telemetryPageName(\"data_yearoverview_trim\", TelemetryPageType.StructuredDataPage),\r\n Worldwidepage: telemetryPageName(\"worldwidepage\", TelemetryPageType.StructuredDataPage),\r\n Data_photos_trim: telemetryPageName(\"data_photos_trim\", TelemetryPageType.StructuredDataPage),\r\n Stockcompanydetails: telemetryPageName(\"stockcompanydetails\", TelemetryPageType.StructuredDataPage),\r\n Retirementplanner: telemetryPageName(\"retirementplanner\", TelemetryPageType.StructuredDataPage),\r\n Livecoverage: telemetryPageName(\"livecoverage\", TelemetryPageType.StructuredDataPage),\r\n Teamroster: telemetryPageName(\"teamroster\", TelemetryPageType.StructuredDataPage),\r\n Stockhistorydetails: telemetryPageName(\"stockhistorydetails\", TelemetryPageType.StructuredDataPage),\r\n Filterresultspage: telemetryPageName(\"filterresultspage\", TelemetryPageType.StructuredDataPage),\r\n Data_carcompare: telemetryPageName(\"data_carcompare\", TelemetryPageType.StructuredDataPage),\r\n Stockownershipdetails: telemetryPageName(\"stockownershipdetails\", TelemetryPageType.StructuredDataPage),\r\n Driverstandings: telemetryPageName(\"driverstandings\", TelemetryPageType.StructuredDataPage),\r\n Timevalueofmoney: telemetryPageName(\"timevalueofmoney\", TelemetryPageType.StructuredDataPage),\r\n Savingscalculator: telemetryPageName(\"savingscalculator\", TelemetryPageType.StructuredDataPage),\r\n Iccmatches: telemetryPageName(\"iccmatches\", TelemetryPageType.StructuredDataPage),\r\n Other_flightsearchresult: telemetryPageName(\"other_flightsearchresult\", TelemetryPageType.StructuredDataPage),\r\n Stockrelateddetails: telemetryPageName(\"stockrelateddetails\", TelemetryPageType.StructuredDataPage),\r\n Data_specs_trim: telemetryPageName(\"data_specs_trim\", TelemetryPageType.StructuredDataPage),\r\n Stockoptionsdetails: telemetryPageName(\"stockoptionsdetails\", TelemetryPageType.StructuredDataPage),\r\n HomepageAlerts: telemetryPageName(\"homepage-alerts\", TelemetryPageType.StructuredDataPage),\r\n HomepageRecordsandAverages: telemetryPageName(\"homepage-recordsandaverages\", TelemetryPageType.StructuredDataPage),\r\n HomepageWeatherTraffic: telemetryPageName(\"homepage-weathertraffic\", TelemetryPageType.StructuredDataPage),\r\n Data_specs: telemetryPageName(\"data_specs\", TelemetryPageType.StructuredDataPage),\r\n Data_pricing: telemetryPageName(\"data_pricing\", TelemetryPageType.StructuredDataPage),\r\n Mortgagecalculator: telemetryPageName(\"mortgagecalculator\", TelemetryPageType.StructuredDataPage),\r\n Data_performance_trim: telemetryPageName(\"data_performance_trim\", TelemetryPageType.StructuredDataPage),\r\n Theatershowtimes: telemetryPageName(\"theatershowtimes\", TelemetryPageType.StructuredDataPage),\r\n Data_pricing_trim: telemetryPageName(\"data_pricing_trim\", TelemetryPageType.StructuredDataPage),\r\n Data_photosInterior: telemetryPageName(\"data_photos-interior\", TelemetryPageType.StructuredDataPage),\r\n Indexdetailsanalysispage: telemetryPageName(\"indexdetailsanalysispage\", TelemetryPageType.StructuredDataPage),\r\n Data_photosInterior_trim: telemetryPageName(\"data_photos-interior_trim\", TelemetryPageType.StructuredDataPage),\r\n Data_photosColors: telemetryPageName(\"data_photos-colors\", TelemetryPageType.StructuredDataPage),\r\n Data_carReviews_trim: telemetryPageName(\"data_car-reviews_trim\", TelemetryPageType.StructuredDataPage),\r\n Data_carReviews: telemetryPageName(\"data_car-reviews\", TelemetryPageType.StructuredDataPage),\r\n Racecalendar: telemetryPageName(\"racecalendar\", TelemetryPageType.StructuredDataPage),\r\n Teamstandings: telemetryPageName(\"teamstandings\", TelemetryPageType.StructuredDataPage),\r\n Data_photosColors_trim: telemetryPageName(\"data_photos-colors_trim\", TelemetryPageType.StructuredDataPage),\r\n Stockdetails: telemetryPageName(\"stockdetails\", TelemetryPageType.StructuredDataPage),\r\n Data_interiorFeatures_trim: telemetryPageName(\"data_interior-features_trim\", TelemetryPageType.StructuredDataPage),\r\n Data_exteriorFeatures_trim: telemetryPageName(\"data_exterior-features_trim\", TelemetryPageType.StructuredDataPage),\r\n Calendar: telemetryPageName(\"calendar\", TelemetryPageType.StructuredDataPage),\r\n TeamStats: telemetryPageName(\"teamstats\", TelemetryPageType.StructuredDataPage),\r\n Movieshowtimes: telemetryPageName(\"movieshowtimes\", TelemetryPageType.StructuredDataPage),\r\n Drafts: telemetryPageName(\"drafts\", TelemetryPageType.StructuredDataPage),\r\n Data_technologyFeatures_trim: telemetryPageName(\"data_technology-features_trim\", TelemetryPageType.StructuredDataPage),\r\n Data_workoutdetails_collection: telemetryPageName(\"data_workoutdetails_collection\", TelemetryPageType.StructuredDataPage),\r\n Data_photosExterior: telemetryPageName(\"data_photos-exterior\", TelemetryPageType.StructuredDataPage),\r\n Data_photosExterior_trim: telemetryPageName(\"data_photos-exterior_trim\", TelemetryPageType.StructuredDataPage),\r\n Data_photos360Interior: telemetryPageName(\"data_photos-360-interior\", TelemetryPageType.StructuredDataPage),\r\n Immersivechartsmarketspage: telemetryPageName(\"immersivechartsmarketspage\", TelemetryPageType.StructuredDataPage),\r\n Returnoninvestment: telemetryPageName(\"returnoninvestment\", TelemetryPageType.StructuredDataPage),\r\n Indexdetailsrelatedpage: telemetryPageName(\"indexdetailsrelatedpage\", TelemetryPageType.StructuredDataPage),\r\n Gonepage: telemetryPageName(\"gonepage\", TelemetryPageType.StructuredDataPage),\r\n Data_compare: telemetryPageName(\"data_compare\", TelemetryPageType.StructuredDataPage),\r\n Data_compare_trim: telemetryPageName(\"data_compare_trim\", TelemetryPageType.StructuredDataPage),\r\n Data_options_trim: telemetryPageName(\"data_options_trim\", TelemetryPageType.StructuredDataPage),\r\n Entitiespage: telemetryPageName(\"entitiespage\", TelemetryPageType.StructuredDataPage),\r\n Workoutdetailsprint: telemetryPageName(\"workoutdetailsprint\", TelemetryPageType.StructuredDataPage),\r\n Data_photos360Exterior: telemetryPageName(\"data_photos-360-exterior\", TelemetryPageType.StructuredDataPage),\r\n HomepageDatacarfinder: telemetryPageName(\"homepage-datacarfinder\", TelemetryPageType.StructuredDataPage),\r\n Data_photos360Interior_trim: telemetryPageName(\"data_photos-360-interior_trim\", TelemetryPageType.StructuredDataPage),\r\n Data_skeleton: telemetryPageName(\"data_skeleton\", TelemetryPageType.StructuredDataPage),\r\n Mortgagerates: telemetryPageName(\"mortgagerates\", TelemetryPageType.StructuredDataPage),\r\n Brackets: telemetryPageName(\"brackets\", TelemetryPageType.StructuredDataPage),\r\n Data_photos360Exterior_trim: telemetryPageName(\"data_photos-360-exterior_trim\", TelemetryPageType.StructuredDataPage),\r\n Data_photocompare: telemetryPageName(\"data_photocompare\", TelemetryPageType.StructuredDataPage),\r\n HomepageWeather10day: telemetryPageName(\"homepage-weather10day\", TelemetryPageType.StructuredDataPage),\r\n Data_performance: telemetryPageName(\"data_performance\", TelemetryPageType.StructuredDataPage),\r\n HomepageWeatherextendedforecast: telemetryPageName(\"homepage-weatherextendedforecast\", TelemetryPageType.StructuredDataPage),\r\n Savings: telemetryPageName(\"savings\", TelemetryPageType.StructuredDataPage),\r\n Data_exteriorFeatures: telemetryPageName(\"data_exterior-features\", TelemetryPageType.StructuredDataPage),\r\n Data_interiorFeatures: telemetryPageName(\"data_interior-features\", TelemetryPageType.StructuredDataPage),\r\n Data_options: telemetryPageName(\"data_options\", TelemetryPageType.StructuredDataPage),\r\n Travelgonepage: telemetryPageName(\"travelgonepage\", TelemetryPageType.StructuredDataPage),\r\n Recipe: telemetryPageName(\"recipe\", TelemetryPageType.StructuredDataPage),\r\n Getportfoliodatapage: telemetryPageName(\"getportfoliodatapage\", TelemetryPageType.StructuredDataPage),\r\n Brokercenterpage: telemetryPageName(\"brokercenterpage\", TelemetryPageType.StructuredDataPage),\r\n Data_technologyFeatures: telemetryPageName(\"data_technology-features\", TelemetryPageType.StructuredDataPage),\r\n Tvlistings: telemetryPageName(\"tvlistings\", TelemetryPageType.StructuredDataPage),\r\n Ownerstandings: telemetryPageName(\"ownerstandings\", TelemetryPageType.StructuredDataPage),\r\n Entitydetailspage: telemetryPageName(\"entitydetailspage\", TelemetryPageType.StructuredDataPage),\r\n Creditcards: telemetryPageName(\"creditcards\", TelemetryPageType.StructuredDataPage),\r\n Cmssitemap: telemetryPageName(\"cmssitemap\", TelemetryPageType.StructuredDataPage),\r\n Externalnativeadpage: telemetryPageName(\"externalnativeadpage\", TelemetryPageType.StructuredDataPage),\r\n Autoloans: telemetryPageName(\"autoloans\", TelemetryPageType.StructuredDataPage),\r\n Externalcontent: telemetryPageName(\"externalcontent\", TelemetryPageType.StructuredDataPage),\r\n Htmlsitemap: telemetryPageName(\"htmlsitemap\", TelemetryPageType.StructuredDataPage)\r\n },\r\n CustomColumnPageNames:\r\n {\r\n TrendingTopics: telemetryPageName(\"topic_tt\", TelemetryPageType.CustomColumn),\r\n GlobalSettingsPage: telemetryPageName(\"globalsettingspage\", TelemetryPageType.CustomColumn),\r\n MyTopics: telemetryPageName(\"mytopics\", TelemetryPageType.CustomColumn),\r\n WeatherPlaces: telemetryPageName(\"weatherplaces\", TelemetryPageType.CustomColumn),\r\n MyFavorites: telemetryPageName(\"myfavorites\", TelemetryPageType.CustomColumn),\r\n TopicResult: telemetryPageName(\"topicresult\", TelemetryPageType.CustomColumn),\r\n Collections: telemetryPageName(\"collections\", TelemetryPageType.CustomColumn),\r\n Rouxbe: telemetryPageName(\"rouxbe\", TelemetryPageType.CustomColumn),\r\n ShoppingList: telemetryPageName(\"shopping list\", TelemetryPageType.CustomColumn),\r\n MyHealthReportsPage: telemetryPageName(\"myhealthreportspage\", TelemetryPageType.CustomColumn),\r\n Error404page: telemetryPageName(\"error404page\", TelemetryPageType.CustomColumn),\r\n AppsPromotion: telemetryPageName(\"appspromotion\", TelemetryPageType.CustomColumn),\r\n Error500page: telemetryPageName(\"error500page\", TelemetryPageType.CustomColumn),\r\n DietTrackerPreSigninPage: telemetryPageName(\"diettrackerpresigninpage\", TelemetryPageType.CustomColumn),\r\n ExerciseTrackerPreSigninPage: telemetryPageName(\"exercisetrackerpresigninpage\", TelemetryPageType.CustomColumn),\r\n WebSlicePage: telemetryPageName(\"other_webslice\", TelemetryPageType.CustomColumn),\r\n Error200Page: telemetryPageName(\"error200page\", TelemetryPageType.CustomColumn),\r\n AboutUsPage: telemetryPageName(\"aboutus\", TelemetryPageType.CustomColumn),\r\n UnSupport: telemetryPageName(\"unsupport\", TelemetryPageType.CustomColumn),\r\n Disclaimer: telemetryPageName(\"disclaimer\", TelemetryPageType.CustomColumn),\r\n TermsOfService: telemetryPageName(\"termsofservice\", TelemetryPageType.CustomColumn),\r\n SevereWeather: telemetryPageName(\"severeweather\", TelemetryPageType.CustomColumn)\r\n },\r\n SubjectSectionPageNames:\r\n {\r\n TeamhomePage: telemetryPageName(\"teamhome\", TelemetryPageType.SubjectSection),\r\n PlayerPage: telemetryPageName(\"player\", TelemetryPageType.SubjectSection),\r\n MarketMoversPage: telemetryPageName(\"marketmovers\", TelemetryPageType.SubjectSection),\r\n CommoditiesPage: telemetryPageName(\"commoditiespage\", TelemetryPageType.SubjectSection),\r\n ChefPage: telemetryPageName(\"chef\", TelemetryPageType.SubjectSection),\r\n NutritionIndexPage: telemetryPageName(\"nutritionindex\", TelemetryPageType.SubjectSection),\r\n FinanceTechnologyPage: telemetryPageName(\"finance-technologypage\", TelemetryPageType.SubjectSection),\r\n MedicalindexPage: telemetryPageName(\"medicalindex\", TelemetryPageType.SubjectSection)\r\n },\r\n SiteSearchPageNames:\r\n {\r\n SearchResultsPage: telemetryPageName(\"searchresultspage\", TelemetryPageType.SiteSearch),\r\n VideoSearchResultsPage: telemetryPageName(\"videosearchresultspage\", TelemetryPageType.SiteSearch),\r\n PartnerVideolistPage: telemetryPageName(\"partnervideolistpage\", TelemetryPageType.SiteSearch),\r\n HomepageBingserpIframepage: telemetryPageName(\"homepage-bingserpiframepage\", TelemetryPageType.SiteSearch),\r\n SitesearchSitesearch: telemetryPageName(\"sitesearch_sitesearch\", TelemetryPageType.SiteSearch),\r\n SearchResults: telemetryPageName(\"search results\", TelemetryPageType.SiteSearch),\r\n SerpPage: telemetryPageName(\"serppage\", TelemetryPageType.SiteSearch),\r\n FindaMoviePage: telemetryPageName(\"findamoviepage\", TelemetryPageType.SiteSearch)\r\n },\r\n SectionFrontPageNames:\r\n {\r\n Competitionhub: telemetryPageName(\"competitionhub\", TelemetryPageType.SectionFront),\r\n Local: telemetryPageName(\"local\", TelemetryPageType.SectionFront),\r\n Stockscreener: telemetryPageName(\"stockscreener\", TelemetryPageType.SectionFront),\r\n Toolslandingpage: telemetryPageName(\"toolslandingpage\", TelemetryPageType.SectionFront),\r\n Showtimes: telemetryPageName(\"showtimes\", TelemetryPageType.SectionFront),\r\n FinanceRealEstatepage: telemetryPageName(\"finance-real-estatepage\", TelemetryPageType.SectionFront),\r\n CookingSchool: telemetryPageName(\"cooking school\", TelemetryPageType.SectionFront),\r\n Allcompetitions: telemetryPageName(\"allcompetitions\", TelemetryPageType.SectionFront),\r\n Newspage: telemetryPageName(\"newspage\", TelemetryPageType.SectionFront),\r\n CocktailHub: telemetryPageName(\"cocktail hub\", TelemetryPageType.SectionFront),\r\n Travelflightsearchhubpage: telemetryPageName(\"travelflightsearchhubpage\", TelemetryPageType.SectionFront),\r\n Hotelshubpage: telemetryPageName(\"hotelshubpage\", TelemetryPageType.SectionFront),\r\n WineHub: telemetryPageName(\"wine hub\", TelemetryPageType.SectionFront),\r\n ChefHub: telemetryPageName(\"chef hub\", TelemetryPageType.SectionFront),\r\n Travelflightstatushubpage: telemetryPageName(\"travelflightstatushubpage\", TelemetryPageType.SectionFront),\r\n HomepageCompetitionhub: telemetryPageName(\"homepage-competitionhub\", TelemetryPageType.SectionFront),\r\n Editorial: telemetryPageName(\"editorial\", TelemetryPageType.SectionFront),\r\n SecfrontHotel: telemetryPageName(\"secfront_hotel\", TelemetryPageType.SectionFront),\r\n SecfrontTNews: telemetryPageName(\"secfront_tnews\", TelemetryPageType.SectionFront)\r\n }\r\n};\r\n\r\n/// Telemetry PageMode \r\nvar TelemetryPageMode = {\r\n Default: 0,\r\n Trial: 1,\r\n Subscription: 2\r\n};\r\n\r\n/// Telemetry Page Pivot \r\nvar TelemetryPagePivot = {\r\n Undefined: \"undefined\",\r\n Office: \"office\",\r\n Apps: \"apps\",\r\n News: \"news\",\r\n Timeline: \"timeline\",\r\n StartMenu: \"startmenu\"\r\n};\r\n\r\n/// Telemetry User Id Type \r\nvar TelemetryUserType = {\r\n Aad: \"aad\",\r\n Msa: \"msa\",\r\n MsaKids: \"msa-kids\",\r\n Local: \"local\"\r\n};\r\n\r\nconst TelemetryActionType = {\r\n Click: \"click\",\r\n Hover: \"mouseenter\",\r\n Submit: \"submit\",\r\n View: \"view\",\r\n RightClick: \"rightclick\"\r\n};\r\n\r\nexport var telemetryDataTypes = {\r\n TelemetryProduct: TelemetryProduct,\r\n TelemetryPageType: TelemetryPageType,\r\n TelemetryType: TelemetryType,\r\n TelemetryContentType: TelemetryContentType,\r\n TelemetryBehaviorType: TelemetryBehaviorType,\r\n ContentPlacedBySource: ContentPlacedBySource,\r\n TelemetryPageConfiguration: TelemetryPageConfiguration,\r\n TelemetryPageName: TelemetryPageName,\r\n TelemetryPageMode: TelemetryPageMode,\r\n TelemetryPagePivot: TelemetryPagePivot,\r\n TelemetryPartnerNamespace: TelemetryPartnerNamespace,\r\n TelemetryUserType: TelemetryUserType,\r\n getTelemetryContentType: getTelemetryContentType,\r\n getTelemetryPageInfo: getTelemetryPageInfo,\r\n validateTelemetryDataType: validateTelemetryDataType,\r\n getTelemetryBehavior: getTelemetryBehavior,\r\n TelemetryActionType: TelemetryActionType\r\n};\r\n\r\n/// \r\n/// This function gets the telemetry page info object from the given pageName string.\r\n/// \r\n/// PageName string\r\n/// The Telemetry Page Name object\r\nfunction getTelemetryPageInfo(pageName) {\r\n if (pageName && PageNamePageTypeMappingList) {\r\n pageName = pageName.toLowerCase();\r\n if (PageNamePageTypeMappingList[pageName] !== undefined) {\r\n return PageNamePageTypeMappingList[pageName];\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/// \r\n/// This function validates and returns the telemetry data type from the given string of the data type.\r\n/// \r\n/// DataType enum e.g. telemetryDataType.TelemetryPageType\r\n/// value of the type to validate\r\n/// The Telemetry Page type\r\nfunction validateTelemetryDataType(type, value) {\r\n if (type && value) {\r\n for (var prop in type) {\r\n if (type.hasOwnProperty(prop)) {\r\n if ((typeof value == \"string\" && type[prop] === value.toLowerCase()) ||\r\n type[prop] === value) {\r\n return type[prop];\r\n }\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/// \r\n/// Private class to define the telemetry Page Name. This class is purposefully not exposed to public.\r\n/// Public should use getTelemetryPageName to get the telemetrypagename object from the given pagename string.\r\n/// All the telemetry page names should be defined as part of this javascript file.\r\n/// \r\n/// PageName string\r\n/// PageType should be of type TelemetryPageType\r\n/// The Telemetry Page Name object\r\nfunction telemetryPageName(pageName, pageType) {\r\n if (pageName) {\r\n var name = pageName.toLowerCase();\r\n var pType = pageType || TelemetryPageType.Unspecified;\r\n var telemetryPageNameObject = { PageName: name, PageType: pType };\r\n PageNamePageTypeMappingList[name] = telemetryPageNameObject;\r\n\r\n return telemetryPageNameObject;\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/// \r\n/// This function gets the telemetry contentType from the given telemetryType.\r\n/// \r\n/// TelemetryType enum value\r\n/// ContentType enum.\r\nfunction getTelemetryContentType(telemetryType) {\r\n if (TelemetryTypeContentTypeMappingList[telemetryType]) {\r\n return TelemetryTypeContentTypeMappingList[telemetryType];\r\n }\r\n}\r\n\r\n/// \r\n/// This function gets the telemetry contentAction from the given telemetryType.\r\n/// \r\n/// TelemetryType enum value\r\n/// ContentAction enum.\r\nfunction getTelemetryBehavior(telemetryType) {\r\n if (TelemetryTypeBehaviorTypeMappingList[telemetryType]) {\r\n return TelemetryTypeBehaviorTypeMappingList[telemetryType];\r\n } else {\r\n return TelemetryBehaviorType.Undefined;\r\n }\r\n}\r\n\r\n/// \r\n/// Private function for initializing mapping between telemetryType and telemetryContentType.\r\n/// This will be removed after telemetryType deprecated.\r\n/// \r\nfunction initTelemetryTypeContentTypeMappingList() {\r\n TelemetryTypeContentTypeMappingList[TelemetryType.AppInstall] = TelemetryContentType.App;\r\n TelemetryTypeContentTypeMappingList[TelemetryType.AppLaunch] = TelemetryContentType.App;\r\n TelemetryTypeContentTypeMappingList[TelemetryType.SponsoredContent] = TelemetryContentType.SponsoredContent;\r\n TelemetryTypeContentTypeMappingList[TelemetryType.StructuredData] = TelemetryContentType.StructuredDataCard;\r\n TelemetryTypeContentTypeMappingList[TelemetryType.AppStore] = TelemetryContentType.AppStorePromo;\r\n}\r\n\r\n/// \r\n/// Private function for initializing mapping between telemetryType and TelemetryBehaviorType.\r\n/// This will be removed after telemetryType deprecated.\r\n/// \r\nfunction initTelemetryTypeBehaviorTypeMappingList() {\r\n TelemetryTypeBehaviorTypeMappingList[TelemetryType.AppInstall] = TelemetryBehaviorType.Install;\r\n TelemetryTypeBehaviorTypeMappingList[TelemetryType.AppLaunch] = TelemetryBehaviorType.Launch;\r\n TelemetryTypeBehaviorTypeMappingList[TelemetryType.Follow] = TelemetryBehaviorType.Follow;\r\n TelemetryTypeBehaviorTypeMappingList[TelemetryType.Unfollow] = TelemetryBehaviorType.Unfollow;\r\n TelemetryTypeBehaviorTypeMappingList[TelemetryType.Like] = TelemetryBehaviorType.Like;\r\n TelemetryTypeBehaviorTypeMappingList[TelemetryType.Dislike] = TelemetryBehaviorType.Dislike;\r\n TelemetryTypeBehaviorTypeMappingList[TelemetryType.Unlike] = TelemetryBehaviorType.Unlike;\r\n TelemetryTypeBehaviorTypeMappingList[TelemetryType.Undislike] = TelemetryBehaviorType.Undislike;\r\n TelemetryTypeBehaviorTypeMappingList[TelemetryType.Mute] = TelemetryBehaviorType.Mute;\r\n TelemetryTypeBehaviorTypeMappingList[TelemetryType.Unmute] = TelemetryBehaviorType.Unmute;\r\n TelemetryTypeBehaviorTypeMappingList[TelemetryType.MuteCancel] = TelemetryBehaviorType.MuteCancel;\r\n TelemetryTypeBehaviorTypeMappingList[TelemetryType.Manage] = TelemetryBehaviorType.Manage;\r\n TelemetryTypeBehaviorTypeMappingList[TelemetryType.Hide] = TelemetryBehaviorType.Hide;\r\n TelemetryTypeBehaviorTypeMappingList[TelemetryType.Unhide] = TelemetryBehaviorType.Unhide;\r\n}\r\n\r\n// Init telemetryType mapping\r\ninitTelemetryTypeContentTypeMappingList();\r\ninitTelemetryTypeBehaviorTypeMappingList();","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { canUseDOM, getDocumentElementsByTagName, getLocationSearch, getLocationHostname } from \"@msnews/isomorphic-util\";\r\nimport { applicationCacheConstants, clientSettings, dir, htmlElementIds, info, js, lang, pagetypeSettings } from \"../constants\";\r\n\r\nimport { AudienceModeType } from \"@msnews/experiences-constants\";\r\nimport { DeviceFormFactorType } from \"cms-models-msn/configuration/types/DeviceFormFactorType\";\r\nimport { Environment } from \"./Environment\";\r\nimport { ILocale } from \"cms-models-msn/configuration/ILocale\";\r\nimport { IPcsBrowserScope } from \"../types/PcsBrowsersType\";\r\nimport { MarketProperties } from \"./MarketProperties\";\r\nimport { WebClientData } from \"./WebClientData\";\r\nimport { OperatingSystemType } from \"cms-models-msn/configuration/types/OperatingSystemType\";\r\nimport { UrlUtility } from \"../utilities/UrlUtility\";\r\nimport { localStorage } from \"../utilities/WebStorage\";\r\nimport { tryParseJson } from \"../utilities/Parsing\";\r\nimport { KeyValueArray } from \"../utilities\";\r\n\r\n/**\r\n * Format used for activity ID stored in storage\r\n */\r\nexport type StoredActivityId = {\r\n /**\r\n * ID value\r\n */\r\n id: string,\r\n\r\n /**\r\n * Timestamp of when value was stored\r\n */\r\n ts: number,\r\n\r\n /**\r\n * Flag inidicating if the ID was used in a previous page (stale)\r\n */\r\n previouslyUsed?: boolean\r\n};\r\n\r\n/**\r\n * JSON data contract / interface for settings in the element that are part of the data-client-settings attribute.\r\n */\r\nexport interface IClientSettings {\r\n aid: string,\r\n apptype: string,\r\n apps_locale: string,\r\n audienceMode?: AudienceModeType,\r\n browser?: IPcsBrowserScope,\r\n configRootUrl?: string,\r\n deviceFormFactor?: DeviceFormFactorType,\r\n domain?: string,\r\n env: Environment,\r\n featureFlags?: any,\r\n contentId?: string,\r\n\r\n /** The schema://domain to be used for the main feed URL */\r\n feedBaseDomain?: string,\r\n\r\n categoryKey?: string,\r\n functionalonly_cookie_experience: boolean,\r\n functional_cookie_patterns: string,\r\n functional_cookies: string,\r\n geo_city?: string,\r\n geo_country?: string,\r\n geo_countryname?: string;\r\n geo_lat: string,\r\n geo_long: string,\r\n geo_subdivision?: string,\r\n geo_zip?: string,\r\n locale?: ILocale,\r\n market?: MarketProperties,\r\n os?: OperatingSystemType,\r\n pagetype?: string,\r\n\r\n /** Query params in the format \"?key=value&...\" as observed from the PCS origin server */\r\n queryparams?: string,\r\n\r\n static_page?: string,\r\n verticalKey?: string,\r\n\r\n /** cache busting identifier sent by pcs */\r\n cbid?: string\r\n\r\n /** Peregrine Build version sent by PCS */\r\n v?: string\r\n}\r\n\r\nexport const EnterpiseFlightId = \"prg-enterpriseblended-t\";\r\nexport const OfficeDefaultPivotFlightId = \"prg-officedefault-t\";\r\n\r\n/**\r\n * Class for getting the head data information.\r\n */\r\nclass HeadData {\r\n /**\r\n * The single instance of the HeadData class.\r\n * @type {HeadData}\r\n */\r\n private static _instance: HeadData;\r\n\r\n private anonCookieName: string;\r\n private locale: string;\r\n private marketDir: string;\r\n private currentFlights: string;\r\n private clientSettings: IClientSettings;\r\n private enableCMSPPEConfigs: boolean = false;\r\n private userIsSignedIn: boolean; // Always signed out on server side: https://dev.azure.com/microsoft/OS/_workitems/edit/25344027\r\n private isPreload: boolean;\r\n private headElement: any;\r\n private htmlElement: any;\r\n private isAppcache: boolean;\r\n private isEnterprise: boolean;\r\n private isOfficeDefaultPivot: boolean;\r\n private isServiceWorkerCache: boolean;\r\n private ssoComplete: boolean;\r\n private aadState: boolean;\r\n\r\n private locationSearch: string;\r\n\r\n // TODO: Task 24890741: refactor this class to use the current singleton pattern with ES6 modules\r\n // This will also clean up these getters/setters\r\n public get Locale(): string { return this.locale; }\r\n public get MarketDir(): string { return this.marketDir; }\r\n public get CurrentFlights(): string { return this.currentFlights || \"\"; }\r\n public get ClientSettings(): IClientSettings { return this.clientSettings; }\r\n public get EnableCMSPPEConfigs(): boolean { return this.enableCMSPPEConfigs; }\r\n public get UserIsSignedIn(): boolean { return this.userIsSignedIn; }\r\n public get IsPreload(): boolean { return this.isPreload; }\r\n public get IsAppCache(): boolean { return this.isAppcache; }\r\n public get IsEnterprise(): boolean { return this.isEnterprise; }\r\n public get IsOfficeDefaultPivot(): boolean { return this.isOfficeDefaultPivot; }\r\n public get IsServiceWorkerCache(): boolean { return this.isServiceWorkerCache; }\r\n\r\n // TODO: Dependencies that some client side code expects headData to specify but doesn't due to PCS\r\n public get AnonCookieName(): string { return this.anonCookieName; }\r\n public get SsoComplete(): boolean { return this.ssoComplete; }\r\n public get AadState(): boolean { return this.aadState; }\r\n\r\n // For testing purposes add setters\r\n public set AnonCookieName(value: string) { this.anonCookieName = value; }\r\n public set LocaleName(value: string) { this.locale = value; }\r\n public set MarketDir(value: string) { this.marketDir = value; }\r\n public set CurrentFlights(value: string) { this.currentFlights = value; }\r\n public set ClientSettings(value: IClientSettings) { this.clientSettings = value; }\r\n public set IsEnterprise(value: boolean) { this.isEnterprise = value; }\r\n public set IsOfficeDefaultPivot(value: boolean) { this.isOfficeDefaultPivot = value; }\r\n public set UserIsSignedIn(value: boolean) { this.userIsSignedIn = value; }\r\n\r\n /**\r\n * Initialize the head data instance, on server side provide the client info & client settings\r\n * @param {WebClientData} clientData Data object containing both client info and settings\r\n */\r\n private constructor(clientData?: WebClientData) {\r\n this.initializeHeadData(clientData);\r\n }\r\n\r\n /**\r\n * Returns singleton class instance.\r\n * @returns {HeadData}\r\n */\r\n public static getInstance(): HeadData { return HeadData._instance || (HeadData._instance = new HeadData()); }\r\n\r\n /**\r\n * Reset singleton class instance with passed in info and client settings. Used on server side to reset HeadData for each request.\r\n * @param {WebClientData} clientData Data object containing both client info and settings\r\n * @returns {HeadData}\r\n */\r\n public static resetInstance(clientData?: WebClientData): HeadData {\r\n HeadData._instance = new HeadData(clientData);\r\n headData = HeadData._instance;\r\n return HeadData._instance;\r\n }\r\n\r\n /**\r\n * Initializes head data. If WebClientData is provided use that, otherwise do client side initialization.\r\n * @param {WebClientData} clientData - Data object containing both client info and settings\r\n */\r\n public initializeHeadData(clientData?: WebClientData): void {\r\n if (clientData) {\r\n // Data is passed in only from Render Service under Node.JS environment since there is no DOM.\r\n this.initializeFromData(clientData);\r\n return;\r\n }\r\n\r\n this.locationSearch = getLocationSearch();\r\n this.htmlElement = canUseDOM() ? getDocumentElementsByTagName(htmlElementIds.html)[0] : null;\r\n this.headElement = canUseDOM() ? getDocumentElementsByTagName(htmlElementIds.head)[0] : null;\r\n\r\n if (!this.htmlElement || !this.headElement) {\r\n return;\r\n }\r\n\r\n // We always initialize from DOM first because\r\n // even if we are in an appcache/service worker case, we still need some data from the DOM\r\n // and we will fallback to DOM if there are no items found in storage\r\n this.initializeFromDom();\r\n\r\n // Attempt to override with local storage item when in appcache scenario\r\n // In service worker scenario, just update the storage activity id\r\n if (this.htmlElement.getAttribute(applicationCacheConstants.manifestAttributeName)) {\r\n this.isAppcache = true;\r\n this.initializeFromStorage();\r\n } else if (window && window.navigator && window.navigator.serviceWorker && window.navigator.serviceWorker.controller) {\r\n this.isServiceWorkerCache = true;\r\n this.updateStorageActivityId();\r\n }\r\n\r\n // Below items are common for both scenarios\r\n const language = this.htmlElement.getAttribute(lang);\r\n this.locale = language && language.toLowerCase() || \"\";\r\n\r\n const marketDir = this.htmlElement.getAttribute(dir);\r\n this.marketDir = marketDir && marketDir.toLocaleLowerCase() || \"\";\r\n\r\n this.setQueryItemProvidedValues();\r\n\r\n // Note: This isn't currently being stamped by PCS\r\n let headDataJs = this.headElement.getAttribute(js);\r\n if (headDataJs) {\r\n const headJs = <{ anonckname: string, signedin: number }>tryParseJson(headDataJs);\r\n this.anonCookieName = headJs.anonckname;\r\n this.userIsSignedIn = headJs.signedin === 1;\r\n }\r\n\r\n // Checks if current request is background preload request\r\n if (UrlUtility.getQueryParameterByName(\"backgroundpreload\", this.locationSearch)) {\r\n this.isPreload = true;\r\n }\r\n\r\n // Determine if we are in Enterprise version or not\r\n this.setIsEnterprise();\r\n\r\n // Determine if Office is the default pivot\r\n this.setIsOfficeDefaultPivot();\r\n }\r\n\r\n /**\r\n * Helper that gets the current's page stored last used activityID (if there is one)\r\n */\r\n public getCurrentPageTypeStoredActivityId(): StoredActivityId {\r\n const storedActivities = localStorage.getItem(applicationCacheConstants.storedLastUsedActivityIdKey) || \"\";\r\n const storedActivityIds = tryParseJson(storedActivities);\r\n\r\n return (storedActivityIds && storedActivityIds[headData.ClientSettings.pagetype]) || null;\r\n }\r\n\r\n /**\r\n * Initializes the client settings and info from client data passed in externally (render service query param)\r\n * @param {WebClientData} clientData Data object containing both client info and settings\r\n */\r\n private initializeFromData(clientData: WebClientData): void {\r\n this.clientSettings = tryParseJson(clientData.clientSettings);\r\n\r\n this.setFlights(clientData.clientInfo);\r\n\r\n this.setQueryItemProvidedValues();\r\n\r\n this.locale = clientData.language && clientData.language.toLowerCase() || \"\";\r\n this.marketDir = clientData.marketDir && clientData.marketDir.toLocaleLowerCase() || \"\";\r\n\r\n // Determine if we are in Enterprise version or not\r\n this.setIsEnterprise();\r\n\r\n // Determine if Office is the default pivot\r\n this.setIsOfficeDefaultPivot();\r\n }\r\n\r\n /**\r\n * Initializes the client settings and info from DOM element\r\n */\r\n private initializeFromDom(): void {\r\n let dataClientSettings = this.headElement.getAttribute(clientSettings);\r\n if (dataClientSettings) {\r\n this.clientSettings = tryParseJson(dataClientSettings);\r\n\r\n // If clientSettings.pagetype does not exist, try getting from data-pagetype.\r\n // For Peregrine full spa page: pagetype is part of data-client-settings. There is no data-pagetype.\r\n // For Prime/Hybrid, pagetype is outside of data-client-settings and it belongs to data-pagetype\r\n if (!this.clientSettings.pagetype) {\r\n const pageTypeFromSettings = this.headElement.getAttribute(pagetypeSettings);\r\n this.clientSettings.pagetype = pageTypeFromSettings === null ? undefined : pageTypeFromSettings;\r\n }\r\n }\r\n this.setFlights(this.headElement.getAttribute(info));\r\n }\r\n\r\n /**\r\n * Initializes headData client settings and info from the value found in storage\r\n * and if none is found, fallbacks to using the DOM element\r\n */\r\n private initializeFromStorage(): void {\r\n const responseFromStorage = localStorage.getItem(applicationCacheConstants.storedHeadDataKey);\r\n const parsedResponseFromStorage = tryParseJson(responseFromStorage);\r\n\r\n // If there is nothing store, then fallback to the DOM\r\n if (!parsedResponseFromStorage) {\r\n return;\r\n }\r\n\r\n const currentPageStoredHeadData = parsedResponseFromStorage[this.clientSettings.pagetype];\r\n\r\n // We don't have an entry for the current page\r\n if (!currentPageStoredHeadData) {\r\n return;\r\n }\r\n\r\n const storedClientSettings = currentPageStoredHeadData[\"clientSettings\"];\r\n const storedFlights = currentPageStoredHeadData[\"info\"];\r\n\r\n // The stored head data is corrupt so we fallback to DOM\r\n if (!storedClientSettings || !storedFlights) {\r\n return;\r\n }\r\n\r\n this.clientSettings = storedClientSettings;\r\n this.setFlights(storedFlights);\r\n this.updateStorageActivityId();\r\n }\r\n\r\n /**\r\n * Update the last used activity ID in storage\r\n */\r\n private updateStorageActivityId(): void {\r\n if (!this.clientSettings.aid) {\r\n return;\r\n }\r\n\r\n const existingLastUsedActivityIds = tryParseJson(localStorage.getItem(applicationCacheConstants.storedLastUsedActivityIdKey)) || {};\r\n const currentPageLastUsedActivityId: StoredActivityId = existingLastUsedActivityIds[this.clientSettings.pagetype];\r\n\r\n // If the current pages last used activity ID matches the one for the current page head data\r\n // then we have re-used this. Mark it as such but don't override the timestamp\r\n if (currentPageLastUsedActivityId && (currentPageLastUsedActivityId.id === this.clientSettings.aid)) {\r\n currentPageLastUsedActivityId.previouslyUsed = true;\r\n existingLastUsedActivityIds[this.clientSettings.pagetype] = currentPageLastUsedActivityId;\r\n } else {\r\n // If they don't match then that means we haven't used this so store the new value.\r\n const activityIdToStore: StoredActivityId = { id: this.clientSettings.aid, ts: (new Date()).getTime() };\r\n existingLastUsedActivityIds[this.clientSettings.pagetype] = activityIdToStore;\r\n }\r\n\r\n // Update the last used activity ID in storage\r\n localStorage.setItem(applicationCacheConstants.storedLastUsedActivityIdKey, JSON.stringify(existingLastUsedActivityIds));\r\n }\r\n\r\n /**\r\n * Parses flights from provided string (if in proper format of f:{flights})\r\n * and sets it to the headData object\r\n */\r\n private setFlights(flightString: string): void {\r\n // The comma separated list of flights enabled in current request\r\n this.currentFlights = ((/f:\\s*([^;]+)/i.exec(flightString) || {})[1] || \"\").toLowerCase();\r\n }\r\n\r\n /**\r\n * Determines if we are in Enterprise version based on clientSettings and currentFlights\r\n */\r\n private setIsEnterprise(): void {\r\n // We know we are in the Enterpise version of the page when both the audience mode is set to Enterprise\r\n // and the correct flight id is set.\r\n this.IsEnterprise = this.clientSettings &&\r\n this.currentFlights &&\r\n this.currentFlights.includes(EnterpiseFlightId) &&\r\n this.clientSettings.audienceMode === AudienceModeType.Enterprise;\r\n }\r\n\r\n /**\r\n * Read query items to determine the headdata variable values.\r\n */\r\n private setQueryItemProvidedValues(): void {\r\n // This only finds multiples of item=key:value qsp. If keys are the same, first given will be used (similar to UrlSearchParamsHelper).\r\n const queryItems = UrlUtility.getParamsWithItems(getLocationSearch());\r\n const cmsItem = queryItems.find(item => item.key === \"cms\");\r\n this.enableCMSPPEConfigs = (cmsItem && cmsItem.value === \"ppe\");\r\n \r\n // Test override to add flights for scope purposes\r\n this.setCurrentFlightsTestOverride(queryItems);\r\n }\r\n\r\n /**\r\n * Overrides currentFlights when hostname is localhost. Used for testing.\r\n */\r\n private setCurrentFlightsTestOverride(queryItems: KeyValueArray): void {\r\n if (getLocationHostname().toLowerCase().includes(\"localhost\") && queryItems) {\r\n const flights = queryItems.find(item => item.key === \"flights\");\r\n if (flights) {\r\n this.currentFlights = flights.value;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Determines if Office is the default pivot based on flight id.\r\n */\r\n private setIsOfficeDefaultPivot(): void {\r\n // There is work scheduled to have \"sticky\" pivots stored in some form of local storage which will\r\n // replace this check. Until then, the only way to know if Office is the default pivot is to check\r\n // for this flight id\r\n this.IsOfficeDefaultPivot = this.currentFlights && this.currentFlights.includes(OfficeDefaultPivotFlightId);\r\n }\r\n}\r\n\r\nexport const getHeadData = HeadData.getInstance;\r\n\r\n// headData can be reinitialized through resetHeadData.\r\nexport let headData = HeadData.getInstance();\r\n\r\n/**\r\n * Export function to reset headData based on WebClientData\r\n */\r\nexport const resetHeadData = HeadData.resetInstance;","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { IActionPayload } from \"./IActionPayload\";\r\nimport { IDataConnector } from \"../connectors\";\r\nimport PageBase from \"../pages/PageBase\";\r\n\r\n/**\r\n * Helper function to create an action payload\r\n * @param connector The connector (if applicable) where the action will be dispatched\r\n * @param type The Action Type (name of the action)\r\n * @param args Arguments to be passed to the action\r\n * @param experienceInstanceId If defined, the id of an experience instance, that will be used by action receiver\r\n */\r\nexport function getActionPayload(connector: IDataConnector, type: string, args: any[], experienceInstanceId: string): IActionPayload {\r\n let stateKey: string = undefined;\r\n if (connector) {\r\n if (!connector.parentNamespace) {\r\n stateKey = connector.namespace;\r\n } else {\r\n stateKey = connector.parentNamespace + \".\" + connector.namespace;\r\n }\r\n }\r\n\r\n return {\r\n key: stateKey,\r\n experienceInstanceId: experienceInstanceId,\r\n type: type,\r\n params: args\r\n };\r\n}\r\n\r\n/**\r\n * Helper function to dispatch an action either to a connector's namespaced store, or to the root store for the entire app.\r\n * @param connector The connector (if applicable) where the action will be dispatched\r\n * @param payload The action payload\r\n */\r\nexport function dispatchAction(connector: IDataConnector, payload: IActionPayload): any {\r\n\r\n // Dispatch the action\r\n if (connector) {\r\n return connector.store.dispatch(payload);\r\n } else {\r\n return PageBase.getInstance().store.dispatch(payload);\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { IActionDispatchCancellationToken } from \"./IActionDispatchCancellationToken\";\r\n\r\n/**\r\n * Cancellation Token class.\r\n * @class\r\n */\r\nexport class ActionDispatchCancellationToken implements IActionDispatchCancellationToken {\r\n /** Backing variable for the isCancellationRequested property\r\n * @type {boolean}\r\n */\r\n private isCancelled: boolean;\r\n\r\n /**\r\n * Creates an instance of the `ActionDispatchCancellationToken` class.\r\n * @constructor\r\n */\r\n constructor() {\r\n this.isCancelled = false;\r\n }\r\n\r\n /**\r\n * Helper method to cater for a null or undefined token.\r\n * A null or undefined token means cancellation cannot be requested, so it is equivalent to false\r\n * @method\r\n * @param {IActionDispatchCancellationToken} cancellationToken Optional cancellation token to be checked for undefined, null or cancellation requested\r\n * @returns {boolean}\r\n */\r\n public static isCancellationRequested(cancellationToken?: IActionDispatchCancellationToken): boolean {\r\n return !(cancellationToken === undefined || cancellationToken === null || !cancellationToken.isCancellationRequested);\r\n }\r\n\r\n /** The cancel method.\r\n * @method\r\n */\r\n public cancel(): void {\r\n this.isCancelled = true;\r\n }\r\n\r\n /** getter for the isCancellationRequested property\r\n * @property\r\n * @returns {boolean} Whether cancellation has been requested or not.\r\n */\r\n public get isCancellationRequested(): boolean {\r\n return this.isCancelled;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { dispatchAction, getActionPayload } from \"./ActionDispatchHelper\";\r\n\r\nimport { ActionDispatchCancellationToken } from \"./ActionDispatchCancellationToken\";\r\nimport { ConnectorConstants } from \"../constants/ConnectorConstants\";\r\nimport { IActionDispatchCancellationToken } from \"./IActionDispatchCancellationToken\";\r\nimport { IActionPayload } from \"./IActionPayload\";\r\nimport { Observer } from \"./ActionObserver\";\r\nimport { PerfTimeline } from '@msnews/diagnostics';\r\n\r\n/**\r\n * Class that wraps the sending of a action to a connector (i.e. dispatch) with an explicit method, so that in the consuming code\r\n * it is obvious that the action is being \"sent\"\r\n * @class\r\n */\r\nexport abstract class ActionSenderBase {\r\n /**\r\n * Property which is a function that will send an action to the connector.\r\n */\r\n public get send(): TActionSignature {\r\n return (this.dispatchAction());\r\n }\r\n\r\n /**\r\n * Creates an instance of the `ActionSender` class.\r\n * @constructor\r\n * @param {string} type The action type.\r\n * @param {IActionDispatchCancellationToken} cancellationToken Optional cancellation token, which can be used to cancel an in flight action\r\n */\r\n constructor(\r\n protected type: string,\r\n private observers: Observer[],\r\n private cancellationToken?: IActionDispatchCancellationToken) { }\r\n\r\n /**\r\n * Method to get dispatcher and payload\r\n * @param args - the arguments being dispatched\r\n * @returns dispatch result metadata\r\n */\r\n protected abstract getDispatchResult(args: any[]): { payload: IActionPayload, result: any };\r\n\r\n /**\r\n * Gets the perf timeline object if applicable\r\n */\r\n protected abstract tryGetPerfTimeline(): PerfTimeline;\r\n\r\n /**\r\n * Method that returns an action sender function to send the action.\r\n * @method\r\n * @return {TActionSignature} return value is a function to send to action.\r\n */\r\n private dispatchAction(): TActionSignature {\r\n return function (): any {\r\n if (!ActionDispatchCancellationToken.isCancellationRequested(this.cancellationToken)) {\r\n\r\n const perfTimeline = this.tryGetPerfTimeline();\r\n let actionEndMeasure = perfTimeline && perfTimeline.startMeasure(\"action\", this.type).endMeasure;\r\n\r\n const { payload, dispatchResult } = this.getDispatchResult(Array.prototype.slice.call(arguments));\r\n\r\n // Call any observers\r\n this.observers.forEach(o => {\r\n try {\r\n // Call the observer\r\n o.observer(payload);\r\n } catch (error) {\r\n console.log(`Error calling observer: ${JSON.stringify(o)}, with error: ${error}`);\r\n }\r\n\r\n // If there is a connector, dispatch an action to it, forcing it to re-render\r\n if (o.connector) {\r\n let renderActionPayload = getActionPayload(o.connector, ConnectorConstants.renderAction, [], undefined);\r\n dispatchAction(o.connector, renderActionPayload);\r\n }\r\n });\r\n\r\n if (actionEndMeasure) {\r\n actionEndMeasure();\r\n }\r\n\r\n // Return the dispatch result\r\n return dispatchResult;\r\n } else {\r\n // Don't dispatch the action because it has been canceled\r\n return;\r\n }\r\n };\r\n }\r\n\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { dispatchAction, getActionPayload } from \"./ActionDispatchHelper\";\r\n\r\nimport { ActionSenderBase } from \"./ActionSenderBase\";\r\nimport { IActionDispatchCancellationToken } from \"./IActionDispatchCancellationToken\";\r\nimport { IActionPayload } from \"./IActionPayload\";\r\nimport { IDataConnector } from \"../connectors\";\r\nimport { Observer } from \"./ActionObserver\";\r\nimport { PerfTimeline } from '@msnews/diagnostics';\r\n\r\n/**\r\n * Class that wraps the sending of a action to a connector (i.e. dispatch) with an explicit method, so that in the consuming code\r\n * it is obvious that the action is being \"sent\"\r\n * @class\r\n */\r\nexport class ActionSender extends ActionSenderBase {\r\n\r\n /**\r\n * Creates an instance of the `ActionSender` class.\r\n * @constructor\r\n * @param {string} type The action type.\r\n * @param {IDataConnector} connector The connector instance to dispatch the action to.\r\n * @param {IActionDispatchCancellationToken} cancellationToken Optional cancellation token, which can be used to cancel an in flight action\r\n */\r\n constructor(\r\n type: string,\r\n observers: Observer[],\r\n private connector: IDataConnector,\r\n cancellationToken?: IActionDispatchCancellationToken) {\r\n\r\n super(type, observers, cancellationToken);\r\n }\r\n\r\n /**\r\n * Core dispatch implementation for {GlobalActionSender}\r\n * @param args - the arguments being dispatched\r\n * @returns dispatch result metadata\r\n */\r\n protected getDispatchResult(args: any[]): { payload: IActionPayload, result: any } {\r\n let payload = getActionPayload(this.connector, this.type, args, undefined);\r\n let result = dispatchAction(this.connector, payload);\r\n return { payload, result };\r\n }\r\n\r\n /**\r\n * Gets the perf timeline if applicable\r\n */\r\n protected tryGetPerfTimeline(): PerfTimeline {\r\n return this.connector.perfTimeline;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { PerfTimeline, tryGetPerfTimeline } from '@msnews/diagnostics';\r\nimport { dispatchAction, getActionPayload } from \"./ActionDispatchHelper\";\r\n\r\nimport { ActionSenderBase } from \"./ActionSenderBase\";\r\nimport { IActionDispatchCancellationToken } from \"./IActionDispatchCancellationToken\";\r\nimport { IActionPayload } from './IActionPayload';\r\nimport { Observer } from \"./ActionObserver\";\r\n\r\n/**\r\n * Class that wraps the sending of a action globally to all connectors\r\n * @export\r\n * @class\r\n */\r\nexport class GlobalActionSender extends ActionSenderBase {\r\n\r\n /**\r\n * Creates an instance of the `GlobalActionSender` class.\r\n * @constructor\r\n * @param {string} type The action type.\r\n * @param {string} experienceInstanceId Optional experienceInstanceId of the experience that is originating the action.\r\n * @param {IActionDispatchCancellationToken} cancellationToken Optional cancellation token, which can be used to cancel an in flight action.\r\n */\r\n constructor(\r\n type: string,\r\n observers: Observer[],\r\n private experienceInstanceId?: string,\r\n cancellationToken?: IActionDispatchCancellationToken) {\r\n\r\n super(type, observers, cancellationToken);\r\n }\r\n\r\n /**\r\n * Core dispatch implementation for {GlobalActionSender}\r\n * @param args - the arguments being dispatched\r\n * @returns dispatch result metadata\r\n */\r\n protected getDispatchResult(args: any[]): { payload: IActionPayload, result: any } {\r\n let payload = getActionPayload(undefined, this.type, args, this.experienceInstanceId);\r\n let result = dispatchAction(undefined, payload);\r\n return { payload, result };\r\n }\r\n\r\n /**\r\n * Gets the perf timeline if applicable\r\n */\r\n protected tryGetPerfTimeline(): PerfTimeline {\r\n return tryGetPerfTimeline(\"GlobalActionSender\", this.experienceInstanceId || \"unknown\");\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionObserver, Observer } from \".\";\r\n\r\nimport { ActionSender } from \"./ActionSender\";\r\nimport { GlobalActionSender } from \"./GlobalActionSender\";\r\nimport { IActionDispatchCancellationToken } from \"./IActionDispatchCancellationToken\";\r\nimport { IActionMap } from \"./IActionMap\";\r\nimport { IDataConnector } from \"../connectors/IDataConnector\";\r\nimport PageBase from \"../pages\";\r\n\r\n/**\r\n * Class that maps Action to its callback function type.\r\n * Provides the method to get action creator which returns callback function to send to action.\r\n * Callback function dispatches the action payload.\r\n * @class\r\n */\r\nexport class ActionMap implements IActionMap {\r\n\r\n /**\r\n * An array of registered action observers\r\n */\r\n private observers: Observer[] = [];\r\n\r\n /**\r\n * Creates an instance of the `ActionMap` class.\r\n * @constructor\r\n * @param {string} type The action type, which is part of the IActionMap contract.\r\n */\r\n constructor(public type: string) {\r\n }\r\n\r\n /**\r\n * Method that returns an action sender function that can be used to send/dispatch the action to a specific connector\r\n * @method\r\n * @param {IDataConnector | string} connector The connector instance to send the action to, or the connector namespace. If the param type\r\n * is string, then the connector instance will be looked up, and used if found.\r\n * @param {IActionDispatchCancellationToken} cancellationToken If passed in and cancellation has been requested, then nothing is dispatched.\r\n * @return {TActionSignature} return value is an object with a send method, which is used to send the action.\r\n */\r\n public getActionSender(connector: IDataConnector | string, cancellationToken?: IActionDispatchCancellationToken): ActionSender | undefined {\r\n let connectorInstance: IDataConnector = undefined;\r\n if (typeof(connector) === \"string\") {\r\n // Find the connector with the matching namespace\r\n connectorInstance = PageBase.getInstance().rootReducer.connector(connector);\r\n } else {\r\n connectorInstance = connector;\r\n }\r\n\r\n if (connectorInstance) {\r\n return new ActionSender(this.type, this.observers, connectorInstance, cancellationToken);\r\n }\r\n }\r\n\r\n /**\r\n * Method that returns an action sender function that can be used to send/dispatch the action globally to all connectors\r\n * @method\r\n * @param {string} experienceInstanceId An optional experienceInstanceId, that will get passed along in the action payload.\r\n * It can then be used by the receiving reducer to determine if the action should be handled.\r\n * @param {IActionDispatchCancellationToken} cancellationToken If passed in and cancellation has been requested, then nothing is dispatched.\r\n * @return {TActionSignature} return value is an object with a send method, which is used to send the action.\r\n */\r\n public getGlobalActionSender(experienceInstanceId?: string, cancellationToken?: IActionDispatchCancellationToken): GlobalActionSender {\r\n return new GlobalActionSender(this.type, this.observers, experienceInstanceId, cancellationToken);\r\n }\r\n\r\n /**\r\n * Method that registers a new observer for this action. The observer will be called after the action is dispatched\r\n * @method\r\n * @param {ActionObserver} observer The observer to be added to the list of observers that will be called when the action completes\r\n */\r\n public registerObserver(observer: ActionObserver, connector?: IDataConnector): void {\r\n this.observers.push({ observer: observer, connector: connector });\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n// Defines constants used in telemetry beacons\r\n\r\nexport default {\r\n // logSamplingRate was configured via %app_error_log_sampling_rate% in Prime. Hardcoding \"0\" here.\r\n logSamplingRate: \"0\",\r\n FireTelemetry: \"fireTelemetryBeacon\",\r\n GET: \"GET\",\r\n POST: \"POST\",\r\n Ctag: \"ctag\",\r\n Comscore: \"scorecard\",\r\n OTF: \"udc\",\r\n Exp: \"EX:\",\r\n ResetIdx: \"resetTelemetryEventIndex\"\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { KeyValueArray, KeyValuePair, Utility } from \"./Utility\";\r\nimport { findIndex, isArray, isEmpty, isString, trimEnd, trimStart } from \"lodash-es\";\r\n\r\nimport { StringMap } from \"../types\";\r\nimport { getLocationOrigin } from \"@msnews/isomorphic-util\";\r\n\r\nexport namespace UrlUtility {\r\n\r\n /**\r\n * Characters that, if present on a url, will make prime routing misbehave\r\n *\r\n * These are the characters we know cause problems:\r\n * - spaces\r\n * - slashes\r\n * - punctuation: !?.:\r\n * - ampersands\r\n *\r\n * As we don't know all the offending characters, we are just removing every character that is not alphanumeric\r\n */\r\n const primeForbiddenCharacters: RegExp = /[^A-Za-z0-9]+/g;\r\n\r\n /**\r\n * Parse parameters from the given URL\r\n * @param {string} url - the URL to parse for parameters\r\n * @param {boolean} decodeComponents - flag to indicate whether the query param key and value should be URL decoded\r\n * @returns {KeyValueArray} - the parsed query key/value collection\r\n */\r\n export function getParamsFromUrl(url: string, decodeComponents: boolean = false): KeyValueArray {\r\n if (!isString(url)) {\r\n return null;\r\n }\r\n\r\n let queryString: string = (url || \"\").split(\"?\")[1];\r\n return getParams(queryString, decodeComponents);\r\n }\r\n\r\n /**\r\n * Decode the given URL encoded string that may contain plus signs\r\n * @param {string} val - The value to decode.\r\n * @returns {string} - the decoded value\r\n */\r\n function decodeURIComponentWithPlusSign(val: string): string {\r\n val = val.replace(/\\+/g, \" \");\r\n val = decodeURIComponent(val);\r\n return val;\r\n }\r\n\r\n /**\r\n * Encode uri components in a way that won't break prime routing system\r\n * @param uriComponent the uriComponent to be encoded\r\n */\r\n export function encodeURIComponentForPrime(uriComponent: string): string {\r\n return encodeURIComponent(uriComponent.replace(primeForbiddenCharacters, \"-\"));\r\n }\r\n\r\n /**\r\n * Parse parameters from the given query string\r\n * @param {string} queryString - the query string to parse for parameters\r\n * @param {boolean} decodeComponents - flag to indicate whether the query param key and value should be URL decoded\r\n * @returns {KeyValueArray} - the parsed query key/value collection\r\n */\r\n export function getParams(queryString: string, decodeComponents: boolean = false): KeyValueArray {\r\n let params: KeyValueArray = [];\r\n // Remove the leading ? if it is present\r\n if (queryString && queryString.startsWith(\"?\")) {\r\n queryString = queryString.substring(1);\r\n }\r\n\r\n if (queryString) {\r\n // remove hash part.\r\n queryString = queryString.split(\"#\")[0];\r\n let queryArray = queryString.split(\"&\");\r\n for (let ndx = 0; ndx < queryArray.length; ndx++) {\r\n let parts = queryArray[ndx].split(\"=\");\r\n let queryKey = parts[0];\r\n let queryValue = parts[1];\r\n\r\n if (decodeComponents) {\r\n queryKey = decodeURIComponentWithPlusSign(queryKey);\r\n if (queryValue) {\r\n queryValue = decodeURIComponentWithPlusSign(queryValue);\r\n }\r\n }\r\n\r\n // Don't allow for duplicate query string parameter keys. Take the last one\r\n let newParam: KeyValuePair = { key: queryKey, value: queryValue };\r\n let existingParam = findIndex(params, (entry) => entry.key === newParam.key);\r\n if (existingParam === -1) {\r\n params.push(newParam);\r\n } else {\r\n params[existingParam] = newParam;\r\n }\r\n }\r\n }\r\n return params;\r\n }\r\n\r\n /**\r\n * Parse specific parameters from the given query string, allowing for multiple item=key:value.\r\n * This function ONLY parses qsp item=[key]:[value]\r\n * Note: Use first given rule for duplicate key!\r\n * @param {string} queryString - the query string to parse for parameters\r\n * @returns {KeyValueArray} - the parsed query key/value collection\r\n */\r\n export function getParamsWithItems(queryString: string): KeyValueArray {\r\n let params: KeyValueArray = [];\r\n\r\n const inputKey = \"item\";\r\n\r\n if (queryString) {\r\n // Remove the leading ? if it is present\r\n if (queryString.startsWith(\"?\")) {\r\n queryString = queryString.substring(1);\r\n }\r\n\r\n // split on the hashes.\r\n queryString = queryString.split(\"#\")[0];\r\n let queryArray = queryString.split(\"&\");\r\n for (let ndx = 0; ndx < queryArray.length; ndx++) {\r\n let parts = queryArray[ndx].split(\"=\");\r\n let queryKey = parts[0];\r\n let queryValue = parts[1];\r\n\r\n // If the query key is inputKey (default: \"item\"), and the query values is key:value, then convert the\r\n // value into the actual key/value\r\n if (queryKey.toLowerCase() === inputKey) {\r\n let queryItems = queryValue.split(\":\");\r\n // Ignore value not in \"key:value\" format\r\n if (queryItems.length === 2) {\r\n queryKey = queryItems[0];\r\n queryValue = queryItems[1];\r\n\r\n // Don't allow for duplicate query string parameter keys. Use first given rule for duplicate key!\r\n let newParam: KeyValuePair = { key: queryKey, value: queryValue };\r\n let existingParam = params.findIndex((entry) => entry.key === newParam.key);\r\n if (existingParam === -1) {\r\n params.push(newParam);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return params;\r\n }\r\n\r\n /**\r\n * Utility method to extract query string param in url.\r\n *\r\n * @export\r\n * @param {string} name - query param name\r\n * @returns {string} - query param value\r\n */\r\n export function getQueryParameterByName(name: string, href: string): string {\r\n\r\n // TODO: exposing this method for accessing a single parameter can be used\r\n // extremely inefficiently (for example if invoked multiple times to get parameters\r\n // from a single URL). Instead we should deprecate this and export getParamsObj\r\n // and use that throughout.\r\n\r\n let value = getParamsObj(href)[name];\r\n return (value !== undefined)\r\n ? value\r\n : null;\r\n }\r\n\r\n /**\r\n * Check if given url string is a valid url.\r\n * Returns true when url string is a valid url, otherwise false.\r\n *\r\n * @export\r\n * @param url {string} - Url string value to check\r\n * @param validateScheme {boolean} - Should scheme validation be forced\r\n * @return {boolean}\r\n */\r\n export function isValidUrl(url: string, validateScheme: boolean): boolean {\r\n return (isString(url) &&\r\n (url.length > 0) &&\r\n (!validateScheme ||\r\n validateScheme && url.indexOf(\"http\") === 0));\r\n }\r\n\r\n /**\r\n * Converts a keyValueArray into a set of query string parameters\r\n *\r\n * @export\r\n * @param {any} - params to be converted\r\n * @return {string}\r\n */\r\n export function keyValueArrayToQueryString(params: KeyValueArray): string {\r\n // Validate we have a nonempty array\r\n if (!isArray(params) || isEmpty(params)) {\r\n return \"\";\r\n }\r\n\r\n // Filter for valid keyValue entries, and then map them into key==value strings\r\n // joined with an &\r\n const queryString: string = params.filter(kv =>\r\n Utility.isKeyValuePair(\r\n kv,\r\n (key) => typeof (key) === \"string\",\r\n (value) => typeof (value) === \"string\"))\r\n .map(kv => kv.key + \"=\" + kv.value)\r\n .join(\"&\");\r\n\r\n return queryString;\r\n }\r\n\r\n /**\r\n * Helper method to parse the given URLs query parameters to a lookup dictionary\r\n * @param url - the URL string with the query params to parse\r\n * @returns The {StringMap} containing the key/value pairs, or empty object.\r\n */\r\n function getParamsObj(url: string): StringMap {\r\n let paramsObj = {};\r\n let paramArray = getParamsFromUrl(url, true);\r\n if (paramArray && paramArray.length) {\r\n paramArray.forEach(keyValuePair =>\r\n paramsObj[keyValuePair.key] = keyValuePair.value);\r\n }\r\n return paramsObj;\r\n }\r\n\r\n /**\r\n * For the given `url`, it appends the `subPath` to it.\r\n * It takes propers care to forward slashes characters\r\n * at the end of `url` and at the start of `subPath` parameters\r\n * @param url a valid url\r\n * @param subPath the path which is appended to `url`\r\n * @returns an URL object which is the `url` appended by `subPath`\r\n */\r\n export function joinSubpathToURL(url: URL, subPath: string): URL {\r\n const href = url.href;\r\n const trimmedEndSlashFromHref = trimEnd(href, \"/\");\r\n const trimmedStartSlashFromSubpath = trimStart(subPath, \"/\");\r\n return new URL(`${trimmedEndSlashFromHref}/${trimmedStartSlashFromSubpath}`);\r\n }\r\n\r\n /**\r\n * Updates a search parameter in the given url to map to a new value\r\n * Does not modify the url if the given search param doesn't exist\r\n * @param url the url to update\r\n * @param key the name of the search param to be updated\r\n * @param value the new value for the given search param\r\n * @returns {URL} the updated URL\r\n */\r\n export function updateSearchParam(url: URL, key: string, value: string): URL {\r\n // Note that the searchParams data member may not be compatible with older browser versions\r\n // see https://caniuse.com/#search=searchparams\r\n if (url && url.searchParams && url.searchParams.get(key)) {\r\n url.searchParams.set(key, value);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Appends a search parameter to the given url\r\n * @param url the url to modify\r\n * @param key the name of the search param to be appended\r\n * @param value the new value for the given search param\r\n * @returns {URL} the modified URL\r\n */\r\n export function appendSearchParam(url: URL, key: string, value: string, fallback?: boolean): URL {\r\n if (url) {\r\n if (url.searchParams || fallback) {\r\n url.searchParams.append(key, value);\r\n } else {\r\n // TODO Bug 22390312: [Peregrine] UrlUtility appendSearchParam needs more robust polyfill\r\n url = new URL(url.href + (url.search.indexOf(\"?\") >= 0 ? \"&\" : \"?\") + key + \"=\" + value);\r\n }\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Returns an absolute URL if a relative on is passed in, or returns the passed in URL if already absolute\r\n * @param partialUrl The relative or absolute URL\r\n * @returns {string} the absolute URL\r\n */\r\n export function getAbsoluteUrl(partialUrl: string): string {\r\n if (partialUrl.indexOf('://') > 0 || partialUrl.indexOf('//') === 0) {\r\n return partialUrl;\r\n } else {\r\n return getLocationOrigin() + partialUrl;\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * locationHref of page\r\n */\r\nexport const locationHref = (typeof(window) !== \"undefined\" ? window.location.href : \"\");\r\n\r\n/**\r\n * localStorage key prefix for render cache object\r\n */\r\nexport const storagePrefix = `lastKnown_`;\r\n\r\n/**\r\n * localStorage key prefix for render cache expiration timestamp\r\n */\r\nexport const expirationPrefix = `timestamp_`;\r\n\r\n/**\r\n * localStorage key for JSS Map object\r\n */\r\nexport const jssMapKey = `${storagePrefix}${locationHref}_jssmap`;\r\n\r\n/**\r\n * localStorage key for render cache object\r\n */\r\nexport const renderCacheKey = `${storagePrefix}${locationHref}`;\r\n\r\n/**\r\n * localStorage key for render cache expiration timestamp\r\n */\r\nexport const renderCacheExpirationKey = `${expirationPrefix}${locationHref}`;\r\n\r\n/**\r\n * render-cache expiration time in ms\r\n * 86400000 = 24 hours in milliseconds\r\n */\r\nexport const defaultExpirationTimeMs = 86400000;\r\n\r\n/**\r\n * River Render Cache ClassName\r\n */\r\nexport const riverRcClassName = \"river-rc\";","// © Microsoft Corporation. All rights reserved.\r\n/// Adds basic dom manipulation functions to an object defined as \"dom\"\r\n\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\nvar doc = canUseDOM() ? document : null;\r\nvar otherWhitespaceRegex = /[\\n\\t]/g;\r\nvar trimRegex = /(^\\s+)|(\\s+$)/mg;\r\n\r\n// curly brace needs to be on the return line otherwise build with throw an error\r\nexport default {\r\n attr: function (elem, attr) {\r\n // getAttribute(attr, 2) causes IE to only report correct values for href.\r\n // IE reports href values for IMG tags without an href property\r\n // see http://reference.sitepoint.com/javascript/Element/getAttribute\r\n // see bug #1131443\r\n return elem && (elem.getAttribute ? elem.getAttribute(attr, 2) : elem[attr]) || \"\";\r\n },\r\n name: function (elem) {\r\n return elem && elem.nodeName || \"\";\r\n },\r\n text: function (elem) {\r\n return (elem && (elem.textContent || elem.innerText) || \"\").replace(trimRegex, \"\");\r\n },\r\n children: function (elem) {\r\n return elem && elem.children || [];\r\n },\r\n parent: function (elem) {\r\n return elem && elem.parentNode;\r\n },\r\n getElementsByTagName: function (name) {\r\n return doc ? doc.getElementsByTagName(name) : [];\r\n },\r\n create: function (name) {\r\n return doc ? doc.createElement(name) : null;\r\n },\r\n containsClass: function (element, className) {\r\n /// \r\n /// Looks for the className in element and returns true/false based on result.\r\n /// \r\n /// element - Element where className to be searched for.\r\n /// className - Class name to be looked for.\r\n /// \r\n /// \r\n return element && ((\" \" + (element.className || element.getAttribute(\"class\")) + \" \")\r\n .replace(otherWhitespaceRegex, \" \").indexOf(\" \" + className + \" \") > -1);\r\n },\r\n getTarget: function (event) {\r\n return event && (event.customTarget || event.target || event.srcElement) || doc;\r\n }\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Constants that are used throughout the library\r\n */\r\nexport namespace ConnectorConstants {\r\n /**\r\n * The key within a state JSON document used to store a connectors individual state\r\n */\r\n export const connectorStateKey: string = \"_@STATE@_\";\r\n\r\n export const renderAction: string = \"@@connector-view/RENDER\";\r\n\r\n export const dataConnectorMergeInitAction: string = \"@@data-connector/MERGE-INIT\";\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n// Usage:\r\n// pass data to any callback that has subscribed to the event\r\n// mediator.pub(event, data);\r\n//\r\n// call the callback whenever this event is published\r\n// mediator.sub(event, callback)\r\n//\r\n// pass data to any callback that has subscribed to this event and channel\r\n// mediator.pubChannel(event, channel, data);\r\n//\r\n// call the callback whenever this event is published to this channel\r\n// mediator.subChannel(event, channel, callback)\r\n//\r\n// Think of pub/sub as using their own channel, useful for 1 ofs or app communication.\r\n// Channels are useful when multiple copies of the same widget want to communicate.\r\n\r\n/// Constructor for mediator object\r\n/// Mediator object\r\n\r\n/// Default publish subscribe where all non-channel-specific events are managed\r\n// @ts-ignore\r\nvar defaultPubSub = new PublishSubscribe();\r\nvar channels = {};\r\nexport default {\r\n pub: defaultPubSub.pub,\r\n sub: defaultPubSub.sub,\r\n unsub: defaultPubSub.unsub,\r\n pubChannel: function (event, channel, data) {\r\n /// Publishes event to channel subscribers only\r\n /// Event to subscribe to\r\n /// Name of the channel\r\n /// Data to pass to the callback\r\n getChannel(channel).pub(event, data);\r\n },\r\n subChannel: function (event, channel, callback) {\r\n /// Subscribes to event published on a specific channel\r\n /// Event to subscribe to\r\n /// Name of the channel\r\n /// Function to call when the event is fired\r\n getChannel(channel).sub(event, callback);\r\n },\r\n unsubChannel: function (event, channel, callback) {\r\n /// Unsubscribe from an event published on a specific channel\r\n /// Event to subscribe to\r\n /// Name of the channel\r\n /// Function to call when the event is fired\r\n getChannel(channel).unsub(event, callback);\r\n }\r\n};\r\n\r\nfunction getChannel(channel) {\r\n /// Gets a channel from the collection of mediator channels\r\n /// ID of the channel\r\n /// Channel requested or new channel if not exist\r\n if (!channels[channel]) {\r\n // @ts-ignore\r\n channels[channel] = new PublishSubscribe();\r\n }\r\n return channels[channel];\r\n}\r\n\r\nfunction PublishSubscribe() {\r\n /// PublishSubscribe factory\r\n /// PubSub Object\r\n var pubMap = {};\r\n return {\r\n pub: function (event, data) {\r\n /// Passes data to any callback that has subscribed to the event\r\n /// Event being published\r\n /// Data to pass to the callback\r\n var callbacks = pubMap[event];\r\n\r\n if (callbacks) {\r\n for (var ndx = 0; ndx < callbacks.length; ndx++) {\r\n callbacks[ndx](data);\r\n }\r\n }\r\n },\r\n sub: function (event, callback) {\r\n /// Subscribes the callback to this event\r\n /// Event to subscribe to\r\n /// Function to call when the event is fired\r\n if (typeof callback == \"function\") {\r\n var listeners = pubMap[event];\r\n\r\n if (!listeners) {\r\n listeners = [];\r\n pubMap[event] = listeners;\r\n }\r\n listeners.push(callback);\r\n }\r\n },\r\n unsub: function (event, callback) {\r\n /// Unsubscribes a callback from an event\r\n /// Event to unsubscribe from\r\n /// Function to unsubscribe from the event\r\n var listeners = pubMap[event];\r\n\r\n if (listeners) {\r\n for (var ndx = 0; ndx < listeners.length; ndx++) {\r\n if (listeners[ndx] === callback) {\r\n listeners.splice(ndx--, 1);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Client side properties that Render Service sends to initialize RequestData.\r\n * These properties are typically passed via query param to the render service.\r\n * On the client side these are available and populated through the DOM.\r\n */\r\nexport interface RequestProps {\r\n\r\n /**\r\n * URL for the original client request.\r\n */\r\n href: string;\r\n\r\n /**\r\n * Width of client browser window.\r\n */\r\n innerWidth: number;\r\n\r\n /**\r\n * Height of client browser window.\r\n */\r\n innerHeight: number;\r\n\r\n /**\r\n * Device pixel ratio of client.\r\n */\r\n devicePixelRatio: number;\r\n\r\n /**\r\n * CSS Grid support of the client browser.\r\n */\r\n canUseCssGrid: boolean;\r\n\r\n /**\r\n * Request Id.\r\n */\r\n requestId: number;\r\n}\r\n\r\n/**\r\n * Singleton class to store client browser data sent through query param to Render Service.\r\n * This is only used under server environment.\r\n */\r\nclass RequestData {\r\n /**\r\n * The single instance of the RequestData class.\r\n * @type {RequestData}\r\n */\r\n private static _instance: RequestData = null;\r\n\r\n /**\r\n * URL object to be used to store original request url.\r\n */\r\n public readonly url: URL;\r\n\r\n /**\r\n * Inner width of browser from the original request.\r\n */\r\n public readonly innerWidth: number;\r\n\r\n /**\r\n * Inner height of browser from the original request.\r\n */\r\n public readonly innerHeight: number;\r\n\r\n /**\r\n * Device pixel ratio from the original request.\r\n */\r\n public readonly devicePixelRatio: number;\r\n\r\n /**\r\n * Boolean flag that represents if CSS Grid is supported by the browser from the original request.\r\n */\r\n public readonly canUseCssGrid: boolean;\r\n\r\n /**\r\n * Request Id.\r\n */\r\n public readonly requestId: number;\r\n\r\n /**\r\n * Initialize the request data instance with passed in client properties\r\n */\r\n private constructor(data: RequestProps) {\r\n this.url = new URL(data.href);\r\n this.innerWidth = data.innerWidth;\r\n this.innerHeight = data.innerHeight;\r\n this.devicePixelRatio = data.devicePixelRatio;\r\n this.canUseCssGrid = data.canUseCssGrid;\r\n this.requestId = data.requestId;\r\n }\r\n\r\n /**\r\n * Returns singleton class instance.\r\n * @returns RequestData\r\n */\r\n public static getInstance(): RequestData {\r\n if (global[\"TEST_ENV\"] && !RequestData._instance) {\r\n resetRequestData({\r\n href: \"http://localhost:8080/\",\r\n innerWidth: 1024,\r\n innerHeight: 768,\r\n devicePixelRatio: 1,\r\n canUseCssGrid: false,\r\n requestId: 0\r\n });\r\n }\r\n\r\n if (!RequestData._instance) {\r\n // Throw error if the request data has not been set as this should never be the case.\r\n // This likely highlights that the request data was not initialized when handling a\r\n // request when server side rendering.\r\n throw new Error(\"Request data is not initialized yet through ResetInstance.\");\r\n }\r\n return RequestData._instance;\r\n }\r\n\r\n /**\r\n * Reset singleton class instance with passed in info and client settings\r\n * @returns RequestData\r\n */\r\n public static resetInstance(data: RequestProps): RequestData {\r\n RequestData._instance = new RequestData(data);\r\n return RequestData._instance;\r\n }\r\n}\r\n\r\n/**\r\n * Export function to reset the request data singleton.\r\n * This must be used to set the request data.\r\n */\r\nexport const resetRequestData = RequestData.resetInstance;\r\n\r\n/**\r\n * Export get instance function for testing\r\n */\r\nexport const getRequestData = () => (RequestData.getInstance());","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, AppErrorPropertyBag, Severity } from \"./AppErrorTracker\";\r\n\r\n/**\r\n * This file contains the list of errors to log to the server for each feature.\r\n * We are centralizing errors here to make sure we do not have any dupes\\conflicts.\r\n * The idea is that each feature would have their own range of values.\r\n *\r\n * IMPORTANT: Please do not add strings to this file. Please map messages to send in your\r\n * code.\r\n */\r\n\r\n/**\r\n * All app errors are set to create IcM ticket by default unless specified in individual error code otherwise.\r\n */\r\nconst severity = Severity.Alert;\r\n\r\n// Webpack defines the BUILD_NUMBER of client code build number.\r\ndeclare var BUILD_NUMBER: string;\r\n\r\n/**\r\n * Get build number from web pack. If not present, return empty\r\n */\r\nconst pb: AppErrorPropertyBag = {\r\n build: typeof BUILD_NUMBER === \"undefined\"\r\n ? \"\"\r\n : BUILD_NUMBER\r\n};\r\n\r\n/** Represents a ServiceUI related error */\r\nexport const ServiceUiError: AppError = {\r\n id: 5100,\r\n source: \"ServiceUiComm.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents a Top Sites related error */\r\nexport const TopSitesError: AppError = {\r\n id: 8010,\r\n source: \"TopSites.tsx\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents a Top Sites error when there are zero rendered top sites */\r\nexport const ZeroTopSitesError: AppError = {\r\n id: 8011,\r\n source: \"TopSites.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** Curated sites list is empty */\r\nexport const CuratedSitesEmpty: AppError = {\r\n id: 8012,\r\n source: \"TopSites.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\nconst TopSitesEdgeConnectorFileName: string = \"TopSitesEdge.connector.tsx\";\r\nconst TopSitesEdgeStorageFileName: string = \"TopSitesStorage.ts\";\r\n\r\nexport const TopSitesEdgeAppErrors = {\r\n ZeroTopSitesError: {\r\n id: 8013,\r\n source: TopSitesEdgeConnectorFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n CuratedSitesEmpty: {\r\n id: 8014,\r\n source: TopSitesEdgeStorageFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n ComponentMountFailed: {\r\n id: 8015,\r\n source: TopSitesEdgeConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n ErrorFetchingRichTopSitesDataCollectionFromCms: {\r\n id: 8016,\r\n source: TopSitesEdgeStorageFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst TopSitesEdgeNextConnectorFileName: string = \"TopSitesEdgeNext.connector.tsx\";\r\n\r\nexport const TopSitesEdgeNextAppErrors = {\r\n\r\n /** The React component failed to mount */\r\n ComponentMountFailed: {\r\n id: 8020,\r\n source: TopSitesEdgeNextConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Represents a Top Sites error when there are zero rendered top sites */\r\n ZeroTopSitesError: {\r\n id: 8021,\r\n source: TopSitesEdgeNextConnectorFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nexport const TopSiteDialogAppErrors = {\r\n /** The React component failed to mount */\r\n TopSitesDialogFailedToMount: {\r\n id: 8025,\r\n source: \"TopSitesDialog.tsx\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst OneServiceCardProviderFileName: string = \"OneServiceCardProvider.ts\";\r\n\r\nexport const OneServiceCardProviderAppErrors = {\r\n OneServiceResponseWasNullOrErroneous: {\r\n id: 8031,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n ErrorFetchingOneServiceResponse: {\r\n id: 8032,\r\n source: OneServiceCardProviderFileName,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n\r\n InvalidJsonInOneServiceResponse: {\r\n id: 8033,\r\n source: OneServiceCardProviderFileName,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n\r\n InvalidFeedListInOneServiceResponse: {\r\n id: 8034,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n RiverConfigurationIssue: {\r\n id: 8035,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load views river content based on current vertical/category. */\r\n QueryInterestContentFetchError: {\r\n id: 8036,\r\n source: OneServiceCardProviderFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n StaticContentLoaded: {\r\n id: 8037,\r\n source: OneServiceCardProviderFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nconst OneServiceDailyBriefApi: string = \"dailyBriefServiceClient.ts\";\r\n\r\nexport const DailyBriefServiceClientAppErrors = {\r\n OneServiceResponseWasNullOrErroneous: {\r\n id: 8038,\r\n source: OneServiceDailyBriefApi,\r\n severity,\r\n pb\r\n },\r\n\r\n OneServiceArticleListWasNullOrErroneous: {\r\n id: 8039,\r\n source: OneServiceDailyBriefApi,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst ContentPreviewSourceFile = \"ContentPreview.connector.ts\";\r\nconst ContentPreviewDataSourceFile = \"ContentPreviewData.ts\";\r\nconst ExternalContentMapperHelperFile = \"ExternalContentMapperHelper.ts\";\r\n\r\nexport const ContentPreviewAppErrors = {\r\n\r\n ErrorWhileFetchingContentPreviewContent: {\r\n id: 8041,\r\n source: ContentPreviewDataSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n InvalidResponseFromContentPreviewFetch: {\r\n id: 8042,\r\n source: ContentPreviewDataSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n InvalidResponseFromContentPreviewResponseJson: {\r\n id: 8043,\r\n source: ContentPreviewDataSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n ErrorWhileInitializingAsyncContentPreviewContent: {\r\n id: 8044,\r\n source: ContentPreviewSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n InvalidOrMissingContentId: {\r\n id: 8045,\r\n source: ContentPreviewDataSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n MissingDataForExternalContent: {\r\n id: 8046,\r\n source: ExternalContentMapperHelperFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nconst RiverSourceFile = \"River.connector.ts\";\r\n\r\nexport const RiverAppErrors = {\r\n UnknownMetadataReceivedFromRiverCardProvider: {\r\n id: 8051,\r\n source: RiverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n RiverContentProviderFetchException: {\r\n id: 8052,\r\n source: RiverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n UnableToSelectSectionTemplateForGivenChildExperiences: {\r\n id: 8053,\r\n source: RiverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n InvalidConfig: {\r\n id: 8054,\r\n source: RiverSourceFile,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n\r\n ChildLoadError: {\r\n id: 8056,\r\n source: RiverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n InitialDataLoadError: {\r\n id: 8057,\r\n source: RiverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Warning for when the ordinal children we get from config contains a duplicate instance id. */\r\n DuplicateInstanceIdWarning: {\r\n id: 8058,\r\n source: RiverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nconst UserInitiatedPageRefreshSourceFile = \"UserInitiatedPageRefresh.ts\";\r\nexport const UserInitiatedPageRefreshErrors = {\r\n Default: {\r\n id: 8060,\r\n source: UserInitiatedPageRefreshSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst PivotContentSourceFile = \"PivotContent.connector.ts\";\r\nexport const PivotContentErrors = {\r\n LoadFailure: {\r\n id: 8070,\r\n source: PivotContentSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst PivotsNavSourceFile = \"PivotsNav.connector.ts\";\r\nexport const PivotsNavErrors = {\r\n TopicDataConnectorUnavailable: {\r\n id: 8075,\r\n source: PivotsNavSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n NavigationDataConnectorUnavailable: {\r\n id: 8076,\r\n source: PivotsNavSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n DynamicPivotsHelperLoaderFailed: {\r\n id: 8077,\r\n source: PivotsNavSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n LayoutPreferenceDataConnectorUnavailable: {\r\n id: 8078,\r\n source: PivotsNavSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Smart list is empty */\r\nexport const SmartListEmpty: AppError = {\r\n id: 8080,\r\n source: \"SmartList.connector.ts\",\r\n severity,\r\n pb\r\n};\r\n\r\n/** Represents BingWebSSO related App errors */\r\nconst BingWebSSOSourceFile = \"BingWebSSO.tsx\";\r\nexport const BingWebSSOAppErrors = {\r\n /** Failed to render bing websso iframe */\r\n BingWebSSORenderFailed: {\r\n id: 8090,\r\n source: BingWebSSOSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** User signed-in to MSA on page but bing SSO returned authentication failed response */\r\n BingWebSSOSignInFailed: {\r\n id: 8091,\r\n source: BingWebSSOSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Bing SSO process did not complete withing required time */\r\n BingWebSSOTimeout: {\r\n id: 8092,\r\n source: BingWebSSOSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst WeatherDataConnectorSourceFile = \"WeatherData.connector.ts\";\r\nexport const WeatherDataAppErrors = {\r\n /** Failed to fetch weather summary */\r\n WeatherSummaryFetchError: {\r\n id: 8100,\r\n source: WeatherDataConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** No valid Location set from User */\r\n WeatherLocationEmpty: {\r\n id: 8101,\r\n source: WeatherDataConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Not able to read from PDP */\r\n WeatherPDPReadFailed: {\r\n id: 8102,\r\n source: WeatherDataConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Not able to write home location to PDP */\r\n WeatherPDPHomeLocationWriteFailed: {\r\n id: 8103,\r\n source: WeatherDataConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Not able to write display Unit to PDP */\r\n WeatherPDPDisplayUnitWriteFailed: {\r\n id: 8104,\r\n source: WeatherDataConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Not able to localize Location */\r\n WeatherLocalizeLocationFailed: {\r\n id: 8105,\r\n source: WeatherDataConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nconst WeatherCardConnectorSourceFile = \"WeatherCard.connector.ts\";\r\nexport const WeatherCardAppErrors = {\r\n /** Failed to fetch local news */\r\n WeatherLocalNewsFetchError: {\r\n id: 8106,\r\n source: WeatherCardConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Failed to fetch autosuggest for locations */\r\n WeatherAutoSuggestFetchError: {\r\n id: 8107,\r\n source: WeatherCardConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** No valid Location set from User */\r\n WeatherLocationEmpty: {\r\n id: 8108,\r\n source: WeatherCardConnectorSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst SportsPdpServiceClientSourceFile = \"SportsPdpServiceClient.ts\";\r\nexport const SportsCardError = {\r\n /** Failed to fetch league sports pdp */\r\n SportsLeaguePdpFetchError: {\r\n id: 8110,\r\n source: SportsPdpServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch league sports pdp */\r\n SportsLeaguePdpInvalidResponse: {\r\n id: 8111,\r\n source: SportsPdpServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch players sports pdp */\r\n SportsPlayersPdpFetchError: {\r\n id: 8112,\r\n source: SportsPdpServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch players sports pdp */\r\n SportsPlayersPdpInvalidResponse: {\r\n id: 8113,\r\n source: SportsPdpServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch teams sports pdp */\r\n SportsTeamsPdpFetchError: {\r\n id: 8114,\r\n source: SportsPdpServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch teams sports pdp */\r\n SportsTeamsPdpInvalidResponse: {\r\n id: 8115,\r\n source: SportsPdpServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get sports card config */\r\n SportsCardConfigFetchError: {\r\n id: 8116,\r\n source: \"SportsCardConfigReader.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get Team Data */\r\n SportsCardGetFavoriteTeamDataError: {\r\n id: 8117,\r\n source: \"SportsCard.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get Team Data */\r\n SportsCardGetPlayerBioError: {\r\n id: 8118,\r\n source: \"SportsCard.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n SportsCardGetLeaguesGamesArrayError: {\r\n id: 8119,\r\n source: \"SportsCard.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n SportsCardGetPdpDataFailure: {\r\n id: 8120,\r\n source: \"SportsCard.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n SportsCardGetLeagueSeasonYearDataFailure: {\r\n id: 8121,\r\n source: \"SportsCardServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n SportsCardGetLocalizedTeamNameDataFailure: {\r\n id: 8122,\r\n source: \"SportsCardServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n SportsCardGetTeamDataFailure: {\r\n id: 8123,\r\n source: \"SportsCardServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n SportsCardGetLeagueDataFailure: {\r\n id: 8124,\r\n source: \"SportsCardServiceClient.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst MoneyCardConnectorFile = \"MoneyCard.connector.ts\";\r\nexport const MoneyCardError = {\r\n /** Failed to get quote summary for user */\r\n MoneyQuoteSummaryGetError: {\r\n id: 8130,\r\n source: MoneyCardConnectorFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get quote summaries */\r\n MoneyQuoteSummariesGetError: {\r\n id: 8131,\r\n source: MoneyCardConnectorFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get pdp data */\r\n MoneyPdpDataGetErrorFromService: {\r\n id: 8132,\r\n source: \"MoneyPdpServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get pdp data because of invalid response */\r\n MoneyPdpInvalidResponseFromService: {\r\n id: 8133,\r\n source: \"MoneyPdpServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get quote summary response for user from service client */\r\n MoneyQuoteSummaryGetErrorFromService: {\r\n id: 8134,\r\n source: \"MoneyQuotesServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get quote summary response for user from service client because of invalid response */\r\n MoneyQuoteSummaryInvalidResponseFromService: {\r\n id: 8135,\r\n source: \"MoneyQuotesServiceClient.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const TrendingNewsErrors = {\r\n /** Failed to fetch the trending news stories */\r\n DataFetchError: {\r\n id: 8140,\r\n source: \"TrendingNews.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n /** Failed to fetch the backup data for trending news stories */\r\n BackupDataFetchError: {\r\n id: 8141,\r\n source: \"TrendingNews.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst ComplexContentPreviewSourceFile = \"ComplexContentPreview.connector.ts\";\r\nexport const ComplexContentPreviewErrors = {\r\n InitError: {\r\n id: 8150,\r\n source: ComplexContentPreviewSourceFile,\r\n severity,\r\n pb\r\n },\r\n LoadError: {\r\n id: 8151,\r\n source: ComplexContentPreviewSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n ContentError: {\r\n id: 8152,\r\n source: ComplexContentPreviewSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const GridSectionAppErrors = {\r\n /** Unable to generate river section cards */\r\n GridSectionCardGenerationError: {\r\n id: 8160,\r\n source: \"GridSection.tsx\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst MmxEntryPointFileName: string = \"MMXPage.connector.ts\";\r\n\r\nexport const MmxEntryPointAppErrors = {\r\n /**\r\n * MMX river is not able to load Error Page.\r\n */\r\n MmxErrorPage: {\r\n id: 8170,\r\n source: MmxEntryPointFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Error fetching the APP_ANON cookie on MMX page load\r\n */\r\n ErrorFetchingAppAnonCookie: {\r\n id: 8171,\r\n source: \"page.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst irisImageHotspotsFile = \"ImageHotspots.manager.ts\";\r\nexport const BackgroundImageAppErrors = {\r\n /** The Bing Image of the Day failed to load properly */\r\n BingIOTDFailedToLoad: {\r\n id: 8180,\r\n source: \"BingImageOfTheDayProvider.ts\",\r\n severity,\r\n pb\r\n },\r\n /** Error when Iris fails to return Hotspots Data to the client. */\r\n FailedHotspotsDataDelivery: {\r\n id: 8181,\r\n source: irisImageHotspotsFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Hotspots data that was returned failed to validate. */\r\n IncompleteHotspotsContract: {\r\n id: 8182,\r\n source: irisImageHotspotsFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Hotspots data found for the off page navigation failed inspection. */\r\n InvalidOffPageNavCTA: {\r\n id: 8183,\r\n source: irisImageHotspotsFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const SettingsDialogAppErrors = {\r\n /** Failed to get the saved layout preferences */\r\n ReadPreferencesFailed: {\r\n id: 8190,\r\n source: \"SettingsDialogEdgeNext.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch the ConfigData object from the client API */\r\n FetchNtpConfigDataFailed: {\r\n id: 8191,\r\n source: \"SettingsDialogEdgeNextBase.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n ChromiumClientEmbededsearchAPIError: {\r\n id: 8192,\r\n source: \"SettingsDialogEdgeNext.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const EdgePageSettingsAppErrors = {\r\n ServiceUiError: {\r\n id: 8192,\r\n source: \"EdgeSettingsProvider.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst MsnSettingMenuConnectorFileName = \"MsnSettingMenuConnector.connector.ts\";\r\n\r\nexport const MsnSettingsMenuAppErrors = {\r\n /** Failed to get feedback dialog connector */\r\n FailedToGetFeedbackDialogConnector: {\r\n id: 8193,\r\n source: MsnSettingMenuConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Failed to get feedback data connector */\r\n FailedToGetFeedbackDataConnector: {\r\n id: 8194,\r\n source: MsnSettingMenuConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** The Msn settings menu failed to load valid config settings */\r\n MsnSettingsMenuFailedToFetchConfig: {\r\n id: 8195,\r\n source: MsnSettingMenuConnectorFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst ShowFeedConnectorFileName = \"ShowFeed.connector.ts\";\r\n\r\nexport const ShowFeedAppErrors = {\r\n MissingPageSettings: {\r\n id: 8199,\r\n source: ShowFeedConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n ExpectedDataMissing: {\r\n id: 8198,\r\n source: ShowFeedConnectorFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst InfopaneSourceFile = \"Infopane.connector.ts\";\r\nexport const InfopaneErrors = {\r\n InitializeError: {\r\n source: InfopaneSourceFile,\r\n id: 8201,\r\n severity,\r\n pb\r\n },\r\n InvalidConfig: {\r\n source: InfopaneSourceFile,\r\n id: 8202,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const FeedbackDialogAppErrors = {\r\n /** Failed to get feedback data connector */\r\n FailedToGetFeedbackDataConnector: {\r\n id: 8211,\r\n source: \"FeedbackDialog.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const FeedbackLinkAppErrors = {\r\n /** The Feedback link failed to load valid config settings */\r\n FeedbackLinkFailedToFetchConfig: {\r\n id: 8210,\r\n source: \"FeedbackLink.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n /** Failed to get feedback dialog connector */\r\n FailedToGetFeedbackDialogConnector: {\r\n id: 8211,\r\n source: \"FeedbackLink.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n /** Failed to get feedback data connector */\r\n FailedToGetFeedbackDataConnector: {\r\n id: 8212,\r\n source: \"FeedbackLink.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const OneFooterErrors = {\r\n InvalidConfig: {\r\n source: \"OneFooter.connector.ts\",\r\n id: 8220,\r\n severity,\r\n pb\r\n },\r\n /** Failed to get feedback data connector */\r\n FailedToGetFeedbackDataConnector: {\r\n id: 8221,\r\n source: \"OneFooter.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const PoweredByLegendAppErrors = {\r\n /** The PoweredBy legend failed to load expected config settings */\r\n PoweredByLegendInvalidConfig: {\r\n id: 8230,\r\n source: \"PoweredByLegend.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst TabbedInfopaneSourceFile = \"TabbedInfopane.connector.ts\";\r\nexport const TabbedInfopaneErrors = {\r\n InitializeError: {\r\n source: TabbedInfopaneSourceFile,\r\n id: 8250,\r\n severity,\r\n pb\r\n },\r\n InvalidConfig: {\r\n source: TabbedInfopaneSourceFile,\r\n id: 8251,\r\n severity,\r\n pb\r\n },\r\n ChildLoadError: {\r\n source: TabbedInfopaneSourceFile,\r\n id: 8252,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const MeControlAppErrors = {\r\n /** The SSO call failed to return valid SSO sign-in information. */\r\n SSOFailedError: {\r\n id: 8260,\r\n source: \"MeControl.tsx\",\r\n severity,\r\n pb\r\n },\r\n /** The Me Control failed to load */\r\n MeControlLoadFailedError: {\r\n id: 8261,\r\n source: \"MeControl.tsx\",\r\n severity: Severity.HighImpact,\r\n pb\r\n }\r\n};\r\n\r\nconst TabbedInfopaneTabPreviewSourceFile = \"TabbedInfopaneTabPreview.connector.ts\";\r\nexport const TabbedInfopaneTabPreviewErrors = {\r\n InitError: {\r\n source: TabbedInfopaneTabPreviewSourceFile,\r\n id: 8270,\r\n severity,\r\n pb\r\n },\r\n InvalidConfig: {\r\n source: TabbedInfopaneTabPreviewSourceFile,\r\n id: 8271,\r\n severity,\r\n pb\r\n },\r\n LoadError: {\r\n source: TabbedInfopaneTabPreviewSourceFile,\r\n id: 8272,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const HeaderNavigationLogoAppErrors = {\r\n MegaMenuDataError: {\r\n id: 8280,\r\n source: \"HeaderNavigationLogoConnector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst pageClicksTrackerFileName = \"pageClicksTracker.ts\";\r\nexport const PageClickTrackerErrors = {\r\n InvalidResponse: {\r\n id: 8290,\r\n severity: Severity.NoAlert,\r\n source: pageClicksTrackerFileName,\r\n pb\r\n },\r\n FetchFailure: {\r\n id: 8291,\r\n severity: Severity.NoAlert,\r\n source: pageClicksTrackerFileName,\r\n pb\r\n }\r\n};\r\n\r\nconst TargetingSystemSourceFile = \"TargetingSystem.ts\";\r\nexport const TargetingSystemAppErrors = {\r\n GeneralError: {\r\n id: 8310,\r\n source: TargetingSystemSourceFile,\r\n severity,\r\n pb\r\n },\r\n TopLevelDataMissing: {\r\n id: 8311,\r\n source: TargetingSystemSourceFile,\r\n severity,\r\n pb\r\n },\r\n TrackingDataUPSMissing: {\r\n id: 8312,\r\n source: TargetingSystemSourceFile,\r\n severity,\r\n pb\r\n },\r\n AppEnvironmentValuesMissing: {\r\n id: 8313,\r\n source: TargetingSystemSourceFile,\r\n severity,\r\n pb\r\n },\r\n CallingOneServiceFailed: {\r\n id: 8314,\r\n source: TargetingSystemSourceFile,\r\n severity,\r\n pb\r\n },\r\n CallingUPSServiceFailed: {\r\n id: 8315,\r\n source: TargetingSystemSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst CoachmarkSourceFile = \"Coachmark.connector.ts\";\r\nconst CoachmarkTSX = \"Coachmark.tsx\";\r\nexport const CoachmarkAppErrors = {\r\n GeneralError: {\r\n id: 8320,\r\n source: CoachmarkTSX,\r\n severity,\r\n pb\r\n },\r\n NotPlaceable: {\r\n id: 8321,\r\n source: CoachmarkTSX,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n NotFoundComponent: {\r\n id: 8322,\r\n source: CoachmarkSourceFile,\r\n severity,\r\n pb\r\n },\r\n CoachmarkDataConnectorUndefined: {\r\n id: 8323,\r\n source: CoachmarkSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst CoachmarkDataConnectorSourceFile = \"CoachmarkData.connector.ts\";\r\nconst CoachmarkPayloadSourceFile = \"CoachmarkPayload.ts\";\r\nconst IrisHandlerSourceFile = \"IrisHandler.ts\";\r\nexport const CoachmarkDataAppErrors = {\r\n InvalidCoachmarkMessage: {\r\n id: 8324,\r\n source: CoachmarkPayloadSourceFile,\r\n severity,\r\n pb\r\n },\r\n IrisDataConnectorUndefined: {\r\n id: 8325,\r\n source: IrisHandlerSourceFile,\r\n severity,\r\n pb\r\n },\r\n NoSurfaceFoundForCampaign: {\r\n id: 8326,\r\n source: IrisHandlerSourceFile,\r\n severity,\r\n pb\r\n },\r\n ErrorFoundForSurface: {\r\n id: 8327,\r\n source: IrisHandlerSourceFile,\r\n severity,\r\n pb\r\n },\r\n TelemetryInfoUndefined: {\r\n id: 8328,\r\n source: CoachmarkDataConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n EventTypeUndefined: {\r\n id: 8329,\r\n source: CoachmarkDataConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n IrisActionUndefined: {\r\n id: 8330,\r\n source: CoachmarkDataConnectorSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst SpotlightPreviewSourceFile = \"SpotlightPreview.connector.ts\";\r\n\r\nexport const SpotlightPreviewAppErrors = {\r\n ErrorWhileFetchingSpotlightPreviewCardInfo: {\r\n id: 8401,\r\n source: SpotlightPreviewSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n NoServiceContextMetadata: {\r\n id: 8402,\r\n source: SpotlightPreviewSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst SpotlightSourceFile = \"Spotlight.connector.ts\";\r\nexport const SpotlightErrors = {\r\n UnknownError: {\r\n id: 8500,\r\n source: SpotlightSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n ContentFetchError: {\r\n id: 8501,\r\n source: SpotlightSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const CommentsErrors: {[key: string]: AppError} = {\r\n NoPost: {\r\n id: 8510,\r\n source: \"Comments.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const CardActionErrors = {\r\n /** Error catch in base CardAction experience container */\r\n CardActionBaseExperienceError: {\r\n id: 8600,\r\n source: \"CardAction.tsx\",\r\n severity,\r\n pb\r\n },\r\n /** Post action failed (Like/Dislike) */\r\n CardActionPostActionError: {\r\n id: 8601,\r\n source: \"CarActionServiceClient.tsx\",\r\n severity,\r\n pb\r\n },\r\n /** Delete action failed (Unlike/Undislike) */\r\n CardActionDeleteActionError: {\r\n id: 8602,\r\n source: \"CardActionServiceClient.tsx\",\r\n severity,\r\n pb\r\n },\r\n /** Get action failed (GetPublisherDetails) */\r\n CardActionGetActionError: {\r\n id: 8603,\r\n source: \"CardActionServiceClient.tsx\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst ContentRelatedSourceFile = \"ContentRelated.connector.ts\";\r\nexport const ContentRelatedErrors = {\r\n /**\r\n * Missing source Id error\r\n */\r\n MissingSourceIdError: {\r\n id: 8700,\r\n source: ContentRelatedSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Invalid sourceIdError\r\n */\r\n InvalidSourceIdError: {\r\n id: 8701,\r\n source: ContentRelatedSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Related contents feed fetch error\r\n */\r\n ContentRelatedFeedFetchError: {\r\n id: 8702,\r\n source: ContentRelatedSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst Cookies = \"Cookies.ts\";\r\nexport const CookieRelatedErrors = {\r\n SharedStateConnectorNull: {\r\n id: 8840,\r\n source: Cookies,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst CookieConsentBannerHelper = \"MsccCookieConsentHelper.ts\";\r\nexport const CookieConsentBannerHelperErrors = {\r\n FailedToParseStaticsUrls: {\r\n id: 8810,\r\n source: CookieConsentBannerHelper,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n ScriptsNotFound: {\r\n id: 8811,\r\n source: CookieConsentBannerHelper,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n StyleSheetsNotFound: {\r\n id: 8812,\r\n source: CookieConsentBannerHelper,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n FailedToMountScript: {\r\n id: 8813,\r\n source: CookieConsentBannerHelper,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n FailedToMountStyleSheet: {\r\n id: 8814,\r\n source: CookieConsentBannerHelper,\r\n severity: Severity.HighImpact,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents IFrame related errors */\r\nconst IFrameSourceFile = \"IFrame.tsx\";\r\nexport const IFrameErrors = {\r\n /** Message recieved by event listener not from expected origin */\r\n IFrameUnallowedOriginMessage: {\r\n id: 8820,\r\n source: IFrameSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const RightRailCarouselAppErrors = {\r\n NoChildrenExperienceFoundError: {\r\n id: 8830,\r\n source: \"RightRailCarousel.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const BreakingNewsErrors = {\r\n /** Error fetching Breaking News content */\r\n ContentFetchError: {\r\n id: 8901,\r\n source: \"BreakingNews.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n /** Error fetching Blowout content */\r\n BlowoutDocumentFetchError: {\r\n id: 8902,\r\n source: \"BreakingNews.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const BlowoutErrors = {\r\n /** Error fetching Blowout content */\r\n ContentFetchError: {\r\n id: 8921,\r\n source: \"Blowout.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const OverlayErrors: { [name: string]: AppError } = {\r\n /** Error loading experience */\r\n LoadExperienceError: {\r\n id: 8941,\r\n source: \"Overlay.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const ViewsCommonAppErrors = {\r\n /** Invalid intra article component metadata passed. */\r\n InvalidIntraArticleDataError: {\r\n id: 9001,\r\n source: \"IntraArticleHelper.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch from data api. */\r\n DataFetchError: {\r\n id: 9002,\r\n source: \"ViewsServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Invalid content markup encountered. */\r\n InvalidDocumentContentError: {\r\n id: 9003,\r\n source: \"ViewsUtility.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load views paddle data from data api. */\r\n ViewsPaddleDataLoadError: {\r\n id: 9004,\r\n source: \"ViewsPaddle.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Error during app initialization for views page experience. */\r\n ViewsErrorPage: {\r\n id: 9005,\r\n source: \"page.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Error during mapping provider data for views content header experience */\r\n ProviderMapperError: {\r\n id: 9006,\r\n source: \"ViewContentHeader.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const LegacySharingToolbarAppErrors = {\r\n /** Failed to invoke legacy sharing toolbar. */\r\n LegacySharingToolbarInvokeError: {\r\n id: 9100,\r\n source: \"SharingHelper.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load sharing toolbar. */\r\n SharingToolbarLoadError: {\r\n id: 9101,\r\n source: \"LegacySharingToolbar.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Invalid source content id passed in. */\r\n InvalidContentIdError: {\r\n id: 9102,\r\n source: \"LegacySharingToolbar.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents ContentActionsToolbar experience related errors */\r\nconst ContentActionsToolbarConnectorSourceFile = \"ContentActionToolbar.connector.ts\";\r\nconst ContentActionsToolbarSourceFile = \"ContentActionToolbar.tsx\";\r\nconst ContentActionsToolbarServiceClientSourceFile = \"ContentActionToolbarServiceClient.tsx\";\r\nexport const ContentActionsToolbarAppErrors = {\r\n /** Failed to load sharing toolbar - 9120 */\r\n ContentActionsSharingToolbarLoadError: {\r\n id: 9120,\r\n source: ContentActionsToolbarConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Error fetching article data - 9121 */\r\n ContentActionsArticleDatafetchError: {\r\n id: 9121,\r\n source: ContentActionsToolbarConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Base Experience error - 9122 */\r\n ContentActionsBaseExperienceError: {\r\n id: 9122,\r\n source: ContentActionsToolbarSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Get content views action failed (getContentViewsRequest) - 9123 */\r\n ContentActionsGetDocumentDataError: {\r\n id: 9123,\r\n source: ContentActionsToolbarServiceClientSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Get content status action failed (getContentStatusRequest) - 9124 */\r\n ContentActionsGetContentStatusActionError: {\r\n id: 9124,\r\n source: ContentActionsToolbarServiceClientSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Delete action failed (Unlike/Undislike) - 9125 */\r\n ContentActionsDeleteActionError: {\r\n id: 9125,\r\n source: ContentActionsToolbarServiceClientSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Post action failed (Like/Dislike) - 9126 */\r\n ContentActionsPostActionError: {\r\n id: 9126,\r\n source: ContentActionsToolbarServiceClientSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Prime hybrid error loading the experience - 9127 */\r\n ContentActionsExperienceLoadError: {\r\n id: 9127,\r\n source: ContentActionsToolbarSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Missing vert/horiz placeholder to flip toolbar - 9128 */\r\n ContentActionsFlipToolbarError: {\r\n id: 9128,\r\n source: ContentActionsToolbarSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Failed fetching contentStatus - 9129 */\r\n ContentActionsContentStatusFetchError: {\r\n id: 9129,\r\n source: ContentActionsToolbarServiceClientSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** Failed fetching contentPreview - 9130 */\r\n ContentActionsContentPreviewFetchError: {\r\n id: 9130,\r\n source: ContentActionsToolbarServiceClientSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nexport const ContentSharingToolbarAppErrors = {\r\n ContentSharingToolbarInitializationError: {\r\n id: 9150,\r\n source: \"ContentSharingToolbar.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const ContentProviderAppErrors = {\r\n /** Invalid source article/gallery id passed in. */\r\n InvalidSourceIdError: {\r\n id: 9200,\r\n source: \"ContentProvider.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch provider details. */\r\n ProviderDetailsFetchError: {\r\n id: 9201,\r\n source: \"ContentProvider.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch provider feed. */\r\n ProviderFeedFetchError: {\r\n id: 9202,\r\n source: \"ContentProvider.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Invalid layout template passed in. */\r\n InvalidLayoutTemplate: {\r\n id: 9203,\r\n source: \"ContentProvider.templates.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** ApplicationCache related messages */\r\nconst refreshHeadDataFile = \"Appcache/RefreshHeadData.ts\";\r\nconst edgeAppCacheHelperFile = \"Appcache/EdgeApplicationCacheHelper.ts\";\r\n\r\nexport const ApplicationCacheMessages = {\r\n FailedToFetchHeadData: {\r\n id: 9310,\r\n source: refreshHeadDataFile,\r\n severity,\r\n pb\r\n },\r\n CatastrophicFailedToFetchHeadData: {\r\n id: 9311,\r\n source: refreshHeadDataFile,\r\n severity,\r\n pb\r\n },\r\n StaleActivityIdEncountered: {\r\n id: 9312,\r\n source: refreshHeadDataFile,\r\n severity,\r\n pb\r\n },\r\n /**\r\n * The current DOM that is in AppCache doesn't match what should be getting served\r\n * to the user due to the existence of the ntps cookie that defines what the locale should be.\r\n * In this case, we must bypass AppCache to get the proper DOM from PCS.\r\n */\r\n LocaleMismatch: {\r\n id: 9313,\r\n source: edgeAppCacheHelperFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /**\r\n * Our checks determining we need to bypass appcache for the user are failing\r\n * to detect that the appcache refresh has succeeded. We've tried, for the current page view, to\r\n * bypass without any success.\r\n */\r\n RapidAppcacheForcedRefreshes: {\r\n id: 9314,\r\n source: edgeAppCacheHelperFile,\r\n severity,\r\n pb\r\n },\r\n FailedToReadFromStorage: {\r\n id: 9315,\r\n source: refreshHeadDataFile,\r\n severity,\r\n pb\r\n },\r\n FailedToWriteToStorage: {\r\n id: 9316,\r\n source: refreshHeadDataFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst ViewsGallerySourceFile = \"ViewsGallery.connector.ts\";\r\nexport const ViewsGalleryAppErrors = {\r\n /** Invalid gallery id passed. */\r\n InvalidGalleryIdError: {\r\n id: 10001,\r\n source: ViewsGallerySourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load gallery data. */\r\n GalleryDataLoadError: {\r\n id: 10010,\r\n source: ViewsGallerySourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load images. */\r\n GalleryImagesLoadError: {\r\n id: 10020,\r\n source: ViewsGallerySourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst SlideShowConnectorFile = \"SlideShow.connector.ts\";\r\nconst SlideShowCarouselFile = \"SlideShowCarousel.tsx\";\r\nexport const SlideShowAppErrors = {\r\n /** Invalid slideshow id passed. */\r\n InvalidSlideShowIdError: {\r\n id: 10100,\r\n source: SlideShowConnectorFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load slideshow data. */\r\n SlideShowDataLoadError: {\r\n id: 10110,\r\n source: SlideShowConnectorFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load images. */\r\n SlideShowImagesLoadError: {\r\n id: 10120,\r\n source: SlideShowConnectorFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to ads refresh. */\r\n SlideShowAdsRefreshError: {\r\n id: 10130,\r\n source: SlideShowCarouselFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load image. */\r\n SlideShowImageLoadFailed: {\r\n id: 10135,\r\n source: SlideShowCarouselFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const VideoListAppErrors = {\r\n /** Failed to load the video list data. */\r\n VideoListDataLoadError: {\r\n id: 11001,\r\n source: \"VideoList.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst VideoContentSourceFile: string = \"VideoContent.connector.ts\";\r\nexport const VideoContentAppErrors = {\r\n /** Failed to load the video content data. */\r\n InvalidResponseFromVideoContentResponseJson: {\r\n id: 11101,\r\n source: VideoContentSourceFile,\r\n severity\r\n },\r\n /** Failed to fetch the video content data from server. */\r\n ErrorWhileFetchingContentPreviewContent: {\r\n id: 11102,\r\n source: VideoContentSourceFile,\r\n severity\r\n }\r\n};\r\n\r\nconst ViewsArticleSourceFile = \"ViewsArticle.connector.ts\";\r\nexport const ViewsArticleAppErrors = {\r\n /** Invalid article id passed. */\r\n InvalidArticleIdError: {\r\n id: 12001,\r\n source: ViewsArticleSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load article data. */\r\n ArticleDataLoadError: {\r\n id: 12002,\r\n source: ViewsArticleSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load intra-article component. */\r\n IntraArticleComponentLoadError: {\r\n id: 12003,\r\n source: ViewsArticleSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to invoke inline gallery experience. */\r\n InlineGalleryInvokeError: {\r\n id: 12004,\r\n source: ViewsArticleSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const InterestsSearchAppErrors = {\r\n /** Received non 200 from OneService */\r\n ErrorResponseFromOneService: {\r\n id: 13000,\r\n source: \"InterestsSearchServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n /** Received a response from 200 but didn't have expected structure */\r\n ErrorResponseFromOneServiceIsInvalid: {\r\n id: 13001,\r\n source: \"InterestsSearchServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n /**\r\n * When building the XFeed URL for one of the suggestion items,\r\n * we weren't able to build a valid URL\r\n */\r\n InvalidUrlFoundForElement: {\r\n id: 13002,\r\n source: \"InterestsSearch.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n /**\r\n * When building the XFeed URL for one of the suggestion items,\r\n * we weren't able to build a valid URL\r\n */\r\n SelectedItemNotFoundInSuggestions: {\r\n id: 13003,\r\n source: \"InterestsSearch.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n /**\r\n * When building the XFeed URL for one of the suggestion items,\r\n * we weren't able to build a valid URL\r\n */\r\n SelectedItemIsInvalid: {\r\n id: 13004,\r\n source: \"InterestsSearch.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst EdgeHeaderConnectorFileName: string = \"EdgeHeader.connector.ts\";\r\n\r\nexport const EdgeHeaderAppErrors = {\r\n /** The BingImageData Connector was not loaded */\r\n BingImageDataConnectorNotLoaded: {\r\n id: 8240,\r\n source: EdgeHeaderConnectorFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst MicrosoftNewsPageConnectorFileName: string = \"MicrosoftNewsPage.connector.ts\";\r\n\r\nexport const MicrosoftNewsPageAppErrors = {\r\n /** The BingImageData Connector was not loaded */\r\n BingImageDataConnectorNotLoaded: {\r\n id: 8241,\r\n source: MicrosoftNewsPageConnectorFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst WindowsPageConnectorFileName: string = \"WindowsPage.connector.ts\";\r\n\r\nexport const WindowsPageAppErrors = {\r\n /** The BingImageData Connector was not loaded */\r\n BingImageDataConnectorNotLoaded: {\r\n id: 8242,\r\n source: WindowsPageConnectorFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst InterestsConnectorFileName: string = \"Interests.connector.ts\";\r\nconst TopicCacheFileName: string = \"TopicCache.ts\";\r\nconst XfeedConnectorFileName: string = \"Xfeed.connector.ts\";\r\nexport const InterestsAppErrors = {\r\n /** We could not retrieve the list of Topics from OneService */\r\n InterestsRetrieveTopicsError: {\r\n id: 13100,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not retrieve the user's list of Followed Topics from OneService */\r\n InterestsRetrieveFollowedTopicsError: {\r\n id: 13101,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not retrieve the user's list of Muted Publishers from OneService */\r\n InterestsRetrieveMutedPublishersError: {\r\n id: 13102,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not UnMute a Muted Publisher */\r\n InterestsUnMutePublisherError: {\r\n id: 13103,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not follow a new interests topic */\r\n InterestsFollowTopicError: {\r\n id: 13104,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not unfollow an interests topic */\r\n InterestsUnfollowTopicError: {\r\n id: 13105,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** TopicState should not be undefined */\r\n InterestsTopicStateUndefined: {\r\n id: 13106,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Topics should have rendered */\r\n InterestsShouldHaveRendered: {\r\n id: 13107,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Could not retrieve a specific topic */\r\n InterestsRetrieveTopicError: {\r\n id: 13108,\r\n source: XfeedConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not retrieve the user's list of Saved Stories from OneService */\r\n InterestsRetrieveSavedStoriesError: {\r\n id: 13109,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Saved stories config is invalid */\r\n InterestsSavedStoriesInvalidConfigError: {\r\n id: 13110,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not load saved stories children */\r\n InterestsSavedStoriesChildLoadError: {\r\n id: 13111,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** OneService response for saved stories had invalid json */\r\n InterestsSavedStoriesInvalidJsonError: {\r\n id: 13112,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** OneService response for saved stories had invalid list of response */\r\n InterestsSavedStoriesInvalidListError: {\r\n id: 13113,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not retrieve the user's list of Recommended Topics from OneService */\r\n InterestsRetrieveRecommendedTopicsError: {\r\n id: 13114,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Topic Data Connector is not defined */\r\n UndefinedTopicDataConnector: {\r\n id: 13115,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not retrieve the user's list of Read Stories from OneService */\r\n InterestsRetrieveReadStoriesError: {\r\n id: 13116,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Read stories config is invalid */\r\n InterestsReadStoriesInvalidConfigError: {\r\n id: 13117,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** We could not load Read stories children */\r\n InterestsReadStoriesChildLoadError: {\r\n id: 13118,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** OneService response for Read stories had invalid json */\r\n InterestsReadStoriesInvalidJsonError: {\r\n id: 13119,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** OneService response for Read stories had invalid list of response */\r\n InterestsReadStoriesInvalidListError: {\r\n id: 13120,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** OneService failed resetting user default set of interests */\r\n FailedRestoringDefaultTopicsError: {\r\n id: 13121,\r\n source: InterestsConnectorFileName,\r\n severity,\r\n pb\r\n },\r\n /** Failed opening topics IndexedDB connection */\r\n TopicsFailedIndexedDBConnection: {\r\n id: 13122,\r\n source: TopicCacheFileName,\r\n severity,\r\n pb\r\n },\r\n /** Failed getting topics indexedDB */\r\n TopicsFailedGettingIndexedDB: {\r\n id: 13123,\r\n source: TopicCacheFileName,\r\n severity,\r\n pb\r\n },\r\n /** Failed updating topics indexedDB */\r\n TopicsFailedUpdatingIndexedDB: {\r\n id: 13124,\r\n source: TopicCacheFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** {ComponentConnector} base app errors */\r\nexport const ComponentConnectorAppErrors = {\r\n\r\n /** Duplicate child experience instance found */\r\n DuplicateChildInstanceFound: {\r\n id: 14000,\r\n source: \"ComponentConnector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load bundle */\r\n BundleLoadError: {\r\n id: 14001,\r\n source: \"ComponentConnector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** ChildConfigInfoList is null */\r\n ChildConfigInfoListNull: {\r\n id: 14002,\r\n source: \"ComponentConnector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Merge List start position must be greater than 0 */\r\n ListStartPositionInvalid: {\r\n id: 14003,\r\n source: \"ComponentConnector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to delay load child bundle */\r\n ChildDelayLoadError: {\r\n id: 14004,\r\n source: \"ComponentConnector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Milestone dependency failed to resolve and timeout triggered */\r\n ExperienceDependencyTimeout: {\r\n id: 14005,\r\n source: \"ComponentConnector.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\n/** App errors for {ExperienceLoader} */\r\nexport const ExperienceLoaderAppErrors = {\r\n\r\n /** Logged when neither the config type nor config HREF was provided to the loader */\r\n InsufficientLoadArgs: {\r\n id: 14100,\r\n source: \"ExperienceLoader.ts\",\r\n severity: Severity.HighImpact,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents SearchHistoryCommon related App errors */\r\nconst SearchHistoryCommonSourceFile = \"SearchHistoryCommon.tsx\";\r\nexport const SearchHistoryCommonAppErrors = {\r\n /** Failed to parse search history response */\r\n ResponseParsingFailed: {\r\n id: 15000,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Search history service call failed */\r\n ServiceCallFailed: {\r\n id: 15001,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to render search history */\r\n RenderFailed: {\r\n id: 15002,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Search history api response not received within configured time */\r\n Timeout: {\r\n id: 15003,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Search history api call unauthorized */\r\n Unauthorized: {\r\n id: 15004,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Search history api call forbidden */\r\n Forbidden: {\r\n id: 15005,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Search history api not able to find recent search associated with this request */\r\n NotFound: {\r\n id: 15006,\r\n source: SearchHistoryCommonSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents a Search related error */\r\nexport const SearchError: AppError = {\r\n id: 15100,\r\n source: \"SearchBox.tsx\",\r\n severity: Severity.HighImpact,\r\n pb\r\n};\r\n\r\nconst PollsCardConnectorSourceFile = \"PollsCard.connector.ts\";\r\nexport const PollsCardAppErrors = {\r\n /**\r\n * Failed to fetch polls list\r\n */\r\n PollsListFetchError: {\r\n id: 18000,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Failed to fetch poll data\r\n */\r\n PollDataFetchError: {\r\n id: 18001,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * No data{questions} for poll\r\n */\r\n PollsCardInvalidPoll: {\r\n id: 18002,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Invalid Poll Quiz\r\n */\r\n PollsCardInvalidQuizPoll: {\r\n id: 18003,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * PollsVoteError\r\n */\r\n PollsCardVoteError: {\r\n id: 18004,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * PollsMapStateToPropsError\r\n */\r\n PollsCardMapStateToPropsError: {\r\n id: 18005,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * PollsUnknownError\r\n */\r\n PollsUnknownError: {\r\n id: 18006,\r\n source: PollsCardConnectorSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const EdgeNextAppErrors = {\r\n /**\r\n * Error during app initialization for EdgeNext page experience.\r\n */\r\n EdgeNextErrorPage: {\r\n id: 19000,\r\n source: \"page.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Error fetching the APP_ANON cookie on EdgeNext page load */\r\n ErrorFetchingAppAnonCookie: {\r\n id: 19001,\r\n source: \"page.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up showing the local ntp page on bundle syntax errors.\r\n */\r\n EdgeNextLocalNTPPageShownSyntaxErrors: {\r\n id: 19002,\r\n source: \"page.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up showing the local ntp page on bundle failures.\r\n */\r\n EdgeNextLocalNTPPageShownBundleFailureErrors: {\r\n id: 19003,\r\n source: \"page.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up showing the local ntp page on page exception.\r\n */\r\n EdgeNextLocalNTPPageShownPageExceptionError: {\r\n id: 19004,\r\n source: \"page.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up showing the local ntp page on page exception.\r\n */\r\n EdgeNextLocalNTPPageShownJSSMismatchExceptionError: {\r\n id: 19005,\r\n source: \"page.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up reloading the NTP page on jss mismatch exception.\r\n */\r\n EdgeNextPageReloadedPageExceptionError: {\r\n id: 19010,\r\n source: \"page.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up reloading the NTP page on jss mismatch exception.\r\n */\r\n EdgeNextPageReloadedJSSMismatchExceptionError: {\r\n id: 19011,\r\n source: \"PersistRenderCache.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst AdRefreshSourceFile = \"AdsRefresh.ts\";\r\nconst ApnWrapperSourceFile = \"AppnexusWrapper.ts\";\r\nconst DisplayAdsAdsDetectionSourceFile = \"AdsDetection.ts\";\r\nconst DisplayAdsConnectorSourceFile = \"DisplayAds.connector.ts\";\r\nconst DisplayAdsManagerConnectorSourceFile = \"DisplayAdsManager.connector.ts\";\r\nconst NativeAdConnectorSourceFile = \"NativeAd.connector.ts\";\r\nconst OathWrapperSourceFile = \"OathAdsWrapper.ts\";\r\nconst PlacementManagerConnectorSourceFile = \"PlacementManager.connector.ts\";\r\nconst PlacementManagerCookieSyncSourceFile = \"PlacementManagerCookieSync.ts\";\r\nconst PlacementManagerCMSServiceSourceFile = \"PlacementManagerCMSService.ts\";\r\nconst NativeAdClientConnectorSourceFile = \"NativeAdClient.connector.ts\";\r\nconst PartnerScriptLoaderFile = \"PartnerScriptLoader.ts\";\r\nconst NativeAdBeaconSourceFile = \"Beacon.ts\";\r\n\r\nexport const MonetizationAppErrors = {\r\n /** Failed to load Placement Manager. */\r\n PlacementManagerLoadError: {\r\n id: 20000,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load arrangement position on native ad experience. */\r\n ArrangementPositionLoadError: {\r\n id: 20001,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get CMS Content. */\r\n GetCMSContentError: {\r\n id: 20002,\r\n source: PlacementManagerCMSServiceSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get SAM RTB Response. */\r\n GetSAMRTBResponseError: {\r\n id: 20003,\r\n source: PlacementManagerConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load MediaNet End Of Article Block. */\r\n MediaNetEOABError: {\r\n id: 20005,\r\n source: \"medianetNativeAdOnArticle.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** Invalid promo module config */\r\n InvalidPromoModuleConfig: {\r\n id: 20006,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to download cookie sync external script. */\r\n CookieSyncDownloadExternalScriptError: {\r\n id: 20007,\r\n source: PlacementManagerCookieSyncSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Missing cookie sync external script. */\r\n CookieSyncMissingExternalScriptUrl: {\r\n id: 20008,\r\n source: PlacementManagerCookieSyncSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Cookie sync timeout. */\r\n CookieSyncTimeout: {\r\n id: 20009,\r\n source: PlacementManagerCookieSyncSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Cookie sync partner script error */\r\n CookieSyncPartnerScriptError: {\r\n id: 20010,\r\n source: PlacementManagerCookieSyncSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Cookie pixel sync partner download error */\r\n CookieSyncPixelPartnerDownloadError: {\r\n id: 20011,\r\n source: PlacementManagerCookieSyncSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load cms or backfill native ad. */\r\n CMSOrBackfillNativeAdLoadError: {\r\n id: 20012,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Missing required property on placement manager config */\r\n MissingRequiredPropertyPlacementManagerConfig: {\r\n id: 20014,\r\n source: PlacementManagerConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Missing page type target scope. */\r\n NativeAdTargetScopeError: {\r\n id: 20016,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** River video ad partner error. */\r\n RiverVideoAdPartnerError: {\r\n id: 20017,\r\n source: PartnerScriptLoaderFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** JsTracker ad partner script load error. */\r\n JsTrackerPartnerScriptLoadError: {\r\n id: 20018,\r\n source: NativeAdBeaconSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Viglink load error. */\r\n ViglinkError: {\r\n id: 20019,\r\n source: PartnerScriptLoaderFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Missing topic id for stripe native ad */\r\n MissingTopicId: {\r\n id: 20020,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Topic id not found for stripe native ad */\r\n TopicIdNotFound: {\r\n id: 20021,\r\n source: NativeAdConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to get SAM RTB Response. This App error doesn't trigger alert */\r\n GetSAMRTBResponseErrorNoAlert: {\r\n id: 20022,\r\n source: PlacementManagerConnectorSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Failed to load Oath JS */\r\n DisplayAdsOathLoadError: {\r\n id: 20500,\r\n source: OathWrapperSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load AppNexus JS */\r\n DisplayAdsApnLoadError: {\r\n id: 20501,\r\n source: ApnWrapperSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** AppNexus Provider was empty */\r\n DisplayAdsApnEmptyProvider: {\r\n id: 20502,\r\n source: ApnWrapperSourceFile,\r\n severity: Severity.Alert\r\n },\r\n\r\n /** Ads Detection no initialized properly Provider was empty */\r\n DisplayAdsAdsDetectionNotInit: {\r\n id: 20503,\r\n source: DisplayAdsAdsDetectionSourceFile,\r\n severity: Severity.Alert,\r\n pb\r\n },\r\n\r\n /** Failed to load Moat JS */\r\n DisplayAdsMoatLoadError: {\r\n id: 20504,\r\n source: DisplayAdsManagerConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Display ad objects were not available for refresh */\r\n DisplayAdsNoAdObjects: {\r\n id: 20505,\r\n source: AdRefreshSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** There was a problem in encoding CMS provider ID from base 62 to 32 */\r\n DisplayAdsProviderIdEncode: {\r\n id: 20506,\r\n source: DisplayAdsConnectorSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const TaboolaRiverAppErrors = {\r\n /** Failed to fetch taboola river data. */\r\n TaboolaRiverFetchError: {\r\n id: 20100,\r\n source: \"TaboolaRiver.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst PCSPageHTMLFile = \"PCS-Page.cshtml\";\r\nexport const CoreLibAppErrors = {\r\n /** Deprecated composition layout config in use */\r\n DeprecatedCompositionLayoutUsed: {\r\n id: 20200,\r\n source: \"LayoutBase.inspector.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Deprecated composition layout config in use */\r\n InvalidColumnInGridConfig: {\r\n id: 20201,\r\n source: \"GridBase.inspector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Error during loading of page bundles.\r\n */\r\n ErrorLoadingBundle: {\r\n id: 20202,\r\n source: PCSPageHTMLFile,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n\r\n /**\r\n * Generic JS exceptions.\r\n */\r\n GenericJSException: {\r\n id: 20203,\r\n source: PCSPageHTMLFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Missing localStorage exception\r\n */\r\n LocalStorageDoesntExist: {\r\n id: 20204,\r\n source: \"WebStorage.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Missing sessionStorage exception\r\n */\r\n SessionStorageDoesntExist: {\r\n id: 20205,\r\n source: \"WebStorage.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Authenticatedfetch related App errors */\r\nconst AuthenticatedFetchSourceFile = \"AuthenticatedFetch.ts\";\r\nexport const AuthenticatedFetchErrors = {\r\n ErrorCodeReceived: {\r\n id: 20302,\r\n source: AuthenticatedFetchSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n CallFailed: {\r\n id: 20303,\r\n source: AuthenticatedFetchSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst resolverSourceFile = \"resolver.ts\";\r\nexport const ResolverAppErrors = {\r\n /**\r\n * IndexedDb write failed in resolver.\r\n */\r\n IndexedDbWriteFailed: {\r\n id: 22010,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * IndexedDb read failed in resolver.\r\n */\r\n IndexedDbReadFailed: {\r\n id: 22011,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Config Service Resolver fetch failed.\r\n */\r\n CrsFetchFailed: {\r\n id: 22012,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Config Service Resolver was enabled but we still went to Assets to getConfig and merge configs at client (classic resolver).\r\n */\r\n ReceivedConfigFromCdnAsCrsFetchFailed: {\r\n id: 22013,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Exception In GetConfig function.\r\n */\r\n GetConfigException: {\r\n id: 22014,\r\n source: resolverSourceFile,\r\n severity: Severity.HighImpact,\r\n pb\r\n },\r\n\r\n /**\r\n * IndexedDb bulk read failed in resolver.\r\n */\r\n IndexedDbBulkReadFailed: {\r\n id: 22015,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * IndexedDb failed to remove cached config\r\n */\r\n IndexedDbFailedToRemoveCachedConfig: {\r\n id: 22016,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * IndexedDb failed to clear all configs\r\n */\r\n IndexedDbFailedToClearAllCachedConfigs: {\r\n id: 22017,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Render cache is purged due to changes in config\r\n */\r\n RenderCachePurgedDueToChangesInConfig: {\r\n id: 22018,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Render cache failed purge even though config changes were detected.\r\n */\r\n FailedToPurgeRenderCache: {\r\n id: 22019,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Failed to refresh config cache\r\n */\r\n RefreshConfigCacheFailed: {\r\n id: 22020,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Failed to initialize indexedDb\r\n */\r\n IndexedDbInitFailed: {\r\n id: 22021,\r\n source: resolverSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Different cache busting identifier\r\n */\r\n DifferentCbid: {\r\n id: 22022,\r\n source: resolverSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nexport const HubAppErrors = {\r\n /**\r\n * Error during app initialization for hub page experience.\r\n */\r\n HubErrorPage: {\r\n id: 22100,\r\n source: \"page.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst EdgePageFileName: string = \"Edge/page.ts\";\r\n\r\n/** Edge App Type errors. */\r\nexport const EdgeAppErrors = {\r\n ErrorFetchingChildCookie: {\r\n id: 23000,\r\n source: EdgePageFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Error during app initialization for Edge page experience.\r\n */\r\n EdgeErrorPage: {\r\n id: 23001,\r\n source: EdgePageFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Error fetching the APP_ANON cookie on Edge page load\r\n */\r\n ErrorFetchingAppAnonCookie: {\r\n id: 23002,\r\n source: EdgePageFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Auth related app messages (errors|warnings) */\r\nexport const AuthenticationAppMessages = {\r\n AuthRefreshBlockedError: {\r\n id: 33000,\r\n source: \"\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error fetching the APP_ANON cookie\r\n */\r\n ErrorFetchingAppAnonCookie: {\r\n id: 33001,\r\n source: \"\",\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Error during app initialization for Edge page experience.\r\n */\r\n EstablishSignedInState: {\r\n id: 1405,// need to mimic the prime one since telemetry cooking logic looks for this\r\n source: \"\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /**\r\n * Error during app initialization for migration consent\r\n */\r\n EstablishMigrationConsent: {\r\n id: 33010,\r\n source: \"EstablishMigrationConsent.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n MigrationConsentServiceClient: {\r\n id: 33011,\r\n source: \"MigrationConsentServiceClient.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const BingCardsAppErrors = {\r\n BingCardGetHotelAnswersError: {\r\n id: 24001,\r\n source: \"BingCardsServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n BingCardGetHotelErrorFromService: {\r\n id: 24002,\r\n source: \"BingCardsServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n BingCardGetAnswersError: {\r\n id: 24003,\r\n source: \"BingCardsExperience.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n BingCardInvalidEntityType: {\r\n id: 24004,\r\n source: \"BingCardsExperience.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n BingCardErrorOut: {\r\n id: 24005,\r\n source: \"BingCardsExperience.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const BingAnswersAppErrors = {\r\n UnknownError: {\r\n id: 24101,\r\n source: \"BingAnswers.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n FailedToLoadData: {\r\n id: 24102,\r\n source: \"BingAnswers.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n NoCardsContentType: {\r\n id: 24103,\r\n source: \"BingAnswers.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n NoCardsRelated: {\r\n id: 24104,\r\n source: \"BingAnswers.connector.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nconst BingShoppingShopCardServiceClientSourceFile =\r\n \"bing-shopping/ShopCardServiceClient.ts\";\r\n\r\nexport const BingShoppingShopCardError = {\r\n ShopCardServiceFetchError: {\r\n id: 24200,\r\n source: BingShoppingShopCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ShopCardServiceFetchInvalidResponse: {\r\n id: 24201,\r\n source: BingShoppingShopCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ShopCardServiceEmptyPersonalizedResponse: {\r\n id: 24202,\r\n source: BingShoppingShopCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ShopCardServiceInvalidPersonalizedResponse: {\r\n id: 24203,\r\n source: BingShoppingShopCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ShopCardServiceEmptyTrendingResponse: {\r\n id: 24204,\r\n source: BingShoppingShopCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n ShopCardServiceInvalidTrendingResponse: {\r\n id: 24205,\r\n source: BingShoppingShopCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst BingShoppingLifestyleCardServiceClientSourceFile =\r\n \"bing-shopping-lifestyle-card/BingShoppingLifestyleCardServiceClient.ts\";\r\n\r\nconst BingShoppingLifestyleCardCdnServiceClientSourceFile =\r\n \"bing-shopping-lifestyle-card/BingShoppingLifestyleCardCdnServiceClient.ts\";\r\n\r\nconst BingShoppingLifestyleAutosuggestServiceClientSourceFile =\r\n \"bing-shopping-lifestyle-card/BingShoppingLifestyleAutosuggestServiceClient.ts\";\r\n\r\nconst BingShoppingLifestyleConnectorSourceFile =\r\n \"bing-shopping-lifestyle-card/BingShoppingLifestyleCard.connector.ts\";\r\nexport const BingShoppingLifestyleCardError = {\r\n // Lifestyle Shopcard service Errors\r\n LifestyleShopCardServiceFetchError: {\r\n id: 24300,\r\n source: BingShoppingLifestyleCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopCardServiceFetchInvalidResponse: {\r\n id: 24301,\r\n source: BingShoppingLifestyleCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopCardServiceEmptyResponse: {\r\n id: 24302,\r\n source: BingShoppingLifestyleCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopCardServiceInvalidResponse: {\r\n id: 24303,\r\n source: BingShoppingLifestyleCardServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n // Lifestyle Shopcard Cdn service Errors\r\n LifestyleShopCardCdnServiceFetchError: {\r\n id: 24304,\r\n source: BingShoppingLifestyleCardCdnServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopCardCdnServiceFetchInvalidResponse: {\r\n id: 24305,\r\n source: BingShoppingLifestyleCardCdnServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopCardCdnServiceInvalidResponse: {\r\n id: 24306,\r\n source: BingShoppingLifestyleCardCdnServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n // Lifestyle Autosuggest service Errors\r\n LifestyleShopAutosuggestServiceFetchError: {\r\n id: 24310,\r\n source: BingShoppingLifestyleAutosuggestServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopAutosuggestServiceFetchInvalidResponse: {\r\n id: 24311,\r\n source: BingShoppingLifestyleAutosuggestServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopAutosuggestServiceEmptyResponse: {\r\n id: 24312,\r\n source: BingShoppingLifestyleAutosuggestServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopAutosuggestServiceInvalidResponse: {\r\n id: 24313,\r\n source: BingShoppingLifestyleAutosuggestServiceClientSourceFile,\r\n severity,\r\n pb\r\n },\r\n LifestyleShopAutosuggestInvalidSuggestionUrl: {\r\n id: 24314,\r\n source: BingShoppingLifestyleConnectorSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const PageSettingsDataConnectorAppErrors = {\r\n PageSettingsGetInitialState: {\r\n id: 26001,\r\n source: \"PageSettingsData.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst MicrosoftNewsEntryPointFileName: string = \"MicrosoftNews.connector.ts\";\r\nexport const MicrosoftNewsEntryPointAppErrors = {\r\n /**\r\n * Error during app initialization for MicrosoftNews page experience.\r\n */\r\n MicrosoftNewsErrorPage: {\r\n id: 27000,\r\n source: MicrosoftNewsEntryPointFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const NavigationDataConnectorAppErrors = {\r\n /**\r\n * Error while trying to fetch the Navigation Items\r\n */\r\n NavigationDataGetNavigationItems: {\r\n id: 28000,\r\n source: \"NavigationData.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n NavigationDataIndexedDbInitializationFailed: {\r\n id: 28001,\r\n source: \"NavigationData.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n NavigationDataIndexedDbWriteFailed: {\r\n id: 28002,\r\n source: \"NavigationData.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n NavigationDataIndexedDbBulkReadFailed: {\r\n id: 28003,\r\n source: \"NavigationData.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const CategoryDataConnectorAppErrors = {\r\n /**\r\n * Error while to get the category details\r\n */\r\n CategoryDataGetCategoryDetail: {\r\n id: 28100,\r\n source: \"CategoryData.connector.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n CategoryDataIndexedDbInitializationFailed: {\r\n id: 28101,\r\n source: \"CategoryData.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n CategoryDataIndexedDbWriteFailed: {\r\n id: 28102,\r\n source: \"CategoryData.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n CategoryDataIndexedDbBulkReadFailed: {\r\n id: 28103,\r\n source: \"CategoryData.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/**\r\n * App reporting messages related to OneService Content Data Connector\r\n */\r\nexport const OneServiceContentDataConnector = {\r\n /**\r\n * Message sent when a feature tries to update\r\n * the cache bypass value but the connector was not initialized\r\n * for the page\r\n */\r\n FailedToUpdateBypassValueConnectorNotInitialized: {\r\n id: 28200,\r\n source: \"OneServiceContentHelper.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /**\r\n * Message sent when a feature tries to update\r\n * the cache bypass value but the connector was not initialized\r\n * for the page\r\n */\r\n FailedToGetBypassValueConnectorNotInitialized: {\r\n id: 28201,\r\n source: \"OneServiceContentHelper.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\nexport const NotificationBellErrors = {\r\n /** Failed to fetch the notification bell data content */\r\n DataFetchError: {\r\n id: 28400,\r\n source: \"NotificationBell.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n JsonParseError: {\r\n id: 28401,\r\n source: \"LocalStorageSettings.ts\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n NewsItemDataFetchError: {\r\n id: 28402,\r\n source: \"NotificationBellServiceClient.ts\",\r\n severity,\r\n pb\r\n },\r\n MalformedNewsItemResponseError: {\r\n id: 28403,\r\n source: \"NotificationBellServiceClient.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/**\r\n * App reporting messages related to Stripe Experience\r\n */\r\nexport const StripeAppErrors = {\r\n InvalidConfig: {\r\n id: 28300,\r\n source: \"Stripe.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/**\r\n * App reporting messages related to StripeView Experience\r\n */\r\nexport const StripeViewAppErrors = {\r\n InvalidConfig: {\r\n id: 28600,\r\n source: \"StripeView.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n ChildLoadError: {\r\n id: 28601,\r\n source: \"StripeView.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents RecommendedSearch related App errors */\r\nconst RecommendedSearchSourceFile = \"RecommendedSearchDataService.ts\";\r\nexport const RecommendedSearchErrors = {\r\n /** Warning for failed to parse recommended search response */\r\n ResponseParsingFailed: {\r\n id: 15200,\r\n source: RecommendedSearchSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** warning for recommended search service returned invalid Json response */\r\n InvalidJsonResponse: {\r\n id: 15201,\r\n source: RecommendedSearchSourceFile,\r\n severity : Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Warning for recommended search service call failed */\r\n ServiceCallFailed: {\r\n id: 15202,\r\n source: RecommendedSearchSourceFile,\r\n severity : Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Failed to render recommended searches */\r\n RenderFailed: {\r\n id: 15203,\r\n source: RecommendedSearchSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Warning for recommended search api response not received within configured time */\r\n Timeout: {\r\n id: 15204,\r\n source: RecommendedSearchSourceFile,\r\n severity : Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** recommended search back fill failed to fetch content from CMS */\r\n ContentFetchError : {\r\n id: 15205,\r\n source: RecommendedSearchSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Trending Now related app errors */\r\nconst TrendingNowSourceFile = \"TrendingNow.connector.ts\";\r\nexport const TrendingNowErrors = {\r\n /** Failed to fetch Trending now content from CMS */\r\n ContentFetchError: {\r\n id: 15250,\r\n source: TrendingNowSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to fetch child experience config */\r\n FailedToFetchConfig: {\r\n id: 15251,\r\n source: TrendingNowSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Failed to load child experience */\r\n FailedToLoadChildExperience: {\r\n id: 15252,\r\n source: TrendingNowSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Layout Preference Data Connector related App errors */\r\nconst LayoutPreferenceDataSourceFile = \"LayoutPreferenceData.connector.ts\";\r\nexport const LayoutPreferenceDataErrors = {\r\n /** Failed to retrieve Layout Preference Data */\r\n LayoutPreferenceDataGetFailed: {\r\n id: 28500,\r\n source: LayoutPreferenceDataSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Sentiment Line Chart Connector related app errors */\r\nconst SentimentLineChartSourceFile = \"SentimentLineChart.connector.ts\";\r\nexport const SentimentLineChartErrors = {\r\n ContentFetchError: {\r\n id: 28700,\r\n source: SentimentLineChartSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Sentiment Result Card Connector related app errors */\r\nconst SentimentResultCardSourceFile = \"SentimentResultCard.connector.ts\";\r\nexport const SentimentResultCardErrors = {\r\n ContentFetchError: {\r\n id: 28710,\r\n source: SentimentResultCardSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Sentiment Map Connector related app errors */\r\nconst SentimentMapSourceFile = \"SentimentMap.connector.ts\";\r\nexport const SentimentMapErrors = {\r\n ContentFetchError: {\r\n id: 28720,\r\n source: SentimentMapSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Election Results Card Connector related app errors */\r\nconst ElectionResultsCardFile = \"ElectionResultsCard.connector.ts\";\r\nexport const ElectionResultsCardErrors = {\r\n ContentFetchError: {\r\n id: 28730,\r\n source: ElectionResultsCardFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Sentiment Bar chart Connector related app errors */\r\nconst SentimentBarChartSourceFile = \"SentimentBarChart.connector.ts\";\r\nexport const SentimentBarChartErrors = {\r\n ContentFetchError: {\r\n id: 28740,\r\n source: SentimentBarChartSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Elction Result Map connector App errors */\r\nconst ElectionResultMapConnectorSourceFile = \"ElectionResultMap.connector.ts\";\r\nexport const ElectionResultMapConnectorErrors = {\r\n UnknownError: {\r\n id: 28750,\r\n source: ElectionResultMapConnectorSourceFile,\r\n severity\r\n },\r\n\r\n ContentFetchError: {\r\n id: 28751,\r\n source: ElectionResultMapConnectorSourceFile,\r\n severity\r\n }\r\n};\r\n\r\n/** Elction Result Map Inspector App errors */\r\nconst ElectionResultMapInspectorSourceFile = \"ElectionResultMap.inspector.ts\";\r\nexport const ElectionResultMapInspectorErrors = {\r\n EmptyResultSummaryError: {\r\n id: 28752,\r\n source: ElectionResultMapInspectorSourceFile,\r\n severity\r\n }\r\n};\r\n/** Elction Result Map App errors */\r\nconst ElectionResultMapSourceFile = \"ElectionResultMap.tsx\";\r\nexport const ElectionResultMapErrors = {\r\n FetchAndUpdateElectionDataError: {\r\n id: 28753,\r\n source: ElectionResultMapSourceFile,\r\n severity\r\n }\r\n};\r\n\r\n/** Election Editor's Note App errors */\r\nexport const ElectionEditorsNoteErrors = {\r\n\r\n ContentFetchError: {\r\n id: 28760,\r\n source: \"ElectionEditorsNote.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Election Delegate Counter related app errors */\r\nexport const ElectionDelegateCounterErrors = {\r\n ContentFetchError: {\r\n id: 28770,\r\n source: \"ElectionDelegateCounter.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/**\r\n * App reporting messages related to Partner Widget Experience\r\n */\r\nexport const PartnerWidgetAppErrors = {\r\n /** default breakpoint settings missing */\r\n DefaultBreakpointSettingsMissing: {\r\n id: 28801,\r\n source: \"PartnerWidget.connector.ts\",\r\n severity,\r\n pb\r\n },\r\n\r\n /** non whitelisted source url */\r\n NonWhitelistedSourceUrl: {\r\n id: 28802,\r\n source: \"PartnerWidget.connector.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents RecommendedSearch related App errors */\r\nconst RecommendedTopicsSourceFile = \"RecommendedTopics.connector.ts\";\r\nexport const RecommendedTopicsErrors = {\r\n /** Failed to connect to the Topics Data Connector */\r\n TopicsDataConnectorFailed: {\r\n id: 28901,\r\n source: RecommendedTopicsSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Topic Clicked was null */\r\n InvalidTopicClick: {\r\n id: 28902,\r\n source: RecommendedTopicsSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst webWorkerSource = \"Web worker\";\r\nconst webWorkerUtility = \"WebWorkerUtility.ts\";\r\nexport const WebWorkerErrors = {\r\n /** Web worker script load error (404 response) */\r\n FileNotFound: {\r\n id: 29000,\r\n source: webWorkerUtility,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Web worker runtime error, fired by web worker on unhandled exceptions */\r\n RuntimeError: {\r\n id: 29001,\r\n source: webWorkerSource,\r\n severity,\r\n pb\r\n },\r\n\r\n /** Web worker message timeout */\r\n MessageTimeout: {\r\n id: 29002,\r\n source: webWorkerUtility,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n /** Web worker handled errors. These are the errors received as messages from web worker */\r\n HandledError: {\r\n id: 29003,\r\n source: webWorkerSource,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst EntryPointConnector = \"EntryPointConnector\";\r\nexport const EntryPointConnectorEvents = {\r\n /**\r\n * Indicates that for some reason the page never received all the perf markers it was waiting for\r\n * resulting in the timeout logic kicking in.\r\n */\r\n WaitForAllPerfMarkersTimeoutInvoked: {\r\n id: 29100,\r\n source: EntryPointConnector,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\nconst FirstPartyEntryPointFileName: string = \"FirstParty.connector.ts\";\r\nconst FirstPartyPageFileName: string = \"page.ts\";\r\nexport const FirstPartyEntryPointAppErrors = {\r\n /**\r\n * Error during app initialization for FirstParty page experience.\r\n */\r\n FirstPartyErrorPage: {\r\n id: 29200,\r\n source: FirstPartyEntryPointFileName,\r\n severity,\r\n pb\r\n },\r\n /** Error during initial SSO call, either the call failed of the user was not signed in */\r\n SSOFailedError: {\r\n id: 29250,\r\n source: FirstPartyPageFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst HomePageEntryPointFileName: string = \"HomePage.connector.ts\";\r\nconst HomePageFileName: string = \"page.ts\";\r\nexport const HomePageEntryPointAppErrors = {\r\n /**\r\n * Error during app initialization for Home page experience.\r\n */\r\n HomePageErrorPage: {\r\n id: 29300,\r\n source: HomePageEntryPointFileName,\r\n severity,\r\n pb\r\n },\r\n /** Error during initial SSO call, either the call failed of the user was not signed in */\r\n SSOFailedError: {\r\n id: 29301,\r\n source: HomePageFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst WindowsEntryPointFileName: string = \"Windows.connector.ts\";\r\nconst WindowsPageFileName: string = \"page.ts\";\r\n\r\nexport const WindowsEntryPointAppErrors = {\r\n /**\r\n * Error during app initialization for Windows page experience.\r\n */\r\n WindowsErrorPage: {\r\n id: 29400,\r\n source: WindowsEntryPointFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up showing the local ntp page on page exception.\r\n */\r\n WindowsPageShownPageExceptionError: {\r\n id: 29401,\r\n source: WindowsPageFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Tracking errors where we ended up reloading the NTP page on jss mismatch exception.\r\n */\r\n WindowsPageReloadedPageExceptionError: {\r\n id: 29402,\r\n source: WindowsPageFileName,\r\n severity,\r\n pb\r\n },\r\n\r\n /**\r\n * Error fetching the APP_ANON cookie on Windows page load\r\n */\r\n ErrorFetchingAppAnonCookie: {\r\n id: 29403,\r\n source: WindowsPageFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst irisArcCallerFileName = \"Iris.arcCaller.ts\";\r\nconst irisArcParserFileName = \"Iris.arcParser.ts\";\r\nconst irisMasterFileName = \"Iris.master.ts\";\r\nexport const IrisErrors = {\r\n /** Generic Unknown related to the Iris system. Investigate. */\r\n IrisUnknown: {\r\n id: 35000,\r\n source: \"Iris\",\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n /** The query parameters presented to the arc caller were found to be invalid. */\r\n InvalidQParams: {\r\n id: 35001,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n },\r\n ArcCallFailed: {\r\n id: 35002,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n },\r\n ArcResponseNotOk: {\r\n id: 35003,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n },\r\n ArcResponseUnparsable: {\r\n id: 35004,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n },\r\n MissingAppEnv: {\r\n id: 35005,\r\n source: irisArcCallerFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n UnknownIrisErrorFound: {\r\n id: 35006,\r\n source: irisArcParserFileName,\r\n severity,\r\n pb\r\n },\r\n TimeoutIrisErrorFound: {\r\n id: 35007,\r\n source: irisArcParserFileName,\r\n severity,\r\n pb\r\n },\r\n TemplateIrisErrorFound: {\r\n id: 35008,\r\n source: irisArcParserFileName,\r\n severity,\r\n pb\r\n },\r\n ClientErrorIrisErrorFound: {\r\n id: 35009,\r\n source: irisArcParserFileName,\r\n severity,\r\n pb\r\n },\r\n DSourceIrisErrorFound: {\r\n id: 35010,\r\n source: irisArcParserFileName,\r\n severity,\r\n pb\r\n },\r\n ActionCallFailure: {\r\n id: 35011,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n },\r\n ActionFetchFailure: {\r\n id: 35012,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n },\r\n ActionResponseFailure: {\r\n id: 35013,\r\n source: irisArcCallerFileName,\r\n severity,\r\n pb\r\n },\r\n UncaughtErrorDetected: {\r\n id: 35014,\r\n source: irisMasterFileName,\r\n severity,\r\n pb\r\n },\r\n UnconvertableCreative: {\r\n id: 35015,\r\n source: irisMasterFileName,\r\n severity,\r\n pb\r\n },\r\n InvalidResponseFormat: {\r\n id: 35016,\r\n source: irisMasterFileName,\r\n severity,\r\n pb\r\n },\r\n AbortErrorDiscovered: {\r\n id: 35017,\r\n source: irisMasterFileName,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n UnparsableSingleResponseJSON: {\r\n id: 35018,\r\n source: irisMasterFileName,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Iris data connector related App errors */\r\nconst IrisDataConnectorSourceFile = \"IrisData.connector.ts\";\r\nconst SubscriberValidatorSourceFile = \"SubscriberValidator.ts\";\r\nexport const IrisDataConnectorErrors = {\r\n SubscriberNotFound: {\r\n id: 35117,\r\n source: SubscriberValidatorSourceFile,\r\n severity,\r\n pb\r\n },\r\n CreativeCountNegativeOrZero: {\r\n id: 35118,\r\n source: IrisDataConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n ErrorFetchingSurfaceInfo: {\r\n id: 35119,\r\n source: IrisDataConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n ErrorFoundForSurface: {\r\n id: 35120,\r\n source: IrisDataConnectorSourceFile,\r\n severity,\r\n pb\r\n },\r\n SubscriberNotFoundInIrisPlacementDictionary: {\r\n id: 35121,\r\n source: IrisDataConnectorSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents AccessTokens related App errors */\r\nconst AccessTokensSourceFile = \"AccessTokens.ts\";\r\nconst PivotContentErrorPlaceholderFile = \"AadErrorPlaceholder.tsx\";\r\nexport const AccessTokensErrors = {\r\n EdgeChromiumAPIsNotAvailable: {\r\n id: 35200,\r\n source: AccessTokensSourceFile,\r\n severity,\r\n pb\r\n },\r\n\r\n AcquireAccessTokenFailed: {\r\n id: 35201,\r\n source: AccessTokensSourceFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n AcquireAccessTokenFailedForPivotContent: {\r\n id: 35202,\r\n source: PivotContentErrorPlaceholderFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents Render Cache errors*/\r\nconst PersistRenderCacheFile = \"PersistRenderCache.ts\";\r\nexport const RenderCacheErrors = {\r\n JssStyleMismatchWarning: {\r\n id: 35300,\r\n source: PersistRenderCacheFile,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n\r\n JssStyleCriticalMismatchError: {\r\n id: 35301,\r\n source: PersistRenderCacheFile,\r\n severity: Severity.Alert,\r\n pb\r\n }\r\n}\r\n\r\n/** Represents OcvFeedbackData related App errors */\r\nconst OcvFeedbackDataSourceFile = \"OcvFeedbackData.ts\";\r\nexport const OcvFeedbackDataErrors = {\r\n UndefinedDataNotAvailable: {\r\n id: 35400,\r\n source: OcvFeedbackDataSourceFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nexport const PivotHoverErrors = {\r\n /** Failed to fetch feed summary data for the Pivot Hover list. */\r\n FeedSummaryFetchError: {\r\n id: 35500,\r\n source: \"FeedSummaryFetcher.ts\",\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\nconst PreloadActionHelpers = \"PreloadActionHelpers.ts\";\r\nexport const PreloadReportingMessages = {\r\n TtvrMissing: {\r\n id: 35600,\r\n source: PreloadActionHelpers,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n TfprMissing: {\r\n id: 35601,\r\n source: PreloadActionHelpers,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n TtvrSearchBoxMissing: {\r\n id: 35602,\r\n source: PreloadActionHelpers,\r\n severity: Severity.NoAlert,\r\n pb\r\n },\r\n TtfSearchBoxMissing: {\r\n id: 35603,\r\n source: PreloadActionHelpers,\r\n severity: Severity.NoAlert,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents push notifications lib App errors */\r\nconst PushNotificationsLibFile = \"PushNotifications.ts\";\r\nexport const PushNotificationsLibErrors = {\r\n FetchKeyError: {\r\n id: 35700,\r\n source: PushNotificationsLibFile,\r\n severity,\r\n pb\r\n },\r\n SubscribeUnsubscribeError: {\r\n id: 35701,\r\n source: PushNotificationsLibFile,\r\n severity,\r\n pb\r\n }\r\n};\r\n\r\n/** Represents content truncation lib App errors */\r\nconst ContentTruncationSourceFile = \"ContentTruncation.ts\";\r\nexport const ContentTruncationErrors = {\r\n OverTruncationError: {\r\n id: 35800,\r\n source: ContentTruncationSourceFile,\r\n severity,\r\n pb\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AadData, clientId, oneServiceScope } from \"./Enterprise\";\r\nimport { AccountType, AppType, AudienceModeType, AuthCookieName } from \"@msnews/experiences-constants\";\r\nimport { EnterpriseOneServiceApi, appAnonCookieExistsCookieName, childCookieName, rootElementId, serviceUrl, telemetryId, trackPageProduct, trackPageType } from \"../constants\";\r\nimport { Environment, getEnvironmentFromString } from \"./Environment\";\r\nimport { HostPage, IHostPage } from \"./HostPage\";\r\nimport { canUseDOM, getDocumentElementById, getLocationHostname, getLocationHref, getLocationOrigin, getLocationSearch } from \"@msnews/isomorphic-util\";\r\nimport { getCookie, getMuidCookie } from \"../utilities/CookieUtility\";\r\n\r\nimport { Market } from \"./Market\";\r\nimport { PageRequestTargetScope } from \"./PageRequestTargetScope\";\r\nimport { PlatformType } from \"cms-models-msn/configuration/types/PlatformType\";\r\nimport { UrlUtility } from \"../utilities/UrlUtility\";\r\nimport { Utility } from \"../utilities/Utility\";\r\nimport { headData } from \"./HeadData\";\r\nimport { isString } from \"lodash-es\";\r\nimport { logger } from \"@msnews/diagnostics\";\r\n\r\n/**\r\n * chrome\r\n * The chrome API is not defined in Typescript\r\n */\r\ndeclare global {\r\n // tslint:disable-next-line: completed-docs\r\n interface Window { chrome: any; }\r\n}\r\n\r\n/**\r\n * Page level experience tracking info\r\n */\r\nexport interface ITrackInfo {\r\n sitePage: {\r\n page_product: string,\r\n page_type: string\r\n }\r\n}\r\n\r\nexport class AppEnvironment {\r\n /**\r\n * The single instance of the AppEnvironment class.\r\n * @type {AppEnvironment}\r\n */\r\n private static _instance: AppEnvironment;\r\n\r\n /**\r\n * the activity id for the current page view\r\n */\r\n private activityId: string;\r\n\r\n /**\r\n * Base url for the content service, endpoints/queries are appended for specific content calls.\r\n * This is an akamai url for highly cacheable content.\r\n * Possible values are enumerated on ContentServiceConfig.ts\r\n *\r\n * @private\r\n * @type {string}\r\n * @memberof AppEnvironment\r\n */\r\n private contentServiceUrlBase: URL;\r\n\r\n private currentRequestTargetScope: PageRequestTargetScope;\r\n\r\n private currentMarket: Market;\r\n private hostPage: IHostPage;\r\n\r\n /** The hostname to use for content links. */\r\n private currentContentLinkHost: string;\r\n\r\n /**\r\n * Indicates that the page is running as an FRE page (i.e. the url contains fre=1)\r\n * Does not indicate that the FRE itself is currently displayed over the page.\r\n */\r\n private isFrePage: boolean;\r\n\r\n /**\r\n * Base for the service url, endpoints/queries are appended for specific service calls.\r\n * This is the OneService url used for personalized content.\r\n * Possible values are enumerated on OneServiceConfig.ts\r\n *\r\n * @private\r\n * @type {string}\r\n * @memberof AppEnvironment\r\n */\r\n private serviceUrlBase: URL;\r\n\r\n /**\r\n * Base URL for the feed service\r\n */\r\n private feedServiceUrlBase: URL;\r\n\r\n /**\r\n * The account type of the page user\r\n * Currently this is only implemented for the Anaheim New Tab Pages\r\n */\r\n private accountType: AccountType;\r\n\r\n /**\r\n * The aad data for the current page user\r\n */\r\n private aadDataPromise: Promise;\r\n\r\n private appType: string;\r\n private authCookieName: AuthCookieName;\r\n private buildVersion: string;\r\n\r\n private environmentConfigUrl: URL;\r\n\r\n private rootTelemetryId: number;\r\n private trackInfo: ITrackInfo;\r\n private userId: string;\r\n private countryCode: string;\r\n private latitude: string;\r\n private longitude: string;\r\n private environment: Environment;\r\n private assetsHost: string;\r\n private featureFlags: any;\r\n private disableCachingConfigs: boolean;\r\n private enableConfigService: boolean;\r\n private isMultiConfigRetrievalEnabled: boolean;\r\n private configServiceBaseUrl: URL;\r\n private disableContentPreviewCache: boolean;\r\n private disableContentCacheIDBRead: boolean;\r\n private disableContentListCache: boolean;\r\n private disableContentListCacheIDBRead: boolean;\r\n private sendFeedCallActivityIdInHeader: boolean;\r\n\r\n /** True if query string has appropriate debug flag */\r\n private isDebug: boolean;\r\n\r\n /** True if query string has appropriate flag to show msnCreatorDashboard (msnDash=) */\r\n private showMnsCreatorDashboard: boolean;\r\n\r\n /** Config Root Url */\r\n private configRootUrl: URL;\r\n\r\n /** Cache busting identifier received from pcs */\r\n private cacheBustingIdentifier: string;\r\n\r\n /**\r\n * ActivityId value from initial server response, use telemetry's requestId instead for associating with current page client navigation\r\n */\r\n public get ActivityId(): string { return this.activityId; }\r\n\r\n /**\r\n * Getter for the base url for the content service, endpoints/queries are appended for specific content calls.\r\n * This is an akamai url for highly cacheable content.\r\n * Possible values are enumerated on ContentServiceConfig.ts\r\n *\r\n * @readonly\r\n * @type {URL}\r\n * @memberof AppEnvironment\r\n */\r\n public get EnvironmentConfigUrl(): URL {\r\n // If I mutate the same object, I will need to revert to the original state somewhere.\r\n // For safety reason, it is better to use a new Object\r\n const url = new URL(\"\", this.environmentConfigUrl);\r\n\r\n if (process.env.WEBPACK_DEV_SERVER || new URLSearchParams(getLocationSearch()).get(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.config\", \"dev\");\r\n }\r\n\r\n const searchParam = new URLSearchParams(getLocationSearch()).get(\"env.config\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.config\", searchParam);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Getter for the base url for the content service, endpoints/queries are appended for specific content calls.\r\n * This is an akamai url for highly cacheable content.\r\n * Possible values are enumerated on ContentServiceConfig.ts\r\n *\r\n * @readonly\r\n * @type {URL}\r\n * @memberof AppEnvironment\r\n */\r\n public get ContentServiceUrlBase(): URL {\r\n // If I mutate the same object, I will need to revert to the original state somewhere.\r\n // For safety reason, it is better to use a new Object\r\n const url = new URL(\"\", this.contentServiceUrlBase);\r\n\r\n if (process.env.WEBPACK_DEV_SERVER || new URLSearchParams(getLocationSearch()).get(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.content\", \"dev\");\r\n }\r\n\r\n const searchParam = new URLSearchParams(getLocationSearch()).get(\"env.content\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.content\", searchParam);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n public get CurrentRequestTargetScope(): PageRequestTargetScope { return this.currentRequestTargetScope; }\r\n public get CurrentMarket(): Market { return this.currentMarket; }\r\n public get Environment(): Environment { return this.environment; }\r\n public get AssetsHost(): string { return this.assetsHost; }\r\n public get HostPage(): IHostPage { return this.hostPage; }\r\n public get AppType(): string { return this.appType; }\r\n public get AuthCookieName(): AuthCookieName { return this.authCookieName; }\r\n public get AccountType(): AccountType { return this.accountType; }\r\n public get AadDataPromise(): Promise { return this.aadDataPromise; }\r\n public get BuildVersion(): string { return this.buildVersion; }\r\n\r\n /** True if query string has appropriate debug flag */\r\n public get IsDebug(): boolean { return this.isDebug; }\r\n\r\n /** True if query string has appropriate flag to show msnCreatorDashboard (msnDash=) */\r\n public get ShowMnsCreatorDashboard(): boolean { return this.showMnsCreatorDashboard; }\r\n\r\n /**\r\n * Gets the host to use when linking to content.\r\n */\r\n public get contentLinkHost(): string { return this.currentContentLinkHost; }\r\n\r\n /**\r\n * Getter for the base for the service url, endpoints/queries are appended for specific service calls.\r\n * This is the oneservice url used for personalized content.\r\n * Possible values are enumerated on OneServiceConfig.ts\r\n *\r\n * @type {URL}\r\n * @memberof AppEnvironment\r\n */\r\n public get ServiceUrlBase(): URL {\r\n const url = new URL(\"\", this.serviceUrlBase);\r\n\r\n if (process.env.WEBPACK_DEV_SERVER || new URLSearchParams(getLocationSearch()).get(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.service\", \"dev\");\r\n }\r\n\r\n const searchParam = new URLSearchParams(getLocationSearch()).get(\"env.service\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.service\", searchParam);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Base URL for the feed service\r\n */\r\n public get FeedServiceUrlBase(): URL {\r\n if (!this.feedServiceUrlBase) {\r\n return null;\r\n }\r\n\r\n const url = new URL(\"\", this.feedServiceUrlBase);\r\n\r\n if (process.env.WEBPACK_DEV_SERVER || new URLSearchParams(getLocationSearch()).get(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.service\", \"dev\");\r\n }\r\n\r\n const searchParam = new URLSearchParams(getLocationSearch()).get(\"env.service\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.service\", searchParam);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Base URL for the enterprise service\r\n */\r\n public get EnterpriseServiceUrlBase(): URL {\r\n const url = new URL(\"\", EnterpriseOneServiceApi);\r\n\r\n if (process.env.WEBPACK_DEV_SERVER || new URLSearchParams(getLocationSearch()).get(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.service\", \"dev\");\r\n }\r\n\r\n const searchParam = new URLSearchParams(getLocationSearch()).get(\"env.service\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.service\", searchParam);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n public get IsFrePage(): boolean { return this.isFrePage; }\r\n\r\n public get RootTelemetryId(): number { return this.rootTelemetryId; }\r\n public get TrackInfo(): ITrackInfo { return this.trackInfo; }\r\n public get UserId(): string { return this.userId; }\r\n\r\n /**\r\n * This is the switch to turn on/off indexed db operation used as a caching layer in config resolver (Resolver.ts)\r\n */\r\n public get DisableCachingConfigs(): boolean { return this.disableCachingConfigs; }\r\n\r\n /**\r\n * This is the switch to turn on/off config service operation in Resolver.ts\r\n */\r\n public get EnableConfigService(): boolean { return this.enableConfigService; }\r\n\r\n /**\r\n * This indicates whether we will use CMS PPE configs or not\r\n */\r\n public get EnableCMSPPEConfigs(): boolean { return headData && headData.EnableCMSPPEConfigs; }\r\n\r\n /**\r\n * Check whether multi config retrieval is supported.\r\n */\r\n public get IsMultiConfigRetrievalEnabled(): boolean { return this.isMultiConfigRetrievalEnabled; }\r\n\r\n /**\r\n * This is the switch to turn on/off content preview caching in core/cache/ContentPreview.ts\r\n */\r\n public get DisableContentPreviewCache(): boolean {\r\n return this.disableContentPreviewCache;\r\n }\r\n\r\n /**\r\n * Returns a flag indicating whether the one service feed fetch call should send activityID\r\n * in the request header or as a QSP in the URL (current behavior is via QSP).\r\n */\r\n public get SendFeedCallActivityIdInHeader(): boolean {\r\n return this.sendFeedCallActivityIdInHeader;\r\n }\r\n\r\n /**\r\n * This is the switch to turn off hydrating content preview cache from IndexedDB.\r\n * Default is false\r\n */\r\n public get DisableContentCacheIDBRead(): boolean {\r\n const queryParamOverride = UrlUtility.getQueryParameterByName(\"disableContentCacheIDBRead\", getLocationSearch());\r\n\r\n if (queryParamOverride) {\r\n return queryParamOverride === \"true\";\r\n }\r\n\r\n return this.disableContentCacheIDBRead;\r\n }\r\n\r\n /**\r\n * This is the switch to turn on/off content list caching in core/cache/ContentPreview.ts\r\n */\r\n public get DisableContentListCache(): boolean {\r\n return this.disableContentListCache;\r\n }\r\n\r\n /**\r\n * This is the switch to turn off hydrating content list cache from IndexedDB.\r\n * Default is false\r\n */\r\n public get DisableContentListCacheIDBRead(): boolean {\r\n const queryParamOverride = UrlUtility.getQueryParameterByName(\"disableContentListCacheIDBRead\", getLocationSearch());\r\n\r\n if (queryParamOverride) {\r\n return queryParamOverride === \"true\";\r\n }\r\n\r\n return this.disableContentListCacheIDBRead;\r\n }\r\n\r\n /**\r\n * Get base url of Config Service.\r\n */\r\n public get ConfigServiceBaseUrl(): URL { return this.configServiceBaseUrl; }\r\n\r\n /**\r\n * This returns feature flags client settings stamped by PCS.\r\n */\r\n public get FeatureFlags(): any { return this.featureFlags; }\r\n\r\n /**\r\n * This returns config root url\r\n */\r\n public get ConfigRootUrl(): URL {\r\n if (!this.configRootUrl) {\r\n return null;\r\n }\r\n\r\n const url = new URL(\"\", this.configRootUrl);\r\n\r\n if (process.env.WEBPACK_DEV_SERVER || new URLSearchParams(getLocationSearch()).get(\"env\") === \"dev\") {\r\n url.searchParams.set(\"env.config\", \"dev\");\r\n }\r\n\r\n const searchParam = new URLSearchParams(getLocationSearch()).get(\"env.config\");\r\n if (searchParam) {\r\n url.searchParams.set(\"env.config\", searchParam);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * Returns cache busting identifier from PCS.\r\n */\r\n public get CacheBustingIdentifier(): string { return this.cacheBustingIdentifier; }\r\n\r\n /**\r\n * Returns the country code. For example \"br\"\r\n */\r\n public get CountryCode(): string { return this.countryCode; }\r\n\r\n //// FIXME: hyphen has a second 'h'\r\n //// Bug 24228723: [Peregrine] ActivityIdLowerCaseNoHypens misspells \"Hyphen\"\r\n /**\r\n * Gets the Activity ID in lower case and without any hyphens. This helper method should be where parity with Prime is required.\r\n * Use telemetry's requestId instead for associating with current page client navigation\r\n */\r\n public get ActivityIdLowerCaseNoHypens(): string { return ((headData && headData.ClientSettings && headData.ClientSettings.aid) || \"\").toLowerCase(); }\r\n\r\n /**\r\n * Returns the latitude. For example \"42.361145\"\r\n */\r\n public get Latitude(): string { return this.latitude; }\r\n\r\n /**\r\n * Returns the longitude. For example \"-71.057083\"\r\n */\r\n public get Longitude(): string { return this.longitude; }\r\n\r\n public set ActivityId(value: string) { this.activityId = value; }\r\n public set CountryCode(value: string) { this.countryCode = value; }\r\n public set CurrentMarket(value: Market) { this.currentMarket = value; }\r\n public set CurrentRequestTargetScope(value: PageRequestTargetScope) { this.currentRequestTargetScope = value; }\r\n public set Environment(value: Environment) { this.environment = value; }\r\n public set HostPage(value: IHostPage) { this.hostPage = value; }\r\n public set RootTelemetryId(value: number) { this.rootTelemetryId = value; }\r\n public set TrackInfo(value: ITrackInfo) { this.trackInfo = value; }\r\n public set UserId(value: string) { this.userId = value; }\r\n public set AuthCookieName(value: AuthCookieName) { this.authCookieName = value; }\r\n public set AccountType(value: AccountType) { this.accountType = value; }\r\n public set AadDataPromise(value: Promise) { this.aadDataPromise = value; }\r\n\r\n /**\r\n * Initialize the AppEnvironment singleton instance.\r\n * @param _serviceUrl Optional URL to initialize the ServiceUrlBase.\r\n * @param _configServiceUrlBase ConfigServiceUrlBase provided during server side rendering this is the ServiceFabric ClusterRegionUrl.\r\n */\r\n private constructor(_serviceUrl: URL, _configServiceUrlBase: string) {\r\n this.initializeAppEnvironment(_serviceUrl, _configServiceUrlBase);\r\n }\r\n\r\n /**\r\n * Returns singleton class instance.\r\n * @returns {AppEnvironment}\r\n */\r\n public static getInstance(serviceUrl: URL = null, configServiceUrlBase: string = null): AppEnvironment {\r\n return AppEnvironment._instance || (AppEnvironment._instance = new AppEnvironment(serviceUrl, configServiceUrlBase));\r\n }\r\n\r\n /**\r\n * Reinitialize the singleton class instance.\r\n * @param serviceUrl OneService service url to initialize to.\r\n * @param configServiceUrlBase Config service url to initialize to.\r\n * @returns {AppEnvironment}\r\n */\r\n public static resetInstance(serviceUrl: URL = null, configServiceUrlBase: string = null): AppEnvironment {\r\n AppEnvironment._instance = new AppEnvironment(serviceUrl, configServiceUrlBase);\r\n appEnvironment = AppEnvironment._instance;\r\n return AppEnvironment._instance;\r\n }\r\n\r\n /**\r\n * Initializes App environment. This is normally only called by the constructor (singleton pattern)\r\n * It is made public so that it can be also called by test code.\r\n */\r\n public initializeAppEnvironment(_serviceUrl?: URL, configServiceUrlBase?: string): void {\r\n\r\n let environmentFromHeadData: Environment = null;\r\n const clientSettings = headData && headData.ClientSettings;\r\n\r\n if (clientSettings) {\r\n this.activityId = this.tryReformatGuid(clientSettings.aid);\r\n this.buildVersion = clientSettings.v;\r\n this.currentMarket = (headData.Locale || clientSettings.apps_locale) as Market;\r\n this.countryCode = clientSettings.geo_country;\r\n this.latitude = clientSettings.geo_lat;\r\n this.longitude = clientSettings.geo_long;\r\n this.configRootUrl = clientSettings.configRootUrl ? new URL(\"\", clientSettings.configRootUrl) : null;\r\n environmentFromHeadData = getEnvironmentFromString(clientSettings.env);\r\n\r\n this.setAccountType();\r\n this.appType = clientSettings.apptype || \"\";\r\n this.authCookieName = this.getAuthCookieName();\r\n\r\n this.featureFlags = clientSettings.featureFlags;\r\n\r\n this.disableCachingConfigs =\r\n this.featureFlags && this.featureFlags.disableCachingConfigs\r\n ? this.featureFlags.disableCachingConfigs === \"true\"\r\n : false;\r\n\r\n this.enableConfigService =\r\n this.featureFlags && this.featureFlags.enableConfigService\r\n ? this.featureFlags.enableConfigService === \"true\"\r\n : true;\r\n\r\n this.disableContentPreviewCache =\r\n this.featureFlags && this.featureFlags.disableContentPreviewCache\r\n ? this.featureFlags.disableContentPreviewCache === \"true\"\r\n : false;\r\n\r\n this.disableContentCacheIDBRead = this.featureFlags && this.featureFlags.disableContentCacheIDBRead\r\n ? this.featureFlags.disableContentCacheIDBRead === \"true\"\r\n : false;\r\n\r\n this.disableContentListCache =\r\n this.featureFlags && this.featureFlags.disableContentListCache\r\n ? this.featureFlags.disableContentListCache === \"true\"\r\n : false;\r\n\r\n this.disableContentListCacheIDBRead = this.featureFlags && this.featureFlags.disableContentListCacheIDBRead\r\n ? this.featureFlags.disableContentListCacheIDBRead === \"true\"\r\n : false;\r\n\r\n // Hardcode flight details for experimentation sake\r\n // Use feature flag as a switch to disable the feature, since we may not be able to stop the flight itself (will need a PCS deployment)\r\n this.sendFeedCallActivityIdInHeader = this.featureFlags && this.featureFlags.disableActivityIdInHeader && this.featureFlags.disableActivityIdInHeader === \"true\"\r\n ? false\r\n : this.appType === AppType.Edge;\r\n\r\n this.cacheBustingIdentifier = clientSettings.cbid;\r\n }\r\n\r\n const rootElement = canUseDOM() ? getDocumentElementById(rootElementId) : null;\r\n const locationHref = getLocationHref();\r\n const locationOrigin = getLocationOrigin();\r\n\r\n // env is read from\r\n // - query string param env, if present\r\n // - headData.ClientSettings.env\r\n // - defaults to prod otherwise\r\n const envQSOverwrite = getEnvironmentFromString(UrlUtility.getQueryParameterByName(\"env\", locationHref));\r\n this.environment =\r\n envQSOverwrite\r\n || environmentFromHeadData\r\n || Environment.prod;\r\n\r\n this.serviceUrlBase = _serviceUrl || (rootElement && rootElement.getAttribute(serviceUrl) && new URL(\"\", rootElement.getAttribute(serviceUrl))) || new URL(\"\", \"https://assets.msn.com/service/\");\r\n\r\n // If PCS sent the feed base domain, use it for the feed URL base\r\n // or else default to host page rooted URL.\r\n this.feedServiceUrlBase = new URL(\"./service/\", clientSettings && clientSettings.feedBaseDomain ? clientSettings.feedBaseDomain : locationOrigin);\r\n\r\n // Get the hostPage from the request url\r\n this.hostPage = HostPage.getHostPageFromUrl(locationHref);\r\n\r\n // Determine if the page is running as an FRE page\r\n this.isFrePage = (UrlUtility.getQueryParameterByName(\"fre\", locationHref) === \"1\");\r\n\r\n // Find the host for the Akamai assets store.\r\n this.assetsHost = getLocationHostname().endsWith(\".cn\") ? \"assets.msn.cn\" : \"assets.msn.com\";\r\n\r\n // Get the UserMuid from the muid cookie\r\n const muidCookie: string = getMuidCookie();\r\n if (isString(muidCookie)) {\r\n logger.log(\"u: m-\" + muidCookie);\r\n this.userId = \"m-\" + muidCookie;\r\n }\r\n\r\n // Get attributes from the head (full page Peregrine experience) or from the spa \"root\" element (PrimeHybrid case)\r\n // TODO, determine where in the element attributes these values should be set\r\n this.rootTelemetryId = rootElement ? Number(rootElement.getAttribute(telemetryId)) : 0;\r\n const trackPageProd = rootElement && rootElement.getAttribute(trackPageProduct);\r\n const trackPageTypeVal = rootElement && rootElement.getAttribute(trackPageType);\r\n this.trackInfo = { sitePage: { page_product: trackPageProd, page_type: trackPageTypeVal } };\r\n\r\n this.contentServiceUrlBase = new URL(\"\", \"https://assets.msn.com/content/\");\r\n\r\n this.currentContentLinkHost = this.createContentLinkHost();\r\n\r\n this.setTargetScope();\r\n\r\n this.isMultiConfigRetrievalEnabled = this.useMultiConfigsRetrieval();\r\n\r\n const baseUrl = this.getConfigServiceBaseUrl(this.isMultiConfigRetrievalEnabled, configServiceUrlBase);\r\n this.configServiceBaseUrl = baseUrl ? new URL(\"\", baseUrl) : null;\r\n\r\n this.environmentConfigUrl = new URL(\"\", \"https://assets.msn.com/config/v1/\");\r\n\r\n this.isDebug = ((UrlUtility.getQueryParameterByName(\"debug\", locationHref) || \"\").toLowerCase() in { \"1\": 1, \"true\": 1 })\r\n || (UrlUtility.getQueryParameterByName(\"item\", locationHref) || \"\").toLowerCase().indexOf(\"/debug\") > 0;\r\n\r\n this.showMnsCreatorDashboard = UrlUtility.getQueryParameterByName(\"mnsDash\", locationHref) != null;\r\n }\r\n\r\n /**\r\n * Get config service base url\r\n * @param isMultiConfigRetrievalEnabled if multiple config retrieval is supported.\r\n * @param configServiceUrlBase externally configured config service url (from SSR environment)\r\n * @returns {string} - config service base url.\r\n */\r\n private getConfigServiceBaseUrl(isMultiConfigRetrievalEnabled: boolean = true, configServiceUrlBase?: string): string {\r\n const relativePath = `/resolver/api/resolve/${isMultiConfigRetrievalEnabled ? `v2/` : ``}configindex/`;\r\n\r\n if (configServiceUrlBase) {\r\n // When doing server side rendering the ClusterRegionUrl env variable should be set, use this to avoid calls to CRS going outside of the cluster.\r\n return configServiceUrlBase + relativePath;\r\n } else if (process.env.WEBPACK_DEV_SERVER || this.environment === Environment.int) {\r\n // int and localhost to use int.msn.com for config service.\r\n return \"https://int.msn.com\" + relativePath;\r\n } else {\r\n return getLocationOrigin() ? getLocationOrigin() + relativePath : null;\r\n }\r\n }\r\n\r\n /**\r\n * Function checks if ConfigService should return multiple configs\r\n * @returns true if supported else false.\r\n */\r\n private useMultiConfigsRetrieval(): boolean {\r\n const urlQuery = getLocationSearch();\r\n if (urlQuery) {\r\n const param = UrlUtility.getQueryParameterByName(\"isMultiConfigRetrievalEnabled\", urlQuery);\r\n if (param) {\r\n return param.toLocaleLowerCase() === \"true\";\r\n }\r\n }\r\n\r\n // PCS flag to turn on/off multi config retrieval.\r\n if (this.featureFlags\r\n && this.featureFlags.isMultiConfigRetrievalEnabled) {\r\n return this.featureFlags.isMultiConfigRetrievalEnabled === \"true\";\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Get the auth cookie name based on the app type of the page\r\n * @returns {AuthCookieName} - the name of the auth cookie to use\r\n */\r\n private getAuthCookieName(): AuthCookieName {\r\n const clientSettings = headData && headData.ClientSettings;\r\n const appType: AppType = (clientSettings.apptype || \"\") as AppType;\r\n let authCookieName: AuthCookieName;\r\n switch (appType) {\r\n case AppType.Hub:\r\n case AppType.MicrosoftNews:\r\n case AppType.Views:\r\n authCookieName = AuthCookieName.Anon;\r\n break;\r\n case AppType.Edge:\r\n case AppType.EdgeChromium:\r\n case AppType.MMX:\r\n case AppType.Office:\r\n default:\r\n authCookieName = AuthCookieName.AppAnon;\r\n }\r\n\r\n return authCookieName;\r\n }\r\n\r\n /**\r\n * Sets the AccountType for the current user\r\n */\r\n private setAccountType(): void {\r\n // TODO: Currently signed in status is not available on the server side\r\n // Tracking work item: https://dev.azure.com/microsoft/OS/_workitems/edit/24489062\r\n if (!canUseDOM() || !window.chrome || !window.chrome.authPrivate || !window.chrome.authPrivate.getPrimaryAccountInfo) {\r\n this.AccountType = AccountType.SignedOut;\r\n return;\r\n }\r\n window.chrome.authPrivate.getPrimaryAccountInfo((accountInfo) => {\r\n if (!accountInfo) {\r\n this.AccountType = AccountType.SignedOut;\r\n return;\r\n }\r\n\r\n const accountType: string = accountInfo.account_type;\r\n if (accountType === \"AAD\") {\r\n this.AccountType = AccountType.AAD;\r\n this.setAadDataPromise(accountInfo);\r\n return;\r\n }\r\n\r\n if (accountType === \"MSA\") {\r\n this.AccountType = AccountType.MSA;\r\n return;\r\n }\r\n\r\n this.AccountType = AccountType.SignedOut;\r\n });\r\n }\r\n\r\n /**\r\n * Sets the AadDataPromise for the current user if an aad account\r\n */\r\n private setAadDataPromise(accountInfo: any): void {\r\n this.AadDataPromise = new Promise((resolve) => {\r\n const tokenAcquireParameters = {\r\n account_id: accountInfo.account_id,\r\n account_type: accountInfo.account_type,\r\n client_id: clientId,\r\n scope_or_resource: oneServiceScope\r\n };\r\n\r\n window.chrome.authPrivate.acquireAccessTokenSilently(tokenAcquireParameters, (acquireResult) => {\r\n resolve({\r\n token: acquireResult.access_token,\r\n errorInfo: acquireResult.error_info,\r\n isSuccess: acquireResult.is_success,\r\n isValid: acquireResult.is_token_valid\r\n });\r\n });\r\n })\r\n }\r\n\r\n /**\r\n * Determines the content link host to use.\r\n * @returns The content link host.\r\n */\r\n private createContentLinkHost(): string {\r\n const topLevelDomain = this.currentMarket === Market.ZHCN ? \"cn\" : \"com\";\r\n return \"www.msn.\" + topLevelDomain;\r\n }\r\n\r\n /**\r\n * Reformats the given guid without dashes to a guid string with dashes.\r\n * @param {string} guid - The guid without dashes.\r\n * @returns {string} - The reformatted GUI with dashes.\r\n */\r\n private tryReformatGuid(guid: string): string {\r\n if (guid && guid.length === 32) {\r\n // use a regex to extract the specific substrings to reformat the guid\r\n const matches = guid.match(/(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})/i);\r\n if (matches) {\r\n // join all the captured groups from 1-5 to format the final guid string\r\n guid = matches.slice(1).join(\"-\");\r\n }\r\n }\r\n\r\n return guid;\r\n }\r\n\r\n /**\r\n * Sets target scope for current request.\r\n */\r\n private setTargetScope(): void {\r\n if (!headData || !headData.ClientSettings) {\r\n return;\r\n }\r\n\r\n // If user is signed in and \"child\" Cookie exists - set Kids audience mode, otherwise use PCS provided Audience mode.\r\n let audienceMode: AudienceModeType;\r\n if (getCookie(appAnonCookieExistsCookieName) && getCookie(childCookieName)) {\r\n audienceMode = AudienceModeType.Kids;\r\n } else {\r\n audienceMode = headData.ClientSettings.audienceMode || AudienceModeType.Adult;\r\n }\r\n\r\n const { browser, deviceFormFactor, domain, locale, os, pagetype } = headData.ClientSettings;\r\n\r\n this.currentRequestTargetScope = {\r\n audienceMode: audienceMode,\r\n browser: browser,\r\n deviceFormFactor: deviceFormFactor,\r\n domain: domain,\r\n locale: locale,\r\n os: os,\r\n platform: PlatformType.Web,\r\n pageType: pagetype\r\n };\r\n\r\n // if locale is not defined in client settings, try reading it from headData for backward compatibility\r\n if (!this.currentRequestTargetScope.locale && Utility.stringHasData(headData.Locale)) {\r\n const locale = headData.Locale.split(\"-\");\r\n if (locale.length > 1) {\r\n this.currentRequestTargetScope.locale = {\r\n language: locale[0],\r\n // Some spartan locale are in format \"ha-latn-ng\". Here the market is \"ng\" and language is \"ha\"\r\n market: locale[locale.length - 1]\r\n };\r\n }\r\n }\r\n\r\n if (Utility.stringHasData(headData.CurrentFlights)) {\r\n this.currentRequestTargetScope.pageExperiments = headData.CurrentFlights.split(\",\");\r\n }\r\n }\r\n}\r\n\r\nexport const getAppEnvironment = AppEnvironment.getInstance;\r\n\r\n// appEnvironment can be reinitialized for server side rendering through resetAppEnvironment.\r\nexport let appEnvironment = AppEnvironment.getInstance();\r\n\r\nexport const resetAppEnvironment = AppEnvironment.resetInstance;","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Attempts to parse a given string to a JSON object\r\n * @param {string} jsonString - The string to parse.\r\n * @returns {any} - the parsed object if successful, or null otherwise.\r\n */\r\nexport function tryParseJson(jsonString: string): any {\r\n try {\r\n return JSON.parse(jsonString);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\n/** Attempts to parse the given value as a integer and if failed will return the defaultValue.\r\n * @param {string} value - The value to parse.\r\n * @param {number} defaultValue - The default value to return if parsing fails\r\n * @returns {number} the parsed value if it was a valid number or otherwise the default value if specified.\r\n */\r\nexport function tryParseInt(value: string, defaultValue: number): number {\r\n let n = parseInt(value);\r\n return isNaN(n) ? defaultValue : n;\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/// Creates a function defined as \"extend\" that functions similiar to jQuery's extend function.\r\n\r\nfunction isArray(arr) {\r\n // Check support for isArray\r\n if (Array.isArray) {\r\n return Array.isArray(arr);\r\n } else {\r\n return Object.prototype.toString.call(arr).toLowerCase() === \"[object array]\";\r\n }\r\n}\r\n\r\nfunction extend(...args: any[]) {\r\n var target = args[0] || {};\r\n var ndx = 1;\r\n var key;\r\n var obj;\r\n var isRecursive;\r\n var src;\r\n\r\n if (typeof target == \"boolean\" || typeof target == \"number\") {\r\n isRecursive = !!target;\r\n target = args[1];\r\n ndx = 2;\r\n }\r\n for (; ndx < args.length; ndx++) {\r\n obj = args[ndx];\r\n for (key in obj) {\r\n if (obj[key] !== undefined && obj[key] !== null) {\r\n if (isRecursive && typeof obj[key] == \"object\") {\r\n src = target[key];\r\n if (typeof src != \"object\") {\r\n if (isArray(obj[key])) {\r\n src = [];\r\n } else {\r\n src = {};\r\n }\r\n }\r\n\r\n extend(true, src, obj[key]);\r\n target[key] = src;\r\n } else {\r\n target[key] = obj[key];\r\n }\r\n }\r\n }\r\n }\r\n return target;\r\n};\r\n\r\nexport default extend;\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { BrowserConsoleAppender } from \"clientcore-infrastructure-analytics/appenders/BrowserConsoleAppender\";\r\nimport { ILoggingService } from \"clientcore-infrastructure-analytics/ILoggingService\";\r\nimport { LogLevel } from \"clientcore-infrastructure-analytics/models/LogLevel\";\r\nimport { LoggingService } from \"clientcore-infrastructure-analytics/LoggingService\";\r\nimport { NodeConsoleAppender } from \"clientcore-infrastructure-analytics/appenders/NodeConsoleAppender\";\r\nimport { RuntimeEnvironment } from \"clientcore-infrastructure-analytics/RuntimeEnvironment\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\n/** The Logger class */\r\nexport class Logger {\r\n /** A default instance of the Logger class. */\r\n public static readonly defaultInstance: Logger = new Logger();\r\n\r\n /** Backing field for the isDebug function */\r\n private isDebugEnabled: boolean;\r\n\r\n /** The common logger for the application. The logging level for this is updated in initialize */\r\n private logger: ILoggingService;\r\n\r\n /** Backing field to hold reference to the window object */\r\n private windowObj?: Window;\r\n\r\n /**\r\n * The constructor\r\n */\r\n private constructor() {\r\n if (canUseDOM()) {\r\n this.setupBrowserEnvironment(window);\r\n\r\n if (this.isDebugEnabled) {\r\n // @ts-ignore\r\n window.webpackRequire = __webpack_require__;\r\n }\r\n } else {\r\n this.setupNodeEnvironment();\r\n }\r\n }\r\n\r\n /**\r\n * Setup client side logging environment - this sets / overrides the Window obj\r\n * @param windowObj - The Window obj to use\r\n */\r\n public setupBrowserEnvironment(windowObj: Window): void {\r\n this.logger = LoggingService.getInstance(\"ExperienceLogger\", LogLevel.Info, RuntimeEnvironment.Browser);\r\n\r\n this.windowObj = windowObj;\r\n\r\n // Once we have a WindowObj, we can determine if debug mode is enabled\r\n this.isDebugEnabled = ((this.getQueryParameterByName(windowObj.location.href, \"debug\") || \"\").toLowerCase() in { \"1\": 1, \"true\": 1 });\r\n\r\n this.setupLogLevel();\r\n }\r\n\r\n /**\r\n * Setup server side logging environment\r\n */\r\n public setupNodeEnvironment(): void {\r\n this.logger = LoggingService.getInstance(\"ExperienceLogger\", LogLevel.Info, RuntimeEnvironment.NodeJs);\r\n this.isDebugEnabled = false; // isDebugEnabled should be set explictly using the setDebug method\r\n this.setupLogLevel();\r\n }\r\n\r\n /**\r\n * Returns the logging service\r\n * @returns {ILoggingService}\r\n */\r\n public getLoggingService(): ILoggingService {\r\n return this.logger;\r\n }\r\n\r\n /**\r\n * Checks whether we're running in debug mode.\r\n * @returns True when either debug=1 or debug=true is present as a query param, otherwise false.\r\n */\r\n public isDebug(): boolean {\r\n return this.isDebugEnabled;\r\n }\r\n\r\n /**\r\n * Override the isDebug setting. Useful when server side rendering.\r\n */\r\n public setDebug(isDebug: boolean): void {\r\n this.isDebugEnabled = isDebug;\r\n this.setupLogLevel();\r\n }\r\n\r\n /**\r\n * Log console message.\r\n * Note that these are not output to the console unless you're in debug mode.\r\n * @param message - Message to log.\r\n */\r\n public log(message: string): void {\r\n if (this.isDebug()) {\r\n if (!canUseDOM()) {\r\n // currently the logger is incredibly verbose when printing on the server side.\r\n // For now just directly print to console.\r\n // Work Item to address this: http://osgvsowi/24861651\r\n console.log(\"logger.info:\", message);\r\n } else {\r\n this.logger.info(message);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Log error message.\r\n * @param message - Message to log\r\n */\r\n public logError(message: string): void {\r\n this.logger.error(message);\r\n }\r\n\r\n /**\r\n * Lazy log console message. Use this when the message being constructed is complex or expensive so that it's only evaluated if needed.\r\n * Note that the callback is not invoked and the message is not output unless you're in debug mode.\r\n * @param getMessage - The function to call to get message to log\r\n */\r\n public logCallback(getMessage: () => string): void {\r\n this.logger.infoCallback(getMessage);\r\n }\r\n\r\n /**\r\n * Log the object to the console.\r\n * Note that these are not output to the console unless you're in debug mode.\r\n * @param message - Array of messages to log\r\n */\r\n public logObjects(...message: any[]): void {\r\n if (this.isDebug()) {\r\n if (canUseDOM() && this.windowObj) {\r\n this.windowObj.console.log(...message);\r\n } else {\r\n console.log(\"logger.logObjects:\", ...message);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Set logger log level.\r\n */\r\n private setupLogLevel(): void {\r\n // Note that we need to set the level at the root logger level or else the callback versions of the logging\r\n // methods will still be invoked to disseminate the message to the appenders.\r\n this.logger.setLevel(this.isDebug() ? LogLevel.Info : LogLevel.Error);\r\n this.setupAppenders();\r\n }\r\n\r\n /**\r\n * Add relevant appenders to the logger depending.\r\n */\r\n private setupAppenders(): void {\r\n this.logger.removeAllAppenders();\r\n if (canUseDOM()) {\r\n this.logger.addAppender(new BrowserConsoleAppender(this.logger.getLevel()));\r\n } else {\r\n this.logger.addAppender(new NodeConsoleAppender(this.logger.getLevel()));\r\n }\r\n }\r\n\r\n /**\r\n * Utility method to extract query string param in url.\r\n * @param name - Query param name\r\n * @returns Query param value\r\n */\r\n private getQueryParameterByName(locationHref: string, name: string): string {\r\n\r\n const nameRegEx = name.replace(/[\\[\\]]/g, \"\\\\$&\");\r\n const regex: any = new RegExp(\"[?&]\" + nameRegEx + \"(=([^&#]*)|&|#|$)\");\r\n\r\n const queryNameValueMatches: any = regex.exec(locationHref);\r\n if (!queryNameValueMatches) {\r\n return null;\r\n }\r\n\r\n // the second group would contain the value of the param\r\n let queryValue = queryNameValueMatches[2];\r\n\r\n return decodeURIComponent(queryValue.replace(/\\+/g, \" \")) || \"\";\r\n }\r\n}\r\n\r\nexport const logger = Logger.defaultInstance;","// © Microsoft Corporation. All rights reserved.\r\n\r\n// Front Door issues an activityID (which we refer to as a RID) per page view and we use this ID in tracking and ad calls,\r\n// There are specific circumstances where we need a unique GUID for every event, for example when navigating between slideshow images or refreshing ads withoug a page refresh\r\n// example usage:\r\n// mediator.pub(\"updatePageInstance\");\r\n// var trackInfoRequestId = pageInstance.getRequestId() || trackInfo.sitePage.requestId;\r\n\r\nimport guidGen from \"./guidGen\";\r\nimport mediator from \"./mediator\";\r\nimport telemetryConstants from \"./telemetryconstants\";\r\n\r\nvar rid;\r\nvar pageInstanceEventName = \"updatePageInstance\";\r\nvar updatePageInstance = function () {\r\n rid = guidGen().replace(/-/g, \"\");\r\n\r\n mediator.pub(telemetryConstants.ResetIdx);\r\n\r\n // replace the impression guid for bing search box\r\n var form = document.body.querySelector(\"#srchfrm\");\r\n if (form) {\r\n var refigInputs = form.querySelectorAll(\"input[name='refig']\");\r\n var length = refigInputs.length;\r\n for (var i = 0; i < length; i++) {\r\n // @ts-ignore\r\n refigInputs[i].value = rid;\r\n }\r\n }\r\n};\r\n\r\nmediator.sub(pageInstanceEventName, updatePageInstance);\r\n\r\nexport default {\r\n getRequestId: function() { return rid; },\r\n setRequestId: function (newRequestId) {\r\n rid = newRequestId;\r\n\r\n // Reset eventIndex (telemetry related params) everytime requestId gets set\r\n mediator.pub(telemetryConstants.ResetIdx);\r\n },\r\n eventName: pageInstanceEventName,\r\n\r\n // exposing direct call to updatePageInstance to eliminate delay rid update\r\n // when executed via mediator.pub\r\n updatePageInstance: updatePageInstance\r\n };\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Enum for different app types\r\n * @enum\r\n */\r\nexport enum AppType {\r\n Edge = \"edge\",\r\n EdgeChromium = \"edgeChromium\",\r\n Hub = \"hub\",\r\n MicrosoftNews = \"microsoftNews\",\r\n MMX = \"mmx\",\r\n Office = \"office\",\r\n Views = \"views\",\r\n Windows = \"windows\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * An enumeration indicating the MSA sign in status for the page.\r\n */\r\nexport enum SignedInStatus {\r\n Unknown,\r\n NotSignedIn,\r\n SignedIn\r\n}\r\n\r\n/**\r\n * The various account types that we support in Peregrine, this enum can be modified as new types are added\r\n * 0 - MSA\r\n * 1 - AAD\r\n * 2 - SignedOut\r\n */\r\nexport enum AccountType {\r\n MSA = 0,\r\n AAD = 1,\r\n SignedOut = 2\r\n}\r\n\r\n/**\r\n * Note: these values are used by the Telemetry team and must remain in the following order:\r\n * 0 - NonAadAccount\r\n * 1 - AadAccount\r\n * 2 - Unknown\r\n */\r\nexport enum AadAccountType {\r\n NonAadAccount = 0,\r\n AadAccount = 1,\r\n Unknown = 2\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { toNumber as _toNumber, isString } from \"lodash-es\";\r\n\r\nexport type KeyValuePair = { key: K, value: V };\r\nexport type KeyValueArray = KeyValuePair[];\r\n\r\nexport namespace Utility {\r\n /**\r\n * Check if given value is not null. Returns true when not null, otherwise false.\r\n *\r\n * @export\r\n * @param {any} value - Value to check for not null\r\n * @return {boolean}\r\n */\r\n export function isNotNullOrUndefined(value: any): boolean {\r\n return typeof value !== \"undefined\" && value !== null;\r\n }\r\n\r\n export interface IHashable {\r\n /**\r\n * This function will return the string representation of the complex object\r\n * @type {function}\r\n */\r\n toString(): string;\r\n }\r\n\r\n /**\r\n * Check if given value is defined. Returns true when defined, otherwise false.\r\n *\r\n * @export\r\n * @param {any} value - Value to check for defined\r\n * @return {boolean}\r\n */\r\n export function isDefined(value: any): boolean {\r\n return (typeof value !== \"undefined\");\r\n }\r\n\r\n /**\r\n * Check if a given value is a valid key value pair\r\n *\r\n * @export\r\n * @param potentialKeyValuePair\r\n * @return {boolean}\r\n */\r\n export function isKeyValuePair(potentialKeyValuePair: { key: K, value: V },\r\n isKey: (key: K) => boolean,\r\n isValue: (value: V) => boolean ): boolean {\r\n return Utility.isNonNullObject(potentialKeyValuePair)\r\n && isKey(potentialKeyValuePair.key)\r\n && isValue(potentialKeyValuePair.value);\r\n }\r\n\r\n /**\r\n * Check if given value is a non null object. Returns true when value is non null , otherwise false.\r\n *\r\n * @export\r\n * @param {any} value - Value to check for non null\r\n * @return {boolean}\r\n */\r\n export function isNonNullObject(value: any): boolean {\r\n return value && typeof value === \"object\";\r\n }\r\n\r\n /**\r\n * Check if given value is not null. Returns true when not null, otherwise false.\r\n *\r\n * @export\r\n * @param {any} value - Value to check for not null\r\n * @return {boolean}\r\n */\r\n export function isNotNull(value: any): boolean {\r\n return value !== null;\r\n }\r\n\r\n /**\r\n * Check if given value is a a non-null or non-empty string. Returns true when it is, otherwise false.\r\n *\r\n * @export\r\n * @param {string} value - Value to check for string\r\n * @return {boolean}\r\n */\r\n export function isNullOrWhiteSpace(value: string): boolean {\r\n return !isString(value) || value.trim() === \"\";\r\n }\r\n\r\n /**\r\n * Converts string to number\r\n *\r\n * @export\r\n * @param {string} value - string to convert to a number\r\n * @param {number} defaultValue - number to return if there is an error\r\n * @return {number}\r\n */\r\n export function toNumber(value: string, defaultValue: number = -1): number {\r\n if (!value) {\r\n return defaultValue;\r\n }\r\n\r\n const result = _toNumber(value);\r\n if (!isNaN(result)) {\r\n return result;\r\n } else {\r\n return defaultValue;\r\n }\r\n }\r\n\r\n /**\r\n * Check if given value is an array with content in it.\r\n * Returns true when value is an array with content, otherwise false.\r\n *\r\n * @export\r\n * @param {any[]} value - Value to check for array with content\r\n * @return {boolean}\r\n */\r\n export function arrayHasData(value: any[]): boolean {\r\n if (isNotNullOrUndefined(value)) {\r\n return ((value.constructor === Array) && (value.length > 0));\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Check if given value is a string with content in it.\r\n * Returns true when value is a string with content, otherwise false.\r\n *\r\n * @export\r\n * @param {string} value - Value to check for string with content\r\n * @return {boolean}\r\n */\r\n export function stringHasData(value: string): boolean {\r\n return (isString(value) && (value.trim().length > 0));\r\n }\r\n\r\n /**\r\n * Convert object to string representation for it's values.\r\n * @param {object} object - The object to convert\r\n * @returns {string}\r\n */\r\n export function objectToString(object: object): string {\r\n let value = \"\";\r\n let firstRun = true;\r\n\r\n if (typeof object !== \"object\") {\r\n return value;\r\n }\r\n\r\n // tslint:disable-next-line:forin\r\n for (let attribute in object) {\r\n if (typeof object[attribute] === \"object\") {\r\n value += firstRun ? `${objectToString(object[attribute])}` : `-${objectToString(object[attribute])}`;\r\n } else {\r\n value += firstRun ? `${object[attribute]}` : `-${object[attribute]}`;\r\n }\r\n\r\n firstRun = false;\r\n }\r\n\r\n return value;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionMap } from \"@msnews/experiences-redux\";\r\nimport { ExperienceDeferralInfo } from \"./data-model/ExperienceDeferralInfo\";\r\nimport { ExperienceLoadingState } from \"./data-model/ExperienceLoadingState\";\r\nimport { MilestonePlugin } from \"./data-model\";\r\n\r\ntype UpdateExperienceCurrentStateSignature = (\r\n /** Experience Type - Defines an experience */\r\n experienceType: string,\r\n\r\n /** Current Milestone of the experience e.g initialized, loaded, deferred etc */\r\n currentState: ExperienceLoadingState,\r\n\r\n /** Associated Experience Group */\r\n experienceGroup?: string,\r\n\r\n /** Defines an instance of the Experience */\r\n experienceInstance?: string\r\n) => void;\r\n\r\ntype UpdateExperienceDeferralSignature = (\r\n /** Tracks deferral information used by an experience to determine when it should load/render */\r\n deferralInfo: ExperienceDeferralInfo,\r\n\r\n /** Experience Type - Defines an experience */\r\n experienceType: string,\r\n\r\n /** Associated Experience Group */\r\n experienceGroup?: string,\r\n\r\n /** Defines an instance of the Experience */\r\n experienceInstance?: string\r\n) => void;\r\n\r\ntype UpdateTimingSignature = (\r\n /** Experience Type - Defines an experience */\r\n experienceType: string,\r\n\r\n /** Associated Experience Group */\r\n experienceGroup?: string,\r\n\r\n /** Defines an instance of the Experience */\r\n experienceInstance?: string,\r\n\r\n /** start time fo the milestone e.g. startTime of loaded milestone */\r\n startTime?: number,\r\n\r\n /** end time fo the milestone e.g. endTime of loaded milestone */\r\n endTime?: number\r\n) => void;\r\n\r\ntype UpdatePluginSignature = (\r\n /** Plugins to add additional behaviors in page lifecycle events */\r\n plugins: MilestonePlugin[]\r\n) => void;\r\n\r\ntype UpdatePageTimingSignature = (endTime?: number) => void;\r\n\r\ntype UpdateBelowTheFoldTransitionSignature = (start?: boolean) => void;\r\n\r\n/**\r\n * Actions for the Milestone Data Connector\r\n * @class\r\n */\r\nexport class MilestoneDataActions {\r\n /** Static instance with references to the ActionMaps. */\r\n private static _instance: MilestoneDataActions = new MilestoneDataActions();\r\n\r\n /** Action to trigger above the fold timing updates */\r\n private _updateAboveTheFoldVisuallyReady: ActionMap\r\n = new ActionMap(\"updateAboveTheFoldVisuallyReady\");\r\n\r\n /** Action to trigger below the fold transition updates */\r\n private _updateBelowTheFoldTransitionStart: ActionMap\r\n = new ActionMap(\"updateBelowTheFoldTransitionStart\");\r\n\r\n /** Action to trigger when deferring an experience load */\r\n private _updateExperienceLoadDeferralState: ActionMap\r\n = new ActionMap(\"updateExperienceLoadDeferralState\");\r\n\r\n /** Action to trigger when updating current state of experience in load/render life-cycle */\r\n private _updateExperienceCurrentState: ActionMap\r\n = new ActionMap(\"updateExperienceCurrentState\");\r\n\r\n /** Action to trigger when deferring an experience render */\r\n private _updateExperienceRenderDeferralState: ActionMap\r\n = new ActionMap(\"updateExperienceRenderDeferralState\");\r\n\r\n /** Action to trigger when experience load initiates */\r\n private _updateInitTiming: ActionMap\r\n = new ActionMap(\"UpdateInitTiming\");\r\n\r\n /** Action to trigger page complete timing updates */\r\n private _updatePageComplete: ActionMap\r\n = new ActionMap(\"updatePageCompleteTiming\");\r\n\r\n /** Action to trigger when experience instance completed render */\r\n private _updateRenderTiming: ActionMap\r\n = new ActionMap(\"UpdateRenderTiming\");\r\n\r\n /** Action to trigger when experience instance is visually ready */\r\n private _updateVisuallyReadyTiming: ActionMap\r\n = new ActionMap(\"UpdateVisuallyReadyTiming\");\r\n\r\n /** Action to trigger when experience instance is DOM complete */\r\n private _updateDomCompleteTiming: ActionMap\r\n = new ActionMap(\"UpdateDomCompleteTiming\");\r\n\r\n /** Action to trigger when adding/updating milestone plugin */\r\n private _updateMilestonePlugins: ActionMap\r\n = new ActionMap(\"updateMilestonePlugin\");\r\n\r\n /** Public getter for action */\r\n public static get updateAboveTheFoldVisuallyReady(): ActionMap { return this._instance._updateAboveTheFoldVisuallyReady; }\r\n /** Public getter for action */\r\n public static get updateBelowTheFoldTransitionStart(): ActionMap { return this._instance._updateBelowTheFoldTransitionStart; }\r\n /** Public getter for action */\r\n public static get updateExperienceLoadDeferralState(): ActionMap { return this._instance._updateExperienceLoadDeferralState; }\r\n /** Public getter for action */\r\n public static get updateExperienceCurrentState(): ActionMap { return this._instance._updateExperienceCurrentState; }\r\n /** Public getter for action */\r\n public static get updateExperienceRenderDeferralState(): ActionMap { return this._instance._updateExperienceRenderDeferralState; }\r\n /** Public getter for action */\r\n public static get updateInitTiming(): ActionMap { return this._instance._updateInitTiming; }\r\n /** Public getter for action */\r\n public static get updatePageComplete(): ActionMap { return this._instance._updatePageComplete; }\r\n /** Public getter for action */\r\n public static get updateRenderTiming(): ActionMap { return this._instance._updateRenderTiming; }\r\n /** Public getter for action */\r\n public static get updateVisuallyReadyTiming(): ActionMap { return this._instance._updateVisuallyReadyTiming; }\r\n /** Public getter for action */\r\n public static get updateDomCompleteTiming(): ActionMap { return this._instance._updateDomCompleteTiming; }\r\n /** Public getter for action */\r\n public static get updateMilestonePlugins(): ActionMap { return this._instance._updateMilestonePlugins; }\r\n\r\n /** Get a reference to the current MilestoneDataActions instance. */\r\n public static getInstance(): MilestoneDataActions {\r\n return this._instance;\r\n }\r\n\r\n /** Reset the static instance. Useful when server side rendering. */\r\n public static resetInstance(): void {\r\n this._instance = new MilestoneDataActions();\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n/**\r\n * Defines valid loading states for an experience\r\n * The state has been defined as it happens. Please do not update the ordering or the numeric value of states.\r\n * If the numeric value of the state is updated this will break internal logic.\r\n */\r\nexport enum ExperienceLoadingState {\r\n\r\n /**\r\n * The experience has not been started yet\r\n */\r\n notStarted = 1,\r\n\r\n /**\r\n * The experience loading has been deferred\r\n */\r\n loadDeferred = 2,\r\n\r\n /**\r\n * The experience is coming out of loadDeferred state and is now resolved to be loaded.\r\n */\r\n resolvedForLoad = 3,\r\n\r\n /**\r\n * The experience has been loaded (i.e. the bundle has been downloaded and parsed, and the connector created)\r\n */\r\n loaded = 4,\r\n\r\n /**\r\n * The experience initialized milestone has been reached\r\n */\r\n initialized = 5,\r\n\r\n /**\r\n * The experience render has been deferred\r\n */\r\n renderDeferred = 6,\r\n\r\n /**\r\n * The experience is coming out of renderDeferred state and is now resolved to be rendered.\r\n */\r\n resolvedForRender = 7,\r\n\r\n /**\r\n * The experience rendered milestone has been reached (render function has been completed)\r\n */\r\n rendered = 8,\r\n\r\n /**\r\n * The experience DOM complete milestone has been reached\r\n */\r\n domComplete = 10,\r\n\r\n /**\r\n * The initial render of the experience has completed. All initial DOM elements have been created, and the browser has completed all render\r\n * task (applying styles, animations, etc)\r\n */\r\n visuallyReady = 11,\r\n\r\n /**\r\n * The experience encountered an error during loading\r\n */\r\n error = 12\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { canUseDOM, getLocationSearch } from \"@msnews/isomorphic-util/\";\r\n\r\n/**\r\n * Defines telemetryReadyCallback() which queues a function to be called after the page is revealed.\r\n * This is specific for telemetry package and should not be used for preload dependent features.\r\n * Telemetry can't have a reference to preload since preload references experiences-redux which\r\n * then references telemetry which causes a problem.\r\n * This helper is specific to queuing telemetry calls when needed and invoking the queued calls once\r\n * the preload page is revealed.\r\n */\r\n\r\nlet queuedCalls: Function[] = [];\r\nconst locationSearch = getLocationSearch();\r\nlet isPreload = locationSearch.match(/backgroundpreload/) ? true : false;\r\nlet pageRevealed = false;\r\n\r\nlet trackValuesUpdated = true;\r\n\r\n// Check and add an event listener if page has been pre-loaded but not yet revealed.\r\nif (canUseDOM() && isPreload && document.visibilityState !== \"visible\") {\r\n document.addEventListener(\"visibilitychange\", onVisibilityChange);\r\n} else {\r\n pageRevealed = true;\r\n}\r\n\r\n/** Event handler for page visibility change */\r\nfunction onVisibilityChange(): void {\r\n if (canUseDOM()) {\r\n document.removeEventListener(\"visibilitychange\", onVisibilityChange);\r\n }\r\n pageRevealed = true;\r\n checkAndFireQueuedCalls();\r\n}\r\n\r\n/** Event handler to run once track values have been updated by respective entities */\r\nfunction onTrackValuesUpdated(): void {\r\n if (canUseDOM()) {\r\n document.removeEventListener(\"trackvaluesupdated\", onTrackValuesUpdated);\r\n }\r\n trackValuesUpdated = true;\r\n checkAndFireQueuedCalls();\r\n}\r\n\r\n/** Helper method to check if all conditions have been satisfied and then fire queued up telemetry beacons */\r\nfunction checkAndFireQueuedCalls(): void {\r\n if (trackValuesUpdated && pageRevealed) {\r\n while (queuedCalls.length) {\r\n let item = queuedCalls.shift();\r\n if (typeof item === \"function\") {\r\n item();\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** If config dictates to wait for page settings to update track values, set trackValuesUpdated to false and add an event listener for trackvaluesupdated. */\r\nexport function waitForPageSettingsTrackUpdate(waitForPageSettingsToUpdateTrack: boolean): void {\r\n if (!waitForPageSettingsToUpdateTrack) {\r\n return;\r\n }\r\n\r\n trackValuesUpdated = false;\r\n\r\n if (canUseDOM()) {\r\n // Add an event listener to listen for a signal indicating track values have been updated.\r\n document.addEventListener(\"trackvaluesupdated\", onTrackValuesUpdated);\r\n }\r\n}\r\n\r\n/**\r\n * If the page is revealed then just call the callback, if not then queue it up\r\n *\r\n * @param {function(object): void} callback - The callback function.\r\n * @returns {void}\r\n */\r\nexport function telemetryReadyCallback(callback: Function): void {\r\n\r\n if (pageRevealed && trackValuesUpdated) {\r\n callback();\r\n } else {\r\n queuedCalls.push(callback);\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { assign, get, merge, set } from \"lodash-es\";\r\n\r\nimport { ConnectorConstants } from \"../constants/ConnectorConstants\";\r\nimport { ConnectorNamespaces } from \"@msnews/experiences-constants\";\r\nimport { IActionPayload } from \"./IActionPayload\";\r\nimport { IDataConnector } from \"../connectors/IDataConnector\";\r\nimport { IReducer } from \"./IReducer\";\r\nimport { dataConnectorInjector } from \"./DataConnectorInjector\";\r\nimport { isNullOrUndefined } from \"util\";\r\n\r\n/** Resolve & Reject Function Signature */\r\ntype ResolveConnectorSignature = (connector: IDataConnector) => void;\r\ntype RejectConnectorSignature = (error: Error) => void;\r\n\r\n/**\r\n * Pending getDataConnector Promise\r\n */\r\ninterface PendingConnectorPromise {\r\n /** Promise */\r\n promise: Promise>;\r\n /** callback to resolve the promise */\r\n resolve: ResolveConnectorSignature;\r\n /** callback to reject the promise */\r\n reject: RejectConnectorSignature;\r\n}\r\n\r\n/** Result from running a reducer. */\r\ninterface ReducerResult {\r\n /** The new state calculated by the reducer */\r\n newState: any;\r\n\r\n /** True if the state changed. */\r\n stateChanged: boolean;\r\n}\r\n\r\n/**\r\n * A reducer that can dynamically add and remove individual sub-reducers\r\n * @class\r\n */\r\nexport class DynamicReducer {\r\n\r\n /**\r\n * A map of connectors, which maintain the sub-spaced state. Reducers and connectors are keyed by namespace\r\n */\r\n private readonly _connectorMap: {[key: string]: IDataConnector} = {};\r\n\r\n /**\r\n * The list of global connectors. Used for fast lookup instead of iterating through _connectorMap keys and toArray methods.\r\n */\r\n private readonly _globalConnectors: IDataConnector[] = [];\r\n\r\n /**\r\n * The list of all connectors. Used for fast lookup instead of iterating through _connectorMap keys and toArray methods.\r\n */\r\n private readonly _allConnectors: IDataConnector[] = [];\r\n\r\n /**\r\n * The list of all pending promises for the get data connector call. Used to resolve the promise when data connector is instantiated.\r\n */\r\n private readonly _getDataConnectorPendingPromises: Map = new Map();\r\n\r\n /**\r\n * Creates an instance of the `DynamicReducer` class.\r\n * @constructor\r\n * @param {string} type The action type.\r\n */\r\n constructor() {\r\n // bind the reduce method to this instance\r\n this.reduce = this.reduce.bind(this);\r\n }\r\n\r\n /**\r\n * Returns an array of connectors that have their reducers registered with this instance\r\n * @method\r\n * @returns {IDataConnector} A simple arry of all connectors\r\n */\r\n public connectors(): IDataConnector[] {\r\n return this._allConnectors;\r\n }\r\n\r\n /**\r\n * Returns an array of connectors that have their reducers registered with this instance\r\n * @method\r\n * @param {string} namespace The namespace of the connector to return, if it is in the map\r\n * @returns {IDataConnector | undefined} A simple arry of all connectors\r\n */\r\n public connector(namespace: string): IDataConnector | undefined {\r\n return (this._connectorMap[namespace]);\r\n }\r\n\r\n /**\r\n * Returns an array of connectors that have state that is global\r\n * @method\r\n * @returns {IDataConnector} A simple arry of connectors that have global state\r\n */\r\n public globalConnectors(): IDataConnector[] {\r\n return this._globalConnectors;\r\n }\r\n\r\n /**\r\n * Returns a promise which resolves immediately if the data connector is already present on the page,\r\n * otherwise resolves when the data connector is instantiated on the Page later in the lifecycle.\r\n * @method\r\n * @param namespace The namespace of data connector to return\r\n */\r\n public getDataConnector(namespace: ConnectorNamespaces): Promise> {\r\n // Check for data connector, if it is already present resolve immediately\r\n const dataConnector = this.connector(namespace);\r\n if (dataConnector) {\r\n return Promise.resolve(dataConnector);\r\n }\r\n\r\n // Check if we have an entry for the namespace in pending promise map, if present return the same promise\r\n const pendingPromise = this._getDataConnectorPendingPromises.get(namespace);\r\n if (pendingPromise) {\r\n return pendingPromise.promise;\r\n }\r\n\r\n // If the data connector is not on the page and has no entry in the pending promise map, create a new promise\r\n let resolveCallback: ResolveConnectorSignature;\r\n let rejectCallback: RejectConnectorSignature;\r\n const promise = new Promise>((resolve, reject) => {\r\n // Get the reference to the resolve & reject which can be called later when the data connector is instantiated on the Page\r\n resolveCallback = resolve;\r\n rejectCallback = reject;\r\n });\r\n\r\n // Add the promise to the pending promise map\r\n this._getDataConnectorPendingPromises.set(namespace, { promise: promise, resolve: resolveCallback, reject: rejectCallback });\r\n\r\n // Return the promise\r\n return promise;\r\n }\r\n\r\n /**\r\n * Produces the next state based on the given action. The state to be reduced is an aggregate of the reducers for all of the connectors\r\n * that have been added.\r\n * The overall state looks something like:\r\n * This will be the state for the redux-subspace for the connector. It is of the form:\r\n * {\r\n * FOO: {\r\n * _@STATE@_: {\r\n * \r\n * },\r\n * BAR: {\r\n * _@STATE@_: {\r\n * \r\n * },\r\n * },\r\n * }\r\n * }\r\n * @function\r\n * @param state {any} The previous state of the application. The application state, will contain one or more sub-states, which will be individually reduced\r\n * @param actionPayload {IActionPayload} The action detail to update the state with.\r\n * @returns {any} The next state for the application, containing the next state for each connector (a.k.a subspace)\r\n */\r\n public reduce(state: any, actionPayload: IActionPayload): any {\r\n // If the initial state is undefined, then create an empty object to start with\r\n if (isNullOrUndefined(state)) {\r\n state = {};\r\n }\r\n\r\n let newState = { ...state };\r\n let stateChanged = false;\r\n\r\n // See if we need to reduce for a specific connector. This is the common case.\r\n if (actionPayload !== undefined && actionPayload.key !== undefined) {\r\n // If this is a special action, used to force a re-render, then we need to set stateChanged to true, and create a clone of the existing scoped state\r\n const typeIsString: boolean = typeof actionPayload.type === \"string\";\r\n if (typeIsString && actionPayload.type.endsWith(ConnectorConstants.renderAction)) {\r\n const statePropertyKey = actionPayload.key + \".\" + ConnectorConstants.connectorStateKey;\r\n const connectorState = assign({}, get(state, statePropertyKey, undefined));\r\n set(newState, statePropertyKey, connectorState);\r\n stateChanged = true;\r\n } else if (typeIsString && actionPayload.type.endsWith(ConnectorConstants.dataConnectorMergeInitAction)) {\r\n const experienceFullNamespace: string = actionPayload.key;\r\n const dataConnectorName: ConnectorNamespaces = actionPayload.params[0];\r\n\r\n if (dataConnectorName) {\r\n dataConnectorInjector.initializeExperience(newState, experienceFullNamespace, dataConnectorName);\r\n stateChanged = true;\r\n }\r\n } else {\r\n // If the connector doing the reducing is global, then create a deep copy of state, so that all the connected\r\n // components think the state is new, and run their mappers. Connected components are subscribed to, and only see\r\n // changed in their subspace portion of the state tree. The redux connect implementation uses strict equal comparison,\r\n // meaning it consider the state change if it is a new object reference, even if all the properties are still the same\r\n if (this._connectorMap[actionPayload.key].isGlobal) {\r\n newState = merge({}, newState);\r\n }\r\n\r\n const connectorReducerResult = this.computeNextStateForConnector(newState, actionPayload.key, actionPayload);\r\n stateChanged = connectorReducerResult.stateChanged;\r\n\r\n if (stateChanged) {\r\n // Check to see if any experiences are including this data connector state. If so, update those too.\r\n dataConnectorInjector.reportStateChange(newState, actionPayload.key, connectorReducerResult.newState);\r\n }\r\n }\r\n } else {\r\n // Iterate over the full list of connectors calling each reducer. This is not the common case, and is typically done\r\n // for actions that come from Redux, during initialization\r\n Object.keys(this._connectorMap).forEach(key => {\r\n if (this.computeNextStateForConnector(newState, key, actionPayload).stateChanged) {\r\n stateChanged = true;\r\n }\r\n });\r\n }\r\n\r\n // Return the newState, as modified by the reducer(s) if it was changed, otherwise return the original state\r\n if (stateChanged) {\r\n return newState;\r\n } else {\r\n return state;\r\n }\r\n }\r\n\r\n /**\r\n * Adds a sub reducer for a connector to the sub-reducer collection.\r\n * @method\r\n * @param {IDataConnector} connector The connector to add.\r\n */\r\n public addSubReducerForConnector(connector: IDataConnector): void {\r\n if (!connector) {\r\n throw new Error(\"The parameter 'connector' cannot be null.\");\r\n }\r\n\r\n // Add the sub-reducer and connector into their maps, based on the connector's namespace\r\n const key = connector.fullNamespace;\r\n this._connectorMap[key] = connector;\r\n\r\n // update the all and global connector fast lookup lists\r\n this._allConnectors.push(connector);\r\n\r\n if (connector.isGlobal) {\r\n this._globalConnectors.push(connector);\r\n }\r\n\r\n // Check if there is a pending promise for the data connector\r\n // DO NOT CHANGE namespace to fullnamespace, data connectors are supposed to be queried using just the namespace by design.\r\n if (this._getDataConnectorPendingPromises.has(connector.namespace)) {\r\n // Get the resolve callback for the pending promise and resolve it\r\n const pendingPromise = this._getDataConnectorPendingPromises.get(connector.namespace);\r\n\r\n try {\r\n pendingPromise.resolve(connector);\r\n } catch (error) {\r\n pendingPromise.reject(error);\r\n }\r\n\r\n // Delete the entry from the pending promise map\r\n this._getDataConnectorPendingPromises.delete(connector.namespace);\r\n }\r\n\r\n connector.store.dispatch({ key: key, type: \"@@connector-view/INIT\" });\r\n }\r\n\r\n /**\r\n * Helper method to compute the next state for a given connector. This method will get the connector's actual state\r\n * from the state tree, call the reducer, and then state the state in the passed in object that is to receive the new state\r\n * @param {any} state The current subspace (or root) state object, which will be updated\r\n * @param {string} key The key to the connector in the connector map\r\n * @param {IActionPayload} actionPayload The action to apply\r\n * @returns Information on how the connector state was changed\r\n */\r\n private computeNextStateForConnector(state: any, key: string, actionPayload: IActionPayload): ReducerResult {\r\n // Get the connector, so that we can call the reducer\r\n const connector = this._connectorMap[key];\r\n\r\n // Setup the key and get the actual state property for the connector. lodash uses dotted notation\r\n // so the key will be something like: namespace._@STATE@_\r\n const statePropertyKey = key + \".\" + ConnectorConstants.connectorStateKey;\r\n const connectorPreviousState = get(state, statePropertyKey, undefined);\r\n\r\n // Call the reducer for the connector, and validate that we received a state object back.\r\n const nextStateForConnector = this.subReduce(connector.reducer, connectorPreviousState, actionPayload);\r\n if (typeof nextStateForConnector === \"undefined\") {\r\n throw new Error(\"Reducer for: \" + key + \" must not return undefined.\");\r\n }\r\n\r\n // If the state changed, then set the new connector state in the overall state object\r\n const connectorStateChanged: boolean = nextStateForConnector !== connectorPreviousState;\r\n if (connectorStateChanged) {\r\n set(state, statePropertyKey, nextStateForConnector);\r\n }\r\n\r\n return { newState: nextStateForConnector, stateChanged: connectorStateChanged };\r\n }\r\n\r\n /**\r\n * Calls the reducer that has been registered to handle the state associated with a specific subspace\r\n * @param {Reducer} reducer The reducer to call\r\n * @param {TSubReducerState} state The state object for the subreducer\r\n * @param {IActionPayload} actionPayload The action to apply\r\n */\r\n private subReduce(reducer: IReducer, previousState: TSubReducerState, actionPayload: IActionPayload): TSubReducerState {\r\n const reducedState: TSubReducerState = reducer.reduce(previousState, actionPayload);\r\n if (reducedState !== previousState) {\r\n return reducedState;\r\n } else {\r\n return previousState;\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { captureJssGeneratedClasses } from \"@msnews/render-cache\";\r\nimport { registerResetCallback } from \"@msnews/core\";\r\n\r\n/**\r\n * Weak map which is used to store DesignSystem to GenerateClassName Callback.\r\n */\r\nlet designSystemMap = new WeakMap();\r\n\r\n/**\r\n * Map which will store number of DesignSystem appearances with same name.\r\n */\r\nlet designSystemIndexMap = new Map();\r\n\r\n/**\r\n * Register a callback to reset the designSystem globals.\r\n * The callback is registered once when the module is loaded and invoked once on the server side at the beginning of each request.\r\n */\r\nregisterResetCallback(() => {\r\n designSystemMap = new WeakMap();\r\n designSystemIndexMap = new Map();\r\n});\r\n\r\n/**\r\n * JSS callback function that defines the class name generation logic\r\n * The default jss manager class name generation logic increments counter based on order\r\n * of how the experiences are rendered. We cannot guarantee the order due to async nature\r\n * of experiences which potentially causes different class names on every reload/refresh.\r\n * Instead here with this callback, we start the counter from 1 per rule to ensure class\r\n * names stays consistent irrespective of when they are rendered.\r\n *\r\n * Design system is taken into account since a change in it can result in potential different\r\n * styling being needed even if that rule was already used in a previous design system.\r\n *\r\n * For example:\r\n * For TopSites, with this override the class name would be generated as \"topSites-DS-default1-1\"\r\n * (jss manager by default would have generated it something like \"topSites-0-1-305\")\r\n * If the design system were to be updated and the same rule would be passed then you would\r\n * get topsites-DS-default2-1.\r\n */\r\nexport function createGenerateClassName(designSystem: any): (rule: any, sheet: any) => string {\r\n if (!designSystem) {\r\n return;\r\n }\r\n\r\n let callback = designSystemMap.get(designSystem);\r\n\r\n if (!callback) {\r\n const dsName = designSystem.name || \"unknown\";\r\n const dsIndex = designSystemIndexMap.get(dsName) + 1 || 1;\r\n let rulesMap: any = {};\r\n callback = (rule: any, sheet: any) => {\r\n const key = rule.key;\r\n\r\n if (!rulesMap[key]) {\r\n rulesMap[key] = 1;\r\n } else {\r\n rulesMap[key]++;\r\n }\r\n\r\n const name = `DS-${dsName}${dsIndex}-${rulesMap[key]}`;\r\n captureJssGeneratedClasses(key, name);\r\n\r\n return `${key}-${name}`;\r\n };\r\n\r\n designSystemMap.set(designSystem, callback);\r\n designSystemIndexMap.set(dsName, dsIndex);\r\n }\r\n\r\n return callback;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Provider, connect } from \"react-redux\";\r\nimport { Store, StoreEnhancer, compose, createStore } from \"redux\";\r\nimport { getPageTimings, logger, perfMarker } from \"@msnews/diagnostics\";\r\n\r\nimport { DynamicReducer } from \"../reducers\";\r\nimport { IDataConnector } from \"../connectors/IDataConnector\";\r\nimport { JSSManager } from \"@microsoft/fast-jss-manager-react\";\r\nimport React from \"react\";\r\nimport ReactDom from \"react-dom\";\r\nimport { applyMiddleware } from \"redux-subspace\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\nimport { create } from \"jss\";\r\nimport { createGenerateClassName } from \"./PageHelper\";\r\nimport { getStateFromRenderCache } from \"@msnews/render-cache\";\r\nimport jssGlobal from \"jss-global\";\r\nimport jssNested from \"jss-nested\";\r\n\r\ndeclare global {\r\n interface Window {\r\n /**\r\n * Boolean flag to indicate if this is an SSR page or not\r\n */\r\n SSR: boolean;\r\n\r\n /**\r\n * Enable redux devtools extension debugging\r\n */\r\n __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: any;\r\n\r\n /**\r\n * Boolean flag to indicate if render cache hydration is happening\r\n */\r\n needsHydrate?: boolean;\r\n }\r\n}\r\n\r\n/**\r\n * Page Base.\r\n * Each page or hybrid page/experience must have an instance of the PageBase, which contains the the store, and dynamic reducer\r\n * for the experience/app.\r\n * PageBase is setup as a singleton, so the proper usage in consumers is:\r\n * var pageBase = PageBase.getInstance();\r\n * @export\r\n * @class\r\n */\r\nclass PageBase {\r\n /**\r\n * The singleton instance of this class\r\n * @type: {PageBase}\r\n */\r\n private static _instance: PageBase;\r\n\r\n /**\r\n * The Dynamic reducer for this app/experience\r\n * @type: {DynamicReducer}\r\n */\r\n private _rootReducer: DynamicReducer;\r\n\r\n /**\r\n * The Redux store containing the top level application state. All component and data connectors will manage namespaced subspaces within\r\n * this store\r\n * @type {Store}\r\n */\r\n private _store: Store;\r\n\r\n /**\r\n * Constructor for PageBase class\r\n * @constructor\r\n * @param {any} initialState Optional initial redux state provided as part of SSR response during hydration\r\n */\r\n private constructor(initialState?: any) {\r\n /**\r\n * In debug build, add the option to turn on redux-devtools-extension debugging.\r\n * More info here https://github.com/zalmoxisus/redux-devtools-extension\r\n */\r\n let enhancer: StoreEnhancer;\r\n const middlewares: any = [];\r\n if ((canUseDOM() && logger) ? logger.isDebug() : false) {\r\n const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, traceLimit: 25 }) || compose;\r\n enhancer = composeEnhancers(applyMiddleware(...middlewares)\r\n );\r\n } else {\r\n enhancer = applyMiddleware(...middlewares);\r\n }\r\n\r\n // Create the root reducer\r\n this._rootReducer = new DynamicReducer();\r\n\r\n // Check to see if this app instance was bootstrapped with a render-cache\r\n initialState = initialState || (canUseDOM() && window.needsHydrate && getStateFromRenderCache()) || {};\r\n\r\n // create the store with a basic root reducer\r\n this._store = createStore(this.rootReducer.reduce, initialState, enhancer);\r\n\r\n }\r\n\r\n /**\r\n * Reset PageBase. Useful when handling multiple requests when server side rendering.\r\n */\r\n public static resetPageBaseInstance(initialState?: any): void {\r\n this._instance = new PageBase(initialState);\r\n }\r\n\r\n /**\r\n * Gets the Redux store for this app/experience\r\n * @method\r\n * @returns {Store} The overall state for the App, which contains sub-states for each connector\r\n */\r\n public get store(): Store {\r\n return this._store;\r\n }\r\n\r\n /**\r\n * Gets the root reducer for this app/experience\r\n * @returns {DynamicReducer} The reducer for the app/experience\r\n */\r\n public get rootReducer(): DynamicReducer {\r\n return this._rootReducer;\r\n }\r\n\r\n /**\r\n * Gets the singleton instance of this class for the app/experience\r\n * @returns {PageBase} The instance of PageBase for the page/hybrid experience\r\n */\r\n public static getInstance(initialState?: any): PageBase {\r\n return this._instance || (this._instance = new this(initialState));\r\n }\r\n\r\n /**\r\n * Starts the application by calling the onApplicationStart method for each connector that has been added to the app.\r\n * @function\r\n * @method\r\n */\r\n public start(): void {\r\n // Iterate over all of the connector's and call their OnApplicationStart method\r\n const allConnectors: IDataConnector[] = this.rootReducer.connectors();\r\n allConnectors.forEach(connector => connector.onApplicationStart());\r\n }\r\n\r\n /**\r\n * Creates and renders a root element, that is connected to the store.\r\n * The root element will created with the passed in connected element as a child.\r\n * @function\r\n * @param {React.ReactElement} connectedTopLevelElement The top level rendering element for the page/application.\r\n * @param {HTMLElement} hostElement The host element (usuall a
) to contain the msnews-experiences-redux application\r\n * @param {Function} callback An optional callback to be fired after hydration is complete, used when hydrating server side rendered content.\r\n * @method\r\n */\r\n public renderRootElement(connectedTopLevelElement: React.ReactElement, hostElement: HTMLElement, callback?: Function): void {\r\n // Update the base JSS manager instance\r\n this.updateJssManagerInstance();\r\n\r\n // Create a ReactElement, that contains the Redux provider with the store, passing the incomming top level element in as a child, so that\r\n // the pageElement wraps the top level element with the redux store\r\n const rootElement = React.createElement(Provider, { store: this._store }, connectedTopLevelElement);\r\n\r\n // Capture Render cache state in page timings\r\n let pageTimings = getPageTimings();\r\n\r\n if (window.needsHydrate) {\r\n ReactDom.hydrate(rootElement, hostElement);\r\n pageTimings[\"isRenderCachePresent\"] = 1;\r\n window.needsHydrate = false;\r\n } else if (window.SSR) {\r\n pageTimings[\"isRenderCachePresent\"] = 0;\r\n perfMarker.startMark(\"SSR.Hydrate\");\r\n ReactDom.hydrate(rootElement, hostElement, callback);\r\n } else {\r\n pageTimings[\"isRenderCachePresent\"] = 0;\r\n ReactDom.render(rootElement, hostElement);\r\n }\r\n }\r\n\r\n /**\r\n * Updates the base JSSManager instance with the correct default plugins\r\n */\r\n public updateJssManagerInstance(): void {\r\n const jssInstance: ReturnType = create({\r\n plugins: [jssNested(), jssGlobal()]\r\n });\r\n\r\n JSSManager.createGenerateClassName = createGenerateClassName;\r\n JSSManager.jss = jssInstance;\r\n }\r\n}\r\n\r\nexport default PageBase;","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\nlet savedMuid: string = null;\r\n\r\n/**\r\n * Returns the cookie content given a name\r\n *\r\n * @param name {string} - cookie name\r\n * @returns the value of the cookie or `null`, if the key is not found.\r\n */\r\nexport function getCookie(name: string): string {\r\n if (canUseDOM() && document && document.cookie) {\r\n var re = new RegExp(\"\\\\b\" + name + \"\\\\s*=\\\\s*([^;]*)\", \"i\");\r\n var match = re.exec(document.cookie);\r\n return (match && match.length > 1 ? match[1] : null);\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Helper function that retrieves the MUID from the document.cookie\r\n * or uses the saved value if the cookie was retrieved for the current page instance\r\n */\r\nexport function getMuidCookie(): string {\r\n return savedMuid || (savedMuid = getCookie(\"MUID\"));\r\n}\r\n\r\n/**\r\n * Helper function used to set a cookie\r\n * NOTE: THIS BYPASSES ANY GDPR CHECK AND HENCE ONLY REQUIRED FUNCTIONAL COOKIES SHOULD BE SET USING THIS\r\n * IF YOU DO NOT KNOW IF YOUR COOKIE IS ONE THEN PLEASE USE Cookies.ts setCookie THAT MAKES USE OF GDPR LOGIC CHECKS\r\n * When expiryDays is equal to -1 it will unset the cookie\r\n * * @param {string} name Cookie name\r\n * * @param {string} value Cookie value\r\n * * @param {number} expiryDays Cookie expiry days\r\n * * @param {string} domain Cookie domain\r\n * * @param {string} path Cookie path\r\n * * @param {boolean} secure Is it a https only cookie\r\n */\r\nexport function setRequireFunctionalCookie(name: string, value: string, expiryDays?: number, domain?: string, path?: string, secure?: boolean): void {\r\n let expiryDate;\r\n const builder = [name, \"=\", value];\r\n if (-1 === expiryDays) {\r\n // Expires date format is supposed to be in GMT.\r\n expiryDate = \"Fri, 31 Dec 1999 23:59:59 GMT\";\r\n } else if (expiryDays) {\r\n const date = new Date();\r\n date.setTime(date.getTime() + (expiryDays * 86400000)); // 86400000 == 24*60*60*1000 (ms/day)\r\n expiryDate = date.toUTCString();\r\n }\r\n\r\n if (expiryDate) { builder.push(\";expires=\", expiryDate); }\r\n if (domain) { builder.push(\";domain=\", domain); }\r\n if (path) { builder.push(\";path=\", path); }\r\n if (secure) { builder.push(\";secure\"); }\r\n\r\n if (canUseDOM() && document) {\r\n document.cookie = builder.join(\"\");\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n// Provides utility functions to get and set data from browser webStorage.\r\n\r\nimport { tryParseJson } from \"../utilities/Parsing\";\r\nimport { AppError, CoreLibAppErrors, logger } from \"@msnews/diagnostics\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\n/**\r\n * Base class for localeStorage and sessionStorage abstractions\r\n */\r\nexport class WebStorage {\r\n /**\r\n * Local storage object for persistent storage\r\n */\r\n constructor(private readonly storage: Storage) {\r\n }\r\n\r\n /**\r\n * Check if the web storage is supported\r\n * @returns {boolean} true if supported\r\n */\r\n public get supported(): boolean {\r\n return !!this.storage;\r\n }\r\n\r\n /**\r\n * Get given key's value from web storage\r\n * @param {string} key - Key name\r\n * @returns {string} Key value\r\n */\r\n public getItem(key: string): string {\r\n if (this.supported) {\r\n return this.storage.getItem(key);\r\n }\r\n }\r\n\r\n /**\r\n * Gets the value from local storage using the key.\r\n * @param {string} key - the storage key to store under\r\n * @param {T} defaultValue - the default value to return if parsing fails\r\n * @returns {T} The parsed JSON value\r\n */\r\n public getObject(key: string, defaultValue?: T): T {\r\n let value = this.getItem(key);\r\n if (value != null) {\r\n let parsedObj = tryParseJson(value);\r\n if (parsedObj != null) {\r\n return parsedObj;\r\n }\r\n }\r\n\r\n return defaultValue;\r\n }\r\n\r\n /**\r\n * Gets given index location key from web storage\r\n * @param {string} key - Key name\r\n * @returns {string} Key value\r\n */\r\n public key(index: number): string {\r\n if (this.supported && index >= 0) {\r\n return this.storage.key(index);\r\n }\r\n }\r\n\r\n /**\r\n * Sets the given value after stringifying as JSON\r\n * @param {string} key - the storage key to store under\r\n * @param {T} value - the value to serialize and store\r\n */\r\n public setObject(key: string, value: T): void {\r\n (value !== undefined)\r\n ? this.setItem(key, JSON.stringify(value))\r\n : this.removeItem(key);\r\n }\r\n\r\n /**\r\n * Removes the given key from storage and returns the existing value parsed\r\n * @param {string} key - the key to remove.\r\n */\r\n public removeObject(key: string): T {\r\n let value = this.removeItem(key);\r\n if (value != null) {\r\n return tryParseJson(value);\r\n }\r\n }\r\n\r\n /**\r\n * Set given key's value to local storage\r\n * @param {string} key - Key name\r\n * @param {string} value - Key value\r\n */\r\n public setItem(key: string, value: string): void {\r\n if (this.supported) {\r\n // Catch quota exceeded exception\r\n try {\r\n this.storage.setItem(key, value);\r\n } catch (e) {\r\n logger.logError(e);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove key item from local storage\r\n * @param {string} key - Key name\r\n * @returns {string} Key value\r\n */\r\n public removeItem(key: string): string {\r\n if (this.supported) {\r\n let value = this.getItem(key);\r\n this.storage.removeItem(key);\r\n return value;\r\n }\r\n }\r\n\r\n /**\r\n * Removes all keys containing the given substring in the storage key\r\n * @param {string} substring The substring to check\r\n */\r\n public removeSubstringKeys(substring: string): void {\r\n if (!this.supported || !substring) {\r\n return;\r\n }\r\n\r\n let matchingKeys = [];\r\n for (let index = 0; index < this.storage.length; index++) {\r\n const storageKey = this.key(index);\r\n if (storageKey && storageKey.includes(substring)) {\r\n matchingKeys.push(storageKey);\r\n }\r\n }\r\n\r\n for (let index = 0; index < matchingKeys.length; index++) {\r\n this.removeItem(matchingKeys[index]);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Local storage class for persistent storage\r\n */\r\nexport class LocalStorage extends WebStorage {\r\n constructor() {\r\n let storage: Storage;\r\n\r\n try {\r\n storage = \"localStorage\" in window && window.localStorage;\r\n } catch (ex) {\r\n // Getting local storage failed. Can happen in Chrome when user has disabled cookies.\r\n }\r\n\r\n super(storage);\r\n }\r\n\r\n /**\r\n * Checks whether localStorage is available or not.\r\n * Need to aggressively check because iOS5 & Safari Private Browsing mode will throw error.\r\n * This is how the library Modernizr does localStorage check. (MIT License)\r\n * For more details:\r\n * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/localstorage.js\r\n */\r\n public localStorageExists(trackAppErrorEvent: (data: AppError) => void): boolean {\r\n if(canUseDOM()){\r\n var storageTest = \"storageTest\";\r\n try {\r\n window.localStorage.setItem(storageTest, storageTest);\r\n window.localStorage.removeItem(storageTest);\r\n return true;\r\n } catch(e) {\r\n if (trackAppErrorEvent || typeof trackAppErrorEvent === \"function\") {\r\n trackAppErrorEvent({\r\n ...CoreLibAppErrors.LocalStorageDoesntExist,\r\n message: `Local Storage is not defined ${e}`\r\n });\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Session storage class for persistent storage\r\n */\r\nexport class SessionStorage extends WebStorage {\r\n constructor() {\r\n let storage: Storage;\r\n\r\n try {\r\n storage = \"sessionStorage\" in window && window.sessionStorage;\r\n } catch (ex) {\r\n // Getting session storage failed. Can happen in Chrome when user has disabled cookies.\r\n }\r\n\r\n super(storage);\r\n }\r\n\r\n /**\r\n * Checks whether sessionStorage is available or not.\r\n * Need to aggressively check because iOS5 & Safari Private Browsing mode will throw error.\r\n * This is how the library Modernizr does sessionStorage check. (MIT License)\r\n * For more details:\r\n * https://github.com/Modernizr/Modernizr/blob/master/feature-detects/storage/sessionstorage.js\r\n */\r\n public sessionStorageExists(trackAppErrorEvent: (data: AppError) => void): boolean {\r\n if(canUseDOM()){\r\n var storageTest = \"storageTest\";\r\n try {\r\n window.sessionStorage.setItem(storageTest, storageTest);\r\n window.sessionStorage.removeItem(storageTest);\r\n return true;\r\n } catch(e) {\r\n if (trackAppErrorEvent || typeof trackAppErrorEvent === \"function\") {\r\n trackAppErrorEvent({\r\n ...CoreLibAppErrors.SessionStorageDoesntExist,\r\n message: `Session Storage is not defined: ${e}`\r\n });\r\n }\r\n }\r\n } \r\n return false;\r\n }\r\n}\r\n\r\nexport const localStorage = new LocalStorage();\r\nexport const sessionStorage = new SessionStorage();","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport enum Environment {\r\n prod = \"prod\",\r\n int1 = \"int1\",\r\n int = \"int\",\r\n intpr = \"intPR\",\r\n intpef = \"intPef\"\r\n}\r\n\r\n/**\r\n * Parses from string to Environment enum.\r\n * Defaults to null\r\n *\r\n * @export\r\n * @param {(string | null | undefined)} environment - string being parsed\r\n * @returns {(Environment | null)} - the parsed Environment enum, or null.\r\n */\r\nexport function getEnvironmentFromString(environment: string | null | undefined): Environment | null {\r\n switch (environment) {\r\n case Environment.prod:\r\n return Environment.prod;\r\n case Environment.int1:\r\n return Environment.int1;\r\n case Environment.int:\r\n case Environment.intpr:\r\n case Environment.intpef:\r\n return Environment.int;\r\n default:\r\n return null;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport const Size1ColumnWidth: number = 300;\r\nexport let Size2ColumnWidth: number = 624;\r\nexport let Size3ColumnWidth: number = 948;\r\nexport let Size4ColumnWidth: number = 1272;\r\nexport let GutterSize: number = 24;\r\n\r\n/** Updates the current ColumnWidths based on changes in gutterSize */\r\nexport function updateColumnWidths(gutterSize: number): void {\r\n GutterSize = gutterSize;\r\n Size4ColumnWidth = (Size1ColumnWidth * 4) + (gutterSize * 3);\r\n Size3ColumnWidth = (Size1ColumnWidth * 3) + (gutterSize * 2);\r\n Size2ColumnWidth = (Size1ColumnWidth * 2) + gutterSize;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AadData, getAppEnvironment } from \"@msnews/core\";\r\n\r\nimport { ConnectorNamespaces } from \"@msnews/experiences-constants\";\r\nimport { ExperiencesSharedStateConnector } from \"@msnews/experiences-shared-state\";\r\nimport { PageBase } from \"@msnews/experiences-redux\";\r\n\r\n/**\r\n * chrome\r\n * The chrome API is not defined in Typescript\r\n */\r\ndeclare global {\r\n // tslint:disable-next-line: completed-docs\r\n interface Window { chrome: any; }\r\n}\r\n\r\n/** The aadToken QS key */\r\nexport const aadTokenQsKey = \"stn\";\r\n\r\n/** The aadToken QS value */\r\nexport const aadTokenQsVal = \"aad\";\r\n\r\n/**\r\n * Gets a value to indicate if we are in an enterprise scenario\r\n * eg. whether we should append the AAD Token as part of the call to oneservice endpoints\r\n * The default value is false, so we don't need to wait until the value is explicitly set\r\n */\r\nexport function useEnterpriseCompliance(): boolean {\r\n // Obtain the current value of useEnterpriseCompliance from the ExperiencesSharedState connector\r\n const sharedStateConnector: ExperiencesSharedStateConnector = PageBase.getInstance().rootReducer.connector(ConnectorNamespaces.SharedState) as ExperiencesSharedStateConnector;\r\n return sharedStateConnector ? sharedStateConnector.getCurrentState().useEnterpriseCompliance : false;\r\n}\r\n\r\n/**\r\n * Checks if aad data exists\r\n */\r\nexport function hasAadData(): boolean {\r\n const appEnvironment = getAppEnvironment();\r\n\r\n return !!appEnvironment.AadDataPromise;\r\n}\r\n\r\n/**\r\n * Checks if aad token is invalid for user\r\n */\r\nexport async function isInvalidAadToken(): Promise {\r\n const aadData = await resolveAadData();\r\n\r\n return !aadData || !aadData.isSuccess || !aadData.isValid;\r\n}\r\n\r\n/**\r\n * Resolve aad token from aad data promise\r\n */\r\nexport async function resolveAadToken(): Promise {\r\n const aadData = await resolveAadData();\r\n\r\n return aadData ? aadData.token : null;\r\n}\r\n\r\n/**\r\n * Resolve aad data promise\r\n */\r\nexport async function resolveAadData(): Promise {\r\n const appEnvironment = getAppEnvironment();\r\n\r\n if (!appEnvironment.AadDataPromise) {\r\n return null;\r\n }\r\n\r\n return await appEnvironment.AadDataPromise;\r\n}\r\n\r\n/**\r\n * Gets a value to indicate if we should use enterprise domain\r\n * eg. whether we should use the Falcon domain vs. consumer domain for oneservice requests\r\n * The default value is false, so we don't need to wait until the value is explicitly set\r\n */\r\nexport function useEnterpriseDomain(): boolean {\r\n // Obtain the current value of useEnterpriseDomain from the ExperiencesSharedState connector\r\n const sharedStateConnector: ExperiencesSharedStateConnector = PageBase.getInstance().rootReducer.connector(ConnectorNamespaces.SharedState) as ExperiencesSharedStateConnector;\r\n return sharedStateConnector ? sharedStateConnector.getCurrentState().useEnterpriseDomain : false;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport PageBase from \"./PageBase\";\r\n\r\nexport default PageBase;\r\nexport * from \"./PageBase\";\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\nconst pageTimings = canUseDOM() ? (window._pageTimings || (window._pageTimings = {})) : null;\r\n\r\n/**\r\n * Gets current window._pageTimings object\r\n */\r\nexport function getPageTimings(): object {\r\n return pageTimings;\r\n}\r\n\r\n/**\r\n * Creates or updates a new counter under the page timings\r\n * @param counterName - the name of the counter to increment.\r\n */\r\nexport function incrementCounter(counterName: string): void {\r\n if (counterName && pageTimings) {\r\n let existingCount = pageTimings[counterName] || (pageTimings[counterName] = 0);\r\n pageTimings[counterName] = existingCount + 1;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Size1ColumnWidth, Size2ColumnWidth, Size3ColumnWidth, Size4ColumnWidth } from \"./ColumnWidths\";\r\n\r\nimport { findIndex } from \"lodash-es\";\r\nimport { toPx } from \"@microsoft/fast-jss-utilities\";\r\n\r\n/**\r\n * Describes possible arragements of columns. For example c3 represents 3 columns.\r\n *\r\n * Each arrangement is valid for a particular range of window widths. For example, for window widths from 996px to 1319px,\r\n * we will use the c3 arrangement, or 3 columns.\r\n *\r\n * Currently each arrangement describes a column count, but in the future, there may be separate 3-column \"large\"\r\n * and 3-column \"small\" arrangements, like on msn.com.\r\n */\r\nexport enum ColumnArrangement {\r\n c1 = \"c1\",\r\n c2 = \"c2\",\r\n c3 = \"c3\",\r\n c4 = \"c4\"\r\n}\r\n\r\nlet minViewportWidthOverrides: Map;\r\n\r\n/**\r\n * Override the min viewport widths for the given column arrangements.\r\n * @param overrides The overrides to use for the column arrangements.\r\n */\r\nexport function overrideMinViewportWidths(overrides: Map): void {\r\n minViewportWidthOverrides = overrides;\r\n}\r\n\r\n/**\r\n * Defines the properties of a particular column arrangement.\r\n */\r\nexport class ColumnArrangementDefinition {\r\n /**\r\n * Creates a column arrangement definition.\r\n * @param arrangement The column arrangement being defined.\r\n * @param contentSizePx The size of the content in pixels for this arrangement.\r\n * @param isFirstBreakpoint True if this is the first breakpoint.\r\n */\r\n constructor(public arrangement: ColumnArrangement, public contentSizePx: number, private isFirstBreakpoint?: boolean) {}\r\n\r\n /**\r\n * Gets the minimum required window width to trigger this column arrangement.\r\n */\r\n public get minViewportWidthPx(): number {\r\n if (this.isFirstBreakpoint) {\r\n return 0;\r\n }\r\n\r\n if (minViewportWidthOverrides) {\r\n const widthOverride = minViewportWidthOverrides.get(this.arrangement);\r\n if (widthOverride) {\r\n return widthOverride;\r\n }\r\n }\r\n\r\n return this.contentSizePx + contentBufferPx;\r\n }\r\n}\r\n\r\n/**\r\n * The list of possible column arrangement definitions. Use this to determine what window sizes are\r\n * appropriate for each column arrangement.\r\n */\r\nexport const columnArrangements: ColumnArrangementDefinition[] = [\r\n new ColumnArrangementDefinition(ColumnArrangement.c1, Size1ColumnWidth, true),\r\n new ColumnArrangementDefinition(ColumnArrangement.c2, Size2ColumnWidth),\r\n new ColumnArrangementDefinition(ColumnArrangement.c3, Size3ColumnWidth),\r\n new ColumnArrangementDefinition(ColumnArrangement.c4, Size4ColumnWidth)\r\n];\r\n\r\n/**\r\n * A map of column arrangements to definitions.\r\n */\r\nconst columnArrangementMap: { [columnArrangement in ColumnArrangement]?: ColumnArrangementDefinition } = {};\r\nfor (let columnArrangementDefinition of columnArrangements) {\r\n columnArrangementMap[columnArrangementDefinition.arrangement] = columnArrangementDefinition;\r\n}\r\n\r\n/**\r\n * The number of pixels to add on top of the content width in order to get the window width required to show it.\r\n * This buffer guarantees space between the content and the edge of the window, and also space for the scrollbar,\r\n * which is also counted when determining breakpoints.\r\n */\r\nconst contentBufferPx: number = 32;\r\n\r\n/**\r\n * Gets the content width for the given column arrangement.\r\n * @param columnArrangement The column arrangement to look up.\r\n * @returns The width in pixels of the content.\r\n */\r\nexport function contentWidthPxForColumnArrangement(columnArrangement: ColumnArrangement): number {\r\n return columnArrangementMap[columnArrangement].contentSizePx;\r\n}\r\n\r\n/**\r\n * Gets the minimum window width for the given column arrangement.\r\n * @param columnArrangement The column arrangement to look up.\r\n * @returns The minimum width for the window to show this column arrangement.\r\n */\r\nexport function minWindowWidthPxForColumnArrangement(columnArrangement: ColumnArrangement): number {\r\n return columnArrangementMap[columnArrangement].minViewportWidthPx;\r\n}\r\n\r\n/**\r\n * Gets the maximum window width for the given column arrangement.\r\n * @param columnArrangement The column arrangement to look up.\r\n * @returns The maximum width for the window to show this column arrangement. NaN if there is no maximum.\r\n */\r\nexport function maxWindowWidthPxForColumnArrangement(columnArrangement: ColumnArrangement): number {\r\n const arrangementIndex = findIndex(columnArrangements, a => a.arrangement === columnArrangement);\r\n\r\n if (arrangementIndex < columnArrangements.length - 1) {\r\n return columnArrangements[arrangementIndex + 1].minViewportWidthPx - 1;\r\n }\r\n\r\n return NaN;\r\n}\r\n\r\n/**\r\n * Helper to efficiently get the media query string to be used for given min/max column arrangements\r\n * It can be used in conjuction with `window.matchMedia` to target specific page widths, and it is also\r\n * used internally to generate the equivalent css selectors in `getMediaQuerySelector`\r\n * @param minArragement The min column arrangement to use for the @media query (inclusive)\r\n * @param maxArrangement The max column arrangement to use for the @media query (inclusive)\r\n * @returns the @media query for the specified min/max.\r\n */\r\nexport function getMediaQuery(minArragement: ColumnArrangement | null, maxArrangement: ColumnArrangement | null): string {\r\n const queries = [];\r\n\r\n if (minArragement) {\r\n const minArrangementDefinition = columnArrangementMap[minArragement];\r\n const minWidthPx = minArrangementDefinition.minViewportWidthPx;\r\n\r\n if (minWidthPx > 0) {\r\n queries.push(`(min-width: ${toPx(minWidthPx)})`);\r\n }\r\n }\r\n\r\n if (maxArrangement) {\r\n const maxArrangementDefinition = columnArrangementMap[maxArrangement];\r\n const maxArrangementIndex = columnArrangements.indexOf(maxArrangementDefinition);\r\n\r\n if (maxArrangementIndex < columnArrangements.length - 1) {\r\n queries.push(`(max-width: ${toPx(columnArrangements[maxArrangementIndex + 1].minViewportWidthPx - 1)})`);\r\n }\r\n }\r\n\r\n return queries.join(\" and \");\r\n}\r\n\r\n/**\r\n * Helper to efficiently get the media query string to be used for the given column arrangement\r\n * It can be used in conjuction with `window.matchMedia` to target specific page widths, and it is also\r\n * used internally to generate the equivalent css selectors in `getMediaQuerySelector`\r\n * @param columnArrangement The column arrangement to target\r\n * @returns The media query to target that column arrangement\r\n */\r\nexport function getMediaQueryFor(columnArrangement: ColumnArrangement): string {\r\n return getMediaQuery(columnArrangement, columnArrangement);\r\n}\r\n\r\n/**\r\n * Helper to efficiently get the CSS selector to be used for apply styles for given min/max arrangements\r\n * @param minArragement The min column arrangement to use for the media query (inclusive)\r\n * @param maxArrangement The max column arrangement to use for the media query (inclusive)\r\n * @returns the css media query selector for the specified min/max.\r\n */\r\nexport function getMediaQuerySelector(minArragement: ColumnArrangement | null, maxArrangement: ColumnArrangement | null): string {\r\n const mediaQuery = getMediaQuery(minArragement, maxArrangement);\r\n return mediaQuery ? \"@media \" + mediaQuery : \"\";\r\n}\r\n\r\n/**\r\n * Helper to efficiently get the CSS selector to be used for apply styles for the given column arrangement.\r\n * @param columnArrangement The column arrangement to target\r\n * @returns the css media query selector for the specified column arrangement.\r\n */\r\nexport function getMediaQuerySelectorFor(columnArrangement: ColumnArrangement): string {\r\n return getMediaQuerySelector(columnArrangement, columnArrangement);\r\n}\r\n\r\n/**\r\n * Callback type for subscribing to BreakpointManager breakpoint changed events.\r\n */\r\nexport type BreakpointManagerCallback = (columnArrangement: ColumnArrangement) => void;\r\n\r\n/**\r\n * Breakpoint manager common interface.\r\n */\r\nexport interface BreakpointManager {\r\n /**\r\n * Gets the current column arrangement.\r\n */\r\n currentColumnArrangement: ColumnArrangement;\r\n\r\n /**\r\n * Subscribes for changes\r\n * @param callback The method to call when the column arrangement changes.\r\n */\r\n subscribe(callback: BreakpointManagerCallback): void;\r\n\r\n /**\r\n * Unsubscribe from changes\r\n * @param callback The callback to unregister.\r\n */\r\n unsubscribe(callback: BreakpointManagerCallback): void;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Helper to promisify the Prime 'require' AMD helper to resolve a single module with no dependencies.\r\n * @param moduleName {string} - the name of the module to resolve\r\n * @param defaultModule {TModule} - the default module implementation if require is not available.\r\n * @returns {Promise{TModule}} a promise that will resolve the module when it's available.\r\n * @description Note that this version only resolves a single module with no dependencies.\r\n */\r\nexport async function requireAsync(moduleName: string, defaultModule?: TModule): Promise {\r\n return new Promise((resolve: (module: TModule) => void, reject) => {\r\n\r\n if (typeof window.require === \"function\") {\r\n window.require([moduleName], resolve);\r\n } else if (defaultModule) {\r\n console.error(`require was not available. Returning default implementation for ${moduleName}`);\r\n resolve(defaultModule);\r\n } else {\r\n reject(\"require is not available\");\r\n }\r\n });\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { get, set } from \"lodash-es\";\r\n\r\nimport { ConnectorConstants } from \"../constants/ConnectorConstants\";\r\nimport { ConnectorNamespaces } from \"@msnews/experiences-constants\";\r\n\r\n/**\r\n * Maps the data connector name to the set of experience keys it is injected into.\r\n * The values include the \"._@STATE@_\" portion needed to pull experience state out of the app state object.\r\n */\r\nconst dataConnectorToExperienceKeyMap: Map> = new Map>();\r\n\r\n/**\r\n * Register a data connector to inject into an experience.\r\n * @param experienceFullNamespace The full namespace of the experience to inject into.\r\n * @param dataConnectorName The name for the data connector to inject.\r\n */\r\nfunction registerInjection(\r\n experienceFullNamespace: string,\r\n dataConnectorName: ConnectorNamespaces): void {\r\n let experienceSet: Set = dataConnectorToExperienceKeyMap.get(dataConnectorName);\r\n if (!experienceSet) {\r\n experienceSet = new Set();\r\n dataConnectorToExperienceKeyMap.set(dataConnectorName, experienceSet);\r\n }\r\n\r\n experienceSet.add(createStatePropertyKey(experienceFullNamespace));\r\n}\r\n\r\n/**\r\n * Initializes the shared data connector state for the given experience.\r\n * @param appState The global app state to modify.\r\n * @param experienceFullNamespace The full namespace of the experience to host the data connector state.\r\n * @param dataConnectorName The name of the data connector to use.\r\n */\r\nfunction initializeExperience(\r\n appState: any,\r\n experienceFullNamespace: string,\r\n dataConnectorName: ConnectorNamespaces): void {\r\n\r\n // Setup the key and get the actual state property for the connector. lodash uses dotted notation\r\n // so the key will be something like: namespace._@STATE@_\r\n const experienceStatePropertyKey = createStatePropertyKey(experienceFullNamespace);\r\n const connectorPreviousState = get(appState, experienceStatePropertyKey, undefined);\r\n\r\n // Find the initial data connector state\r\n const initialDataConnectorState = get(appState, createStatePropertyKey(dataConnectorName), undefined);\r\n\r\n // Create the new experience connector state\r\n const nextStateForConnector = { ...connectorPreviousState, [dataConnectorName]: initialDataConnectorState };\r\n set(appState, experienceStatePropertyKey, nextStateForConnector);\r\n}\r\n\r\n/**\r\n * Updates the data connector state on all experiences that include it.\r\n * @param appState The global app state object.\r\n * @param dataConnectorNamespace The namespace of the data connector that's been updated.\r\n * @param newDataConnectorState The new data connector state object.\r\n */\r\nfunction reportStateChange(\r\n appState: any,\r\n dataConnectorNamespace: string,\r\n newDataConnectorState: any): void {\r\n\r\n const experienceKeys: Set = dataConnectorToExperienceKeyMap.get(dataConnectorNamespace);\r\n if (experienceKeys) {\r\n for (let experienceKey of experienceKeys) {\r\n const experiencePreviousState: any = get(appState, experienceKey, undefined);\r\n\r\n if (experiencePreviousState) {\r\n set(appState, experienceKey, { ...experiencePreviousState, [dataConnectorNamespace]: newDataConnectorState });\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Creates the lodash property key to get or set the experience or data connector state.\r\n * @param fullNamespace The full namespace of the experience or data connector.\r\n */\r\nfunction createStatePropertyKey(fullNamespace: string): string {\r\n return fullNamespace + \".\" + ConnectorConstants.connectorStateKey;\r\n}\r\n\r\n/** Methods to support injecting data connector state into experiences */\r\nexport const dataConnectorInjector = {\r\n registerInjection,\r\n initializeExperience,\r\n reportStateChange\r\n};\r\n","\r\n// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { renderCacheExpirationKey, renderCacheKey, riverRcClassName } from \"./Constants\";\r\n\r\nimport { RenderCache } from \"./RenderCache\";\r\n\r\nlet renderCacheObject: RenderCache;\r\n\r\n/**\r\n * Function to get render cache if it's valid.\r\n * @returns Render cache object if it exists and is valid otherwise null.\r\n */\r\nexport function getRenderCache(): RenderCache {\r\n if (renderCacheObject) {\r\n return renderCacheObject;\r\n }\r\n\r\n if (!(window && window.localStorage)) {\r\n return null;\r\n }\r\n\r\n const cacheExpirationTimestamp = window.localStorage.getItem(renderCacheExpirationKey);\r\n\r\n if (!cacheExpirationTimestamp) {\r\n return null; // Cache Expiration Timestamp not exist\r\n }\r\n\r\n const parsedCacheExpirationTimestamp = parseInt(cacheExpirationTimestamp);\r\n if (!parsedCacheExpirationTimestamp) {\r\n return null; // Cache Expiration Timestamp broken.\r\n }\r\n\r\n const currentTimestamp: number = new Date().getTime();\r\n\r\n if (currentTimestamp >= parsedCacheExpirationTimestamp) {\r\n return null; // cache expired.\r\n }\r\n\r\n const renderCacheStorage = window.localStorage.getItem(renderCacheKey);\r\n\r\n if (!renderCacheStorage) {\r\n return null; // Cache object is missing.\r\n }\r\n\r\n try {\r\n renderCacheObject = JSON.parse(renderCacheStorage);\r\n } catch (error) {\r\n return null; // Cache object not parsable.\r\n }\r\n\r\n if (!renderCacheObject || !renderCacheObject.dom || !renderCacheObject.batch_css) {\r\n renderCacheObject = null; // Cache object is broken\r\n }\r\n\r\n return renderCacheObject;\r\n}\r\n\r\n/**\r\n * Batch All styles into one object.\r\n */\r\nexport function batchCSS(): string {\r\n let batchCss = \"\";\r\n\r\n // Enumerate and write out all of the JSS styles\r\n const styles = document.getElementsByTagName(\"style\");\r\n const length = styles.length;\r\n\r\n for (var i = 0; i < length; i++) {\r\n // Skip any styles that do not have a data-jss attribute to always pick newer styles added by jss\r\n if (styles[i].dataset.jss != null) {\r\n batchCss += styles[i].innerHTML;\r\n }\r\n }\r\n\r\n return batchCss;\r\n}\r\n\r\n/**\r\n * Scrapes Dom and remove River.\r\n */\r\nexport function scrapeDom(includeNewsFeed: boolean): string {\r\n const root = document.getElementById(\"root\");\r\n\r\n if (!root || !root.innerHTML) {\r\n return \"\";\r\n }\r\n\r\n /* Currently we don't have functionality to include experiences separately,\r\n because of that we do return whole dom if river included in render cache and exclude river otherwise */\r\n if (includeNewsFeed) {\r\n return root.innerHTML;\r\n }\r\n\r\n const rivers = document.getElementsByClassName(riverRcClassName);\r\n\r\n if (!rivers || !rivers.length) {\r\n return root.innerHTML;\r\n }\r\n\r\n const river = rivers[0] as HTMLElement;\r\n\r\n return root.innerHTML.replace(river.outerHTML, \"\");\r\n}\r\n\r\n/**\r\n * Gets the state object from render cache.\r\n * @returns The redux state object.\r\n */\r\nexport function getStateFromRenderCache(): any {\r\n // Check to see if this app instance was bootstrapped with a render-cache\r\n const renderCache = getRenderCache();\r\n\r\n if (!renderCache || !renderCache.state) {\r\n return null; // Render Cache missing or it does not include State.\r\n }\r\n\r\n let initialState;\r\n\r\n try {\r\n initialState = JSON.parse(renderCache.state, reduxStoreStringifyReviver);\r\n } catch (error) {\r\n // Cache state object is not parsable.\r\n }\r\n\r\n return initialState;\r\n}\r\n\r\n/**\r\n * Redux Store Stringify replacer HOF, generates store stringify.\r\n * @param storeExceptions list of store namespaces which will not be included in result.\r\n */\r\nexport function reduxStoreStringifyReplacer(key: string, value: any): any {\r\n const originalObject = this[key];\r\n if (originalObject instanceof Map) {\r\n return { dataType: \"Map\",\r\n value: [...originalObject]\r\n };\r\n } else {\r\n return value;\r\n }\r\n}\r\n\r\n/**\r\n * Custom JSON.stringify reviver that will create Map objects from a string/JSON representation\r\n * @param key not used\r\n * @param value The value being converted from a string\r\n */\r\nfunction reduxStoreStringifyReviver(key: any, value: any): any {\r\n // If the value being restored is a object, check it it was a map\r\n if (typeof value === \"object\" && value !== null) {\r\n // If the object value being restored was a map, that was custom written, then revive it by creating a map\r\n if (value.dataType === \"Map\") {\r\n return new Map(value.value);\r\n }\r\n }\r\n\r\n // Return the original value being restored\r\n return value;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Aad data formatted from browser response\r\n */\r\nexport type AadData = {\r\n /**\r\n * Access token\r\n */\r\n token: string;\r\n\r\n /**\r\n * Any error info\r\n */\r\n errorInfo: AadErrorInfo;\r\n\r\n /**\r\n * Flag to indicate if call was successful\r\n */\r\n isSuccess: boolean;\r\n\r\n /**\r\n * Flag to indicate if token is valid\r\n */\r\n isValid: boolean;\r\n};\r\n\r\n/**\r\n * Error info from aad request\r\n */\r\nexport type AadErrorInfo = {\r\n /**\r\n * Error string\r\n */\r\n error_string?: string;\r\n\r\n /**\r\n * Platform error code\r\n */\r\n platform_error_code?: number;\r\n\r\n /**\r\n * Primary error code\r\n */\r\n primary_error?: number;\r\n\r\n /**\r\n * Secondary error code\r\n */\r\n secondary_error?: number;\r\n};\r\n\r\n/**\r\n * The client id of our application\r\n */\r\nexport const clientId = \"d7b530a4-7680-4c23-a8bf-c52c121d2e87\";\r\n\r\n/**\r\n * The scope/resource id for enterprise One Service\r\n */\r\nexport const oneServiceScope = \"f920ab6b-8a48-4438-9255-1650179a3a0f\";","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Enum for different page types\r\n * @enum\r\n */\r\nexport enum PageType {\r\n Article = \"article\",\r\n ArticleFullScreen = \"articlefullscreen\",\r\n DHP = \"dhp\",\r\n Gallery = \"gallery\",\r\n GalleryFullScreen = \"galleryfullscreen\",\r\n MMX = \"mmx\",\r\n NTP = \"ntp\",\r\n Video = \"video\",\r\n Windows = \"windowshp\"\r\n}\r\n\r\n/** The AudienceMode enum */\r\nexport enum AudienceModeType {\r\n Adult = \"adult\",\r\n Enterprise = \"enterprise\",\r\n Kids = \"kids\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { groupBy, identity } from \"lodash-es\";\r\n\r\nimport { PageMeasure } from \"./PerfTimeline\";\r\nimport { getExperienceMeasures } from \"./ExperienceDiagnostics\";\r\nimport { getPageTimings } from \"./PageTimings\";\r\n\r\n/** The type that encapsulates the data for a single aggregated timeline object */\r\ninterface Timeline {\r\n\r\n /** Name of the timeline */\r\n name: string,\r\n\r\n /** The data for the timeline */\r\n measures: Array\r\n}\r\n\r\n/** Describes a single Process ID */\r\ninterface PID {\r\n /** The pid value */\r\n pid: number;\r\n}\r\n\r\n/** Type for easily looking up if a given timeline should be considered async */\r\ninterface AsyncTimelineGroups {\r\n /** The incrementing async PID */\r\n nextPID: PID,\r\n\r\n /** The async PID for the given timeline */\r\n [timelineName: string]: PID\r\n}\r\n\r\n/**\r\n * Calculates and returns the JSON that can be used in the chrome://tracing tool to render an\r\n * experience-centric perf timeline for various tracked page measurements in the pageMeasures object.\r\n * See https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview# for more details.\r\n *\r\n * @returns Array object with chrome trace event data that can be serialized and saved to a JSON file\r\n * to be loaded inside the chrome://tracing tool.\r\n */\r\nexport function getAppPerfTrace(): Array {\r\n\r\n // create a shallow copy since we don't want to mutate the original data from the page object\r\n const measures: Array = [];\r\n\r\n const asyncExperiences = {\r\n\r\n // Web-Worker\r\n \"WW\": { pid: 0 },\r\n\r\n // Config resolver on the render thread\r\n \"Resolver\": { pid: 1 },\r\n\r\n // Various resource timing categories.\r\n \"Ads\": { pid: 2 },\r\n \"Telemetry\": { pid: 3 },\r\n \"Content Preview\": { pid: 4 },\r\n \"Images\": { pid: 5 },\r\n \"JS\": { pid: 6 },\r\n \"Configs\": { pid: 7 },\r\n \"Services\": { pid: 8 },\r\n\r\n // The async process ID counter, which will be used to group similar timelines under virtual process IDs to\r\n // identify and group a list of related timelines. The timeline groups will render in order of smallest to\r\n // larges process ID in the chrome trace.\r\n nextPID: { pid: 20 }\r\n };\r\n\r\n // this is the process ID which will identify the main timeline (that renders last in the tool)\r\n const defaultPID = 100;\r\n\r\n // merge resource timings\r\n mergeResourceTimings(measures, asyncExperiences);\r\n\r\n // merge experience timeline measures.\r\n mergePageMeasures(measures, getExperienceMeasures(), asyncExperiences);\r\n\r\n // merge other page timings\r\n const pageTimings = { ...getPageTimings() };\r\n mergePageTimings(measures, pageTimings, asyncExperiences, /^WW\\./, \"WW\");\r\n\r\n // merge timings from window._appTimings object if it exists (used to get timeline measurements\r\n // out of band from non-typescript enabled code)\r\n const appTimings = { ...(window._appTimings || {}) };\r\n mergePageTimings(measures, appTimings, asyncExperiences, /.*/);\r\n\r\n // build chrome trace object\r\n const chromeTrace = [];\r\n\r\n // zero start instance marker to indicate nav start\r\n chromeTrace.push(chromeInstantMarker(\"Global\", \"NavStart\", defaultPID, 0, \"g\"));\r\n\r\n // Other well known instance markers\r\n Object.keys(pageTimings)\r\n .filter(name => name.match(/TT/))\r\n .sort((key1, key2) => pageTimings[key1] - pageTimings[key2])\r\n .forEach(name =>\r\n chromeTrace.push(chromeInstantMarker(\"Global\", name, defaultPID, pageTimings[name], \"g\"))\r\n );\r\n\r\n // web-worker instant markers\r\n Object.keys(pageTimings)\r\n .filter(name => name.match(/^WW\\./i))\r\n .sort((key1, key2) => pageTimings[key1] - pageTimings[key2])\r\n .forEach(name =>\r\n chromeTrace.push(chromeInstantMarker(\"WW\", name, asyncExperiences[\"WW\"].pid, pageTimings[name], \"p\"))\r\n );\r\n\r\n // Main process name metadata\r\n chromeTrace.push(chromeMetadata(\"process_name\", defaultPID, { name: \"Main\" }));\r\n chromeTrace.push(chromeMetadata(\"process_sort_index\", defaultPID, { sort_index: defaultPID }));\r\n\r\n // async timelines\r\n calculateTimelines(measures, true)\r\n .forEach((timeline, timelineIndex) => {\r\n\r\n const { pid } = asyncExperiences[timeline.name];\r\n\r\n // for async timelines, we need to create a separate process so the individual\r\n // measurements can start on their own line as async events should\r\n timeline.measures.forEach((measure, measureIndex) => {\r\n\r\n const { timelineName, measureName, from, to } = measure;\r\n const measureIndexPrefix = (\"000\" + measureIndex).substr(-3, 3);\r\n const name = `${measureIndexPrefix}-${measureName}`;\r\n\r\n // async begin/end\r\n chromeTrace.push(...chromeAsyncMeasure(timelineName, name, pid, timelineIndex, measureIndex, from, to));\r\n });\r\n\r\n // since we're creating a new process id for async experiences, put the name metadata for the process\r\n chromeTrace.push(chromeMetadata(\"process_name\", pid, { name: timeline.name }));\r\n chromeTrace.push(chromeMetadata(\"process_sort_index\", pid, { sort_index: pid }));\r\n chromeTrace.push(chromeMetadata(\"thread_name\", pid, { name: timeline.name }, timelineIndex));\r\n chromeTrace.push(chromeMetadata(\"thread_sort_index\", pid, { sort_index: timelineIndex }, timelineIndex));\r\n });\r\n\r\n // sync timelines\r\n calculateTimelines(measures, false)\r\n .forEach((timeline, timelineIndex) => {\r\n\r\n const pid = defaultPID;\r\n\r\n timeline.measures.forEach(measure => {\r\n const { timelineName, measureName, from, to } = measure;\r\n chromeTrace.push(chromeSyncMeasure(timelineName, measureName, pid, timelineIndex, from, to));\r\n });\r\n\r\n chromeTrace.push(chromeMetadata(\"thread_name\", pid, { name: timeline.name }, timelineIndex));\r\n chromeTrace.push(chromeMetadata(\"thread_sort_index\", pid, { sort_index: timelineIndex }, timelineIndex));\r\n });\r\n\r\n return chromeTrace;\r\n}\r\n\r\n/**\r\n * Creates a chrome metadata entry object\r\n */\r\nfunction chromeMetadata(metadataType: string, pid: number, args: object, threadId?: number): object {\r\n\r\n const metadata: any = {\r\n name: metadataType,\r\n ph: \"M\",\r\n pid,\r\n args\r\n };\r\n\r\n if (threadId != null) {\r\n metadata.tid = threadId;\r\n }\r\n\r\n return metadata;\r\n}\r\n\r\n/**\r\n * Returns two markers that signifiy the measurement of an asynchronous event\r\n */\r\nfunction chromeAsyncMeasure(category: string, name: string, pid: number, threadId: number, id: number, fromMs: number, toMs: number, showInParentThread?: boolean): Array {\r\n return [\r\n chromeMarker(category, name, showInParentThread ? \"B\" : \"b\", pid, threadId, fromMs, { id }),\r\n chromeMarker(category, name, showInParentThread ? \"E\" : \"e\", pid, threadId, toMs, { id })\r\n ];\r\n}\r\n\r\n/**\r\n * Returns two markers that signifiy the measurement of an synchronous event\r\n */\r\nfunction chromeSyncMeasure(category: string, name: string, pid: number, threadId: number, fromMs: number, toMs: number): object {\r\n return chromeMarker(category, name, \"X\", pid, threadId, fromMs, { dur: (toMs - fromMs) * 1000 });\r\n}\r\n\r\n/**\r\n * Returns an instance marker\r\n */\r\nfunction chromeInstantMarker(category: string, name: string, pid: number, timeStampMs: number, type: string): object {\r\n return chromeMarker(category, name, \"i\", pid, null, timeStampMs, { s: type });\r\n}\r\n\r\n/**\r\n * Creates a generic Chrome marker entry\r\n */\r\nfunction chromeMarker(category: string, name: string, type: string, pid: number, threadId: number = null, timeStampMs: number, auxData: any): object {\r\n const marker: any = {\r\n cat: category,\r\n name,\r\n ph: type,\r\n pid,\r\n tid: threadId,\r\n ts: timeStampMs * 1000,\r\n ...auxData\r\n };\r\n\r\n if (threadId != null) {\r\n marker.tid = threadId;\r\n }\r\n\r\n return marker;\r\n}\r\n\r\n/**\r\n * Iterates through the given measure data, parses, groups timeline data and creates\r\n * a sorted array of {Timeline} objects to render in the Chrome trace\r\n *\r\n * @param measures - the measure data object to which to append new measurements.\r\n * @returns the array of aggregated, sorted {Timeline} objects.\r\n */\r\nfunction calculateTimelines(measures: Array, async: boolean): Array {\r\n\r\n // group info objects by experience name\r\n const timelineGroups = groupBy(\r\n measures.filter(measure => !!measure.async === async),\r\n info => info.timelineName\r\n );\r\n\r\n // create a list of sub-timelines where each sub-timeline is sorted by metric value\r\n const timelineList: Array = [];\r\n let maxValue = 0;\r\n\r\n Object.keys(timelineGroups).forEach(groupName => {\r\n\r\n // sort each timeline by start metric value\r\n const timeline = timelineGroups[groupName].sort(\r\n (info1, info2) => info1.from - info2.from\r\n );\r\n\r\n // get the running max value from the last metric on each sorted timeline\r\n maxValue = Math.max(maxValue, timeline[timeline.length - 1].to);\r\n\r\n timelineList.push({\r\n name: groupName,\r\n measures: timeline\r\n });\r\n });\r\n\r\n // sort the list of timelines by first appearing metric for each timeline.\r\n // This is the order we will render the timeline view from top to bottom,\r\n // so that each line represents a single experience's timeline.\r\n return timelineList.sort(\r\n (timeline1, timeline2) => timeline1.measures[0].from - timeline2.measures[0].from\r\n );\r\n}\r\n\r\n/**\r\n * Attempts to map measures from the given object bag that contains related start/end markers\r\n * and adds to the given measures array.\r\n * @param measures - the measure data object to which to append new measurements.\r\n * @param pageTimings - the page timings object from which to parse data from.\r\n * @param asyncExperiences - the async info object containing the currently allocated PID info\r\n * @param matchRegex - regex to use to filter the metric names.\r\n * @param timelineName - Optional name to use for the timeline. If not specified the measure name will\r\n * be parsed to attempt to derive the timeline name dynamically.\r\n */\r\nfunction mergePageTimings(\r\n measures: Array,\r\n pageTimings: object,\r\n asyncExperiences: AsyncTimelineGroups,\r\n matchRegex: RegExp,\r\n timelineName?: string\r\n): void {\r\n\r\n // work out other WW markers\r\n const startSuffixRegex = /\\-?[Ss]tart$/;\r\n\r\n // we have a range of start/end marker styles in WW code :-/\r\n const endSuffixLookup = {\r\n \"-Start\": \"-End\",\r\n \"-start\": \"-end\",\r\n \"Start\": \"End\",\r\n \"start\": \"end\"\r\n };\r\n\r\n const processedKeysToRemove = [];\r\n\r\n Object.keys(pageTimings)\r\n .filter(key => key.match(matchRegex))\r\n .forEach(key => {\r\n\r\n const startSuffixMatch = key.match(startSuffixRegex);\r\n if (!startSuffixMatch) {\r\n return;\r\n }\r\n\r\n let measureName = key.replace(startSuffixRegex, \"\");\r\n const endKey = `${measureName}${endSuffixLookup[startSuffixMatch[0]]}`;\r\n const endValue = startSuffixMatch && pageTimings[endKey];\r\n\r\n if (!endValue) {\r\n return;\r\n }\r\n\r\n processedKeysToRemove.push(key);\r\n processedKeysToRemove.push(endKey);\r\n\r\n let thisTimelineName = timelineName;\r\n\r\n // if we're not given an explicit timeline name, then see if we can try to derive the\r\n // timeline name from the measurement (i.e., see if the measure name is formatted as\r\n // [timeline name].[measure name]), and if so, use that instead. This is useful for aggregating\r\n // related timeline measures across code that use the PerfTimeline class as well as the global\r\n // window._appTimings object to generate a unified timeline.\r\n if (!thisTimelineName) {\r\n const prefixSuffixMatch = measureName.match(/(.+)\\.(.+)/);\r\n if (prefixSuffixMatch) {\r\n thisTimelineName = prefixSuffixMatch[1];\r\n measureName = prefixSuffixMatch[2];\r\n } else {\r\n // no explicit timeline name, and no timeline name could be derived from the measure name\r\n return;\r\n }\r\n }\r\n\r\n measures.push({\r\n async: !!asyncExperiences[thisTimelineName],\r\n timelineName: thisTimelineName,\r\n measureName,\r\n from: pageTimings[key],\r\n to: endValue\r\n });\r\n });\r\n\r\n // remove the keys we used for detecting start/end from the measures so we don't attempt\r\n // to process them again for something else\r\n for (const keyToRemove of processedKeysToRemove) {\r\n delete pageTimings[keyToRemove];\r\n }\r\n}\r\n\r\n/**\r\n * Parses various resource timings that are of interest and merges into the measure data object\r\n * @param measures - the destination array into which we will add the resource timings.\r\n * @param asyncExperiences - the async info object containing the currently allocated PID info\r\n */\r\nfunction mergeResourceTimings(measures: Array, asyncExperiences: AsyncTimelineGroups): void {\r\n\r\n // interesting groups from resource timings.\r\n // IMPORTANT!! Put from most specific to less specific, so dupes don't appear in multiple groups.\r\n let resourceGroupings = [\r\n\r\n // Ads\r\n { name: \"Ads\", regex: /(\\/srtb\\.|taboola|outbrain)/i },\r\n\r\n // Config service calls (CRS or Config)\r\n { name: \"Telemetry\", regex: /(otf\\.|\\/c\\.gif)/i },\r\n\r\n // Content preview calls.\r\n // Note: put before services to avoid capture of /content/\r\n { name: \"Content Preview\", regex: /\\/content\\/view\\/v[0-9]\\/Preview\\//i },\r\n\r\n // Content service calls (i.e., content preview)\r\n { name: \"Images\", regex: /(img-s-msn-com|\\.svg)/i },\r\n\r\n // Javascript resources.\r\n // Note: put before configs, to avoid capture of web-worker hash, which contains config stuff\r\n { name: \"JS\", regex: /\\.js/i },\r\n\r\n // Config service calls (CRS or Config)\r\n { name: \"Configs\", regex: /\\/config/i },\r\n\r\n // Various known service calls to 1S (i.e., feed, structure data, etc.)\r\n { name: \"Services\", regex: /(\\/service\\/|apiKey|\\/getappanoncookie|content)/i }\r\n ];\r\n\r\n let nonZeroResources = performance.getEntriesByType(\"resource\")\r\n .filter(entry => entry.duration > 0);\r\n\r\n resourceGroupings.forEach(resourceGroup => {\r\n\r\n // add the resource group names to the async experiences list\r\n tryCreateAsyncPID(resourceGroup.name, asyncExperiences);\r\n\r\n let remainingResources = [];\r\n\r\n nonZeroResources\r\n .filter(entry => {\r\n const match = entry.name.match(resourceGroup.regex);\r\n if (!match) {\r\n remainingResources.push(entry);\r\n }\r\n return match;\r\n })\r\n .forEach((entry, entryIndex) => {\r\n\r\n const url = new URL(entry.name);\r\n const measureName = url.pathname.length > 1\r\n ? url.pathname\r\n : url.hostname;\r\n\r\n measures.push({\r\n async: true,\r\n timelineName: resourceGroup.name,\r\n measureName: `${measureName}-${entryIndex}`,\r\n from: entry.startTime,\r\n to: entry.startTime + entry.duration\r\n });\r\n });\r\n\r\n // don't re-process the ones we already matched for a previous group.\r\n nonZeroResources = remainingResources;\r\n });\r\n}\r\n\r\n/**\r\n * Appends the given measure to the target array\r\n * @param destinationMeasures - the destination array to which to add the measures\r\n * @param sourceMeasures - the source list of measures to process and add\r\n * @param asyncExperiences - the async info object containing the currently allocated PID info\r\n * @param asyncPID - the last allocated async PID\r\n * @returns {number} The next usable async PID\r\n */\r\nfunction mergePageMeasures(\r\n destinationMeasures: Array,\r\n sourceMeasures: Array,\r\n asyncExperiences: AsyncTimelineGroups\r\n): void {\r\n\r\n sourceMeasures.forEach(measure => {\r\n const { async, timelineName } = measure;\r\n if (async) {\r\n tryCreateAsyncPID(timelineName, asyncExperiences);\r\n }\r\n destinationMeasures.push(measure);\r\n });\r\n}\r\n\r\n/**\r\n * Attempts to create a new async PID for the given timeline name if it does not already exist\r\n * @param timelineName - the name of the async timeline to allocate a new PID if it does not exist.\r\n * @param asyncExperiences - the async info object containing the currently allocated PID info\r\n * @returns {boolean} Indicating whether an async PID exists for the given timeline or not.\r\n */\r\nfunction tryCreateAsyncPID(timelineName: string, asyncExperiences: AsyncTimelineGroups): boolean {\r\n if (!asyncExperiences[timelineName]) {\r\n asyncExperiences[timelineName] = { pid: asyncExperiences.nextPID.pid++ };\r\n return true;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { logger } from \"../logging\";\r\nimport { getAppPerfTrace } from \"./AppPerfTrace\";\r\nimport { getPageTimings } from \"./PageTimings\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\nconst pageTimings = getPageTimings();\r\n\r\n/**\r\n * Utility class to keep track of how many times a key has appeared in order to\r\n * get a uniquely qualified name back to be used in a dictionary.\r\n */\r\nclass KeyCounter {\r\n\r\n /** Lookup of counts for the given key */\r\n private timelineCount: { [name: string]: number } = {};\r\n\r\n /** Gets the qualified key name */\r\n public qualifyKey(timelineName: string): string {\r\n\r\n // get the previous count\r\n const count = this.getCount(timelineName);\r\n\r\n // if we've called it previously append the count as suffix\r\n // to identify it uniquely.\r\n if (count <= 1) {\r\n return timelineName;\r\n }\r\n\r\n return timelineName + count;\r\n }\r\n\r\n /** Resets the counter state to initial values */\r\n public reset(): void {\r\n this.timelineCount = {};\r\n }\r\n\r\n /** Gets the key's appearence count */\r\n private getCount(timelineName: string): number {\r\n\r\n // get the previous count\r\n const count = this.timelineCount[timelineName] || 0;\r\n\r\n // update the new count\r\n return this.timelineCount[timelineName] = count + 1;\r\n }\r\n}\r\n\r\n/** Type info of a single page measure in the window._pageMeasures object */\r\nexport type PageMeasure = {\r\n\r\n /** Name of the timeline */\r\n timelineName: string;\r\n\r\n /** Name of the metric */\r\n measureName: string;\r\n\r\n /** Flag that indicates whether this measure is an async measure */\r\n async?: boolean;\r\n\r\n /** The start time of the measure */\r\n from: number;\r\n\r\n /** The end time of the measure */\r\n to: number;\r\n};\r\n\r\n/**\r\n * Unique key qualifier for distinctly identifying instances of perf timelines\r\n * across multiple instances of the same or different experience types.\r\n * For example, ContentPreview, ContentPreview2, ContentPreview3, etc.\r\n */\r\nconst timelineKeyCount = new KeyCounter();\r\n\r\n/** Suffix for start markers */\r\nconst startSuffix = \"-start\";\r\n\r\n/** Suffix for end markers */\r\nconst endSuffix = \"-end\";\r\n\r\n/**\r\n * This class can be used to aggregate a list of perf markers and their transitions.\r\n */\r\nexport class PerfTimeline {\r\n\r\n /**\r\n * Unique key qualifier for metric names that appear multiple times.\r\n * For example, render, render2, render3, etc.\r\n */\r\n private readonly markerCount: KeyCounter = new KeyCounter();\r\n\r\n /**\r\n * List of in-memory logged markers for this perf-timeline object\r\n */\r\n private readonly measures: Array> = [];\r\n\r\n /**\r\n * Constructor of a {PerfTimeline} instance\r\n * @param timelineName - the name of the perf timeline. Note that if you don't know the name\r\n * of a perf timeline at construction time, it can later be renamed to a known name later via\r\n * the 'rename' method.\r\n * @param instanceId - this specific instance's ID. Used during a renaming operation to idenfity any previous isntance.\r\n * @param addPerfMarks - Flag to indicate whether to log perf marks with the native performance API.\r\n * @param addPageTimings - Flag to indicate whether to log the perf marks into the _pageTimings object.\r\n * @param async - Flag to mark this timeline as an async timeline, so by default all measures under\r\n * this timeline will show under a new process line.\r\n */\r\n protected constructor(\r\n public timelineName: string,\r\n public readonly instanceId: string,\r\n private readonly addPerfMarks: boolean,\r\n private readonly addPageTimings: boolean,\r\n private readonly async?: boolean\r\n ) {\r\n this.timelineName = timelineKeyCount.qualifyKey(this.timelineName);\r\n }\r\n\r\n /**\r\n * Helper to construct a {PerfTimeline} instance\r\n * @param timelineName - the name of the perf timeline. Note that if you don't know the name\r\n * of a perf timeline at construction time, it can later be renamed to a known name later via\r\n * the 'rename' method.\r\n * @param instanceId - this specific instance's ID. Used during a renaming operation to idenfity any previous isntance.\r\n * @param addPerfMarks - Flag to indicate whether to log perf marks with the native performance API.\r\n * @param addPageTimings - Flag to indicate whether to log the perf marks into the _pageTimings object.\r\n * @param async - Flag to mark this timeline as an async timeline, so by default all measures under\r\n * this timeline will show under a new process line.\r\n */\r\n public static create(\r\n timelineName: string,\r\n instanceId: string,\r\n addPerfMarks: boolean = false,\r\n addPageTimings: boolean = false,\r\n async?: boolean\r\n ): PerfTimeline {\r\n return new PerfTimeline(timelineName, instanceId, addPerfMarks, addPageTimings, async);\r\n }\r\n\r\n /**\r\n * Renames this instances of the timeline to the new given name.\r\n * This is useful when the timeline name is not known until after some asynchronous operation is completed,\r\n * but the measuring operation required to be started before the name was known.\r\n * @param timelineName - the new name of the timeline.\r\n */\r\n public rename(timelineName: string): void {\r\n\r\n if (this.timelineName === timelineName) {\r\n return;\r\n }\r\n\r\n if (this.addPageTimings) {\r\n // if we're adding page timings, then make sure we delete the measures under the old name and add the new ones\r\n this.measures.forEach(measure => {\r\n const oldMeasureName = this.qualifyMeasureName(measure.measureName);\r\n delete pageTimings[oldMeasureName + startSuffix];\r\n delete pageTimings[oldMeasureName];\r\n });\r\n }\r\n\r\n this.timelineName = timelineName;\r\n\r\n if (this.addPageTimings) {\r\n // add back the page timings under the new timeline name\r\n this.measures.forEach(measure => {\r\n const newMeasureName = this.qualifyMeasureName(measure.measureName);\r\n pageTimings[newMeasureName + startSuffix] = measure.from;\r\n pageTimings[newMeasureName] = measure.to - measure.from;\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Marks the start of a timeline measurement.\r\n * @param coreMarkerName - the name of the core marker. This value is usually invariant\r\n * from instance to instance (i.e., init, config, render)\r\n * @param dynamicMeasureName - the optional additional identifying name to give for the measure.\r\n * This value can be used to identify dynamic values across instances. For example the\r\n * HREF of the config. This can also later be updated to a new name when calling the 'endMeasure'\r\n * method.\r\n * @param async - flag to indicate whether this is an async measure or not.\r\n * @returns An object with the following properties:\r\n * - endMeasure - method that should be used to mark the end the measure.\r\n */\r\n public startMeasure(coreMarkerName: string, dynamicMeasureName?: string, async?: boolean): { endMeasure: (updatedDynamicMeasureName?: string) => void } {\r\n\r\n const startTime = performance.now();\r\n\r\n const timelineNameAtStart = this.timelineName;\r\n let measureNameCore = this.formatMeasureName(coreMarkerName, dynamicMeasureName);\r\n let measureName = this.qualifyMeasureName(measureNameCore);\r\n\r\n let startMarkerName = measureName + startSuffix;\r\n this.singleMark(startMarkerName);\r\n\r\n if (this.addPageTimings) {\r\n pageTimings[startMarkerName] = startTime;\r\n }\r\n\r\n return {\r\n /**\r\n * Ends the given measure we started\r\n */\r\n // tslint:disable-next-line:no-shadowed-variable\r\n endMeasure: (updatedDynamicMeasureName?: string) => {\r\n\r\n const endTime = performance.now();\r\n\r\n // flag to indicate whether we need to re-qualify the measure name based on frequency. Note that we only\r\n // set this to true if the timeline name has changed since start, or we have a new dynamic name at the end.\r\n const requalifyMeasureName = updatedDynamicMeasureName\r\n || (timelineNameAtStart !== this.timelineName);\r\n\r\n if (requalifyMeasureName) {\r\n // if by the time we're ending the measure, we have a new dynamic name for the measurement, use that as the final measure name.\r\n measureNameCore = this.formatMeasureName(coreMarkerName, updatedDynamicMeasureName);\r\n measureName = this.qualifyMeasureName(measureNameCore);\r\n }\r\n\r\n const endMarkerName = measureName + endSuffix;\r\n\r\n this.singleMark(endMarkerName);\r\n this.measure(measureName, startMarkerName, endMarkerName);\r\n\r\n // Note we only save the partial metric without the timeline name, so we can use the final timeline name\r\n // if any rename operations happen while initial measurements have started without the final timeline name\r\n this.measures.push({\r\n measureName: measureNameCore,\r\n async: (async != null) ? async : this.async,\r\n from: startTime,\r\n to: endTime\r\n });\r\n\r\n if (this.addPageTimings) {\r\n pageTimings[measureName] = endTime - startTime;\r\n }\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Returns the list of page measures for this timeline object\r\n * @returns {Array} containing the fully qualified list of metric names for this perf timeline.\r\n */\r\n public getPageMeasures(): Array {\r\n return this.measures.map(measure => ({\r\n ...measure,\r\n timelineName: this.timelineName\r\n }));\r\n }\r\n\r\n /**\r\n * Instruments the start/begin for the given function with a given binding context\r\n * @param funcName - the identifying name of the function\r\n * @param func - the function instance to measure\r\n * @param bindingContext - the optional context from which to invoke the function\r\n * @returns the instrumented function that will track the start/end of the given function.\r\n */\r\n public instrumentFunc(funcName: string, func: TFunc, bindingContext?: Object): TFunc {\r\n\r\n const _this = this;\r\n\r\n let wrapper = function (): any {\r\n const endMeasure = _this.startMeasure(funcName).endMeasure;\r\n try {\r\n return func.apply(bindingContext, arguments);\r\n } finally {\r\n endMeasure();\r\n }\r\n };\r\n\r\n return wrapper as any as TFunc;\r\n }\r\n\r\n /**\r\n * Instruments the start/begin for the given async-style function\r\n * @param promiseName - the identifying name of the promise\r\n * @param getPromise - the promise getter that returns the promise to measure. This is needed\r\n * so that the start measurement can occur before the promise starts executing.\r\n * @param async - flag to indicate whether to measure this promise as an async timeline\r\n * or a synchronous one. Please note that if you specify this as true, and other measurements\r\n * in the timeline are synchronous, the async measurements will appear as a separate timeline\r\n * and will not be next to the synchronous one. If unsure, leave undefined.\r\n * @returns the wrapped promise that tracks the start/end of the promise execution.\r\n */\r\n public async instrumentPromise(promiseName: string, getPromise: () => Promise, async?: boolean): Promise {\r\n\r\n const endMeasure = this.startMeasure(promiseName, null, async).endMeasure;\r\n try {\r\n return await getPromise();\r\n } finally {\r\n endMeasure();\r\n }\r\n }\r\n\r\n /**\r\n * Prefixes the given measure name with the current timeline name\r\n * @param measureName - the measure name to qualify\r\n * @returns the timeline name prefixed measure name.\r\n */\r\n private qualifyMeasureName(measureName: string): string {\r\n return `${this.timelineName}-${measureName}`;\r\n }\r\n\r\n /**\r\n * Returns the formatted measure name with it's constiuent parts\r\n * @param coreMeasureName - the core marker name\r\n * @param dynamicMeasureName - optional dynamic measure name\r\n * @returns the formatted marker name\r\n */\r\n private formatMeasureName(coreMeasureName: string, dynamicMeasureName?: string): string {\r\n const dynamicMeasureSuffix = dynamicMeasureName ? (\"-\" + dynamicMeasureName) : \"\";\r\n return this.markerCount.qualifyKey(`${coreMeasureName}${dynamicMeasureSuffix}`);\r\n }\r\n\r\n /**\r\n * Helper to add a single mark with the performance API\r\n * @param markerName - the name of the marker to add.\r\n */\r\n private singleMark(markerName: string): void {\r\n if (this.addPerfMarks) {\r\n performance.mark(markerName);\r\n }\r\n }\r\n\r\n /**\r\n * Helper to calculate a performance measurement against the performance API\r\n * @param measureName - the name of the measure\r\n * @param startMarker - the name of the start marker\r\n * @param endMarker - the name of the end marker\r\n */\r\n private measure(measureName: string, startMarker: string, endMarker: string): void {\r\n if (this.addPerfMarks) {\r\n try {\r\n // this can throw if start/end markers were not available for some reason\r\n performance.measure(measureName, startMarker, endMarker);\r\n } catch (ex) {\r\n logger.logError(ex);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Test export for resetting the timeline name counter\r\n */\r\nexport function _resetTimelineKeyCounter(): void {\r\n timelineKeyCount.reset();\r\n}\r\n\r\n// Note that we're exporting this function here so that it doesn't get tree shaken out\r\n// since it's not actually referenced from any PROD code anywhere. Since the PerfTimeline class\r\n// is referenced, having the getAppPerfTrace function referenced here would end up bundling in the final bits.\r\nif (canUseDOM()) {\r\n (window)._getAppPerfTrace = getAppPerfTrace;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { PageMeasure, PerfTimeline } from \"./PerfTimeline\";\r\nimport { canUseDOM, getLocationHref } from \"@msnews/isomorphic-util\";\r\n\r\nimport { logger } from \"../logging\";\r\n\r\n/**\r\n * In case we're tracking only specific experience types, this will contain\r\n * the keys of experiences that were requested to be tracked.\r\n */\r\nlet experiencesForPerf: { [key: string]: boolean };\r\n\r\n/**\r\n * In case we're excluding specific experiences from tracking. Useful when\r\n * we want to track all experiences, except for a few noisy ones, for example.\r\n */\r\nlet experiencesExcludedForPerf: { [key: string]: boolean };\r\n\r\n/**\r\n * Flag to indicate we want to log marks & measurements against the performance API.\r\n * By default, all marks and measurements will only happen against an in-memory object.\r\n * Note that when you enable this option, it will incur an additional overhead from using\r\n * the API. You should only use this option when you want to look at the perf trace in\r\n * the browser's F12 tools. This is not required otherwise.\r\n *\r\n * Controlled via the experPerfMark=true QSP.\r\n */\r\nlet addPerformanceMarks: boolean;\r\n\r\n/**\r\n * Flag to add any perf timeline measurements to the global _pageTimings object\r\n */\r\nlet addPageTimings: boolean;\r\n\r\n/**\r\n * Flag to indicate that we're tracking all experiences.\r\n *\r\n * Controlled via the expPerf=all QSP\r\n */\r\nlet trackAllExp: boolean;\r\n\r\n/**\r\n * Top-level flag to enable perf timeline features\r\n */\r\nlet enablePerfTimeline: boolean;\r\n\r\n/**\r\n * Dictionary containing the unique {PerfTimeline} object instances across the app.\r\n * When related measurements on the same perf timeline is required across unrelated parts\r\n * of the code, this will guarantee you're tracking those measurements under the same\r\n * perf timeline using a combination of the experience name and instance id.\r\n */\r\nlet perfTimelineInstances: { [instanceId: string]: PerfTimeline };\r\n\r\n/**\r\n * Initializes experience perf diagnostic specific state\r\n * Note: this method should not be called explicitly (other than from UTs.)\r\n * It is already called by default at the beginning of module initialization.\r\n * @param locationHref - the value of window.location.href from which to parse options\r\n */\r\nexport function initExperienceDiagnostics(locationHref: string): void {\r\n\r\n addPageTimings = false;\r\n addPerformanceMarks = false;\r\n experiencesExcludedForPerf = {};\r\n experiencesForPerf = {};\r\n perfTimelineInstances = {};\r\n trackAllExp = false;\r\n\r\n try {\r\n const searchParams = (new URL(locationHref)).searchParams;\r\n const expPerfQsp = searchParams.get(\"expPerf\");\r\n enablePerfTimeline = !!expPerfQsp;\r\n\r\n // if we weren't requested for any experience perf tracking, return early.\r\n if (!enablePerfTimeline) {\r\n return;\r\n }\r\n\r\n trackAllExp = expPerfQsp === \"all\";\r\n\r\n // if an explicit experience name list was specified, convert it to an boolean map\r\n // for efficient lookup so that we can create or avoid cration of the timeline object\r\n // for whatever experience needs instrumentation.\r\n if (!trackAllExp && expPerfQsp) {\r\n expPerfQsp.split(\",\").forEach(expName =>\r\n experiencesForPerf[expName] = true\r\n );\r\n }\r\n\r\n // parse explicit exclusions from perf timeline\r\n const expPerfSkipQsp = searchParams.get(\"expPerfSkip\");\r\n if (expPerfSkipQsp) {\r\n expPerfSkipQsp.split(\",\").forEach(expName =>\r\n experiencesExcludedForPerf[expName] = true\r\n );\r\n }\r\n\r\n addPerformanceMarks = searchParams.get(\"expPerfMarks\") === \"true\";\r\n addPageTimings = searchParams.get(\"expPerfTimings\") === \"true\";\r\n\r\n } catch (e) {\r\n logger.logError(\"Error parsing URL for detecting experience diagnostic switches: \" + e);\r\n }\r\n}\r\n\r\n// initialize right away\r\n// TODO (http://osgvsowi/24596752): This needs reinitialized on each request when server side rendering\r\nif (canUseDOM()) {\r\n initExperienceDiagnostics(getLocationHref());\r\n}\r\n\r\n/**\r\n * Gets or creates a perf timeline object for the given experience instance\r\n * @param experienceName - the name of the experience for which to create the timeline\r\n * @param instanceId - the ID that will uniquely identify this timeline across multiple instances.\r\n * @param async - Optional flag to indicate the default tracing mode for this timeline.\r\n * Specifying true will render the measures under its own process id in the app trace.\r\n * Useful if the timeline will contain many async operations that frequently overlap with each other.\r\n * Note that this value can be overriden when taking an individual measure as well.\r\n */\r\nexport function tryGetPerfTimeline(experienceName: string, instanceId: string, async?: boolean): PerfTimeline {\r\n\r\n if (!shouldTrackPerfTimeline(experienceName)) {\r\n return;\r\n }\r\n\r\n const instanceKey = getInstanceKeyCore(experienceName, instanceId);\r\n\r\n const perfTimeline = perfTimelineInstances[instanceKey];\r\n if (perfTimeline) {\r\n return perfTimeline;\r\n }\r\n\r\n return perfTimelineInstances[instanceKey] = PerfTimeline.create(\r\n experienceName,\r\n instanceId,\r\n addPerformanceMarks,\r\n addPageTimings,\r\n async\r\n );\r\n}\r\n\r\n/**\r\n * Renames the given perf timeline object and moves the lookup dictionary reference under the new key\r\n * @param perfTimeline - the perf timeline to rename\r\n * @param newExperienceName - the new name for the perf timeline\r\n */\r\nexport function renamePerfTimeline(perfTimeline: PerfTimeline, newExperienceName: string): void {\r\n\r\n const oldInstanceKey = getInstanceKey(perfTimeline);\r\n\r\n if (perfTimelineInstances[oldInstanceKey] !== perfTimeline) {\r\n logger.logError(`Attempted to rename a perf timeline object with mismatching instance key ${oldInstanceKey}`);\r\n return;\r\n }\r\n\r\n // rename the perf timeline to the new name\r\n perfTimeline.rename(newExperienceName);\r\n\r\n // delete the old reference\r\n delete perfTimelineInstances[oldInstanceKey];\r\n\r\n // ...and add the new instance under the new key\r\n const newInstanceKey = getInstanceKey(perfTimeline);\r\n perfTimelineInstances[newInstanceKey] = perfTimeline;\r\n}\r\n\r\n/**\r\n * Returns the list of page measures from all the perf timeline objects being tracked\r\n */\r\nexport function getExperienceMeasures(): Array {\r\n const pageMeasures: Array = [];\r\n Object.keys(perfTimelineInstances).forEach(instanceKey =>\r\n pageMeasures.push(...perfTimelineInstances[instanceKey].getPageMeasures())\r\n );\r\n return pageMeasures;\r\n}\r\n\r\n/**\r\n * Helper to check whether we should track perf timeline for the given experience\r\n * @param experienceName - the name of the experience to check\r\n * @returns {boolean} indicating whether the given experience should be tracked for perf\r\n */\r\nfunction shouldTrackPerfTimeline(experienceName: string): boolean {\r\n return enablePerfTimeline\r\n && !experiencesExcludedForPerf[experienceName]\r\n && (trackAllExp || experiencesForPerf[experienceName]);\r\n}\r\n\r\n/**\r\n * Gets the instance key to store the experience timeline\r\n * @param perfTimeline - the timeline object from which to get the instance key.\r\n * @returns the cache key that represents the location to which to store the perf timeline.\r\n */\r\nfunction getInstanceKey(perfTimeline: PerfTimeline): string {\r\n const { timelineName, instanceId } = perfTimeline;\r\n return getInstanceKeyCore(timelineName, instanceId);\r\n}\r\n\r\n/**\r\n * Gets the instance key to store the experience timeline\r\n * @param experienceName - the name of the experience\r\n * @param instanceId - the instance ID for the perf timeline.\r\n * @returns the cache key that represents the location to which to store the perf timeline.\r\n */\r\nfunction getInstanceKeyCore(experienceName: string, instanceId: string): string {\r\n return `${experienceName}-${instanceId || \"0\"}`;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * An enumeration of global / fixed connector namespaces\r\n * Only name spaces that are constant (i.e. not instanced) for the entire SPA lifetime should be listed here\r\n * NOTE: Keep this list alphabetical\r\n * NOTE: Left/Right side need to match\r\n */\r\nexport enum ConnectorNamespaces {\r\n AdsManager = \"AdsManager\",\r\n BingImageData = \"BingImageData\",\r\n CategoryData = \"CategoryData\",\r\n ChromiumPageSettings = \"ChromiumPageSettings\",\r\n CoachmarkData = \"CoachmarkData\",\r\n DailyBriefServiceClient = \"DailyBriefServiceClient\",\r\n DisplayAdsManager = \"DisplayAdsManager\",\r\n ExperienceTrackerData = \"ExperienceTrackerData\",\r\n ExperienceTrackerEdgeData = \"ExperienceTrackerEdgeData\",\r\n ExperienceTrackerEdgeNextData = \"ExperienceTrackerEdgeNextData\",\r\n ExperienceTrackerFirstPartyData = \"ExperienceTrackerFirstPartyData\",\r\n ExperienceTrackerHomePageData = \"ExperienceTrackerHomePageData\",\r\n ExperienceTrackerHubData = \"ExperienceTrackerHubData\",\r\n ExperienceTrackerMicrosoftNewsData = \"ExperienceTrackerMicrosoftNewsData\",\r\n ExperienceTrackerOfficeData = \"ExperienceTrackerOfficeData\",\r\n ExperienceTrackerViewsData = \"ExperienceTrackerViewsData\",\r\n ExperienceTrackerWindowsData = \"ExperienceTrackerWindowsData\",\r\n FeedbackData = \"FeedbackData\",\r\n IrisData = \"IrisData\",\r\n LayoutPreferenceData = \"LayoutPreferenceData\",\r\n MarketSelector = \"MarketSelector\",\r\n MilestoneData = \"MilestoneData\",\r\n MsccCookieBannerData = \"MsccCookieBannerData\",\r\n MsNewsPageSettings = \"MsNewsPageSettings\",\r\n NavigationData = \"NavigationData\",\r\n OfficeSharedData = \"OfficeSharedData\",\r\n OneServiceContent = \"OneServiceContent\",\r\n PageClickTrackerData = \"PageClickTrackerData\",\r\n PageLayout = \"PageLayout\",\r\n PageSettingsData = \"PageSettingsData\",\r\n PlacementManager = \"PlacementManager\",\r\n PoweredByData = \"PoweredByData\",\r\n Preload = \"Preload\",\r\n RewardsData = \"RewardsData\",\r\n SharedState = \"SharedState\",\r\n SmartListSharedData = \"SmartListSharedData\",\r\n TelemetryData = \"TelemetryData\",\r\n TelemetryDataEdgeChromium = \"TelemetryDataEdgeChromium\",\r\n TopicData = \"TopicData\",\r\n VerticalPropertyData = \"VerticalPropertyData\",\r\n VideoDataManager = \"VideoDataManager\",\r\n WeatherData = \"WeatherData\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n ITrackInfo,\r\n KeyValueArray,\r\n KeyValuePair,\r\n Utility,\r\n getAppEnvironment,\r\n getHeadData,\r\n oneServiceHeaders,\r\n oneServiceQueryStringKeys\r\n} from \"@msnews/core\";\r\nimport { aadTokenQsKey, aadTokenQsVal, resolveAadToken, useEnterpriseCompliance } from \"@msnews/auth\";\r\n\r\nimport { isString } from \"lodash-es\";\r\n\r\n/**\r\n * A namespace that provides OneService utility functionality\r\n */\r\nexport namespace OneServiceUtility {\r\n\r\n /**\r\n * Authentication ticket type - Header value required by back-end service\r\n * Specifies what type of authentication to do\r\n */\r\n export const authenticationTicketType = \"10\";\r\n\r\n /**\r\n * Header name that holds which ANON cookie to use\r\n */\r\n export const signedInCookieNameHeader = \"signedInCookieName\";\r\n\r\n /**\r\n * Header name that holds the user-location value.\r\n */\r\n export const userLocationHeader = \"user-location\";\r\n\r\n /**\r\n * The api-key we'll be sending to OneService.\r\n */\r\n export const apiKey = \"0QfOX3Vn51YCzitbLaRkTTBadtWpgTN8NZLW0C1SEM\";\r\n\r\n /**\r\n * Executes a callback on completing of a service request\r\n *\r\n * @param {() => Promise} serviceRequest - The service request\r\n * @param {() => void} callbackMethod - The callback method\r\n * @return {Promise} - A promise of the service response\r\n */\r\n export async function serviceRequestOnComplete(serviceRequest: () => Promise, callbackMethod: () => void): Promise {\r\n try {\r\n const result = await serviceRequest();\r\n callbackMethod();\r\n\r\n return result;\r\n } catch (error) {\r\n callbackMethod();\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * Gets common parameters used in service requests to OneService, when there is no personalization involved\r\n * @param {string} userId - The user id for the request\r\n * @param {string} ocidSpecifier - The OCID\r\n * @param {string} addPageInfoToOcid - If true, page_product and page_type are added to the ocid. Defaults to true\r\n * @returns {KeyValueArray}\r\n */\r\n export function getOneServiceParamsWithoutAuth(userId: string = null, ocidSpecifier: string, addPageInfoToOcid: boolean = true): KeyValueArray {\r\n const appEnvironment = getAppEnvironment();\r\n const params = [\r\n {\r\n key: oneServiceQueryStringKeys.apiKey,\r\n value: apiKey\r\n },\r\n {\r\n // TODO Bug 22266910: clarify use of activityId vs rid in this spot\r\n key: oneServiceQueryStringKeys.activityId,\r\n value: appEnvironment.ActivityId\r\n },\r\n {\r\n key: oneServiceQueryStringKeys.ocid,\r\n value: addPageInfoToOcid ? getOneServiceOCID(appEnvironment.TrackInfo, ocidSpecifier) : ocidSpecifier\r\n },\r\n {\r\n key: oneServiceQueryStringKeys.market,\r\n value: appEnvironment.CurrentMarket\r\n }\r\n ];\r\n\r\n // 21527208 - remove this after upgrading experiences to use shared lib.\r\n if (userId) {\r\n params.push({\r\n key: oneServiceQueryStringKeys.user,\r\n value: userId\r\n });\r\n }\r\n\r\n let runningExperiments = getHeadData().CurrentFlights;\r\n if (runningExperiments) {\r\n params.push({\r\n key: oneServiceQueryStringKeys.fdhead,\r\n value: runningExperiments\r\n });\r\n }\r\n\r\n if (useEnterpriseCompliance()) {\r\n params.push({\r\n key: aadTokenQsKey,\r\n value: aadTokenQsVal\r\n });\r\n }\r\n\r\n return params;\r\n }\r\n\r\n /**\r\n * Gets common parameters used in service requests to OneService,\r\n * plus authentication params in the form of the sign in cookie name\r\n * Note: This should only be called if the user is known to be signed in, else use getOneServiceParamsWithoutAuth\r\n *\r\n * @export\r\n * @param {string} userId - The user id for the request\r\n * @param {string} ocidSpecifier - The OCID\r\n * @param {string} addPageInfoToOcid - If true, page_product and page_type are added to the ocid. Defaults to true\r\n * @returns {KeyValueArray}\r\n */\r\n export function getOneServiceParamsWithAuth(userId: string = null, ocidSpecifier: string, addPageInfoToOcid: boolean = true): KeyValueArray {\r\n const appEnvironment = getAppEnvironment();\r\n const authCookieName: string = appEnvironment.AuthCookieName as string;\r\n let params = [...getOneServiceParamsWithoutAuth(userId, ocidSpecifier, addPageInfoToOcid)];\r\n if (authCookieName) {\r\n params.push({\r\n key: oneServiceQueryStringKeys.signInCookieName, // sign-in cookie name\r\n value: authCookieName.toUpperCase()\r\n });\r\n }\r\n\r\n return params;\r\n }\r\n\r\n /**\r\n * Gets common headers used in service requests to OneService\r\n *\r\n * @export\r\n * @returns {Promise}\r\n */\r\n export async function getOneServiceHeaders(): Promise {\r\n const headers = {};\r\n\r\n if (useEnterpriseCompliance()) {\r\n const aadToken = await resolveAadToken();\r\n if (aadToken) {\r\n headers[oneServiceHeaders.authorization] = `Bearer ${aadToken}`;\r\n }\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n /**\r\n * Gets headers specifically used in service requests to OneService /feed endpoint\r\n * @export\r\n * @returns {Promise}\r\n */\r\n export async function getOneServiceFeedCallHeaders(): Promise {\r\n const headers = await getOneServiceHeaders();\r\n const appEnvironment = getAppEnvironment();\r\n const activityId = appEnvironment.ActivityId;\r\n\r\n if (appEnvironment.SendFeedCallActivityIdInHeader && activityId) {\r\n headers[oneServiceHeaders.activityId] = activityId;\r\n }\r\n\r\n return headers;\r\n }\r\n\r\n /**\r\n * Gets the location query string parameters\r\n */\r\n export function getLocationParams(): KeyValuePair {\r\n const appEnvironment = getAppEnvironment();\r\n const latitude = appEnvironment.Latitude;\r\n const longitude = appEnvironment.Longitude;\r\n\r\n if (latitude && longitude) {\r\n return { key: oneServiceQueryStringKeys.location, value: `${latitude}|${longitude}` };\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Returns the OCID generated from the telemetry TrackInfo if it is valid, otherwise returns the ocid specifier\r\n * @param trackInfo The track info\r\n * @param ocidSpecifier The OCID\r\n * @returns The OCID to use.\r\n */\r\n export function getOneServiceOCID(trackInfo: ITrackInfo, ocidSpecifier: string): string {\r\n if (Utility.isNonNullObject(trackInfo) &&\r\n Utility.isNonNullObject(trackInfo.sitePage) &&\r\n isString(trackInfo.sitePage.page_product) &&\r\n isString(trackInfo.sitePage.page_type)) {\r\n return trackInfo.sitePage.page_product + \"-\" + trackInfo.sitePage.page_type + (ocidSpecifier ? \"-\" + ocidSpecifier : \"\");\r\n } else {\r\n return ocidSpecifier;\r\n }\r\n }\r\n\r\n /**\r\n * Sets up base request data for One Service calls\r\n * @param method\r\n * @returns - RequestInit\r\n */\r\n export async function getBaseRequestData(method): Promise {\r\n const requestObj: RequestInit = {\r\n headers: await OneServiceUtility.getOneServiceHeaders(),\r\n method\r\n };\r\n\r\n return requestObj;\r\n }\r\n\r\n /**\r\n * Populates the request init and return commonParams\r\n * @param ocid -- the ocid for this request\r\n * @returns {KeyValueArray} - parameters as a key/value array\r\n */\r\n export function getCommonParams(ocid: string): KeyValueArray {\r\n if (getHeadData().UserIsSignedIn) {\r\n return this.getOneServiceParamsWithAuth(getAppEnvironment().UserId, ocid);\r\n }\r\n\r\n return this.getOneServiceParamsWithoutAuth(getAppEnvironment().UserId, ocid);\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nexport enum Market {\r\n BR = \"pt-br\",\r\n ENCA = \"en-ca\",\r\n FRCA = \"fr-ca\",\r\n FRFR = \"fr-fr\",\r\n IN = \"en-in\",\r\n ENUS = \"en-us\",\r\n ZHCN = \"zh-cn\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n/// \r\n\r\n/**\r\n * List of SVG icon types available by its key\r\n */\r\nexport const AdChoices = () => import(/* webpackChunkName: \"icon-assets-AdChoices\" */\"@svgr/webpack?-svgo!../../icons/AdChoices.svg\");\r\nexport const BingCardDefaultHotelImage = () => import(/* webpackChunkName: \"icon-assets-BingCardDefaultHotelImage\" */\"@svgr/webpack?-svgo!../../icons/BingCardDefaultHotelImage.svg\");\r\nexport const BingHotelSeePrice = () => import(/* webpackChunkName: \"icon-assets-BingHotelSeePrice\" */\"@svgr/webpack?-svgo!../../icons/BingHotelSeePrice.svg\");\r\nexport const BingLogo = () => import(/* webpackChunkName: \"icon-assets-BingLogo\" */\"@svgr/webpack?-svgo!../../icons/BingLogo.svg\");\r\nexport const BingRatingDarkStar = () => import(/* webpackChunkName: \"icon-assets-BingRatingDarkStar\" */\"@svgr/webpack?-svgo!../../icons/BingRatingDarkStar.svg\");\r\nexport const BingRatingLightStar = () => import(/* webpackChunkName: \"icon-assets-BingRatingLightStar\" */\"@svgr/webpack?-svgo!../../icons/BingRatingLightStar.svg\");\r\nexport const BingRatingDarkLightStar = () => import(/* webpackChunkName: \"icon-assets-BingRatingDarkLightStar\" */\"@svgr/webpack?-svgo!../../icons/BingRatingDarkLightStar.svg\");\r\nexport const BlowingHail = () => import(/* webpackChunkName: \"icon-assets-BlowingHail\" */\"@svgr/webpack?-svgo!../../icons/BlowingHail.svg\");\r\nexport const BlowingHailWhite = () => import(/* webpackChunkName: \"icon-assets-BlowingHailWhite\" */\"@svgr/webpack?-svgo!../../icons/BlowingHailWhite.svg\");\r\nexport const BlowingSnow = () => import(/* webpackChunkName: \"icon-assets-BlowingSnow\" */\"@svgr/webpack?-svgo!../../icons/BlowingSnow.svg\");\r\nexport const BlowingSnowWhite = () => import(/* webpackChunkName: \"icon-assets-BlowingSnowWhite\" */\"@svgr/webpack?-svgo!../../icons/BlowingSnowWhite.svg\");\r\nexport const Check = () => import(/* webpackChunkName: \"icon-assets-Check\" */\"@svgr/webpack?-svgo!../../icons/Check.svg\");\r\nexport const Chevron = () => import(/* webpackChunkName: \"icon-assets-Chevron\" */\"@svgr/webpack?-svgo!../../icons/Chevron.svg\");\r\nexport const CircleClose = () => import(/* webpackChunkName: \"icon-assets-CircleClose\" */\"@svgr/webpack?-svgo!../../icons/CircleClose.svg\");\r\nexport const ClearNight = () => import(/* webpackChunkName: \"icon-assets-ClearNight\" */\"@svgr/webpack?-svgo!../../icons/ClearNight.svg\");\r\nexport const ClearNightWhite = () => import(/* webpackChunkName: \"icon-assets-ClearNightWhite\" */\"@svgr/webpack?-svgo!../../icons/ClearNightWhite.svg\");\r\nexport const Close = () => import(/* webpackChunkName: \"icon-assets-Close\" */\"@svgr/webpack?-svgo!../../icons/Close.svg\");\r\nexport const Cloudy = () => import(/* webpackChunkName: \"icon-assets-Cloudy\" */\"@svgr/webpack?-svgo!../../icons/Cloudy.svg\");\r\nexport const CloudyWhite = () => import(/* webpackChunkName: \"icon-assets-CloudyWhite\" */\"@svgr/webpack?-svgo!../../icons/CloudyWhite.svg\");\r\nexport const Copy = () => import(/* webpackChunkName: \"icon-assets-Copy\" */\"@svgr/webpack?-svgo!../../icons/Copy.svg\");\r\nexport const DarkModeHotel = () => import(/* webpackChunkName: \"icon-assets-DarkModeHotel\" */\"@svgr/webpack?-svgo!../../icons/DarkModeHotel.svg\");\r\nexport const DayTime = () => import(/* webpackChunkName: \"icon-assets-DayTime\" */\"@svgr/webpack?-svgo!../../icons/DayTime.svg\");\r\nexport const Delete = () => import(/* webpackChunkName: \"icon-assets-Delete\" */\"@svgr/webpack?-svgo!../../icons/Delete.svg\");\r\nexport const Dislike = () => import(/* webpackChunkName: \"icon-assets-Dislike\" */\"@svgr/webpack?-svgo!../../icons/Dislike.svg\");\r\nexport const DislikeText = () => import(/* webpackChunkName: \"icon-assets-DislikeText\" */\"@svgr/webpack?-svgo!../../icons/DislikeText.svg\");\r\nexport const Disliked = () => import(/* webpackChunkName: \"icon-assets-Disliked\" */\"@svgr/webpack?-svgo!../../icons/Disliked.svg\");\r\nexport const DislikedText = () => import(/* webpackChunkName: \"icon-assets-DislikedText\" */\"@svgr/webpack?-svgo!../../icons/DislikedText.svg\");\r\nexport const DislikedLight = () => import(/* webpackChunkName: \"icon-assets-DislikedLight\" */\"@svgr/webpack?-svgo!../../icons/DislikedLight.svg\");\r\nexport const Docx = () => import(/* webpackChunkName: \"icon-assets-Docx\" */\"@svgr/webpack?-svgo!../../icons/Docx.svg\");\r\nexport const DoubleTap = () => import(/* webpackChunkName: \"icon-assets-DoubleTap\" */\"@svgr/webpack?-svgo!../../icons/DoubleTap.svg\");\r\nexport const Download = () => import(/* webpackChunkName: \"icon-assets-Download\" */\"@svgr/webpack?-svgo!../../icons/Download.svg\");\r\nexport const DownloadNoFill = () => import(/* webpackChunkName: \"icon-assets-DownloadNoFill\" */\"@svgr/webpack?-svgo!../../icons/DownloadNoFill.svg\");\r\nexport const Edit = () => import(/* webpackChunkName: \"icon-assets-Edit\" */\"@svgr/webpack?-svgo!../../icons/Edit.svg\");\r\nexport const EditNoFill = () => import(/* webpackChunkName: \"icon-assets-EditNoFill\" */\"@svgr/webpack?-svgo!../../icons/EditNoFill.svg\");\r\nexport const Edited = () => import(/* webpackChunkName: \"icon-assets-Edited\" */\"@svgr/webpack?-svgo!../../icons/Edited.svg\");\r\nexport const EditedNoFill = () => import(/* webpackChunkName: \"icon-assets-EditedNoFill\" */\"@svgr/webpack?-svgo!../../icons/EditedNoFill.svg\");\r\nexport const Ellipses = () => import(/* webpackChunkName: \"icon-assets-Ellipses\" */\"@svgr/webpack?-svgo!../../icons/Ellipses.svg\");\r\nexport const EllipsesLight = () => import(/* webpackChunkName: \"icon-assets-EllipsesLight\" */\"@svgr/webpack?-svgo!../../icons/EllipsesLight.svg\");\r\nexport const EmptyMruDark = () => import(/* webpackChunkName: \"icon-assets-EmptyMruDark\" */\"@svgr/webpack?-svgo!../../icons/EmptyMruDark.svg\");\r\nexport const EmptyMruLight = () => import(/* webpackChunkName: \"icon-assets-EmptyMruLight\" */\"@svgr/webpack?-svgo!../../icons/EmptyMruLight.svg\");\r\nexport const EmptyPinnedDark = () => import(/* webpackChunkName: \"icon-assets-EmptyPinnedDark\" */\"@svgr/webpack?-svgo!../../icons/EmptyPinnedDark.svg\");\r\nexport const EmptyPinnedLight = () => import(/* webpackChunkName: \"icon-assets-EmptyPinnedLight\" */\"@svgr/webpack?-svgo!../../icons/EmptyPinnedLight.svg\");\r\nexport const EmptySharedDark = () => import(/* webpackChunkName: \"icon-assets-EmptySharedDark\" */\"@svgr/webpack?-svgo!../../icons/EmptySharedDark.svg\");\r\nexport const EmptySharedLight = () => import(/* webpackChunkName: \"icon-assets-EmptySharedLight\" */\"@svgr/webpack?-svgo!../../icons/EmptySharedLight.svg\");\r\nexport const Excel = () => import(/* webpackChunkName: \"icon-assets-Excel\" */\"@svgr/webpack?-svgo!../../icons/Excel.svg\");\r\nexport const Facebook = () => import(/* webpackChunkName: \"icon-assets-Facebook\" */\"@svgr/webpack?-svgo!../../icons/Facebook.svg\");\r\nexport const FacebookText = () => import(/* webpackChunkName: \"icon-assets-FacebookText\" */\"@svgr/webpack?-svgo!../../icons/FacebookText.svg\");\r\nexport const FacebookTextBlack = () => import(/* webpackChunkName: \"icon-assets-FacebookTextBlack\" */\"@svgr/webpack?-svgo!../../icons/FacebookTextBlack.svg\");\r\nexport const Fog = () => import(/* webpackChunkName: \"icon-assets-Fog\" */\"@svgr/webpack?-svgo!../../icons/Fog.svg\");\r\nexport const FogWhite = () => import(/* webpackChunkName: \"icon-assets-FogWhite\" */\"@svgr/webpack?-svgo!../../icons/FogWhite.svg\");\r\nexport const Form = () => import(/* webpackChunkName: \"icon-assets-Form\" */\"@svgr/webpack?-svgo!../../icons/Form.svg\");\r\nexport const Folder = () => import(/* webpackChunkName: \"icon-assets-Folder\" */\"@svgr/webpack?-svgo!../../icons/Folder.svg\");\r\nexport const FolderNoFill = () => import(/* webpackChunkName: \"icon-assets-FolderNoFill\" */\"@svgr/webpack?-svgo!../../icons/FolderNoFill.svg\");\r\nexport const FolderOpen = () => import(/* webpackChunkName: \"icon-assets-FolderOpen\" */\"@svgr/webpack?-svgo!../../icons/FolderOpen.svg\");\r\nexport const FreezingRain = () => import(/* webpackChunkName: \"icon-assets-FreezingRain\" */\"@svgr/webpack?-svgo!../../icons/FreezingRain.svg\");\r\nexport const FreezingRainWhite = () => import(/* webpackChunkName: \"icon-assets-FreezingRainWhite\" */\"@svgr/webpack?-svgo!../../icons/FreezingRainWhite.svg\");\r\nexport const GalleryFullscreen = () => import(/* webpackChunkName: \"icon-assets-GalleryFullscreen\" */\"@svgr/webpack?-svgo!../../icons/GalleryFullscreen.svg\");\r\nexport const GalleryMediaIcon = () => import(/* webpackChunkName: \"icon-assets-GalleryMediaIcon\" */\"@svgr/webpack?-svgo!../../icons/GalleryMediaIcon.svg\");\r\nexport const GenericFile = () => import(/* webpackChunkName: \"icon-assets-GenericFile\" */\"@svgr/webpack?-svgo!../../icons/GenericFile.svg\");\r\nexport const GridView = () => import(/* webpackChunkName: \"icon-assets-GridView\" */\"@svgr/webpack?-svgo!../../icons/GridView.svg\");\r\nexport const HailDay = () => import(/* webpackChunkName: \"icon-assets-HailDay\" */\"@svgr/webpack?-svgo!../../icons/HailDay.svg\");\r\nexport const HailDayWhite = () => import(/* webpackChunkName: \"icon-assets-HailDayWhite\" */\"@svgr/webpack?-svgo!../../icons/HailDayWhite.svg\");\r\nexport const HailNight = () => import(/* webpackChunkName: \"icon-assets-HailNight\" */\"@svgr/webpack?-svgo!../../icons/HailNight.svg\");\r\nexport const HailNightWhite = () => import(/* webpackChunkName: \"icon-assets-HailNightWhite\" */\"@svgr/webpack?-svgo!../../icons/HailNightWhite.svg\");\r\nexport const HazeSmoke = () => import(/* webpackChunkName: \"icon-assets-HazeSmoke\" */\"@svgr/webpack?-svgo!../../icons/HazeSmoke.svg\");\r\nexport const HazeSmokeWhite = () => import(/* webpackChunkName: \"icon-assets-HazeSmokeWhite\" */\"@svgr/webpack?-svgo!../../icons/HazeSmokeWhite.svg\");\r\nexport const HeavySnow = () => import(/* webpackChunkName: \"icon-assets-HeavySnow\" */\"@svgr/webpack?-svgo!../../icons/HeavySnow.svg\");\r\nexport const HeavySnowWhite = () => import(/* webpackChunkName: \"icon-assets-HeavySnowWhite\" */\"@svgr/webpack?-svgo!../../icons/HeavySnowWhite.svg\");\r\nexport const Hide = () => import(/* webpackChunkName: \"icon-assets-Hide\" */\"@svgr/webpack?-svgo!../../icons/Hide.svg\");\r\nexport const HideStory = () => import(/* webpackChunkName: \"icon-assets-HideStory\" */\"@svgr/webpack?-svgo!../../icons/HideStory.svg\");\r\nexport const Hotel = () => import(/* webpackChunkName: \"icon-assets-Hotel\" */\"@svgr/webpack?-svgo!../../icons/Hotel.svg\");\r\nexport const Information = () => import(/* webpackChunkName: \"icon-assets-Information\" */\"@svgr/webpack?-svgo!../../icons/Information.svg\")\r\nexport const InteractionRequiredDark = () => import(/* webpackChunkName: \"icon-assets-InteractionRequiredDark\" */\"@svgr/webpack?-svgo!../../icons/InteractionRequiredDark.svg\");\r\nexport const InteractionRequiredLight = () => import(/* webpackChunkName: \"icon-assets-InteractionRequiredLight\" */\"@svgr/webpack?-svgo!../../icons/InteractionRequiredLight.svg\");;\r\nexport const Interested = () => import(/* webpackChunkName: \"icon-assets-Interested\" */\"@svgr/webpack?-svgo!../../icons/Interested.svg\");\r\nexport const LightRain = () => import(/* webpackChunkName: \"icon-assets-LightRain\" */\"@svgr/webpack?-svgo!../../icons/LightRain.svg\");\r\nexport const LightRainWhite = () => import(/* webpackChunkName: \"icon-assets-LightRainWhite\" */\"@svgr/webpack?-svgo!../../icons/LightRainWhite.svg\");\r\nexport const LightSnow = () => import(/* webpackChunkName: \"icon-assets-LightSnow\" */\"@svgr/webpack?-svgo!../../icons/LightSnow.svg\");\r\nexport const LightSnowWhite = () => import(/* webpackChunkName: \"icon-assets-LightSnowWhite\" */\"@svgr/webpack?-svgo!../../icons/LightSnowWhite.svg\");\r\nexport const Like = () => import(/* webpackChunkName: \"icon-assets-Like\" */\"@svgr/webpack?-svgo!../../icons/Like.svg\");\r\nexport const LikeText = () => import(/* webpackChunkName: \"icon-assets-LikeText\" */\"@svgr/webpack?-svgo!../../icons/LikeText.svg\");\r\nexport const Liked = () => import(/* webpackChunkName: \"icon-assets-Liked\" */\"@svgr/webpack?-svgo!../../icons/Liked.svg\");\r\nexport const LikedText = () => import(/* webpackChunkName: \"icon-assets-LikedText\" */\"@svgr/webpack?-svgo!../../icons/LikedText.svg\");\r\nexport const Line = () => import(/* webpackChunkName: \"icon-assets-Line\" */\"@svgr/webpack?-svgo!../../icons/Line.svg\");\r\nexport const LinkedIn = () => import(/* webpackChunkName: \"icon-assets-LinkedIn\" */\"@svgr/webpack?-svgo!../../icons/LinkedIn.svg\");\r\nexport const LinkedInBlack = () => import(/* webpackChunkName: \"icon-assets-LinkedInBlack\" */\"@svgr/webpack?-svgo!../../icons/LinkedInBlack.svg\");\r\nexport const LinkedInText = () => import(/* webpackChunkName: \"icon-assets-LinkedInText\" */\"@svgr/webpack?-svgo!../../icons/LinkedInText.svg\");\r\nexport const Mail = () => import(/* webpackChunkName: \"icon-assets-Mail\" */\"@svgr/webpack?-svgo!../../icons/Mail.svg\");\r\nexport const MailNoFill = () => import(/* webpackChunkName: \"icon-assets-MailNoFill\" */\"@svgr/webpack?-svgo!../../icons/MailNoFill.svg\");\r\nexport const MailBlack = () => import(/* webpackChunkName: \"icon-assets-MailBlack\" */\"@svgr/webpack?-svgo!../../icons/MailBlack.svg\");\r\nexport const ManagedBriefcase = () => import(/* webpackChunkName: \"icon-assets-ManagedBriefcase\" */\"@svgr/webpack?-svgo!../../icons/ManagedBriefcase.svg\");\r\nexport const Message = () => import(/* webpackChunkName: \"icon-assets-Message\" */\"@svgr/webpack?-svgo!../../icons/Message.svg\");\r\nexport const MessageNoFill = () => import(/* webpackChunkName: \"icon-assets-MessageNoFill\" */\"@svgr/webpack?-svgo!../../icons/MessageNoFill.svg\");\r\nexport const Messages = () => import(/* webpackChunkName: \"icon-assets-Messages\" */\"@svgr/webpack?-svgo!../../icons/Messages.svg\");\r\nexport const MicrosoftNews = () => import(/* webpackChunkName: \"icon-assets-MicrosoftNews\" */\"@svgr/webpack?-svgo!../../icons/MicrosoftNews.svg\");\r\nexport const MicrosoftNewsFull = () => import(/* webpackChunkName: \"icon-assets-MicrosoftNews\" */\"@svgr/webpack?-svgo!../../icons/MicrosoftNewsFull.svg\");\r\nexport const MicrosoftNewsFull_FR = () => import(/* webpackChunkName: \"icon-assets-MicrosoftNews_FR\" */\"@svgr/webpack?-svgo!../../icons/MicrosoftNewsFull_FR.svg\");\r\nexport const MicrosoftNewsFull_ZH = () => import(/* webpackChunkName: \"icon-assets-MicrosoftNews_ZH\" */\"@svgr/webpack?-svgo!../../icons/MicrosoftNewsFull_ZH.svg\");\r\nexport const ModerateRain = () => import(/* webpackChunkName: \"icon-assets-ModerateRain\" */\"@svgr/webpack?-svgo!../../icons/ModerateRain.svg\");\r\nexport const ModerateRainWhite = () => import(/* webpackChunkName: \"icon-assets-ModerateRainWhite\" */\"@svgr/webpack?-svgo!../../icons/ModerateRainWhite.svg\");\r\nexport const Movie = () => import(/* webpackChunkName: \"icon-assets-Movie\" */\"@svgr/webpack?-svgo!../../icons/Movie.svg\");\r\nexport const NightTime = () => import(/* webpackChunkName: \"icon-assets-NightTime\" */\"@svgr/webpack?-svgo!../../icons/NightTime.svg\");\r\nexport const NotificationFivePlusSign = () => import(/* webpackChunkName: \"icon-assets-Notification-Five-Plus-Sign\" */\"@svgr/webpack?-svgo!../../icons/NotificationFivePlusSign.svg\");\r\nexport const NotificationRefreshArrow = () => import(/* webpackChunkName: \"icon-assets-Notification-Five-Plus-Sign\" */\"@svgr/webpack?-svgo!../../icons/NotificationRefreshArrow.svg\");\r\nexport const OneDrive = () => import(/* webpackChunkName: \"icon-assets-OneDrive\" */\"@svgr/webpack?-svgo!../../icons/OneDrive.svg\");\r\nexport const OfficeFormsLogo = () => import(/* webpackChunkName: \"icon-assets-OfficeFormsLogo\" */\"@svgr/webpack?-svgo!../../icons/OfficeFormsLogo.svg\");\r\nexport const OneNote = () => import(/* webpackChunkName: \"icon-assets-OneNote\" */\"@svgr/webpack?-svgo!../../icons/OneNote.svg\");\r\nexport const Onetoc = () => import(/* webpackChunkName: \"icon-assets-Onetoc\" */\"@svgr/webpack?-svgo!../../icons/Onetoc.svg\");\r\nexport const Outlook = () => import(/* webpackChunkName: \"icon-assets-Outlook\" */\"@svgr/webpack?-svgo!../../icons/Outlook.svg\");\r\nexport const PartlyCloudyDay = () => import(/* webpackChunkName: \"icon-assets-PartlyCloudyDay\" */\"@svgr/webpack?-svgo!../../icons/PartlyCloudyDay.svg\");\r\nexport const PartlyCloudyDayWhite = () => import(/* webpackChunkName: \"icon-assets-PartlyCloudyDayWhite\" */\"@svgr/webpack?-svgo!../../icons/PartlyCloudyDayWhite.svg\");\r\nexport const PartlyCloudyNight = () => import(/* webpackChunkName: \"icon-assets-PartlyCloudyNight\" */\"@svgr/webpack?-svgo!../../icons/PartlyCloudyNight.svg\");\r\nexport const PartlyCloudyNightWhite = () => import(/* webpackChunkName: \"icon-assets-PartlyCloudyNightWhite\" */\"@svgr/webpack?-svgo!../../icons/PartlyCloudyNightWhite.svg\");\r\nexport const Pdf = () => import(/* webpackChunkName: \"icon-assets-Pdf\" */\"@svgr/webpack?-svgo!../../icons/Pdf.svg\");\r\nexport const People = () => import(/* webpackChunkName: \"icon-assets-People\" */\"@svgr/webpack?-svgo!../../icons/People.svg\");\r\nexport const Pin = () => import(/* webpackChunkName: \"icon-assets-Pin\" */\"@svgr/webpack?-svgo!../../icons/Pin.svg\");\r\nexport const PowerPoint = () => import(/* webpackChunkName: \"icon-assets-PowerPoint\" */\"@svgr/webpack?-svgo!../../icons/PowerPoint.svg\");\r\nexport const Pptx = () => import(/* webpackChunkName: \"icon-assets-Pptx\" */\"@svgr/webpack?-svgo!../../icons/Pptx.svg\");\r\nexport const RainShowersDay = () => import(/* webpackChunkName: \"icon-assets-RainShowersDay\" */\"@svgr/webpack?-svgo!../../icons/RainShowersDay.svg\");\r\nexport const RainShowersDayWhite = () => import(/* webpackChunkName: \"icon-assets-RainShowersDayWhite\" */\"@svgr/webpack?-svgo!../../icons/RainShowersDayWhite.svg\");\r\nexport const RainShowersNight = () => import(/* webpackChunkName: \"icon-assets-RainShowersNight\" */\"@svgr/webpack?-svgo!../../icons/RainShowersNight.svg\");\r\nexport const RainShowersNightWhite = () => import(/* webpackChunkName: \"icon-assets-RainShowersNightWhite\" */\"@svgr/webpack?-svgo!../../icons/RainShowersNightWhite.svg\");\r\nexport const RainSnow = () => import(/* webpackChunkName: \"icon-assets-RainSnow\" */\"@svgr/webpack?-svgo!../../icons/RainSnow.svg\");\r\nexport const RainSnowWhite = () => import(/* webpackChunkName: \"icon-assets-RainSnowWhite\" */\"@svgr/webpack?-svgo!../../icons/RainSnowWhite.svg\");\r\nexport const RainSnowShowersDay = () => import(/* webpackChunkName: \"icon-assets-RainSnowShowersDay\" */\"@svgr/webpack?-svgo!../../icons/RainSnowShowersDay.svg\");\r\nexport const RainSnowShowersDayWhite = () => import(/* webpackChunkName: \"icon-assets-RainSnowShowersDayWhite\" */\"@svgr/webpack?-svgo!../../icons/RainSnowShowersDayWhite.svg\");\r\nexport const RainSnowShowersNight = () => import(/* webpackChunkName: \"icon-assets-RainSnowShowersNight\" */\"@svgr/webpack?-svgo!../../icons/RainSnowShowersNight.svg\");\r\nexport const RainSnowShowersNightWhite = () => import(/* webpackChunkName: \"icon-assets-RainSnowShowersNightWhite\" */\"@svgr/webpack?-svgo!../../icons/RainSnowShowersNightWhite.svg\");\r\nexport const Refresh = () => import(/* webpackChunkName: \"icon-assets-Refresh\" */\"@svgr/webpack?-svgo!../../icons/Refresh.svg\");\r\nexport const Remove = () => import(/* webpackChunkName: \"icon-assets-Remove\" */\"@svgr/webpack?-svgo!../../icons/Remove.svg\");\r\nexport const VideoMediaIcon = () => import(/* webpackChunkName: \"icon-assets-VideoMediaIcon\" */\"@svgr/webpack?-svgo!../../icons/VideoMediaIcon.svg\");\r\nexport const VideoPlay = () => import(/* webpackChunkName: \"icon-assets-VideoPlay\" */\"@svgr/webpack?-svgo!../../icons/VideoPlay.svg\");\r\nexport const Save = () => import(/* webpackChunkName: \"icon-assets-Save\" */\"@svgr/webpack?-svgo!../../icons/Save.svg\");\r\nexport const Saved = () => import(/* webpackChunkName: \"icon-assets-Saved\" */\"@svgr/webpack?-svgo!../../icons/Saved.svg\");\r\nexport const Search = () => import(/* webpackChunkName: \"icon-assets-Search\" */\"@svgr/webpack?-svgo!../../icons/Search.svg\");\r\nexport const Share = () => import(/* webpackChunkName: \"icon-assets-Share\" */\"@svgr/webpack?-svgo!../../icons/Share.svg\");\r\nexport const ShareLight = () => import(/* webpackChunkName: \"icon-assets-ShareLight\" */\"@svgr/webpack?-svgo!../../icons/ShareLight.svg\");\r\nexport const Sharepoint = () => import(/* webpackChunkName: \"icon-assets-Sharepoint\" */\"@svgr/webpack?-svgo!../../icons/Sharepoint.svg\");\r\nexport const Skype = () => import(/* webpackChunkName: \"icon-assets-Skype\" */\"@svgr/webpack?-svgo!../../icons/Skype.svg\");\r\nexport const SkypeOffice = () => import(/* webpackChunkName: \"icon-assets-SkypeOffice\" */\"@svgr/webpack?-svgo!../../icons/SkypeOffice.svg\");\r\nexport const SnowShowersDay = () => import(/* webpackChunkName: \"icon-assets-SnowShowersDay\" */\"@svgr/webpack?-svgo!../../icons/SnowShowersDay.svg\");\r\nexport const SnowShowersDayWhite = () => import(/* webpackChunkName: \"icon-assets-SnowShowersDayWhite\" */\"@svgr/webpack?-svgo!../../icons/SnowShowersDayWhite.svg\");\r\nexport const SnowShowersNight = () => import(/* webpackChunkName: \"icon-assets-SnowShowersNight\" */\"@svgr/webpack?-svgo!../../icons/SnowShowersNight.svg\");\r\nexport const SnowShowersNightWhite = () => import(/* webpackChunkName: \"icon-assets-SnowShowersNightWhite\" */\"@svgr/webpack?-svgo!../../icons/SnowShowersNightWhite.svg\");\r\nexport const SunnyDay = () => import(/* webpackChunkName: \"icon-assets-SunnyDay\" */\"@svgr/webpack?-svgo!../../icons/SunnyDay.svg\");\r\nexport const SunnyDayWhite = () => import(/* webpackChunkName: \"icon-assets-SunnyDayWhite\" */\"@svgr/webpack?-svgo!../../icons/SunnyDayWhite.svg\");\r\nexport const Sway = () => import(/* webpackChunkName: \"icon-assets-Sway\" */\"@svgr/webpack?-svgo!../../icons/Sway.svg\");\r\nexport const SwayApp = () => import(/* webpackChunkName: \"icon-assets-SwayApp\" */\"@svgr/webpack?-svgo!../../icons/SwayApp.svg\");\r\nexport const Teams = () => import(/* webpackChunkName: \"icon-assets-Teams\" */\"@svgr/webpack?-svgo!../../icons/Teams.svg\");\r\nexport const ThumbnailView = () => import(/* webpackChunkName: \"icon-assets-ThumbnailView\" */\"@svgr/webpack?-svgo!../../icons/ThumbnailView.svg\");\r\nexport const Thunderstorms = () => import(/* webpackChunkName: \"icon-assets-Thunderstorms\" */\"@svgr/webpack?-svgo!../../icons/Thunderstorms.svg\");\r\nexport const ThunderstormsWhite = () => import(/* webpackChunkName: \"icon-assets-ThunderstormsWhite\" */\"@svgr/webpack?-svgo!../../icons/ThunderstormsWhite.svg\");\r\nexport const Trending = () => import(/* webpackChunkName: \"icon-assets-Trending\" */\"@svgr/webpack?-svgo!../../icons/Trending.svg\");\r\nexport const Twitter = () => import(/* webpackChunkName: \"icon-assets-Twitter\" */\"@svgr/webpack?-svgo!../../icons/Twitter.svg\");\r\nexport const TwitterBlack = () => import(/* webpackChunkName: \"icon-assets-TwitterBlack\" */\"@svgr/webpack?-svgo!../../icons/TwitterBlack.svg\");\r\nexport const TwitterText = () => import(/* webpackChunkName: \"icon-assets-TwitterText\" */\"@svgr/webpack?-svgo!../../icons/TwitterText.svg\");\r\nexport const Unpin = () => import(/* webpackChunkName: \"icon-assets-Unpin\" */\"@svgr/webpack?-svgo!../../icons/Unpin.svg\");\r\nexport const VerticalSeparator = () => import(/* webpackChunkName: \"icon-assets-VerticalSeparator\" */\"@svgr/webpack?-svgo!../../icons/VerticalSeparator.svg\");\r\nexport const Visio = () => import(/* webpackChunkName: \"icon-assets-Visio\" */\"@svgr/webpack?-svgo!../../icons/Visio.svg\");\r\nexport const Vsdx = () => import(/* webpackChunkName: \"icon-assets-Vsdx\" */\"@svgr/webpack?-svgo!../../icons/Vsdx.svg\");\r\nexport const WeatherAlert = () => import(/* webpackChunkName: \"icon-assets-WeatherAlert\" */\"@svgr/webpack?-svgo!../../icons/WeatherAlert.svg\");\r\nexport const WhatsApp = () => import(/* webpackChunkName: \"icon-assets-WhatsApp\" */\"@svgr/webpack?-svgo!../../icons/WhatsApp.svg\");\r\nexport const WhatsAppBlack = () => import(/* webpackChunkName: \"icon-assets-WhatsAppBlack\" */\"@svgr/webpack?-svgo!../../icons/WhatsAppBlack.svg\");\r\nexport const Windy = () => import(/* webpackChunkName: \"icon-assets-Windy\" */\"@svgr/webpack?-svgo!../../icons/Windy.svg\");\r\nexport const WindyWhite = () => import(/* webpackChunkName: \"icon-assets-WindyWhite\" */\"@svgr/webpack?-svgo!../../icons/WindyWhite.svg\");\r\nexport const Word = () => import(/* webpackChunkName: \"icon-assets-Word\" */\"@svgr/webpack?-svgo!../../icons/Word.svg\");\r\nexport const World = () => import(/* webpackChunkName: \"icon-assets-World\" */\"@svgr/webpack?-svgo!../../icons/World.svg\");\r\nexport const Xlsx = () => import(/* webpackChunkName: \"icon-assets-Xlsx\" */\"@svgr/webpack?-svgo!../../icons/Xlsx.svg\");\r\nexport const Yammer = () => import(/* webpackChunkName: \"icon-assets-Yammer\" */\"@svgr/webpack?-svgo!../../icons/Yammer.svg\");\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ManagedClasses } from \"@microsoft/fast-jss-manager\";\r\n\r\nimport { IconCssClasses } from \"./Icon.styles\";\r\nimport * as Glyph from \"./icons\";\r\nimport * as GlyphInline from \"./icons/GlyphInline\";\r\n\r\nexport interface IconManagedClasses extends ManagedClasses { }\r\n\r\nexport type GlyphType = (() => Promise) | string;\r\n\r\nexport { Glyph, GlyphInline };\r\n\r\n/**\r\n * Property contract for the {CardAction} component\r\n */\r\nexport interface IconHandledProps extends IconManagedClasses {\r\n /** Icon type props */\r\n glyphType: GlyphType,\r\n /** Aria label optional type props */\r\n ariaLabel?: string,\r\n width?: string,\r\n height?: string,\r\n fill?: string,\r\n onError?: (error: Error) => void,\r\n wrapperClassName?: string\r\n}\r\n\r\nexport interface IconUnhandledProps extends React.HTMLAttributes {\r\n}\r\n\r\nexport type IconProps = IconHandledProps & IconUnhandledProps;","// © Microsoft Corporation. All rights reserved.\r\n\r\n// TODO: This should be considered for moving it to the Interests experience wrapper, once that\r\n// code arrives, since this is specific to that experience\r\n\r\n/**\r\n * Subnav TabId Enum object\r\n * @export\r\n * @type {enum}\r\n */\r\nexport enum SubnavTabId {\r\n None = 0,\r\n MyFeed = 1,\r\n XFeed = 2,\r\n Interests = 3\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { IconHandledProps as BaseHandledProps, IconProps as BaseIconProps, IconManagedClasses, IconUnhandledProps } from \"./Icon.props\";\r\nimport { Glyph, GlyphInline, GlyphType } from \"./Icon.props\";\r\nimport manageJss, { ManagedJSSProps } from \"@microsoft/fast-jss-manager-react\";\r\n\r\nimport { Icon as BaseIcon } from \"./Icon\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { IconCssClasses as IconClassNameContract } from \"./Icon.styles\";\r\nimport { IconStyles } from \"./Icon.styles\";\r\nimport { Subtract } from \"utility-types\";\r\n\r\nconst Icon = manageJss(IconStyles)(BaseIcon);\r\ntype Icon = InstanceType;\r\ninterface IconHandledProps extends Subtract { }\r\ntype IconProps = ManagedJSSProps;\r\n\r\nexport {\r\n Icon,\r\n IconProps,\r\n IconClassNameContract,\r\n IconHandledProps,\r\n IconUnhandledProps,\r\n GlyphType,\r\n Glyph,\r\n GlyphInline\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ComponentStyles } from \"@microsoft/fast-jss-manager\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\n\r\n/** CSS class names to apply to various {CardAction} components */\r\nexport interface IconCssClasses {\r\n /** CSS class for the image icon */\r\n icon?: string,\r\n /** CSS class for the inline icon */\r\n icon_inline?: string\r\n}\r\n\r\n/**\r\n * The main JSS stylesheet for {CardAction}\r\n */\r\nexport const IconStyles: ComponentStyles = {\r\n icon: {\r\n \"max-height\": \"100%\",\r\n \"max-width\": \"100%\"\r\n },\r\n icon_inline: {\r\n \"&&\": {\r\n width: \"auto\",\r\n height: \"auto\"\r\n }\r\n }\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { IconHandledProps, IconProps, IconUnhandledProps } from \"./Icon.props\";\r\nimport React, { CSSProperties } from \"react\";\r\n\r\nimport Foundation from \"@microsoft/fast-components-foundation-react\";\r\nimport { Glyph } from \".\";\r\nimport { HandledPropsKeys } from \"@msnews/core\";\r\n\r\n/**\r\n * Icon state\r\n */\r\ninterface IconState {\r\n /**\r\n * Svg component that we are lazy loading. Normally, we would use React.lazy and React.suspense, but those are not recommended for \r\n * production with Preact. Using them will cause CardActions to break.\r\n */\r\n svgComponent?: React.ComponentType>;\r\n}\r\n\r\n/**\r\n * Icon component\r\n * @class - Icon\r\n * @classdesc - The Icon component. Renders the image with respective glyph icon\r\n * @default\r\n */\r\nexport class Icon extends Foundation {\r\n /**\r\n * Component HandledProps enumeration. Anything not enumerated here will be included in the experience root HTML tag via unhandledProps()\r\n */\r\n protected handledProps: HandledPropsKeys = {\r\n ariaLabel: undefined,\r\n fill: undefined,\r\n glyphType: undefined,\r\n height: undefined,\r\n managedClasses: undefined,\r\n onError: undefined,\r\n width: undefined,\r\n wrapperClassName: undefined\r\n };\r\n\r\n constructor(props: IconProps) {\r\n super(props);\r\n this.state = {\r\n svgComponent: null\r\n };\r\n }\r\n\r\n /**\r\n * If glyphType is a promise, lazy load the component with the promise. Once loaded, update state with the new\r\n * component.\r\n * @method\r\n */\r\n public componentDidMount() {\r\n const { glyphType } = this.props;\r\n\r\n if (typeof glyphType === \"function\") {\r\n glyphType().then((m) => {\r\n this.setState({ svgComponent: m.ReactComponent });\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * If glyphType is a promise and has changed, lazy load the new component with the promise. Once loaded, update\r\n * state with the new component.\r\n * @method\r\n * @param {IconProps} prevProps - props before update\r\n */\r\n public componentDidUpdate(prevProps: IconProps) {\r\n const { glyphType } = this.props;\r\n\r\n if (typeof glyphType === \"function\" && glyphType !== prevProps.glyphType) {\r\n glyphType().then((m) => {\r\n this.setState({ svgComponent: m.ReactComponent });\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Updating state before render. If there is no glyphType, we can set this.state.svgComponent to null. This avoids\r\n * an extra render if we tried to use setState in componentDidUpdate to set this.state.svgComponent to null.\r\n * @method\r\n * @param {IconProps} props - props to be used in the upcoming render\r\n * @param {IconState} state - state to be used in the upcoming render\r\n * @returns {IconState} - updated state to be used in the next render\r\n */\r\n public static getDerivedStateFromProps(props: IconProps, state: IconState): IconState {\r\n const { glyphType } = props;\r\n\r\n if (!glyphType) {\r\n return {\r\n svgComponent: null\r\n }\r\n } else {\r\n return state;\r\n }\r\n }\r\n\r\n /**\r\n * Render our lazy loaded svg component\r\n * @method\r\n * @param {React.ComponentType} LazyLoadedSvgComponent - the lazy loaded svg component we're going to render\r\n * @returns {JSX.Element} A JSX element with a span wrapping our lazy loaded svg component\r\n */\r\n private renderSvgComponent(LazyLoadedSvgComponent: React.ComponentType): JSX.Element {\r\n const { height, width, fill, managedClasses } = this.props;\r\n const attrProps: React.SVGAttributes = {};\r\n\r\n if (width) {\r\n attrProps.width = width;\r\n }\r\n\r\n if (height) {\r\n attrProps.height = height;\r\n }\r\n\r\n return ();\r\n }\r\n\r\n /**\r\n * Component renderer\r\n * @public\r\n * @method\r\n * @returns {JSX.Element} the image component containing a glyph icon\r\n */\r\n public render(): JSX.Element {\r\n const { ariaLabel, height, managedClasses, glyphType, width, wrapperClassName, fill } = this.props;\r\n if (!glyphType) {\r\n return (null);\r\n }\r\n const role = ariaLabel ? \"img\" : \"presentation\";\r\n\r\n if (typeof glyphType === \"string\") {\r\n // when glyphType is string, use img tag\r\n let icon = glyphType as string;\r\n if (Glyph[icon]) {\r\n icon = Glyph[icon];\r\n }\r\n return ();\r\n }\r\n\r\n let wrapperCss: CSSProperties = {};\r\n if (width) {\r\n wrapperCss.width = width;\r\n }\r\n if (height) {\r\n wrapperCss.height = height;\r\n }\r\n\r\n if (!wrapperCss.width && !wrapperCss.height) {\r\n wrapperCss = undefined;\r\n }\r\n\r\n return (\r\n \r\n { this.state.svgComponent ? this.renderSvgComponent(this.state.svgComponent) : () }\r\n \r\n );\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { minimumHostPagePathSegments } from \"../constants\";\r\n\r\n/**\r\n * The HostPage interface uses words defined by the Prime project for us to locate in what hostpage\r\n * the Feeds project is running.\r\n */\r\nexport interface IHostPage {\r\n originalUrl: string; // ex: https://www.msn.com/spartan/ntp/interests/my?fdhead=gizmodemo\r\n verticalKey: string, // ex: spartan or compass\r\n categoryKey: string, // ex: dhp or ntp\r\n hostName: string, // ex: www.msn.com\r\n topDomain: string, // ex: msn.com or msn.cn\r\n subcategoryKey?: string // ex: interests or discover\r\n}\r\n\r\nexport namespace HostPage {\r\n /**\r\n * This function extracts the hostPage information from the passed in href. This is based on the\r\n * Prime pathname convention of \"/vertical/category/subcategory\". If the passed href does not have at least the\r\n * category, then null is returned instead as this is considered an invalid URL.\r\n * @param {string} href - The URL, which will be used to extract the hostPage\r\n * @returns {IHostPage | null}\r\n */\r\n export function getHostPageFromUrl(href: string): IHostPage | null {\r\n const url = new URL(href);\r\n\r\n const host = url.hostname;\r\n const pathnameSegments = url.pathname.split(\"/\");\r\n\r\n // for cookie stamping that needs the msn.com or msn.cn path isntead of using the full host value\r\n const topDomainName = (host.match(/[^.]+\\.[^.\\d]+$/) || {})[0] || \"\";\r\n\r\n /**\r\n * The + 1 in the following statement is take into account the empty string \"segment\"\r\n * that would be to the left of the first backslash in a valid path like \"/spartan/ntp\"\r\n */\r\n if (pathnameSegments.length <= minimumHostPagePathSegments) {\r\n return {\r\n originalUrl: href,\r\n categoryKey: null,\r\n verticalKey: null,\r\n hostName: host,\r\n topDomain: topDomainName\r\n }; // When the user url doesn't have atleast two pathsegments the vertical and category keys are null\r\n }\r\n\r\n /**\r\n * Consider path segments that have market in it e.g.\r\n * /en-us/news/other/title/ar-cmsId\r\n * /en-us/video/animals\r\n * /en-us/sports/nfl/scores\r\n */\r\n const isMarketPresent = pathnameSegments[1].length === 5 && pathnameSegments[1].split(\"-\").length === 2;\r\n const indexOffset = isMarketPresent ? 1 : 0;\r\n\r\n let hostPage: IHostPage = {\r\n originalUrl: href,\r\n categoryKey: pathnameSegments[2 + indexOffset],\r\n verticalKey: pathnameSegments[1 + indexOffset],\r\n hostName: host,\r\n topDomain: topDomainName\r\n };\r\n\r\n if (pathnameSegments.length >= minimumHostPagePathSegments) {\r\n hostPage.subcategoryKey = pathnameSegments[3 + indexOffset];\r\n }\r\n return hostPage;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n// define function to generate valid rfc4122 \"Version 4\"-compliant randomized guid value\r\n// http://www.ietf.org/rfc/rfc4122.txt (Section 4.4)\r\n\r\nexport default function guidGen() {\r\n // generate an additional random timestamp-base seed.\r\n // the Math.random function is itself seeded, but if two clients happen to have\r\n // seeded their random number generator with the same value, then they will generate\r\n // duplicate guids and collide. With this added timestamp seed, the first thirteen characters\r\n // will be adjusted by the timestamp of the call as well, so even if the clients' random number generated\r\n // are seeded with the same value, they would have to call this method at the EXACT same millisecond\r\n // to generate the same GUID. Probably not a very high probability.\r\n var timestampSeed = new Date().getTime();\r\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, getDigit);\r\n\r\n function getDigit(c) {\r\n // generate a random timestmp-seeded hex digit\r\n var seededRandom = (timestampSeed + Math.random() * 16) % 16 | 0;\r\n\r\n // adjust the timestamp seed so that it changes for the first thirteen characters\r\n timestampSeed = Math.floor(timestampSeed / 16);\r\n\r\n // if the position is an \"x\", just use the random number. If it's a \"y\", we\r\n // we want to make sure the value is only the lowest three bits of the random\r\n // number, with a 1 in the 4-bit position. See RFC4122 for more info.\r\n return (c == 'x' ? seededRandom : (seededRandom & 0x7 | 0x8)).toString(16);\r\n }\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Enum for different auth cookie names\r\n * @enum\r\n */\r\nexport enum AuthCookieName {\r\n Anon = \"ANON\",\r\n AppAnon = \"APP_ANON\",\r\n Unknown = \"\"\r\n}\r\n\r\n/**\r\n * List of http-readable cookies that indicate the presence of an auth cookie\r\n */\r\nexport enum AuthCookieExistsCookieName {\r\n AnonCookieExists = \"ace\",\r\n AppAnonCookieExists = \"aace\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { AppError, WebWorkerErrors, logger, tryGetPerfTimeline } from \"@msnews/diagnostics\";\r\n\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\nimport { isUserNavigatingAway } from \"../utilities/UserNavigation\";\r\n\r\ndeclare global {\r\n /** Adding webWorker to Window */\r\n interface Window {\r\n /** Global flag indicating if web worker is present */\r\n _isWebWorkerPresent: boolean;\r\n\r\n /** Web worker instance */\r\n webWorker?: Worker;\r\n\r\n /** Web worker runtime errors */\r\n webWorkerErrors?: any[];\r\n }\r\n}\r\n\r\n/** Web worker request interface. */\r\nexport interface WebWorkerRequest {\r\n /** The message id. */\r\n id: string;\r\n\r\n /** The type of message. */\r\n type?: string;\r\n\r\n /** The additional message payload */\r\n payload?: any;\r\n}\r\n\r\n/** Web worker response interface. */\r\nexport interface WebWorkerResponse {\r\n /** The message id. */\r\n id: string;\r\n\r\n /** The item fetched status. */\r\n fetched: boolean;\r\n\r\n /** The item payload. */\r\n payload: any;\r\n}\r\n\r\n/**\r\n * Reports web worker presence.\r\n *\r\n * **NOTE**: Make sure to update the **_window._isWebWorkerPresent_** flag as well\r\n * while updating this, since the diagnostics lib doesn't have access to the core lib.\r\n */\r\nexport let isWebWorkerPresent: boolean;\r\n\r\n/** Web-worker message-map entry */\r\nexport interface WebWorkerMessageMapEntry {\r\n /** The message type (default is \"data\") */\r\n type: string;\r\n\r\n /** The callback, if any, that receives the data payload for the message */\r\n callback: (data: any) => void;\r\n}\r\n\r\n/** The message map from message id to the WebWorkerMessageMapEntry */\r\nconst messages = new Map();\r\n\r\nlet logAppError: (data: AppError) => void;\r\n\r\n/** The perf timeline for the web-worker interface */\r\nconst perfTimeline = tryGetPerfTimeline(\"WebWorkerUtility\", \"WebWorkerUtility\", true);\r\n\r\n/**\r\n * Initialize isWebWorkerPresent. And this function also serve as test hook.\r\n * @param override - The test override\r\n */\r\nexport function init(override?: boolean): void {\r\n isWebWorkerPresent = false;\r\n if (canUseDOM()) {\r\n isWebWorkerPresent = (typeof override !== \"undefined\" ? override : !!window.webWorker);\r\n window._isWebWorkerPresent = isWebWorkerPresent;\r\n }\r\n\r\n if (!isWebWorkerPresent) {\r\n return;\r\n }\r\n\r\n window.webWorker.onmessage = (event: MessageEvent) => {\r\n const { data: response } = event;\r\n const pendingMessage = messages.get(response.id);\r\n\r\n if (!pendingMessage) {\r\n return;\r\n }\r\n\r\n if (pendingMessage.type === \"data\") {\r\n messages.delete(response.id);\r\n }\r\n\r\n const callback = pendingMessage.callback;\r\n if (callback) {\r\n callback(response);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * This function utility is converting web worker's postMessage communication into an async function.\r\n * It's sends given request to web worker, returns a promise, and promise is resolved when response is received from web worker.\r\n * @param request - The message to send\r\n * @param timeoutInMs(optional) - Timeout in milliseconds after which the promise will resolve with the default(failed) web worker response\r\n * @returns A promise to return WebWorkerResponse\r\n */\r\nexport function getFromWebWorker(request: WebWorkerRequest, timeoutInMs?: number): Promise {\r\n const defaultResponse = {\r\n id: (request && request.id) || \"\",\r\n fetched: false,\r\n payload: null\r\n };\r\n\r\n if (!isWebWorkerPresent || !request || !request.id) {\r\n return Promise.resolve(defaultResponse);\r\n }\r\n\r\n let endGetFromWebWorker = perfTimeline && perfTimeline.startMeasure(request.id).endMeasure;\r\n\r\n let promiseTimeout;\r\n let timeOutPromise;\r\n\r\n // If timeout is provided, create a promise that will resolve after the timeout expires\r\n if (timeoutInMs) {\r\n timeOutPromise = new Promise(resolve => {\r\n promiseTimeout = setTimeout(\r\n () => {\r\n // Request timed out, we need not process the response if it's returned later, remove from messages map\r\n messages.delete(request.id);\r\n\r\n const errorMessage = `Web worker request timed out after ${timeoutInMs}ms for request id: [${request.id}]`;\r\n\r\n if (logAppError) {\r\n logAppError({\r\n ...WebWorkerErrors.MessageTimeout,\r\n message: `Web worker request timed out`,\r\n pb: {\r\n ...WebWorkerErrors.MessageTimeout.pb,\r\n customMessage: errorMessage\r\n }\r\n });\r\n } else {\r\n logger.logError(errorMessage);\r\n }\r\n\r\n if (endGetFromWebWorker) {\r\n endGetFromWebWorker(\"timeout\");\r\n }\r\n\r\n resolve(defaultResponse);\r\n },\r\n timeoutInMs);\r\n });\r\n }\r\n\r\n const webWorkerPromise: Promise = new Promise(\r\n resolve => {\r\n const onMessage = (response: WebWorkerResponse) => {\r\n // We got a response from web worker, clear the promise timeout if it exists.\r\n if (promiseTimeout) {\r\n clearTimeout(promiseTimeout);\r\n }\r\n\r\n if (endGetFromWebWorker) {\r\n endGetFromWebWorker();\r\n }\r\n\r\n resolve(response);\r\n };\r\n\r\n messages.set(request.id, {\r\n type: request.type || \"data\",\r\n callback: onMessage\r\n });\r\n }\r\n );\r\n\r\n window.webWorker.postMessage({\r\n id: request.id,\r\n type: request.type || \"data\",\r\n payload: request.payload\r\n });\r\n\r\n return timeoutInMs\r\n ? Promise.race([webWorkerPromise, timeOutPromise])\r\n : webWorkerPromise;\r\n}\r\n\r\n/**\r\n * Sends given request to the web worker.\r\n * @param request - The message to send\r\n */\r\nexport function sendToWebWorker(request: WebWorkerRequest): void {\r\n if (!isWebWorkerPresent || !request || !request.id) {\r\n return;\r\n }\r\n\r\n window.webWorker.postMessage({\r\n id: request.id,\r\n type: request.type || \"command\",\r\n payload: request.payload || null\r\n });\r\n}\r\n\r\n/**\r\n * Subscribes to web worker notification\r\n * @param request subscription request\r\n * @param callback the callback to execute when notification is received\r\n */\r\nexport function subscribeWebWorkerNotification(request: WebWorkerRequest, callback: (payload: any) => void): void {\r\n if (!isWebWorkerPresent || !request || request.type !== \"subscription\" || !callback) {\r\n return;\r\n }\r\n\r\n messages.set(request.id, { type: \"subscription\", callback });\r\n window.webWorker.postMessage(request);\r\n}\r\n\r\n/**\r\n * Sets the AppError logging function and adds event listener for web worker errors.\r\n * @param handler - Error tracker function(track.trackAppErrorEvent) from @msnews/telemetry-transitional\r\n */\r\nexport function trackWebWorkerErrors(trackAppErrorEvent: (data: AppError) => void): void {\r\n if (!isWebWorkerPresent || !trackAppErrorEvent || typeof trackAppErrorEvent !== \"function\") {\r\n return;\r\n }\r\n\r\n logAppError = function(data: AppError): void {\r\n try {\r\n // Do not fire app error if user is navigating away.\r\n if (isUserNavigatingAway()) {\r\n return;\r\n }\r\n\r\n trackAppErrorEvent(data);\r\n } catch (ex) {\r\n logger.logError(`Failed to log web worker AppError. Error: ${JSON.stringify(ex)}`);\r\n }\r\n };\r\n\r\n // callback for unhandled runtime exceptions\r\n window.webWorker.onerror = onWebWorkerRuntimeError;\r\n\r\n // Callback for handled errors(logger.error) in web worker\r\n const onWorkerErrorMessage = (response: WebWorkerResponse) => {\r\n logAppError({\r\n ...WebWorkerErrors.HandledError,\r\n message: \"Web worker error\",\r\n pb: {\r\n ...WebWorkerErrors.HandledError.pb,\r\n customMessage: JSON.stringify(response.payload || \"\")\r\n }\r\n });\r\n };\r\n\r\n subscribeWebWorkerNotification({ id: \"WebWorkerError\", type: \"subscription\" }, onWorkerErrorMessage);\r\n\r\n // Read and log web worker errors that were reported before the main thread initialized.\r\n if (window.webWorkerErrors && Array.isArray(window.webWorkerErrors)) {\r\n window.webWorkerErrors.forEach(error => {\r\n onWebWorkerRuntimeError(error);\r\n });\r\n\r\n delete window.webWorkerErrors;\r\n }\r\n}\r\n\r\n/**\r\n * Handler for web worker error events\r\n * @param event web worker ErrorEvent\r\n */\r\nfunction onWebWorkerRuntimeError(event: ErrorEvent): void {\r\n // If ErrorEvent does not contain the filename, only possible reason could be that the web worker script 404ed.\r\n if (!event.filename) {\r\n isWebWorkerPresent = false;\r\n window._isWebWorkerPresent = isWebWorkerPresent;\r\n window.webWorker.terminate();\r\n\r\n logAppError({\r\n ...WebWorkerErrors.FileNotFound,\r\n message: \"Web worker script not found\",\r\n pb: {\r\n ...WebWorkerErrors.FileNotFound.pb,\r\n customMessage: JSON.stringify(getErrorDetails(event))\r\n }\r\n });\r\n\r\n return;\r\n }\r\n\r\n logAppError({\r\n ...WebWorkerErrors.RuntimeError,\r\n message: \"Web worker runtime error\",\r\n pb: {\r\n ...WebWorkerErrors.RuntimeError.pb,\r\n customMessage: JSON.stringify(getErrorDetails(event))\r\n }\r\n });\r\n}\r\n\r\n/** Extracts properties from error event. Direct JSON.stringify removes all properties except `isTrusted` */\r\nfunction getErrorDetails(error: ErrorEvent): any {\r\n return JSON.stringify({\r\n filename: error.filename,\r\n message: error.message,\r\n lineno: error.lineno\r\n });\r\n}\r\n\r\ninit();\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\n/**\r\n * If user is navigating away or not.\r\n */\r\nlet userNavigatingAway: boolean = false;\r\n\r\nif (canUseDOM()) {\r\n // Sets isUserNavigatingAway = true when user is navigating away.\r\n window.addEventListener(\"beforeunload\", function () {\r\n userNavigatingAway = true;\r\n });\r\n}\r\n\r\n/**\r\n * Is user navigating away.\r\n * @returns true if user is navigating away.\r\n */\r\nexport function isUserNavigatingAway(): boolean {\r\n return userNavigatingAway;\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n///\r\n\r\n/**\r\n * Used to mock the LRU cache in unit test environments.\r\n * Partial is used to highlight this class is a subset of LRUCache and only\r\n * implements the functions we currently use out of this API. If more functions are\r\n * utilized they will need to be implmented here in this class.\r\n */\r\nexport class MockLRUCache implements Partial> {\r\n /** cache */\r\n private cacheMap: Map = new Map();\r\n\r\n /** Check if cache key exists */\r\n public async has(key: string): Promise {\r\n return !!this.cacheMap[key];\r\n }\r\n /** Get cached value by key */\r\n public async get(key: string): Promise {\r\n return this.cacheMap[key];\r\n }\r\n /** Set cached value by key */\r\n public async set(key: string, value: any, maxAge?: number): Promise {\r\n this.cacheMap[key] = value;\r\n return true;\r\n }\r\n /** Delete cached key-value pair */\r\n public async del(key: string): Promise {\r\n delete this.cacheMap[key];\r\n }\r\n /** Get count of total items cached */\r\n public async itemCount(): Promise {\r\n return Object.keys(this.cacheMap).length;\r\n }\r\n /** Reset entire cache */\r\n public async reset(): Promise {\r\n this.cacheMap = new Map();\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { logger } from \"../logging\";\r\n\r\n/** Perf marker start suffix */\r\nconst StartMarkSuffix: string = \"-start\";\r\n\r\n/**\r\n * PerfMarker facilitates adding and measuring performance markers.\r\n */\r\nclass PerfMarker {\r\n /** The single instance of the PerfMarker class. */\r\n private static instance: PerfMarker;\r\n\r\n /** The performance object. */\r\n private performance: Performance;\r\n\r\n /** Perf marker end suffix */\r\n private readonly endMarkSuffix: string = \"-end\";\r\n\r\n /**\r\n * The constructor.\r\n */\r\n private constructor() {\r\n this.initialize(performance);\r\n }\r\n\r\n /**\r\n * Returns singleton class instance.\r\n * @returns The class instance\r\n */\r\n public static getInstance(): PerfMarker {\r\n if (!PerfMarker.instance) {\r\n PerfMarker.instance = new PerfMarker();\r\n }\r\n\r\n return PerfMarker.instance;\r\n }\r\n\r\n /**\r\n * Initialize the member variables.\r\n * @param performance - The performance object instance.\r\n */\r\n public initialize(performance: Performance): void {\r\n this.performance = performance;\r\n }\r\n\r\n /**\r\n * Adds given perf marker to browser.\r\n * @param name - Perf marker to start\r\n */\r\n public startMark(name: string): void {\r\n this.singleMark(name + StartMarkSuffix);\r\n }\r\n\r\n /**\r\n * Adds given perf marker to browser.\r\n * @param name - Perf marker to end\r\n */\r\n public endMark(name: string): void {\r\n this.singleMark(name + this.endMarkSuffix);\r\n this.measureStartEnd(name);\r\n }\r\n\r\n /**\r\n * Adds a single performance marker via the performance API.\r\n * @param name - the name of the perf marker\r\n */\r\n public singleMark(name: string): void {\r\n let performance = this.performance;\r\n if (performance && performance.mark) {\r\n performance.mark(name);\r\n }\r\n }\r\n\r\n /**\r\n * Utility method to add start/end marker around a promise.\r\n * @param name - The name of perf marker\r\n * @param getPromise - The callback\r\n * @returns The promise\r\n */\r\n public async measurePromise(name: string, getPromise: () => Promise): Promise {\r\n this.startMark(name);\r\n let result = await getPromise();\r\n this.endMark(name);\r\n return result;\r\n }\r\n\r\n /**\r\n * Telemetry call this method to collect existing perf markers that each Experience has added.\r\n * @param experienceName - Perf marker name in case of custom marker / Experience name\r\n * @returns {IPerfMarkers}\r\n */\r\n public measurePerfMarker(experienceName: string): IPerfMarkers {\r\n\r\n if (!this.performance) {\r\n return;\r\n }\r\n\r\n let perfMarkers: { [id: string]: PerfMarkerDetail; } = {};\r\n\r\n // Get all perf markers from browser.\r\n let perfEntries = this.performance.getEntriesByType(\"mark\");\r\n if (!perfEntries) {\r\n return perfMarkers;\r\n }\r\n\r\n // Iterate through perfEntries received from browser.\r\n for (let i = 0; i < perfEntries.length; i++) {\r\n\r\n // if marker name in perfEntries object is null\r\n let markerName: string = perfEntries[i].name;\r\n if (!markerName || perfEntries[i].startTime == null) {\r\n continue;\r\n }\r\n\r\n // Remove start and end suffix.\r\n markerName = markerName.replace(/-(end|start)$/i, \"\");\r\n\r\n // if marker name retrieved from browser is not for this experience then continue with next marker.\r\n if (!markerName.startsWith(experienceName)) {\r\n continue;\r\n }\r\n\r\n let perfMarkerDetail = perfMarkers[markerName] || new PerfMarkerDetail(markerName);\r\n perfMarkerDetail.processPerfEntry(perfEntries[i]);\r\n if (perfMarkerDetail.isValid) {\r\n perfMarkers[markerName] = perfMarkerDetail;\r\n }\r\n }\r\n\r\n return perfMarkers;\r\n }\r\n\r\n /**\r\n * Measures the given marker name's start/end markers.\r\n * @param name - The name of the marker whose -start and -end to measure\r\n */\r\n private measureStartEnd(name: string): void {\r\n let performance = this.performance;\r\n if (performance && performance.measure) {\r\n try {\r\n performance.measure(\r\n name,\r\n name + StartMarkSuffix,\r\n name + this.endMarkSuffix\r\n );\r\n } catch (ex) {\r\n // An exception will be thrown if either start/end marker didn't exist.\r\n // We swallo this exception and log an error so that actual code's execution\r\n // would not be effected due to performance measurement code.\r\n logger.logError(`Error while attempting to measure start/end of '${name}'. Error: ${ex}`);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport const perfMarker = PerfMarker.getInstance();\r\n\r\n/**\r\n * Interface defining attributes of each per marker.\r\n */\r\nexport interface IPerfMarkers {\r\n [key: string]: PerfMarkerDetail;\r\n}\r\n\r\n/**\r\n * Interface defining perf markers.\r\n */\r\nclass PerfMarkerDetail {\r\n /** marker name */\r\n public readonly markerName: string;\r\n /** first start time */\r\n public firstStartTime: number;\r\n /** start time */\r\n public startTime: number;\r\n /** duration */\r\n public duration: number = 0;\r\n\r\n /**\r\n * Sets marker name.\r\n */\r\n constructor(markerName: string) {\r\n this.markerName = markerName;\r\n }\r\n\r\n /**\r\n * Check if given marker is valid. If marker has a start time then it is a valid marker.\r\n * @returns True if valid else false.\r\n */\r\n get isValid(): boolean {\r\n return this.startTime != null;\r\n }\r\n\r\n /**\r\n * Sum up start and end marker duraiton per marker name.\r\n */\r\n public processPerfEntry(perfEntry: PerformanceEntry): void {\r\n\r\n // If given mark is a start mark\r\n if (perfEntry.name.endsWith(StartMarkSuffix)) {\r\n\r\n // If this is a start mark and firstStartTime is undefined then assign value of startTime now.\r\n if (!this.firstStartTime) {\r\n this.firstStartTime = perfEntry.startTime;\r\n }\r\n\r\n // Change start time to start time of current mark.\r\n this.startTime = perfEntry.startTime;\r\n\r\n } else if (this.startTime != null) {\r\n // This is is not a start mark. Assuming this is end mark, check start time of this mark is set earlier. if set properly then proceed.\r\n // else likely a candiddate to skip \"if\" part.\r\n\r\n // This is a end mark. Add earlier duration plus current start time minus this start time.\r\n this.duration += perfEntry.startTime - this.startTime;\r\n\r\n // reset start time so we can recalculate the next start/end pair correctly\r\n this.startTime = null;\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { requireAsync } from \"./RequireAsync\";\r\n\r\n/**\r\n * Integration function to retrieve the prime track object.\r\n *\r\n * @export\r\n * @return {Promise} - Resolves if the track object could be loaded, rejects otherwise.\r\n */\r\nexport let getTrack: IGetTrack = () => {\r\n return requireAsync(\"track\");\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Mediator events\r\n * @export\r\n * @type {object}\r\n */\r\nexport const MediatorEventNames = {\r\n // Event fired when content actions attributes are updated (eg: new video is loaded)\r\n ContentActionsUpdated: \"contentActionsUpdated\",\r\n // Event fired when a feed is successfully followed\r\n FeedFollowed: \"feedFollowed\",\r\n // Event fired when a feed is successfully followed/un-followed to let pre-load\r\n // framework know it needs to refresh the page\r\n ForcePageReload: \"forcePageReload\",\r\n // Event fired when a feed is successfully followed/un-followed\r\n FollowedTopicsUpdated: \"followedTopicsUpdated\",\r\n // Event to fire to show a specific mediated coach mark\r\n MediatedCoachMark: \"mediated_coach_mark\",\r\n // Event fired by Prime when the tab is being changed\r\n TabNavigation: \"tab_navigation\",\r\n // Event that tells Prime feedsNav module to navigate to the specified URL\r\n TabNavigateTo: \"tab_navigate_to\",\r\n // Event fired when a topic is followed/unfollowed so SPA can re-act\r\n TopicAction: \"topic_action\",\r\n // Event fired when a 360 experience is launched\r\n Msn360: \"msn360\",\r\n // Event to fire to show card action menu\r\n CardActionInit: \"cardActionInit\",\r\n // Event to fire to post card action menu\r\n CardActionPost: \"cardActionPostEvent\",\r\n // Event to fire when interests render complete\r\n InterestsRenderComplete: \"interestsRenderCompleteEvent\",\r\n // Event to fire when an Xfeed needs to load\r\n RenderXFeed: \"show_xfeed_content\",\r\n // Event to fire when a pivot needs to load by id\r\n ShowPivotById: \"show_pivot_by_id\",\r\n // Event that tells Prime infopane module to resume the auto-rotation\r\n ResumeInfopaneAutoRotate: \"resumeInfopaneAutoRotate\"\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { HeadingProps } from \"@microsoft/fast-components-react-msft\";\r\n\r\n/**\r\n * An enum for intra article component position values\r\n *\r\n * @export\r\n * @enum IntraArticleComponentPosition\r\n */\r\nexport enum IntraArticleComponentPosition {\r\n Normal = \"normal\",\r\n Wide = \"wide\"\r\n}\r\n\r\n/**\r\n * An enum for views article component types\r\n *\r\n * @export\r\n * @enum IntraArticleComponentType\r\n */\r\nexport enum IntraArticleComponentType {\r\n ArticleReader = \"articlereader\",\r\n InlineImage = \"inlineimage\",\r\n InlineSlideshow = \"inlineslideshow\",\r\n InlineVideo = \"inlinevideo\",\r\n FacebookEmbed = \"facebookembed\",\r\n TwitterEmbed = \"twitterembed\",\r\n InstagramEmbed = \"instagramembed\",\r\n GiphyEmbed = \"giphyembed\",\r\n GraphiqEmbed = \"graphiqembed\",\r\n PinterestEmbed = \"pinterestembed\",\r\n TextParagraph = \"textparagraph\",\r\n Unknown = \"unknown\"\r\n}\r\n\r\n/**\r\n * An interface for SocialEmbedData contract\r\n *\r\n * @export\r\n * @interface SocialEmbedData\r\n */\r\nexport interface SocialEmbedData {\r\n /**\r\n * Social feed attribution\r\n * @type {string}\r\n */\r\n attribution?: string;\r\n\r\n /**\r\n * Url to fetch social feed from provider\r\n * @type {string}\r\n */\r\n feedHref: string;\r\n\r\n /**\r\n * Embed identifier\r\n * @type {string}\r\n */\r\n id: string;\r\n\r\n /**\r\n * Title for the social feed\r\n * @type {string}\r\n */\r\n title?: string;\r\n\r\n /**\r\n * Social embed type\r\n * @type {IntraArticleComponentType}\r\n */\r\n type: IntraArticleComponentType;\r\n}\r\n\r\n/**\r\n * An interface for IntraArticleComponent contract\r\n *\r\n * @export\r\n * @interface IntraArticleComponent\r\n */\r\nexport interface IntraArticleComponent {\r\n /**\r\n * CMS document id\r\n * @type {string}\r\n */\r\n cmsDocumentId?: string;\r\n\r\n /**\r\n * Additional component data\r\n * @type {unknown}\r\n */\r\n data?: unknown;\r\n\r\n /**\r\n * Message to show if error encountered while loading component\r\n * @type {HeadingProps}\r\n */\r\n loadError?: HeadingProps;\r\n\r\n /**\r\n * Ingested component markup\r\n * @type {string}\r\n */\r\n marker: string;\r\n\r\n /**\r\n * Position index in ingested article body markup\r\n * @type {number}\r\n */\r\n startIndex: number;\r\n\r\n /**\r\n * Expected component positioning inside article body\r\n * @type {IntraArticleComponentPosition}\r\n */\r\n position?: IntraArticleComponentPosition;\r\n\r\n /**\r\n * Type of component\r\n * @type {IntraArticleComponentType}\r\n */\r\n type: IntraArticleComponentType;\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { requireAsync } from \"./RequireAsync\";\r\n\r\n/**\r\n * Integration function to wait on track extension complete canary.\r\n *\r\n * @export\r\n * @return {Promise} - Resolves if track extension canary is define, rejects otherwise.\r\n */\r\nexport let getTrackExtCompleteCanary: IGetTrackExtComplete = () => {\r\n return requireAsync(\"c.trackExtComplete\");\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { getTrack } from \"./PrimeTrack\";\r\nimport { getTrackExtCompleteCanary } from \"./PrimeTrackExtensionComplete\";\r\nimport { getTrackInfo } from \"./PrimeTrackInfo\";\r\nimport { AppError } from \"@msnews/diagnostics\";\r\n\r\ntype trackingEventCall = {event: Event, element: HTMLElement, destination: string, headline: string};\r\ntype trackPartialImpression = {elem?: HTMLElement, visibilityCheck?: boolean, mechanism?: TrackMechanism, topLevelContainerType?: string};\r\n\r\nlet trackingResolved: boolean = false;\r\nlet trackingObject: PrimeGlobal.ITrack = null;\r\nlet trackExtCompleted: any = null;\r\nlet trackEventBuffer: trackingEventCall[] = [];\r\nlet trackImpressionBuffer: trackPartialImpression[] = [];\r\nlet trackAppErrorEventBuffer: AppError[] = [];\r\nlet trackingPromiseCalled: boolean = false;\r\n\r\n// Following code is to decouple Prime dependency from initial state of experience. Once tracking is ported to Peregrine, it would not be needed.\r\n/**\r\n * Send the tracking call\r\n * @param {Event} event event object\r\n * @param {HTMLElement} element form code\r\n * @param {string} destination text\r\n * @param {string} headline text\r\n * @void\r\n */\r\nfunction sendTrackingCall(event: Event, element: HTMLElement, destination: string, headline: string): void {\r\n trackingObject.trackEvent(event, element, destination, headline);\r\n}\r\n\r\n/**\r\n * Makes the partial page request\r\n * @param {HTMLElement} elem object\r\n * @param {boolean} visibilityCheck\r\n * @param {TrackMechanism} mechanism\r\n * @param {string} topLevelContainerType\r\n * @void\r\n */\r\nfunction sendPartialPageRequest(elem?: HTMLElement, visibilityCheck?: boolean, mechanism?: TrackMechanism, topLevelContainerType?: string): void {\r\n trackingObject.trackPartialImpression(elem, visibilityCheck, mechanism, topLevelContainerType);\r\n}\r\n\r\n/**\r\n * Converts the AppError object to the Prime AppError type and make the trackAppErrorEvent call\r\n * @param appError - App error object\r\n */\r\nfunction sendTrackAppErrorEvent(appError: AppError): void {\r\n trackingObject.trackAppErrorEvent({ errId: appError.id, errSource: appError.source, errMsg: appError.message });\r\n}\r\n\r\n/**\r\n * Processes the pending tracking and page impresssion calls for statics.\r\n * Dependencies: getTrack(), getTrackExtCompleteCanary()\r\n * @void\r\n */\r\nfunction processPendingTrackingCall(): void {\r\n Promise.all([getTrack(), getTrackExtCompleteCanary()])\r\n .then(modules => {\r\n [trackingObject, trackExtCompleted] = modules;\r\n\r\n // at this point we will process any pending requests and resolve tracking\r\n trackingResolved = true;\r\n if (trackEventBuffer.length > 0) {\r\n trackEventBuffer.forEach(eventObj => {\r\n try {\r\n sendTrackingCall(eventObj.event, eventObj.element, eventObj.destination, eventObj.headline);\r\n } catch {\r\n // This catch block is meant to continue to next element in the loop.\r\n // We may remove this in future once Error Boundaries are added.\r\n }\r\n });\r\n\r\n // empty it again after processing\r\n trackEventBuffer = [];\r\n }\r\n\r\n if (trackImpressionBuffer.length > 0) {\r\n trackImpressionBuffer.forEach(eventObj => {\r\n sendPartialPageRequest(eventObj.elem, eventObj.visibilityCheck, eventObj.mechanism, eventObj.topLevelContainerType);\r\n });\r\n\r\n // empty it again after processing\r\n trackImpressionBuffer = [];\r\n }\r\n\r\n if (trackAppErrorEventBuffer.length > 0) {\r\n trackAppErrorEventBuffer.forEach(appError => {\r\n sendTrackAppErrorEvent(appError);\r\n });\r\n\r\n // empty it again after processing\r\n trackAppErrorEventBuffer = [];\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * Callback function to pass to experience. It maintains an internal array to hold track calls until dependencies resolved.\r\n * @param {Event} event event object\r\n * @param {HTMLElement} element form code\r\n * @param {string} destination text\r\n * @param {string} headline text\r\n * @void\r\n */\r\nexport function handleTelemetryCall(event: Event, element: HTMLElement, destination: string, headline: string): void {\r\n if (trackingResolved) {\r\n sendTrackingCall(event, element, destination, headline);\r\n } else {\r\n trackEventBuffer.push({ event: event, element: element, destination: destination, headline: headline });\r\n\r\n if (!trackingPromiseCalled) {\r\n trackingPromiseCalled = true;\r\n\r\n // only want to call this once\r\n processPendingTrackingCall();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Makes the partial page request\r\n * @param {HTMLElement} elem object\r\n * @param {boolean} visibilityCheck\r\n * @param {TrackMechanism} mechanism\r\n * @param {string} topLevelContainerType\r\n * @void\r\n */\r\nexport function handlePartialPageImpressionCall(elem?: HTMLElement, visibilityCheck?: boolean, mechanism?: TrackMechanism, topLevelContainerType?: string): void {\r\n if (trackingResolved) {\r\n sendPartialPageRequest(elem, visibilityCheck, mechanism, topLevelContainerType);\r\n } else {\r\n trackImpressionBuffer.push({ elem: elem, visibilityCheck: visibilityCheck, mechanism: mechanism, topLevelContainerType: topLevelContainerType });\r\n\r\n if (!trackingPromiseCalled) {\r\n trackingPromiseCalled = true;\r\n\r\n // only want to call this once\r\n processPendingTrackingCall();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Handler to log app errors\r\n * @param appError - App error object\r\n * @void\r\n */\r\nexport function handleAppErrorEventCall(appError: AppError): void {\r\n if (trackingResolved) {\r\n sendTrackAppErrorEvent(appError);\r\n } else {\r\n trackAppErrorEventBuffer.push({ ...appError });\r\n if (!trackingPromiseCalled) {\r\n trackingPromiseCalled = true;\r\n\r\n // only want to call this once\r\n processPendingTrackingCall();\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { requireAsync } from \"./RequireAsync\";\r\n\r\n/**\r\n * Integration function to retrieve the prime mediator object.\r\n *\r\n * @export\r\n * @return {Promise} - Resolves with the mediator if it could be loaded, rejects otherwise.\r\n */\r\nexport let getMediator: IGetMediator = () => {\r\n return requireAsync(\"mediator\");\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { endsWith as _endsWith, some as _some } from \"lodash-es\";\r\n\r\nimport { IActionMap } from \"./IActionMap\";\r\nimport { IActionPayload } from \"./IActionPayload\";\r\nimport { String as StringOperations } from \"typescript-string-operations\";\r\n\r\n/**\r\n * Class Contains helpers to use inside of a reducer, that is managed by and called from DynamicReducer\r\n * These helpers provide the ability to use a strongly typed callback that matches the parameters of an Action.\r\n * redux-subspace will automatically prepend a namespace to actions so that they are targeted to their specific subspace.\r\n * DynamicReducer already handles ensuring actions reach the correct reducer, so the redux-subspace namespace can be ignored\r\n * @class\r\n */\r\nexport class ActionHandler {\r\n\r\n /**\r\n * local function that either uses the built-in String.prototype.endsWith function, or uses the lodash-es function to polyFill;\r\n * the built-in function is significantly faster than the lodash-es function or other options, so we want to use it when we can;\r\n * the lodash-es function, based on splice, is faster than String.prototype.indexOf, but using RegEx might be faster...\r\n */\r\n private static endsWith: Function = String.prototype.endsWith\r\n ? function (search: string, target: string): boolean { return search.endsWith(target); }\r\n : _endsWith;\r\n\r\n /**\r\n * Method to handle specific actions.\r\n * @method\r\n * @param actionPayload {IActionPayload} The action details.\r\n * @param actionMap {IActionMap} The actionMap which maps Action to its callback function type.\r\n * @param callback {TActionSignature} function of type TActionSignature.\r\n * @return { boolean } true if the action type matched, false otherwise.\r\n */\r\n public static handleAction(\r\n actionPayload: IActionPayload,\r\n actionMap: IActionMap,\r\n callback: TActionSignature): boolean {\r\n\r\n // actionPayload.type may have a redux-subspace namespace prepended, so check to see if the ending action is what we want\r\n // namespaces are separated from the action type by a \"/\";\r\n // we use that to differentiate where the payload type ends with the mapped type as part of the name, but is not the same action\r\n // e.g. \"Action\" in the action map and \"NameSpace/AnotherAction\" in the payload, both end in \"Action\" but do not match\r\n // we prepend to *both* to cover the case where they are already equal (that is, no namespace is present)\r\n\r\n if (ActionHandler.endsWith(actionPayload.type + \"\", actionMap.type)) {\r\n callback.apply(callback, actionPayload.params);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Method to handle multiple actions with same signature.\r\n * @method\r\n * @param actionPayload {IActionPayload} The action details.\r\n * @param actionMap {IActionMap[]} The collection of actionMaps which maps Action to its callback function type.\r\n * @param callback {TActionSignature} function of type TActionSignature.\r\n * @return { boolean } true if the action type matched, false otherwise.\r\n */\r\n public static handleActions(\r\n actionPayload: IActionPayload,\r\n actionMaps: IActionMap[],\r\n callback: TActionSignature): boolean {\r\n\r\n const actionPayloadType = actionPayload.type + \"\";\r\n let actionsMatched = _some(actionMaps, (actionMap) => ActionHandler.endsWith(actionPayloadType, actionMap.type));\r\n\r\n if (actionsMatched) {\r\n callback.apply(callback, actionPayload.params);\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * Method to handle specific actions and check typescript type safely.\r\n * It throws error if actionMap.type does not equal the actionPayload.type.\r\n * @method\r\n * @param actionPayload {IActionPayload} The action details.\r\n * @param actionMap {IActionMap} The actionMap which maps Action to its callback function type.\r\n * @param callback {TActionSignature} function of type TActionSignature.\r\n * @return { boolean } true if the action type matched, false otherwise.\r\n */\r\n public static safeHandleAction(\r\n actionPayload: IActionPayload,\r\n actionMap: IActionMap,\r\n callback: TActionSignature): any {\r\n\r\n if (!ActionHandler.endsWith(actionPayload.type + \"\", actionMap.type)) {\r\n throw \"The action payload does not match the action type.\";\r\n }\r\n\r\n callback.apply(callback, actionPayload.params);\r\n return true;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { isNil, isString, omitBy } from \"lodash-es\";\r\n\r\nimport { TelemetryOrdinalTracker } from \"./Telemetry.OrdinalTracker\";\r\nimport { TelemetryProps } from \"./Telemetry.props\";\r\nimport { TelemetryTags } from \"./Telemetry.tags\";\r\nimport { TelemetryTypes } from \".\";\r\nimport { Utility } from \"@msnews/core\";\r\n\r\n/**\r\n * Telemetry class to inject into components via props.\r\n *\r\n * @export\r\n * @class Telemetry\r\n */\r\nexport class Telemetry {\r\n\r\n /**\r\n * The index to uniquely identify the telemetry elements.\r\n * @private\r\n * @type {number}\r\n */\r\n public static ordinalTracker: { [id: number]: TelemetryOrdinalTracker } = {\r\n 0: {\r\n childIndices: [],\r\n childOrdinalCounter: 0,\r\n ordinal: 1\r\n }\r\n };\r\n\r\n /**\r\n * The index to uniquely identify the telemetry elements.\r\n * @private\r\n * @type {number}\r\n */\r\n public static telemetryIndex: number = 0;\r\n\r\n /**\r\n * Set the new telemetry props for a child component.\r\n * @type {function}\r\n * @param {parentTelemetry} telemetry - props that may contain the telemetry index of the parent component.\r\n * @param {childTelemetry} telemetry - props that contain the telemetry index of the child component.\r\n */\r\n public static setChildProps(parentTelemetry: TelemetryProps, childTelemetry: TelemetryProps): void {\r\n if (!parentTelemetry) {\r\n throw \"the parentTelemetry parameter is required\";\r\n }\r\n\r\n if (!childTelemetry) {\r\n throw \"the childTelemetry parameter is required\";\r\n }\r\n\r\n // set parentIndex from parent's index; if the parent has no non-zero index, use the grandparent index instead, falling back to zero\r\n childTelemetry.parentIndex = parentTelemetry.index || parentTelemetry.parentIndex || 0;\r\n\r\n // This part is required to trigger shouldComponentUpdate on child component,\r\n // if no other props changed but parent component re-renders.\r\n // childTelemetryProps.headlineIndex = Math.random();\r\n }\r\n\r\n /**\r\n * Gets the telemetry item for a child element.\r\n *\r\n * @static\r\n * @param {TelemetryProps} parentTelemetry the telemetry props for the parent element\r\n * @param {string} telemetryName the telemetry name for the child\r\n * @param {TelemetryTypes} telemetryType the telemetry type for the child\r\n * @returns {TelemetryProps} the telemetry props for the child\r\n * @memberof Telemetry\r\n */\r\n public static getChildTelemetryItem(parentTelemetry: TelemetryProps, telemetryName: string, telemetryType: TelemetryTypes): TelemetryProps {\r\n const initTelemetryProps: TelemetryProps = {\r\n name: telemetryName,\r\n telemetryType: telemetryType\r\n };\r\n\r\n const resultTelemetryProps = Telemetry.createProps(initTelemetryProps, parentTelemetry, initTelemetryProps);\r\n Telemetry.setChildProps(parentTelemetry, resultTelemetryProps);\r\n\r\n return resultTelemetryProps;\r\n }\r\n\r\n /**\r\n * Get the parent's index value for telemetry.\r\n * @type {function}\r\n * @param {parentTelemetry} telemetry - props that may contain the telemetry index of the parent component.\r\n */\r\n public static getParentIndex(parentTelemetry: TelemetryProps): number {\r\n if (!parentTelemetry) {\r\n throw \"the parentTelemetry parameter is required\";\r\n }\r\n\r\n // return parentIndex from parent's index; if the parent has no non-zero index, use the grandparent index instead, even if zero\r\n return parentTelemetry.index || parentTelemetry.parentIndex;\r\n }\r\n\r\n /**\r\n * Get the parent's index value for telemetry.\r\n * @type {function}\r\n * @param {parentTelemetry} telemetry - props that may contain the telemetry index of the parent component.\r\n */\r\n public static getParentHeadlineIndex(parentTelemetry: TelemetryProps): number {\r\n if (!parentTelemetry) {\r\n throw \"the parentTelemetry parameter is required\";\r\n }\r\n\r\n // This part is required to trigger shouldComponentUpdate on child component,\r\n // if no other props changed but parent component re-renders.\r\n return Math.random();\r\n }\r\n\r\n /**\r\n * Create the root private telemetry object for an application\r\n * @type {function}\r\n * @param {string} name - Name of the entity.\r\n * @param {string} id - Id property of the entity.\r\n * @param {number} rootTelemetryIndex - telemetry index of root, e.g. the SPA host container index\r\n * @returns {TelemetryProps} - private Telemetery props\r\n */\r\n public static createRootProps(name?: string, id?: string, rootTelemetryIndex?: number): TelemetryProps {\r\n const ordinal = 0;\r\n\r\n // root index if specified otherwise we set it the next telemetry index\r\n const rootIndex = rootTelemetryIndex || Telemetry.getNewIndex();\r\n\r\n Telemetry.ordinalTracker[rootIndex] = {\r\n ordinal,\r\n childIndices: {},\r\n childOrdinalCounter: 0\r\n };\r\n\r\n return {\r\n id: id,\r\n index: rootIndex,\r\n name: name,\r\n ordinal: ordinal,\r\n parentIndex: 0\r\n };\r\n }\r\n\r\n /**\r\n * Create the telemetry object for the component.\r\n * @type {function}\r\n * @param {TelemetryProps} savedProps - Props that are being saved by the calling component. If this is the first call to createProps, null or undefined should be passed.\r\n * @param {TelemetryProps} componentProps - Props that were passed into the calling component. This set of props carries the parentIndex.\r\n * @param {TelemetryProps} initializationProps - Override props which can be used to replace the default properties\r\n * @returns {TelemetryProps} - Telemetry props\r\n */\r\n public static createProps(savedProps: TelemetryProps, componentProps: TelemetryProps, initializationProps: TelemetryProps = {}): TelemetryProps {\r\n\r\n const parentIndex = componentProps.parentIndex || 0;\r\n\r\n if (!(parentIndex in Telemetry.ordinalTracker)) {\r\n throw \"parentIndex not tracked in ordinalTracker\";\r\n }\r\n\r\n let index: number;\r\n let ordinal: number;\r\n\r\n // TODO are we calling the right one?\r\n if (savedProps && !isNil(savedProps.index)) {\r\n index = savedProps.index;\r\n } else {\r\n index = Telemetry.getNewIndex();\r\n }\r\n\r\n Telemetry.resetChildProps(index);\r\n\r\n let isIndexTrackedByParent: boolean = index in Telemetry.ordinalTracker[parentIndex].childIndices;\r\n if (isIndexTrackedByParent) {\r\n ordinal = Telemetry.ordinalTracker[parentIndex].childIndices[index];\r\n } else {\r\n ordinal = ++Telemetry.ordinalTracker[parentIndex].childOrdinalCounter;\r\n Telemetry.ordinalTracker[parentIndex].childIndices[index] = ordinal;\r\n }\r\n\r\n Telemetry.ordinalTracker[index] = {\r\n ordinal,\r\n childIndices: {},\r\n childOrdinalCounter: 0\r\n };\r\n\r\n return { ...initializationProps, index, ordinal, parentIndex };\r\n }\r\n\r\n /**\r\n * Render telemetry props to the DOM.\r\n * @type {function}\r\n * @param {TelemetryProps} props - Props of the element which needs to render telemetry string.\r\n * @returns {TelemetryTags} - Telemetery tags for rendering\r\n */\r\n public static render(props: TelemetryProps): TelemetryTags {\r\n if (!props || !props.index) {\r\n return null;\r\n }\r\n\r\n const result: any = {\r\n c: props.category,\r\n ct: props.contentType,\r\n f: props.feedId || props.id,\r\n h: props.headlineIndex,\r\n i: props.index,\r\n l: props.id,\r\n n: props.name,\r\n o: props.ordinal,\r\n p: props.parentIndex,\r\n y: props.telemetryType,\r\n v: props.vertical\r\n };\r\n\r\n const filteredResult = omitBy(result, isNil);\r\n\r\n const tags: TelemetryTags = {\r\n \"data-m\": JSON.stringify(filteredResult),\r\n \"data-id\": filteredResult.i\r\n };\r\n\r\n if (isString(props.userFacingText)) {\r\n tags[\"data-hl\"] = props.userFacingText;\r\n }\r\n\r\n return tags;\r\n }\r\n\r\n // Bug 15830025: if this isn't used, we should delete it; if it is used, it needs unit tests.\r\n /**\r\n * Resets the global dictionary recursively starting at the given component.\r\n * @type {function}\r\n * @param {number} telemetryIndex - Telemetry index of the component.\r\n */\r\n public static resetChildProps(telemetryIndex: number): void {\r\n if (!(telemetryIndex in Telemetry.ordinalTracker)) {\r\n return;\r\n }\r\n\r\n const childIndices = Telemetry.ordinalTracker[telemetryIndex].childIndices;\r\n Object.keys(childIndices).map((index) => this.resetChildProps(Utility.toNumber(index)));\r\n delete Telemetry.ordinalTracker[telemetryIndex];\r\n }\r\n\r\n /**\r\n * Decides if the new telemetry related props changed on parent component.\r\n * @type {function}\r\n * @param {TelemetryProps} oldProps - Old props of the element which contains parentIndex and ordinal values.\r\n * @param {TelemetryProps} newProps - New props of the element which contains parentIndex and ordinal values.\r\n * @param {TelemetryProps} telemetry - Existing private telemetry props of the element.\r\n * @returns {boolean} - should telemetry props need to be changed.\r\n */\r\n public static shouldComponentUpdate(oldProps: TelemetryProps, newProps: TelemetryProps, telemetry: TelemetryProps): boolean {\r\n return (oldProps.parentIndex !== newProps.parentIndex)\r\n || (telemetry && !(telemetry.index in Telemetry.ordinalTracker[oldProps.parentIndex].childIndices));\r\n }\r\n\r\n /**\r\n * Creates and returns new telemetry index which should be global among the application.\r\n *\r\n * @export\r\n * @return {number}\r\n */\r\n private static getNewIndex(): number {\r\n return --Telemetry.telemetryIndex;\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n// TODO: This should be considered for moving it to the Interests experience wrapper, once that\r\n// code arrives, since this is specific to that experience\r\n\r\n/**\r\n * Tab Names\r\n * @export\r\n * @type {object}\r\n */\r\nexport const SubnavTabName = {\r\n Interests: \"cinterests\",\r\n MyFeed: \"newsfeed\",\r\n XFeed: \"xfeed\"\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n/// Adds functions events.bind and events.unbind that bind and unbind events\r\n\r\nexport default {\r\n bind: bindEvent,\r\n unbind: unbindEvent\r\n};\r\n\r\nfunction bindEvent(element, type, handler) {\r\n if (element.addEventListener) {\r\n element.addEventListener(type, handler, false);\r\n }\r\n}\r\n\r\nfunction unbindEvent(element, type, handler) {\r\n if (element.removeEventListener) {\r\n element.removeEventListener(type, handler, false);\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n// /**\r\n// * Provides common XSS escaping implementations.\r\n// * @returns {Escape}\r\n// */\r\n// regex that looks for all the various dangerous HTML characters that we want to escape.\r\n// every character in this match MUST have a corresponding map entry in sequenceValues,\r\n// or it will be removed from the string we are escaping.\r\nvar sequenceTokens = /[\"&'\\/<>]/g;\r\n\r\n// mapping object from the character we want to replace to the escape sequence for it.\r\n// make sure that every character in the above regex is represented with an escape\r\n// sequence in this object.\r\nvar sequenceValues = {\r\n \"\\\"\": \""\",\r\n \"&\": \"&\",\r\n \"'\": \"'\",\r\n \"/\": \"/\",\r\n \"<\": \"<\",\r\n \">\": \">\"\r\n};\r\n\r\nexport default {\r\n url: encodeURI,\r\n urlPart: encodeURIComponent,\r\n html: escapeHtml\r\n};\r\n\r\n/**\r\n * Encodes a text string as a valid Uniform Resource Identifier (URI)\r\n * @param {string} text - A value representing an encoded URI.\r\n * @return {string}\r\n */\r\nfunction encodeURI(text) {\r\n // be sure to use a NON-STRICT comparison here so we get both null AND undefined.\r\n // will ALWAYS return a string; empty string if passed null or undefined.\r\n return (text != null && encodeURI(text)) || \"\";\r\n}\r\n\r\n/**\r\n * Encodes a text string as a valid component of a Uniform Resource Identifier (URI).\r\n * @param {string} text - A value representing an encoded URI component.\r\n * @returns {string}\r\n */\r\nfunction encodeURIComponent(text) {\r\n // be sure to use a NON-STRICT comparison here so we get both null AND undefined.\r\n // will ALWAYS return a string; empty string if passed null or undefined.\r\n // @ts-ignore\r\n return (text != null && window.encodeURIComponent(text)) || \"\";\r\n}\r\n\r\n/**\r\n * Encodes a text string as a valid html, by mapping object from the character we want to replace to the escape sequence for it.\r\n * @param {string} text - The text\r\n * @returns {string}\r\n */\r\nfunction escapeHtml(text) {\r\n // make sure text is a string (string concate with an empty string forces the type),\r\n // and then run a regex that finds all the characters we want to escape, and passes\r\n // each character to a function expression that looks up the appropriate replacement\r\n // sequence from an object map (key = character to replace, value = escaped sequence).\r\n // be sure to use a NON-STRICT comparison here so we get both null AND undefined.\r\n // will ALWAYS return a string; empty string if passed null or undefined.\r\n return (text != null && (\"\" + text).replace(sequenceTokens, function (ch) {\r\n return sequenceValues[ch] || \"\";\r\n })) || \"\";\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n// /**\r\n// * The navigatio module\r\n// * @param {Escape} escape - The escape.\r\n// * @param {Document} document - The document.\r\n// * @returns {Navigation}\r\n// */\r\nimport escape from \"./escape\";\r\n\r\n/** @type {Navigation} - The navigation object. */\r\nvar navigation = {\r\n getUrl: function(relativeUrl) {\r\n if (navigation.filter) {\r\n // @ts-ignore\r\n return navigation.filter(relativeUrl);\r\n }\r\n\r\n return relativeUrl;\r\n },\r\n navigate: function (url, replace) {\r\n if (navigation.filter) {\r\n // @ts-ignore\r\n url = navigation.filter(url);\r\n }\r\n if (replace) {\r\n location.replace(url);\r\n } else {\r\n location.href = url;\r\n }\r\n },\r\n getHostName: getHostName,\r\n parseUrl: parseUrl,\r\n isLocal: function (url) {\r\n var hostname = getHostName(url);\r\n return !hostname || (location.hostname == hostname);\r\n },\r\n getParams: getParams,\r\n getParamsFromUrl: function (url, supportMultiple?, decodeComponents?) {\r\n var queryString = url.split(\"?\")[1];\r\n return getParams(queryString, supportMultiple, decodeComponents);\r\n },\r\n // merge query string parameters with a set of new parameters. This does not support duplicate keys\r\n mergeQueryStringParams: function (url, newParams) {\r\n if (newParams) {\r\n var urlParts = url.split(\"?\");\r\n var params;\r\n if (urlParts[1]) {\r\n // get the existing parameters, then merge in the\r\n // new ones, overwriting any values that previously existed.\r\n params = getParams(urlParts[1], false, true);\r\n for (var param in newParams) {\r\n params[param] = newParams[param];\r\n }\r\n } else {\r\n // no existing parameters, so just use the new ones directly\r\n params = newParams;\r\n }\r\n\r\n // now rebuild the url from the parameters\r\n url = urlParts[0];\r\n var separator = \"?\";\r\n for(var param in params) {\r\n if (params[param]) {\r\n url += separator + escape.urlPart(param) + \"=\" + escape.urlPart(params[param]);\r\n } else {\r\n url += separator + escape.urlPart(param);\r\n }\r\n separator = \"&\";\r\n }\r\n }\r\n\r\n return url;\r\n },\r\n filter: null\r\n};\r\n\r\nexport default navigation;\r\n\r\nfunction getParams(queryString, supportMultiple?, decodeComponents?) {\r\n var decodeURIComponentAndPlusSign = function (val) {\r\n val = val.replace(/\\+/g, \" \");\r\n val = decodeURIComponent(val);\r\n return val;\r\n };\r\n\r\n var params = {};\r\n if (queryString) {\r\n // remove hash part.\r\n queryString = queryString.split(\"#\")[0];\r\n var queryArray = queryString.split(\"&\");\r\n for (var ndx = 0; ndx < queryArray.length; ndx++) {\r\n var parts = queryArray[ndx].split(\"=\");\r\n var key = parts[0];\r\n var value = parts[1];\r\n\r\n if (decodeComponents) {\r\n key = decodeURIComponentAndPlusSign(key);\r\n if (value) {\r\n value = decodeURIComponentAndPlusSign(value);\r\n }\r\n }\r\n\r\n if (supportMultiple) {\r\n if (!params[key]) {\r\n params[key] = [];\r\n }\r\n\r\n params[key].push(value);\r\n } else {\r\n params[key] = value;\r\n }\r\n }\r\n }\r\n\r\n return params;\r\n}\r\n\r\n/**\r\n * Parse the given URL.\r\n * For example, \"http://example.com:3000/pathname/?search=test#hash\" returns:\r\n * {\r\n * protocol: \"http:\",\r\n * host: \"example.com:3000\",\r\n * hostName: \"example.com\",\r\n * port: \"3000\",\r\n * path: \"/pathname/\",\r\n * hash: \"#hash\",\r\n * query: \"?search=test\",\r\n * origin: \"http://example.com:3000\"\r\n * }\r\n * @param {string} url\r\n * @returns {{ protocol: string, host: string, hostName: string, port: string, path: string, hash: string, query: string, origin: string }}\r\n */\r\nfunction parseUrl(url) {\r\n var anchor = document.createElement(\"a\");\r\n anchor.href = url;\r\n\r\n return {\r\n protocol: anchor.protocol,\r\n host: anchor.host,\r\n hostName: anchor.hostname,\r\n port: anchor.port,\r\n path: anchor.pathname,\r\n hash: anchor.hash,\r\n query: anchor.search,\r\n origin: anchor.origin\r\n };\r\n}\r\n\r\nfunction getHostName(url) {\r\n return parseUrl(url).hostName;\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n// Provides Tracking helper methods unique to the NTP and DHP pages.\r\n//\r\n// Need to add OCID to all links that go to the MSN page.\r\n// Also need to add the OCID, CCID and TDUID values to all links that launch the store.\r\n//\r\n// Provide method to modify trackInfo data prior to TrackPage call usage.\r\n\r\nimport { getLocationHost } from \"@msnews/isomorphic-util\";\r\nimport pageInstance from \"./pageInstance\";\r\nimport { trackInfo } from \"./trackInfo\";\r\n\r\nvar displayOptionsHelper = {};\r\nvar browserAccess = {};\r\n\r\nconst locationHost = getLocationHost();\r\nvar domainParts = locationHost ? locationHost.split(\".\").reverse() : [];\r\nvar hostDomain = domainParts.length > 1 ? domainParts[1] + \".\" + domainParts[0] : locationHost; // handle an internal address\r\nvar windowsStoreHost = \"ms-windows-store\";\r\nvar domainMatchPattern = /[a-z][a-z0-9+\\-.]*:\\/\\/([a-z0-9\\-._~%!$&'()*+,;=]+@)?([a-z0-9\\-._~%]+|\\[[a-z0-9\\-._~%!$&'()*+,;=:]+\\])/i;\r\nvar ocidMatchPattern = /[&?]ocid=([^&]+)/i;\r\nvar ccidMatchPattern = /[&?]ccid=([^&]+)/i;\r\nvar classIdentifierForHlTrackingInApps = \".hltxt\";\r\n\r\n// The following values will not change during the life of the page.\r\n// @ts-ignore\r\nvar msnOcid = trackInfo.sitePage.msnocid || \"\";\r\n// @ts-ignore\r\nvar storeOcid = trackInfo.sitePage.storeocid || \"\";\r\n\r\nfunction addOcidToHref(tHref, target, event) {\r\n /// Adds OCID value to MSN URLs and to Store URLs\r\n /// The href found in track.js\r\n /// The DOM element being tracked.\r\n /// The event.\r\n\r\n // MSN OCID is only applied on NTP and DHP pages.\r\n if (!tHref || !target) {\r\n return;\r\n }\r\n\r\n // in case sitePage was not filled when this resolved, get and save the msnocid and storeocid values.\r\n if (!msnOcid) {\r\n // @ts-ignore\r\n msnOcid = trackInfo.sitePage.msnocid;\r\n }\r\n\r\n if (!storeOcid) {\r\n // @ts-ignore\r\n storeOcid = trackInfo.sitePage.storeocid;\r\n }\r\n\r\n // For the store (Prime and ServiceUI), we need to test the scheme - URL portion before \"://\".\r\n var endOfScheme = tHref.indexOf(\"://\");\r\n var locationOfStore = tHref.indexOf(windowsStoreHost);\r\n var isStoreUrl = endOfScheme > 0 && locationOfStore >= 0 && locationOfStore < endOfScheme;\r\n\r\n // Need to account for ocid and ccid being of mixed case. e.g. parameters.ocid returns null if the\r\n // param is \"Ocid\".\r\n var ocidMatch = tHref.match(ocidMatchPattern);\r\n var ccidMatch = tHref.match(ccidMatchPattern);\r\n\r\n // Fix 1764836. Ad links (e.g. EMS Ads) already contain their own ocid (not ours) on the URL. We need to make sure to keep their ocid value\r\n // and add the ccid value. Some Ads use uppercase OCID parameter.\r\n // NOTE: JS doesn't have negative lookback so selecting values directly doesn't work. Using [1]\r\n // to read the second match which will be the value.\r\n var ocidOnUrl = ocidMatch && ocidMatch[1];\r\n var ccidOnUrl = ccidMatch && ccidMatch[1];\r\n var emsOnUrl;\r\n\r\n if (ocidOnUrl && ccidOnUrl) {\r\n // If this is an EMS Ad it will already have the ocid and ccid values. We need to add our other values.\r\n var initStoreUrl = tHref;\r\n var emsMatch = tHref.match(/[&?]ocid=(ems\\.)/i);\r\n emsOnUrl = emsMatch && emsMatch[1];\r\n\r\n // See if we are an EMS link and do not have emsadid on the URL. If already have one do not add another.\r\n if (emsOnUrl && !initStoreUrl.match(/[=_]emsadid\\./i)) {\r\n initStoreUrl = addCcidToStoreUrl(initStoreUrl.replace(ccidMatchPattern, ''), ccidMatch[1]);\r\n }\r\n\r\n // This has already been modified.\r\n return;\r\n }\r\n\r\n var hashIndex = tHref.indexOf(\"#\");\r\n var hashValue = \"\";\r\n\r\n // Do not modify Prime page URLs - maintain this as only DHP/NTP code.\r\n // If we do not have an ocid on the url.\r\n if (!ocidOnUrl) {\r\n // TopSites uses an href of \"#\" to indicate it should not be a navigation, but it gets changed to the NTP Url with # at the end.\r\n // Some Prime websites also use the # character and we should not affect them, so make this check within the ServiceUI IFDEF.\r\n if (hashIndex === tHref.length - 1) {\r\n return;\r\n }\r\n\r\n // We need the msnocid value if this is the NTP/DHP page.\r\n if (msnOcid) {\r\n var domainMatch = domainMatchPattern.exec(tHref);\r\n var hrefHostName = domainMatch && domainMatch[2];\r\n var linkUrl = tHref;\r\n if (hrefHostName) {\r\n var isMsnDomain = hrefHostName.indexOf(hostDomain) >= 0;\r\n if (isMsnDomain) {\r\n if (hashIndex >= 0) {\r\n hashValue = tHref.substring(hashIndex, tHref.length);\r\n linkUrl = tHref.substring(0, hashIndex);\r\n }\r\n\r\n linkUrl += linkUrl.indexOf('?') > 0 ? \"&\" : \"?\";\r\n linkUrl = linkUrl + \"ocid=\" + msnOcid;\r\n target.href = linkUrl + (hashValue || \"\");\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // If we don't have the store OCID value, just return. We can't add the ocid if we don't have the correct value.\r\n if (!ocidOnUrl && !storeOcid) {\r\n return;\r\n }\r\n\r\n if (isStoreUrl) {\r\n // Bug 1763626 - clicking Top Sites Open App link multiple times added OCID/CCID multiple times.\r\n // If there was a hash at the end of the URL, we used to add the parameters after the hash, and it was\r\n // not recognized as parameters by navigation.getParamsFromUrl(tHref).\r\n // If there is a hash value, save it, and re-add it at the end.\r\n if (hashIndex >= 0) {\r\n hashValue = tHref.substring(hashIndex, tHref.length);\r\n tHref = tHref.substring(0, hashIndex);\r\n }\r\n\r\n // We know that the store URL will have a query string parameter (the ID or PFN).\r\n // If the url already has an ocid on it, don't add another.\r\n var storeUrl = tHref;\r\n if (!ocidOnUrl) {\r\n storeUrl += \"&ocid=\" + storeOcid;\r\n }\r\n\r\n storeUrl = addCcidToStoreUrl(storeUrl, emsOnUrl);\r\n target.href = storeUrl + hashValue;\r\n }\r\n}\r\n\r\nfunction addCcidToStoreUrl(tHref, emsAdId) {\r\n ///Adds Ccid to the Store url.\r\n /// The href found in track.js\r\n /// The optional value for the emsid ccid value\r\n /// Returns Store Url with ccid.\r\n\r\n var ccidMatch = tHref.match(ccidMatchPattern);\r\n var ccidOnUrl = ccidMatch && ccidMatch[1];\r\n var hashIndex = tHref.indexOf(\"#\");\r\n var hashValue = \"\";\r\n\r\n // If the url already has an ccid on it, don't add another, but make sure it has MUID and RID. EMS Ads already have a ocid and ccid values.\r\n if (!ccidOnUrl) {\r\n // TODO: refactor this code , so we don't have to calculate index at different places\r\n if (hashIndex >= 0) {\r\n hashValue = tHref.substring(hashIndex, tHref.length);\r\n tHref = tHref.substring(0, hashIndex);\r\n }\r\n\r\n // We know that the store URL will have a query string parameter (the ID or PFN).\r\n // If the url already has an ocid on it, don't add another.\r\n var storeUrl = tHref;\r\n storeUrl += \"&ccid=\";\r\n\r\n var ccidData = [];\r\n\r\n // If sent an emsAdId value add it first.\r\n if (emsAdId) {\r\n ccidData.push(\"emsadid.\" + emsAdId);\r\n }\r\n\r\n // @ts-ignore\r\n var webig = pageInstance.getRequestId() || trackInfo.sitePage.requestId;\r\n if (webig) {\r\n ccidData.push(\"webig.\" + webig);\r\n }\r\n\r\n var muid = trackInfo.client.clientId();\r\n if (muid) {\r\n ccidData.push(\"muid.\" + muid);\r\n }\r\n\r\n return storeUrl + ccidData.join(\"_\") + hashValue;\r\n }\r\n\r\n return tHref;\r\n}\r\n\r\nfunction modifyValuesForTrackPage() {\r\n ///Modifies specific trackInfo values for TrackPage, to identify user settings.\r\n /// Returns whether we need to prevent the ComScore beacon from firing.\r\n var noContent = \"_NoContent\";\r\n var topSites = \"-topsites\";\r\n var oneBox = \"-onebox\";\r\n\r\n // If we need to prevent sending a beacon, return true.\r\n var preventComscore = false;\r\n\r\n if (trackInfo.sitePage) {\r\n var hasContent = true;\r\n // when there is rive content\r\n\r\n if (!hasContent) {\r\n // We cannot send a ComScore beacon if we have no content.\r\n preventComscore = true;\r\n }\r\n }\r\n\r\n // add personalization specific properties if they haven't been created before.\r\n if (trackInfo.client\r\n // @ts-ignore\r\n && !trackInfo.client.personalization) {\r\n // add any Spartan DHP/NTP specific personalization related properties to this object\r\n var props;\r\n\r\n // write out the value only if we have any properties set in the property bag\r\n if (props) {\r\n // @ts-ignore\r\n trackInfo.client.personalization = JSON.stringify(props);\r\n }\r\n }\r\n\r\n return { preventComscore: preventComscore };\r\n}\r\n\r\nfunction attachTaglineClickHandler(element) {\r\n /// Modify \"hl\" before the trackEvent.\r\n /// The element (or jquery collection) to process.\r\n /// We do not want to require jquery.\r\n\r\n // If this code becomes needed for Prime, change the IFDEF. Also using a switch if this is a perf issue.\r\n}\r\n\r\nfunction getActionResult(action, isSuccessful) {\r\n /// \r\n /// Gets the action result name based on the action and the fact whether it was successfully executed or not\r\n /// \r\n /// \r\n /// The name of the action (e.g. sethome, addfavorite,...)\r\n /// \r\n /// \r\n /// Flag to indicate whether the action was successfully executed or not\r\n /// \r\n return isSuccessful ? action + \"_succeeded\" : action + \"_failed\";\r\n}\r\n\r\nexport default {\r\n addOcidToHref: addOcidToHref,\r\n modifyValuesForTrackPage: modifyValuesForTrackPage,\r\n attachTaglineClickHandler: attachTaglineClickHandler,\r\n addCcidToStoreUrl: addCcidToStoreUrl,\r\n getActionResult: getActionResult\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\n// Implements multiple parallel tracking engine which gets its tracking\r\n// url from the specific implementation using defined functions.\r\n//\r\n// if called multiple times during page interaction (representing significant content\r\n// update), the trackPage method will also publish a \"pageView\" mediator event that third-party\r\n// tracking code can hook to register their refresh page-view beacons.\r\n\r\n/// \r\n/// This function implements multiple parallel tracking engine which gets its tracking\r\n/// url from the specific implementation using defined functions.\r\n/// \r\n/// The tracking info JS library\r\n/// The JS library that provides functionality similar to jQuery's extend function\r\n/// The dom manipulation JS library\r\n/// The JS library for getting cookies\r\n/// The JS library for setting cookies\r\n/// The events object\r\n/// The window object\r\n/// The document object.\r\n/// The mediator JS library\r\n/// Provides access to current navigation URL and helpers\r\n/// Collection of data passed from the server\r\n/// The page instance object\r\n/// Cross browser support for json parse\r\n/// The tracking helper object\r\n/// The storage object\r\n/// The performance marker object\r\n/// The telemetry constant object\r\n/// The JS library that provides functionality for callback when page is revealed. Used for preload scenarios.\r\n/// The datatypes for telemetry library\r\n/// The webStorage object\r\n/// The track object\r\n\r\nimport { Severity, logger } from \"@msnews/diagnostics\";\r\nimport { canUseDOM, getLocationHost, getLocationHref, getLocationProtocol } from \"@msnews/isomorphic-util\";\r\n\r\nimport dom from \"./dom\";\r\nimport events from \"./events\";\r\nimport extend from \"./extend\";\r\nimport mediator from \"./mediator\";\r\nimport navigation from \"./navigation\";\r\nimport pageInstance from \"./pageInstance\";\r\nimport { sessionStorage } from \"@msnews/core\";\r\nimport telemetryConstants from \"./telemetryconstants\";\r\nimport { telemetryDataTypes } from \"./telemetryDataTypes\";\r\nimport { telemetryReadyCallback } from \"./telemetryReadyCallback\";\r\nimport { trackInfo } from \"./trackInfo\";\r\nimport trackingHelper from \"./trackingHelper\";\r\n\r\n// shortcuts to dom functions\r\nvar attr = dom.attr;\r\nvar domName = dom.name;\r\nvar getParent = dom.parent;\r\nvar getChildren = dom.children;\r\nvar recipients = [];\r\nvar refreshPageLoad;\r\nvar doc = canUseDOM() ? document : null;\r\nvar errorLogInterval = 5 * 60 * 1000;\r\n\r\nvar lastClickedTarget = null;\r\n\r\n// After 500 ms, lastClickedTarget will be set as null.\r\nvar clickTargetResetTimeoutInMs = 500;\r\n\r\n// Token to find the custom event token passed on the url. the format would be like this - http://www.msn.com/#tevt=click_nonnav;tobjid=....;...\r\nvar tEvtTag = 'tevt=';\r\n\r\n// If there are more than one tags(name value pair), then the name value pair should be separated with ;\r\nvar regExpEventName = /#tevt=([A-Za-z0-9]+_[A-Za-z0-9]+)(;*)/g;\r\n\r\n// an array of ids that represent what we've already sent to the service as updates\r\n// TODO (rohjain): Remove this cache as we don't need two caches one in trackInfo and another here to maintain for impression updates cache.\r\nvar impressionCache = [];\r\n\r\n// error report interval in milliseconds (5 min = 5 * 60 * 1000)\r\nvar errorReportInterval = telemetryConstants.logSamplingRate || 5 * 60 * 1000;\r\n\r\nmediator.sub(\"logerror\", logErrorEvent);\r\n\r\nfunction trackAll(implementationMethod) {\r\n /// After createReport returns a report, this method fires tracking call for each registered tracking system\r\n\r\n var implementation;\r\n\r\n var parameters = canUseDOM() ? navigation.getParamsFromUrl(getLocationHref()) : {};\r\n\r\n // loop through each implementation\r\n for (var ndx = 0; ndx < recipients.length; ndx++) {\r\n implementation = recipients[ndx];\r\n var defOpts = implementation.defaultOpts;\r\n if (defOpts.disableOnAutoRefresh) {\r\n var names = defOpts.disableOnAutoRefresh.split(';');\r\n var isInList = false;\r\n for (var i = 0; i < names.length; i++) {\r\n if (names[i] == defOpts.id) {\r\n isInList = true;\r\n break;\r\n }\r\n }\r\n\r\n // @ts-ignore\r\n if (isInList && parameters.AR) {\r\n // In case this was generated early, reset to false so the next pageTrack() call will generate the beacon.\r\n defOpts.isGeneratedEarly = false;\r\n continue;\r\n }\r\n }\r\n\r\n if (defOpts.isGeneratedEarly) {\r\n // Don't generate this time, but reset to false so the next pageTrack() call will generate the beacon.\r\n defOpts.isGeneratedEarly = false;\r\n } else if (implementation) {\r\n // TODO: (nubenja) Remove samplingRate everywhere (implementation.samplingRate)\r\n var result = implementation[implementationMethod]();\r\n }\r\n }\r\n\r\n}\r\n\r\nfunction logErrorEvent(errorObject) {\r\n // /// Track error event\r\n // ///\r\n // /// errorObject- defined in errorCategory\r\n // ///\r\n // if (!errorObject)\r\n // {\r\n // return;\r\n // }\r\n // var cacheKey = errorObject.errId + errorObject.errSource;\r\n\r\n // var lastErrorTime = storage.getItem(cacheKey, true);\r\n // var currentTime = new Date().getTime();\r\n // if (lastErrorTime && (currentTime - lastErrorTime) <= errorLogInterval)\r\n // {\r\n // return;\r\n // }\r\n\r\n // trackInfo.event = {\r\n // type: \"app_error\"\r\n // };\r\n // trackInfo.report = errorObject;\r\n // logDiag(JSON.stringify(errorObject), true);\r\n\r\n // trackAll(\"getEventTrackingUrl\");\r\n // storage.setItem(cacheKey, currentTime, true);\r\n}\r\n\r\nfunction depthFirstChildAttribute(element, attributeName, skipElement?) {\r\n /// \r\n /// find the first attribute from the element in the depthFirst manner\r\n /// skips the element if it is specified in elementName\r\n /// \r\n var children = getChildren(element) || [];\r\n var ndx = 0;\r\n var altValue;\r\n\r\n attributeName = attributeName || \"alt\";\r\n\r\n for (; ndx < children.length; ndx++) {\r\n altValue = attr(children[ndx], attributeName)\r\n || depthFirstChildAttribute(children[ndx], attributeName, skipElement);\r\n\r\n if (altValue && !(skipElement == children[ndx].localName)) {\r\n return altValue;\r\n }\r\n }\r\n}\r\n\r\nfunction findCMValue(element) {\r\n /// \r\n /// create a list of id values separated with '>'\r\n /// walking from generic to specific\r\n /// ending at (not including) wrapper on the generic side\r\n /// \r\n if (element) {\r\n var parent = getParent(element);\r\n var curId = attr(parent, \"id\");\r\n var previousCM;\r\n if (trackInfo.wrapperId == curId) {\r\n return;\r\n }\r\n previousCM = findCMValue(parent);\r\n if (previousCM && curId) {\r\n return [previousCM, curId].join(trackInfo.cmSeparator);\r\n }\r\n return curId || previousCM;\r\n }\r\n}\r\n\r\nfunction getContentElementIndex(element) {\r\n /// \r\n /// count number of trackable elements upto and including the\r\n /// element passed into the function\r\n /// stop at the first parent with an id\r\n /// do not use anything with a new id\r\n /// indexing all elements with the same CM value\r\n /// indexing starts at 1\r\n /// 0 means there is no parent with an id\r\n /// \r\n\r\n if (!element) {\r\n return;\r\n }\r\n\r\n var parent = getParent(element);\r\n var children;\r\n var count = 0;\r\n var ndx = 0;\r\n\r\n // go up first, incase there is no parent id so we don't have to waste a lot of work\r\n if (!attr(parent, \"id\")) {\r\n count = getContentElementIndex(parent);\r\n if (count) {\r\n // by default getContentElementIndex will count the element passed in\r\n // subtract 1 to offset this\r\n count--;\r\n } else {\r\n // only stays 0 if there is no parent or no parent with an id\r\n // bubble up the expected 0 value\r\n return 0;\r\n }\r\n }\r\n\r\n children = getChildren(parent) || [];\r\n for (; ndx < children.length; ndx++) {\r\n if (children[ndx] == element) {\r\n count++;\r\n break;\r\n }\r\n count += countAllTrackableLinks(children[ndx]);\r\n }\r\n\r\n return count;\r\n}\r\n\r\nfunction countAllTrackableLinks(element) {\r\n /// \r\n /// returns count of all trackable elements[contains href and notrack]\r\n /// \r\n var count = 0;\r\n var ndx = 0;\r\n var children;\r\n if (element && !attr(element, \"id\")) {\r\n children = getChildren(element) || [];\r\n if (attr(element, \"href\") && !attr(element, trackInfo.notrack)) {\r\n count++;\r\n }\r\n for (; ndx < children.length; ndx++) {\r\n count += countAllTrackableLinks(children[ndx]);\r\n }\r\n }\r\n return count;\r\n}\r\n\r\nfunction getChildByTargetElement(element, tagName, depth) {\r\n /// \r\n /// Finds the first child element within the provided element with the desired tagName.\r\n /// Goes through all the children/grandchildren to the provided depth (1 = children, 2 = first grandchildren)\r\n /// \r\n /// Element with tagName if found, null if not\r\n if (depth && element && tagName) {\r\n if (element.tagName == tagName) {\r\n // They passed in an element with the correct tagName value.\r\n return element;\r\n }\r\n\r\n var children = getChildren(element) || [];\r\n for (var ndx = 0, dataLength = children.length; ndx < dataLength; ndx++) {\r\n if (children[ndx].tagName == tagName) {\r\n return children[ndx];\r\n } else {\r\n var subChild = getChildByTargetElement(children[ndx], tagName, depth - 1);\r\n if (subChild) {\r\n return subChild;\r\n }\r\n }\r\n }\r\n }\r\n return null;\r\n}\r\n\r\nfunction sendSinglePageViewBeacon(beaconId) {\r\n /// \r\n /// This method generates a single beacon without firing any other beacons.\r\n /// Do NOT call track.trackPage() if this is used, or you will generate two of these beacons.\r\n /// \r\n /// \r\n /// The single beacon to generate.\r\n /// \r\n\r\n if (beaconId) {\r\n // loop through each implementation\r\n var implementation;\r\n var implementationMethod = \"getPageViewTrackingUrl\";\r\n var ndx = 0;\r\n\r\n for (; ndx < recipients.length; ndx++) {\r\n implementation = recipients[ndx];\r\n if (implementation.defaultOpts.id === beaconId) {\r\n var result = implementation[implementationMethod]();\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction sendPageViewCandidate() {\r\n /// \r\n /// This fires a request for a page view candidate file required by ComScore.\r\n /// Call this directly, if you are generating new page views which include ComScore and\r\n /// need to identify it as a page view candidate.\r\n /// \r\n\r\n var pvUrl = getLocationProtocol() + \"//\" + getLocationHost(); + \"/pv.xml\";\r\n if (!trackInfo.shouldFireTelemetry()) {\r\n return;\r\n }\r\n\r\n var beaconData = {\r\n url: pvUrl,\r\n requestType: telemetryConstants.GET,\r\n trackingType: telemetryConstants.Comscore\r\n };\r\n\r\n mediator.pub(telemetryConstants.FireTelemetry, beaconData);\r\n}\r\n\r\nfunction trackAdEvent(adParams) {\r\n ///\r\n /// This method tracks the adimpr_update event.\r\n /// Call getEventTrackingUrl to fire the tracking call.\r\n ///\r\n ///\r\n /// adParams- defined as follows\r\n /// adParams = {\r\n /// dst: dapStartTime,\r\n /// den: dapEndTime,\r\n /// id: placementId,\r\n /// pg: pageGroup\r\n /// w: width,\r\n /// h: height,\r\n /// status: status,\r\n /// anAd: appNexusId\r\n /// seqid: sequenceId\r\n /// sdk: sdk\r\n /// fen: finalEndTime\r\n /// };\r\n ///\r\n\r\n trackInfo.event = { type: \"adimpr_update\" };\r\n var adWidth = parseInt(adParams.w);\r\n var adHeight = parseInt(adParams.h);\r\n\r\n // @ts-ignore\r\n trackInfo.report =\r\n {\r\n ///\r\n /// This creates a tracking report.\r\n /// It does NOT send the report, nor does it perform any navigation.\r\n ///\r\n ///\r\n /// Report object that is structured as follows:\r\n /// report = {\r\n /// dst: dapStartTime,\r\n /// den: dapEndTime,\r\n /// id: placementId,\r\n /// pg: pageGroup\r\n /// w: width,\r\n /// h: height,\r\n /// status: status,\r\n /// anAd: appNexusId\r\n /// seqid: sequenceId\r\n /// sdk: sdk\r\n /// fen: finalEndTime\r\n /// };\r\n /// \r\n\r\n dst: adParams.dst,\r\n den: adParams.den,\r\n id: adParams.id,\r\n pg: adParams.pg,\r\n w: isNaN(adWidth) ? 0 : adWidth,\r\n h: isNaN(adHeight) ? 0 : adHeight,\r\n status: adParams.status,\r\n anAd: adParams.anAd,\r\n seqid: adParams.seqid,\r\n sdk: adParams.sdk,\r\n fen: adParams.fen\r\n };\r\n\r\n trackAll(\"getEventTrackingUrl\");\r\n}\r\n\r\nfunction trackAppErrorEventInternal(errorParams) {\r\n ///\r\n /// This method tracks the app_error event.\r\n /// Call getEventTrackingUrl to fire\r\n /// the tracking call.\r\n ///\r\n ///\r\n /// errorParams- defined in errorCategory\r\n ///\r\n\r\n if (!errorParams) {\r\n return;\r\n }\r\n\r\n // Check if it should fire app error.\r\n if (!trackInfo.shouldFireAppError()) {\r\n return;\r\n }\r\n\r\n if (!errorParams.severity) {\r\n errorParams.severity = Severity.Alert;\r\n }\r\n\r\n setAppErrorTrackInfo(errorParams);\r\n trackAll(\"getEventTrackingUrl\");\r\n}\r\n\r\nfunction setAppErrorTrackInfo(errorParams) {\r\n ///Sets the track information object\r\n\r\n var errEventObj = { type: \"app_error\" };\r\n trackInfo.event = errEventObj;\r\n\r\n // @ts-ignore\r\n var report = trackInfo.report =\r\n {\r\n ///\r\n /// This creates a tracking report.\r\n /// It does NOT send the report, nor does it perform any navigation.\r\n ///\r\n ///\r\n ///\r\n /// Error Id - defined in errorCategory\r\n ///\r\n ///\r\n /// Error Message - defined in errorCategory\r\n ///\r\n ///\r\n /// Error Source - defined in errorCategory\r\n ///\r\n //\r\n /// severity - defined in AppErrorTracker.ts\r\n ///\r\n ///\r\n /// Pb (property bag) - defined in AppErrorTracker.ts\r\n ///\r\n ///\r\n /// Report object that is structured as follows:\r\n /// report = {\r\n /// errId: ErrorId,\r\n /// errMsg: ErrorMsg,\r\n /// errMsg: ErrorSource,\r\n /// severity: severity,\r\n /// pb: pb\r\n /// };\r\n /// \r\n errId: errorParams.id,\r\n errMsg: errorParams.message,\r\n errSource: errorParams.source,\r\n severity: errorParams.severity,\r\n pb: errorParams.pb\r\n };\r\n\r\n logDiag(JSON.stringify(report), true);\r\n}\r\n\r\nfunction trackFormSubmitEvent(event, element, destination, headline, module, index, campaign) {\r\n /// \r\n /// This method tracks form events.\r\n /// This methods try to gets the search term.\r\n /// Call trackEvent\r\n /// \r\n /// \r\n /// Event object\r\n /// \r\n /// \r\n /// element that was clicked or target of the event. Passed to createReport.\r\n /// \r\n /// \r\n /// destination url to use instead of computing. Passed to createReport.\r\n /// \r\n /// \r\n /// headline to use instead of computing. Passed to createReport.\r\n ///\t\r\n ///\t\r\n /// content module string to be used instead of computing. Passed to createReport.\r\n /// \r\n /// \r\n /// content index string to be used instead of computing. Passed to createReport.\r\n /// \r\n /// \r\n /// campaign id to be used instead of computing. Passed to createReport.\r\n /// \r\n\r\n ///Helper functions.\r\n function isSearchForm() {\r\n var searchFormId = \"srchfrm\";\r\n if (!element && event) {\r\n element = event.target;\r\n }\r\n\r\n // if element not does not exist or is non trackable\r\n if (!element || attr(element, trackInfo.notrack)) {\r\n return false;\r\n }\r\n return element.id === searchFormId;\r\n }\r\n\r\n function getSearchTerm() {\r\n var searchBox = document.getElementById(\"q\");\r\n if (searchBox) {\r\n // @ts-ignore\r\n return searchBox.value;\r\n }\r\n }\r\n //End of helper functions\r\n\r\n if (isSearchForm()) {\r\n headline = getSearchTerm();\r\n }\r\n\r\n trackEvent(event, element, destination, headline, module, index, campaign);\r\n}\r\n\r\nfunction trackEvent(event, element?, destination?, headline?, module?, index?, campaign?, contentAction?) {\r\n /// \r\n /// This method tracks events.\r\n /// This methods loops through each implementation,\r\n /// Call getEventTrackingUrl and call that url to fire\r\n /// the tracking call.\r\n /// \r\n /// \r\n /// Event object\r\n /// \r\n /// \r\n /// element that was clicked or target of the event. Passed to createReport.\r\n /// \r\n /// \r\n /// destination url to use instead of computing. Passed to createReport.\r\n /// \r\n /// \r\n /// headline to use instead of computing. Passed to createReport.\r\n /// \r\n /// \r\n /// content module string to be used instead of computing. Passed to createReport.\r\n /// \r\n /// \r\n /// content index string to be used instead of computing. Passed to createReport.\r\n /// \r\n /// \r\n /// campaign id to be used instead of computing. Passed to createReport.\r\n /// \r\n /// contentAction enum of the event. Please see list of enum values under telemetryDatatypes.js\r\n /// \r\n\r\n // if element is not passed in, try to get it from event\r\n if (!element && event) {\r\n element = event.target;\r\n }\r\n\r\n // if element not does not exist or is non trackable\r\n if (!element || attr(element, trackInfo.notrack)) {\r\n return;\r\n }\r\n\r\n // for bug 1114449\r\n // element is a jQuery object, not an element\r\n // break out element from jQuery wrapper\r\n if (element.jquery) {\r\n element = element[0];\r\n }\r\n\r\n // Make sure that the trackInfo event does not have a jQuery object for target, or AOP will fail to find a parent.\r\n event = event || {};\r\n // Mark the event that it is already custom handled.\r\n event.customHandled = true;\r\n\r\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Read-only\r\n // event.target = element;\r\n trackInfo.event = event;\r\n var elemHref = element.href || attr(element, \"href\");\r\n\r\n // Temp. Fix: element.getAttribute(attr, 2) returns # only for non-navigational url. Need to get destination with full domain path.\r\n if (elemHref == \"#\") {\r\n elemHref = element[\"href\"];\r\n }\r\n\r\n // find destination value if needed\r\n destination = destination || attr(element, trackInfo.piiurl) ||\r\n elemHref || attr(element, \"action\") || \"\";\r\n\r\n // TODO: clean up how we find a headline. Depending on the markup of the page leads to bugs when we update it.\r\n // find headline value if needed, one may have been passed in through a data-hl attribute.\r\n var dataHlValue = attr(element, \"data-hl\") || \"\";\r\n if (!headline && !dataHlValue) {\r\n // See if there is an h4 or h3 element, no more than 2 deep.\r\n var headlineElement = getChildByTargetElement(element, \"H4\", 2) || getChildByTargetElement(element, \"H3\", 2);\r\n if (headlineElement) {\r\n headline = dom.text(headlineElement);\r\n }\r\n }\r\n\r\n if (typeof headline !== \"string\") {\r\n headline = dataHlValue || attr(element, trackInfo.piitxt) ||\r\n (\"FORM\" == domName(element)\r\n ? trackInfo.defaultFormHeadline\r\n : attr(element, \"title\") || depthFirstChildAttribute(element, \"title\", \"img\") || dom.text(element) || attr(element, \"alt\") || depthFirstChildAttribute(element, \"alt\") || \"\");\r\n }\r\n\r\n // Added condition to call trim function only if it is defined, it fails for browsers <=IE8\r\n if (headline.trim != undefined) {\r\n headline = headline.trim();\r\n }\r\n\r\n // find module value if needed\r\n module = module || findCMValue(element) || trackInfo.defaultModule;\r\n\r\n // find index value if needed\r\n index = index || (attr(element, \"id\") ? 1 : getContentElementIndex(element));\r\n\r\n // find campaign value if needed\r\n // Added backward compatibility for Old GT1 implementation. If \"GT1-xxxx\" not defined in class, look it into href attribute.\r\n // Example when GT1 defined in a class: class=\"GT1-12345\"\r\n // Example when GT1 is a part of href attribute: href=\"www.msn.com?GT1=12345\"\r\n var clsGT1 = element.className || attr(element, \"class\");\r\n campaign = campaign || (/GT1-(\\d+)\\b/i.exec(clsGT1) ? RegExp.$1 : \"\") ||\r\n (/[?&]GT1=(\\d+)\\b/i.exec(elemHref) ? RegExp.$1 : \"\");\r\n\r\n var moduleInfo = \"\";\r\n var nameLineage = '';\r\n var ordinalLineage = '';\r\n var lineageDelimiter = trackInfo.cmSeparator;\r\n var eventTime;\r\n\r\n if (event && (event.type == trackInfo.eventTypes.click || event.type == trackInfo.eventTypes.nonNavClckEvt || event.type == trackInfo.eventTypes.submit || event.type == trackInfo.eventTypes.contextmenu || event.type == trackInfo.eventTypes.mouseenter)) {\r\n var moduleInfoHeader = \"data-m\";\r\n moduleInfo = attr(element, moduleInfoHeader);\r\n if (!moduleInfo) {\r\n var parent = getParent(element);\r\n moduleInfo = parent ? attr(parent, moduleInfoHeader) : \"\";\r\n }\r\n\r\n try {\r\n // TODO: (nubenja) Remove this once data-m.y is deprecated\r\n // Convertion from telemetryType (e1.y) to telemetryContentType (e1.ct) and telemetryContentAction (ca)\r\n var moduleInfoJson = JSON.parse(moduleInfo);\r\n if (moduleInfoJson && moduleInfoJson.y && !moduleInfoJson.ct) {\r\n var ct = telemetryDataTypes.getTelemetryContentType(moduleInfoJson.y);\r\n\r\n if (ct) {\r\n moduleInfoJson.ct = ct;\r\n }\r\n }\r\n\r\n var actionType;\r\n var behaviorType;\r\n\r\n // Map behavior\r\n if (moduleInfoJson && moduleInfoJson.y) {\r\n behaviorType = telemetryDataTypes.getTelemetryBehavior(moduleInfoJson.y);\r\n }\r\n\r\n // Map action type\r\n if (event.originalEvent === trackInfo.eventTypes.contextmenu) {\r\n actionType = telemetryDataTypes.TelemetryActionType.RightClick;\r\n behaviorType = telemetryDataTypes.TelemetryBehaviorType.ContextMenu;\r\n } else if (event.type === trackInfo.eventTypes.click) {\r\n actionType = telemetryDataTypes.TelemetryActionType.Click;\r\n behaviorType = telemetryDataTypes.TelemetryBehaviorType.Navigate;\r\n } else if (event.type === trackInfo.eventTypes.nonNavClckEvt) {\r\n actionType = telemetryDataTypes.TelemetryActionType.Click;\r\n } else if (event.type === trackInfo.eventTypes.submit) {\r\n actionType = telemetryDataTypes.TelemetryActionType.Submit;\r\n }\r\n } catch (e) {\r\n moduleInfoJson = null;\r\n }\r\n\r\n var elementTelemetryLineage = getLineage(element);\r\n if (elementTelemetryLineage) {\r\n nameLineage = elementTelemetryLineage.nameLineage.reverse().join(lineageDelimiter);\r\n ordinalLineage = elementTelemetryLineage.ordinalLineage.reverse().join(lineageDelimiter);\r\n }\r\n\r\n // assign the time if event already has time field. (added from trackClickEvents)\r\n eventTime = event.time;\r\n }\r\n\r\n // check if destination url is bing or not. if it is, remove all telemetry sensitive data\r\n var duHostname = navigation.getHostName(destination);\r\n if (duHostname && duHostname.toLowerCase().indexOf(\"bing.com\") > -1) {\r\n // filter out privacy sensitive params\r\n destination = track.filterUrlParams(destination, [\"q\", \"pq\"]);\r\n\r\n // remove headline\r\n headline = \"\";\r\n }\r\n\r\n // @ts-ignore\r\n trackInfo.report =\r\n {\r\n /// \r\n /// This method creates a tracking report.\r\n /// It does NOT send the report, nor does it perform any navigation.\r\n ///\r\n /// \r\n /// \r\n /// element that was clicked or target of the event.\r\n /// \r\n /// \r\n /// destination url to use instead of computing.\r\n /// \r\n /// \r\n /// headline to use instead of computing.\r\n /// \r\n /// \r\n /// content module string to be used instead of computing.\r\n /// \r\n /// \r\n /// content index string to be used instead of computing.\r\n /// \r\n /// \r\n /// campaign id to be used instead of computing.\r\n /// \r\n /// \r\n /// data-m section to be used instead of computing.\r\n /// \r\n /// \r\n /// Report object that is structured as follows:\r\n /// report = {\r\n /// destinationUrl: destination,\r\n /// campaignId: '',\r\n /// contentElement: index,\r\n /// contentModule: module,\r\n /// headline: headline,\r\n /// sourceIndex,\r\n /// nodeName,\r\n /// module: moduleInfo,\r\n /// nLineage: nameLineage,\r\n /// oLineage: ordinalLineage,\r\n /// timeToInteract: trackInfo.timeToInteract()\r\n /// };\r\n /// \r\n destinationUrl: destination,\r\n headline: headline,\r\n contentModule: module,\r\n contentElement: index,\r\n campaignId: campaign,\r\n module: moduleInfoJson,\r\n sourceIndex: element.sourceIndex || \"\",\r\n nodeName: element.nodeName || \"\",\r\n nLineage: nameLineage,\r\n oLineage: ordinalLineage,\r\n timeToInteract: trackInfo.timeToInteract(eventTime),\r\n actionType: actionType,\r\n behaviorType: behaviorType\r\n };\r\n\r\n trackAll(\"getEventTrackingUrl\");\r\n}\r\n\r\nfunction trackPageInternal(overrideParams, persistOverriddenParams) {\r\n /// \r\n /// Fires page view call for each registered tracking system at the top of tag\r\n /// \r\n /// override client side params\r\n /// if true overridden params are persisted for other events otherwise false. Default is false\r\n\r\n var perfMarkerTrackingPageViewStart = \"TimeToTrackingPageViewStart\";\r\n var perfMarkerTrackingPageViewEnd = \"TimeToTrackingPageViewEnd\";\r\n\r\n // initialize params and assign default as false.\r\n persistOverriddenParams = !!persistOverriddenParams;\r\n\r\n // clear event in case trackPage is called more than once on a page\r\n delete trackInfo.event;\r\n\r\n // Clear the request id to generate the new request id\r\n // @ts-ignore\r\n delete trackInfo.userStatic.requestId;\r\n\r\n // Clear the override Client Params for every track page request and reassign the parameter.\r\n delete trackInfo.overrideClientParams;\r\n\r\n var paramPageName = \"pg.n\";\r\n var pageName = overrideParams && overrideParams[paramPageName];\r\n if (pageName) {\r\n var paramPageType = \"pg.t\";\r\n var telemetryPageName = telemetryDataTypes.getTelemetryPageInfo(pageName);\r\n if (telemetryPageName) {\r\n overrideParams[paramPageName] = telemetryPageName.PageName;\r\n\r\n var pageType = overrideParams[paramPageType];\r\n var telemetryPageType = telemetryDataTypes.validateTelemetryDataType(telemetryDataTypes.TelemetryPageType, pageType);\r\n if (telemetryPageType) {\r\n overrideParams[paramPageType] = telemetryPageType;\r\n } else if (telemetryPageName.PageType === telemetryDataTypes.TelemetryPageType.Unspecified) {\r\n // @ts-ignore\r\n overrideParams[paramPageType] = trackInfo.sitePage.page_type;\r\n } else {\r\n overrideParams[paramPageType] = telemetryPageName.PageType;\r\n }\r\n }\r\n }\r\n\r\n // This is needed since in prime we include this so that\r\n // telemetry team knows that the page should be ignored due to\r\n // automatic refresh\r\n var signInRefreshedPageKey = \"sign-in-refreshed-page\";\r\n if (sessionStorage.getItem(signInRefreshedPageKey)) {\r\n sessionStorage.removeItem(signInRefreshedPageKey);\r\n (overrideParams = overrideParams || {}).ar = 1;\r\n }\r\n\r\n trackInfo.overrideClientParams = overrideParams;\r\n trackInfo.persistOverriddenParams = persistOverriddenParams;\r\n\r\n var result = trackingHelper.modifyValuesForTrackPage();\r\n if (result && result.preventComscore) {\r\n track.preventBeacon(telemetryConstants.Comscore);\r\n }\r\n\r\n trackAll(\"getPageViewTrackingUrl\");\r\n\r\n // the refreshPageLoad value is undefined (false) at first page load request, and\r\n // we then set it to one (true).\r\n // subsequent calls to trackPage will then publish the mediator pageView event\r\n // that code can listen for to know when the page is generating a \"page view\"\r\n // due to significant content change.\r\n if (refreshPageLoad) {\r\n mediator.pub(\"pageView\");\r\n } else {\r\n refreshPageLoad = 1;\r\n mediator.pub(\"pageViewOnLoad\");\r\n }\r\n\r\n // Clear the override Client Params once the trackPage is fired so that other events don't use the overridden params from memory.\r\n delete trackInfo.overrideClientParams;\r\n}\r\n\r\nexport var track =\r\n{\r\n onContextMenu: onContextMenu,\r\n onClick: onClick,\r\n\r\n trackEvent: trackEvent,\r\n trackFormSubmitEvent: trackFormSubmitEvent,\r\n trackAdEvent: trackAdEvent,\r\n trackVideoEvent: trackVideoEvent,\r\n trackFeedbackEvent: trackFeedbackEvent,\r\n\r\n createEvent: createEvt,\r\n sendPageViewCandidate: sendPageViewCandidate,\r\n sendSinglePageViewBeacon: sendSinglePageViewBeacon,\r\n\r\n clearImpressionCache: clearImpressionCache,\r\n\r\n getFeedbackTrackingParams: getFeedbackTrackingParams,\r\n filterUrlParams: filterUrlParams,\r\n\r\n trackAppErrorEvent: function (errorParams) {\r\n /// \r\n /// This method tracks the app_error event.\r\n /// Call getEventTrackingUrl to fire the tracking call\r\n /// \r\n /// \r\n /// errorParams- defined in errorCategory\r\n /// \r\n\r\n telemetryReadyCallback((): void => {\r\n trackAppErrorEventInternal(errorParams);\r\n });\r\n },\r\n\r\n trackPartialImpression: function (elem, visibilityCheck, mechanism, topLevelContainerType) {\r\n /// The track partial impression will fire an impression update for the element graph.\r\n /// The element graph that contains the data-m attributes\r\n /// Conduct the visibility checking. By default is false\r\n /// Mechanism to capture for impression update. By Default is load. Mechanism load is used whenever the module is loaded and rendered to the user.\r\n /// TopLevelContainer type for impression update\r\n\r\n telemetryReadyCallback((): void => {\r\n trackPartialImpressionInternal(elem, visibilityCheck, mechanism, topLevelContainerType);\r\n });\r\n },\r\n\r\n trackPage: function (overrideParams?, persistOverriddenParams?) {\r\n /// \r\n /// Fires page view call for each registered tracking system at the top of tag\r\n /// \r\n /// override client side params\r\n /// if true overridden params are persisted for other events otherwise false. Default is false\r\n\r\n telemetryReadyCallback((): void => {\r\n trackPageInternal(overrideParams, persistOverriddenParams);\r\n });\r\n },\r\n\r\n trackThirdPartyUpdate: function () {\r\n /// \r\n /// Fires the third party tracking call for Ajax page refresh scenarios like slide refresh.\r\n /// \r\n\r\n mediator.pub(\"thirdPartyTrackingUpdate\");\r\n },\r\n\r\n register: function (...args: any[]) {\r\n /// \r\n /// Registers an implementation with the main Tracking function\r\n /// \r\n /// \r\n /// Implementation of tracking,\r\n /// must implement the following functions\r\n /// GetEventTrackingUrl(trackInfo) - generates url for tracking\r\n /// \r\n /// \r\n /// Implementation of tracking\r\n /// \r\n /// \r\n /// Returns the current object to enable cascading calls\r\n /// \r\n var ndx = 0;\r\n var trackingImplementation;\r\n\r\n // use double-parens to tell the validator that yes, we INTEND this to be an assignment (=)\r\n // and not a mistyped equals (==) conditional test.\r\n while ((trackingImplementation = arguments[ndx++])) {\r\n if (isNaN(trackingImplementation.samplingRate)) {\r\n trackingImplementation.samplingRate = 99;\r\n }\r\n recipients.push(trackingImplementation);\r\n }\r\n },\r\n\r\n getCurrentPageRequestId: function () {\r\n /// \r\n /// Utility function to return the current page request Id. Empty value will be returned if this method is called before\r\n /// telemetry initialization.\r\n /// \r\n /// the current page request Id\r\n /// \r\n\r\n // @ts-ignore\r\n return pageInstance.getRequestId() || trackInfo.sitePage.requestId || \"\";\r\n },\r\n\r\n mapTelemetryParams: function (common, commonMap, params, paramsMap) {\r\n /// \r\n /// Utility function to gather all the telemetry Params.\r\n /// \r\n /// \r\n /// Object contains common parameters.\r\n /// \r\n /// \r\n /// Object contains common param to property mapping\r\n /// E.g. map.sitePage:{ a1: \"page_name\"}\r\n /// this will create a querystring a1=\"value of trackInfo.sitePage.page_name\"\r\n /// \r\n /// \r\n /// Object contains custom parameters.\r\n /// \r\n /// \r\n /// Object contains param to property mapping\r\n /// E.g. map.sitePage:{ a1: \"page_name\"}\r\n /// this will create a querystring a1=\"value of trackInfo.sitePage.page_name\"\r\n /// \r\n /// \r\n /// url that will be called to do the tracking\r\n /// \r\n\r\n var groupKey; \r\n var groupValue; \r\n var key; \r\n var value;\r\n params = extend({}, common, params);\r\n // Get params from commonMap\r\n paramsMap = extend(true, {}, commonMap, paramsMap);\r\n for (groupKey in paramsMap) {\r\n var trackInfoGroupKey = trackInfo[groupKey];\r\n if (trackInfoGroupKey) {\r\n groupValue = paramsMap[groupKey];\r\n for (key in groupValue) {\r\n // check the override client params first\r\n var clientParams = trackInfo.overrideClientParams;\r\n if (key && clientParams && clientParams[key] !== undefined) {\r\n value = clientParams[key];\r\n // if persisting overridden params then override trackInfo group key with value from overridden client params.\r\n if (trackInfo.persistOverriddenParams) {\r\n trackInfoGroupKey[groupValue[key]] = value;\r\n }\r\n } else {\r\n value = trackInfoGroupKey[groupValue[key]];\r\n\r\n if (typeof value == \"function\") {\r\n value = value();\r\n }\r\n }\r\n\r\n // allow for empty strings but use null or undefined to ignore the parameter entirely\r\n if (value != null) {\r\n params[key] = value;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return params;\r\n },\r\n\r\n extend: function (obj) {\r\n extend(true, trackInfo, obj);\r\n },\r\n\r\n form: function (elem) {\r\n /// \r\n /// Helper function to bind Form elements that are part of element for tracking\r\n /// \r\n\r\n if (!elem || !elem.length) {\r\n elem = [elem];\r\n }\r\n var formElem;\r\n var ndx = 0;\r\n\r\n // use double-parens to tell the validator that yes, we INTEND this to be an assignment (=)\r\n // and not a mistyped equals (==) conditional test.\r\n while ((formElem = elem[ndx++])) {\r\n // if element is a form element and has not attr \"data-customformtrack\", bind the submit to it.\r\n // if the attr \"data-customformtrack\" is included, it is entirely reponsible for firing its own\r\n // tracking beacons\r\n if (\"FORM\" == domName(formElem) && !attr(formElem, \"data-customformtrack\")) {\r\n events.bind(formElem, \"submit\", trackFormSubmitEvent);\r\n }\r\n }\r\n },\r\n\r\n preventBeacon: function (beaconId) {\r\n /// Set the value isGeneratedEarly to prevent the sending of a beacon.\r\n /// The name of the beacon as listed in the markets.config file.\r\n if (beaconId) {\r\n beaconId = beaconId.toLowerCase();\r\n\r\n // loop through each implementation\r\n for (var ndx = 0; ndx < recipients.length; ndx++) {\r\n var defOpts = recipients[ndx].defaultOpts;\r\n if (beaconId === defOpts.id.toLowerCase()) {\r\n defOpts.isGeneratedEarly = true;\r\n break;\r\n }\r\n }\r\n }\r\n },\r\n\r\n trackPageRefresh: function (overrideParams?, persistOverriddenParams?) {\r\n /// \r\n /// Fires page view call for each registered tracking system at the top of tag and resets activity Id.\r\n /// \r\n /// override client side params\r\n /// if true overridden params are persisted for other events otherwise false. Default is false\r\n\r\n // calling pageInstance.updatePageInstance() instead of using mediator\r\n // to eliminate delay rid update when executed via mediator.pub\r\n pageInstance.updatePageInstance();\r\n clearImpressionCache();\r\n trackPageInternal(overrideParams, persistOverriddenParams);\r\n\r\n setTimeout(\r\n () => {\r\n trackPartialImpressionInternal(document.getElementById(\"root\"), true, \"load\", null);\r\n },\r\n 1000);\r\n }\r\n};\r\n\r\n// find's all the children dom elements that have the 'data-m' attribute defined.\r\n// also returns the current element if it meets the criteria.\r\nfunction findTelemetryElements(domElement) {\r\n var elements = [];\r\n\r\n // for modern browsers I can use querySelectorAll to find the child elements.\r\n if (domElement && domElement.querySelectorAll) {\r\n var telemetryChildren = domElement.querySelectorAll('[data-m]');\r\n\r\n // include the root if applicable\r\n if (attr(domElement, 'data-m')) {\r\n elements.push(domElement);\r\n }\r\n\r\n // do the children\r\n for (var index = 0; index < telemetryChildren.length; index++) {\r\n elements.push(telemetryChildren[index]);\r\n }\r\n }\r\n\r\n // return the elements\r\n return elements;\r\n}\r\n\r\n// a helper function that will parse json contained within attributes\r\nfunction parseDomAttributeJson(element, attributeName) {\r\n var dataAttr = attr(element, attributeName);\r\n if (dataAttr) {\r\n try {\r\n return JSON.parse(dataAttr);\r\n } catch (e) {\r\n return null;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n// a helper function to check if an array contains an element.\r\nfunction contains(item, array) {\r\n if (array.indexOf) {\r\n return array.indexOf(item) !== -1;\r\n } else {\r\n // for IE8\r\n for (var i = 0; i < array.length; i++) {\r\n if (array[i] === item) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction trackPartialImpressionInternal(elem, visibilityCheck, mechanism, topLevelContainerType) {\r\n /// The track partial impression will fire an OTF impression update for the element graph.\r\n /// The element graph that contains the data-m attributes\r\n /// Conduct the visibility checking. By default is false\r\n /// Mechanism to capture for impression update. By Default is load\r\n /// TopLevelContainer type for impression update. By Default is load\r\n\r\n var perfMarkerTrackingPartialImprUpdateStart = \"TimeToTrackingPartialImprUpdateStart\";\r\n var perfMarkerTrackingPartialImprUpdateEnd = \"TimeToTrackingPartialImprUpdateEnd\";\r\n\r\n if (elem) {\r\n if (elem.jquery) {\r\n elem = elem[0];\r\n }\r\n\r\n // retrieve the telemetry elements.\r\n var elements = findTelemetryElements(elem);\r\n var formattedModules = [];\r\n\r\n for (var index = 0; index < elements.length; index++) {\r\n var element = elements[index];\r\n if (visibilityCheck && !trackInfo.telemetryTracking.isVisible(element)) {\r\n continue;\r\n }\r\n\r\n var impressionContent = parseDomAttributeJson(element, 'data-m');\r\n var id = impressionContent ? impressionContent.i : undefined;\r\n\r\n // ensure we haven't already sent the payload\r\n if (id !== undefined && !contains(id, impressionCache)) {\r\n // add it to our cache\r\n impressionCache.push(id);\r\n formattedModules.push(impressionContent);\r\n\r\n // TODO: (nubenja) Remove this once data-m.y is deprecated\r\n // Convertion from telemetryType (data-m.y) to telemetryContentType and telemetryContentAction (data-m.ct/ca)\r\n if (impressionContent.y && !impressionContent.ct) {\r\n var ct = telemetryDataTypes.getTelemetryContentType(impressionContent.y);\r\n\r\n if (ct) {\r\n impressionContent.ct = ct;\r\n }\r\n }\r\n }\r\n }\r\n\r\n var context = {};\r\n if (formattedModules && formattedModules.length > 0) {\r\n // @ts-ignore\r\n context.e = formattedModules;\r\n }\r\n\r\n // fire the telemetry event if we were able to get any impression data.\r\n // @ts-ignore\r\n if (context && context.e && context.e.length > 0) {\r\n var mech = (mechanism) ? mechanism : trackInfo.imprUpdateMechanisms.partial;\r\n trackInfo.telemetryTracking.sendImprUpdateEvent(mech, context, topLevelContainerType);\r\n }\r\n }\r\n}\r\n\r\nfunction clearImpressionCache() {\r\n impressionCache = [];\r\n}\r\n\r\nfunction getEventFromUrl(targetUrl) {\r\n /// \r\n /// Check the Current Url and get the event name from the targetUrl.\r\n /// The URL format for the specifying the event name is - url#tevt=EVENTNAME;OTHER_NAME_VALUE_PAIRS\r\n /// \r\n /// \r\n /// The target Url for the event.\r\n /// \r\n /// event name, if it is specified, else null. \r\n\r\n /*\r\n For input value : \"http://www.bing.com/videos/search?q=&mkt=en-GB#tevt=click_nonnav;\"\r\n The result will be like this-\r\n [#tevt=click_nonnav;,click_nonnav,;]\r\n [0] : \"#tevt=click_nonnav;\",\r\n [1] : \"click_nonnav\",\r\n [2] : \";\",\r\n\r\n The 1st element contains the event name.\r\n */\r\n\r\n // If event name is not found, return null, the original event name will be kept.\r\n var result = new RegExp(regExpEventName).exec(targetUrl);\r\n return (result && result.length && result[1]) || null;\r\n};\r\n\r\nfunction getClickEventFromUrl(targetUrl) {\r\n /// \r\n /// Check the Current Url -\r\n /// Case 1- if the Url format is - baseurl/#, then treat it as nonNav event.\r\n /// Match Domain name.\r\n /// If the Url of current page and target page is same and only # is at the end, then it is not navigating away from the page.\r\n ///\r\n /// Case 2 - the Url format is url#tevt=EVENTNAME;OTHER_NAME_VALUE_PAIRS,\r\n /// extract the event name from the Url. the event name is terminated with ;\r\n /// \r\n /// \r\n /// The target Url for the event.\r\n /// \r\n /// \r\n /// event name; if it is a non nav url and no event name is specified then return the default non nav click event name,\r\n /// otherwise, return the event name specified in the url.\r\n /// \r\n\r\n var evtName = null;\r\n if (targetUrl) {\r\n // if the target url contains tevt=, then this url contains the event name. We will extract the event name from url.\r\n if (targetUrl.indexOf(tEvtTag) == -1) {\r\n // If the Url format is - http://www.msn.com/#, then categorize it as nonnav click.\r\n // Convert the baseurl and currentUrl in lowercase for comparison.\r\n var baseUrl = targetUrl.substring(0, targetUrl.indexOf('#')).toLowerCase();\r\n var curUrl = getLocationHref().toLowerCase();\r\n if (curUrl == baseUrl || curUrl.substring(0, curUrl.indexOf('#')) == baseUrl) {\r\n evtName = trackInfo.eventTypes.nonNavClckEvt;\r\n }\r\n } else {\r\n // extract the event name from url.\r\n evtName = getEventFromUrl(targetUrl);\r\n }\r\n }\r\n // Return null, so that the original event is kept.\r\n return evtName;\r\n};\r\n\r\nfunction createEvt(event, eventName, targetElem) {\r\n /// \r\n /// Creates an event based upon the properties of the base event.\r\n /// \r\n /// \r\n /// This is a an input event parameter. Some basic properties are copied from this param to the the event created.\r\n /// \r\n /// \r\n /// Name of the event to be created.\r\n /// \r\n /// \r\n /// Target element that need to be attached to the event being created in this method.\r\n /// \r\n /// An object is created with base properties from the event passed as param. This object is then returned. \r\n\r\n var evt = null;\r\n\r\n if (doc && doc.createEvent) { // Supported by non-IE based browsers.\r\n evt = doc.createEvent(\"Events\");\r\n evt.initEvent(eventName, false, true, targetElem || window,\r\n 0, 0, 0, 0, 0, false, false, false, false, 0, null);\r\n // @ts-ignore\r\n } else if (doc && doc.createEventObject) { // Supported by IE based browsers.\r\n // @ts-ignore\r\n evt = doc.createEventObject(event);\r\n evt.type = eventName;\r\n }\r\n\r\n if (evt) {\r\n evt.customTarget = targetElem;\r\n\r\n // Store the original event type in a field\r\n evt.originalEvent = event && event.type;\r\n }\r\n\r\n return evt;\r\n};\r\n\r\nfunction preventEventDefault(event) {\r\n /// \r\n /// Cancels the event and prevents from being passed further.\r\n /// \r\n /// \r\n /// Input event parameter that need to be canceled.\r\n /// \r\n if (event.preventDefault) { // For Non IE\r\n event.preventDefault();\r\n } else { // For IE\r\n event.returnValue = false;\r\n }\r\n};\r\n\r\nfunction onContextMenu(event) {\r\n /// \r\n /// onContextMenu Handler\r\n /// we'll only track context menu events if the target is a link (A or AREA)\r\n /// This event is used to keep track of when the context menu opens....\r\n /// Right click does not generate onClick events, so we are tracking context menu on all the form factors.\r\n /// \r\n trackClickEvents(event);\r\n};\r\n\r\nfunction onClick(event) {\r\n /// \r\n /// OnClick Handler\r\n /// we'll only track clicks if the target is a link (A or AREA)\r\n /// AND the mouse button isn't the RIGHT button.\r\n /// MOST browsers think the mouse button value is 2. For those that don't, this\r\n /// might have to be revisited.\r\n /// \r\n if (2 == event.button) {\r\n return;\r\n }\r\n\r\n trackClickEvents(event);\r\n};\r\n\r\n/// \r\n/// Computes the lineage of a particular element, passing back the object containing array of 'n's and array of 'o's on the dom tree.\r\n/// \r\n/// An object containing the array of 'n's and array of 'o's on the dom tree starting with the current element, or an empty array if none are found.\r\nfunction getLineage(element) {\r\n var result: any = {};\r\n var nameLineageArray = [];\r\n var ordinalLineageArray = [];\r\n\r\n while (element) {\r\n var telemetryObject = parseDomAttributeJson(element, 'data-m');\r\n if (telemetryObject) {\r\n if (telemetryObject.n) {\r\n nameLineageArray.push(telemetryObject.n);\r\n }\r\n\r\n if (telemetryObject.o) {\r\n ordinalLineageArray.push(telemetryObject.o);\r\n }\r\n }\r\n element = getParent(element);\r\n }\r\n\r\n result.nameLineage = nameLineageArray;\r\n result.ordinalLineage = ordinalLineageArray;\r\n return result;\r\n}\r\n\r\nfunction isClickedTwice(currentTarget) {\r\n /// \r\n /// isClickedTwice method\r\n /// Identify if more than one click event happened on the same element in short span of time.\r\n /// \r\n /// Return true if the user click on the same element twice in short span of time, otherwise false.\r\n\r\n // if lastClickedTarget is same as currentTarget means user clicked on same elements twice to be considered as double click.\r\n try {\r\n if (currentTarget && lastClickedTarget && lastClickedTarget === currentTarget) {\r\n return true;\r\n }\r\n lastClickedTarget = currentTarget;\r\n setTimeout(function () {\r\n // Reset 'lastClickedTarget' after a ceratin time period to avoid any kind of unexpected situation.\r\n lastClickedTarget = null;\r\n }, clickTargetResetTimeoutInMs);\r\n } catch (ex) {\r\n lastClickedTarget = null;\r\n return false;\r\n }\r\n return false;\r\n}\r\n\r\nfunction trackClickEvents(event) {\r\n /// \r\n /// trackClickEvents method\r\n /// Tracks all the click events on links.\r\n /// \r\n\r\n // handle error scenarios.\r\n if (!event) {\r\n return;\r\n }\r\n\r\n // If the event or in the originalEvent the developer has set customHandled=true, which means its been already explicitly fired.\r\n // In those cases, don't fire the implicit event.\r\n if (event.customHandled || (event.originalEvent && event.originalEvent.customHandled)) {\r\n return;\r\n }\r\n\r\n // Temp. Hack for Image Map: In IE9, srcElement associated with window.event is not returning correct element.\r\n // Instead of returning a element, it is returning element. element has no href attribute, neither it's parents do have.\r\n // For this reason, Tracking calls are not fired in IE9.\r\n // This hack will check if the event belongs to ImageMap. If so, it will pick activeElement from document and assign it as target/customTarget.\r\n try {\r\n // Passing the time parameter inside event object with timestamp as a value.\r\n event.time = trackInfo.getCurrentTime();\r\n if (event.customTarget && event.customTarget.useMap) {\r\n event.customTarget = event.customTarget.document.activeElement;\r\n event.target = event.customTarget;\r\n }\r\n } catch (ex) { }\r\n\r\n // we assume that an element with an href (and or an ) is the click-tracking element.\r\n // we also want to target \r\n {this.renderPopOver()}\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Renders the pop over menu\r\n * @method\r\n * @returns {JSX.Element} The pop over menu JSX Element\r\n */\r\n private renderPopOver(): JSX.Element {\r\n const { menuOpened, dropDownLocation } = this.state;\r\n const enabled = menuOpened && dropDownLocation && !isNil(dropDownLocation.left) && !isNil(dropDownLocation.top);\r\n\r\n return (\r\n \r\n
\r\n \r\n {this.renderContextMenu()}\r\n \r\n
\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Renders the context menu items\r\n * @method\r\n * @returns {JSX.Element} The pcontext menu items JSX Element\r\n */\r\n private renderContextMenu(): JSX.Element[] {\r\n const { menuItems } = this.props;\r\n const { contextMenuItem, contextMenuItem_contentRegion, contextMenuItem_image } = this.props.managedClasses;\r\n return menuItems.map(itemProps => (\r\n | React.KeyboardEvent): void => {\r\n e.preventDefault();\r\n this.onMenuItemClick(e, itemProps.onSelect);\r\n }}>\r\n
\r\n {itemProps.icon && (\r\n )}\r\n {itemProps.text}\r\n
\r\n \r\n ));\r\n }\r\n\r\n /**\r\n * Handles unfocusing the Context Menu or Esc key down\r\n * @method\r\n */\r\n private handleUnfocus = (e: Event) => {\r\n const buttonContainerContainsNode = (node: Node) => !this.containerRef.current || this.containerRef.current.contains(node);\r\n // Can't put ref on the PopOver react element, so we attach to a ref div and check its immediate parent\r\n // Must check parent because focus goes to PopOver, which is outside menuRef (otherwise menu closes when you try tab to it)\r\n const menuPopoverContainsNode = (node: Node) => !this.menuRef.current || this.menuRef.current.parentNode.contains(node);\r\n\r\n if (e.target && !buttonContainerContainsNode(e.target as Node) && !menuPopoverContainsNode(e.target as Node)) {\r\n this.closeMenu();\r\n } else if (e.type === \"keydown\") {\r\n const keyEvent = e as KeyboardEvent;\r\n if (keyEvent.keyCode === keyCodeEscape) {\r\n e.preventDefault();\r\n this.closeMenu();\r\n this.buttonRef.current.focus();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handles closing the menu\r\n * @method\r\n */\r\n private closeMenu = (): void => {\r\n this.setState({ menuOpened: false });\r\n }\r\n\r\n /**\r\n * Handles the click on the menuitems\r\n * @method\r\n */\r\n private onMenuItemClick(event: any, onSelectCallback: (e) => void): void {\r\n if (onSelectCallback) {\r\n onSelectCallback(event);\r\n }\r\n this.closeMenu();\r\n }\r\n\r\n /**\r\n * Handles the click on the settings button to show the context menu\r\n * @method\r\n */\r\n private onSettingClick(e: any): void {\r\n const posOffset = this.props.positionOffset;\r\n const offsetX = posOffset ? posOffset.x : 0;\r\n const offsetY = posOffset ? posOffset.y : 0;\r\n\r\n let dropDownLocation = {};\r\n if (e.target) {\r\n const { top, left, width } = e.target.getBoundingClientRect();\r\n dropDownLocation = { top: top + offsetY + window.scrollY, left: left + offsetX + window.scrollX, offset: width };\r\n }\r\n this.setState({ menuOpened: !this.state.menuOpened, dropDownLocation });\r\n }\r\n}\r\n\r\nexport { CardContextMenu as CardContextMenu };\r\nexport * from \"./CardContextMenu.props\";","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n DesignSystem,\r\n applyTypeRampConfig,\r\n highContrastSelector,\r\n neutralForegroundRest\r\n} from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty, toPx } from \"@microsoft/fast-jss-utilities\";\r\n\r\nimport { ButtonClassNameContract } from \"@microsoft/fast-components-class-name-contracts-msft\";\r\nimport { ComponentStyles } from \"@microsoft/fast-jss-manager\";\r\nimport { SocialMediaIconClassNameContract } from \"./SocialMediaIcon.classnames\";\r\n\r\n/** Value for border radius on icons */\r\nconst borderRadiusIcons = 2;\r\n\r\n/** icon height */\r\nconst iconHeight = 40;\r\n\r\n/** icon width */\r\nconst iconWidth = 40;\r\n\r\n/** label width */\r\nconst labelWidth = 60;\r\n\r\n/**\r\n * The JSS stylesheet for the social media icon\r\n * @type {ComponentStyles}\r\n * @param {DesignSystem} config - The design system configuration interface\r\n */\r\nexport const SocialMediaIconStyles: ComponentStyles = (config: DesignSystem) => {\r\n return {\r\n iconContainer: {\r\n \"border-radius\": toPx(borderRadiusIcons),\r\n height: toPx(iconHeight),\r\n width: toPx(iconWidth),\r\n \"line-height\": toPx(iconHeight),\r\n position: \"relative\",\r\n \"&:hover\": {\r\n cursor: \"pointer\"\r\n }\r\n },\r\n iconImage: {\r\n bottom: \"0\",\r\n left: \"0\",\r\n margin: \"auto\",\r\n position: \"absolute\",\r\n right: \"0\",\r\n top: \"0\"\r\n },\r\n iconLabel: {\r\n \"&&\": {\r\n ...applyTypeRampConfig(\"t8\"),\r\n \"line-height\": \"20px\",\r\n \"text-align\": \"center\",\r\n [applyLocalizedProperty(\"margin-left\", \"margin-right\", config.direction)]: toPx(-(labelWidth - iconHeight) / 2),\r\n \"margin-top\": \"4px\",\r\n padding: \"3px 0\",\r\n width: toPx(labelWidth),\r\n \"&:hover\": {\r\n cursor: \"pointer\"\r\n },\r\n [highContrastSelector]: {\r\n background: \"ButtonFace\",\r\n color: \"LinkText\"\r\n }\r\n }\r\n }\r\n };\r\n};\r\n\r\n/** style to override button existing style */\r\nexport const ButtonStyle: Partial> = (config: DesignSystem) => {\r\n return {\r\n button__justified: {\r\n \"&&\": {\r\n \"background-color\": \"transparent\",\r\n \"text-decoration\": \"none\",\r\n height: \"inherit\",\r\n \"min-width\": \"unset\",\r\n [applyLocalizedProperty(\"padding-left\", \"padding-right\", config.direction)]: toPx((labelWidth - iconHeight) / 2),\r\n \"&:focus\": {\r\n \"outline\": `1px solid ${neutralForegroundRest(config)}`\r\n }\r\n }\r\n }\r\n };\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n SocialMediaIconHandledProps as BaseComponentHandledProps,\r\n SocialMediaIconProps as BaseComponentProps,\r\n SocialMediaIconManagedClasses,\r\n SocialMediaIconUnHandledProps\r\n} from \"./SocialMediaIcon.props\";\r\nimport manageJss, { ManagedJSSProps } from \"@microsoft/fast-jss-manager-react\";\r\n\r\nimport { SocialMediaIcon as BaseComponent } from \"./SocialMediaIcon\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { SocialMediaIconClassNameContract } from \"./SocialMediaIcon.classnames\";\r\nimport { SocialMediaIconStyles } from \"./SocialMediaIcon.styles\";\r\nimport { Subtract } from \"utility-types\";\r\n\r\n/*\r\n * The type returned by manageJss type is very complicated so we'll let the\r\n * compiler infer the type instead of re-declaring just for the package export\r\n */\r\n/* tslint:disable-next-line:typedef */\r\nconst SocialMediaIcon = manageJss(SocialMediaIconStyles)(BaseComponent);\r\ntype SocialMediaIcon = InstanceType;\r\n\r\n// Create a valid JSS managed interface that doesn't require managed classes which are provided by the manageJSS HOC\r\ninterface SocialMediaIconHandledProps extends Subtract { }\r\n\r\n// Create type for manageJSS HOC styled instance we are exporting\r\ntype SocialMediaIconProps = ManagedJSSProps;\r\n\r\n// Export everything a user might need from this index file\r\nexport {\r\n SocialMediaIcon,\r\n SocialMediaIconProps,\r\n SocialMediaIconClassNameContract,\r\n SocialMediaIconHandledProps,\r\n SocialMediaIconUnHandledProps\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { Button, ButtonAppearance, Label } from \"@microsoft/fast-components-react-msft\";\r\nimport {\r\n SharingHelper,\r\n SocialMediaDefaultConfig,\r\n SocialMediaItemConfigAttributes,\r\n SocialMediaTarget\r\n} from \"@msnews/views-helpers\";\r\nimport {\r\n SocialMediaIconHandledProps,\r\n SocialMediaIconProps,\r\n SocialMediaIconUnHandledProps\r\n} from \"./SocialMediaIcon.props\";\r\n\r\nimport { ButtonStyle } from \"./SocialMediaIcon.styles\";\r\nimport Foundation from \"@microsoft/fast-components-foundation-react\";\r\nimport { HandledPropsKeys } from \"@msnews/core\";\r\nimport { Icon } from \"@msnews/icon\";\r\nimport React from \"react\";\r\nimport { merge } from \"lodash-es\";\r\n\r\n/**\r\n * Social medial icon component\r\n * @class - The Social Media Icon class\r\n * @classdesc - Renders the visual Social Media Icon used to share links without major social media solutions.\r\n * @export\r\n * @default\r\n */\r\nexport class SocialMediaIcon extends Foundation {\r\n /**\r\n * Social media icon handled props contract\r\n * @protected\r\n * @type { HandledPropsKeys }\r\n */\r\n protected handledProps: HandledPropsKeys = {\r\n managedClasses: undefined,\r\n socialMedia: undefined,\r\n contentUrl: undefined,\r\n contentTitle: undefined,\r\n hideLabel: undefined,\r\n socialMediaItemConfigOverride: undefined\r\n };\r\n\r\n /**\r\n * Render social media icon\r\n *\r\n * @public\r\n * @return {JSX.Element}\r\n */\r\n public render(): JSX.Element {\r\n const { managedClasses, contentUrl, contentTitle, hideLabel, socialMedia, socialMediaItemConfigOverride } = this.props;\r\n const itemConfig = merge({}, SocialMediaDefaultConfig[socialMedia], socialMediaItemConfigOverride);\r\n if (!itemConfig) {\r\n return null;\r\n }\r\n\r\n const shareUrl = SharingHelper.getSocialMediaShareUrl(socialMedia, contentUrl, contentTitle, itemConfig.ocid, itemConfig.url);\r\n if (!shareUrl) {\r\n return null;\r\n }\r\n\r\n const target = itemConfig.target.toString();\r\n const targetRelatedAtributes = target === SocialMediaTarget.newWindow ?\r\n { onClick: (event: any) => this.onClickNewWindow(event, shareUrl, itemConfig.newWindowOptions, itemConfig.newWindowTelemetryCall), role: \"button\", \"data-customhandled\": true } :\r\n { href: shareUrl, target: target };\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handles custom on click when targeting new windows\r\n * @public\r\n * @return {JSX.Element}\r\n */\r\n private onClickNewWindow = (event: any, shareUrl: string, newWindowOptions: any, newWindowTelemetryCall: (event: any) => void): void => {\r\n SharingHelper.openNewWindow(event, shareUrl, newWindowOptions);\r\n if (newWindowTelemetryCall) {\r\n newWindowTelemetryCall(event);\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Shallow compare of two objects.\r\n * Compares reference and primitive values of both object's key-value pairs\r\n *\r\n * @param a\r\n * @param b\r\n * @returns {bool} result of comparison.\r\n */\r\nexport function ShallowCompare(a: Object, b: Object): boolean {\r\n for (let key in a) {\r\n if (!(key in b) || a[key] !== b[key]) {\r\n return false;\r\n }\r\n }\r\n\r\n for (let key in b) {\r\n if (!(key in a) || a[key] !== b[key]) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { CSSRules, ComponentStyleSheet, ComponentStyles } from \"@microsoft/fast-jss-manager\";\r\nimport {\r\n DesignSystem,\r\n DesignSystemDefaults,\r\n applyAcrylicMaterial,\r\n applyTypeRampConfig,\r\n fontWeight,\r\n highContrastSelector,\r\n neutralForegroundRest\r\n} from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty, toPx } from \"@microsoft/fast-jss-utilities\";\r\nimport { get, memoize } from \"lodash-es\";\r\n\r\nimport { DialogClassNameContract } from \"@microsoft/fast-components-react-base\";\r\nimport { ShareDialogClassNameContract } from \"./ShareDialog.classnames\";\r\nimport { ZIndex } from \"@msnews/core\";\r\nimport { canUseDOM } from \"@msnews/isomorphic-util\";\r\n\r\n/** Default values for border radius */\r\nconst borderRadiusCopyLink = 2;\r\nconst borderRadiusDialog = 4;\r\n\r\n/**\r\n * Default color values for the share dialog\r\n */\r\nconst ShareDialogColors = {\r\n dividerLine: \"rgba(0,0,0, 0.05)\",\r\n inputText: \"rgba(0, 1, 0, 0.6)\",\r\n inputBorder: \"rgba(0, 0, 0, 0.2)\",\r\n copyLinkButtonBackground: \"#0078D4\",\r\n copyLinkButtonBackgroundActive: \"#1B64B0\",\r\n copyLinkButtonText: \"#FFF\",\r\n dialogOverlayBackground: \"rgba(0, 0, 0, 0.4)\"\r\n};\r\n\r\n/**\r\n * The JSS stylesheet for the base dialog\r\n * @type {ComponentStyles}\r\n * @param {DesignSystem} config - The design system configuration interface\r\n */\r\nexport const baseDialogStyles: ComponentStyles = (config: DesignSystem) => {\r\n const backgroundColor: string = get(config, \"backgroundColor\", DesignSystemDefaults.backgroundColor);\r\n\r\n return {\r\n dialog: {\r\n display: \"none\",\r\n '&[aria-hidden=\"false\"]': {\r\n display: \"block\"\r\n }\r\n },\r\n dialog_modalOverlay: {\r\n position: \"fixed\",\r\n background: ShareDialogColors.dialogOverlayBackground,\r\n top: \"0\",\r\n left: \"0\",\r\n right: \"0\",\r\n bottom: \"0\",\r\n \"z-index\": `${ZIndex.Above}`\r\n },\r\n dialog_contentRegion: {\r\n position: \"fixed\",\r\n left: \"50%\",\r\n top: \"50%\",\r\n transform: \"translate(-50%, -50%)\",\r\n \"border-radius\": toPx(borderRadiusDialog),\r\n \"box-shadow\": \"none\",\r\n \"z-index\": `${ZIndex.Above + 1}`,\r\n ...applyAcrylicMaterial(backgroundColor, 0.7, 0.7, true)\r\n }\r\n };\r\n};\r\n\r\n /**\r\n * Gets the override style for base dialog based on ZIndex\r\n * @private\r\n * @method\r\n * @return {>} the result style to be passed to base dialog\r\n */\r\nexport const setStyleByZIndex = memoize((overrides: ComponentStyleSheet = {}, zIndex: number = null) => {\r\n return zIndex == null ? overrides : {\r\n ...overrides,\r\n dialog_modalOverlay: {\r\n ...overrides.dialog_modalOverlay,\r\n \"z-index\": zIndex.toString()\r\n },\r\n dialog_contentRegion: {\r\n ...overrides.dialog_contentRegion,\r\n \"z-index\": (zIndex + 1).toString()\r\n }\r\n };\r\n});\r\n\r\n/**\r\n * The JSS stylesheet for the share dialog\r\n * @type {ComponentStyles}\r\n * @param {DesignSystem} config - The design system configuration interface\r\n */\r\nexport const ShareDialogStyles: ComponentStyles = (config: DesignSystem) => {\r\n const iconWidth = 40;\r\n const headerLineHeight = 24;\r\n const backdropFilterStyles: CSSRules = {\r\n background: \"none\"\r\n };\r\n const fallbackStyles: CSSRules = {\r\n background: get(config, \"backgroundColor\", DesignSystemDefaults.backgroundColor)\r\n };\r\n const backdropFilterSupport: boolean = canUseDOM() && (\"backdrop-filter\" in document.documentElement.style || \"-webkit-backdrop-filter\" in document.documentElement.style);\r\n const backgroundStyle: CSSRules = backdropFilterSupport ? backdropFilterStyles : fallbackStyles;\r\n return {\r\n closeButton: {\r\n background: \"transparent !important\",\r\n border: \"none\",\r\n height: `${headerLineHeight}px !important`,\r\n padding: \"0\",\r\n position: \"absolute\",\r\n \"min-width\": toPx(headerLineHeight),\r\n [applyLocalizedProperty(\"right\", \"left\", config.direction)]: \"4px\",\r\n \"&:hover, &:focus, &:active\": {\r\n cursor: \"pointer\"\r\n },\r\n [highContrastSelector]: {\r\n background: \"ButtonFace !important\",\r\n \"& svg\": {\r\n fill: \"ButtonText\"\r\n },\r\n \"&:hover, &:focus, &:active\": {\r\n background: \"Highlight !important\",\r\n \"& svg\": {\r\n fill: \"HighlightText\"\r\n }\r\n }\r\n }\r\n },\r\n closeIcon: {\r\n fill: neutralForegroundRest\r\n },\r\n copyLinkButton: {},\r\n copyLinkInput: {},\r\n dialogContainer: {\r\n ...backgroundStyle,\r\n \"border-radius\": toPx(borderRadiusDialog),\r\n padding: \"0 12px\",\r\n width: \"322px\",\r\n \"box-sizing\": \"content-box\",\r\n \"& $inputContainer\": {\r\n \"& $copyLinkInput\": {\r\n [applyLocalizedProperty(\"border-top-left-radius\", \"border-top-right-radius\", config.direction)]: toPx(borderRadiusCopyLink),\r\n [applyLocalizedProperty(\"border-bottom-left-radius\", \"border-bottom-right-radius\", config.direction)]: toPx(borderRadiusCopyLink)\r\n }\r\n },\r\n [highContrastSelector]: {\r\n border: \"1px solid Highlight\"\r\n }\r\n },\r\n header: {\r\n \"border-bottom\": `${config.outlineWidth}px solid ${ShareDialogColors.dividerLine}`,\r\n display: \"flex\",\r\n \"line-height\": toPx(headerLineHeight),\r\n padding: \"12px 0\",\r\n \"text-align\": \"center\"\r\n },\r\n headerText: {\r\n ...applyTypeRampConfig(\"t7\"),\r\n \"font-weight\": `${fontWeight.semibold}`,\r\n margin: \"0\",\r\n width: \"100%\"\r\n },\r\n iconListContainer: {\r\n display: \"inline-block\",\r\n \"list-style\": \"none\",\r\n \"text-align\": \"center\",\r\n margin: \"36px 11px 0 11px\",\r\n padding: \"0\"\r\n },\r\n iconListItem: {\r\n float: applyLocalizedProperty(\"left\", \"right\", config.direction),\r\n width: toPx(iconWidth),\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: \"40px\",\r\n \"&:nth-child(4)\": {\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: 0\r\n },\r\n \"&:nth-child(n+5)\": {\r\n \"margin-top\": \"24px\"\r\n },\r\n \"&:nth-child(4n+1)\": {\r\n clear: \"both\"\r\n }\r\n },\r\n inputContainer: {\r\n \"box-sizing\": \"content-box\",\r\n \"padding-top\": \"24px\",\r\n \"padding-bottom\": \"32px\",\r\n \"text-align\": \"center\",\r\n \"& $copyLinkInput\": {\r\n border: `2px solid ${ShareDialogColors.inputBorder}`,\r\n \"box-sizing\": \"content-box\",\r\n color: ShareDialogColors.inputText,\r\n ...applyTypeRampConfig(\"t8\"),\r\n padding: \"1px 0 1px 5px\",\r\n height: \"28px\",\r\n width: \"191px\"\r\n },\r\n \"& $copyLinkButton\": {\r\n background: ShareDialogColors.copyLinkButtonBackground,\r\n [applyLocalizedProperty(\"border-top-right-radius\", \"border-top-left-radius\", config.direction)]: toPx(borderRadiusCopyLink),\r\n [applyLocalizedProperty(\"border-bottom-right-radius\", \"border-bottom-left-radius\", config.direction)]: toPx(borderRadiusCopyLink),\r\n border: \"none\",\r\n color: ShareDialogColors.copyLinkButtonText,\r\n ...applyTypeRampConfig(\"t8\"),\r\n height: \"32px\",\r\n width: \"89px\",\r\n \"&:hover\": {\r\n cursor: \"pointer\"\r\n },\r\n \"&:active\": {\r\n background: ShareDialogColors.copyLinkButtonBackgroundActive\r\n },\r\n [highContrastSelector]: {\r\n background: \"ButtonFace\",\r\n color: \"ButtonText\",\r\n \"&:hover, &:focus, &:active\": {\r\n background: \"Highlight\",\r\n color: \"HighlightText\"\r\n }\r\n }\r\n }\r\n }\r\n };\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\n/** String resource to be used in the Card Action components */\r\nexport const StringResource = {\r\n dialogStrings: {\r\n dialogButtonClose: \"close dialog\",\r\n dialogTitle: \"Share\",\r\n copyButton: \"Copy\",\r\n copiedButton: \"Link Copied\",\r\n copyButtonAriaLabel: \"copy link to clipboard\",\r\n copiedButtonAriaLabel: \"link copied to clipboard\"\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n AccentButton,\r\n Heading,\r\n HeadingSize,\r\n HeadingTag,\r\n StealthButton\r\n} from \"@microsoft/fast-components-react-msft\";\r\nimport {\r\n DialogProps,\r\n Dialog as MSFTBaseDialog\r\n} from \"@microsoft/fast-components-react-base\";\r\nimport { GlyphInline, Icon } from \"@msnews/icon\" ;\r\nimport { ShareDialogHandledProps, ShareDialogProps, ShareDialogStrings } from \"./ShareDialog.props\";\r\nimport {\r\n SocialMedia,\r\n SocialMediaConfig,\r\n SocialMediaDefaultConfig\r\n} from \"@msnews/views-helpers\";\r\nimport { Telemetry, TelemetryTags } from \"@msnews/experiences-base\";\r\nimport { baseDialogStyles, setStyleByZIndex } from \"./ShareDialog.styles\";\r\n\r\nimport Foundation from \"@microsoft/fast-components-foundation-react\";\r\nimport { HandledPropsKeys } from \"@msnews/core\";\r\nimport React from \"react\";\r\nimport { SocialMediaIcon } from \"@msnews/social-media-icon\";\r\nimport { StringResource } from \"./StringResource\";\r\nimport { logger } from \"@msnews/diagnostics\";\r\nimport manageJss from \"@microsoft/fast-jss-manager-react\";\r\n\r\n/** Base MSFT dialog with overriden style */\r\nconst Dialog = manageJss(baseDialogStyles)(MSFTBaseDialog);\r\n\r\n/** Duration the button should present the \"link copied\" text after a user click */\r\nconst linkCopiedDisplayDuration = 1600;\r\n\r\n/**\r\n * Share dialog state interface\r\n * @export\r\n * @interface ShareDialogState\r\n */\r\nexport interface ShareDialogState {\r\n isLinkCopied: boolean\r\n}\r\n/**\r\n * ShareDialog Component\r\n * @class - ShareDialog\r\n * @classdesc - The ShareDialog component. Renders the dialog that provides social media sharing options\r\n * @default\r\n */\r\nexport class ShareDialog extends Foundation {\r\n /**\r\n * Component HandledProps enumeration. Anything not enumerated here will be included in the experience root HTML tag via unhandledProps()\r\n */\r\n protected handledProps: HandledPropsKeys = {\r\n baseDialogProps: undefined,\r\n closeButtonTelemetryTags: undefined,\r\n contentTitle: undefined,\r\n contentUrl: undefined,\r\n copyButtonAttributes: undefined,\r\n copyButtonTelemetryProps: undefined,\r\n copyButtonTelemetryTags: undefined,\r\n copyLinkOcid: undefined,\r\n dialogStrings: undefined,\r\n enabled: undefined,\r\n managedClasses: undefined,\r\n onClose: undefined,\r\n socialMediaConfigOverride: undefined,\r\n socialMediaItems: undefined,\r\n shareIconTelemetryProps: undefined,\r\n shareIconTelemetryTags: undefined,\r\n baseDialogStyleOverride: undefined,\r\n zIndex: undefined\r\n };\r\n\r\n /**\r\n * Stores the strings to be used in the dialog. Merged default strings with passed from props\r\n * @type {ShareDialogStrings}\r\n */\r\n private dialogStrings: ShareDialogStrings;\r\n\r\n /**\r\n * Social media items config that stores merged values from default and props\r\n * @type {SocialMediaConfig}\r\n */\r\n private socialMediaItemsConfig: SocialMediaConfig;\r\n\r\n /**\r\n * Ref to input field with shared url\r\n * @type {React.RefObject}\r\n */\r\n private readonly inputRef: React.RefObject = React.createRef();\r\n\r\n /**\r\n * Constructs a ShareDialog component\r\n * @constructor\r\n * @param { ShareDialogProps } props props contract\r\n */\r\n constructor(props: ShareDialogProps) {\r\n super(props);\r\n this.state = {\r\n isLinkCopied: false\r\n };\r\n\r\n // Merges some values from props with default values\r\n this.dialogStrings = { ...StringResource.dialogStrings, ...props.dialogStrings };\r\n\r\n this.setSocialMediaItemsConfig();\r\n }\r\n\r\n /**\r\n * Component renderer\r\n * @public\r\n * @method\r\n * @returns {JSX.Element} the ShareDialog component\r\n */\r\n public render(): JSX.Element {\r\n const { managedClasses, enabled, contentUrl, baseDialogProps, onClose, children, closeButtonTelemetryTags, baseDialogStyleOverride, zIndex } = this.props;\r\n if (!enabled || !contentUrl) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n
\r\n
\r\n \r\n {this.dialogStrings.dialogTitle}\r\n \r\n \r\n \r\n \r\n
\r\n {children}\r\n {this.renderSocialIconsList()}\r\n {this.renderCopyLink()}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Renders the copy link input and button part of the share dialog\r\n * @private\r\n * @method\r\n * @returns {JSX.Element} the content part of the ShareDialog component\r\n */\r\n private renderCopyLink(): JSX.Element {\r\n const { managedClasses, copyLinkOcid, contentUrl, copyButtonAttributes, copyButtonTelemetryProps, copyButtonTelemetryTags } = this.props;\r\n\r\n const url = copyLinkOcid ? `${contentUrl}?ocid=${copyLinkOcid}` : contentUrl;\r\n const buttonText = this.state.isLinkCopied ? this.dialogStrings.copiedButton : this.dialogStrings.copyButton;\r\n const ariaLabel = this.state.isLinkCopied ? this.dialogStrings.copiedButtonAriaLabel : this.dialogStrings.copyButtonAriaLabel;\r\n\r\n const copyTelemetryTag = copyButtonTelemetryTags || Telemetry.render(copyButtonTelemetryProps);\r\n\r\n return (\r\n
\r\n \r\n \r\n {buttonText}\r\n \r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Copy share url to clipboard and set timer to update the copy link button text\r\n * @private\r\n * @method\r\n */\r\n private onCopyLinkToClipboard = () => {\r\n if (!this.state.isLinkCopied) {\r\n this.setState({ isLinkCopied: true });\r\n this.inputRef.current.select();\r\n document.execCommand(\"copy\");\r\n setTimeout(() => {\r\n /* istanbul ignore next */\r\n this.setState({ isLinkCopied: false });\r\n },\r\n linkCopiedDisplayDuration\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Renders the social items list part of the share dialog\r\n * @private\r\n * @method\r\n * @returns {JSX.Element} the social media list element of the ShareDialog component\r\n */\r\n private renderSocialIconsList(): JSX.Element {\r\n const { managedClasses, socialMediaItems } = this.props;\r\n if (!socialMediaItems || !socialMediaItems.length) {\r\n return null;\r\n }\r\n\r\n const socialMediaIcons = socialMediaItems.map((item) => {\r\n return this.renderSocialIcon(item);\r\n });\r\n\r\n return (\r\n
    \r\n {socialMediaIcons}\r\n
\r\n );\r\n }\r\n\r\n /**\r\n * Renders each individual social media icon of the social media list\r\n * @private\r\n * @method\r\n * @param { string } socialMediaItem The social media item as string\r\n * @returns {JSX.Element} the icon part of the social media list\r\n */\r\n private renderSocialIcon(socialMediaItem: string): JSX.Element {\r\n const { managedClasses, shareIconTelemetryProps, shareIconTelemetryTags, contentTitle, contentUrl } = this.props;\r\n const media: SocialMedia = SocialMedia[Object.keys(SocialMedia).find(key => SocialMedia[key] === socialMediaItem.toLowerCase())];\r\n if (!media) {\r\n logger.logError(`ShareDialog: renderSocialIcon: Invalid param: socialMediaItem = ${socialMediaItem}`);\r\n return null;\r\n }\r\n const mediaKey = media.toString();\r\n\r\n const iconTelemetryTags: TelemetryTags = (shareIconTelemetryTags && shareIconTelemetryTags[mediaKey]) ||\r\n (shareIconTelemetryProps && Telemetry.render(shareIconTelemetryProps[mediaKey]));\r\n\r\n return (\r\n
  • \r\n \r\n
  • \r\n );\r\n }\r\n\r\n /**\r\n * Sets configuration specs for social media items based on default and override props values\r\n * @method\r\n */\r\n private setSocialMediaItemsConfig(): void {\r\n this.socialMediaItemsConfig = { ...SocialMediaDefaultConfig };\r\n\r\n // merge default config with override props\r\n if (this.props.socialMediaConfigOverride) {\r\n Object.keys(this.props.socialMediaConfigOverride).forEach((key) => {\r\n const keyLower = key.toLowerCase();\r\n this.socialMediaItemsConfig[keyLower] = { ...this.socialMediaItemsConfig[keyLower], ...this.props.socialMediaConfigOverride[key] };\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Gets the final props to apply to the dialog component\r\n * @private\r\n * @method\r\n * @param {DialogProps} props - the default dialog props\r\n * @returns {DialogProps} the resulting props to be passed to base dialog\r\n */\r\n private coerceDialogProps(props: DialogProps): DialogProps {\r\n return {\r\n visible: this.props.enabled,\r\n modal: true,\r\n contentHeight: \"auto\",\r\n contentWidth: \"346px\",\r\n ...props\r\n };\r\n }\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n ShareDialogHandledProps as BaseShareDialogHandledProps,\r\n ShareDialogProps as BaseShareDialogProps,\r\n ShareDialogManagedClasses,\r\n ShareDialogStrings,\r\n ShareDialogUnhandledProps\r\n} from \"./ShareDialog.props\";\r\nimport manageJss, { ManagedJSSProps } from \"@microsoft/fast-jss-manager-react\";\r\n\r\nimport { ShareDialog as BaseShareDialog } from \"./ShareDialog\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { ShareDialogClassNameContract } from \"./ShareDialog.classnames\";\r\nimport { ShareDialogStyles } from \"./ShareDialog.styles\";\r\nimport { Subtract } from \"utility-types\";\r\n\r\n/* The type returned by manageJss type is very complicated so we'll let the\r\n* compiler infer the type instead of re-declaring just for the package export\r\n*/\r\nconst ShareDialog = manageJss(ShareDialogStyles)(BaseShareDialog);\r\ntype ShareDialog = InstanceType;\r\n\r\n// Create a valid JSS managed interface that doesn't require managed classes which are provided by the manageJSS HOC\r\ninterface ShareDialogHandledProps\r\n extends Subtract {}\r\n\r\n// Create type for manageJSS HOC styled instance we are exporting\r\ntype ShareDialogProps = ManagedJSSProps<\r\n BaseShareDialogProps,\r\n ShareDialogClassNameContract,\r\n DesignSystem\r\n>;\r\n\r\n// Export everything a user might need from this index file\r\nexport {\r\n ShareDialog,\r\n ShareDialogProps,\r\n ShareDialogHandledProps,\r\n ShareDialogUnhandledProps,\r\n ShareDialogManagedClasses,\r\n ShareDialogClassNameContract,\r\n ShareDialogStrings\r\n};\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ArticleCardHandledProps, ArticleCardProps, ArticleCardUnhandledProps } from \"./ArticleCard.props\";\r\nimport { HandledPropsKeys, ShallowCompare } from \"@msnews/core\";\r\nimport { Heading, Image, Typography } from \"@microsoft/fast-components-react-msft\";\r\n\r\nimport Foundation from \"@microsoft/fast-components-foundation-react\";\r\nimport React from \"react\";\r\n\r\n/**\r\n * Article card state interface\r\n */\r\nexport interface ArticleCardState {}\r\n\r\n/**\r\n * Article card component\r\n * @class - Article card\r\n * @classdesc - Article card component base; provides semantic structure of a basic article card.\r\n * @export\r\n * @default\r\n */\r\nclass ArticleCard extends Foundation {\r\n /**\r\n * Article card handled props contract\r\n * @protected\r\n * @type { HandledPropsKeys}\r\n */\r\n protected handledProps: HandledPropsKeys = {\r\n anchorRef: undefined,\r\n headlineTitle: undefined,\r\n href: undefined,\r\n image: undefined,\r\n managedClasses: undefined,\r\n provider: undefined\r\n };\r\n\r\n /**\r\n * Construct a new article card\r\n * @constructor\r\n * @param { ArticleCardHandledProps } props the props contract for ArticleCard\r\n */\r\n constructor(props: ArticleCardHandledProps) {\r\n super(props);\r\n }\r\n\r\n /**\r\n * Performs a shallow comparison on the props\r\n * @param nextProps Incoming props\r\n * @param nextState Incoming state. Ignored as component is stateless\r\n */\r\n public shouldComponentUpdate(nextProps: ArticleCardProps): boolean {\r\n return !ShallowCompare(this.props, nextProps);\r\n }\r\n\r\n /**\r\n * Renders the component\r\n * @method\r\n * @returns {JSX.Element} the ArticleCard JSX element\r\n */\r\n public render(): JSX.Element {\r\n return (\r\n \r\n {this.renderContent()}\r\n {this.props.children}\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Renders the content component of the article\r\n * @method\r\n * @returns {JSX.Element} the content of an article\r\n */\r\n private renderContent(): JSX.Element {\r\n let content: JSX.Element;\r\n const { href, managedClasses } = this.props;\r\n\r\n if (href) {\r\n content = (\r\n \r\n {this.renderImage()}\r\n
    \r\n {this.renderTitle()}\r\n {this.renderProvider()}\r\n
    \r\n
    \r\n );\r\n } else {\r\n content = (\r\n
    \r\n {this.renderImage()}\r\n
    \r\n {this.renderTitle()}\r\n {this.renderProvider()}\r\n
    \r\n
    \r\n );\r\n }\r\n\r\n return content;\r\n }\r\n\r\n /**\r\n * Renders the card image component of the article\r\n * @method\r\n * @returns {JSX.Element} the image component of an article\r\n */\r\n private renderImage(): JSX.Element {\r\n if (!this.props.image) {\r\n return;\r\n }\r\n\r\n const { articleCard_imageWrapper, articleCard_image, articleCard_imageOverlay } = this.props.managedClasses;\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n /**\r\n * Renders the headline title component of the article\r\n * @method\r\n * @returns {JSX.Element} the headline title component of an article\r\n */\r\n private renderTitle(): JSX.Element {\r\n const { articleCard_headline, articleCard_headlineText, articleCard_headlineMask } = this.props.managedClasses;\r\n\r\n return (\r\n
    \r\n \r\n
    \r\n
    \r\n );\r\n }\r\n\r\n /**\r\n * Renders the article provider component of an article\r\n * @method\r\n * @returns {JSX.Element} the article provider component if it exists\r\n */\r\n private renderProvider(): JSX.Element {\r\n if (!this.props.provider) {\r\n return;\r\n }\r\n\r\n let providerImage: JSX.Element;\r\n if (this.props.provider.image && this.props.provider.image.src) {\r\n providerImage = (\r\n \r\n );\r\n }\r\n\r\n return (\r\n
    \r\n {providerImage}\r\n \r\n
    \r\n );\r\n }\r\n}\r\n\r\nexport default ArticleCard;\r\nexport * from \"./ArticleCard.props\";","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { SocialMedia, SocialMediaDefaultConfig } from \"./SocialMediaConfig\";\r\nimport { getLocationHref, getLocationOrigin } from \"@msnews/isomorphic-util\";\r\nimport { indexOf, uniqueId } from \"lodash-es\";\r\n\r\nimport { String } from \"typescript-string-operations\";\r\nimport { format } from \"@microsoft/fast-web-utilities\";\r\nimport { getAppEnvironment } from \"@msnews/core\";\r\nimport { logger } from \"@msnews/diagnostics\";\r\n\r\n/**\r\n * Document type being shared\r\n */\r\nexport enum SharedDocumentType {\r\n CMS = \"0\",\r\n SD = \"5\"\r\n}\r\n\r\n/**\r\n * Sharing details interface to build sharing items\r\n * @interface\r\n */\r\nexport interface SharingInfo {\r\n /**\r\n * CMS document id\r\n * @type {string}\r\n */\r\n documentId: string;\r\n\r\n /**\r\n * Document type\r\n * @type {SharedDocumentType}\r\n */\r\n documentType: SharedDocumentType;\r\n\r\n /**\r\n * Sharing url for the content\r\n * @type {string}\r\n */\r\n sharingUrl?: string;\r\n}\r\n\r\n/**\r\n * Helper for building sharing details\r\n * @class\r\n */\r\nexport class SharingHelper {\r\n /**\r\n * Base production url used in the sharing link\r\n */\r\n private static readonly SharingBaseUrlDefault: string = \"http://a.msn.com/\";\r\n\r\n /**\r\n * Path format used to build the sharing url\r\n */\r\n private static readonly shortUrlPathFormat: string = \"{0}{1}/{2}/{3}\";\r\n\r\n /**\r\n * List the available options that should be mapped to prod url\r\n */\r\n private static readonly SharingProductionHosts: string = \"bing.com|www.bing.com|preview.msn.com|www.msn.com\";\r\n\r\n /**\r\n * String used to map the AppId number to single char identifier required in the sharing url\r\n */\r\n private static readonly Base36AppIdString: string = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\";\r\n\r\n /**\r\n * Path format used to append querystring to the sharing url\r\n */\r\n private static readonly appendQueryStringFormat: string = \"{0}?ocid={1}\";\r\n\r\n /**\r\n * List of available vertical keys to be mapped.\r\n * The order matter here as the AppId to be used is based on the array index of the key\r\n */\r\n private static readonly AppKeys: string[] = [\"finance\",\r\n \"news\",\r\n \"sports\",\r\n \"travel\",\r\n \"weather\",\r\n \"health\",\r\n \"foodanddrink\",\r\n \"entertainment\",\r\n \"autos\",\r\n \"video\",\r\n \"tv\",\r\n \"music\",\r\n \"movies\",\r\n \"games\",\r\n \"lifestyle\",\r\n \"kids\",\r\n \"sample\",\r\n \"asia\",\r\n \"africa\",\r\n \"australasia\",\r\n \"europe\",\r\n \"latinamerica\",\r\n \"middleeast\",\r\n \"northamerica\"];\r\n\r\n /**\r\n * Builds the short url that links to the article to be shared\r\n * @param sharingInfo The sharing data based on SharingInfo interface\r\n * @param locale The locale\r\n * @returns String with the short url to be shared\r\n */\r\n public static shortUrlBuilder(sharingInfo: SharingInfo, locale: string): string {\r\n const appId = this.getAppId();\r\n if (!appId) {\r\n return null;\r\n }\r\n\r\n const baseUrl = this.getSharingUrlBase(sharingInfo.sharingUrl);\r\n\r\n return baseUrl + format(this.shortUrlPathFormat, sharingInfo.documentType, appId, locale, sharingInfo.documentId);\r\n }\r\n\r\n /**\r\n * Gets the base36 AppId that is mapped from the vertical key identifier\r\n * @returns The mapped AppId\r\n */\r\n public static getAppId(): string {\r\n const { HostPage } = getAppEnvironment();\r\n const verticalKey: string = ((HostPage && HostPage.verticalKey) || \"news\").toLowerCase();\r\n let appId = indexOf(this.AppKeys, verticalKey);\r\n if (appId === -1 || appId >= this.Base36AppIdString.length) {\r\n appId = 1;\r\n }\r\n const base36Id = this.Base36AppIdString.substr(appId, 1);\r\n return base36Id;\r\n }\r\n\r\n /**\r\n * Gets the base url to be used in the shared link\r\n * @param articleUrl The full article url\r\n * @returns The base url to be used in the shared link\r\n */\r\n public static getSharingUrlBase(articleUrl: string): string {\r\n const url = new URL(articleUrl, getLocationOrigin());\r\n\r\n const host = url.host;\r\n const currentBaseUrl = url.origin + \"/\";\r\n\r\n const splitUrls = this.SharingProductionHosts.split(\"|\");\r\n\r\n const baseUrl = splitUrls.indexOf(host) > -1 ? this.SharingBaseUrlDefault : currentBaseUrl;\r\n\r\n return baseUrl;\r\n }\r\n\r\n /**\r\n * Strips off query string params\r\n * @param url Input url\r\n * @returns The plain url\r\n */\r\n public static getUrlWithoutQueryParams(url: string): string {\r\n if (url && url.length > 0) {\r\n return url.split(\"?\")[0];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Retrieves the URL for sharing with Social Media.\r\n * @param medias social media to be included\r\n * @param contentUrl The url of the content to be shared\r\n * @param contentTitle The title of the content\r\n * @param ocid The ocid to be included in the shared link\r\n * @returns The share url\r\n */\r\n public static getSocialMediaShareUrl(media: string, contentUrl: string, contentTitle: string, ocid?: string, overrideShareUrl?: string): string {\r\n if (!media || !contentUrl || !contentTitle) {\r\n logger.logError(`SharingHelper: getSocialMediaShareUrl: Parameter missing: media=${media}, contentUrl=${contentUrl}, contentTitle=${contentTitle}`);\r\n return;\r\n }\r\n\r\n let socialMediaItemConfig = SocialMediaDefaultConfig[media];\r\n if (!socialMediaItemConfig ) {\r\n logger.logError(`SharingHelper: getSocialMediaShareUrl: Cannot find media type: ${socialMediaItemConfig}`);\r\n return \"\";\r\n }\r\n\r\n let shareUrl = overrideShareUrl || socialMediaItemConfig.url;\r\n if (media === SocialMedia.Skype ) {\r\n shareUrl = shareUrl.replace(\"{flowid}\", uniqueId());\r\n }\r\n\r\n if (ocid) {\r\n contentUrl = format(this.appendQueryStringFormat, contentUrl, ocid);\r\n }\r\n\r\n shareUrl = String.Format(shareUrl, {\r\n url: encodeURIComponent(contentUrl),\r\n title: encodeURIComponent(contentTitle),\r\n refererUrl: getLocationHref()\r\n });\r\n\r\n return shareUrl;\r\n }\r\n\r\n /**\r\n * Opens the social media sharing page in a new window\r\n * @param event Mouse event\r\n * @param shareUrl The complete url to be shared\r\n * @param options The features optional parameter in window.open\r\n */\r\n public static openNewWindow = (event: React.MouseEvent, shareUrl: string, options?: any): void => {\r\n const defaultOptions = { \"toolbar\": 0, \"status\": 0, \"resizable\": 1, \"scrollbars\": 1 };\r\n const finalOptions = Object.entries({ ...defaultOptions, ...options })\r\n .map(entry => entry.join(\"=\"))\r\n .join(\",\");\r\n\r\n window.open(shareUrl, null, finalOptions);\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\n/**\r\n * Default name for the content action toolbar experience\r\n */\r\nexport const experienceDefaultName = \"ContentActionsToolbar\";\r\n\r\n/**\r\n * Windows sizes to trigger breakpoint tracker\r\n */\r\nexport const BreakpointIndexToPx = [0, 1152, 1263];\r\n\r\n/**\r\n * The breakpoint indexes to be maped by breakpoint tracker\r\n */\r\nexport enum ToolbarBreakpoints {\r\n Breakpoint3_1 = 0,\r\n Breakpoint3_2 = 1,\r\n Breakpoint3_3 = 2\r\n}\r\n\r\n/**\r\n * Constant names for telemetry data\r\n */\r\nexport enum TelemetryConstants {\r\n socialToolbarTelemetryName = \"socialtoolbar\",\r\n closeDialogTelemetryName = \"Close\",\r\n copyLinkTelemetryName = \"CopyLink\",\r\n shareArticleTelemetryName = \"ShareArticle\",\r\n shareDialogTelemetryName = \"ShareDialog\"\r\n}\r\n\r\n/**\r\n * Spa placeholders Ids\r\n */\r\nexport enum PlaceHolderId {\r\n vertical = \"content-actions-toolbar-vert\",\r\n horizontal = \"content-actions-toolbar-horiz\"\r\n}\r\n\r\n/**\r\n * Action keys for like/dislike\r\n */\r\nexport enum LikeDislikeActionKey {\r\n like = \"like\",\r\n dislike = \"dislike\",\r\n undoliked = \"undoliked\",\r\n undodisliked = \"undodisliked\"\r\n}\r\n\r\n/**\r\n * action keys available in content action\r\n */\r\nexport enum SelectPropKey {\r\n onLike = \"onLike\",\r\n onDislike = \"onDislike\",\r\n onOpenOptions = \"onOpenOptions\",\r\n onShareDialogOpen = \"onShareDialogOpen\"\r\n}\r\n\r\n/**\r\n * Content Status\r\n */\r\nexport enum Status {\r\n None = \"none\",\r\n Like = \"like\",\r\n DisLike = \"dislike\"\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { SocialMedia, SocialMediaTarget } from \"@msnews/views-helpers\";\r\n\r\nimport { CardContextMenuItem } from \"@msnews/card-context-menu\";\r\nimport { DialogArticleCardProps } from \"../dialog-article-card\";\r\nimport { GlyphType } from \"@msnews/icon\";\r\nimport { ManagedClasses } from \"@microsoft/fast-components-class-name-contracts-msft\";\r\nimport { ShareDialogProps } from \"@msnews/share-dialog\";\r\nimport { SharingToolbarClassNames } from \"./\";\r\nimport { Status } from \"../../ContentActionsToolbar.constants\";\r\nimport { TelemetryTags } from \"@msnews/experiences-base\";\r\nimport { ToolbarPosition } from \"../..\";\r\n\r\n/**\r\n * Enumeration of available button type options\r\n * @type {enum}\r\n */\r\nexport enum ButtonType {\r\n SocialMedia = \"SocialMedia\",\r\n ShareDialog = \"ShareDialog\",\r\n LikeDislike = \"LikeDislike\",\r\n MoreOptions = \"MoreOptions\"\r\n}\r\n\r\n/**\r\n * Coordinate position type\r\n */\r\nexport type CoordinatePos = {\r\n /**\r\n * A horizontal coordinate position\r\n * @type {number}\r\n */\r\n x: number;\r\n\r\n /**\r\n * A vertical coordinate position\r\n * @type {number}\r\n */\r\n y: number;\r\n};\r\n\r\n/**\r\n * The social media type button\r\n */\r\nexport type SocialMediaType = {\r\n /**\r\n * Optional HTML anchor attributes\r\n * @type {React.HTMLAttributes}\r\n */\r\n attributes?: React.HTMLAttributes;\r\n\r\n /**\r\n * The social media enum type\r\n * @type {SocialMedia}\r\n */\r\n mediaType: SocialMedia;\r\n\r\n /**\r\n * The shared content url\r\n * @type {string}\r\n */\r\n contentUrl: string;\r\n\r\n /**\r\n * The shared content title\r\n * @type {string}\r\n */\r\n contentTitle: string;\r\n\r\n /**\r\n * The icon to be used instead of default one\r\n * @type {GlyphType}\r\n */\r\n icon?: GlyphType;\r\n\r\n /**\r\n * The ocid value to be used\r\n * @type {string}\r\n */\r\n ocid?: string;\r\n\r\n /**\r\n * The social media anchor target attribute option to be used\r\n * @type {SocialMediaTarget}\r\n */\r\n target?: SocialMediaTarget;\r\n\r\n /**\r\n * The telemetry callback to triggered when new window is used as the anchor target\r\n * @type {(event: any) => void}\r\n */\r\n newWindowTelemetryCall?: (event: any) => void;\r\n};\r\n\r\n/**\r\n * The share dialog type button\r\n */\r\nexport type ShareDialogType = {\r\n /**\r\n * Optional HTML button attributes\r\n * @type {React.HTMLAttributes}\r\n */\r\n attributes?: React.HTMLAttributes;\r\n\r\n /**\r\n * The share dialog component props\r\n * @type {ShareDialogProps}\r\n */\r\n shareDialogProps: ShareDialogProps;\r\n\r\n /**\r\n * The dialog article card component props\r\n * @type {DialogArticleCardProps}\r\n */\r\n dialogArticleCardProps: DialogArticleCardProps;\r\n\r\n /**\r\n * The telemetry tags\r\n * @type {TelemetryTags}\r\n */\r\n articleTelemetryTags?: TelemetryTags;\r\n\r\n /**\r\n * Callback to be triggered at user click\r\n * @type {(event: any) => void}\r\n */\r\n onSelect?: (event: any) => void;\r\n};\r\n\r\n/**\r\n * The like/dislike type button\r\n */\r\nexport type LikeDislikeType = {\r\n /**\r\n * Optional HTML button attributes\r\n * @type {React.HTMLAttributes}\r\n */\r\n attributes?: React.HTMLAttributes;\r\n\r\n /**\r\n * Current status (like/dislike/none) of the content\r\n * @type {Status}\r\n */\r\n status: Status;\r\n\r\n /**\r\n * Callback to be triggered at user click\r\n * @type {(event: any) => void}\r\n */\r\n onSelect?: (event: any) => void;\r\n};\r\n\r\n/**\r\n * The more options type button\r\n */\r\nexport type MoreOptionsType = {\r\n /**\r\n * Optional HTML div attributes\r\n * @type {React.HTMLAttributes}\r\n */\r\n attributes?: React.HTMLAttributes;\r\n\r\n /**\r\n * Current status (like/dislike/none) of the content\r\n * @type {Status}\r\n */\r\n status: Status;\r\n\r\n /**\r\n * The array of items to be displayed in the menu\r\n * @type {CardContextMenuItem[]}\r\n */\r\n menuItems: CardContextMenuItem[];\r\n\r\n /**\r\n * The offset position of the menu to open in relation to its button\r\n * Default to (0,0)\r\n * @type {CoordinatePos}\r\n */\r\n offsetPos?: CoordinatePos;\r\n\r\n /**\r\n * The override zIndex to be used by the menu\r\n * @type {number}\r\n */\r\n zIndex?: number;\r\n};\r\n\r\n/**\r\n * The button item common type\r\n */\r\nexport type ButtonItemType = {\r\n /**\r\n * The content actions toolbar button type\r\n * @type {ButtonType}\r\n */\r\n buttonType: ButtonType;\r\n\r\n /**\r\n * The content actions toolbar button data type\r\n * @type {ButtonDataType}\r\n */\r\n buttonData?: ButtonDataType;\r\n\r\n /**\r\n * The telemetry tags\r\n * @type {TelemetryTags}\r\n */\r\n telemetryTags?: TelemetryTags;\r\n};\r\n\r\nexport type ButtonDataType = Partial;\r\n\r\n/**\r\n * An interface to represent the SharingToolbar jss managed classes.\r\n *\r\n * @export\r\n * @interface SharingToolbarManagedClasses\r\n */\r\nexport interface SharingToolbarManagedClasses extends ManagedClasses { }\r\n\r\n/**\r\n * An interface to represent the SharingToolbar handled props.\r\n *\r\n * @export\r\n * @interface SharingToolbarHandledProps\r\n */\r\nexport interface SharingToolbarHandledProps extends SharingToolbarManagedClasses {\r\n\r\n /**\r\n * The toolbar position (vertical/horizontal)\r\n * @type {ToolbarPosition}\r\n */\r\n position: ToolbarPosition;\r\n\r\n /**\r\n * The sharing buttons configuration array\r\n * @type {ButtonItemType[]}\r\n */\r\n sharingButtons: ButtonItemType[];\r\n}\r\n\r\n/**\r\n * An interface to represent the SharingToolbar unhandled props.\r\n * @export\r\n * @interface SharingToolbarUnHandledProps\r\n */\r\nexport interface SharingToolbarUnHandledProps extends React.HTMLAttributes { }\r\n\r\n/**\r\n * The SharingToolbar props type\r\n */\r\nexport type SharingToolbarProps = SharingToolbarHandledProps & SharingToolbarUnHandledProps;","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionMap } from \"@msnews/experiences-redux\";\r\nimport { DocumentData } from \"./ContentActionsToolbar.state\";\r\nimport { Status } from \"./ContentActionsToolbar.constants\";\r\nimport { ToolbarPosition } from \"./ContentActionsToolbar.props\";\r\n\r\ntype InitializeToolbar = (breakpointIndex: number, isRSThreeDevice: boolean, documentId: string, staticPosition: ToolbarPosition) => void;\r\ntype ContentStatuReady = (status: Status) => void;\r\ntype DocumentDataReady = (documentData: DocumentData) => void;\r\ntype LikeContent = () => void;\r\ntype UnlikeContent = () => void;\r\ntype DislikeContent = () => void;\r\ntype UndislikeContent = () => void;\r\ntype ViewportUpdate = (breakpointIndex: number, isRSThreeDevice: boolean) => void;\r\ntype SharingToolbarError = (error: Error) => void;\r\n\r\n/**\r\n * Class containing actions that apply to the ContentActionsToolbar connector\r\n * @class\r\n */\r\nexport class ContentActionsToolbarActions {\r\n public static initializeToolbar: ActionMap = new ActionMap(\"InitializeToolbar\");\r\n public static ContentStatuReady: ActionMap = new ActionMap(\"ContentStatuReady\");\r\n public static documentDataReady: ActionMap = new ActionMap(\"DocumentDataReady\");\r\n public static likeContent: ActionMap = new ActionMap(\"LikeContent\");\r\n public static unlikeContent: ActionMap = new ActionMap(\"UnlikeContent\");\r\n public static dislikeContent: ActionMap = new ActionMap(\"DislikeContent\");\r\n public static undislikeContent: ActionMap = new ActionMap(\"UndislikeContent\");\r\n public static sharingToolbarError: ActionMap = new ActionMap(\"SharingToolbarError\");\r\n public static ViewportUpdate: ActionMap = new ActionMap(\"ViewportUpdate\");\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { CardContextMenuItem } from \"@msnews/card-context-menu\";\r\nimport { CoordinatePos } from \"./SharingToolbar.props\";\r\nimport { Glyph } from \"@msnews/icon\";\r\nimport { LikeDislikeActionKey } from \"../../ContentActionsToolbar.constants\";\r\n\r\n/**\r\n * Default color for the icon container\r\n */\r\nexport const iconContainerDefaultColor = \"#EEE\";\r\n\r\n/**\r\n * Colors for the more options icon\r\n */\r\nexport const moreOptionsIconColors = {\r\n background: iconContainerDefaultColor,\r\n foreground: \"#666\"\r\n};\r\n\r\n/**\r\n * Background colors for the like dislike icon\r\n */\r\nexport const likeDislikeIconBackroundColor = {\r\n none: iconContainerDefaultColor,\r\n like: \"#FF4343\",\r\n dislike: \"#666\"\r\n};\r\n\r\n/**\r\n * Default offset position to display the more options context menu\r\n */\r\nexport const moreOptionsMenuDefaultOffsetPos: CoordinatePos = {\r\n x: 0,\r\n y: -80\r\n};\r\n\r\n/**\r\n * Menu items to render the like option\r\n */\r\nexport const OptionItemLike: CardContextMenuItem = {\r\n key: LikeDislikeActionKey.like,\r\n text: null,\r\n onSelect: null,\r\n icon: Glyph.Like,\r\n telemetryTag: null\r\n};\r\n\r\n/**\r\n * Menu items to render the dislike option\r\n */\r\nexport const OptionItemDislike: CardContextMenuItem = {\r\n key: LikeDislikeActionKey.dislike,\r\n text: null,\r\n onSelect: null,\r\n icon: Glyph.Disliked,\r\n telemetryTag: null\r\n};\r\n\r\n/**\r\n * Menu items to render the undo like option\r\n */\r\nexport const OptionItemUndoLike: CardContextMenuItem = {\r\n key: LikeDislikeActionKey.undoliked,\r\n text: null,\r\n onSelect: null,\r\n icon: Glyph.Like,\r\n telemetryTag: null\r\n};\r\n\r\n/**\r\n * Menu items to render the undo dislike option\r\n */\r\nexport const OptionItemUndoDislike: CardContextMenuItem = {\r\n key: LikeDislikeActionKey.undodisliked,\r\n text: null,\r\n onSelect: null,\r\n icon: Glyph.Dislike,\r\n telemetryTag: null\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ContentActionsToolbarConfig, ContentActionsToolbarProps, ContentActionsToolbarState, Status } from \".\";\r\nimport { InspectorArgs, InspectorResponse } from \"@msnews/core\";\r\nimport { OptionItemDislike, OptionItemLike, OptionItemUndoDislike, OptionItemUndoLike } from \"./components/sharing-toolbar/SharingToolbar.constants\";\r\n\r\nimport { ButtonType } from \"./components/sharing-toolbar/SharingToolbar\";\r\nimport { CardContextMenuItem } from \"@msnews/card-context-menu\";\r\nimport { SocialMediaTarget } from \"@msnews/views-helpers\";\r\nimport { cloneDeep } from \"lodash-es\";\r\n\r\n/**\r\n * Type for ContentActionsToolbar connectorArgs\r\n *\r\n * @export\r\n * @type {ContentActionsToolbarConnectorArgs}\r\n */\r\nexport type ContentActionsToolbarConnectorArgs = {};\r\n\r\nexport type ContentActionsToolbarInspectorArgs = InspectorArgs;\r\n\r\nexport namespace ContentActionsToolbarInspector {\r\n export function inspect(args: ContentActionsToolbarInspectorArgs): InspectorResponse {\r\n const { config, state, config: { localizedStrings } } = args;\r\n\r\n const newProps: ContentActionsToolbarProps = {\r\n staticPosition: state.staticPosition,\r\n position: state.position,\r\n sharingToolbar: {\r\n position: state.position,\r\n sharingButtons: []\r\n },\r\n contentStatus: args.state.status,\r\n sharingError: args.state.sharingError\r\n };\r\n\r\n const sharingShortUrl = state.documentData ? state.documentData.sharingShortUrl : undefined;\r\n const articleTitle = state.documentData ? state.documentData.articleTitle : undefined;\r\n const articleImageUrl = state.documentData ? state.documentData.articleImageUrl : undefined;\r\n const providerName = state.documentData ? state.documentData.providerName : undefined;\r\n const providerLogoUrl = state.documentData ? state.documentData.providerLogoUrl : undefined;\r\n\r\n if (state.status && state.documentData) {\r\n newProps.sharingToolbar.sharingButtons = config.sharingButtons.map(buttonItem => {\r\n let newButtonItem = cloneDeep(buttonItem);\r\n switch (buttonItem.buttonType) {\r\n case ButtonType.SocialMedia:\r\n if (newButtonItem.buttonData) {\r\n newButtonItem.buttonData.contentUrl = sharingShortUrl;\r\n newButtonItem.buttonData.contentTitle = articleTitle;\r\n newButtonItem.buttonData.target = buttonItem.buttonData.target ? SocialMediaTarget[buttonItem.buttonData.target] : undefined;\r\n } else {\r\n newButtonItem = undefined;\r\n }\r\n break;\r\n case ButtonType.ShareDialog:\r\n if (newButtonItem.buttonData && newButtonItem.buttonData.shareDialogProps && newButtonItem.buttonData.shareDialogProps.socialMediaItems) {\r\n const { shareDialogProps } = newButtonItem.buttonData;\r\n shareDialogProps.enabled = true;\r\n shareDialogProps.contentUrl = sharingShortUrl;\r\n shareDialogProps.contentTitle = articleTitle;\r\n shareDialogProps.dialogStrings = {\r\n dialogTitle: localizedStrings.shareDialogTitleText,\r\n copyButton: localizedStrings.shareDialogCopyButtonText,\r\n copyButtonAriaLabel: localizedStrings.shareDialogCopyButtonAriaLabelText,\r\n copiedButton: localizedStrings.shareDialogCopiedButtonText,\r\n copiedButtonAriaLabel: localizedStrings.shareDialogCopiedButtonAriaLabelText\r\n };\r\n\r\n newButtonItem.buttonData.dialogArticleCardProps = {\r\n articleId: state.documentId,\r\n headlineTitle: {\r\n tag: undefined,\r\n children: articleTitle\r\n },\r\n href: sharingShortUrl,\r\n image: {\r\n alt: articleTitle,\r\n src: articleImageUrl\r\n },\r\n provider: {\r\n name: {\r\n title: providerName,\r\n children: providerName\r\n },\r\n image: {\r\n src: providerLogoUrl,\r\n alt: providerName\r\n }\r\n }\r\n };\r\n\r\n newButtonItem.buttonData.attributes = {\r\n \"aria-label\": localizedStrings.shareDialogButtonAriaLabelText,\r\n \"aria-hidden\": false,\r\n \"title\": localizedStrings.shareDialogButtonAriaLabelText\r\n };\r\n } else {\r\n newButtonItem = undefined;\r\n }\r\n break;\r\n case ButtonType.LikeDislike:\r\n newButtonItem.buttonData = {\r\n attributes: {\r\n \"aria-label\": localizedStrings.likeDislikeButtonAriaLabelText,\r\n \"aria-hidden\": false,\r\n \"title\": localizedStrings.likeDislikeButtonAriaLabelText\r\n },\r\n status: state.status\r\n };\r\n break;\r\n case ButtonType.MoreOptions:\r\n let menuItems: CardContextMenuItem[] = [];\r\n if (state.status === Status.Like) {\r\n OptionItemUndoLike.text = localizedStrings.moreOptionsUnlikeText;\r\n OptionItemUndoLike.attr = {\r\n \"aria-label\": localizedStrings.moreOptionsUnlikeAriaLabelText,\r\n \"aria-hidden\": false,\r\n \"title\": localizedStrings.moreOptionsUnlikeAriaLabelText\r\n };\r\n menuItems.push(OptionItemUndoLike);\r\n\r\n OptionItemDislike.text = localizedStrings.moreOptionsDislikeText;\r\n OptionItemDislike.attr = {\r\n \"aria-label\": localizedStrings.moreOptionsDislikeAriaLabelText,\r\n \"aria-hidden\": false,\r\n \"title\": localizedStrings.moreOptionsDislikeAriaLabelText\r\n };\r\n menuItems.push(OptionItemDislike);\r\n } else if (state.status === Status.DisLike) {\r\n OptionItemUndoDislike.text = localizedStrings.moreOptionsUndislikeText;\r\n OptionItemUndoDislike.attr = {\r\n \"aria-label\": localizedStrings.moreOptionsUndislikeAriaLabelText,\r\n \"aria-hidden\": false,\r\n \"title\": localizedStrings.moreOptionsUndislikeAriaLabelText\r\n };\r\n menuItems.push(OptionItemUndoDislike);\r\n\r\n OptionItemLike.text = localizedStrings.moreOptionsLikeText;\r\n OptionItemLike.attr = {\r\n \"aria-label\": localizedStrings.moreOptionsLikeAriaLabelText,\r\n \"aria-hidden\": false,\r\n \"title\": localizedStrings.moreOptionsLikeAriaLabelText\r\n };\r\n menuItems.push(OptionItemLike);\r\n } else {\r\n OptionItemDislike.text = localizedStrings.moreOptionsDislikeText;\r\n OptionItemDislike.attr = {\r\n \"aria-label\": localizedStrings.moreOptionsDislikeAriaLabelText,\r\n \"aria-hidden\": false,\r\n \"title\": localizedStrings.moreOptionsDislikeAriaLabelText\r\n };\r\n menuItems.push(OptionItemDislike);\r\n }\r\n newButtonItem.buttonData = {\r\n attributes: {\r\n \"aria-label\": localizedStrings.moreOptionsButtonAriaLabelText,\r\n \"aria-hidden\": false,\r\n \"title\": localizedStrings.moreOptionsButtonAriaLabelText\r\n },\r\n menuItems: menuItems,\r\n status: state.status,\r\n offsetPos: buttonItem.buttonData ? buttonItem.buttonData.offsetPos : undefined,\r\n zIndex: buttonItem.buttonData ? buttonItem.buttonData.zIndex : undefined\r\n };\r\n break;\r\n default:\r\n break;\r\n }\r\n return newButtonItem;\r\n }).filter(value => value);\r\n }\r\n\r\n return {\r\n props: newProps,\r\n missingChildren: []\r\n };\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n KeyValuePair,\r\n TelemetryBase,\r\n appEnvironment,\r\n headData,\r\n oneServiceQueryStringKeys\r\n} from \"@msnews/core\";\r\nimport { OneServiceUtility, getServiceUrlForSubpath, sendRequest } from \"@msnews/oneservice\";\r\n\r\nimport { ContentActionsToolbarAppErrors } from \"@msnews/diagnostics\";\r\nimport { DocumentData } from \"../ContentActionsToolbar.state\";\r\nimport { Status } from \"../ContentActionsToolbar.constants\";\r\nimport { get } from \"lodash-es\";\r\n\r\n/**\r\n * Class to fetch data for the content actions toolbar experience\r\n * @class ContentActionsToolbarServiceClient\r\n */\r\nexport class ContentActionsToolbarServiceClient {\r\n /**\r\n * The actions service end point\r\n */\r\n private contentActionsServiceEndpoint: string = \"Graph/Actions\";\r\n\r\n /**\r\n * The content preview endpoint\r\n */\r\n private contentPreviewApiEndpoint: string = \"view/v1/Preview\";\r\n\r\n /**\r\n * The template url for article images\r\n */\r\n private articleImageUrl: string = \"https://img-s-msn-com.akamaized.net/tenant/amp/entityid/${imageId}.img?h=100&w=100&m=6&q=60&u=t&o=t&l=f&f=png\";\r\n\r\n /**\r\n * The template url for provider logo images\r\n */\r\n private providerLogoUrl: string = \"https://img-s-msn-com.akamaized.net/tenant/amp/entityid/${logoId}.img?h=16&w=16&m=6&q=60&u=t&o=t&l=f&f=png\";\r\n\r\n /**\r\n * the ocid for request\r\n */\r\n private ocid: string = \"feeds\";\r\n\r\n /**\r\n * Initializes a new instance of the `ContentActionsToolbarServiceClient` class.\r\n * @constructor\r\n * @public\r\n * @param {any} fetchImpl - The fetch implementation\r\n */\r\n public constructor(private fetchImpl: any) {\r\n }\r\n\r\n /**\r\n * Get content preference initial state\r\n * @param {string} targetId target id\r\n */\r\n public async GetPreferenceInitialState(targetId: string): Promise {\r\n let initialState: Status = undefined;\r\n try {\r\n const response = await this.GetContentStatusRequest(targetId);\r\n const isLike = response && response[\"value\"] && response[\"value\"].find(obj => obj.actionType === \"Like\");\r\n const isDislike = response && response[\"value\"] && response[\"value\"].find(obj => obj.actionType === \"Dislike\");\r\n initialState = isLike ? Status.Like : (isDislike ? Status.DisLike : Status.None);\r\n } catch (error) {\r\n TelemetryBase.trackAppErrorEvent({\r\n ...ContentActionsToolbarAppErrors.ContentActionsGetContentStatusActionError,\r\n message: \"Failed obtaining content status\",\r\n pb: {\r\n ...ContentActionsToolbarAppErrors.ContentActionsGetContentStatusActionError.pb,\r\n customMessage: `Error: ${error}`\r\n }\r\n });\r\n }\r\n return initialState;\r\n }\r\n\r\n /**\r\n * Get required document data\r\n * @param {string} targetId target id\r\n */\r\n public async GetDocumentData(targetId: string): Promise {\r\n let documentData: DocumentData = undefined;\r\n try {\r\n const contentPreviewData = await this.GetContentPreviewData(targetId);\r\n documentData = this.TranslateContentPreviewDocumentData(contentPreviewData);\r\n if (!documentData) {\r\n throw new Error(`Failed to map content preview data to DocumentData. TargetId: ${targetId}`);\r\n }\r\n } catch (error) {\r\n TelemetryBase.trackAppErrorEvent({\r\n ...ContentActionsToolbarAppErrors.ContentActionsGetDocumentDataError,\r\n message: \"Failed obtaining document data\",\r\n pb: {\r\n ...ContentActionsToolbarAppErrors.ContentActionsGetDocumentDataError.pb,\r\n customMessage: `Error: ${error}`\r\n }\r\n });\r\n }\r\n return documentData;\r\n }\r\n\r\n /**\r\n * The dislike target service call\r\n * @param targetId target id to be disliked\r\n */\r\n public async Dislike(targetId: string): Promise {\r\n return this.PostContentActionRequest(targetId, \"Dislike\");\r\n }\r\n\r\n /**\r\n * The undislike target service call\r\n * @param targetId target id to be undislike\r\n */\r\n public async Undislike(targetId: string): Promise {\r\n return this.DeleteContentActionRequest(targetId, \"Dislike\");\r\n }\r\n\r\n /**\r\n * The like target service call\r\n * @param targetId target id to be like\r\n */\r\n public async Like(targetId: string): Promise {\r\n return this.PostContentActionRequest(targetId, \"Like\");\r\n }\r\n\r\n /**\r\n * The like target service call\r\n * @param targetId target id to be like\r\n */\r\n public async Unlike(targetId: string): Promise {\r\n return this.DeleteContentActionRequest(targetId, \"Like\");\r\n }\r\n\r\n /**\r\n * Set request to service to get the metadata about content status\r\n * @param targetId target id\r\n */\r\n private async GetContentStatusRequest(targetId: string): Promise {\r\n const requestParams = await OneServiceUtility.getBaseRequestData(\"GET\");\r\n requestParams.credentials = headData.UserIsSignedIn ? \"include\" : undefined;\r\n\r\n const serviceUrl = getServiceUrlForSubpath(this.contentActionsServiceEndpoint);\r\n const commonParams = OneServiceUtility.getCommonParams(this.ocid);\r\n [\r\n ...commonParams,\r\n {\r\n key: \"$filter\",\r\n value: `targetId eq '${targetId}'`\r\n }\r\n ].forEach(pair => pair.value && serviceUrl.searchParams.set(pair.key, pair.value));\r\n\r\n let contentStatusData: any;\r\n try {\r\n contentStatusData = await (sendRequest(\r\n async () => {\r\n const response: Response = await this.fetchImpl(serviceUrl.href, requestParams);\r\n if (response.status >= 400) {\r\n throw new Error(response.statusText);\r\n }\r\n return response.json();\r\n },\r\n `getContentAction`\r\n ));\r\n } catch (error) {\r\n TelemetryBase.trackAppErrorEvent({\r\n ...ContentActionsToolbarAppErrors.ContentActionsContentStatusFetchError,\r\n message: \"Failed to fetch from content status data endpoint\",\r\n pb: {\r\n ...ContentActionsToolbarAppErrors.ContentActionsContentStatusFetchError.pb,\r\n customMessage: `Service URL: ${serviceUrl}, error: ${error}`\r\n }\r\n });\r\n }\r\n\r\n return contentStatusData;\r\n }\r\n\r\n /**\r\n * Gets article content data from ContentPreview endpoint\r\n * @param articleId the article id\r\n * @returns Primise The article details data\r\n */\r\n private async GetContentPreviewData(articleId: string): Promise {\r\n const requestParams = await OneServiceUtility.getBaseRequestData(\"GET\");\r\n requestParams.credentials = headData.UserIsSignedIn ? \"include\" : undefined;\r\n\r\n // Build the url\r\n const serviceUrl = new URL(`${this.contentPreviewApiEndpoint}/${articleId}${appEnvironment.ContentServiceUrlBase.search}`, appEnvironment.ContentServiceUrlBase);\r\n\r\n let contentPreviewData: any;\r\n try {\r\n contentPreviewData = await (sendRequest(\r\n async () => {\r\n const response: Response = await this.fetchImpl(serviceUrl.href, requestParams);\r\n if (response.status >= 400) {\r\n throw new Error(response.statusText);\r\n }\r\n return response.json();\r\n },\r\n `getContentAction`\r\n ));\r\n } catch (error) {\r\n TelemetryBase.trackAppErrorEvent({\r\n ...ContentActionsToolbarAppErrors.ContentActionsContentPreviewFetchError,\r\n message: \"Failed to fetch from content views data endpoint\",\r\n pb: {\r\n ...ContentActionsToolbarAppErrors.ContentActionsContentPreviewFetchError.pb,\r\n customMessage: `Service URL: ${serviceUrl}, error: ${error}`\r\n }\r\n });\r\n }\r\n\r\n return contentPreviewData;\r\n }\r\n\r\n /**\r\n * Delete an action from target\r\n * @param targetId target to be deleted\r\n * @param actionType type of the action\r\n */\r\n private async DeleteContentActionRequest(targetId: string, actionType: string): Promise {\r\n const requestParams = await OneServiceUtility.getBaseRequestData(\"DELETE\");\r\n requestParams.credentials = headData.UserIsSignedIn ? \"include\" : undefined;\r\n\r\n const deleteQueryParam: KeyValuePair = {\r\n key: oneServiceQueryStringKeys.filter,\r\n value: `actionType eq '${actionType}' and targetId eq '${targetId}'`\r\n };\r\n\r\n const serviceUrl = getServiceUrlForSubpath(this.contentActionsServiceEndpoint);\r\n const commonParams = OneServiceUtility.getCommonParams(this.ocid);\r\n [\r\n deleteQueryParam,\r\n ...commonParams\r\n ].forEach((pair) => pair.value && serviceUrl.searchParams.set(pair.key, pair.value));\r\n\r\n let deleteResponse: Response;\r\n try {\r\n deleteResponse = await (sendRequest(\r\n async () => {\r\n const response: Response = await this.fetchImpl(serviceUrl.href, requestParams);\r\n if (response.status >= 400) {\r\n throw new Error(response.statusText);\r\n }\r\n return response;\r\n },\r\n `deleteContentAction${actionType}`\r\n ));\r\n } catch (error) {\r\n TelemetryBase.trackAppErrorEvent({\r\n ...ContentActionsToolbarAppErrors.ContentActionsDeleteActionError,\r\n message: \"Error while calling delete action for content actions toolbar\",\r\n pb: {\r\n ...ContentActionsToolbarAppErrors.ContentActionsDeleteActionError.pb,\r\n customMessage: `URL: ${serviceUrl.href}, error: ${error}`\r\n }\r\n });\r\n }\r\n\r\n return deleteResponse;\r\n }\r\n\r\n /**\r\n * create an action from target\r\n * @param targetId target to be created\r\n * @param actionType type of the action\r\n */\r\n private async PostContentActionRequest(targetId: string, actionType: string, targetType?: string): Promise {\r\n const requestParams: RequestInit = {\r\n method: \"POST\",\r\n body: JSON.stringify({\r\n actionType,\r\n targetId,\r\n targetType\r\n }),\r\n credentials: headData.UserIsSignedIn ? \"include\" : undefined,\r\n headers: await OneServiceUtility.getOneServiceHeaders()\r\n };\r\n\r\n const serviceUrl = getServiceUrlForSubpath(this.contentActionsServiceEndpoint);\r\n const commonParams = OneServiceUtility.getCommonParams(this.ocid);\r\n commonParams.forEach((pair) => {\r\n pair.value && serviceUrl.searchParams.set(pair.key, pair.value);\r\n });\r\n\r\n let postResponse: Response;\r\n try {\r\n postResponse = await (sendRequest(\r\n async () => {\r\n const response: Response = await this.fetchImpl(serviceUrl.href, requestParams);\r\n if (response.status >= 400) {\r\n throw new Error(response.statusText);\r\n }\r\n return response;\r\n },\r\n `getContentAction${actionType}`\r\n ));\r\n } catch (error) {\r\n TelemetryBase.trackAppErrorEvent({\r\n ...ContentActionsToolbarAppErrors.ContentActionsPostActionError,\r\n message: \"Error while posting action for content actions toolbar\",\r\n pb: {\r\n ...ContentActionsToolbarAppErrors.ContentActionsPostActionError.pb,\r\n customMessage: `URL: ${serviceUrl.href}, error: ${error}`\r\n }\r\n });\r\n }\r\n\r\n return postResponse;\r\n }\r\n\r\n /**\r\n * Schema Translator for content preview data\r\n * @param {any} articleDataResponse response data from content preview api\r\n * @returns {DocumentData} translated document data\r\n */\r\n private TranslateContentPreviewDocumentData(articleDataResponse: any): DocumentData {\r\n const articleImageId = get(articleDataResponse, \"images[0].id\", undefined);\r\n const providerLogoId = get(articleDataResponse, \"provider.logo.id\", undefined);\r\n\r\n return {\r\n articleTitle: get(articleDataResponse, \"title\", undefined),\r\n articleImageUrl: articleImageId ? this.articleImageUrl.replace(\"${imageId}\", articleImageId) : undefined,\r\n providerName: get(articleDataResponse, \"provider.name\", undefined),\r\n providerLogoUrl: providerLogoId ? this.providerLogoUrl.replace(\"${logoId}\", providerLogoId) : undefined\r\n };\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ButtonItemType, ButtonType } from \"./components/sharing-toolbar/SharingToolbar\";\r\nimport { LikeDislikeActionKey, TelemetryConstants } from \"./ContentActionsToolbar.constants\";\r\nimport { OptionItemDislike, OptionItemLike, OptionItemUndoDislike, OptionItemUndoLike } from \"./components/sharing-toolbar/SharingToolbar.constants\";\r\nimport { SocialMediaItemConfigAttributes, SocialMediaTarget, ViewsUtility } from \"@msnews/views-helpers\";\r\nimport { Telemetry, TelemetryProps, TelemetryTypes } from \"@msnews/experiences-base\";\r\n\r\nimport { Status } from \".\";\r\nimport { TelemetryBase } from \"@msnews/core\";\r\n\r\n/**\r\n * Helper class to implement telemetry for content actions toolbar\r\n * @export\r\n * @class\r\n */\r\nexport class ContentActionsToolbarTelemetryHelper {\r\n\r\n /**\r\n * Injects telemetry data into sharing buttons array\r\n * @param {ButtonItemType[]} sharingButtons The sharing buttons array\r\n * @param {Status} status The current content status\r\n * @param {TelemetryProps} sharingToolbarTelemetryProps The sharing toolbar telemetry props\r\n * @param {TrackTelemetryEventSignature} handleTelemetryCall Dispatches click telemetry events\r\n */\r\n public static InjectTelemetry(sharingButtons: ButtonItemType[], status: Status, sharingToolbarTelemetryProps: TelemetryProps): void {\r\n sharingButtons.map(button => {\r\n let buttonTelemetryName: string;\r\n switch (button.buttonType) {\r\n case ButtonType.SocialMedia:\r\n buttonTelemetryName = button.buttonData.mediaType.toUpperCase();\r\n button.buttonData.newWindowTelemetryCall = (event: any) => {\r\n TelemetryBase.trackEvent({ type: \"click\", target: event.currentTarget }, null, null, buttonTelemetryName);\r\n return;\r\n };\r\n break;\r\n case ButtonType.ShareDialog:\r\n if (button.buttonData.shareDialogProps && button.buttonData.shareDialogProps.socialMediaItems) {\r\n buttonTelemetryName = button.buttonType.toUpperCase();\r\n let { shareDialogProps } = button.buttonData;\r\n button.buttonData.onSelect = (event: any) => {\r\n TelemetryBase.trackEvent({ type: \"click_nonnav\", target: event.currentTarget }, null, null, buttonTelemetryName);\r\n return;\r\n };\r\n if (button.buttonData.target === SocialMediaTarget.newWindow) {\r\n button.buttonData.newWindowTelemetryCall = (event: any) => {\r\n TelemetryBase.trackEvent({ type: \"click\", target: event.currentTarget }, null, null, buttonTelemetryName);\r\n return;\r\n };\r\n }\r\n\r\n let mediaTelemetryProps: { [s: string]: TelemetryProps } = shareDialogProps.socialMediaItems.reduce(\r\n (result, value) => {\r\n if (value) {\r\n result[value.toLowerCase()] = Telemetry.getChildTelemetryItem(sharingToolbarTelemetryProps, value.toUpperCase(), TelemetryTypes.Share);\r\n result[value.toLowerCase()].userFacingText = `tmx-stb-sd-${value.toLowerCase()}`;\r\n }\r\n return result;\r\n },\r\n {}\r\n );\r\n shareDialogProps.copyButtonTelemetryProps = Telemetry.getChildTelemetryItem(sharingToolbarTelemetryProps, TelemetryConstants.copyLinkTelemetryName, TelemetryTypes.Share);\r\n const closeButtonTelemetryProps = Telemetry.getChildTelemetryItem(sharingToolbarTelemetryProps, TelemetryConstants.closeDialogTelemetryName, TelemetryTypes.Close);\r\n shareDialogProps.closeButtonTelemetryTags = Telemetry.render(closeButtonTelemetryProps);\r\n shareDialogProps.shareIconTelemetryProps = mediaTelemetryProps;\r\n shareDialogProps.socialMediaConfigOverride = shareDialogProps.socialMediaItems.reduce((result, mediaItem) => {\r\n let mediaItemOverride: SocialMediaItemConfigAttributes = {};\r\n if (shareDialogProps.socialMediaConfigOverride && shareDialogProps.socialMediaConfigOverride[mediaItem]) {\r\n mediaItemOverride = {...shareDialogProps.socialMediaConfigOverride[mediaItem]};\r\n }\r\n mediaItemOverride.newWindowTelemetryCall = event => TelemetryBase.trackEvent({ type: \"click\", target: event.currentTarget }, null, null, mediaItem.toUpperCase());\r\n result[mediaItem] = mediaItemOverride;\r\n return result;\r\n }, {}\r\n );\r\n const shareDialogTelemetryProps = Telemetry.getChildTelemetryItem(sharingToolbarTelemetryProps, TelemetryConstants.shareDialogTelemetryName, TelemetryTypes.Interaction);\r\n button.buttonData.shareDialogProps = {\r\n ...shareDialogProps,\r\n ...Telemetry.render(shareDialogTelemetryProps)\r\n\r\n };\r\n button.buttonData.articleTelemetryTags = Telemetry.render(Telemetry.getChildTelemetryItem(sharingToolbarTelemetryProps, TelemetryConstants.shareArticleTelemetryName, TelemetryTypes.Share));\r\n }\r\n break;\r\n case ButtonType.LikeDislike:\r\n if (status === Status.Like) {\r\n buttonTelemetryName = OptionItemUndoLike.key.toUpperCase();\r\n } else if (status === Status.DisLike) {\r\n buttonTelemetryName = OptionItemUndoDislike.key.toUpperCase();\r\n } else {\r\n buttonTelemetryName = OptionItemLike.key.toUpperCase();\r\n }\r\n break;\r\n case ButtonType.MoreOptions:\r\n buttonTelemetryName = button.buttonType.toUpperCase();\r\n const menuItems = button.buttonData.menuItems;\r\n if (status === Status.Like) {\r\n menuItems.find(e => e.key === LikeDislikeActionKey.undoliked).telemetryTag = Telemetry.render(Telemetry.getChildTelemetryItem(sharingToolbarTelemetryProps, OptionItemUndoLike.key.toUpperCase(), TelemetryTypes.Unlike));\r\n menuItems.find(e => e.key === LikeDislikeActionKey.dislike).telemetryTag = Telemetry.render(Telemetry.getChildTelemetryItem(sharingToolbarTelemetryProps, OptionItemDislike.key.toUpperCase(), TelemetryTypes.Dislike));\r\n } else if (status === Status.DisLike) {\r\n menuItems.find(e => e.key === LikeDislikeActionKey.undodisliked).telemetryTag = Telemetry.render(Telemetry.getChildTelemetryItem(sharingToolbarTelemetryProps, OptionItemUndoDislike.key.toUpperCase(), TelemetryTypes.Undislike));\r\n menuItems.find(e => e.key === LikeDislikeActionKey.like).telemetryTag = Telemetry.render(Telemetry.getChildTelemetryItem(sharingToolbarTelemetryProps, OptionItemLike.key.toUpperCase(), TelemetryTypes.Like));\r\n } else {\r\n menuItems.find(e => e.key === LikeDislikeActionKey.dislike).telemetryTag = Telemetry.render(Telemetry.getChildTelemetryItem(sharingToolbarTelemetryProps, OptionItemDislike.key.toUpperCase(), TelemetryTypes.Dislike));\r\n }\r\n break;\r\n default:\r\n break;\r\n }\r\n button.telemetryTags = Telemetry.render(ViewsUtility.getChildTelemetryItem(sharingToolbarTelemetryProps, buttonTelemetryName, TelemetryTypes.Share));\r\n if (button.telemetryTags) {\r\n // Keeping same telemetry headline data as found today in Prime for AB testing\r\n button.telemetryTags[\"data-hl\"] = `tmx-stb-${buttonTelemetryName.toLowerCase()}`;\r\n }\r\n });\r\n }\r\n\r\n}\r\n","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { BreakpointIndexToPx, LikeDislikeActionKey, Status, TelemetryConstants } from \"./ContentActionsToolbar.constants\";\r\nimport { BreakpointTracker, identifyBreakpoint } from \"@microsoft/fast-layouts-react\";\r\nimport { ButtonItemType, ButtonType } from \"./components/sharing-toolbar/SharingToolbar\";\r\nimport { ContentActionsToolbarActions, ContentActionsToolbarConfig, ContentActionsToolbarProps, ContentActionsToolbarState } from \".\";\r\nimport { ContentActionsToolbarInspector, ContentActionsToolbarInspectorArgs } from \"./ContentActionsToolbar.inspector\";\r\nimport { DynamicReducer, IReducer } from \"@msnews/experiences-redux\";\r\nimport { ExperienceInitialProps, Telemetry, TelemetryProps, TelemetryTags, TelemetryTypes } from \"@msnews/experiences-base\";\r\nimport { InspectorResponse, TelemetryBase, getAppEnvironment } from \"@msnews/core\";\r\nimport { OptionItemDislike, OptionItemLike, OptionItemUndoDislike, OptionItemUndoLike } from \"./components/sharing-toolbar/SharingToolbar.constants\";\r\nimport { SharedDocumentType, SharingHelper, ViewsStringResource } from \"@msnews/views-helpers\";\r\n\r\nimport { ComponentConnector } from \"@msnews/experiences-connector\";\r\nimport { ContentActionsToolbarAppErrors } from \"@msnews/diagnostics\";\r\nimport { ContentActionsToolbarServiceClient } from \"./services\";\r\nimport { ContentActionsToolbarTelemetryHelper } from \"./ContentActionsToolbar.telemetry\";\r\nimport { Store } from \"redux\";\r\nimport { getInnerWidth } from \"@msnews/isomorphic-util\";\r\n\r\n/**\r\n * An interface to represent the more options menu callbacks\r\n * @interface MoreOptionsCallbacks\r\n */\r\ninterface MoreOptionsCallbacks {\r\n /** On like event handler */\r\n onLike: (event: any) => void;\r\n\r\n /** On dislike evewnt hander */\r\n onDislike: (event: any) => void;\r\n}\r\n\r\n/**\r\n * The connector for the ContentActionsToolbar Experience\r\n * @class\r\n */\r\nexport class ContentActionsToolbarConnector extends ComponentConnector {\r\n\r\n /**\r\n * Telemetry related props for the experience.\r\n * @type {TelemetryProps}\r\n */\r\n private sharingToolbarTelemetryProps: TelemetryProps;\r\n\r\n /**\r\n * Telemetry related tags for the experience.\r\n * @type {TelemetryProps}\r\n */\r\n private sharingToolbarTelemetryTags: TelemetryTags;\r\n\r\n /**\r\n * An instance of the content action service client\r\n * @type {ContentActionsToolbarServiceClient}\r\n */\r\n private actionServiceClient: ContentActionsToolbarServiceClient;\r\n\r\n /**\r\n * Telemetry related tags for the more option button.\r\n */\r\n private moreOptionsTelemetryTags: {\r\n Like: TelemetryTags,\r\n Dislike: TelemetryTags,\r\n UndoLike: TelemetryTags,\r\n UndoDislike: TelemetryTags\r\n };\r\n\r\n /**\r\n * Initializes the ContentActionsToolbar connector\r\n * @param {string} namespace Redux subspace name for the connector\r\n * @param {string} parentNamespace Redux subspace name for the parent connector\r\n * @param {DynamicReducer} rootReducer Application root reducer\r\n * @param {IReducer} reducer The connector reducer\r\n * @param {Store} store The store or redux subspace that the connector will be connected to\r\n * @param {ContentActionsToolbarConfig} config The configuration properties from config index\r\n */\r\n public constructor( namespace: string,\r\n parentNamespace: string,\r\n rootReducer: DynamicReducer,\r\n reducer: IReducer,\r\n store: Store,\r\n config?: ContentActionsToolbarConfig) {\r\n super(namespace, parentNamespace, rootReducer, reducer, store, config);\r\n }\r\n\r\n /**\r\n * State mapper\r\n * @param state The current state for the connector\r\n */\r\n public mapStateToProps(state: ContentActionsToolbarState): ContentActionsToolbarProps {\r\n const inspectorArgs: ContentActionsToolbarInspectorArgs = {\r\n config: this.config,\r\n children: {},\r\n state: state\r\n };\r\n\r\n let contentActionsToolbarProps: ContentActionsToolbarProps = {};\r\n\r\n if (state.status && state.documentId && state.documentData) {\r\n const inspectorResponse: InspectorResponse = ContentActionsToolbarInspector.inspect(inspectorArgs);\r\n\r\n const status = inspectorResponse.props.contentStatus;\r\n const callbacks = this.BuildLikeDislikeCallbacks(status, state.documentId);\r\n\r\n if (inspectorResponse.props.sharingToolbar && inspectorResponse.props.sharingToolbar.sharingButtons && inspectorResponse.props.sharingToolbar.sharingButtons.length > 0) {\r\n const sharingButtons = inspectorResponse.props.sharingToolbar.sharingButtons;\r\n\r\n this.InjectCallbacksToMoreOptionsMenu(sharingButtons.find(m => m.buttonType === ButtonType.MoreOptions), status, callbacks);\r\n\r\n ContentActionsToolbarTelemetryHelper.InjectTelemetry(sharingButtons, status, this.sharingToolbarTelemetryProps);\r\n\r\n const likeDislikeButton = sharingButtons.find(m => m.buttonType === ButtonType.LikeDislike);\r\n if (likeDislikeButton) {\r\n sharingButtons.find(m => m.buttonType === ButtonType.LikeDislike).buttonData\r\n .onSelect = (event: any) => status === Status.DisLike ? callbacks.onDislike(event) : callbacks.onLike(event);\r\n }\r\n }\r\n\r\n contentActionsToolbarProps = {\r\n ...inspectorResponse.props,\r\n rootTelemetryTags: this.sharingToolbarTelemetryTags,\r\n ...this.telemetryTags,\r\n ...callbacks\r\n };\r\n }\r\n\r\n return contentActionsToolbarProps;\r\n }\r\n\r\n /**\r\n * Perform one time initialization of the connector, including getting initial state from config\r\n * @param {ExperienceInitialProps} connectorProps Application initial props\r\n */\r\n public async onComponentConnect(initialProps?: ExperienceInitialProps): Promise {\r\n await ComponentConnector.prototype.onComponentConnect.call(this, initialProps);\r\n\r\n const { contentId, context: { staticPosition, isRSThree = false, documentType = SharedDocumentType.CMS } } = initialProps;\r\n if (!contentId) {\r\n ContentActionsToolbarActions.sharingToolbarError.getActionSender(this).send(new Error(ViewsStringResource.sharingToolbarLoadFailure));\r\n this.onAppError({\r\n ...ContentActionsToolbarAppErrors.ContentActionsSharingToolbarLoadError,\r\n message: `Error while initializing content actions toolbar. Requried initial props is not available: InitialProps = ${initialProps}`\r\n });\r\n return;\r\n }\r\n\r\n this.actionServiceClient = new ContentActionsToolbarServiceClient(window.fetch.bind(window));\r\n\r\n this.generateTelemetryTags();\r\n\r\n this.getContentStatus(contentId);\r\n this.getDocumentData(contentId, documentType);\r\n\r\n const currentBreakpoint = this.initializeBreakpointTracker(isRSThree);\r\n ContentActionsToolbarActions.initializeToolbar.getActionSender(this).send(currentBreakpoint, isRSThree, contentId, staticPosition);\r\n }\r\n\r\n /**\r\n * Initialize and subscribe Breakpoint tracker to detect change in toolbar position\r\n */\r\n private initializeBreakpointTracker(isRSThree: boolean): number {\r\n BreakpointTracker.defaultBreakpoint = identifyBreakpoint(getInnerWidth());\r\n BreakpointTracker.breakpoints = BreakpointIndexToPx;\r\n BreakpointTracker.update();\r\n BreakpointTracker.subscribe(breakpoint => {\r\n ContentActionsToolbarActions.ViewportUpdate.getActionSender(this).send(breakpoint, isRSThree);\r\n });\r\n\r\n return BreakpointTracker.currentBreakpoint();\r\n }\r\n\r\n /**\r\n * Fetches the current status (like/dislike/none) of the document\r\n * @param {ExperienceInitialProps} documentId The document Id\r\n */\r\n private async getContentStatus(documentId: string): Promise {\r\n const contentStatus = await this.actionServiceClient.GetPreferenceInitialState(documentId);\r\n if (!contentStatus) {\r\n ContentActionsToolbarActions.sharingToolbarError.getActionSender(this).send(new Error(ViewsStringResource.sharingToolbarLoadFailure));\r\n this.onAppError({\r\n ...ContentActionsToolbarAppErrors.ContentActionsSharingToolbarLoadError,\r\n message: `Error while retrieving content status data from API`\r\n });\r\n return;\r\n }\r\n ContentActionsToolbarActions.ContentStatuReady.getActionSender(this).send(contentStatus);\r\n }\r\n\r\n /**\r\n * Fetches the required document data for the experience\r\n * @param {ExperienceInitialProps} documentId The document Id\r\n */\r\n private async getDocumentData(documentId: string, documentType: SharedDocumentType): Promise {\r\n let documentData = await this.actionServiceClient.GetDocumentData(documentId);\r\n if (!documentData) {\r\n ContentActionsToolbarActions.sharingToolbarError.getActionSender(this).send(new Error(ViewsStringResource.sharingToolbarLoadFailure));\r\n this.onAppError({\r\n ...ContentActionsToolbarAppErrors.ContentActionsSharingToolbarLoadError,\r\n message: `Error while retrieving content status data from API`\r\n });\r\n return;\r\n }\r\n\r\n documentData.sharingShortUrl = SharingHelper.shortUrlBuilder({documentId, documentType}, getAppEnvironment().CurrentMarket);\r\n ContentActionsToolbarActions.documentDataReady.getActionSender(this).send(documentData);\r\n }\r\n\r\n /**\r\n * Builds the like and dislike callbacks\r\n * @param {Status} The content status\r\n * @param {DocumentId} The document id\r\n * @returns {MoreOptionsCallbacks} The MoreOptionsCallbacks interface implementation\r\n */\r\n private BuildLikeDislikeCallbacks(status: Status, documentId: string): MoreOptionsCallbacks {\r\n return {\r\n onLike: (event: Event) => {\r\n if (status !== Status.Like) {\r\n this.actionServiceClient.Like(documentId);\r\n TelemetryBase.trackEvent({ type: \"click_nonnav\", target: event.currentTarget }, null, null, OptionItemLike.key.toUpperCase());\r\n ContentActionsToolbarActions.likeContent.getActionSender(this).send();\r\n } else {\r\n this.actionServiceClient.Unlike(documentId);\r\n TelemetryBase.trackEvent({ type: \"click_nonnav\", target: event.currentTarget }, null, null, OptionItemUndoLike.key.toUpperCase());\r\n ContentActionsToolbarActions.unlikeContent.getActionSender(this).send();\r\n }\r\n return;\r\n },\r\n onDislike: (event: Event) => {\r\n if (status !== Status.DisLike) {\r\n this.actionServiceClient.Dislike(documentId);\r\n TelemetryBase.trackEvent({ type: \"click_nonnav\", target: event.currentTarget }, null, null, OptionItemDislike.key.toUpperCase());\r\n ContentActionsToolbarActions.dislikeContent.getActionSender(this).send();\r\n } else {\r\n this.actionServiceClient.Undislike(documentId);\r\n TelemetryBase.trackEvent({ type: \"click_nonnav\", target: event.currentTarget }, null, null, OptionItemUndoDislike.key.toUpperCase());\r\n ContentActionsToolbarActions.undislikeContent.getActionSender(this).send();\r\n }\r\n return;\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Injects callbacks to more options menu buttons\r\n * @param {ButtonItemType} moreOptionsButton The more option button\r\n * @param {Status} status The current content status\r\n * @param {MoreOptionsCallbacks} The more options menu callbacks interface\r\n */\r\n private InjectCallbacksToMoreOptionsMenu(moreOptionsButton: ButtonItemType, status: Status, callbacks: MoreOptionsCallbacks): void {\r\n if (!moreOptionsButton || !moreOptionsButton.buttonData || !moreOptionsButton.buttonData.menuItems) {\r\n return;\r\n }\r\n const { menuItems } = moreOptionsButton.buttonData;\r\n\r\n if (status === Status.Like) {\r\n menuItems.find(e => e.key === LikeDislikeActionKey.undoliked).onSelect = (event: any) => callbacks.onLike(event);\r\n menuItems.find(e => e.key === LikeDislikeActionKey.dislike).onSelect = (event: any) => callbacks.onDislike(event);\r\n } else if (status === Status.DisLike) {\r\n menuItems.find(e => e.key === LikeDislikeActionKey.undodisliked).onSelect = (event: any) => callbacks.onDislike(event);\r\n menuItems.find(e => e.key === LikeDislikeActionKey.like).onSelect = (event: any) => callbacks.onLike(event);\r\n } else {\r\n menuItems.find(e => e.key === LikeDislikeActionKey.dislike).onSelect = (event: any) => callbacks.onDislike(event);\r\n }\r\n }\r\n\r\n /**\r\n * Sets base telemetry data for Content Actions Toolbar\r\n */\r\n private generateTelemetryTags(): void {\r\n this.sharingToolbarTelemetryProps = Telemetry.getChildTelemetryItem(this.telemetryProps, TelemetryConstants.socialToolbarTelemetryName, TelemetryTypes.Module);\r\n this.sharingToolbarTelemetryTags = Telemetry.render(this.sharingToolbarTelemetryProps);\r\n this.moreOptionsTelemetryTags = {\r\n Like: Telemetry.render(Telemetry.getChildTelemetryItem(this.sharingToolbarTelemetryProps, OptionItemLike.key.toUpperCase(), TelemetryTypes.Like)),\r\n Dislike: Telemetry.render(Telemetry.getChildTelemetryItem(this.sharingToolbarTelemetryProps, OptionItemDislike.key.toUpperCase(), TelemetryTypes.Dislike)),\r\n UndoLike: Telemetry.render(Telemetry.getChildTelemetryItem(this.sharingToolbarTelemetryProps, OptionItemUndoLike.key.toUpperCase(), TelemetryTypes.Unlike)),\r\n UndoDislike: Telemetry.render(Telemetry.getChildTelemetryItem(this.sharingToolbarTelemetryProps, OptionItemUndoDislike.key.toUpperCase(), TelemetryTypes.Undislike))\r\n };\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { CommonExperienceProps, TelemetryTags } from \"@msnews/experiences-base\";\r\n\r\nimport { AppError } from \"@msnews/diagnostics\";\r\nimport { ContentActionsToolbarClassNames } from \".\";\r\nimport { ManagedClasses } from \"@microsoft/fast-components-class-name-contracts-msft\";\r\nimport { SharingToolbarProps } from \"./components/sharing-toolbar\";\r\nimport { Status } from \"./ContentActionsToolbar.constants\";\r\n\r\n/**\r\n * Toolbar positioning options\r\n */\r\nexport enum ToolbarPosition {\r\n horizontal = \"horizontal\",\r\n vertical = \"vertical\"\r\n}\r\n\r\n/**\r\n * An interface to represent the ContentActionsToolbar jss managed classes.\r\n * @export\r\n * @interface ContentActionsToolbarManagedClasses\r\n */\r\nexport interface ContentActionsToolbarManagedClasses extends ManagedClasses { }\r\n\r\n/**\r\n * An interface to represent the ContentActionsToolbar handled props.\r\n * @export\r\n * @interface ContentActionsToolbarHandledProps\r\n */\r\nexport interface ContentActionsToolbarHandledProps extends CommonExperienceProps, ContentActionsToolbarManagedClasses {\r\n /**\r\n * Defines the toolbar position in case of single static position. Undefined otherwise.\r\n */\r\n staticPosition?: ToolbarPosition;\r\n\r\n /**\r\n * Position to render toolbar in\r\n * @type {ToolbarPosition}\r\n */\r\n position?: ToolbarPosition;\r\n\r\n /**\r\n * Sharing toolbar props\r\n * @type {SharingToolbarProps}\r\n */\r\n sharingToolbar?: SharingToolbarProps;\r\n\r\n /**\r\n * Content Status\r\n * @type {Status}\r\n */\r\n contentStatus?: Status;\r\n\r\n /**\r\n * Sharing toolbar error\r\n * @type {Error}\r\n */\r\n sharingError?: Error;\r\n\r\n /**\r\n * Root element telemetry tags\r\n * @type {TelemetryTags}\r\n */\r\n rootTelemetryTags?: TelemetryTags;\r\n}\r\n\r\n/**\r\n * An interface to represent the ContentActionsToolbar unhandled props.\r\n * @export\r\n * @interface ContentActionsToolbarUnhandledProps\r\n */\r\nexport interface ContentActionsToolbarUnhandledProps extends React.HTMLAttributes {}\r\n\r\n/**\r\n * The ContentActionsToolbar props type\r\n */\r\nexport type ContentActionsToolbarProps = ContentActionsToolbarHandledProps & ContentActionsToolbarUnhandledProps;\r\n\r\n/**\r\n * App Error Event Tracking Callback Signature\r\n */\r\nexport type TrackAppErrorEventSignature = (error: AppError) => void;\r\n\r\n/**\r\n * Click event tracking callback signature\r\n */\r\nexport type TrackTelemetryEventSignature = (event: Object, element: HTMLElement, destination: string, headline: string) => void;","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ActionHandler, IActionPayload, IReducer } from \"@msnews/experiences-redux\";\r\nimport { ContentActionsToolbarActions, ContentActionsToolbarState, ToolbarPosition } from \".\";\r\nimport { Status, ToolbarBreakpoints } from \"./ContentActionsToolbar.constants\";\r\n\r\nimport { DocumentData } from \"./ContentActionsToolbar.state\";\r\n\r\n/**\r\n * Experience initial state.\r\n */\r\nconst initialState: ContentActionsToolbarState = {\r\n documentData: undefined,\r\n documentId: undefined,\r\n position: undefined,\r\n sharingError: undefined,\r\n staticPosition: undefined,\r\n status: undefined\r\n};\r\n\r\n/**\r\n * The reducer for the ContentActionsToolbar connector, and the ContentActionsToolbarState\r\n * @export\r\n * @class\r\n */\r\nexport class ContentActionsToolbarReducer implements IReducer {\r\n /**\r\n * Update the state for the connector, based on the action being applied\r\n * @param state The previous state\r\n * @param actionPayload The action being applied\r\n */\r\n public reduce(state: ContentActionsToolbarState, actionPayload: IActionPayload): ContentActionsToolbarState {\r\n // Return the initial state for this experience, including the config.\r\n if (!state) {\r\n return initialState;\r\n }\r\n\r\n // Return the passed in state, if there is no action specified\r\n if (!actionPayload) {\r\n return state;\r\n }\r\n\r\n let newState: ContentActionsToolbarState;\r\n\r\n // handle actions\r\n ActionHandler.handleAction(actionPayload, ContentActionsToolbarActions.initializeToolbar, (breakpointIndex: number,\r\n isRSThreeDevice: boolean,\r\n documentId: string,\r\n staticPosition: ToolbarPosition) => {\r\n newState = initialState;\r\n newState.position = this.getToolbarPosition(staticPosition, isRSThreeDevice, breakpointIndex);\r\n newState.documentId = documentId;\r\n newState.staticPosition = staticPosition;\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, ContentActionsToolbarActions.ContentStatuReady, (status: Status) => {\r\n newState = {\r\n ...state,\r\n status\r\n };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, ContentActionsToolbarActions.documentDataReady, (documentData: DocumentData) => {\r\n newState = {\r\n ...state,\r\n documentData\r\n };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, ContentActionsToolbarActions.likeContent, () => {\r\n newState = {\r\n ...state,\r\n status: Status.Like\r\n };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, ContentActionsToolbarActions.unlikeContent, () => {\r\n newState = {\r\n ...state,\r\n status: Status.None\r\n };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, ContentActionsToolbarActions.dislikeContent, () => {\r\n newState = {\r\n ...state,\r\n status: Status.DisLike\r\n };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, ContentActionsToolbarActions.undislikeContent, () => {\r\n newState = {\r\n ...state,\r\n status: Status.None\r\n };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, ContentActionsToolbarActions.ViewportUpdate, (breakpointIndex: number, isRSThreeDevice: boolean) => {\r\n newState = {\r\n ...state,\r\n position: this.getToolbarPosition(state.staticPosition, isRSThreeDevice, breakpointIndex)\r\n };\r\n });\r\n\r\n ActionHandler.handleAction(actionPayload, ContentActionsToolbarActions.sharingToolbarError, (error: Error) => {\r\n newState = {\r\n ...state,\r\n sharingError: error\r\n };\r\n });\r\n\r\n return newState || state;\r\n }\r\n\r\n /**\r\n * Calculates current toolbar position\r\n * @param staticPosition Defines orientation for static position if single position. Undefined otherwise.\r\n * @param isRSThreeDevice Indicates if device is RSThree\r\n * @param breakpointIndex Current breakpoint index.\r\n * @returns Toolbar current position\r\n */\r\n private getToolbarPosition(staticPosition: ToolbarPosition, isRSThreeDevice: boolean, breakpointIndex: number): ToolbarPosition {\r\n if (staticPosition) {\r\n return staticPosition;\r\n } else {\r\n const currentBreakpointIndex = isRSThreeDevice ? ToolbarBreakpoints.Breakpoint3_2 : ToolbarBreakpoints.Breakpoint3_3;\r\n return breakpointIndex >= currentBreakpointIndex ? ToolbarPosition.vertical : ToolbarPosition.horizontal;\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n DesignSystem,\r\n ElevationMultiplier,\r\n applyElevation,\r\n highContrastSelector,\r\n neutralFillActive,\r\n neutralFillHover,\r\n neutralForegroundRest,\r\n neutralLayerCard\r\n} from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty, toPx } from \"@microsoft/fast-jss-utilities\";\r\nimport { iconContainerDefaultColor, likeDislikeIconBackroundColor, moreOptionsIconColors } from \"./SharingToolbar.constants\";\r\n\r\nimport { CardContextMenuClassNameContract } from \"@msnews/card-context-menu\";\r\nimport { ComponentStyles } from \"@microsoft/fast-jss-manager\";\r\nimport { SharingToolbarClassNames } from \"./\";\r\n\r\n// reduce listItem dimension to 32, remove margin for iconListHorizontal (3px) and add list icon margin (in between) dinamically hor/vert\r\nconst iconListItemDimension = 32;\r\nconst iconContainerDimension = 32;\r\nconst iconImageDimension = 18;\r\nconst iconPadding = 10;\r\n\r\n/**\r\n * The SharingToolbar styles\r\n * @type {ComponentStyles}\r\n */\r\nexport const SharingToolbarStyles: ComponentStyles = (config: DesignSystem) => {\r\n return {\r\n icon_none: {},\r\n icon_like: {},\r\n icon_dislike: {},\r\n iconListHorizontal: {\r\n \"list-style\": \"none\",\r\n padding: \"0\",\r\n margin: \"0\",\r\n \"text-align\": \"center\",\r\n \"& $iconListItem\": {\r\n [applyLocalizedProperty(\"margin-right\", \"margin-left\", config.direction)]: toPx(iconPadding)\r\n }\r\n },\r\n iconListVertical: {\r\n float: \"left\",\r\n height: \"auto\",\r\n width: toPx(iconListItemDimension),\r\n position: \"absolute\",\r\n \"& $iconListItem\": {\r\n \"margin-bottom\": toPx(iconPadding)\r\n }\r\n },\r\n iconListItem: {\r\n \"align-items\": \"center\",\r\n display: \"inline-flex\",\r\n height: toPx(iconListItemDimension),\r\n \"justify-content\": \"center\",\r\n width: toPx(iconListItemDimension),\r\n \"&:hover\": {\r\n cursor: \"pointer\"\r\n }\r\n },\r\n shareDialog: {\r\n \"background-color\": \"#f00\"\r\n },\r\n iconContainer: {\r\n cursor: \"pointer\",\r\n border: \"unset\",\r\n padding: \"unset\",\r\n \"background-color\": iconContainerDefaultColor,\r\n \"border-radius\": \"50%\",\r\n color: neutralForegroundRest,\r\n height: toPx(iconContainerDimension),\r\n \"justify-content\": \"center\",\r\n position: \"relative\",\r\n width: toPx(iconContainerDimension),\r\n \"$icon_none &\": {\r\n \"background-color\": likeDislikeIconBackroundColor.none\r\n },\r\n \"$icon_like &\": {\r\n \"background-color\": likeDislikeIconBackroundColor.like\r\n },\r\n \"$icon_dislike &\": {\r\n \"background-color\": likeDislikeIconBackroundColor.dislike\r\n },\r\n \"& img\": {\r\n \"vertical-align\": \"unset\"\r\n }\r\n },\r\n highContrast: {\r\n [highContrastSelector]: {\r\n background: \"Highlight\",\r\n border: \"1px solid Highlight\",\r\n \"border-radius\": \"50%\",\r\n \"& svg\" : {\r\n fill: \"Highlight\"\r\n }\r\n }\r\n },\r\n iconImage: {\r\n bottom: \"0\",\r\n left: \"0\",\r\n margin: \"7px\",\r\n right: \"0\",\r\n top: \"0\",\r\n height: toPx(iconImageDimension),\r\n width: toPx(iconImageDimension)\r\n },\r\n moreOptions: {\r\n height: toPx(iconContainerDimension),\r\n width: toPx(iconContainerDimension),\r\n [highContrastSelector]: {\r\n width: toPx(iconContainerDimension - 2),\r\n height: toPx(iconContainerDimension - 2)\r\n }\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * The context menu styles\r\n * @type {ComponentStyles}\r\n */\r\nexport const contextMenuStyles: Partial> = {\r\n menuContainer: {\r\n \"background-color\": moreOptionsIconColors.background,\r\n \"border-radius\": \"50%\",\r\n height: toPx(iconContainerDimension),\r\n width: toPx(iconContainerDimension),\r\n [highContrastSelector]: {\r\n width: toPx(iconContainerDimension - 2),\r\n height: toPx(iconContainerDimension - 2)\r\n }\r\n },\r\n settingButton: {\r\n background: \"none\",\r\n border: \"0\",\r\n cursor: \"pointer\",\r\n display: \"flex\",\r\n padding: \"0\",\r\n height: toPx(iconContainerDimension),\r\n margin: \"0\",\r\n width: toPx(iconContainerDimension),\r\n \"& svg\": {\r\n color: moreOptionsIconColors.foreground,\r\n display: \"flex\",\r\n margin: \"auto\",\r\n height: \"inherit\",\r\n width: toPx(iconImageDimension),\r\n \"& path\": {\r\n fill: \"currentColor\"\r\n }\r\n }\r\n },\r\n contextMenu: {\r\n ...applyElevation(ElevationMultiplier.e11),\r\n \"background-color\": neutralLayerCard,\r\n border: \"none\",\r\n display: \"grid\",\r\n padding: \"8px 0\",\r\n margin: \"0 14px\",\r\n width: \"240px\"\r\n },\r\n contextMenuItem: {\r\n background: neutralLayerCard,\r\n \"box-sizing\": \"border-box\",\r\n border: \"none\",\r\n display: \"inline-block\",\r\n padding: \"6px 16px\",\r\n width: \"auto\",\r\n \"&:hover, &:focus\": {\r\n background: neutralFillHover(neutralLayerCard),\r\n border: \"none\"\r\n },\r\n \"&:active\": {\r\n background: neutralFillActive(neutralLayerCard)\r\n }\r\n },\r\n contextMenuItem_contentRegion: {\r\n color: neutralForegroundRest(neutralLayerCard),\r\n \"grid-column-start\": \"1\"\r\n }\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { applyFontWeightNormal, applyFontWeightSemiBold, applyTypeRampConfig, getLineHeight, neutralFillStealthRest, neutralForegroundHover } from \"@microsoft/fast-components-styles-msft\";\r\nimport { applyLocalizedProperty, applyMaxLines, toPx } from \"@microsoft/fast-jss-utilities\";\r\n\r\nimport { ComponentStyles } from \"@microsoft/fast-jss-manager\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { DialogArticleCardClassNameContract } from \"./DialogArticleCard.classnames\";\r\n\r\nconst ArticleCardImageBorderRadius = 2;\r\nconst RelatedCardHeight = 100;\r\nconst RelatedCardImageSize = 100;\r\nconst HeadlineTextMargin = 16;\r\n\r\nconst borderColor = \"rgba(0,0,0, 0.05)\";\r\nconst DialogArticleCardTypeRamp = \"t7\";\r\n\r\n/**\r\n * The DialogArticleCard styles\r\n * @type {ComponentStyles}\r\n */\r\nexport const DialogArticleCardStyles: ComponentStyles = (config: DesignSystem) => {\r\n return {\r\n articleCard: {\r\n background: \"none\",\r\n \"border-bottom\": `1px solid ${borderColor}`,\r\n cursor: \"pointer\",\r\n display: \"flex\",\r\n padding: \"15px 0\",\r\n position: \"relative\"\r\n },\r\n articleCard_content: {\r\n display: \"flex\",\r\n \"text-decoration\": \"none\",\r\n \"&:hover\": {\r\n \"& $articleCard_headline\": {\r\n color: neutralForegroundHover(neutralFillStealthRest),\r\n \"text-decoration\": \"underline\"\r\n },\r\n \"& $articleCard_imageOverlay\": {\r\n opacity: 0.1\r\n }\r\n }\r\n },\r\n articleCard_imageWrapper: {\r\n position: \"relative\",\r\n \"& $articleCard_image\": {\r\n height: toPx(RelatedCardImageSize)\r\n }\r\n },\r\n articleCard_image: {\r\n \"border-radius\": toPx(ArticleCardImageBorderRadius),\r\n \"object-fit\": \"cover\",\r\n width: toPx(RelatedCardImageSize)\r\n },\r\n articleCard_imageOverlay: {\r\n height: \"100%\",\r\n opacity: \"0\",\r\n position: \"absolute\",\r\n top: \"0\",\r\n width: \"100%\"\r\n },\r\n articleCard_textWrapper: {\r\n \"box-sizing\": \"border-box\",\r\n flex: \"1\",\r\n height: toPx(RelatedCardHeight),\r\n padding: applyLocalizedProperty(`0 0 0 ${toPx(HeadlineTextMargin)}`, `0 ${toPx(HeadlineTextMargin)} 0 0`, config.direction)\r\n },\r\n articleCard_headline: {\r\n \"& $articleCard_headlineText\": {\r\n ...applyFontWeightSemiBold(),\r\n ...applyMaxLines(3, getLineHeight(DialogArticleCardTypeRamp)),\r\n ...applyTypeRampConfig(DialogArticleCardTypeRamp)\r\n }\r\n },\r\n articleCard_headlineText: {\r\n \"padding-top\": \"3px\"\r\n },\r\n articleCard_headlineMask: {},\r\n articleCard_provider: {\r\n bottom: \"23px\",\r\n display: \"inline-flex\",\r\n position: \"absolute\",\r\n \"& $articleCard_providerImage\": {\r\n height: \"16px\"\r\n },\r\n \"& $articleCard_providerTitle\": {\r\n \"line-height\": \"16px\"\r\n }\r\n },\r\n articleCard_providerImage: {\r\n display: \"inline-block\",\r\n [applyLocalizedProperty(\"padding-right\", \"padding-left\", config.direction)]: \"8px\"\r\n },\r\n articleCard_providerTitle: {\r\n display: \"inline-block\",\r\n \"vertical-align\": \"top\",\r\n ...applyFontWeightNormal()\r\n },\r\n articleCard_noImage: {\r\n \"& $articleCard_textWrapper\": {\r\n height: \"auto\",\r\n \"text-align\": applyLocalizedProperty(\"left\", \"right\", config.direction)\r\n },\r\n \"& $articleCard_provider\": {\r\n \"margin-top\": \"15px\",\r\n position: \"static\"\r\n },\r\n \"& $articleCard_headlineText\": {\r\n \"padding-top\": \"0\"\r\n }\r\n }\r\n };\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n DialogArticleCard as BaseDialogArticleCard,\r\n DialogArticleCardHandledProps as BaseDialogArticleCardHandledProps,\r\n DialogArticleCardProps as BaseDialogArticleCardProps,\r\n DialogArticleCardManagedClasses,\r\n DialogArticleCardUnhandledProps\r\n} from \"./DialogArticleCard\";\r\nimport manageJss, { ManagedJSSProps } from \"@microsoft/fast-jss-manager-react\";\r\n\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { DialogArticleCardClassNameContract } from \"./DialogArticleCard.classnames\";\r\nimport { DialogArticleCardStyles } from \"./DialogArticleCard.styles\";\r\nimport { Subtract } from \"utility-types\";\r\n\r\n/*\r\n * The type returned by manageJss type is very complicated so we'll let the\r\n * compiler infer the type instead of re-declaring just for the package export\r\n */\r\n/* tslint:disable-next-line:typedef */\r\nconst DialogArticleCard = manageJss(DialogArticleCardStyles)(BaseDialogArticleCard);\r\ntype DialogArticleCard = InstanceType;\r\n\r\n// Create a valid JSS managed interface that doesn't require managed classes which are provided by the manageJSS HOC\r\ninterface DialogArticleCardHandledProps\r\n extends Subtract {}\r\n\r\n// Create type for manageJSS HOC styled instance we are exporting\r\ntype DialogArticleCardProps = ManagedJSSProps<\r\n BaseDialogArticleCardProps,\r\n DialogArticleCardClassNameContract,\r\n DesignSystem\r\n>;\r\n\r\nexport {\r\n DialogArticleCard,\r\n DialogArticleCardProps,\r\n DialogArticleCardHandledProps,\r\n DialogArticleCardUnhandledProps,\r\n DialogArticleCardManagedClasses,\r\n DialogArticleCardClassNameContract\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport * as React from \"react\";\r\n\r\nimport { ArticleCard, ArticleProviderProps } from \"@msnews/article-card\";\r\nimport {\r\n DialogArticleCardHandledProps,\r\n DialogArticleCardManagedClasses,\r\n DialogArticleCardUnhandledProps\r\n} from \"./DialogArticleCard.props\";\r\nimport { HandledPropsKeys, ImageResizeMode, generateImageUrlFromBaseUrl } from \"@msnews/core\";\r\nimport { HeadingProps, HeadingSize, HeadingTag } from \"@microsoft/fast-components-react-msft\";\r\nimport { TypographyProps, TypographySize, TypographyTag } from \"@microsoft/fast-components-react-base\";\r\n\r\nimport Foundation from \"@microsoft/fast-components-foundation-react\";\r\n\r\n/**\r\n * Dialog article card\r\n * @class - Dialog Article Card\r\n * @classdesc - An dialog article Card composed from the base article card.\r\n */\r\nexport class DialogArticleCard extends Foundation {\r\n /**\r\n * Handled props contract\r\n * @protected\r\n * @type { HandledPropsKeys }\r\n */\r\n protected handledProps: HandledPropsKeys = {\r\n anchorRef: undefined,\r\n articleId: undefined,\r\n headlineTitle: undefined,\r\n href: undefined,\r\n image: undefined,\r\n managedClasses: undefined,\r\n provider: undefined\r\n };\r\n\r\n /**\r\n * Constructs an DialogArticleCard component\r\n * @constructor\r\n * @param { DialogArticleCardHandledProps & DialogArticleCardManagedClasses } props props contract\r\n */\r\n constructor(props: DialogArticleCardHandledProps & DialogArticleCardManagedClasses) {\r\n super(props);\r\n }\r\n\r\n /**\r\n * Component rendered\r\n * @method\r\n * @returns {JSX.Element} the DialogArticleCard component\r\n */\r\n public render(): JSX.Element {\r\n let { href, image, managedClasses } = this.props;\r\n\r\n if (image && image.src) {\r\n image.src = generateImageUrlFromBaseUrl(\r\n image.src,\r\n {\r\n width: 100,\r\n height: 100,\r\n enableDpiScaling: false,\r\n mode: ImageResizeMode.Scale\r\n });\r\n }\r\n\r\n const articleCard = (\r\n \r\n );\r\n\r\n if (image) {\r\n return (\r\n articleCard\r\n );\r\n } else {\r\n return (\r\n
    \r\n {articleCard}\r\n
    \r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Coerces the title props to enforce visual level\r\n * @method\r\n * @returns {HeadingProps} the headline title props\r\n */\r\n private coerceTitleProps(): any {\r\n const coercedProps: Partial = {\r\n size: HeadingSize._6,\r\n tag: HeadingTag.h3\r\n };\r\n\r\n return { ...this.props.headlineTitle, ...coercedProps };\r\n }\r\n\r\n /**\r\n * Coerces the provider props to enforce visual level of the name\r\n * @method\r\n * @returns {ArticleProviderProps} the provider props\r\n */\r\n private coerceProviderProps(): ArticleProviderProps {\r\n const { provider } = this.props;\r\n if (!provider) {\r\n return;\r\n }\r\n\r\n const coercedProviderNameProps: Partial = {\r\n size: TypographySize._8,\r\n tag: TypographyTag.h5\r\n };\r\n\r\n const coercedProps: Partial = {\r\n name: { ...provider.name, ...coercedProviderNameProps }\r\n };\r\n\r\n const coerceProviderProps = { ...provider, ...coercedProps };\r\n if (!coerceProviderProps.image || !coerceProviderProps.image.src) {\r\n coerceProviderProps.image = undefined;\r\n }\r\n\r\n return coerceProviderProps;\r\n }\r\n}\r\n\r\nexport * from \"./DialogArticleCard.props\";","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n SharingToolbarHandledProps as BaseComponentHandledProps,\r\n SharingToolbarProps as BaseComponentProps,\r\n ButtonItemType,\r\n ButtonType,\r\n SharingToolbarManagedClasses,\r\n SharingToolbarUnHandledProps\r\n} from \"./SharingToolbar.props\";\r\nimport manageJss, { ManagedJSSProps } from \"@microsoft/fast-jss-manager-react\";\r\n\r\nimport { SharingToolbar as BaseComponent } from \"./SharingToolbar\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { SharingToolbarClassNames } from \"./SharingToolbar.classnames\";\r\nimport { SharingToolbarStyles } from \"./SharingToolbar.styles\";\r\nimport { Subtract } from \"utility-types\";\r\n\r\n/*\r\n * The type returned by manageJss type is very complicated so we'll let the\r\n * compiler infer the type instead of re-declaring just for the package export\r\n */\r\n/* tslint:disable-next-line:typedef */\r\nconst SharingToolbar = manageJss(SharingToolbarStyles)(BaseComponent);\r\ntype SharingToolbar = InstanceType;\r\n\r\n// Create a valid JSS managed interface that doesn't require managed classes which are provided by the manageJSS HOC\r\ninterface SharingToolbarHandledProps extends Subtract { }\r\n\r\n// Create type for manageJSS HOC styled instance we are exporting\r\ntype SharingToolbarProps = ManagedJSSProps;\r\n\r\n// Export everything a user might need from this index file\r\nexport {\r\n ButtonType,\r\n ButtonItemType,\r\n SharingToolbar,\r\n SharingToolbarProps,\r\n SharingToolbarClassNames,\r\n SharingToolbarHandledProps,\r\n SharingToolbarUnHandledProps\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {\r\n ButtonItemType,\r\n ButtonType,\r\n SharingToolbarHandledProps,\r\n SharingToolbarProps,\r\n SharingToolbarUnHandledProps\r\n} from \"./SharingToolbar.props\";\r\nimport { Glyph, Icon } from \"@msnews/icon\";\r\nimport { SharingToolbarStyles, contextMenuStyles } from \"./SharingToolbar.styles\";\r\nimport { get, merge } from \"lodash-es\";\r\n\r\nimport { CardContextMenu } from \"@msnews/card-context-menu\";\r\nimport { ComponentStyles } from \"@microsoft/fast-jss-manager\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { DialogArticleCard } from \"../dialog-article-card\";\r\nimport { DialogClassNameContract } from \"@microsoft/fast-components-react-base\";\r\nimport Foundation from \"@microsoft/fast-components-foundation-react\";\r\nimport { HandledPropsKeys } from \"@msnews/core\";\r\nimport React from \"react\";\r\nimport { Share } from \"@edge-web-ui/news-icons\";\r\nimport { ShareDialog } from \"@msnews/share-dialog\";\r\nimport { SharingToolbarClassNames } from \".\";\r\nimport { SocialMediaIcon } from \"@msnews/social-media-icon\";\r\nimport { Status } from \"../../ContentActionsToolbar.constants\";\r\nimport { ToolbarPosition } from \"../../ContentActionsToolbar.props\";\r\nimport { moreOptionsMenuDefaultOffsetPos } from \"./SharingToolbar.constants\";\r\n\r\n/**\r\n * The local state interface of the component\r\n */\r\nexport interface SharingToolbarState {\r\n /** Flag to determine if share dialog should be displayed */\r\n shareDialogOpened: boolean\r\n}\r\n\r\n/**\r\n * Social media sharing toolbar component\r\n * @class - SharingToolbar\r\n * @classdesc - Sharing toolbar component class\r\n */\r\nexport class SharingToolbar extends Foundation {\r\n /**\r\n * Describes the object that enumerates all handled props for a component.\r\n * @protected\r\n * @type { HandledPropsKeys }\r\n */\r\n protected handledProps: HandledPropsKeys = {\r\n managedClasses: undefined,\r\n position: undefined,\r\n sharingButtons: undefined\r\n };\r\n\r\n /**\r\n * Stylesheet to apply to article card\r\n * @type {Partial>}\r\n */\r\n private articleCardStylesheet: Partial>;\r\n\r\n /**\r\n * Constructs a SharingToolbar component\r\n * @constructor\r\n * @param { SharingToolbarProps } props props contract\r\n */\r\n constructor(props: SharingToolbarProps) {\r\n super(props);\r\n this.state = {\r\n shareDialogOpened: false\r\n };\r\n }\r\n\r\n /**\r\n * Render sharing toolbar component\r\n * @public\r\n * @return {JSX.Element}\r\n */\r\n public render(): JSX.Element {\r\n return (\r\n
    \r\n
      \r\n {this.renderSharingButtons()}\r\n
    \r\n {this.renderShareDialog()}\r\n
    \r\n );\r\n }\r\n\r\n /**\r\n * Get the classname based on positioning of the toolbar\r\n */\r\n private getPositioningClassName(): string {\r\n const positionClass: string = this.props.position === ToolbarPosition.horizontal ?\r\n this.managedClass(\"iconListHorizontal\") :\r\n this.managedClass(\"iconListVertical\");\r\n\r\n return positionClass;\r\n }\r\n\r\n /**\r\n * Render the toolbar sharing buttons\r\n * @private\r\n * @return {JSX.Element} The sharing buttons element\r\n */\r\n private renderSharingButtons(): JSX.Element[] {\r\n if (!this.props.sharingButtons) {\r\n return ([]);\r\n }\r\n\r\n return this.props.sharingButtons.map(buttonItem => {\r\n if (!buttonItem.buttonData) {\r\n return null;\r\n }\r\n\r\n const buttonId: string = buttonItem.buttonType === ButtonType.SocialMedia ? buttonItem.buttonData.mediaType.toString() : buttonItem.buttonType.toString();\r\n let listItem: JSX.Element;\r\n\r\n switch (buttonItem.buttonType) {\r\n case ButtonType.SocialMedia:\r\n listItem = this.renderSocialMediaIcon(buttonItem);\r\n break;\r\n case ButtonType.ShareDialog:\r\n listItem = this.renderShareDialogIcon(buttonItem);\r\n break;\r\n case ButtonType.LikeDislike:\r\n listItem = this.renderLikeDislikeIcon(buttonItem);\r\n break;\r\n case ButtonType.MoreOptions:\r\n listItem = this.renderMoreOptionsIcon(buttonItem);\r\n break;\r\n default:\r\n return (null);\r\n }\r\n\r\n return (\r\n
  • \r\n {listItem}\r\n
  • \r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Renders the share dialog\r\n * @private\r\n * @return {JSX.Element} The share dialog element\r\n */\r\n private renderShareDialog(): JSX.Element {\r\n const shareDialogItem = this.props.sharingButtons.find(x => x.buttonType === ButtonType.ShareDialog);\r\n if (!shareDialogItem || !shareDialogItem.buttonData) {\r\n return null;\r\n }\r\n\r\n const { shareDialogProps, dialogArticleCardProps, articleTelemetryTags } = shareDialogItem.buttonData;\r\n if (!this.state.shareDialogOpened || !shareDialogProps || !dialogArticleCardProps) {\r\n return null;\r\n }\r\n\r\n const shareDialog = (\r\n \r\n \r\n \r\n );\r\n\r\n return ReactDOM.createPortal(\r\n shareDialog,\r\n document.body\r\n );\r\n }\r\n\r\n /**\r\n * Renders the social media icon element\r\n * @private\r\n * @param {ButtonItemType} buttonItem The button item data\r\n * @return {JSX.Element} The share dialog element\r\n */\r\n private renderSocialMediaIcon(buttonItem: ButtonItemType): JSX.Element {\r\n const { attributes, mediaType, contentUrl, contentTitle, icon, ocid, target, newWindowTelemetryCall } = buttonItem.buttonData;\r\n if (!mediaType || !contentUrl || !contentTitle) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Renders the share dialog icon element\r\n * @private\r\n * @param {ButtonItemType} buttonItem The button item data\r\n * @return {JSX.Element} The share dialog icon element\r\n */\r\n private renderShareDialogIcon(buttonItem: ButtonItemType): JSX.Element {\r\n const { attributes, shareDialogProps, dialogArticleCardProps, onSelect } = buttonItem.buttonData;\r\n if (!shareDialogProps || !dialogArticleCardProps || !shareDialogProps.enabled || !shareDialogProps.contentTitle || !shareDialogProps.contentUrl) {\r\n return null;\r\n }\r\n\r\n return (\r\n this.onShareDialogOpen(event, onSelect)}\r\n {...attributes}\r\n {...buttonItem.telemetryTags}\r\n >\r\n \r\n \r\n);\r\n }\r\n\r\n /**\r\n * Renders the like/dislike icon element\r\n * @private\r\n * @param {ButtonItemType} buttonItem The button item data\r\n * @return {JSX.Element} The like/dislike icon element\r\n */\r\n private renderLikeDislikeIcon(buttonItem: ButtonItemType): JSX.Element {\r\n if (!buttonItem.buttonData.status) {\r\n return;\r\n }\r\n const { attributes, status, onSelect } = buttonItem.buttonData;\r\n\r\n const glyphType = status !== Status.DisLike ?\r\n (status === Status.Like ? Glyph.LikedText : Glyph.LikeText) :\r\n Glyph.DislikeText;\r\n\r\n const iconClassName = this.managedClass(\"icon_\" + status.toString() as keyof SharingToolbarClassNames);\r\n return (\r\n
    \r\n \r\n \r\n \r\n
    \r\n );\r\n }\r\n\r\n /**\r\n * Renders the more options icon element\r\n * @private\r\n * @param {ButtonItemType} buttonItem The button item data\r\n * @return {JSX.Element} The more options icon element\r\n */\r\n private renderMoreOptionsIcon(buttonItem: ButtonItemType): JSX.Element {\r\n if (!buttonItem.buttonData || !buttonItem.buttonData.status || !buttonItem.buttonData.menuItems) {\r\n return;\r\n }\r\n const { attributes, menuItems, offsetPos, zIndex } = buttonItem.buttonData;\r\n\r\n const positionOffset = this.props.position === ToolbarPosition.vertical\r\n ? { ...moreOptionsMenuDefaultOffsetPos, ...offsetPos }\r\n : undefined;\r\n\r\n return (\r\n \r\n \r\n
    \r\n );\r\n }\r\n\r\n /**\r\n * Enables and open the share dialog\r\n * @private\r\n * @param {any} event Event\r\n * @param {(e: any) => void)} onSelect Telemetry callback\r\n */\r\n private onShareDialogOpen = (event: any, onSelect: (e: any) => void): void => {\r\n this.setState({ shareDialogOpened: true });\r\n if (onSelect) {\r\n onSelect(event);\r\n }\r\n }\r\n\r\n /**\r\n * Disables and close the share dialog\r\n * @private\r\n */\r\n private onShareDialogClose = (): void => {\r\n this.setState({ shareDialogOpened: false });\r\n }\r\n\r\n /**\r\n * Utility function to simplify getting class name from managedClasses.\r\n * @param className - The class to get from managedClasses\r\n * @returns The managed class name\r\n */\r\n private managedClass = (className: keyof SharingToolbarClassNames): string => {\r\n return get(this.props.managedClasses, className);\r\n }\r\n\r\n /**\r\n * Utility function to obtain the highContrast styles for non social media content actions buttons\r\n * @returns The high contrast styles to append\r\n */\r\n private appendHighContrastStyle = (): string => {\r\n return this.managedClass(\"highContrast\") ? \" \" + this.managedClass(\"highContrast\") : \"\";\r\n }\r\n}\r\n\r\nexport * from \"./SharingToolbar.props\";","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n ContentActionsToolbarHandledProps,\r\n ContentActionsToolbarUnhandledProps\r\n} from \"./ContentActionsToolbar.props\";\r\nimport { ContentActionsToolbarProps, ToolbarPosition } from \".\";\r\nimport { PlaceHolderId, experienceDefaultName } from \"./ContentActionsToolbar.constants\";\r\n\r\nimport { BaseExperience } from \"@msnews/experiences-base\";\r\nimport { ContentActionsToolbarAppErrors } from \"@msnews/diagnostics\";\r\nimport { HandledPropsKeys } from \"@msnews/core\";\r\nimport React from \"react\";\r\nimport { SharingToolbar } from \"./components/sharing-toolbar\";\r\nimport { TelemetryBase } from \"@msnews/core\";\r\nimport { classNames } from \"@microsoft/fast-web-utilities\";\r\nimport { markTtvr } from \"@msnews/diagnostics\";\r\n\r\n/**\r\n * Content Action toolbar base experience class\r\n * @class - ContentActionsToolbar\r\n * @classdesc - ContentActionsToolbar\r\n */\r\nexport class ContentActionsToolbar extends BaseExperience {\r\n /**\r\n * The ContentActionsToolbar default prop contract\r\n * Describes any default values for any component handled props\r\n * @public\r\n * @type { Partial }\r\n */\r\n public static defaultProps: Partial = {\r\n experienceName: experienceDefaultName\r\n };\r\n\r\n /**\r\n * The content action toolbar handled prop contract\r\n * Describes the object that enumerates all handled props for a component. This\r\n * object includes all props that can in some way consumed or manipulated by component\r\n * code.\r\n * @protected\r\n * @type { HandledPropsKeys }\r\n */\r\n protected handledProps: HandledPropsKeys = {\r\n contentStatus: undefined,\r\n customField: undefined,\r\n experienceName: undefined,\r\n managedClasses: undefined,\r\n onExperienceMilestoneTimingUpdate: undefined,\r\n position: undefined,\r\n rootTelemetryTags: undefined,\r\n sharingError: undefined,\r\n sharingToolbar: undefined,\r\n staticPosition: undefined\r\n };\r\n\r\n /**\r\n * Flag to confirm first render is completed\r\n * @type {boolean}\r\n */\r\n private firstRenderCompleted: boolean = false;\r\n\r\n /**\r\n * Constructs a ContentActionsToolbar component\r\n * @constructor\r\n * @param { ContentActionsToolbarProps } props props contract\r\n */\r\n constructor(props: ContentActionsToolbarProps) {\r\n super(props);\r\n }\r\n\r\n /**\r\n * Render App component.\r\n *\r\n * @public\r\n * @return {JSX.Element}\r\n */\r\n public render(): JSX.Element {\r\n super.render();\r\n\r\n if (this.props.position && this.props.sharingToolbar && this.props.sharingToolbar.sharingButtons && !this.props.sharingError) {\r\n return (\r\n
    \r\n \r\n
    \r\n );\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Trigger after component update\r\n */\r\n public componentDidUpdate(prevProps: ContentActionsToolbarHandledProps): void {\r\n super.componentDidUpdate(prevProps);\r\n\r\n if (!prevProps.staticPosition && this.shouldFlip()) {\r\n this.flipToolbar();\r\n }\r\n\r\n if (!this.firstRenderCompleted) {\r\n markTtvr(this.props.experienceName);\r\n this.firstRenderCompleted = true;\r\n }\r\n }\r\n\r\n /**\r\n * A handler that gets invoked for unhandled errors.\r\n * @param error error object.\r\n */\r\n public componentDidCatch(error: Error): void {\r\n const appError = { ...ContentActionsToolbarAppErrors.ContentActionsBaseExperienceError, message: `${error.message}\\n${error.stack}` };\r\n TelemetryBase.trackAppErrorEvent(appError);\r\n }\r\n\r\n /**\r\n * Get the classname based on positioning of the toolbar\r\n */\r\n private getPositioningClassName(): string {\r\n const managedClasses = this.props.managedClasses;\r\n const positionClass: string = this.props.position === ToolbarPosition.horizontal ?\r\n managedClasses.contentActionsToolbar_horizontal :\r\n managedClasses.contentActionsToolbar_vertical;\r\n\r\n return positionClass;\r\n }\r\n\r\n /**\r\n * Check if toolbar needs to flip from one position to another\r\n * @method\r\n * @returns {boolean} True if toolbar should flip. False otherwise.\r\n */\r\n private shouldFlip(): boolean {\r\n const { position } = this.props;\r\n\r\n const currentHostId = position === ToolbarPosition.vertical ? PlaceHolderId.vertical : PlaceHolderId.horizontal;\r\n const hostElem = document.getElementById(currentHostId);\r\n if (!hostElem) {\r\n TelemetryBase.trackAppErrorEvent({\r\n ...ContentActionsToolbarAppErrors.ContentActionsFlipToolbarError,\r\n message: \"Missing toolbar placeholder while checking shouldFlip\",\r\n pb: {\r\n ...ContentActionsToolbarAppErrors.ContentActionsFlipToolbarError.pb,\r\n customMessage: `CurrentHostId: ${currentHostId}`\r\n }\r\n });\r\n return false;\r\n }\r\n return hostElem.getElementsByTagName(\"ul\").length === 0;\r\n }\r\n\r\n /**\r\n * Move toolbar from one placeholder to another, depending on the toolbar position\r\n * @method\r\n */\r\n private flipToolbar(): void {\r\n const { position } = this.props;\r\n const prevHostId = position === ToolbarPosition.vertical ? PlaceHolderId.horizontal : PlaceHolderId.vertical;\r\n const newHostId = position === ToolbarPosition.vertical ? PlaceHolderId.vertical : PlaceHolderId.horizontal;\r\n\r\n const prevHostElem = document.getElementById(prevHostId);\r\n const newHostElem = document.getElementById(newHostId);\r\n\r\n if (!prevHostElem || !newHostElem) {\r\n return null;\r\n }\r\n\r\n while (prevHostElem.childNodes.length > 0) {\r\n newHostElem.appendChild(prevHostElem.childNodes[0]);\r\n }\r\n }\r\n}","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport { ComponentStyles } from \"@microsoft/fast-jss-manager\";\r\nimport { ContentActionsToolbarClassNames } from \".\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { toPx } from \"@microsoft/fast-jss-utilities\";\r\n\r\nconst toolbarMinDim = 40;\r\nconst iconHeight = 32;\r\n\r\n/**\r\n * The ContentActionsToolbar styles\r\n * @type {ComponentStyles}\r\n */\r\nexport const ContentActionsToolbarStyles: ComponentStyles = (config: DesignSystem) => {\r\n return {\r\n contentActionsToolbar: {\r\n \"background-color\": \"none\"\r\n },\r\n contentActionsToolbar_vertical: {\r\n width: toPx(toolbarMinDim)\r\n },\r\n contentActionsToolbar_horizontal: {\r\n width: \"auto\"\r\n }\r\n };\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport {\r\n ContentActionsToolbarHandledProps as BaseExperienceHandledProps,\r\n ContentActionsToolbarProps as BaseExperienceProps,\r\n ContentActionsToolbarManagedClasses,\r\n ContentActionsToolbarUnhandledProps,\r\n ToolbarPosition\r\n} from \"./ContentActionsToolbar.props\";\r\nimport {\r\n ContentActionsToolbarConfigSchema,\r\n ContentActionsToolbarMockConfig,\r\n ContentActionsToolbarMockState\r\n} from \"./experience-info\";\r\nimport { ContentActionsToolbarConnectorArgs, ContentActionsToolbarInspector } from \"./ContentActionsToolbar.inspector\";\r\nimport { PlaceHolderId, Status } from \"./ContentActionsToolbar.constants\";\r\nimport manageJss, { ManagedJSSProps } from \"@microsoft/fast-jss-manager-react\";\r\n\r\nimport {\r\n ContentActionsToolbar as BaseExperience\r\n} from \"./ContentActionsToolbar\";\r\nimport { ComponentClass } from \"react-redux\";\r\nimport { ContentActionsToolbarActions } from \"./ContentActionsToolbar.actions\";\r\nimport { ContentActionsToolbarClassNames } from \"./ContentActionsToolbar.classnames\";\r\nimport { ContentActionsToolbarConfig } from \"./ContentActionsToolbar.config\";\r\nimport { ContentActionsToolbarConnector } from \"./ContentActionsToolbar.connector\";\r\nimport { ContentActionsToolbarReducer } from \"./ContentActionsToolbar.reducer\";\r\nimport { ContentActionsToolbarState } from \"./ContentActionsToolbar.state\";\r\nimport { ContentActionsToolbarStyles } from \"./ContentActionsToolbar.styles\";\r\nimport { DesignSystem } from \"@microsoft/fast-components-styles-msft\";\r\nimport { ExperienceInfo } from \"@msnews/core\";\r\nimport { Subtract } from \"utility-types\";\r\n\r\n/*\r\n * The type returned by manageJss type is very complicated so we'll let the\r\n * compiler infer the type instead of re-declaring just for the package export\r\n */\r\n/* tslint:disable-next-line:typedef */\r\nconst ContentActionsToolbar = manageJss(ContentActionsToolbarStyles)(BaseExperience);\r\ntype ContentActionsToolbar = InstanceType;\r\n\r\n// Create a valid JSS managed interface that doesn't require managed classes which are provided by the manageJSS HOC\r\ninterface ContentActionsToolbarHandledProps extends Subtract {}\r\n\r\n// Create type for manageJSS HOC styled instance we are exporting\r\ntype ContentActionsToolbarProps = ManagedJSSProps;\r\n\r\nconst ToolingInfo: ExperienceInfo<\r\n ContentActionsToolbarConfig,\r\n ContentActionsToolbarState,\r\n ContentActionsToolbarProps,\r\n ContentActionsToolbarConnectorArgs\r\n> = {\r\n reactComponent: ContentActionsToolbar,\r\n experienceConfigSchema: ContentActionsToolbarConfigSchema,\r\n mockState: ContentActionsToolbarMockState,\r\n mockConfig: ContentActionsToolbarMockConfig,\r\n inspector: ContentActionsToolbarInspector.inspect\r\n};\r\n\r\n// type for ContentActionsToolbar experience to be invoked by other experiences\r\ntype ContentActionsToolbarExp = ComponentClass;\r\n\r\n// Export everything a user might need from this index file\r\nexport {\r\n ContentActionsToolbar,\r\n ContentActionsToolbarActions,\r\n ContentActionsToolbarConfig,\r\n ContentActionsToolbarConnector,\r\n ContentActionsToolbarExp,\r\n ContentActionsToolbarProps,\r\n ContentActionsToolbarReducer,\r\n ContentActionsToolbarState,\r\n ContentActionsToolbarClassNames,\r\n ContentActionsToolbarHandledProps,\r\n ContentActionsToolbarUnhandledProps,\r\n PlaceHolderId,\r\n Status,\r\n ToolbarPosition,\r\n ToolingInfo\r\n};","// © Microsoft Corporation. All rights reserved.\r\n\r\nimport \"../publicPath\";\r\n\r\nimport {\r\n ContentActionsToolbar,\r\n ContentActionsToolbarConfig,\r\n ContentActionsToolbarConnector,\r\n ContentActionsToolbarReducer,\r\n PlaceHolderId\r\n} from \"@msnews/content-actions-toolbar\";\r\nimport { ExperienceConfigWrapper, TelemetryBase, appEnvironment, resolver } from \"@msnews/core\";\r\nimport { ExperienceInitialProps, Telemetry } from \"@msnews/experiences-base\";\r\nimport { handleAppErrorEventCall, handlePartialPageImpressionCall, handleTelemetryCall } from \"../integration/PrimeTelemetry\";\r\n\r\nimport { ContentActionsToolbarAppErrors } from \"@msnews/diagnostics\";\r\nimport { DesignSystemDefaults } from \"@microsoft/fast-components-styles-msft\";\r\nimport { DesignSystemProvider } from \"@microsoft/fast-jss-manager-react\";\r\nimport { Mediator } from \"../integration/Mediator\";\r\nimport { PageBase } from \"@msnews/experiences-redux\";\r\nimport React from \"react\";\r\nimport { SharedDocumentType } from \"@msnews/views-helpers\";\r\nimport { ToolbarPosition } from \"@msnews/content-actions-toolbar\";\r\nimport { isNullOrUndefined } from \"util\";\r\n\r\n// export default function bootstrapPrimeHybrid(): void {\r\n// Get an instance of the PageBase for this app, and start the app\r\nconst app = PageBase.getInstance();\r\n\r\n// Mock documentId to be used when running hybrid locally for testing purposes\r\nconst mockDocumentId = \"BBKJJOS\";\r\n\r\n// Map base telemetry to prime library for hybrid\r\nTelemetryBase.trackAppErrorEvent = handleAppErrorEventCall;\r\nTelemetryBase.trackPartialImpression = handlePartialPageImpressionCall;\r\nTelemetryBase.trackEvent = handleTelemetryCall;\r\n\r\n// Start the App\r\napp.start();\r\n\r\nlet hostElement: HTMLElement;\r\n\r\nconst appTelemetry = Telemetry.createRootProps(\"spaContentActionsToolbarExperienceContainer\", undefined, appEnvironment.RootTelemetryId);\r\nconst initialProps: ExperienceInitialProps = {\r\n contentId: mockDocumentId,\r\n parentTelemetry: appTelemetry,\r\n context: {\r\n handleTelemetryCall: handleTelemetryCall\r\n }\r\n};\r\n\r\n/**\r\n * Otains document data properties from Prime placeholder and sets up the initial props and appEnv variables\r\n */\r\nfunction setupContentActionsInitialState(): void {\r\n // For Content Actions the placeholder can be in vertical in one prime region or horizontal in another prime region (depending on pagetype and column size)\r\n hostElement = document.getElementById(PlaceHolderId.vertical) || document.getElementById(PlaceHolderId.horizontal) || document.getElementById(\"content-actions-toolbar\");\r\n\r\n const dataset = hostElement.dataset || {};\r\n const cmsDocumentId: string = dataset.documentid || mockDocumentId;\r\n const isRSThree: string = dataset.isrsthree || \"false\";\r\n\r\n // Check for the existence of second position and sets staticsPosition accordingly\r\n var staticPosition = hostElement.id === PlaceHolderId.vertical ?\r\n document.getElementById(PlaceHolderId.horizontal) ? undefined : ToolbarPosition.vertical :\r\n document.getElementById(PlaceHolderId.vertical) ? undefined : ToolbarPosition.horizontal;\r\n\r\n // Set initital props\r\n initialProps.contentId = cmsDocumentId;\r\n initialProps.context.staticPosition = staticPosition;\r\n initialProps.context.isRSThree = (isRSThree.toLowerCase() === \"true\");\r\n initialProps.context.documentType = SharedDocumentType.CMS;\r\n\r\n // Update app environment\r\n appEnvironment.HostPage = {\r\n originalUrl: location.href,\r\n hostName: location.hostname,\r\n verticalKey: dataset.verticalkey || \"news\",\r\n categoryKey: dataset.categorykey || \"other\",\r\n topDomain: appEnvironment.HostPage.topDomain\r\n };\r\n}\r\n\r\n/**\r\n * Connected the component to the Redux store passing initial props data\r\n * @param {any} experienceConfig\r\n * @returns The Redux connected component\r\n */\r\nfunction connectContentActionsComponent(contentActionsToolbarConfig: ContentActionsToolbarConfig): Promise> {\r\n const contentActionsToolbarConnector = new ContentActionsToolbarConnector(\"ContentActionsToolbar\",\r\n \"\",\r\n app.rootReducer,\r\n new ContentActionsToolbarReducer(),\r\n app.store,\r\n contentActionsToolbarConfig);\r\n return contentActionsToolbarConnector.connectComponent(ContentActionsToolbar, initialProps);\r\n}\r\n\r\n/**\r\n * Render the experience on hostElement placeholder\r\n * @param contentActionsExperience\r\n */\r\nfunction renderExperience(contentActionsExperience: any): void {\r\n app.renderRootElement(\r\n React.createElement(\r\n DesignSystemProvider,\r\n { designSystem: DesignSystemDefaults },\r\n React.createElement(contentActionsExperience)\r\n ),\r\n hostElement\r\n );\r\n}\r\n\r\nlet contentActionsConfig: ContentActionsToolbarConfig;\r\nconst configFilePath = \"cms/api/amp/experienceConfigIndex/BBWebZe\";\r\nresolver.getConfig(configFilePath)\r\n .then((experienceConfig: ExperienceConfigWrapper) => {\r\n if (!experienceConfig) {\r\n throw Error(`Failed to load config file. Path: ${configFilePath}`);\r\n }\r\n contentActionsConfig = experienceConfig.properties;\r\n setupContentActionsInitialState();\r\n return connectContentActionsComponent(contentActionsConfig);\r\n }).then(renderExperience)\r\n .catch(error => {\r\n handleAppErrorEventCall({\r\n ...ContentActionsToolbarAppErrors.ContentActionsExperienceLoadError,\r\n message: `Error in hybrid loading Content Actions experience`,\r\n pb: {\r\n ...ContentActionsToolbarAppErrors.ContentActionsExperienceLoadError.pb,\r\n customMessage: `Url: ${location.href} Config: ${contentActionsConfig} Error: ${error}`\r\n }\r\n });\r\n return;\r\n }\r\n );\r\n\r\n// Listen to update events from Prime (Necessary as video page auto updates current displayed video)\r\nMediator.registerContentActionsUpdatedEvent(async () => {\r\n setupContentActionsInitialState();\r\n connectContentActionsComponent(contentActionsConfig)\r\n .then(renderExperience);\r\n});"],"sourceRoot":""}