Source: Help4.js

(function() {
    /** @namespace Help4 */

    window.Help4 = {moduleRoot: {
        _method: 'UI5',
        help4: 'sap.dfa.help.wpb.help4',
        xray: 'sap.dfa.help.wpb',
        html: 'sap.dfa.help.wpb.html',
        lib: 'sap.dfa.help.wpb.lib'
    }};

    // specific for xRay; need to stay like this as long as we develop in UI5/Fiori
    // NOT real UI5 API usage. used internally as proxy for including js files in dkp.pl
    jQuery.sap.require("sap.dfa.help.wpb.Core");

    Help4.extendObject(Help4, {
        VERSION: '~~~VERSION~~~',
        BUILDNUMBER: '~~~BUILDNUMBER~~~',
        TIMESTAMP: '',  // for UI5/Fiori caching

        I18N_PATH: '/wpb/i18n/',
        FILES_PATH: '/wpb/files/',
        THEME_PATH: '/wpb/less/',
        LEARNING_APP_PATH: '/wpb/learningapp/index.html',

        // this value should be the same as css variable with the same name. in case of changing this value, make sure to check the css variable.
        HOTSPOT_BORDER_WIDTH: 2,

        // needed in other places during bootstrapping
        // standard (RO) content URL marker in EXT mode
        STANDARD_SERVER_URL_MARKER: 'wa!STANDARD:',

        init: _init,
        cleanup: _cleanup,
        getShell: _getShell,
        getController: _getController,
        getConfiguration: () => Help4.getController()?.getConfiguration(),
        adapterTypeToName: type => ({fiori: 'Fiori', ui5: 'UI5', desktopAssistant: 'DesktopAssistant' }[type]) || 'Shell'
    });

    Help4.require("xray.jscore.Base");

    Help4.require("xray.ajax.Ajax");
    Help4.require("xray.ajax.EnableNow");
    Help4.require("xray.ajax.UACP");
    Help4.require("xray.ajax.UrHarmonization");

    Help4.require("xray.observer.Observer");
    Help4.require("xray.observer.EventObserver");
    Help4.require("xray.observer.MessageEventObserver");
    Help4.require("xray.observer.EventBusObserver");
    Help4.require("xray.observer.MutationObserver");
    Help4.require("xray.observer.WindowObserver");
    Help4.require("xray.observer.TimeObserver");
    Help4.require("xray.observer.ControlObserver");
    Help4.require("xray.observer.FocusObserver");

    Help4.require("xray.Element");
    Help4.require("xray.Object");
    Help4.require("xray.Event");
    Help4.require("xray.Localization");
    Help4.require("xray.Queue");
    Help4.require("xray.History");
    Help4.require("xray.CtxWPB");
    Help4.require("xray.BinaryStorage");
    Help4.require("xray.StartStatus");
    Help4.require("xray.Promise");
    Help4.require("xray.XhrPromise");
    Help4.require("xray.EventBus");
    Help4.require("xray.Placeholder");
    Help4.require("xray.BooleanFormula");
    Help4.require("xray.EmbeddedEvent");
    Help4.require("xray.EmbeddedEventSync");
    Help4.require("xray.AuthService");

    Help4.require("xray.MigrateFioriSpaces");

    Help4.require("xray.jscore.Base");
    Help4.require("xray.jscore.ControlBase");
    Help4.require("xray.jscore.DataBase");
    Help4.require("xray.jscore.DataContainer");
    Help4.require("xray.jscore.DataFunctions");
    Help4.require("xray.jscore.ControlBase_Texts");
    Help4.require("xray.jscore.DataTypeArray");
    Help4.require("xray.jscore.DataTypeAtomic");
    Help4.require("xray.jscore.DataTypeDataContainer");
    Help4.require("xray.jscore.DataTypeInstance");
    Help4.require("xray.jscore.DataTypeElement");
    Help4.require("xray.jscore.DataTypeJson");
    Help4.require("xray.jscore.DataTypeLeftTop");
    Help4.require("xray.jscore.DataTypeObject");
    Help4.require("xray.jscore.DataTypeWidthHeight");
    Help4.require("xray.jscore.DataTypeWH");
    Help4.require("xray.jscore.DataTypeXY");
    Help4.require("xray.jscore.DataTypeXYWH");
    Help4.require("xray.jscore.DragDrop");
    Help4.require("xray.jscore.MediaWatcher");
    Help4.require("xray.jscore.MutualExclusion");

    Help4.require("xray.data.Data");
    Help4.require("xray.data.TileData");
    Help4.require("xray.data.HotspotData");
    Help4.require("xray.data.HotspotStatusData");
    Help4.require("xray.data.CrossOriginRequestData");

    Help4.require("xray.selector.Selector");
    Help4.require("xray.selector.methods.Utils");
    Help4.require("xray.selector.methods.BaseSelector");
    Help4.require("xray.selector.methods.AppFrameSelector");
    Help4.require("xray.selector.methods.ClassSelector");
    Help4.require("xray.selector.methods.DataAttrSelector");
    Help4.require("xray.selector.methods.GenericSelector");
    Help4.require("xray.selector.methods.FallbackSelector");
    Help4.require("xray.selector.methods.IdSelector");
    Help4.require("xray.selector.methods.IframeSelector");
    Help4.require("xray.selector.methods.KnownElementSelector");
    Help4.require("xray.selector.methods.NoNumbersIdSelector");
    Help4.require("xray.selector.methods.ShortTermIframeSelector");
    Help4.require("xray.selector.methods.TextSelector");
    Help4.require("xray.selector.methods.TreeDataAttrSelector");
    Help4.require("xray.selector.methods.enablenow.EnableNowSelector");
    Help4.require("xray.selector.methods.fieldglass.FG_StableIdSelector");
    Help4.require("xray.selector.methods.fiori.BlacklistFiori");
    Help4.require("xray.selector.methods.htmlgui.HtmlGui_DialogControlSelector");
    Help4.require("xray.selector.methods.htmlgui.HtmlGui_IdSelector");
    Help4.require("xray.selector.methods.htmlgui.HtmlGui_SidSelector");
    Help4.require("xray.selector.methods.sfsf.SFSF_FormFieldSelector");
    Help4.require("xray.selector.methods.sfsf.SFSF_FormNameSelector");
    Help4.require("xray.selector.methods.sfsf.SFSF_IdSelector");
    Help4.require("xray.selector.methods.sfsf.SFSF_StableIdSelector");
    Help4.require("xray.selector.methods.sfsf.SFSF_TreeIdSelector");
    Help4.require("xray.selector.methods.sfsf.SFSF_XmlViewSelector");
    Help4.require("xray.selector.methods.sfsf.SFSF_MsgsSelector");
    Help4.require("xray.selector.methods.ui5.UtilsUI5");
    Help4.require("xray.selector.methods.ui5.BindingInfoUI5");
    Help4.require("xray.selector.methods.ui5.DomSelectorUI5");
    Help4.require("xray.selector.methods.ui5.IdSelectorUI5");
    Help4.require("xray.selector.methods.ui5.NavSelectorUI5");
    Help4.require("xray.selector.methods.ui5.SideNavigationSelectorUI5");
    Help4.require("xray.selector.methods.ui5.TabStripItemSelectorUI5");
    Help4.require("xray.selector.methods.ui5.PopUpItemSelectorUI5");
    Help4.require("xray.selector.methods.wda.WDA_InputFieldSelector");

    Help4.require("xray.service.Service");
    Help4.require("xray.service.storage.StorageService");
    Help4.require("xray.service.storage.StorageInterface");
    Help4.require("xray.service.storage.CookieStorage");
    Help4.require("xray.service.storage.LocalStorage");
    Help4.require("xray.service.storage.SessionStorage");
    Help4.require("xray.service.storage.EnableNowStorage");
    Help4.require("xray.service.storage.FioriStorage");
    Help4.require("xray.service.InputFieldService");
    Help4.require("xray.service.ImageDownloadService");
    Help4.require("xray.service.HotkeyService");
    Help4.require("xray.service.ConditionService");
    Help4.require("xray.service.RemoteModelService");
    Help4.require("xray.service.CrossOriginMessageService");
    Help4.require("xray.service.container.ContainerService");
    Help4.require("xray.service.container.HotspotService");
    Help4.require("xray.service.container.LightboxService");
    Help4.require("xray.service.container.InfoBarService");
    Help4.require("xray.service.container.MessageService");
    Help4.require("xray.service.container.BubbleService");
    Help4.require("xray.service.container.bubble.StandardBubble");
    Help4.require("xray.service.container.bubble.HelpBubble");
    Help4.require("xray.service.container.bubble.TourBubble");
    Help4.require("xray.service.container.bubble.TileConfigBubble");
    Help4.require("xray.service.recording.RecordingService");
    Help4.require("xray.service.recording.SameWindowRecording");
    Help4.require("xray.service.recording.SameWindowPlayback");
    Help4.require("xray.service.recording.ElementToSelector");
    Help4.require("xray.service.recording.ShadowDomService");
    Help4.require("xray.service.recording.IFrameService");
    Help4.require("xray.service.recording.RecordingCacheService");
    Help4.require("xray.service.recording.PlaybackCacheService");
    Help4.require("xray.service.recording.PlaybackService");
    Help4.require("xray.service.recording.PlaybackServiceUpdate");
    Help4.require("xray.service.recording.PlaybackServiceScan");
    Help4.require("xray.service.recording.PlaybackServiceAction");
    Help4.require("xray.service.recording.PlaybackServiceEvent");
    Help4.require("xray.service.zoom.ZoomService");
    Help4.require("xray.service.zoom.InPlaceZoom");
    Help4.require("xray.service.zoom.LightboxZoom");

    Help4.require("xray.engine.StateEngine");
    Help4.require("xray.engine.CarouselSelectionEngine");
    Help4.require("xray.engine.DomRefreshEngine");
    Help4.require("xray.engine.crossorigin.Core");
    Help4.require("xray.engine.crossorigin.CoreEngine");
    Help4.require("xray.engine.crossorigin.CoreWindowObserver");
    Help4.require("xray.engine.RecordingEngine");
    Help4.require("xray.engine.ur.UrHarmonizationEngine");
    Help4.require("xray.engine.ur.Connection");
    Help4.require("xray.engine.ur.IconTemplate");
    Help4.require("xray.engine.ur.Migration");
    Help4.require("xray.engine.ur.Mock");
    Help4.require("xray.engine.ur.Selector");
    Help4.require("xray.engine.ur.Tile");
    Help4.require("xray.engine.ur.Tour");
    Help4.require("xray.engine.ur.Transformation");
    Help4.require("xray.engine.ur.Update");
    Help4.require("xray.engine.ur.WTA");
    Help4.require("xray.engine.hotspotManager.HotspotManagerEngine");
    Help4.require("xray.engine.hotspotManager.HotspotController");
    Help4.require("xray.engine.remote.RemoteControlEngine");
    Help4.require("xray.engine.remote.TourPlaybackController");
    Help4.require("xray.engine.remote.CarouselController");
    Help4.require("xray.engine.ConditionEngine");
    Help4.require("xray.engine.MLTEngine");

    Help4.require("xray.control.Store");
    Help4.require("xray.control.Icons");
    Help4.require("xray.control.Control");
    Help4.require("xray.control.SearchField");
    Help4.require("xray.control.Lightbox");
    Help4.require("xray.control.Progress");
    Help4.require("xray.control.Text");
    Help4.require("xray.control.HelpBox");
    Help4.require("xray.control.Select");
    Help4.require("xray.control.InfoBar");

    Help4.require("xray.control2.Control");
    Help4.require("xray.control2.Store");
    Help4.require("xray.control2.Icons");
    Help4.require("xray.control2.Line");
    Help4.require("xray.control2.Cover");
    Help4.require("xray.control2.Text");
    Help4.require("xray.control2.Tile");
    Help4.require("xray.control2.Lightbox");
    Help4.require("xray.control2.InfoBar");
    Help4.require("xray.control2.Select");

    Help4.require("xray.control2.button.Button");
    Help4.require("xray.control2.button.Option");

    Help4.require("xray.control2.input.Text");

    Help4.require("xray.control2.container.Container");
    Help4.require("xray.control2.container.SortedContainer");
    Help4.require("xray.control2.container.PanelWidgetContainer");
    Help4.require("xray.control2.container.Rating");
    Help4.require("xray.control2.container.PanelSearch");

    Help4.require("xray.control2.recording.Overlay");
    Help4.require("xray.control2.recording.SelectionRect");
    Help4.require("xray.control2.recording.InfoArea");

    Help4.require("xray.control2.hotspot.Hotspot");
    Help4.require("xray.control2.hotspot.Circle");
    Help4.require("xray.control2.hotspot.Rectangle");
    Help4.require("xray.control2.hotspot.Triangle");
    Help4.require("xray.control2.hotspot.Underline");
    Help4.require("xray.control2.hotspot.Icon");
    Help4.require("xray.control2.hotspot.Connected");
    Help4.require("xray.control2.hotspot.Numbered");

    Help4.require("xray.control2.bubble.Bubble");
    Help4.require("xray.control2.bubble.BubbleAlignment");
    Help4.require("xray.control2.bubble.Help");
    Help4.require("xray.control2.bubble.Panel");
    Help4.require("xray.control2.bubble.LanguageSelection");
    Help4.require("xray.control2.bubble.BubbleCover");
    Help4.require("xray.control2.bubble.BubbleArrow");
    Help4.require("xray.control2.bubble.header.BubbleHeader");
    Help4.require("xray.control2.bubble.header.CaptionTranslateClose");
    Help4.require("xray.control2.bubble.header.Panel");
    Help4.require("xray.control2.bubble.content.BubbleContent");
    Help4.require("xray.control2.bubble.content.Html");
    Help4.require("xray.control2.bubble.content.Panel");
    Help4.require("xray.control2.bubble.content.Selection");
    Help4.require("xray.control2.bubble.footer.BubbleFooter");
    Help4.require("xray.control2.bubble.footer.Checkbox");
    Help4.require("xray.control2.bubble.footer.Panel");
    Help4.require("xray.control2.bubble.footer.Close");
    Help4.require("xray.control2.bubble.footer.Apply");

    Help4.require("xray.control.button.Button");
    Help4.require("xray.control.button.Option");
    Help4.require("xray.control.button.SwitchToggle");
    Help4.require("xray.control.button.Description");
    Help4.require("xray.control.button.TourInfo");

    Help4.require("xray.control.container.Container");
    Help4.require("xray.control.container.Select");
    Help4.require("xray.control.container.Propsheet");
    Help4.require("xray.control.container.TabbedPropsheet");
    Help4.require("xray.control.container.Option");
    Help4.require("xray.control.container.Toolbar");
    Help4.require("xray.control.container.HtmlToolbar");
    Help4.require("xray.control.container.Tile");
    Help4.require("xray.control.container.LearningApp");
    Help4.require("xray.control.container.Condition");

    Help4.require("xray.control.tile.Tile");
    Help4.require("xray.control.tile.Help");
    Help4.require("xray.control.tile.ProjectTour");
    Help4.require("xray.control.tile.LearningApp");
    Help4.require("xray.control.tile.Edit");
    Help4.require("xray.control.tile.HelpEdit");
    Help4.require("xray.control.tile.LinkEdit");
    Help4.require("xray.control.tile.TourEdit");
    Help4.require("xray.control.tile.Asset");
    Help4.require("xray.control.tile.SearchResult");
    Help4.require("xray.control.tile.Action");

    Help4.require("xray.control.input.Input");
    Help4.require("xray.control.input.Text");
    Help4.require("xray.control.input.Number");
    Help4.require("xray.control.input.Size");
    Help4.require("xray.control.input.Rating");
    Help4.require("xray.control.input.Orientation");
    Help4.require("xray.control.input.Offset");
    Help4.require("xray.control.input.Border");
    Help4.require("xray.control.input.Margin");
    Help4.require("xray.control.input.Date");
    Help4.require("xray.control.input.HtmlEditor");
    Help4.require("xray.control.input.HtmlEditor_transformation");
    Help4.require("xray.control.input.ConditionalInputButton");
    Help4.require("xray.control.input.slider.Slider");
    Help4.require("xray.control.input.slider.Enum");

    Help4.require("xray.control.carousel.Carousel");
    Help4.require("xray.control.carousel.Edit");

    Help4.require("xray.control.bubble.BubbleAlignment");
    Help4.require("xray.control.bubble.Bubble");
    Help4.require("xray.control.bubble.Container");
    Help4.require("xray.control.bubble.Help");
    Help4.require("xray.control.bubble.Tour");
    Help4.require("xray.control.bubble.Debug");

    Help4.require("xray.control.bubble.dialog.Dialog");
    Help4.require("xray.control.bubble.dialog.Message");
    Help4.require("xray.control.bubble.dialog.Tabbed");
    Help4.require("xray.control.bubble.dialog.Hotkey");
    Help4.require("xray.control.bubble.dialog.NoHelp");
    Help4.require("xray.control.bubble.dialog.ContextInformation");
    Help4.require("xray.control.bubble.dialog.ContextMismatch");
    Help4.require("xray.control.bubble.dialog.LearningApp");
    Help4.require("xray.control.bubble.dialog.UpdateNotification");
    Help4.require("xray.control.bubble.dialog.PreAssignment");
    Help4.require("xray.control.bubble.dialog.Condition");
    Help4.require("xray.control.bubble.dialog.ConditionRecurrence");

    Help4.require("xray.service.InfobarService");
    Help4.require("xray.service.LightboxService");

    Help4.require("xray.widget.Widget");
    Help4.require("xray.widget.static");
    Help4.require("xray.widget.Infrastructure");
    Help4.require("xray.widget.Requirement");
    Help4.require("xray.widget.companionCore.Core");
    Help4.require("xray.widget.companionCore.State");
    Help4.require("xray.widget.companionCore.SEN");
    Help4.require("xray.widget.companionCore.UACP");
    Help4.require("xray.widget.companionCore.data.Tour");
    Help4.require("xray.widget.companionCore.data.Help");
    Help4.require("xray.widget.learning.Widget");
    Help4.require("xray.widget.learning.Data");
    Help4.require("xray.widget.learning.Backend");
    Help4.require("xray.widget.learning.View");
    Help4.require("xray.widget.learning.TileControl");
    Help4.require("xray.widget.learning.FeedbackBubbleControl");
    Help4.require("xray.widget.learning.FeedbackBubbleContentControl");
    Help4.require("xray.widget.learning.FeedbackBubbleFooterControl");
    Help4.require("xray.widget.help.Widget");
    Help4.require("xray.widget.help.Data");
    Help4.require("xray.widget.help.XmlHelper");
    Help4.require("xray.widget.help.HeadersXml");
    Help4.require("xray.widget.help.Cookie");
    Help4.require("xray.widget.help.CatalogueBackend");
    Help4.require("xray.widget.help.catalogues.SEN");
    Help4.require("xray.widget.help.catalogues.SEN2");
    Help4.require("xray.widget.help.catalogues.UACP");
    Help4.require("xray.widget.help.catalogues.GlobalHelp");
    Help4.require("xray.widget.help.catalogues._Special");
    Help4.require("xray.widget.help.catalogues.API");
    Help4.require("xray.widget.help.catalogues.QuickTour");
    Help4.require("xray.widget.help.catalogues.UR");
    Help4.require("xray.widget.help.project.SEN");
    Help4.require("xray.widget.help.project.SEN2");
    Help4.require("xray.widget.help.project.UACP");
    Help4.require("xray.widget.help.project.GlobalHelp");
    Help4.require("xray.widget.help.project._Special");
    Help4.require("xray.widget.help.project.API");
    Help4.require("xray.widget.help.project.QuickTour");
    Help4.require("xray.widget.help.project.UR");
    Help4.require("xray.widget.help.CatalogueType");
    Help4.require("xray.widget.help.view2.view2");
    Help4.require("xray.widget.help.view2.Tile");
    Help4.require("xray.widget.help.view2.TileTile");
    Help4.require("xray.widget.help.view2.TileHotspot");
    Help4.require("xray.widget.help.view2.TileLightbox");
    Help4.require("xray.widget.help.view2.TileBubble");
    Help4.require("xray.widget.help.view2.TileContainer");
    Help4.require("xray.widget.help.view2.HotspotScan");
    Help4.require("xray.widget.help.view2.LaserBeam");
    Help4.require("xray.widget.help.view2.BubbleControl");
    Help4.require("xray.widget.help.view2.GlobalHelpDialogControl");
    Help4.require("xray.widget.help.view2.View");
    Help4.require("xray.widget.tourlist.Widget");
    Help4.require("xray.widget.tourlist.Data");
    Help4.require("xray.widget.tourlist.CatalogueType");
    Help4.require("xray.widget.tourlist.View");
    Help4.require("xray.widget.tourlist.TileControl");
    Help4.require("xray.widget.tour.Widget");
    Help4.require("xray.widget.tour.View");
    Help4.require("xray.widget.tour.HotspotController");
    Help4.require("xray.widget.tour.BubbleController");
    Help4.require("xray.widget.tour.Observer");
    Help4.require("xray.widget.tour.BubbleControl");
    Help4.require("xray.widget.tour.BubbleFooterControl");
    Help4.require("xray.widget.whatsnew.Widget");
    Help4.require("xray.widget.whatsnew.catalogues.WNTours");
    Help4.require("xray.widget.whatsnew.project.WNTours");
    Help4.require("xray.widget.whatsnew.Data");
    Help4.require("xray.widget.bpm.Widget");
    Help4.require("xray.widget.filter.Widget");
    Help4.require("xray.widget.monitor.Widget");
    Help4.require("xray.widget.monitor.Store");

    Help4.require("xray.Config");
    Help4.require("xray.CustomTheme");

    Help4.require("xray.control.condition.Condition");
    Help4.require("xray.control.condition.ApiCondition");
    Help4.require("xray.control.condition.ElementCondition");
    Help4.require("xray.control.condition.UrlCondition");
    Help4.require("xray.control.condition.DateCondition");

    Help4.require("xray.tracking.Tracking");
    Help4.require("xray.tracking.connector.Shell");
    Help4.require("xray.tracking.connector.WebAnalytics");
    Help4.require("xray.tracking.connector.EnableNow");

    Help4.require("xray.shell.Params");
    Help4.require("xray.shell.Shell");
    Help4.require("xray.shell.Fiori");
    Help4.require("xray.shell.QuickTour");
    Help4.require("xray.shell.QuickTourStore");
    Help4.require("xray.shell.UI5");
    Help4.require("xray.shell.DesktopAssistant");

    Help4.require("xray.model.ModelBase");
    Help4.require("xray.model.Model");
    Help4.require("xray.model.ServiceLayer");
    Help4.require("xray.model.uacp.ModelBase");
    Help4.require("xray.model.uacp.Model");
    Help4.require("xray.model.uacp.ServiceLayer");
    Help4.require("xray.model.wpb.HeadersXml");
    Help4.require("xray.model.wpb.XmlHelper");
    Help4.require("xray.model.wpb.ModelBase");
    Help4.require("xray.model.wpb.Model");
    Help4.require("xray.model.wpb.ServiceLayer");
    Help4.require("xray.model.ext.ModelBase");
    Help4.require("xray.model.ext.Model");
    Help4.require("xray.model.ext.ServiceLayer");
    Help4.require("xray.model.ext.Helper");

    Help4.require("html.wctlayer");
    Help4.require("html.html_editor");
    Help4.require("html.core.transformation.html");
    Help4.require("html.core.transformation.beautifier");
    Help4.require("html.core.transformation.inner_format");
    Help4.require("html.core.transformation.outer_format");
    Help4.require("html.core.transformation.cleanup");
    Help4.require("html.core.selection.selection");
    Help4.require("html.core.selection.range");
    Help4.require("html.core.selection.bookmark");
    Help4.require("html.core.history.history");
    Help4.require("html.core.clipboard.clipboard");
    Help4.require("html.core.clipboard.dom_cleaner");
    Help4.require("html.core.clipboard.msotohtml");
    Help4.require("html.core.clipboard.table");
    Help4.require("html.core.clipboard.uploader");
    Help4.require("html.core.event");
    Help4.require("html.core.control");
    Help4.require("html.core.iframe");
    Help4.require("html.core.core");
    Help4.require("html.core.editor_dom");
    Help4.require("html.core.textarea");
    Help4.require("html.core.preview");
    Help4.require("html.core.utils");
    Help4.require("html.core.link_builder");
    Help4.require("html.core.media_factory");
    Help4.require("html.core.command/base");
    Help4.require("html.core.command/insert");
    Help4.require("html.core.command/inline");
    Help4.require("html.core.command/font_color");
    Help4.require("html.core.command/font_name");
    Help4.require("html.core.command/font_size");
    Help4.require("html.core.command/del");
    Help4.require("html.core.command/direction");
    Help4.require("html.core.command/div");
    Help4.require("html.core.command/justify");
    Help4.require("html.core.command/list");
    Help4.require("html.core.command/paragraph");
    Help4.require("html.core.command/tab");
    Help4.require("html.core.command/table");
    Help4.require("html.core.command/toggleBackground");
    Help4.require("html.core.command/toggleOutline");
    Help4.require("html.core.command/paste");
    Help4.require("html.core.command/genai/genai");
    Help4.require("html.core.command/genai/content_patcher");

    Help4.require("xray.theme.Theme");
    Help4.require("xray.theme.belize");
    Help4.require("xray.theme.belizeplus");
    Help4.require("xray.theme.default");
    Help4.require("xray.theme.hcb");
    Help4.require("xray.theme.hcw");
    Help4.require("xray.theme.horizon");
    Help4.require("xray.theme.horizondark");
    Help4.require("xray.theme.light");
    Help4.require("xray.theme.quartz");
    Help4.require("xray.theme.quartzlight");
    Help4.require("xray.theme.sfsf");
    Help4.require("xray.theme._whatsnew");
    Help4.require("xray.theme._walkme");

    Help4.require("xray.controller.ControllerBase");
    Help4.require("xray.controller.Controller");
    Help4.require("xray.controller.CMP4");
    Help4.require("xray.controller.Persistence");
    Help4.require("xray.controller.EngineManager");
    Help4.require("xray.controller.helper.Helper");
    Help4.require("xray.controller.helper.Lightbox");
    Help4.require("xray.controller.helper.Bubbles");
    Help4.require("xray.controller.helper.Hotspots");
    Help4.require("xray.controller.helper.Messages");
    Help4.require("xray.controller.Handler");
    Help4.require("xray.controller.HandlerEvent");
    Help4.require("xray.controller.Help");
    Help4.require("xray.controller.Tour");
    Help4.require("xray.controller.Editor");
    Help4.require("xray.controller.EditorEvent");
    Help4.require("xray.controller.HelpEdit");
    Help4.require("xray.controller.TourEdit");

    Help4.require("xray.API");
    Help4.require("xray.WM");
    Help4.require("lib.dompurify");

    Help4.DOMPurify.addHook('uponSanitizeElement', (node, nodeConfig, options) => {
        // options.embedVideo: true - editmode, trust all iframes and allow to render
        // options.embedVideo: false || undefined - playback/preview mode, allow only if it has trusted wrapper (i.e content created using HTMLEditor)
        if (node.tagName === 'IFRAME' && !options.embedVideo) {
            const embeddedVideoWrapper = node.closest('div.video-iframe-wrapper');  // stable class name used by HTMLEditor to wrap the embedded video code
            return embeddedVideoWrapper ? node : node.parentNode?.removeChild(node);
        }
    });

    Help4.setOriginalObjects();
    Help4.observeMessages();

    (function() {
        if (Help4.Platform.iPad) {
            // XRAY-2208, XRAY-2212

            const _setWindowHeight = function() {
                Help4.setCssVariable('window-vh', window.innerHeight * 0.01 + 'px');
            };

            new Help4.observer.EventObserver(_setWindowHeight).observe(window, {type: 'resize'});
            _setWindowHeight();
        }
    })();

    // boot the whole system
    function _init(params /*, returnPromise*/) {
        const returnPromise = arguments[1] === true;
        const shellName = this.adapterTypeToName(params.type);
        if (shellName === null) return returnPromise ? Help4.Promise.resolve(null) : null;

        function checkInitializedShell() {
            const names = ['DesktopAssistant', 'Fiori', 'Shell', 'UI5'];
            let w = window;
            let s;

            while (true) {
                s = w.Help4 && w.Help4.shell;
                if (!s) return false;

                // XRAY-1766: do only allow one Shell
                for (let i = 0, name; name = names[i++];) {
                    // a shell is already instantiated; block all others
                    if (s[name] && s[name]._initialized) return true;
                }

                // XRAY-3817: if it is top window; break
                // if it is not top window; go to parent
                if (w === w.parent) {
                     return false;
                } else {
                    w = w.parent;
                }
            }
        }

        try {
            if (checkInitializedShell()) {
                return returnPromise ? Help4.Promise.resolve(null) : null;
            }
        } catch(e) {
        }

        // the protection code below is no longer needed due to XRAY-1766
        // as XRAY-1766 seems to be under discussion and might change I
        // leave it as is anyway
        const shells = Help4.shell;
        const shellClass = shells[shellName];
        if (shellClass) {
            // first init of a shell of this type
            const button = params._button;
            params._button = null;  // cannot be cloned
            shellClass._params = Help4.cloneObject(params);
            shellClass._params._button = params._button = button;

            const shellInstance = new shellClass(params);
            const shellId = shellInstance.getId();
            shellClass._initialized = shellId;
            shells[shellId] = shellInstance;

            const shellPromise = new Help4.Promise(function(resolve) {
                if (shellInstance.getShellReady()) {
                    resolve(shellInstance);
                } else {
                    shellInstance.onShellReady.addListener(function() {
                        resolve(shellInstance);
                    });
                }
            });

            return returnPromise ? shellPromise : shellInstance;
        }

        return returnPromise ? Help4.Promise.resolve(null) : null;
    }

    function _cleanup() {
        var s = this.shell;
        for (var i in s) {
            if (s.hasOwnProperty(i) && s[i] && typeof s[i].destroy === 'function') {
                s[i].destroy();
                s[i] = null;
            }
        }
    }

    function _getShell() {
        var s = this.shell;
        for (var i in s) {
            if (s.hasOwnProperty(i) && typeof s[i].getHelp === 'function') return s[i];
        }
        return null;
    }

    function _getController(/*controllerId*/) {
        var cid = arguments[0];
        var s = this.shell;

        for (var i in s) {
            if (s.hasOwnProperty(i) && typeof s[i].getHelp === 'function') {
                if (cid) {
                    var h = s[i].getHelp();
                    if (h.getId() === cid) return h;
                } else {
                    return s[i].getHelp();
                }
            }
        }
        return null;
    }
})();