{"version":3,"file":"static/js/cgp-sdk.5f84e077.chunk.js","mappings":"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","sources":["app-react/services/geo-location/strategies/geo-location.strategy.interface.ts","common/const/service-worker-constants.ts","common/const/token_type.ts","common/utils/controlled-promise.ts","sdk/src/base/base_component.ts","sdk/src/base/base_model.ts","sdk/src/base/base_model_component.ts","sdk/src/base/base_model_service.ts","sdk/src/base/base_object.ts","sdk/src/base/base_service.ts","sdk/src/base/base_singleton.ts","sdk/src/components/live_feeds/game_jackpot/game_jackpot_component_controller.js","sdk/src/components/message/message_consts.js","sdk/src/components/options/option_components/base_options_component_controller.js","sdk/src/components/options/option_components/base_options_model.js","sdk/src/components/options/option_components/inactivity_timeout_settings/inactivity_timeout_settings_controller.js","sdk/src/components/options/option_components/reminder_settings/reminder_settings_model.js","sdk/src/components/options/option_components/reminder_settings/reminder_settings_const.js","sdk/src/components/options/option_components/reminder_settings/reminder_settings_component_controller.js","sdk/src/components/options/option_components/touch_id/touch_id_component_consts.js","sdk/src/components/options/option_components/touch_id/touch_id_model.js","sdk/src/components/options/option_components/touch_id/Screens/touch_id_screen_base.js","sdk/src/components/options/option_components/touch_id/Screens/touch_id_screen_init.js","sdk/src/components/options/option_components/touch_id/Screens/touch_id_screen_modify.js","sdk/src/components/options/option_components/touch_id/touch_id_component_controller.js","sdk/src/components/options/options_component_controller.js","sdk/src/components/overlay/overlay_const.ts","sdk/src/components/clock/clock_controller_component.ts","sdk/src/base/component_renderer.ts","sdk/src/core/directive.js","sdk/src/core/initialize.js","sdk/src/core/api.ts","sdk/src/sdk-version.ts","sdk/src/services/ab_testing/ab_testing_service.ts","sdk/src/services/ai_list/ai_list_service_interface.ts","sdk/src/services/ai_list/ai_list_service.ts","sdk/src/services/analytics/analytics_service.ts","sdk/src/services/analytics/casinofied_analytics_proxy_service.ts","sdk/src/services/bonus_abuse/bonus_abuse_parking_money_in_sport_and_poker_service.ts","sdk/src/services/cashier_proxy/cashier_proxy_service.ts","sdk/src/services/clock/clock_service.ts","sdk/src/services/clock/clock_service_consts.ts","sdk/src/services/component_factory/component_factory_service.js","sdk/src/services/config/config_service.ts","sdk/src/services/country/country_service.ts","sdk/src/services/currency/currency_consts.ts","sdk/src/services/currency/currency_service.ts","sdk/src/services/domain_detection/domain_detection_service.ts","sdk/src/services/evolution/evolution_service.ts","sdk/src/services/external_links_proxy/external_links_proxy_service.ts","sdk/src/services/game/companies_names_consts.ts","sdk/src/services/game/game_runner_proxy_service.ts","sdk/src/services/game/game_service.js","sdk/src/services/game_manager/game_manager_model.js","sdk/src/services/game_manager/game_manager_service.js","sdk/src/services/game_reason/game_reason_consts.js","sdk/src/services/game_reason/game_reason_service.js","sdk/src/services/games_correlation/games_correlation_service.js","sdk/src/services/games_information/games_diagnostic_messages.js","sdk/src/services/games_information/games_info_cache.ts","sdk/src/services/games_information/games_information_service.ts","sdk/src/utils/http_loader.ts","sdk/src/services/games_questionnaire/games_questionnaire_service.ts","sdk/src/services/gnwp/gnwp_model.ts","sdk/src/services/gnwp/gnwp_service.ts","sdk/src/services/gnwp/gnwp_consts.js","sdk/src/services/gnwp/gnwp_response.ts","sdk/src/services/history/history_service.ts","sdk/src/services/http/http2_service.ts","sdk/src/services/hybrid/features/3d_touch/three_d_touch_consts.js","sdk/src/services/hybrid/features/3d_touch/three_d_touch_model.js","sdk/src/services/hybrid/features/3d_touch/three_d_touch_hybrid_feature.js","sdk/src/services/hybrid/features/deep_link/deep_link_hybrid_consts.js","sdk/src/services/hybrid/features/deep_link/deep_link_model.js","sdk/src/services/hybrid/features/deep_link/deep_link_hybrid_feature.js","sdk/src/services/hybrid/features/depositwidget/deposit_widget_hybrid_feature.js","sdk/src/services/hybrid/features/device_detection/device_detection_hybrid_consts.js","sdk/src/services/hybrid/features/device_detection/device_detection_hybrid_feature.js","sdk/src/services/hybrid/features/fabric/fabric_hybrid_consts.js","sdk/src/services/hybrid/features/fabric/fabric_hybrid_model.js","sdk/src/services/hybrid/features/fabric/fabric_hybrid_feature.js","sdk/src/services/hybrid/features/firebase/firebase_hybrid_consts.js","sdk/src/services/hybrid/features/firebase/firebase_hybrid_feature.js","sdk/src/services/hybrid/features/game_launcher/game_launcher_hybrid_feature.js","sdk/src/services/hybrid/features/geo/geo_hybrid_consts.ts","sdk/src/services/hybrid/features/geo/geo_hybrid_model.js","sdk/src/services/hybrid/features/geo/geo_hybrid_feature.js","sdk/src/services/hybrid/features/info/info_hybrid_model.js","sdk/src/services/hybrid/features/info/info_hybrid_consts.js","sdk/src/services/hybrid/features/info/info_hybrid_feature.js","sdk/src/services/hybrid/features/lexis_nexis/lexis_nexis_hybrid_consts.js","sdk/src/services/hybrid/features/lexis_nexis/lexis_nexis_hybrid_feature.js","sdk/src/services/hybrid/features/lobby_pop_up/lobby_pop_up_hybrid_feature.js","sdk/src/services/hybrid/features/migration/migration_hybrid_feature.js","sdk/src/services/hybrid/features/native_logs/native_logs_hybrid_consts.js","sdk/src/services/hybrid/features/native_logs/native_logs_hybrid_feature.js","sdk/src/services/hybrid/features/on_demand/on_demand_hybrid_consts.js","sdk/src/services/hybrid/features/on_demand/on_demand_hybrid_model.js","sdk/src/services/hybrid/features/on_demand/on_demand_hybrid_feature.js","sdk/src/services/hybrid/features/on_demand/on_demand_nyx_hybrid_feature.js","sdk/src/services/hybrid/features/push/push_hybrid_consts.js","sdk/src/services/hybrid/features/push/push_hybrid_model.js","sdk/src/services/hybrid/features/push/push_hybrid_feature.js","sdk/src/services/hybrid/features/rating_popup/rating_popup_hybrid_feature.js","sdk/src/services/hybrid/features/scheme/scheme_hybrid_feature.js","sdk/src/services/hybrid/features/serial/providers/appsflyer/app_flayer_const.js","sdk/src/services/hybrid/features/serial/serial_hybrid_feature.js","sdk/src/services/hybrid/features/touch_id/touch_id_consts.js","sdk/src/services/hybrid/features/touch_id/touch_id_model.js","sdk/src/services/web_login/web_login_consts.js","sdk/src/services/hybrid/features/touch_id/touch_id_hybrid_feature.js","sdk/src/services/hybrid/features/url_scheme/url_scheme_consts.js","sdk/src/services/hybrid/features/url_scheme/url_scheme_model.js","sdk/src/services/hybrid/features/url_scheme/url_schema__params_map.js","sdk/src/services/hybrid/features/url_scheme/url_scheme_hybrid_feature.js","sdk/src/services/hybrid/features/web_view_manager/web_view_manager_consts.js","sdk/src/services/hybrid/features/web_view_manager/base_web_view.js","sdk/src/services/hybrid/features/web_view_manager/master_web_view.js","sdk/src/services/hybrid/features/web_view_manager/second_web_view.js","sdk/src/services/hybrid/features/web_view_manager/safari_web_view.js","sdk/src/services/hybrid/features/web_view_manager/web_view_manager_model.js","sdk/src/services/hybrid/features/web_view_manager/web_view_manager_hybrid_feature.js","sdk/src/services/hybrid/native/native.js","sdk/src/services/hybrid/native/native_ios.js","sdk/src/services/hybrid/native/native_android.js","sdk/src/services/hybrid/native/native_ios_poker.js","sdk/src/services/hybrid/native/native_ios_sport.js","sdk/src/services/hybrid/hybrid_factory.js","sdk/src/services/hybrid/wait-for-hybrid-game-step-logic-handler.js","sdk/src/services/hybrid/hybrid_service.js","sdk/src/services/hybrid/hybrid_version_handler_model.js","sdk/src/services/hybrid/hybrid_version_handler_service.js","sdk/src/services/idle_recommendations/idle_recommendations_service.ts","sdk/src/services/integration/integration_model.js","sdk/src/services/integration/vendors/base_integration.js","sdk/src/services/integration/vendors/b2c/integration_b2c.js","sdk/src/services/integration/integration_service.js","sdk/src/services/jackpot_toasters/jackpot_toasters_consts.ts","sdk/src/services/jackpot_toasters/jackpot_toasters_service.ts","sdk/src/services/language/language_service.ts","sdk/src/services/links_navigation_proxy/links_navigation_proxy_service.ts","sdk/src/services/live_feeds/jackpots/games_jackpots_publisher.js","sdk/src/services/live_feeds/jackpots/jackpot_feeds_reader.ts","sdk/src/services/live_feeds/jackpots/jackpot_feeds_service_dependencies_factory.ts","sdk/src/services/live_feeds/jackpots/jackpot_feeds_service.ts","sdk/src/services/live_tables/live_tables_store.ts","sdk/src/services/live_tables/live_tables_service.ts","sdk/src/components/message/message_button.js","sdk/src/components/message/message_model.ts","sdk/src/components/message/message_component.ts","sdk/src/services/message_manager/message_manager_service.ts","sdk/src/services/netent/netent_extend.ts","sdk/src/services/netent/netent_service.ts","sdk/src/services/oauth/states/login_time_analytics.js","sdk/src/services/oauth/oauth2_backend_proxy.ts","sdk/src/services/oauth/states/oauth2_state.js","sdk/src/services/oauth/tokens/empty_token.js","sdk/src/services/oauth/tokens/token.js","sdk/src/services/oauth/states/oauth2_authorized_state.js","sdk/src/services/oauth/states/oauth2_anonymous_state.js","sdk/src/services/oauth/states/oauth2_state_factory.js","sdk/src/services/oauth/inactivity_timeout_settings_persister.js","sdk/src/services/oauth/oauth2_service.js","sdk/src/services/oauth/oauth_const.ts","sdk/src/services/oauth/states/user_scroll_detector.js","sdk/src/services/oauth/states/user_activity_detector.js","sdk/src/services/oauth/user/user_service.ts","sdk/src/services/observable_factory/observable_factory_service.ts","sdk/src/services/orbit_component_renderer/orbit_component_render_service.ts","sdk/src/services/overlay_manager/overlay_manager_types.ts","sdk/src/components/overlay/overlay_component_controller.ts","sdk/src/components/overlay/overlay_wrapper_component_controller.ts","sdk/src/exceptions/base/extendable_error.js","sdk/src/exceptions/overlay/overlay_exception.js","sdk/src/services/overlay_manager/queue_model.ts","sdk/src/services/overlay_manager/overlay_manager_service.ts","sdk/src/services/overlay_manager/overlay_managers_const.ts","sdk/src/services/player-migration/player_migration_proxy_service.ts","sdk/src/services/player_messages_service/fallback/fallback_handlers_dependencies_factory.js","sdk/src/services/player_messages_service/fallback/fallback_service.js","sdk/src/services/player_messages_service/fallback/fallback_service_consts.js","sdk/src/services/player_messages_service/fallback/base_fallback_handler.js","sdk/src/services/player_messages_service/fallback/handlers/wallet_fallback_handler.ts","sdk/src/services/player_messages_service/firebase/firebase_elastic_service.ts","sdk/src/services/player_messages_service/firebase/firebase_handler_base.ts","sdk/src/services/player_messages_service/firebase/handlers/bankroll_handler.ts","sdk/src/services/player_messages_service/firebase/handlers/freeplay_handler.ts","sdk/src/services/player_messages_service/firebase/handlers/gamblingsession_handler.ts","sdk/src/services/player_messages_service/firebase/firebase_const.ts","sdk/src/services/player_messages_service/firebase/handlers/messages_handler.ts","sdk/src/services/player_messages_service/firebase/handlers/netposition_handler.ts","sdk/src/services/player_messages_service/player_messages_consts.js","sdk/src/services/player_messages_service/main/main_proxy_consts.js","sdk/src/services/player_messages_service/main/main_restriction_parser.js","sdk/src/services/player_messages_service/main/main_proxy_strategy.js","sdk/src/services/player_messages_service/firebase/firebase_strategy.ts","sdk/src/services/player_messages_service/player_messages_factory.js","sdk/src/services/player_messages_service/player_messages_service.js","sdk/src/services/post_message/post_message_service.js","sdk/src/services/query_string_detector/query_string_detector_service.js","sdk/src/services/recently_played/recently_played_service.ts","sdk/src/services/regulation/regulation_model.js","sdk/src/services/regulation/helpers/session_timer_logic_helper.ts","sdk/src/services/regulation/helpers/generic_reality_check_message_handler.ts","sdk/src/services/regulation/regulations/base_regulation.ts","sdk/src/services/regulation/regulations/default_regulation.js","sdk/src/services/regulation/helpers/temp_account_message_helper.ts","sdk/src/services/regulation/regulations/italy/italy_regulation.js","sdk/src/services/regulation/regulations/denmark/logging/dk_structured_logging.js","sdk/src/services/regulation/regulations/denmark/dk_regulation.js","sdk/src/services/regulation/regulations/spain/spain_regulation.ts","sdk/src/services/regulation/regulations/sweden/logging/sweden_structured_logging.js","sdk/src/services/regulation/regulations/sweden/sweden_regulation.js","sdk/src/services/regulation/regulations/sweden/mrgreen_sweeden_regulation.js","sdk/src/services/regulation/regulations/portugal/portugal_regulation.ts","sdk/src/services/regulation/regulations/uk/uk_regulation.ts","sdk/src/services/regulation/regulations/romania/romania_regulation.ts","sdk/src/services/regulation/regulations/sh/sh.js","sdk/src/services/regulation/regulations/com/com_base_regulation.ts","sdk/src/services/regulation/regulations/com/malta/malta_regulation.ts","sdk/src/services/regulation/regulations/netherlands/netherlands_regulation.ts","sdk/src/services/regulation/regulations/com/gib/gib_regulation.js","sdk/src/services/regulation/regulations/us/us_base_regulation.ts","sdk/src/services/regulation/regulations/us/new_jersey/new_jersey_regulation.ts","sdk/src/components/regulation_components/helpers/reality_check/generic_reality_check_component_model.js","sdk/src/components/regulation_components/helpers/reality_check/generic_reality_check_component.js","sdk/src/services/regulation/helpers/reality_check_with_confirmation_message_handler.ts","sdk/src/services/regulation/regulations/germany/germany_regulation.ts","sdk/src/services/regulation/regulations/canada/ontario/canada_ontario_regulation.ts","sdk/src/services/regulation/regulations/michigan/michigan_regulation.ts","sdk/src/services/regulation/regulations/denmark/mrgreen_denmark_regulation.js","sdk/src/services/regulation/regulations/regulation_factory.js","sdk/src/services/regulation/regulation_service.js","sdk/src/services/resize_detector/resize_detector_model.js","sdk/src/services/resize_detector/resize_detector_service.js","sdk/src/services/restrictions/values/no_restriction_value.ts","sdk/src/services/restrictions/messages/restriction_messages.ts","sdk/src/services/restrictions/values/generic_restriction_value.ts","sdk/src/services/restrictions/pool/value_factory.ts","sdk/src/services/restrictions/pool/restrictions_pool.ts","sdk/src/services/restrictions/strategies/restrictions_strategy_base.ts","sdk/src/services/restrictions/strategies/anonymous_restrictions_strategy.ts","sdk/src/services/restrictions/strategies/authorized_restrictions_strategy.ts","sdk/src/services/restrictions/restrictions_service.ts","sdk/src/services/script_loader/script_loader_service.ts","sdk/src/services/service_factory.ts","sdk/src/services/services_registry.ts","sdk/src/services/skin/product_package/product_package.ts","sdk/src/services/hybrid/features/serial/serial_const.js","sdk/src/services/hybrid/features/serial/providers/appsflyer/app_flayer_model.js","sdk/src/services/hybrid/features/serial/providers/appsflyer/app_flayer.js","sdk/src/services/hybrid/features/serial/providers/provider.js","sdk/src/services/skin/serial/serial.js","sdk/src/services/skin/info/info_model.js","sdk/src/services/skin/info/info.js","sdk/src/services/skin/skin_service.ts","sdk/src/services/spinner_proxy_service/spinner_proxy_service.ts","sdk/src/services/structured_logging/builders/log-event-header-builder.ts","sdk/src/services/structured_logging/builders/log-event-data-builder.ts","sdk/src/services/structured_logging/builders/log-device-data-builder.ts","sdk/src/services/structured_logging/builders/log-client-data-builder.ts","sdk/src/services/structured_logging/elastic_logger.ts","sdk/src/services/structured_logging/structured_logging_service.ts","sdk/src/services/themes/themes_consts.js","sdk/src/services/themes/themes_model.js","sdk/src/services/themes/themes_service.js","sdk/src/services/time/time_service.ts","sdk/src/services/toaster/toaster_proxy_service.ts","sdk/src/services/trackjs/trackjs_service.ts","sdk/src/services/visibility_detector/visibility_detector_service.ts","sdk/src/services/wallet/wallet_service.js","sdk/src/services/web_login/action_handlers/action_handler_base.js","sdk/src/services/web_login/action_handlers/close_actionhandler.js","sdk/src/services/web_login/action_handlers/externallink_actionhandler.js","sdk/src/services/web_login/action_handlers/forgot_your_password_actionhandler.js","sdk/src/services/web_login/action_handlers/forgot_your_username_actionhandler.js","sdk/src/services/web_login/action_handlers/onredirectlink_actionhandler.js","sdk/src/services/web_login/action_handlers/playforfun_actionhandler.js","sdk/src/services/web_login/action_handlers/registration_actionhandler.js","sdk/src/services/web_login/action_handlers/submit_actionhandler.js","sdk/src/services/web_login/error_handlers/login_error_hadler_base.js","sdk/src/services/web_login/error_handlers/pending_action_errorhandler.js","sdk/src/services/web_login/error_handlers/token_not_valid_errorhandler.js","sdk/src/services/web_login/web_login_component.js","sdk/src/services/web_login/events_object_builder.js","sdk/src/services/web_login/init_object_builder.js","sdk/src/services/web_login/login_error_handler.js","sdk/src/services/web_login/web_login_service_dependencies_factory.js","sdk/src/services/web_login/web_login_service.js","sdk/src/services/web_push/web_push_service.ts","sdk/src/services/window/window_service.ts","sdk/src/utils/date_time_utils.ts","sdk/src/utils/module_loader.js","sdk/src/utils/observable.ts","sdk/src/utils/observable_factory.ts","sdk/src/utils/reconnect_helper.ts","sdk/src/components/live_feeds/game_jackpot/view/game_jackpot.html","sdk/src/components/message/view/message.html","sdk/src/components/message/view/title_template.html","sdk/src/components/options/option_components/inactivity_timeout_settings/view/inactivity_timeout_settings.html","sdk/src/components/options/option_components/reminder_settings/view/reminder_settings.html","sdk/src/components/options/option_components/touch_id/view/touch_id_init.html","sdk/src/components/options/option_components/touch_id/view/touch_id_modify.html","sdk/src/components/overlay/view/overlay-close-strip.html","sdk/src/components/overlay/view/overlay-content.html","sdk/src/components/regulation_components/helpers/reality_check/view/generic_reality_check.html","sdk/src/components/regulation_components/helpers/reality_check/view/session_cooldown_reality_check.html","sdk/src/components/options/option_components|sync|/^.*(controller)/.js$","sdk/src/components|sync|/^.*(controller)/.js$","sdk/src/services/hybrid/features|sync|/^.*(_hybrid_feature)/.js$","sdk/src/services/player_messages_service/fallback/handlers|sync|/^.*(handler)/.[jt]s$","sdk/src/services/player_messages_service/firebase/handlers|sync|/^.*(handler)/.[jt]s$","sdk/src/services/web_login/action_handlers|sync|/^.*(_actionhandler)/.js$","sdk/src/services/web_login/error_handlers|sync|/^.*(_errorhandler)/.js$","sdk/src/services|sync|/^.*(service)/.(js%7Cts)$"],"sourcesContent":["import {IModalDialogHandler} from \"../../dialog/dialog.service.interface\";\nimport {GeoComplyFailureReason} from \"./geo-comply-error-codes\";\nimport {GeoLocationAnalytics} from \"../geo-location-analytics\";\nimport {IGeoRestrictionsUpdateEventParams} from \"../../sdk/sdk-events\";\n\nexport enum GeoLocationReason {\n Login = 'Login',\n Periodic = 'Periodic',\n Retry = 'Retry',\n //AutoRetry = 'Auto Retry',\n OpenRealGame= 'OPEN_REAL_GAME'\n};\n\n\nexport interface IGeoLocationStrategyRunParams {\n licenseKey: string;\n licenseWebKey: string;\n locationTransactionId: string;\n mobileNumber: string;\n reason: GeoLocationReason;\n progressIndicator?: IModalDialogHandler;\n analytics: GeoLocationAnalytics;\n\n}\n\nexport interface IGeoComplyError {\n errorCode: number;\n errorMessage: string;\n}\n\nexport interface IGeoComplyFailure {\n geoComplyError?: IGeoComplyError;\n additionalFailureReason: GeoComplyFailureReason;\n}\n\nexport interface IGeoComplyResponse {\n data?: string;\n failure?: IGeoComplyFailure;\n}\n\nexport enum GeoValidationResult {\n Fail,\n Pass\n}\n\nexport interface IGeoRunResult {\n geoComplyFailure?: IGeoComplyFailure;\n validationResult: GeoValidationResult;\n kickParams?: IGeoRestrictionsUpdateEventParams;\n\n}\n\nexport interface IGeoLocationStrategy {\n readonly shouldReloadOnGeoRetry: boolean;\n runGeoLocation(params: IGeoLocationStrategyRunParams): Promise;\n dispose(): void;\n}","export const QA_ENV_URBAN_DEFAULT_SETTINGS = {\n defaultIcon: 'https://mirage-orbit-latest-eu.888casino.com/configurations/888casino_com/assets/images/888casinologo-mobile.svg',\n defaultTitle: '888Casino',\n defaultActionURL: 'https://mirage-orbit-latest-eu.888casino.com',\n appKey: '64FbuTbIS9aQUIwB0cWoMA',\n token: 'MTo2NEZidVRiSVM5YVFVSXdCMGNXb01BOkFVRXNxa2hEUE5rZUtTOW1DLVdvR3hwMHNjdHEtNF9xLXJ1M3ZGazVJWEU',\n vapidPublicKey: 'BJOvGd2nCaeEGqqKnsJJhWmJzMvJqO4t3wSCqzVJ6uhHWw3891tqJhs8muo958dtbggZe4vM122EtKE9HkvUf9U='\n};\n\nexport const PWA_PROMPT_EVENT = \"pwaPromptEvent\";\nexport const PWA_PROMPT_CALLBACK = \"pwaPromptCallback\";\nexport const PWA_INSTALLED_CALLBACK = \"pwaInstalledCallback\";\nexport const PWA_SHOULD_AUTO_POPUP_LOCAL_STORAGE_KEY = \"orbit-pwa-should-auto-popup\";\n\n","export enum TokenType {\n AuthenticationToken = 1,\n TouchID = 2,\n RememberMe = 3,\n NemIdToken = 4,\n MFAToken = 5,\n PendingActionToken = 6,\n BankIdToken = 7,\n MigrationToken = 8\n}","export class ControlledPromise {\n\n private readonly _promise: Promise;\n private _resolve;\n private _reject;\n constructor() {\n this._promise = new Promise((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n }\n\n public waitForPromise(): Promise {\n return this._promise;\n }\n\n public resolve(data?: T): Promise {\n this._resolve(data);\n return this._promise;\n }\n\n public reject(err?: any): Promise {\n this._reject(err);\n return this._promise;\n }\n\n public then(callBack?: (response?: T) => void) {\n return this._promise.then((data) => {\n if(callBack) {\n return callBack(data);\n } else {\n return data;\n }\n });\n }\n\n public catch(callBack?: (error?: any) => void) {\n return this._promise.catch((err) => {\n if(callBack) {\n return callBack(err);\n } else {\n return err;\n }\n });\n }\n}","import BaseObject from './base_object';\nimport DOM, { DomEventSubscription, TimeoutSubscription } from '../utils/dom';\nimport _ from '../utils/underscore';\nimport Strings from '../utils/strings';\nimport Event, { SystemEventSubscription } from '../utils/event';\nimport ServiceFactory from '../services/service_factory';\nimport { SYSTEM_EVENTS } from '../events/events';\nimport { BaseComponentParams, IBaseComponent } from './base_component_interface';\nimport { IOverlayClasses } from '../services/overlay_manager/overlay_manager_service_interface';\nimport {TimeIntervalName} from '../../../common/utils/time-interval-names';\n\nexport default class BaseComponent extends BaseObject implements IBaseComponent {\n static CLASS = 'BaseComponent';\n\n protected _selector = 'cgp-component';\n\n protected serviceFactory: ServiceFactory;\n\n private _isDirective: boolean;\n private _styleSelectors: any;\n\n private el: HTMLElement;\n\n protected innerComponentsRef = new Array();\n private _systemEventsSubscriptions = new Array();\n private _domEventsSubscriptions = new Array();\n private _timeoutSubscriptions = new Array();\n private _intervalSubscriptions = new Array();\n\n /**\n * @constructor\n */\n protected init(params: BaseComponentParams) {\n super.init(params);\n params = params || {} as BaseComponentParams;\n this.serviceFactory = params.serviceFactory || ServiceFactory.create();\n this._isDirective = params.isDirective;\n this._styleSelectors = Object.assign({}, this.getDefaultStyleSelectors(), _.isObject(params.styleSelectors) ? params.styleSelectors : _.safeJSON(params.styleSelectors));\n\n this.el = this.createRootElement(this.bake(params.innerHtml));\n\n // Add component root selector.\n this.addClass(this._selector);\n this.addClass(this._getIsolationSelector());\n this._setPropertiesSelectors();\n\n //AB testing\n const abTestingParams = this.serviceFactory.abTestingService().getAbTestingDataForFeature(this.getClassName());\n if (abTestingParams) {\n this.applyABTestingStyleClass(abTestingParams)\n }\n }\n\n protected _getIsolationSelector(): string {\n return 'cgp-isolation';\n }\n\n\n protected createRootElement(innerHtml: string = ''): HTMLElement {\n return DOM.createElement('div', innerHtml);\n }\n\n\n start(): BaseComponent {\n return this;\n }\n\n getStyleSelectors(): any {\n return this._styleSelectors;\n }\n\n getDefaultStyleSelectors(): any {\n return {};\n }\n\n getEl(): HTMLElement {\n return this.el;\n }\n\n setHTML(html: string): BaseComponent {\n if (!html) {\n this.logger.error('an html to set on the component is not defined');\n return this;\n }\n\n DOM.html(html, this.el);\n\n return this;\n }\n\n render(componentEl): BaseComponent {\n if (!_.isElement(componentEl)) {\n this.logger.error('Could not render not dom element type --> ', typeof componentEl);\n throw new Error();\n }\n\n // Clean current element html markup.\n DOM.html('', this.el);\n DOM.append(this.el, componentEl);\n\n return this;\n }\n\n\n /**\n * Process html to cgp manipulation html,\n * For example language support or show item support (show remember me show wallet etc..)\n */\n bake(html: string, bindingParams = {}): string {\n if(!html) {\n return html;\n }\n\n const string = new Strings(html),\n bindingArray = string.getCurlyBracesBinding();\n\n\n bindingArray.forEach((bind) => {\n const bindingFunction = this[bind.fn].bind(this);\n if (!bind.fn || !_.isFunction(bindingFunction)) {\n return;\n }\n html = html.replace('{' + bind.to + '}', bindingFunction(bind.value, bindingParams));\n });\n\n return html;\n }\n\n _model = {};\n /**\n * Show check if we decide to display a show html function.\n */\n protected show(method: string, bindingParams: object): string {\n const html = this._model['get' + method]();\n return html ? this.bake(html, bindingParams) : '';\n }\n\n\n /**\n * Return textual value for specific model parameter.\n */\n protected text(value: string): string {\n const text = this._model[value];\n return text;\n }\n\n\n /**\n * Binding function, translate the raw html into locale language.\n */\n protected translate(key: string, bindingParams?: object): string {\n return ServiceFactory.create().languageService().translation(key, bindingParams);\n }\n\n /**\n * inject the variable and then translate him\n * @param value\n * @param bindingParams\n * @returns {string}\n */\n protected injectAndTranslate(value, bindingParams) {\n const key = this.inject(value, bindingParams);\n return this.translate(key, bindingParams);\n }\n\n /**\n * Inject string into html.\n */\n protected inject(value, bindingParams) {\n if (!_.isString(value)) {\n value = value.toString();\n }\n //Required by FreePlayVoucherComponentController for NJ - working with old platform\n if (bindingParams[value] === '') {\n return bindingParams[value];\n }\n\n if (bindingParams[value]) {\n return bindingParams[value];\n }\n\n return value;\n }\n\n\n onAppendedToDOM(): void {\n this.innerComponentsRef.forEach(childComponent => {\n childComponent.onAppendedToDOM();\n });\n }\n\n getOverlayClasses(): IOverlayClasses {\n return null;\n }\n\n\n isDirective(): boolean {\n return this._isDirective;\n }\n\n protected _setPropertiesSelectors(): void {\n\n const styleSelectors = this.getStyleSelectors();\n if (!styleSelectors) {\n return;\n }\n Object.keys(styleSelectors).forEach((selectorKey) => {\n this.setClassSelectorToEl(this.getPropertiesStyleMapper()[selectorKey], styleSelectors[selectorKey]);\n });\n }\n\n\n /**\n * Add class selector to all specified elements into the component\n */\n protected setClassSelectorToEl(elClass, selector): void {\n if (!elClass) {\n return;\n }\n const contentElements = this.getEl().getElementsByClassName(elClass);\n for (let i = 0; i < contentElements.length; i++) {\n DOM.addClass(contentElements[i], selector);\n }\n }\n\n\n /**\n * Get mapper for style selectors\n */\n protected getPropertiesStyleMapper(): any {\n return {};\n }\n\n /**\n * Get internal component element by its class name\n */\n getDOMElementByClassName(className): Element {\n return this.getEl().getElementsByClassName(className)[0];\n }\n\n\n /**\n * Remove all resource that were used by component\n */\n shutDown(): void {\n this._detachSystemEvents();\n this._detachDOMEvents();\n this._clearTimeouts();\n this._shutDownChildComponents();\n }\n\n protected _detachSystemEvents(): void {\n Event.detachEvents(this._systemEventsSubscriptions);\n this._systemEventsSubscriptions = new Array();\n }\n\n private _detachDOMEvents(): void {\n this._domEventsSubscriptions.forEach(subscription => subscription.remove());\n this._domEventsSubscriptions = [];\n }\n\n private _shutDownChildComponents(): void {\n this.innerComponentsRef.forEach(comp => {\n comp.shutDown();\n });\n this.innerComponentsRef = [];\n };\n\n private _clearTimeouts(): void {\n this._timeoutSubscriptions.forEach((ref) => {\n DOM.clearTimeout(ref);\n });\n\n this._timeoutSubscriptions = [];\n }\n\n querySelector(selector): Element {\n return this.getEl().querySelector(selector);\n }\n\n querySelectorAll(selector: string): Element[] {\n const result: any = this.getEl().querySelectorAll(selector);\n\n return result as Element[];\n }\n\n appendChildComponent(childComponent: BaseComponent, containerSelector?: string): void {\n if(containerSelector) {\n const parentElement = this.querySelector(containerSelector);\n if(!parentElement) {\n this.throwError('291',`Can't add ${childComponent.getClassName()} component as child to ${this.getClassName()} because ${containerSelector} selector doesn't exists`, {childComponent, containerSelector});\n }\n\n parentElement.appendChild(childComponent.getEl());\n } else {\n this.getEl().appendChild(childComponent.getEl());\n }\n\n this.innerComponentsRef.push(childComponent);\n }\n\n removeChildComponent(childComponent: BaseComponent): void {\n const childComponentIndex = this.innerComponentsRef.findIndex((comp) => childComponent === comp);\n if(childComponentIndex >= 0) {\n DOM.removeElement(this.getEl(), childComponent.getEl());\n this.innerComponentsRef.splice(childComponentIndex, 1);\n childComponent.shutDown();\n }\n }\n\n addStyle(key: string, value: string): void {\n DOM.addStyle(this.getEl(), key, value);\n }\n\n removeStyle(key: string): void {\n DOM.removeStyle(this.getEl(), key);\n }\n\n addClass(className: string): void {\n DOM.addClass(this.getEl(), className);\n }\n\n hasClass(className): boolean {\n return DOM.hasClass(this.getEl(), className);\n }\n\n removeClass(className: string): void {\n DOM.removeClass(this.getEl(), className);\n }\n\n setAttribute(attribute: string , value: string): void {\n DOM.addAttribute(this.getEl(), attribute, value);\n }\n\n protected setInnerHtml(innerHtml: string, bindingParams = {}): void {\n DOM.html(this.bake(innerHtml, bindingParams), this.getEl());\n }\n\n protected onDOMEvent(element: Element, eventName: string, handler: EventListener): DomEventSubscription {\n const subscription = DOM.onDOMElementEvent(element, eventName, handler.bind(this));\n this._domEventsSubscriptions.push(subscription);\n return {\n remove: () => {\n subscription.remove();\n const index = this._domEventsSubscriptions.findIndex(item => item === subscription);\n if (index >= 0) {\n this._domEventsSubscriptions.splice(index, 1);\n }\n }\n }\n }\n\n protected onRootElementEvent(eventName: string, handler: EventListener): DomEventSubscription {\n return this.onDOMEvent(this.getEl(), eventName, handler);\n }\n\n protected onChildElementEvent(childElementSelector: string, eventName: string, handler: EventListener): DomEventSubscription {\n return this.onDOMEvent(this.querySelector(childElementSelector), eventName, handler);\n }\n\n protected onSystemEvent(eventName: string | string[], callback: Function): SystemEventSubscription {\n const subscription = Event.on(eventName, callback.bind(this), this);\n this._systemEventsSubscriptions.push(subscription);\n return this._createEventSubscription(subscription);\n }\n\n protected onceSystemEvent(eventName: string, callback: Function): SystemEventSubscription {\n const subscription = Event.once(eventName, callback, this);\n this._systemEventsSubscriptions.push(subscription);\n return this._createEventSubscription(subscription);\n }\n\n private _createEventSubscription(subscription: SystemEventSubscription): SystemEventSubscription {\n return {\n off: () => {\n subscription.off();\n const index = this._systemEventsSubscriptions.findIndex(item => item === subscription);\n if (index >= 0) {\n this._systemEventsSubscriptions.splice(index, 1);\n }\n }\n }\n }\n\n setInterval(callback: () => void, timeout: number, name?: TimeIntervalName): TimeoutSubscription {\n const timeoutRef = DOM.setInterval(callback, timeout, name);\n this._intervalSubscriptions.push(timeoutRef);\n\n return {\n clear: () => {\n clearInterval(timeoutRef);\n const indexOfTimeoutRef = this._intervalSubscriptions.findIndex(item => item === timeoutRef);\n if (indexOfTimeoutRef >= 0) {\n this._timeoutSubscriptions.splice(indexOfTimeoutRef, 1);\n }\n }\n };\n }\n\n setTimeout(callback: () => void, timeout: number, name?: TimeIntervalName): TimeoutSubscription {\n const timeoutRef = DOM.setTimeout(callback, timeout, name);\n this._timeoutSubscriptions.push(timeoutRef);\n return {\n clear: () => {\n DOM.clearTimeout(timeoutRef);\n\n const indexOfTimeoutRef = this._timeoutSubscriptions.findIndex(item => item === timeoutRef);\n if (indexOfTimeoutRef >= 0) {\n this._timeoutSubscriptions.splice(indexOfTimeoutRef, 1);\n }\n }\n };\n }\n\n _sendAnalytics(analyticsData) {\n const defaultAnalyticsData = {\n category: '[Technical-event]',\n };\n\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, Object.assign(defaultAnalyticsData, analyticsData));\n }\n\n hideRootElement(): void {\n DOM.hide(this.getEl());\n }\n\n showRootElement(): void {\n DOM.show(this.getEl());\n }\n\n applyABTestingStyleClass(properties: any): void {\n if (properties.Properties){\n if (properties.Properties['css-selector']) {\n DOM.addClass(this.getEl(), 'cgp-ab-' + properties.Properties['css-selector']);\n }\n }\n }\n}","import BaseObject from './base_object';\n\n/**\n *\n *\n *\n */\nexport default class BaseModel extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'BaseModel';\n\n /**\n *\n */\n init(params){}\n}\n","import BaseModel from './base_model';\n\nexport default class BaseModelComponent extends BaseModel {\n getStyleSelectors() {\n return {};\n }\n \n static CLASS = 'BaseModelComponent';\n}\n","import BaseModel from './base_model';\n\n/**\n *\n *\n *\n */\nclass BaseModelService extends BaseModel {\n static CLASS = 'BaseModelService';\n\n init(params) {}\n\n}\n\nexport default BaseModelService;","import Logger from '../utils/logger';\nimport _ from '../utils/underscore';\n\nexport interface IBaseObject {\n getClassName(): string;\n}\n\n/**\n *\n *\n * @description - BaseObject is the ancestor of all cgp entity, every one inherit from him\n * append on each entity global behavior such as logger or define if it's singleton or not.\n *\n */\nexport default class BaseObject {\n static create(params?: any): any {\n const $instance = new this(); // constructor SHOULD NOT GET ANYTHING... it's TEMPORARY HERE!\n\n if (_.isFunction($instance.init)) {\n $instance.init.apply($instance, arguments);\n }\n\n return $instance;\n }\n\n constructor() {\n this._createLogger();\n }\n\n\n protected init(params: any): void {\n }\n\n\tprotected logger: Logger;\n\n private _createLogger(): void {\n this.logger = new Logger(this.getClassName());\n }\n\n\n /**\n * This si a helper method for throwing an exception in a consistent and standard way\n * @param lineNumber - it must always take this value '43'\n * @param message - the error message\n * @param context - This parameter is optional and it can be used to\n * provide more information about the exception.\n */\n protected throwError(lineNumber: string, message: string, context?: any): void {\n const theError = {\n message: message,\n className: this.getClassName(),\n lineNumber: lineNumber,\n context: context,\n stackTrace: new Error().stack,\n };\n\n this.logger.error(theError);\n throw new Error(JSON.stringify(theError));\n }\n\n protected throwArgumentExpected(lineNumber: string, methodName: string, argumentName: string, context?: any): void {\n this.throwError(lineNumber, `${this.getClassName()}.${methodName} method expects parameter ${argumentName} which was not provided`, context);\n }\n\n protected reThrowError(lineNumber: string, message: string, innerError: any, context?: any): void {\n\n this.logger.error({\n message: message,\n className: this.getClassName(),\n lineNumber: lineNumber,\n context: context,\n stackTrace: new Error().stack,\n innerError: innerError,\n });\n\n throw innerError;\n\n }\n\n protected throwNotImplemented(lineNumber: string, methodName: string): void {\n this.throwError(lineNumber, `${this.getClassName()} doesn't implement ${methodName} method`);\n }\n\n getClassName(): string {\n\n const thisProto = Object.getPrototypeOf(this);\n\n if(thisProto.constructor.CLASS) {\n return thisProto.constructor.CLASS;\n } else {\n return thisProto.constructor.name;\n }\n\n\n }\n}\n","import BaseSingleton from './base_singleton';\nimport _ from '../utils/underscore';\nimport ServiceFactory from '../services/service_factory';\nimport Event, {SystemEventSubscription} from '../utils/event';\nimport { SYSTEM_EVENTS } from '../events/events';\nimport IBaseService, { CreateServiceFactoryFunction, ServiceDependencies } from './base_service_interface';\n\n\nexport default class BaseService extends BaseSingleton implements IBaseService {\n protected featureEnabled: boolean = true;\n private _isToggledAlready = false;\n private _systemEventsSubscriptions = new Array();\n\n protected init(params: any): void {\n super.init(params);\n if (params && params.featureEnabled === false) {\n this.featureEnabled = false;\n }\n\n if(this.shouldApplyFeatureToggleABTesting()) {\n Event.on([SYSTEM_EVENTS.OAUTH_STATE_CHANGE, SYSTEM_EVENTS.ON_INIT_COMPLETE], ()=>this.applyABTestingLogic(params), this)\n } else {\n Event.on(SYSTEM_EVENTS.ON_INIT_COMPLETE, ()=>this.toggleFeatureOn(params), this)\n }\n }\n\n private applyABTestingLogic(params: any): void{\n if(!this.serviceFactory.oAuth2Service().isAuthorized()) {\n return;\n }\n const abTestingParams = this.serviceFactory.abTestingService().getAbTestingDataForFeature(this.getClassName());\n if (abTestingParams && abTestingParams.Properties){\n const featureToggleProperty = this._safeGetPropertyLowerCase(abTestingParams.Properties,'featuretoggle');\n if (featureToggleProperty === 'true' && !this._isToggledAlready) {\n this._isToggledAlready = true;\n this.toggleFeatureOn(params);\n }\n }\n }\n\n protected shouldApplyFeatureToggleABTesting(): boolean {\n //override this function if service supports AB testing\n return false;\n }\n\n protected toggleFeatureOn(params: any): void{\n //override this function if service need to be initialized after getting AB testing parameters\n }\n\n private _safeGetPropertyLowerCase(properties,propertyName): string{\n if (properties[propertyName]){\n return properties[propertyName].toLowerCase();\n } else {\n return '';\n }\n }\n\n protected featureToggle(){\n return this.featureEnabled;\n }\n /**\n * can be override when service has async jobs to execute before app init complete.\n */\n doAsyncJobs(): Promise {\n return Promise.resolve();\n }\n\n\n /**\n * can be override when service has async jobs to execute after all services have being initialized\n */\n onInitializationCompleted(): Promise {\n return Promise.resolve();\n }\n\n private _createServiceFactoryFunction: CreateServiceFactoryFunction = null;\n protected get serviceFactory(): ServiceFactory {\n if (_.isNullOrUndefined(this._createServiceFactoryFunction)) {\n this.throwError('79', 'serviceFactory is not available at this time because it is not injected yet!', {className: this.getClassName()});\n }\n return this._createServiceFactoryFunction();\n }\n\n injectDependencies(dependencies: ServiceDependencies): void {\n this._createServiceFactoryFunction = dependencies.createServiceFactoryFunction;\n }\n\n // only for unit tests - so we will stop listen to events\n shutDown() {\n this._detachSystemEvents();\n }\n\n protected onSystemEvent(eventName: string | string[], callback: Function): SystemEventSubscription {\n const subscription = Event.on(eventName, callback.bind(this), this);\n this._systemEventsSubscriptions.push(subscription);\n return this._createEventSubscription(subscription);\n }\n\n protected onSystemEventOnce(eventName: string | string[], callback: Function): SystemEventSubscription {\n const subscription = Event.once(eventName, callback.bind(this), this);\n this._systemEventsSubscriptions.push(subscription);\n return this._createEventSubscription(subscription);\n }\n\n private _detachSystemEvents(): void {\n Event.detachEvents(this._systemEventsSubscriptions);\n this._systemEventsSubscriptions = new Array();\n }\n\n private _createEventSubscription(subscription: SystemEventSubscription): SystemEventSubscription {\n return {\n off: () => {\n subscription.off();\n const index = this._systemEventsSubscriptions.findIndex(item => item === subscription);\n if (index >= 0) {\n this._systemEventsSubscriptions.splice(index, 1);\n }\n }\n }\n }\n}\n\n","import BaseObject from './base_object';\nimport _ from '../utils/underscore';\n\nexport default class BaseSingleton extends BaseObject {\n\n static $instance = null;\n\n\n static create(params?: any): any {\n if (!_.isNull(this.$instance)) {\n return this.$instance;\n }\n\n this.$instance = super.create(params);\n\n return this.$instance;\n }\n\n /**\n * This method is mainly used in unit testing\n * in order to create a fresh instance on every test run\n */\n static reCreate(params?: any): any {\n this.$instance = null;\n return this.create(params);\n }\n}\n\n","import BaseComponent from '../../../base/base_component';\nimport DOM from '../../../utils/dom';\nimport _ from '../../../utils/underscore';\nimport {SYSTEM_EVENTS} from '../../../events/events';\n\n\nlet gameJackpotView = require('./view/game_jackpot.html');\n\nexport default class GameJackpotComponentController extends BaseComponent {\n static CLASS = 'GameJackpotComponentController';\n\n static DIRECTIVE = 'cgp-directive-game_jackpot';\n\n init(params) {\n params = params || {};\n params.innerHtml = gameJackpotView;\n this._gameType = params.gametypeid;\n\n super.init(params);\n this._subscribe();\n }\n\n start() {\n let jackpotValue = this.serviceFactory.jackpotFeedsService().getJackpotAmountInCentsByGame(this._gameType);\n this._displayJackpotValue(jackpotValue);\n }\n\n _subscribe() {\n this.onSystemEvent(SYSTEM_EVENTS.LIVE_FEEDS_JACKPOT_AMOUNTS_BY_GAME_UPDATED, this._onJackpotsUpdated);\n }\n\n get _liveFeedContentElement() {\n return this.querySelector('.cgp-live-feed-content');\n }\n\n _onJackpotsUpdated(gamesJackpots) {\n let jackpotValue = gamesJackpots[this._gameType];\n this._displayJackpotValue(jackpotValue);\n }\n\n _displayJackpotValue(jackpotValue) {\n if(!_.isNullOrUndefined(jackpotValue)) {\n DOM.text(this._liveFeedContentElement, this.serviceFactory.currencyService().formatMoney(jackpotValue));\n }\n }\n\n getPropertiesStyleMapper() {\n return {\n amount: 'cgp-live-feed-content'\n };\n }\n\n}","/**\n * Enum for message type\n * @readonly\n * @enum {string}\n */\nconst MESSAGE_TYPE = {\n INFO: 'info',\n WARNING: 'warning',\n ERROR: 'error',\n SUCCESS: 'success'\n};\n\nconst TEXT_ALIGNMENT = {\n CENTER: 'center',\n LEFT: 'left',\n RIGHT: 'right'\n}\n\nconst BUTTON_ALIGHT = {\n CENTER: 'center',\n LEFT: 'left',\n RIGHT: 'right'\n}\n\nconst BUTTON_TYPE = {\n MAIN: {\n typeName: 'main',\n class: 'cgp-themes-main-cta'\n },\n SECONDARY: {\n typeName: 'secondary',\n class: 'cgp-themes-base-cta'\n },\n CUSTOM: {\n typeName: 'custom'\n }\n}\n\nconst MDP_IMG_CSS_CLASS_SELECTORS = {\n COMMON_ERROR: 'cgp-mdp-common-error',\n LOGIN_ERROR_CONTACT_SUPPORT: 'cgp-mdp-login-error-contact-support',\n LOGIN_RESTRICTED_COUNTRY_ERROR: 'cgp-mdp-resticted-country-error',\n LOGIN_USERNAME_PASSWORD_WRONG: 'cgp-mdp-username-password-wrong',\n LOGIN_AGE_VERIFICATION_WARNING: 'cgp-mdp-login-age-verification-warning',\n LOGIN_CAPS_LOCK: 'cgp-mdp-login-caps-lock',\n GAME_LOW_RESOLUTION: 'cgp-mdp-game-low-resolution',\n GAME_RESTRICTED_ERROR: 'cgp-mdp-game-resticted-error',\n GAME_UNAVAILABLE: 'cgp-mdp-game-unavailable',\n GAME_REAL_MONEY_ONLY: 'cgp-mdp-game-real-money-only',\n OAUTH_INACTIVITY_WARNING: 'cgp-mdp-auth-inactivity-warning',\n OAUTH_DISCONNECT_NOTIFY: 'cgp-mdp-oauth-disconnect-notify',\n COOKIE_ENABLE_NOTIFY: 'cgp-cookie-enable-notify'\n};\n\nexport {BUTTON_ALIGHT, MDP_IMG_CSS_CLASS_SELECTORS, MESSAGE_TYPE, TEXT_ALIGNMENT, BUTTON_TYPE}","import BaseComponent from '../../../base/base_component';\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport {MESSAGE_TYPE} from '../../message/message_consts';\nimport Event from '../../../utils/event';\nimport {PRIORITY_LEVEL} from '../../../services/overlay_manager/overlay_manager_levels';\n\nclass BaseOptionsComponentController extends BaseComponent {\n\n static CLASS = 'BaseOptionsComponentController';\n\n /**\n * Render Component UI over Overlay\n *\n * @returns\n * @public\n */\n render() {\n if (this.start()) {\n //this._openInOverlay();\n this._openInMDP();\n\n }\n }\n\n\n _openInOverlay() {\n Event.fire(SYSTEM_EVENTS.OPEN_OVERLAY, {\n el: this.getEl(),\n priority: this.getOverlayPriority(),\n btnCloseCallback: () => {\n this.onCloseBtnClicked();\n },\n closeCallback: () => {\n this.onComponentClosed();\n },\n additionalClasses: ['cgp-options-component', 'cgp-mdp-dialog'],\n contentAdditionalClasses: ['cgp-theme-property-lb-corner-radius'],\n openCallback: () => {\n this._onComponentOpened();\n }\n });\n }\n\n\n /**\n * Open component over MDP message\n * @private\n */\n _openInMDP() {\n Event.fire(SYSTEM_EVENTS.MESSAGE_OPEN, {\n contentEl: this.getEl(),\n title: this._getOptionTitle(),\n closeButton: this._isCloseButtonEnabled(),\n hasDefaultButton: false,\n customCSSClassList: this._getCustomCSSClassList(),\n priority: this.getOverlayPriority(),\n buttons: this._getButtons(),\n openCallback: this.onComponentOpened.bind(this),\n closeCallback: this.onComponentClosed.bind(this),\n btnCloseCallback: this.onCloseBtnClicked.bind(this)\n });\n }\n\n\n /**\n * Get Custom CSS to create spicified selectors for option component\n * @returns {Array}\n */\n _getCustomCSSClassList() {\n return ['cgp-options-component'];\n }\n\n /**\n * close button display - the default is true\n */\n _isCloseButtonEnabled() {\n return true;\n }\n\n /**\n * Get option title. This title will be displayed in the title area of MDP\n */\n _getOptionTitle() {\n let titleLangKey = this._getTitleKey();\n if (titleLangKey) {\n return this.serviceFactory.languageService().translation(titleLangKey);\n }\n return '';\n }\n\n\n /**\n * Get buttons configuration to MDP\n * @returns {Array}\n * @private\n */\n _getButtons() {\n return [];\n }\n\n /**\n * @abstract\n * Get title language key\n * @private\n */\n _getTitleKey() {}\n\n /*\n * Remove Componwent UI from overlay\n * @depricated\n * @returns\n * @public\n */\n destroy() {\n Event.fire(SYSTEM_EVENTS.CLOSE_OVERLAY, {priority: this.getOverlayPriority()});\n }\n\n /**\n * Open error message dialog\n * @param text\n */\n openErrorMessage(text) {\n Event.fire(SYSTEM_EVENTS.MESSAGE_OPEN, {text: text, type: MESSAGE_TYPE.ERROR});\n }\n\n /**\n * Get options from model\n * @returns {object}\n */\n getOptions() {\n return this._model.getOptions();\n }\n\n\n /**\n * Get priority to option message\n * @returns {number}\n */\n getOverlayPriority() {\n return PRIORITY_LEVEL.POP_UP;\n }\n\n\n /**\n * Handle after component open action\n * @abstract\n * @protected\n */\n onComponentOpened() {}\n\n\n /**\n * Handle action on btn close clicked\n */\n onCloseBtnClicked() {}\n\n\n /**\n * Handle action after component was closed\n */\n onComponentClosed() {\n this.shutDown();\n }\n\n /**\n * Send analytcs message\n */\n reportAnalytics() {\n\n }\n\n}\n\nexport default BaseOptionsComponentController;\n\n","/**\n * Created by andreyna on 6/13/2016.\n */\nimport BaseModelComponent from '../../../base/base_model_component';\n\nclass BaseOptionsModel extends BaseModelComponent {\n\n _options = {};\n\n /**\n * get application settings options\n * Object contains of 'reminder property'\n * @returns {object}\n */\n getOptions() {\n return this._options;\n }\n\n /**\n * set / update selected object in the model\n *\n * @param {string} value\n * @returns {bool}\n */\n setOptions(options) {\n\n }\n}\n\nexport default BaseOptionsModel\n\n","import BaseOptionsComponentController from '../base_options_component_controller';\nimport DOM from '../../../../utils/dom';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport Event from '../../../../utils/event';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\n\nlet view = require('./view/inactivity_timeout_settings.html');\n\nconst CSS = {\n INACTIVITY_TIME_SELECT: '.cgp-inactivity-timeout-select',\n SELECTOR_LABEL: '.cgp-inactivity-timeout-label'\n};\n\nexport default class InactivityTimeoutSettingsController extends BaseOptionsComponentController {\n static CLASS = 'InactivityTimeoutSettingsController';\n\n _selector = 'cgp-component-inactivity-timeout-settings';\n\n _currentSessionTimeoutSettings = null;\n\n init(params) {\n super.init(params);\n this._currentSessionTimeoutSettings = this._oAuthService.getCurrentSessionTimeoutSettings();\n }\n\n start() {\n let bakedHTML = this.bake(view);\n\n this.setHTML(bakedHTML)\n ._bindOptions()\n ._setSelectorLabelText();\n\n return this;\n }\n\n _sendAnalytics(action, label) {\n let params = {\n category: 'italy_inactivity_window',\n action: action\n };\n\n if(label) {\n params.label = label;\n }\n\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, params);\n }\n\n _setSelectorLabelText() {\n let label = this.getEl().querySelectorAll(CSS.SELECTOR_LABEL)[0];\n\n label.innerHTML = this._languageService.translation('inactivity_timeout_settings_label');\n\n\n return this;\n }\n\n get _oAuthService() {\n return this.serviceFactory.oAuth2Service();\n }\n\n get _languageService() {\n return this.serviceFactory.languageService();\n }\n\n _getPossibleSessionTimeouts() {\n return this._currentSessionTimeoutSettings.possibleSessionTimeoutValues.map(timeSpan => Math.round(timeSpan.totalMinutes));\n }\n\n _getSelectorEl() {\n return this.getEl().querySelectorAll(CSS.INACTIVITY_TIME_SELECT)[0];\n }\n\n _bindOptions() {\n let possibleValues = this._getPossibleSessionTimeouts();\n\n\n let selector = this._getSelectorEl();\n\n let options = possibleValues.map(value => {\n let el = DOM.createElement('option');\n el.value = value;\n el.text = this._languageService.translation('inactivity_timeout_settings_minutes', {\n minutes: value\n });\n\n DOM.addClass(el, 'cgp-themes-main-text');\n DOM.addClass(el, 'cgp-theme-property-background-color-base03');\n\n return el;\n });\n\n options.forEach(option => {\n DOM.append(selector, option);\n });\n\n let currentSessionTimeout = this._currentSessionTimeoutSettings.currentSessionTimeout.totalMinutes;\n let index = possibleValues.findIndex(item => item === currentSessionTimeout);\n if(index >= 0) {\n selector.selectedIndex = index;\n } else {\n selector.selectedIndex = 0;\n }\n\n return this;\n }\n\n _getButtons() {\n let buttons = [\n {\n name: this._languageService.translation('inactivity_timeout_settings_save'),\n type: 'main',\n isClosable: true,\n callback: (event) => {\n this._onSaveBtnClicked(event);\n },\n forceAnalytic: true\n }\n ];\n\n return buttons;\n }\n\n _onSaveBtnClicked() {\n let selector = this._getSelectorEl();\n let selectedValue = Number.parseInt(selector[selector.selectedIndex].value);\n\n if(selectedValue !== this._currentSessionTimeoutSettings.currentSessionTimeout.totalMinutes) {\n this._sendAnalytics('changed', selectedValue);\n }\n\n this._oAuthService.setCustomSessionTimeout(TimeSpan.fromMinutes(selectedValue));\n\n }\n\n _getTitleKey() {\n return 'inactivity_timeout_settings_title';\n }\n\n onComponentOpened() {\n super.onComponentClosed();\n this._sendAnalytics('open');\n }\n onComponentClosed() {\n super.onComponentClosed();\n this._sendAnalytics('closed');\n }\n\n\n}","import BaseOptionsModel from '../base_options_model';\n\nclass ReminderSettingsModel extends BaseOptionsModel {\n\n init(params) {\n this._title = 'App Settings';\n this._initOptions(params)\n }\n\n\n _initOptions(params = {}) {\n this._options = params;\n }\n\n\n /**\n * set / update selected interval in the model\n * if there is no such interval, this interval will not be set\n *\n * @param {string} value\n * @returns\n */\n setOptions(options) {\n let isStored = false;\n if (options) {\n this._options.reminder = options.reminder;\n isStored = true;\n }\n\n return isStored;\n }\n\n\n /**\n * @param {string} value\n * @returns\n */\n getOptions() {\n return {reminder: this._options.reminder}\n }\n}\n\nexport default ReminderSettingsModel\n\n","/**\n * Created by andreyna on 6/8/2016.\n */\nconst REMINDER_SETTINGS_SELECTORS = {\n REMINDER_OPTIONS: '.cgp-reminder-select',\n CLOSE_BUTTON: '.cgp-reminder-cancel-btn',\n SAVE_BUTTON: '.cgp-reminder-save-btn',\n MORE_INFO_CONTAINER: '.cgp-reminder-text',\n MORE_INFO_SWITCH: '.cgp-more-info-title',\n REMINDER_INFO: '.cgp-reminder-info',\n REMINDER_INFO_MOBILE: '.cgp-mobile:not(.cgp-tablet) .cgp-reminder-info'\n\n};\n\nconst REMINDER_MORE_INFO_GAP = 25; // 15px - gap between button area top + 10px - info element margin\n\nexport {REMINDER_SETTINGS_SELECTORS, REMINDER_MORE_INFO_GAP};","import Model from './reminder_settings_model';\nimport DOM from '../../../../utils/dom';\nimport Store from '../../../../utils/store';\nimport BaseOptionsComponentController from '../base_options_component_controller';\nimport {REMINDER_SETTINGS_SELECTORS} from './reminder_settings_const';\nimport {USER_EVENTS} from '../../../../events/events';\nimport Strings from '../../../../utils/strings';\nimport _ from '../../../../utils/underscore';\nimport {TimeSpan} from \"@sparkware/app-utils\";\n\n// Views\nlet options = require('./view/reminder_settings.html');\nconst REMINDER_STORAGE_KEY = 'reminder';\n\n\nconst ELASTIC_ACTION_NAMES = {\n SAVE: 'Save',\n CANCEL: 'Cancel',\n CLOSE: 'Close',\n MOREINFO: 'MoreInfo'\n}\n\nclass ReminderSettingsController extends BaseOptionsComponentController {\n\n static CLASS = 'ReminderSettingsController';\n\n /**\n * @property\n * @type {object|null}\n * @private\n */\n _model = null;\n\n /**\n *`\n * @param params\n */\n init(params) {\n super.init();\n this._model = Model.create(this._initModel(params));\n }\n\n\n /**\n * Default root cgp component selector.\n *\n * @type {string}\n * @private\n */\n _selector = 'cgp-component-reminder';\n\n\n /**\n * Get reminder key for specific user cid\n *\n * @returns {*}\n * @private\n */\n _getReminderKey() {\n let key = null;\n // user service data\n let accountData = this.serviceFactory.userService().getAccountData();\n if (_.isUndefined(accountData) || _.isNull(accountData)) {\n return null;\n }\n key = REMINDER_STORAGE_KEY + '_' + accountData.Cid;\n\n return key;\n }\n\n\n /**\n * initialize model object\n *\n * @private\n * @returns {}\n */\n _initModel() {\n let optionsObj = {};\n let intervals = this._getIntervals();\n\n if (intervals && 0 < intervals.length) {\n const storedReminderValue = Store.get(this._getReminderKey())\n if(storedReminderValue) {\n const reminderIntervalAsNumber = Number(storedReminderValue);\n if(_.isNumber(reminderIntervalAsNumber)) {\n optionsObj.reminder = TimeSpan.fromMinutes(reminderIntervalAsNumber);\n } else {\n optionsObj.reminder = TimeSpan.parse(storedReminderValue);\n }\n\n } else {\n optionsObj.reminder = TimeSpan.fromMinutes(0);\n }\n\n }\n\n return optionsObj;\n }\n\n /**\n * Start the component view.\n *\n *\n * @returns {ReminderSettingsController}\n * @public\n */\n start() {\n // init the component layouts\n let bakedHTML = this.bake(options);\n this.setHTML(bakedHTML)\n ._bindOptions()\n ._subscribeDOMEvents();\n\n return this;\n }\n\n\n /**\n *\n */\n off() {\n if (Store.del(this._getReminderKey())) {\n this._model.setOptions({reminder: 0});\n }\n }\n\n set(value) {\n let intervals = this._getIntervals()\n // check if the interval is in the list of accepted values\n if (intervals.find(index => index === value) !== undefined) {\n // check whether value is OFF\n if (value === intervals[0]) {\n // remove reminder from local storage\n this.off();\n } else {\n // update or set new reminder\n if (this._getReminderKey()) {\n if (Store.set(this._getReminderKey(), TimeSpan.fromMinutes(value).toString())) {\n this._model.setOptions({reminder: value});\n }\n }\n }\n }\n }\n\n\n /**\n * Get intervals values for regulation\n * @returns {Array}\n * @public\n */\n _getIntervals() {\n let intervals = this.serviceFactory.regulationService().getReminderIntervals();\n\n return intervals;\n }\n\n\n /**\n * Bind array of intervals to selected DDL into the view\n * define selected change events.\n * @returns {*}\n * @private\n */\n _bindOptions() {\n let reminderIntervals = this._getIntervals();\n if (!reminderIntervals || 0 === reminderIntervals.length) {\n return this;\n }\n\n let ddlReminder = this.getEl().querySelectorAll(REMINDER_SETTINGS_SELECTORS.REMINDER_OPTIONS);\n\n if (0 < !ddlReminder && ddlReminder) {\n return this;\n }\n\n let reminderOptions = reminderIntervals.map(optionItem => {\n let el = DOM.createElement('option');\n el.value = optionItem;\n DOM.addClass(el, 'cgp-themes-main-text');\n DOM.addClass(el, 'cgp-theme-property-background-color-base03');\n\n let languageService = this.serviceFactory.languageService();\n if (0 < optionItem) {\n el.text = new Strings(languageService.translation('reminder_cta_minute')).injectIntoCurly({reminderValue: optionItem});\n } else {\n el.text = languageService.translation('reminder_off_option');\n }\n\n return el;\n });\n\n reminderOptions.forEach(el => {\n DOM.append(ddlReminder[0], el);\n });\n\n // init selected\n let selectedReminder = this._model.getOptions().reminder;\n if (selectedReminder) {\n ddlReminder[0].selectedIndex = reminderIntervals.findIndex(index => index === selectedReminder.totalMinutes);\n }\n return this;\n }\n\n\n /**\n * Subscribe handlers for DOM events\n * @private\n */\n _subscribeDOMEvents() {\n this.onChildElementEvent(REMINDER_SETTINGS_SELECTORS.MORE_INFO_SWITCH, USER_EVENTS.ON_CLICK, () => {\n let reminderText = DOM.$$('.cgp-reminder-text');\n DOM.toggleClass(reminderText[0], 'cgp-info-open');\n let reminderInfo = this.getEl().querySelectorAll(REMINDER_SETTINGS_SELECTORS.REMINDER_INFO)[0];\n let display = window.getComputedStyle(reminderInfo).display;\n let openType = 'block' === display ? 'Open' : 'Close';\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent({\n category: 'Client_RealityCheck_Set',\n action: ELASTIC_ACTION_NAMES.MOREINFO,\n label: openType\n });\n this._sendElasticRegulationData(ELASTIC_ACTION_NAMES.MOREINFO, openType);\n });\n\n return this;\n }\n\n _sendElasticRegulationData(action, value = null) {\n let eventData = {\n CGPEventCategory: 'Client_RealityCheck_Detail',\n CGPEventAction: action,\n RegulationID: this.serviceFactory.regulationService().getRegulationCode()\n };\n\n if (action === ELASTIC_ACTION_NAMES.SAVE) {\n eventData.CGPEventValue = value + '';\n eventData.CGPEventValueAsNumber = value;\n } else if (action === ELASTIC_ACTION_NAMES.MOREINFO) {\n eventData.CGPEventValue = value;\n }\n\n let logger = this.serviceFactory.structuredLoggingService()\n .getLogger(eventData)\n .setTarget('casino-realityCheck');\n\n logger.info();\n }\n\n /**\n * Save reminder value in local storage\n *\n *\n * @param {object} event\n * @returns\n * @private\n */\n _onSaveReminder(event) {\n let value = this._getReminderValue(event);\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent( {\n category: 'Client_RealityCheck_Set',\n action: 'TimeIntervalDropdown',\n label: value * 60 + ''\n });\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent({\n category: 'Client_RealityCheck_Set',\n action: 'Save'\n });\n this._sendElasticRegulationData(ELASTIC_ACTION_NAMES.SAVE, value);\n\n this.set(value);\n }\n\n\n /**\n * Wrapper to close component overlay\n * @returns\n * @private\n */\n _onCancelBtnClicked() {\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent( {category: 'Client_RealityCheck_Set', action: 'Cancel'});\n this._sendElasticRegulationData(ELASTIC_ACTION_NAMES.CANCEL);\n }\n\n\n /**\n * Get title language key\n * @returns {string}\n * @private\n */\n _getTitleKey() {\n return 'reminder_title';\n }\n\n /**\n * Get custom css class for component\n * @returns {*[]}\n * @private\n */\n _getCustomCSSClassList() {\n return super._getCustomCSSClassList().concat(['cgp-options-reminder']);\n }\n\n\n /**\n *\n * @returns {*}\n * @private\n */\n _getReminderValue() {\n let reminder = this.getEl().querySelectorAll(REMINDER_SETTINGS_SELECTORS.REMINDER_OPTIONS)[0],\n value = Number(reminder[reminder.selectedIndex].value);\n\n return value;\n }\n\n\n /**\n * Handle overlay close button click\n */\n onCloseBtnClicked() {\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent( {\n category: 'Client_RealityCheck_Set',\n action: 'CloseClick'\n });\n this._sendElasticRegulationData(ELASTIC_ACTION_NAMES.CLOSE);\n }\n\n\n /**\n * Handle after component open action\n * @protected\n */\n onComponentOpened() {\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent( {category: 'Client_RealityCheck_Set', action: 'Open'});\n }\n\n\n /**\n * Get buttons configuration to MDP\n * @returns {Array}\n * @privatee\n */\n _getButtons() {\n let buttons = [\n {\n name: this.serviceFactory.languageService().translation('reminder_cta_cancel'),\n type: 'secondary',\n isClosable: true,\n callback: this._onCancelBtnClicked.bind(this),\n forceAnalytic: true\n },\n {\n name: this.serviceFactory.languageService().translation('reminder_cta_save'),\n type: 'main',\n isClosable: true,\n callback: (event) => {\n this._onSaveReminder(event);\n },\n forceAnalytic: true\n }\n ];\n\n return buttons;\n }\n\n\n /**\n * Callback fired when component is completly removed from DOM\n * @protected\n */\n onComponentClosed() {\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent({category: 'Client_RealityCheck_Set', action: 'Close'});\n super.onComponentClosed();\n }\n\n /**\n * Send analytics message\n */\n reportAnalytics() {\n let reminderOptions = this.getOptions();\n const reminderIntervalInSeconds = (reminderOptions.reminder && reminderOptions.reminder.totalSeconds) || 0;\n if (reminderIntervalInSeconds !== 0) {\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent( {\n category: 'Client_RealityCheck_Set',\n action: 'TimeSetInLogin',\n label: reminderIntervalInSeconds // time in seconds\n });\n }\n }\n\n}\n\n\nexport default ReminderSettingsController;\n","const TOUCH_ID = {\n INIT_VIEW: require('./view/touch_id_init.html'),\n MODIFY_VIEW: require('./view/touch_id_modify.html'),\n\n ACTIVATION_BUTTON_CONFIRM: '.cgp-touch-id-init-button',\n ELEMENT_CHECKBOX_LABEL: '.cgp-touch-id-modify-toggle-button',\n ELEMENT_CHECKBOX: '.cgp-touch-id-modify-toggle-button-checkbox'\n};\n\n\nconst TOUCH_ID_SCREENS = {\n INIT_SCREEN: '1',\n MODIFY_SCREEN: '2',\n TOUCH_ID_CTL_OPENED: 'thocu_id_ctl_opened',\n TOUCH_ID_CTL_CLOSED: 'thocu_id_ctl_closed'\n};\n\nexport {TOUCH_ID, TOUCH_ID_SCREENS};\n","// import BaseModelComponent from '../../../../base/base_model_component';\nimport BaseOptionsModel from '../base_options_model';\n\n/**\n *\n *\n *\n */\nclass TouchIdComponentModel extends BaseOptionsModel {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'TouchIdComponentModel';\n\n\n /**\n *\n * @param params\n */\n init(params) {\n\n }\n}\nexport default TouchIdComponentModel;","import BaseObject from '../../../../../base/base_object';\nimport {SYSTEM_EVENTS} from '../../../../../events/events';\nimport Event from '../../../../../utils/event';\n\nclass TouchIdBaseScreen extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n\n _parent = null;\n\n _html = null;\n\n _setHtml(html) {\n this._html = html;\n }\n\n setParent(parent) {\n this._parent = parent;\n return this;\n }\n\n getEl() {\n return this._parent.getEl();\n }\n\n show() {\n let screen = this._parent.bake(this._html);\n this._parent.setHTML(screen);\n\n return this;\n }\n\n onInitScreenShow() {\n Event.fire(SYSTEM_EVENTS.TOUCH_ID_INIT_SCREEN_SHOW);\n }\n\n close() {\n this._parent.close();\n }\n\n\n onTryAgainSkip() {\n this.close();\n }\n\n onNativeCancel() {\n this.close();\n }\n\n /**\n * @override\n * @returns {Array}\n * @private\n */\n _getButtons() { return []; }\n\n onCheckTouchEnable(bChecked) {}\n closeScreen() {}\n onClosedByClicked() {}\n onComponentOpened() {}\n}\nexport default TouchIdBaseScreen;\n","import TouchIdBaseScreen from './touch_id_screen_base';\nimport {TOUCH_ID} from '../touch_id_component_consts';\nimport DOM from '../../../../../utils/dom';\n\n\nclass TouchIdAutoInitScreen extends TouchIdBaseScreen {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'TouchIdAutoInitScreen';\n _selector = 'cgp-touch-id-screen-init';\n\n _checkboxToggle = null;\n _butNext = null;\n\n init(params) {\n super.init(params);\n this._setHtml(TOUCH_ID.INIT_VIEW);\n }\n\n show() {\n super.show();\n\n DOM.addClass(this.getEl().getElementsByClassName('cgp-touch-id-content')[0], this._selector);\n\n return this;\n }\n\n /**\n * Subscribe for change of toggle.\n *\n * @public\n */\n onComponentOpened() {\n this.onInitScreenShow();\n\n DOM.onDOMElementEvent(this.getEl().querySelector(TOUCH_ID.ACTIVATION_BUTTON_CONFIRM), 'click', () => {\n\n this._parent.getTokenFromSrv();\n\n this._parent.serviceFactory.analyticsService().sendOrbitUserFlowEvent(\n {\n category:'Client_TouchID',\n action: 'Activation'\n });\n\n this.close();\n });\n\n return this;\n }\n\n onClosedByClicked() {\n super.onClosedByClicked();\n }\n}\nexport default TouchIdAutoInitScreen;\n","import TouchIdBaseScreen from './touch_id_screen_base';\nimport {TOUCH_ID} from '../touch_id_component_consts';\nimport {USER_EVENTS} from '../../../../../events/events';\nimport DOM from '../../../../../utils/dom';\nimport {SYSTEM_EVENTS} from '../../../../../events/events';\nimport Event from '../../../../../utils/event';\n\nclass TouchIdModifyScreen extends TouchIdBaseScreen {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'TouchIdModifyScreen';\n _selector = 'cgp-touch-id-screen-modify';\n\n _checkboxToggle = null;\n\n init(params) {\n super.init(params);\n this._setHtml(TOUCH_ID.MODIFY_VIEW);\n }\n\n show() {\n\n super.show();\n\n DOM.addClass(this.getEl().getElementsByClassName('cgp-touch-id-content')[0], this._selector);\n\n this.checkToOpenTouchIdSettings();\n\n\n return this;\n }\n\n checkToOpenTouchIdSettings() {\n\n return new Promise((resolve) => {\n const hybrid = this._parent.serviceFactory.hybridService();\n\n if (!hybrid.isOpenSettingSupported()) {\n resolve(false);\n }\n\n hybrid.isDeviceTouchEnable().then(bVal => {\n if (!hybrid._touchidfeature.getModel().isDeviceTouchEnable()) {\n hybrid.openTouchIdSettings();\n resolve(true);\n } else {\n resolve(false);\n }\n });\n });\n }\n\n onComponentOpened() {\n this._checkboxToggle = this.getEl().querySelector(TOUCH_ID.ELEMENT_CHECKBOX);\n\n this._parent.checkTouchEnable();\n\n DOM.onDOMElementEvent(this._checkboxToggle, USER_EVENTS.ON_CHANGE, () => {\n let strToggle = 'Menu toggle on';\n if (this._checkboxToggle?.checked) {\n\n this.checkToOpenTouchIdSettings().then(bOpen => {\n if (!bOpen) {\n this._parent.getTokenFromSrv();\n } else {\n this.onCheckTouchEnable(false);\n }\n });\n\n this.onInitScreenShow();\n\n } else {\n strToggle = 'Menu toggle off';\n Event.fire(SYSTEM_EVENTS.TOUCH_ID_CLEAR_TOKEN);\n }\n\n this._parent.serviceFactory.analyticsService().sendClickstreamEvent(\n {\n eventName: 'Client_TouchID',\n category: strToggle\n });\n\n });\n }\n\n onCheckTouchEnable(bChecked) {\n this._checkboxToggle.checked = bChecked;\n }\n\n onClosedByClicked() {\n super.onClosedByClicked();\n Event.fire(SYSTEM_EVENTS.TOUCH_ID_STATE_CHANGED)\n }\n}\nexport default TouchIdModifyScreen;\n","import BaseOptionsComponentController from '../base_options_component_controller';\nimport Model from './touch_id_model';\nimport {TOUCH_ID_SCREENS} from './touch_id_component_consts';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\nimport Event from '../../../../utils/event';\nimport {PRIORITY_LEVEL} from '../../../../services/overlay_manager/overlay_manager_levels';\nimport TouchIdAutoInitScreen from './Screens/touch_id_screen_init';\nimport TouchIdModifyScreen from './Screens/touch_id_screen_modify';\n\nclass TouchIdController extends BaseOptionsComponentController {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'TouchIdController';\n\n\n /**\n * @static\n * @type {string}\n */\n static DIRECTIVE = 'cgp-directive-touch-id';\n\n\n /**\n * Root component selector.\n *\n * @type {string}\n * @private\n */\n _selector = 'cgp-touch-id-component';\n\n\n /**\n * @property screen type\n * @type {int}\n * @private\n */\n _screenType = TOUCH_ID_SCREENS.INIT_SCREEN;\n\n /**\n * @property screen type\n * @type {object|null}\n * @private\n */\n _currentScreen = null;\n\n\n /**\n * @property\n * @type {object|null}\n * @private\n */\n _model = null;\n\n init(params) {\n super.init();\n this._model = Model.create(params);\n\n this._subscribe();\n }\n\n\n _subscribe() {\n Event.on(SYSTEM_EVENTS.TOUCH_ID_TRY_AGAIN_SKIP, this._onTryAgainSkip, this);\n Event.on(SYSTEM_EVENTS.TOUCH_ID_TOKEN_ENABLE_RES, this._onCheckTouchEnable, this);\n Event.on(SYSTEM_EVENTS.TOUCH_ID_NATIVE_CANCEL, this._onNativeCancel, this);\n\n Event.fire(TOUCH_ID_SCREENS.TOUCH_ID_CTL_OPENED);\n }\n\n _onNativeCancel() {\n this._currentScreen.onNativeCancel();\n }\n _onTryAgainSkip() {\n this._currentScreen.onTryAgainSkip();\n }\n\n _onCheckTouchEnable(bChecked) {\n // TODO\n this._currentScreen.onCheckTouchEnable(bChecked);\n }\n\n setScreen(screenType) {\n this._screenType = screenType;\n }\n\n\n _setHtmlScreen() {\n this._currentScreen = null;\n switch (this._screenType) {\n case TOUCH_ID_SCREENS.INIT_SCREEN:\n this._currentScreen = TouchIdAutoInitScreen.create();\n break;\n case TOUCH_ID_SCREENS.MODIFY_SCREEN:\n this._currentScreen = TouchIdModifyScreen.create();\n break;\n default:\n /* Maybe should throw an exception */\n break;\n }\n\n this._currentScreen && this._currentScreen.setParent(this).show();\n }\n\n\n /**\n *\n * @returns {TouchIdController}\n */\n start() {\n this._setHtmlScreen();\n this._openInMDP();\n\n return this;\n }\n\n\n /**\n * Wrapper to close component overlay\n * @returns\n * @public\n */\n close() {\n super.destroy();\n }\n\n getTokenFromSrv() {\n Event.fire(SYSTEM_EVENTS.TOUCH_ID_GET_TOKEN_FROM_SRV);\n }\n\n checkTouchEnable() {\n Event.fire(SYSTEM_EVENTS.TOUCH_ID_CHECK_TOKEN_ENABLE);\n }\n\n\n getCurrentScreen() {\n return this._currentScreen;\n }\n\n /**\n * Get touch id message priority\n * @returns {*}\n */\n getOverlayPriority() {\n return PRIORITY_LEVEL.TOUCH_ID;\n }\n\n\n /**\n * Handle after component open action\n * @protected\n */\n onComponentOpened() {\n this._currentScreen.onComponentOpened();\n }\n\n\n /**\n * Callback fired when component is completly removed from DOM\n * @protected\n */\n onComponentClosed() {\n this._currentScreen.onClosedByClicked();\n Event.fire(TOUCH_ID_SCREENS.TOUCH_ID_CTL_CLOSED);\n super.onComponentClosed();\n }\n\n\n /**\n * Handle overlay close button click\n */\n onCloseBtnClicked() {\n // Event.fire(TOUCH_ID_SCREENS.TOUCH_ID_CTL_CLOSED);\n }\n\n\n _getCustomCSSClassList() {\n return super._getCustomCSSClassList().concat(['cgp-options-touch-id', 'mdp-tablet-full-size']);\n }\n\n\n _getButtons() {\n return this._currentScreen._getButtons();\n }\n\n _getTitleKey() {\n return 'touch_id_auto_screen'\n }\n\n _openInMDP() {\n Event.fire(SYSTEM_EVENTS.MESSAGE_OPEN, {\n contentEl: this._currentScreen.getEl(),\n title: this._getOptionTitle(),\n closeButton: true,\n hasDefaultButton: false,\n customCSSClassList: this._getCustomCSSClassList(),\n priority: this.getOverlayPriority(),\n buttons: this._getButtons(),\n openCallback: this.onComponentOpened.bind(this),\n closeCallback: this.onComponentClosed.bind(this),\n btnCloseCallback: this.onCloseBtnClicked.bind(this)\n });\n }\n\n}\nexport default TouchIdController;","import BaseObject from '../../base/base_object';\nimport Loader from '../../utils/module_loader';\nimport _ from '../../utils/underscore';\n\nclass OptionsComponentController extends BaseObject {\n\n static CLASS = 'OptionsComponentController';\n\n\n /**\n * Root component selector.\n *\n * @type {string}\n * @private\n */\n _selector = 'cgp-options-component';\n\n\n /**\n * @function\n * @public\n */\n load(optionComponentNameToLoad) {\n let loader = new Loader();\n let optionComponents = loader.optionComponents();\n\n let findOptionComponentByName = optionComponents.find(optionComponent => this._isOptionExist(optionComponent.CLASS, optionComponentNameToLoad + 'Controller'));\n\n if (_.isUndefined(findOptionComponentByName)) {\n this.logger.error('Could not find the option component controller => ', optionComponentNameToLoad);\n return null;\n }\n\n return findOptionComponentByName.create();\n }\n\n\n /**\n *\n * @param optionComponentName\n * @param optionComponentNameToLoad\n * @returns {boolean}\n * @private\n */\n _isOptionExist(optionComponentName, optionComponentNameToLoad) {\n return optionComponentName === optionComponentNameToLoad;\n }\n\n getReminderInterval() {\n return this.load('ReminderSettings').getOptions().reminder;\n }\n}\n\n\nexport default OptionsComponentController;","const OVERLAY_DOM_PROPERTIES = {\n ID: '#cgp_overlay',\n ID_NAME: 'cgp_overlay',\n CLASS_NAME: 'cgp-overlay',\n CONTENT_CLASS_NAME: 'cgp-overlay-content'\n};\n\nconst OVERLAY_COMPONENT_PROPERTIES = {\n ID: '#cgp_overlay',\n CLASS_NAME: 'OverlayComponentController'\n};\n\n\nconst OVERLAY_CONTENT_PROPERTIES = {\n CLASS_NAME: 'cgp-overlay-content'\n};\n\nconst PRIORITY_CLASS_MAP = {\n BASE: 'cgp-overlay-base',\n POP_UP: 'cgp-overlay-popup',\n OPEN_SESSION: 'cgp-overlay-open-session',\n FP: 'cgp-overlay-fp',\n OMG: 'cgp-overlay-omg',\n MESSAGE: 'cgp-overlay-message',\n TOUCH_ID: 'cgp-overlay-touch-id'\n};\n\nconst TYPES_CLASS_MAP = {\n FLAT: 'cgp-overlay-flat',\n FULL_SCREEN: 'cgp-overlay-fullscreen'\n};\n\nconst LIGHTBOX_BACKGROUND_COLOR_CLASS = 'cgp-theme-property-lightbox-background-color';\n\nexport {OVERLAY_DOM_PROPERTIES, OVERLAY_COMPONENT_PROPERTIES, OVERLAY_CONTENT_PROPERTIES, PRIORITY_CLASS_MAP, TYPES_CLASS_MAP, LIGHTBOX_BACKGROUND_COLOR_CLASS};","import BaseComponent from '../../base/base_component';\nimport DOM from '../../utils/dom';\nimport DateFormatter from '../../utils/date_formatter';\nimport {SYSTEM_EVENTS} from '../../events/events';\nimport Event from '../../utils/event';\nimport { BaseComponentParams } from '../../base/base_component_interface';\n\n/**\n * Display digital current time in several formats (24 and 12 hours)\n * Controller can be used only through directive cgp-directive-clock\n *\n * @attributes\n * data-format - define 24 or 12 hours time display (values: '24h', '12h') Default is 24 hours\n * data-seconds - define if seconds will be displayed (values: 'Y', 'N'). Default is 'N' (not shown)\n *\n * @example\n * 24 hours format without seconds\n *
\n *\n * 12 hours format with seconds\n *
\n *\n */\n\ninterface ClockComponentInitParams extends BaseComponentParams {\n datetime?: string;\n}\n\nclass ClockComponentController extends BaseComponent {\n\n static CLASS: string = 'ClockComponentController';\n static DIRECTIVE: string = 'cgp-directive-clock';\n private _datetime: string;\n private _timeClockInterval: number = null;\n\n\n init(params: ClockComponentInitParams) {\n super.init(params);\n this._setInitParams(params);\n this._subscribe();\n this.addClass('cy-clock');\n\n }\n\n private _subscribe(): void {\n Event.on(SYSTEM_EVENTS.TIME_UPDATED_FROM_SERVER, () => {\n if (this._timeClockInterval) {\n this._updateTime();\n }\n });\n }\n\n private _setInitParams(params: ClockComponentInitParams): void {\n const dateTimeFormat = this.serviceFactory.skinService().getDateTimeFormat();\n this._datetime = params.datetime ? params.datetime : dateTimeFormat;\n }\n\n start() {\n if (!this._timeClockInterval) {\n this._timeClockInterval =\n DOM.setInterval(this._updateTime.bind(this), 1000, 'CLOCK_UPDATE_TIMER');\n }\n this._updateTime();\n return this;\n }\n\n private _updateTime(): void {\n const clockService = this.serviceFactory.clockService();\n const currentDate = clockService.getCurrentDate();\n const currentDateInRegulationTimeZone = clockService.convertToRegulationTimeZone(currentDate);\n if (!currentDateInRegulationTimeZone)\n {\n return;\n }\n const time = DateFormatter.format(currentDateInRegulationTimeZone.date, this._datetime, currentDateInRegulationTimeZone.isUTC);\n const el = this.getEl();\n if (el.innerText !== time) {\n el.innerText = time;\n }\n }\n\n //Clear timeout\n shutDown() {\n super.shutDown();\n if (this._timeClockInterval) DOM.clearInterval(this._timeClockInterval);\n }\n}\nexport default ClockComponentController;","import BaseComponent from './base_component';\n\nexport class ComponentRenderer {\n constructor(private _componentPrototype: any) {\n\n }\n\n\n private _hostElement: Element = null;\n private _componentInstance: BaseComponent = null;\n\n render(hostElement: Element, props?: any): void {\n\n\n this._disposeComponent();\n\n this._componentInstance = this._componentPrototype.create(props);\n hostElement.appendChild(this._componentInstance.getEl());\n this._componentInstance.start();\n this._componentInstance.onAppendedToDOM();\n this._hostElement = hostElement;\n }\n\n private _disposeComponent() {\n if(this._componentInstance) {\n this._componentInstance.shutDown();\n this._hostElement.removeChild(this._componentInstance.getEl());\n this._componentInstance = null;\n }\n }\n\n dispose() {\n this._disposeComponent();\n this._hostElement = null;\n }\n}","import Event from '../utils/event';\nimport {SYSTEM_EVENTS} from '../events/events';\nimport BaseObject from '../base/base_object';\nimport DOM from '../utils/dom';\nimport _ from '../utils/underscore';\nimport Clock from '../components/clock/clock_controller_component';\nimport GameJackpot from '../components/live_feeds/game_jackpot/game_jackpot_component_controller';\nimport {ComponentRenderer} from '../base/component_renderer';\n\nclass Directive extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'Directive';\n\n\n /**\n *\n * @type {string}\n * @private\n */\n _prefix = 'cgp-directive-';\n\n\n /**\n *\n * @type {string[]}\n * @private\n */\n _cgpAllowedQuery = [\n {selector : 'id', getValueSelector: 'id'},\n {selector : 'class', getValueSelector: 'className'}\n ];\n\n\n /**\n * @property\n * @type {Array}\n */\n cgpLoadedDirectives = [];\n\n\n static table = {\n clock : {ref: Clock, isReRenderable: true},\n game_jackpot : {ref: GameJackpot, isReRenderable: true},\n };\n\n\n static createComponentRenderer(componentId) {\n let componentDescriptor = Directive.table[componentId];\n if (!componentDescriptor) {\n throw new Error(`There is no sdk component with id ${componentId}`);\n }\n return new ComponentRenderer(componentDescriptor.ref);\n }\n\n CLEAN_DIRECTIVES_INTERVAL = 60000;\n\n\n /**\n *\n * @param params\n */\n init(params) {\n this\n ._loadDirectives(params)\n ._subscribe()\n .render()\n ._setTimeoutRemoveDirectives()\n ._initDOMObserver(document.body, params);\n }\n\n\n /**\n * Generate the cgp directives.\n *\n * @param componentOptions\n * @returns {*}\n */\n static generate(componentOptions) {\n let directiveRaw = Directive.table[componentOptions.directiveName];\n\n if (_.isUndefined(directiveRaw)) {\n console.error('Directive name => ' + componentOptions.directiveName + ' not allowed in the directives table.');\n return null;\n }\n\n //this._loadDirective\n let directiveInstance = directiveRaw.ref.create(componentOptions.props);\n\n if (_.isUndefined(directiveInstance)) {\n console.error('Invalid directive could not create instance error.');\n return null;\n }\n\n // If the programmer choose to auto start the component and set a start true flag.\n if (componentOptions.start) {\n directiveInstance.start();\n }\n\n return directiveInstance;\n }\n\n\n /**\n * Render the loaded directives into dom.\n *\n * @returns {Directive}\n * @private\n */\n render(forceRender = true) {\n this.cgpLoadedDirectives.forEach((directive) => {\n if (!forceRender) {\n this.logger.debug('Should consider and not re render the not allowed re render directive because using the force render flag to => ', forceRender)\n\n if (!directive.isReRenderable) {\n this.logger.debug('Directive is not allowed to be re render => ', directive.options.name);\n return;\n }\n }\n this._drawDirective(directive);\n });\n return this;\n }\n\n\n /**\n *\n * @param directive\n * @private\n */\n _drawDirective(directive) {\n // Start the directive to build himself.\n directive.directiveInstance.start();\n\n if (!directive.options.isOnDOM) {\n // // Clear previous directive DOM html.\n directive.options.el.innerHTML = '';\n // Append new bake directive element on the dom directive.\n DOM.append(directive.options.el, directive.directiveInstance.getEl());\n // Set that the directive is appended on dom.\n directive.options.isOnDOM = true;\n }\n\n Event.fire(SYSTEM_EVENTS.ELEMENT_CREATED, directive.options.el);\n directive.directiveInstance.onAppendedToDOM();\n //this.logger.debug('Draw component into the dom --> ', directive.options.name);\n }\n\n\n /**\n * Load single directive\n * @param cgpElement\n * @param query\n * @param params\n * @private\n */\n _loadDirective(cgpElement, query, params) {\n let cgpDirectiveOptions = this._makeDirectiveOptions(cgpElement, query);\n if (_.isNull(cgpDirectiveOptions)) {\n return;\n }\n\n let directiveRef = cgpDirectiveOptions.directive.ref;\n let directive = directiveRef.create(Object.assign({},\n cgpDirectiveOptions.configuration, // Directive dom configuration.\n params, // Params from loader.\n {isDirective: true} // Custom directive inner implementation.\n ));\n\n let loadedDirective = {\n directiveInstance: directive,\n options: cgpDirectiveOptions,\n isReRenderable: cgpDirectiveOptions.directive.isReRenderable\n };\n this.cgpLoadedDirectives.push(loadedDirective);\n\n return loadedDirective;\n }\n\n\n /**\n * Load all cgp directive and set them into directive loaded array.\n *\n * @returns {object}\n * @public\n */\n _loadDirectives(params) {\n this._cgpAllowedQuery.forEach((query) => {\n let cgpElements = DOM.$$('[' + query.selector + '^=' + this._prefix + ']');\n cgpElements.forEach((cgpElement) => {\n this._loadDirective(cgpElement, query, params);\n });\n });\n\n return this;\n }\n\n\n /**\n * Subscribe the directive to global application events.\n *\n * @return {Directive} this, for chaining.\n */\n _subscribe() {\n Event.on([\n SYSTEM_EVENTS.OAUTH_STATE_CHANGE\n ], () => {\n this._cleanDirectives();\n this.render(false);\n });\n\n return this;\n }\n\n\n /**\n * Handle add new element into the DOM\n * @param newNodes\n * @private\n */\n _onElementsAdded(elements, params) {\n if (false === elements || elements.length === 0) {\n return;\n }\n\n for(let i = 0; i < elements.length; i++) {\n let el = elements[i];\n if (el instanceof HTMLElement) {\n if (this._tryLoadDirective(el, params) === false) {\n this._cgpAllowedQuery.forEach((query) => {\n let cgpElements = el.querySelectorAll('[' + query.selector + '^=' + this._prefix + ']');\n cgpElements.forEach((cgpElement) => {\n this._tryLoadDirective(cgpElement, params);\n });\n });\n }\n }\n }\n }\n\n\n /**\n * Try load dynamic directive\n * @param el\n * @param params\n * @returns {boolean}\n * @private\n */\n _tryLoadDirective(el, params) {\n let query = this._getCGPDirectiveQuery(el);\n if (query) {\n //test if this directive is already loaded\n let componentSelector = this._getDynamicDirectiveSelector(el);\n if (componentSelector) {\n this.logger.warn('Directive is ' + componentSelector + ' has already loaded');\n return false;\n }\n\n let loadedDirective = this._loadDirective(el, query, params);\n this._drawDirective(loadedDirective);\n return true\n }\n return false;\n }\n\n\n /**\n * Get component selector into the directive element\n * @param el\n * @returns {null}\n * @private\n */\n _getDynamicDirectiveSelector(el) {\n if (el && el.children.length > 0) {\n let selector = el.children[0].className.match(/cgp-(\\w*-?)*component/g);\n return selector;\n }\n\n return null;\n }\n\n\n /**\n * Create CGP query selector to element\n * @param el\n * @returns {*}\n * @private\n */\n _getCGPDirectiveQuery(el) {\n let query;\n if (el instanceof HTMLElement) {\n if (el.getAttribute('id') && el.getAttribute('id').indexOf(this._prefix) > -1) {\n query = {selector: 'id', getValueSelector: 'id'};\n } else if (el.getAttribute('class') && el.getAttribute('class').indexOf(this._prefix) > -1) {\n query = {selector: 'class', getValueSelector: 'className'}\n }\n }\n\n return query;\n }\n\n\n /**\n * Initialize listener for DOM changes\n * @param observerRoot\n * @returns {Directive}\n * @private\n */\n _initDOMObserver(observerRoot, params) {\n let MutationObserver = window.MutationObserver || window.WebKitMutationObserver,\n eventListenerSupported = window.addEventListener;\n\n if (MutationObserver) {\n // define a new observer\n this._obs = new MutationObserver((mutations) => {\n mutations.forEach((record) => {\n if (record.addedNodes.length > 0) {\n //this.logger.debug(record);\n this._onElementsAdded(record.addedNodes, params);\n }\n });\n\n });\n // have the observer observe foo for changes in children\n this._obs.observe(observerRoot, {childList: true, subtree: true});\n } else\n if (eventListenerSupported) {\n DOM.addEventListener(observerRoot, 'DOMNodeInserted', this._onDOMNodeInserted, false);\n }\n\n return this;\n }\n\n\n /**\n * On DOM node inserted callback.\n */\n _onDOMNodeInserted(mutationEvent, params) {\n let elements = [];\n elements.push(mutationEvent.target);\n this._onElementsAdded(elements, params);\n }\n\n\n /**\n *\n * @returns {Directive}\n * @private\n */\n _setTimeoutRemoveDirectives() {\n this.cleanDirectivesTimeout = DOM.setTimeout(() => {\n this.logger.debug('Clean directives loop started');\n this._cleanDirectives();\n this._setTimeoutRemoveDirectives();\n }, this.CLEAN_DIRECTIVES_INTERVAL);\n\n return this;\n }\n\n /**\n * clean directives which were removed from dome\n * @returns {Directive}\n * @private\n */\n _cleanDirectives() {\n for (let i = this.cgpLoadedDirectives.length - 1; i >= 0; i--) {\n let directive = this.cgpLoadedDirectives[i];\n let el = directive.directiveInstance.getEl();\n if (_.isUndefined(el.offsetParent) || _.isNull(el.offsetParent)) {\n this.cgpLoadedDirectives.splice(i, 1);\n directive.directiveInstance.shutDown();\n this.logger.debug('Directive ' + directive.options.name + ' is not used and has been removed');\n }\n }\n\n return this;\n }\n\n /**\n * shutDown all existing directives instances\n * @returns {Directive}\n * @private\n */\n _shutDownDirectives() {\n for (let i = this.cgpLoadedDirectives.length - 1; i >= 0; i--) {\n let directive = this.cgpLoadedDirectives[i];\n let el = directive.directiveInstance.getEl();\n if (el.parentElement){\n el.parentElement.removeChild(el);\n }\n this.cgpLoadedDirectives.splice(i, 1);\n directive.directiveInstance.shutDown();\n }\n }\n\n\n /**\n * Prepare directive attribute for instance if is allowed in the directive rules.\n *\n * @param cgpElement\n * @param query\n * @private\n * @returns {{el: *, selector: *, configuration: {}, name: string}|null}\n */\n _makeDirectiveOptions(cgpElement, query) {\n let directiveName = cgpElement[query.getValueSelector].replace(this._prefix, '')\n .toLowerCase() // lower case\n .split(' ')[0]; // use only the first part, incase the directive has more properties in the classname.\n\n if (!Directive.table && !Directive.table[directiveName]) {\n this.logger.error('Sorry this dom element is not allowed in cgp directives => ', cgpElement);\n return null;\n }\n\n if (!Directive.table[directiveName]) {\n this.logger.error('Not found a match reference in cgp directive for --> ', directiveName);\n return null;\n }\n\n return {\n el: cgpElement,\n selector: query.selector,\n configuration: DOM.parseDataAttributes(cgpElement),\n name: directiveName,\n directive: Directive.table[directiveName],\n isOnDOM: false\n };\n }\n\n\n /**\n * Clean event subscription\n */\n shutDown() {\n this._shutDownDirectives();\n document.body.removeEventListener('DOMNodeInserted', this._onDOMNodeInserted);\n if (!_.isUndefined(this._obs)) {\n this._obs.disconnect();\n }\n\n if (!_.isUndefined(this.cleanDirectivesTimeout)) {\n DOM.clearTimeout(this.cleanDirectivesTimeout);\n }\n }\n}\n\nexport default Directive;\n","import Logger from '../utils/logger';\nimport Directive from './directive';\nimport Event from '../utils/event';\nimport {SYSTEM_EVENTS} from '../events/events';\nimport _ from '../utils/underscore';\nimport Device from '../utils/device/device';\nimport DOM from '../utils/dom';\nimport ConfigService from '../services/config/config_service';\nimport Loader from '../utils/module_loader';\nimport ServicesRegistry from '../services/services_registry';\n\nconst CGP_START_SELECTOR = 'cgp-',\n CLASS_NAME = 'INITIALIZE',\n REPLACE_SERVICE = 'Service',\n EMPTY = '';\n\n\n/**\n * Initialize class handle of creation core components in the application.\n * There are 3 types of supported components in the system:\n * 1. Directive\n * 2. Service\n * 3. Component\n *\n * All of the above initialized here with the properties model along. All of these are singletons.\n * Creation is done once.\n *\n * Usage:\n * When we create at the start of CGP initialization we create this class. It runs once and dies.\n *\n *\n */\nclass Initialize {\n /**\n * @type {Logger}\n */\n logger;\n\n /**\n * Init process, calls bootstrap to initiate the process.\n *\n * @constructor\n */\n constructor(onInitCompleteCallback) {\n let configs = ConfigService.create().getConfig();\n let loader = new Loader();\n this.logger = new Logger(CLASS_NAME, window.LOG_LEVEL);\n try {\n this.properties = configs;\n this.services = loader.services();\n this._initializeServices();\n this.loadDeviceSetting();\n this.subscribe();\n this._registerAllServices();\n this._doServicesAsyncJobs().then(() => {\n this._executeServicesOnInitializationCompleted().then(() => {\n Event.fire(SYSTEM_EVENTS.ON_INIT_COMPLETE);\n if (_.isFunction(onInitCompleteCallback)) {\n onInitCompleteCallback();\n }\n });\n });\n } catch (e) {\n this.logger.error('Error in SDK Initialize, error message:', e);\n }\n }\n\n\n /**\n * Subscribe initialize application startup events.\n */\n subscribe() {\n Event.on(SYSTEM_EVENTS.ON_INIT_COMPLETE, this.loadDirective.bind(this));\n }\n\n /**\n * Loads all the services\n *\n * @public\n */\n _initializeServices() {\n try {\n\n let initializeService = fn => {\n try {\n if (_.isFunction(fn.create)) {\n fn.create(this._getClassProperties(fn));\n } else {\n this.logger.error('loadServices - ' + fn.CLASS + ' not created');\n }\n } catch (ex) {\n this.logger.error('Failed to load function service ', fn.CLASS, ex);\n }\n };\n\n this.services.forEach(service => {\n if (_.isArray(service)) {\n service.forEach(fn => {\n initializeService(fn);\n });\n } else {\n initializeService(service);\n }\n\n });\n } catch (ex) {\n this.logger.error('Failed to load services => ', ex);\n }\n }\n\n\n /**\n * Load directive class to maintain cgp dom components.\n *\n * @public\n */\n loadDirective() {\n try {\n Directive.create(Object.assign({}, this.properties.defaults));\n } catch (ex) {\n this.logger.error('Failed to load directives: ', ex);\n }\n }\n\n\n /**\n * Load device settings selectors helper.\n */\n loadDeviceSetting() {\n let deviceType = Device.isMobile() ? \"mobile\" : (Device.os.isPC ? \"pc\" : null);\n if (deviceType) {\n DOM.addClass(DOM.getHTML(), CGP_START_SELECTOR + deviceType);\n }\n let osName = Device.os.name;\n DOM.addClass(DOM.getHTML(), CGP_START_SELECTOR + osName);\n let isTablet = Device.isTablet();\n if (isTablet) {\n DOM.addClass(DOM.getHTML(), CGP_START_SELECTOR + \"tablet\");\n }\n }\n\n\n /**\n * Getter for the class properties, passes externally during initialization.\n *\n * @param {Object} classObject - class reference of an un-instanced class.\n * @return {Object} of properties that reference only this class.\n * @public\n */\n _getClassProperties(classObject) {\n let objectName = classObject.CLASS\n .replace(REPLACE_SERVICE, EMPTY);\n\n return Object.assign({},\n this.properties.defaults,\n this.properties[objectName]);\n }\n\n _registerAllServices() {\n let servicesRegistry = ServicesRegistry.create();\n this.services.forEach(srv => {\n servicesRegistry.registerService(srv);\n });\n }\n\n /**\n * start services async jobs ( every service will implement his own async jobs ).\n *\n * @private\n */\n _doServicesAsyncJobs() {\n let asyncJobsPromises = [];\n\n let servicesRegistry = ServicesRegistry.create();\n this.services.forEach(service => {\n try {\n // push promise result from each service\n let serviceInstance = servicesRegistry.getService(service.CLASS);\n asyncJobsPromises.push(serviceInstance.doAsyncJobs());\n } catch (ex) {\n this.logger.error('Failed to get new promise from service: ' + service.CLASS, ex);\n }\n });\n\n return Promise.all(asyncJobsPromises)\n .catch(err => {\n this.logger.error('Failed to finish all services async jobs: ', err);\n });\n\n }\n\n _executeServicesOnInitializationCompleted() {\n let promises = [];\n let servicesRegistry = ServicesRegistry.create();\n this.services.forEach(service => {\n try {\n let serviceInstance = servicesRegistry.getService(service.CLASS);\n promises.push(serviceInstance.onInitializationCompleted());\n } catch (ex) {\n this.logger.error('_executeServicesOnInitializationCompleted failed for service: ' + service.CLASS, ex);\n }\n });\n\n return Promise.all(promises)\n .catch(err => {\n this.logger.error('_executeServicesOnInitializationCompleted failed:', err);\n });\n }\n}\n\nexport default Initialize;\nexport {Loader};","import {IAnalyticsData} from '../services/analytics/analytics_service_interface';\nimport {IJackpotDataByGame, IJackpotDataById} from '../services/live_feeds/jackpots/jackpot_feeds_service_interface';\n/* eslint-enable no-unused-vars */\nimport _Logger from '../utils/logger';\nimport Initialize from './initialize';\nimport {SYSTEM_EVENTS} from '../events/events';\nimport Event from '../utils/event';\nimport {SDK_VERSION} from '../sdk-version';\n/*\n we can't use ServiceFactory instead of ConfigService\n because ConfigService is used in the initialize()\n */\nimport ConfigService from '../services/config/config_service';\nimport OptionsComponentController from '../components/options/options_component_controller';\nimport _ from '../utils/underscore';\nimport Device from '../utils/device/device';\nimport ServiceFactory from '../services/service_factory';\nimport Directive from './directive';\nimport {IAutoLoginParams} from '../../../common/interfaces/autologin-params.interface';\nimport {BalanceType} from '../../../common/const/wallet_balance_type';\nimport IStructuredLoggingService from \"../../../common/interfaces/structured-logging-service-interface\";\nimport {SdkOverlayZIndex} from \"../../../common/interfaces/sdk-overlay-z-index\";\nimport {PRIORITY_LEVEL, PRIORITY_LEVEL_ZINDEX_MAPPER} from \"../services/overlay_manager/overlay_manager_levels\";\nimport {IGeoLocationInfo} from \"../../../common/interfaces/geo-location-info.interface\";\nimport {IScriptLoaderService} from \"../../../app-react/services/scrip-loader/script-loader.service.interface\";\nimport {Check, TimeSpan} from \"@sparkware/app-utils\";\nimport {MarketingParams} from \"../../../common/interfaces/marketing-params.interface\";\nimport {IAbTestingFeatureProperties} from \"../../../common/interfaces/ab-testing-interface\";\nimport DOM from \"../utils/dom\";\nimport {GNWP_SOURCES} from \"../../../app-react/services/gnwp/gnwp-consts\";\nimport {IDateFormattedToRegulationOffset} from '../../../app-react/services/sdk/cgp-sdk.interface';\nimport {LoadScriptOptions} from \"../../../common/interfaces/load-script-options\";\nimport {NullableString} from \"../../../common/types/nullable-types\";\nimport {IGameRestriction} from \"../../../app-react/services/restrictions/game-restriction.interface\";\n\n\n\nconst Logger = new _Logger('API');\n\n/**\n * API class handle of the application initialization and it's the only thing\n * That bare to the client.\n *\n * Usage:\n *\n * When we create new instance of API class we initialize the CGP. (or your var name in the cgp.js).\n *\n * Blow are few examples of how we can use this API:\n *\n * Initialize the core and all the functionality of the application.\n * And the only thing we will bare to our client.\n *\n * options parameter is all the data you want to set in the initialize to your application.\n Core.GetEvent() is an singleton event handler for event driven patten.\n *\n * initialize(options = {}) {\n * new this.Initialize(options);\n * return this;\n * }\n *\n * You can add or remove the set functions because they are chainable methods.\n * The method return a promise with a property of request that\n * contain a reference to the current xhr.\n */\nexport class API {\n version = SDK_VERSION;\n\n serviceFactory: ServiceFactory = null;\n\n _isSdkReady: boolean;\n\n /**\n * @constructor\n * @param modelSettings\n */\n constructor(modelSettings) {\n this.serviceFactory = ServiceFactory.create();\n ConfigService.create().setDefaultConfig(modelSettings);\n this._isSdkReady = false;\n Event.on(SYSTEM_EVENTS.ON_INIT_COMPLETE, () => {\n this._isSdkReady = true;\n }, this);\n }\n\n /**\n * Used by automation\n * @return {boolean}\n */\n isSdkReady() {\n return this._isSdkReady;\n }\n\n /**\n *\n * @returns {string}\n */\n generateGUID() {\n return Device.generateGuid();\n }\n\n /**\n * @returns {API}\n * @public\n */\n initialize(userSettings, onInitCompleteCallback) {\n ConfigService.create().setUserConfig(userSettings);\n new Initialize(onInitCompleteCallback);\n return this;\n }\n\n getConfigs() {\n return ConfigService.create().getConfig();\n }\n\n /**\n * Logout from the application will remove access token and refresh token from local storage.\n * User will not be allowed anymore to preform an authentication role request to resource server until he authorize again.\n *\n * @usage:\n * CGP.logout(); // Will remove access token from local storage and the user will not allowed to preform an authentication role request to resource server.\n *\n *\n * @public\n */\n logout() {\n return this.serviceFactory.oAuth2Service().logout();\n }\n\n runAutoLogin(autoLoginParams: IAutoLoginParams): Promise {\n let sessionTimer: TimeSpan | undefined = undefined;\n if (Check.isNumber(autoLoginParams.sessionTimer)) {\n sessionTimer = TimeSpan.fromSeconds(autoLoginParams.sessionTimer);\n }\n return this.serviceFactory.oAuth2Service().runAutoLogin(autoLoginParams.token, sessionTimer, autoLoginParams.sourceProductPackage, autoLoginParams.brandId, autoLoginParams.sourceSubBrand, autoLoginParams.targetSubBrand);\n }\n\n\n /**\n * Open login form over overlay externally.\n * @example:\n *\n * // The open login form take these default values\n * var loginViewOptions = {\n * marketingDataFn : 'getMarketingData(1234,abc,312312,null)'\n * }\n *\n * function onClose() {\n * console.log('When clicking on the close overlay btn I will invoke!');\n * }\n *\n * function onSuccess() {\n * console.log('When the login authentication will be successful I will invoke!');\n * }\n *\n * CGP.openLoginForm(loginViewOptions, onClose.bind(this), onSuccess.bind(this));\n *\n *\n * @returns void\n */\n openLoginForm(marketingParams?: MarketingParams) {\n\n if (this.serviceFactory.oAuth2Service().isAuthorized()) {\n return Promise.resolve();\n }\n\n return this.serviceFactory.webLoginService().openLoginForm({\n marketingParams: marketingParams,\n onCloseCallback: () => {\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {category: 'Client_LoginPopup', action: 'Close'});\n }\n });\n }\n\n /**\n * Message popup CGP extra candy.\n *\n * @param {string} title - title of the message # Require\n * @param {string} text - text in the message\n * @param {MessageType} type - the type of the message\n * @param {MessagePriority} priority - the priority of the message\n * @param {MessageButton[]} buttons - array of string that represent button action\n */\n message({title, text, type, priority, buttons}) {\n // MessageManager.create().addMessage(new MessageModel({title, text, type, priority, buttons}));\n }\n\n\n\n /**\n *\n * You also may to get reference to the overlay manager and fill it and create the display after the\n * Model is full.\n *\n * @usage:\n * Full demonstration of the overlay options.\n *\n * @example 1:\n * var el = document.createElement('DIV'); // Create arbitrarily DOM Element object.\n * var over = CGP.openOverlay(el); // Call overlay function from cgp api and append the el in the function.\n *\n * Close ability you the call.\n * closeLastOverlay(); // will close the overlay and remove it from the DOM.\n *\n *\n * @param overlayOptions - Object {\n * el (object) - DOMElement Object that will be over the overlay,\n * priority (number) - The overlay priority level\n * id (number) - overlay id. If is not provided, the iverlay will be opened with incremented id from previous overlay. Will be deprecated later\n * isCloseBtnAllowed (bool) - determinate if overlay will be opened with close button. Default is true\n * }\n * @public\n */\n openOverlay(overlayOptions) {\n Event.fire(SYSTEM_EVENTS.OPEN_OVERLAY, overlayOptions);\n }\n\n\n /**\n * Close last overaly dialog appropriate to its priority level\n * @param priority\n * priority (number) The overlay priority level\n */\n closeLastOverlay(priority) {\n Event.fire(SYSTEM_EVENTS.CLOSE_OVERLAY, {priority: priority});\n }\n\n getRegulationService() {\n return this.serviceFactory.regulationService();\n }\n\n /**\n * Close all overlay in the application.\n */\n closeAllOverlay() {\n Event.fire(SYSTEM_EVENTS.CLOSE_ALL_OVERLAY);\n }\n\n /**\n * Give access to device component.\n */\n device() {\n return Device;\n }\n\n getRegulationDateAndTimeFormat() {\n const skinService = this.serviceFactory.skinService();\n\n return {\n date: skinService.getDateFormat(),\n time: skinService.getTimeFormat(),\n dateTime: skinService.getDateTimeFormat(),\n dateTimeHistory: skinService.getDateTimeHistoryFormat()\n };\n }\n\n /**\n * Return list with id's of recently played games\n */\n getRecentlyGames() {\n return this.serviceFactory.recentlyPlayedService().getRecentlyPlayedList();\n }\n\n /**\n * Event Emitter give you the power to subscribe CGP system event handling.\n *\n * @usage:\n * // Simple use of CGP Event Subscriber we allowed to give the programmer the best way to integrate with CGP SDK JS.\n *\n * @example 1:\n * var oauthChangeEvent = CGP.onEvent({eventName: 'OAUTH_STATE_CHANGE'}); // now you will get notify when wallet change.\n *\n * @example 2:\n * // You can modify and add callback when the event been fired.\n * var oauthChangeEvent = CGP.onEvent({eventName: 'OAUTH_STATE_CHANGE', callback: function(){console.log('user wallet been changed')}})\n *\n * @example 3:\n * // We also giving the developer the relief of binding this to the callback context.. for Ecmascript 5 noobs\n * var oauthChangeEvent = CGP.onEvent({eventName: 'OAUTH_STATE_CHANGE', callback: function(){console.log('user wallet been changed')}, context: this)\n *\n * // Every variable subscribe come with off function that can be unsubscribe the event from listening.\n * oauthChangeEvent.off();\n *\n * // When you trying to subscribe to event that not exist or not allowed to be subscribe you will get undefined.\n * var oauthChangeEvent = CGP.onEvent('SOME_CUSTOM_EVENT_NOT_ALLOWED', function(){console.log('user wallet been changed')}, this)\n *\n * // The events we allowed to used are restricted due to CGP product design. for more information you can see full documentation in\n * // http://nocipedia/index.php?w=WEB&title=CGP:onEvent\n *\n *\n * @param eventOptions - Object {\n * eventName - Is the event name to subscribe to,\n * callback - Is the function that execute when the event fired. function() {alert('event fired')},\n * context - Is the context of the execution event callback.\n * }\n * @returns {*}\n */\n onEvent(eventOptions) {\n return Event.on(eventOptions.eventName, eventOptions.callback, eventOptions.context);\n }\n\n /**\n * Getter for the Username\n * if not authed, will return a false.\n *\n * @usage\n * var username = CGP.getUsername();\n *\n * @returns {String|Boolean}\n */\n getUsername() {\n if (this.isAuthorized()) {\n return this.serviceFactory.userService().getUsername();\n }\n\n return false;\n }\n\n getSessionId() {\n let oAuth2Service = this.serviceFactory.oAuth2Service();\n if (oAuth2Service.isAuthorized()) {\n return oAuth2Service.getToken().sessionId;\n } else {\n return null;\n }\n }\n\n /**\n * Is authorized giving the developer the power to know if the current user is authorized to the system or not.\n *\n * @usage\n * var isConnected = CGP.isAuthorized();\n * If the user is authorized to the system the output will be true else false.\n *\n * @example 1:\n * if (CGP.isAuthorized()) {\n * console.log('Hi I'm loggedin');\n * }\n *\n * @returns {*|boolean}\n */\n isAuthorized() {\n return this.serviceFactory.oAuth2Service().isAuthorized();\n }\n\n isLoginFromRegistration() {\n return this.serviceFactory.oAuth2Service().isLoginFromRegistration();\n }\n\n\n isVIP() {\n return this.serviceFactory.oAuth2Service().isVIP();\n }\n\n\n getUserData() {\n return this.serviceFactory.oAuth2Service().getUserData();\n }\n\n\n getUserSegments() {\n return this.serviceFactory.integrationService().getUserSegments();\n }\n\n\n getSerial() {\n let marketingData: any;\n return this.serviceFactory.skinService().getSerialData(marketingData);\n }\n\n getHybrid() {\n return this.serviceFactory.hybridService();\n }\n\n isHybridEmbeddedGame(gameType: number): boolean {\n return this.serviceFactory.hybridService().isOnDemandHtmlGame(gameType);\n }\n\n openHybridLink(url: string) {\n return this.serviceFactory.hybridService().openExternalLink(url);\n }\n\n getUtils() {\n return _;\n }\n\n displayHybrid() {\n this.getHybrid().displayHybrid();\n }\n\n\n getProductPackage() {\n return this.serviceFactory.skinService().getProductPackageID();\n }\n\n getSkin() {\n return this.serviceFactory.skinService();\n }\n\n\n /**\n * open tab in new window - if Hybrid call call external link function\n */\n openInNewWindow(url, specs) {\n this.serviceFactory.windowService().openInNewWindow(url, specs);\n }\n\n /**\n * Get user token if exist.\n *\n * @usage\n * var token = CGP.getToken(); // if the user is authorized token will received it.\n *\n * @returns {Promise}\n */\n getToken() {\n return this.serviceFactory.oAuth2Service().getToken();\n }\n\n getPlatformToken() {\n return this.serviceFactory.userService().getPlatformToken();\n }\n\n getFirebaseToken() {\n return this.serviceFactory.userService().getFirebaseLoginToken();\n }\n\n getTrendingRecommendedGamesForPlayer(listTypeIds: number[]): Promise<{[key: number]: number[]}> {\n return this.serviceFactory.aiListService().getTrendingRecommendedGamesForPlayer(listTypeIds);\n }\n\n /**\n * Generates a platform token for autologin.\n *\n * @returns\n */\n getAutoLoginToken() {\n return this.serviceFactory.userService().renewLoginToken();\n }\n\n\n /**\n * Login a user using an AutoLogin/UserInfo token - provided usually by Platform.\n *\n * @returns\n */\n setAutoLoginToken(token) {\n Event.fire(SYSTEM_EVENTS.RUN_AUTOLOGIN, token);\n\n return this;\n }\n\n\n /**\n * Open Options\n * ReminderSettings, About,TouchId\n */\n openOptions(screenType, innerScreen) {\n const screen = OptionsComponentController.create().load(screenType);\n if (undefined !== innerScreen) {\n screen.setScreen(innerScreen);\n }\n\n screen.render();\n\n if (undefined !== innerScreen) {\n if (undefined !== this.getHybrid().getTouchIDFeaturer()) {\n this.getHybrid().getTouchIDFeaturer().setTouchIdComponentController(screen);\n }\n }\n }\n\n /**\n * get sub brand ID\n * @returns {*}\n */\n getSubBrandID() {\n return this.serviceFactory.skinService().getSubBrandID();\n }\n\n /**\n * get external brand callback url\n */\n getExternalBrandCallbackURL() {\n return this.serviceFactory.queryStringDetectorService().getExternalBrandCallbackURL();\n }\n\n /**\n * get external brand callback method\n */\n getExternalBrandCallbackURLMethod() {\n return this.serviceFactory.queryStringDetectorService().getExternalBrandCallbackURLMethod();\n }\n\n /**\n * get source sub brand name.\n */\n getSourceSubBrandName() {\n const sourceSubBrandID = this.serviceFactory.queryStringDetectorService().getSourceSubBrand();\n let sourceSubBrandName = \"notFound\";\n\n // We need it for back to. and also to recognize poker native.\n const pokerSubBrands = ['1', '114', '81', '45', '130', '106', '103'];\n const sportSubBrands = ['8', '115', '110', '116', '131', '128'];\n\n if (pokerSubBrands.includes(sourceSubBrandID)) {\n sourceSubBrandName = \"poker\";\n } else if (sportSubBrands.includes(sourceSubBrandID)) {\n sourceSubBrandName = \"sport\";\n }\n\n return sourceSubBrandName;\n }\n\n /**\n * get brand ID\n * @returns {*}\n */\n getBrandID() {\n return this.serviceFactory.skinService().getBrandID();\n }\n\n showInfo(txt) {\n\n let options = {\n hasImage: false,\n text: txt,\n closeButton: true,\n title: 'Info',\n buttons: [\n {name: 'Close', isClosable: true},\n {\n name: 'MailTo:', isClosable: true, callback: () => {\n this.getHybrid().openMail(encodeURIComponent(txt));\n }\n }\n ]\n };\n this.openMessage(options);\n }\n\n openSafariTest(url) {\n this.getHybrid().openSafariTest(url);\n }\n\n navigateToSecondGameVebView(url) {\n Event.fire(SYSTEM_EVENTS.WEB_VIEW_NAVIGATE_GAME, url);\n }\n\n\n /**\n * Popup CGP messages in lightbox (overlay)\n *\n * @params\n * messageOptions {object} {\n * title {string} message title text. It appears on the top of message dialog, but under icon if exists (read type and customIcon)\n * text {string} message text. Can be every HTML markup. It appears under the title\n * type {string} message type. There are strongly defined message types (see MESSAGE_TYPE const) [info, warning, error, success].\n * If one of them is passed and there is no customIcon, appropriate message icon will appear under the title.\n * customIcon {string} url to custom icon. It overrides any message defined icon, that is to say, if you define message type, it will be ignored\n * priority {number} message priority. Since the message opens on overlay, it defines the overlay priority. There are two priority types in CGP (HIGH and LOW).\n * default value for messages is PRIORITY_LEVEL.MESSAGE, so when your message will appear it will destroy all previous overlays and messages. If need to change this behaviour,\n * you should pass lower priority: PRIORITY_LEVEL.BASE, then your message will appear when the higher overlay destroys.\n * NOTE! If you pass priority and there is custom button in message (read button) that should close the message on click, be aware, you should pass priority\n * parameter in button onClick callback where you fire CLOSE_OVERLAY event\n * @Example\n * CGP.openMessage({priority: priorityValue}); //priorityValue = PRIORITY_LEVEL.MESSAGE or PRIORITY_LEVEL.BASE (similar to what passed in message options)\n * closeButton {bool} define if close X button will appear to close the message\n * buttons {array} contains buttons on message dialog. Read button object definition in message_button.\n * By default, if the array is empty, message dialog render single default button with name 'OK' that close the dialog.\n * Each custom button by default closes message dialog. To prevent this behavior, isClosable button parameter will be define false explicitly. (see message_button).\n * @Example\n * [{name: 'btn1'}, {name: 'btn2', isClosable: false}]\n * buttonPosition {string} define buttons position. Values: 'left', 'right', 'center'.\n * By default, in PC layout, button aligned to center, and in mobile to right side.\n * If buttonPosition is defined, it overrides this behaviour and valid both in PC and mobile\n *}\n */\n openMessage(messageOptions) {\n Event.fire(SYSTEM_EVENTS.MESSAGE_OPEN, messageOptions);\n }\n\n /**\n * Expose internal cgp events should be during development only!\n *\n * @returns {Event}\n */\n exposeEventInternal() {\n return Event;\n }\n\n structuredLoggingService(): IStructuredLoggingService {\n return this.serviceFactory.structuredLoggingService();\n }\n\n getCGPMaxOverlayZIndex(): number {\n return this.serviceFactory.overlayManagerService().getCGPMaxOverlayZIndex();\n }\n\n /**\n * Send GA analytic object\n *\n * analytic {object} contains GA properties (category, action, label, value)\n *\n *\n * @param analyticObject\n */\n sendAnalytics(analyticObject: IAnalyticsData) {\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, analyticObject);\n }\n\n pushDataToDataLayer(data) {\n this.serviceFactory.analyticsService().pushDataToDataLayer(data);\n }\n\n getGoogleClientID() {\n return this.serviceFactory.analyticsService().getGoogleClientID();\n }\n\n /**\n * Add extra properties to GTA data layer\n * @param dataLayerObject\n */\n updateAnalyticsDataLayer(dataLayerObject) {\n Event.fire(SYSTEM_EVENTS.ANALYTIC_DATA_LAYER_UPDATE, dataLayerObject);\n }\n\n /**\n * Send specified event for trigger optimize experiment condition compare process\n */\n onSegmentationChanged() {\n Event.fire(SYSTEM_EVENTS.ANALYTICS_OPTIMIZE_TRIGGER);\n }\n\n /**\n * This function api gets a number type only in ` CENTS ` !.\n * Formatting cents due to user preference money format.\n * @param cents\n * @param roundIfZero if true and the decimal numbers are 0 value will return without the decimal number\n * @param options\n * @example #1: let jackpot = CGP.format$$$(1000000);\n * console.log(jackpot) // $10,000.00\n * @example #2: let jackpot = CGP.format$$$(1000000, true);\n * console.log(jackpot) // $10,000\n *\n * @example #3: let jackpot = CGP.format$$$(1000055, true);\n * console.log(jackpot) // $10,000.55\n *\n * @returns {string}\n */\n format$$$(cents, roundIfZero = false) {\n if (!_.isNumber(cents)) {\n Logger.error('format$$$ invalid input => ', cents);\n return '';\n }\n\n return this.serviceFactory.currencyService().formatMoney(cents, {}, roundIfZero);\n }\n\n getCurrencyIso3(): string {\n return this.serviceFactory.currencyService().getCurrency();\n }\n\n\n kickSimulate(params) {\n this.serviceFactory.playerMessagesService().getMessageStrategy().KICKUpdateHandler(params.featureName, params.msgFields, params.fullTopic);\n }\n\n\n\n /**\n * Retrieves the games information like title from the backend\n * @param gameTypes - an array of game types\n * @param url - for using a URL on the fly (and not the service URI param)\n * @returns {Promise} where T is a map where the key is the game type\n * Sample returned data:\n {\n 130017: {gameType: 130017, title: 'Elm Street', background: 'someUrl'}\n 130043: {gameType: 130043, title: 'Millionaire Genie', background: 'someUrl'}\n }\n */\n getGamesInfo(gameTypes) {\n return this.serviceFactory.gamesInformationService().getGamesInfo(gameTypes);\n }\n\n getGamesThemes(): Record {\n return this.serviceFactory.gamesInformationService().themes;\n }\n\n getGamesVendors(): Record {\n return this.serviceFactory.gamesInformationService().vendors;\n }\n\n getGamesCompanies(): Record {\n return this.serviceFactory.gamesInformationService().companies;\n }\n\n /**\n * use this method only for history. this method will return also game info for restricted and not in layout games.\n * @param gameTypes\n */\n getGamesInfoForHistory(gameTypes) {\n return this.serviceFactory.gamesInformationService().getGamesInfoWithoutAnyFiltering(gameTypes);\n }\n\n /**\n * Get all game IDs as array\n * @param url - for using a URL on the fly (and not the service URI param)\n * @returns {*}\n */\n getAllGameTypes() {\n return this.serviceFactory.gamesInformationService().getAllGameTypes();\n }\n\n freePlayAdd(topic, fields) {\n return this.serviceFactory.playerMessagesService().getMessageStrategy().FPUpdateHandler(null, fields, topic);\n }\n\n\n applyRestrictions(restrictions) {\n this.serviceFactory.restrictionsService().applyRestrictions(restrictions);\n }\n\n\n /**\n * Retrieves the AI (Artificial Intelligence) game list from the backend\n * @returns {Promise} 2 Arrays one with game types and the other with the AI game score for each type\n * @param maxGames - max games for return\n * @param filterOutRecentlyPlayedGames - if true we will filter out from the response the recently played games\n * @param numberOfRecentlyPlayedGameToFilterOut - numberOfRecentlyPlayedGameToFilterOut number of recently games that we need to filter out\n * Sample returned\n * AiGameListData = {\n * \"aiGameTypesArray\": [\"130001\", \"130008\", \"130012\", \"130014\", \"130017\", \"130024\", \"130026\", \"130036\"],\n * \"aiEngine\": the engine/vendor name that return the AI list = for example 888\n * };\n */\n getAIList(maxGames, filterOutRecentlyPlayedGames, numberOfRecentlyPlayedGameToFilterOut = 0) {\n return this.serviceFactory.aiListService().getAIList(maxGames, filterOutRecentlyPlayedGames, numberOfRecentlyPlayedGameToFilterOut);\n }\n\n getAINewGamesList(maxGames, filterOutRecentlyPlayedGames, numberOfRecentlyPlayedGameToFilterOut = 0) {\n return this.serviceFactory.aiListService().getAINewGamesList(maxGames, filterOutRecentlyPlayedGames, numberOfRecentlyPlayedGameToFilterOut);\n }\n\n // will become obsolete, do not use anymore\n getAbTestingDataForFeature(featureName) {\n return this.serviceFactory.abTestingService().getAbTestingDataForFeature(featureName);\n }\n\n getAbTestingData() {\n return this.serviceFactory.abTestingService().getAbTestingData();\n }\n\n /**\n * @returns Promise\n */\n waitForAnonymousAbTestingData() {\n return this.serviceFactory.abTestingService().waitForAnonymousAbTestingData();\n }\n\n getAnonymousPlayerAbTestingDataForFeature(featureName: string, shouldDefaultToLocalStorageData: boolean): IAbTestingFeatureProperties {\n return this.serviceFactory.abTestingService().getAnonymousPlayerAbTestingDataForFeature(featureName, shouldDefaultToLocalStorageData);\n }\n\n /**\n * @returns Promise\n */\n countPlayerChallenges() {\n return this.serviceFactory.userService().countPlayerChallenges();\n }\n\n routeChanged(routeParams) {\n Event.fire(SYSTEM_EVENTS.ROUTE_CHANGED, routeParams);\n }\n\n getGamesDiagnosticMessages() {\n return this.serviceFactory.gamesInformationService().getDiagnosticMessages();\n }\n\n getLoginTime() {\n return this.serviceFactory.oAuth2Service().getLoginTime();\n }\n\n OMGSimulate(messages) {\n if (!messages) {\n return;\n }\n\n messages.forEach((message) => {\n this.serviceFactory.playerMessagesService().getMessageStrategy().OMGUpdateHandler('OMG', message);\n });\n }\n\n getGRSEnvironments() {\n return this.serviceFactory.gameService().getGRSEnvironments();\n }\n\n getCorrelatedGames(gameType, numberOfGames = 3) {\n return this.serviceFactory.gamesCorrelationService().getCorrelatedGames(gameType, numberOfGames);\n }\n\n simulateClockRequest(data) {\n this.serviceFactory.clockService().setServerTime(\"2019-01-23T15:27:03Z\");\n this.serviceFactory.clockService().setRegulationOffset(-300);\n }\n\n getCurrentServerDate() {\n return this.serviceFactory.clockService().getCurrentServerDate();\n }\n\n formatToRegulationOffset(date: Date, dateFormattedToRegulation: Date): IDateFormattedToRegulationOffset {\n return this.serviceFactory.clockService().formatToRegulationOffset(date, dateFormattedToRegulation);\n }\n\n simulatePlayerMessages() {\n this.serviceFactory.playerMessagesService().getMessageStrategy()._getPlayerMessages();\n }\n\n isPlayerMessagesConnected(): boolean {\n return this.serviceFactory.playerMessagesService().isConnected;\n }\n\n createComponentRenderer(componentId) {\n return Directive.createComponentRenderer(componentId);\n }\n\n startLiveTableFeeds() {\n return this.serviceFactory.liveTablesService().start();\n }\n\n getTablesInfo() {\n return this.serviceFactory.liveTablesService().getTablesInfo();\n }\n\n stopLiveTableFeeds() {\n return this.serviceFactory.liveTablesService().stop();\n }\n\n testGamesQuestionnaire() {\n this.serviceFactory.gamesQuestionnaireService()._showOverlay();\n }\n\n getDailyDealCampaigns() {\n return this.serviceFactory.historyService().getDailyDealCampaigns();\n }\n\n getJackpotsById(): Record {\n return this.serviceFactory.jackpotFeedsService().getJackpotsById();\n }\n\n getJackpotsByGameType(): Record {\n return this.serviceFactory.jackpotFeedsService().getJackpotsByGameType();\n }\n\n getBankroll(balanceType: BalanceType, plainNumber: boolean = false) {\n return this.serviceFactory.walletService().getBankroll(balanceType, plainNumber);\n }\n\n\n getEnvironment() {\n return this.serviceFactory.structuredLoggingService().getEnvironment();\n }\n\n getCountryName() {\n return this.serviceFactory.countryService().countryName;\n }\n\n getCountryIso3() {\n return this.serviceFactory.countryService().getCountry();\n }\n\n getSupportedStates() {\n return this.serviceFactory.countryService().supportedStates;\n }\n\n getWrongLocationDetectionPath() {\n return this.serviceFactory.skinService().getWrongLocationDetectionPath();\n }\n\n clearLocalStorage() {\n localStorage.clear();\n Event.fire(SYSTEM_EVENTS.LOCAL_STORAGE_CHANGED);\n }\n\n private _onOrbitInitCompleteFired = false;\n onOrbitInitComplete() {\n if (!this._onOrbitInitCompleteFired) {\n this._onOrbitInitCompleteFired = true; // just in case somebody calls this function twice.\n Event.fire(SYSTEM_EVENTS.ON_ORBIT_INIT_COMPLETE);\n }\n\n }\n\n httpPost(url: string, requestData?: object): Promise {\n return this.serviceFactory.http2Service().post(url, requestData);\n }\n\n httpGet(url: string, requestData?: object): Promise {\n return this.serviceFactory.http2Service().get(url, requestData);\n }\n\n waitForAutologin() {\n return this.serviceFactory.oAuth2Service().waitForAutologin();\n }\n\n loadScript(options: LoadScriptOptions): Promise {\n return this.serviceFactory.scriptLoaderService().loadScript(options);\n }\n\n getRefreshToken(): string {\n return this.serviceFactory.oAuth2Service().getRefreshToken();\n }\n\n get overlayZIndex(): SdkOverlayZIndex {\n return {\n OMG: PRIORITY_LEVEL_ZINDEX_MAPPER[PRIORITY_LEVEL.OMG],\n GAME_FRAME: PRIORITY_LEVEL_ZINDEX_MAPPER[PRIORITY_LEVEL.GAME_FRAME]\n };\n }\n\n isInAutologin(): boolean {\n return this.serviceFactory.oAuth2Service().isInAutologin();\n }\n\n fireDepositWidgetClosed() {\n Event.fire(SYSTEM_EVENTS.DEPOSIT_WIDGET_CLOSED);\n }\n\n\n /* Resumes the player's game after it was stopped, e.g. to display reality check */\n\n getGeoLocationInfo(): Promise {\n return this.serviceFactory.countryService().getGeoLocationInfo();\n }\n\n getDownloadAppLink() {\n return this.serviceFactory.skinService().getAppDownloadPageURL();\n }\n\n isDepositWidgetSupportedByHybrid(): boolean {\n return this.serviceFactory.hybridService().isDepositWidgetSupported();\n }\n\n promptPushNotificationPermissionRequest(): void {\n if (Device.hybrid.inCasino) {\n this.serviceFactory.hybridService().promptPermission();\n } else {\n return this.serviceFactory.webPushService().promptPermission();\n }\n }\n\n openPopUpOnSecondWebView(content, timeout): void {\n this.serviceFactory.hybridService().openPopUpOnSecondWebView(content, timeout);\n }\n\n closePopUpOnSecondWebView(): void {\n this.serviceFactory.hybridService().closePopUpOnSecondWebView();\n }\n\n getBurnoutAnimationZIndex() {\n return PRIORITY_LEVEL_ZINDEX_MAPPER[PRIORITY_LEVEL.SECONDARY_MESSAGE];\n }\n\n get hybrid() {\n return this.serviceFactory.hybridService();\n }\n get currentRegulation() {\n return this.serviceFactory.regulationService().getRegulation();\n }\n\n getCurrentBrowserTabId(): string {\n return this.serviceFactory.windowService().getCurrentBrowserTabId();\n }\n\n get hasOpenOverlays(): boolean {\n return this.serviceFactory.overlayManagerService().isActiveOverlayExists();\n }\n\n get gnwp() {\n return this.serviceFactory.gnwpService();\n }\n\n get scriptLoader(): IScriptLoaderService {\n return this.serviceFactory.scriptLoaderService();\n }\n\n stopGameTimeReminders(): void {\n OptionsComponentController.create().load('ReminderSettings').off();\n }\n\n extractTokenProperty(tokenProperty: string) {\n return this.serviceFactory.oAuth2Service().extractTokenProperty(tokenProperty);\n }\n updateTokenProperty(tokenProperty: string, value: NullableString) {\n return this.serviceFactory.oAuth2Service().updateTokenData(tokenProperty, value);\n }\n isLoginPopupEnabled(): boolean {\n return this.serviceFactory.regulationService().isLoginPopupEnabled();\n }\n\n getAccountData(): any {\n return this.serviceFactory.userService().getAccountData()\n }\n\n getTempAccountGnwpSource(): GNWP_SOURCES {\n return this.serviceFactory.regulationService().getTempAccountGnwpSource();\n }\n\n testSetInterval(intervalMS: number) {\n DOM.setInterval(() => {\n console.log(\"Testing setInterval on Android. Will remove\");\n }, intervalMS);\n }\n\n testfromInterval(intervalMS: number) {\n this.serviceFactory.observableFactoryService().fromInterval(intervalMS, 'SESSION_TIMER_INCREMENT_INTERVAL')\n .forEach(() => {\n console.log(\"Testing fromInterval on Android. Will remove\");\n });\n }\n\n getGameRestriction(gameType: number, gameGroupId: number, vendorId: number): IGameRestriction {\n return this.serviceFactory.restrictionsService().getGameRestriction(gameType, gameGroupId, vendorId);\n }\n}\n","export const SDK_VERSION = '4.1546.4';","import BaseService from '../../base/base_service';\nimport _ from '../../utils/underscore';\nimport { IAbTestingData } from \"./ab_testing_service_interface\";\nimport { SYSTEM_EVENTS } from '../../events/events';\nimport IAbTestingService from './ab_testing_service_interface';\nimport { IAbTestingFeatureProperties } from '../../../../common/interfaces/ab-testing-interface';\nimport Store from '../../utils/store';\nimport Device from '../../utils/device/device';\nimport { ControlledPromise } from '../../../../common/utils/controlled-promise';\nimport {SetTimeoutType} from \"../../../../common/types/set-timeout-type\";\n\nconst AB_TESTING_DATA_LOCAL_STORAGE_KEY = \"ABTestingDataForUser\";\nconst AB_TESTING_ANONYMOUS_PLAYER_ID_LOCAL_STORAGE_KEY = \"ABTestingAnonymousPlayerId\";\n\ninterface AbTestingServiceParams {\n enableABFiltering: true;\n isAnonymousPlayerSupportEnabled: boolean;\n getTestsForAnonymousPlayerUrl: string;\n}\n\n\nexport default class AbTestingService extends BaseService implements IAbTestingService {\n\n static CLASS = 'AbTestingService';\n\n private _params: AbTestingServiceParams;\n\n private _cachedABTestingData: IAbTestingData;\n\n private _anonymousPlayerId: string = null;\n\n private _getAnonymousPlayerDataPromise = new ControlledPromise();\n private _getAnonymousPlayerDataPromiseTimeout: SetTimeoutType;\n\n private _anonymousPlayerData: IAbTestingData = {\n ErrorDescription: \"\",\n Features: {},\n AnonymousPlayerId: null\n };\n\n public init(params: AbTestingServiceParams): void {\n super.init(params);\n\t\tthis._params = params;\n this._resetCache();\n this._subscribe();\n }\n\n onInitializationCompleted(): Promise {\n this._readAbTestingDataFromToken();\n this._updateAnonymousAbTestingData();\n return super.onInitializationCompleted();\n }\n\n private _subscribe(): void {\n this.onSystemEvent(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, () => {\n this._resetCacheData();\n });\n }\n\n private _resetCacheData(): void {\n this._resetCache();\n this._readAbTestingDataFromToken();\n }\n\n private _resetCache(): void {\n this._cachedABTestingData = {\n ErrorDescription: null,\n Features: {},\n AnonymousPlayerId: null\n };\n }\n\n getAnonymousPlayerId(): string {\n return this._anonymousPlayerId;\n }\n\n _getFeature(container: IAbTestingData, featureName: string) {\n if (container?.Features) {\n const feature: IAbTestingFeatureProperties = container.Features[featureName.toLowerCase()];\n if (feature?.Properties) {\n return feature;\n }\n }\n return null;\n }\n\n getAbTestingDataForFeature(featureName: string): IAbTestingFeatureProperties {\n return this._getFeature(this._cachedABTestingData, featureName);\n }\n\n getAnonymousPlayerAbTestingDataForFeature(featureName: string, defaultsToLocalStorageData?: boolean): IAbTestingFeatureProperties {\n let featureData = this._getFeature(this._anonymousPlayerData, featureName);\n if(!featureData) {\n featureData = this._getFeature(this._anonymousPlayerData, featureName.toLowerCase());\n }\n if (!featureData && defaultsToLocalStorageData) {\n featureData = this._getFeature(this._getLocalStorageABTestingData(), featureName);\n }\n return featureData;\n }\n\n private _updateAnonymousAbTestingData() {\n if (!this._params.isAnonymousPlayerSupportEnabled || this.serviceFactory.oAuth2Service().isAuthorized()) {\n this._getAnonymousPlayerDataPromise.resolve();\n return;\n }\n\n if (!this._anonymousPlayerId) {\n this._anonymousPlayerId = this._getLocalStorageAnonymousPlayerId();\n }\n\n const request: any = {\n brandId: this.serviceFactory.skinService().getBrandID(),\n subBrandId: this.serviceFactory.skinService().getSubBrandID(),\n countryCode: this.serviceFactory.countryService().getCountry(),\n isMobile: Device.os.isMobileOS\n };\n if (this._anonymousPlayerId) {\n request.anonymousPlayerId = this._anonymousPlayerId;\n }\n\n // we don't want anonymousPlayerDataPromise to last more than 2 seconds\n this._resetTimeout();\n this._getAnonymousPlayerDataPromiseTimeout = setTimeout(() => {\n // we don't want to keep any \n this._getAnonymousPlayerDataPromise.resolve();\n this._resetTimeout();\n }, 2000);\n\n this.serviceFactory.http2Service().post(this._params.getTestsForAnonymousPlayerUrl, request).then(data => {\n this._anonymousPlayerData = data;\n if (!this._anonymousPlayerId && this._anonymousPlayerData?.AnonymousPlayerId) {\n //we got new anonymous id to save and store\n this._anonymousPlayerId = this._anonymousPlayerData.AnonymousPlayerId;\n this._saveLocalStorageAnonymousPlayerId();\n }\n this._getAnonymousPlayerDataPromise.resolve();\n this._resetTimeout();\n }).catch(ex => {\n this.logger.error(`AbTestingService.getTestsForAnonymousPlayer failed`, ex);\n // we always resolve the promise even if data\n this._getAnonymousPlayerDataPromise.resolve();\n this._resetTimeout();\n });\n }\n\n _resetTimeout() {\n if (this._getAnonymousPlayerDataPromiseTimeout) {\n clearTimeout(this._getAnonymousPlayerDataPromiseTimeout);\n this._getAnonymousPlayerDataPromiseTimeout = null;\n }\n }\n\n getAbTestingData(): { [key: string]: IAbTestingFeatureProperties } {\n if (this._cachedABTestingData?.Features && !this._cachedABTestingData.ErrorDescription) {\n const result: { [key: string]: IAbTestingFeatureProperties } = {};\n for (const featureName in this._cachedABTestingData.Features) {\n result[featureName] = this.getAbTestingDataForFeature(featureName);\n }\n return result;\n } else {\n return null;\n }\n }\n\n waitForAnonymousAbTestingData(): Promise {\n return this._getAnonymousPlayerDataPromise.waitForPromise();\n }\n\n private _readAbTestingDataFromToken(): void {\n const abTestingDataTokenProperty = this.serviceFactory.oAuth2Service().extractTokenProperty('abTestingData');\n if (abTestingDataTokenProperty) {\n this._cachedABTestingData = _.safeJSON(abTestingDataTokenProperty);\n this._saveLocalStorageABTestingData();\n if (this._cachedABTestingData.AnonymousPlayerId &&\n this._cachedABTestingData.AnonymousPlayerId !== this._anonymousPlayerId\n ) {\n if (this._anonymousPlayerId) {\n this.logger.warn(`For user ${this.serviceFactory.userService().getCID()} existing anonymous id ${this._anonymousPlayerId} was replaced by token anonymous id ${this._cachedABTestingData.AnonymousPlayerId}`)\n } else {\n this.logger.debug(`For user ${this.serviceFactory.userService().getCID()} anonymous id was set with token anonymous id ${this._cachedABTestingData.AnonymousPlayerId}`)\n }\n this._anonymousPlayerId = this._cachedABTestingData.AnonymousPlayerId;\n this._saveLocalStorageAnonymousPlayerId();\n }\n } else {\n const localStorageABTestingData = this._getLocalStorageABTestingData();\n if (localStorageABTestingData) {\n this._cachedABTestingData = localStorageABTestingData;\n }\n }\n }\n\n private _saveLocalStorageABTestingData(): void {\n const abTestingData = this._cachedABTestingData;\n if (abTestingData && !abTestingData.ErrorDescription) {\n Store.set(AB_TESTING_DATA_LOCAL_STORAGE_KEY, JSON.stringify(abTestingData));\n }\n }\n\n private _getLocalStorageAnonymousPlayerId(): string {\n return Store.get(AB_TESTING_ANONYMOUS_PLAYER_ID_LOCAL_STORAGE_KEY, null);\n }\n\n private _saveLocalStorageAnonymousPlayerId(): void {\n Store.set(AB_TESTING_ANONYMOUS_PLAYER_ID_LOCAL_STORAGE_KEY, this._anonymousPlayerId);\n }\n\n private _getLocalStorageABTestingData(): IAbTestingData {\n return JSON.parse(Store.get(AB_TESTING_DATA_LOCAL_STORAGE_KEY, null));\n }\n}\n","export const MAX_AI_GAMES = 15;\n\nexport interface IAIList {\n aiEngine: string;\n aiGameTypesArray: number[];\n}\n\nexport default interface IAiListService {\n getAIList(maxGames?: number, shouldFilterByRecentlyPlayed?: boolean, numberOfRecentlyPlayedGameToFilterOut?: number): Promise;\n getAINewGamesList(maxGames?: number, shouldFilterByRecentlyPlayed?: boolean, numberOfRecentlyPlayedGameToFilterOut?: number): Promise;\n sortGames(gameTypes: number[]): Promise;\n getTrendingRecommendedGamesForPlayer(listTypeId?): Promise<{[key:number] : number[]}>\n getGameRecommendations(): Promise;\n clearGamesRecommendationsCache(): void;\n}\n\nexport enum AI_ENGINE_TYPE {\n ML888 = \"ML888\"\n}\n\n\nexport interface IAIGameRecommendations {\n engine: string;\n gameTypes: number[];\n gameTypesOrderDict: { [key: number]: number };\n}\n\nexport interface IAIGameRecommendationsForPlayerByListType {\n [key:number] : number[]\n}","import BaseService from '../../base/base_service';\nimport IAiListService, {\n MAX_AI_GAMES,\n IAIList,\n AI_ENGINE_TYPE,\n IAIGameRecommendations, IAIGameRecommendationsForPlayerByListType\n} from './ai_list_service_interface';\nimport _ from '../../utils/underscore';\nimport {SYSTEM_EVENTS} from \"../../events/events\";\nimport {FEATURE_GAME_RECOMMENDATIONS} from \"../../../../common/const/ab-testing-names\";\nimport { IAbTestingFeatureProperties } from '../../../../common/interfaces/ab-testing-interface';\nimport Store from \"../../utils/store\";\nimport {LIST_TYPE_ID} from \"../../../../common/const/ai-trending-list-ids-map\";\n\ninterface AiListServiceParams {\n getTrendingRecommendedGamesForPlayerApiUrl: string,\n getGameRecommendationsForPlayerUrl:string;\n getNewGamesRecommendationsForPlayerUrl:string;\n}\n\nconst AI_NEW_GAMES_KEY = 'ai_new_games';\nconst AI_GAMES_KEY = 'ai_games';\n\nexport default class AiListService extends BaseService implements IAiListService {\n static CLASS = 'AiListService';\n private _params: AiListServiceParams;\n\n private _cachedRecommendedGames: IAIGameRecommendations;\n private _cachedNewGamesRecommendations: IAIGameRecommendations;\n private _cachedRecommendedGamesForPlayerByListType: IAIGameRecommendationsForPlayerByListType = {};\n\n init(params) {\n super.init(params);\n this._params = params;\n this._subscribe();\n }\n\n private _subscribe(): void {\n this.onSystemEvent(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, () => {\n // Related to this bug: Bug 1866277: Search results should be ordered by top 10 API\n if(this.serviceFactory.oAuth2Service().isAuthorized()) {\n this._cachedRecommendedGamesForPlayerByListType = {};\n }\n\n this._cachedRecommendedGames = null;\n this._cachedNewGamesRecommendations = null;\n });\n }\n\n clearGamesRecommendationsCache(): void {\n this._cachedRecommendedGames = null;\n }\n\n getAIList(maxGames: number = MAX_AI_GAMES, shouldFilterByRecentlyPlayed: boolean = true, numberOfRecentlyPlayedGameToFilterOut: number = 0): Promise {\n return this._resolveAIList(\n () => this.getGameRecommendations(),\n maxGames, shouldFilterByRecentlyPlayed, numberOfRecentlyPlayedGameToFilterOut,\n AI_GAMES_KEY,\n []\n );\n }\n\n private _getGameRecommendationsPromise: Promise = null;\n getGameRecommendations(): Promise {\n if (!this.serviceFactory.oAuth2Service().isAuthorized()) {\n return Promise.reject('Can`t get game recommendations for unauthorized user');\n }\n\n if (!this._playerHasRecommendations()) {\n return Promise.resolve({\n engine: null,\n gameTypes: [],\n gameTypesOrderDict: {}\n });\n }\n\n if (this._cachedRecommendedGames) {\n return Promise.resolve(this._cachedRecommendedGames);\n }\n\n const engineId: string = this._getEngineID(this._getGameRecommendationsEngine()).toString();\n if (_.isEmpty(this._params.getGameRecommendationsForPlayerUrl)) {\n this.logger.debug('getGameRecommendationsForPlayerUrl is empty ');\n return Promise.resolve({\n engine: null,\n gameTypes: [],\n gameTypesOrderDict: {}\n });\n }\n\n if(this._getGameRecommendationsPromise) {\n return this._getGameRecommendationsPromise;\n }\n\n this._getGameRecommendationsPromise = this.serviceFactory.http2Service().post(this._params.getGameRecommendationsForPlayerUrl, {engineType: engineId})\n .then((data: { GameTypes: number[], Engine: string }) => {\n this._getGameRecommendationsPromise = null;\n this._cachedRecommendedGames = {\n gameTypes: data.GameTypes,\n engine: data.Engine,\n gameTypesOrderDict: this._convertToGameTypesDict(data.GameTypes)\n };\n return this._cachedRecommendedGames;\n }).catch(() => {\n this._getGameRecommendationsPromise = null;\n this._cachedRecommendedGames = {\n gameTypes:[],\n engine: null,\n gameTypesOrderDict:{}\n };\n return this._cachedRecommendedGames;\n });\n\n return this._getGameRecommendationsPromise;\n }\n\n getAINewGamesList(maxGames: number = MAX_AI_GAMES, shouldFilterByRecentlyPlayed: boolean = true, numberOfRecentlyPlayedGameToFilterOut: number = 0): Promise {\n return this._resolveAIList(\n () => this._getNewGameRecommendations(),\n maxGames, shouldFilterByRecentlyPlayed, numberOfRecentlyPlayedGameToFilterOut,\n AI_NEW_GAMES_KEY,\n {\n aiEngine: '',\n aiGameTypesArray: []\n }\n );\n }\n\n private _getNewGameRecommendations(): Promise {\n if (!this.serviceFactory.oAuth2Service().isAuthorized()) {\n return Promise.reject('Can`t get new game recommendations for unauthorized user');\n }\n\n if (this._cachedNewGamesRecommendations) {\n return Promise.resolve(this._cachedNewGamesRecommendations);\n }\n\n return this.serviceFactory.http2Service().post(this._params.getNewGamesRecommendationsForPlayerUrl)\n .then((data: { GameTypes: number[], Engine: string }) => {\n this._cachedNewGamesRecommendations = {\n gameTypes: data.GameTypes,\n engine: AI_ENGINE_TYPE.ML888,\n gameTypesOrderDict: this._convertToGameTypesDict(data.GameTypes)\n };\n\n return this._cachedNewGamesRecommendations;\n });\n }\n\n async getTrendingRecommendedGamesForPlayer(listTypeIds: LIST_TYPE_ID[]): Promise {\n const countryCode = this.serviceFactory.countryService().getCountry();\n\n if (_.isNullOrUndefined(countryCode) || _.isEmpty(this._params?.getTrendingRecommendedGamesForPlayerApiUrl)) {\n return {};\n }\n\n // If we already have in runtime memory the response for all the requested listTypeIDs\n if(!_.isEmpty(this._cachedRecommendedGamesForPlayerByListType) && listTypeIds.every(listID => this._cachedRecommendedGamesForPlayerByListType.hasOwnProperty(listID))){\n return this._cachedRecommendedGamesForPlayerByListType;\n }\n\n const gameTypesPerListID: IAIGameRecommendationsForPlayerByListType = await this.serviceFactory.http2Service()\n .post(this._params.getTrendingRecommendedGamesForPlayerApiUrl,\n {\n listTypeIds: listTypeIds,\n subBrandId: this.serviceFactory.skinService().getSubBrandID(),\n countryCode\n });\n\n for (let listID in gameTypesPerListID){\n if(gameTypesPerListID.hasOwnProperty(listID)) {\n this._cachedRecommendedGamesForPlayerByListType[listID] = await this._filterGameTypes(gameTypesPerListID[listID], false, 0);\n }\n }\n\n return this._cachedRecommendedGamesForPlayerByListType;\n }\n\n sortGames(gameTypes: number[]): Promise {\n return this.getGameRecommendations().then(\n (gameRecommendations) => AiListService._sortGames(gameTypes, gameRecommendations.gameTypesOrderDict)\n );\n }\n\n private static _sortGames(gameTypes: number[], gameTypesDict: { [gameType: number]: number }): number[] {\n if (!_.isObject(gameTypesDict)) {\n return gameTypes;\n }\n\n return gameTypes.sort((gt1, gt2) => {\n const index1 = gameTypesDict[gt1];\n const index2 = gameTypesDict[gt2];\n\n if (_.isUndefined(index1)) { //if gt1 is not in the AI recommendations\n if (_.isUndefined(index2)) { //and if gt2 also is not in the AI recommendations\n return -1; // then gt1 goes before gt2 (keeping the same order)\n } else {\n return 1; // otherwise gt1 goes after gt2 (any game that is in the AI recommendation goes before those that are not in the AI recommendations)\n }\n }\n\n if (_.isUndefined(index2)) { //if gt2 is not in the AI recommendations obviously gt1 is in the AI recommended games (otherwise the previous if statement will apply)\n return -1; // so gt2 goes after gt1\n }\n\n return (index1 < index2) ? -1 : 1; //gt1 goes before gt2 if index1 < index2\n });\n }\n\n private _resolveAIList(\n apiFunction: () => Promise,\n maxGames: number, shouldFilterByRecentlyPlayed: boolean, numberOfRecentlyPlayedGameToFilterOut: number, storeKey: string, defaultValueForKey: any) {\n\n if (!this.serviceFactory.oAuth2Service().isAuthorized()) {\n const aiGamesStored = Store.get(storeKey, JSON.stringify(defaultValueForKey));\n\n return Promise.resolve(JSON.parse(aiGamesStored));\n }\n\n return apiFunction()\n .then(data => {\n data.gameTypes = data.gameTypes || [];\n return this._filterRecommendedGames(data, maxGames, shouldFilterByRecentlyPlayed, numberOfRecentlyPlayedGameToFilterOut).then((aiGames)=> {\n Store.set(storeKey, JSON.stringify(aiGames));\n return aiGames;\n });\n }).catch((err)=> {\n this.logger.error(`_resolveAIList api call failed for store key:${storeKey}. Error: ${JSON.stringify(err)}`);\n Store.del(storeKey);\n return defaultValueForKey;\n });\n }\n\n private _filterRecommendedGames(aiRecommendations, maxGames, shouldFilterByRecentlyPlayed, numberOfRecentlyPlayedGameToFilterOut) {\n return this._filterGameTypes(aiRecommendations.gameTypes, shouldFilterByRecentlyPlayed, numberOfRecentlyPlayedGameToFilterOut)\n .then(gameTypes => gameTypes.slice(0, maxGames))\n .then(gameTypes => {\n return {\n aiEngine: aiRecommendations.engine,\n aiGameTypesArray: gameTypes\n };\n });\n }\n\n private _filterGameTypes(gameTypes, shouldFilterByRecentlyPlayed, numberOfRecentlyPlayedGameToFilterOut) {\n let result;\n\n if (shouldFilterByRecentlyPlayed) {\n result = this._filterByRecentlyPlayed(gameTypes, numberOfRecentlyPlayedGameToFilterOut);\n } else {\n result = Promise.resolve(gameTypes);\n }\n\n return result\n .then(filteredGameTypes => this._filterByLayout(filteredGameTypes))\n .then(filteredGameTypes => this._filterAllowedToPlayRealGames(filteredGameTypes));\n }\n\n /**\n * @description Get the recently played game type array and remove them for the AI games list\n * @numberOfRecentlyPlayedGameToFilterOut By default we will filter out all the recently played games,\n * unless we got a specific number of games to filter out\n * @Note Games that are in the recently played list will not be shown to the user in AI list\n * @return {boolean}\n */\n private _filterByRecentlyPlayed(gameTypes, numberOfRecentlyPlayedGameToFilterOut) {\n return this.serviceFactory.recentlyPlayedService().getRecentlyPlayedList().then(recentlyPlayedGameTypes => {\n recentlyPlayedGameTypes = recentlyPlayedGameTypes || [];\n if (numberOfRecentlyPlayedGameToFilterOut) {\n recentlyPlayedGameTypes = recentlyPlayedGameTypes.slice(0, numberOfRecentlyPlayedGameToFilterOut);\n }\n return gameTypes.filter(gameType => recentlyPlayedGameTypes.indexOf(gameType) === -1);\n });\n }\n\n private _filterByLayout(gameTypes) {\n const result = this.serviceFactory.integrationService().filterInLayoutGames(gameTypes);\n if (result) {\n return result;\n }\n\n return Promise.resolve(gameTypes);\n }\n\n async _filterAllowedToPlayRealGames(gameTypes) {\n const result = await this.serviceFactory.integrationService().filterAllowedToPlayRealGames(gameTypes);\n if (result) {\n return result;\n }\n\n return Promise.resolve(gameTypes);\n }\n\n private _playerHasRecommendations(): boolean {\n const engine = this._getGameRecommendationsEngine();\n if (engine) {\n const noRecommendationMatches = engine.match(/no\\s*recommendation/gi) || [];\n return noRecommendationMatches.length === 0;\n }\n return true;\n }\n\n private _getGameRecommendationsEngine(): string {\n let engine: string;\n const gameRecommendations: IAbTestingFeatureProperties = this.serviceFactory.abTestingService().getAbTestingDataForFeature(FEATURE_GAME_RECOMMENDATIONS);\n if (gameRecommendations) {\n engine = (gameRecommendations.Properties || {}).Engine;\n }\n return engine;\n }\n\n private _getEngineID(engine: string): number {\n engine = engine ? engine.toUpperCase() : engine;\n if (engine === AI_ENGINE_TYPE.ML888) {\n return 1;\n } else {\n return 0;\n }\n }\n\n private _convertToGameTypesDict(gameTypes: number[]): { [key: number]: number } {\n const dict: { [key: number]: number } = {};\n if (!gameTypes) {\n return dict;\n }\n\n gameTypes.forEach((gameType, index) => {\n dict[gameType] = index;\n });\n\n return dict;\n }\n}\n","import _ from '../../utils/underscore';\nimport BaseService from '../../base/base_service';\nimport Event from '../../utils/event';\nimport {SYSTEM_EVENTS} from '../../events/events';\nimport IAnalyticsService, { AnalyticsServiceInitParams, IAnalyticsData } from './analytics_service_interface';\nimport {IElasticEventData, IStructuredLogger} from '../../../../common/interfaces/structured-logging-service-interface';\n\nconst GTM_URL = 'www.googletagmanager.com/gtm.js';\nconst PROD_DATA_LAYER_NAME = 'dataLayer';\n\nclass AnalyticsService extends BaseService implements IAnalyticsService{\n\n static CLASS: string = 'AnalyticsService';\n private _initParams: AnalyticsServiceInitParams = null;\n private _GTMDataLayer: any = null;\n\n private _isInitialisedByB2C: boolean = false;\n\n init(params: AnalyticsServiceInitParams) {\n super.init(params);\n this._setInitParams(params);\n this._subscribe();\n }\n\n private _setInitParams(params: AnalyticsServiceInitParams): void {\n this._initParams = {\n GTMContainerID: params.GTMContainerID,\n UATrackingID: params.UATrackingID,\n GTMDataLayerName: params.GTMDataLayerName\n };\n this._initGTMDataLayer();\n }\n\n private _initGTMDataLayer(): void {\n this._GTMDataLayer = {\n cgpIsAuthenticated: false,\n cgpIsRegistered: false,\n cgpCID: undefined,\n cgpIsFTD: false,\n cgpPlayerStatus: undefined,\n cgpLoginSessionID: undefined\n };\n }\n\n\n private _loadGTM(document: Document, dataLayerName: string, GTMContainerId: string): void {\n this.pushDataToDataLayer({'gtm.start': new Date().getTime(), 'event': 'gtm.js'});\n\n const firstScript: HTMLScriptElement = document.getElementsByTagName(\"script\")[0];\n\n const newScript: HTMLScriptElement = document.createElement(\"script\");\n const dataLayer: string = dataLayerName !== PROD_DATA_LAYER_NAME ? '&l=' + dataLayerName : '';\n newScript.async = true;\n newScript.src = '//' + GTM_URL + '?id=' + GTMContainerId + dataLayer;\n firstScript.parentNode.insertBefore(newScript, firstScript);\n }\n\n\n /**\n * Gathering analytic data from CGP\n *\n * @returns {*}\n * @private\n */\n private _getCGPEventData(): any {\n this._initGTMDataLayer();\n // tslint:disable-next-line:no-console\n console.log(\"PASSED\");\n const dataLayer = this._GTMDataLayer;\n\n // get authorized data\n if (this.serviceFactory.oAuth2Service().isAuthorized()) {\n // authorization data\n dataLayer.cgpLoginSessionID = +this.serviceFactory.oAuth2Service().getToken().sessionId;\n\n // user service data\n const accountData = this.serviceFactory.userService().getAccountData();\n if (accountData) {\n dataLayer.cgpCID = accountData.Cid;\n dataLayer.cgpIsVip = accountData.IsVip;\n }\n\n // b2c data\n const b2cData = this._getB2CData();\n if (b2cData && b2cData.sessionParamsMsg) {\n dataLayer.cgpPlayerStatus = b2cData.sessionParamsMsg.PlayerStatus;\n dataLayer.cgpIsFTD = b2cData.sessionParamsMsg.IsFTD;\n dataLayer.cgpIsRegistered = b2cData.sessionParamsMsg.IsRegistered;\n dataLayer.cgpIsAuthenticated = b2cData.sessionParamsMsg.IsAuthenticated;\n }\n }\n\n dataLayer.cgpExperiment = undefined;\n\n return dataLayer;\n }\n\n /**\n * Extract b2c data\n * @returns {any}\n * @private\n */\n private _getB2CData(): any {\n const b2cData = this.serviceFactory.oAuth2Service().extractTokenProperty('b2c');\n if (b2cData) {\n return JSON.parse(b2cData);\n }\n }\n\n /**\n * Temp function to select B2C dataLayer if initialized before our dataLayer (Use their over ours)\n */\n _selectPlatformDataLayerIfExists() {\n if(window[PROD_DATA_LAYER_NAME]) {\n this._initParams.GTMDataLayerName = PROD_DATA_LAYER_NAME;\n this._isInitialisedByB2C = true;\n }\n }\n\n /**\n * initialization of datalayer and GTM\n * @private\n */\n private _initGTM(): void {\n const dataLayerName = this._initParams.GTMDataLayerName;\n\n window[dataLayerName] = window[dataLayerName] || [];\n this.pushDataToDataLayer(this._createDataLayer());\n\n if (!this._isInitialisedByB2C) {\n this._loadGTM(document, this._initParams.GTMDataLayerName, this._initParams.GTMContainerID);\n }\n }\n\n\n private _subscribe(): void {\n this.onSystemEvent(SYSTEM_EVENTS.ON_INIT_COMPLETE, () => {\n this._selectPlatformDataLayerIfExists();\n this._initGTM();\n });\n\n this.onSystemEvent(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, () => {\n this.pushDataToDataLayer(this._createDataLayer());\n });\n\n this.onSystemEvent(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, (data) => {\n this._sendAnalytics(data);\n });\n }\n\n\n private _sendAnalytics(data: IAnalyticsData): void {\n const dataToSend = Object.assign({},\n {\n event: data.eventName || 'CGP_GENERIC_EVENT',\n CGP_EventCategory: data.category,\n CGP_EventAction: data.action,\n CGP_EventLabel: data.label,\n CGP_EventValue: data.value\n });\n\n if (!data.omitStructuredLogger) {\n this._sendAnalyticsToElasticSearch(data);\n }\n\n this.pushDataToDataLayer(dataToSend);\n this._resetDataLayer();\n }\n\n private _sendAnalyticsToElasticSearch(data: IAnalyticsData) {\n const dataToSend: IElasticEventData = {\n CGPEventCategory: data.category?.toString(),\n CGPEventAction: data.action?.toString(),\n CGPEventLabel: data.label?.toString(),\n CGPEventValue: data.value?.toString()\n };\n\n if (!_.isNullOrUndefined(dataToSend.CGPEventValue)) {\n const valueAsNumber = (dataToSend.CGPEventValue as any) * 1;\n if (_.isNumber(valueAsNumber)) {\n dataToSend.CGPEventValueAsNumber = valueAsNumber;\n }\n }\n\n this.serviceFactory.structuredLoggingService().getLogger(dataToSend).info();\n }\n\n /**\n * Clear GTM dataLayer for avoid memory leak\n * GTM persists dataLayer properties, so in order to send each time the new data, we have to reset dataLayer at all, otherwise we should provide\n * undefined value for each property we don't want to send, for example user properties if they are not exist anymore\n * @private\n */\n private _resetDataLayer(): void {\n this._getDataLayerObject().pop();\n // window.google_tag_manager[this._model.getGTMContainerID()].dataLayer.reset();\n }\n\n private _getDataLayerObject(){\n return window[this._initParams.GTMDataLayerName] || {pop: () =>{} , push : ()=>{}};\n }\n\n\n /**\n * Get data layer object to be send\n * @returns {{} & any & any}\n * @private\n */\n private _createDataLayer(): any {\n return Object.assign({},\n {\n cgpUATrackingID: this._initParams.UATrackingID,\n },\n this._getCGPVersionInfo(),\n this._getCGPEventData());\n }\n\n\n private _getCGPVersionInfo(): any {\n const skinService = this.serviceFactory.skinService();\n return {\n cgpProductPackage: skinService.getProductPackageID(),\n cgpVersion: skinService.getVersion()\n };\n }\n\n public sendEvent(analyticsData: IAnalyticsData): void {\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, analyticsData);\n }\n\n public sendClickstreamEvent(analyticsData: IAnalyticsData):void{\n try {\n const logger: IStructuredLogger = this.serviceFactory.structuredLoggingService()\n .getLogger()\n .addCategory(analyticsData.category)\n .addAction(analyticsData.action)\n .addLabel(analyticsData.label)\n .addValue(analyticsData.value);\n\n logger.setEventType(analyticsData.eventName,'Log', 'Analytics');\n logger.info();\n }\n catch (err){\n console.log(\"Error on CGP sendOrbitUserFlowEvent : \" + err);\n }\n }\n\n sendOrbitUserFlowEvent(analyticsData: IAnalyticsData):void{\n try {\n const logger: IStructuredLogger = this.serviceFactory.structuredLoggingService()\n .getLogger()\n .addCategory(analyticsData.category)\n .addAction(analyticsData.action)\n .addLabel(analyticsData.label)\n .addValue(analyticsData.value);\n\n logger.setEventType('Orbit_User_Flow','Log', 'Analytics');\n logger.info();\n }\n catch (err){\n console.log(\"Error on CGP sendOrbitUserFlowEvent : \" + err);\n }\n }\n\n private _getGoogleSessionObject() {\n const ga = this.serviceFactory.windowService().getGlobalProperty('ga');\n if (ga && _.isFunction(ga.getAll)) {\n return ga.getAll()[0] || {\n get: () => {}\n };\n } else {\n return {\n get: () => {}\n }\n }\n\n }\n\n public getGoogleSessionID(): string {\n return this._getGoogleSessionObject().get('linkerParam') || '';\n }\n\n public getGoogleClientID(): string {\n return this._getGoogleSessionObject().get('clientId') || '';\n }\n\n public pushDataToDataLayer(data:{}):void {\n this._getDataLayerObject().push(data);\n }\n\n}\n\nexport default AnalyticsService;","import {\n IAnalyticsDisplayMessage,\n ICasinofiedAnalyticsService,\n IMessageActionTakenEventParams\n} from \"../../../../common/interfaces/casinofied-analytics-proxy.interface\";\nimport BaseService from \"../../base/base_service\";\nimport ICasinofiedAnalyticsProxyService from \"./casinofied_analytics_proxy_service_interface\";\n\ninterface CasinofiedAnalyticsProxyServiceParams {\n getCasinofiedAnalyticsService: () => ICasinofiedAnalyticsService;\n}\n\nexport default class CasinofiedAnalyticsProxyService extends BaseService implements ICasinofiedAnalyticsProxyService{\n static CLASS = 'CasinofiedAnalyticsProxyService';\n private _params: CasinofiedAnalyticsProxyServiceParams;\n\n init(params: CasinofiedAnalyticsProxyServiceParams) {\n this._params = params;\n }\n\n messageDisplay(params: IAnalyticsDisplayMessage): void {\n return this._params.getCasinofiedAnalyticsService().messageDisplay(params);\n }\n\n messageActionTaken(params: IMessageActionTakenEventParams): void {\n return this._params.getCasinofiedAnalyticsService().messageActionTaken(params);\n }\n}","import BaseService from \"../../base/base_service\";\nimport {SYSTEM_EVENTS} from \"../../events/events\";\nimport Event from \"../../utils/event\";\nimport * as MDP_CONSTS from \"../../components/message/message_consts\";\nimport {CHANNEL_ELEMENTS, CHANNEL_SOURCE} from \"../../../../common/const/casinofied-analytics-consts\";\nimport {AreaType, CashierSessionType} from \"@sparkware/uc-sdk-core\";\n\ninterface IBetRejectedData {\n RejectionReasonId: number;\n GameTypeID: number;\n RealMoneyBalance: number;\n BetCurrencyCode: string;\n}\n\nconst BET_REJECT_REASON_ID_MAP = {\n 'Sport': 1,\n 'Poker': 2,\n 'PokerAndSport': 3,\n};\n\nexport default class BonusAbuseParkingMoneyInSportAndPokerService extends BaseService {\n static CLASS = \"BonusAbuseParkingMoneyInSportAndPokerService\";\n\n init() {\n this._subscribe();\n }\n\n private _subscribe() {\n this.onSystemEvent(SYSTEM_EVENTS.BONUS_ABUSE_PARKING_MONEY, this._showBonusAbuseParkingMoneyMessage)\n }\n\n private async _showBonusAbuseParkingMoneyMessage(data: IBetRejectedData): Promise {\n let contentText;\n switch(data.RejectionReasonId){\n case BET_REJECT_REASON_ID_MAP.Poker:\n contentText = `bonus_abuse_parking_money_text_poker_${data.RealMoneyBalance > 0 ? 'with' : 'without'}_real_money`;\n break;\n case BET_REJECT_REASON_ID_MAP.Sport:\n contentText = `bonus_abuse_parking_money_text_sport_${data.RealMoneyBalance > 0 ? 'with' : 'without'}_real_money`;\n break;\n case BET_REJECT_REASON_ID_MAP.PokerAndSport:\n contentText = `bonus_abuse_parking_money_text_poker_and_sport_${data.RealMoneyBalance > 0 ? 'with' : 'without'}_real_money`;\n break;\n }\n\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent({\n category: 'Bonus_Availability_Popup',\n action: 'Show' ,\n label: data.GameTypeID.toString(),\n value: data.RejectionReasonId.toString()\n });\n\n\n const isGameRunning = await this.serviceFactory.gameService().isGameRunning();\n\n Event.fire(SYSTEM_EVENTS.MESSAGE_OPEN, {\n title: this.serviceFactory.languageService().translation('bonus_abuse_parking_money_title'),\n text: this.serviceFactory.languageService().translation(contentText, {\n RealMoneyBalance: this.serviceFactory.currencyService().formatMoney(data.RealMoneyBalance)\n }),\n closeButton: false,\n hasDefaultButton: false,\n contentAlign: MDP_CONSTS.TEXT_ALIGNMENT.LEFT,\n customCSSClassList: ['cgp-mdp-text-support-slash-n'],\n buttons: [\n {\n name: this.serviceFactory.languageService().translation('logged_in_cashier_btn'),\n callback: () => {\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent( {\n category: 'Bonus_Availability_Popup',\n action: 'CTA_Click' ,\n label: 'cashier_btn'\n });\n\n this.serviceFactory.cashierProxyService().openCashier({\n sessionType: CashierSessionType.FullCashier,\n channel: {\n source: CHANNEL_SOURCE.casinoClient,\n area: AreaType.Message,\n element: CHANNEL_ELEMENTS.depositButton\n }\n\n });\n }\n },\n {\n name: this.serviceFactory.languageService().translation(isGameRunning ? 'close_game' : 'close_btn'),\n type: \"secondary\",\n callback: () => {\n let label = 'Close Message';\n if(isGameRunning) {\n label = 'Close Game';\n this.serviceFactory.gameService().closeRunningGame();\n }\n\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent( {\n category: 'Bonus_Availability_Popup',\n action: 'CTA_Click' ,\n label: label\n });\n }\n }\n ],\n showPopupAboveSecondWebViewHybrid: true\n });\n }\n}\n","import ICashierProxy from \"./cashier_proxy_service_interface\";\nimport BaseService from \"../../base/base_service\";\nimport {\n ICashierService,\n OpenCashierOptions,\n OpenDepositOptions,\n OpenWithdrawOptions,\n OpenTransactionHistoryOptions\n} from \"../../../../common/interfaces/cashier.service.interface\";\n\ninterface CashierProxyServiceParams {\n getCashierService: () => ICashierService;\n}\nexport default class CashierProxyService extends BaseService implements ICashierProxy {\n static CLASS = 'CashierProxyService';\n private _params: CashierProxyServiceParams;\n\n init(params: CashierProxyServiceParams) {\n this._params = params;\n }\n\n isEligibleForDepositWidget(): Promise {\n return this._params.getCashierService().isEligibleForDepositWidget();\n }\n\n isCashierInRedirectMode(): Promise {\n return this._params.getCashierService().isCashierInRedirectMode();\n }\n\n getProductPackage() {\n return this._params.getCashierService().getProductPackage();\n }\n\n openDeposit(options: OpenDepositOptions): Promise {\n return this._params.getCashierService().openDeposit(options);\n }\n \n openWithdraw(options: OpenWithdrawOptions): Promise {\n return this._params.getCashierService().openWithdraw(options);\n }\n\n openTransactionHistory(options: OpenTransactionHistoryOptions): Promise {\n return this._params.getCashierService().openTransactionHistory(options);\n }\n\n openCashier(options?: OpenCashierOptions): Promise {\n return this._params.getCashierService().openCashier(options);\n }\n openUploadDocumentsFromCashier(): Promise {\n return this._params.getCashierService().openUploadDocumentsFromCashier();\n }\n\n openOldCashier(options?: OpenCashierOptions): Promise {\n return this._params.getCashierService().openOldCashier(options);\n }\n\n}","import BaseService from '../../base/base_service';\nimport {CLOCK_CONSTS, CLOCK_LOCALIZATION} from './clock_service_consts';\nimport DOM from '../../utils/dom';\nimport Event from '../../utils/event';\nimport {SYSTEM_EVENTS} from '../../events/events';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport _ from \"../../utils/underscore\";\nimport IClockService, {\n ClockServiceInitParams,\n ClockServiceParsedInitParams,\n DateFormattedToRegulationOffset,\n} from './clock_service_interface';\nimport ReconnectHelper, {RetryItem} from \"../../utils/reconnect_helper\";\n\nexport const RETRY_INTERVALS: RetryItem[] = [\n {durationInSeconds:3, repeatTimes:3},\n {durationInSeconds:30, repeatTimes:0},\n];\n\nclass ClockService extends BaseService implements IClockService{\n static CLASS: string = 'ClockService';\n\n private _timeClockInterval: number = null;\n private _serverUpdateInterval: number = null;\n private _timeData: Date = null;\n private _updateOnce: boolean = null;\n private _initParams: ClockServiceParsedInitParams = null;\n private _regulationOffset: number = null;\n private _retryGetClockHelper: ReconnectHelper;\n\n init(params: ClockServiceInitParams) {\n super.init(params);\n\n this._setInitParams(params);\n this._subscribe();\n }\n\n private _setInitParams(params: ClockServiceInitParams): void {\n const clockUpdateFromServerInterval = params.clockUpdateFromServerInterval || CLOCK_CONSTS.DEFAULT_CLOCK_UPDATE_FROM_SERVER_INTERVAL;\n this._initParams = {\n getClockUrl: params.getClockUrl,\n clockUpdateFromServerInterval: TimeSpan.parse(clockUpdateFromServerInterval),\n };\n if (params) {\n this._getLocalDate = params.getLocalDate || this._getLocalDate;\n }\n }\n\n private _subscribe(): void {\n this.onSystemEvent(SYSTEM_EVENTS.ON_INIT_COMPLETE, this._onInitComplete);\n this.onSystemEvent(SYSTEM_EVENTS.APP_RESUMED, this._readServerClock);\n }\n\n private _onInitComplete(): void {\n this._tryReadServerClock();\n if (!this._serverUpdateInterval) {\n this._serverUpdateInterval = DOM.setInterval(() => this._tryReadServerClock(), this._initParams.clockUpdateFromServerInterval.totalMilliseconds);\n }\n }\n\n private _tryReadServerClock(){\n this._removeRetryReadClockHelper();\n this._retryGetClockHelper = this._createRetryReadClockHelper();\n this._retryGetClockHelper.start();\n }\n private _createRetryReadClockHelper() {\n return ReconnectHelper.create({\n retryFunc: () => this._readServerClock(),\n retryIntervals: RETRY_INTERVALS,\n name: 'CLOCK',\n });\n }\n\n private _removeRetryReadClockHelper() {\n if (!_.isNullOrUndefined(this._retryGetClockHelper)) {\n this._retryGetClockHelper.stop();\n this._retryGetClockHelper = null;\n }\n }\n\n private _restartTimerInterval(): void {\n if (this._timeClockInterval) {\n DOM.clearInterval(this._timeClockInterval);\n }\n this._timeClockInterval = DOM.setInterval(() => this._increaseTimer(),\n CLOCK_CONSTS.TIMER_UPDATE_INTERVAL, 'CLOCK_INCREMENT_INTERVAL_TIMER');\n }\n\n private _increaseTimer(): void {\n const utcTime = this._timeData.getTime();\n this._timeData = new Date(utcTime + CLOCK_CONSTS.TIMER_UPDATE_INTERVAL);\n }\n\n private _getClockLocalization(): string {\n return this.serviceFactory.regulationService().getClockLocalization();\n }\n\n public setServerTime(serverTime: string|number): void {\n this._timeData = new Date(serverTime);\n this._restartTimerInterval();\n }\n\n public setRegulationOffset(regOffset: number): void {\n this._regulationOffset = regOffset;\n }\n\n public getCurrentDate(): Date {\n return this._timeData || this._getLocalDate();\n }\n\n public getCurrentServerDate(): Date {\n return this._timeData;\n }\n\n public getRegulationOffset(): number {\n return this._regulationOffset;\n }\n\n private _getLocalDate(): Date {\n return new Date();\n }\n\n //Convert utc date to its equivalent in regulation timezone.\n public convertToRegulationTimeZone(date: Date): DateFormattedToRegulationOffset {\n date = date || this._getLocalDate();\n const useLocalTime = CLOCK_LOCALIZATION.LOCAL === this._getClockLocalization() || null == this.getRegulationOffset();// if offset not defined -> fallback to local time. Please note offset = 0 is accessible value\n if (!useLocalTime) {\n // convert to regulation date\n const utcTime = date.getTime();\n date = new Date(utcTime + this.getRegulationOffset());\n }\n return {\n date: date,\n isUTC: !useLocalTime\n };\n }\n\n private _readServerClock(): Promise {\n return this.serviceFactory.http2Service().post(this._initParams.getClockUrl)\n .then(response => {\n this.setServerTime((response as any).DateTimeUtcFormated);\n this.setRegulationOffset((response as any).RegulationOffsetInMilliseconds);\n this._timeUpdatedFromServer();\n }).catch(err => {\n this.logger.error('Failed to retrieve server clock', err);\n throw err;\n });\n }\n\n private _timeUpdatedFromServer(): void {\n if (!this._updateOnce) {\n Event.fire(SYSTEM_EVENTS.TIME_UPDATED_FROM_SERVER);\n this._updateOnce = true;\n }\n }\n\n // Decides which parameter to use regular or regulation\n // If exists regulation time use it without any conversion\n // if regulation parameter not excist - use regular and shift local PC timezone\n public formatToRegulationOffset(date: Date, dateFormattedToRegulation: Date): DateFormattedToRegulationOffset {\n let isUTC = false;\n // if we already have date in regulation timezone - use it\n if (!_.isNullOrUndefined(dateFormattedToRegulation)) {\n date = dateFormattedToRegulation;\n isUTC = true;\n }\n return {\n date: date,\n isUTC: isUTC\n };\n }\n}\nexport default ClockService;","const CLOCK_LOCALIZATION = {\n LOCAL: 'LOCAL',\n SERVER: 'SERVER'\n};\nconst CLOCK_CONSTS = {\n TIMER_UPDATE_INTERVAL: 1000,\n DEFAULT_CLOCK_UPDATE_FROM_SERVER_INTERVAL: '00:05:00'\n};\n\nexport {CLOCK_LOCALIZATION, CLOCK_CONSTS};","import BaseService from \"../../base/base_service\";\n\n\nexport default class ComponentFactoryService extends BaseService {\n static CLASS = 'ComponentFactoryService';\n\n createComponent(componentPrototype, params) {\n return componentPrototype.create(params);\n }\n\n\n\n}\n","import BaseService from '../../base/base_service';\nimport _ from '../../utils/underscore';\nimport IConfigService from './config_service_interface';\n\nconst STOP_CONFIGS: string[] = []; //ex.[\"defaults.logLevel\", \"Language.iso3\", \"Initialize.logLevel\"]\n\nclass ConfigService extends BaseService implements IConfigService{\n\n static CLASS: string = 'ConfigService';\n private _configs: any[] = [];\n\n init(params) {\n super.init(params);\n if (this._configs.length === 0) {\n this._pushQueryStringParameters();\n }\n }\n\n //Push parameters coming from query String as highest priority\n private _pushQueryStringParameters(): void {\n const queryParams = this._convertToObject(_.getQueryParameters());\n\n this._pushConfig(9999, this._cleanConfig(queryParams));\n\n }\n\n private _convertToObject(params: any): any {\n const obj = {};\n\n Object.keys(params).forEach(param=> {\n const val = params[param];\n const miniObj = param.split('.').reduceRight((prev, key, idx, arr)=> {\n const newObj = {};\n newObj[key] = prev;\n\n if (idx === arr.length - 1) {\n newObj[key] = val;\n }\n\n return newObj;\n }, {});\n\n _.mergeDeep(obj, miniObj);\n });\n\n return obj;\n }\n\n private _pushConfig(level: number, config: any): any[] {\n if (this._configs[level]) {\n throw new Error(\"Config Level already set!\");\n }\n this._configs[level] = config;\n return this._configs;\n }\n\n private _cleanConfig(config: any) {\n STOP_CONFIGS.forEach(stop => {\n config = this._deleteByPath(config, stop);\n });\n return config;\n }\n\n private _deleteByPath(object: any, path: string): any {\n let currentObject = object;\n const nestedProperties = path.split(\".\");\n const lastProperty = nestedProperties.pop();\n for (const property of nestedProperties) {\n currentObject = currentObject[property];\n if (!currentObject) {\n return;\n }\n }\n delete currentObject[lastProperty];\n return object;\n }\n\n //Setter User Config from CGP.initialize({}).\n public setUserConfig(config: any): void {\n this._pushConfig(1, this._cleanConfig(config));\n }\n\n //Setter Config from Server Configurations\n public setDefaultConfig(config: any): void {\n this._pushConfig(0, config);\n }\n\n //Get merged Configs\n public getConfig(): any {\n const configValues = Object.keys(this._configs).map(key => this._configs[key]);\n\n configValues.unshift({});\n\n return _.mergeDeep.apply(_, configValues);\n }\n}\n\nexport default ConfigService;","import BaseService from '../../base/base_service';\nimport ICountryService, { CountryServiceInitParams } from './country_service_interface';\nimport {IGeoLocationInfo} from \"../../../../common/interfaces/geo-location-info.interface\";\nimport {SYSTEM_EVENTS} from \"../../events/events\";\nimport Device from \"../../utils/device/device\";\nimport {Check} from \"@sparkware/app-utils\";\nimport IStateOfResidence from \"../../../../common/interfaces/state-of-residence.interface\";\n\nclass CountryService extends BaseService implements ICountryService{\n\n static CLASS: string = 'CountryService';\n\n private _initParams: CountryServiceInitParams = null;\n\n protected init(params: CountryServiceInitParams): void {\n super.init(params);\n this._setInitParams(params);\n this._subscribe();\n }\n\n private _subscribe() {\n this.onSystemEvent(SYSTEM_EVENTS.ON_INIT_COMPLETE, ()=>{\n if(this._shouldCallCountryByIP()) {\n this._countryByIP().then(()=> {\n this.checkIfCorrectAppInUse();\n })\n }\n });\n }\n\n private _setInitParams(params: CountryServiceInitParams): void {\n this._initParams = {\n default: params.default.toUpperCase(),\n country: params.country?.toUpperCase(),\n state: params.state ? params.state.toUpperCase() : '',\n uri: params.uri,\n supportLoginAndRegisterRedirect: params.supportLoginAndRegisterRedirect,\n\n anonymousCountryTTL: params.anonymousCountryTTL,\n mustCallCountryByIPApiFlag: params.mustCallCountryByIPApiFlag,\n countryName: params.countryName,\n supportedStates: Check.isNullOrUndefined(params.supportedStates) ? [] : params.supportedStates\n };\n }\n\n /**\n * Returns the default country value\n *\n * Added in case the server sends jibberish instead of a valid country\n *\n * @returns {*}\n */\n public getDefaultCountry(): string {\n return this._initParams.default;\n }\n\n\n /**\n * Returns the computed country or the default if country does not exist\n *\n * @returns {*}\n */\n public getCountry(): string {\n return this._initParams.country || this._initParams.default;\n }\n\n get countryName() {\n return this._initParams.countryName;\n }\n\n get supportedStates(): IStateOfResidence[] {\n return this._initParams.supportedStates;\n }\n\n /**\n * override base service for async jobs\n * @returns {Promise}\n * @public\n */\n public doAsyncJobs(): Promise {\n if (this._initParams.country && this._initParams.mustCallCountryByIPApiFlag !== true) {\n return Promise.resolve();\n } else {\n return this._countryByIP();\n }\n }\n\n public isNetherlands(): boolean {\n if(this.serviceFactory.oAuth2Service().isAuthorized()) {\n const accountData = this.serviceFactory.userService().getAccountData();\n\n return accountData\n && accountData.RegistrationCountry\n && accountData.RegistrationCountry.toLowerCase() === 'nld';\n } else {\n return this.getCountry().toLowerCase() === 'nld';\n }\n }\n\n public isUK(): boolean {\n const currentCountry = (this.getCountry() || '').toUpperCase();\n return currentCountry === 'GB' || currentCountry === 'GBR';\n }\n\n checkIfCorrectAppInUse() {\n if(!this.serviceFactory.skinService().disableCheckIfCorrectAppInUse()) {\n this.serviceFactory.regulationService().checkIfCorrectAppInUse(this._initParams.country?.toUpperCase(), this._initParams.state?.toUpperCase());\n }\n }\n\n private _geoLocationInfo: IGeoLocationInfo = null;\n\n async getGeoLocationInfo(): Promise {\n if(this._geoLocationInfo) {\n return this._geoLocationInfo;\n }\n\n return await this._countryByIP();\n }\n /**\n * Get user country by IP\n *\n * @param url\n * @returns {Promise.|*|Promise}\n * @private\n */\n private _countryByIP(): Promise {\n return this.serviceFactory.http2Service().post(this._initParams.uri).then((geolocationResponse: any) => {\n this._initParams.country = geolocationResponse.countryISO3?.toUpperCase();\n this._initParams.state = geolocationResponse.state;\n this._initParams.stateId = geolocationResponse.stateId;\n this._geoLocationInfo = geolocationResponse;\n return this._geoLocationInfo;\n })\n .catch((err) => {\n this.logger.error('Could not get country by IP. Error : ' + err);\n return null\n });\n }\n\n private _shouldCallCountryByIP() {\n return Device.hybrid.inCasino && Device.os.isIOS && this.serviceFactory.regulationService().shouldCallCountryByIP(this._initParams.country?.toUpperCase());\n }\n}\n\nexport default CountryService;","import { ICountryCurrencyMap } from './currency_service_interface';\n\nexport const CURRENCY_SYMBOLS: ICountryCurrencyMap= {\n CAD: 'C$',\n NOK: 'Kr.',\n USD: '$',\n EUR: '€',\n GBP: '£',\n DKK: 'Kr.',\n SEK: 'kr',\n RON: 'RON',\n BRL: \"R$\"\n};\n\nexport const CURRENCY_DEFAULT_FORMAT: string = '{symbol}{#}2{#},{#}.{#}%s%v';\n\nexport const CURRENCY_FORMAT_SYMBOL_SELECTOR: string = '{symbol}';\n\nexport const CURRENCY_FORMAT_NAME: string = 'currency_format';\n\nexport const WALLET_TOKEN_PROPERTY_KEY: string = 'walletData';","import BaseService from '../../base/base_service';\nimport _ from '../../utils/underscore'; // eslint-disable-line id-length\nimport Accounting from 'accounting';\nimport {SYSTEM_EVENTS} from '../../events/events';\n\n\nimport {\n CURRENCY_SYMBOLS,\n CURRENCY_FORMAT_SYMBOL_SELECTOR,\n CURRENCY_DEFAULT_FORMAT,\n CURRENCY_FORMAT_NAME,\n WALLET_TOKEN_PROPERTY_KEY\n} from './currency_consts';\nimport ICurrencyService, {\n CurrencyServiceInitParams,\n ICurrencyFormattingOptions,\n IFormatStructure\n} from './currency_service_interface';\n\n\nclass CurrencyService extends BaseService implements ICurrencyService{\n /**\n * @static\n * @type {string}\n */\n static CLASS: string = 'CurrencyService';\n\n private _initParams: CurrencyServiceInitParams;\n private _currencyFormat: string;\n\n\n init(params: CurrencyServiceInitParams) {\n super.init(params);\n this._initParams = params;\n this._subscribe();\n }\n\n public getCurrency(): string {\n return this._initParams.currency;\n }\n\n public getAnonymousCurrency(): string {\n return this._initParams.anonymousCurrency;\n }\n\n public getCurrencySymbol(countryCode?: string): string {\n return CURRENCY_SYMBOLS[countryCode || this._initParams.currency];\n }\n\n /**\n * Format money due to formatting rules.\n *\n * @return {string}\n */\n public formatMoney(value: number, options: ICurrencyFormattingOptions = {}, roundIfZero: boolean = false): string {\n\n if (!_.isNumber(value)) {\n // Set default value to zero.\n value = 0;\n }\n\n //If the numbers after the decimal point are 0/00 we will return the number without decimal point if roundIfZero = true\n if(roundIfZero && (value / 100) % 1 === 0) {\n options.precision = 0;\n }\n\n // Formatting money.\n return Accounting.formatMoney(value / 100, this._modifyAccountingLibraryFunctionality(this._currencyFormat, options));\n }\n\n private _subscribe(): void {\n this.onSystemEvent([SYSTEM_EVENTS.ON_INIT_COMPLETE, SYSTEM_EVENTS.CURRENCY_UPDATED, SYSTEM_EVENTS.OAUTH_STATE_CHANGE], () => {\n this._initParams.currency = this._currencyCode();\n this._refreshCurrencyFormat();\n });\n }\n\n /**\n * Create formatting with the format and currency.\n *\n * @param structureFormat\n * @returns {string|void|XML|*}\n * @private\n */\n private _createFormatting(structureFormat: IFormatStructure): string {\n const regulationCurrencySymbol = this.serviceFactory.regulationService().getRegulation().overrideCurrencySymbol();\n const currSymbol = regulationCurrencySymbol || this.getCurrencySymbol(structureFormat.currency) || structureFormat.currency;\n\n if (_.isUndefined(currSymbol)) {\n this.logger.error('Currency formatting not set properly => ', this._initParams);\n throw new Error('');\n }\n\n if (_.isUndefined(structureFormat.format)) {\n this.logger.info('No format was set. Default format will be used', CURRENCY_DEFAULT_FORMAT);\n\n structureFormat.format = CURRENCY_DEFAULT_FORMAT;\n }\n\n return structureFormat.format.replace(CURRENCY_FORMAT_SYMBOL_SELECTOR, currSymbol);\n }\n\n\n /**\n * Get the current currency code. when entering this func we already called to '_setAnonymousCurrency'\n * so we have default anonymous currency.\n *\n * @returns {*}\n * @private\n */\n private _currencyCode(): string {\n const anonymousCurrency = this.getAnonymousCurrency().toUpperCase();\n\n // NOTE: For some reason accounting need only upper case currency lol :)..\n if (!this.serviceFactory.oAuth2Service().isAuthorized()) {\n // this.logger.debug('User not authorized, using default currency code: '+ anonymousCurrency);\n return anonymousCurrency;\n }\n\n const tokenCurrency = this._localStorageTokenCurrency();\n\n return (tokenCurrency ? tokenCurrency : anonymousCurrency).toUpperCase();\n }\n\n\n /**\n * Get local storage currency value from token if exist.\n *\n * @returns {*}\n * @private\n */\n private _localStorageTokenCurrency(): string {\n // Get token from local storage.\n const walletToken = _.safeJSON(this.serviceFactory.oAuth2Service().extractTokenProperty(WALLET_TOKEN_PROPERTY_KEY));\n if(!walletToken) {\n this.logger.error(`WalletToken fail parsing. walletToken ${this.serviceFactory.oAuth2Service().extractTokenProperty(WALLET_TOKEN_PROPERTY_KEY)}`);\n return null;\n } else {\n return walletToken.CurrencyCode;\n }\n }\n\n private _languageFormatting(): string {\n return this.serviceFactory.languageService().translation(CURRENCY_FORMAT_NAME);\n }\n\n\n /**\n * Our modify the functionality of the accounting js external library.\n *\n * @param currencyFormat\n * @param options\n * @returns {{symbol: undefined, precision: undefined, thousand: undefined, decimal: undefined, format: undefined}}\n * @private\n */\n private _modifyAccountingLibraryFunctionality(currencyFormat: string, options: ICurrencyFormattingOptions = {}) {\n const splitFormat = currencyFormat.split('{#}');\n const length = splitFormat.length;\n const fullFormat = {\n symbol: length > 0 ? splitFormat[0] : undefined,\n precision: length > 1 ? options.precision || parseInt(splitFormat[1]) : undefined,\n thousand: length > 2 ? splitFormat[2] : undefined,\n decimal: length > 3 ? splitFormat[3] : undefined,\n format: length > 4 ? splitFormat[4] : undefined\n };\n\n return Object.assign(fullFormat, options);\n }\n\n /**\n * Refresh currency format set new or same due to change currency model format,\n * The currency format.\n *\n * @private\n */\n private _refreshCurrencyFormat(): void {\n const structureFormat: IFormatStructure = {\n currency: this._initParams.currency,\n format: this._initParams.format\n };\n this._currencyFormat = this._createFormatting(structureFormat);\n }\n\n public doAsyncJobs(): Promise {\n return this._asyncAnonymousCurrency();\n }\n\n /**\n * Actions after getting anonymous currency\n *\n * @private\n */\n private _anonymousCurrencyPostActions(anonymousCurrency: string): void {\n try {\n // set the format\n this._initParams.format = this._languageFormatting();\n // this will define the currency model at first time and set anonymous currency code\n this._initParams.anonymousCurrency = anonymousCurrency;\n // set currency to be anonymous at first time before user log in\n this._initParams.currency = anonymousCurrency;\n this._refreshCurrencyFormat();\n } catch(err) {\n this.logger.error('Fail in _anonymousCurrencyPostActions method.', err);\n }\n\n }\n\n\n /**\n * Get the anonymous currency code\n *\n * @returns {*}\n * @private\n */\n private _asyncAnonymousCurrency(): Promise {\n return new Promise((resolve) => {\n const countryService = this.serviceFactory.countryService();\n const country = countryService.getCountry();\n const defaultCountry = countryService.getDefaultCountry();\n const countryCurrencyMap = this._initParams.countryCurrencyMap;\n // if the country is not valid, use the default\n const anonymousCurrency = this.getAnonymousCurrency() || countryCurrencyMap[country] || countryCurrencyMap[defaultCountry];\n\n this._anonymousCurrencyPostActions(anonymousCurrency);\n resolve();\n });\n }\n}\n\nexport default CurrencyService;","import BaseService from \"../../base/base_service\";\nimport _ from '../../utils/underscore';\nimport Device from '../../utils/device/device';\nimport DOM from '../../utils/dom';\n\ninterface IParams {\n domains: string[];\n enable: boolean;\n}\n\nexport default class DomainDetectionService extends BaseService{\n static CLASS=\"DomainDetectionService\";\n\n _params: IParams;\n\n init(params: IParams){\n this._params = params;\n }\n\n onInitializationCompleted(): Promise {\n if(!_.isNullOrUndefined(this._params)){\n this._verifyDomain();\n }\n\n return Promise.resolve();\n }\n\n private _verifyDomain(){\n\n if(_.isNullOrUndefined(this._params.domains) ||\n (!_.isNullOrUndefined(this._params.domains) && this._params.domains.length === 0) ||\n Device.hybrid.isHybrid ||\n this.serviceFactory.windowService().getDomain() === 'localhost' ||\n (!_.isNullOrUndefined(this._params.enable) && _.toBoolean(this._params.enable) === false)) {\n return;\n }\n\n if (!this._isDomainApproved()) {\n this._cleanDom();\n this._sendElasticEvent();\n }\n }\n\n private _isDomainApproved(): boolean {\n const currentDomain = this.serviceFactory.windowService().getHost();\n const verifyCurrentDomain = domain => currentDomain.endsWith(domain);\n return this._params.domains.some(verifyCurrentDomain);\n }\n\n private _cleanDom(){\n DOM.getBody().innerHTML = \"\";\n this.logger.info(\"Not approved domain! Content removed.\");\n }\n\n private _sendElasticEvent(){\n const data = {\n CGPEventCategory: 'DOMAIN_DETECTION',\n CGPEventAction: \"BLOCKED_DOMAIN\",\n CGPEventLabel: this.serviceFactory.windowService().getHref()\n };\n this.serviceFactory.structuredLoggingService().getLogger(data).info();\n }\n}","import BaseService from '../../base/base_service';\nimport IEvolutionService from './evolution_service_interface';\n\ninterface IEvolutionServiceParams {\n\tuseNewIntegration: boolean;\n supportOneStopShop: boolean;\n}\n\nexport default class EvolutionService extends BaseService implements IEvolutionService {\n\n static CLASS = 'EvolutionService';\n\n\tprivate _params: IEvolutionServiceParams;\n\n init(params: IEvolutionServiceParams) {\n\t\tsuper.init(params);\n\t\tthis._params = params;\n\t}\n\n shouldUseNewIntegration(): boolean {\n return this._params.useNewIntegration;\n\t}\n\n shouldUseOneStopShopIntegration(): boolean {\n return this._params.useNewIntegration && this._params.supportOneStopShop;\n\t}\n}\n","import BaseService from \"../../base/base_service\";\nimport IExternalLinksProxyService from \"./external_links_proxy_service_interface\";\nimport {\n IOpenRegistrationOptions\n} from \"../../../../app-react/services/external-links/handlers/registration/registration.external-link-handler.interface\";\nimport {IExternalLinksProxy} from \"../../../../common/interfaces/external-links-proxy.interface\";\nimport {\n IOpenGameLimitsOptions,\n IOpenPendingLoginOptions\n} from \"../../../../app-react/services/external-links/external-links.service.interface\";\nimport {OpenCashierOptions} from \"../../../../common/interfaces/cashier.service.interface\";\n\ninterface ExternalLinksProxyServiceParams {\n externalLinksService: () => Promise;\n}\n\nexport default class ExternalLinksProxyService extends BaseService implements IExternalLinksProxyService {\n\n static CLASS = 'ExternalLinksProxyService';\n\n private _params: ExternalLinksProxyServiceParams;\n\n init(params: ExternalLinksProxyServiceParams) {\n this._params = params;\n }\n\n async openCashier(options?: OpenCashierOptions): Promise {\n await (await this._params.externalLinksService()).openCashier(options);\n }\n\n async openMembership(options?: IOpenRegistrationOptions): Promise {\n await (await this._params.externalLinksService()).openMembership(options);\n }\n\n async openForgotPassword(): Promise {\n await (await this._params.externalLinksService()).openForgotPassword();\n }\n async openForgotUserName(): Promise {\n await (await this._params.externalLinksService()).openForgotUserName();\n }\n\n async openPendingLogin(options: IOpenPendingLoginOptions): Promise {\n await (await this._params.externalLinksService()).openPendingLogin(options);\n }\n\n async openUploadDocumentFromMyAccount(): Promise {\n await (await this._params.externalLinksService()).openUploadDocumentFromMyAccount();\n }\n async openGameLimits(options:IOpenGameLimitsOptions): Promise{\n (await this._params.externalLinksService()).openGameLimits(options);\n }\n}","export const TRIPLE_EIGHT_COMPANY_NAME = '888';\nexport const NYX_COMPANY_NAME = 'NYX';\n","import {IGameRunnerProxy} from \"../../../../common/interfaces/game-runner-proxy.interface\";\nimport BaseService from \"../../base/base_service\";\nimport {UndefinedString} from \"../../../../common/types/nullable-types\";\nimport {OpenGameParameters} from \"../../../../app-react/services/games/game-info\";\n\n\ninterface GameRunnerProxyServiceParams {\n getGameRunnerService: () => Promise;\n}\n\nexport default class GameRunnerProxyService extends BaseService implements IGameRunnerProxy {\n static CLASS = 'GameRunnerProxyService';\n\n private _params: GameRunnerProxyServiceParams;\n init(params: GameRunnerProxyServiceParams) {\n this._params = params;\n }\n\n\n private _getGameRunner(): Promise {\n return this._params.getGameRunnerService();\n }\n\n get isGameRunningLegacy(): Promise {\n return this._getGameRunner().then(r => r.isGameRunningLegacy);\n }\n\n async closeRunningGame(): Promise {\n await (await this._getGameRunner()).closeRunningGame();\n }\n\n get isGameRunningInFreePlayModeLegacy(): Promise {\n return this._getGameRunner().then(r => r.isGameRunningInFreePlayModeLegacy);\n }\n\n get currentRunningGameCompanyNameLegacy(): Promise {\n return this._getGameRunner().then(r => r.currentRunningGameCompanyNameLegacy);\n }\n\n async continuePlayCurrentGameLegacy(): Promise {\n await (await this._getGameRunner()).continuePlayCurrentGameLegacy();\n }\n\n async stopCurrentGameAutoplayLegacy(): Promise {\n await (await this._getGameRunner()).stopCurrentGameAutoplayLegacy();\n }\n\n async shouldShowRealityCheckMessageWhileGameIsOpenLegacy(): Promise {\n return await (await this._getGameRunner()).shouldShowRealityCheckMessageWhileGameIsOpenLegacy();\n }\n\n async shouldShowTimeLimitMessageWhileGameIsOpenLegacy(): Promise {\n return await (await this._getGameRunner()).shouldShowTimeLimitMessageWhileGameIsOpenLegacy();\n }\n\n get isOpenGameInProgress(): Promise {\n return this._getGameRunner().then(r => r.isOpenGameInProgress);\n }\n\n async openRealGameFromSdkRequest(gameType: number, options?: OpenGameParameters): Promise {\n await (await this._getGameRunner()).openRealGameFromSdkRequest(gameType);\n }\n\n async openDemoGameFromSdkRequest(gameType: number, options?: OpenGameParameters): Promise {\n await (await this._getGameRunner()).openDemoGameFromSdkRequest(gameType, options);\n }\n}","import BaseService from '../../base/base_service';\nimport Event from '../../utils/event';\nimport DOM from '../../utils/dom';\nimport {SYSTEM_EVENTS} from '../../events/events';\nimport Device from '../../utils/device/device';\nimport _ from '../../utils/underscore';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport Store from '../../utils/store';\n\n\nexport default class GameService extends BaseService {\n static CLASS = 'GameService';\n\n init(params) {\n super.init(params);\n this._resolveGameImagePath = params.resolveGameImagePath;\n this._openAnonymousGameApiUrl = params.openAnonymousGameApiUrl;\n\n if(params.GRS) {\n this._customChillUrl = params.GRS.CustomChillUrl;\n this._customGameResourcesPath = params.GRS.CustomGameResourcesPath;\n this._grsConfiguration = {\n gameState: params.GRS.GameState,\n additionalState: params.GRS.AdditionalState,\n gameTechnology: params.GRS.GameTechnology,\n GRSEnvironment: params.GRS.GRSEnvironment,\n enableVersionSending: params.GRS.enableVersionSending\n };\n }\n }\n\n\n\n resolveGameImagePath(imageFileName) {\n if(this._resolveGameImagePath) {\n return this._resolveGameImagePath(imageFileName);\n }\n const origin = this.serviceFactory.windowService().getLocationOrigin();\n\n return `${origin}/gamesImages/${imageFileName}`;\n }\n\n\n\n async closeRunningGame() {\n const isGameRunning = await this.serviceFactory.gameRunnerProxyService().isGameRunningLegacy\n if(isGameRunning) {\n await this.serviceFactory.gameRunnerProxyService().closeRunningGame();\n } else{\n if (Device.hybrid.isEmbedded && await this.isGameRunning()) {\n Event.fire(SYSTEM_EVENTS.SECOND_WEB_VIEW_CLOSE_ALL);\n }\n }\n }\n\n isGameRunning() {\n return this.serviceFactory.gameRunnerProxyService().isGameRunningLegacy;\n }\n\n async isGameRunningInFreePlayMode() {\n if (!await this.isGameRunning()) {\n return false;\n }\n\n return await this.serviceFactory.gameRunnerProxyService().isGameRunningInFreePlayModeLegacy;\n }\n\n\n async getCurrentRunningGamecompanyName() {\n return await this.serviceFactory.gameRunnerProxyService().currentRunningGameCompanyNameLegacy;\n }\n\n async shouldShowRealityCheckMessageWhileGameIsOpen() {\n if(await this.serviceFactory.gameRunnerProxyService().isGameRunningLegacy) {\n return await this.serviceFactory.gameRunnerProxyService().shouldShowRealityCheckMessageWhileGameIsOpenLegacy();\n }\n return false;\n }\n\n async shouldShowTimeLimitMessageWhileGameIsOpen() {\n if(await this.serviceFactory.gameRunnerProxyService().isGameRunningLegacy) {\n return await this.serviceFactory.gameRunnerProxyService().shouldShowTimeLimitMessageWhileGameIsOpenLegacy();\n }\n\n return false;\n }\n\n async stopCurrentGameAutoplay() {\n // Relevant only for NYX AOD that still on second web view and not iframe\n if(await this.isGameRunning()) {\n // We wat delay here so the user will have enough time to see the reason of the closing game- for example big win.\n DOM.setTimeout(()=> {\n Event.fire(SYSTEM_EVENTS.SECOND_WEB_VIEW_CLOSE_NYX);\n }, 5000);\n }\n\n if (await this.serviceFactory.gameRunnerProxyService().isGameRunningLegacy) {\n await this.serviceFactory.gameRunnerProxyService().stopCurrentGameAutoplayLegacy();\n }\n }\n\n async continuePlayCurrentGame() {\n if (await this.serviceFactory.gameRunnerProxyService().isGameRunningLegacy) {\n await this.serviceFactory.gameRunnerProxyService().continuePlayCurrentGameLegacy();\n }\n }\n\n\n _createCommonReadGameConfigurationRequest(gameOptions) {\n let request = {\n gameTypeId: gameOptions.gameType,\n isSupportFlash: false,\n isSupportHTML5: Device.isSupportHTML5,\n isMobile: Device.os.isMobileOS,\n GrsData: Store.get('GRSABTesting', ''),\n GameState: this._grsConfiguration.gameState,\n AdditionalState: this._grsConfiguration.additionalState,\n GameTechnology: this._grsConfiguration.gameTechnology,\n regulationId: this.serviceFactory.regulationService().getRegulationCode(),\n currencyCode: this.serviceFactory.currencyService().getCurrency(),\n languageCode: this.serviceFactory.languageService().getISO3(),\n currentRoute: this.serviceFactory.windowService().getPathName(),\n isHybridEmbedded: Device.hybrid.isEmbedded,\n productPackage: this.serviceFactory.skinService().getProductPackageID()\n };\n\n if (!_.isNullOrUndefined(gameOptions.vendorEnvironment)) {\n request.vendorEnvironment = gameOptions.vendorEnvironment;\n }\n\n if (this._grsConfiguration.GRSEnvironment) {\n request.GrsEnvironment = this._grsConfiguration.GRSEnvironment;\n }\n\n if (!_.isNullOrUndefined(gameOptions.useNetEntGameInclusion)) {\n request.useNetEntGameInclusion = gameOptions.useNetEntGameInclusion;\n }\n\n if (!_.isNullOrUndefined(gameOptions.useEvolutionNewIntegration)) {\n request.useEvolutionNewIntegration = gameOptions.useEvolutionNewIntegration;\n }\n\n if (!_.isNullOrUndefined(gameOptions.useAdapterIntegration)) {\n request.useAdapter = gameOptions.useAdapterIntegration;\n }\n\n if (false !== this._grsConfiguration.enableVersionSending) {\n let gameVersion = this.serviceFactory.hybridService().getCompiledGameVersion(gameOptions.gameType);\n if (gameVersion) { // better validation\n request.GameState = gameVersion;\n }\n }\n\n return request;\n }\n\n _handleGameConfigurationResult(gameConfigurationFromServer) {\n if(gameConfigurationFromServer.grsData) {\n let customChillUrl = this._customChillUrl;\n if(customChillUrl){\n gameConfigurationFromServer.grsData.chillUrl = customChillUrl;\n }\n\n if(this._customGameResourcesPath){\n gameConfigurationFromServer.grsData.customGameResourcesPath = this._customGameResourcesPath;\n }\n\n Store.set('GRSABTesting', gameConfigurationFromServer.grsData.abTestingData)\n }\n\n if(gameConfigurationFromServer.sessionTimer) {\n gameConfigurationFromServer.sessionTimer = TimeSpan.parse(gameConfigurationFromServer.sessionTimer);\n }\n\n return gameConfigurationFromServer;\n }\n\n readAnonymousGameConfiguration(gameOptions) {\n let requestParams = this._createCommonReadGameConfigurationRequest(gameOptions);\n\n return this.serviceFactory.http2Service()\n .post(this._openAnonymousGameApiUrl, requestParams)\n .then(gameConfiguration => this._handleGameConfigurationResult(gameConfiguration));\n }\n}","import BaseModelService from '../../base/base_model_service';\nimport _ from '../../utils/underscore';\n\nclass GameServiceModel extends BaseModelService {\n _useDefaults;\n\n\n init(params) {\n\n if (params) {\n this._useDefaults = _.isUndefined(params.useDefaults) ? true : params.useDefaults;\n this._setCashierOpenType(params.cashierOpenType)\n ._setNavbarCustomClientProperties(params.navbar)\n ._setResponsibleGameView(params.responsibleGameView);\n }\n }\n\n\n\n _setResponsibleGameView(responsibleGameView) {\n if (!this._useDefaults && _.isUndefined(responsibleGameView)) {\n return this;\n }\n\n if (!_.isNumber(responsibleGameView)) {\n return this;\n }\n\n this._responsibleGameView = responsibleGameView;\n return this;\n }\n\n\n _setCashierOpenType(cashierOpenType) {\n if (!this._useDefaults && _.isUndefined(cashierOpenType)) {\n return this;\n }\n\n if (!_.isNumber(cashierOpenType)) {\n this._cashierOpenType = 0;\n return this;\n }\n\n this._cashierOpenType = cashierOpenType;\n return this;\n }\n\n _setNavbarCustomClientProperties(navbarProps) {\n if (!this._useDefaults && _.isUndefined(navbarProps)) {\n return this;\n }\n\n if (_.isUndefined(navbarProps)) {\n return this;\n }\n\n this._navbarProps = navbarProps;\n return this;\n }\n\n getResponsibleGameView() {\n return this._responsibleGameView;\n }\n\n getNavbarProps() {\n return this._navbarProps;\n }\n\n getCashierOpenType() {\n return this._cashierOpenType;\n }\n}\n\nexport default GameServiceModel;","import BaseService from \"../../base/base_service\";\nimport Model from \"./game_manager_model\";\n\n\nclass GameManagerService extends BaseService {\n /**\n * @static\n * @type {string}\n */\n\n\tstatic CLASS = 'GameManagerService';\n\n\n\t\t/**\n\t\t * @property\n\t\t * @type {null|object}\n\t\t * @private\n\t\t */\n _model = null;\n\n\n\t\t/**\n\t\t *\n\t\t * @param params\n\t\t */\n init(params) {\n\t\tsuper.init(params);\n\t\tthis._model = Model.create(params);\n\t}\n\n\n getNavbarProps() {\n return this._model.getNavbarProps();\n }\n\n cashierOpenType() {\n return this._model.getCashierOpenType();\n }\n\n responsibleGamblingView() {\n return this._model.getResponsibleGameView();\n }\n}\n\nexport default GameManagerService;","const GAME_REASON_CTA = {\n LOBBY: 0,\n CASHIER_DEPOSIT: 5,\n LOBBY_FROM_GAME_LOAD: 6,\n HISTORY: 7,\n SELF_TEST_SWEDEN: 10,\n OPEN_LIMITS_SWEDEN: 11,\n SELF_EXCLUSION_SWEDEN: 12,\n RESPONSIBLE_GAMING: 13,\n};\nconst GAME_POST_MESSAGES = {\n GOTO_LOBBY: 'GOTO_LOBBY',\n CASHIER: 'CASHIER',\n OPEN_GAME_HISTORY: 'OPEN_GAME_HISTORY'\n};\n\nexport {GAME_REASON_CTA, GAME_POST_MESSAGES};","import BaseService from \"../../base/base_service\";\nimport {GAME_POST_MESSAGES, GAME_REASON_CTA} from \"./game_reason_consts\";\nimport {SYSTEM_EVENTS} from \"../../events/events\";\nimport Event from \"../../utils/event\";\nimport _ from '../../utils/underscore';\nimport {CHANNEL_ELEMENTS, CHANNEL_SOURCE} from \"../../../../common/const/casinofied-analytics-consts\";\nimport {AreaType} from \"@sparkware/uc-sdk-core\";\n\nclass GameReasonService extends BaseService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'GameReasonService';\n\n\n /**\n * Initialize game reason service.\n *\n * @param params\n */\n init(params) {\n super.init(params);\n }\n\n\n handleReason(reason) {\n let isGameClose = true;\n let numReason = parseInt(reason);\n let gameEvent = '';\n this.logger.debug('Handling reason => ', reason);\n if (isNaN(numReason)) {\n this.logger.error('Reason is undefined or not a number value', reason);\n return false;\n }\n switch (numReason) {\n case GAME_REASON_CTA.LOBBY:\n gameEvent = GAME_POST_MESSAGES.GOTO_LOBBY;\n break;\n case GAME_REASON_CTA.CASHIER_DEPOSIT:\n this.serviceFactory.cashierProxyService().openDeposit({\n channel: {\n source: CHANNEL_SOURCE.casinoClient,\n area: AreaType.externalClick,\n element: CHANNEL_ELEMENTS.urlParam\n }\n });\n gameEvent = GAME_POST_MESSAGES.CASHIER;\n break;\n case GAME_REASON_CTA.LOBBY_FROM_GAME_LOAD:\n break;\n case GAME_REASON_CTA.HISTORY:\n this.serviceFactory.linksNavigationProxyService().openGamingHistoryPage();\n gameEvent = GAME_POST_MESSAGES.OPEN_GAME_HISTORY;\n break;\n case GAME_REASON_CTA.SELF_TEST_SWEDEN:\n this.serviceFactory.linksNavigationProxyService().openSelfTest();\n break;\n case GAME_REASON_CTA.OPEN_LIMITS_SWEDEN:\n this.serviceFactory.regulationService().getRegulation().openLimits();\n break;\n case GAME_REASON_CTA.SELF_EXCLUSION_SWEDEN:\n this.serviceFactory.linksNavigationProxyService().openSelfExclusion();\n break;\n case GAME_REASON_CTA.RESPONSIBLE_GAMING:\n this.serviceFactory.linksNavigationProxyService().openResponsibleGaming();\n\n break;\n default:\n isGameClose = false;\n break;\n }\n if (!_.isEmpty(gameEvent)) {\n this._tryToSendReasonPostMessage(gameEvent);\n }\n\n this._sendAnalytics(reason);\n\n return isGameClose;\n }\n\n _tryToSendReasonPostMessage(event) {\n let data = {EventId: event, type: event};\n if (window !== window.top) {\n this.serviceFactory.postMessageService().sendPostMessage(window.parent, data);\n }\n }\n\n _sendAnalytics(reason){\n //reason 600 is sent 3M time in 24H- we don't want to send it to GA - Hybrid second_web_view\n if(reason === 600)\n return;\n let analyticsData = {\n category: '[Technical-event]',\n action: 'GameReasonService',\n label: 'reason',\n value: reason\n };\n\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, analyticsData);\n }\n}\n\nexport default GameReasonService;","import BaseService from '../../base/base_service';\n\nexport default class GamesCorrelationService extends BaseService {\n static CLASS = 'GamesCorrelationService';\n\n init(params) {\n super.init(params);\n this._getCorrelatedGamesUrl = params.getCorrelatedGamesUrl;\n }\n\n getCorrelatedGames(gameType, numberOfGames = 3) {\n return this._readCorrelatedGames(gameType)\n .then(correlatedGames => {\n\n if(correlatedGames.length === 0) {\n return [];\n }\n\n return this._filterRecentlyPlayed(correlatedGames)\n .then(filteredGames => this._filterByGamesInformation(filteredGames))\n .then(filteredGames => this._filterByLayout(filteredGames))\n .then(filteredGames => filteredGames.slice(0, numberOfGames));\n });\n }\n\n\n _cachedCorrelatedGames = {};\n\n _readCorrelatedGames(gameType) {\n let correlatedGames = this._cachedCorrelatedGames[gameType];\n if(correlatedGames) {\n return Promise.resolve(correlatedGames);\n }\n\n return this.serviceFactory.http2Service()\n .post(this._getCorrelatedGamesUrl, {\n gameType: gameType\n })\n .then(correlatedGames => {\n correlatedGames = correlatedGames || [];\n this._cachedCorrelatedGames[gameType] = correlatedGames;\n return correlatedGames;\n });\n\n }\n\n _filterRecentlyPlayed(correlatedGameTypes) {\n return this.serviceFactory.recentlyPlayedService().getRecentlyPlayedList().then(gameTypes => {\n let recentlyPlayedMap = {};\n gameTypes.forEach(gt => recentlyPlayedMap[gt] = gt);\n\n return correlatedGameTypes.filter(gt => !recentlyPlayedMap[gt]);\n })\n }\n\n _filterByGamesInformation(correlatedGameTypes) {\n return this.serviceFactory.gamesInformationService().getGamesInfo(correlatedGameTypes)\n .then(gamesInfo => {\n let result = [];\n correlatedGameTypes.forEach(gt => {\n let gameInfo = gamesInfo[gt];\n if(gameInfo && gameInfo.restriction.isGameAllowedToPlayReal()) {\n result.push(gt);\n }\n });\n\n return result;\n });\n }\n\n _filterByLayout(correlatedGameTypes) {\n let result = this.serviceFactory.integrationService().filterInLayoutGames(correlatedGameTypes);\n if(result) {\n return result;\n }\n\n return Promise.resolve(correlatedGameTypes);\n\n }\n}","import BaseObject from '../../base/base_object';\nimport Event from '../../utils/event';\nimport {SYSTEM_EVENTS} from '../../events/events';\n\nexport default class GamesDiagnosticMessages extends BaseObject {\n static CLASS = 'GamesDiagnosticMessages';\n\n init(params) {\n super.init(params);\n Event.on(SYSTEM_EVENTS.RESTRICTIONS_CHANGED, this._onRestrictionsChanged, this);\n }\n\n\n _onRestrictionsChanged() {\n this._gameRestrictedMessages = {};\n }\n\n\n _gameRestrictedMessages = {};\n logGameRestricted(gameType, message) {\n this._gameRestrictedMessages[gameType] = message;\n this.logger.debug(message);\n }\n\n\n _gameFilteredByPlatformTypeMessges = {};\n logGameFilteredByPlatformType(gameType, message) {\n this._gameFilteredByPlatformTypeMessges[gameType] = message;\n this.logger.debug(message);\n }\n\n _gameNotApprovedMessages = {}\n logGameNotApproved(gameType, message) {\n this._gameNotApprovedMessages[gameType] = message;\n this.logger.debug(message);\n }\n\n getAllDiagnosticMessages() {\n return Object.values(this._gameRestrictedMessages)\n .concat(Object.values(this._gameFilteredByPlatformTypeMessges))\n .concat(Object.values(this._gameNotApprovedMessages));\n }\n\n\n}\n","import BaseObject from '../../base/base_object';\nimport Device from '../../utils/device/device';\nimport Event, {SystemEventSubscription} from '../../utils/event';\nimport {SYSTEM_EVENTS} from '../../events/events';\nimport {\n IGameInfoFromBackend,\n ExternalGameSubTypeInfo,\n ExternalGameTypeInfo\n} from './games_information_service';\nimport GamesDiagnosticMessages from './games_diagnostic_messages';\nimport ServiceFactory from '../service_factory';\nimport {ILocalizedGameInfo, PLATFORM_TYPES, GAMES_INFO, GAME_VOLATILITY, VOLATILITY_LIMITS} from './games_information_service_interface';\nimport _ from '../../utils/underscore';\nimport { ILiveTableInfo } from '../live_tables/live_table_info';\nimport {Check} from '@sparkware/app-utils';\n\nexport default class GamesInfoCache extends BaseObject {\n static CLASS = 'GamesInfoCache';\n private _getServiceFactory: () => ServiceFactory;\n private _gamesDiagnostics: GamesDiagnosticMessages;\n private _onRestrictionsChangedSubscription: SystemEventSubscription;\n private _onOAuthStateChangedSubscription: SystemEventSubscription;\n private _onInitCompletedSubscription: SystemEventSubscription;\n private _shouldUpdateBetsFromLiveTables: boolean = false;\n private _previousRegulationIDForBets: number = null;\n\n init(params) {\n super.init(params);\n this._getServiceFactory = params.getServiceFactory;\n this._gamesDiagnostics = params.gamesDiagnostics;\n this._setActivePlatform();\n this._subscribe();\n }\n\n dispose() {\n this._unsubscribe();\n }\n\n private _subscribe() {\n this._onRestrictionsChangedSubscription = Event.on(SYSTEM_EVENTS.RESTRICTIONS_CHANGED, this._onRestrictionsChanged, this);\n this._onOAuthStateChangedSubscription = Event.on(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, this._onOAuthStateChanged, this);\n this._onInitCompletedSubscription = Event.on(SYSTEM_EVENTS.ON_INIT_COMPLETE, this._onInitComplete, this);\n }\n\n _onInitComplete() {\n if (this.serviceFactory.skinService().getRegulationID() !== this.serviceFactory.liveTablesService().getRegulationIDForMinMaxBet()\n && this.serviceFactory.oAuth2Service().isAuthorized()) {\n this._shouldUpdateBetsFromLiveTables = true;\n }\n\n this._previousRegulationIDForBets = this.serviceFactory.liveTablesService().getRegulationIDForMinMaxBet();\n }\n\n private _unsubscribe() {\n this._onRestrictionsChangedSubscription.off();\n this._onOAuthStateChangedSubscription.off();\n this._onInitCompletedSubscription.off();\n }\n\n private _onRestrictionsChanged() {\n for(let gameInfo of Object.values(this._gamesInfoCache)) {\n gameInfo.restriction = this.serviceFactory.restrictionsService().getGameRestriction(gameInfo.gameType, gameInfo.gameGroupId, gameInfo.vendorId);\n }\n }\n\n private _onOAuthStateChanged() {\n if (this._previousRegulationIDForBets !== this.serviceFactory.liveTablesService().getRegulationIDForMinMaxBet()) {\n this._previousRegulationIDForBets = this.serviceFactory.liveTablesService().getRegulationIDForMinMaxBet();\n this._shouldUpdateBetsFromLiveTables = true;\n }\n\n Object.keys(this._gamesInfoCache).forEach(gameType => {\n const gameInfo = this._gamesInfoCache[gameType];\n const gameFromBackend = this._gamesFromBackend[gameType];\n gameInfo.isAnonymousSupported = (gameFromBackend.AllowDemo || false) && this.serviceFactory.regulationService().isAnonymousPlayAllowed();\n gameInfo.forceDemoButton = this.serviceFactory.regulationService().forceDemoButton();\n gameInfo.minBet = this._extractMinBetLimit(gameFromBackend.Bets, gameFromBackend.MaxBetPerBrand); // putting here gameFromBackend.MaxBetPerBrand is intentional because if we are in Germany and MaxBetPerBrand is not set in SDM then we don't want to show the min bet either\n gameInfo.maxBet = gameFromBackend.MaxBetPerBrand;\n });\n }\n\n get serviceFactory() {\n return this._getServiceFactory();\n }\n\n private _gamesFromBackend: { [key: number]: IGameInfoFromBackend } = {};\n\n appendBackendGamesInfo(gamesFromBackend: IGameInfoFromBackend[]) {\n gamesFromBackend = gamesFromBackend || [];\n\n gamesFromBackend.forEach(gameInfo => {\n this._gamesFromBackend[gameInfo.Id] = gameInfo;\n });\n }\n\n private _gamesInfoCache: { [key: number]: ILocalizedGameInfo } = {};\n\n private _gamesSubTypeToGameTypeMappingCache: { [key: string]: number } = {};\n\n private _shouldUseLiveTableFeeds() {\n return this._shouldUpdateBetsFromLiveTables && this.serviceFactory.liveTablesService().getBetLimitsFromTableFeedsEnabled();\n }\n\n async getGamesInfo(gameTypes: number[]): Promise<{ gamesInfo: GAMES_INFO, notFoundGames: number[] }> {\n const gamesInfo = {};\n const notFoundGames = [];\n gameTypes = gameTypes || [];\n\n if (gameTypes.length === 0) {\n return Promise.resolve({\n gamesInfo: gamesInfo,\n notFoundGames: notFoundGames,\n });\n }\n\n\n let liveTables: {[id: number]: ILiveTableInfo} = null;\n if (this._shouldUseLiveTableFeeds()) {\n this._shouldUpdateBetsFromLiveTables = false;\n try {\n liveTables = await this.serviceFactory.liveTablesService().getTablesInfo();\n } catch(err) {\n this.logger.error(\"LiveTablesService::getTablesInfo failed!\", err);\n }\n }\n\n gameTypes.forEach(gameType => {\n try {\n let gameInfo = this._gamesInfoCache[gameType];\n\n if (gameInfo) {\n gamesInfo[gameType] = gameInfo;\n } else {\n gameInfo = this._createGameInfoFromBackendInfo(gameType);\n if (gameInfo) {\n gamesInfo[gameType] = gameInfo;\n } else {\n notFoundGames.push(gameType);\n }\n }\n\n if (gameInfo && !_.isNullOrUndefined(liveTables) && !_.isNullOrUndefined(liveTables[gameType])) {\n const liveTable = liveTables[gameType];\n gameInfo.minBet = liveTable.MinBet;\n gameInfo.maxBet = liveTable.MaxBet;\n }\n } catch (e) {\n this.logger.error('Failed to get games info for gameType: ', gameType, ',Error: ', e);\n }\n });\n\n return Promise.resolve({\n gamesInfo: gamesInfo,\n notFoundGames: notFoundGames,\n });\n\n }\n\n getGamesSubTypesMappings(gameSubTypes?: string[]): { [key: string]: number } {\n if (!gameSubTypes || !_.isArray(gameSubTypes)) {\n return {...this._gamesSubTypeToGameTypeMappingCache};\n }\n\n const res: { [key: string]: number } = {};\n gameSubTypes.forEach(subType => {\n const cgpGameId = this._gamesSubTypeToGameTypeMappingCache[subType];\n if (cgpGameId) {\n res[subType] = cgpGameId;\n }\n });\n return res;\n }\n\n /**\n *\n * @param gameType\n * @returns {*}\n * @private\n */\n private _createGameInfoFromBackendInfo(gameType: number): ILocalizedGameInfo {\n const gameFromBackend = this._gamesFromBackend[gameType];\n if (!gameFromBackend) {\n return null;\n }\n\n const vendors = this.serviceFactory.gamesInformationService().vendors || {};\n const companies = this.serviceFactory.gamesInformationService().companies || {};\n\n const gameInfo: ILocalizedGameInfo = {\n gameType: gameFromBackend.Id,\n externalGameCode: this._extractExternalGameCode(gameFromBackend.ExtId),\n externalGameSubType: this._extractExternalSubTypeGameCode(gameFromBackend.ExtSubType),\n title: gameFromBackend.Title,\n isEliteLounge: gameFromBackend.IsEliteLounge,\n allowWithdrawOnlyFromReal: gameFromBackend.AllowWithdrawOnlyFromReal && this.serviceFactory.regulationService().getRegulation().supportWithdrawOnlyFromReal(),\n hasJackpot: gameFromBackend.HasJackpot && !this.serviceFactory.jackpotFeedsService().jackpotFeedsDisabled(),\n vendorId: gameFromBackend.VendorId,\n vendorName: gameFromBackend.Vendor ?? vendors[gameFromBackend.VendorId ?? 0],\n companyId: gameFromBackend.CompanyId,\n companyName: gameFromBackend.Company ?? companies[gameFromBackend.CompanyId ?? 0],\n gameGroup: gameFromBackend.Group,\n gameGroupId: gameFromBackend.GroupId,\n isAnonymousSupported: (gameFromBackend.AllowDemo || false) && this.serviceFactory.regulationService().isAnonymousPlayAllowed(),\n forceDemoButton: this.serviceFactory.regulationService().forceDemoButton(),\n subGroupName: gameFromBackend.SubGroup,\n numberOfLines: gameFromBackend.NumberOfLines,\n hasFreeSpins: gameFromBackend.HasFreeSpins,\n allowedPlatformType: gameFromBackend.PlatformType,\n hasSideBets: gameFromBackend.HasSideBets,\n isMultiHand: gameFromBackend.IsMultiHand,\n maxBetPerSpot: gameFromBackend.MaxBetPerSpot,\n numberOfDecks: gameFromBackend.Decks,\n hasBonusGames: gameFromBackend.HasBonusGames,\n minBet: this._extractMinBetLimit(gameFromBackend.Bets, gameFromBackend.MaxBetPerBrand), // putting here gameFromBackend.MaxBetPerBrand is intentional because if we are in Germany and MaxBetPerBrand is not set in SDM then we don't want to show the min bet either\n maxBet: gameFromBackend.MaxBetPerBrand, \n approvals: gameFromBackend.Approvals,\n gameThemes: gameFromBackend.GameThemes ?? [],\n volatility: this._getVolatility(gameFromBackend.Volatility),\n isChildish: gameFromBackend.IsChildish,\n hasNonChildishIcon: gameFromBackend.HasNonChildishIcon,\n hasLessNonChildishIcon: gameFromBackend.HasLessNonChildishIcon\n };\n\n if(gameInfo.companyName?.toUpperCase() === 'LNW') {\n gameInfo.companyName = 'NYX';\n }\n\n if (gameInfo.externalGameSubType) {\n this._gamesSubTypeToGameTypeMappingCache[gameInfo.externalGameSubType] = gameInfo.gameType;\n }\n\n this._applyPlatformRestrictions(gameInfo);\n\n this._gamesInfoCache[gameType] = gameInfo;\n return gameInfo;\n }\n\n private _getVolatility(volatility?: number): GAME_VOLATILITY {\n if (Check.isNumber(volatility) && volatility >= 0) {\n if (volatility <= VOLATILITY_LIMITS.Low)\n return GAME_VOLATILITY.Low;\n else if (volatility <= VOLATILITY_LIMITS.Medium)\n return GAME_VOLATILITY.Medium;\n else\n return GAME_VOLATILITY.High;\n }\n return GAME_VOLATILITY.None;\n }\n\n private _extractMinBetLimit(betsConfiguration: {[currency: string] : number[]}, maxBetPerBrand: number | null | undefined): number{\n if(_.isNullOrUndefined(maxBetPerBrand)){\n return null;\n }\n\n return this._extractBetLimit(betsConfiguration, 0);\n }\n\n /**\n * Extract min or max bet value from betsConfiguration\n * @param betsConfiguration it is a map where the key is the currency ISO3 symbol and the value is an array of 2 items the first one being minBet and the second is the maxBet\n * @param betType: 0 - minBet; 1 - maxBet\n * @private\n */\n private _extractBetLimit(betsConfiguration: {[currency: string]: number[]}, betType: 0 | 1): number {\n if (!betsConfiguration) {\n return null;\n }\n\n const betLimits = betsConfiguration[this._getActiveCurrency()];\n return betLimits && betLimits[betType]\n }\n\n private _extractExternalGameCode(typeInfo: ExternalGameTypeInfo): string | null | undefined {\n if (Check.isArray(typeInfo)) {\n return typeInfo[this.activePlatformIndex]\n }\n\n return typeInfo;\n }\n\n private _extractExternalSubTypeGameCode(subTypeInfo: ExternalGameSubTypeInfo): string | null | undefined {\n if (Check.isArray(subTypeInfo)) {\n return subTypeInfo[this.activePlatformIndex];\n }\n return subTypeInfo;\n }\n\n\n private _activeCurrency: string = null;\n /**\n * @returns {string}\n * @private\n */\n private _getActiveCurrency() {\n return this._activeCurrency || (this._activeCurrency = this.serviceFactory.currencyService().getCurrency().toUpperCase());\n }\n\n private _activePlatform: string = null;\n private _activePlatformIndex: number = null;\n get activePlatformIndex(): number {\n return this._activePlatformIndex;\n }\n\n /**\n * @returns {string}\n * @private\n */\n private _setActivePlatform() {\n if (Device.os.isMobileOS) {\n this._activePlatform = PLATFORM_TYPES.MOBILE;\n this._activePlatformIndex = 1;\n } else {\n this._activePlatform = PLATFORM_TYPES.PC;\n this._activePlatformIndex = 0;\n }\n }\n\n\n\n /**\n * @param platformType\n * @returns {boolean}\n * @private\n */\n private _isPlatformMatch(platformType: string) {\n switch (platformType) {\n case PLATFORM_TYPES.ALL:\n return true;\n case PLATFORM_TYPES.MOBILE:\n return this._activePlatform === PLATFORM_TYPES.MOBILE;\n case PLATFORM_TYPES.PC:\n return this._activePlatform === PLATFORM_TYPES.PC;\n case PLATFORM_TYPES.NONE:\n return false;\n default:\n this.throwError('336', `Invalid platform type ${platformType}`);\n return false;\n }\n }\n\n /**\n * @param gameInfo\n * @returns {boolean}\n * @private\n */\n private _isGameAllowedForCurrentPlatform(gameInfo) {\n return this._isPlatformMatch(gameInfo.allowedPlatformType);\n }\n\n private _applyPlatformRestrictions(gameInfo) {\n if (this._isGameAllowedForCurrentPlatform(gameInfo)) {\n gameInfo.isCurrentPlatformAllowed = true;\n } else {\n gameInfo.isCurrentPlatformAllowed = false;\n this._gamesDiagnostics.logGameFilteredByPlatformType(gameInfo.gameType, `Game \"${gameInfo.gameType} - ${gameInfo.title}\" is not returned because of platform type filtering! Game allowed platform is ${gameInfo.allowedPlatformType} and current detected platform is ${this._activePlatform}`);\n }\n }\n}\n","/**\n * Created by florinia on 16/06/2017.\n */\nimport BaseService from '../../base/base_service';\nimport { GAME_GROUP } from '../../../../common/const/game_groups_consts';\nimport GamesDiagnosticMessages from './games_diagnostic_messages';\nimport GamesInfoCache from './games_info_cache';\nimport IGamesInformationService, {\n ILocalizedGameInfo,\n GAMES_INFO,\n RegulationApprovalValues,\n GAME_VOLATILITY\n} from './games_information_service_interface';\n\nimport {Check} from '@sparkware/app-utils';\nimport { GameChildishIconMode } from '../../../../common/enums/game-childish-icon-mode.enum';\n\n\nexport type ExternalGameTypeInfo = [string, string] // [ExternalGameTypeForPC, ExternalGameTypeForMobile]\n | string //same value for both\n | null\n | undefined\n\nexport type ExternalGameSubTypeInfo = [string, string] // [ExternalGameSubTypeForPC, ExternalGameSubTypeForMobile]\n | string // same for both PC and Mobile\n | null\n | undefined\n\n\n\nexport interface IGameInfoFromBackend {\n Id: number;\n ExtId: ExternalGameTypeInfo;\n ExtSubType?: ExternalGameSubTypeInfo;\n Title: string;\n HasJackpot: boolean;\n VendorId: number;\n Vendor?: string;\n CompanyId?: number;\n Company?: string;\n SubGroup: string;\n Group: string;\n GroupId: number;\n NumberOfLines?: number;\n AllowDemo: boolean;\n HasFreeSpins: boolean;\n PlatformType: string;\n HasSideBets: boolean;\n IsMultiHand: boolean;\n MaxBetPerSpot?: number;\n Decks?: number;\n HasBonusGames: boolean;\n Bets: { [id: string]: number[] };\n Approvals: Record;\n Thumbnail: string;\n IsEliteLounge: boolean;\n AllowWithdrawOnlyFromReal: boolean;\n MaxBetPerBrand?: number;\n GameThemes?: number[];\n Volatility: GAME_VOLATILITY;\n IsChildish?: boolean;\n HasNonChildishIcon?: boolean;\n HasLessNonChildishIcon?: boolean;\n}\n\n\n/**\n * Provides games information like gameType, gameName\n * reading data from the backend and merging it with games overrides\n * provided by the IntegrationService in the gamesMapper.\n * This service is also making use of the SkinService in order to retrieve\n * the games names\n */\nclass GamesInformationService extends BaseService implements IGamesInformationService {\n static CLASS = 'GamesInformationService';\n\n private _getGameTypesInfoUri: string;\n private _getAllGameTypesApiUri: string;\n private _gamesDiagnostics: GamesDiagnosticMessages;\n private _gamesInfoCache: GamesInfoCache;\n private _allowUnfilteredGames: boolean;\n\n themes: { [key: number]: string; };\n\n vendors: { [key: number]: string; };\n\n companies: { [key: number]: string; };\n\n init(params) {\n super.init(params);\n this._getGameTypesInfoUri = params.uri + '/getGameTypesInfo';\n this._getAllGameTypesApiUri = params.uri + '/GetAllGameIDs';\n this._gamesDiagnostics = GamesDiagnosticMessages.create();\n\n this._gamesInfoCache = this._createGamesInfoCache();\n\n this._gamesInfoCache.appendBackendGamesInfo(params.gamesInfo);\n this._allowUnfilteredGames = params.allowUnfilteredGames;\n this.themes = params.themes;\n this.vendors = params.vendors;\n this.companies = params.companies;\n }\n\n dispose() {\n this._gamesInfoCache.dispose();\n }\n\n private _createGamesInfoCache() {\n return GamesInfoCache.create({\n getServiceFactory: () => this.serviceFactory,\n gamesDiagnostics: this._gamesDiagnostics,\n });\n }\n\n /**\n * @returns {SkinService}\n * @private\n */\n private _skinService() {\n return this.serviceFactory.skinService();\n }\n\n /**\n * @returns {Http2Service}\n * @private\n */\n private _httpService() {\n return this.serviceFactory.http2Service();\n }\n\n getGamesInfoWithoutAnyFiltering(gameTypes: number[]): Promise {\n gameTypes = gameTypes || [];\n if (gameTypes.length === 0) {\n return Promise.resolve({});\n }\n\n return this._gamesInfoCache.getGamesInfo(gameTypes).then(resultFromCache => {\n const finalGamesInfo = resultFromCache.gamesInfo;\n if (resultFromCache.notFoundGames.length > 0) {\n return this._readFromServer(resultFromCache.notFoundGames).then(gamesInfo => {\n return Object.assign(finalGamesInfo, gamesInfo);\n });\n } else {\n return finalGamesInfo;\n }\n });\n }\n\n private _shouldFilterOutChildishGame(gameInfo: ILocalizedGameInfo): boolean {\n if(!gameInfo.isChildish){\n return false;\n }\n\n const childishIconMode = this.serviceFactory.regulationService().getRegulation().getChildishIconMode();\n if(childishIconMode !== GameChildishIconMode.UseNonChildishIcon && childishIconMode !== GameChildishIconMode.UseLessNonChildishIcon) {\n return false;\n }\n\n if(childishIconMode === GameChildishIconMode.UseLessNonChildishIcon && gameInfo.hasLessNonChildishIcon) {\n return false;\n }\n\n if(gameInfo.hasNonChildishIcon){\n return false;\n }\n\n return true;\n }\n\n /**\n * Retrieves the games information from the backend and merge it\n * with the information from the IntegrationService.\n * The restricted games are not returned.\n *\n * @param gameTypes - an array of game types to query for\n * @returns {Promise} where T is a map where the key is the game type and the value is an object\n * representing game properties.\n * See documentation page http://confluence/display/CGP/getGamesInfo\n */\n getGamesInfo(gameTypes: number[], overrideUnfilteredGames = false): Promise {\n return this.getGamesInfoWithoutAnyFiltering(gameTypes).then((gamesInfo) => {\n if(overrideUnfilteredGames) {\n return gamesInfo;\n }\n const result: GAMES_INFO = {};\n\n const currentRegulationType = this.serviceFactory.regulationService().getRegulationCode();\n\n Object.keys(gamesInfo).forEach(gameType => {\n const gameInfo = gamesInfo[gameType];\n\n if (gameInfo) {\n if (!gameInfo.restriction) {\n this._applyRestriction(gameInfo);\n }\n\n const isGameApproved = this._allowUnfilteredGames || this._isGameApprovedForRegulation(gameInfo, currentRegulationType);\n if (!isGameApproved) {\n this._gamesDiagnostics.logGameNotApproved(gameInfo.gameType, `Game \"${gameInfo.gameType} - ${gameInfo.title}\" is not approved for regulation ${currentRegulationType} on the current platform!`);\n } \n else if(this._shouldFilterOutChildishGame(gameInfo)){\n this._gamesDiagnostics.logGameNotApproved(gameInfo.gameType, `Game \"${gameInfo.gameType} - ${gameInfo.title}\" does not have non-childish icon!`);\n }\n else\n if (gameInfo.isCurrentPlatformAllowed && gameInfo.restriction.isGameAllowedInTheGrid()) {\n\n if (this.isGameAllowedAndExistsInHybrid(gameInfo)) {\n result[gameType] = gameInfo;\n }\n }\n }\n });\n return result;\n });\n }\n\n private _isGameApprovedForRegulation(gameInfo: ILocalizedGameInfo, currentRegulationType: string): boolean | undefined {\n if(Check.isBoolean(gameInfo.approvals)) {\n return gameInfo.approvals;\n }\n\n const approvals: RegulationApprovalValues = gameInfo.approvals && gameInfo.approvals[currentRegulationType];\n\n if(Check.isArray(approvals)) {\n return approvals[this._gamesInfoCache.activePlatformIndex]\n }\n\n return approvals;\n\n }\n\n\n isGameAllowedAndExistsInHybrid(gameInfo: ILocalizedGameInfo): boolean {\n let isGameAllowed = false;\n\n if (this.serviceFactory.hybridService().isGameApproved(gameInfo.gameType) || gameInfo.gameGroup === 'Live Casino') {\n isGameAllowed = true;\n }\n\n return isGameAllowed;\n }\n\n private _applyRestriction(gameInfo: ILocalizedGameInfo) {\n gameInfo.restriction = this.serviceFactory.restrictionsService().getGameRestriction(gameInfo.gameType, gameInfo.gameGroupId, gameInfo.vendorId);\n\n if (!gameInfo.restriction.isGameAllowedInTheGrid()) {\n this._gamesDiagnostics.logGameRestricted(gameInfo.gameType, `Game \"${gameInfo.gameType} - ${gameInfo.title}\" is not allowed in the grid because of the restrictions`);\n } else if (!gameInfo.restriction.isGameAllowedToPlayReal()) {\n this._gamesDiagnostics.logGameRestricted(gameInfo.gameType, `Game \"${gameInfo.gameType} - ${gameInfo.title}\" is not allowed to play in real mode because of the restrictions`);\n }\n }\n\n getAllGameTypes(): Promise {\n return this._httpService().get(this._getAllGameTypesApiUri);\n }\n\n getGamesSubTypesMappings(gameSubTypes?: string[]): { [key: string]: number } {\n return this._gamesInfoCache.getGamesSubTypesMappings(gameSubTypes);\n }\n\n /**\n * Retrieve information for all games available in the site\n * @returns {Object}\n */\n getAllGamesInfo(): Promise {\n return this.serviceFactory.integrationService().getAllGameTypes()\n .then((gamesType) => {\n return this.getGamesInfo(gamesType);\n });\n }\n\n /**\n *\n * @param gameTypes\n * @param gamesIntegrationOverrides\n * @returns {Promise.|Promise|*}\n * @private\n */\n private _readFromServer(gameTypes: number[]): Promise {\n const brandId = this._skinService().getBrandID();\n const country = this.serviceFactory.countryService().getCountry();\n const regulationID = this.serviceFactory.skinService().getRegulationID();\n const apiUri = this._getGameTypesInfoUri;\n return this._httpService().post<{ Games: IGameInfoFromBackend[] }>(apiUri, { BrandID: brandId.toString(), Country: country, regulationID: regulationID, GameTypes: gameTypes.map(gs => gs.toString()) })\n .then(res => {\n this._gamesInfoCache.appendBackendGamesInfo(res.Games || []);\n return this._gamesInfoCache.getGamesInfo(gameTypes).then(cacheResponse => cacheResponse.gamesInfo);\n\n })\n .catch((err) => {\n this.reThrowError('291', 'Failed to read games information from the server', err, { gameTypes });\n throw err;\n });\n }\n\n\n isVideoSlotOrVideoPokerOrScratchCardsGameGroup(gameGroupId: number): boolean {\n return gameGroupId === GAME_GROUP.VIDEO_POKER ||\n gameGroupId === GAME_GROUP.SCRATCH_CARD ||\n this.isVideoSlotOrSlotsGameGroup(gameGroupId)\n }\n\n isVideoSlotOrSlotsGameGroup(gameGroupId: number): boolean {\n return gameGroupId === GAME_GROUP.VIDEO_SLOT ||\n gameGroupId === GAME_GROUP.SLOT;\n }\n\n isRouletteOrBlackjackOrBaccarat(gameGroupId: number): boolean {\n return gameGroupId === GAME_GROUP.ROULETTE ||\n gameGroupId === GAME_GROUP.BLACKJACK ||\n gameGroupId === GAME_GROUP.BACCARAT;\n }\n\n isLiveGamesGroup(gameGroupId: number): boolean {\n return gameGroupId === GAME_GROUP.LIVE_CASINO;\n }\n\n getDiagnosticMessages() {\n return this._gamesDiagnostics.getAllDiagnosticMessages().join('\\n');\n }\n}\n\nexport default GamesInformationService;\n","import DOM from './dom';\nimport _ from './underscore';\n\nclass HTTPLoader {\n\n /**\n * Represent the cgp loading class.\n */\n static DIRECTIVE = '.cgp-loading.cgp-external-link-loader';\n\n /**\n * Hide loading spinner.\n */\n hide(): void {\n\n let elem = DOM.$$(HTTPLoader.DIRECTIVE);\n if (_.isNull(elem)) {\n return;\n }\n\n if (_.isArray(elem)) {\n elem.forEach((el) => {\n DOM.hide(el);\n });\n } else {\n DOM.hide(elem);\n }\n }\n\n\n /**\n * Show loading spinner.\n */\n show() : void {\n\n let elem = DOM.$$(HTTPLoader.DIRECTIVE);\n if (_.isNull(elem)) {\n return;\n }\n\n if (_.isArray(elem)) {\n elem.forEach((el) => {\n DOM.show(el);\n });\n } else {\n DOM.show(elem);\n }\n }\n}\n\nexport default new HTTPLoader();","import BaseService from '../../base/base_service';\nimport { PRIORITY_LEVEL } from '../overlay_manager/overlay_manager_levels';\nimport { SYSTEM_EVENTS } from '../../events/events';\nimport { GNWP_SOURCES } from '../../../../app-react/services/gnwp/gnwp-consts';\nimport Store from '../../utils/store';\nimport Device from '../../utils/device/device';\nimport Event, { SystemEventSubscription } from '../../utils/event';\nimport DOM from '../../utils/dom';\nimport HTTPLoader from '../../utils/http_loader';\nimport {\n IGameQuestionnaireBuilder,\n IGamesQuestionnaireBuilderContext,\n IGamesQuestionnaireBuilderParams,\n IGamesQuestionnaireServiceParams,\n} from './games_questionnaire_service_interface';\nimport { IElasticEventData } from '../../../../common/interfaces/structured-logging-service-interface';\nimport _ from '../../utils/underscore';\n\nconst GQ_LOCAL_STORAGE_KEY = \"shouldDisplayGamesQuestionnaire\";\nconst GQ_SCRIPT_ID = \"games_questionnaire_loader\";\nconst GQ_CONTAINER_ID = \"GamesQuestionnaireContainer\";\n\nexport default class GamesQuestionnaireService extends BaseService{\n\n static CLASS = 'GamesQuestionnaireService';\n\n private _initParams: IGamesQuestionnaireServiceParams = null;\n private _cashierSubscription: SystemEventSubscription = null;\n private _membershipSubscription: SystemEventSubscription = null;\n private _loginSubscription: SystemEventSubscription = null;\n private _loader: HTMLElement = null;\n private _gqContainer: HTMLElement = null;\n private _isListeningToCashier: boolean = false;\n private _gamesQuestionnaireBuilder: IGameQuestionnaireBuilder = null;\n private _startTimeMs: number = null;\n\n init(params: IGamesQuestionnaireServiceParams) {\n super.init(params);\n this._initParams = params;\n }\n\n protected shouldApplyFeatureToggleABTesting(): boolean{\n return true;\n }\n\n private _isEnabledForCurrentRegulation(): boolean{\n const currentRegulationCode = this.serviceFactory.regulationService().getRegulationCode();\n if (this._initParams.sourceUrl && this._initParams.enabledForRegulation && this._initParams.enabledForRegulation[currentRegulationCode]){\n return true;\n }\n return false;\n }\n\n protected toggleFeatureOn(params: any): void{\n if(this.featureEnabled){\n return;\n }\n if(!this._isEnabledForCurrentRegulation()){\n return;\n }\n this.featureEnabled = true;\n this._startListeningToCashier();\n }\n\n onInitializationCompleted(): Promise {\n if (this._isEnabledForCurrentRegulation())\n {\n if(Store.get(GQ_LOCAL_STORAGE_KEY))\n this._showOverlay();\n else\n this._subscribe();\n }\n return super.onInitializationCompleted();\n }\n\n private _subscribe(): void{\n this._membershipSubscription = this.onSystemEvent(SYSTEM_EVENTS.REGISTRATION_COMPLETED, this._listenToLogin);\n }\n\n private _listenToLogin(): void{\n this._loginSubscription = this.onSystemEvent(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, this._startListeningToCashier);\n }\n\n private _startListeningToCashier(): void{\n if(this._isListeningToCashier){\n return;\n }\n\n if(!this._loginSubscription){\n return;\n }\n\n if(this._loginSubscription && this._loginSubscription.off)\n this._loginSubscription.off();\n\n if(this.featureToggle()){\n\n if(this._membershipSubscription && this._membershipSubscription.off){\n this._membershipSubscription.off();\n }\n\n Store.set(GQ_LOCAL_STORAGE_KEY, true);\n\n this._cashierSubscription = this.onSystemEvent(SYSTEM_EVENTS.EXTERNAL_LINK_CLOSED, this._handleCloseCashier);\n this._isListeningToCashier = true;\n\n this._sendElasticAnalytics({\n action: \"listening_cashier_close\"\n });\n }\n }\n\n private _handleCloseCashier(event: any): void{\n if(event !== GNWP_SOURCES.CASHIER)\n return;\n\n if(this._cashierSubscription && this._cashierSubscription.off)\n this._cashierSubscription.off();\n\n this._showOverlay();\n }\n\n private async _initializeScript(): Promise{\n this.serviceFactory.scriptLoaderService().loadScript({\n url: this._initParams.sourceUrl,\n tagId: GQ_SCRIPT_ID\n })\n .then( () => this._getContextObject())\n .then(contextObject => {\n const params: IGamesQuestionnaireBuilderParams = {\n context: contextObject,\n onReady: this.onReadyHandler.bind(this),\n onError: this.onErrorHandler.bind(this),\n onComplete: this.onCompleteHandler.bind(this)\n };\n this._gamesQuestionnaireBuilder = this.serviceFactory.windowService().getGlobalProperty(\"GamesQuestionnaire\");\n this._gamesQuestionnaireBuilder(params).render('#' + GQ_CONTAINER_ID);\n });\n }\n\n private _showOverlay(): void{\n Store.del(GQ_LOCAL_STORAGE_KEY);\n this._startTimeMs = Date.now();\n\n this._gqContainer = DOM.createElement();\n DOM.addAttribute(this._gqContainer, \"id\", GQ_CONTAINER_ID);\n\n let overlayClass = \"games-questionnaire-overlay\";\n if(Device.isMobile())\n overlayClass += \"-mobile\";\n\n const overlayOptions = {\n el: this._gqContainer,\n additionalClasses: [overlayClass],\n isCloseBtnAllowed: false,\n priority: PRIORITY_LEVEL.GAMES_QUESTIONNAIRE\n };\n\n Event.fire(SYSTEM_EVENTS.OPEN_OVERLAY, overlayOptions);\n\n this._displayLoader();\n\n this._initializeScript();\n }\n\n private _displayLoader(): void{\n this._loader = DOM.createElement();\n DOM.addClass(this._loader,\"cgp-loading\");\n DOM.addClass(this._loader, \"cgp-external-link-loader\");\n DOM.append(this._gqContainer, this._loader);\n HTTPLoader.show();\n }\n\n private async _getContextObject(): Promise{\n const userService = this.serviceFactory.userService();\n const token = await userService.renewLoginToken().then(response => response.token);\n const skinService = this.serviceFactory.skinService();\n const languageService = this.serviceFactory.languageService();\n const langISO3 = languageService.getISO3();\n\n return {\n userInfo: token,\n brandId: skinService.getBrandID(),\n subBrandId: skinService.getSubBrandID(),\n productPackage: skinService.getProductPackageID(),\n systemId: parseInt(skinService.getPlatformSystemID()),\n lang: langISO3,\n clientPlatform: parseInt(skinService.getClientPlatform()),\n clientVersion: skinService.getVersion()\n };\n }\n\n onReadyHandler(): void{\n const timeElapsedSecs: number = (Date.now() - this._startTimeMs)/1000;\n\n this._sendElasticAnalytics({\n action: \"displayed\",\n value: timeElapsedSecs.toFixed(2),\n });\n\n HTTPLoader.hide();\n }\n\n onErrorHandler(err: any): void{\n this.logger.error('Error opening games questionnaire', err);\n const timeElapsedSecs: number = (Date.now() - this._startTimeMs)/1000;\n this._sendElasticAnalytics({\n action: \"error\",\n label: JSON.stringify(err).substr(0, 100),\n value: timeElapsedSecs.toFixed(2),\n }, true);\n\n this._closeGamesQuestionnaire();\n }\n\n onCompleteHandler(arePreferencesSaved: boolean): void{\n if(arePreferencesSaved){\n this.serviceFactory.aiListService().clearGamesRecommendationsCache();\n this._fireGamesQuestionariesCompleted();\n }\n const label = arePreferencesSaved ? \"preferences_saved\" : \"preferences_not_saved\";\n this._sendElasticAnalytics({\n action: \"completed\",\n label: label,\n });\n this._closeGamesQuestionnaire();\n }\n\n private _fireGamesQuestionariesCompleted(): void{\n Event.fire(SYSTEM_EVENTS.GAMES_QUESTIONNAIRE_COMPLETED);\n }\n\n private _closeGamesQuestionnaire(): void{\n Event.fire(SYSTEM_EVENTS.CLOSE_OVERLAY, {\n priority: PRIORITY_LEVEL.GAMES_QUESTIONNAIRE\n });\n }\n\n private _sendElasticAnalytics(elasticData: any, isError: boolean = false): void{\n const data: IElasticEventData = this._buildElasticData(elasticData);\n if(isError){\n this.serviceFactory.structuredLoggingService().getLogger(data).error();\n }else{\n this.serviceFactory.structuredLoggingService().getLogger(data).info();\n }\n }\n\n private _buildElasticData({action, label, value}): IElasticEventData {\n const data: IElasticEventData = {\n CGPEventCategory: 'Games_Questionnaire',\n CGPEventAction: action\n };\n if (label){\n data.CGPEventLabel = label;\n }\n if (value) {\n const valueAsNumber = Number(value);\n if (_.isNumber(valueAsNumber)) {\n data.CGPEventValueAsNumber = valueAsNumber;\n } else {\n data.CGPEventValue = value;\n }\n }\n return data;\n }\n}","/**\n * Created by andreyna on 6/1/2016.\n */\nimport BaseModelService from '../../base/base_model_service';\nimport _ from '../../utils/underscore';\n\nconst GNWP_URL_DEFAULT = '/cgpapi/gnwp/getGnwpConfig';\n\n/**\n *\n *\n */\nclass GNWPServiceModel extends BaseModelService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'GNWPServiceModel';\n\n private _apiURI: string;\n private _navigationURI: string;\n private _templates: string[];\n\n\n /**\n *\n * @param params\n */\n init(params) {\n if (params) {\n this\n ._setTemplates(params.templates)\n ._setURI(params.uri)\n ._setNavigationURI(params.sharedNavigationURI);\n }\n }\n\n\n /**\n * Set API URI that handle GNWP request\n *\n * @param apiUri\n * @returns {GNWPServiceModel}\n * @private\n */\n _setURI(apiUri) {\n if (!_.isString(apiUri)) {\n this._apiURI = GNWP_URL_DEFAULT;\n return this;\n }\n\n this._apiURI = apiUri;\n return this;\n }\n\n /**\n * Set list of existed GNWP templates from configuration for further validation before request\n *\n * @param templates\n * @returns {GNWPServiceModel}\n * @private\n */\n _setTemplates(templates: string) {\n let isValid = false;\n if (_.isString(templates)) {\n try {\n this._templates = JSON.parse(templates);\n isValid = true;\n } catch(e) {\n }\n }\n\n if (!isValid) {\n this.logger.error(GNWPServiceModel.CLASS + \"--> template list is not defined correctly.\");\n }\n\n return this;\n }\n\n\n /**\n * Set GNWP navigation URI. URI is aspx third party page used as proxy service for redirection to specified web site (service)\n *\n * @param uri\n * @returns {GNWPServiceModel}\n * @private\n */\n _setNavigationURI(uri) {\n if (!_.isString(uri)) {\n return this;\n }\n\n this._navigationURI = uri;\n return this;\n }\n\n\n /**\n * Get API GNWP request URI\n *\n * @returns {string}\n * @public\n */\n getGNWPUri() {\n return this._apiURI;\n }\n\n\n /**\n * Get GNWP navigation URI\n *\n * @returns {string}\n */\n getRedirectUri() {\n return this._navigationURI;\n }\n\n /**\n * Validate if template exists in list of allowed templates\n *\n * @param {string} template\n * @returns {boolean}\n */\n isValidTemplate(template: string) {\n const isValid = this._templates.find(t => {\n return t === template;\n });\n\n return isValid ? true : false;\n }\n}\n\nexport default GNWPServiceModel;\n","/**\n * Created by andreyna on 6/1/2016.\n */\nimport GNWPServiceModel from './gnwp_model';\nimport BaseService from '../../base/base_service';\nimport _ from '../../utils/underscore';\nimport Device from '../../utils/device/device';\nimport GNWPResponse from './gnwp_response';\nimport { IGNWPRequestModel } from './gnwp_service_interface';\nimport Store from \"../../utils/store\";\nimport {STATE_OF_RESIDENCE_COOKIE_KEY} from \"../../../../common/const/state-of-residence-cookie_const\";\nimport {Check} from \"@sparkware/app-utils\";\nimport {\n REGISTRATION_DATA_KEY\n} from \"../../../../app-react/services/external-links/handlers/registration/registration.external-link-handler.interface\";\n\n// 3rd party cookie which contains info about a user's allowing the use of cookies, needed by cashier\nconst COOKIE_CONSENT_KEY = \"OptanonConsent\";\n\nconst VERSION_MAX_SIZE = 50;\n\nexport enum DEVICE_ENUM_TYPE {\n NON = 0,\n IOS = 1,\n ANDROID = 2\n}\n\n/**\n * GnwpService enables perform navigation / redirect appropriate to specified template and some additional parameters.\n * Template describes the service (web site) GNWP should redirect to.\n */\nclass GnwpService extends BaseService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'GnwpService';\n\n\n /**\n * @property\n * @type {null}\n * @private\n */\n _model: GNWPServiceModel = null;\n\n\n /**\n *\n * @param params\n */\n init(params) {\n super.init(params);\n this._model = GNWPServiceModel.create(params);\n }\n\n\n /**\n * Get GNWPResponse object contains API to perform GNWP navigation (see GNWPResponse class)\n *\n * @usage:\n * getGNWPResponse({\"templateName\" : \"netent\", \"gameType\" : 2010005, \"isReal\" : true})\n *\n * @param {Object} GNWPRequestModel - {\n * templateName (string)- template describe service (web site) GNWP redirects to. REQUIRED\n * gameType (number) - game identifier to open remote game. REQUIRED in game templates\n * isReal (bool) - if it's real game or fun. NOT REQUIRED\n * }\n * There are some templates with additional parameters.\n *\n * Additional parameters in netent template\n * gameLimit (number) NOT REQUIRED\n * requestedTimeLimit (number) NOT REQUIRED\n * restrictionPeriod (number) NOT REQUIRED\n *\n * Additional parameters in omg template\n * viewPort REQUIRED\n *\n * Used for request marketing data from B2X\n *\n * @return Promise\n *\n */\n getGNWPResponse(GNWPRequestModel: IGNWPRequestModel): Promise {\n return this._getMarketingData(GNWPRequestModel).then((marketingRes) => {\n const GNWPRequest = Object.assign({}, marketingRes, GNWPRequestModel);\n if(GNWPRequest.marketingData) {\n //we discard here the incoming marketingData parameter because this was useful only inside _getMarketingData\n //and we don't want to send it in the gnwp request.\n delete GNWPRequest.marketingData;\n }\n return this._getGNWPParams(GNWPRequest)\n }).then((res: any) => {\n if (res.error_code) {\n throw new Error(res);\n }\n return GNWPResponse.create({\n baseUrl: this._model.getRedirectUri(),\n navigation: this._replaceNavigationParams(res)\n });\n\n });\n }\n\n _getMarketingData(GNWPRequestModel: IGNWPRequestModel) {\n\n const marketingData = {};\n const integrationService = this.serviceFactory.integrationService();\n let tempMarketingData = GNWPRequestModel.marketingData;\n if (!tempMarketingData && integrationService.isMarketingDataExist()) {\n tempMarketingData = integrationService.getRecentMarketData();\n }\n\n if(tempMarketingData) {\n // Use it when there are complex objects in marketData\n Object.keys(tempMarketingData).forEach((key) => {\n if (_.isString(tempMarketingData[key])) {\n marketingData[key] = tempMarketingData[key];\n } else {\n marketingData[key] = JSON.stringify(tempMarketingData[key]);\n }\n });\n }\n\n return this.serviceFactory.skinService().getSerialData(marketingData).then(data => {\n if (Device.hybrid.inCasino) {\n this._appendMarketingDataToTestData(data);\n }\n return this.serviceFactory.hybridService().getLexisNexisSession(data);\n });\n }\n\n private _appendMarketingDataToTestData(data: Record) {\n try {\n if (!data) {\n throw new Error(\"Invalid object received\");\n }\n let testData: any = this.serviceFactory.hybridService().getAppMareketingData();\n if (data.TestData) {\n testData = {\n ...JSON.parse(data.TestData),\n ...testData\n }\n }\n data.TestData = JSON.stringify(testData);\n } catch (err) {\n this.logger.warn(\"Failed to add marketingData to data.TestData\", err);\n }\n }\n\n /**\n * Check if template is valid string for GNWP navigation\n *\n * @param {string} template\n * @returns {boolean} false = GNWP template is not corrected, true = otherwise\n */\n isGNWPTemplate(template) {\n if (!template) return false;\n return this._model.isValidTemplate(template);\n }\n\n\n /**\n * Validate correct definition of GNWP request object\n *\n * @param {Object} request - GNWP request object. See runGNWPRedirect function description\n * @returns {boolean} false = GNWP request object doesn't contain [templateName] or [templateName] is not corrected, true = otherwise\n * @private\n */\n _isValidRequest(request) {\n if (!request) return false;\n\n if (!request.templateName) {\n this.logger.warn('templateName property is not found in gnwpRequestModel');\n return false;\n }\n\n return true;\n }\n\n\n /**\n * TODO We need to provide another solution to version size limitation problem\n *\n * There is a limitation of version max length in GNWP.\n * Function cuts version string to it's max size\n *\n * @param {string} version\n * @returns {string}\n * @private\n */\n _fixVersionMaxSize(version) {\n let fixVersion = version;\n if (!_.isUndefined(version) && _.isString(version)) {\n const sizeDiff = version.length - VERSION_MAX_SIZE;\n const startIndex = sizeDiff < 0 ? 0 : sizeDiff;\n fixVersion = version.slice(startIndex);\n }\n\n return fixVersion;\n }\n\n\n private getDeviceTypeForGNWP(): string {\n if (Device.hybrid.isEmbedded) {\n return 'hybrid_ios_embedded';\n } \n \n return \"\";\n }\n\n private getNativeType(): DEVICE_ENUM_TYPE {\n if (Device.hybrid.inCasino && Device.os.isIOS) {\n return DEVICE_ENUM_TYPE.IOS;\n } else if (Device.hybrid.inCasino && Device.os.isAndroid) {\n return DEVICE_ENUM_TYPE.ANDROID;\n }\n\n return DEVICE_ENUM_TYPE.NON;\n }\n\n _getUserSelectedState(): string {\n return Store.getCookie(STATE_OF_RESIDENCE_COOKIE_KEY);\n }\n\n _getOptanonConsent(): string {\n return encodeURIComponent(Store.getCookie(COOKIE_CONSENT_KEY));\n }\n\n /**\n * Performs request to server (API) and retrieves navigation parameters, appropriate to GNWP object properties\n *\n * @param {Object} request - GNWP request object. See runGNWPRedirect function description\n * @returns {Promise}\n * @private\n */\n _getGNWPParams(GNWPRequestModel: IGNWPRequestModel): Promise {\n const GNWPUri = this._model.getGNWPUri();\n const promise = new Promise((resolve, reject) => {\n if (!this._isValidRequest(GNWPRequestModel)) {\n reject(null);\n } else {\n const skinService = this.serviceFactory.skinService();\n GNWPRequestModel.brandID = skinService.getBrandID();\n GNWPRequestModel.subBrandID = skinService.getSubBrandID();\n GNWPRequestModel.productPackage = skinService.getProductPackageID();\n if(Check.isNullOrUndefined(GNWPRequestModel.isMobile)) {\n GNWPRequestModel.isMobile = Device.os.isMobileOS;\n }\n\n GNWPRequestModel.version = this._fixVersionMaxSize(skinService.getVersion());\n GNWPRequestModel.isNative = 0;\n GNWPRequestModel.storeRegistrationCookiesData = Store.get(REGISTRATION_DATA_KEY, '{}');\n GNWPRequestModel.currentRoute = this.serviceFactory.windowService().getPathName();\n GNWPRequestModel.googleSessionID = this.serviceFactory.analyticsService().getGoogleSessionID();\n GNWPRequestModel.userSelectedState = this._getUserSelectedState();\n let optanonConsent = this._getOptanonConsent();\n if (!Check.isEmpty(optanonConsent)) {\n GNWPRequestModel.OptanonConsent = optanonConsent;\n }\n // GNWPRequestModel.isMobile = true;\n // GNWPRequestModel.hybridBundleParams = 'co.dino://ddadlaskddjasdjasd123143';\n // GNWPRequestModel.hybridNativeType = 1;// 0: non 1: ios 2: android\n\n if (Device.hybrid.inCasino) {\n const defaultHybridSerial = skinService.getDefaultHybridSerial();\n if(defaultHybridSerial){\n GNWPRequestModel.sr = defaultHybridSerial;\n }\n GNWPRequestModel.hybridSmartLink = this.serviceFactory.hybridService().getSwitchBackSmartLinkToOpen();\n GNWPRequestModel.hybridScheme = this.serviceFactory.hybridService().getUrlSchemeToOpen();\n GNWPRequestModel.isNative = 1;\n }\n GNWPRequestModel.device = this.getDeviceTypeForGNWP();\n GNWPRequestModel.hybridNativeType = this.getNativeType();\n\n GNWPRequestModel.regId = this.serviceFactory.regulationService().getRegulationCode();\n if (this.serviceFactory.oAuth2Service().isAuthorized()) {\n GNWPRequestModel.registrationCountry = this.serviceFactory.userService().getAccountData().RegistrationCountry;\n }\n\n this.serviceFactory.http2Service().post(GNWPUri, GNWPRequestModel)\n .then((res) => {\n if (res) {\n resolve(res);\n } else {\n this.logger.error('GNWP request failed');\n reject('GNWP response is null');\n }\n })\n .catch(function (reason) { // (B)\n // File read error or JSON SyntaxError\n reject(reason);\n });\n }\n });\n\n return promise;\n }\n\n _replaceNavigationParams(navResp) {\n for (const param in navResp) {\n if (_.isFunction(this['_replace' + param])) {\n navResp[param] = this['_replace' + param](navResp[param]);\n }\n }\n\n return navResp;\n }\n\n /**\n *\n * @param val\n * @returns {XML|void|string|*}\n * @private\n */\n _replaceSpecificNavigation(val) {\n const refreshToken = this.serviceFactory.oAuth2Service().extractTokenProperty('refresh_token');\n\n return val.replace('{{refresh_token}}', refreshToken);\n }\n}\n\nexport default GnwpService;\n","const TARGET_VIEWS = {\n WINDOW: 1,\n IFRAME: 2\n}\n\nconst REQUEST_METHODS = {\n POST: 'POST',\n GET: 'GET'\n}\n\nexport {TARGET_VIEWS, REQUEST_METHODS};","import BaseObject from '../../base/base_object';\nimport * as GNWP_CONSTS from './gnwp_consts';\nimport _ from '../../utils/underscore';\n\nexport default class GNWPResponse extends BaseObject {\n private navigationParams: any;\n private baseUrl: string;\n\n init(params) {\n this\n ._setBaseUrl(params.baseUrl)\n ._setNavigationParams(params.navigation);\n }\n\n\n /**\n * Set GNWP navigation parameters that has been received from GNWP API request\n * @param params\n * @returns {GNWPResponse}\n * @private\n */\n private _setNavigationParams(navigation) {\n this.navigationParams = navigation;\n this.logger.debug('GNWP navigation params', this.navigationParams);\n return this;\n }\n\n\n /**\n * Set base url to GNWP navigation\n * @param url\n * @returns {GNWPResponse}\n * @private\n */\n private _setBaseUrl(url) {\n this.baseUrl = url;\n return this;\n }\n\n /**\n * Return GNWP full url\n *\n * @usage\n * Open web resource, for example, game in new window\n * \n * @example\n * let GNWPResponseObject = getObject();\n * let url = GNWPResponseObject.getGNWPUrl();\n * window.open(url);\n * \n * @returns {string}\n */\n getGNWPUrl(): string {\n const url = this.baseUrl + _.jsonToQueryString(this.navigationParams);\n return url;\n }\n\n\n /**\n * Return GNWP predefined (filled) form to perform GNWP navigation through POST\n * \n * @usage\n * Open web resource, for example, game in iframe\n * \n * @example\n * let GNWPResponseObject = getObject();\n * let form = GNWPResponseObject.getGNWPPostForm();\n * form.setAttribute('target', 'your iframe name');\n * document.body.appendChild(form);\n * form.submit();\n * \n * @returns {Element}\n */\n getGNWPPostForm(): HTMLFormElement {\n const form = document.createElement('form');\n form.setAttribute('method', 'post');\n form.setAttribute('action', this.baseUrl);\n\n for(const prop in this.navigationParams) {\n const hiddenField = document.createElement('input');\n hiddenField.setAttribute('type', 'hidden');\n hiddenField.setAttribute('name', prop);\n hiddenField.setAttribute('value', this.navigationParams[prop]);\n\n form.appendChild(hiddenField);\n }\n\n return form;\n }\n\n\n /**\n * Performs GNWP navigation to specified target (window or iframe) through HTTP method GET or POST\n * Encapsulates getGNWPUrl and getGNWPPostForm methods\n * Note: target 'window' can be opened only via GET request\n * \n * @param {string} method - HTTP method that will be performed to navigation. 'GET' or 'POST'\n * @param {string} target - specified target where GNWP navigation response will be injected ('WINDOW' or 'IFRAME')\n * @param {string} frameName - required when navigation result should be injected to iframe (target = 'IFRAME') \n */\n performGNWPNavigation(method, target, frameName) {\n switch(target) {\n case GNWP_CONSTS.TARGET_VIEWS.IFRAME:\n this._performToIframeNavigation(method, frameName);\n break;\n case GNWP_CONSTS.TARGET_VIEWS.WINDOW:\n this._performToNewWindowNavigation(method);\n break;\n default:\n break;\n }\n }\n\n /**\n * Perforn GNWP navigation and through iframe.\n * \n * @param method\n * @param frameName\n * @private\n */\n private _performToIframeNavigation(method, frameName) {\n\n if (!_.isString(method) || !_.isString(frameName)) {\n throw new Error('GNWP navigation failed. method or frameName is not provided');\n }\n\n switch (method) {\n case GNWP_CONSTS.REQUEST_METHODS.GET:\n const url = this.getGNWPUrl();\n const frame = document.getElementsByName(frameName) as any;\n frame.src = url;\n break;\n case GNWP_CONSTS.REQUEST_METHODS.POST:\n const form = this.getGNWPPostForm();\n form.setAttribute('target', frameName);\n document.body.appendChild(form);\n form.submit();\n document.body.removeChild(form);\n break;\n }\n }\n\n\n /**\n * Perform GNWP navigation in new window\n * @param method\n * @private\n */\n private _performToNewWindowNavigation(method) {\n if (!_.isString(method)) {\n throw new Error('GNWP navigation failed. method is not provided');\n }\n\n if (method !== GNWP_CONSTS.REQUEST_METHODS.GET) {\n throw new Error('GNWP navigation failed. Impossible open new window with method POST');\n }\n\n const url = this.getGNWPUrl();\n window.open(url);\n }\n}\n","import BaseService from '../../base/base_service';\nimport _ from '../../utils/underscore';\nimport IHistoryService, { IDailyDealCampaign } from './history_service_interface';\n\nexport interface IHistoryServiceParams {\n uri: string;\n gameSessionUri: string;\n recentlyPlayedUri: string;\n aiRecommendedGameListUri: string;\n popupCampaignsUrl: string;\n}\n\n\nexport default class HistoryService extends BaseService implements IHistoryService {\n static CLASS = 'HistoryService';\n\n private _params: IHistoryServiceParams;\n\n\n init(params: IHistoryServiceParams) {\n super.init(params);\n this._params = params;\n }\n\n\n getRecentlyPlayed(): Promise<{gameTypes: number[]}> {\n return this.serviceFactory.http2Service().post(this._params.recentlyPlayedUri);\n }\n\n /**\n * Gets the AI Recommended Game List from the server / platform\n * @returns {Promise|Object{RecommendedGameList : Object}\n */\n getAIRecommendedGameList(): Promise<{[gameType: number]: number}> {\n return new Promise((resolve) => {\n this.serviceFactory.http2Service().post(this._params.aiRecommendedGameListUri).then((data: any) => {\n try {\n if (typeof data !== 'object')\n resolve({});\n\n resolve(data.RecommendedGameList);\n } catch (e) {\n this.logger.error('Failed to parse get AI recommended list response, error:' + e);\n resolve({});\n }\n });\n });\n }\n\n public getDailyDealCampaigns(): Promise {\n if (_.isEmpty(this._params.popupCampaignsUrl)) {\n return Promise.resolve([]);\n }\n return this.serviceFactory.http2Service().post(this._params.popupCampaignsUrl)\n .then((data: any) => (data && data.MarketingCampaigns) || [])\n .catch(() => []);\n }\n}\n","import BaseService from '../../base/base_service';\nimport Device from '../../utils/device/device';\nimport IHttp2Service from './http2_service_interface';\nimport {isAbsolutUrl} from \"../../../../utils/url-utils\";\nimport {Check} from \"@sparkware/app-utils\";\nimport {CGP_ERROR_CODES} from \"../../exceptions/cgp_error_codes\";\nimport _ from '../../utils/underscore';\nimport {parseFetchResponse} from \"../../../../common/utils/parse-fetch-response\";\nimport Store from \"../../utils/store\";\nimport {STATE_OF_RESIDENCE_COOKIE_KEY} from \"../../../../common/const/state-of-residence-cookie_const\";\n\ntype ParameterValue = string | number | boolean | null | undefined;\nexport interface Http2ServiceParams {\n origin: string;\n skin: string;\n skinOverride: string;\n useCountryAsState: boolean;\n}\n\ninterface IFetchError {\n error_code: string;\n error_description?: string;\n error?: string;\n [key: string]: any;\n}\n\ninterface IFetchOptions {\n method: string;\n headers?: HeadersInit;\n body?: any\n encodeBody?: (bodyData: any) => any;\n keepalive?:boolean;\n}\n\nexport default class Http2Service extends BaseService implements IHttp2Service {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'Http2Service';\n\n\n private _initParams: Http2ServiceParams;\n\n init(params: Http2ServiceParams) {\n super.init(params);\n this._initParams = {\n origin: window.location.origin,\n ...params\n }\n\n }\n\n /**\n * Set the origin of the request from the configuration if not something else set.\n */\n public appendOrigin(url: string): string {\n if (isAbsolutUrl(url)) {\n return url;\n } else {\n return this._initParams.origin + url;\n }\n }\n\n private _urlEncodeOneParam(name: string, value: ParameterValue | ParameterValue[]): string {\n if(Check.isArray(value)) {\n return value.filter(item => !Check.isNullOrUndefined(item))\n .map(item => `${encodeURIComponent(name)}=${encodeURIComponent(item.toString())}`)\n .join('&');\n } else {\n return `${encodeURIComponent(name)}=${encodeURIComponent(value?.toString() || '')}`\n }\n }\n\n private _urlEncodeUrlParams(params: object): string {\n return Object.keys(params)\n .map(propertyName => this._urlEncodeOneParam(propertyName, params[propertyName]))\n .join('&');\n }\n\n private _encodeXFormBodyParams(body?: object): string {\n body = {\n ...body,\n ...this._applicationParams()\n };\n\n return this._urlEncodeUrlParams(body);\n }\n\n\n private _parseFetchError(error: IFetchError): IFetchError {\n let error_code: string = CGP_ERROR_CODES.GENERAL_ERROR_SUPPORT.toString();\n if(error.error === CGP_ERROR_CODES.INVALID_GRANT) {\n error_code = CGP_ERROR_CODES.INVALID_GRANT\n }\n error = {\n error_code: error_code,\n ...error\n };\n\n if(error.error_description) {\n error = {\n ...error,\n ..._.safeJSON(error.error_description, {})\n }\n }\n\n return error;\n }\n\n\n private async _executeFetch(url: string, options: IFetchOptions): Promise {\n const response = await fetch(url, {\n method: options.method,\n body: options.encodeBody ? options.encodeBody(options.body) : options.body,\n headers: options.headers,\n keepalive:options.keepalive\n });\n\n\n if(response.status >= 400) {\n let error: IFetchError = {error_code: CGP_ERROR_CODES.GENERAL_ERROR_SUPPORT.toString()};\n try {\n error = await parseFetchResponse(response);\n } catch (err) {\n this.logger.error(`Fetch response.json() failed ${options.method} ${url}`, err);\n }\n\n error = this._parseFetchError(error);\n\n this._logFetchError(\n options.method,\n url, {\n errorStatusCode: response.status,\n errorStatusText: response.statusText,\n ...error\n },\n options.body,\n options.headers);\n\n throw error;\n }\n\n\n if(response.status !== 204) { //204 means no content and this happens when the API doesn't return any data (a void operation on the backend side)\n return await parseFetchResponse(response);\n }\n\n return undefined;\n }\n\n\n /**\n * HTTP post using Content-Type: application/x-www-form-urlencoded\n */\n\n async post(url: string, body?: object, headers?: HeadersInit): Promise {\n headers = {\n 'Content-Type': 'application/x-www-form-urlencoded',\n ...headers\n };\n\n url = this.appendOrigin(url);\n\n return await this._executeFetch(url, {\n method: 'POST',\n headers: headers,\n body: body,\n encodeBody: body => this._encodeXFormBodyParams(body)\n });\n }\n\n private _logFetchError(method: string, url: string, error: any, request?: any, headers?: HeadersInit) {\n request = {...request};\n let authenticationData: any = request.authenticationData;\n if(authenticationData) {\n try {\n authenticationData = JSON.parse(authenticationData);\n if(authenticationData?.credentials) {\n authenticationData.credentials.password = '*';\n request.authenticationData = authenticationData;\n }\n }catch(err){}\n }\n\n\n this.logger.error(`Http request failed: ${method} ${url}`, {\n error: error,\n request: request,\n headers: headers\n });\n }\n\n async postJSON(url: string, options:{body?: Object, headers?: HeadersInit, keepalive?:boolean}): Promise{\n url = this.appendOrigin(url);\n options.headers = {\n 'Content-Type': 'application/json',\n ...options.headers\n }\n return await this._executeFetch(url, {\n method: 'POST',\n headers: options.headers,\n body: JSON.stringify(options.body),\n keepalive:options.keepalive //see here when we need it : https://chromestatus.com/feature/4664843055398912\n });\n }\n\n\n /**\n * HTTP get request you can send custom params and headers.\n */\n async get(url: string, params?: object, headers?: HeadersInit): Promise {\n let fullURL = new URL(this.appendOrigin(url));\n if(params) {\n if(fullURL.search) {\n fullURL.search = fullURL.search + '&' + this._urlEncodeUrlParams(params);\n } else {\n fullURL.search = this._urlEncodeUrlParams(params);\n }\n }\n\n return await this._executeFetch(fullURL.href, {\n method: 'GET',\n headers: headers\n });\n }\n\n\n private _getClientProperties() {\n const skinService = this.serviceFactory.skinService();\n return {\n version: skinService.getVersion(),\n brandName: skinService.getBrandName(),\n subBrandId: skinService.getSubBrandID(),\n brandId: skinService.getBrandID(),\n productPackageId: skinService.getProductPackageID(),\n screenWidth: Device.viewport.screenWidth,\n screenHeight: Device.viewport.screenHeight,\n language: this.serviceFactory.languageService().getISO3(),\n operatingSystem: Device.os.name\n };\n }\n\n\n\n /**\n * Get essential application params depend on request.\n */\n private _applicationParams() {\n const params: any = {};\n\n // Set the current application iso3 language.\n params.lang = this.serviceFactory.languageService().getISO3();\n\n // Get the token bearer authorization to set on the header.\n const getBearerToken = this.serviceFactory.oAuth2Service().getTokenAuthorizeHeader();\n\n // Is token bearer exist? if yes send it with the request.\n if (getBearerToken) {\n params.Authorization = getBearerToken;\n }\n params.clientRequestId = Device.generateGuid().replace(/-/g, '');\n params.clientProperties = JSON.stringify(this._getClientProperties());\n\n\n const fakeClientIp = this.serviceFactory.oAuth2Service().getFakeClientIP();\n if(fakeClientIp) {\n params.FakeClientIP = fakeClientIp;\n }\n\n const cmsSource = this.serviceFactory.integrationService().getCmsSourceIfValid();\n if(cmsSource) {\n params.CGP_CMSSource = cmsSource;\n }\n params.CGP_DomainOrigin = window.location.origin;\n\n params.CGP_State = Store.getCookie(STATE_OF_RESIDENCE_COOKIE_KEY);\n params.CGP_Skin = this._initParams.skin;\n params.CGP_SkinOverride = this._initParams.skinOverride;\n params.CGP_Country = this.serviceFactory.countryService().getCountry();\n params.CGP_UseCountryAsState = this._initParams.useCountryAsState;\n\n return params;\n }\n}\n","/**\n * 3 D Thouch const symbols.\n * @constant\n * @type {Object}\n */\nconst T3D_TOUCH = {\n ACT_QUICK_DEPOSIT: 'QuickDeposit',\n ACT_LOGIN: 'Login',\n ACT_PLAY_GAME: 'PlayGame',\n ACTION: 'action',\n CAPTION: 'caption',\n VAL: 'val',\n CLIENT_ACTION: 'clientAction',\n CLIENT_VAL: 'clientVal',\n INIT_GAME_ID: 'initGameId',\n RECENTLY_PLAYED_GAME_ID: 'recentlyPlayedGameId'\n};\n\n\nexport {T3D_TOUCH};","import BaseModel from '../../../../base/base_model';\nimport {T3D_TOUCH} from './three_d_touch_consts';\nimport {KEY_NAME} from '../../native/native_const';\nimport Store from '../../../../utils/store';\n\n\nclass ThreeDTouchModel extends BaseModel {\n\n static CLASS = 'ThreeDTouchModel';\n\n _gameCaption = '';\n _params='';\n\n /*\n * init the params to be an json object.\n * @params is string from web.config\n * @params is json object from html\n */\n init(params) {\n\n this._params = params;\n super.init(params);\n }\n\n setShourtcutGameCaption(caption) {\n this._gameCaption = caption;\n }\n\n getShourtcutGameCaption() {\n return this._gameCaption;\n }\n\n saveInitGameId(newGameId) {\n\n let prevGameId = Store.get(T3D_TOUCH.INIT_GAME_ID, '0');\n\n if (newGameId !== prevGameId) {\n Store.set(T3D_TOUCH.INIT_GAME_ID, newGameId);\n this.saveRecentlyPlayedGame(newGameId);\n }\n }\n\n saveRecentlyPlayedGame(gameId) {\n Store.set(T3D_TOUCH.RECENTLY_PLAYED_GAME_ID, gameId);\n }\n\n getRecentlyPlayedGame() {\n let gameId = Store.get(T3D_TOUCH.RECENTLY_PLAYED_GAME_ID, '0');\n return gameId;\n }\n\n\n getParams() {\n return this._params ? this._params.ShourtcutsLaunch : '';\n }\n\n getUpdateShortcutDataObj(action, caption = '', val = '') {\n\n let data = {\n [T3D_TOUCH.ACTION]: action,\n [T3D_TOUCH.CAPTION]: caption,\n [T3D_TOUCH.VAL]: val\n };\n\n return JSON.stringify(data);\n }\n\n getShortcutLaunch(data) {\n let error = data[KEY_NAME.ERROR];\n if (error !== 0) {\n return null;\n }\n\n let shortcut = data[KEY_NAME.DATA];\n\n return shortcut;\n }\n\n}\n\nexport default ThreeDTouchModel;","import BaseObject from '../../../../base/base_object';\nimport _ from '../../../../utils/underscore';\nimport Model from './three_d_touch_model';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\nimport Event from '../../../../utils/event';\nimport {T3D_TOUCH} from './three_d_touch_consts';\nimport ServiceFactory from '../../../service_factory';\nimport {CashierSessionType} from \"@sparkware/uc-sdk-core\";\n\n\n\nclass ThreeDTouch extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'ThreeDTouch';\n\n _model = null;\n _HybridService = null;\n\n init(params) {\n\n super.init(params);\n\n this._model = Model.create(params);\n\n this._subscribe();\n }\n\n initFeatures(hybridSrv) {\n this._HybridService = hybridSrv;\n return this;\n }\n\n _subscribe() {\n Event.on(SYSTEM_EVENTS.ON_INIT_COMPLETE, this.initThreeDTouch, this);\n Event.on(SYSTEM_EVENTS.RECENTLY_PLAYED_GAMES_UPDATED, this.updateRecentlyPlayed, this);\n }\n\n _languageService() {\n return ServiceFactory.create().languageService();\n }\n _gamesInformationService() {\n return ServiceFactory.create().gamesInformationService();\n }\n\n initThreeDTouch() {\n this._getCurrectShourtcutsLaunchTxt()\n .then(shourtcutsLaunch => {\n this._HybridService.init3DTouchShourtcutsLaunch(JSON.stringify(shourtcutsLaunch));\n });\n }\n\n /**\n * get the Currect Shourtcuts Launch Text\n * translate the caption to the currect language.\n * @returns {Promise}\n */\n _getCurrectShourtcutsLaunchTxt() {\n return new Promise((resolve) => {\n\n let shourtcutsLaunch = this._model.getParams();\n\n let bResolve = true;\n let caption = '';\n\n for (let key in shourtcutsLaunch) {\n\n let shourtcutData = shourtcutsLaunch[key];\n caption = shourtcutData.caption;\n\n shourtcutData.caption = this._languageService().translation(caption);\n\n if (T3D_TOUCH.ACT_PLAY_GAME === shourtcutData.action) {\n\n this._model.setShourtcutGameCaption(caption);\n this._model.saveInitGameId(shourtcutData.val);\n shourtcutData.val = this._model.getRecentlyPlayedGame();\n bResolve = false;\n\n this.getCurrectGameName(shourtcutData).then(data => {\n const res = null !== data ? shourtcutsLaunch : null;\n resolve(res);\n });\n }\n }\n if (bResolve) {\n resolve(shourtcutsLaunch);\n }\n });\n }\n\n /**\n * get the current game name.\n * @param caption: example: {action: \"PlayGame\", caption: \"Play {GAME_NAME}\", val: \"130043\"}\n * @returns {Promise} example: {action: \"PlayGame\", caption: \"Play Millionaire Genie\", val: \"130043\"}\n */\n getCurrectGameName(shortcutData) {\n return new Promise((resolve) => {\n let gameType = Number(shortcutData.val);\n return this._gamesInformationService().getGamesInfo([gameType])\n .then(gamesInfo => {\n if(undefined !== gamesInfo[gameType]) {\n shortcutData.caption = shortcutData.caption.replace('{GAME_NAME}', gamesInfo[gameType].title);\n resolve(shortcutData);\n }else{\n resolve(null);\n }\n });\n });\n }\n\n /**\n * @param action: example: Login,QuickDeposit\n * @param caption: example: Login,QuickDeposit\n * @example: updateShourtcut('QuickDeposit','QuickDeposit')\n * @returns {Promise}\n */\n updateShourtcut(action, caption) {\n\n let shourtcutData = this._model.getUpdateShortcutDataObj(action, caption, '');\n this._HybridService.update3DTouchShortcut(shourtcutData);\n }\n\n\n /**\n * @param gameType: example: 130043\n * @example: updateGameShourtcut('130043')\n * @returns {Promise}\n */\n updateGameShourtcut(gameType) {\n\n let caption = this._model.getShourtcutGameCaption();\n caption = this._languageService().translation(caption);\n let shourtcutData = JSON.parse(this._model.getUpdateShortcutDataObj(T3D_TOUCH.ACT_PLAY_GAME, caption, gameType));\n\n this.getCurrectGameName(shourtcutData).then(data => {\n if(null !== data) {\n this._HybridService.update3DTouchShortcut(JSON.stringify(data));\n this._model.saveRecentlyPlayedGame(gameType);\n }\n });\n }\n\n /**\n * @update the Recently Played game\n * @param gamesList: example: [130090, 130037, 130071]\n */\n updateRecentlyPlayed(gamesList) {\n this._gamesInformationService().getGamesInfo(gamesList).then(() => {\n if (!_.isEmpty(gamesList[0])) {\n this.updateGameShourtcut(gamesList[0]);\n }\n });\n }\n\n\n /**\n * @run the currect action from the 3dTouch button\n * @param shourtcuts: example: {action:'PlayGame',val:'130090'}\n */\n runAction(shourtcuts) {\n\n if (!_.isEmpty(shourtcuts)) {\n switch (shourtcuts.action) {\n case T3D_TOUCH.ACT_LOGIN:\n window.CGP.openLoginForm();\n break;\n case T3D_TOUCH.ACT_PLAY_GAME:\n window.CGP.openGame({gametype: Number(shourtcuts.val), isReal: true});\n break;\n case T3D_TOUCH.ACT_QUICK_DEPOSIT:\n ServiceFactory.create().cashierProxyService().openCashier({\n sessionType: CashierSessionType.QuickDeposit\n })\n break;\n default:\n /* Maybe should throw an exception */\n break;\n }\n }\n }\n\n\n\n /**\n * Delete a specific shourtcuts from the 3Dtouch shortcuts\n * @param action: example: Login,QuickDeposit,PlayGame\n * @returns {Promise}\n */\n deleteShortcut(action) {\n let data = this._model.getUpdateShortcutDataObj(action);\n return this._HybridService.delete3DTouchShourtcut(data);\n }\n\n /**\n * Delete all the shourtcuts from the 3Dtouch shortcuts\n * @returns {Promise}\n */\n deleteAllShourtcuts() {\n return this._HybridService.deleteAll3DTouchShourtcuts();\n }\n\n /**\n * @get the shourtcuts that was pressed on the 3Dtouch\n * @returns {Promise}\n */\n getShortcutLaunch() {\n return new Promise((resolve, reject) => {\n this._HybridService.get3DTouchShortcutLaunch().then(data => {\n let shourtcuts = this._model.getShortcutLaunch(_.safeJSONandDecode(data));\n resolve(shourtcuts);\n }).catch(() => {\n reject();\n });\n });\n }\n\n}\nexport default ThreeDTouch;\n","/**\n * DeepLinkHybrid const symbols.\n * @constant\n * @type {Object}\n */\nconst DEEP_LINK_HYBRID = {\n TYPE: \"deeplinkfeature\"\n};\n\n\nexport {DEEP_LINK_HYBRID};","import BaseModel from '../../../../base/base_model';\nimport {KEY_NAME} from '../../native/native_const';\nimport _ from \"../../../../utils/underscore\";\nimport {DEEP_LINK_HYBRID} from \"./deep_link_hybrid_consts\";\n\n\nclass DeepLinkModel extends BaseModel {\n\n static CLASS = 'DeepLinkModel';\n _deepLinkObject = {};\n\n\n /*\n * init the params to be an json object.\n * @params is string from web.config\n * @params is json object from html\n */\n init(params) {\n super.init(params);\n }\n\n updateData(data) {\n this._deepLinkObject = this.extractDeepLinkObject(data);\n }\n\n getDeepLinkObject(){\n return this._deepLinkObject;\n }\n\n extractDeepLinkObject(data) {\n const {[KEY_NAME.TYPE]: type, ...deepLinkObject} = data;\n\n if(type === DEEP_LINK_HYBRID.TYPE){\n if(_.isObject(deepLinkObject))\n return deepLinkObject;\n\n return _.safeJSONandDecode(deepLinkObject);\n }\n }\n\n}\n\nexport default DeepLinkModel;","import BaseObject from '../../../../base/base_object';\nimport Model from \"./deep_link_model\";\nimport {KEY_NAME} from \"../../native/native_const\";\nimport Event from \"../../../../utils/event\";\nimport {SYSTEM_EVENTS} from \"../../../../events/events\";\n\nclass DeepLinkHybrid extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'DeepLink';\n\n _model = null;\n _HybridService = null;\n\n init(params) {\n super.init(params);\n this._model = Model.create(params);\n }\n\n initFeatures(hybridSrv) {\n this._HybridService = hybridSrv;\n return this;\n }\n\n onHybridDirectCall(data) {\n this._model.updateData(data);\n\n const deepLinkObject = this._model.getDeepLinkObject();\n\n if(deepLinkObject && deepLinkObject[KEY_NAME.ACTION]) {\n Event.fire(SYSTEM_EVENTS.DEEPLINK_RECEIVED, deepLinkObject);\n }\n }\n}\nexport default DeepLinkHybrid;\n","import BaseObject from '../../../../base/base_object';\nimport _ from \"../../../../utils/underscore\";\nimport Device from '../../../../utils/device/device';\nimport {KEY_NAME} from \"../../native/native_const\";\n\n/**\n *\n *\n */\n\n\nconst DEPOSIT_WIDGET_KEY = 'shouldOpenInSecoundWebView=true';\n\nclass DepositWidget extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'DepositWidget';\n _HybridService = null;\n _bEnable = false;\n _bDepositWidgetSupported = false;\n\n\n\n\n init(params) {\n\n super.init();\n\n if(_.isNullOrUndefined(params)){\n return;\n }\n\n if (Device.os.isIOS) {\n params = params.ios;\n } else if (Device.os.isAndroid) {\n params = params.android;\n }\n\n if(!_.isNullOrUndefined(params)){\n this._bEnable = params.enable;\n }\n }\n\n initFeatures(hybridSrv) {\n\n this._HybridService = hybridSrv;\n\n if(this._bEnable){\n this.initFeature();\n }\n\n return this;\n }\n\n initFeature(){\n\n let dt = {[KEY_NAME.URL]: DEPOSIT_WIDGET_KEY};\n\n this._HybridService.checkHybridSupportDepositWidget(dt).then(data => {\n this._bDepositWidgetSupported = true;\n this._HybridService.updateDepositWidgetSupported();\n });\n }\n\n isDepositWidgetSupported() {\n return this._bDepositWidgetSupported;\n }\n\n}\n\n\nexport default DepositWidget;\n","/**\n * DeviceDetection const symbols.\n * @constant\n * @type {Object}\n */\n\n\n\nconst DEVICE_DETECTION = {\n KEY_IS_EMULATOR: 'IsEmulator',\n KEY_IS_ROOT_1: 'IsRootMethod1',\n KEY_IS_ROOT_2: 'IsRootMethod2',\n KEY_IS_ROOT_3: 'IsRootMethod3',\n KEY_IS_JAIL_BROKEN: 'IsJailBroken'\n\n};\n\nexport {DEVICE_DETECTION};","import BaseObject from '../../../../base/base_object';\nimport {DEVICE_DETECTION} from './device_detection_hybrid_consts';\nimport _ from \"../../../../utils/underscore\";\nimport {KEY_NAME} from \"../../native/native_const\";\nimport {SYSTEM_EVENTS} from \"../../../../events/events\";\n\n\n/**\n *\n *\n */\nclass DeviceDetection extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'DeviceDetection';\n\n _HybridService = null;\n\n\n initFeatures(hybridSrv) {\n\n this._HybridService = hybridSrv;\n\n this._HybridService.onSystemEvent(SYSTEM_EVENTS.ON_INIT_COMPLETE, () => {\n if(this._HybridService.serviceFactory.regulationService().getRegulation().isDeviceDetectionEnabled()) {\n this._HybridService.getDeviceDetectionInfo().then(data => {\n this._checkIfNeedPopUp(data);\n });\n }\n });\n\n return this;\n }\n\n _checkIfNeedPopUp(data) {\n\n try {\n\n const json = _.safeJSONandDecode(data);\n const datainfo = json[KEY_NAME.DATA];\n const bIsEmulator = this._getVal(datainfo, DEVICE_DETECTION.KEY_IS_EMULATOR);\n const bIsRootMethod1 = this._getVal(datainfo, DEVICE_DETECTION.KEY_IS_ROOT_1);\n const bIsRootMethod2 = this._getVal(datainfo, DEVICE_DETECTION.KEY_IS_ROOT_2);\n const bIsRootMethod3 = this._getVal(datainfo, DEVICE_DETECTION.KEY_IS_ROOT_3);\n const bIsJailBroken = this._getVal(datainfo, DEVICE_DETECTION.KEY_IS_JAIL_BROKEN);\n\n let showPopUp = false;\n let title = '';\n let text = '';\n let btntxt = this._HybridService.serviceFactory.languageService().translation('close_app');\n\n if(bIsEmulator){\n showPopUp = true;\n title = this._HybridService.serviceFactory.languageService().translation('emulator_detected_title');\n text = this._HybridService.serviceFactory.languageService().translation('emulator_detected_txt');\n }else if( bIsRootMethod1 || bIsRootMethod2 || bIsRootMethod3){\n showPopUp = true;\n title = this._HybridService.serviceFactory.languageService().translation('rooted_detected_title');\n text = this._HybridService.serviceFactory.languageService().translation('rooted_detected_txt');\n }else if(bIsJailBroken){\n showPopUp = true;\n title = this._HybridService.serviceFactory.languageService().translation('jail_broken_title');\n text = this._HybridService.serviceFactory.languageService().translation('jail_broken_txt');\n }\n\n\n if(showPopUp){\n this._showPopUp(title, text, btntxt);\n }\n }\n catch (e) {\n this._HybridService.logger.error('DeviceDetection: ' + e);\n }\n }\n\n _showPopUp(title, text, btntxt){\n\n this._HybridService.serviceFactory.messageManagerService().openMessage({\n title: title,\n text: text,\n closeButton:false,\n hasDefaultButton: false,\n buttons: [\n {\n name: btntxt,\n callback: ()=> {\n this._HybridService.closeApp();\n },\n isClosable: true\n }]\n });\n }\n\n _getVal(datainfo, key){\n return 'true' === datainfo[key];\n }\n}\n\nexport default DeviceDetection;\n","/**\n * FABRIC const symbols.\n * @constant\n * @type {Object}\n */\n\n\n\nconst FABRIC = {\n EV_NAME: 'evName',\n START_WITH: 'fb_'\n};\n\n\nexport {FABRIC};","import BaseModel from '../../../../base/base_model';\nimport {FABRIC} from './fabric_hybrid_consts';\n\n\n/**\n *\n */\nclass FabricModel extends BaseModel {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'FabricModel';\n\n\n /**\n * @property\n * @type {string}\n * @private\n */\n\n _ev = null;\n\n createEvName(name){\n this._ev = {[FABRIC.EV_NAME]: name};\n }\n\n addEvKeyVal(key, val){\n this._ev = Object.assign(this._ev, {[FABRIC.START_WITH + key] : val});\n return this.getEv();\n }\n\n getEv(){\n return this._ev;\n }\n}\n\nexport default FabricModel;","import BaseObject from '../../../../base/base_object';\nimport Model from './fabric_hybrid_model';\nimport {FABRIC} from './fabric_hybrid_consts';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\nimport Event from '../../../../utils/event';\nimport Device from \"../../../../utils/device/device\";\nimport _ from \"../../../../utils/underscore\";\n\n\n/**\n *\n *\n */\nclass Fabric extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'Fabric';\n _model = null;\n _HybridService = null;\n _bEnable = false;\n\n init(params) {\n\n super.init();\n\n this._model = Model.create(params);\n\n if(_.isNullOrUndefined(params)){\n return;\n }\n if (Device.hybrid.inCasino) {\n if (Device.os.isIOS) {\n params = params.ios;\n } else if (Device.os.isAndroid) {\n params = params.android;\n }\n }\n\n if(!_.isNullOrUndefined(params) && params.enable){\n this._subscribe();\n }\n }\n\n initFeatures(hybridSrv) {\n\n this._HybridService = hybridSrv;\n\n return this;\n }\n\n _subscribe() {\n this._bEnable = true;\n Event.on(SYSTEM_EVENTS.FABRIC_ADD_EVENT, this._addEvent, this);\n }\n\n /**\n * add Event to fabric\n * @param ev the event to write\n * Example of adding 3 keys with single event:\n this._HybridService.createFabricEv('evName500');\n let ev = this._HybridService.addFabricKeyVal('key111', 'val111');\n ev = this._HybridService.addFabricKeyVal('key222', 'val222');\n ev = this._HybridService.addFabricKeyVal('key333', 'val223333');\n Event.fire(SYSTEM_EVENTS.FABRIC_ADD_EVENT, ev);\n */\n _addEvent(ev) {\n\n if (this._IsValid(ev) && null !== this._HybridService) {\n this._HybridService.addFabricEvent(ev);\n }\n }\n\n _IsValid(ev){\n\n if (!this._bEnable || _.isNullOrUndefined(ev) || _.isNullOrUndefined(ev.evName)) {\n return false;\n }\n\n for (let key in ev.evkeys)\n {\n if(!key.startsWith(FABRIC.START_WITH))\n {\n return false;\n }\n }\n\n return true;\n }\n\n createEvName(name){\n this._model.createEvName(name);\n }\n\n addEvKeyVal(key, val){\n return this._model.addEvKeyVal(key, val);\n }\n\n getEv(){\n return this._model.getEv();\n }\n}\n\nexport default Fabric;\n","/**\n * FIREBASE const symbols.\n * @constant\n * @type {Object}\n */\n\n\n\nconst FIREBASE = {\n INSTANCE_ID: 'fbInstanceId',\n APP_ID: 'fbAppId'\n};\n\n\nexport {FIREBASE};","import BaseObject from '../../../../base/base_object';\nimport {FIREBASE} from './firebase_hybrid_consts';\nimport _ from \"../../../../utils/underscore\";\nimport Device from \"../../../../utils/device/device\";\nimport {KEY_NAME} from \"../../native/native_const\";\n\n\n\n\n/**\n *\n *\n */\nclass FireBase extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'FireBase';\n _HybridService = null;\n _InstanceId = '';\n _AppId = '';\n _bEnable = false;\n\n init(params) {\n\n super.init();\n\n if(_.isNullOrUndefined(params)){\n return;\n }\n if (Device.hybrid.inCasino) {\n if (Device.os.isIOS) {\n params = params.ios;\n } else if (Device.os.isAndroid) {\n params = params.android;\n }\n }\n\n if(!_.isNullOrUndefined(params) && params.enable){\n this._bEnable = true;\n }\n }\n\n initFeatures(hybridSrv) {\n\n this._HybridService = hybridSrv;\n\n if(this._bEnable) {\n this._getData();\n }\n return this;\n }\n\n _getData(){\n\n this._HybridService.getFireBaseData().then(data => {\n\n let json = _.safeJSONandDecode(data);\n let error = json[KEY_NAME.ERROR];\n if (error !== 0) {\n return;\n }\n\n const fbdata = json[KEY_NAME.DATA];\n\n this._InstanceId = fbdata[FIREBASE.INSTANCE_ID];\n this._AppId = fbdata[FIREBASE.APP_ID];\n });\n }\n\n getAppMareketingData(){\n\n const data = {FirebaseAppID: this._AppId, FirebaseAppInstanceID: this._InstanceId};\n\n return data;\n }\n\n}\n\nexport default FireBase;\n","import BaseObject from '../../../../base/base_object';\nimport Device from '../../../../utils/device/device';\nimport _ from \"../../../../utils/underscore\";\nimport {KEY_NAME} from \"../../native/native_const\";\nimport Event from \"../../../../utils/event\";\nimport {SYSTEM_EVENTS} from \"../../../../events/events\";\n\n\nclass GameLauncher extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'GameLauncher';\n\n _HybridService = null;\n _bEnableLocalGameLauncher = false;\n _bEnable = false;\n\n\n init(params) {\n\n if (Device.hybrid.isEmbedded) {\n params = params.ios;\n if (!_.isNullOrUndefined(params) && !_.isNullOrUndefined(params.enable)) {\n this._bEnable = params.enable;\n }\n }\n\n super.init(params);\n }\n\n initFeatures(hybridSrv) {\n this._HybridService = hybridSrv;\n\n if (this._bEnable) {\n Event.on(SYSTEM_EVENTS.ON_INIT_COMPLETE, this.checkLocalGameLauncher, this);\n }\n\n return this;\n }\n\n checkLocalGameLauncher(){\n\n this._HybridService.checkLocalGameLauncher().then(data => {\n data = _.safeJSONandDecode(data);\n\n let error = data[KEY_NAME.ERROR];\n if (error !== 0) {\n return;\n }\n\n let keyData = data[KEY_NAME.DATA];\n if(undefined !== keyData) {\n const isSupported = (keyData[KEY_NAME.LOCAL_GAME_LAUNCHER_SUPPORTED] === 'true');\n\n if(isSupported) {\n this._HybridService.loadGameLauncher();\n this._HybridService.loadGamePreLoader();\n this.setLocalGameLauncherSupported(isSupported);\n }\n }\n })\n }\n\n setLocalGameLauncherSupported(val){\n this._bEnableLocalGameLauncher = val;\n }\n\n isLocalGameLauncherSupported(){\n return this._bEnableLocalGameLauncher;\n }\n\n}\nexport default GameLauncher;\n","/**\n * GEO const symbols.\n * @constant\n * @type {Object}\n */\n\n\nconst GEO = {\n CB_FN: 'cbfn',\n RES_DATA: 'geoResData',\n RES_CODE: 'geoResCode',\n RES_TYPE: 'geoResType',\n TIME_OUT: 'timeout',\n GEO_CB_RES: 'cbresfn',\n GEO_SESSION_ID: 'sessionid',\n CHANGE_TO: '\\'',\n CHANGE_FROM:'##abf#fcd##'\n};\n\n\nexport {GEO};","import BaseModel from '../../../../base/base_model';\nimport {GEO} from './geo_hybrid_consts';\n\nimport Strings from '../../../../utils/strings';\n\n\n\n/**\n *\n */\n\nclass GeoModel extends BaseModel {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'GeoModel';\n\n\n init(params) {\n super.init(params);\n }\n\n\n /**\n * @get the Function Name\n */\n getFuncName(data) {\n let fn = data[GEO.CB_FN];\n\n return (undefined !== fn) ? fn : '';\n }\n\n isValidData(data){\n try {\n let dt = JSON.stringify(data);\n return 'undefine' !== data && dt.length > 2;\n }\n catch (e) {\n return false;\n }\n }\n\n geoLocationRes(data) {\n let res = data[GEO.RES_DATA];\n let datatmp = decodeURIComponent(res);\n\n let string = new Strings(datatmp);\n\n if(string.isEmpty()){\n return '';\n }\n\n datatmp = string.stripslashes();\n string.setString(datatmp);\n datatmp = string.replaceAll(GEO.CHANGE_TO, GEO.CHANGE_FROM);\n let type = data[GEO.RES_TYPE];\n let code = data[GEO.RES_CODE] || 0;\n\n let AllData = JSON.stringify({'type': type, 'data': datatmp, 'code': code});\n\n return AllData;\n }\n\n}\n\nexport default GeoModel;","import BaseObject from '../../../../base/base_object';\nimport Model from './geo_hybrid_model';\nimport {SERIVCES_FUNC_LIST, FEATURE_CB_FUNC} from '../../native/native_const';\nimport Event from '../../../../utils/event';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\nimport {GEO} from './geo_hybrid_consts';\nimport Store from \"../../../../utils/store\";\nimport {\n GeoLocationReason\n} from \"../../../../../../app-react/services/geo-location/strategies/geo-location.strategy.interface\";\n\n\n/**\n *\n *\n */\nclass Geo extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'Geo';\n\n _model = null;\n _HybridService = null;\n _isFeatureEnable = false;\n _isPermissionPopupSupported = false;\n\n\n init(params) {\n\n super.init();\n\n this._model = Model.create(params);\n\n this._subscribe();\n }\n\n\n _subscribe() {\n Event.on(SYSTEM_EVENTS.GEO_HYBRID_UPDATE_ENABLE, this._updateEnable, this);\n Event.on(SYSTEM_EVENTS.GEO_HYBRID_GT_CB, this.onHybridDirectCall, this);\n }\n\n _updateEnable(val){\n\n if(null !== this._HybridService){\n\n this._isFeatureEnable = val;\n\n if(this._isFeatureEnable) {\n Event.on(SYSTEM_EVENTS.GEO_HYBRID_GET_LOCATION, this._onGetGeoLocation, this);\n this._HybridService.setCbFunction(SERIVCES_FUNC_LIST.GEO_SET_CB, FEATURE_CB_FUNC.HYBRID_GEO_CALL);\n }\n }\n }\n\n _onGetGeoLocation(data){\n\n let bValid = this._isFeatureEnable && this._model.isValidData(data);\n\n if(bValid) {\n const isPeriodic = GeoLocationReason.Periodic === data['reason'];\n data[GEO.GEO_CB_RES] = 'onGeoLocationRes';\n this._getGeoLocation(data, isPeriodic);\n }\n\n return bValid;\n }\n\n _getSessionId(geoparams){\n\n const isLogin = GeoLocationReason.Login === geoparams['reason'];\n\n if(isLogin){\n let oAuth2Service = this._HybridService.serviceFactory.oAuth2Service();\n if(oAuth2Service) {\n geoparams[GEO.GEO_SESSION_ID] = oAuth2Service.isAuthorized() ? oAuth2Service.getToken().sessionId : '';\n }\n }\n\n return geoparams;\n }\n\n _getGeoLocation(geoparams, isPeriodic){\n\n geoparams = this._getSessionId(geoparams);\n\n if(this._isPermissionPopupSupported){\n this._sendElasticEvent('getGeoLocation', 'new hybrid flow');\n this._getGeoLocationFromHybrid(geoparams, isPeriodic);\n }else{\n this._sendElasticEvent('getGeoLocation', 'old hybrid flow');\n this._HybridService.getGeoLocation(geoparams);//support old hybrids\n }\n }\n\n _getGeoLocationFromHybrid(geoparams, isPeriodic){\n\n this._showGeoOrbitMsg(isPeriodic).then( ()=> {\n this._sendElasticEvent('getGeoLocationFromHybrid', 'showGeoLocationPermissionPopUp');\n this._HybridService.showGeoLocationPermissionPopUp().then(data => {\n this._sendElasticEvent('getGeoLocationFromHybrid', 'getGeoLocation', JSON.stringify(geoparams));\n this._HybridService.getGeoLocation(geoparams);\n });\n });\n }\n\n\n onHybridDirectCall(data) {\n this._executeFunc(data);\n }\n\n _executeFunc(data) {\n let fn = this._model.getFuncName(data);\n\n if('function' === typeof this[fn]) {\n this[fn](data);\n }\n }\n\n onGeoLocationRes(data) {\n try{\n this._sendElasticEvent('onGeoLocationRes', 'geoResponse', JSON.stringify(data));\n }catch(e){\n this._sendElasticEvent('onGeoLocationRes', 'geoResponse','X');\n }\n\n let allData = this._model.geoLocationRes(data);\n Event.fire(SYSTEM_EVENTS.GEO_HYBRID_GET_LOCATION_RES, allData);\n }\n\n initFeatures(hybridSrv) {\n\n this._HybridService = hybridSrv;\n\n this._HybridService.isPermissionPopupSupported().then(data => {\n this._isPermissionPopupSupported = true;\n });\n\n return this;\n }\n\n _sendElasticEvent(action, label, value){\n const dataToSend = {\n CGPEventCategory: 'hybrid_geo_feature',\n CGPEventAction: action,\n CGPEventLabel: label,\n CGPEventValue: value\n };\n this._HybridService.serviceFactory.structuredLoggingService().getLogger(dataToSend).info();\n }\n\n\n _showGeoOrbitMsg(isPeriodic){\n return new Promise((resolve, reject) => {\n const GEO_PERMISSION = 'permisions-popup';\n if(isPeriodic || Store.get(GEO_PERMISSION)) {\n return resolve();\n }\n this._sendElasticEvent('onGeoLocation', 'show geo permission popup');\n\n return this._HybridService.serviceFactory.orbitComponentRenderService().showGeoPermissionPopup({\n onOkPressed: ()=> {\n Store.set(GEO_PERMISSION, true);\n return resolve();\n },\n onMessageClosed: ()=> {\n return resolve();\n }\n });\n });\n }\n}\n\nexport default Geo;\n","import BaseModel from '../../../../base/base_model';\nimport {KEY_NAME} from '../../native/native_const';\nimport Store from '../../../../utils/store';\nimport _ from '../../../../utils/underscore';\n\nclass HybridInfoModel extends BaseModel {\n\n static CLASS = 'HybridInfoModel';\n\n _debugMode = false;\n _autologinToken = null;\n _sessionTimerOffset = null;\n _reload = false;\n _url = '';\n _urlType = '';\n _ListInfo = [];\n\n\n /*\n * init the params to be an json object.\n * @params is string from web.config\n * @params is json object from html\n */\n init(params) {\n super.init(params);\n }\n\n updateData(data) {\n this._debugMode = KEY_NAME.DEBUG === data[KEY_NAME.ACTION];\n this._autologinToken = data[KEY_NAME.AUTOLOGIN];\n this._sessionTimerOffset = data[KEY_NAME.SESSIONTIMER];\n this._reload = data[KEY_NAME.RELOAD];\n this._url = data[KEY_NAME.URL];\n }\n\n getAutologinToken() {\n return this._autologinToken;\n }\n\n getSessionTimerOffset() {\n try {\n return parseInt(this._sessionTimerOffset);\n } catch(err) {\n return null;\n }\n }\n\n getUrl() {\n return this._url;\n }\n\n getReload() {\n return this._reload;\n }\n\n isDebugMode() {\n return this._debugMode;\n }\n\n checkData(data) {\n if (data[KEY_NAME.DATA] !== undefined) {\n return data;\n }\n\n data = _.safeJSONandDecode(data);\n return data[KEY_NAME.DATA];\n }\n\n updateAllInfo(data) {\n\n data = this.checkData(data);\n\n if (null === data) {\n return;\n }\n\n this._updateAllKeys(data);\n }\n\n _updateAllKeys(data) {\n Object.keys(data).forEach((key) => {\n this._addKeys(key,data[key])\n });\n\n this._addKeys('CurrentUrl',window.location.href.toLowerCase());\n }\n\n _addKeys(key,data){\n Store.set(key,data);\n this._addToList(key, data);\n }\n\n _addToList(key, val) {\n\n const obj = {key: key, val: val};\n const objIndex = this._ListInfo.findIndex((obj => obj.key === key));\n\n if(objIndex > -1){\n this._ListInfo[objIndex].val = val;//replace\n }else{\n this._ListInfo.push(obj);//add\n }\n }\n\n getVal(key, defaultVal) {\n return Store.get(key, defaultVal);\n }\n\n getInfo() {\n return this._ListInfo;\n }\n\n}\n\nexport default HybridInfoModel;\n","/**\n * INFO const symbols.\n * @constant\n * @type {Object}\n */\n\nconst INFO_ALL = 'all';\n\nconst INFO = {\n VER: 'hybridVer',\n URL_SCHEME: 'hybridUrlScheme',\n APP_NAME: 'hybridAppName',\n BUILD_TYPE: 'hybridBuildType',\n BUILD: 'hybridBuild',\n AppleID: 'AppleId',\n PUSH_PARAMS: 'hybridPushParams',\n WEB_URL: 'hybridWebUrl'\n};\n\n\nexport {INFO, INFO_ALL};","import BaseObject from '../../../../base/base_object';\nimport Model from './info_hybrid_model';\nimport {INFO, INFO_ALL} from './info_hybrid_consts';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\nimport Event from '../../../../utils/event';\nimport _ from '../../../../utils/underscore';\nimport Device from \"../../../../utils/device/device\";\n\nclass HybridInfo extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'HybridInfo';\n\n _model = null;\n _HybridService = null;\n\n init(params) {\n super.init();\n\n this._model = Model.create(params);\n\n this._subscribe();\n }\n\n _subscribe() {\n Event.on(SYSTEM_EVENTS.ON_INIT_COMPLETE, this._initInfo, this);\n Event.on(SYSTEM_EVENTS.HYBRID_UPDATE_INFO_KEY, this._updateKey, this);\n }\n\n _initInfo() {\n this.getAllInfo();\n }\n\n _updateKey(data){\n\n if(data) {\n this._model._addKeys(data.key, data.val);\n }\n }\n\n /**\n * @update the data from hybrid\n * @param data: example: {type: \"HybridInfoFeature\", action: \"debug\", url: \"https://mirage-cgp-client.888sport.com\", reload: \"true\"}\n */\n\n onHybridDirectCall(data) {\n this._model.updateData(data);\n this.setUrl();\n\n let autologinToken = this._model.getAutologinToken();\n\n if(autologinToken) {\n this._HybridService.runAutologin({userinfo: autologinToken, sessionTimer: this._model.getSessionTimerOffset()});\n }\n }\n\n /**\n * @set a new url in hybrid hybrid\n */\n\n setUrl() {\n let url = this._model.getUrl();\n let reload = this._model.getReload();\n if (undefined !== url && url.length > 0) {\n this._HybridService.setUrl(url, reload);\n }\n }\n\n /**\n * is debug mode ( for the info display )\n * @returns bool\n */\n isDebugMode() {\n return this._model.isDebugMode();\n }\n\n /**\n * get all the info from hybrid(version, name, bundleid... ( for the info display )\n */\n getAllInfo() {\n return this._HybridService.getInfo(INFO_ALL).then(data => {\n this._model.updateAllInfo(data);\n\n if(Device.hybrid.inCasino) {\n let ver = this.getFullVersion();\n Event.fire(SYSTEM_EVENTS.ADD_TAG_OPEN_APP_VER, ver);\n }\n });\n }\n\n initFeatures(hybridSrv) {\n\n this._HybridService = hybridSrv;\n\n return this;\n }\n\n getFullVersion(){\n return this.getVersion() + '-' + this.getBuild();\n }\n\n getBuild() {\n return this._model.getVal(INFO.BUILD, 0);\n }\n\n getAppleID() {\n return this._model.getVal(INFO.AppleID, '');\n }\n\n getVersion() {\n return this._model.getVal(INFO.VER, 0);\n }\n\n getUrlScheme() {\n return this._model.getVal(INFO.URL_SCHEME, '');\n }\n\n getInfo() {\n return this._model.getInfo();\n }\n\n /**\n * get Info For Display - (used in the menu)\n * @returns info in html format\n */\n getInfoForDisplay() {\n let val, key, html = '';\n let count = 0;\n this._model.getInfo().forEach(item => {\n\n count++;\n val = item.val;\n key = item.key;\n\n if ('SerialData' === key) {\n val = JSON.stringify(_.safeJSONandDecode(val));\n }\n\n html += count + '. ' + key + ': ' + val + '
';\n });\n\n return '
    ' + html + '
';\n }\n}\n\nexport default HybridInfo;\n","/**\n * Lexis Nexis const symbols.\n * @constant\n * @type {Object}\n */\n\n\nconst LEXIS_NEXIS_CONST = {\n PROFILING_SESSION_ID: 'profilingSessionId'\n};\n\n\nexport {LEXIS_NEXIS_CONST};","import BaseObject from '../../../../base/base_object';\nimport _ from \"../../../../utils/underscore\";\nimport Device from '../../../../utils/device/device';\nimport {LEXIS_NEXIS_CONST} from './lexis_nexis_hybrid_consts';\n\nimport {LEXIS_NEXIS, KEY_NAME} from '../../native/native_const';\n\n/**\n *\n *\n */\nclass LexisNexis extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'LexisNexis';\n _HybridService = null;\n _bEnable = false;\n _bLexisNexisSupport = false;\n _bIsDeviceSupportWithAnswer = false;\n _origid = '';\n _server = '';\n _timeout = 0;\n _profilingSessionId = '';\n _startTime = 0;\n\n init(params) {\n\n super.init();\n\n if(_.isNullOrUndefined(params)){\n return;\n }\n\n this._origid = params.origid;\n this._server = params.server;\n this._timeout = params.timeout;\n\n if (Device.hybrid.inCasino) {\n if (Device.os.isIOS) {\n params = params.ios;\n } else if (Device.os.isAndroid) {\n params = params.android;\n }\n }\n\n if(!_.isNullOrUndefined(params) && params.enable){\n this._bEnable = true;\n }\n }\n\n initFeatures(hybridSrv) {\n\n this._HybridService = hybridSrv;\n\n if(this._bEnable){\n this._HybridService.IsLexisNexisSupported().then(() => {\n this._bLexisNexisSupport = true;\n this.getLexisNexisInfo({}, true);\n });\n }\n\n return this;\n }\n\n\n getLexisNexisInfo(marketingData, bWaitToResponse) {\n if (this._isDeviceNotSupport()) {\n return new Promise((resolve) => {\n resolve(marketingData);\n });\n }\n\n if (!bWaitToResponse) {\n return this.getProfilingSessionId(marketingData);\n }\n\n return this._getLexisNexisInfoFromDevics(marketingData);\n }\n\n _isDeviceNotSupport() {\n return !Device.hybrid.inCasino || !this._bEnable || !this._bLexisNexisSupport;\n }\n\n getProfilingSessionId(marketingData){\n return new Promise((resolve) => {\n marketingData = this._mergeMarketingData(marketingData);\n this._sendElasticEvent(LEXIS_NEXIS.SESSION_ID_CALL, 'session id call', this._profilingSessionId);\n resolve(marketingData);\n });\n }\n\n _getLexisNexisInfoFromDevics(marketingData){\n\n return new Promise((resolve) => {\n this._startTime = Date.now();\n\n this._sendElasticEvent(LEXIS_NEXIS.SESSION_ID_REQUEST_SENT, '', 0);\n\n let data = {[KEY_NAME.LN_ORG_ID]: this._origid, [KEY_NAME.LN_SERVER]: this._server, [KEY_NAME.TIME_OUT]: this._timeout};\n return this._HybridService.getLexisNexisInfo(data).then(data => {\n\n let end = Date.now();\n let timeinseconds = (end - this._startTime)/1000;\n\n\n this._bIsDeviceSupportWithAnswer = true;\n let action = LEXIS_NEXIS.SESSION_ID_LOAD_OK;\n let label = 'session id load ok';\n let value = '';\n try {\n let json = _.safeJSONandDecode(data);\n\n let error = json[KEY_NAME.ERROR];\n if (error !== 0) {\n resolve(marketingData);\n return;\n }\n let datainfo = json[KEY_NAME.DATA];\n this._profilingSessionId = datainfo[KEY_NAME.LN_SESSION_ID];\n value = this._profilingSessionId;\n\n if(datainfo[KEY_NAME.CLOSE_BY_TIME_OUT]){\n\n action = LEXIS_NEXIS.SESSION_ID_CLOSE_BY_TIME_OUT;\n label = 'close by timeout';\n }\n }\n catch (e) {\n action = LEXIS_NEXIS.SESSION_ID_LOAD_ERROR;\n label = 'Error in parsing';\n value = value + ' ' + e;\n }\n\n label = label + ' ' + value;\n value = timeinseconds;\n\n this._sendElasticEvent(action, label, value);\n\n marketingData = this._mergeMarketingData(marketingData);\n\n resolve(marketingData);\n });\n });\n\n }\n\n _mergeMarketingData(marketingData) {\n let output = Object.assign({}, marketingData, {[LEXIS_NEXIS_CONST.PROFILING_SESSION_ID]: this._profilingSessionId});\n return output;\n }\n\n _sendElasticEvent(action, label, value){\n const dataToSend = {\n CGPEventCategory: LEXIS_NEXIS.LEXIS_NEXIS_CATEGORY,\n CGPEventAction: action,\n CGPEventLabel: label,\n CGPEventValue: value\n };\n\n this._HybridService.serviceFactory.structuredLoggingService().getLogger(dataToSend).info();\n }\n}\n\n\nexport default LexisNexis;\n","import _ from \"../../../../utils/underscore\";\nimport Device from '../../../../utils/device/device';\nimport {FEATURE_CB_FUNC, KEY_NAME, SERIVCES_FUNC_LIST} from \"../../native/native_const\";\nimport Event from \"../../../../utils/event\";\nimport {SYSTEM_EVENTS, USER_EVENTS} from \"../../../../events/events\";\nimport DOM from \"../../../../utils/dom\";\nimport BaseObject from \"../../../../base/base_object\";\n\n\n\n\nconst GAME_SUPPORTED_NYX = 'NYX';\nconst TIME_OUT_GAME_LOAD = 30;\nconst CB_FN = 'cbfn';\n\n/**\n *\n *\n */\nclass LobbyPopUp extends BaseObject{\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'LobbyPopUp';\n _HybridService = null;\n _bEnable = false;\n _nPreviosHeight = 0;\n _bLobbyPopUpSupport = false;\n _popUpTimeOut = null;\n _dataObjSrc = null;\n _onResizeEvent = null;\n\n _nCountInterval = 0;\n _resizeInterval = null;\n _left = -1;\n _right = -1;\n _top = -1;\n _bottom = -1;\n _timeout=0;\n\n\n init(params) {\n\n super.init();\n\n\n if(_.isNullOrUndefined(params)){\n return;\n }\n\n if (Device.hybrid.isEmbedded) {\n params = params.ios;\n }\n\n if(!_.isNullOrUndefined(params) && params.enable){\n\n this._bEnable = true;\n }\n }\n\n initFeatures(hybridSrv) {\n\n this._HybridService = hybridSrv;\n\n if(this._bEnable){\n this._HybridService.isPopUpAboveSecounpSupported().then(data => {\n this._bLobbyPopUpSupport = true;\n this._HybridService.setCbFunction(SERIVCES_FUNC_LIST.LOBBY_POPUP_SET_CB, FEATURE_CB_FUNC.HYBRID_LOBBY_POP_UP_CALL);\n });\n }\n\n this._subscribe();\n\n return this;\n }\n\n _subscribe() {\n Event.on(SYSTEM_EVENTS.SHOW_POPUP_ABOVE_HYBRID_SECOND_WEB_VIEW, this._onShow, this);\n Event.on(SYSTEM_EVENTS.CLOSE_POPUP_ABOVE_HYBRID_SECOND_WEB_VIEW, this._onClose, this);\n }\n\n\n onHybridDirectCall(data) {\n this._executeFunc(data);\n }\n\n _executeFunc(data) {\n let fn = this.getFuncName(data);\n\n if('function' === typeof this[fn]) {\n this[fn](data);\n }\n }\n\n getFuncName(data) {\n let fn = data[CB_FN];\n\n return (undefined !== fn) ? fn : '';\n }\n\n _getContent(){\n if(null !== this._dataObjSrc) {\n this._onShow(this._dataObjSrc);\n }\n }\n\n _getParams(dataObj) {\n\n if (_.isNullOrUndefined(dataObj) || _.isNullOrUndefined(dataObj.content)) {\n return null;\n }\n\n let rect = null;\n let msgObj = null;\n let content = document.querySelector(dataObj.content);\n\n if (content) {\n rect = content.getBoundingClientRect();\n if (rect) {\n msgObj = {\n height: window.outerHeight,\n width: window.outerWidth,\n rectwidth: rect.width,\n rectheight: rect.height,\n left: rect.x,\n right: window.outerWidth - rect.width - rect.x,\n top: rect.y,\n bottom: window.outerHeight - rect.height - rect.y,\n timeout: 0,\n showHybridPopUp: dataObj.showHybridPopUp,\n isFirstShow: dataObj.isFirstShow\n };\n }\n }\n return msgObj;\n }\n\n _onShow(dataObj) {\n\n const msgObj = this._getParams(dataObj);\n\n this._timeout = 300;\n if(msgObj.isFirstShow) {\n this._timeout = dataObj.timeout * 1;\n }\n\n this.clearTimeOut();\n\n this._popUpTimeOut = DOM.setTimeout(() => {\n this._onShowTimeOut(dataObj);\n }, this._timeout);\n\n }\n\n async _onShowTimeOut(dataObj) {\n\n const msgObj = this._getParams(dataObj);\n\n if(!await this.isGameOpenAndSupportLobbyPopUp(msgObj)){\n if(true === msgObj.isFirstShow){\n Event.fire(SYSTEM_EVENTS.SECOND_WEB_VIEW_CLOSE_ALL);\n return;\n }\n }\n\n if(msgObj.isFirstShow) {\n this._dataObjSrc = dataObj;\n this._onResizeEvent = DOM.addEventListener(window, USER_EVENTS.ON_RESIZE, this._onResize.bind(this), false);\n }\n\n //the popup size is not correct yet\n if(msgObj.rectwidth > msgObj.width || msgObj.rectheight > msgObj.height) {\n return;\n }\n\n this._nPreviosHeight = msgObj.height;\n\n this._left = msgObj.left;\n this._right = msgObj.right;\n this._top = msgObj.top;\n this._bottom = msgObj.bottom;\n\n\n let data = {[KEY_NAME.LEFT]: msgObj.left, [KEY_NAME.RIGHT]: msgObj.right, [KEY_NAME.TOP]: msgObj.top,[KEY_NAME.BOTTOM]: msgObj.bottom,\n [KEY_NAME.SHOW]: msgObj.isFirstShow.toString() , [KEY_NAME.TIME_OUT]: msgObj.timeout, [KEY_NAME.TIME_OUT_BEFORE_DISPLAY]:TIME_OUT_GAME_LOAD};\n\n this._HybridService.popUpAboveSecoundShow(data);\n\n }\n\n _isValid(newParam, oldParam, val){\n\n return val && (newParam !== oldParam) && oldParam > 0;\n }\n\n _isPopUpReady(){\n const msgObj = this._getParams(this._dataObjSrc);\n\n let bValid = this._isValid(this._top, msgObj.top, true);\n bValid = this._isValid(this._left, msgObj.left, bValid);\n bValid = this._isValid(this._right, msgObj.right, bValid);\n bValid = this._isValid(this._bottom, msgObj.bottom, bValid);\n\n return bValid;\n }\n\n _onResize(){\n this._dataObjSrc.isFirstShow = false;\n\n let self = this;\n this._nCountInterval = 0;\n\n DOM.setTimeout(() => {\n self._resizeInterval = setInterval(function(){\n let bClearInterval = 10 < ++self._nCountInterval;//wait maximum 1 sec\n let bCheckReady = self._isPopUpReady();\n if(bCheckReady){\n self._onShow(self._dataObjSrc);\n bClearInterval = true;\n }\n\n if(bClearInterval && null !== self._resizeInterval) {\n clearInterval(self._resizeInterval);\n self._resizeInterval = null;\n }\n }, 100);\n }, 300);\n\n }\n\n async isGameOpenAndSupportLobbyPopUp(msgObj){\n\n const gameSupported = GAME_SUPPORTED_NYX === (await this._HybridService.serviceFactory.gameService().getCurrentRunningGamecompanyName())?.toUpperCase();\n\n if (!msgObj || !this._bLobbyPopUpSupport || !msgObj.showHybridPopUp || !gameSupported) {\n return false;\n }\n\n return true;\n }\n\n _onClose(){\n\n this._nPreviosHeight = 0;\n this._HybridService.popUpAboveSecoundClose();\n this._onResizeEvent && this._onResizeEvent.remove();\n this._dataObjSrc = null;\n clearInterval(this._resizeInterval);\n this._resizeInterval = null;\n\n }\n\n clearTimeOut() {\n if (this._popUpTimeOut) {\n DOM.clearTimeout(this._popUpTimeOut);\n this._popUpTimeOut = null;\n }\n }\n\n}\n\n//TEST_ORBIT_POPUP\n\nexport default LobbyPopUp;\n","import BaseObject from '../../../../base/base_object';\nimport {KEY_NAME} from \"../../native/native_const\";\nimport _ from \"../../../../utils/underscore\";\nimport Event from \"../../../../utils/event\";\nimport {SYSTEM_EVENTS} from \"../../../../events/events\";\nimport {TokenType} from \"../../../../../../common/const/token_type\";\n\n\nconst BUSINESS_COR_ID = 'af_sub5';\n\n\nclass HybridMigration extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'HybridMigration';\n\n _HybridService = null;\n _migrationToken='';\n _businessCorrId='';\n _bRunAutoLoginOnlyOnce=false;\n\n init(params) {\n super.init();\n }\n\n\n initFeatures(hybridSrv) {\n\n this._HybridService = hybridSrv;\n\n this._getHybridToken();\n\n this._subscribe();\n }\n\n _subscribe() {\n Event.on(SYSTEM_EVENTS.APPS_FLAYER_READY, this._onAppsFlayerReady, this);\n Event.on(SYSTEM_EVENTS.DEEP_LINK_READY, this._onDeepLinkReady, this);\n }\n\n\n _onAppsFlayerReady(dataObj){\n\n this._businessCorrId = dataObj[BUSINESS_COR_ID];\n this._runAutoLoginWhenDataIsReady(true);\n }\n\n _onDeepLinkReady(dataObj){\n\n let obj = new URLSearchParams(dataObj[KEY_NAME.DATA]);\n this._businessCorrId = obj.get(BUSINESS_COR_ID);\n this._runAutoLoginWhenDataIsReady(false);\n this._getHybridToken();\n }\n\n\n _getHybridToken() {\n const dt = {[KEY_NAME.DELETE]: 'true'};\n this._HybridService.getMigrationToken(dt).then(data => {\n this._migrationToken = this._extractToken(data);\n this._runAutoLoginWhenDataIsReady(false);\n });\n }\n\n _extractToken(data){\n const json = _.safeJSONandDecode(data);\n const datatoken = json[KEY_NAME.DATA];\n return datatoken[KEY_NAME.TOKEN];\n }\n\n _runAutoLoginWhenDataIsReady(bIgnoreBusinessCorrId){\n\n if (!this._bRunAutoLoginOnlyOnce && this._migrationToken && this._migrationToken.toString().length > 0 && (bIgnoreBusinessCorrId || !_.isEmpty(this._businessCorrId))) {\n this._bRunAutoLoginOnlyOnce = true;\n\n if(_.isEmpty(this._businessCorrId) || !_.isGuid(this._businessCorrId)){\n this._businessCorrId = _.getGuid();\n }\n\n this._HybridService.serviceFactory.oAuth2Service().runAutoLogin(this._migrationToken, null, null, null, null, null, TokenType.MigrationToken, this._businessCorrId);\n\n this._HybridService.serviceFactory.playerMigrationProxyService().sendClientVisitAnalytics({\n businessCorrelationId: this._businessCorrId,\n migrationToken: this._migrationToken\n });\n }\n }\n}\n\nexport default HybridMigration;\n","/**\n * NATIVE_LOGS const symbols.\n * @constant\n * @type {Object}\n */\n\n\nconst NATIVE_LOGS = {\n CB_FN: 'cbfn',\n\n L_NON: 0,\n L_INFO: 3,\n L_ERROR: 5,\n INFO: 'Info',\n ERROR: 'Error'\n\n};\n\n\nexport {NATIVE_LOGS};","import BaseObject from '../../../../base/base_object';\nimport _ from \"../../../../utils/underscore\";\nimport Device from \"../../../../utils/device/device\";\nimport {FEATURE_CB_FUNC, KEY_NAME, SERIVCES_FUNC_LIST} from \"../../native/native_const\";\nimport {NATIVE_LOGS} from \"../native_logs/native_logs_hybrid_consts\";\n\n\n\n\n/**\n *\n *\n */\nclass NativeLogs extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'NativeLogs';\n _HybridService = null;\n _logLevel = NATIVE_LOGS.L_NON;\n\n\n\n init(params) {\n\n super.init();\n\n if(_.isNullOrUndefined(params)){\n return;\n }\n if (Device.hybrid.isHybrid) {\n\n this.updateLogLevel(params.loglevel);\n\n if (Device.os.isIOS) {\n params = params.ios;\n } else if (Device.os.isAndroid) {\n params = params.android;\n }\n }\n\n if(!_.isNullOrUndefined(params) && params.enable){\n this._bEnable = true;\n }\n }\n\n\n updateLogLevel(loglevel){\n\n const logArr = {[NATIVE_LOGS.INFO] : NATIVE_LOGS.L_INFO, [NATIVE_LOGS.ERROR] : NATIVE_LOGS.L_ERROR};\n\n this._logLevel = logArr[loglevel];\n }\n\n\n initFeatures(hybridSrv) {\n\n this._HybridService = hybridSrv;\n\n if(this._bEnable) {\n hybridSrv.setCbFunction(SERIVCES_FUNC_LIST.NATIVE_LOGS_SET_CB, FEATURE_CB_FUNC.HYBRID_NATIVE_LOGS);\n }\n return this;\n }\n\n\n onHybridDirectCall(data) {\n this._executeFunc(data);\n }\n\n _executeFunc(data) {\n let fn = this.getFuncName(data);\n\n if('function' === typeof this[fn]) {\n this[fn](data);\n }\n }\n\n getFuncName(data) {\n let fn = data[NATIVE_LOGS.CB_FN];\n\n return (undefined !== fn) ? fn : '';\n }\n\n writeToLog(data){\n\n const category = data[KEY_NAME.LOG_CATEGORY];\n const action = data[KEY_NAME.LOG_ACTION];\n const label = data[KEY_NAME.LOG_LABLE];\n const value = data[KEY_NAME.LOG_VALUE];\n const logLevel = data[KEY_NAME.LOG_LEVEL];\n\n\n if(logLevel >= this._logLevel) {\n\n const isError = NATIVE_LOGS.L_ERROR === parseInt(logLevel);\n this._sendElasticEvent(category, action, label, value, isError);\n }\n }\n\n _sendElasticEvent(category, action, label, value, isError){\n\n const dataToSend = {\n CGPEventCategory: category,\n CGPEventAction: action,\n CGPEventLabel: label,\n CGPEventValue: value\n };\n\n if(isError) {\n this._HybridService.serviceFactory.structuredLoggingService().getLogger(dataToSend).error();\n }else{\n this._HybridService.serviceFactory.structuredLoggingService().getLogger(dataToSend).info();\n }\n }\n}\n\nexport default NativeLogs;\n","/**\n * OnDemand const symbols.\n * @constant\n * @type {Object}\n */\n\n\nconst ON_DEMAND = {\n CB_FN: 'cbfn',\n STATUS_BAR_DATA: 'statusBarData',\n ODR_GAMES: 'ODR_Games'\n};\n\n\nexport {ON_DEMAND};","import BaseModel from '../../../../base/base_model';\nimport _ from '../../../../utils/underscore';\nimport Device from '../../../../utils/device/device';\nimport {ON_DEMAND} from './on_demand_hybrid_consts';\nimport Store from '../../../../utils/store';\nimport {KEY_NAME, ODR_SHARED_GAMES} from \"../../native/native_const\";\n\n\n\nclass OnDemandModel extends BaseModel {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'OnDemandModel';\n\n _nTimeOut = 0;\n _bEnableChillRemoteLoading = false;\n\n init(params) {\n\n if (_.isNullOrUndefined(params)) {\n return;\n }\n\n if(!_.isNullOrUndefined(params.enableChillRemoteLoading)) {\n this._bEnableChillRemoteLoading = params.enableChillRemoteLoading;\n }\n\n if (Device.hybrid.isHybrid) {\n if (Device.os.isIOS) {\n params = params.ios;\n } else if (Device.os.isAndroid) {\n params = params.android;\n }\n }\n\n if (!_.isNullOrUndefined(params) && !_.isNullOrUndefined(params.timeout)) {\n this._nTimeOut = params.timeout;\n }\n }\n\n /**\n * @get the Function Name\n */\n getFuncName(data) {\n let fn = data[ON_DEMAND.CB_FN];\n\n return undefined !== fn ? fn : '';\n }\n\n isEnableChillRemoteLoading() {\n return this._bEnableChillRemoteLoading;\n }\n\n getTimeOut() {\n return this._nTimeOut;\n }\n\n\n _gatValToStore(gameType, sharedFolder){\n\n let val = gameType.toString();\n\n if(ODR_SHARED_GAMES.RED_TIGER === sharedFolder){\n val = ODR_SHARED_GAMES.RED_TIGER;\n } else if(ODR_SHARED_GAMES.PRAGMATIC_PLAY === sharedFolder){\n val = ODR_SHARED_GAMES.PRAGMATIC_PLAY;\n } else if(ODR_SHARED_GAMES.PLAY_N_GO === sharedFolder){\n val = ODR_SHARED_GAMES.PLAY_N_GO;\n }else if(ODR_SHARED_GAMES.BLUEPRINT === sharedFolder){\n val = ODR_SHARED_GAMES.BLUEPRINT;\n }\n\n return val + ',';\n }\n saveOnDemandLoadedGame(gameType, sharedFolder) {\n\n const val = this._gatValToStore(gameType, sharedFolder);\n\n let allvals = Store.get(ON_DEMAND.ODR_GAMES,'');\n\n if(!allvals.includes(val)) {\n allvals+=val;\n Store.set(ON_DEMAND.ODR_GAMES,allvals);\n }\n }\n\n getAllOnDemandGames(){\n return Store.get(ON_DEMAND.ODR_GAMES,'');\n }\n\n resetAllOnDemandGames(){\n Store.set(ON_DEMAND.ODR_GAMES,'');\n }\n\n isOnDemandLoadedGame(gameType) {\n return true;\n }\n\n deleteGameFolders(data){\n let games = _.safeJSONandDecode(data);\n\n if(_.isEmpty(games.data)){\n return;\n }\n\n const gameArr = games.data[KEY_NAME.ODR_DEL_GAMES].split(',');\n\n if(_.isEmpty(gameArr)){\n return;\n }\n\n let allGames = this.getAllOnDemandGames();\n\n for (let i=0; i < gameArr.length; i++) {\n if(gameArr[i].length > 0) {\n allGames = allGames.replace(gameArr[i] + ',','');\n }\n }\n\n Store.set(ON_DEMAND.ODR_GAMES,allGames);\n\n return allGames;\n }\n}\n\nexport default OnDemandModel;","import BaseObject from '../../../../base/base_object';\nimport Model from './on_demand_hybrid_model';\nimport {FEATURE_CB_FUNC, SERIVCES_FUNC_LIST, KEY_NAME, ON_DEMAND} from '../../native/native_const';\nimport Event from '../../../../utils/event';\nimport Device from '../../../../utils/device/device';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\nimport _ from \"../../../../utils/underscore\";\nimport DOM from \"../../../../utils/dom\";\n\n\n\nclass OnDemand extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'OnDemand';\n\n _HybridService = null;\n _isOdrRealProgress = true;\n _nTimeOut = 0;\n\n\n init(params) {\n\n this._model = Model.create(params);\n\n this._nTimeOut = this.getTimeOut();\n\n super.init(params);\n }\n\n initFeatures(hybridSrv) {\n this._HybridService = hybridSrv;\n\n if (Device.hybrid.isEmbedded) {\n this._HybridService.setCbFunction(SERIVCES_FUNC_LIST.ON_DEMAND_SET_CB, FEATURE_CB_FUNC.HYBRID_ON_DEMAND_CALL);\n\n Event.on(SYSTEM_EVENTS.ODR_CLEAR_ALL_GAMES, () => {\n this.deleteAllOnDemandGames();\n });\n }\n\n return this;\n }\n\n inidFeature(){\n if (Device.hybrid.isEmbedded) {\n this.loadRemoteChill();\n }\n }\n\n loadRemoteChill() {\n\n if(!this._model.isEnableChillRemoteLoading()){\n return;\n }\n\n let gameOptions = {gameType:130043};\n\n this._HybridService.serviceFactory.gameService().readAnonymousGameConfiguration(gameOptions)\n .then(data => {\n let url = '';\n let ver = '';\n\n try{\n url = this._getChillUrl(data.grsData.chillUrl);\n ver = data.grsData.chillUrl;\n\n } catch (err) {\n this._sendElasticEvent(ON_DEMAND.CHILL_LOADING_ERROR, 'Error in LoadChill', err);\n this._logError(err);\n return;\n }\n\n this._sendElasticEvent(ON_DEMAND.CHILL_LOADING, 'onLoadChill', url);\n this._HybridService.loadRemoteChill(url, ver);\n });\n }\n\n _logError(err){\n this._HybridService.logger.error('CHILL_LOADING_ERROR: ' + err);\n }\n\n _getChillUrl(grschillUrl){\n let url = grschillUrl.includes('http') ? grschillUrl : 'https://' + grschillUrl;\n return url + 'hybrid_chill/chill.zip';\n }\n\n\n getTimeOut() {\n return this._model.getTimeOut();\n }\n\n onHybridDirectCall(data) {\n this._executeFunc(data);\n }\n\n _executeFunc(data) {\n const fn = this._model.getFuncName(data);\n\n if ('function' === typeof this[fn]) {\n this[fn](data);\n }\n }\n\n\n setStartOndemand(b) {\n this._isOdrRealProgress = b;\n }\n\n onLoadError(data) {\n let error = data[KEY_NAME.DATA];\n this._sendElasticEvent(ON_DEMAND.GAME_LOADING_ERROR, 'Error in onLoadError', error);\n }\n\n onLowDiskSpacError(data) {\n let error = data[KEY_NAME.DATA];\n this._sendElasticEvent(ON_DEMAND.GAME_LOADING_ERROR, 'Error in LowDiskSpac', error);\n //this._HybridService.closeByLowDiskSpace();\n }\n\n onUpdateProgresBar(data) {\n try{\n if(data[KEY_NAME.RESOURCE_NAME]){\n this.updateProgressBarV2(data)\n }else{\n //to support old version that send only fake progress\n this.updateProgressBarV1(data)\n }\n\n }catch (e){\n this._sendElasticEvent(ON_DEMAND.GAME_LOADING_ERROR, 'Error in onUpdateProgresBar');\n this.logger.error('Error in onUpdateProgresBar, error msg: ', e)\n }\n }\n\n updateProgressBarV1(data){\n let statusBar = data[KEY_NAME.DATA];\n Event.fire(SYSTEM_EVENTS.LOADING_INDICATOR_EMBEDDED_UPDATE, statusBar);\n }\n\n updateProgressBarV2(data) {\n const progressbarfake = data[KEY_NAME.PROGRESS_BAR_FAKE];\n const progressbarreal = data[KEY_NAME.PROGRESS_BAR_REAL];\n const resourcename = data[KEY_NAME.RESOURCE_NAME];\n const resourcexofmeny = data[KEY_NAME.X_OF_MENY];\n const gameType = data[KEY_NAME.GAME_ID];\n const sharedolder = data[KEY_NAME.SHARED_FOLDER];\n\n Event.fire(SYSTEM_EVENTS.LOADING_INDICATOR_EMBEDDED_UPDATE_V2, {\n statusBar: progressbarreal,\n numberOfPackages: resourcexofmeny\n });\n\n //TODO not sure we want to keep this log in the long term, for now we need in order to analyse CIP8 Apple rejection\n if(progressbarreal % 10 === 0){\n this._sendElasticEvent(ON_DEMAND.GAME_LOADING_REAL_ODR_STARTED, gameType + '_' + resourcexofmeny + '_' + resourcename + '_' + sharedolder + '_' + progressbarfake, progressbarreal);\n }\n }\n\n /**\n * save the game in cookie\n */\n saveOnDemandLoadedGame(gameType, sharedFolder) {\n this._model.saveOnDemandLoadedGame(gameType, sharedFolder);\n }\n\n /**\n * ask if already the game loaded\n */\n isOnDemandLoadedGame(gameType) {\n return this._model.isOnDemandLoadedGame(gameType);\n }\n\n _sendElasticEvent(action, label, value){\n\n const dataToSend = {\n CGPEventCategory: ON_DEMAND.ON_DEMAND_CATEGORY,\n CGPEventAction: action,\n CGPEventLabel: label,\n CGPEventValue: value\n };\n\n this._HybridService.serviceFactory.structuredLoggingService().getLogger(dataToSend).info();\n }\n\n closeGame(){\n DOM.setTimeout(() => {\n this.deleteAllOnDemandGames();\n }, 1000);\n }\n\n deleteAllOnDemandGames(){\n const games = this._model.getAllOnDemandGames();\n\n this._deleteGameFolder(games);\n }\n\n _deleteGameFolder(games) {\n if(games.length > 0) {\n this._HybridService.deleteGameFolder(games).then(data => {\n const remianGames = this._model.deleteGameFolders(data);\n let res = !_.isEmpty(remianGames) ? 'ODR_ERR ' + remianGames : '';\n this._sendElasticEvent(ON_DEMAND.ON_DEMAND_DELETE_GAMES, 'oldGames: ' + games + ' remianGames: ' + res,0);\n });\n }\n }\n}\nexport default OnDemand;\n","import BaseObject from '../../../../base/base_object';\nimport {FEATURE_CB_FUNC, KEY_NAME, SERIVCES_FUNC_LIST} from '../../native/native_const';\nimport Device from '../../../../utils/device/device';\nimport {ON_DEMAND} from \"./on_demand_hybrid_consts\";\nimport ServiceFactory from \"../../../service_factory\";\nimport {SYSTEM_EVENTS} from \"../../../../events/events\";\nimport Event from \"../../../../utils/event\";\nimport _ from \"../../../../utils/underscore\";\nimport DOM from \"../../../../utils/dom\";\nimport {BRANDS} from \"../../../regulation/regulation_const\";\nimport {NYX_COMPANY_NAME} from \"../../../game/companies_names_consts\";\nimport Store from \"../../../../utils/store\";\n\n\nclass OnDemandNyx extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'OnDemandNyx';\n static NYX_TYPE = 'NYX';\n static NYX_ALL_GAME_IDS = 'nyxallgameids';\n\n _HybridService = null;\n _bUpdateHeaderHeight = false;\n _onDemandGameIsRunning = false;\n _isIframeSupport = false;\n _iframeEnable = false;\n _gameIndicatorInterval = null;\n _gameIndicatorCounter = 0;\n _gameIndicatorTimout = 0;\n _bIsFakegameIndicator = true;\n\n init(params) {\n\n super.init();\n if (_.isNullOrUndefined(params)) {\n return;\n }\n if (Device.os.isIOS) {\n params = params.ios;\n if (_.isNullOrUndefined(params)) {\n return;\n }\n\n if (!_.isNullOrUndefined(params.iframeEnable)) {\n this._iframeEnable = params.iframeEnable.enable;\n }\n\n if (!_.isNullOrUndefined(params.headerShift)) {\n this._bUpdateHeaderHeight = params.headerShift.enable;\n }\n\n this._gameIndicatorTimout = params.gameIndicatorTimout;\n\n if(this._gameIndicatorTimout < 0){\n this._gameIndicatorTimout = 0;\n }\n }\n }\n\n initFeatures(hybridSrv) {\n this._HybridService = hybridSrv;\n\n if (Device.hybrid.isEmbedded) {\n this._HybridService.setCbFunction(SERIVCES_FUNC_LIST.ON_DEMAND_NYX_SET_CB, FEATURE_CB_FUNC.HYBRID_ON_DEMAND_NYX_CALL);\n\n if(this._iframeEnable) {\n this._HybridService.checkNyxIframeSupport().then(data => {\n data = _.safeJSONandDecode(data);\n let dt = data[KEY_NAME.DATA];\n this._isIframeSupport = 'true' === dt[KEY_NAME.VAL];\n });\n }\n }\n return this;\n }\n\n canHandle(companyName) {\n return companyName?.toUpperCase() === NYX_COMPANY_NAME;\n }\n\n _getNyxLocalHostUrl(url){\n\n let dataToSent = {// example of the parames\n [KEY_NAME.URL] : url,\n 'domain' : 'ogs-gl-stage.nyxgib.eu',\n 'operatorId' : '1387',\n 'accountId' : '702740118',\n 'gameId' : '70206',\n 'sessionId' : 'MGMxNWQ0ZDMtOWU2Mi00NzhkLWIzZTYtODFmYTIzYjU2OWUy',\n 'mode' : 'real',\n 'language' : 'en_US',\n 'currency' : 'USD',\n 'device' : 'mobile',\n 'jurisdiction' : '',\n 'timeElapsedUK' : '0',\n 'timeLimitUK' : '0',\n 'timeElapsedMalta' : '0',\n 'timeLimitMalta' : '0',\n 'lobbyUrl' : 'http://www.888casino.com/lobbyUrl',\n 'historyUrl' : ' http://www.888casino.com/historyurl',\n 'selfAssessmentURL' : '',\n 'depositLimitURL' : '',\n 'selfExclusionURL' : '',\n 'timeElapsed' : '0'\n };\n\n return this._HybridService.getNyxLocalHostUrl(dataToSent,'12345678').then(urlLocalHost => {\n\n //urlLocalHost example\n //http://localhost:17171/games/100/html5/gcmwrapper.html?clock=true¤cy=USD&depositurl=&device=mobile&elapsedtime=0&envid=local&gameid=bonanza&gpid=100&jurisdiction=&lang=en_us&lobbyurl=http://www.888casino.com/lobbyUrl&mode=demo&nyxroot=ogs-gdm-stage.nyxgib.eu/nextgen/&ogsenv=gibraltarstage&ogsgameid=70206&operatorid=1387&realitycheck__timestamp=1675761459&secure=true&sessionid=Free:whigcl7ppb6lrvlu459j3tl1dsr&stage=1&type=nextgen\n\n window.location.href = urlLocalHost;\n // this._HybridService.alert(urlLocalHost);\n });\n }\n\n updatOnDemandGameIsRunning(data) {\n\n this._onDemandGameIsRunning = true;\n\n if (this._bIsFakegameIndicator) {\n this.gameStartFakeIndicator(data);\n }\n }\n\n _storeifNotExistGameId(gameId) {\n\n let allGameIds = Store.get(OnDemandNyx.NYX_ALL_GAME_IDS, '');\n\n if(allGameIds.includes(gameId + ',')){\n return false;\n }\n\n allGameIds+= gameId + ',';\n\n Store.set(OnDemandNyx.NYX_ALL_GAME_IDS, allGameIds);\n\n return true;\n }\n\n gameStartFakeIndicator(data){\n\n if(!this._gameIndicatorTimout){//future hybrid version will send the real values\n return;\n }\n\n if(!this._storeifNotExistGameId(data.gameId)){\n return;\n }\n\n let self = this;\n this._gameIndicatorCounter = 0;\n\n const timeout = this._gameIndicatorTimout*10;\n\n self._gameIndicatorInterval = setInterval(function(){\n self._simulateGameLoadingIndicator();\n if(self._gameIndicatorCounter > 100){\n clearInterval(self._gameIndicatorInterval);\n }\n }, timeout);\n }\n\n stopgameIndicator(){\n clearInterval(this._gameIndicatorInterval);\n this._gameIndicatorInterval = 0;\n this._simulateGameLoadingIndicator();\n }\n\n _simulateGameLoadingIndicator(){\n Event.fire(SYSTEM_EVENTS.LOADING_INDICATOR_EMBEDDED_UPDATE_V2, {\n statusBar: this._gameIndicatorCounter.toString(),\n numberOfPackages: '1/1'\n });\n\n this._gameIndicatorCounter++;\n }\n\n navigate(companyName, url, gameType) {\n\n if (this.canHandle(companyName)) {\n\n\n\n Event.on(SYSTEM_EVENTS.SCREEN_RESIZE_CHANGED, this._onResize, this);\n Event.on(SYSTEM_EVENTS.SECOND_WEB_VIEW_CLOSE_ALL, this._onCloseAllWebViews, this);\n Event.on(SYSTEM_EVENTS.SECOND_WEB_VIEW_CLOSE_NYX, this._onCloseNyx, this);\n\n Event.once(SYSTEM_EVENTS.GAME_SEQUENCE_FINISH, (status) => {\n this._onGameSequenceFinish(status)\n }, this);\n\n this._HybridService.navigateForOnDemandNyx(url, gameType);\n this._updateHeaderheight();\n this._onDemandGameIsRunning = true;\n return true;\n }\n\n return false;\n }\n\n isIframeSupported(){\n return this._isIframeSupport;\n }\n\n _getHeaderClassName() {\n const brandID = this._HybridService.serviceFactory.skinService().getBrandID();\n\n if(this._HybridService.serviceFactory.skinService().isCOMBrand()\n || brandID === BRANDS.SPAIN\n || brandID === BRANDS.CANADA\n || brandID === BRANDS.MICHIGAN) {\n return '.orbit-game-header-in-app-header';\n }\n\n return '.cy-header-regulation-data';\n }\n\n _waitForTheHeaderElementToBeInDOM() {\n let headerClassName = this._getHeaderClassName();\n return new Promise(resolve => {\n const startTime = Date.now();\n const intervalRef = setInterval(() => {\n const elementRef = DOM.querySelector(headerClassName);\n if(elementRef && elementRef.offsetHeight > 0) {\n clearInterval(intervalRef);\n resolve(elementRef.offsetHeight);\n }\n else if(Date.now() - startTime > 3 * 1000) {\n clearInterval(intervalRef);\n resolve(0);\n }\n }, 10);\n });\n }\n\n async _getHeaderHeight() {\n\n const headerShiftDisable = !this._bUpdateHeaderHeight;\n const netPositionDisable = !this._HybridService.serviceFactory.regulationService().getRegulation().showNetPosition();\n\n if(headerShiftDisable && netPositionDisable){\n return 0;\n }\n\n try{\n return await this._waitForTheHeaderElementToBeInDOM();\n }\n catch (e){\n this.logger.error('Error topHeaderElement height can be calculated, error msg: ', e);\n return 0\n }\n }\n\n\n _getBrandenable(){\n const isEnable = this._HybridService.serviceFactory.regulationService().getRegulation().hybridNyxClosedButtonEnabled();\n return isEnable ? 'true' : 'false'\n }\n\n _getCloseButPosition(){\n\n let xp = 0;\n let yp = 0;\n let xl = 0;\n let yl = 0;\n\n if(Device.hybrid.isEmbedded && !Device.hybrid.inPoker && !Device.hybrid.inSport) {\n if(Device.isIphoneX()) {\n xp = -10;\n yp = 10;\n xl = -10;\n yl = 20;\n }\n }\n\n let enable = this._getBrandenable();\n\n let dt = {\n 'enable': enable,\n 'xp': xp,\n 'yp': yp,\n 'xl': xl,\n 'yl': yl\n };\n\n return dt;\n }\n\n async _updateHeaderheight(){\n\n let headerHeight = await this._getHeaderHeight();\n\n let dt = this._getCloseButPosition();\n\n this._HybridService.changeHeaderHeightOnDemandNyx(headerHeight, dt);\n }\n\n _onResize() {\n this._updateHeaderheight();\n }\n\n _onGameSequenceFinish(status){\n if(status) {\n this._updateHeaderheight();\n }\n }\n\n onHybridDirectCall(data) {\n\n let fn = this.getFuncName(data);\n\n if ('function' === typeof this[fn]) {\n this[fn](data);\n }\n }\n\n getFuncName(data) {\n let fn = data[ON_DEMAND.CB_FN];\n\n return undefined !== fn ? fn : '';\n }\n\n onLoadErrorIframe(data){\n // console.log('AAAAAA: onLoadErrorIframe');\n }\n\n onNyxEvent(data) {\n\n let reason = this._getReason(data);\n\n let isClose = ServiceFactory.create().gameReasonService().handleReason(reason);\n if (isClose) {\n this.onclose();\n }\n }\n\n onNyxPostMsg(data){\n\n let msg = {\n data: {}\n };\n\n try {\n let val = data[KEY_NAME.DATA];\n msg.data.gcmevent = decodeURIComponent(val);\n }\n catch (e) {\n msg.data.gcmevent = '';\n }\n\n Event.fire(SYSTEM_EVENTS.HYBRID_POST_MESSAGE_ARRIVE, msg);\n }\n\n _closeAndInit(){\n this._onDemandGameIsRunning = false;\n Event.off(SYSTEM_EVENTS.SCREEN_RESIZE_CHANGED, this._onResize, this);\n Event.off(SYSTEM_EVENTS.SECOND_WEB_VIEW_CLOSE_ALL, this._onCloseAllWebViews, this);\n Event.off(SYSTEM_EVENTS.SECOND_WEB_VIEW_CLOSE_NYX, this._onCloseNyx, this);\n\n\n Event.fire(SYSTEM_EVENTS.CLOSE_GAME);\n }\n\n onclose() {\n this._HybridService.closeNyxODRGame();\n this._closeAndInit();\n }\n\n _onCloseNyx() {\n\n this._HybridService.closeNyxODRGame();\n\n if(this.isOnDemandStandAloneGameRunning()) {\n this._closeAndInit();\n }\n }\n\n _onCloseAllWebViews(){\n if(this.isOnDemandStandAloneGameRunning()) {\n this._closeAndInit();\n }\n }\n\n isOnDemandStandAloneGameRunning() {\n return this._onDemandGameIsRunning;\n }\n\n _getReason(data) {\n\n let url;\n\n try {\n let val = data[KEY_NAME.DATA];\n url = decodeURIComponent(val);\n }\n catch (e) {\n url = null;\n }\n\n if (null === url) {\n return null;\n }\n\n let extractFirstPart = url.split('?')[1];\n\n if ('undefined' === typeof extractFirstPart) {\n return null;\n }\n\n let allowedPattern = /^reason=([0-9]{1,2})/,\n matchedURL = extractFirstPart.match(allowedPattern),\n reasonID = Array.isArray(matchedURL) ? Number(matchedURL[1]) : false;\n\n return reasonID;\n }\n\n}\nexport default OnDemandNyx;\n","/**\n * PUSH const symbols.\n * @constant\n * @type {Object}\n */\n\n\n\nconst PUSH = {\n TAG: 'tag',\n ALIAS: 'alias',\n TAG_OPEN_APP: 'OpenApp',\n TAG_OPEN_APP_VER: 'OpenAppVer',\n TAG_LOGIN: 'login',\n OPEN_APP_VER: 'openappver',\n CHANGE_TO: '\\'',\n CHANGE_FROM: 'abffcd',\n UA: 'com.urbanairship.in_app',\n EXTRA: 'extra',\n IOS: 'ios',\n ACTION: 'action'\n\n\n};\n\n\nexport {PUSH};","import BaseModel from '../../../../base/base_model';\nimport {PUSH} from './push_hybrid_consts';\nimport _ from \"../../../../utils/underscore\";\nimport Device from \"../../../../utils/device/device\";\nimport {KEY_NAME} from \"../../native/native_const\";\nimport Strings from \"../../../../utils/strings\";\n\nclass PushModel extends BaseModel {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'PushModel';\n\n _bEnable = false;\n _bFeatureEnable = false;\n _actionData = '';\n _bIsLazyPopUp = false;\n\n init(params) {\n\n if (_.isNullOrUndefined(params)) {\n return;\n }\n if (Device.hybrid.inCasino) {\n if (Device.os.isIOS) {\n params = params.ios;\n } else if (Device.os.isAndroid) {\n params = params.android;\n }\n }\n\n if (!_.isNullOrUndefined(params) && params.enable) {\n this._bFeatureEnable = true;\n }\n }\n\n /**\n * @isEnable: is feature enable\n * the 2 bolleans need to be true - the configuration is true and the hybrid support push\n */\n\n isEnable() {\n return this._bEnable && this._bFeatureEnable;\n }\n\n /**\n * @isFeatureEnable: is feature enable from configuration\n */\n\n isFeatureEnable() {\n return this._bFeatureEnable;\n }\n\n /**\n * @updateEnable: enable the feature from hybrid\n * data: {\"error\":0,\"data\":{\"msg\":\"true\"}}\n */\n\n updateEnable(hybridService, data){\n\n data = _.safeJSONandDecode(data);\n\n\n let error = data[KEY_NAME.ERROR];\n if (error !== 0) {\n return;\n }\n\n\n let keyData = data[KEY_NAME.DATA];\n if(undefined !== keyData) {\n\n this._bEnable = (keyData[KEY_NAME.MSG] === 'true');\n this._bIsLazyPopUp = (keyData[KEY_NAME.LAZY_PUSH] === 'true');\n }\n }\n\n isLazyPopUp(){\n return this.isEnable() && this._bIsLazyPopUp;\n }\n\n /**\n * @getActionData: return the data from hybrid\n */\n\n getActionData(){\n return this._actionData;\n }\n\n initData(){\n this._actionData = '';\n }\n\n isNullOrEmpty = function (value) {\n return (\"undefined\" == (typeof(value)) || !value || false || value === \"\" || value.length === 0);\n }\n\n _replaceIfExistAt(str, index, replace, toReplace) {\n return str.substring(0, index) + replace + str.substring(index + 1);\n }\n\n parsePerDevice(pushNotificationdData){\n\n let data = null;\n\n try {\n\n data = JSON.stringify(pushNotificationdData[PUSH.ACTION]);\n if (Device.hybrid.inCasino && Device.os.isIOS) {\n data = this._replaceIfExistAt(data, 0, '', '\"');\n data = this._replaceIfExistAt(data, data.length - 1, '', '\"');\n\n let string = new Strings(data);\n data = string.stripslashes();\n }\n } catch (ex) {\n data = pushNotificationdData;\n }\n\n this._actionData = data;\n }\n\n parseData(data) {\n\n this.initData();\n\n try {\n\n const datatmp = _.safeJSONandDecode(data[KEY_NAME.MSG]);\n\n if(this.isNullOrEmpty(datatmp)){\n return;\n }\n\n this.parsePerDevice(datatmp);\n\n } catch (ex) {\n this.initData();\n }\n }\n\n parseInitData(hybridService,data) {\n try {\n\n this._HybridService = hybridService;\n\n const datatmp = _.safeJSONandDecode(data);\n\n this.parseData(datatmp[KEY_NAME.DATA]);\n } catch (ex) {}\n }\n}\n\nexport default PushModel;","import BaseObject from '../../../../base/base_object';\nimport Model from './push_hybrid_model';\nimport {PUSH} from './push_hybrid_consts';\nimport {FEATURE_CB_FUNC, SERIVCES_FUNC_LIST} from \"../../native/native_const\";\nimport Event from '../../../../utils/event';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\n\n\nclass Push extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'Push';\n _model = null;\n _HybridService = null;\n _dataVersion = null;\n _cidData = null;\n\n\n init(params) {\n\n\n super.init();\n\n this._model = Model.create(params);\n }\n\n initFeatures(hybridSrv) {\n\n this._HybridService = hybridSrv;\n\n if(this._model.isFeatureEnable()){\n\n this._HybridService.isPushDeviceEnable().then(data => {\n this._model.updateEnable(this._HybridService,data);\n this._subscribe();\n this._HybridService.onDisplayWebView();\n });\n }\n return this;\n }\n\n _subscribe() {\n\n if(this._model.isEnable()){\n this._HybridService.setCbFunction(SERIVCES_FUNC_LIST.PUSH_SET_CB, FEATURE_CB_FUNC.HYBRID_PUSH_CALL);\n\n Event.on(SYSTEM_EVENTS.ADD_TAG_OPEN_APP_VER, this._addTagOpenAppVer, this);\n Event.on(SYSTEM_EVENTS.ADD_TAG, this._addTag, this);\n Event.on(SYSTEM_EVENTS.REM_TAG, this._remTag, this);\n Event.on(SYSTEM_EVENTS.SUCCESSFULLY_LOGIN_RESPONSE, this._setAlias, this);\n\n this._addTag(PUSH.TAG_OPEN_APP);\n }\n }\n\n promptPermission(){\n\n if(this._model.isLazyPopUp()) {\n this._addTag(PUSH.TAG_OPEN_APP);\n this._HybridService.addTag(this._dataVersion);\n this._setAlias(this._cidData);\n }\n }\n\n /**\n * Add Tag Open App Version - the tag will be added after the CGP will have the haybrid version\n * data example: OpenAppVer_2.6.14-0\n */\n\n _addTagOpenAppVer(ver){\n this._dataVersion = {[PUSH.TAG]: [PUSH.TAG_OPEN_APP_VER] + '_' + ver, [PUSH.OPEN_APP_VER]:'true'};\n this._HybridService.addTag(this._dataVersion);\n }\n\n /**\n * Add Tag - the tag will be added to hybrid\n * data example: login, OpenApp, OpenAppVer_2.6.14-0\n */\n\n _addTag(tag) {\n let data = {[PUSH.TAG]: tag};\n this._HybridService.addTag(data);\n }\n\n /**\n * Remove Tag - the tag will be removed in the hybrid\n * data example: login, OpenApp\n */\n\n _remTag(tag) {\n let data = {[PUSH.TAG]: tag};\n this._HybridService.remTag(data);\n }\n\n /**\n * Set the Alias for the push\n * cidData:the Alias will be the cidData.newCid\n * data example: {lastCid: 11111111, newCid: 22222222}\n */\n\n _setAlias(cidData) {\n this._cidData = cidData;\n let data = {[PUSH.ALIAS]: cidData.newCid.toString()};\n this._HybridService.setAlias(data);\n\n this._addTag(PUSH.TAG_LOGIN);\n }\n\n\n /**\n * check if the feature is enable\n */\n\n isEnable() {\n return this._model.isEnable();\n }\n\n /**\n * @call when app is open\n * @param data: push parames\n */\n onHybridDirectCall(data) {\n this._model.parseData(data);\n this.runAction();\n }\n\n /**\n * @call when app is launched\n * @param data IOS: {\"error\":0,\"data\":{\"msg\":\"%7B%22com.urbanairship.metadata%22:%22eyJ2ZXJzaW9uX2lkIjoxLCJ0aW1lIjoxNTMyMjUwNTI4NzcwLCJwdXNoX2lkIjoiYTZlMTZjODQtMGQ4Ni00ZGFmLWEyNzAtNzkzMjBiOTkwYWNhIn0=%22,%22aps%22:%7B%22alert%22:%22Login%22,%22badge%22:1%7D,%22_%22:%22e0d14328-e61a-4d37-9905-09e8d7af34a5%22,%22action%22:%22%7B%5C%22action%5C%22:%5C%22login%5C%22%7D%22%7D\"}}\n *@param data Android: \"{\"error\":0,\"data\":{\"msg\":\"%7B%22action%22%3A%7B%22action%22%3A%22login%22%7D%7D\"}}\"\n */\n getPushActions() {\n\n return new Promise((resolve, reject) => {\n this._HybridService.getPushActions().then(data => {\n this._model.parseInitData(this._HybridService,data);\n let actionData = this.runAction();\n resolve(actionData);\n }).catch(() => {\n reject();\n });\n });\n }\n\n /**\n * @runAction: send the event as object to the Orbit\n */\n\n runAction(){\n\n let data = this._model.getActionData();\n\n this._model.initData();\n if(this._model.isNullOrEmpty(data))\n {\n Event.fire(SYSTEM_EVENTS.TOUCH_ID_AUTO_LOGIN);\n return '';\n }\n\n try {\n Event.fire(SYSTEM_EVENTS.DEEPLINK_RECEIVED, JSON.parse(data));\n\n } catch (ex) {\n\n }\n return data;\n }\n}\n\nexport default Push;\n","import BaseObject from '../../../../base/base_object';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\nimport _ from '../../../../utils/underscore';\nimport Device from '../../../../utils/device/device';\nimport Event from '../../../../utils/event';\nimport {LOGIN_TYPE} from '../../../oauth/oauth_const';\n\n\nclass Rating extends BaseObject {\n\n static CLASS = 'Rating';\n _hybridService = null;\n _onGameCloseListener = null;\n _isFeatureEnable = false;\n _displayPopUpRatingAfterGame=true;\n _displayPopUpRatingAfterLogin=true;\n\n init(params) {\n super.init();\n if (_.isNullOrUndefined(params)) {\n return;\n }\n if (Device.os.isIOS) {\n params = params.ios;\n } else if (Device.os.isAndroid) {\n params = params.android;\n }\n\n if (params.enable) {\n this._isFeatureEnable = true;\n\n }\n }\n\n initFeatures(hybridSrv) {\n this._hybridService = hybridSrv;\n if (this._isFeatureEnable) {\n this._subscribe();\n }\n return this;\n }\n\n _subscribe() {\n Event.on(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, this._onAuthChanged, this);\n\n Event.on(SYSTEM_EVENTS.ON_INIT_COMPLETE, () => {\n this._displayPopUpRatingAfterGame = this._getServiceFactory().regulationService().getRegulation().displayPopUpRatingAfterGame();\n this._displayPopUpRatingAfterLogin = this._getServiceFactory().regulationService().getRegulation().displayPopUpRatingAfterLogin();\n });\n }\n\n _getServiceFactory() {\n return this._hybridService.serviceFactory;\n }\n\n async _onAuthChanged() {\n\n if(!this._getServiceFactory().oAuth2Service().isAuthorized()) {\n this._removeGameCloseListener();\n }\n\n if (this._checkLoginCondition()) {\n const gamePlayedCondition = await this._checkGamePlayedCondition();\n if(gamePlayedCondition) {\n this._triggerRatingPopup(this._displayPopUpRatingAfterLogin);\n }\n }\n }\n\n _removeGameCloseListener() {\n this._onGameCloseListener && this._onGameCloseListener.off();\n this._onGameCloseListener = null;\n }\n\n _onGameClose() {\n this._triggerRatingPopup(this._displayPopUpRatingAfterGame);\n }\n\n _checkLoginCondition() {\n const isNewLoggedIn =\n this._getServiceFactory().oAuth2Service().isAuthorized() &&\n this._getServiceFactory().oAuth2Service().getLoginType().toString() === LOGIN_TYPE.NEW_LOGIN.toString();\n\n const isLoginFromRegistration =\n this._getServiceFactory().oAuth2Service().isLoginFromRegistration();\n\n return isNewLoggedIn && !isLoginFromRegistration;\n }\n\n _checkGamePlayedCondition() {\n return this._getServiceFactory().recentlyPlayedService().getRecentlyPlayedList()\n .then(games => {\n const isGamePlayed = _.isArray(games) && games.length >= 1;\n if(isGamePlayed) {\n return true;\n } else {\n this._removeGameCloseListener();\n this._onGameCloseListener = Event.on(SYSTEM_EVENTS.CLOSE_GAME, this._onGameClose, this);\n return false;\n }\n })\n .catch((err) => {\n this._removeGameCloseListener();\n this._onGameCloseListener = Event.on(SYSTEM_EVENTS.CLOSE_GAME, this._onGameClose, this);\n this.logger.error(`getRecentlyPlayedList() error`, err);\n return false;\n });\n }\n\n _triggerRatingPopup(bSend) {\n\n if(bSend) {\n this._hybridService.displayRatingPopup();\n this.logger.info('Rating PopUp Triggered');\n }\n }\n}\n\nexport default Rating;\n","import BaseObject from '../../../../base/base_object';\nimport Device from '../../../../utils/device/device';\nimport _ from \"../../../../utils/underscore\";\nimport {KEY_NAME} from \"../../native/native_const\";\n\n\nclass Scheme extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'Scheme';\n\n _HybridService = null;\n _bSchemeSupported = false;\n _strGamescheme = '';\n _bEnable = false;\n\n\n init(params) {\n\n if (Device.hybrid.isEmbedded) {\n params = params.ios;\n if (!_.isNullOrUndefined(params) && !_.isNullOrUndefined(params.enable)) {\n this._bEnable = params.enable;\n }\n }\n\n super.init(params);\n }\n\n initFeatures(hybridSrv) {\n this._HybridService = hybridSrv;\n\n if (this._bEnable) {\n this.checkSchemeSupported();\n }\n\n return this;\n }\n\n\n\n checkSchemeSupported(){\n\n this._HybridService.checkSchemeSupported().then(data => {\n data = _.safeJSONandDecode(data);\n\n let error = data[KEY_NAME.ERROR];\n if (error !== 0) {\n return;\n }\n\n let keyData = data[KEY_NAME.DATA];\n if(undefined !== keyData) {\n const httpsSupported = (keyData[KEY_NAME.SCHEME_SUPPORTED] === 'true');\n this.setSchemeSupported(httpsSupported);\n }\n })\n }\n\n setSchemeSupported(val){\n this._bSchemeSupported = val;\n }\n\n isSchemeSupported(){\n return this._bSchemeSupported;\n }\n\n setGamescheme(gameschcme){\n this._strGamescheme = gameschcme;\n }\n\n getGamescheme(){\n return this._strGamescheme;\n }\n\n}\nexport default Scheme;\n","/**\n * Apps Flayer const symbols.\n * @constant\n * @type {Object}\n */\nconst AF = {\n ID: 'appsflyerid',\n APP_NAME: 'appname',\n DEVICE_ID: 'deviceid',\n AF_INSTALL: 'afinstall',\n SERIAL_DATA: 'serialdata',\n AFInstall: 'AFInstall',\n AppsFlyerID:'AppsFlyerID',\n APP_IDFV:'idfv',\n CB_FN: 'cbfn',\n SERLAI_DATA: 'SerialData'\n};\n\nexport {AF};","import BaseObject from '../../../../base/base_object';\nimport {FEATURE_CB_FUNC, SERIVCES_FUNC_LIST} from \"../../native/native_const\";\nimport {AF} from \"./providers/appsflyer/app_flayer_const\";\nimport Event from \"../../../../utils/event\";\nimport {SYSTEM_EVENTS} from \"../../../../events/events\";\n\n\n\nclass SerialExtentions extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'SerialExtentions';\n _HybridService = null;\n\n\n init(params) {\n super.init();\n }\n\n\n initFeatures(hybridSrv) {\n\n this._HybridService = hybridSrv;\n\n this._HybridService.setCbFunction(SERIVCES_FUNC_LIST.SERIAL_SET_CB, FEATURE_CB_FUNC.HYBRID_SERIAL_EXTENTIONS);\n\n return this;\n }\n\n updateSerialData(data){\n Event.fire(SYSTEM_EVENTS.SERIAL_UPDATE, data);\n\n try {\n let dt = JSON.stringify(data);\n let dtEncode = encodeURIComponent(dt);\n this._replaceInfoKey(AF.SERLAI_DATA, dtEncode);\n }\n catch (err){\n console.log('updateSerialData failed with error: ' + err);\n }\n\n\n }\n\n _replaceInfoKey(key, val) {\n let data = {\n key: key,\n val: val\n };\n Event.fire(SYSTEM_EVENTS.HYBRID_UPDATE_INFO_KEY, data);\n }\n\n\n onHybridDirectCall(data){\n this._executeFunc(data);\n }\n\n _executeFunc(data){\n let fn = this.getFuncName(data);\n\n if('function' === typeof this[fn]) {\n this[fn](data);\n }\n }\n\n getFuncName(data){\n let fn = data[AF.CB_FN];\n\n return (undefined !== fn) ? fn : '';\n }\n}\n\nexport default SerialExtentions;\n","/**\n * Thouch ID const symbols.\n * @constant\n * @type {Object}\n */\nconst TOUCH_ID = {\n KEY_TOKEN: 'touch_token',\n KEY_TOUCH_ENABLE: 'touchenable',\n KEY_TOUCH_ACTIVATION_CLICKED: 'activationclicked',\n KEY_OPEN_NATIVE_TOUCH_TXT: 'touch_id_native_open_subtitle',\n KEY_TRY_AGAIN_CAPTION: 'touch_id_try_again_caption',\n KEY_TRY_AGAIN_TXT: 'touch_id_try_again_txt',\n KEY_BUT_SKIP: 'touch_id_but_skip',\n KEY_BUT_TRY_AGAIN: 'touch_id_but_try_again',\n KEY_BUT_DISABLE_OK: 'touch_id_disable_but_ok',\n KEY_DISABLE_TXT: 'touch_id_disable_but_txt',\n KEY_SUCCESS: 'success',\n KEY_REASON: 'reason',\n KEY_DEVICE_ID: 'DeviceId',\n KEY_BUNDLE_ID: 'BundleId',\n KEY_TARGET_TYPE: 'TargetType',\n KEY_TARGET_TYPE_VALUE: 'TargetTypeValue',\n KEY_EROR_FAILD: -1,\n KEY_EROR_CANCEL: -2,\n KEY_EROR_LOCK_OUT: -8,\n //PASS_CHANGED: 300,\n //TOKEN_EXPIRE: 305\n/*\n#define kLAErrorAuthenticationFailed -1\n#define kLAErrorUserCancel -2\n#define kLAErrorUserFallback -3\n#define kLAErrorSystemCancel -4\n#define kLAErrorPasscodeNotSet -5\n#define kLAErrorTouchIDNotAvailable -6\n#define kLAErrorTouchIDNotEnrolled -7\n#define kLAErrorTouchIDLockout -8\n#define kLAErrorAppCancel -9\n#define kLAErrorInvalidContext -10\n*/\n};\n\n\nexport {TOUCH_ID};","import BaseModel from '../../../../base/base_model';\nimport {KEY_NAME} from '../../native/native_const';\nimport {TOUCH_ID} from './touch_id_consts';\nimport Store from '../../../../utils/store';\nimport _ from '../../../../utils/underscore';\nimport Device from '../../../../utils/device/device';\nimport ServiceFactory from '../../../service_factory';\n\n\n\nclass TouchIDModel extends BaseModel {\n\n static CLASS = 'TouchIDModel';\n\n _isFeatureEnable = false;\n\n _token = '';\n _srvtoken = '';\n _deviceId = '';\n _bundleId = '';\n _deviceTouchEnable = false;\n _success = '';\n _reason = '';\n _loginWithTouch = false;\n _autoLogin = false;\n _displayAlsoFaceId = true;\n\n /*\n * init the params to be an json object.\n * @params is string from web.config\n * @params is json object from html\n */\n init(params) {\n\n this._isFeatureEnable = true === params.enable && Device.hybrid.inCasino;\n this._displayAlsoFaceId = params.displayAlsoFaceId;\n\n this._initSuccess();\n super.init(params);\n }\n\n isDisplayAlsoFaceId(){\n return this._displayAlsoFaceId;\n }\n\n /**\n * set Auto Login val\n * bVal true/false\n */\n setAutoLogin(bVal) {\n this._autoLogin = bVal;\n }\n\n /**\n * is Auto Login\n * return bool\n */\n isAutoLogin() {\n return this._autoLogin;\n }\n\n /**\n * is Auto Login with touch id - the login was made with the touch id token\n * return bool\n */\n isloginWithTouch() {\n return this._loginWithTouch;\n }\n\n /**\n * set logi nWith Touch id - if true then the login is made with the touchid token\n * bVal true/false\n */\n setloginWithTouch(bVal) {\n this._loginWithTouch = bVal;\n }\n\n /**\n * return true if the user already click on the screen buttons(he saw the screen already)\n * return bool\n */\n _getIsInitScreenShowed() {\n\n let val = Store.get(TOUCH_ID.KEY_TOUCH_ACTIVATION_CLICKED, 'false');\n return val === 'false' ? true : false;\n }\n\n /*\n * set Init screen is showed\n * @params bool\n * need to update only when screen is displayed.\n */\n setInitScreenShowed(val) {\n Store.set(TOUCH_ID.KEY_TOUCH_ACTIVATION_CLICKED, val);\n }\n\n\n /**\n * return true if the touchid is enabled\n * return bool\n */\n isFeatureEnable() {\n return this._isFeatureEnable;\n }\n\n /**\n * return the token that was saved in the hybrid\n * return string\n */\n getToken() {\n return this._token;\n }\n\n /**\n * return the token that was send from the server\n * return string\n */\n getSrvToken() {\n return this._srvtoken;\n }\n\n /**\n * return true if the token is not empty\n * return bool\n */\n isSrvTokenValid() {\n return this._srvtoken.length > 0;\n }\n\n /**\n * set Server Token - save the token that arrived from server\n * example params: Token_PFRva2VuQmxvYkZvckF1dGhlbnRpY2F0aW9uIEF1dGhlbnRpY2F0aW9uQmxvY2s9IjRhOWM1ZmNlLWM2ZGEtNGM2ZS1iYmNmLTU5MDc5MGEzMWRmMSIgRW5jcnlwdGlvblR5cGU9IjgiPg0KICA8VGFyZ2V0VHlwZVZhbHVlPnsiQnVuZGxlSWQiOiJjb20uaHlicmlkY2dwLnJsIiwiRGV2aWNlSWQiOiIxMzY5NDNEQS02QzYxLTRFOTctODcxQS0zODA5QTExNkZFQ0MifTwvVGFyZ2V0VHlwZVZhbHVlPg0KICA8VG9rZW5Tb3VyY2U+VG91Y2hJZDwvVG9rZW5Tb3VyY2U+DQo8L1Rva2VuQmxvYkZvckF1dGhlbnRpY2F0aW9uPg==%22%7D%7D\n */\n setSrvToken(params) {\n this._srvtoken = params.token;\n }\n\n /**\n * return true if the token is empty\n * return bool\n */\n isTokenEmpty() {\n return _.isEmpty(this._token);\n }\n\n /**\n * return true if the touch id is enable\n * return bool\n */\n isDeviceTouchEnable() {\n return this._deviceTouchEnable;\n }\n\n /**\n * return true if the touch id is enable and we have a token\n * return bool\n */\n isTokenEnable() {\n return this._token.length > 0 && true === this._deviceTouchEnable;\n }\n\n /**\n * can Display Autoomatic Activation Screen\n * the screen didn't display ever.\n * the token is empty.\n * the IOS support the touch Feature.\n * @returns BOOL\n */\n canDisplayInitializeScreen() {\n return this._getIsInitScreenShowed() && this.isTokenEmpty() && this.isDeviceTouchEnable();\n }\n\n getText(id) {\n\n let txt = ServiceFactory.create().languageService().translation(id);\n\n if (undefined === txt) {\n txt = '';\n }\n\n return txt;\n }\n\n _initSuccess() {\n this._success = false;\n this._reason = 1000;\n }\n\n /**\n * setEnableRes - enable the touch id\n * json: {error: 0, data: {touchenable: \"true\"}}\n */\n setEnableRes(json) {\n let error = json[KEY_NAME.ERROR];\n if (error !== 0) {\n return;\n }\n let tokenData = json[KEY_NAME.DATA];\n\n this._updateTouchEnable(tokenData);\n }\n\n /**\n * setResTouchParams - set the resault from the touch id\n * json: {error: 0, data: {success: \"true\", reason: \"0\"}}\n */\n setResTouchParams(json) {\n let error = json[KEY_NAME.ERROR];\n if (error !== 0) {\n this._initSuccess();\n return;\n }\n let data = json[KEY_NAME.DATA];\n\n this._success = data[TOUCH_ID.KEY_SUCCESS] === 'true';\n this._reason = Number(data[TOUCH_ID.KEY_REASON]);\n }\n\n isSuccess() {\n return this._success;\n }\n\n getReason() {\n return this._reason;\n }\n\n isEnableWithoutToken() {\n return this._deviceTouchEnable && this._token.length === 0;\n }\n\n /**\n * set TokenData from hybrid\n * data example: \"%7B%22error%22:0,%22data%22:%7B%22touchenable%22:%22true%22,%22touch_token%22:%22Token_PFRva2VuQmxvYkZvckF1dGhlbnRpY2F0aW9uIEF1dGhlbnRpY2F0aW9uQm\n * xvY2s9ImNlYTVlMzBhLTMzOWUtNGFiNy05MjFlLTNiNzIwMjE3OGNiOCIgRW5jcnlwdGlvblR5cGU9IjgiPg0KICA8VGFyZ2V0VHlwZVZhbHVlPnsiQnVuZGxlSWQiOiJjb20uaHlicmlkY2dwLnJsIiwi\n * RGV2aWNlSWQiOiJBRjBDNjU1MC05QjU5LTQxNDktOEE5RS02MzhFQTRDNzUyN0QifTwvVGFyZ2V0VHlwZVZhbHVlPg0KICA8VG9rZW5Tb3VyY2U+VG91Y2hJZDwvVG9rZW5Tb3VyY2U+DQo8L1Rva2VuQm\n * xvYkZvckF1dGhlbnRpY2F0aW9uPg==%22%7D%7D\n */\n setTokenData(data) {\n\n data = _.safeJSONandDecode(data);\n\n let error = data[KEY_NAME.ERROR];\n if (error !== 0) {\n return;\n }\n\n let tokenData = data[KEY_NAME.DATA];\n\n this._updateTokenData(tokenData);\n }\n\n\n /**\n * set TokenData from hybrid\n * tokenData example: {touchenable: \"true\", touch_token: \"Token_PFRva2VuQmxvYkZvckF1dGhlbnRpY2F0aW9uIEF1dGh......yY2U+DQo8L1Rva2VuQmxvYkZvckF1dGhlbnRpY2F0aW9uPg==\"}\n */\n _updateTokenData(tokenData) {\n this._token = tokenData[TOUCH_ID.KEY_TOKEN];\n this._updateTouchEnable(tokenData);\n }\n\n _updateTouchEnable(tokenData) {\n this._deviceTouchEnable = tokenData[TOUCH_ID.KEY_TOUCH_ENABLE] === 'true' && this._isFeatureEnable;\n }\n\n saveParamsForToken(data) {\n data = _.safeJSONandDecode(data);\n\n let error = data[KEY_NAME.ERROR];\n if (error !== 0) {\n return;\n }\n\n let tokenData = data[KEY_NAME.DATA];\n this.saveTokenData(tokenData);\n }\n\n /**\n * save Token Data from hybrid\n * tokenData example: {DeviceId: \"2DE2325B-412C-4218-8FA7-A7B1A98C28E3\", BundleId: \"com.hybridcgp.rl\"}\n */\n saveTokenData(tokenData) {\n this._deviceId = tokenData[TOUCH_ID.KEY_DEVICE_ID];\n this._bundleId = tokenData[TOUCH_ID.KEY_BUNDLE_ID];\n }\n\n /**\n * get Params For Token\n * return Params example: TargetTypeValue: \"{\\\"BundleId\\\":\\\"com.hybridcgp.rl\\\",\\\"DeviceId\\\":\\\"D0D8E990-4ED5-4F8A-ADBA-6507DA328C52\\\"}\", TargetType: 2}\n */\n getParamsForToken() {\n let targetvalueParams = {\n [TOUCH_ID.KEY_BUNDLE_ID]: this._bundleId,\n [TOUCH_ID.KEY_DEVICE_ID]: this._deviceId\n };\n\n let params = {\n [TOUCH_ID.KEY_TARGET_TYPE_VALUE]: JSON.stringify(targetvalueParams),\n [TOUCH_ID.KEY_TARGET_TYPE]: 2\n };\n return params;\n }\n /**\n * get Params for login\n * return Params example: {BundleId: \"com.hybridcgp.rl\", DeviceId: \"D0D8E990-4ED5-4F8A-ADBA-6507DA328C52\", touch_token: \"Token_PFRva2VuQmxvYkZvckF1dGhlbnRpY2F0aW9uIEF1dGhl…yY2U+DQo8L1Rva2VuQmxvYkZvckF1dGhlbnRpY2F0aW9uPg==\"}\n */\n getParamsForLogin() {\n let params = {\n [TOUCH_ID.KEY_BUNDLE_ID]: this._bundleId,\n [TOUCH_ID.KEY_DEVICE_ID]: this._deviceId,\n [TOUCH_ID.KEY_TOKEN]: this._token\n };\n return params;\n }\n}\n\nexport default TouchIDModel;\n","export const WEB_LOGIN_MODES = {\n FIT_TO_PLAY: 'fit-to-play'\n}","import BaseObject from '../../../../base/base_object';\nimport Model from './touch_id_model';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\nimport Event from '../../../../utils/event';\nimport _ from '../../../../utils/underscore';\nimport {TOUCH_ID} from './touch_id_consts';\nimport OptionsComponentController from '../../../../components/options/options_component_controller';\nimport {TOUCH_ID_SCREENS} from '../../../../components/options/option_components/touch_id/touch_id_component_consts';\nimport {PRIORITY_LEVEL} from '../../../overlay_manager/overlay_manager_levels';\nimport ServiceFactory from '../../../service_factory';\nimport DOM from '../../../../utils/dom';\nimport {CGP_ERROR_CODES} from '../../../../exceptions/cgp_error_codes';\nimport {WEB_LOGIN_MODES} from \"../../../web_login/web_login_consts\";\nimport Device from \"../../../../utils/device/device\";\n\n/**\n *\n *\n */\nclass TouchID extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'TouchID';\n\n _model = null;\n _HybridService = null;\n _TouchIdComponentController = null;\n _bIsOpenSettingsSupported = false;\n\n init(params) {\n super.init();\n\n this._model = Model.create(params);\n\n this._subscribe();\n }\n\n initFeatures(hybridSrv) {\n this._HybridService = hybridSrv;\n\n const displayAlsoFaceId = this._model.isDisplayAlsoFaceId();\n\n this._HybridService.setSupportedFaceId(displayAlsoFaceId);\n\n if (Device.hybrid.isHybrid) {\n this._HybridService.isOpenSettingsSupported().then(data => {\n this._bIsOpenSettingsSupported = true;\n });\n }\n\n return this;\n }\n\n isOpenSettingSupported(){\n return this._bIsOpenSettingsSupported;\n }\n\n _subscribe() {\n if (this._model.isFeatureEnable()) {\n Event.on(SYSTEM_EVENTS.ON_INIT_COMPLETE, this.initComplete, this);\n Event.on(SYSTEM_EVENTS.ON_RUN_AUTOLOGIN, this._onAutoLogin, this);\n Event.on(SYSTEM_EVENTS.SUCCESSFULLY_LOGIN_RESPONSE, this._successLogin, this);\n Event.on(SYSTEM_EVENTS.FAIL_LOGIN_RESPONSE, this._failLogin, this);\n Event.on(SYSTEM_EVENTS.TOUCH_ID_GET_TOKEN_FROM_SRV, this.getTokenFromSrv, this);\n Event.on(SYSTEM_EVENTS.TOUCH_ID_INIT_SCREEN_SHOW, this.setInitScreenShowed, this);\n Event.on(SYSTEM_EVENTS.TOUCH_ID_CHECK_TOKEN_ENABLE, this.getTokenAndCheckEnable, this);\n Event.on(SYSTEM_EVENTS.TOUCH_ID_CLEAR_TOKEN, this.clearToken, this);\n Event.on(SYSTEM_EVENTS.TOUCH_ID_LOGIN_ERROR, this.loginerror, this);\n Event.on(TOUCH_ID_SCREENS.TOUCH_ID_CTL_OPENED, this._touchCtlOpend, this);\n Event.on(TOUCH_ID_SCREENS.TOUCH_ID_CTL_CLOSED, this._touchCtlClosed, this);\n Event.on(SYSTEM_EVENTS.LOGIN_FORM_OPEN, this._triggerFitToPlayOrLogin, this);\n Event.on(SYSTEM_EVENTS.TOUCH_ID_AUTO_LOGIN, this._touchIdAutoLoginOnInit, this);\n }\n }\n\n\n initComplete() {\n Event.fire(SYSTEM_EVENTS.TOUCH_GT_SET_ENABLE,true);\n }\n\n /**\n * perform action when we have an error at the login with the tocuh id.\n */\n loginerror(error) {\n switch (error) {\n case CGP_ERROR_CODES.TOKEN_NOT_VALID:\n let bVal = this._model.isloginWithTouch();\n this._model.setloginWithTouch(false);\n if (bVal) {\n this.clearAll();\n }\n break;\n default:\n // maybe should throw an Exception here\n break;\n }\n }\n\n /**\n * clear the token in hybrid\n */\n clearToken() {\n this._HybridService.clearToken();\n }\n\n getModel() {\n return this._model;\n }\n\n _touchIdAutoLoginOnInit(params){\n if (this._model.isFeatureEnable() && !this._HybridService.serviceFactory.oAuth2Service().isAuthorized()) {\n this._triggerFitToPlayOrLogin(params);\n }\n }\n\n isFeatureEnable(){\n return this._model.isFeatureEnable();\n }\n\n _touchCtlClosed() {\n // this._HybridService.setRotaion(ROTATION_KEYS.ALL, 'true');\n }\n _touchCtlOpend() {\n // this._HybridService.setRotaion(ROTATION_KEYS.PORTRATE, 'true');\n }\n setInitScreenShowed() {\n this._model.setInitScreenShowed('true');\n }\n\n _triggerFitToPlayOrLogin(params = {}) {\n const fitToPlayEnabled = this._HybridService.serviceFactory.regulationService().fitToPlayModeEnabled();\n\n if(fitToPlayEnabled && params.fitToPlaySubmit !== true){\n this._getTouchIdToken().then(() => {\n this._HybridService.serviceFactory.webLoginService().updateLoginFormModeType(WEB_LOGIN_MODES.FIT_TO_PLAY);\n });\n }else{\n this.triggerTouchIdLogin();\n }\n }\n\n _getTouchIdToken(){\n return new Promise((resolve, reject) => {\n this._HybridService.getTouchIdToken().then(data => {\n this._model.setTokenData(data);\n if (this._model.isTokenEnable()) {\n resolve(data);\n }else{\n reject();\n }\n });\n });\n }\n\n /**\n * check if we need to display the touch id for the user to login with his finger print\n */\n triggerTouchIdLogin() {\n this._getTouchIdToken().then(() => {\n this.callOpenTouchId().then(data =>\n this._loginWithToken(_.safeJSONandDecode(data))\n ).then(() => {\n Event.fire(SYSTEM_EVENTS.TOUCH_ID_STATE_CHANGED);\n });\n });\n }\n\n /**\n * login with the token that was save in the hybrid\n */\n _loginWithToken(json) {\n this._model.setResTouchParams(json);\n if (this._model.isSuccess()) {\n this._HybridService.getParamsForToken()\n .then(data => {\n this._model.saveParamsForToken(data);\n this._model.setloginWithTouch(true);\n let params = JSON.stringify(this._model.getParamsForLogin());\n Event.fire(SYSTEM_EVENTS.RUN_AUTOLOGIN_TOUCH_ID, params);\n });\n }\n }\n\n /**\n * fail to Login - update analitic\n */\n _failLogin() {\n let bVal = this._model.isloginWithTouch();\n DOM.setTimeout(() => {\n this._model.setloginWithTouch(false);\n }, 2000);\n if (true === bVal) {\n this._HybridService.serviceFactory.analyticsService().sendOrbitUserFlowEvent(\n {\n category:'Client_TouchID',\n action: 'LoginFailure'\n });\n }\n }\n\n _onAutoLogin() {\n this._model.setAutoLogin(true);\n }\n\n _successLogin(cidData) {\n // this._HybridService.setRotaion(ROTATION_KEYS.ALL, 'true');\n // users with auto login - are returned - to avoid executing the following code - to prevent first time logins from running.\n // autologin is usually indicates the user is firstly login - except touchid flow which can be called few times\n if (this._model.isAutoLogin()) {\n this.clearAll();\n this._model.setAutoLogin(false);\n return;\n }\n\n // close the overlay of the login\n //Event.fire(SYSTEM_EVENTS.CLOSE_OVERLAY, {priority: PRIORITY_LEVEL.LOGIN});\n let bVal = this._model.isloginWithTouch();\n this._model.setloginWithTouch(false);\n if (true === bVal) {\n this._HybridService.serviceFactory.analyticsService().sendOrbitUserFlowEvent(\n {\n category:'Client_TouchID',\n action: 'LoginSuccess'\n });\n }\n\n // ask for new token for the touch id\n this._checkOtherCid(cidData);\n this._HybridService.getTouchIdToken()\n .then(data => {\n this._model.setTokenData(data);\n if (this._model.canDisplayInitializeScreen()) {\n this._HybridService.serviceFactory.orbitComponentRenderService().showInitBiometricDialog();\n }\n });\n }\n\n /**\n * check if the new CID is different from the old one - if yes the clear all data(old token)\n */\n _checkOtherCid(cidData) {\n if (cidData.newCid !== cidData.lastCid) {\n this.clearAll();\n }\n }\n\n clearAll() {\n this._model.setInitScreenShowed('false');\n this.clearToken();\n }\n /**\n * open Controller to display the touch id\n * screen: there are 3 screens\n * INIT_SCREEN: the outonatic screen after first login\n * MODIFY_SCREEN: the manual screen that we open from the menu\n */\n _openController(screen) {\n this._TouchIdComponentController = this._TouchIdComponentController || OptionsComponentController.create().load('TouchId');\n this._TouchIdComponentController.setScreen(screen);\n this._TouchIdComponentController.render();\n }\n\n setTouchIdComponentController(control) {\n this._TouchIdComponentController = control;\n }\n\n /**\n * open TouchId window\n */\n openTouchId() {\n\n const caption = this._model.getText(TOUCH_ID.KEY_OPEN_NATIVE_TOUCH_TXT);\n return this._HybridService.openTouchId(caption);\n }\n\n /**\n * get Token And Check Enable - get a new token if the device is enable\n */\n getTokenAndCheckEnable() {\n return this._HybridService.getTouchIdToken().then(data => {\n this._model.setTokenData(data);\n\n const isTokenAndCheckEnable = this._model.isDeviceTouchEnable() && !this._model.isTokenEmpty(); // check if touch is suported and there is a token\n\n Event.fire(SYSTEM_EVENTS.TOUCH_ID_TOKEN_ENABLE_RES, isTokenAndCheckEnable);\n\n return isTokenAndCheckEnable;\n });\n }\n\n /**\n * get Token From Server and save him in the hybrid\n */\n getTokenFromSrv() {\n return this._HybridService.getParamsForToken()\n .then(data => {\n this._model.saveParamsForToken(data);\n\n const params = this._model.getParamsForToken();\n\n // call to SRV\n return ServiceFactory.create().userService().renewLoginToken(params)\n .then(data => {\n this._model.setSrvToken(data);\n\n const setTokenRes = this._HybridService.setToken(this._model.getSrvToken());\n Event.fire(SYSTEM_EVENTS.TOUCH_ID_STATE_CHANGED);\n\n return setTokenRes;\n\n })\n .catch(error =>{\n this.logger.error(\"Retrieve Token For Touch Id failed\", error);\n throw error;\n });\n });\n }\n\n\n /**\n * call Open TouchId - check if the device is support touch id then open the touch id screen\n */\n callOpenTouchId() {\n return this._HybridService.isTouchIdSuported().then(data => {\n this._model.setEnableRes(_.safeJSONandDecode(data));\n if (this._model.isDeviceTouchEnable()) {// check if touch is suported\n return this.openTouchId().then(data => {\n this._model.setResTouchParams(_.safeJSONandDecode(data));\n\n if (this._model.isSuccess()) {\n this.closeComponentController();\n } else {\n this.onTouchVerifyError();\n }\n\n return data;\n });\n } else {\n this.closeComponentController();\n }\n });\n }\n\n /**\n * display Try Again if the device is support touch id.\n */\n onTryAgain() {\n\n this._HybridService.isTouchIdSuported().then(data => {\n this._model.setEnableRes(_.safeJSONandDecode(data));\n if (this._model.isDeviceTouchEnable()) {// check if touch is suported\n let txt = this._model.getText(TOUCH_ID.KEY_TRY_AGAIN_TXT);\n let caption = this._model.getText(TOUCH_ID.KEY_TRY_AGAIN_CAPTION);\n let skip = this._model.getText(TOUCH_ID.KEY_BUT_SKIP);\n let tryAgain = this._model.getText(TOUCH_ID.KEY_BUT_TRY_AGAIN);\n\n Event.fire(SYSTEM_EVENTS.MESSAGE_OPEN, {\n title: caption, text: txt,\n priority: PRIORITY_LEVEL.TOUCH_ID_POPUP,\n customCSSClassList: ['mdp-mobile-full-size'],\n buttons: [\n {\n name: tryAgain,\n callback: () => {\n this.callOpenTouchId();\n }\n },\n {\n name: skip,\n callback: () => {\n Event.fire(SYSTEM_EVENTS.TOUCH_ID_TRY_AGAIN_SKIP);\n }\n }\n ]\n });\n } else {\n let txt = this._model.getText(TOUCH_ID.KEY_DISABLE_TXT);\n let skip = this._model.getText(TOUCH_ID.KEY_BUT_DISABLE_OK);\n\n Event.fire(SYSTEM_EVENTS.MESSAGE_OPEN, {\n title: '', text: txt,\n priority: PRIORITY_LEVEL.TOUCH_ID_POPUP,\n buttons: [{name: skip, callback: () => {\n this.closeComponentController();\n }}]\n });\n }\n });\n }\n\n /**\n * onTouchVerifyError - act accurding to the error from the finger print on the device.\n */\n onTouchVerifyError() {\n\n let reason = this._model.getReason();\n\n // this._HybridService.alert(reason.toString());\n\n let errorlog = '';\n\n switch (reason) {\n case TOUCH_ID.KEY_EROR_FAILD: // -1\n errorlog = 'Native_Error_Failed';\n this.triggerTouchIdLogin();\n break;\n case TOUCH_ID.KEY_EROR_LOCK_OUT: // -8\n errorlog = 'Native_Lock_Out';\n this.onTryAgain();\n break;\n case TOUCH_ID.KEY_EROR_CANCEL: // -2\n errorlog = 'Cancel_Native_Prompt';\n Event.fire(SYSTEM_EVENTS.TOUCH_ID_TRY_AGAIN_SKIP);\n break;\n default:\n this.closeComponentController();\n }\n\n if(errorlog.length > 0) {\n this._HybridService.serviceFactory.analyticsService().sendOrbitUserFlowEvent(\n {\n category:'Client_TouchID',\n action: errorlog\n });\n }\n }\n\n closeComponentController() {\n this._TouchIdComponentController?.close();\n }\n}\n\nexport default TouchID;\n","/**\n * Created by arieh on 12/6/2017.\n */\n\n\nconst SCHEME = {\n IS_DEEP_LINK: 'deep_link_execute',\n DL_DEL:'deeplink=',\n DL_R_CURLY_BRACKETS: '}',\n DEEP_LINK_FEATUR_NAME: 'deeplinkfeature'\n};\n\n\nexport {SCHEME};","import BaseModel from '../../../../base/base_model';\nimport _ from '../../../../utils/underscore';\nimport {KEY_NAME} from '../../native/native_const';\nimport {SCHEME} from './url_scheme_consts';\n\n\n\nclass UrlSchemeModel extends BaseModel {\n\n static CLASS = 'UrlSchemeModel';\n\n\n _bundleId = '';\n _featureData = '';\n _featueName = '';\n\n /*\n * init the params to be an json object.\n * @params is string from web.config\n * @params is json object from html\n */\n init(params) {\n super.init(params);\n }\n\n checkData(data) {\n\n if (undefined !== data[KEY_NAME.DATA]) {\n return data;\n }\n\n data = _.safeJSONandDecode(data);\n\n return data[KEY_NAME.DATA];\n }\n\n /**\n * setInfoUrlScheme - that function is called each time when the app is hybrid is called by the url scheme\n * and the UrlSchcme class call the currect feature with the data.\n * example data:\n * info:{\\\"hybridcbfeaturefunc\\\":\\\"UrlSchemeFeature\\\",\\\"id\\\":\\\"com.hybridcgp.rl\\\",\\\"data\\\":\\\"com.hybridcgp.rl://%7B%22type%22%3A%22HybridInfoFeature%22%2C%22action%22%3A%22debug%22%2C%22url%22%3A%22https%3A%2F%2Fcasino-devtouch.888sport.com%3A82%22%2C%22reload%22%3A%22true%22%7D\\\"}\"\n * casheir:{\\\"hybridcbfeaturefunc\\\":\\\"UrlSchemeFeature\\\",\\\"id\\\":\\\"com.hybridcgp.rl\\\",\\\"data\\\":\\\"com.hybridcgp.rl://%7b%22type%22%3a%22webviewmanagerfeature%22%2c%22action%22%3a%22closesafari%22%2c%22webid%22%3a1000%7d\\\"}\n */\n setInfoUrlScheme(data) {\n\n let jsonData = data;\n\n if (undefined !== jsonData && undefined !== jsonData[KEY_NAME.ID]) {\n this._bundleId = jsonData[KEY_NAME.ID];\n let allData = jsonData[KEY_NAME.DATA];\n this._setfeatureName(allData);\n }\n }\n\n\n /**\n * set feature Name - tparse the feature name from the url scheme\n * example data info: com.hybridcgp.rl://%7B%22type%22%3A%22HybridInfoFeature%22%2C%22action%22%3A%22debug%22%2C%22url%22%3A%22https%3A%2F%2Fmirage-cgp-client.888sport.com%22%2C%22reload%22%3A%22true%22%7D\n * */\n _setfeatureName(data) {\n if (undefined !== data) {\n let res = data.split('://');\n this._featureData = res[1];\n let tmpData = _.safeJSONandDecode(res[1]);\n this._featueName = tmpData[KEY_NAME.TYPE];\n }\n }\n\n /**\n * return the Feature Data\n * */\n getFeatureData() {\n return this._featureData;\n }\n\n /**\n * return the Feature Name\n * */\n getFeatueName() {\n return this._featueName;\n }\n\n\n setDeepLinkData(data, hybridService) {\n\n try {\n\n const logData = data;\n data = data.replace(SCHEME.IS_DEEP_LINK, '');\n\n const splitDeepLinkDataArray = data.split(SCHEME.DL_DEL);\n\n let deepLinkData = decodeURIComponent(splitDeepLinkDataArray[1]);\n\n deepLinkData = deepLinkData.split(SCHEME.DL_R_CURLY_BRACKETS)[0] + SCHEME.DL_R_CURLY_BRACKETS;\n\n deepLinkData = deepLinkData.replace('{','').replace('}','');\n\n this._featureData = encodeURIComponent('{\"type\":\"deeplinkfeature\",' + deepLinkData + '}');\n this._featueName = SCHEME.DEEP_LINK_FEATUR_NAME;\n\n hybridService.logger.info('DeepLink Ok : ' + logData);\n\n return true;\n }\n catch (e) {\n hybridService.logger.info('DeepLink Error: ' + e.toString());\n\n return false;\n }\n }\n}\n\nexport default UrlSchemeModel;\n","import {KEY_NAME} from '../../native/native_const';\n\nconst schamaParamsMap = {\n userinfo: \"HybridInfoFeature\",\n sessiontimer: \"HybridInfoFeature\"\n};\n\n/**\n * Convert data as query string to the type that Hybrid should got. not support params from not the same feature.\n * @param data\n * @returns {{}}\n */\nexport function convertQueryStringToObject(data) {\n try {\n let convertedObject = {};\n\n if (typeof data === 'string' && data.split('?').length === 2) {\n let queryParamsString = data.split('?')[1];\n let queryParamsArr = queryParamsString.split('&');\n\n queryParamsArr.forEach((param) => {\n let paramObject = param.split('=');\n let paramName = paramObject[0];\n let paramValue = paramObject[1];\n\n // Remove unrelevant params\n if(schamaParamsMap[paramName.toLowerCase()]) {\n if(!convertedObject[KEY_NAME.TYPE]) {\n convertedObject[KEY_NAME.TYPE] = schamaParamsMap[paramName.toLowerCase()];\n }\n\n convertedObject[paramName] = paramValue;\n }\n });\n\n return data.split('?')[0] + JSON.stringify(convertedObject);\n }\n\n return data;\n } catch (err) {\n return data;\n }\n}\n","import BaseObject from '../../../../base/base_object';\nimport Model from './url_scheme_model';\nimport {SCHEME} from './url_scheme_consts';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\nimport {SERIVCES_FUNC_LIST, FEATURE_CB_FUNC, KEY_NAME} from '../../native/native_const';\nimport Event from '../../../../utils/event';\nimport _ from '../../../../utils/underscore';\nimport {convertQueryStringToObject} from './url_schema__params_map';\n\n\n/**\n *\n *\n */\nclass UrlScheme extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'UrlScheme';\n\n _model = null;\n _HybridService = null;\n\n init(params) {\n super.init();\n\n this._model = Model.create(params);\n\n this._subscribe();\n }\n\n _subscribe() {\n Event.on(SYSTEM_EVENTS.ON_INIT_COMPLETE, this._getInfoUrlScheme, this);\n }\n\n /**\n * get Info UrlScheme - check at init if the hybrid was launched from UrlScheme\n */\n _getInfoUrlScheme() {\n this._HybridService.getInfoUrlScheme().then(data => {\n let dataDecode = _.safeJSONandDecode(data);\n\n this.onHybridDirectCall(dataDecode[KEY_NAME.DATA]);\n });\n }\n\n /**\n * onHybridDirectCall - that function is called each time when the app is hybrid is called by the url scheme\n * and the UrlSchcme class call the currect feature with the data.\n * example data:\n * info:{\\\"hybridcbfeaturefunc\\\":\\\"UrlSchemeFeature\\\",\\\"id\\\":\\\"com.hybridcgp.rl\\\",\\\"data\\\":\\\"com.hybridcgp.rl://%7B%22type%22%3A%22HybridInfoFeature%22%2C%22action%22%3A%22debug%22%2C%22url%22%3A%22https%3A%2F%2Fcasino-devtouch.888sport.com%3A82%22%2C%22reload%22%3A%22true%22%7D\\\"}\"\n * casheir:{\\\"hybridcbfeaturefunc\\\":\\\"UrlSchemeFeature\\\",\\\"id\\\":\\\"com.hybridcgp.rl\\\",\\\"data\\\":\\\"com.hybridcgp.rl://%7b%22type%22%3a%22webviewmanagerfeature%22%2c%22action%22%3a%22closesafari%22%2c%22webid%22%3a1000%7d\\\"}\n */\n onHybridDirectCall(data) {// casheir info\n\n if(this._isDeepLink(data)){\n this._updateDeepLinkAndCallFeature(data);\n }else {\n this._updateAndCallFeature(data);\n }\n }\n\n _isDeepLink(data){\n\n if(data[KEY_NAME.DATA] && data[KEY_NAME.DATA].includes(SCHEME.IS_DEEP_LINK)) {\n Event.fire(SYSTEM_EVENTS.DEEP_LINK_READY, data);\n return this._model.setDeepLinkData(data[KEY_NAME.DATA],this._HybridService);\n }\n\n return false;\n }\n /**\n * convert DeepLink Data to be like scheme format\n */\n _updateDeepLinkAndCallFeature(data){\n this.clearUrlScheme();\n this.onHybridUrlScheme();\n }\n /**\n * update And Call Feature - call the currect feature\n */\n _updateAndCallFeature(data) {\n data[KEY_NAME.DATA] = convertQueryStringToObject(data[KEY_NAME.DATA]);\n this._model.setInfoUrlScheme(data);\n this.clearUrlScheme();\n this.onHybridUrlScheme();\n }\n\n initFeatures(hybridSrv) {\n this._HybridService = hybridSrv;\n hybridSrv.setCbFunction(SERIVCES_FUNC_LIST.URL_SCHEME_SET_CB, FEATURE_CB_FUNC.HYBRID_URL_SCHEME_CALL);\n\n return this;\n }\n\n /**\n * call the correct feature from the urlscheme\n */\n onHybridUrlScheme() {\n let name = this._model.getFeatueName();\n let data = this._model.getFeatureData();\n this._HybridService.onHybridUrlScheme(name, data);\n }\n\n clearUrlScheme() {\n this._HybridService.clearUrlScheme();\n }\n\n}\n\nexport default UrlScheme;\n","/**\n * WEB VIEW MANAGER const symbols.\n * @constant\n * @type {Object}\n */\nconst WEB_VIEW_TYPES = {\n MASTER: 0,\n SECOND: 1,\n SAFARI: 2\n};\n\nconst WEB_VIEW_IDS = {\n MASTER_ID: 0,\n GAME_ID: 1,\n SAFARI_ID: 1000,\n DEPOSIT_WIDGET_ID: 1100\n};\n\nconst WEB_VIEW_REASON = {\n UN_DEFINED: -1,\n WEB_SECOND_NOT_SUPPORTED: 400,\n CLOSE_BUT_CLICKED: 500,\n CLOSE_BY_WEB: 501,\n CLIENT_TAPED_ON_VIEW: 600,\n OPEN_LINK: 700\n};\n\nconst DEVICE_SHIFTS = {\n IPHONE_DEFAULT: 82,\n IPHONE_X_PORTRATE: 15,\n IPHONE_X_LANDSCAPE: 10,\n IPHONE_X_12_PRO_LANDSCAPE: 25,\n ANDROID_X_BUTL: 35,\n ANDROID_DEFAULT: 0,\n ANDROID_S9_WIDTH: 360,\n ANDROID_S9_HEIGHT: 740,\n ANDROID_S9_DENSITY_2 : '2.0',\n ANDROID_S9_DENSITY_4 : '4.0',\n ANDROID_S9_DP_2: 14,\n ANDROID_S9_DP_4: -16,\n ANDROID_S9_LANDSCAPE: -2,\n ANDROID_PORTRATE_NAV_BAR_DISPLAY: 18,\n ANDROID_PORTRATE_NAV_BAR_NOT_DISPLAY: 115\n};\n\nconst WINDOW_ELEMENTS = {\n SPORT: 'isSIC'\n};\n\nconst WEB_VIEW_INFO = {\n TYPE: 'type',\n ACTION: 'action',\n ENAABLE_SNAP_SHOT: 'enableSnapShot',\n INJECT_FUNC: 'injectfunc',\n DEL_INJECT: '@@@',\n FRAME_OFFSET_TOP_Y: 'frameOffsetTopY',\n FRAME_OFFSET_TOP_PORTRATE_Y: 'topPortrateY',\n FRAME_TOP_LANDSCAPE_Y: 'frameOffsetTopLandscapeY',\n FRAME_TOP_PORTRATE_Y: 'frameOffsetTopPortrateY',\n FRAME_TOP_PORTRATE_IPHONE_X: 'frameOffsetTopPortrateIphoneX',\n FRAME_OFFSET_BOTTOM_Y: 'frameOffsetBottomY',\n ID: 'webid',\n URL: 'url',\n DISPLAY_GAME_TIME_OUT: 'displayGameTimeOut',\n TAP_KEEP_ALIVE: 'tapKeepAlive',\n BUT_INIT: 'butInit', // Close button\n BUT_RTL: 'butRTL',\n BUT_W: 'butW',\n BUT_H: 'butH',\n BUT_X: 'butX',\n BUT_Y: 'butY',\n DP_TO_PX: 'dp2px',\n BUT_LANDSCARE_X: 'butlandscapeX',\n BUT_LANDSCARE_Y: 'butlandscapeY',\n CLOSE_BUT_CLICKED: 'closebutclicked',\n WEB_SECOND_NOT_SUPPORTED: 'websecondnotsupported',\n CLOSE_CALLED_BY_WEB: 'closesafari',\n TAP_ON_VIEW: 'tapAction',\n ORIENTATION: 'orientation',\n REMOTE_URL: 'remoteurl',\n WINDOW_ELEMENT: 'windowelement',\n SHIFT_FROM_BOTTOM: 'shiftFromBottom',\n IPHONE_X_PORTRATE: 'iphonexportrate',\n IPHONE_X_LANDSCAPE: 'iphonexlandscape',\n ANDROID_PORTRATE: 'androidportrate',\n ANDROID_LANDSCAPE: 'androidlandscape',\n IPHONE_X_12_PRO_LANDSCAPE: 'iphonex12prolandscape',\n ANDROID_PORTRATE_NAV_BAR_DISPLAY: 'androidportratenavbardisplay',\n ANDROID_PORTRATE_NAV_BAR_NOT_DISPLAY: 'androidportratenavbarnotdisplay'\n};\n\nconst WEB_INJECT_FUNC = {\n DRAG_STARTED: 'function dragStarted(x,y) {var el = document.elementFromPoint(x, y);var evt = new MouseEvent(\\'click\\', {bubbles: true,cancelable: true,view: window, screenX: x, screenY: y, clientX: x+10, clientY: y + 10});el.dispatchEvent(evt);}',\n DEBUG_FUNC: 'function onclock() {var devtools = /./; devtools.toString = function() { webkit.messageHandlers.cbCallBackHandlerCGP.postMessage(\\'isdebugenable\\'); }; console.log(\\'%c\\', devtools);} setInterval(onclock, 200);',\n PIXEL_EL: 'var elemDiv = document.createElement(\\'div\\'); elemDiv.style.cssText = \\'position:fixed;width:1px;height:1px;z-index:99999;background:black;\\';document.body.appendChild(elemDiv);',\n READY: 'setTimeout(function() {webkit.messageHandlers.cbCallBackHandlerCGP.postMessage(\\'onready\\');}, 100);'\n};\n\n\nexport {WEB_VIEW_TYPES, WEB_VIEW_IDS, WEB_VIEW_INFO, WEB_VIEW_REASON,DEVICE_SHIFTS, WEB_INJECT_FUNC, WINDOW_ELEMENTS};","import BaseObject from '../../../../base/base_object';\nimport {SERIVCES_FUNC_LIST, FEATURE_CB_FUNC ,KEY_NAME} from '../../native/native_const';\nimport {WEB_VIEW_INFO} from './web_view_manager_consts';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\nimport Event from '../../../../utils/event';\n\nclass BaseWebView extends BaseObject {\n\n\n static CLASS = 'BaseWebView';\n\n _id = -1;\n _type = -1;\n _parent = null;\n\n init(params) {\n\n this._id = params.id;\n this._type = params.type;\n this._parent = params.parent;\n super.init();\n }\n\n\n /**\n * isValidId\n * return default is false\n */\n isValidId() {\n return false;\n }\n\n /**\n * getWebId\n * return id of webView\n * MASTER_ID: 0\n * GAME_ID: 1,2,3...999\n * SAFARI_ID: 1000\n */\n getWebId() {\n return this._id;\n }\n\n /**\n * get the Type of webView\n * return type of web\n * MASTER: 0\n * SECOND: 1\n * SAFARI: 2\n */\n getType() {\n return this._type;\n }\n\n onclose() {\n this._parent.onclose(this);\n }\n\n /**\n * set Call back Functions for hybrid\n * each webView has his own cb function with his unique id\n */\n setCbFunctions(hybridService) {\n let data = {[WEB_VIEW_INFO.ID]: this._id, [WEB_VIEW_INFO.TYPE]: this._type};\n hybridService.setCbFunction(SERIVCES_FUNC_LIST.WEB_SECOND_SET_CB, FEATURE_CB_FUNC.HYBRID_WEB_CALL, data);\n }\n\n /**\n * on Hybrid DirectCall - the call from the hybrid\n * data example: {hybridcbfeaturefunc: \"WebViewManagerFeature\", webid: \"1\", action: \"https://mirage.navigation-center.com/SharedNavigat…GMxNjctMDdlMy00MjdjLTg4NTItMWVlODZhNzRhZTEz%22%7D\"}\n */\n onHybridDirectCall(data) {\n let funcName = 'onHybridCall';\n this[funcName](data);\n }\n\n /**\n * onHybridCall - call from hybrid\n * data example: {hybridcbfeaturefunc: \"WebViewManagerFeature\", webid: \"0\", action: \"https://www.google.co.il/\"}\n */\n checkOpenLinks(data) {\n\n try{\n let url = data[KEY_NAME.OPEN_LINK];\n let regex = new RegExp('^(' + [KEY_NAME.BANK_ID] + '|http|https):\\\\/\\\\/[^ \"]+$');\n let valid = regex.test(url) || url.includes([KEY_NAME.PHONE]);\n\n const eventData = {category: 'Hybrid_WebView_open', action: 'Open_SecondWebView', label: url}\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, eventData);\n\n if (true === valid) {\n if(url.toLowerCase().includes(KEY_NAME.MIT_ID) && this._parent.isDepositWidgetSupported()){\n Event.fire(SYSTEM_EVENTS.WEB_VIEW_NAVIGATE_MIT_ID, 'mitid');\n const eventData = {category: 'MitId', action: 'MitIdSecondWebViewUrl', label: url}\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, eventData);\n }else {\n this._parent.openExternalLink(url);\n }\n }else if(0 === url.length){\n if(this._parent.isDepositWidgetSupported()) {\n Event.fire(SYSTEM_EVENTS.WEB_VIEW_NAVIGATE_DEPOSIT_WIDGET, 'depositWidget');\n\n let urlsecondwebview = data[KEY_NAME.URL];\n\n //Will Fire only on Android since only in Android we have the url of the second web view\n if(urlsecondwebview.length > 0) {\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent({\n category: 'DepositWidget',\n action: 'DepositWidgetSecondWebViewUrl',\n label: urlsecondwebview\n });\n }\n }\n }else if('CloseWebView' === url){ //We get CloseWebView from Deposit widget to close it\n Event.fire(SYSTEM_EVENTS.SECOND_WEB_VIEW_CLOSE_ALL);\n return;\n }\n\n this._parent.openLinksAccomplished(this.getWebId(), this.getType());\n\n }catch (e){\n const eventData = {category: 'Hybrid_WebView_Error', action: 'checkOpenLinks_function', label: e}\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, eventData);\n }\n\n }\n}\n\n\nexport default BaseWebView;","import BaseWebView from './base_web_view';\nimport {WEB_VIEW_IDS, WEB_VIEW_INFO, WEB_VIEW_REASON} from './web_view_manager_consts';\nimport {KEY_NAME} from '../../native/native_const';\n\nclass MasterWebView extends BaseWebView {\n\n static CLASS = 'MasterWebView';\n\n\n /**\n * isValidId\n * return return true if the id of master is correct\n */\n isValidId() {\n return WEB_VIEW_IDS.MASTER_ID === this._id;\n }\n\n /**\n * onHybridCall - call from hybrid\n * data example: {hybridcbfeaturefunc: \"WebViewManagerFeature\", webid: \"0\", action: \"https://www.google.co.il/\"}\n */\n onHybridCall(data) {\n\n let reason = this._getReason(data);\n\n switch (reason) {\n case WEB_VIEW_REASON.WEB_SECOND_NOT_SUPPORTED:\n this._disableSecondWebView();\n break;\n default:\n this.checkOpenLinks(data);\n }\n\n }\n\n /**\n * get Reason - get the currect reason of incoming msg\n * data example: websecondnotsupported\n */\n _getReason(data) {\n\n let val = data[KEY_NAME.ACTION];\n\n let reasonID = WEB_VIEW_REASON.OPEN_LINK;\n\n switch (val) {\n case WEB_VIEW_INFO.WEB_SECOND_NOT_SUPPORTED:\n reasonID = WEB_VIEW_REASON.WEB_SECOND_NOT_SUPPORTED;\n break;\n default:\n // maybe should throw an Exception here\n break;\n }\n\n return reasonID;\n }\n\n _disableSecondWebView() {\n this._parent.setFeatureGameDisable();\n }\n\n}\n\nexport default MasterWebView;","import BaseWebView from './base_web_view';\nimport {WEB_VIEW_IDS, WEB_VIEW_INFO, WEB_VIEW_REASON} from './web_view_manager_consts';\nimport {KEY_NAME} from '../../native/native_const';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\nimport Event from '../../../../utils/event';\nimport ServiceFactory from \"../../../service_factory\";\n\nclass SecondWebView extends BaseWebView {\n\n static CLASS = 'SecondWebView';\n\n init(params) {\n super.init(params);\n this._subscribe();\n }\n\n _subscribe() {\n Event.on(SYSTEM_EVENTS.SECOND_WEB_VIEW_OLD_CALL, this._onOldHybridCall, this);\n }\n\n /**\n * isValidId\n * return return true if the id of SecondWebView is in range\n */\n isValidId() {\n return WEB_VIEW_IDS.MASTER_ID < this._id && this._id <= WEB_VIEW_IDS.DEPOSIT_WIDGET_ID;\n }\n\n _onOldHybridCall(data) {\n this.onHybridCall(data);\n }\n\n /**\n * onHybridCall - call from hybrid\n * data example: {hybridcbfeaturefunc: \"WebViewManagerFeature\", webid: \"1\", action: \"https://casino-devtouch.888sport.com:82/?reason=0\"}\n */\n onHybridCall(data) {\n\n let reason = this._getReason(data);\n let isClose = ServiceFactory.create().gameReasonService().handleReason(reason);\n if (isClose) {\n this.onclose();\n return;\n }\n switch (reason) {\n case WEB_VIEW_REASON.CLOSE_BUT_CLICKED:// close but clicked\n this.onclose();\n break;\n\n case WEB_VIEW_REASON.CLIENT_TAPED_ON_VIEW:\n this._onTapped();\n break;\n\n case WEB_VIEW_REASON.OPEN_LINK:\n this.checkOpenLinks(data);\n break;\n\n default:\n // maybe should throw an Exception here\n break;\n }\n }\n\n /**\n * on Tapped - call in order to keep alive the cgp when tapped on secondVewView\n */\n _onTapped() {\n Event.fire(SYSTEM_EVENTS.EXTEND_USER_TIME_TO_LIVE);\n }\n\n /**\n * get Reason - get the currect reason of incoming msg\n * data example1: tapAction\n * data example2: closebutclicked\n * data example3: https://casino-devtouch.888sport.com:82/?reason=0\n */\n _getReason(data) {\n\n let val = data[KEY_NAME.ACTION];\n\n if (undefined === val) {\n return WEB_VIEW_REASON.OPEN_LINK;\n }\n\n if (WEB_VIEW_INFO.TAP_ON_VIEW === val) {\n return WEB_VIEW_REASON.CLIENT_TAPED_ON_VIEW;\n }\n\n if (WEB_VIEW_INFO.CLOSE_BUT_CLICKED === val) {\n return WEB_VIEW_REASON.CLOSE_BUT_CLICKED;\n }\n\n let extractFirstPart = val.split('?')[1]; // gets the first part after the ?\n\n if ('undefined' === typeof extractFirstPart) {\n return WEB_VIEW_REASON.UN_DEFINED;\n }\n\n let allowedPattern = /^reason=([0-9]{1,2})/,\n matchedURL = extractFirstPart.match(allowedPattern),\n reasonID = Array.isArray(matchedURL) ? Number(matchedURL[1]) : false;\n\n return reasonID;\n }\n\n}\n\nexport default SecondWebView;","import BaseWebView from './base_web_view';\nimport {WEB_VIEW_IDS} from './web_view_manager_consts';\nimport {WEB_VIEW_INFO, WEB_VIEW_REASON} from './web_view_manager_consts';\nimport {KEY_NAME} from '../../native/native_const';\n\nclass SafariWebView extends BaseWebView {\n\n static CLASS = 'SafariWebView';\n\n /**\n * isValidId\n * return return true if the id of safari is correct\n */\n isValidId() {\n return WEB_VIEW_IDS.SAFARI_ID === this._id;\n }\n\n /**\n * onHybridCall - call from hybrid\n * data example: {type: \"webviewmanagerfeature\", action: \"closesafari\", webid: 1000}\n */\n onHybridCall(data) {\n let reason = this.getReason(data);\n switch (reason) {\n case WEB_VIEW_REASON.CLOSE_BUT_CLICKED:// close but clicked\n this.onclose();\n break;\n case WEB_VIEW_REASON.CLOSE_BY_WEB: // close call by web\n this.onclose();\n break;\n default:\n // maybe should throw an Exception here\n break;\n }\n }\n\n /**\n * get Reason to act with the currect action\n * data example: {type: \"webviewmanagerfeature\", action: \"closesafari\", webid: 1000}\n */\n getReason(data) {\n let val = data[KEY_NAME.ACTION];\n if (WEB_VIEW_INFO.CLOSE_BUT_CLICKED === val) {\n return WEB_VIEW_REASON.CLOSE_BUT_CLICKED;\n } else if (WEB_VIEW_INFO.CLOSE_CALLED_BY_WEB === val) {\n return WEB_VIEW_REASON.CLOSE_BY_WEB;\n }\n\n return WEB_VIEW_REASON.UN_DEFINED;\n }\n\n}\n\nexport default SafariWebView;","import BaseModel from '../../../../base/base_model';\nimport {WEB_VIEW_TYPES} from './web_view_manager_consts';\nimport Device from '../../../../utils/device/device';\nimport MasterWebView from './master_web_view';\nimport SecondWebView from './second_web_view';\nimport SafariWebView from './safari_web_view';\nimport {WEB_VIEW_INFO, WEB_VIEW_IDS, DEVICE_SHIFTS, WINDOW_ELEMENTS} from './web_view_manager_consts';\nimport _ from '../../../../utils/underscore';\nimport {KEY_NAME} from '../../native/native_const';\nimport ServiceFactory from \"../../../service_factory\";\nimport {HYBRID_EMBEDDED_NAV_MENU} from \"../../../../../../app-react/components/bottom-navigation-bar/bottom-navigation-bar-consts\";\n\n\n\n\nclass WebViewManager extends BaseModel {\n\n static CLASS = 'WebViewManager';\n\n _isFeatureGameEnable = false;\n _isFeatureCasheirEnable = false;\n _ListWebViews = [];\n\n _displayHybridTimeout = -1;\n _frameOffsetTopGameDemoY = 0;\n _frameOffsetTopGameY = 0;\n _frameGameRealPortrate = 0;\n _frameGameDemoPortrate = 0;\n _frameOffsetTopSportY = 0;\n _frameOffsetTopSportPortrateY = 0;\n _frameOffsetTopSportPortrate = 0;\n _frameOffsetTopLandScapeY = null;\n _frameOffsetTopPortrateY = null;\n _frameOffsetTopPortrateIphoneX = null;\n _frameOffsetTopCashierY = 0;\n _frameOffsetBottomCashierY = 0;\n _displayGameTimeOut = 0;\n _butInitGame = false;\n _butInitCashier = false;\n _butInitSport = 'false';\n _butRtl = true;\n _butW = 0;\n _butH = 0;\n _butX = 0;\n _butY = 0;\n _but_landscape_x = 0;\n _but_landscape_y = 0;\n _nLocalHostPort = 0;\n _allHtmlCompiledGames = '';\n _ndpToPx = 1;\n\n\n init(params) {\n\n this._initParams(params);\n\n super.init(params);\n }\n\n _initParams(params) {\n\n if (Device.hybrid.isHybrid) {\n if (Device.os.isIOS) {\n params = params.ios;\n } else if (Device.os.isAndroid) {\n params = params.android;\n }\n }\n\n if(undefined === params){\n return;\n }\n\n\n this._isFeatureGameEnable = 'true' === params.enable_game;\n this._isFeatureCasheirEnable = 'true' === params.enable_casheir;\n this._displayHybridTimeout = params.display_hybrid_timeout;\n\n if (this._isFeatureGameEnable || this._isFeatureCasheirEnable) {\n this._displayGameTimeOut = params.display_game_time_out;\n this._frameOffsetTopGameDemoY = params.frame_offset_top_game_demo_y;\n this._frameOffsetTopGameY = params.frame_offset_top_game_real_y;\n this._frameGameRealPortrate = params.game_r_portrate;\n this._frameGameDemoPortrate = params.game_d_portrate;\n this._frameOffsetTopSportPortrateY = params.game_sport_portrate;\n this._frameOffsetTopSportY = params.frame_offset_top_sport_y;\n\n this._frameOffsetTopLandScapeY = params.iphoneXtopLandScapeY;\n if(Device.isIphoneX()) {\n this._frameOffsetTopPortrateIphoneX = params.iphoneXtopPortrateY;\n } else {\n this._frameOffsetTopPortrateY = params.iphonetopPortrateY;\n }\n this._frameOffsetTopCashierY = params.frame_offset_top_cashier_y;\n this._frameOffsetBottomCashierY = params.frame_offset_bottom_cashier_y;\n this._butInitSport = params.but_initSport;\n this._butInitGame = params.but_initGame;\n this._butInitCashier = params.but_initCashier;\n this._butRtl = params.but_rtl;\n\n if(Device.isIphoneX() && undefined !== params.iphonex) {\n params = params.iphonex;\n this._but_landscape_x = params.but_landscape_x;\n this._but_landscape_y = params.but_landscape_y;\n }\n\n this._butW = params.but_w;\n this._butH = params.but_h;\n this._butX = params.but_x;\n this._butY = params.but_y;\n }\n }\n\n getDisplayHybridTimeout() {\n return this._displayHybridTimeout;\n }\n /**\n * is Feature Game Enable\n * return true if enable\n */\n isFeatureGameEnable() {\n return this._isFeatureGameEnable;\n }\n\n /**\n * disable the Feature Game\n */\n setFeatureGameDisable() {\n this._isFeatureGameEnable = false;\n }\n\n /**\n * is Feature Casheir Enable\n * return true if enable\n */\n isFeatureCasheirEnable() {\n return this._isFeatureCasheirEnable;\n }\n\n /**\n * init the WebView\n * type exmmple open game: 1\n * id exmmple open game: 1\n */\n initWebView(type, id, parent) {\n\n let webview = null;\n\n let params = {\n 'id': id,\n 'type': type,\n 'parent': parent\n };\n\n switch (type) {\n case WEB_VIEW_TYPES.MASTER:\n webview = MasterWebView.create(params);\n break;\n case WEB_VIEW_TYPES.SECOND:\n webview = SecondWebView.create(params);\n break;\n case WEB_VIEW_TYPES.SAFARI:\n webview = SafariWebView.create(params);\n break;\n default:\n // maybe should throw an Exception here\n break;\n }\n\n return this._addToList(webview);\n }\n\n /**\n * remove the webView\n * webview: to be removed\n */\n remove(webview) {\n let id = webview.getWebId();\n for (let index = 0; index < this._ListWebViews.length; index++) {\n if (id === this._ListWebViews[index].getWebId()) {\n this._ListWebViews.splice(index, 1);\n webview = null;\n return;\n }\n }\n }\n\n /**\n * add To List of all WebViews\n * webview: to be added\n */\n _addToList(webview) {\n\n if (this._isValid(webview)) {\n this._ListWebViews.push(webview);\n } else {\n webview = null;\n }\n\n return webview;\n\n // alert('Id: ' + webview.getWebId() + ' Type: ' + webview.getType());\n }\n\n /**\n * is Valid - check if the VebView is valid, if not already exist and the type + id are in range\n * webview: to be checked\n */\n _isValid(webview) {\n if (null !== webview && !this._isAlreadyExist(webview) && webview.isValidId()) {\n return true;\n }\n\n return false;\n }\n\n /**\n * get all Open webViews - get the list of all WebViews\n * return allWebViews list\n */\n getallOpenwebViews() {\n\n let allWebViews = [];\n for (let ii = 0; ii < this._ListWebViews.length; ii++) {\n if (0 !== this._ListWebViews[ii].getWebId()) {\n allWebViews.push(this._ListWebViews[ii]);\n }\n }\n\n return allWebViews;\n }\n\n /**\n * is Already Exist - check if the WebView already exist in list\n * webview - to be checked\n * return bool\n */\n _isAlreadyExist(webview) {\n\n let newId = webview.getWebId();\n\n for (let ii = 0; ii < this._ListWebViews.length; ii++) {\n if (newId === this._ListWebViews[ii].getWebId()) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * get WebView By Id - find the WebView by his id\n * id: the webView id\n * return webview\n */\n getWebViewById(id) {\n\n for (let ii = 0; ii < this._ListWebViews.length; ii++) {\n if (id === this._ListWebViews[ii].getWebId()) {\n return this._ListWebViews[ii];\n }\n }\n\n return null;\n }\n\n /**\n * fill Widget - add the Widget relevant info\n * obj: object with general info\n * return obj\n */\n filWidgetInfo(obj,bShowCloseBut) {\n\n obj[WEB_VIEW_INFO.TYPE] = WEB_VIEW_TYPES.SECOND;\n obj[WEB_VIEW_INFO.ID] = WEB_VIEW_IDS.DEPOSIT_WIDGET_ID;\n\n if(bShowCloseBut) {\n obj[WEB_VIEW_INFO.BUT_INIT] = this._butInitGame;\n obj = this._fillCloseButInfo(obj);\n }\n return obj;\n }\n\n /**\n * fill Cashier Info - add the casheir relevant info\n * obj: object with general info\n * return obj\n */\n fillCashierInfo(obj) {\n\n obj[WEB_VIEW_INFO.FRAME_OFFSET_TOP_Y] = this._frameOffsetTopCashierY;\n obj[WEB_VIEW_INFO.FRAME_OFFSET_BOTTOM_Y] = this._frameOffsetBottomCashierY;\n obj[WEB_VIEW_INFO.TYPE] = WEB_VIEW_TYPES.SAFARI;\n obj[WEB_VIEW_INFO.ID] = WEB_VIEW_IDS.SAFARI_ID;\n obj[WEB_VIEW_INFO.BUT_INIT] = this._butInitCashier;\n obj = this._fillCloseButInfo(obj);\n\n return obj;\n }\n\n /**\n * fill game Info - add the game relevant info\n * obj: object with general info\n * gameTimeOut: ovverite the curent display game timeout\n * return obj\n */\n fillGameInfo(obj, gameTimeOut) {\n let bReal = ServiceFactory.create().oAuth2Service().isAuthorized();\n obj[WEB_VIEW_INFO.FRAME_OFFSET_TOP_Y] = bReal ? this._frameOffsetTopGameY : this._frameOffsetTopGameDemoY;\n obj[WEB_VIEW_INFO.FRAME_OFFSET_TOP_PORTRATE_Y] = bReal ? this._frameGameRealPortrate : this._frameGameDemoPortrate;\n obj[WEB_VIEW_INFO.TYPE] = WEB_VIEW_TYPES.SECOND;\n obj[WEB_VIEW_INFO.ID] = this._getNextGameId();\n obj[WEB_VIEW_INFO.TAP_KEEP_ALIVE] = 'true';\n obj[WEB_VIEW_INFO.BUT_INIT] = this._butInitGame;\n obj[WEB_VIEW_INFO.DISPLAY_GAME_TIME_OUT] = undefined !== gameTimeOut ? gameTimeOut : this._displayGameTimeOut;\n obj = this._fillGTValues(obj);\n obj = this._fillCloseButInfo(obj);\n\n return obj;\n }\n\n _fillGTValues(obj){\n\n obj[WEB_VIEW_INFO.FRAME_TOP_LANDSCAPE_Y] = this._frameOffsetTopLandScapeY;\n obj[WEB_VIEW_INFO.FRAME_TOP_PORTRATE_Y] = this._frameOffsetTopPortrateY;\n obj[WEB_VIEW_INFO.FRAME_TOP_PORTRATE_IPHONE_X] = this._frameOffsetTopPortrateIphoneX;\n\n return obj;\n }\n\n fillSportInfo(obj) {\n obj[WEB_VIEW_INFO.REMOTE_URL] = 'true';\n obj[WEB_VIEW_INFO.WINDOW_ELEMENT] = WINDOW_ELEMENTS.SPORT;\n obj[WEB_VIEW_INFO.TYPE] = WEB_VIEW_TYPES.SECOND;\n obj[WEB_VIEW_INFO.ID] = this._getNextGameId();\n obj[WEB_VIEW_INFO.BUT_INIT] = this._butInitSport;\n\n return obj;\n }\n\n getEmbeddedNavMenuHeight(){\n const bottomMenu = document.querySelector(`.${HYBRID_EMBEDDED_NAV_MENU}`);\n const offsetHeight = bottomMenu ? bottomMenu.offsetHeight : DEVICE_SHIFTS.IPHONE_DEFAULT;\n\n return offsetHeight;\n }\n\n addSportCommonInfo(obj){\n obj[WEB_VIEW_INFO.SHIFT_FROM_BOTTOM] = this.getEmbeddedNavMenuHeight() * this._ndpToPx;\n\n return obj;\n }\n\n _addSpecificDeviceAdaptations(obj){\n\n if(DEVICE_SHIFTS.ANDROID_S9_HEIGHT === window.innerHeight && DEVICE_SHIFTS.ANDROID_S9_WIDTH === window.innerWidth){//android s9\n switch(this._ndpToPx){\n case DEVICE_SHIFTS.ANDROID_S9_DENSITY_2:\n obj[WEB_VIEW_INFO.ANDROID_PORTRATE_NAV_BAR_DISPLAY] = DEVICE_SHIFTS.ANDROID_S9_DP_2;\n break;\n case DEVICE_SHIFTS.ANDROID_S9_DENSITY_4:\n obj[WEB_VIEW_INFO.ANDROID_PORTRATE_NAV_BAR_DISPLAY] = DEVICE_SHIFTS.ANDROID_S9_DP_4;\n break;\n default:\n }\n } else if(DEVICE_SHIFTS.ANDROID_S9_HEIGHT === window.innerWidth && DEVICE_SHIFTS.ANDROID_S9_WIDTH === window.innerHeight){\n obj[WEB_VIEW_INFO.ANDROID_LANDSCAPE] = DEVICE_SHIFTS.ANDROID_S9_LANDSCAPE;\n }\n\n return obj;\n }\n\n addAndroidInfo(obj) {\n\n obj[WEB_VIEW_INFO.ANDROID_PORTRATE] = DEVICE_SHIFTS.ANDROID_DEFAULT;\n obj[WEB_VIEW_INFO.ANDROID_LANDSCAPE] = DEVICE_SHIFTS.ANDROID_DEFAULT;\n obj[WEB_VIEW_INFO.ANDROID_PORTRATE_NAV_BAR_DISPLAY] = DEVICE_SHIFTS.ANDROID_PORTRATE_NAV_BAR_DISPLAY;\n obj[WEB_VIEW_INFO.ANDROID_PORTRATE_NAV_BAR_NOT_DISPLAY] = DEVICE_SHIFTS.ANDROID_PORTRATE_NAV_BAR_NOT_DISPLAY;\n\n obj = this._addSpecificDeviceAdaptations(obj);\n\n return this.addSportCommonInfo(obj);\n }\n\n addIosInfo(obj){\n obj = this.addSportCommonInfo(obj);\n obj[WEB_VIEW_INFO.IPHONE_X_PORTRATE] = DEVICE_SHIFTS.IPHONE_X_PORTRATE;\n obj[WEB_VIEW_INFO.IPHONE_X_LANDSCAPE] = DEVICE_SHIFTS.IPHONE_X_LANDSCAPE;\n obj[WEB_VIEW_INFO.IPHONE_X_12_PRO_LANDSCAPE] = DEVICE_SHIFTS.IPHONE_X_12_PRO_LANDSCAPE;\n\n return obj;\n }\n\n fillSportInfoInSecondWebView(obj) {\n obj = this.fillSportInfo(obj);\n\n if(Device.os.isIOS) {\n obj = this.addIosInfo(obj);\n }else if(Device.os.isAndroid){\n obj = this.addAndroidInfo(obj);\n obj[WEB_VIEW_INFO.BUT_X] = DEVICE_SHIFTS.ANDROID_X_BUTL;\n }\n\n return obj;\n }\n\n /**\n * fill Close But Info - add the Close But relevant info\n * obj: object with general info\n * return obj\n */\n _fillCloseButInfo(obj) {\n\n obj[WEB_VIEW_INFO.BUT_RTL] = this._butRtl;\n obj[WEB_VIEW_INFO.BUT_W] = this._butW;\n obj[WEB_VIEW_INFO.BUT_H] = this._butH;\n obj[WEB_VIEW_INFO.BUT_X] = this._butX;\n obj[WEB_VIEW_INFO.BUT_Y] = this._butY;\n obj[WEB_VIEW_INFO.BUT_LANDSCARE_X] = this._but_landscape_x;\n obj[WEB_VIEW_INFO.BUT_LANDSCARE_Y] = this._but_landscape_y;\n\n return obj;\n }\n\n /**\n * get Next Game Id: look for the next free game id\n * return next Id\n */\n _getNextGameId() {\n let nWebId, nextId = WEB_VIEW_IDS.GAME_ID;\n\n for (let ii = 0; ii < this._ListWebViews.length; ii++) {\n if ( this._ListWebViews[ii].getType() === WEB_VIEW_TYPES.SECOND) {\n nWebId = this._ListWebViews[ii].getWebId();\n nextId = Math.max(nextId, nWebId + 1);\n }\n }\n return nextId;\n }\n\n getDpToPx(data, dpToPx) {\n\n data = _.safeJSONandDecode(data);\n\n let error = data[KEY_NAME.ERROR];\n if (error !== 0) {\n return dpToPx;\n }\n\n let keyData = data[KEY_NAME.DATA];\n if (undefined !== keyData) {\n dpToPx = keyData[KEY_NAME.DP_TO_PX];\n }\n\n this._ndpToPx = dpToPx;\n\n return dpToPx;\n }\n\n getCompiledGamesList(data) {\n data = _.safeJSONandDecode(data);\n\n let error = data[KEY_NAME.ERROR];\n if (error !== 0) {\n return '';\n }\n\n let keyData = data[KEY_NAME.DATA];\n if (undefined !== keyData) {\n\n let allHtmlCompiledGames = keyData[KEY_NAME.MSG];\n if (allHtmlCompiledGames.length > 0) {\n this._nLocalHostPort = keyData[KEY_NAME.PORT];\n }\n return allHtmlCompiledGames;\n }\n\n return '';\n }\n\n getLocalHostPortPort() {\n return this._nLocalHostPort;\n }\n}\n\nexport default WebViewManager;\n","import BaseObject from '../../../../base/base_object';\nimport Model from './web_view_manager_model';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\nimport Event from '../../../../utils/event';\nimport DOM from '../../../../utils/dom';\nimport {WEB_VIEW_TYPES, WEB_VIEW_IDS, WEB_VIEW_INFO} from './web_view_manager_consts';\nimport {KEY_NAME} from '../../native/native_const';\nimport ServiceFactory from '../../../service_factory';\nimport Device from \"../../../../utils/device/device\";\nimport {Check} from \"@sparkware/app-utils\";\n\nconst PX_DEFAULT = 1;\n\nclass WebViewManager extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'WebViewManager';\n\n _model = null;\n _HybridService = null;\n _displayHybridTimeout = null;\n _ndpToPx = PX_DEFAULT;\n\n\n init(params) {\n\n super.init();\n\n this._model = Model.create(params);\n\n this._model.initWebView(WEB_VIEW_TYPES.MASTER, WEB_VIEW_IDS.MASTER_ID,this);\n\n this._subscribe();\n\n }\n\n initFeatures(hybridSrv) {\n this._HybridService = hybridSrv;\n let webView = this._model.getWebViewById(WEB_VIEW_TYPES.MASTER);\n webView.setCbFunctions(this._HybridService);\n this.setHybridDisplayTimeOut();\n this.getDpToPx();\n return this;\n }\n\n getDpToPx() {\n this._HybridService.getDpToPx().then(data => {\n this._ndpToPx = this._model.getDpToPx(data, PX_DEFAULT);\n })\n }\n\n _getLogger() {\n return ServiceFactory.create().structuredLoggingService().getLogger();\n }\n\n /**\n * disable the Feature Game\n */\n setFeatureGameDisable() {\n this._model.setFeatureGameDisable();\n\n Event.off(SYSTEM_EVENTS.WEB_VIEW_NAVIGATE_GAME, this.openGame, this);\n\n let logger = this._getLogger();\n logger && logger.setEventType('hybrid_psp_redirect_disable').info();\n\n Event.off(SYSTEM_EVENTS.WEB_VIEW_NAVIGATE_DEPOSIT_WIDGET, this.openDepositWidget, this);\n Event.off(SYSTEM_EVENTS.WEB_VIEW_NAVIGATE_MIT_ID, this.openMitId, this);\n\n\n Event.off(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, this._onOauthStateChange, this);\n Event.off(SYSTEM_EVENTS.DEEPLINK_RECEIVED, this._onPushMsgArrived, this);\n Event.off(SYSTEM_EVENTS.SECOND_WEB_VIEW_CLOSE_ALL, this._closAllWebViews, this);\n }\n\n _subscribe() {\n if (this._model.isFeatureGameEnable()) {\n Event.on(SYSTEM_EVENTS.WEB_VIEW_NAVIGATE_GAME, this.openGame, this);\n Event.on(SYSTEM_EVENTS.SECOND_WEB_VIEW_CLOSE_ALL, this._closAllWebViews, this);\n }\n\n if (this._model.isFeatureCasheirEnable()) {\n Event.on(SYSTEM_EVENTS.WEB_VIEW_NAVIGATE_CASHIER, this._openCashierDirect, this);\n }\n\n if (this._model.isFeatureGameEnable() || this._model.isFeatureCasheirEnable()) {\n Event.on(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, this._onOauthStateChange, this);\n Event.on(SYSTEM_EVENTS.DEEPLINK_RECEIVED, this._onPushMsgArrived, this);\n }\n\n\n Event.on(SYSTEM_EVENTS.SECOND_WEB_VIEW_NAVIGATE_SPORT, this._openSport, this);\n Event.on([SYSTEM_EVENTS.SCREEN_CHANGE_STATE, SYSTEM_EVENTS.SCREEN_RESIZE_CHANGED], this._onScreenState, this);\n }\n\n /**\n * set the Hybrid Display TimeOut\n * display the hybrid after timeout if the client didn't call it before.\n */\n setHybridDisplayTimeOut() {\n let timeOut = this._model.getDisplayHybridTimeout();\n if (timeOut >= 0) {\n this._displayHybridTimeout = DOM.setTimeout(() => {\n this._HybridService.displayHybrid();\n }, timeOut);\n }\n }\n\n setDepositWidgetSupported(){\n Event.on(SYSTEM_EVENTS.WEB_VIEW_NAVIGATE_DEPOSIT_WIDGET, this.openDepositWidget, this);\n Event.on(SYSTEM_EVENTS.WEB_VIEW_NAVIGATE_MIT_ID, this.openMitId, this);\n }\n\n /**\n * clear the Hybrid Display TimeOut\n */\n clearHybridDisplayTimeOut() {\n if (this._displayHybridTimeout) {\n DOM.clearTimeout(this._displayHybridTimeout);\n this._displayHybridTimeout = null;\n }\n }\n\n /**\n * check if device support the SecondWebView\n * return bool\n */\n\n isNativeSupportSecondWebView() {\n return this._model.isFeatureGameEnable();\n }\n\n\n /**\n * check if device support the SafariCashier\n * return bool\n */\n\n isNativeSupportSafariCashier() {\n return this._model.isFeatureCasheirEnable();\n }\n\n /**\n * hybrid direct call\n * data example: {hybridcbfeaturefunc: \"WebViewManagerFeature\", webid: \"1\", action: \"https://mirage.navigation-center.com/SharedNavigat…ackage%22%3A%2292%22%2C%22UserInfo%22%3A%22%22%7D\"}\n */\n\n onHybridDirectCall(data) {\n let nId = Number(data[KEY_NAME.WEB_ID]);\n\n let webView = this._model.getWebViewById(nId);\n\n if (webView) {\n webView.onHybridDirectCall(data);\n }\n\n return webView;\n }\n\n openExternalLink(url) {\n this._HybridService.openExternalLink(url);\n }\n\n /**\n * get the url as an object\n * url: the url to convert to obj\n * bEncode: true = encode the url\n * return obj\n */\n _getObjUrl(url, bEncode) {\n if(true === bEncode){\n url = encodeURIComponent(url);\n }\n return {[WEB_VIEW_INFO.URL]: url};\n }\n\n openLinksAccomplished(webId, webType) {\n this._HybridService.openLinksAccomplished(webId, webType);\n }\n\n /**\n * open game - add the parameters for game\n * url: the url of game\n */\n openGame(url, gameTimeOut) {\n const obj = this._getObjUrl(url, true);\n\n this.fillFrameOffset(obj).then((objWithFrameOffset)=> {\n const filledObj = this._model.fillGameInfo(objWithFrameOffset, gameTimeOut);\n this._navigate(filledObj);\n });\n }\n\n openWidget(url,bShowCloseBut) {\n\n let logger = this._getLogger();\n logger && logger.setEventType('hybrid_psp_redirect_handle_open').info();\n\n const obj = this._getObjUrl(url, false);\n\n this.fillFrameOffset(obj).then((objWithFrameOffset)=> {\n const filledObj = this._model.filWidgetInfo(objWithFrameOffset,bShowCloseBut);\n this._navigate(filledObj);\n });\n\n this._HybridService.closeNyxODRGame();\n }\n\n /**\n * open Deposit Widget - add the parameters for game\n * url: empty\n */\n openDepositWidget(url) {\n\n this.openWidget(url,true);\n\n this._HybridService.closeNyxODRGame();\n }\n\n openMitId(url){\n this.openWidget(url,false);\n }\n\n isDepositWidgetSupported(){\n return this._HybridService.isDepositWidgetSupported();\n }\n\n /**\n * get UrlScheme form Webview\n * return: the url scheme\n */\n _getUrlScheme() {\n return this._HybridService.getUrlScheme() + '://';\n }\n\n getUrlSchemeToOpen() {\n return this._HybridService.getUrlScheme() + '://';\n }\n\n /**\n * get Params For Casheir - build all the parameters to identify casheir\n * return: urlscheme + parameters for casheir\n */\n getParamsForCasheir() {\n\n let params = {\n [WEB_VIEW_INFO.TYPE]: 'WebViewManagerFeature',\n [WEB_VIEW_INFO.ACTION]: WEB_VIEW_INFO.CLOSE_CALLED_BY_WEB,\n [WEB_VIEW_INFO.ID]: WEB_VIEW_IDS.SAFARI_ID\n };\n\n let strJson = JSON.stringify(params)\n let uri = encodeURIComponent(strJson);\n\n let urlScheme = this.getUrlSchemeToOpen();\n let str = urlScheme + uri;\n\n return str;\n }\n\n /**\n * open Casheir - add the parameters for Casheir\n * url: the url of Casheir\n */\n openCasheir(url) {\n let obj = this._getObjUrl(url, false);\n\n obj = this._model.fillCashierInfo(obj);\n\n this._navigate(obj);\n }\n\n async _getHeaderHeight() {\n const headerRegulationDataElement = await ServiceFactory.create().integrationService().getHeaderRegulationDataElement()\n return headerRegulationDataElement.getBoundingClientRect().top + headerRegulationDataElement.offsetHeight;\n }\n\n async fillFrameOffset(obj) {\n const headerHeight = await this._getHeaderHeight();\n obj[KEY_NAME.HEADER_HEIGHT] = headerHeight * this._ndpToPx;\n return obj;\n }\n /**\n * open Sport - add the parameters for Sport\n * url: the url of Sport\n */\n _openSport(url) {\n\n let obj = this._getObjUrl(url, true);\n\n const sportObj = this._model.fillSportInfoInSecondWebView(obj);\n\n //this._HybridService.alert('dpToPx: ' + this._ndpToPx + ' Height: ' + window.innerHeight + ' Width: ' + window.innerWidth);\n\n this._navigate(sportObj);\n }\n\n closeSecondWebView(){\n this._closAllWebViews();\n }\n\n\n /**\n * open Cashier Direct with a url\n * url: the url of Casheir\n */\n _openCashierDirect(url) {\n\n let str = this.getParamsForCasheir();\n\n this.openCasheir(url + str);\n }\n\n /**\n * navigate to second webview\n * obj: the obj of game/Casheir\n * obj example: {url: \"https://mirage.navigation-center.com/SharedNavigat…ackage%22%3A%2292%22%2C%22UserInfo%22%3A%22%22%7D\", frameOffsetTopY: 0, type: 1, webid: 1, tapKeepAlive: \"true\", …}\n */\n _navigate(obj) {\n let webview = this._model.initWebView( obj[WEB_VIEW_INFO.TYPE], obj[WEB_VIEW_INFO.ID], this);\n\n if (null !== webview) {\n\n obj[WEB_VIEW_INFO.ID] = webview.getWebId();\n this._HybridService.navigateWebView(obj);\n webview.setCbFunctions(this._HybridService);\n\n this._showWithTimeOut(webview, obj);\n\n window.scrollTo(0, 0);\n } else if(WEB_VIEW_IDS.DEPOSIT_WIDGET_ID === obj[WEB_VIEW_INFO.ID]) {\n let logger = this._getLogger();\n logger && logger.setEventType('hybrid_psp_redirect_no_webview').error();\n }\n }\n\n /**\n * show the Loader and close at timeout\n * obj: the obj of game/Casheir\n * webview: the current webview\n */\n _showWithTimeOut(webview, obj) {\n\n const isDepositPSPRedirect = WEB_VIEW_IDS.DEPOSIT_WIDGET_ID === obj[WEB_VIEW_INFO.ID];\n\n let timeOut = obj[WEB_VIEW_INFO.DISPLAY_GAME_TIME_OUT] || 0;\n\n if(isDepositPSPRedirect){\n const logger = this._getLogger();\n logger && logger.setEventType('hybrid_psp_redirect_showWithTimeout_start')\n .addCustomData({\n timeout: timeOut,\n depositWindowData: obj\n })\n .info();\n }\n\n\n DOM.setTimeout(() => {\n obj[WEB_VIEW_INFO.TYPE] = webview.getType();\n let logger = this._getLogger();\n logger && logger.setEventType('hybrid_psp_redirect_showWithTimeout_end')\n .addCustomData({\n timeout: timeOut,\n depositWindowData: obj\n });\n\n try {\n this._show(obj);\n if(isDepositPSPRedirect) {\n logger && logger.info();\n }\n } catch (err) {\n if(isDepositPSPRedirect) {\n logger && logger.addCustomData({\n errorDetails: err\n }).error();\n }\n throw err;\n }\n\n }, timeOut);\n }\n\n\n /**\n * close WebView\n * webview: the webview to close\n */\n onclose(webview) {\n let obj = {};\n obj[WEB_VIEW_INFO.ID] = webview.getWebId();\n this._model.remove(webview);\n Event.fire(SYSTEM_EVENTS.SECOND_WEB_VIEW_CLOSE);\n this._HybridService.closeWebView(obj);\n }\n\n /**\n * on OauthStateChange - called when the status is changed\n * if we are logged out - we will close all the open WebVeiws\n */\n _onOauthStateChange() {\n if (false === ServiceFactory.create().oAuth2Service().isAuthorized()) {\n this._closAllWebViews();\n }\n }\n\n /**\n * on Push Msg Arrived - called when the push message arrive from hybrid\n */\n _onPushMsgArrived(){\n this._closAllWebViews();\n }\n\n _onOrientationStateInit(){\n\n let str = Device.isPortrait ? 'portrait' : '';\n this._onScreenState(str);\n }\n\n async _onScreenState(addOrientationState){\n let isPortrate = false;\n if(!Check.isNullOrUndefined(addOrientationState)) {\n isPortrate = 'portrait' === addOrientationState;\n } else {\n isPortrate = Device.isPortrait;\n }\n\n let allWebViews = this._model.getallOpenwebViews();\n\n for (let ii = 0; ii < allWebViews.length; ii++) {\n let webView = allWebViews[ii];\n\n let obj = {\n [WEB_VIEW_INFO.TYPE]: webView.getType(),\n [WEB_VIEW_INFO.ID]: webView.getWebId(),\n [WEB_VIEW_INFO.ORIENTATION]: isPortrate,\n [WEB_VIEW_INFO.HEADER_HEIGHT]: await this._getHeaderHeight()\n };\n\n if(Device.os.isIOS) {\n obj = this._model.addIosInfo(obj);\n }else if(Device.os.isAndroid){\n obj = this._model.addAndroidInfo(obj);\n }\n this._HybridService.updateScreenSize(obj);\n }\n }\n\n _closAllWebViews(){\n let allWebViews = this._model.getallOpenwebViews();\n\n for (let ii = 0; ii < allWebViews.length; ii++) {\n let webView = allWebViews[ii];\n this.onclose(webView);\n }\n\n this._HybridService.closeNyxODRGame();\n }\n\n /**\n * show the WebView\n */\n _show(obj) {\n Event.fire(SYSTEM_EVENTS.SECOND_WEB_VIEW_OPEN);\n this._HybridService.showWebView(obj);\n\n\n this._onOrientationStateInit();\n }\n}\n\nexport default WebViewManager;\n","import BaseObject from '../../../base/base_object';\nimport {KEY_NAME} from './native_const';\nimport _ from '../../../utils/underscore'; // eslint-disable-line id-length\n\n\n/**\n * The Native is responsible to sent the message to the correct hybrid(IOS,Android)\n * The Native create a unique temporary function on the main window(to save the context of the calback function).\n * The Native will delete the temporary function after he call it.\n */\nclass Native extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'Native';\n\n\n /**\n * @property\n * @type {int}\n * @private\n */\n _idd = 0;\n\n _parent = null;\n\n\n /**\n * Get the function Id\n *\n * @returns {int} - Returns the next(unique) id\n */\n getID() {\n this._idd++;\n\n return 'hybridCallback' + this._idd;\n }\n\n /**\n * Entry point to recive calls from hybrid.\n *\n * @param parent: the HybridService;\n * @param params: parameters in json format.\n */\n initHybridDirectCall(parent) {\n this._parent = parent;\n window[KEY_NAME.HYBRID_CB_GLOBAL_NAME] = (params) => {\n params = this.getParams(params);\n this._parent.onHybridDirectCall(params);\n };\n }\n\n /**\n * Entry point to send calls for hybrid & back.\n *\n * @param serviceFuncName: the service name + function name for exp: WebView_Webshow:\n * WebView - service name.\n * WebShow - function name.\n * @param jsonParams: parameters in json format.\n * @returns {Promise}\n */\n msgToHybrid(serviceFuncName, jsonParams = {}) {\n return new Promise((resolve) => {\n let autoGeneratedCBID = this.getID();\n this.logger.info([\n 'Hybrid Call:',\n 'Request ID: ' + autoGeneratedCBID,\n 'Method: ' + serviceFuncName,\n 'Params: ' + JSON.stringify(jsonParams)\n ]);\n window[autoGeneratedCBID] = function(id, callback, self, serviceName) {\n return params => {\n params = self.getParams(params);\n let allParams = _.safeJSONandDecode(params);\n self.logger.info([\n 'Hybrid Response:',\n 'Request ID: ' + id,\n 'Service: ' + serviceName,\n 'Params: ' + allParams,\n 'Error: ' + allParams[KEY_NAME.ERROR]\n ]);\n callback(params);\n delete window[id];\n };\n }(autoGeneratedCBID, resolve, this, serviceFuncName);\n\n let extractFunctionName = this._extractFunctionConvenstion(serviceFuncName),\n payloadForHybrid = Object.assign({}, jsonParams, {\n [KEY_NAME.SRV]: extractFunctionName.service,\n [KEY_NAME.FUNC]: extractFunctionName.method,\n [KEY_NAME.FUNC_CB]: autoGeneratedCBID\n });\n this.callToHandler(payloadForHybrid);\n });\n }\n\n /**\n * Converts string name into a convention call. String input example: WEBVIEW_INIT\n * In this case Class is: WEBVIEW and method is INIT.\n *\n * @param {String} serviceFuncName - underscore seperated string\n * @returns {Object} - {service: {*}, method: {*}}\n * @private\n */\n _extractFunctionConvenstion(serviceFuncName) {\n let extractFunctionName = serviceFuncName.split('_');\n\n return {\n service: extractFunctionName[0],\n method: extractFunctionName[1]\n };\n }\n\n callToHandler() {\n }\n getParams(params) {\n return '';\n }\n}\n\nexport default Native;\n\n\n","import Native from './native';\n\n\n/**\n *\n *\n */\nclass NativeIOS extends Native {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'NativeIOS';\n static METHOD_NAME_IOS = 'cbCallBackHandlerCGP';\n\n\n /**\n *\n * @param json - parameters to hybrid\n * @public\n */\n callToHandler(json){\n\n json = JSON.stringify(json);\n\n window.webkit.messageHandlers[NativeIOS.METHOD_NAME_IOS].postMessage(json);\n\n return this;\n }\n\n getParams(params) {\n return params;\n }\n}\n\nexport default NativeIOS;\n\n\n","import Native from './native';\n\nclass NativeAndroid extends Native {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'NativeAndroid';\n static METHOD_NAME_IOS = 'cbCallBackHandlerCGP';\n\n /**\n *\n * @param json - parameters to hybrid\n * @public\n */\n callToHandler(json = {}) {\n json = JSON.stringify(json);\n window.WrapperInterfaceCGP[NativeAndroid.METHOD_NAME_IOS](json);\n }\n\n getParams(params) {\n return encodeURIComponent(params);\n }\n}\n\nexport default NativeAndroid;\n\n\n","import Native from './native';\n\n\n/**\n *\n *\n */\nclass NativeIOSPoker extends Native {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'NativeIOSPoker';\n static METHOD_NAME_IOS = 'cbCallBackHandlerCGP';\n\n\n /**\n *\n * @param json - parameters to hybrid\n * @public\n */\n callToHandler(json) {\n json = JSON.stringify(json);\n\n if(window.webkit.messageHandlers[NativeIOSPoker.METHOD_NAME_IOS]) {\n window.webkit.messageHandlers[NativeIOSPoker.METHOD_NAME_IOS].postMessage(json);\n }else{\n this.logger.error(\"NativeIOSPoker.METHOD_NAME_IOS not exist\");\n }\n return this;\n }\n\n getParams(params) {\n return params;\n }\n}\n\nexport default NativeIOSPoker;\n\n\n","import Native from './native';\n\n\n/**\n *\n *\n */\nclass NativeIOSSport extends Native {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'NativeIOSSport';\n static METHOD_NAME_IOS = 'cbCallBackHandlerCGP';\n\n\n /**\n *\n * @param json - parameters to hybrid\n * @public\n */\n callToHandler(json) {\n json = JSON.stringify(json);\n\n window.webkit.messageHandlers[NativeIOSSport.METHOD_NAME_IOS].postMessage(json);\n\n return this;\n }\n\n getParams(params) {\n return params;\n }\n}\n\nexport default NativeIOSSport;\n\n\n","import BaseObject from '../../base/base_object';\nimport NativeIOS from './native/native_ios';\nimport NativeAndroid from './native/native_android';\nimport NativeIOSPoker from './native/native_ios_poker';\nimport Device from '../../utils/device/device';\nimport NativeIOSSport from './native/native_ios_sport';\n\n\n\n/**\n *\n *\n */\nclass HybridFactory extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'HybridFactory';\n\n\n getHybridWrapper() {\n if (!Device.hybrid.isHybrid) {\n return null;\n }\n if (Device.os.isAndroid) {\n this.logger.info('Create Native Android');\n return NativeAndroid.create();\n }\n if (Device.os.isIOS) {\n if (Device.hybrid.inPoker) {\n this.logger.info('Create Native IOS For Poker');\n return NativeIOSPoker.create();\n } else if (Device.hybrid.inSport) {\n this.logger.info('Create Native IOS For Sport');\n return NativeIOSSport.create();\n } else {\n this.logger.info('Create Native IOS');\n return NativeIOS.create();\n }\n }\n return null;\n }\n}\nexport default HybridFactory;","import _ from \"../../utils/underscore\";\nimport Device from \"../../utils/device/device\";\nimport {KEY_NAME, ON_DEMAND} from \"./native/native_const\";\nimport Event from \"../../utils/event\";\nimport {SYSTEM_EVENTS} from \"../../events/events\";\nimport BaseObject from \"../../base/base_object\";\n\n\nexport class WaitForHybridGameStepLogicHandler extends BaseObject {\n static CLASS = 'WaitForHybridGameLogicHandler';\n\n _startTime = 0;\n _folderStruct;\n _sharedFolder;\n _gameType;\n _vendorName = '';\n _companyName = ''\n serviceFactory = null;\n\n init(params) {\n super.init(params);\n this.serviceFactory = params.serviceFactory;\n this._folderStruct = params.folderStruct;\n this._sharedFolder = params.sharedFolder;\n this._gameType = params.gameType;\n this._vendorName = params.vendorName;\n this._companyName = params.companyName;\n }\n\n run() {\n\n const hybrid = this.serviceFactory.hybridService();\n\n if (Device.hybrid.isEmbedded && hybrid.isOnDemandHtmlGame(this._gameType)) {\n\n this._startTime = new Date();\n\n this._sendAnalytics(ON_DEMAND.GAME_LOADING_START, `${this._companyName}_${this._vendorName}_${this._gameType}`);\n\n return hybrid.waitForOnDemandId(this._gameType, this._folderStruct, this._sharedFolder, this._vendorName).then(data => {\n\n let json = _.safeJSONandDecode(data);\n let error = json[KEY_NAME.ERROR];\n if (error !== 0) {\n this._onerror(json, this._gameType , error);\n }\n\n hybrid.saveOnDemandLoadedGame(this._gameType,this._sharedFolder);\n this._sendAnalytics(ON_DEMAND.GAME_LOADING_END, `${this._companyName}_${this._vendorName}_${this._gameType}`);\n });\n }else {\n return Promise.resolve();\n }\n }\n\n _onerror(json, gameType, error) {\n let data = json[KEY_NAME.DATA];\n let action = ON_DEMAND.GAME_LOADING_ERROR;\n if (data) {\n if (data[KEY_NAME.CLOSE_BY_X]) {\n action = ON_DEMAND.GAME_LOADING_CLOSE_BY_X;\n } else if (data[KEY_NAME.CLOSE_BY_TIME_OUT]) {\n action = ON_DEMAND.GAME_LOADING_CLOSE_BY_TIME_OUT;\n } else if (data[KEY_NAME.CLOSE_BY_LOW_DISK_SPACE]) {\n action = ON_DEMAND.GAME_LOADING_CLOSE_BY_LOW_DISK_SPACE;\n Event.fire(SYSTEM_EVENTS.ODR_CLEAR_ALL_GAMES);\n } else if (data[KEY_NAME.CLOSE_NO_CHILL]) {\n action = ON_DEMAND.GAME_LOADING_CLOSE_BY_NO_CHILL;\n }\n }\n\n\n this._sendAnalytics(action, gameType,error);\n this._writeToLog(action, gameType, error);\n\n throw new Error('WaitForHybridGameStep ' + action + 'error:' + error);\n }\n\n _getTime() {\n return Math.floor(((new Date()).getTime() - this._startTime.getTime()) / 1000);\n }\n\n _writeToLog(action, gameType, error) {\n let nTime = this._getTime();\n this.logger.error('Failed to load game from on demand: ' + action + ' gameType: ' + gameType + ' sec: ' + nTime +\"error:\" ,error);\n }\n\n _sendAnalytics(action, gameType, error) {\n let nTime = this._getTime();\n let errorMsg = '';\n if(error){\n errorMsg = ' error msg:' + error;\n }\n\n let obj = {\n category: ON_DEMAND.ON_DEMAND_CATEGORY,\n action: action,\n label: gameType + errorMsg,\n value: nTime\n };\n\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, obj);\n }\n}","import BaseService from '../../base/base_service';\nimport HybridFactory from './hybrid_factory';\nimport {SYSTEM_EVENTS} from '../../events/events';\nimport {SERIVCES_PARAMS_LIST, SERIVCES_FUNC_LIST, KEY_NAME, LOCAL_HOST, OPEN_SETTINGS} from './native/native_const';\nimport DOM from '../../utils/dom';\nimport Device from '../../utils/device/device';\nimport Loader from '../../utils/module_loader';\nimport _ from '../../utils/underscore';\nimport {WEB_VIEW_IDS, WEB_VIEW_INFO} from \"./features/web_view_manager/web_view_manager_consts\";\nimport Event from \"../../utils/event\";\nimport {WaitForHybridGameStepLogicHandler} from \"./wait-for-hybrid-game-step-logic-handler\";\nimport {isInsideAutomation} from \"../../../../utils/automation-helpers\";\n\n\nconst ON_DEMAND_PORT = 8092;\n\n/**\n * The hybrid service initialise the correct hybrid(IOS,Android)\n * The service send messages to the hybrid.\n * The service receive messages from the hybrid - by promise\n *\n *\n */\nclass HybridService extends BaseService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'HybridService';\n\n /**\n * @property\n * @type {class}\n * @private\n */\n _wrapper = null;\n _threedtouchfeature = null;\n _touchidfeature=null;\n _fabricfeature=null;\n _pushfeature=null;\n _ondemandfeature=null;\n _ondemandnyxfeature=null;\n _webviewmanagerfeature=null;\n _hybridinfofeature=null;\n _lexisnexisfeature=null;\n _depositwidgetfeature=null;\n _appflayerfeature=null;\n _firebasefeature=null;\n _schemefeature=null;\n _gamelauncherfeature=null;\n _bDisplayWebView=false;\n _allCompiledGamesMetadata = {};\n _nLocalHostPort=-1;\n _strSmartLinkData=null;\n _smartLink='';\n _bSchemeGameSupported = false;\n _bLocalGameLauncherSupported = false;\n\n\n /**\n *\n * @param params\n */\n init(params) {\n super.init(params);\n\n if (Device.hybrid.isHybrid) {\n this._initWrapper();\n this._initFeatures(params);\n this._subscribe();\n }\n\n if (Device.hybrid.isEmbedded) {\n this._updateHybridCompiledGames();\n }\n }\n\n\n _subscribe() {\n this.onSystemEvent(SYSTEM_EVENTS.ON_INIT_COMPLETE, this.initHybrid);\n this.onSystemEvent(SYSTEM_EVENTS.APP_RESUMED, this.onDisplayWebView);\n this.onSystemEvent(SYSTEM_EVENTS.HYBRID_ALERT, this.alert);\n this.onSystemEvent(SYSTEM_EVENTS.HYBRID_OPEN_MAIL, this.openMail);\n this.onSystemEvent(SYSTEM_EVENTS.CLOSE_GAME, this._closeGame);\n this.onSystemEvent(SYSTEM_EVENTS.LOADING_INDICATOR_EMBEDDED_CLOSED_BY_X, this._onStopProgressBar);\n }\n\n runAutologin(tokenParams) {\n this.serviceFactory.queryStringDetectorService().tokenHandler(tokenParams);\n }\n\n getThreeDTouchFeature() {\n return this._threedtouchfeature;\n }\n getTouchIDFeaturer() {\n return this._touchidfeature;\n }\n\n getPushFeature() {\n return this._pushfeature;\n }\n\n getOnDemandTimeOut() {\n return this._ondemandfeature ? this._ondemandfeature.getTimeOut() : 0;\n }\n\n /**\n * The parames can be stored on window support (for poker...)\n */\n _updateHybridCompiledGames(){\n let gamesMetadata = window['hybridCompiledGamesMetadata'];\n\n if(gamesMetadata !== undefined && 'object' === typeof(gamesMetadata)){\n let port = window['hybridLocalPort'];\n this.setCompiledGamesMetadata(gamesMetadata, port);\n }\n }\n\n /**\n * The games stored in map\"\n */\n\n setCompiledGamesMetadata(gamesMetadata, port) {\n this._allCompiledGamesMetadata = gamesMetadata;\n\n if (port) {\n this._nLocalHostPort = port;\n }\n }\n\n isGameApproved(gameType){\n return !this.isHybridSuportHtmlCompiledGames() || (this.isHybridSuportHtmlCompiledGames() && this.isCompiledHtmlGame(gameType));\n }\n\n /**\n * rerurn true if the hybrid support the \"Compiled Html Game\"\n */\n isCompiledHtmlGame(gameType) {\n return this._allCompiledGamesMetadata.hasOwnProperty(gameType);\n }\n\n /**\n * rerurn true if the hybrid support the \"OnDemand Html Game\"\n */\n isOnDemandHtmlGame(gameType) {\n\n if(this.isCompiledHtmlGame(gameType)){\n return 'true' === this._allCompiledGamesMetadata[gameType].ondemand;\n }\n\n return false;\n }\n\n isSchemeSupported(){\n\n if(!this._bSchemeGameSupported){\n return false;\n }\n return this._schemefeature ? this._schemefeature.isSchemeSupported() : false;\n }\n\n isLocalGameLauncherSupported(){\n\n if(!this._bLocalGameLauncherSupported){\n return false;\n }\n return this._gamelauncherfeature ? this._gamelauncherfeature.isLocalGameLauncherSupported() : false;\n }\n\n /**\n * rerurn game current Compiled Region name(needed for Nyx mapping between game name to gametype)\n */\n getCurrentCompiledRegionName(gameType) {\n\n if(this.isCompiledHtmlGame(gameType)){\n return this._allCompiledGamesMetadata[gameType].region || '';\n }\n\n return '';\n }\n\n /**\n * rerurn game external name(needed for blueprint mapping between game name to gametype)\n */\n getGameExternalName(gameType) {\n\n if(this.isCompiledHtmlGame(gameType)){\n return this._allCompiledGamesMetadata[gameType].name || '';\n }\n\n return '';\n }\n\n navigateToOnDemandStandalone(gameType, companyName, url) {\n if (this.isOnDemandStandalone(gameType, companyName)) {\n if (this._ondemandnyxfeature && this._ondemandnyxfeature.navigate(companyName, url,gameType)) {\n return true;\n }\n }\n\n return false;\n }\n\n isOnDemandStandAloneGameRunning() {\n if (this._ondemandnyxfeature) {\n return this._ondemandnyxfeature.isOnDemandStandAloneGameRunning();\n }\n\n return false;\n }\n\n\n /**\n * rerurn true if the hybrid support OnDemand Standalon - Nyx is the first Standalone\"\n */\n isOnDemandStandalone(gameType, companyName) {\n\n if (Device.hybrid.isEmbedded && this.isOnDemandHtmlGame(gameType)) {\n\n if (this._ondemandnyxfeature && this._ondemandnyxfeature.canHandle(companyName)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * save the game in cookie\n */\n saveOnDemandLoadedGame(gameType, sharedFolder) {\n if (this._ondemandfeature) {\n this._ondemandfeature.saveOnDemandLoadedGame(gameType, sharedFolder);\n }\n }\n\n /**\n * ask if On Demand Game already Loaded\n */\n isDisplayLoadingIndicator(gameType) {\n if (!Device.hybrid.isEmbedded) {\n return true;\n }\n return this._ondemandfeature ? this._ondemandfeature.isOnDemandLoadedGame(gameType) : true;\n }\n\n /**\n * rerurn true Game Meta data\"\n */\n getCompiledGameMetadata(gameType) {\n if (!this.isCompiledHtmlGame(gameType)) {\n return null;\n }\n\n return this._allCompiledGamesMetadata[gameType];\n }\n\n\n /**\n * rerurn Game Version\"\n */\n getCompiledGameVersion(gameType) {\n if (!this.isCompiledHtmlGame(gameType)) {\n return null;\n }\n\n return this.getCompiledGameMetadata(gameType).version;\n }\n\n\n isHybridSuportHtmlCompiledGames(){\n return 0 < this._nLocalHostPort;\n }\n\n setGamescheme(gameschcme){\n if(this._schemefeature){\n this._schemefeature.setGamescheme(gameschcme);\n }\n }\n\n getOnDemandOrigin() {\n return `http://${window.location.hostname}:${ON_DEMAND_PORT}`;\n }\n\n getLocalHostAndPortForOnDemand(gameUrlBuilder, pathname){\n\n gameUrlBuilder.protocol = 'http:';\n gameUrlBuilder.host = window.location.hostname;\n gameUrlBuilder.port = ON_DEMAND_PORT.toString();\n gameUrlBuilder.pathname = pathname;\n return gameUrlBuilder.href;\n }\n\n prepareGameUrl(gameType, gameUrl, pathname = '') {\n let gameUrlBuilder = new URL(gameUrl);\n\n if (this.isCompiledHtmlGame(gameType) && this.isOnDemandHtmlGame(gameType)) {\n // All on demand games most be served form http and not https\n return this.getLocalHostAndPortForOnDemand(gameUrlBuilder, pathname);\n }\n\n return gameUrlBuilder.href;\n }\n\n /**\n * init the Hybrid Features\n *\n * @private\n */\n _initFeatures(params) {\n\n const reg = require.context('../../services/hybrid/features', true, /^.*(_hybrid_feature)\\.js$/);\n\n const loader = new Loader();\n const allFeatures = loader.getDefault(reg);\n\n allFeatures.forEach(feature => {\n try {\n let param = params ? params[feature.CLASS] : 'undefined';\n param = _.isString(param) ? _.safeJSON(param, '') : param;\n this.logger.info('load feature => ' + feature.CLASS);\n\n const fearureInstance = feature.create(param).initFeatures(this);\n this._saveFeature(feature.CLASS, fearureInstance);\n } catch (ex) {\n this.logger.error('Failed to load feature => ', feature);\n }\n });\n }\n\n /**\n * save the Feature reference dynamicly\n *\n * @private\n */\n _saveFeature(className, fearureInstance) {\n let name = ('_' + className + 'Feature').toLowerCase();\n this[name] = fearureInstance;\n }\n\n\n\n /**\n * init the current Wrapper & functions implementation\n *\n * @private\n */\n _initWrapper() {\n\n this._wrapper = HybridFactory.create().getHybridWrapper();\n\n if (null !== this._wrapper) {\n this._wrapper.initHybridDirectCall(this);\n }\n\n let data = {[KEY_NAME.HYBRID_CB]: KEY_NAME.HYBRID_CB_GLOBAL_NAME};\n this.msgToHybrid(SERIVCES_FUNC_LIST.GENERAL_SET_CB, data);\n\n return this;\n }\n\n onHybridUrlScheme(name, data) {\n\n let feature = this._getFeature(name);\n\n if (feature) {\n let dataDecode = _.safeJSONandDecode(data);\n feature.onHybridDirectCall(dataDecode);\n }\n }\n\n\n /**\n *\n * @param params\n */\n onHybridDirectCall(params) {\n\n let objParams = _.safeJSONandDecode(params);\n\n let error = objParams[KEY_NAME.ERROR];\n if (error !== 0) {\n return null;\n }\n\n let data = objParams[KEY_NAME.DATA];\n\n\n let feature = this._getFeature(data[KEY_NAME.HYBRID_CB_FEATURE_FUNC]);// .split('_')[0]);\n\n if (feature) {\n feature.onHybridDirectCall(data);\n }\n\n return undefined !== feature ? feature : null;\n }\n\n _getFeature(featureName) {\n let name = ('_' + featureName).toLowerCase();\n return this[name];\n }\n\n displayHybrid() {\n this._bDisplayWebView = true;\n this.onDisplayWebView();\n }\n\n onDisplayWebView() {\n\n if (this._bDisplayWebView) {\n\n if(this.getPushFeature() && this.getPushFeature().isEnable()) {\n this.getPushFeature().getPushActions()\n .then(data => {\n if(0 === data.length) {\n if(this.getThreeDTouchFeature()) {\n this._checkThreeDTouch();\n }\n }else {\n this.displayWebView(2000);\n this._clearHybridDisplayTimeOut();\n }\n });\n } else if(this.getThreeDTouchFeature()) {\n this._checkThreeDTouch();\n }\n }\n }\n\n _clearHybridDisplayTimeOut() {\n if (this._webviewmanagerfeature) {\n this._webviewmanagerfeature.clearHybridDisplayTimeOut();\n }\n }\n\n _checkThreeDTouch(){\n this.getThreeDTouchFeature().getShortcutLaunch()\n .then(shortcut => {\n this.getThreeDTouchFeature().runAction(shortcut);\n this.displayWebView(2000);\n this._clearHybridDisplayTimeOut();\n });\n }\n\n\n /**\n * int the hybrid.\n * return the active services.\n */\n initHybrid() {\n\n this.initOndemandfeature();\n\n this.onDisplayWebView();\n\n this._getSmartLink();\n\n return this.msgToHybrid(SERIVCES_FUNC_LIST.GENERAL_INIT_HYBRID);\n }\n\n /* close the hybrid */\n closeApp(){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.GENERAL_CLOSE_APP);\n }\n\n /* Get The Smart link directly from hybrid*/\n _getSmartLink(){\n this.msgToHybrid(SERIVCES_FUNC_LIST.GENERAL_GET_SMART_LINK).then(data => {\n const json = _.safeJSONandDecode(data);\n const datainfo = json[KEY_NAME.DATA];\n this._smartLink = datainfo[KEY_NAME.SMART_LINK];\n });\n }\n\n /**\n * Show the alert in native on top of webView.\n *\n * @param str - the string that will display in alert.\n * @returns {Promise}\n */\n alert(str) {\n let alertProperties = {[KEY_NAME.MSG]: str};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.GENERAL_ALERT, alertProperties);\n }\n\n /**\n * Show the alert in native on top of webView.\n *\n * @param str - the string that will display in alert.\n * @returns {Promise}\n */\n alertd(str) {\n let alertProperties = {[KEY_NAME.MSG]: str};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.GENERAL_ALERT_D, alertProperties);\n }\n\n\n setRotaion(rotation, bVal) {\n let data = {[KEY_NAME.ROTATION]: rotation, [KEY_NAME.FORCE]: bVal};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.GENERAL_SET_ROTATION, data);\n }\n\n openMail(txt) {\n let data = {[KEY_NAME.DATA]: txt, [KEY_NAME.MAIL_TO]: 'mailto:tablet.888casino@gmail.com?&body='};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.GENERAL_OPEN_MAIL, data);\n }\n\n openExternalLink(url) {\n\n let srcurl = url;\n url = this.convertToAbsoluteLink(url);\n\n if(Device.hybrid.isEmbedded){\n url = this.buildExternalLinkForEmbeddedHybrid(url);\n }\n\n if(Device.hybrid.inCasino || Device.hybrid.isEmbedded){\n url = srcurl.includes([KEY_NAME.BANK_ID] + ':///') ? srcurl : url;\n url = srcurl.includes([KEY_NAME.PHONE]) ? srcurl : url;\n }\n\n let data = {[KEY_NAME.DATA]: url};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.GENERAL_OPEN_EXTERNAL_LINK, data);\n }\n\n convertToAbsoluteLink(link) {\n let absoluteLink = '';\n // check if relative or absolute link\n if (!_.isAbsoluteLink(link)) {\n absoluteLink = this.serviceFactory.windowService().getLocationOrigin();\n }\n absoluteLink += link;\n return absoluteLink;\n }\n\n setCbFunction(serviceFuncName, cbFuncName, privatedata) {\n\n let publicdata = {[KEY_NAME.HYBRID_CB_FEATURE_FUNC]: cbFuncName};\n\n let data = Object.assign(publicdata, privatedata);\n\n return this.msgToHybrid(serviceFuncName, data);\n }\n\n loadRemoteChill(url, ver){\n\n let data = {[KEY_NAME.URL]: url, [KEY_NAME.VERSION]: ver};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.ON_DEMAND_LOAD_CHILL, data);\n }\n\n _closeGame(options) {\n if(this._ondemandfeature){\n this._ondemandfeature.closeGame();\n }\n\n return this.msgToHybrid(SERIVCES_FUNC_LIST.ON_DEMAND_CLOSE_GAME);\n }\n\n\n initOndemandfeature(){\n if(this._ondemandfeature){\n this._ondemandfeature.inidFeature();\n }\n }\n setStartOndemand(b){\n if(this._ondemandfeature){\n this._ondemandfeature.setStartOndemand(b);\n }\n }\n\n canUseScheme(vendorName) {\n let val = 'false';\n if(Device.hybrid.isEmbedded) {\n if ('888' === vendorName) {\n val = 'true';\n }\n this._bSchemeGameSupported = 'true' === val ? true : false;\n }\n return val;\n }\n\n canUseLocalGameLauncherSupported(vendorName) {\n let val = 'false';\n if(Device.hybrid.isEmbedded) {\n if ('888' === vendorName) {\n val = 'true';\n }\n this._bLocalGameLauncherSupported = 'true' === val ? true : false;\n }\n return val;\n }\n\n\n waitForOnDemandId(id, folderStruct = 0, sharedFolder = '', vendorName = '') {\n\n let useScheme = this.canUseScheme(vendorName);\n this.canUseLocalGameLauncherSupported(vendorName);\n\n this.setStartOndemand(false);\n let data = {[KEY_NAME.DATA]: id.toString(),[KEY_NAME.EXT_GAME_NAME]: this.getGameExternalName(id), [KEY_NAME.TIME_OUT]: 0, [KEY_NAME.FOLDER_STRUCT]: folderStruct.toString(), [KEY_NAME.FOLDER_SHARED_NAME]: sharedFolder.toString(),\n [KEY_NAME.USE_SCHEME]: useScheme};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.ON_DEMAND_IS_READY, data);\n }\n\n stopProgressBarByTimeOut(){\n this.setStartOndemand(true);\n return this.msgToHybrid(SERIVCES_FUNC_LIST.ON_DEMAND_CLOSE_BY_TIME_OUT);\n }\n\n _onStopProgressBar() {\n this.setStartOndemand(true);\n\n if(this._ondemandnyxfeature){\n this._ondemandnyxfeature.stopgameIndicator();\n }\n return this.msgToHybrid(SERIVCES_FUNC_LIST.ON_DEMAND_CLOSE_BY_X);\n }\n\n closeByLowDiskSpace() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.ON_DEMAND_CLOSE_BY_LOW_DISK_SPACE);\n }\n\n deleteGameFolder(games) {\n let data = {[KEY_NAME.DATA]: games};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.ON_DEMAND_DELETE_GAME_FOLDER,data);\n }\n\n checkSchemeSupported(){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.SCHEME_CHECK_SUPPORTED);\n }\n\n checkLocalGameLauncher(){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.GAME_LAUNCHER_SUPPORTED);\n }\n\n loadGameLauncher(){\n const url = this.serviceFactory.configService().getConfig().TripleEight.gameLauncherUrl + [KEY_NAME.GAME_LAUNCHER_ZIP];\n const ver = '1111';//temp - need to be change for each new GameLauncher\n let data = {[KEY_NAME.URL]: url, [KEY_NAME.VERSION]: ver};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.GAME_LAUNCHER_LOAD,data);\n }\n\n loadGamePreLoader(){\n const url = this.serviceFactory.configService().getConfig().TripleEight.gameLauncherUrl + [KEY_NAME.GAME_PRELOADER_ZIP];\n const ver = '1111';//temp - need to be change for each new GameLauncher\n let data = {[KEY_NAME.URL]: url, [KEY_NAME.VERSION]: ver};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.GAME_PRELOADER_LOAD,data);\n }\n\n\n\n isSupportHtmlCompiledGames() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.WEB_VIEW_IS_HTML_COMPILED_GAMES);\n }\n\n navigateForOnDemandNyx(url,gameType) {\n\n const region = this.getCurrentCompiledRegionName(gameType);\n\n let data = {[KEY_NAME.URL]: url, [KEY_NAME.REGION]: region};\n\n return this.msgToHybrid(SERIVCES_FUNC_LIST.ON_DEMAND_NYX_NAVIGATE, data);\n }\n\n\n changeHeaderHeightOnDemandNyx(headerheight, dt){\n let data = {[KEY_NAME.HEADER_HEIGHT] : headerheight, [KEY_NAME.CLOSE_BY_X] : dt.enable, [KEY_NAME.CLOSE_X_POS_P] : dt.xp, [KEY_NAME.CLOSE_Y_POS_P]: dt.yp,\n [KEY_NAME.CLOSE_X_POS_L] : dt.xl, [KEY_NAME.CLOSE_Y_POS_L]: dt.yl} ;\n return this.msgToHybrid(SERIVCES_FUNC_LIST.ON_DEMAND_NYX_CHANGE_HEADER_HEIGHT, data);\n }\n\n checkNyxIframeSupport(){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.ON_DEMAND_NYX_IS_IFRAME_SUPPORT);\n }\n\n closeNyxODRGame() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.ON_DEMAND_NYX_CLOSE);\n }\n\n\n isNyxIframeSupported(){\n if(this._ondemandnyxfeature && this._ondemandnyxfeature.isIframeSupported()){\n return true;\n }\n return false;\n }\n\n // build with not iframe\n\n getNyxLocalHostUrl(data,gameType){\n\n if(this._ondemandnyxfeature){\n this._ondemandnyxfeature.updatOnDemandGameIsRunning(data);\n }\n\n data.region = this.getCurrentCompiledRegionName(gameType);\n\n return this.msgToHybrid(SERIVCES_FUNC_LIST.ON_DEMAND_NYX_GET_LOCAL_HOST_URL, data).then(data => {\n data = _.safeJSONandDecode(data);\n const dt = data[KEY_NAME.DATA];\n\n return dt[KEY_NAME.URL];\n });\n }\n\n /**\n * Show the site in webview.\n *\n * @private\n */\n\n displayWebView(timeout) {\n\n DOM.setTimeout(() => {\n this.msgToHybrid(SERIVCES_FUNC_LIST.WEB_VIEW_WEB_SHOW, {[SERIVCES_PARAMS_LIST.WEB_VIEW_SPLASH]: SERIVCES_PARAMS_LIST.WEB_VIEW_SPLASH_FADE});\n }, timeout);\n }\n\n /* SERLAL START */\n /**\n *\n * @returns {Promise}\n */\n getSerialData() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.SERIAL_GET_SERIAL);\n }\n\n setSmartLinkData(smartLinkData, appflayerfeature) {\n this._appflayerfeature = appflayerfeature;\n this._strSmartLinkData = encodeURIComponent(smartLinkData);\n }\n\n getSmartLinkData() {\n return this._strSmartLinkData;\n }\n\n /* SERLAL END */\n\n\n /* 3D Touch START */\n /**\n * @param shourtcutsLaunch: parameters in json format.\n * @returns {Promise}\n * Example: \"[{\"action\":\"Login\",\"caption\":\"Logintext\",\"val\":\"\"},{\"action\":\"QuickDeposit\",\"caption\":\"QuickDeposittext\",\"val\":\"\"}]\"\n */\n init3DTouchShourtcutsLaunch(shourtcutsLaunch) {\n let data = {[KEY_NAME.DATA]: shourtcutsLaunch};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.T3_D_TOUCH_INIT_SHORTCUTS, data);\n }\n\n /**\n * @param shortcutData: json:\n * @param example: {'action': 'PlayGame','caption': 'Millionaire Genie','val': '130043'}\n * @returns {Promise}\n */\n update3DTouchShortcut(shortcutData) {\n let data = {[KEY_NAME.DATA]: shortcutData};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.T3_D_TOUCH_UPDATE_SHORTCUT, data);\n }\n\n /**\n * Delete a specific shortcut from the 3Dtouch shortcuts\n * @param action: example: Login,QuickDeposit,PlayGame\n * @returns {Promise}\n */\n delete3DTouchShourtcut(action) {\n let data = {[KEY_NAME.DATA]: action};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.T3_D_TOUCH_DELETE_SHORTCUT, data);\n }\n\n /**\n * delete all the shortcuts from the 3D touch Hybrid\n */\n deleteAll3DTouchShourtcuts() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.T3_D_TOUCH_DEL_ALL_SHORTCUTS);\n }\n\n /**\n * get the shortcut if pressed on the 3D touch\n * @returns {Promise}\n */\n get3DTouchShortcutLaunch() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.T3_D_TOUCH_GET_LAUNCH_SHORTCUT);\n }\n\n /* 3D Touch END */\n\n\n /* PUSH START */\n\n\n promptPermission(){\n\n this.msgToHybrid(SERIVCES_FUNC_LIST.PUSH_PROMPT_PERMISSION);\n\n if(this.getPushFeature()){\n this.getPushFeature().promptPermission();\n }\n }\n\n isPushDeviceEnable() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.PUSH_IS_DEVICE_ENABLE);\n }\n\n\n /**\n * get the push action if i press on push popup\n * @returns {Promise}\n */\n getPushActions() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.PUSH_GET_ACTION);\n }\n\n addTag(data){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.PUSH_ADD_TAG,data);\n }\n\n remTag(data){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.PUSH_REM_TAG,data);\n }\n\n setAlias(data){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.PUSH_SET_ALIAS,data);\n }\n\n /* PUSH END */\n\n /* TouchID START */\n\n /**\n * get the token if exist for touchId\n * @returns {Promise}\n */\n\n setSupportedFaceId(displayAlsoFaceId){\n const data = {[KEY_NAME.DISPLAY_ALSO_FACE_ID] : displayAlsoFaceId};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.TOUCH_ID_SUPPORT_FACE_ID, data);\n }\n\n openTouchIdSettings(){\n const data = {[KEY_NAME.DATA]: Device.os.isIOS ? OPEN_SETTINGS.TOUCH_ID_IOS : OPEN_SETTINGS.TOUCH_ID_ANDROID};\n return this.openSettings(data);\n }\n\n openSettings(data){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.GENERAL_OPEN_SETTINGS,data);\n }\n\n isOpenSettingsSupported(){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.TOUCH_ID_IS_OPEN_SETTINGS_SUPPORTED);\n }\n\n getTouchIdToken() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.TOUCH_ID_GET_TOKEN);\n }\n\n setToken(token) {\n const data = {[KEY_NAME.DATA]: token};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.TOUCH_ID_SET_TOKEN, data);\n }\n\n openTouchId(caption) {\n const data = {[KEY_NAME.DATA]: caption, [KEY_NAME.KEYBORD]: 'false'};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.TOUCH_ID_OPEN, data);\n }\n\n isTouchIdSuported() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.TOUCH_ID_IS_SUPORTED);\n }\n\n isOpenSettingSupported(){\n return this._touchidfeature && this._touchidfeature.isOpenSettingSupported();\n }\n\n\n\n\n\n isDeviceTouchEnable() {\n return new Promise((resolve) => {\n this.isTouchIdSuported().then(data => {\n if (null !== this._touchidfeature && this._touchidfeature.isFeatureEnable()) {\n this._touchidfeature.getModel().setEnableRes(_.safeJSONandDecode(data));\n let bEnable = this._touchidfeature.getModel().isDeviceTouchEnable() || this.isOpenSettingSupported();\n resolve(bEnable);\n } else {\n resolve(false);\n }\n });\n });\n }\n\n clearToken() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.TOUCH_ID_CLEAR_ALL);\n }\n\n getParamsForToken() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.TOUCH_ID_PARAMS_FOR_TOKEN);\n }\n\n /* TouchID END */\n\n /* SAFARI TEST FOR CASHIER */\n openSafariTest(url) {\n\n DOM.setTimeout(() => { this.testSafari(); } , 2000);\n\n let data = {[KEY_NAME.DATA]: url, 'top': '45' , 'bottom': '45' };\n return this.msgToHybrid(SERIVCES_FUNC_LIST.WEB_VIEW_SAFARI, data);\n }\n\n testSafari() {\n this.msgToHybrid(SERIVCES_FUNC_LIST.WEB_VIEW_SAFARI_PING)\n .then(() => {\n DOM.setTimeout(() => {\n this.testSafari();\n }, 7000);\n });\n }\n\n openLinksAccomplished(webId, webType) {\n let data = {[KEY_NAME.WEB_ID]: webId, [KEY_NAME.TYPE]: webType };\n return this.msgToHybrid(SERIVCES_FUNC_LIST.WEB_VIEW_ACCOMPLISHED, data);\n }\n\n navigateWebView(data) {\n\n if(WEB_VIEW_IDS.DEPOSIT_WIDGET_ID === data[WEB_VIEW_INFO.ID]){\n let logger = this.serviceFactory.structuredLoggingService().getLogger();\n logger && logger.setEventType('hybrid_psp_redirect_navigate')\n .addCustomData({\n depositWindowData: data\n });\n\n return this.msgToHybrid(SERIVCES_FUNC_LIST.WEB_DEPOSIT_WIDGET_NAVIFATE, data)\n .then(() => logger && logger.info())\n .catch(err => {\n logger && logger.addCustomData({\n errorDetails: err\n }).error();\n\n throw err;\n });\n }else {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.WEB_SECOND_NAVIFATE, data);\n }\n }\n\n checkHybridSupportDepositWidget(data){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.WEB_DEPOSIT_WIDGET_SUPPORTED, data);\n }\n\n\n showWebView(data) {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.WEB_SECOND_SHOW, data);\n }\n\n getDpToPx(){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.WEB_VIEW_GET_DP_2_PX);\n }\n\n updateScreenSize(data){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.WEB_SECOND_UPDATE_SIZE, data);\n }\n\n closeWebView(data) {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.WEB_SECOND_CLOSE, data);\n }\n\n isWebviewmanagerfeature() {\n\n if (!Device.hybrid.inCasino) {\n return false;\n }\n\n return null !== this._webviewmanagerfeature;\n }\n\n isNativeSupportSecondWebView() {\n return this.isWebviewmanagerfeature() ? this._webviewmanagerfeature.isNativeSupportSecondWebView() : false;\n }\n\n isNativeSupportSafariCashier() {\n return this.isWebviewmanagerfeature() ? this._webviewmanagerfeature.isNativeSupportSafariCashier() : false;\n }\n\n getParamsForCasheir() {\n return this.isWebviewmanagerfeature() ? this._webviewmanagerfeature.getParamsForCasheir() : '';\n }\n\n getUrlSchemeToOpen() {\n return this.isWebviewmanagerfeature() ? this._webviewmanagerfeature.getUrlSchemeToOpen() : '';\n }\n\n getSwitchBackSmartLinkToOpen(){\n return this._smartLink;\n }\n\n openCasheir(url) {\n if (this.isNativeSupportSafariCashier()) {\n this._webviewmanagerfeature.openCasheir(url);\n return true;\n }\n return false;\n }\n\n closeSecondWebView(){\n if(this.isWebviewmanagerfeature()){\n this._webviewmanagerfeature.closeSecondWebView();\n }\n }\n\n\n /* WEB VIEW MANAGER END */\n\n\n /* INFO START */\n\n\n getInfoFeature() {\n return this._hybridinfofeature;\n }\n\n getUrlScheme() {\n let infoFeature = this.getInfoFeature();\n let urlScheme = undefined !== infoFeature ? infoFeature.getUrlScheme() : '';\n return urlScheme;\n }\n\n setUrl(url, reload) {\n let data = {[KEY_NAME.URL]: url, [KEY_NAME.RELOAD]: reload};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.INFO_SET_URL, data);\n }\n\n getInfoForDisplay() {\n let infoFeature = this.getInfoFeature();\n let info = undefined !== infoFeature ? infoFeature.getInfoForDisplay() : '';\n return info;\n }\n\n getInfo(key) {\n let data = {[KEY_NAME.DATA]: key};\n return this.msgToHybrid(SERIVCES_FUNC_LIST.INFO_GET_ALL_INFO, data);\n }\n\n\n isDebugMode() {\n let infoFeature = this.getInfoFeature();\n return null !== infoFeature ? infoFeature.isDebugMode() : false;\n }\n\n getVersion() {\n let infoFeature = this.getInfoFeature();\n return null !== infoFeature ? infoFeature.getVersion() : 0;\n }\n\n getAppleID() {\n let infoFeature = this.getInfoFeature();\n return null !== infoFeature ? infoFeature.getAppleID() : '';\n }\n\n /* INFO END*/\n\n /* URL_SCHEME START */\n\n\n getInfoUrlScheme() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.URL_SCHEME_GET_URL_SCHEME);\n }\n\n clearUrlScheme() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.URL_SCHEME_CLEAR);\n }\n\n /* URL_SCHEME END */\n\n /* FABRIC */\n\n createFabricEv(name){\n if(null != this._fabricfeature) {\n this._fabricfeature.createEvName(name);\n }\n }\n\n addFabricKeyVal(key, val){\n if(null != this._fabricfeature) {\n return this._fabricfeature.addEvKeyVal(key, val);\n }else {\n return null;\n }\n }\n\n getEv() {\n return null != this._fabricfeature ? this._model.getEv() : null;\n }\n\n addFabricEvent(ev) {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.FABRIC_ADD_EVENT,ev);\n }\n\n /* FABRIC */\n\n\n /* GEO */\n\n isPermissionPopupSupported(){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.GEO_IS_PERMISSION_SUPPORTED);\n }\n\n getGeoLocation(data){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.GEO_GET_LOCATION,data);\n }\n\n showGeoLocationPermissionPopUp(){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.GEO_SHOW_PERMISSION);\n }\n\n /* GEO */\n\n\n /* LEXIS NEXIS */\n\n IsLexisNexisSupported(){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.LEXIS_NEXIS_IS_SUPPORTED);\n }\n\n getLexisNexisInfo(data){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.LEXIS_NEXIS_GET_INFO, data);\n }\n\n getLexisNexisSession(marketingData){\n\n if (null !== this._lexisnexisfeature) {\n return this._lexisnexisfeature.getLexisNexisInfo(marketingData, false);\n }\n\n return new Promise((resolve) => {\n resolve(marketingData);\n });\n }\n\n /* LEXIS NEXIS *\n\n\n\n /* DEPOSIT WIDGET */\n\n updateDepositWidgetSupported() {\n if (null !== this._webviewmanagerfeature) {\n this._webviewmanagerfeature.setDepositWidgetSupported();\n }\n }\n\n isDepositWidgetSupported(){\n if(!Device.hybrid.inCasino) {\n return true; // if is not hybrid then we let other layers decide if the user is eligible for deposit widget.\n }\n if (null !== this._depositwidgetfeature) {\n return this._depositwidgetfeature.isDepositWidgetSupported();\n }\n\n return false;\n }\n\n /* DEPOSIT WIDGET */\n\n\n /* LOBBY POP UP */\n\n isPopUpAboveSecounpSupported(){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.LOBBY_POPUP_IS_SUPPORTED);\n }\n\n popUpAboveSecoundShow(data){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.LOBBY_POPUP_SHOW,data);\n }\n\n popUpAboveSecoundClose(){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.LOBBY_POPUP_CLOSE);\n }\n\n displayRatingPopup(){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.RATE_APP);\n }\n\n /* FIRE BASE */\n\n getFireBaseData() {\n return this.msgToHybrid(SERIVCES_FUNC_LIST.FIRE_BASE_GET_DATA);\n }\n\n getAppMareketingData(){\n const appsFlayerData = this._appflayerfeature ? this._appflayerfeature.getAppMareketingData() : {};\n const fireBaseData = this._firebasefeature ? this._firebasefeature.getAppMareketingData() : {};\n\n const allData = Object.assign(appsFlayerData, fireBaseData);\n\n return allData;\n }\n\n getAFInstall(){\n return this._appflayerfeature ? this._appflayerfeature.getAFInstall() : \"\";\n }\n\n /* Migration */\n\n getMigrationToken(data){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.MIGRATION_GET_TOKEN,data);\n }\n\n /* Device Detectiob */\n\n getDeviceDetectionInfo(){\n return this.msgToHybrid(SERIVCES_FUNC_LIST.DEVICE_DETECTION_GET_INFO);\n }\n\n\n\n /**\n * Entry point to send calls for hybrid & back.\n *\n * @param serviceFuncName: the service name + function name for exp: WebView_Webshow:\n * WebView - service name.\n * WebShow - function name.\n * @param jsonParams: parameters in json format.\n * @returns {Promise}\n */\n msgToHybrid(serviceFuncName, jsonParams = {}) {\n if (this.isNotHybridConnection()) {\n if(serviceFuncName === SERIVCES_FUNC_LIST.WEB_DEPOSIT_WIDGET_NAVIFATE) {\n let logger = this.serviceFactory.structuredLoggingService().getLogger();\n logger && logger.setEventType('hybrid_psp_redirect_not_hybrid_connection')\n .addCustomData({\n depositWindowData: jsonParams,\n wrapperIsNull: this._wrapper ? 'No' : 'Yes'\n })\n .error();\n }\n\n this.logger.info([\n 'Hybrid Call:',\n 'Method: ' + serviceFuncName,\n 'Params: ' + JSON.stringify(jsonParams)\n ]);\n\n return Promise.resolve();\n }\n return this._wrapper.msgToHybrid(serviceFuncName, jsonParams);\n }\n\n /**\n * @Description we need connection in those hybrids\n */\n isNotHybridConnection() {\n return (!Device.hybrid.isHybrid) || null === this._wrapper;\n }\n\n // Event.fire(SYSTEM_EVENTS.HYBRID_ALERT, str);\n\n /***\n * @Description If the Url is with localhost or just relative we need to add the cmsSource\n * @Note BUG 1322249\n * @param url\n */\n buildExternalLinkForEmbeddedHybrid(url){\n\n let cmsSource = this.serviceFactory.integrationService().getCmsSourceIfValid();\n if(cmsSource) {\n //If we got localhost link\n if (_.isString(url) && (url.startsWith('http://localhost') || url.startsWith('https://localhost')) && !isInsideAutomation()) {\n //Remove the localhost (it will not work on embedded Hybrid) and add the cmsSource to the relative link\n url = _.removeLocalhost(url);\n return cmsSource + \"/\" + url;\n }\n\n //If we got localhost in the domain\n let strReplace = this.getReplaceLocalhost(url, cmsSource);\n\n if (strReplace.length > 0) {\n return strReplace;\n }\n\n //If we got relative link(and not mailto link) - add the cms source\n if (!_.isAbsoluteLink(url) && !_.isNullOrUndefined(url) && !url.startsWith('mailto:')) {\n return cmsSource + url;\n }\n\n }\n return url;\n }\n\n getReplaceLocalhost(url, cmsSource) {\n let strReplace = '';\n if (_.isString(url) && url.includes('reason') && url.includes('domain')) {\n if (url.includes([LOCAL_HOST.HTTP])) {\n strReplace = [LOCAL_HOST.HTTP];\n } else if (url.includes([LOCAL_HOST.HTTPS])) {\n strReplace = [LOCAL_HOST.HTTPS];\n }\n\n if (strReplace.length > 0) {\n strReplace = url.replace(strReplace, cmsSource);\n }\n }\n return strReplace;\n }\n\n /**\n * @description When it is internal link we need to redirect to the Hybrid localhost and not to the fullurl\n * @param url\n */\n getRedirectInternalPageUrl(url){\n try {\n let redirectFullURL = new URL(url)\n redirectFullURL.protocol = this.serviceFactory.windowService().getProtocol();\n redirectFullURL.host = this.serviceFactory.windowService().getHost();\n\n return redirectFullURL.href;\n }catch (e){\n this.logger.error('Failed to getRedirectInternalPageUrl error: ' + e + ' ,return original url: ' + url);\n return url;\n }\n\n }\n\n openPopUpOnSecondWebView(content,timeout) {\n\n if(!Device.hybrid.isHybrid) {\n return;\n }\n\n const dataforHybrid = {\n content: content,\n isFirstShow: true,\n showHybridPopUp: true,\n timeout:timeout\n };\n\n setTimeout(() => {//the popup is not ready yet\n Event.fire(SYSTEM_EVENTS.SHOW_POPUP_ABOVE_HYBRID_SECOND_WEB_VIEW, dataforHybrid);\n }, 1000);\n }\n\n closePopUpOnSecondWebView() {\n if(Device.hybrid.isEmbedded) {\n Event.fire(SYSTEM_EVENTS.CLOSE_POPUP_ABOVE_HYBRID_SECOND_WEB_VIEW);\n }\n }\n\n executeWaitForHybridGameStep({folderStruct, sharedFolder, gameType, vendorName, companyName}) {\n\n const gameStepLogicHandler = WaitForHybridGameStepLogicHandler.create({\n serviceFactory: this.serviceFactory,\n folderStruct,\n sharedFolder,\n gameType,\n vendorName,\n companyName\n })\n\n return gameStepLogicHandler.run();\n }\n}\nexport default HybridService;","import BaseModelService from '../../base/base_model_service';\nimport Device from '../../utils/device/device';\n\n\n/**\n *\n *\n */\nclass HybridVersionHandlerModel extends BaseModelService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'HybridVersionHandlerModel';\n\n\n /**\n *\n * @param params\n */\n init(params) {\n if (params) {\n this\n ._setBlockMinVersionIOS(params.blockMinVersionIOS)\n ._setBlockMinVersionAndroid(params.blockMinVersionAndroid)\n ._setMessageMinVersionIOS(params.messageMinVersionIOS)\n ._setMessageMinVersionAndroid(params.messageMinVersionAndroid)\n ._setAppStoreLink(params.appStoreLink)\n ._setGooglePlayLink(params.googlePlayLink)\n }\n }\n\n /**\n * set app store link\n * @private\n */\n _setAppStoreLink(appStoreLink) {\n this.appStoreLink = appStoreLink;\n return this;\n }\n\n /**\n * set google play link\n * @private\n */\n _setGooglePlayLink(googlePlayLink) {\n this.googlePlayLink = googlePlayLink;\n return this;\n }\n\n /** This param is to block the screen when the user Hybrid version is low then the min version for IOS\n * @param blockMinVersionIOS\n * @returns {HybridServiceModel}\n * @private\n */\n _setBlockMinVersionIOS(blockMinVersionIOS) {\n this._blockMinVersionIOS = blockMinVersionIOS;\n return this;\n }\n\n /**\n * This param is to block the screen when the user Hybrid version is low then the min version for Android\n * @param blockMinVersionAndroid\n * @returns {HybridServiceModel}\n * @private\n */\n _setBlockMinVersionAndroid(blockMinVersionAndroid) {\n this._blockMinVersionAndroid = blockMinVersionAndroid;\n return this;\n }\n\n /**\n * This param is to show message when the user Hybrid version is low then the min version for IOS\n * @param messageMinVersionIOS\n * @returns {HybridServiceModel}\n * @private\n */\n _setMessageMinVersionIOS(messageMinVersionIOS) {\n this._messageMinVersionIOS = messageMinVersionIOS;\n return this;\n }\n\n /**\n * This param is to show message when the user Hybrid version is low then the min version for Android\n * @param messageMinVersionAndroid\n * @returns {HybridServiceModel}\n * @private\n */\n _setMessageMinVersionAndroid(messageMinVersionAndroid) {\n this._messageMinVersionAndroid = messageMinVersionAndroid;\n return this;\n }\n\n /**\n * return the min version message for your device type(IOS/Android)\n * @returns {*}\n */\n getMessageMinVersion() {\n return Device.os.isIOS ? this._messageMinVersionIOS : this._messageMinVersionAndroid;\n }\n\n /**\n * return the min version block for your device type(IOS/Android)\n * @returns {*}\n */\n getBlockMinVersion() {\n return Device.os.isIOS ? this._blockMinVersionIOS : this._blockMinVersionAndroid;\n }\n\n /**\n * get google play/ app store link according to android/ios device\n * @private\n */\n getApplicationStore() {\n return Device.os.isIOS ? this.appStoreLink : this.googlePlayLink;\n }\n}\n\nexport default HybridVersionHandlerModel;","import BaseService from '../../base/base_service';\nimport Event from '../../utils/event';\nimport {SYSTEM_EVENTS} from '../../events/events';\nimport Model from './hybrid_version_handler_model';\nimport ServiceFactory from \"../service_factory\";\nimport Device from '../../utils/device/device';\n\n/**\n * The hybrid service initialise the correct hybrid(IOS,Android)\n * The service send messages to the hybrid.\n * The service receive messages from the hybrid - by promise\n *\n *\n */\nclass HybridVersionHandlerService extends BaseService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'HybridVersionHandlerService';\n\n\n /**\n *\n * @param params\n */\n init(params) {\n super.init(params);\n this._model = Model.create(params);\n }\n\n /**\n * Open application store according to device(IOS/Android)\n * @private\n */\n _openApplicationStore(url) {\n ServiceFactory.create().linksNavigationProxyService().openUrl({\n url: url,\n openMode: 'newTab'\n })\n }\n\n /**\n * Open mdp message to the user to upgrade Hybrid version.\n * @param messageType\n * @private\n */\n _showMessage(messageType) {\n let langService = ServiceFactory.create().languageService();\n let category = messageType === 'regular' ? 'mobile_upgrade_message' : 'mobile_block_message';\n let buttons = [{isClosable: false, name: langService.translation('hybrid_version_message_upgrade_button'), type: 'main', callback: () => {\n\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {\n category: category,\n action: 'upgrade'\n });\n // Open appstore/ google play\n this._openApplicationStore(this._model.getApplicationStore());\n }}];\n\n // We have not now button only in regular message and not in block message\n if(messageType === 'regular') {\n buttons.push({name: langService.translation('hybrid_version_message_not_now_button'), type: 'secondary', callback: () => {\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {\n category: category,\n action: 'not_now'\n });\n }});\n }\n\n Event.fire(SYSTEM_EVENTS.MESSAGE_OPEN, {\n title: langService.translation('hybrid_version_message_title'),\n text: langService.translation('hybrid_version_message_body'),\n closeButton: messageType === 'regular',\n hasDefaultButton: false,\n buttons: buttons\n });\n }\n\n /**\n * Show low version block message\n * @private\n */\n _showLowVersionBlockMessage() {\n this._showMessage('block');\n }\n\n /**\n * Show low version regular message\n * @private\n */\n _showLowVersionRegularMessage() {\n this._showMessage('regular');\n }\n\n\n /**\n * return if the user version is lower then min version\n * @param userVersion\n * @param minVersion\n * @private\n */\n _isLowerThenMinVersion(userVersion, minVersion) {\n if(typeof userVersion === 'string' || typeof minVersion === 'string') {\n userVersion = userVersion.split('-')[0];\n let userSubVersions = userVersion.split('.'),\n minSubVersions = minVersion.split('.');\n if(userSubVersions.length !== minSubVersions.length) {\n this._logger.error('[HybridVersionHandlerService] Hybrid min version have '+ minSubVersions.length + ' while user version ' + userSubVersions.length);\n } else {\n for(let index=0; index Number(userSubVersions[index])) {\n return true;\n } else if(Number(minSubVersions[index]) < Number(userSubVersions[index])) {\n return false;\n }\n }\n }\n }\n\n return false;\n }\n\n doAsyncJobs() {\n // Listen to the Hybrid version only if you are in Hybrid and the block/message feature enable(not empty)\n this.onSystemEventOnce(SYSTEM_EVENTS.ADD_TAG_OPEN_APP_VER, (version)=> {\n if((Device.hybrid.inCasino) &&(this._model.getBlockMinVersion() || this._model.getMessageMinVersion())) {\n if(this._model.getBlockMinVersion()) {\n // Check if the user version is lower then the needed.\n if(this._isLowerThenMinVersion(version.toString(), this._model.getBlockMinVersion())) {\n this._showLowVersionBlockMessage();\n return;\n }\n }\n if(this._model.getMessageMinVersion()){\n // Check if the user version is lower then the needed.\n if(this._isLowerThenMinVersion(version.toString(), this._model.getMessageMinVersion())) {\n this._showLowVersionRegularMessage();\n }\n }\n }\n });\n }\n\n showUserWrongAppMessage(appStoreLink) {\n this.serviceFactory.messageManagerService().openMessage({\n closeButton: false,\n customCSSClassList: ['cgp-mdp-text-support-slash-n', 'cy-wrong-app-message'],\n title: this.serviceFactory.languageService().translation('hybrid_version_not_available_title'),\n text: this.serviceFactory.languageService().translation('hybrid_version_not_available'),\n buttons: [\n {\n name: this.serviceFactory.languageService().translation('hybrid_version_not_available_download').toUpperCase(),\n isClosable: false,\n callback: () => {\n this._openApplicationStore(appStoreLink);\n }\n }\n ]\n });\n }\n}\nexport default HybridVersionHandlerService;","import BaseService from '../../base/base_service';\nimport { SYSTEM_EVENTS } from '../../events/events';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport UserActivityDetector from '../oauth/states/user_activity_detector';\nimport { ILocalizedGameInfo } from '../games_information/games_information_service_interface';\nimport _ from '../../utils/underscore';\nimport Store from '../../utils/store';\n\nconst MAX_APPEARANCES_PER_SESSION: number = 3;\nconst ACTIVITY_DETECTION_INTERVAL: TimeSpan = TimeSpan.fromSeconds(1);\nconst IDLE_DETECTION_INTERVAL: TimeSpan = TimeSpan.fromMinutes(1);\nconst IDLE_RECOMMENDATIONS_LOCAL_STORAGE_KEY: string = 'idleRecommendationsData';\nconst DISPLAY_INTERVAL: TimeSpan = TimeSpan.fromSeconds(0);\n\nexport default class IdleRecommendationsService extends BaseService {\n static CLASS = 'IdleRecommendationsService';\n\n private _idleDetectionInterval: TimeSpan;\n private _numberOfAppearancesInSession: number;\n private _maxAppearancesAllowedPerSession: number;\n private _idleDetectionSubscription: any;\n private _userActivityDetector: any;\n private _isIdleRecToasterDisplayed: boolean;\n private _displayInterval: TimeSpan;\n private _recommendedGameType: string | null = null;\n private _toasterDisposer: (() => void) | null = null;\n\n init(params: any) {\n super.init(params);\n }\n protected shouldApplyFeatureToggleABTesting(): boolean{\n return !this.featureToggle();\n }\n protected toggleFeatureOn(params) {\n this._idleDetectionInterval = params.idleDetectionInterval ? TimeSpan.parse(params.idleDetectionInterval) : IDLE_DETECTION_INTERVAL;\n this._maxAppearancesAllowedPerSession = params.maxAppearancesPerSession ? params.maxAppearancesPerSession : MAX_APPEARANCES_PER_SESSION;\n this._numberOfAppearancesInSession = this._getNoOfAppearancesInSessionFromLocalStorage();\n this._displayInterval = params.displayInterval ? TimeSpan.parse(params.displayInterval) : DISPLAY_INTERVAL;\n this._subscribe();\n this._stopIdleDetection(); // Just to be on the safe side\n this._startIdleDetection();\n }\n\n private _subscribe() {\n this.onSystemEvent([SYSTEM_EVENTS.OAUTH_STATE_CHANGE, SYSTEM_EVENTS.ON_INIT_COMPLETE], this._startIdleDetection.bind(this));\n this.onSystemEvent(SYSTEM_EVENTS.CLOSE_GAME, this._resetIdleDetectionTimer.bind(this));\n this.onSystemEvent(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, this._resetAppearancesInSession.bind(this));\n this.onSystemEvent(SYSTEM_EVENTS.GAME_OPEN, this._closeToasterWhenOpeningAnotherGame.bind(this));\n }\n\n\n private _startIdleDetection() {\n if (this.serviceFactory.oAuth2Service().isAuthorized()) {\n this._startUserIdleDetection();\n this._startUserActivityDetection();\n } else {\n this._stopIdleDetection();\n }\n }\n\n private _disposeIdleDetectionTimer() {\n if (this._idleDetectionSubscription) {\n this._idleDetectionSubscription.dispose();\n }\n }\n\n private _resetIdleDetectionTimer() {\n this._disposeIdleDetectionTimer();\n this._startUserIdleDetection();\n }\n\n private _closeToasterWhenOpeningAnotherGame(){\n if(this._isIdleRecToasterDisplayed && this._toasterDisposer){\n this._onCloseAnalytics = this._openedAnotherGameWhileIdleIsActiveAnalytics;\n this._toasterDisposer();\n this._toasterDisposer = null;\n }\n }\n\n private _startUserActivityDetection() {\n this._userActivityDetector = UserActivityDetector.create({\n serviceFactory: this.serviceFactory,\n userActivityDetectionInterval: ACTIVITY_DETECTION_INTERVAL,\n onUserActivityCallback: this._resetIdleDetectionTimer.bind(this),\n });\n }\n\n private _startUserIdleDetection() {\n this._idleDetectionSubscription = this.serviceFactory\n .observableFactoryService()\n .fromInterval(this._idleDetectionInterval)\n .forEach(() => {\n this._showIdleRecommendationToaster();\n });\n }\n\n private _stopIdleDetection() {\n this._disposeIdleDetectionTimer();\n if (this._userActivityDetector) this._userActivityDetector.dispose();\n this._isIdleRecToasterDisplayed = false;\n }\n\n // We have two different types of close analytics: one for clicking the idle rec's X btn and one for launching a game(NOT the one in idle) while the idle is active.\n private _defaultOnCloseAnalytics = () => {\n this._sendAnalytics({action: 'click_close_button', label: this._recommendedGameType});\n };\n\n private _openedAnotherGameWhileIdleIsActiveAnalytics = () => {\n this._sendAnalytics({action: 'launched_other_game', label: this._recommendedGameType});\n };\n\n private _openedRecommendedGameAnalytics = () => {\n this._sendAnalytics({action: 'click_play', label: this._recommendedGameType});\n };\n\n private _onCloseAnalytics = this._defaultOnCloseAnalytics;\n\n private _onClosed() {\n this._isIdleRecToasterDisplayed = false;\n this._resetIdleDetectionTimer();\n this._onCloseAnalytics();\n }\n\n private _onOpened() {\n this._isIdleRecToasterDisplayed = true;\n }\n\n private async _showIdleRecommendationToaster() {\n if (this._isIdleRecToasterDisplayed || await this.serviceFactory.gameService().isGameRunning() || this.serviceFactory.overlayManagerService().isActiveOverlayExists()) {\n return;\n }\n\n if (this._numberOfAppearancesInSession >= this._maxAppearancesAllowedPerSession) {\n this.logger.debug(`IdleRecommendations toaster not displayed - max appearances per session - ${this._maxAppearancesAllowedPerSession} reached`);\n return;\n }\n\n this._getRecentlyPlayedGame()\n .then(recentlyPlayedGame => this._getRecommendedGameBasedOnCorrelation(recentlyPlayedGame))\n .then(recomGameType => {\n this._recommendedGameType = recomGameType;\n return this._getRecommendedGameInfo(recomGameType);\n })\n .then(recomGameTypeInfo => {\n return this._showToaster(recomGameTypeInfo);\n });\n }\n\n private async _showToaster(gameInfo: ILocalizedGameInfo): Promise {\n this._onCloseAnalytics = this._defaultOnCloseAnalytics;\n\n const toasterHandler = this.serviceFactory.toasterProxyService().showIdleRecommendationToast({\n toastOptions: {\n timeout: TimeSpan.fromSeconds(this._displayInterval.totalSeconds),\n hideProgressBar: true,\n className: \"cgp-toaster-component\"\n },\n contentProps: {\n gameType: gameInfo.gameType,\n onPlayRecommendedGameHandler: () => {\n if(this._isIdleRecToasterDisplayed && this._toasterDisposer) {\n this._onCloseAnalytics = this._openedRecommendedGameAnalytics;\n this._toasterDisposer();\n this._toasterDisposer = null;\n }\n this.serviceFactory.gameRunnerProxyService().openRealGameFromSdkRequest(gameInfo.gameType);\n }\n },\n onToastShown: () => {\n this._onOpened();\n this._increaseAppearancesInSession();\n this._sendAnalytics({action: 'view', label: this._recommendedGameType, value: 1 + this._numberOfAppearancesInSession});\n },\n onToastClosed: () => {\n this._onClosed();\n }\n });\n this._toasterDisposer = toasterHandler?.close;\n\n }\n\n private async _getRecentlyPlayedGame(): Promise {\n const recentlyGamesPlayed = await this.serviceFactory.recentlyPlayedService().getRecentlyPlayedList();\n if (recentlyGamesPlayed.length === 0) {\n const { aiGameTypesArray } = (await this.serviceFactory.aiListService().getAIList()) || Object.assign({});\n\n if (_.isArray(aiGameTypesArray) && aiGameTypesArray.length > 0) return aiGameTypesArray[Math.floor(Math.random() * aiGameTypesArray.length)];\n else {\n this.logger.debug(`IdleRecommendations toaster - not displayed because we didnt get any ai list game`);\n return Promise.reject(false);\n }\n } else {\n return recentlyGamesPlayed[0];\n }\n }\n\n private async _getRecommendedGameBasedOnCorrelation(recentlyGamePlayed: number): Promise {\n const correlatedGames = await this.serviceFactory.gamesCorrelationService().getCorrelatedGames(recentlyGamePlayed, 6);\n if (_.isArray(correlatedGames) && correlatedGames.length === 0) {\n this.logger.debug(`IdleRecommendations toaster - not displayed because we didnt get correlated games for game type ${recentlyGamePlayed}`);\n return Promise.reject(false);\n }\n return correlatedGames[Math.floor(Math.random() * correlatedGames.length)];\n }\n\n private async _getRecommendedGameInfo(gameType: number): Promise {\n const gameDataInfo = await this.serviceFactory.gamesInformationService().getGamesInfo([gameType]);\n if (!gameDataInfo) {\n this.logger.debug(`IdleRecommendations toaster - not displayed because we didnt get game infos for gameType: ' ${gameType}`);\n return Promise.reject(false);\n }\n return gameDataInfo[gameType];\n }\n\n private _setIdleRecommendationDataInLocalStorage(): void {\n Store.set(IDLE_RECOMMENDATIONS_LOCAL_STORAGE_KEY, JSON.stringify({ noOfAppearancesInSession: this._numberOfAppearancesInSession || 0 }));\n }\n\n private _getNoOfAppearancesInSessionFromLocalStorage(): number {\n const { noOfAppearancesInSession } = _.safeJSON(Store.get(IDLE_RECOMMENDATIONS_LOCAL_STORAGE_KEY), {}) || Object.assign({});\n return noOfAppearancesInSession || 0;\n }\n\n private _resetAppearancesInSession(): void {\n this._numberOfAppearancesInSession = 0;\n this._setIdleRecommendationDataInLocalStorage();\n }\n\n private _increaseAppearancesInSession(): void {\n this._numberOfAppearancesInSession++;\n this._setIdleRecommendationDataInLocalStorage();\n }\n\n private _sendAnalytics(analyticsData): void{\n this.serviceFactory.analyticsService().sendClickstreamEvent(\n {\n eventName:'Orbit_AI_Feature',\n category: 'idleRecommendations',\n action: analyticsData?.action,\n label: analyticsData?.label,\n value: analyticsData?.value\n });\n }\n}\n","import BaseModelService from '../../base/base_model_service.ts';\nimport _ from '../../utils/underscore';\nimport Strings from '../../utils/strings';\n\n\n/**\n *\n *\n *\n */\nclass IntegrationModel extends BaseModelService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'IntegrationModel';\n\n\n /**\n * @property\n * @type {string[]}\n * @private\n */\n _allowedRoles = [\n 'b2c',\n 'dev'\n ];\n\n\n /**\n * @property\n * @type {string}\n * @private\n */\n _defaultRole = 'dev';\n\n\n /**\n * Define default marketing data.\n *\n * @type {null}\n * @private\n */\n _marketData = null;\n\n\n /**\n * Define marketing flow type.\n *\n * @type {null}\n * @private\n */\n _marketingFlowType = null;\n\n\n /**\n * Orbit header element\n * @type {null}\n * @private\n */\n _headerElementMethod = null;\n\n /**\n *\n * @param params\n */\n init(params) {\n super.init(params);\n\n if (params) {\n this\n .setRole(params.role)\n ._setHeaderElementMethod(params.headerElement)\n ._setHeaderRegulationDataElement(params.headerRegulationDataElement)\n ._setProxyLink(params.proxyLink)\n ._setGameTypeMapper(params.gameTypeMapper)\n ._setGamesList(params.gamesList)\n ._setParamsUrl(params.urlSessionParams)\n ._setAboutHelpLink(params.aboutHelpLink)\n ._setLobbyUrlLink(params.lobbyUrlLink)\n ._setThirdPartyCookieLink(params.thirdPartyCookieLink)\n ._setMDPImageMapper(params.MDPImageMapper)\n ._setRichSettings(params.rich)\n ._setCMSSource(params.CMSSource)\n ._setOpenInNewWindowHook(params.openInNewWindowHook)\n ._setIsMiniCipFunc(params.isMiniCipFunc)\n ._setIsMiniCisFunc(params.isMiniCisFunc);\n }\n }\n\n _richSettings = {};\n\n\n /**\n * @param richSettings\n * @returns {IntegrationModel}\n * @private\n */\n _setRichSettings(richSettings) {\n this._richSettings = richSettings || {};\n return this;\n }\n\n\n /**\n _openInNewWindowHook is a function that returns another function. This is a parameter provided by orbit and is necessary in mini orbit mode to handle external links.\n */\n _openInNewWindowHook = null;\n getOpenInNewWindowHook() {\n return this._openInNewWindowHook;\n }\n\n _setOpenInNewWindowHook(openInNewWindowHook) {\n this._openInNewWindowHook = openInNewWindowHook;\n return this;\n }\n\n _isMiniCipFunc = null;\n _setIsMiniCipFunc(isMiniCipFuc) {\n this._isMiniCipFunc = isMiniCipFuc;\n return this;\n }\n\n getIsMiniCip() {\n if (_.isFunction(this._isMiniCipFunc)) {\n return this._isMiniCipFunc();\n }\n\n return false;\n }\n\n _isMiniCisFunc = null;\n _setIsMiniCisFunc(isMiniCisFuc) {\n this._isMiniCisFunc = isMiniCisFuc;\n return this;\n }\n\n getIsMiniCis() {\n if (_.isFunction(this._isMiniCisFunc)) {\n return this._isMiniCisFunc();\n }\n\n return false;\n }\n\n getHeaderRegulationDataElement() {\n return this._headerRegulationDataElementMethod();\n }\n\n _setHeaderRegulationDataElement(headerRegulationDataElementMethod) {\n if (_.isFunction(headerRegulationDataElementMethod)) {\n this._headerRegulationDataElementMethod = headerRegulationDataElementMethod;\n } else {\n this._headerRegulationDataElementMethod = () => Promise.resolve(null);\n }\n\n return this;\n }\n\n _setHeaderElementMethod(headerElementMethod) {\n if (_.isFunction(headerElementMethod)) {\n this._headerElementMethod = headerElementMethod;\n } else {\n this._headerElementMethod = () => Promise.resolve(null);\n }\n\n return this;\n }\n\n /**\n * @returns {string}\n */\n getRichPageUrl(campaignId) {\n if (!this._richSettings.richPageUrl) {\n this.throwError('175', 'RICH page URL was not provided in the integration');\n }\n\n let richPageUrl = new Strings(this._richSettings.richPageUrl);\n return richPageUrl.injectIntoCurly({campaignid: campaignId});\n }\n\n /**\n * Set the new role.\n *\n * @param role\n * @returns {IntegrationModel}\n */\n setRole(role = this._defaultRole) {\n if (!_.isString(role)) {\n this._role = this._defaultRole;\n }\n\n let allowedRole = this._allowedRoles.find(r => r === role);\n\n this._role = !_.isUndefined(allowedRole) ? allowedRole : this._defaultRole;\n return this;\n }\n\n\n /**\n * Set third party cookie link from initialization.\n *\n * @param thirdPartyCookieLink\n * @returns {IntegrationModel}\n * @private\n */\n _setThirdPartyCookieLink(thirdPartyCookieLink = '') {\n if (!_.isString(thirdPartyCookieLink)) {\n this._thirdPartyCookieLink = '';\n return this;\n }\n\n this._thirdPartyCookieLink = thirdPartyCookieLink;\n return this;\n }\n\n\n /**\n * Update marketing flow type.\n *\n * @param marketingFlowType\n * @returns {IntegrationModel}\n * @private\n */\n _updateMarketingFlowType(marketingFlowType = null) {\n if (_.isNull(marketingFlowType) || _.isUndefined(marketingFlowType)) {\n this._marketingFlowType = null;\n }\n\n this._marketingFlowType = marketingFlowType;\n return this;\n }\n\n\n /**\n * Update recent market data model.\n *\n * @param marketData\n * @returns {IntegrationModel}\n * @private\n */\n _updateMarketData(marketData = null) {\n if (_.isNull(marketData) || _.isUndefined(marketData)) {\n this._marketData = null;\n }\n\n this._marketData = marketData;\n return this;\n }\n\n\n /**\n * Set integration game type mapper.\n *\n * @param gameTypeMapperRef\n * @returns {IntegrationModel}\n * @private\n */\n _setGameTypeMapper(gameTypeMapperRef) {\n if (_.isFunction(gameTypeMapperRef)) {\n this._gameTypeMapperRef = gameTypeMapperRef;\n } else {\n this._gameTypeMapperRef = () => Promise.resolve();\n }\n\n return this;\n }\n\n /**\n * Setter for a proxy to redirect. This used for pass redirect managing to third party side\n * @param proxyScopeCallback\n * @returns {IntegrationModel}\n * @private\n */\n _setProxyLink(proxyLink) {\n if (!_.isFunction(proxyLink)) {\n return this;\n }\n\n this._proxyLink = proxyLink;\n return this;\n }\n\n\n /**\n * Set list of all games in the site\n * @param gamesList\n * @returns {IntegrationModel}\n * @private\n */\n _setGamesList(gamesList) {\n if (!_.isArray(gamesList)) {\n return this;\n }\n\n this._gamesList = gamesList;\n return this;\n }\n\n\n /**\n * Set integration url for session params.\n *\n * @param url\n * @returns {IntegrationModel}\n * @private\n */\n _setParamsUrl(url) {\n if (!_.isString(url)) {\n return this;\n }\n\n this._urlParams = url;\n return this;\n }\n\n\n /**\n * Setter about link integration parameter.\n *\n * @param aboutHelpLink\n * @returns {IntegrationModel}\n * @private\n */\n _setAboutHelpLink(aboutHelpLink) {\n if (!_.isString(aboutHelpLink)) {\n this._aboutHelpLink = '#';\n return this;\n }\n\n this._aboutHelpLink = aboutHelpLink;\n return this;\n }\n\n\n /**\n * Setter lobby URL link integration parameter.\n *\n * @param lobbyUrlLink\n * @returns {IntegrationModel}\n * @private\n */\n _setLobbyUrlLink(lobbyUrlLink) {\n if (!_.isString(lobbyUrlLink)) {\n this._myAccountToLobbyUrlLink = '#';\n return this;\n }\n\n this._lobbyUrlLink = lobbyUrlLink;\n return this;\n }\n\n\n\n /**\n *\n * @returns {*}\n */\n getParamsUrl() {\n return this._urlParams;\n }\n\n\n /**\n * Set mapper to MDP messages. Mapper contains definition which message has an image\n *\n * @param mapper\n * @returns {IntegrationModel}\n * @private\n */\n _setMDPImageMapper(mapper = {}) {\n this._MDPImageMapper = mapper;\n if (_.isObject(mapper)) {\n this._MDPImageMapper = mapper;\n }\n return this;\n }\n\n /**\n * Get role from the model.\n *\n * @returns {string|*}\n */\n getRole() {\n return this._role;\n }\n\n\n /**\n * Get integration game type mapper reference.\n *\n * @returns {*}\n */\n getGameTypeMapper() {\n return this._gameTypeMapperRef;\n }\n\n\n /**\n * Getter about help link.\n *\n * @returns {*|string}\n */\n getAboutHelpLink() {\n return this._aboutHelpLink;\n }\n\n\n /**\n * Getter lobby URL link.\n *\n * @returns {*|string}\n */\n getLobbyUrlLink() {\n return this._lobbyUrlLink;\n }\n\n\n /**\n * Get recent market data.\n *\n * @returns {{}|*}\n */\n getRecentMarketData() {\n return this._marketData;\n }\n\n /**\n * Get current marketing flow type.\n *\n * @returns {{}|*}\n */\n getMarketingFlowType() {\n return this._marketingFlowType;\n }\n\n\n /**\n * Get MDP message mapper\n *\n * @returns {{}|*}\n */\n getMDPImageMapper() {\n return this._MDPImageMapper;\n }\n\n /**\n * Get redirect proxy scope\n * @returns {*|null}\n */\n getProxyLink() {\n return this._proxyLink || null;\n }\n\n _setCMSSource(cmsSource){\n this._cmsSource = cmsSource || '';\n return this;\n }\n\n getCMSSource(){\n return this._cmsSource;\n }\n}\nexport default IntegrationModel;","import BaseObject from '../../../base/base_object';\nimport Strings from '../../../utils/strings';\nimport ServiceFactory from '../../service_factory';\n\n\nclass BaseIntegration extends BaseObject {\n static CLASS = 'BaseIntegration';\n\n init(params) {\n super.init(params);\n }\n\n /**\n * Bake params with a proper form and default data.\n *\n * @param dataObj\n * @param property\n * @returns {{}}\n */\n bakeParams(dataObj, property) {\n if (!dataObj) {\n this.logger.error('Provider data obj is not valid!');\n return {};\n }\n\n if (!dataObj[property]) {\n this.logger.error('Provider data obj data ' + property + ' is invalid.');\n return {};\n }\n\n return dataObj[property] || {};\n }\n\n\n /**\n * Request async http request to the olympus (b2c, b2x etc..).\n *\n * @param options\n * @returns {Promise.|*|Promise}\n */\n send(options) {\n let stringUtil = new Strings(options.url);\n let shouldReplaceOrigin = stringUtil.startsWith('http://') || stringUtil.startsWith('https://');\n\n if (!shouldReplaceOrigin) {\n options.url = window.location.href + options.url;\n }\n\n return ServiceFactory.create().http2Service().post(options.url, options.params)\n .then(() =>{\n this.logger.debug('Success response => ', options.role);\n })\n .catch(() => {\n this.logger.error('Failed response from => ', options.role);\n });\n }\n}\n\nexport default BaseIntegration;","import BaseIntegration from '../../vendors/base_integration';\n\nclass IntegrationB2C extends BaseIntegration {\n /**\n *\n * @type {string}\n * @private\n */\n _role = 'b2c';\n\n\n init(params) {\n super.init(params);\n }\n}\n\n\nexport default IntegrationB2C;","import Model from './integration_model';\nimport Event from '../../utils/event';\nimport {SYSTEM_EVENTS} from '../../events/events';\nimport _ from '../../utils/underscore';\nimport Strings from '../../utils/strings';\nimport * as INTEGRATION from './integration_const';\nimport IntegrationB2C from './vendors/b2c/integration_b2c';\nimport Device from '../../utils/device/device';\nimport Store from '../../utils/store';\nimport BaseService from '../../base/base_service';\n\nclass IntegrationService extends BaseService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'IntegrationService';\n\n\n /**\n * @property\n * @type {object|null}\n * @private\n */\n _model = null;\n\n\n /**\n * Integration map factory.\n *\n * @type {Object}\n * @private\n */\n _integrationMapFactory = Object.create(null);\n\n\n /**\n * Selected vendor.\n *\n * @type {null}\n * @private\n */\n _selectedVendor = null;\n\n\n /**\n * Token unique data to send to marketing b2c b2x b2zubi etc..\n *\n * @type {Object}\n * @private\n */\n _providerData = null;\n\n\n /**\n *\n * @param params\n */\n init(params) {\n super.init(params);\n\n this._model = Model.create(params);\n this._subscribe();\n this._initializeIntegrationMap();\n }\n\n getLinkProxyExecution() {\n return this._model.getProxyLink();\n }\n\n getNavbarContainerElementSelector() {\n return this._model.getNavbarContainerElementSelector();\n }\n\n getNavbarRegulationElementSelector() {\n return this._model.getNavbarRegulationElementSelector();\n }\n\n\n /**\n *\n * @returns {IntegrationService}\n * @private\n */\n _initializeIntegrationMap() {\n this._integrationMapFactory[INTEGRATION.B2C] = IntegrationB2C;\n\n return this;\n }\n\n\n /**\n * Get vendor action\n *\n * @param action\n * @returns {*}\n * @private\n */\n _vendorAction(action) {\n let vendor = this._integrationMapFactory[this.getRole()] || null;\n\n if (!_.isNull(this._selectedVendor)) {\n if (!_.isFunction(this._selectedVendor[action])) {\n this.logger.error('There is no action ' + action + ' for vendor => ', vendor);\n return;\n }\n\n return this._selectedVendor[action];\n }\n\n if (_.isNull(vendor)) {\n this.logger.error('Could not find vendor instance for role => ', this.getRole());\n return;\n }\n\n this._selectedVendor = vendor.create({});\n\n if (!_.isFunction(this._selectedVendor[action])) {\n this.logger.error('There is no action ' + action + ' for vendor => ', vendor);\n return;\n }\n\n return this._selectedVendor[action].bind(this._selectedVendor);\n }\n\n\n /**\n * Check whether the integration has available marketing data.\n *\n * @returns {boolean}\n */\n isMarketingDataExist() {\n return !_.isNull(this.getRecentMarketData());\n }\n\n\n /**\n * Get application consumer role.\n *\n * @returns {*}\n */\n getRole() {\n return this._model.getRole();\n }\n\n\n /**\n * Get about help link.\n *\n * @returns {*}\n */\n getAboutHelpLink() {\n return this._model.getAboutHelpLink();\n }\n\n\n /**\n * Get MyAccountToLobbyUrlLink link.\n *\n * @returns {string}\n */\n getLobbyUrlLink() {\n return this._model.getLobbyUrlLink();\n }\n\n\n /**\n * Filter the list with games are available in the site\n * @param gameList\n */\n // getAvailableGameList(gameList) {\n // if (!_.isArray(gameList)) {\n // return [];\n // }\n // let availableGames = this._model.getGamesList();\n // return gameList.filter((game) => {\n // return availableGames.find((availableGame) => {\n // return availableGame === game\n // });\n // });\n // }\n\n /**\n * return regulation data element only\n * @returns {*}\n */\n getHeaderRegulationDataElement() {\n return this._model.getHeaderRegulationDataElement();\n }\n\n\n /**\n * Middleware to check whether the mapper is promise type if not return reject!\n *\n * @param gameTypeList\n * @returns {*}\n */\n gameTypeMapperIsPromiseMiddleWare(gameTypeList) {\n\n let gameTypeMapperRef = this._model.getGameTypeMapper();\n\n if (!_.isFunction(gameTypeMapperRef)) {\n return new Promise((resolve, reject) => {\n reject({error: 'Host user not override SDK integration gameTypeMapper function.'});\n });\n }\n\n let gameTypeMapperRefPromise = gameTypeMapperRef(gameTypeList);\n\n if (_.isUndefined(gameTypeMapperRefPromise) || _.isNull(gameTypeMapperRefPromise)) {\n this.logger.debug('Invalid result from mapper we expecting for promise => ', gameTypeMapperRefPromise);\n return new Promise((resolve, reject) => {\n reject({error: 'Host user not must set promise type function SDK integration gameTypeMapper function.'});\n });\n }\n\n if (!_.isFunction(gameTypeMapperRefPromise.then)) {\n this.logger.error('Must return promise type function!');\n return new Promise((resolve, reject) => {\n reject({error: 'Host user not must set promise type function SDK integration gameTypeMapper function.'});\n });\n }\n\n return gameTypeMapperRefPromise;\n }\n\n\n\n /**\n * Get game addional data from host side by game type list.\n *\n * @param gameTypeList\n * @returns {*}\n */\n getGameTypeMapper(gameTypeList) {\n return this.gameTypeMapperIsPromiseMiddleWare(gameTypeList);\n }\n\n\n getAllGameTypes() {\n return this.getGameTypeMapper()\n .then(gamesMap => {\n return Object.keys(gamesMap).map((key) => Number(key));\n });\n }\n\n filterAllowedToPlayRealGames(gameTypes) {\n return this.serviceFactory.gamesInformationService().getGamesInfo(gameTypes)\n .then(gamesInfo => {\n let result = [];\n gameTypes.forEach(gt => {\n let gameInfo = gamesInfo[gt];\n if(gameInfo && gameInfo.restriction.isGameAllowedToPlayReal()) {\n result.push(gt);\n }\n });\n\n return result;\n });\n }\n\n filterInLayoutGames(gameTypesToFilter) {\n return this.getGameTypeMapper()\n .then(gamesMap => gameTypesToFilter.filter(gt => gamesMap[gt]));\n }\n\n /**\n * Get recent market data according to marketing flow key.\n *\n * @returns {*}\n */\n getRecentMarketData() {\n let marketData = this._model.getRecentMarketData() ,\n marketingFlowType = this._model.getMarketingFlowType();\n\n if(_.isNull(marketData) || _.isUndefined(marketData[marketingFlowType]))\n return marketData;\n\n return marketData[marketingFlowType];\n }\n\n\n /**\n * Get MDP message mapper\n *\n * @returns {{}|*}\n */\n getMDPImageMapper() {\n return this._model.getMDPImageMapper();\n }\n\n\n /**\n * Subscribe application events.\n *\n * @private\n */\n _subscribe() {\n this.onSystemEvent(SYSTEM_EVENTS.INCOMING_MARKETING_DATA, this._updateMarketingData);\n this.onSystemEvent(SYSTEM_EVENTS.INCOMING_MARKETING_FLOW, this._updateMarketingFlowType);\n }\n\n\n /**\n * Update recent marketing data;\n * @param flowType - const \"MARKETING_FLOWS\" within integration_const.js\n * @private\n */\n _updateMarketingFlowType(flowType) {\n this._model._updateMarketingFlowType(flowType);\n }\n\n\n\n /**\n * Update recent marketing data;\n * @param marketData\n * @private\n */\n _updateMarketingData(marketData) {\n this._model._updateMarketData(marketData);\n }\n\n /**\n * Request async http request to the olympus (b2c, b2x etc..).\n *\n * @param options\n * @returns {Promise.|*|Promise}\n */\n requestToTheOlympus(options) {\n let stringUtil = new Strings(options.url);\n let shouldReplaceOrigin = stringUtil.startsWith('http://') || stringUtil.startsWith('https://');\n\n if (!shouldReplaceOrigin) {\n //If we got valid cms source we will use it and not window.location - to support localhost (embedded Hybrid )\n let cmsSource = this.getCmsSourceIfValid();\n if (cmsSource) {\n options.url = cmsSource + options.url;\n } else {\n options.url = window.location.protocol + '//' + window.location.hostname + options.url;\n }\n\n return this.serviceFactory.http2Service().post(options.url, options.params)\n .then(() => {\n this.logger.debug('Success response => ', options.role);\n })\n .catch((responseError) => {\n this.logger.error('Failed response from => ', 'Role: ', options.role, 'Url: ', options.url, 'Params: ', options.params, 'responseError: ', responseError);\n });\n }\n\n }\n\n isMiniCip() {\n return this._model.getIsMiniCip();\n }\n\n isMiniCis() {\n return this._model.getIsMiniCis();\n }\n\n isMiniOrbit() {\n return this.isMiniCip() || this.isMiniCis();\n }\n\n\n/**\n * Bake params with a proper form and default data.\n *\n * @param dataObj\n * @param property\n * @returns {{}}\n */\n bakeParams(dataObj, property) {\n if (!dataObj) {\n this.logger.error('Provider data obj is not valid!');\n return {};\n }\n\n if (!dataObj[property]) {\n this.logger.error('Provider data obj data ' + property + ' is invalid.');\n return {};\n }\n\n return dataObj[property] || {};\n }\n\n\n /**\n * Get provider data from token.\n *\n * @returns {{}}\n */\n getProviderTokenData() {\n let oauth = this.serviceFactory.oAuth2Service();\n\n if (this._providerData) {\n this.logger.debug('Provider data from token exist so we returned it => ', this._providerData);\n return this._providerData;\n }\n\n let role = this._model.getRole();\n\n this.logger.debug('Provider data from token not exist so we extract from token by role => ', role);\n\n let providerData = oauth.extractTokenProperty(role);\n\n this.logger.debug('Extracted provider data from token => ', providerData);\n\n if ('-1' === providerData || _.isNull(providerData)) {\n this.logger.debug('Not returned from server unique key for the role => ', role);\n return {};\n }\n\n this._providerData = _.safeJSON(oauth.extractTokenProperty(role), {});\n\n this.logger.debug('Parsed provider data to json object => ', this._providerData);\n\n return this._providerData;\n }\n\n /**\n * Gets the RICH page URL\n * @returns {*}\n */\n getRichPageUrl(campaignId) {\n return this._model.getRichPageUrl(campaignId);\n }\n\n getMarketingData() {\n const marketingData = {};\n let tempMarketData;\n if (this.isMarketingDataExist()) {\n tempMarketData = this.getRecentMarketData();\n // Use it when there are complex objects in marketData\n Object.keys(tempMarketData).forEach((key) => {\n if (_.isString(tempMarketData[key])) {\n marketingData[key] = tempMarketData[key];\n } else {\n marketingData[key] = JSON.stringify(tempMarketData[key]);\n }\n });\n }\n\n return marketingData;\n }\n\n executeMarketingDataFunction(marketingDataFunctionCall) {\n try {\n let parsedFunction = _.parseStringFunction(marketingDataFunctionCall);\n let marketingFunctionRef = window[parsedFunction.functionName];\n\n this.logger.debug('Register (or cashier) clicked, trying to call global get marketing data => ', marketingDataFunctionCall);\n\n if (_.isFunction(marketingFunctionRef)) {\n Event.fire(SYSTEM_EVENTS.INCOMING_MARKETING_DATA, marketingFunctionRef.apply(marketingFunctionRef, [parsedFunction.functionStringParams]));\n }\n\n } catch (ex) {\n this.logger.error(`Could not parse market data function ${marketingDataFunctionCall} => `, ex);\n }\n }\n\n\n openInNewWindowHook() {\n const hook = this._model.getOpenInNewWindowHook();\n return hook && hook();\n }\n\n /**\n * @description Return the cms source if it valid url\n * @return {boolean | *}\n */\n getCmsSourceIfValid() {\n const cmsSource = this._model.getCMSSource();\n if(_.isString(cmsSource) && (cmsSource.startsWith('http://') || cmsSource.startsWith('https://'))) {\n return cmsSource\n }\n return false\n }\n\n _addRunTimeSegments(message) {\n this._addAODSegments(message);\n this._addB2CSegment(message);\n }\n\n _addAODSegments(message) {\n if (Device.hybrid.isEmbedded) {\n message.cookie_cstatus = Store.getCookie(\"cstatus\");\n message.cookie_tstatus = Store.getCookie(\"tstatus\");\n }\n }\n\n _addB2CSegment(message) {\n const b2cFeatureName = \"B2CABTest\";\n let b2cSegments;\n const isAuth = this.serviceFactory.oAuth2Service().isAuthorized();\n if (isAuth) {\n b2cSegments = this.serviceFactory.abTestingService().getAbTestingDataForFeature(b2cFeatureName);\n } else {\n b2cSegments = this.serviceFactory.abTestingService().getAnonymousPlayerAbTestingDataForFeature(b2cFeatureName, true);\n }\n\n if (b2cSegments && b2cSegments.Properties[\"group\"]) {\n message.B2CABTest = b2cSegments.Properties[\"group\"];\n } else {\n this.logger.warn(`AbTestingFeature ${b2cFeatureName} not found! isAuth: ${isAuth}`);\n }\n }\n\n /**\n * @description Extract the user token data + signature for both stats(authorized/anonymous)\n */\n getUserSegments() {\n let messageKey, signatureKey;\n let providerDataObj = this.getProviderTokenData() || {};\n let sessionParams = {};\n\n //If we got empty object so we will send default params\n if(Object.keys(providerDataObj).length === 0){\n let message = {\n BrandID: this.serviceFactory.skinService().getBrandID(),\n SubBrandID: this.serviceFactory.skinService().getSubBrandID(),\n SystemId: this.serviceFactory.skinService().getPlatformSystemID() || '75',\n lang: this.serviceFactory.languageService().getISO2(),\n IsEmbeddedHybrid : Device.hybrid.isEmbedded,\n IsHybrid : Device.hybrid.isHybrid,\n ProductPackage: this.serviceFactory.skinService().getProductPackageID(),\n }\n\n const lastSessionData = this.serviceFactory.oAuth2Service().getLastSessionData();\n if(lastSessionData) {\n message.RegulationStatusId = lastSessionData.message?.RegulationStatusId;\n message.IsRisky = lastSessionData.message?.IsRisky;\n }\n\n this._addRunTimeSegments(message);\n\n sessionParams.message = JSON.stringify(message);\n return sessionParams;\n }\n\n if (this.serviceFactory.oAuth2Service().isAuthorized()) {\n messageKey = 'sessionParamsMsg';\n signatureKey = 'sessionParamsSignature';\n }else{\n messageKey = 'logoutObjMsg';\n signatureKey = 'logoutObjSignature';\n }\n\n //normally we don't write data on the fly there, providerDataObj is coming filled in with all the data from backend side\n //but here we need to access cookies for current domain - this is suitable for frontend side\n this._addRunTimeSegments(providerDataObj[messageKey]);\n\n sessionParams.message = JSON.stringify(this.bakeParams(providerDataObj, messageKey));\n sessionParams.signature = this.bakeParams(providerDataObj, signatureKey);\n\n return sessionParams;\n }\n}\nexport default IntegrationService;","/**\n * Daily Jackpot States:\n * https://confluence/display/SECTION8/Daily+Jackpot+mechanism\n */\nexport enum DAILY_JACKPOTS_STATES {\n NONE = 0,\n SUPER_COLD = 1,\n COLD = 2,\n HOT = 3,\n SUPER_HOT = 4,\n HOT_100 = 5,\n}\n\nexport interface IJackpotToastersThresholdDetails {\n threshold: number,\n toasterName: string,\n contentText: string,\n titleText?: string\n}\n\nexport interface IToasterPerGame {\n thresholds: IJackpotToastersThresholdDetails[],\n gameTypes: number[],\n showGameIcon: boolean\n}\n\nexport const DAILY_JACKPOTS_AMOUNT_THRESHOLDS_DEFAULT: IJackpotToastersThresholdDetails[] = [\n {\n threshold: 10000000,\n toasterName: 'DAILY_JP_ALERT_100K',\n contentText: 'jackpot_amount_threshold_text_template5'\n },\n {\n threshold: 9000000,\n toasterName: 'DAILY_JP_ALERT_90K',\n contentText: 'jackpot_amount_threshold_text_template7'\n },\n {\n threshold: 8000000,\n toasterName: 'DAILY_JP_ALERT_80K',\n contentText: 'jackpot_amount_threshold_text_template6'\n },\n {\n threshold: 7500000,\n toasterName: 'DAILY_JP_ALERT_75K',\n contentText: 'jackpot_amount_threshold_text_template5'\n },\n {\n threshold: 6000000,\n toasterName: 'DAILY_JP_ALERT_60K',\n contentText: 'jackpot_amount_threshold_text_template4'\n },\n {\n threshold: 5000000,\n toasterName: 'DAILY_JP_ALERT_50K',\n contentText: 'jackpot_amount_threshold_text_template3'\n },\n {\n threshold: 4000000,\n toasterName: 'DAILY_JP_ALERT_40K',\n contentText: 'jackpot_amount_threshold_text_template2'\n },\n {\n threshold: 2500000,\n toasterName: 'DAILY_JP_ALERT_25K',\n contentText: 'jackpot_amount_threshold_text_template1'\n }\n];\n\nexport const TWILIGHT_JACKPOTS_AMOUNT_THRESHOLDS_DEFAULT: IJackpotToastersThresholdDetails[] = [\n {\n threshold: 3000000,\n toasterName: 'TWILIGHT_JP_ALERT_30K',\n contentText: 'jackpot_amount_threshold_text_template6'\n },\n {\n threshold: 2000000,\n toasterName: 'TWILIGHT_JP_ALERT_20K',\n contentText: 'jackpot_amount_threshold_text_template4'\n },\n {\n threshold: 1500000,\n toasterName: 'TWILIGHT_JP_ALERT_15K',\n contentText: 'jackpot_amount_threshold_text_template3'\n },\n {\n threshold: 1200000,\n toasterName: 'TWILIGHT_JP_ALERT_12K',\n contentText: 'jackpot_amount_threshold_text_template2'\n },\n {\n threshold: 750000,\n toasterName: 'TWILIGHT_JP_ALERT_7.5K',\n contentText: 'jackpot_amount_threshold_text_template1'\n }\n];\n\n","import BaseService from \"../../base/base_service\";\nimport { SYSTEM_EVENTS } from \"../../events/events\";\nimport {\n DAILY_JACKPOTS_AMOUNT_THRESHOLDS_DEFAULT, DAILY_JACKPOTS_STATES\n , IJackpotToastersThresholdDetails, IToasterPerGame, TWILIGHT_JACKPOTS_AMOUNT_THRESHOLDS_DEFAULT\n} from \"./jackpot_toasters_consts\";\nimport { IJackpotDataById, IJackpotData } from \"../live_feeds/jackpots/jackpot_feeds_service_interface\";\nimport { JackpotInternalId } from '../../../../common/const/jackpot_map_ids';\nimport _ from '../../utils/underscore';\nimport {TimeSpan} from \"@sparkware/app-utils\";\n\ninterface IJackpotToastersServiceParams {\n toasterImage: string;\n dailyJackpotAmountThresholds?: IJackpotToastersThresholdDetails[];\n twilightJackpotAmountThresholds?: IJackpotToastersThresholdDetails[];\n dailyJackpot: {\n gameTypeToPlay: number;\n },\n twilightJackpot: {\n gameTypeToPlay: number;\n }\n progressiveJackpot: {\n enabled: boolean;\n }\n toasterPerGame?: IToasterPerGame[];\n}\n\nexport default class JackpotToastersService extends BaseService {\n static CLASS: string = 'JackpotToastersService';\n\n private _previousJackpot: {[key: number]:IJackpotData} = {};\n private _previousJackpotPerGameType = {};\n\n private _params: IJackpotToastersServiceParams = null;\n\n init(params: IJackpotToastersServiceParams) {\n super.init(params);\n this._params = params;\n this._subscribe();\n }\n\n private _subscribe(): void {\n this.onSystemEvent(SYSTEM_EVENTS.LIVE_FEEDS_JACKPOTS_BY_ID_UPDATED, this._stateJackpotUpdate);\n\n if(this._params?.progressiveJackpot.enabled && this._params?.toasterPerGame?.length > 0) {\n this.onSystemEvent(SYSTEM_EVENTS.LIVE_FEEDS_JACKPOT_AMOUNTS_BY_GAME_UPDATED, this._onJackpotUpdate);\n }\n\n this.onSystemEvent(SYSTEM_EVENTS.APP_PAUSED, this.clearPreviousJackpotsAmounts);\n }\n\n private clearPreviousJackpotsAmounts() {\n this._previousJackpotPerGameType = {};\n this._previousJackpot = {};\n }\n\n private _onJackpotUpdate(gamesJackpots) {\n this._params?.toasterPerGame?.forEach((toasterPerGameItem)=> {\n toasterPerGameItem?.gameTypes?.forEach((gameType)=> {\n if (this.serviceFactory.oAuth2Service().isAuthorized()) {\n let jackpotAmount = gamesJackpots[gameType];\n\n if(jackpotAmount) {\n if(this._previousJackpotPerGameType[gameType]) {\n this._checkThreshold(jackpotAmount, this._previousJackpotPerGameType[gameType], toasterPerGameItem?.thresholds, gameType, null, toasterPerGameItem.showGameIcon);\n }\n\n this._previousJackpotPerGameType[gameType] = jackpotAmount;\n }\n } else {\n // Initialize previous jackpot.\n this._previousJackpotPerGameType[gameType] = null;\n }\n });\n });\n }\n\n private _getResolvedGameImagePath(gameData) {\n return this.serviceFactory.gameService().resolveGameImagePath(gameData.images && gameData.images.icon);\n }\n\n private _checkThreshold(jackpotAmount: number, oldJackpotAmount: number, thresholds: IJackpotToastersThresholdDetails[], gameTypeToPlay: number, titleText: string, showGameIcon: boolean = false): void {\n for (let index = 0; index < thresholds.length; index++) {\n const currentThresholdData = thresholds[index];\n\n if (jackpotAmount > currentThresholdData.threshold &&\n oldJackpotAmount <= currentThresholdData.threshold) {\n this._showToaster(currentThresholdData, gameTypeToPlay, currentThresholdData?.titleText || titleText, showGameIcon);\n break;\n }\n }\n }\n\n private _checkIfJackpotDrop(currentJackpotData: IJackpotData, jackpotID:string, titleText: string) {\n if(currentJackpotData.JackpotState === DAILY_JACKPOTS_STATES.SUPER_COLD &&\n this._previousJackpot[jackpotID] &&\n this._previousJackpot[jackpotID].JackpotState !== DAILY_JACKPOTS_STATES.SUPER_COLD) {\n this._showJackpotDropToaster(currentJackpotData, titleText);\n }\n }\n\n private _showJackpotDropToaster(toasterData: IJackpotData, titleText: string) {\n this.serviceFactory.toasterProxyService().showStandardToast({\n id: 'DAILY_JP_DROP_ALERT',\n toastOptions: { timeout: TimeSpan.fromSeconds(15) },\n contentProps: {\n title: this.serviceFactory.languageService().translation(titleText, {jackpotAmount: this.serviceFactory.currencyService().formatMoney(toasterData.LastWinAmount)}),\n message: this.serviceFactory.languageService().translation('jackpot_drop_toaster_text'),\n image: this._params.toasterImage,\n button: {\n text: this.serviceFactory.languageService().translation('game_item_play_btn'),\n onClick: (closeToast) => {\n this.serviceFactory.windowService().redirect('/jackpots/');\n closeToast();\n }\n }\n }\n });\n }\n\n private async _showToaster(toasterData: IJackpotToastersThresholdDetails, gameTypeToPlay: number, titleText: string, showGameIcon:boolean = false) {\n const gameInfo = await this.serviceFactory.gamesInformationService().getGamesInfo([gameTypeToPlay]);\n if(!gameInfo || !gameInfo[gameTypeToPlay]) {\n this.logger.warn(`gameInfo for the toaster button not found. gameType: ${gameTypeToPlay}`);\n return;\n }\n\n this.serviceFactory.toasterProxyService().showStandardToast({\n id: toasterData.toasterName,\n toastOptions: {\n timeout: TimeSpan.fromSeconds(15)\n },\n contentProps: {\n title: this.serviceFactory.languageService().translation(titleText, {gameName: gameInfo[gameTypeToPlay].title}),\n message: this.serviceFactory.languageService().translation(toasterData.contentText, {\n currencySymbol: this.serviceFactory.currencyService().getCurrencySymbol(),\n jackpotThreshold: _.formatNumberToBytesNotation(toasterData.threshold / 100, 2)\n }),\n image: showGameIcon ? this._getResolvedGameImagePath(gameInfo[gameTypeToPlay]) : this._params.toasterImage,\n button: {\n text: this.serviceFactory.languageService().translation('game_item_play_btn'),\n onClick: (closeToast) => {\n this.serviceFactory.gameRunnerProxyService().openRealGameFromSdkRequest(gameTypeToPlay);\n closeToast();\n }\n }\n }\n });\n }\n\n private _stateJackpotToaster(stateJackpot: IJackpotData, thresholdReachedTitleText:string, thresholds: IJackpotToastersThresholdDetails[], gameTypeToPlay: number, jackpotID: string, dropTitleText: string) {\n // if not authorized or cold state- should not show toaster\n if (stateJackpot && this.serviceFactory.oAuth2Service().isAuthorized()) {\n // we don't want notification to show when user refreshed page and we don't have previous value\n // and even after some JP updates we want to show it only after next threshold is reached\n if(stateJackpot.JackpotState !== DAILY_JACKPOTS_STATES.SUPER_COLD && this._previousJackpot[jackpotID] && stateJackpot) {\n this._checkThreshold(stateJackpot?.AmountInCents,\n this._previousJackpot[jackpotID]?.AmountInCents, // can be undefined\n thresholds,\n gameTypeToPlay,\n thresholdReachedTitleText,\n false\n );\n } else {\n this._checkIfJackpotDrop(stateJackpot, jackpotID, dropTitleText);\n }\n\n this._previousJackpot[jackpotID] = stateJackpot;\n }\n }\n\n private _stateJackpotUpdate(jackpotsWithState: Record): void {\n if(jackpotsWithState[JackpotInternalId.Daily]) {\n this._stateJackpotToaster(jackpotsWithState[JackpotInternalId.Daily].Jackpot,\n 'jackpot_threshold_toaster_title',\n this._params?.dailyJackpotAmountThresholds || DAILY_JACKPOTS_AMOUNT_THRESHOLDS_DEFAULT,\n this._params?.dailyJackpot.gameTypeToPlay,\n '8000',\n 'jackpot_drop_toaster_title'\n );\n }\n\n if(jackpotsWithState[JackpotInternalId.Twilight]) {\n this._stateJackpotToaster(jackpotsWithState[JackpotInternalId.Twilight].Jackpot,\n 'twilight_jackpot_threshold_toaster_title',\n this._params?.twilightJackpotAmountThresholds || TWILIGHT_JACKPOTS_AMOUNT_THRESHOLDS_DEFAULT,\n this._params?.twilightJackpot.gameTypeToPlay,\n '8001',\n 'twilight_jackpot_drop_toaster_title'\n );\n }\n }\n}\n","import BaseService from '../../base/base_service';\nimport _ from '../../utils/underscore';\nimport DOM from '../../utils/dom';\nimport Strings from '../../utils/strings';\nimport ILanguageService from './language_service_interface';\n\n\nexport interface LanguageServiceParams {\n iso3: string;\n iso2: string;\n isRTL: boolean;\n text: {[key: string]: string};\n};\n\n\n/**\n *\n * Language class is used for string translation\n *\n */\nexport default class LanguageService extends BaseService implements ILanguageService {\n static CLASS = 'LanguageService';\n\n\n private _params: LanguageServiceParams = null;\n\n\n init(params: LanguageServiceParams) {\n super.init(params);\n\n this._params = params || {} as LanguageServiceParams;\n this._setRTLLanguageClass();\n }\n\n getIsRTL(): boolean {\n return this._params.isRTL;\n }\n\n getISO3(): string {\n return this._params.iso3;\n }\n\n getISO2(): string {\n return this._params.iso2;\n }\n\n\n translation(key: string, params?: {[key: string]: any}): string {\n if (_.isNullOrUndefined(key)) {\n this.logger.error('The key to translate is null or undefined, key: ' + key);\n return '';\n }\n\n key = key.toString().trim().toLowerCase();\n if (_.isEmpty(key)) {\n this.logger.error('The key to translate is empty');\n return '';\n }\n\n const text = this._params.text;\n\n if (!text) {\n this.logger.error(`There are no translation for ${this._params.iso3} language`);\n return '';\n }\n\n if (!text[key]) {\n this.logger.error(`The key ${key} does not exists in the translation`);\n return '';\n }\n\n const textTemplate = text[key];\n if (params) {\n return new Strings(textTemplate).injectIntoCurly(params);\n } else {\n return textTemplate;\n }\n }\n\n private _setRTLLanguageClass(): void {\n const CGP_RTL = 'cgp-rtl';\n if (this._params.isRTL) {\n DOM.addClass(DOM.getHTML(), CGP_RTL);\n } else {\n DOM.removeClass(DOM.getHTML(), CGP_RTL);\n }\n }\n}\n","import ILinksNavigationProxyService from \"./links_navigation_proxy_service_interface\";\nimport {\n ILinksNavigationService, INavigateLinkOptions, IOpenUrlOptions\n} from \"../../../../app-react/services/links-navigation/links-navigation.service.interface\";\nimport {\n LinkNavigationId\n} from \"../../../../app-react/services/configurations/config-data-sections/generated-config-const\";\nimport BaseService from \"../../base/base_service\";\n\ninterface LinksNavigationProxyServiceParams {\n linksNavigation: () => ILinksNavigationService;\n}\n\nexport default class LinksNavigationProxyService extends BaseService implements ILinksNavigationProxyService {\n static CLASS = 'LinksNavigationProxyService';\n\n private _params: LinksNavigationProxyServiceParams;\n\n init(params: LinksNavigationProxyServiceParams) {\n this._params = params;\n }\n \n private get _linksNavigation(): ILinksNavigationService {\n return this._params.linksNavigation();\n }\n\n getLinkUrl(linkId: LinkNavigationId): string {\n return this._linksNavigation.getLinkUrl(linkId);\n }\n\n navigateLink(options: INavigateLinkOptions): Promise {\n return this._linksNavigation.navigateLink(options);\n }\n\n openGamingHistoryPage(): Promise {\n return this._linksNavigation.openGamingHistoryPage();\n }\n\n openPoker(): Promise {\n return this._linksNavigation.openPoker();\n }\n\n openSport(): Promise {\n return this._linksNavigation.openSport();\n }\n\n openUrl(options: IOpenUrlOptions): Promise {\n return this._linksNavigation.openUrl(options);\n }\n\n openResponsibleGaming(): Promise {\n return this._linksNavigation.openResponsibleGaming();\n }\n\n openSecondaryResponsibleGaming(): Promise {\n return this._linksNavigation.openSecondaryResponsibleGaming();\n }\n\n openSelfTest(): Promise {\n return this._linksNavigation.openSelfTest();\n }\n\n openSelfExclusion(): Promise {\n return this._linksNavigation.openSelfExclusion();\n }\n\n openSafeToPlay(): Promise {\n return this._linksNavigation.openSafeToPlay();\n }\n}","import BaseObject from '../../../base/base_object';\nimport Event from '../../../utils/event';\nimport {SYSTEM_EVENTS} from '../../../events/events';\n\nexport default class GamesJackpotsPublisher extends BaseObject {\n static CLASS = 'GamesJackpotsPublisher';\n\n init(params) {\n super.init(params);\n\n if(!params.serviceFactory) {\n this.throwArgumentExpected('12', 'init', 'serviceFactory');\n }\n\n if(!params.refreshInterval) {\n this.throwArgumentExpected('16', 'init', 'refreshInterval');\n }\n\n this._serviceFactory = params.serviceFactory;\n this._refreshInterval = params.refreshInterval;\n }\n\n _publishQueue = [];\n _observableSubscription = null;\n\n /**\n *\n * @param gamesJackpotsObject {\n * gameType1: {\n * AmountInCents: number,\n * },\n * gameType2: {\n * AmountInCents: number\n * }\n */\n delayPublish(gamesJackpotsObject) {\n let gamesJackpotsArray = this._createGamesJackpotsArray(gamesJackpotsObject);\n if(gamesJackpotsArray.length === 0) {\n return;\n }\n\n this._disposeObservableSubscription();\n\n gamesJackpotsArray.forEach(gameJackpot => {\n this._publishQueue.push(gameJackpot);\n });\n\n this._observableSubscription = this._serviceFactory.observableFactoryService().fromInterval(this._refreshInterval.totalMilliseconds / this._publishQueue.length, 'JACKPOT_FEEDS_PUBLISHER_INTERVAL')\n .forEach(() => {\n this._publishGame(this._publishQueue.shift());\n\n if(this._publishQueue.length === 0) {\n this._disposeObservableSubscription();\n }\n });\n }\n\n /**\n *\n * @param gamesJackpotsObject {\n * gameType1: {\n * AmountInCents: number,\n * },\n * gameType2: {\n * AmountInCents: number\n * }\n */\n forcePublish(gamesJackpotsObject) {\n if(!gamesJackpotsObject) {\n return;\n }\n\n let gameTypes = Object.keys(gamesJackpotsObject);\n if(gameTypes.length === 0) {\n return\n }\n\n let eventData = {};\n\n gameTypes.forEach(gameType => {\n eventData[gameType] = gamesJackpotsObject[gameType].AmountInCents\n });\n\n Event.fire(SYSTEM_EVENTS.LIVE_FEEDS_JACKPOT_AMOUNTS_BY_GAME_UPDATED, eventData);\n\n }\n\n _createGamesJackpotsArray(gamesJackpots) {\n if(!gamesJackpots) {\n return [];\n }\n\n return Object.keys(gamesJackpots).map(gt => {\n return {\n gameType: gt,\n amountInCents: gamesJackpots[gt].AmountInCents\n };\n });\n\n\n }\n\n _publishGame(gameJackpot) {\n Event.fire(SYSTEM_EVENTS.LIVE_FEEDS_JACKPOT_AMOUNTS_BY_GAME_UPDATED, {\n [gameJackpot.gameType]: gameJackpot.amountInCents\n });\n }\n\n _disposeObservableSubscription() {\n if(this._observableSubscription) {\n this._observableSubscription.dispose();\n this._observableSubscription = null;\n }\n }\n}","import BaseObject from '../../../base/base_object';\nimport ServiceFactory from '../../service_factory';\n\nexport default class JackpotFeedsReader extends BaseObject {\n static CLASS = 'JackpotFeedsReader';\n private _serviceFactory: ServiceFactory;\n private _getJackpotsUrl: string;\n private _getGameJackpotUrl: string;\n\n init(params) {\n super.init(params);\n if(!params.serviceFactory) {\n this.throwArgumentExpected('13', 'init', 'serviceFactory');\n }\n\n if(!params.getJackpotsUrl) {\n this.throwArgumentExpected('17', 'init', 'getJackpotsUrl');\n }\n\n if(!params.getGameJackpotUrl) {\n this.throwArgumentExpected('21', 'init', 'getGameJackpotUrl');\n }\n\n this._serviceFactory = params.serviceFactory;\n this._getJackpotsUrl = params.getJackpotsUrl;\n this._getGameJackpotUrl = params.getGameJackpotUrl;\n }\n\n readAll() {\n if(!this._serviceFactory.currencyService().getCurrency()) {\n const message = `Not call to jackpot readAll due to\n Currency is: ${this._serviceFactory.currencyService().getCurrency()}.`;\n this.logger.error(message);\n return Promise.reject(message);\n }\n return this._serviceFactory.integrationService().getAllGameTypes()\n .then(gameTypes => {\n return this._serviceFactory.http2Service().post(this._getJackpotsUrl, {\n brandId: this._serviceFactory.skinService().getBrandID(),\n currency: this._serviceFactory.currencyService().getCurrency(),\n gamesList: JSON.stringify(gameTypes)\n });\n });\n }\n\n readGameJackpot(gameType) {\n if(!this._serviceFactory.currencyService().getCurrency()) {\n const message = `Not call to jackpot readGameJackpot due to\n Currency is: ${this._serviceFactory.currencyService().getCurrency()}.`;\n this.logger.error(message);\n return Promise.reject(message);\n }\n return this._serviceFactory.http2Service().post(this._getGameJackpotUrl, {\n brandId: this._serviceFactory.skinService().getBrandID(),\n currency: this._serviceFactory.currencyService().getCurrency(),\n gameType: gameType\n });\n }\n}","import BaseObject from '../../../base/base_object';\nimport GamesJackpotsPublisher from './games_jackpots_publisher';\nimport JackpotFeedsReader from './jackpot_feeds_reader';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport ServiceFactory from '../../service_factory';\n\nexport default class JackpotFeedsServiceDependenciesFactory extends BaseObject {\n static CLASS = 'JackpotFeedsServiceDependenciesFactory';\n _serviceFactory: ServiceFactory;\n _getJackpotsUrl: string;\n _getGameJackpotUrl: string;\n _jackpotsRefreshInterval: TimeSpan;\n\n init(params) {\n super.init(params);\n\n if(!params.serviceFactory) {\n this.throwArgumentExpected('18', 'init', 'serviceFactory');\n }\n\n if(!params.getJackpotsUrl) {\n this.throwArgumentExpected('22', 'init', 'getJackpotsUrl');\n }\n\n if(!params.getGameJackpotUrl) {\n this.throwArgumentExpected('26', 'init', 'getGameJackpotUrl');\n }\n\n if(!params.jackpotsRefreshInterval) {\n this.throwArgumentExpected('30', 'init', 'jackpotsRefreshInterval');\n }\n\n this._serviceFactory = params.serviceFactory;\n this._getJackpotsUrl = params.getJackpotsUrl;\n this._getGameJackpotUrl = params.getGameJackpotUrl;\n this._jackpotsRefreshInterval = params.jackpotsRefreshInterval;\n\n }\n\n createFeedsObservable(milliseconds) {\n return this._serviceFactory.observableFactoryService().fromInterval(milliseconds, 'JACKPOT_FEEDS_REFRESH_INTERVAL');\n }\n\n createGamesJackpotsPublisher(): GamesJackpotsPublisher {\n return GamesJackpotsPublisher.create({\n serviceFactory: this._serviceFactory,\n //we use only 90% of the refresh interval so the publisher finish the publishing before next refresh occurs\n refreshInterval: TimeSpan.fromMilliseconds(this._jackpotsRefreshInterval.totalMilliseconds * 0.9)\n });\n }\n\n createJackpotFeedsReader(): JackpotFeedsReader {\n return JackpotFeedsReader.create({\n serviceFactory: this._serviceFactory,\n getJackpotsUrl: this._getJackpotsUrl,\n getGameJackpotUrl: this._getGameJackpotUrl\n });\n }\n}\n","import BaseService from '../../../base/base_service';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport Event from '../../../utils/event';\nimport _ from '../../../utils/underscore';\nimport JackpotFeedsServiceDependenciesFactory from './jackpot_feeds_service_dependencies_factory';\nimport IJackpotFeedsService, {\n IJackpotData,\n IGamesJackpotsData,\n IJackpotFeedsServiceParams,\n IJackpotDataById\n} from \"./jackpot_feeds_service_interface\";\nimport JackpotFeedsReader from './jackpot_feeds_reader';\nimport GamesJackpotsPublisher from './games_jackpots_publisher';\nimport {IObservableSubscription} from \"../../../utils/observable\";\nimport {NullableNumber} from \"../../../../../common/types/nullable-types\";\nimport {SetTimeoutType} from \"../../../../../common/types/set-timeout-type\";\n\nconst throttleTimeout = 300;\n\nexport default class JackpotFeedsService extends BaseService implements IJackpotFeedsService {\n static CLASS = 'JackpotFeedsService';\n\n private _getGameJackpotUrl: string;\n private _params: IJackpotFeedsServiceParams;\n private _getJackpotsUrl: string;\n private _refreshInterval: TimeSpan;\n\n private _jackpotData: IGamesJackpotsData | null = null;\n\n private _dependenciesFactory: JackpotFeedsServiceDependenciesFactory;\n private _gamesJackpotsPublisher: GamesJackpotsPublisher;\n private _jackpotFeedsReader: JackpotFeedsReader;\n\n private intervalReference: IObservableSubscription | undefined = undefined;\n private _isRequestPaused: boolean = false;\n private _timeoutGuard: SetTimeoutType;\n\n\n\n init(params: IJackpotFeedsServiceParams) {\n super.init(params);\n this._params = params;\n this._getJackpotsUrl = params.getJackpotsUrl;\n this._getGameJackpotUrl = params.getGameJackpotUrl;\n this._refreshInterval = TimeSpan.parse(params.refreshInterval);\n this._dependenciesFactory = params.dependenciesFactory;\n if(_.isNullOrUndefined(params.disableJackpotFeeds) || !params.disableJackpotFeeds) {\n this._subscribe();\n }\n }\n\n _subscribe() {\n this.onSystemEvent(SYSTEM_EVENTS.ON_INIT_COMPLETE, this._onInitComplete);\n this.onSystemEvent(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, this._onOAuthStateChanged);\n this.onSystemEvent(SYSTEM_EVENTS.CLOSE_GAME, this._onCloseGame);\n }\n\n get dependenciesFactory() {\n if(!this._dependenciesFactory) {\n this._dependenciesFactory = JackpotFeedsServiceDependenciesFactory.create({\n serviceFactory: this.serviceFactory,\n getJackpotsUrl: this._getJackpotsUrl,\n getGameJackpotUrl: this._getGameJackpotUrl,\n jackpotsRefreshInterval: this._refreshInterval\n });\n }\n\n return this._dependenciesFactory;\n }\n\n private _createIntervalReference() : IObservableSubscription {\n return this.dependenciesFactory\n .createFeedsObservable(this._refreshInterval.totalMilliseconds)\n .forEach(() => this._readAndPublish());\n }\n\n private _onInitComplete() {\n this._gamesJackpotsPublisher = this.dependenciesFactory.createGamesJackpotsPublisher();\n this._jackpotFeedsReader = this.dependenciesFactory.createJackpotFeedsReader();\n this._readAndPublish(true);\n this._startOrStopJackpotRequest();\n\n Event.on(SYSTEM_EVENTS.APP_PAUSED, () => {\n this._isRequestPaused = true;\n this._applyGuardedRequestDecision();\n });\n\n Event.on(SYSTEM_EVENTS.APP_RESUMED, () => {\n this._isRequestPaused = false;\n this._applyGuardedRequestDecision();\n });\n }\n\n private _onOAuthStateChanged() {\n this._readAndPublish(true);\n }\n\n private _applyGuardedRequestDecision() {\n if (this._timeoutGuard) {\n this._timeoutGuard = undefined;\n }\n\n this._timeoutGuard = setTimeout(() => {\n this._timeoutGuard = undefined;\n this._startOrStopJackpotRequest();\n }, throttleTimeout);\n }\n\n private _startOrStopJackpotRequest() {\n if (this._isRequestPaused) {\n if (this.intervalReference) {\n this.intervalReference.dispose();\n this.intervalReference = undefined;\n }\n } else {\n if (!this.intervalReference) {\n this.intervalReference = this._createIntervalReference();\n }\n }\n }\n\n\n private _onCloseGame(closedGame: any) {\n let gameType: number = closedGame.gameType;\n this.serviceFactory.gamesInformationService()\n .getGamesInfo([gameType])\n .then(gamesInfo => gamesInfo[gameType])\n .then(gameInfo => {\n if(gameInfo /*&& gameInfo.hasJackpot*/) {\n return this._jackpotFeedsReader.readGameJackpot(gameType)\n .then(gameJackpot => {\n this._gamesJackpotsPublisher.forcePublish(gameJackpot);\n }).catch((err)=> {\n this.logger.error('Fail readGameJackpot jackpots', err);\n });\n }\n return Promise.resolve();\n });\n }\n\n private _readAndPublish(force = false) {\n /**\n * TODO: Make jackpotFeedsReader.readAll typesafe so data will be type inferred and not declared\n * {\n * GamesJackpots: {[gameType: string]: IGameJackpotData};\n * TotalJackpotsInCents: number;\n * }\n */\n this._jackpotFeedsReader.readAll().then((data) => {\n let jackpotData: IGamesJackpotsData = {\n ByGameType: data[\"GamesJackpots\"],\n ById: this._buildJackpotDataById(data[\"GamesJackpots\"]),\n TotalJackpotsInCents: data[\"TotalJackpotsInCents\"]\n };\n\n this._publishJackpotsById(jackpotData.ById);\n\n Event.fire(SYSTEM_EVENTS.LIVE_FEEDS_TOTAL_JACKPOTS_UPDATED, jackpotData.TotalJackpotsInCents);\n //this.serviceFactory.clockService().setServerTime(data.ServerTime);\n //this.serviceFactory.clockService().setRegulationOffset(data.RegulationOffset);\n //Event.fire(SYSTEM_EVENTS.CLOCK_UPDATED, {ServerTime:data.ServerTime,RegulationOffset:data.RegulationOffset});\n\n if(force) {\n this._gamesJackpotsPublisher.forcePublish(jackpotData.ByGameType);\n } else {\n this._gamesJackpotsPublisher.delayPublish(jackpotData.ByGameType);\n }\n\n this._jackpotData = jackpotData;\n\n }).catch((err)=> {\n this.logger.warn('Fail _readAndPublish jackpots', err);\n });\n }\n\n /**\n * if any of the jackpots provided in param it's different from the existing one FIRE EVENT\n *\n * Caveat: This approach has a problem. It doesn't treat if a jackpot should be removed from the Map\n * TODO: Treat the case when a jackpot should be removed.\n */\n private _publishJackpotsById(jackpotData: IGamesJackpotsData[\"ById\"]) {\n let jackpotUpdates: IGamesJackpotsData[\"ById\"] = {};\n Object.keys(jackpotData).forEach(jpIdString => {\n // Although we iterate through a Record the value in this forEach is string\n // The reason is here: https://github.com/microsoft/TypeScript/issues/32811\n // So we make a parsing to number even if not necessary\n let jpId = parseInt(jpIdString);\n let jackpot = jackpotData[jpId];\n\n let currentJackpot = this._jackpotData && this._jackpotData.ById[jpId];\n if (!currentJackpot || !this.jackpotIsEqual(currentJackpot.Jackpot, jackpot.Jackpot)) {\n jackpotUpdates[jpId] = jackpot;\n }\n });\n if (Object.keys(jackpotUpdates).length > 0) {\n Event.fire(SYSTEM_EVENTS.LIVE_FEEDS_JACKPOTS_BY_ID_UPDATED, jackpotData);\n }\n }\n\n /**\n * Iterate through all games jackpot (an object dictionary with gameType as key and IJackpotDataByGame as value)\n * Then, iterate through all game's jackpots.\n *\n * Take each and add it to the ById map, putting the gameType into the gameTypes array\n */\n private _buildJackpotDataById(gamesJackpots: IGamesJackpotsData[\"ByGameType\"]) {\n let gameTypes = Object.keys(gamesJackpots);\n let jackpotDataById: {[jackpotId: number]: IJackpotDataById} = {};\n gameTypes.forEach(gameType => {\n let gameJackpotData = gamesJackpots[gameType];\n if(!gameJackpotData || !gameJackpotData.Jackpots) {\n return;\n }\n\n gameJackpotData.Jackpots.forEach(jackpot => {\n let currentJackpot = jackpotDataById[jackpot.JackpotId];\n if (currentJackpot) {\n currentJackpot.GameTypes.push(gameType);\n } else {\n currentJackpot = {\n Jackpot: jackpot,\n GameTypes: [gameType]\n };\n }\n jackpotDataById[jackpot.JackpotId] = currentJackpot;\n });\n });\n return jackpotDataById;\n }\n\n getJackpotsByGameType() {\n if(!this._jackpotData) {\n return null;\n }\n return this._jackpotData.ByGameType;\n }\n\n getJackpotAmountInCentsByGame(gameType: number): NullableNumber {\n if(!this._jackpotData) {\n return null;\n }\n let gameJackpot = this._jackpotData.ByGameType[gameType];\n if(!gameJackpot) {\n return null;\n }\n return gameJackpot.AmountInCents;\n }\n\n jackpotFeedsDisabled() : boolean{\n return this._params && this._params.disableJackpotFeeds;\n }\n\n getTotalJackpotsInCents(): number | null {\n if(this._jackpotData) {\n return this._jackpotData.TotalJackpotsInCents;\n } else {\n return null;\n }\n\n }\n\n getJackpotsById() {\n if(!this._jackpotData) {\n return null;\n }\n return this._jackpotData.ById;\n }\n\n jackpotIsEqual(firstJP: IJackpotData, secondJP: IJackpotData): boolean {\n return (\n firstJP && secondJP &&\n (firstJP.AmountInCents === secondJP.AmountInCents) &&\n (firstJP.JackpotId === secondJP.JackpotId) &&\n (firstJP.JackpotState === secondJP.JackpotState) &&\n (firstJP.LastWinAmount === secondJP.LastWinAmount) &&\n (firstJP.MustHitTime === secondJP.MustHitTime)\n );\n }\n}\n","import BaseObject from '../../base/base_object';\nimport ServiceFactory from '../service_factory';\nimport { SYSTEM_EVENTS } from \"../../events/events\";\nimport Event from '../../utils/event';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport DOM from '../../utils/dom';\nimport _ from \"../../utils/underscore\";\nimport { ILiveTablesServiceParams } from './live_tables_service';\nimport { ILiveTableInfo } from './live_table_info';\n\nexport default class LiveTablesStore extends BaseObject {\n\tstatic CLASS = 'LiveTablesStore';\n\tprivate _serviceFactory: ServiceFactory;\n\tprivate _params: ILiveTablesServiceParams;\n\n\tprivate _isStarted = false;\n\tprivate _currentFeedsRegulationID: number;\n\tprivate _currentFeeds: { [id: number]: ILiveTableInfo };\n\n\tprivate _feedsInterval: number;\n\n\tinit(params: ILiveTablesServiceParams & { serviceFactory: ServiceFactory }) {\n\t\tsuper.init(params);\n\t\tthis._serviceFactory = params.serviceFactory;\n\t\tthis._params = params;\n\t}\n\n\tpublic start(): void {\n\t\tconst feedsIntervalFrequency = TimeSpan.parse(this._params.refreshInterval).totalMilliseconds;\n\n\t\tif (this._isStarted === false) {\n\t\t\tthis._isStarted = true;\n\t\t\tthis._readFromServer();\n\t\t\tthis._feedsInterval = DOM.setInterval(() => {\n\t\t\t\tthis._readFromServer();\n\t\t\t}, feedsIntervalFrequency);\n\t\t}\n\t}\n\n\t/**\n\t * stop update the feeds from server.\n\t */\n\tpublic stop(): void {\n\t\tif (this._feedsInterval) {\n\t\t\tDOM.clearInterval(this._feedsInterval);\n\t\t}\n\t\tthis._isStarted = false;\n\t}\n\n\t/**\n\t * if the regulation id for evo feeds changed - call to server. if not, return the current feeds.\n\t */\n\tpublic getTablesInfo(): Promise<{ [id: number]: ILiveTableInfo }> {\n\t\tif (this._serviceFactory.liveTablesService().getRegulationIDForMinMaxBet() === this._currentFeedsRegulationID && this._currentFeeds) {\n\t\t\treturn Promise.resolve(this._currentFeeds);\n\t\t} else {\n\t\t\treturn this._readFromServer();\n\t\t}\n\t}\n\n\tprivate _readFromServer(): Promise<{ [id: number]: ILiveTableInfo }> {\n\t\tconst regulationID = this._serviceFactory.liveTablesService().getRegulationIDForMinMaxBet();\n\t\treturn this._serviceFactory.http2Service().post< { LiveTables: { [id: number]: ILiveTableInfo } } >(this._params.liveTablesUrl, { regulationID: regulationID && regulationID.toString() })\n\t\t\t.then(data => {\n\t\t\t\tif (_.isNullOrUndefined(data)) {\n\t\t\t\t\treturn {};\n\t\t\t\t}\n\n\t\t\t\tthis._currentFeeds = data.LiveTables;\n\t\t\t\tthis._currentFeedsRegulationID = regulationID;\n\t\t\t\tthis._evaluateBetLimitsForCurrentFeeds();\n\n\t\t\t\tEvent.fire(SYSTEM_EVENTS.LIVE_TABLES_UPDATE, this._currentFeeds);\n\t\t\t\treturn this._currentFeeds;\n\t\t\t}).catch(err => {\n\t\t\t\tthis.logger.warn(\"Evolution new feeds: fail to get data. error: \" + err);\n\t\t\t\treturn null;\n\t\t\t});\n\t}\n\n\tprivate _evaluateBetLimitsForCurrentFeeds(): void {\n\t\tconst currency = this._serviceFactory.currencyService().getCurrency().toUpperCase();\n\t\tconst properties = Object.getOwnPropertyNames(this._currentFeeds);\n\t\tproperties.forEach(property => {\n\t\t\tconst limits = this._currentFeeds[property].Limits;\n\t\t\tconst relevantLimit = limits.find(elem => {\n\t\t\t\treturn elem.currency === currency;\n\t\t\t});\n\n\t\t\tthis._currentFeeds[property].MinBet = relevantLimit && relevantLimit.minBet;\n\t\t\tthis._currentFeeds[property].MaxBet = relevantLimit && relevantLimit.maxBet;\n\t\t});\n\t}\n}\n","import BaseService from '../../base/base_service';\nimport LiveTableFeedsStore from './live_tables_store';\nimport {REGULATION_CODE_TYPES} from \"../regulation/regulation_const\";\nimport _ from \"../../utils/underscore\";\nimport { ILiveTableInfo } from './live_table_info';\nimport ILiveTablesService from './live_tables_service_interface';\n\nexport interface ILiveTablesServiceParams {\n liveTablesUrl: string;\n\trefreshInterval: string;\n\tgetBetLimitsFromLiveTablesEnabled: boolean;\n}\n\nexport default class LiveTablesService extends BaseService implements ILiveTablesService {\n\n static CLASS = 'LiveTablesService';\n\n\tprivate _tablesStore: LiveTableFeedsStore;\n\n\tprivate _params: ILiveTablesServiceParams;\n\n init(params: ILiveTablesServiceParams) {\n\t\tsuper.init(params);\n\t\tthis._params = params;\n\t}\n\n\tonInitializationCompleted(): Promise {\n\t\tthis._tablesStore = LiveTableFeedsStore.create({\n\t\t\tserviceFactory: this.serviceFactory,\n\t\t\t...this._params\n\t\t});\n\n\t\treturn Promise.resolve();\n }\n\n\tgetTablesInfo(): Promise<{[id: number]: ILiveTableInfo}> {\n\t\treturn this._tablesStore.getTablesInfo();\n\t}\n\n\tstart() {\n\t\treturn this._tablesStore.start();\n\t}\n\n\tstop() {\n\t\treturn this._tablesStore.stop();\n\t}\n\n\t/*\n\t For logged-in player:\n\t If the player is from .com brands - 888Casino (0), CIP (1), CIS (8):\n\t If the RegistrationCountry (received from NAP GetAccountDetails on login) = GBR (UK): use the UK regulation id (255).\n\t If the RegistrationCountry <> GBR: use the RegulationTypeID from NAP.\n\t If the player is not from .com brand: use the current regulation id of the player.\n\t In anonymous mode:\n\t Use the current regulation id of the player.\n\t*/\n\tpublic getRegulationIDForMinMaxBet(): number {\n\t\tlet regulationID = -1;\n\t\tlet accountData;\n\t\tif(this.serviceFactory.oAuth2Service().isAuthorized() && this.serviceFactory.skinService().isCOMBrand()) {\n\t\t\taccountData = this.serviceFactory.userService().getAccountData();\n\n\t\t\tif(accountData && accountData.RegistrationCountry && accountData.RegistrationCountry.toLowerCase() === 'gbr') {\n\t\t\t\tregulationID = REGULATION_CODE_TYPES.UK;\n\t\t\t} else {\n\t\t\t\tregulationID = accountData && accountData.RegulationTypeId;\n\t\t\t}\n\t\t} else {\n\t\t\tregulationID = this.serviceFactory.skinService().getRegulationID();\n\t\t}\n\n\t\tif(_.isNullOrUndefined(regulationID)) {\n\t\t\tthis.logger.error(`${LiveTablesService.CLASS}: regulationID is ${regulationID}, isAuthorized\n\t\t\t\t${this.serviceFactory.oAuth2Service().isAuthorized()}, isCOMBrand: ${\n\t\t\t\tthis.serviceFactory.skinService().isCOMBrand()}.\n\t\t\t accountData: ${accountData}. RegulationTypeId: ${accountData && accountData.RegulationTypeId}`);\n\t\t}\n\n\t\treturn regulationID;\n\t}\n\n\tgetBetLimitsFromTableFeedsEnabled(): boolean {\n\t\treturn this._params.getBetLimitsFromLiveTablesEnabled;\n\t}\n}\n","import _ from '../../utils/underscore';\nimport {BUTTON_TYPE} from './message_consts';\nimport ServiceFactory from '../../services/service_factory';\n\nconst BUTTONS_DEFAULT_CLASS = 'cgp-msg-button cgp-modal-button';\n\nclass MessageButton {\n\n /**\n * Build message button wuth options\n * @params\n * params {object}\n * {\n * name, isClosable, id, cssClass, callback, isSendAnalytic\n * }\n * @name {string} - button text. Default = 'OK'\n * @isClosable {bool} - whether button can close the dialog (usable in message_component). Default = true\n * @id {string} - button unique id. Default value is autogenerated ID\n * @cssClass {stirng} - custom css class. Will be added to default button class 'cgp-msg-button'\n * @type {string} - define whether CTA is main or secondary\n * @callback {function} - define custom behavior on button click.\n * @forceAnalytic (bool) - whether button have to send default analytic event. Default = false. If need to force it and send another analytic event,\n * you must define custom button, set this property to be 'false' and fire event via callback function\n *\n */\n constructor(params) {\n let defaults = {\n name: ServiceFactory.create().languageService().translation('mdp_ok'),\n isClosable: true,\n id: _.makeid(),\n cssClass: '',\n callback: () => {},\n type: BUTTON_TYPE.MAIN.typeName,\n forceAnalytic: false\n }\n\n this._options = {};\n Object.assign(this._options, defaults, params)\n let buttomTypeClass = BUTTON_TYPE[this._options.type.toUpperCase()].class || '';\n // fix class\n this._options.cssClass = BUTTONS_DEFAULT_CLASS + ' ' + buttomTypeClass + ' ' + this._options.cssClass;\n\n }\n\n getOptions() {\n return this._options;\n }\n}\n\nexport default MessageButton;","import MessageButton from './message_button';\nimport {PRIORITY_LEVEL} from '../../services/overlay_manager/overlay_manager_levels';\nimport BaseModelComponent from '../../base/base_model_component';\nimport _ from '../../utils/underscore';\nimport DOM from '../../utils/dom';\nimport { IMessageOptions } from '../../services/message_manager/message_manager_service_interface';\n\n\n/**\n * @property {string} type - predefined message type\n * @property {string} title - title message\n * @property {string} text - text message\n * @property {string} footerText - footer text message\n * @property {string} imgClass - the class contains image url that should be displayed\n * @property {boolean} hasImage - define if MDP should be opened with image placement\n * @property {boolean} hasDefaultButton - define if MDP should create the single closable button automatically when there are not buttons provided\n * @property {number} priority - the message priority\n * @property {MessageButton[]|{name:string,callback:function}[]} buttons - array of string that represent button action\n * @param {MessageOptions} params\n * @throws {Error} text must be define if not throw 'must contain text in message';\n */\n\n\n/**\n * Message entity\n */\n\nexport default class MessageModel extends BaseModelComponent {\n static isMessage(msg: any) {\n return 'buttons' in msg &&\n 'title' in msg &&\n 'text' in msg &&\n 'type' in msg &&\n 'priority' in msg &&\n 'buttons' in msg &&\n 'timeStamp' in msg;\n }\n static CLASS = 'MessageModel';\n\n /**\n *\n * @param params\n */\n init(params: IMessageOptions) {\n this._initModel(params);\n }\n\n /**\n * Set the priority of the message, lower is higher priority\n */\n priority: number;\n\n /**\n * If set to true, will not escape title and text parameters\n */\n html: boolean = false;\n\n /**\n * The title of the message\n */\n title: string;\n\n /**\n * The Text of the message\n */\n text: string;\n\n /**\n * The footer text of the message\n */\n footerText: string;\n\n /**\n * The type of the message\n */\n type: string;\n\n /**\n * define whether there is a close button\n */\n closeButton: boolean;\n\n /**\n * define whether there is default button exisst\n */\n hasButton: boolean;\n\n contentEl: HTMLElement;\n\n footerContentEl: HTMLElement;\n\n contentAlign: string;\n\n /**\n * @typedef {Object} MessageOptions - message constructor options\n * @property {string} type - predefined message type\n * @property {string} title - title message\n * @property {string} text - text message\n * @property {string} footerText - footer text message\n * @property {string} imgClass - the class contains image url that should be displayed\n * @property {boolean} hasImage - define if MDP should be opened with image placement\n * @property {boolean} hasDefaultButton - define if MDP should create the single closable button automatically when there are not buttons provided\n * @property {number} priority - the message priority\n * @property {MessageButton[]|{name:string,callback:function}[]} buttons - array of string that represent button action\n * @param {MessageOptions} params\n * @throws {Error} text must be define if not throw 'must contain text in message';\n */\n _initModel(params: IMessageOptions) {\n const defaultOptions: IMessageOptions = {\n type: '',\n title: null,\n hasTitle: true,\n buttonPosition: '',\n closeButton: true,\n text: '',\n footerText: '',\n contentAlign: '',\n contentEl: null,\n footerContentEl: null,\n imgClass: '',\n hasImage: false,\n priority: PRIORITY_LEVEL.MESSAGE,\n hasDefaultButton: true,\n forceAnalytic: false,\n ignoreMobile: false,\n customCSSClassList: [],\n titleElements: [],\n closeCallback: () => {},\n openCallback: () => {},\n footerClickedCallback: () => {},\n btnCloseCallback: () => {}\n };\n\n const options: IMessageOptions = Object.assign({}, defaultOptions, params);\n\n // fix title\n options.title = (!options.title || options.title === '') ? ' ' : options.title;\n\n let buttons: MessageButton[] = [];\n\n // create default button or use provided buttons only if hasButton option is true\n if (options.buttons && _.isArray(options.buttons) && options.buttons.length > 0) {\n options.buttons.forEach((button) => {\n buttons.push(new MessageButton(button));\n });\n } else if (true === options.hasDefaultButton) {\n buttons = [new MessageButton({})];\n }\n options.buttons = buttons;\n\n //TODO: move each defaultOptions members as class members!!!\n //this is not a good practise\n Object.keys(options).forEach((key) => {\n //if (!this[key]) {\n this[key] = options[key];\n //}\n });\n\n this._createContentEl();\n this._createFooterContentEl();\n }\n\n\n /**\n * Create contet element and inject to it if contentEl was not passed\n * @private\n */\n _createContentEl() {\n if (!this.contentEl) {\n this.contentEl = !_.isElement(this.text) ? DOM.createElement('div', this.text) : this.text as unknown as HTMLElement;\n }\n }\n\n /**\n * Create footer contet element and inject to it if footerContentEl was not passed\n * @private\n */\n _createFooterContentEl() {\n if (this.footerText) {\n if (!this.footerContentEl) {\n this.footerContentEl = !_.isElement(this.footerText) ? DOM.createElement('div', this.footerText) : this.footerText as unknown as HTMLElement;\n }\n }\n }\n}\n","import BaseComponent from '../../base/base_component';\nimport Model from './message_model';\nimport Event from '../../utils/event';\nimport Device from '../../utils/device/device';\nimport {SYSTEM_EVENTS, USER_EVENTS} from '../../events/events';\nimport DOM from '../../utils/dom';\nimport _ from '../../utils/underscore';\nimport * as MDP_CONSTS from './message_consts';\nimport {OVERLAY_CONTENT_PROPERTIES} from \"../overlay/overlay_const\";\n\n\n\n// Views\nconst view = require('./view/message.html');\nconst titleElTemplate = require('./view/title_template.html');\nconst BUTTONS_AREA_SELECTOR = 'cgp-btn-area';\nconst TITLE_SELECTOR = 'cgp-msg-title';\nconst IMAGE_CONTENT_SELECTOR = 'cgp-msg-content-img';\nconst CONTENT_WRAPPER = 'cgp-msg-content-wrapper';\nconst CLOSE_BUTTON_SELECTOR = '.cgp-mdp-close-btn-wrapper';\nconst CONTENT_AREA = 'cgp-msg-content';\nconst FOOTER_CONTENT_AREA = 'cgp-msg-footer-content';\n\n\n\n\n/**\n * Generic component to popup CGP messages.\n * Message pops up over overlay and triggered by message_manager_service that subscribed on SYSTEM_EVENTS.MESSAGE_OPEN.\n * So, to pop message, client need to fire MESSAGE_OPEN event with specific message properties (options)\n *\n * @example\n * const messageParams = {\n * title: 'Simple message title',\n * text: 'simple message text',\n * type: 'error'\n * }\n *\n * //fire event to open message\n * Event.fire(SYSTEM_EVENTS.MESSAGE_OPEN, messageParams);\n *\n * @options\n * type {string} predefined CGP message type. Used for automatically add specified image class to image placeholder\n * title {string} message title text. It appears on the top of message dialog, but under icon if exists (read type and customIcon)\n * text {string} message text. Can be every HTML markup. It appears under the title\n * priority {string} message priority. Since the message opens on overlay, it defines the overlay priority. There are two priority types in CGP (HIGH and LOW).\n * default value for messages is PRIORITY_LEVEL.MESSAGE, so when your message will appear it will destroy all previous overlays and messages. If need to change this behaviour,\n * you should pass lower priority: PRIORITY_LEVEL.BASE, then your message will appear when the higher overlay destroys.\n * NOTE! If you pass priority and there is custom button in message (read button) that should close the message on click, be aware, you should pass priority\n * parameter in button onClick callback where you fire CLOSE_OVERLAY event\n * @Example\n * Event.fire(SYSTEM_EVENTS.CLOSE_OVERLAY, {priority: priorityValue); //priorityValue = PRIORITY_LEVEL.MESSAGE or PRIORITY_LEVEL.BASE (similar to what passed in message options)\n * closeButton {bool} define if close X button will appear to close the message\n * buttons {array} contains buttons on message dialog. Read button object definition in message_button.\n * By default, if the array is empty, message dialog render single default button with name 'OK' that close the dialog.\n * Each custom button by default closes message dialog. To prevent this behavior, isClosable button parameter will be define false explicitly. (see message_button).\n * @Example\n * [{name: 'btn1'}, {name: 'btn2', isClosable: false}]\n * buttonPosition {string} define buttons position. Values: 'left', 'right', 'center'.\n * By default, in PC layout, button aligned to center, and in mobile to right side.\n * If buttonPosition is defined, it overrides this behaviour and valid both in PC and mobile\n * imgClass {string} The class contains image url that should be displayed. There is pre-defined placeholder (div) in the left side of the message text area in PC and below the text in Mobile.\n * If the property is defined and not empty, even if there no image, the full size placeholder with this (imgClass) class will be allocated to contain an image.\n * hasImage {boolean} Define image placeholder behavior as imgClass, but without adding css class to placeholder. Used for future customization of image placeholder.\n * analytic {object} {category, action, label, value}\n *\n * forceAnalytic (bool) component sends analytic event automatically on open message dialog. In order to prevent it, value true has to be send. Default = false\n */\n\n\nclass MessageComponent extends BaseComponent {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'MessageComponent';\n\n /**\n * Root component selector.\n *\n * @type {string}\n * @private\n */\n _selector = 'cgp-mdp-component';\n\n /**\n * @property\n * @type {object|null}\n * @private\n */\n _model = null;\n\n\n /**\n * @param params\n */\n init(params) {\n super.init(params);\n this._model = Model.create(params);\n }\n\n\n /**\n * Inject message content element\n * @private\n */\n _injectContent() {\n const contentArea = this.getDOMElementByClassName(CONTENT_AREA);\n\n const alignment = this._model.contentAlign || this.serviceFactory.themesService().getTextAlignment();\n let alignmentClass;\n switch (alignment.toLowerCase()) {\n case MDP_CONSTS.TEXT_ALIGNMENT.CENTER:\n alignmentClass = 'cgp-msg-content-center';\n break;\n case MDP_CONSTS.TEXT_ALIGNMENT.LEFT:\n alignmentClass = this.serviceFactory.languageService().getIsRTL() ? 'cgp-msg-content-right' : 'cgp-msg-content-left';\n break;\n case MDP_CONSTS.TEXT_ALIGNMENT.RIGHT:\n alignmentClass = this.serviceFactory.languageService().getIsRTL() ? 'cgp-msg-content-left' : 'cgp-msg-content-right';\n break;\n }\n\n DOM.addClass(contentArea, alignmentClass);\n DOM.append(contentArea, this._model.contentEl);\n }\n\n /**\n * Inject message footer content element\n * @private\n */\n _injectFooterContent() {\n if (this._model.footerText) {\n const footerDiv = this.getDOMElementByClassName(FOOTER_CONTENT_AREA);\n DOM.removeClass(footerDiv, 'cgp-hidden');\n DOM.append(footerDiv, this._model.footerContentEl);\n\n if(this._model.footerClickedCallback && _.isFunction(this._model.footerClickedCallback)){\n this.onChildElementEvent('.' + FOOTER_CONTENT_AREA,\n USER_EVENTS.ON_CLICK, this._model.footerClickedCallback);\n }\n }\n }\n\n _injectTitleElements() {\n const titleElements = this._model.titleElements;\n const messageTitle = this.getDOMElementByClassName(\"cgp-themes-main-title\");\n if (titleElements && _.isArray(titleElements)) {\n titleElements.forEach((el) => {\n const bakedHTML = this.bake(titleElTemplate, {\n titleEl: el.element.outerHTML\n });\n const newTitleEl = DOM.createElement('div', bakedHTML);\n const mouseTargetElement = newTitleEl.querySelector('.cgp-mdp-title-el-wrapper').firstElementChild;\n\n DOM.addClass(newTitleEl, 'cgp-mdp-title-el-container');\n if (el.customClass) {\n DOM.addClass(newTitleEl, el.customClass);\n }\n DOM.append(messageTitle, newTitleEl);\n if (el.onClick && _.isFunction(el.onClick)) {\n this.onDOMEvent(mouseTargetElement, USER_EVENTS.ON_CLICK, el.onClick);\n }\n });\n }\n }\n\n\n /**\n * Add buttons to message dialog and initialize their behavior.\n *\n * @private\n */\n _injectButtons() {\n const buttonArea = this.getDOMElementByClassName(BUTTONS_AREA_SELECTOR);\n if (this._model.buttons.length === 0) {\n DOM.removeElement(this.getEl(), buttonArea);\n return;\n }\n\n const alignment = this._model.buttonPosition;\n // if buttons position is not defined, take text alignment from themes\n if (!_.isNullOrUndefined(alignment) && alignment !== '') {\n // alignment = this.serviceFactory.themesService().getTextAlignment();\n // // upside alignment. If text alignment is left, so button should be in the right side and vice versa\n // alignment = alignment === MDP_CONSTS.TEXT_ALIGNMENT.LEFT ? MDP_CONSTS.TEXT_ALIGNMENT.RIGHT : alignment === MDP_CONSTS.TEXT_ALIGNMENT.RIGHT ? MDP_CONSTS.TEXT_ALIGNMENT.LEFT : alignment;\n // override or define button position\n //let btnPosition;\n switch (alignment.toLowerCase()) {\n case MDP_CONSTS.TEXT_ALIGNMENT.LEFT:\n //btnPosition = 'flex-start';\n DOM.addClass(buttonArea, 'cgp-flex-justify-left');\n break;\n case MDP_CONSTS.TEXT_ALIGNMENT.RIGHT:\n //btnPosition = 'flex-end';\n DOM.addClass(buttonArea, 'cgp-flex-justify-right');\n break;\n case MDP_CONSTS.TEXT_ALIGNMENT.CENTER:\n //btnPosition = 'center';\n DOM.addClass(buttonArea, 'cgp-flex-justify-center');\n break;\n }\n }\n\n\n if (this._model.buttons.length > 1) {\n DOM.addClass(buttonArea, 'cgp-mdp-multiple-btns');\n }\n\n this._model.buttons.forEach((button, index) => {\n const btnOptions = button.getOptions();\n const htmlButton = DOM.createElement('button', btnOptions.name);\n\n // atributes\n htmlButton.setAttribute('id', btnOptions.id);\n htmlButton.setAttribute('class', btnOptions.cssClass);\n\n // append to DOM\n buttonArea.appendChild(htmlButton);\n\n // attach events\n this.onChildElementEvent('#' + btnOptions.id, USER_EVENTS.ON_CLICK, btnOptions.callback);\n\n this.onChildElementEvent('#' + btnOptions.id, USER_EVENTS.ON_CLICK, () => {\n // if button is closable, then added event to close the message\n if (btnOptions.isClosable) {\n this.closeMessage();\n }\n\n // bind click event listener to each button to send analytic\n if (!btnOptions.forceAnalytic) {\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent(Object.assign({\n category: 'Client_Message',\n action: 'CTA' + (index + 1),\n label: btnOptions.name\n }, this._model.analytic))\n }\n });\n });\n }\n\n\n /**\n * If title exists, the function show it in specified title container\n *\n * @private\n */\n _handleMessageTitle() {\n if (this._model.closeButton) {\n DOM.show(this.getEl().querySelectorAll(CLOSE_BUTTON_SELECTOR)[0] as HTMLElement);\n this.onChildElementEvent(CLOSE_BUTTON_SELECTOR, USER_EVENTS.ON_CLICK, () => {\n if (this._model.btnCloseCallback && _.isFunction(this._model.btnCloseCallback)) {\n this._model.btnCloseCallback.call();\n }\n this.closeMessage();\n }\n );\n }\n\n if (this._model.title && this._model.hasTitle) {\n const title = this.getEl().getElementsByClassName(TITLE_SELECTOR) as HTMLCollectionOf;\n\n const alignment = this.serviceFactory.themesService().getTextAlignment();\n let alignmentClass;\n switch (alignment.toLowerCase()) {\n case MDP_CONSTS.TEXT_ALIGNMENT.CENTER:\n break;\n case MDP_CONSTS.TEXT_ALIGNMENT.LEFT:\n alignmentClass = 'cgp-msg-title-left';\n break;\n case MDP_CONSTS.TEXT_ALIGNMENT.RIGHT:\n alignmentClass = 'cgp-msg-title-right';\n break;\n\n }\n DOM.addClass(title[0], alignmentClass);\n DOM.show(title[0]);\n }\n }\n\n /**\n * Set image within text area by message type or imgClass if the message is configured to contain an image\n *\n * @private\n */\n _handleContentImage() {\n if (this._isHasImage()) {\n const imgClass = MDP_CONSTS.MDP_IMG_CSS_CLASS_SELECTORS[this._model.type] || this._model.imgClass;\n const contentWrapper = this.getEl().getElementsByClassName(CONTENT_WRAPPER)[0];\n DOM.addClass(contentWrapper, 'cgp-msg-has-image');\n DOM.addClass(this.getDOMElementByClassName(IMAGE_CONTENT_SELECTOR), imgClass);\n DOM.show(this.getDOMElementByClassName(IMAGE_CONTENT_SELECTOR) as HTMLElement);\n }\n }\n\n\n /**\n * Show message in light box\n *\n */\n show() {\n const bakedHTML = this.bake(view);\n this.setHTML(bakedHTML);\n this._injectButtons();\n this._injectContent();\n this._injectFooterContent();\n this._injectTitleElements();\n this._handleMessageTitle();\n this._handleContentImage();\n\n Event.fire(SYSTEM_EVENTS.OPEN_OVERLAY, {\n component: this,\n priority: this._model.priority,\n isCloseBtnAllowed: false,\n ignoreMobile: this._model.ignoreMobile,\n additionalClasses: this._getAdditionalClasses(),\n contentAdditionalClasses: ['cgp-theme-property-lb-corner-radius', 'cgp-mobile-no-full-screen-overlay', 'cgp-modal-border-stroke'],\n openCallback: () => this._onMessageOpen(),\n closeCallback: () => this._onMessageClosed()\n });\n\n\n if(Device.hybrid.isEmbedded && this._model.showPopupAboveSecondWebViewHybrid) {\n this.serviceFactory.hybridService().openPopUpOnSecondWebView('.' + OVERLAY_CONTENT_PROPERTIES.CLASS_NAME, 500);\n }\n return '';\n }\n\n closeMessage() {\n\n if(Device.hybrid.isEmbedded && this._model.showPopupAboveSecondWebViewHybrid) {\n this.serviceFactory.hybridService().closePopUpOnSecondWebView();\n }\n\n Event.fire(SYSTEM_EVENTS.CLOSE_OVERLAY, {priority: this._model.priority});\n }\n\n _getAdditionalClasses() {\n const classList = ['cgp-mdp-dialog']\n .concat(this._model.customCSSClassList);\n\n return classList;\n }\n\n\n\n /**\n * Return indication whether message should contain image.\n * By default hasImage parameter will be assign.\n * Otherwise, if it's predefined message, so type is not empty and there is MDP image mapping in Integration (defined by b2c), then this value will be assign.\n * In any case, if hasImage property is true, the function returns true (TBD)\n *\n * @returns {*}\n * @private\n */\n _isHasImage() {\n let hasImage = this._model.hasImage;\n if (this._model.type && this._model.type !== '') {\n const messageMapper = this.serviceFactory.integrationService().getMDPImageMapper();\n if (messageMapper) {\n hasImage = messageMapper[this._model.type] || hasImage; //TBD or False???\n }\n }\n\n return hasImage;\n }\n\n\n /**\n * when message dialog is opened we have to fire analytic event if any analytic data is existed\n * Currently, not usable, maybe can be used in the future\n *\n * @private\n */\n _onMessageOpen() {\n if (this._model.analytic && !this._model.forceAnalytic) {\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent(Object.assign({}, this._model.analytic));\n }\n if (this._model.openCallback && _.isFunction(this._model.openCallback)) {\n this._model.openCallback.call();\n }\n }\n\n\n /**\n * Handle close callback\n * @private\n */\n _onMessageClosed() {\n if (this._model.closeCallback && _.isFunction(this._model.closeCallback)) {\n this._model.closeCallback.call();\n }\n }\n}\n\nexport default MessageComponent;","import {SYSTEM_EVENTS} from '../../events/events';\nimport BaseService from '../../base/base_service';\nimport MessageComponent from '../../components/message/message_component';\nimport {CGP_ERROR_CODES} from '../../exceptions/cgp_error_codes';\nimport IMessageManagerService, { IMessageOptions } from './message_manager_service_interface';\n\nclass MessageManagerService extends BaseService implements IMessageManagerService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'MessageManagerService';\n\n\n /**\n *\n * @param params\n */\n init(params) {\n super.init(params);\n this._subscribeEvents();\n }\n\n\n\n /**\n * @param {MessageModel} msgOptions - an instant of a message to add to the list\n * @throws {Error} title must be define if not throw 'must contain text in message';\n */\n openMessage(msgOptions: IMessageOptions): Promise {\n return this._messageUiDecorator(msgOptions);\n }\n\n showGeneralErrorMessage(): Promise {\n return this.openMessage({\n text: this.serviceFactory.regulationService().getErrorMessage(CGP_ERROR_CODES.GENERAL_ERROR),\n type: 'error',\n closeButton: false,\n hasDefaultButton: false,\n buttons: [\n {\n name: this.serviceFactory.languageService().translation('mdp_ok'),\n isClosable: true\n }\n ]\n });\n }\n\n /**\n * Decorator the message to ui\n *\n * @param {MessageModel} msgOptions - the message that need to be Decode\n * @returns {Promise} - promise that resolve when the alert is close\n * @private\n */\n\n _messageUiDecorator(msgOptions): Promise {\n this.logger.info('message : ' + msgOptions.text + ' start convert to ui');\n const messagePromise = new Promise((resolve) => {\n const cgpMessage = MessageComponent.create(msgOptions) as MessageComponent;\n cgpMessage.show();\n resolve(cgpMessage);\n this.logger.info('message : ' + msgOptions.text + ' end convert to ui');\n });\n\n return messagePromise;\n }\n\n /**\n * Load the Events\n *\n * @private\n */\n\n _subscribeEvents() {\n this.onSystemEvent(SYSTEM_EVENTS.MESSAGE_OPEN, this.openMessage);\n }\n}\n\nexport default MessageManagerService;","import BaseObject from '../../base/base_object';\n\ninterface NetEntExtendParams {\n netEntExtendObject: any\n}\n\nexport default class NetEntExtend extends BaseObject {\n static CLASS = 'NetEntExtend';\n\n private _netEntExtendObject = null;\n init(params: NetEntExtendParams) {\n super.init(params);\n this._netEntExtendObject = params.netEntExtendObject;\n }\n\n resize(width: number, height: number): void {\n if(this._netEntExtendObject) {\n this._netEntExtendObject.resize(width, height);\n }\n\n }\n addEventListener(eventName: string, callBack: Function): void {\n if(this._netEntExtendObject) {\n this._netEntExtendObject.addEventListener(eventName, callBack);\n }\n\n }\n\n removeEventListener(eventName: string, callBack: Function): void {\n if(this._netEntExtendObject) {\n this._netEntExtendObject.removeEventListener(eventName, callBack);\n }\n }\n\n stopAutoplay(): void {\n if(this._netEntExtendObject) {\n this._netEntExtendObject.call(\"stopAutoplay\", [], () => { }, (err) => {\n if(err && err.code !== 12) { // Netent sends error code 12 when we call stop autoplay and there is no autoplay in progress\n this.logger.error('NetEnt stopAutoplay failed!', err);\n }\n });\n }\n }\n}","import BaseService from '../../base/base_service';\nimport Device from '../../utils/device/device';\n\n\nimport INetEntService, {\n NetEntLaunchGameRequest,\n NetEntLaunchGameResponse,\n NetEntSdk,\n NetEntConfig\n} from './netent_service_interface';\nimport NetEntExtend from './netent_extend';\n\n\ninterface NetEntServiceParams {\n staticServerUrlTemplate: string;\n liveCasinoHostTemplate: string;\n}\n\nexport default class NetEntService extends BaseService implements INetEntService {\n static CLASS = 'NetEntService';\n\n private _params: NetEntServiceParams;\n\n init(params: NetEntServiceParams) {\n super.init(params);\n this._params = params;\n }\n\n launchGame(request: NetEntLaunchGameRequest): Promise {\n return this._loadNetEntSdk(request).then(netEntSdk => {\n return new Promise((resolve, reject) => {\n const successFunc = (netEntExtendObj: any) => {\n resolve({\n netEntExtend: NetEntExtend.create({netEntExtendObject: netEntExtendObj})\n });\n };\n\n const errorFunc = (err: any) => {\n reject(err);\n };\n\n try {\n this._createNetEntLaunchGameConfig(request)\n .then(config => {\n this.logger.debug(`Launching NetEnt game ${request.gameType} with the following params: ${JSON.stringify(config)}`);\n netEntSdk.launch(config, successFunc, errorFunc);\n }).catch(err => reject(err));\n } catch (ex) {\n reject(ex);\n }\n });\n });\n }\n\n private _createNetEntLaunchGameConfig(request: NetEntLaunchGameRequest): Promise {\n let config = {\n gameId: request.netEntGameType,\n sessionId: request.gameSessionId,\n language: request.language,\n staticServerURL: this._buildStaticServerUrl(request),\n gameServerURL: request.gameServerUrl,\n walletMode: 'seamlesswallet',\n width: '100%',\n height: '100%',\n enforceRatio: false,\n };\n if (Device.os.isMobileOS) {\n config = Object.assign(config, {\n launchType: 'iframe',\n lobbyURL: '#',\n depositAvailable: true\n });\n }\n if(Device.hybrid.isHybrid)\n {\n config = Object.assign(config, {disableDeviceDetection: true});\n }\n return Promise.resolve(config);\n }\n\n private _getSdkFromWindow(): NetEntSdk {\n return this.serviceFactory.windowService().getGlobalProperty('netent') as NetEntSdk;\n }\n\n private _loadNetEntSdk(request: NetEntLaunchGameRequest): Promise {\n const sdk = this._getSdkFromWindow();\n if(sdk) {\n return Promise.resolve(sdk);\n } else {\n let sdkUrl = this._buildStaticServerUrl(request);\n if(!sdkUrl.endsWith('/')) {\n sdkUrl += '/';\n }\n sdkUrl += 'gameinclusion/library/gameinclusion.js?anticacheKey=' + this.serviceFactory.timeService().now();\n return this.serviceFactory.scriptLoaderService().loadScript({\n url: sdkUrl,\n tagId: 'netentsdk'\n }).then(() => this._getSdkFromWindow());\n }\n }\n\n private _buildStaticServerUrl(request: NetEntLaunchGameRequest): string {\n return this.serviceFactory.hybridService().prepareGameUrl(request.gameType, this._params.staticServerUrlTemplate.replace('{casinoid}', this._getCasinoId(request)));\n }\n\n private _getCasinoId(request: NetEntLaunchGameRequest): string {\n if (request.casinoId) {\n return request.casinoId;\n }\n\n throw new Error(`No casinoId specified in NetEntLaunchGameRequest ${JSON.stringify(request)}!`);\n }\n}\n","import BaseObject from '../../../base/base_object';\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport Event from '../../../utils/event';\nimport DateTimeUtils from '../../../utils/date_time_utils';\n\n\nexport default class LoginTimeAnalytics extends BaseObject {\n static CLASS = 'LoginTimeAnalytics';\n\n init(params) {\n super.init(params);\n this._action = params.action;\n }\n\n static forLoginWithPassword() {\n return LoginTimeAnalytics.create({\n action: 'LoginWithPassword'\n });\n }\n\n static forAutologinWithToken() {\n return LoginTimeAnalytics.create({\n action: 'AutologinWithToken'\n });\n }\n\n static forAutologinWithTouchId() {\n return LoginTimeAnalytics.create({\n action: 'AutologinWithTouchId'\n });\n }\n\n _success(duration) {\n Event.once(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, () => {\n this._sendAnalytics('Success' + this._action, duration);\n }, this);\n }\n\n _fail(duration, error) {\n this._sendAnalytics('Fail' + this._action, duration, error && error.error_code);\n }\n\n\n measure(callback) {\n let startTime = Date.now();\n\n let duration = () => {\n return DateTimeUtils.millisecondsToSeconds(Date.now() - startTime);\n };\n\n return callback().then((data) => {\n this._success(duration());\n return data;\n }).catch(err => {\n this._fail(duration(), err);\n throw err;\n });\n }\n\n _sendAnalytics(label, duration, errorCode) {\n let analyticsData = {\n category: '[Technical-event]',\n action: 'Login',\n label: label,\n value: duration\n };\n\n if(errorCode) {\n analyticsData.label += '.' + errorCode;\n }\n\n\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, analyticsData);\n }\n\n}","import BaseObject from '../../base/base_object';\nimport {GRANT_TYPES} from './oauth_const';\nimport Event from '../../utils/event';\nimport {SYSTEM_EVENTS} from '../../events/events';\n\nimport Device from '../../utils/device/device';\nimport { TimeSpan } from \"@sparkware/app-utils\";\nimport _ from '../../utils/underscore';\nimport LoginTimeAnalytics from './states/login_time_analytics';\nimport ServiceFactory from '../service_factory';\nimport {isRefreshTokenError} from \"../../exceptions/cgp_error_codes\";\nimport {TokenType} from \"../../../../common/const/token_type\";\nimport Store from \"../../utils/store\";\nimport MIGRATION from \"../../../../common/const/migration_consts\";\nimport {UndefinedString} from \"../../../../common/types/nullable-types\";\n\ninterface IRefreshTokenOptions {\n timeSinceLastActivity?: number;\n reason: string;\n}\n\nexport default class OAuth2BackendProxy extends BaseObject {\n static CLASS = 'OAuth2BackendProxy';\n\n _tokenUrl = null;\n _logoutUrl = null;\n _serviceFactory: ServiceFactory = null;\n _inactivityTimeoutSettingsPersister = null;\n\n init(params) {\n super.init(params);\n\n this._tokenUrl = params.tokenUrl;\n this._logoutUrl = params.logoutUrl;\n this._serviceFactory = params.serviceFactory;\n this._inactivityTimeoutSettingsPersister = params.inactivityTimeoutSettingsPersister;\n }\n\n /**\n *\n * @param token {string}\n * @param sessionTimerOffset {TimeSpan}\n * @param sourceProductPackage\n * @param brandId\n * @param sourceSubBrandId\n * @param targetSubBrandId\n * @param tokenType\n * @returns {Promise}\n */\n autoLoginWithToken(token, sessionTimerOffset, sourceProductPackage, brandId, sourceSubBrandId, targetSubBrandId, tokenType: TokenType, businessCorrelationId: UndefinedString) {\n if (sessionTimerOffset) {\n sessionTimerOffset = sessionTimerOffset.toString(); // convert from TimeSpan to string\n }\n return LoginTimeAnalytics.forAutologinWithToken().measure(() => {\n let autoLogingParams: any = {\n token: this._fixPlusSignEncoding(token)\n };\n\n if (!_.isNullOrUndefined(sessionTimerOffset)) {\n autoLogingParams.sessionTimerOffset = sessionTimerOffset;\n }\n\n if (!_.isNullOrUndefined(sourceProductPackage)) {\n autoLogingParams.sourceProductPackage = sourceProductPackage;\n }\n if (!_.isNullOrUndefined(brandId)) {\n autoLogingParams.brandId = brandId;\n }\n\n if (!_.isNullOrUndefined(sourceSubBrandId)) {\n autoLogingParams.sourceSubBrandId = sourceSubBrandId;\n }\n\n if (!_.isNullOrUndefined(targetSubBrandId)) {\n autoLogingParams.targetSubBrandId = targetSubBrandId;\n }\n\n if(!_.isNullOrUndefined(businessCorrelationId)) {\n autoLogingParams.businessCorrelationId = businessCorrelationId;\n }\n\n autoLogingParams.tokenType = !_.isNullOrUndefined(tokenType) ? tokenType : TokenType.AuthenticationToken;\n return this._autologin(autoLogingParams);\n });\n }\n\n _fixPlusSignEncoding(token) {\n // if the token originally had a \"+\" sign inside of it and the navigation is done through GNWP then shared navigation replaces + sign with a space\n // ideally the one who generated the token should URL encode it but if it doesn't do that our autologin will fail.\n if ('string' === typeof(token)) {\n return token.replace(/ /g, '+');\n } else {\n return token;\n }\n }\n\n async autoLoginWithTouchId(touchIdToken) {\n let touchParams = _.safeJSON(touchIdToken, null);\n \n if (touchParams && touchParams.touch_token) {\n return LoginTimeAnalytics.forAutologinWithTouchId().measure(() => {\n return this._autologin({\n token: touchParams.touch_token, //used to be touchtoken\n deviceid: touchParams.DeviceId,\n bundleid: touchParams.BundleId,\n tokenType: TokenType.TouchID\n });\n });\n }\n\n return Promise.resolve();\n }\n\n async _autologin(autoLoginParams) {\n autoLoginParams.grant_type = GRANT_TYPES.AUTOLOGIN;\n\n autoLoginParams.deviceUUID = await this._serviceFactory.webLoginService().getDeviceUUID(); \n\n return this._login(autoLoginParams);\n }\n\n loginWithPassword(credentials) {\n credentials.grant_type = GRANT_TYPES.PASSWORD;\n\n return LoginTimeAnalytics.forLoginWithPassword().measure(() => {\n return this._login(credentials);\n });\n }\n\n async _login(credentials) {\n try {\n // credentials parameter must come before this._buildLoginParams()\n // otherwise some parameters like brandId that can be undefined in the credentials to override those returned by this._buildLoginParams()\n\n let loginParams = Object.assign({}, credentials, this._buildLoginParams(), this._buildCustomSessionTimeTokenRequestParam());\n\n loginParams.playerMigrated = this._serviceFactory.playerMigrationProxyService().isPlayerMigrated;\n\n loginParams.businessCorrelationId = this._serviceFactory.playerMigrationProxyService().businessCorrelationId;\n \n if (!_.isNullOrUndefined(credentials.brandId)) {\n loginParams.brandId = credentials.brandId;\n }\n\n if (!_.isNullOrUndefined(credentials.targetSubBrandId)) {\n loginParams.subBrandId = credentials.targetSubBrandId;\n }\n\n if (Device.hybrid.isHybrid) {\n await this._addPlayerAppDataToLoginParams(loginParams);\n }\n\n //Add some Marketing Data to the request REQUIREMENT 1897606\n this._addMarketingDataToLoginParams(loginParams);\n\n try {\n let result = await this._serviceFactory.http2Service().post(this._tokenUrl, loginParams);\n if (this._serviceFactory.playerMigrationProxyService().isMigrationEnabledFromConfig) {\n this._setMigrationSuccessfulCookie();\n }\n return result;\n } catch (error) {\n Event.fire(SYSTEM_EVENTS.FAIL_LOGIN_RESPONSE);\n\n this.reThrowError('165',\n 'token API failed',\n error,\n {\n loginParams: Object.assign({}, loginParams, {authenticationdata: '*'}) //we are masking the password so we don't print it in the log\n });\n\n }\n\n }catch (error) {\n this.logger.error('_login Error ', error);\n this._sendAnalytics('login Error', 'login with password ', error?.toString());\n\n this.reThrowError('178',\n '_login failed',\n error,\n {});\n }\n }\n\n private _setMigrationSuccessfulCookie() {\n Store.setCookie(MIGRATION.PLAYER_MIGRATED_COOKIE, \"true\");\n }\n\n logout() {\n return this._serviceFactory.http2Service().post(this._logoutUrl);\n }\n\n refreshToken(token, options: IRefreshTokenOptions) {\n\n options = {\n timeSinceLastActivity: 0,\n ...options\n }\n\n\n let refreshTokenParams = Object.assign(\n {\n grant_type: GRANT_TYPES.REFRESH_TOKEN,\n refresh_token: token,\n time_since_last_user_activity: TimeSpan.fromMilliseconds(options.timeSinceLastActivity).toString()\n },\n this._buildLoginParams(),\n this._buildCustomSessionTimeTokenRequestParam());\n\n const executeRefreshToken = () => {\n return this._serviceFactory.http2Service().post(this._tokenUrl, refreshTokenParams);\n }\n\n return executeRefreshToken()\n .then((data) => {\n this._sendAnalytics('refresh_token_success', 'attempt_1', options.reason);\n return data;\n })\n .catch(err1 => {\n if(isRefreshTokenError(err1.error_code)) {\n throw err1;\n }\n this.logger.error('Refresh token attempt 1 failed', err1);\n this._sendAnalytics('refresh_token_failure', 'attempt_1', options.reason);\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n executeRefreshToken().then(data => {\n resolve(data);\n this._sendAnalytics('refresh_token_success', 'attempt_2', options.reason);\n }).catch(err2 => {\n this.logger.error('Refresh token attempt 2 failed', err2);\n this._sendAnalytics('refresh_token_failure', 'attempt_2', options.reason);\n reject(err2);\n });\n }, 2000);\n });\n });\n }\n\n _buildCustomSessionTimeTokenRequestParam() {\n let customSessionTimeout = this._inactivityTimeoutSettingsPersister.tryGetCustomAccessTokenLifeTime();\n if(!customSessionTimeout) {\n return {};\n } else {\n return {\n custom_session_timeout: customSessionTimeout.toString()\n };\n }\n }\n\n private async _addPlayerAppDataToLoginParams(loginParams): Promise {\n try {\n\n return new Promise((resolve, reject) => {\n const appMareketingData = this._serviceFactory.hybridService().getAppMareketingData();\n loginParams.playerAppDetails = JSON.stringify(appMareketingData);\n resolve();\n });\n }\n catch (err) {\n this.logger.error('_addPlaterAppDataToLoginParams failed', err);\n }\n }\n\n private _addMarketingDataToLoginParams(loginParams) {\n try {\n loginParams.gaSessionID = this._serviceFactory.analyticsService().getGoogleSessionID();\n\n const testData = this._serviceFactory.integrationService().getMarketingData()?.TestData;\n loginParams.testData = testData ? JSON.stringify(testData) : testData;\n\n return loginParams;\n\n }catch (error) {\n this.logger.error('_addMarketingData failed', error);\n return loginParams;\n }\n\n }\n\n _buildLoginParams() {\n const skinService = this._serviceFactory.skinService();\n const integrationService = this._serviceFactory.integrationService();\n const loginParams: any = {\n client_id: skinService.getClientID(),\n client_version: skinService.getVersion(),\n productPackage : skinService.getProductPackageID(),\n brandId : skinService.getBrandID(),\n subBrandId : skinService.getSubBrandID(),\n integration : integrationService.getRole(),\n isHybrid : Device.hybrid.isHybrid,\n isHybridEmbedded : Device.hybrid.isEmbedded,\n devicePixelRatio : Device.viewport.pixelRatio,\n screenHeight : Device.viewport.screenHeight,\n screenWidth : Device.viewport.screenWidth,\n benchmark : Device.getBenchMark(),\n langISO2 : this._serviceFactory.languageService().getISO2(),\n country : this._serviceFactory.countryService().getCountry(),\n };\n\n const anonymousPlayerId = this._serviceFactory.abTestingService().getAnonymousPlayerId();\n if (anonymousPlayerId) {\n loginParams.anonymousPlayerId = anonymousPlayerId;\n }\n\n return loginParams;\n }\n\n _sendAnalytics(category: string, action: string, label?: string) {\n this._serviceFactory.analyticsService().sendOrbitUserFlowEvent({\n category:category,\n action:action,\n label:label\n })\n }\n}\n","import BaseObject from '../../../base/base_object';\n\nexport default class OAuth2State extends BaseObject {\n static CLASS = 'OAuth2State';\n\n init(params) {\n super.init(params);\n }\n\n isAuthorized() {\n this.throwNotImplemented('11', 'isAuthorized');\n }\n\n tryToRememberMe() {\n this.throwNotImplemented('15', 'tryToRememberMe');\n }\n\n login(credentials) {\n this.throwNotImplemented('19', 'login');\n }\n\n logout() {\n this.throwNotImplemented('23', 'logout');\n }\n\n getLoginType() {\n this.throwNotImplemented('27', 'getLoginType');\n }\n\n autologinWithToken(autologinToken, sessionTimerOffset, sourceProductPackage, brandId, sourceSubBrandId, targetSubBrandId, tokenType, businessCorrelationId = undefined, fromRegistration= false) {\n this.throwNotImplemented('31', 'autologinWithToken');\n }\n\n getDecodedAccessToken() {\n this.throwNotImplemented('35', 'getDecodedAccessToken');\n }\n\n getTokenAuthorizeHeader() {\n this.throwNotImplemented('39', 'getTokenAuthorizeHeader');\n }\n\n getRefreshToken() {\n this.throwNotImplemented('43', 'getRefreshToken');\n }\n\n extractTokenProperty(tokenProperty) {\n this.throwNotImplemented('47', 'extractTokenProperty');\n }\n\n isVIP() {\n this.throwNotImplemented('51', 'isVIP');\n }\n\n getUserData() {\n this.throwNotImplemented('55', 'getUserData');\n }\n\n getAccountData() {\n this.throwNotImplemented('59', 'getAccountData');\n }\n\n updateTokenData(filedName, fieldValue) {\n this.throwNotImplemented('63', 'updateTokenData');\n }\n\n refreshToken() {\n this.throwNotImplemented('67', 'refreshToken');\n }\n\n getTimeSinceLogin() {\n this.throwNotImplemented('71', 'getTimeSinceLogin');\n }\n\n onInitComplete(fromOnInitCompleteEvent) {\n this.throwNotImplemented('75', 'onInitComplete');\n }\n}","import BaseObject from '../../../base/base_object';\nimport _ from '../../../utils/underscore';\nimport {TOKEN_PROPERTIES} from '../oauth_const';\nimport Store from '../../../utils/store';\n\nexport default class EmptyToken extends BaseObject {\n static CLASS = 'EmptyToken';\n isEmpty() {\n return true;\n }\n\n getLastRefreshTime() {\n return 0;\n }\n\n delete() {\n this._deleteOrphanTokenPropertiesFromStorage();\n }\n\n _deleteTokenRelatedProperties() {\n Store.del(TOKEN_PROPERTIES.OAUTH_LAST_REFRESH_TOKEN_TIMESTAMP);\n Store.del(TOKEN_PROPERTIES.OAUTH_HAS_REMEMBER_ME);\n Store.del(TOKEN_PROPERTIES.OAUTH_LAST_TIME_ACTIVITY);\n Store.del(TOKEN_PROPERTIES.OAUTH_ACCESS_TOKEN);\n Store.del(TOKEN_PROPERTIES.OAUTH_TOKEN_FIELDS_OVERRIDES);\n }\n\n\n _deleteOrphanTokenPropertiesFromStorage() {\n let tokenDataInLocalStorage = Store.get(TOKEN_PROPERTIES.OAUTH_STORAGE_KEY, null);\n // if the token data is not there in the local storage anymore remove the other related properties\n if(!tokenDataInLocalStorage) {\n this._deleteTokenRelatedProperties();\n }\n }\n\n setFieldValue(fieldName, fieldValue) {\n }\n\n getFieldValue() {\n return null;\n }\n\n updatePostLoginData() {\n\n }\n\n getRefreshToken() {\n return null;\n }\n\n _userData = null;\n getUserData() {\n if(!this._userData) {\n this._userData = _.safeJSON(Store.get(TOKEN_PROPERTIES.OAUTH_LAST_USER_DATA), null);\n }\n return this._userData;\n }\n\n getAccountData() {\n return null;\n }\n\n getHttpAuthorizationHeader() {\n return null;\n }\n\n getDecodedAccessToken() {\n return null;\n }\n\n getTimeUntilExpiration() {\n return 0;\n }\n\n isExpired() {\n return true;\n }\n\n hasRememberMe() {\n return false;\n }\n}","import Store from '../../../utils/store';\nimport {TOKEN_PROPERTIES} from '../oauth_const';\nimport _ from '../../../utils/underscore';\nimport Event from '../../../utils/event';\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport EmptyToken from './empty_token';\nimport DateTimeUtils from '../../../utils/date_time_utils';\n\n\nexport default class Token extends EmptyToken {\n static CLASS = 'Token';\n\n _now = () => Date.now();\n _tokenData = null;\n _lastRefreshTimestamp = 0;\n _jwtDecoder = null;\n _hasRememberMe = false;\n\n init(params) {\n super.init(params);\n\n params = params || {};\n this._now = params.now || this._now;\n this._jwtDecoder = params.jwtDecoder || require('jwt-decode');\n\n this._deleteOrphanTokenPropertiesFromStorage();\n\n this._tokenData = this._saveToStorage(params.tokenData, params.sessionTimerOffset);\n\n this._updateLastRefreshTimestamp(params.lastRefreshTimestamp);\n\n this._setHasRememberMe(params.hasRememberMe);\n }\n\n static fromNew(params) {\n return Token.create(params);\n }\n\n static getAccessTokenFieldFromLocalStorage() {\n return Store.get(TOKEN_PROPERTIES.OAUTH_ACCESS_TOKEN);\n }\n\n static getLastSessionFromStorage() {\n return _.safeJSON(Store.get(TOKEN_PROPERTIES.OAUTH_LAST_SESSION_DATA), null);\n }\n\n static fromStorage(params) {\n let tokenData = _.safeJSON(Store.get(TOKEN_PROPERTIES.OAUTH_STORAGE_KEY), null);\n if(tokenData){\n let lastRefreshTimestamp = parseInt(Store.get(TOKEN_PROPERTIES.OAUTH_LAST_REFRESH_TOKEN_TIMESTAMP, 0));\n let hasRememberMe = Store.get(TOKEN_PROPERTIES.OAUTH_HAS_REMEMBER_ME, null) === 'true';\n params = Object.assign(params || {},\n {\n tokenData: tokenData,\n hasRememberMe: hasRememberMe,\n lastRefreshTimestamp: lastRefreshTimestamp\n });\n return Token.create(params);\n } else {\n return EmptyToken.create();\n }\n\n }\n\n static isInStorage() {\n if(Store.get(TOKEN_PROPERTIES.OAUTH_STORAGE_KEY, null)) {\n return true;\n } else {\n return false;\n }\n }\n\n hasRememberMe() {\n return this._hasRememberMe;\n }\n\n _setHasRememberMe(value) {\n if(value) {\n Store.set(TOKEN_PROPERTIES.OAUTH_HAS_REMEMBER_ME, 'true');\n }\n\n this._hasRememberMe = 'true' === Store.get(TOKEN_PROPERTIES.OAUTH_HAS_REMEMBER_ME, 'false');\n }\n\n _saveToStorage(tokenData) {\n\t\ttokenData = this._mergeTokenFieldsOverrides(tokenData);\n\n let stringifiedTokenData = JSON.stringify(tokenData);\n tokenData = JSON.parse(stringifiedTokenData);\n Store.set(TOKEN_PROPERTIES.OAUTH_STORAGE_KEY, stringifiedTokenData);\n //we store the access_token in a separate field in local storage because there are some\n //optimizations in the OAuth2AuthorizedState that rely on this field.\n Store.set(TOKEN_PROPERTIES.OAUTH_ACCESS_TOKEN, tokenData.access_token);\n\n this._saveB2CData(tokenData.b2c);\n\n return tokenData;\n }\n\n _saveB2CData(b2cData) {\n if(!b2cData) {\n return;\n }\n\n //we don't fail everything just because we can't write b2c data into the local storage\n try {\n b2cData = JSON.parse(b2cData);\n\n Store.set(TOKEN_PROPERTIES.OAUTH_LAST_SESSION_DATA, JSON.stringify({\n message: b2cData.sessionParamsMsg,\n signature: b2cData.sessionParamsSignature\n }));\n } catch (err) {\n this.logger.error('Failed to write b2c data into the local storage', err);\n }\n }\n\n _updateLastRefreshTimestamp(timeStamp) {\n if(!timeStamp) {\n timeStamp = this._now();\n }\n this._lastRefreshTimestamp = timeStamp;\n Store.set(TOKEN_PROPERTIES.OAUTH_LAST_REFRESH_TOKEN_TIMESTAMP, timeStamp);\n\n }\n\n delete() {\n Store.del(TOKEN_PROPERTIES.OAUTH_STORAGE_KEY);\n this._deleteTokenRelatedProperties();\n this._tokenData = null;\n }\n\n isEmpty() {\n return false;\n }\n\n getLastRefreshTime() {\n return this._lastRefreshTimestamp;\n }\n\n setFieldValue(fieldName, fieldValue) {\n if (_.isObject(fieldValue)) {\n this._tokenData[fieldName] = JSON.stringify(fieldValue);\n } else {\n this._tokenData[fieldName] = fieldValue;\n }\n\n let fieldsOverrides = this._getTokenFieldsOverrides();\n\n fieldsOverrides[fieldName] = this._tokenData[fieldName];\n\n this._saveTokenFieldsOverrides(fieldsOverrides);\n\n this._tokenData = this._saveToStorage(this._tokenData);\n }\n\n _getTokenFieldsOverrides() {\n let overrides = Store.get(TOKEN_PROPERTIES.OAUTH_TOKEN_FIELDS_OVERRIDES, null);\n if(!overrides) {\n return {};\n }\n\n try {\n return JSON.parse(overrides);\n } catch (err) {\n this.logger.error(`Failed to parse token fields overrides! Overrides: ${overrides}; ErrorDetails: ${err}`);\n return {};\n }\n }\n\n _saveTokenFieldsOverrides(overrides) {\n if(overrides) {\n Store.set(TOKEN_PROPERTIES.OAUTH_TOKEN_FIELDS_OVERRIDES, JSON.stringify(overrides));\n } else {\n Store.del(TOKEN_PROPERTIES.OAUTH_TOKEN_FIELDS_OVERRIDES);\n }\n\n }\n\n _mergeTokenFieldsOverrides(tokenData) {\n let fieldsOverrides = this._getTokenFieldsOverrides();\n return Object.assign(tokenData, fieldsOverrides);\n }\n\n\n getFieldValue(fieldName) {\n return this._tokenData[fieldName];\n }\n\n getRefreshToken() {\n return this.getFieldValue('refresh_token');\n }\n\n /**\n * This method will be called only after a successful login.\n * It should not be called after refresh token.\n */\n updatePostLoginData() {\n let newUserData = this._createUserDataFromTokenData();\n\n let oldUserData = _.safeJSON(Store.get(TOKEN_PROPERTIES.OAUTH_LAST_USER_DATA), null);\n let lastCid = (null === oldUserData)\n ? 0\n : oldUserData.cid;\n\n Store.set(TOKEN_PROPERTIES.OAUTH_LAST_USER_DATA, JSON.stringify(newUserData));\n this._userData = newUserData;\n\n Event.fire(SYSTEM_EVENTS.SUCCESSFULLY_LOGIN_RESPONSE, {\n lastCid: lastCid,\n newCid: newUserData.cid\n });\n }\n\n getUserData() {\n //we always return the userData from the token\n return this._createUserDataFromTokenData();\n }\n\n _accountData = null;\n getAccountData() {\n if(!this._accountData) {\n var fieldValue = this.getFieldValue('accountData');\n this._accountData = JSON.parse(fieldValue);\n }\n return this._accountData;\n }\n\n _createUserDataFromTokenData() {\n const accountData = this.getAccountData();\n const rawHistoryData = this.getFieldValue('historyData');\n let historyData = {};\n if(rawHistoryData) {\n historyData = JSON.parse(rawHistoryData);\n }\n\n return {\n userName: this._tokenData.userName,\n cid: accountData.Cid,\n accountData: {\n FirstName: accountData.FirstName,\n LastName: accountData.LastName,\n StatusGroupId: accountData.StatusGroupId,\n FTDSubBrand: accountData.FTDSubBrand,\n isVIP: accountData.IsVip,\n genderID: accountData.GenderId,\n DWHGameGroupOrientation: accountData.DWHGameGroupOrientation,\n TimeSinceRegistration: accountData.TimeSinceRegistration,\n PlayerRMStatus: accountData.PlayerRMStatus,\n RegistrationCountry: accountData.RegistrationCountry,\n JoinDate: accountData.JoinDate,\n IsPromotionPermitted: accountData.IsPromotionPermitted,\n TaxId: accountData.TaxId,\n MobileNumber: accountData.MobileNumber,\n LastLogin: historyData.LastLogin,\n LastLoginDateInTimeZone: historyData.LastLoginDateInTimeZone\n }\n };\n }\n\n getAccessTokenField() {\n return this.getFieldValue('access_token');\n }\n\n getHttpAuthorizationHeader() {\n return 'Bearer ' + this.getAccessTokenField();\n }\n\n _decodedAccessToken = null;\n getDecodedAccessToken() {\n if(!this._decodedAccessToken) {\n this._decodedAccessToken = this._jwtDecoder(this.getAccessTokenField());\n }\n\n return this._decodedAccessToken;\n }\n\n getTimeUntilExpiration() {\n let timeSinceLastRefresh = this._now() - this.getLastRefreshTime();\n let tokenExpirationTime = DateTimeUtils.secondsToMilliseconds(this._tokenData.expires_in);\n return Math.max(0, tokenExpirationTime - timeSinceLastRefresh);\n }\n\n isExpired() {\n if(0 === this.getTimeUntilExpiration()) {\n return true;\n } else {\n return false;\n }\n }\n}","import OAuth2State from './oauth2_state';\nimport Event from '../../../utils/event';\nimport Strings from '../../../utils/strings';\nimport {Check, TimeSpan} from \"@sparkware/app-utils\";\nimport DOM from '../../../utils/dom';\nimport { SYSTEM_EVENTS} from '../../../events/events';\nimport { KICK_REASONS, KICK_TYPE} from '../../player_messages_service/player_messages_consts';\nimport Token from '../tokens/token';\nimport { OAUTH2_CSS} from '../oauth_const';\nimport OptionsComponentController from '../../../components/options/options_component_controller';\nimport UserActivityDetector from './user_activity_detector';\nimport { MESSAGE_TYPE } from '../../../components/message/message_consts';\nimport EmptyToken from '../tokens/empty_token';\nimport {PRIORITY_LEVEL} from '../../overlay_manager/overlay_manager_levels';\nimport _ from '../../../utils/underscore';\nimport {LOGOUT_REASONS} from '../oauth_const';\n\n\nexport const REFRESH_TOKEN_REASONS = {\n on_init_complete: 'on_init_complete',\n on_user_activity: 'on_user_activity',\n on_user_discard_idle_popup: 'on_user_discard_idle_popup',\n user_set_custom_session: 'user_set_custom_session',\n on_app_resume: 'on_app_resume',\n try_remember_me: 'try_remember_me',\n};\n\nconst GENERAL_KICK_TRANSLATION_KEY = 'kick_reason_general';\n\nexport default class OAuth2AuthorizedState extends OAuth2State {\n static CLASS = 'OAuth2AuthorizedState';\n\n _currentToken = null;\n _stateChangedCallback = null;\n\n _backendProxy = null;\n _oauth2StateFactory = null;\n _serviceFactory = null;\n _userActivityDetector = null;\n _logoutUserTimer = null;\n _logoutUserCancelTimer = null;\n _kickInactiveUserTimer = null;\n _inactivityTimeoutSettingsPersister = null;\n _getSessionTimerUrl = null;\n\n init(params) {\n super.init(params);\n\n this._stateChangedCallback = params.stateChangedCallback;\n this._backendProxy = params.backendProxy;\n this._oauth2StateFactory = params.oauth2StateFactory;\n this._serviceFactory = params.serviceFactory;\n this._inactivityTimeoutSettingsPersister = params.inactivityTimeoutSettingsPersister;\n this._getSessionTimerUrl = params.getSessionTimerUrl;\n\n\n this._currentToken = params.token;\n\n this._subscribe();\n\n\n DOM.addClass(DOM.getBody(), OAUTH2_CSS.AUTHORIZED_USER_CLASS);\n }\n\n onInitComplete(fromOnInitCompleteEvent) {\n this._userActivityDetector = UserActivityDetector.create({\n serviceFactory: this._serviceFactory,\n userActivityDetectionInterval: TimeSpan.fromMilliseconds(Math.max(1000, this._accessTokenLifeTimeMS() / 100))\n });\n\n if (fromOnInitCompleteEvent) {\n if(this._serviceFactory.regulationService().shouldRefreshTokenOnAppOpen()) {\n if(!this._serviceFactory.queryStringDetectorService().isInAutologin()) {\n this.refreshToken(REFRESH_TOKEN_REASONS.on_init_complete); // we get to this line when the user has a token in the local storage and he refresh the browser page (F5)\n }\n }\n } else {\n this._startKickInactiveUserTimer(); // otherwise it means that the user just logged in\n }\n }\n\n static forNewLogin(params) {\n\n let authorizedState = OAuth2AuthorizedState.create(params);\n authorizedState._updateNewLoginData();\n return authorizedState;\n }\n\n static forExistingToken(params) {\n return OAuth2AuthorizedState.create(params);\n }\n\n isAuthorized() {\n return true;\n }\n\n _sessionEventKickSubscription = null;\n _appResumeSubscription = null;\n _subscribe() {\n this._subscribeToLocalStorageChanged();\n this._sessionEventKickSubscription = Event.on(SYSTEM_EVENTS.SESSION_EVENT_KICK, this._onKickEvent, this);\n this._appResumeSubscription = Event.on(SYSTEM_EVENTS.APP_RESUMED, this._onAppResumed, this);\n\n }\n\n _unsubscribe() {\n this._unsubscribeFromLocalStorageChanged();\n if(this._sessionEventKickSubscription) {\n this._sessionEventKickSubscription.off();\n this._sessionEventKickSubscription = null;\n }\n\n if(this._appResumeSubscription) {\n this._appResumeSubscription.off();\n this._appResumeSubscription = null;\n }\n }\n\n _localStorageChangedSubscription = null;\n _subscribeToLocalStorageChanged() {\n this._localStorageChangedSubscription = Event.on(SYSTEM_EVENTS.LOCAL_STORAGE_CHANGED, this._onLocalStorageChanged, this);\n }\n _unsubscribeFromLocalStorageChanged() {\n if(this._localStorageChangedSubscription) {\n this._localStorageChangedSubscription.off();\n this._localStorageChangedSubscription = null;\n }\n }\n\n dispose() {\n this._unsubscribe();\n\n if (this._userActivityDetector) {\n this._userActivityDetector.dispose();\n }\n\n this._killTimers();\n\n }\n\n _updateNewLoginData() {\n this._currentToken.updatePostLoginData();\n this._sendOptionsConfig();\n }\n\n _sendAnalytics(action, label) {\n let analyticsData = {\n category: 'oauth2_authorized_state',\n action: action\n };\n\n if (!_.isNullOrUndefined(label)) {\n analyticsData.label = label;\n }\n\n this._serviceFactory.analyticsService().sendEvent(analyticsData);\n }\n\n _killTimers() {\n if (this._kickInactiveUserTimer) {\n this._kickInactiveUserTimer.dispose();\n }\n\n if (this._logoutUserTimer) {\n this._logoutUserTimer.dispose();\n }\n if (this._logoutUserCancelTimer) {\n this._logoutUserCancelTimer.dispose();\n }\n }\n\n _accessTokenLifeTimeMS() {\n return this._inactivityTimeoutSettingsPersister.getAccessTokenLifeTime().totalMilliseconds;\n }\n\n _timeSinceLastUserActivityMS() {\n return this._userActivityDetector.getTimeSinceLastUserActivity();\n }\n\n _timeBeforeWhichTheUserShouldBeNotifiedMS() {\n const defaultValue = TimeSpan.fromMinutes(2).totalMilliseconds;\n if (defaultValue >= this._accessTokenLifeTimeMS()) { // this is done to support small access token lifetime values in development and testing\n return 0.2 * this._accessTokenLifeTimeMS();\n } else {\n return defaultValue;\n }\n }\n _timeAfterWhichTheIdlePopUpMessageShouldBeShownMS() {\n return Math.max(0, this._accessTokenLifeTimeMS() - this._timeSinceLastUserActivityMS() - this._timeBeforeWhichTheUserShouldBeNotifiedMS());\n }\n\n _startKickInactiveUserTimer() {\n this._killTimers();\n const timeAfterWhichTheIdlePopUpMessageShouldBeShown = this._timeAfterWhichTheIdlePopUpMessageShouldBeShownMS();\n this._sendAnalytics('timeAfterWhichTheIdlePopUpMessageShouldBeShownInMS:' + timeAfterWhichTheIdlePopUpMessageShouldBeShown);\n\n this._kickInactiveUserTimer = this._serviceFactory.observableFactoryService().fromTimeout(timeAfterWhichTheIdlePopUpMessageShouldBeShown)\n .forEach(() => {\n const timeSinceLastUserActivity = this._timeSinceLastUserActivityMS();\n this._sendAnalytics('timeSinceLastUserActivityInMS:' + timeSinceLastUserActivity);\n\n if (timeSinceLastUserActivity < timeAfterWhichTheIdlePopUpMessageShouldBeShown) {\n this.refreshToken(REFRESH_TOKEN_REASONS.on_user_activity);\n } else {\n this._logoutUserTimer = this._startLogoutTimer();\n this._logoutUserCancelTimer = this._startLogoutTimerCanceler();\n this._showIdlePopUpMessage(() => {\n this._serviceFactory.analyticsService().sendOrbitUserFlowEvent({\n category: 'InactivityTimeoutPopUp',\n action: 'OK',\n label: 'PreDisconnect'\n });\n \n // Clicking on the OK button will trigger an overlay close event but that happens too late.\n // This is why here explicitly we let the UserActivityDetector know about this user activity.\n this._userActivityDetector.setLastTimeUserPerformedAction();\n this._killTimers();\n this.refreshToken(REFRESH_TOKEN_REASONS.on_user_discard_idle_popup);\n }, () => {\n this._serviceFactory.analyticsService().sendOrbitUserFlowEvent({\n category: 'InactivityTimeoutPopUp',\n action: 'Close',\n label: 'PreDisconnect'\n });\n });\n }\n });\n }\n\n _showIdlePopUpMessage(onClickCallback, onCloseCallback) {\n let messageTextTranslation = new Strings(this._serviceFactory.languageService().translation('mdp_inactivity'));\n\n let messageText = messageTextTranslation.injectIntoCurly({\n timer: 2\n });\n\n\n let okButton = {\n callback: onClickCallback\n };\n\n let message = {\n text: messageText,\n type: MESSAGE_TYPE.WARNING,\n buttons: [\n okButton\n ],\n closeCallback: onCloseCallback\n };\n\n this._serviceFactory.analyticsService().sendOrbitUserFlowEvent({\n category: 'InactivityTimeoutPopUp',\n action: 'Show',\n label: 'PreDisconnect'\n });\n\n this._showMessage(message);\n }\n\n _startLogoutTimer() {\n return this._serviceFactory.observableFactoryService().fromTimeout(this._timeBeforeWhichTheUserShouldBeNotifiedMS())\n .forEach(() => {\n this._serviceFactory.analyticsService().sendOrbitUserFlowEvent({\n category: 'InactivityTimeoutPopUp',\n action: 'Show',\n label: 'PostDisconnect'\n });\n\n this._switchToAnonymousState({logoutReason: LOGOUT_REASONS.USER_IDLE});\n Event.fire(SYSTEM_EVENTS.TOKEN_LIFETIME_EXPIRED);\n this._serviceFactory.orbitComponentRenderService().showDisconnectPopup();\n });\n }\n\n _startLogoutTimerCanceler() {\n // The purpose of this timer is to close the idle message pop up and refresh token in this tab\n // when the user clicks on the OK button in another browser tab.\n // If we don't do this then the user will be logged out in this browser tab even if he clicked OK button in the other browser tab.\n return this._serviceFactory.observableFactoryService().fromInterval(1000).forEach(() => {\n if (this._timeSinceLastUserActivityMS() < this._timeAfterWhichTheIdlePopUpMessageShouldBeShownMS()) {\n\n this._sendAnalytics('idle_popup_canceled');\n\n this._killTimers();\n Event.fire(SYSTEM_EVENTS.CLOSE_OVERLAY, {priority: PRIORITY_LEVEL.MESSAGE});\n this.refreshToken(REFRESH_TOKEN_REASONS.on_user_activity);\n }\n });\n }\n\n\n\n _onLocalStorageChanged() {\n if (!Token.isInStorage()) { // it means it was removed so we need to switch to anonymous state\n this._switchToAnonymousState({logoutReason: LOGOUT_REASONS.ACCESS_TOKEN_REMOVED});\n EmptyToken.create().delete();\n Event.fire(SYSTEM_EVENTS.OAUTH_REMOVE_FROM_LOCAL_STORAGE);\n } else {\n if (this._currentToken.getAccessTokenField() !== Token.getAccessTokenFieldFromLocalStorage()) {\n //it means that the token was changed in another browser instance\n // probably due to an autologin\n this._currentToken = Token.fromStorage();\n }\n }\n }\n\n _onKickEvent(kickParams) {\n if (kickParams.KickType !== KICK_TYPE.FULL_KICK) {\n return;\n }\n\n this._switchToAnonymousState({logoutReason: LOGOUT_REASONS.USER_KICKED, kickReason: kickParams.KickReasonId});\n\n if (this._serviceFactory.visibilityDetectorService().isActive()) {\n let textKey = null;\n if (this._getIfKnownKickReason(kickParams.KickReasonId)) {\n textKey = 'kick_reason_' + kickParams.KickReasonId;\n } else {\n textKey = GENERAL_KICK_TRANSLATION_KEY;\n }\n\n this._serviceFactory.orbitComponentRenderService().showDefaultKickPopup(textKey);\n }\n }\n\n _getIfKnownKickReason(reasonId) {\n return KICK_REASONS.includes(reasonId);\n }\n\n _lastRefreshOnAppResume = null;\n _onAppResumed() {\n if (Token.isInStorage()) {\n if(!this._serviceFactory.queryStringDetectorService().isInAutologin()) {\n this._userActivityDetector.setLastTimeUserPerformedAction();\n if(Check.isNullOrUndefined(this._lastRefreshOnAppResume) || (Date.now() - this._lastRefreshOnAppResume) > 60000) {\n this._lastRefreshOnAppResume = Date.now();\n this.refreshToken(REFRESH_TOKEN_REASONS.on_app_resume);\n } else {\n this._startKickInactiveUserTimer();\n }\n }\n } else {\n this._switchToAnonymousState({logoutReason: LOGOUT_REASONS.ACCESS_TOKEN_REMOVED});\n }\n }\n\n\n _switchToAnonymousState(params) {\n Event.fire(SYSTEM_EVENTS.ON_BEFORE_OAUTH_STATE_CHANGE);\n\n this.dispose();\n\n \n if (!this._currentToken.hasRememberMe()) {\n this._currentToken.delete();\n this._currentToken = EmptyToken.create();\n }\n \n let newState = this._oauth2StateFactory.createAnonymousState();\n \n this._stateChangedCallback(newState, params);\n \n this._closeAllOverlays();\n\n return newState;\n }\n\n _closeAllOverlays() {\n Event.fire(SYSTEM_EVENTS.CLOSE_ALL_OVERLAY);\n }\n\n _showMessage(message) {\n Event.fire(SYSTEM_EVENTS.MESSAGE_OPEN, message);\n }\n\n /**\n * Send reminder and other options config to analytics\n * @private\n */\n _sendOptionsConfig() {\n let reminderController = OptionsComponentController.create().load('ReminderSettings');\n reminderController.reportAnalytics();\n }\n\n tryToRememberMe() {\n //no need to do something\n //we are already logged in\n return Promise.resolve();\n }\n\n login(credentials) {\n this.throwError('392',\n 'No need to execute login! The user is already logged in!',\n { credentials: Object.assign(credentials, { password: '*' }) });\n }\n\n logout() {\n let executeOnLogout = () => {\n this._switchToAnonymousState({logoutReason: LOGOUT_REASONS.EXPLICIT_LOGOUT});\n // on explicit logout we make sure we clean up token properties from storage\n this._currentToken.delete();\n };\n\n return this._backendProxy.logout()\n .then(() => {\n executeOnLogout();\n }).catch(() => {\n executeOnLogout();\n });\n }\n\n autologinWithToken(autologinToken, sessionTimerOffset, sourceProductPackage, brandId, sourceSubBrandId, targetSubBrandId, tokenType, businessCorrelationId) {\n return this._backendProxy.autoLoginWithToken(autologinToken, sessionTimerOffset, sourceProductPackage, brandId, sourceSubBrandId, targetSubBrandId, tokenType, businessCorrelationId)\n .then((tokenResponse) => {\n //temporary disable local storage change notification\n //otherwise we will have duplicated OAUTH_STATE_CHANGE events fired due to local storage changes\n this._unsubscribeFromLocalStorageChanged();\n try {\n Event.fire(SYSTEM_EVENTS.ON_BEFORE_OAUTH_STATE_CHANGE);\n this._currentToken = Token.fromNew({\n tokenData: tokenResponse\n });\n this._updateNewLoginData();\n Event.fire(SYSTEM_EVENTS.LOGIN_SESSION_RESUMED);//cross sell session continuation\n }\n finally {\n //reenable local storage change notification\n this._subscribeToLocalStorageChanged();\n }\n\n Event.fire(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, {loginType: this.getLoginType()});\n })\n .catch(responseError => {\n this._switchToAnonymousState({logoutReason: LOGOUT_REASONS.AUTOLOGIN_FAILED});\n this._currentToken.delete();\n this._handleAutologinError(responseError);\n });\n }\n\n _handleAutologinError(responseError) {\n Event.fire(SYSTEM_EVENTS.TOUCH_ID_LOGIN_ERROR, responseError.error_code);\n this._serviceFactory.webLoginService().processLoginResponse(responseError);\n }\n\n getDecodedAccessToken() {\n return this._currentToken.getDecodedAccessToken();\n }\n\n getTokenAuthorizeHeader() {\n return this._currentToken.getHttpAuthorizationHeader();\n }\n\n extractTokenProperty(tokenProperty) {\n return this._currentToken.getFieldValue(tokenProperty);\n }\n\n isVIP() {\n return this.getUserData().accountData.isVIP;\n }\n\n getUserData() {\n return this._currentToken.getUserData();\n }\n\n getAccountData() {\n return this._currentToken.getAccountData();\n }\n\n updateTokenData(filedName, fieldValue) {\n this._currentToken.setFieldValue(filedName, fieldValue);\n }\n\n getRefreshToken() {\n return this._currentToken.getRefreshToken();\n }\n\n refreshToken(reason) {\n if (!Token.isInStorage()) {\n return Promise.reject('There is no token in the local storage to refresh');\n }\n\n this._killTimers();\n let timeSinceLastUserActivity = this._userActivityDetector.getTimeSinceLastUserActivity();\n return this._backendProxy.refreshToken(this._currentToken.getRefreshToken(), {timeSinceLastActivity: timeSinceLastUserActivity, reason: reason})\n .then((tokenData) => {\n this._currentToken = Token.fromNew({\n tokenData: tokenData\n });\n this._startKickInactiveUserTimer();\n if(reason === REFRESH_TOKEN_REASONS.on_init_complete || reason === REFRESH_TOKEN_REASONS.on_app_resume) {\n Event.fire(SYSTEM_EVENTS.LOGIN_SESSION_RESUMED);\n }\n\n })\n .catch(err => {\n this._switchToAnonymousState({logoutReason: LOGOUT_REASONS.REFRESH_TOKEN_FAILED});\n if(!this._serviceFactory.integrationService().isMiniOrbit()) {\n this._serviceFactory.orbitComponentRenderService().showDefaultKickPopup(GENERAL_KICK_TRANSLATION_KEY);\n }\n Event.fire(SYSTEM_EVENTS.TOKEN_LIFETIME_EXPIRED);\n this._currentToken.delete();\n\n this.reThrowError('503', 'Failed to refresh token', err);\n });\n }\n\n /**\n *\n * @returns {Promise.}\n */\n getTimeSinceLogin() {\n return this._serviceFactory.http2Service().post(this._getSessionTimerUrl)\n .then(data => {\n return TimeSpan.parse(data.SessionTimer)\n });\n }\n\n getLoginType() {\n return this.getDecodedAccessToken().loginType;\n }\n\n getSourceProductPackage() {\n return this.getDecodedAccessToken().sourceProductPackage;\n }\n\n}\n","import OAuth2State from './oauth2_state';\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport DOM from '../../../utils/dom';\nimport Event from '../../../utils/event';\nimport Token from '../tokens/token';\nimport {OAUTH2_CSS} from '../oauth_const';\nimport EmptyToken from '../tokens/empty_token';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport {REFRESH_TOKEN_REASONS} from \"./oauth2_authorized_state\";\n\nexport default class OAuth2AnonymousState extends OAuth2State {\n static CLASS = 'OAuth2AnonymousState';\n\n _stateChangedCallback = null;\n _backendProxy = null;\n _oauth2StateFactory = null;\n _emptyToken = null;\n _serviceFactory = null;\n\n init(params){\n super.init(params);\n this._emptyToken = EmptyToken.create();\n this._stateChangedCallback = params.stateChangedCallback;\n this._backendProxy = params.backendProxy;\n this._oauth2StateFactory = params.oauth2StateFactory;\n this._serviceFactory = params.serviceFactory;\n\n this._subscribe();\n\n DOM.removeClass(DOM.getBody(), OAUTH2_CSS.AUTHORIZED_USER_CLASS);\n }\n\n isAuthorized() {\n return false;\n }\n\n _subscribe() {\n Event.on(SYSTEM_EVENTS.LOCAL_STORAGE_CHANGED, this._onLocalStorageChanged, this);\n Event.on(SYSTEM_EVENTS.RUN_AUTOLOGIN, this._onRunAutologin, this);\n Event.on(SYSTEM_EVENTS.REGISTRATION_COMPLETED, this._onRegistrationCompleted, this);\n Event.on(SYSTEM_EVENTS.RUN_AUTOLOGIN_TOUCH_ID, this._onAutologinWithTouchId, this);\n Event.on(SYSTEM_EVENTS.APP_RESUMED, this._onAppResumed, this);\n\n }\n\n _unsubscribe() {\n Event.off(SYSTEM_EVENTS.LOCAL_STORAGE_CHANGED, this._onLocalStorageChanged, this);\n Event.off(SYSTEM_EVENTS.RUN_AUTOLOGIN, this._onRunAutologin, this);\n Event.off(SYSTEM_EVENTS.REGISTRATION_COMPLETED, this._onRegistrationCompleted, this);\n Event.off(SYSTEM_EVENTS.RUN_AUTOLOGIN_TOUCH_ID, this._onAutologinWithTouchId, this);\n Event.off(SYSTEM_EVENTS.APP_RESUMED, this._onAppResumed, this);\n }\n\n dispose() {\n this._unsubscribe();\n }\n\n _onLocalStorageChanged() {\n if(Token.isInStorage()) { //just in case this event is called more than once (it happens on IE)\n Event.off(SYSTEM_EVENTS.LOCAL_STORAGE_CHANGED, this._onLocalStorageChanged, this);\n let token = Token.fromStorage();\n if (!token.isExpired()) {\n this._switchToAuthorizedState({\n token: token\n });\n }\n }\n }\n\n _onRunAutologin(token) {\n this.autologinWithToken(token);\n }\n\n _onRegistrationCompleted(postMessageData) {\n this.autologinWithToken(postMessageData.UserInfo,null,postMessageData.SourceProductPackage, null, null, null, null, undefined, true);\n }\n\n _autologinWithTouchIdDebounceTimer = null;\n _onAutologinWithTouchId(touchIdToken) {\n\n if(this._autologinWithTouchIdDebounceTimer) {\n clearTimeout(this._autologinWithTouchIdDebounceTimer);\n }\n\n //we debounce the autologin with touch id because some time we get duplicate events which results in duplicate login requests.\n this._autologinWithTouchIdDebounceTimer = setTimeout(() => {\n this._backendProxy.autoLoginWithTouchId(touchIdToken)\n .then(tokenResponse => {\n this._serviceFactory.webLoginService().closeLoginForm();\n return this._switchToAuthorizedState({\n tokenData: tokenResponse\n });\n })\n .catch(responseError => {\n this._handleAutologinError(responseError);\n })\n .finally(() => {\n this._autologinWithTouchIdDebounceTimer = null;\n });\n\n }, 300);\n\n }\n\n autologinWithToken(autologinToken, sessionTimerOffset, sourceProductPackage, brandId, sourceSubBrandId, targetSubBrandId, tokenType, businessCorrelationId = undefined, fromRegistration= false) {\n\n Event.fire(SYSTEM_EVENTS.ON_RUN_AUTOLOGIN);\n if(fromRegistration) {\n Event.fire(SYSTEM_EVENTS.BEGIN_LOGIN_AFTER_REGISTRATION);\n }\n\n return this._backendProxy.autoLoginWithToken(autologinToken, sessionTimerOffset, sourceProductPackage, brandId, sourceSubBrandId, targetSubBrandId, tokenType, businessCorrelationId)\n .then((tokenResponse) => {\n\n this._serviceFactory.webLoginService().closeLoginForm();\n\n const result = this._switchToAuthorizedState({\n tokenData: tokenResponse,\n fromRegistration: fromRegistration\n });\n\n if(fromRegistration) {\n Event.fire(SYSTEM_EVENTS.LOGIN_COMPLETED_AFTER_REGISTERATION);\n }\n\n this._serviceFactory.spinnerProxyService().stopSpinner();\n return result;\n })\n .catch(responseError => {\n this._handleAutologinError(responseError);\n if(fromRegistration) {\n Event.fire(SYSTEM_EVENTS.LOGIN_FAILED_AFTER_REGISTRATION);\n }\n this._serviceFactory.spinnerProxyService().stopSpinner();\n });\n }\n\n _handleAutologinError(responseError) {\n Event.fire(SYSTEM_EVENTS.TOUCH_ID_LOGIN_ERROR, responseError.error_code);\n this._serviceFactory.webLoginService().processLoginResponse(responseError);\n }\n\n /**\n *\n * @param params: {\n * token: Token\n * tokenData: json\n * }\n * @returns {*}\n * @private\n */\n _switchToAuthorizedState(params) {\n Event.fire(SYSTEM_EVENTS.ON_BEFORE_OAUTH_STATE_CHANGE);\n this.dispose();\n\n let newState = null;\n\n if(params.tokenData) {\n newState = this._oauth2StateFactory.createAuthorizedStateForNewLogin(params.tokenData, params.hasRememberMe, params.sessionTimerOffset);\n } else if(params.token) {\n newState = this._oauth2StateFactory.createAuthorizedStateForExistingToken(params.token);\n } else {\n this.throwError('163',\n 'When switching to authorized state you must provide either token or tokenData parameters',\n {initializationParams: params});\n }\n\n\n\n this._stateChangedCallback(newState, {fromRegistration: params.fromRegistration});\n\n return newState;\n }\n\n _closeAllOverlays() {\n Event.fire(SYSTEM_EVENTS.CLOSE_ALL_OVERLAY);\n }\n\n _onAppResumed() {\n let token = Token.fromStorage();\n if(!token.isEmpty()) {\n if(token.isExpired()) {\n this._closeAllOverlays();\n this.tryToRememberMe();\n } else {\n this._switchToAuthorizedState({\n token: token\n });\n }\n\n }\n }\n\n tryToRememberMe() {\n let token = Token.fromStorage();\n if(token.isEmpty()) {\n return Promise.reject('Can`t remember me because there is no token in the local storage');\n }\n\n return this._backendProxy.refreshToken(token.getRefreshToken(), {reason: REFRESH_TOKEN_REASONS.try_remember_me})\n .then(tokenData => {\n this._switchToAuthorizedState({\n tokenData: tokenData\n });\n })\n .catch(err => {\n token.delete();\n this.reThrowError('208', 'OAuth2AnonymousState.tryToRememberMe failed!', err);\n });\n }\n\n login(credentials) {\n return this._backendProxy.loginWithPassword(credentials)\n .then(tokenData => {\n this._switchToAuthorizedState({\n tokenData: tokenData,\n hasRememberMe: credentials.remember_me\n });\n });\n }\n\n logout() {\n return Promise.resolve();\n }\n\n getDecodedAccessToken() {\n return this._emptyToken.getDecodedAccessToken();\n }\n\n getTokenAuthorizeHeader() {\n // This is for features like Remember Me to work\n return Token.fromStorage().getHttpAuthorizationHeader();\n }\n\n extractTokenProperty(tokenProperty) {\n return this._emptyToken.getFieldValue(tokenProperty);\n }\n\n isVIP() {\n return false;\n }\n\n getUserData() {\n return this._emptyToken.getUserData();\n }\n\n getAccountData() {\n return this._emptyToken.getAccountData();\n }\n\n updateTokenData(filedName, fieldValue) {\n this._emptyToken.setFieldValue(filedName, fieldValue);\n }\n\n getRefreshToken() {\n return null;\n }\n\n refreshToken() {\n return Promise.resolve();\n }\n\n getTimeSinceLogin() {\n return Promise.resolve(TimeSpan.fromMilliseconds(0));\n }\n\n getLoginType() {\n return null;\n }\n\n getSourceProductPackage() {\n return null;\n }\n\n onInitComplete(fromOnInitCompleteEvent) {\n // nothing to do here\n }\n}\n","import BaseObject from '../../../base/base_object';\nimport OAuth2AnonymousState from './oauth2_anonymous_state';\nimport OAuth2AuthorizedState from './oauth2_authorized_state';\nimport Token from '../tokens/token';\n\nexport default class OAuth2StateFactory extends BaseObject {\n static CLASS = 'OAuth2StateFactory';\n\n\n _stateChangedCallback = null;\n _backendProxy = null;\n _serviceFactory = null;\n _inactivityTimeoutSettingsPersister = null;\n _getSessionTimerUrl = null;\n init(params) {\n super.init(params);\n this._stateChangedCallback = params.stateChangedCallback;\n this._backendProxy = params.backendProxy;\n this._serviceFactory = params.serviceFactory;\n this._inactivityTimeoutSettingsPersister = params.inactivityTimeoutSettingsPersister;\n this._getSessionTimerUrl = params.getSessionTimerUrl;\n\n }\n\n createAnonymousState(params) {\n return OAuth2AnonymousState.create(Object.assign({}, params, this._getDependencies()));\n }\n\n createAuthorizedStateForNewLogin(tokenData, hasRememberMe, sessionTimerOffset) {\n let token = Token.fromNew({\n tokenData: tokenData,\n hasRememberMe: hasRememberMe,\n sessionTimerOffset: sessionTimerOffset\n });\n\n return OAuth2AuthorizedState.forNewLogin(this._getAuthorizedStateParams(token));\n }\n\n createAuthorizedStateForExistingToken(token) {\n return OAuth2AuthorizedState.forExistingToken(this._getAuthorizedStateParams(token));\n }\n\n _getAuthorizedStateParams(token) {\n return Object.assign(\n {\n token: token,\n inactivityTimeoutSettingsPersister: this._inactivityTimeoutSettingsPersister,\n getSessionTimerUrl: this._getSessionTimerUrl\n },\n this._getDependencies())\n }\n\n _getDependencies() {\n return {\n stateChangedCallback: this._stateChangedCallback,\n backendProxy: this._backendProxy,\n serviceFactory: this._serviceFactory,\n oauth2StateFactory: this\n };\n }\n\n createInitialState() {\n\n let token = Token.fromStorage();\n if(token.isExpired()) {\n return this.createAnonymousState();\n } else {\n return this.createAuthorizedStateForExistingToken(token);\n }\n }\n}","\nimport BaseObject from '../../base/base_object';\nimport {TOKEN_PROPERTIES} from './oauth_const';\nimport Store from '../../utils/store';\nimport {TimeSpan} from \"@sparkware/app-utils\";\n\nexport default class InactivityTimeoutSettingsPersister extends BaseObject {\n static CLASS = 'InactivityTimeoutSettingsPersister';\n\n _getServiceFactoryFunc = null;\n _defaultAccessTokenLifetime = null;\n _accessTokenLifeTimeForRegulation = null;\n _minAccessTokenLifeTime = null;\n _maxAccessTokenLifeTime = null;\n\n init(params) {\n this._getServiceFactoryFunc = params.getServiceFactoryFunc;\n this._defaultAccessTokenLifetime = TimeSpan.parse(params.defaultAccessTokenLifetime);\n this._accessTokenLifeTimeForRegulation = params.accessTokenLifeTimeForRegulation || {};\n this._minAccessTokenLifeTime = TimeSpan.parse(params.minAccessTokenLifeTime);\n this._maxAccessTokenLifeTime = TimeSpan.parse(params.maxAccessTokenLifeTime);\n }\n\n get serviceFactory() {\n return this._getServiceFactoryFunc();\n }\n\n _getDefaultAccessTokenLifetime() {\n let currentRegulationCode = this.serviceFactory.regulationService().getRegulationCode();\n\n if (this._accessTokenLifeTimeForRegulation[currentRegulationCode]) {\n return TimeSpan.parse(this._accessTokenLifeTimeForRegulation[currentRegulationCode]);\n } else {\n return this._defaultAccessTokenLifetime;\n }\n }\n\n setCustomAccessTokenLifeTime(timeSpan) {\n if (TimeSpan.areEquals(this._getDefaultAccessTokenLifetime(), timeSpan)) {\n Store.del(TOKEN_PROPERTIES.OAUTH_CUSTOM_SESSION_TIMEOUT);\n } else {\n\n Store.set(TOKEN_PROPERTIES.OAUTH_CUSTOM_SESSION_TIMEOUT, this._limitCustomAccessTokenLifeTime(timeSpan).toString());\n }\n }\n\n tryGetCustomAccessTokenLifeTime() {\n let timeSpanAsString = Store.get(TOKEN_PROPERTIES.OAUTH_CUSTOM_SESSION_TIMEOUT, null);\n if (!timeSpanAsString) {\n return null;\n }\n try {\n let timeSpan = TimeSpan.parse(timeSpanAsString);\n return this._limitCustomAccessTokenLifeTime(timeSpan);\n }\n catch (err) {\n // in case it fails we don't want to fail everything because of this\n this.logger.error('tryGetCustomAccessTokenLifeTime failed! ', err);\n return null;\n }\n }\n\n getAccessTokenLifeTime() {\n let timeSpan = this.tryGetCustomAccessTokenLifeTime();\n if (timeSpan) {\n return timeSpan;\n }\n\n return this._getDefaultAccessTokenLifetime();\n }\n\n getMinAccessTokenLifeTime() {\n return this._minAccessTokenLifeTime;\n }\n\n getMaxAccessTokenLifeTime() {\n return this._maxAccessTokenLifeTime;\n }\n\n getPossibleAccessTokenLifeTimeValues() {\n let result = [];\n let minValueInMinutes = this._minAccessTokenLifeTime.totalMinutes;\n let maxValueInMinutes = this._maxAccessTokenLifeTime.totalMinutes;\n for (let i = minValueInMinutes; i <= maxValueInMinutes; i = i + 10) {\n result.push(TimeSpan.fromMinutes(i));\n }\n return result;\n }\n\n\n _limitCustomAccessTokenLifeTime(timeSpan) {\n if (timeSpan.totalMilliseconds > this._maxAccessTokenLifeTime.totalMilliseconds) {\n return this._maxAccessTokenLifeTime;\n } else if (timeSpan.totalMilliseconds < this._minAccessTokenLifeTime.totalMilliseconds) {\n return this._minAccessTokenLifeTime;\n } else {\n return timeSpan;\n }\n }\n}","import BaseService from '../../base/base_service';\nimport OAuth2BackendProxy from './oauth2_backend_proxy'\nimport OAuth2StateFactory from './states/oauth2_state_factory';\nimport Event from '../../utils/event';\nimport {SYSTEM_EVENTS} from '../../events/events';\nimport InactivityTimeoutSettingsPersister from './inactivity_timeout_settings_persister';\nimport Token from './tokens/token';\nimport {REFRESH_TOKEN_REASONS} from './states/oauth2_authorized_state';\nimport {TokenType} from \"../../../../common/const/token_type\";\n\nexport default class OAuth2Service extends BaseService {\n\n static CLASS = 'OAuth2Service';\n\n _initParams = null;\n\n _currentState = null;\n _inactivityTimeoutSettingsPersister = null;\n _loginFromCompletedRegistration = false;\n\n init(params) {\n super.init(params);\n\n this._initParams = params;\n\n this._inactivityTimeoutSettingsPersister = InactivityTimeoutSettingsPersister.create({\n getServiceFactoryFunc: () => this.serviceFactory,\n defaultAccessTokenLifetime: params.defaultAccessTokenLifeTime,\n accessTokenLifeTimeForRegulation: params.accessTokenLifeTimeForRegulation,\n minAccessTokenLifeTime: params.minAccessTokenLifeTime,\n maxAccessTokenLifeTime: params.maxAccessTokenLifeTime\n });\n\n this._subscribe();\n }\n\n\n injectDependencies(dependencies) {\n super.injectDependencies(dependencies);\n\n //we initialize here the _currentState because only here this.serviceFactory is available\n if (!this._currentState) {\n this._currentState = this._getOAuth2StateFactory().createInitialState();\n }\n }\n\n getLastSessionData() {\n return Token.getLastSessionFromStorage();\n }\n\n _changeState(newState, params) {\n if (this._currentState.constructor === newState.constructor) {\n // We don't want to fire OAUTH_STATE_CHANGE if isn't really the case\n return;\n }\n\n this._currentState.dispose();\n this._currentState = newState;\n this._currentState.onInitComplete(false);\n Event.fire(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, {loginType: this._currentState.getLoginType(), ...params});\n }\n\n\n getFakeClientIP() {\n return this._initParams.fakeClientIP;\n }\n\n _getBackendProxy() {\n return OAuth2BackendProxy.create({\n tokenUrl: this._initParams.tokenUrl,\n logoutUrl: this._initParams.logoutUrl,\n fakeClientIP: this._initParams.fakeClientIP,\n serviceFactory: this.serviceFactory,\n inactivityTimeoutSettingsPersister: this._inactivityTimeoutSettingsPersister});\n }\n\n _getOAuth2StateFactory() {\n return OAuth2StateFactory.create({\n stateChangedCallback: this._changeState.bind(this),\n backendProxy: this._getBackendProxy(),\n serviceFactory: this.serviceFactory,\n inactivityTimeoutSettingsPersister: this._inactivityTimeoutSettingsPersister,\n getSessionTimerUrl: this._initParams.getSessionTimerUrl\n });\n }\n\n _subscribe() {\n this.onSystemEvent(SYSTEM_EVENTS.BEGIN_LOGIN_AFTER_REGISTRATION, this._onBeginLoginFromRegistration);\n this.onSystemEvent(SYSTEM_EVENTS.LOGIN_COMPLETED_AFTER_REGISTERATION, this._onLoginCompletedAfterRegistration);\n this.onSystemEvent(SYSTEM_EVENTS.LOGIN_FAILED_AFTER_REGISTRATION, this._onLoginFailedAfterRegistration);\n\n this.onSystemEvent(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, this._onOauthChange);\n this.onSystemEvent(SYSTEM_EVENTS.ON_INIT_COMPLETE, this._onInitCompleteHandler);\n }\n\n _isInAutologinFromRegistration = false;\n _onBeginLoginFromRegistration = () => {\n this._isInAutologinFromRegistration = true;\n this._waitForAutoLoginPromise = new Promise(resolve => {\n this._waitForAutoLoginResolver = resolve;\n });\n }\n\n _onLoginCompletedAfterRegistration = () => {\n this._loginFromCompletedRegistration = true;\n this._isInAutologinFromRegistration = false;\n this._waitForAutoLoginResolver();\n }\n\n _onLoginFailedAfterRegistration = () => {\n this._isInAutologinFromRegistration = false;\n this._waitForAutoLoginResolver();\n }\n\n _onOauthChange() {\n if(!this.isAuthorized()) {\n this._loginFromCompletedRegistration = false;\n }\n }\n\n isLoginFromRegistration() {\n return this._loginFromCompletedRegistration;\n }\n\n _onInitCompleteHandler() {\n this._currentState.onInitComplete(true);\n }\n\n isAuthorized() {\n return this._currentState.isAuthorized();\n }\n\n tryToRememberMe() {\n return this._currentState.tryToRememberMe();\n }\n\n login(credentials) {\n return this._currentState.login(credentials);\n }\n\n isInAutologin() {\n return this._isInAutologinFromRegistration || this.serviceFactory.queryStringDetectorService().isInAutologin();\n }\n\n _waitForAutoLoginResolver = () => {};\n _waitForAutoLoginPromise = null;\n waitForAutologin() {\n if(this.isInAutologin()) {\n if(!this._waitForAutoLoginPromise) {\n this._waitForAutoLoginPromise = new Promise((resolve) => {\n this._waitForAutoLoginResolver = resolve;\n });\n }\n return this._waitForAutoLoginPromise\n\n } else {\n return Promise.resolve();\n }\n\n }\n\n\n\n runAutoLogin(token, sessionTimerOffset, sourceProductPackage, brandId, sourceSubBrandId, targetSubBrandId, tokenType, businessCorrelationId) {\n\n if(tokenType === TokenType.MigrationToken) {\n this.serviceFactory.spinnerProxyService().startSpinner(true);\n }\n\n let resolveWaitForAutologin = () => {\n this._waitForAutoLoginResolver();\n this._waitForAutoLoginPromise = null;\n this._waitForAutoLoginResolver = () => {};\n }\n\n let autologinWithTokenFunc = () => {\n return this._currentState.autologinWithToken(token, sessionTimerOffset, sourceProductPackage, brandId, sourceSubBrandId, targetSubBrandId, tokenType, businessCorrelationId)\n .then(() => {\n if (this.isAuthorized()) {\n Event.fire(SYSTEM_EVENTS.AUTOLOGIN_SUCCESS);\n } else {\n Event.fire(SYSTEM_EVENTS.AUTOLOGIN_FAILED);\n }\n resolveWaitForAutologin();\n\n }).catch(() => {\n Event.fire(SYSTEM_EVENTS.AUTOLOGIN_FAILED);\n resolveWaitForAutologin();\n });\n };\n if (token) {\n if (this.isAuthorized()){\n return this._currentState.logout().then(() => {\n return autologinWithTokenFunc();\n }).catch(() => {\n return autologinWithTokenFunc();\n });\n } else {\n return autologinWithTokenFunc();\n }\n } else {\n resolveWaitForAutologin();\n return Promise.reject('Invalid token null or undefined');\n }\n }\n\n /**\n *\n * @param options: {shouldShowLogoutMessage?: boolean}\n * @returns {*}\n */\n logout(options = {}) {\n options = {\n shouldShowLogoutMessage: true,\n ...options\n }\n return this._currentState.logout().then(()=>{\n if(options.shouldShowLogoutMessage) {\n this.showLogoutMessage();\n }\n });\n }\n\n showLogoutMessage() {\n this.serviceFactory.regulationService().getRegulation().showLogoutMessage();\n }\n\n getAutologinKey() {\n return this._initParams.autologinKey;\n }\n\n getToken() {\n return this._currentState.getDecodedAccessToken();\n }\n\n getTokenAuthorizeHeader() {\n return this._currentState.getTokenAuthorizeHeader();\n }\n\n extractTokenProperty(tokenProperty) {\n return this._currentState.extractTokenProperty(tokenProperty);\n }\n\n isVIP() {\n return this._currentState.isVIP();\n }\n\n getUserData() {\n return this._currentState.getUserData();\n }\n\n getAccountData() {\n return this._currentState.getAccountData();\n }\n\n updateTokenData(filedName, fieldValue) {\n this._currentState.updateTokenData(filedName, fieldValue);\n }\n\n getRefreshToken() {\n return this._currentState.getRefreshToken();\n }\n\n /**\n *\n * @param timeSpan\n * @returns {Promise}\n */\n setCustomSessionTimeout(timeSpan) {\n this._inactivityTimeoutSettingsPersister.setCustomAccessTokenLifeTime(timeSpan);\n this.refreshToken(REFRESH_TOKEN_REASONS.user_set_custom_session);\n }\n\n /**\n *\n * @returns {TimeSpan}\n */\n getCurrentSessionTimeoutSettings() {\n return {\n currentSessionTimeout: this._inactivityTimeoutSettingsPersister.getAccessTokenLifeTime(),\n minSessionTimeout: this._inactivityTimeoutSettingsPersister.getMinAccessTokenLifeTime(),\n maxSessionTimeout: this._inactivityTimeoutSettingsPersister.getMaxAccessTokenLifeTime(),\n possibleSessionTimeoutValues: this._inactivityTimeoutSettingsPersister.getPossibleAccessTokenLifeTimeValues()\n };\n }\n\n\n refreshToken(reason) {\n return this._currentState.refreshToken(reason);\n }\n\n clearTokenInfoFromLocalStorage() {\n Token.fromStorage().delete();\n }\n\n /**\n *\n * @returns {Promise.}\n */\n getTimeSinceLogin() {\n return this._currentState.getTimeSinceLogin();\n }\n\n /**\n *\n * @returns {number}\n * 1 - NewLogin (Manual Login)\n * 3 - Autologin\n */\n getLoginType() {\n return 1 * this._currentState.getLoginType();\n }\n\n /**\n *\n * @returns {number}\n */\n getSourceProductPackage() {\n return 1 * this._currentState.getSourceProductPackage();\n }\n\n onInitializationCompleted() {\n return this.tryToRememberMe().catch((error) => {\n this.logger.debug('Remember me check failed onInitializationCompleted', error);\n });\n }\n}","const TOKEN_PROPERTIES = {\n OAUTH_STORAGE_KEY: 'oAuth2',\n OAUTH_EXPIRE_KEY_IN_STORAGE: 'oAuth2.expireIn',\n OAUTH_LAST_REFRESH_TOKEN_TIMESTAMP: 'oAuth2.lastLoginTimeStamp',\n OAUTH_LAST_USER_DATA: 'oAuth2.userData',\n OAUTH_LAST_SESSION_DATA: 'oAuth2.lastSession',\n OAUTH_HAS_REMEMBER_ME: 'oAuth2.hasRememberMe',\n OAUTH_LAST_TIME_ACTIVITY: 'oAuth2.lastTimeActivity',\n OAUTH_CUSTOM_SESSION_TIMEOUT: 'oAuth2.customSessionTimeout',\n OAUTH_ACCESS_TOKEN: 'oAuth2.access_token',\n OAUTH_TOKEN_FIELDS_OVERRIDES: 'oAuth2.tokenFieldsOverrides',\n};\nconst GRANT_TYPES = {\n PASSWORD: 'password',\n REFRESH_TOKEN: 'refresh_token',\n AUTOLOGIN: 'autologin'\n};\nconst OAUTH2_CSS = {\n AUTHORIZED_USER_CLASS: 'cgp-authorized-user'\n};\n\nconst HTTP = {\n OK: 200\n};\nconst OAUTH_TOKEN_ERRORS = {\n INVALID_GRANT: 'invalid_grant'\n};\nconst LOGIN_TYPE = {\n NEW_LOGIN: 1,\n AUTOLOGIN: 3\n};\n\nconst ID_VERIFICATION_STATUS = {\n AGE_VERIFIED: 1,\n ADDRESS_VERIFIDED: 1\n};\n\nconst LOGOUT_REASONS = {\n EXPLICIT_LOGOUT: 1,\n USER_IDLE: 2,\n AUTOLOGIN_FAILED: 3,\n REFRESH_TOKEN_FAILED: 4,\n ACCESS_TOKEN_REMOVED: 5,\n USER_KICKED: 6,\n};\n\nexport { TOKEN_PROPERTIES, HTTP, GRANT_TYPES, OAUTH2_CSS, OAUTH_TOKEN_ERRORS, LOGIN_TYPE, ID_VERIFICATION_STATUS, LOGOUT_REASONS };\n\n\n","import BaseObject from '../../../base/base_object';\nimport DOM from '../../../utils/dom';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport Event from '../../../utils/event';\n\nexport default class UserScrollDetector extends BaseObject {\n static CLASS = \"UserScrollDetector\";\n\n _getScrollY = () => window.scrollY;\n _now = () => Date.now();\n _scrollCheckingInterval = TimeSpan.fromMinutes(1);\n\n _lastScrollY = null;\n _lastScrollTime = null;\n _onScrollCallback = null;\n\n init(params) {\n super.init(params);\n\n params = params || {};\n\n this._now = params.now || this._now;\n this._scrollCheckingInterval = params.scrollCheckingInterval || this._scrollCheckingInterval;\n this._onScrollCallback = params.onScrollCallback;\n\n this._setLastScrollTime();\n this._setLastScrollY();\n this._startScrollCheckTimer();\n\n this._subscribe();\n }\n\n _subscribe() {\n Event.on(SYSTEM_EVENTS.APP_RESUMED, this._startScrollCheckTimer, this);\n Event.on(SYSTEM_EVENTS.APP_PAUSED, this._stopScrollCheckTimer, this);\n }\n\n _unsubscribe() {\n Event.off(SYSTEM_EVENTS.APP_RESUMED, this._startScrollCheckTimer, this);\n Event.off(SYSTEM_EVENTS.APP_PAUSED, this._stopScrollCheckTimer, this);\n }\n\n\n getLastScrollTime() {\n return this._lastScrollTime;\n }\n\n _setLastScrollTime() {\n this._lastScrollTime = this._now();\n if(this._onScrollCallback) {\n this._onScrollCallback();\n }\n }\n\n setOnScrollCallback(onScrollCallback) {\n this._onScrollCallback = onScrollCallback;\n }\n\n _setLastScrollY() {\n this._lastScrollY = this._getScrollY();\n }\n\n _scrollCheckTimer = null;\n _startScrollCheckTimer() {\n this._stopScrollCheckTimer();\n this._scrollCheckTimer = DOM.setInterval(() => {\n if (this._getScrollY() !== this._lastScrollY) {\n this._setLastScrollTime();\n this._setLastScrollY();\n }\n }, this._scrollCheckingInterval.totalMilliseconds);\n }\n\n _stopScrollCheckTimer() {\n DOM.clearInterval(this._scrollCheckTimer);\n }\n\n dispose() {\n this._stopScrollCheckTimer();\n this._unsubscribe();\n }\n}","import BaseObject from '../../../base/base_object';\nimport {USER_ACTIVITY_EVENTS_ALL, USER_ACTIVITY_EVENTS_FOR_HYBRID } from '../../../events/events';\nimport Event from '../../../utils/event';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport UserScrollDetector from './user_scroll_detector';\nimport Store from '../../../utils/store';\nimport { TOKEN_PROPERTIES } from '../oauth_const';\nimport Device from '../../../utils/device/device';\n\nexport default class UserActivityDetector extends BaseObject {\n static CLASS = 'UserActivityDetector';\n\n _now = () => Date.now();\n _userScrollDetector = null;\n _userActivityDetectionInterval = TimeSpan.fromMinutes(1);\n _serviceFactory = null;\n _onUserActivityCallback = () => { };\n\n /**\n *\n * @param params = {\n * now: function,\n * userScrollDetector: function\n * }\n */\n init(params) {\n super.init(params);\n\n params = Object.assign({}, params);\n\n this._now = params.now || this._now;\n this._userActivityDetectionInterval = params.userActivityDetectionInterval || this._userActivityDetectionInterval;\n this._onUserActivityCallback = params.onUserActivityCallback || this._onUserActivityCallback;\n this._serviceFactory = params.serviceFactory;\n\n this._userScrollDetector = params.userScrollDetector || UserScrollDetector.create({\n now: this._now,\n scrollCheckingInterval: this._userActivityDetectionInterval\n });\n this._userScrollDetector.setOnScrollCallback(this.setLastTimeUserPerformedAction.bind(this));\n\n this.setLastTimeUserPerformedAction();\n this._subscribe();\n this._startUserActivityDetectionTimer();\n }\n\n _userActivityEventsSubscription = null;\n _subscribe() {\n const userActivityEvents = Device.hybrid.isHybrid ? USER_ACTIVITY_EVENTS_FOR_HYBRID : USER_ACTIVITY_EVENTS_ALL;\n this._userActivityEventsSubscription = Event.on(userActivityEvents, this.setLastTimeUserPerformedAction, this);\n }\n\n _unSubscribe() {\n if (this._userActivityEventsSubscription) {\n this._userActivityEventsSubscription.off();\n }\n }\n\n setLastTimeUserPerformedAction() {\n // we store it into the local storage so different browser instances to share it\n Store.set(TOKEN_PROPERTIES.OAUTH_LAST_TIME_ACTIVITY, this._now());\n }\n\n\n getLastTimeUserPerformedAction() {\n return parseInt(Store.get(TOKEN_PROPERTIES.OAUTH_LAST_TIME_ACTIVITY, 0));\n }\n\n getTimeSinceLastUserActivity() {\n return this._now() - this.getLastTimeUserPerformedAction();\n }\n\n getUserActivityDetectionInterval() {\n return this._userActivityDetectionInterval.totalMilliseconds;\n }\n\n _userActivityDetectionTimer = {\n dispose: () => { }\n };\n\n\n _startUserActivityDetectionTimer() {\n this._userActivityDetectionTimer = this._serviceFactory.observableFactoryService().fromInterval(this._userActivityDetectionInterval.totalMilliseconds)\n .forEach(() => {\n let lastTimeUserPerformedAction = this.getLastTimeUserPerformedAction();\n let userActivityDetectionInterval = this.getUserActivityDetectionInterval();\n let now = this._now();\n\n if (lastTimeUserPerformedAction + userActivityDetectionInterval > now) {\n this._onUserActivityCallback();\n }\n });\n }\n\n dispose() {\n this._userActivityDetectionTimer.dispose();\n this._userScrollDetector.dispose();\n this._unSubscribe();\n }\n}\n","import BaseService from '../../../base/base_service';\nimport _ from '../../../utils/underscore';\nimport IUserService, {\n UserServiceInitParams,\n ITokenResponse\n} from './user_service_interface';\nimport { SYSTEM_EVENTS } from '../../../events/events';\n\n\nclass UserService extends BaseService implements IUserService{\n static CLASS: string = 'UserService';\n\n private _initParams: UserServiceInitParams = null;\n private _firebaseLoginToken: string = '';\n\n protected init(params: UserServiceInitParams): void {\n super.init(params);\n this._initParams = {\n tokenUrl: params.tokenUrl ? params.tokenUrl : '/cgpapi/user/gettoken',\n realityCheckDataUrl: params.realityCheckDataUrl,\n updateRealityCheckDataUrl: params.updateRealityCheckDataUrl\n };\n\n this.onSystemEvent(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, () => {\n if (this.serviceFactory.oAuth2Service().isAuthorized()) {\n this._onLogin();\n } else {\n this._firebaseLoginToken = '';\n }\n });\n }\n\n private _onLogin() {\n const regulation = this.serviceFactory.regulationService().getRegulation();\n if (regulation.attemptRealityCheckIntervalMigrationFromLocalStorageToControlCenter) {\n regulation.attemptRealityCheckIntervalMigrationFromLocalStorageToControlCenter();\n }\n }\n\n private _oAuth2Service(): any { // need interface for OAuth2Service\n return this.serviceFactory.oAuth2Service();\n }\n\n private _getHistory(): any {\n return this._oAuth2Service().extractTokenProperty('historyData');\n }\n\n private _getB2C(): any {\n return this._oAuth2Service().extractTokenProperty('b2c');\n }\n\n public getCID(): string {\n // Get token from local storage.\n const accountData = this.getAccountData();\n return accountData && accountData.Cid;\n }\n\n public getTaxID(): string {\n const accountData = this.getAccountData();\n return accountData && accountData.TaxId;\n }\n\n public getUsername(): string {\n return this._oAuth2Service().extractTokenProperty('userName');\n }\n\n public getAccountData(): any {\n return this.serviceFactory.oAuth2Service().getAccountData();\n }\n\n public getB2CData(): any {\n const b2c = this._getB2C();\n\n if (!b2c) {\n return null;\n }\n\n const parseB2CData = JSON.parse(b2c);\n\n return parseB2CData.message;\n }\n\n public getHistoryToken(): any {\n const history = this._getHistory();\n\n if (!history) {\n return null;\n }\n return JSON.parse(history);\n }\n\n public getPlatformTokenFromLogin(): string {\n return this._extractTokenPropertyByName('login', 'Token');\n }\n\n public getUserFirstName(): string {\n return this._extractTokenPropertyByName('accountData', 'FirstName');\n }\n\n public getUserLastName(): string {\n return this._extractTokenPropertyByName('accountData', 'LastName');\n }\n\n public getPlatformToken(params?: object):Promise{\n return this.serviceFactory.http2Service().post(this._initParams.tokenUrl, params)\n .then((response: ITokenResponse) => {\n return response;\n });\n }\n\n public renewLoginToken(params?: object): Promise {\n return this.getPlatformToken(params).then( (response:ITokenResponse) => {\n this._oAuth2Service().updateTokenData('login', {Token: response.token});\n return response;\n })\n }\n\n public updateTokenData(propertyName: string, propertyValue: any): void {\n this._oAuth2Service().updateTokenData(propertyName, propertyValue);\n }\n\n private _extractTokenPropertyByName(properyToExtract: any, propertyToReturn: any): any {\n const loginData = this._oAuth2Service().extractTokenProperty(properyToExtract);\n\n if (!loginData) {\n return null;\n }\n\n const parseLoginData = JSON.parse(loginData);\n\n return parseLoginData[propertyToReturn];\n }\n\n public countPlayerChallenges(): number {\n const accountData = this.getAccountData();\n const numberOfChallenges = accountData && accountData.NumberOfChallenges;\n if(_.isNullOrUndefined(numberOfChallenges)) {\n return 0;\n }\n return numberOfChallenges;\n }\n\n public getRealityCheckData(): Promise {\n if(!this.serviceFactory.oAuth2Service().isAuthorized()) {\n return Promise.resolve();\n }\n\n return this.serviceFactory.http2Service().post(this._initParams.realityCheckDataUrl);\n }\n\n public async updateRealityCheckData(realityCheckIntevalMin: number): Promise {\n return this.serviceFactory.regulationService().getRegulation().updateRealityCheckData(realityCheckIntevalMin);\n }\n\n public getUpdateRealityCheckDataUrl() {\n return this._initParams.updateRealityCheckDataUrl;\n }\n\n public setFirebaseLoginToken(token: string): void{\n this._firebaseLoginToken = token;\n }\n\n public getFirebaseLoginToken(): string{\n return this._firebaseLoginToken;\n }\n}\n\nexport default UserService;\n","import BaseService from '../../base/base_service';\nimport ObservableFactory from '../../utils/observable_factory';\nimport IObservableFactoryService from './observable_factory_service_interface';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport {TimeIntervalName} from '../../../../common/utils/time-interval-names';\nimport Observable from '../../utils/observable';\n\n\nexport default class ObservableFactoryService extends BaseService implements IObservableFactoryService {\n static CLASS = 'ObservableFactoryService';\n\n _observableFactory: ObservableFactory = null;\n init(params) {\n super.init(params);\n this._observableFactory = ObservableFactory.create();\n }\n\n fromTimeout(timeout: TimeSpan | number, name?: TimeIntervalName) : Observable {\n return this._observableFactory.fromTimeout(timeout, name);\n }\n\n fromInterval(interval: TimeSpan | number, name?: TimeIntervalName) : Observable {\n return this._observableFactory.fromInterval(interval, name);\n }\n\n fromEvent(element: HTMLElement, eventName: string, options: any) : Observable {\n return this._observableFactory.fromEvent(element, eventName, options);\n }\n}","import BaseService from '../../base/base_service';\nimport IOrbitComponentRenderService from './orbit_component_render_service_interface';\nimport {\n IGermanyResponsibleGamingButtonOptions,\n IOrbitComponentInSdk,\n IOrbitComponentToSdkAdapterService, IOrbitDialogInSdk\n} from '../../../../common/interfaces/orbit-component-to-sdk-adapter/orbit-component-to-sdk-adapter.service.interface';\nimport {\n ITimeSpentReminderWithBalanceComponentProps,\n ITimeSpentReminderOptions\n} from '../../../../common/interfaces/orbit-component-to-sdk-adapter/components-props/time-spent-reminder-options';\nimport {IStatePopupDisplayParams} from \"../../../../common/interfaces/orbit-component-to-sdk-adapter/components-props/state-popup-display-params\";\nimport {IdleRecommendationsComponentProps} from \"../../../../common/interfaces/orbit-component-to-sdk-adapter/components-props/idle-recommendations.component-props\";\nimport Event from \"../../utils/event\";\nimport {SYSTEM_EVENTS} from \"../../events/events\";\nimport {IGeoPermissionPopupOptions} from \"../../../../common/interfaces/orbit-component-to-sdk-adapter/components-props/geo-permission-popup.component-props\";\nimport {\n IIntrusiveMessagePopupDisplayParams\n} from \"../../../../common/interfaces/orbit-component-to-sdk-adapter/components-props/intrusive-message-popup-display-params\";\nimport {\n ITempAccountShowPopupOptions\n} from \"../../../../common/interfaces/orbit-component-to-sdk-adapter/components-props/temp-account-popup-params\";\nimport {ILoginToastDef} from '../../../../common/interfaces/orbit-component-to-sdk-adapter/components-props/login-toast.component-props';\n\ninterface OrbitComponentRendererServiceParams {\n getOrbitComponentToSdkAdapter: () => IOrbitComponentToSdkAdapterService;\n}\n\nexport default class OrbitComponentRenderService extends BaseService implements IOrbitComponentRenderService {\n static CLASS = 'OrbitComponentRenderService';\n\n init(params: OrbitComponentRendererServiceParams) {\n super.init(params);\n this._getOrbitComponentToSdkAdapter = params.getOrbitComponentToSdkAdapter;\n }\n\n private _getOrbitComponentToSdkAdapter: () => IOrbitComponentToSdkAdapterService;\n\n renderGermanyResponsibleGamingButtons(element: HTMLElement, options?:IGermanyResponsibleGamingButtonOptions): IOrbitComponentInSdk{\n return this._getOrbitComponentToSdkAdapter().renderGermanyResponsibleGamingButtons(element, options);\n }\n\n showLocationPopup(props: IStatePopupDisplayParams) {\n Event.fire(SYSTEM_EVENTS.LOCATION_POPUP_OPEN);\n return this._getOrbitComponentToSdkAdapter().showLocationPopup(props);\n }\n\n showGeoPermissionPopup(props: IGeoPermissionPopupOptions) {\n return this._getOrbitComponentToSdkAdapter().showGeoPermissionPopup(props);\n }\n\n\n\n\n showTimeSpentReminderWithDropdown(options: ITimeSpentReminderOptions): IOrbitDialogInSdk {\n return this._getOrbitComponentToSdkAdapter().showTimeSpentReminderWithDropdown(options);\n }\n\n showTimeSpentReminderWithBalance(options: ITimeSpentReminderWithBalanceComponentProps): IOrbitDialogInSdk {\n return this._getOrbitComponentToSdkAdapter().showTimeSpentReminderWithBalance(options);\n }\n\n\n showIntrusiveMessagePopup(params: IIntrusiveMessagePopupDisplayParams): IOrbitDialogInSdk {\n return this._getOrbitComponentToSdkAdapter().showIntrusiveMessagePopup(params);\n }\n\n showDisconnectPopup(): IOrbitDialogInSdk {\n return this._getOrbitComponentToSdkAdapter().showDisconnectPopup();\n }\n\n renderIdleRecommendations(element: HTMLElement, options: IdleRecommendationsComponentProps): IOrbitComponentInSdk {\n return this._getOrbitComponentToSdkAdapter().renderIdleRecommendations(element, options);\n }\n\n showAboutDialog(): Promise {\n return this._getOrbitComponentToSdkAdapter().showAboutDialog();\n }\n\n showTempAccountPopup(options: ITempAccountShowPopupOptions): IOrbitDialogInSdk {\n return this._getOrbitComponentToSdkAdapter().showTempAccountPopup(options);\n }\n\n showInitBiometricDialog(): IOrbitDialogInSdk {\n return this._getOrbitComponentToSdkAdapter().showInitBiometricDialog();\n }\n\n showDefaultKickPopup(popupTextKey: string): IOrbitDialogInSdk {\n return this._getOrbitComponentToSdkAdapter().showDefaultKickPopup(popupTextKey);\n }\n\n showLoginMessageToast(props: ILoginToastDef): void {\n return this._getOrbitComponentToSdkAdapter().showLoginMessageToast(props);\n }\n}","const TYPES = {\n FLAT: 0,\n FULL_SCREEN: 1\n};\n\nexport { TYPES };","import BaseComponent from '../../base/base_component';\nimport _ from '../../utils/underscore';\nimport DOM from '../../utils/dom';\nimport * as OverlayConst from './overlay_const';\nimport {USER_EVENTS, SYSTEM_EVENTS} from '../../events/events';\nimport Event from '../../utils/event';\nimport {TYPES} from '../../services/overlay_manager/overlay_manager_types';\nimport IOverlayComponentController, { OverlayComponentControllerInitParams } from './overlay_component_controller_interface';\nimport {PRIORITY_LEVEL_ZINDEX_MAPPER} from \"../../services/overlay_manager/overlay_manager_levels\";\n\nconst overlayContent = require('./view/overlay-content.html');\nconst closeOverlayStrip = require('./view/overlay-close-strip.html');\n\nexport interface IChangePriorityParams {\n className: string;\n newPriority: string;\n}\n\nclass OverlayComponentController extends BaseComponent implements IOverlayComponentController{\n static CLASS: string = OverlayConst.OVERLAY_COMPONENT_PROPERTIES.CLASS_NAME;\n static DIRECTIVE: string = OverlayConst.OVERLAY_COMPONENT_PROPERTIES.ID;\n protected _selector: string = 'cgp-overlay-component';\n private _initParams: OverlayComponentControllerInitParams = null;\n\n init(params) {\n super.init(params);\n this._subscribe();\n this._setInitParams(params);\n this.setHTML(overlayContent);\n }\n\n private _subscribe() {\n this.onSystemEvent(SYSTEM_EVENTS.CHANGE_OVERLAY_PRIORITY, this._onChangePriorityEvent);\n }\n\n private _setInitParams(params): void{\n this._initParams = {\n priority: params.priority,\n id: params.id,\n type: params.type ? params.type : 0,\n additionalClasses: params.additionalClasses ? params.additionalClasses : [],\n contentAdditionalClasses: params.contentAdditionalClasses ? params.contentAdditionalClasses : [],\n btnCloseCallback: _.isFunction(params.btnCloseCallback) ? params.btnCloseCallback : undefined,\n openCallback: _.isFunction(params.openCallback) ? params.openCallback : undefined,\n isCloseByEscape: !_.isNullOrUndefined(params.isCloseByEscape) ? params.isCloseByEscape : true,\n isCloseBtnAllowed: !_.isNullOrUndefined(params.isCloseBtnAllowed) ? params.isCloseBtnAllowed : true,\n awaitForDisplay: params.awaitForDisplay,\n isHasHeader: !_.isNullOrUndefined(params.isHasHeader) ? params.isHasHeader : true,\n };\n }\n\n //Create overlay if one does not exist\n public start(): OverlayComponentController {\n const overlayElement = DOM.$$(this._getOverlayClassToPriority());\n\n // Is the overlay element exist on the DOM?\n if (!overlayElement || overlayElement.length === 0) {\n // Overlay element not exist on dom so create overlay document object and\n // append the id and class attributes.\n this.getEl().id = OverlayConst.OVERLAY_DOM_PROPERTIES.ID_NAME + this._initParams.id;\n this.getEl().className = OverlayConst.OVERLAY_DOM_PROPERTIES.CLASS_NAME;\n\n DOM\n .addClass(this.getEl(), this._getOverlayClassToPriority())\n // .addClass(this.getEl(), OverlayConst.LIGHTBOX_BACKGROUND_COLOR_CLASS)\n .addClass(this.getEl(), this._getOverlayClassToType())\n .addClass(this.getEl(), this._getAdditionalClasses())\n .addClass(this._getOverlayContetEl(), this._getContentAdditionalClasses())\n .addClass(this.getEl(), this._initParams.awaitForDisplay === true ? 'cgp-overlay-await' : 'cgp-overlay-active')\n // Draw the overlay frame container into the DOM.\n .draw(this.getEl());\n }\n\n return this;\n }\n\n private _getCloseEl(): HTMLElement {\n const closeBtnDOMElement = DOM.createElement('div', closeOverlayStrip);\n // Add selector for overlay helpers\n DOM.addClass(closeBtnDOMElement, 'cgp-overlay-injected-helpers-close');\n const closeBtnClass = this._initParams.isHasHeader ? 'cgp-themes-icons-x' : 'cgp-themes-icons-x-no-header';\n DOM.addClass(closeBtnDOMElement.querySelectorAll( '.cgp-strip-close-btn')[0], closeBtnClass);\n // Subscribe overlay btn close event.\n DOM.onDOMElementEvent(closeBtnDOMElement.querySelector('.cgp-strip-close-btn'), USER_EVENTS.ON_CLICK, () => {\n const btnCloseFunction = this._initParams.btnCloseCallback;\n\n if (_.isFunction(btnCloseFunction)) {\n btnCloseFunction();\n }\n\n Event.fire(SYSTEM_EVENTS.CLOSE_OVERLAY, {\n priority: this._initParams.priority\n });\n });\n\n return closeBtnDOMElement;\n }\n\n public appendBody(el: HTMLElement) {\n if (!_.isElement(el)) {\n this.logger.error('The element most be dom element type!');\n return;\n }\n\n const overlayContentEl = this._getOverlayContetEl();\n if (this._initParams.isCloseBtnAllowed) {\n const closeEl = this._getCloseEl();\n DOM.appendFirst(overlayContentEl, closeEl);\n DOM.addClass(this.getEl(), 'cgp-overlay-closable');\n }\n\n DOM.append(overlayContentEl, el);\n\n const openFunction = this._initParams.openCallback;\n\n if (_.isFunction(openFunction)) {\n openFunction();\n }\n }\n\n private _getOverlayContetEl(): Element {\n return this.getEl().querySelectorAll('.' + OverlayConst.OVERLAY_CONTENT_PROPERTIES.CLASS_NAME)[0];\n }\n\n private _getOverlayClassToPriority() {\n return 'cgp-overlay-' + this._initParams.priority;\n }\n\n private _getOverlayClassToType(): string {\n const type = this._initParams.type;\n let typeClass;\n\n switch (type) {\n case TYPES.FLAT:\n typeClass = OverlayConst.TYPES_CLASS_MAP.FLAT;\n break;\n case TYPES.FULL_SCREEN:\n typeClass = OverlayConst.TYPES_CLASS_MAP.FULL_SCREEN;\n break;\n }\n\n return typeClass;\n }\n\n private _getAdditionalClasses(): string[] {\n const additionalClasses = this._initParams.additionalClasses;\n\n if (!_.isArray(additionalClasses) && 0 === additionalClasses.length) {\n this.logger.debug('There are no additional classes to append to the overlay.');\n }\n\n return additionalClasses;\n }\n\n private _getContentAdditionalClasses(): string[] {\n const additionalClasses = this._initParams.contentAdditionalClasses;\n\n if (!additionalClasses || (!_.isArray(additionalClasses) && 0 === additionalClasses.length)) {\n this.logger.debug('There is not additional classes to append on overlay content.');\n }\n\n return additionalClasses;\n }\n\n public changeState(isActive: boolean): void {\n if (isActive === true) {\n this._initParams.awaitForDisplay = false;\n DOM.removeClass(this.getEl(), 'cgp-overlay-await');\n DOM.addClass(this.getEl(), 'cgp-overlay-active');\n } else {\n this._initParams.awaitForDisplay = true;\n DOM.addClass(this.getEl(), 'cgp-overlay-await');\n DOM.removeClass(this.getEl(), 'cgp-overlay-active');\n }\n }\n\n private _setPriority(priority: string) {\n const classToBeRemoved = this._getOverlayClassToPriority();\n this._initParams.priority = priority;\n const classToBeAdded = this._getOverlayClassToPriority();\n\n DOM.removeClass(this.getEl(), classToBeRemoved)\n .addClass(this.getEl(), classToBeAdded);\n\n DOM.addStyle(this.getEl(), 'z-index', PRIORITY_LEVEL_ZINDEX_MAPPER[priority].toString());\n }\n\n private _onChangePriorityEvent = (changePriorityParams: IChangePriorityParams) => {\n //className = OMG-SPECIFIC-CLASS;\n if (this.getEl().classList.contains(changePriorityParams.className)) {\n this._setPriority(changePriorityParams.newPriority);\n }\n }\n}\n\nexport default OverlayComponentController;","import BaseComponent from '../../base/base_component';\nimport DOM from '../../utils/dom';\nimport * as OverlayConst from './overlay_const';\n\nexport interface IOverlayWrapperComponentController{\n getEl(): HTMLElement;\n start(): BaseComponent;\n}\n\nclass OverlayWrapperComponentController extends BaseComponent implements IOverlayWrapperComponentController{\n\n static CLASS: string = 'OverlayComponentController';\n protected _selector: string = 'cgp-overlay-wrapper-component';\n\n public start(): BaseComponent {\n const overlayElement = DOM.$$('.cgp-overlay-wrapper-component');\n if (!overlayElement || overlayElement.length === 0) {\n this.getEl().className = OverlayConst.OVERLAY_DOM_PROPERTIES.CLASS_NAME;\n\n DOM.addClass(this.getEl(), OverlayConst.LIGHTBOX_BACKGROUND_COLOR_CLASS)\n .draw(this.getEl());\n }\n return this;\n }\n}\n\nexport default OverlayWrapperComponentController;","import _ from '../../utils/underscore';\n\nclass ExtendableError {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'ExtendableError';\n\n\n /**\n *\n * @returns {ExtendableError}\n */\n static create() {\n let $instance = new this(); // constructor SHOULD NOT GET ANYTHING... it's TEMPORARY HERE!\n if (_.isFunction($instance.init)) {\n $instance.init.apply($instance, arguments);\n }\n\n return $instance;\n }\n\n /**\n * Initialized extendable error\n * @param exceptionParams\n */\n init(exceptionParams) {\n this.name = exceptionParams.name;\n this.message = exceptionParams.message | '';\n this.error_code = exceptionParams.error_code;\n this.error_description = exceptionParams.error_description;\n this.lineNumber = exceptionParams.lineNumber;\n this.fileName = exceptionParams.fileName;\n this.model = exceptionParams.model;\n }\n\n\n /**\n *\n * @returns {Window.onerror}\n */\n onError() {\n return window.onerror = (errorMsg, url, lineNumber, column, errorObj) => {\n console.log('Global Exception Handler');\n if (errorMsg.indexOf('Script error.') > -1) {\n return;\n }\n }\n }\n}\n\nexport default ExtendableError;","import ExtendableError from '../base/extendable_error';\n\n/**\n *\n *\n *\n */\nclass OverlayException extends ExtendableError {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'OverlayException';\n\n\n /**\n * @static\n * @param params\n * @returns {ExtendableError}\n */\n static create(params) {\n return super.create(params);\n }\n}\n\n\nexport default (params) => {\n return OverlayException.create(params);\n}","import BaseModel from '../../base/base_model';\nimport { IOverlayData } from './overlay_manager_service_interface';\n\nexport interface IQueueModel {\n queueList: IOverlayData[];\n queue(item: IOverlayData): number;\n getFirst(): IOverlayData;\n dequeue(): IOverlayData;\n size(): number;\n isEmpty(): boolean;\n clear(): void;\n}\n\nclass QueueModel extends BaseModel implements IQueueModel{\n\n static CLASS: string = 'QueueModel';\n public queueList: IOverlayData[] = [];\n\n init() {}\n\n //Queue item, adds it to the list. Also performs a sorting based on item priority. Returns index of the item in the list\n queue(item: IOverlayData): number {\n let idx = 0;\n if (this.isEmpty()) {\n this.queueList.push(item);\n\n return idx;\n }\n\n idx++;\n // sorts the items by priority.\n while (this.size() > idx) {\n const current = this.queueList[idx];\n if (current.priority > item.priority) {\n break;\n }\n\n idx++;\n }\n\n this.queueList.splice(idx, 0, item);\n\n this.logger.info('item: ' + item.toString() + ' insert in ' + idx);\n\n return idx;\n }\n\n\n /**\n * Returns the first item from the queue.\n *\n *\n * @returns {Object} Item, the first in the queue.\n */\n getFirst(): IOverlayData {\n return this.queueList[0];\n }\n\n\n /**\n * Dequeue the queue\n *\n * @returns {MessageManagerModel} this, for chaining, if needed.\n */\n dequeue(): IOverlayData {\n return this.queueList.shift();\n }\n\n\n size(): number {\n return this.queueList.length;\n }\n\n //Verifies whether the list is empty\n isEmpty(): boolean {\n return 0 === this.size();\n }\n\n //Clear the queueList\n clear(): void {\n this.queueList = [];\n }\n}\n\nexport default QueueModel;","import BaseService from '../../base/base_service';\nimport _ from '../../utils/underscore';\nimport DOM from '../../utils/dom';\nimport {OVERLAY_EVENTS_SELECTORS_ID} from './overlay_managers_const';\nimport {PRIORITY_LEVEL, PRIORITY_LEVEL_ZINDEX_MAPPER, WRAPPER_DEFAULT_INDEX} from './overlay_manager_levels';\nimport OverlayComponentController from '../../components/overlay/overlay_component_controller';\nimport OverlayWrapperComponentController, { IOverlayWrapperComponentController } from '../../components/overlay/overlay_wrapper_component_controller';\nimport {SYSTEM_EVENTS} from '../../events/events';\nimport OverlayException from '../../exceptions/overlay/overlay_exception';\nimport QueueModel from './queue_model';\nimport IOverlayManager, { IOverlayData, OverlayQueuesMap } from './overlay_manager_service_interface';\nimport { action, observable, runInAction, makeObservable } from \"mobx\";\n\nclass OverlayManagerService extends BaseService implements IOverlayManager{\n static CLASS: string = 'OverlayManagerService';\n static OVERLAY_ID: string = OVERLAY_EVENTS_SELECTORS_ID.OVERLAY_CGP_ID;\n private _counter: number = 0;\n\n private _overlayQueues: OverlayQueuesMap = {};\n\n private _overlayWrapper: IOverlayWrapperComponentController = null;\n\n constructor() {\n super();\n\n makeObservable(this, {\n _overlayQueues: observable,\n destroy: action.bound,\n destroyAll: action.bound,\n _add: action.bound,\n _setOverlayWrapperZIndex: action.bound,\n _initQueues: action.bound\n });\n }\n\n init(params) {\n super.init(params);\n\n this._initQueues();\n this._subscribe();\n }\n\n public start(overlay: IOverlayData): void {\n overlay.instance.start();\n\n if (!overlay.el || !_.isElement(overlay.el)) {\n this.logger.error('Could not load overlay');\n throw OverlayException('Setting current dom element on overlay failed --> ' + overlay.el);\n }\n\n this.logger.debug('Appending overlay into the DOM body!');\n overlay.instance.appendBody(overlay.el);\n\n if(PRIORITY_LEVEL_ZINDEX_MAPPER[overlay.priority] > PRIORITY_LEVEL_ZINDEX_MAPPER[PRIORITY_LEVEL.GAME_FRAME]) {\n this.serviceFactory.gameService().stopCurrentGameAutoplay();\n }\n\n DOM.addStyle(overlay.instance.getEl(), 'z-index', PRIORITY_LEVEL_ZINDEX_MAPPER[overlay.priority].toString());\n }\n\n\n _destroyOverlayWrapper() {\n // destroy overlay wrapper\n if (this._overlayWrapper) {\n this._overlayWrapper.getEl().remove();\n this._overlayWrapper = null;\n }\n }\n\n //Remove the overlay element from the screen and DOM.\n destroy(overlayToDestroy, closeParams?: any): void {\n if (_.isUndefined(overlayToDestroy)) {\n return;\n }\n\n this.serviceFactory.gameService().continuePlayCurrentGame();\n\n const overlay = DOM.$$(OverlayManagerService.OVERLAY_ID + overlayToDestroy.id);\n if (!_.isNull(overlay)) {\n overlay.remove();\n this._setOverlayWrapperZIndex();\n // Fire close callback\n if (_.isFunction(overlayToDestroy.closeCallback)) {\n overlayToDestroy.closeCallback(closeParams);\n }\n if (_.isFunction(overlayToDestroy.cleanResources)) {\n overlayToDestroy.cleanResources();\n }\n\n if (false === this.isActiveOverlayExists()) {\n DOM.removeClass(DOM.getBody(), 'cgp-overlay-open');\n this._destroyOverlayWrapper();\n }\n }\n }\n\n //Destroy all overlays.\n destroyAll(): void {\n Object.keys(this._overlayQueues).forEach((key) => {\n const queue = this._overlayQueues[key];\n while(0 < queue.size()) {\n this.destroy(queue.dequeue());\n }\n });\n }\n\n\n /**\n * Create overlay options for component\n * @param component\n * @param overlayOptions\n * @returns {*}\n * @private\n */\n private _createComponentOverlayOptions(component): any {\n const componentOptions = Object.assign({}, {\n openCallback: component.onAppendedToDOM.bind(component),\n cleanResources: component.shutDown.bind(component),\n el: component.getEl()\n }, component.getOverlayClasses());\n return componentOptions;\n }\n\n private _subscribe(): void {\n this.onSystemEvent(SYSTEM_EVENTS.OPEN_OVERLAY, (overlayOptions) => {\n if (!overlayOptions.priority) {\n overlayOptions.priority = PRIORITY_LEVEL.BASE;\n }\n\n if (!overlayOptions.id) {\n overlayOptions.id = this._counter++;\n }\n if (overlayOptions.component) {\n const componentOptions = this._createComponentOverlayOptions(overlayOptions.component);\n overlayOptions = Object.assign({}, componentOptions, overlayOptions);\n }\n\n const overlay = this._createOverlay(overlayOptions);\n if (!this._overlayWrapper && true === this.isActiveOverlayExists()) {\n // create overlay wrapper\n this._overlayWrapper = OverlayWrapperComponentController.create();\n this._overlayWrapper.start();\n DOM.addClass(DOM.getBody(), 'cgp-overlay-open');\n }\n this.start(overlay);\n this._setOverlayWrapperZIndex();\n });\n\n this.onSystemEvent(SYSTEM_EVENTS.CLOSE_OVERLAY, (params) => {\n const priority = params.priority || PRIORITY_LEVEL.BASE;\n const key = this.getPriorityNameByValue(priority);\n runInAction(() => {\n this.destroy(this._overlayQueues[key].dequeue(), params.closeParams);\n });\n\n });\n this.onSystemEvent(SYSTEM_EVENTS.CLOSE_ALL_OVERLAY, () => {\n this.destroyAll();\n });\n\n this.onSystemEvent(SYSTEM_EVENTS.OVERLAY_CLOSE_EXPIRED, (overlayId) => {\n const overlay = this._getOverlayById(overlayId);\n if (overlay) {\n this.destroy(overlay);\n }\n });\n\n this.onSystemEvent(SYSTEM_EVENTS.OVERLAY_OPEN_AWAIT, (overlayId) => {\n const overlay = this._getOverlayById(overlayId);\n if (overlay) {\n overlay.isActive = true;\n overlay.instance.changeState(true);\n if (!this._overlayWrapper) {\n // create overlay wrapper\n this._overlayWrapper = OverlayWrapperComponentController.create();\n this._overlayWrapper.start();\n DOM.addClass(DOM.getBody(), 'cgp-overlay-open');\n this._setOverlayWrapperZIndex();\n }\n }\n });\n }\n\n //Get if at least one overlay instance is active\n public isActiveOverlayExists(): boolean {\n let isShow = false;\n Object.keys(this._overlayQueues).forEach((key) => {\n if (this._overlayQueues[key].size() > 0) {\n if (false === isShow) {\n const activeOverlay = this._overlayQueues[key].queueList.filter((overlayInstance) => {\n return overlayInstance.isActive;\n });\n isShow = activeOverlay.length > 0;\n }\n }\n });\n\n return isShow;\n }\n\n\n private _createOverlay(overlayOptions): IOverlayData {\n if (_.isNull(overlayOptions.el)) {\n return null;\n }\n\n const newOverlay: IOverlayData = {\n id : (overlayOptions.id || 0),\n instance: OverlayComponentController.create(overlayOptions),\n el: (overlayOptions.el || null),\n priority: (overlayOptions.priority || 0),\n cleanResources: overlayOptions.cleanResources,\n closeCallback: overlayOptions.closeCallback,\n awaitForDisplay: overlayOptions.awaitForDisplay || false,\n isActive: overlayOptions.awaitForDisplay !== true\n };\n\n return this._add(newOverlay);\n }\n\n private _getOverlayById(overlayId): IOverlayData {\n let foundOverlay;\n Object.keys(this._overlayQueues).forEach((key) => {\n const queue = this._overlayQueues[key];\n if (foundOverlay) {\n return;\n }\n foundOverlay = queue.queueList.find((overlay) => {\n return overlay.id === overlayId;\n });\n if (foundOverlay) {\n return;\n }\n });\n\n return foundOverlay;\n }\n\n private _add(newOverlay: IOverlayData): IOverlayData {\n if (!newOverlay.priority) {\n this.logger.error('Overlay priority is not defined. Overlay creation has failed!');\n return null;\n }\n\n const key = this.getPriorityNameByValue(newOverlay.priority.toString());\n if (!key) {\n this.logger.error(`Overlay priority ${newOverlay.priority} does not exist. Overlay creation has failed!`);\n return null;\n }\n // clean same level overlays\n while (this._overlayQueues[key].size() > 0) {\n this.destroy(this._overlayQueues[key].dequeue());\n }\n\n this._overlayQueues[key].queue(newOverlay);\n\n return newOverlay;\n }\n\n\n //Find and set z-index for overlay wrapper to be the equal less one from the hightest overlay indexes\n private _setOverlayWrapperZIndex(): void {\n // find hightest z-index on open overlays\n if (!this._overlayWrapper) {\n return;\n }\n let index = WRAPPER_DEFAULT_INDEX;\n Object.keys(this._overlayQueues).forEach((key) => {\n const queue = this._overlayQueues[key];\n queue.queueList.forEach((overlay) => {\n if (overlay.isActive) {\n index = PRIORITY_LEVEL_ZINDEX_MAPPER[overlay.priority] > index ? PRIORITY_LEVEL_ZINDEX_MAPPER[overlay.priority] : index;\n }\n });\n });\n DOM.addStyle(this._overlayWrapper.getEl(), 'z-index', (index - 1).toString());\n }\n\n //Create Map of queues according to PRIORITY_LEVEL constants. One queue to each priority type\n private _initQueues(): void {\n this._overlayQueues = {};\n Object.keys(PRIORITY_LEVEL).forEach((key) => {\n this._overlayQueues[key] = QueueModel.create();\n });\n }\n\n //Determinate whether all overlay queues are empty\n private _isQueuesEmpty(): boolean {\n let isEmpty = true;\n Object.keys(this._overlayQueues).forEach((key) => {\n if (this._overlayQueues[key].size() > 0) {\n isEmpty = false;\n }\n });\n\n return isEmpty;\n }\n\n //Convert priority value to its original name\n public getPriorityNameByValue(priorityValue: string): string {\n return Object.keys(PRIORITY_LEVEL).find((key) => PRIORITY_LEVEL[key] === priorityValue);\n }\n\n public getCGPMaxOverlayZIndex(): number {\n return Math.max(...Object.values(PRIORITY_LEVEL_ZINDEX_MAPPER));\n }\n}\n\nexport default OverlayManagerService;\n","const OVERLAY_EVENTS_SELECTORS_ID = {\n OVERLAY_CGP_ID: '#cgp_overlay'\n};\n\nexport { OVERLAY_EVENTS_SELECTORS_ID };\n","import BaseService from \"../../base/base_service\";\nimport IPlayerMigration, {IPlayerMigrationProxyService} from \"../../../../common/interfaces/player-migration.interface\";\nimport {ClientVisitAnalyticsParams} from \"../../../../app-react/services/player-migration/player-migration.service\";\n\ninterface PlayerMigrationProxyServiceParams {\n getPlayerMigrationService: () => IPlayerMigration;\n}\n\nexport default class PlayerMigrationProxyService extends BaseService implements IPlayerMigrationProxyService {\n static CLASS = 'PlayerMigrationProxyService';\n private _params: PlayerMigrationProxyServiceParams;\n\n init(params: PlayerMigrationProxyServiceParams) {\n this._params = params;\n }\n\n get businessCorrelationId(): string {\n return this._params.getPlayerMigrationService().businessCorrelationId;\n }\n\n get isMigrationEnabledFromConfig(): boolean {\n return this._params.getPlayerMigrationService().isMigrationEnabledFromConfig;\n }\n\n get isPlayerMigrated(): boolean {\n return this._params.getPlayerMigrationService().isPlayerMigrated;\n }\n\n sendClientVisitAnalytics(params?: ClientVisitAnalyticsParams) {\n return this._params.getPlayerMigrationService().sendClientVisitAnalytics(params);\n }\n}","import BaseObject from \"../../../base/base_object\";\nimport WalletFallbackHandler from \"./handlers/wallet_fallback_handler\";\nimport {FALLBACK_HANDLERS} from './fallback_service_consts';\n\nexport default class FallbackHandlerDependenciesFactory extends BaseObject {\n static CLASS = 'FallbackHandlerDependenciesFactory';\n\n init(params) {\n super.init(params);\n\n if(!params.serviceFactory) {\n this.throwArgumentExpected('12', 'init', 'serviceFactory');\n }\n\n this._serviceFactory = params.serviceFactory;\n this._handlerParams = params;\n }\n\n createHandler(handlerName, params) {\n switch (handlerName) {\n case FALLBACK_HANDLERS.WALLET:\n return WalletFallbackHandler.create(Object.assign({}, {serviceFactory: this._serviceFactory}, this._handlerParams.Wallet));\n default:\n // maybe should throw an Exception here\n return undefined;\n }\n }\n}","import BaseService from \"../../../base/base_service\";\nimport {SYSTEM_EVENTS} from \"../../../events/events\";\nimport _ from '../../../utils/underscore';\nimport FallbackHandlerDependenciesFactory from \"./fallback_handlers_dependencies_factory\";\n\nexport default class FallbackService extends BaseService {\n\n static CLASS = 'FallbackService';\n\n /**\n * @property\n * @type {Object}\n * @private\n */\n _handlersContext = require.context('./handlers/', true, /^.*(handler)\\.[jt]s$/);\n\n\n _fallbackHandlers = [];\n\n\n _initParams;\n\n\n init(params) {\n super.init(params);\n this._initParams = params;\n this._dependenciesFactory = params.dependenciesFactory;\n this.subscribe();\n }\n\n\n subscribe() {\n this.onSystemEvent(SYSTEM_EVENTS.ON_INIT_COMPLETE, this._onInitComplete);\n }\n\n _onInitComplete() {\n if (!this._dependenciesFactory) {\n let dependencies = Object.assign({}, {serviceFactory: this.serviceFactory}, this._initParams);\n this._dependenciesFactory = FallbackHandlerDependenciesFactory.create(dependencies);\n }\n\n this._handlersContext.keys().map(this._handlersContext).forEach((handler) => {\n this._fallbackHandlers.push(this._dependenciesFactory.createHandler(handler.default.FallbackName));\n })\n }\n\n\n /**\n * Find Fallback by name\n * @param handlerName\n * @returns {*}\n * @private\n */\n _getFallbackByName(handlerName) {\n return this._fallbackHandlers.find((handler) => {\n return handler.getFallbackName() === handlerName\n });\n }\n\n /**\n * Start all fallbacks. If fallbackName parameter passed, start only specified fallback\n * Specified fallback is used for partial fallback only (for example only for Wallet)\n * @param fallbackName\n */\n start(fallbackName) {\n if (!fallbackName) {\n this.logger.debug('Start fallback process for all messages!');\n this._fallbackHandlers.forEach((fallback) => {\n this._startFallback(fallback)\n });\n return;\n }\n\n let fallback = this._getFallbackByName(fallbackName);\n if (fallback) {\n this._startFallback(fallback);\n }\n }\n\n\n /**\n * Stop all fallbacks. If fallbackName parameter passed, stop only specified fallback\n * Specified fallback is used for partial fallback only (for example only for Wallet)\n * @param handlerName\n */\n stop(fallbackName) {\n if (!fallbackName) {\n this.logger.debug('Stop fallback process for all messages!');\n this._fallbackHandlers.forEach((fallback) => {\n this._stopFallback(fallback);\n });\n }\n\n let fallback = this._getFallbackByName(fallbackName);\n if (fallback) {\n this._stopFallback(fallback);\n }\n }\n\n _stopFallback(fallback) {\n this.logger.debug(`Stop fallback process for ${fallback.getFallbackName()} messages!`);\n fallback.stop();\n }\n\n _startFallback(fallback) {\n this.logger.debug(`Start fallback process for ${fallback.getFallbackName()} messages!`);\n fallback.start();\n }\n\n\n /**\n * Stop all Fallbacks except of fallbacks in excludedHandlers Array\n * @param excludedHandlers\n */\n stopAllButThis(excludedFallbacks) {\n this._fallbackHandlers.forEach((fallback) => {\n if (_.isArray(excludedFallbacks)) {\n let excluded = excludedFallbacks.find((h) => {\n return h === fallback.getFallbackName();\n });\n if (!excluded) {\n this._stopFallback(fallback);\n }\n } else {\n this._stopFallback(fallback);\n }\n });\n }\n}","export const FALLBACK_HANDLERS = {\n WALLET: 'Wallet',\n FREE_PLAY: 'FreePlay'\n}","import BaseObject from \"../../../base/base_object\";\n\nexport default class BaseFallbackHandler extends BaseObject {\n\n _isActive = false;\n\n init(params){\n super.init(params);\n this.serviceFactory = params.serviceFactory;\n }\n\n getFallbackName() {\n return 'BaseFallback';\n }\n\n start() {\n\n }\n\n stop() {}\n}","import BaseFallbackHandler from \"../base_fallback_handler\";\nimport {SYSTEM_EVENTS} from \"../../../../events/events\";\nimport Event from \"../../../../utils/event\";\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport _ from \"../../../../utils/underscore\";\nimport { IFreePlayVoucherData } from \"../../../../../../common/interfaces/free-play/free-play-voucher-data.interface\";\n\n\nconst REFRESH_WALLET_INTERVAL = 30; // in seconds\n\nexport default class WalletFallbackHandler extends BaseFallbackHandler {\n\n static CLASS = 'WalletFallbackHandler';\n static FallbackName = 'Wallet';\n private _subscription;\n private _eventInstances = [];\n\t_uri = '';\n\t_refreshInterval = 0;\n\n init(params) {\n super.init(params);\n if (params) {\n this._uri = params.uri || '/capi/wallet/getplayerwallet/';\n this._refreshInterval = params.refreshInterval || REFRESH_WALLET_INTERVAL;\n }\n }\n\n start() {\n if (true === this._isActive) {\n this.logger.debug('Fallback is already running');\n return;\n }\n this._startWalletRefresh();\n }\n\n\n getFallbackName() {\n return 'Wallet';\n }\n\n\n /**\n * Update wallet over API\n * @private\n */\n private _receiveWallet() {\n if (this.serviceFactory.oAuth2Service().isAuthorized()) {\n this.serviceFactory.http2Service().post(this._uri)\n .then((walletResponse) => {\n // reduce data to update separate system parts (wallet and free play services)\n const walletData = Object.assign({}, walletResponse);\n delete walletData['FreePlay'];\n this._handleWalletData(walletData);\n this._handleFreePlay(walletResponse.FreePlay);\n });\n }\n }\n\n private _handleWalletData(walletData) {\n this.logger.debug('Received Wallet data', JSON.stringify(walletData));\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_WALLET, {\n Balance: walletData.AvailableMoney,\n Currency: walletData.CurrencyCode,\n RealMoneyBankroll: walletData.RealMoneyBankroll\n });\n }\n\n\tprivate _convertWalletFreePlays(fpData: any): IFreePlayVoucherData[] {\n if (!fpData || !fpData.FreePlayList || !fpData.FreePlayList.FreePlay) {\n this.logger.debug('Unable to convert wallet FP data to FP Message format. FreePlay data is empty');\n return [];\n }\n this.logger.debug('Received Free Play data', JSON.stringify(fpData));\n let vouchers: IFreePlayVoucherData[] = [];\n if (_.isArray(fpData.FreePlayList.FreePlay)) {\n\t\t\tvouchers = fpData.FreePlayList.FreePlay.map(freePlay => this._convertToVoucher(freePlay));\n\t\t} else if (_.isObject(fpData.FreePlayList.FreePlay)) {\n\t\t\tvouchers = [this._convertToVoucher(fpData.FreePlayList.FreePlay)];\n\t\t}\n return vouchers;\n\t}\n\n\tprivate _convertToVoucher(freePlay: any): IFreePlayVoucherData {\n\t\tconst voucher: IFreePlayVoucherData = {\n\t\t\tID: freePlay.Id.toString(),\n\t\t\tCurrentBalance: _.safeStringToNumber(freePlay.CurrAmount, 0),\n\t\t\tWinnings: _.safeStringToNumber(freePlay.FreeBetWinning, 0),\n\t\t\tFreePlayTypeId: freePlay.FreePlayTypeID ? freePlay.FreePlayTypeID.toString() : '1',\n\t\t\tOriginAmount: _.safeStringToNumber(freePlay.OrigAmount, 0),\n CreationDate: null,\n\t\t\tExpirationDate: new Date(freePlay.FreePlayExpirationDate),\n\t\t\tSpinBetAmount: _.safeStringToNumber(freePlay.MaxBetAmount, 0),\n\t\t\tGameTypeIDList: freePlay.GameTypeList ? this._getGameTypesFromWalletFreePlay(freePlay.GameTypeList) : []\n\t\t};\n\t\treturn voucher;\n\t}\n\n\n\tprivate _getGameTypesFromWalletFreePlay(gameTypeList: any): number[] {\n const gameTypes: number[] = [];\n if (_.isArray(gameTypeList.GameType)) {\n gameTypeList.GameType.forEach((game) => {\n gameTypes.push(Number(game[\"@id\"]));\n });\n } else {\n gameTypes.push(Number(gameTypeList.GameType[\"@id\"]));\n }\n return gameTypes;\n }\n\n private _lastReceivedVouchers: IFreePlayVoucherData[] = null;\n private _handleFreePlay(fpData: any) {\n\t\tconst newReceivedVouchers = this._convertWalletFreePlays(fpData);\n\t\tif(this._lastReceivedVouchers) {\n\t\t const removedVouchers = this._extractRemovedVouchers(newReceivedVouchers);\n\t\t if(removedVouchers.length > 0) {\n\t\t removedVouchers.forEach( voucher => {\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_FREE_PLAY_REMOVED, voucher.ID);\n })\n }\n }\n this.logger.debug('Received FreePlay voucers', JSON.stringify(newReceivedVouchers));\n this._lastReceivedVouchers = newReceivedVouchers;\n }\n\n private _extractRemovedVouchers(newVouchers:IFreePlayVoucherData[]): IFreePlayVoucherData[] {\n return this._lastReceivedVouchers.filter(oldVoucher => newVouchers.findIndex( newVoucher => newVoucher.ID === oldVoucher.ID) === -1)\n }\n\n /**\n * Refresh wallet.\n */\n private _startWalletRefresh() {\n if (false === this.serviceFactory.oAuth2Service().isAuthorized()) {\n this.stop();\n return;\n }\n this._isActive = true;\n // Get wallet and FP data from token and local storage\n this._receiveWallet();\n\n this._subscription = this.serviceFactory.observableFactoryService().fromInterval(TimeSpan.fromSeconds(this._refreshInterval)).forEach(() => {\n this._receiveWallet();\n });\n\n this._eventInstances.push(Event.on([SYSTEM_EVENTS.OAUTH_STATE_CHANGE, SYSTEM_EVENTS.CLOSE_GAME, SYSTEM_EVENTS.ROUTE_CHANGED], () => {\n this._receiveWallet();\n }, this));\n }\n\n stop() {\n // clear interval\n if (this._subscription) {\n this._subscription.dispose();\n }\n // unsubscribe from events\n Event.detachEvents(this._eventInstances);\n this._isActive = false;\n }\n}","import BaseService from \"../../../base/base_service\";\nimport { IElasticEventData } from \"../../../../../common/interfaces/structured-logging-service-interface\";\n\nexport default class FirebaseElasticService extends BaseService{\n\n static CLASS = 'FirebaseElasticService';\n\n sendConnected(){\n this._sendElasticEvent('FIREBASE_CONNECTED');\n }\n\n sendFallbackStarted(label: string, forced: boolean = false){\n this._sendElasticEvent('FIREBASE_FALLBACK_STARTED', label, forced ? \"Forced\" : \"Not Forced\");\n }\n\n sendConnectionFailed(label: string, value: string){\n this._sendElasticEvent('FIREBASE_CONNECTION_FAILED', label, value);\n }\n\n sendSubscriptionError(label: string, value: string){\n this._sendElasticEvent('FIREBASE_SUBSCRIPTION_ERROR', label, value);\n }\n\n sendMessageUpdate(label: string, value: string){\n this._sendElasticEvent('FIREBASE_MESSAGE_UPDATE', label, value);\n }\n\n private _sendElasticEvent(action: string, label: string = null, value: string = null){\n const data: IElasticEventData = {\n CGPEventCategory: 'FIREBASE',\n CGPEventAction: action\n };\n if (label) data.CGPEventLabel = label;\n if (value) data.CGPEventValue = value;\n this.serviceFactory.structuredLoggingService().getLogger(data).info();\n }\n}\n","import BaseObject from \"../../../base/base_object\";\nimport ServiceFactory from \"../../service_factory\";\nimport _ from \"../../../utils/underscore\";\nimport {IFirebaseParams} from \"./firebase_strategy\";\nimport {IBaseParams, ISubscriptionParams} from \"./firebase_const\";\n\nexport interface FirebaseHandlerInitParams{\n firebaseMessaging: {};\n config: IFirebaseParams;\n}\n\n\nexport default abstract class FirebaseHandlerBase extends BaseObject{\n static CLASS = \"FirebaseHandlerBase\";\n\n protected serviceFactory: ServiceFactory;\n protected firebaseMessaging;\n protected enabled: boolean = false;\n protected forceFallback: boolean = false;\n\n protected init(params: FirebaseHandlerInitParams) {\n const optionalParams = params.config[this.getFeatureName()];\n if(optionalParams){\n this.setFeatureParams(optionalParams);\n }\n super.init(params);\n if(!params.config.serviceFactory) {\n this.throwArgumentExpected('28', 'init', 'serviceFactory');\n }\n\n if(!params.firebaseMessaging) {\n this.throwArgumentExpected('32', 'init', 'firebaseMessaging');\n }\n this.serviceFactory = params.config.serviceFactory;\n this.firebaseMessaging = params.firebaseMessaging;\n\n if(this.enabled){\n if (this.forceFallback) {\n this.startFallback();\n this.logger.warn('Feature ' + this.getFeatureName() + ' is enabled, but forced to fallback.');\n } else {\n this.subscribe();\n this.logger.debug('Feature ' + this.getFeatureName() + ' is enabled. Able to receive message from Firebase');\n }\n } else {\n this.logger.warn('Feature ' + this.getFeatureName() + ' is disabled. Unable to receive message for this feature from Firebase');\n }\n }\n\n protected setFeatureParams(params: IBaseParams){\n this.enabled = _.isNullOrUndefined(params.enabled) ? this.enabled : _.toBoolean(params.enabled);\n this.forceFallback = _.isNullOrUndefined(params.forceFallback) ? false : _.toBoolean(params.forceFallback);\n }\n\n private _subscriptionParams: ISubscriptionParams;\n protected subscribe(){\n this._subscriptionParams = this.getSubscriptionParams();\n this.firebaseMessaging.subscribe(\n this._subscriptionParams.eventName,\n this._successCallback,\n this.errorCallback,\n this._subscriptionParams.params);\n }\n\n private _successCallback = (data) => {\n if(this.getFallbackServiceName()){\n this.serviceFactory.fallbackService().stop(this.getFallbackServiceName());\n }\n this._subscriptionParams.successCallback(data);\n }\n\n\n public unsubscribe(){\n if(this.getFallbackServiceName()){\n this.serviceFactory.fallbackService().stop(this.getFallbackServiceName());\n }\n if(this.firebaseMessaging && this._subscriptionParams) {\n this.firebaseMessaging.unSubscribe(this._subscriptionParams.eventName,\n this._successCallback,\n this._subscriptionParams.params);\n }\n }\n\n protected abstract getFeatureName(): string;\n\n protected abstract getFeatureLabel(): string;\n\n protected abstract getFallbackServiceName(): string;\n\n protected abstract getSubscriptionParams(): ISubscriptionParams;\n\n protected errorCallback = (err) => {\n this.startFallback();\n this.logger.error('Firebase Handler error', err);\n this.serviceFactory.firebaseElasticService().sendSubscriptionError(this.getFeatureLabel(),JSON.stringify(err));\n }\n\n protected startFallback(){\n if(this.serviceFactory.oAuth2Service().isAuthorized() && this.getFallbackServiceName()){\n this.serviceFactory.fallbackService().start(this.getFallbackServiceName());\n this.serviceFactory.firebaseElasticService().sendFallbackStarted(this.getFeatureLabel(), this.forceFallback);\n }\n }\n\n}\n","import FirebaseHandlerBase from \"../firebase_handler_base\";\nimport {SYSTEM_EVENTS} from \"../../../../events/events\";\nimport Event from \"../../../../utils/event\";\nimport {ISubscriptionParams} from \"../firebase_const\";\n\ninterface BankrollData {\n casinoRM: number;\n cid: number;\n currency: string;\n dateUpdated: {};\n pokerRM: number;\n realBR: number;\n sportRM: number;\n updateCounter: number;\n IsCasinoBankrollRestricted?: boolean | string | number;\n}\n\nexport default class BankrollHandler extends FirebaseHandlerBase{\n static CLASS = 'BankrollHandler';\n\n protected getSubscriptionParams(): ISubscriptionParams {\n return {\n eventName: 'bankroll',\n successCallback: this._updateBankroll,\n params: {currency: this.serviceFactory.currencyService().getCurrency()}\n };\n }\n\n protected getFeatureName(): string {\n return \"BR\";\n }\n\n protected getFeatureLabel(): string {\n return \"Bankroll\";\n }\n\n\n protected getFallbackServiceName(): string{\n return \"Wallet\";\n }\n\n private _updateBankroll = (data: BankrollData) => {\n this.logger.debug('Firebase got BR message. Raw data: ' + JSON.stringify(data));\n\n const balanceData = {\n Balance: this._getBalance(data),\n Currency: data.currency,\n RealMoneyBankroll: data.realBR,\n };\n\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_WALLET, balanceData);\n\n this.logger.debug('FIREBASE got BR message. Parsed data: ' + JSON.stringify(balanceData));\n\n // filter elastic bankroll updates only for vip users, avoiding too much reporting\n const accountData = this.serviceFactory.userService().getAccountData();\n if (accountData && accountData.IsVip) {\n this.serviceFactory.firebaseElasticService().sendMessageUpdate(this.getFeatureLabel(), JSON.stringify(data));\n }\n \n };\n\n private _getBalance(data: BankrollData): number{\n const bonus = data.casinoRM || 0;\n\n return data.realBR + bonus;\n }\n}\n","import FirebaseHandlerBase from \"../firebase_handler_base\";\nimport {SYSTEM_EVENTS} from \"../../../../events/events\";\nimport Event from '../../../../utils/event';\nimport _ from \"../../../../utils/underscore\";\nimport {FP_VOUCHER_TYPES} from \"../../../../../../common/const/free_play_consts\";\nimport {IExpirationDate, ISubscriptionParams} from \"../firebase_const\";\nimport {\n IFreePlayVoucherData,\n IFreePlayVoucherDelta\n} from \"../../../../../../common/interfaces/free-play/free-play-voucher-data.interface\";\nimport {Check} from \"@sparkware/app-utils\";\n\n\nenum TYPES{\n ADDED = \"added\",\n REMOVED = \"removed\",\n MODIFIED = \"modified\"\n}\n\ninterface FPVoucherData{\n CurrentBalance: number;\n ExpirationDate: IExpirationDate;\n FreePlayId: number;\n FreePlayTypeId: number;\n GameTypeIdList: number[];\n MaxBetAmount: number;\n OriginAmount: number;\n UpdateCounter: number;\n Winnings: number;\n PendingDeletion?: boolean;\n}\n\ninterface IFPReceivedVoucher{\n data: FPVoucherData;\n type: TYPES;\n id: string;\n}\n\nexport default class FreeplayHandler extends FirebaseHandlerBase{\n static class: string = \"FreeplayHandler\";\n\n protected getSubscriptionParams(): ISubscriptionParams {\n return {\n eventName: 'freePlay',\n successCallback: this._updateFreePlay,\n };\n }\n\n protected getFeatureName(): string {\n return \"FP\";\n }\n\n protected getFeatureLabel(): string {\n return \"FreePlay\";\n }\n\n protected getFallbackServiceName(): string{\n return \"Wallet\";\n }\n\n private _updateFreePlay = (data: IFPReceivedVoucher[]) => {\n this.logger.debug('Firebase got FP message. Raw data: ' + JSON.stringify(data));\n\n if(data.length !== 0){\n const vouchersChanges = this._parseVouchers(data);\n\n\n if(vouchersChanges.removedVouchers.length > 0) {\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_FREE_PLAY_BATCH_REMOVED, vouchersChanges.removedVouchers);\n }\n\n if(vouchersChanges.addedVouchers.length > 0) {\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_FREE_PLAY_BATCH_ADDED, vouchersChanges.addedVouchers);\n }\n\n if(vouchersChanges.updatedVouchers.length > 0) {\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_FREE_PLAY_BATCH_UPDATED, vouchersChanges.updatedVouchers);\n }\n\n //TODO - remove this when free play from SDK will be removed\n vouchersChanges.removedVouchers.forEach(id => {\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_FREE_PLAY_REMOVED, id);\n });\n }\n\n this.serviceFactory.firebaseElasticService().sendMessageUpdate(this.getFeatureLabel(), JSON.stringify(data));\n }\n\n private _parseVouchers(freePlayData: IFPReceivedVoucher[]): {addedVouchers: IFreePlayVoucherData[]; updatedVouchers: IFreePlayVoucherDelta[]; removedVouchers: string[]}{\n const addedVouchers: IFreePlayVoucherData[] = [];\n const updatedVouchers: IFreePlayVoucherDelta[] = [];\n const removedVouchers: string[] = [];\n\n freePlayData.forEach((receivedVoucher: IFPReceivedVoucher) => {\n const receivedData: FPVoucherData = receivedVoucher.data;\n const voucherData: IFreePlayVoucherData = {\n ID: receivedData.FreePlayId.toString(), //make sure that even if it doesn't come as string from firebase we will make it string\n CurrentBalance: receivedData.CurrentBalance,\n Winnings: receivedData.Winnings,\n FreePlayTypeId: (receivedData.FreePlayTypeId?.toString() || FP_VOUCHER_TYPES.FreePlay) as FP_VOUCHER_TYPES,\n OriginAmount: receivedData.OriginAmount,\n CreationDate: null,\n ExpirationDate: receivedData.ExpirationDate ? new Date(1000*receivedData.ExpirationDate.seconds) : undefined,\n SpinBetAmount: receivedData.MaxBetAmount,\n GameTypeIDList: receivedData.GameTypeIdList,\n PendingDeletion: _.isNullOrUndefined(receivedData.PendingDeletion) ? false : _.toBoolean(receivedData.PendingDeletion)\n };\n switch(receivedVoucher.type) {\n case TYPES.ADDED:\n if(voucherData.PendingDeletion) {\n removedVouchers.push(voucherData.ID);\n }else{\n addedVouchers.push(voucherData);\n }\n break;\n case TYPES.MODIFIED:\n if(voucherData.PendingDeletion) {\n removedVouchers.push(voucherData.ID);\n } else {\n const modifiedVoucher: IFreePlayVoucherDelta = {\n ID: voucherData.ID\n }\n Object.keys(voucherData).forEach(propertyName => {\n if(!Check.isUndefined(voucherData[propertyName])) {\n modifiedVoucher[propertyName] = voucherData[propertyName];\n }\n });\n\n updatedVouchers.push(modifiedVoucher);\n }\n\n break;\n case TYPES.REMOVED:\n this.logger.debug(`Firebase got FP message. Remove voucher id: ${voucherData.ID}`);\n removedVouchers.push(voucherData.ID)\n break;\n }\n });\n\n return {\n addedVouchers: addedVouchers,\n updatedVouchers: updatedVouchers,\n removedVouchers: removedVouchers\n };\n }\n}","import FirebaseHandlerBase from \"../firebase_handler_base\";\nimport {ISubscriptionParams} from \"../firebase_const\";\nimport {SYSTEM_EVENTS} from \"../../../../events/events\";\nimport Event from \"../../../../utils/event\";\nimport {IGamblingSessionUpdateData} from \"./gambling-session_handler_interfaces\";\n\nexport default class GamblingSessionHandler extends FirebaseHandlerBase {\n static CLASS = \"GamblingSessionHandler\";\n protected getSubscriptionParams(): ISubscriptionParams {\n return {\n eventName: `gamblingSessions/${this.serviceFactory.userService().getCID()}`,\n successCallback: this._updateGamblingSession\n };\n }\n\n protected getFeatureName(): string {\n return \"GamblingSession\";\n }\n\n protected getFeatureLabel(): string {\n return \"GamblingSession\";\n }\n\n protected getFallbackServiceName(): string{\n return null;\n }\n\n private _updateGamblingSession = (eventData: IGamblingSessionUpdateData) => {\n\n Event.fire(SYSTEM_EVENTS.GAMBLING_SESSION_UPDATE, eventData);\n }\n}","export interface IBaseParams{\n enabled?: boolean;\n forceFallback?: boolean;\n}\n\n\nexport enum MESSAGE_DISPLAY_MODE {\n TOASTER = 0,\n ANIMATION = 1\n}\n\nexport enum MESSAGE_ANIMATION_TYPE {\n BURNOUT = 4\n}\n\nexport enum PLATFORM_MESSAGE_TYPE {\n OMG = 1,\n TOASTER = 2,\n KICK = 3,\n INIT_GEO = 9,\n UPDATE_RESTRICTION_V2 = 10,\n BET_REJECTED = 12,\n PROMOTION_DISPLAY_IN_CLIENT = 13,\n TIME_BASE_PROMOTION_ELIGIBILITY_CHECK = 14,\n FREE_TO_PLAY_ELIGIBILITY_CHECK = 15,\n INTRUSIVE_MESSAGE = 16, // for example, UKGC initial warning message or BIG WIN message\n GAMBLING_SESSION_ACTION = 17,\n}\n\nexport interface IntrusiveMessageData {\n MessageID: string | number;\n Title: string;\n Text: string;\n LangIso3: string;\n ButtonText: string;\n CorrelationID: string;\n}\n\nexport interface IMessageData {\n PlatformMessagesType: PLATFORM_MESSAGE_TYPE;\n TroubleshooterRetry?: boolean;\n TroubleshooterMessages?: any[];\n ReasonID?: number;\n}\n\nexport interface IOMGReceivedData extends IMessageData {\n DisplayInGame: 0 | 1;\n MessageData: string;\n MessageDataJson: string; //apparently this contains an array of toaster messages\n OmgType: number;\n}\n\nexport interface IKickData extends IMessageData {\n KickReasonId: number;\n KickType: number;\n LimitExpirationDate?: TimeSpanFromFirebase;\n CorrelationID?: string;\n CorrelationId?: string; //Because of temporary misalignment between verticals regarding name of this param\n}\n\nexport interface TimeSpanFromFirebase {\n seconds: number;\n nanoseconds: number;\n}\n\nexport interface IInitGeoData extends IMessageData {\n Cid: number;\n GameCategory: number;\n GeoComplyLicense: string;\n GeoComplyWebLicense: string;\n IsPeriodicFlow: boolean;\n LocationTransactionId: string;\n Mobile: string;\n Platform: number;\n PlayerSessionId: number;\n insertData: {\n nanoseconds: number;\n seconds: number;\n };\n}\n\nexport interface IRestrictionEntitiesValuesData {\n ExpirationDate: string;\n ReasonId: number;\n Value: string;\n}\n\nexport interface IRestrictionEntitiesData {\n EntityId: number;\n Values: IRestrictionEntitiesValuesData[];\n}\n\nexport interface IRestrictionByActionData {\n ActionId: number;\n Entities: IRestrictionEntitiesData[]\n}\n\n\nexport interface IRestrictionData extends IMessageData {\n Cid: number;\n ReasonID: number;\n RestrictionsByAction: IRestrictionByActionData[]\n}\n\nexport interface IExpirationDate {\n nanoseconds: number;\n seconds: number;\n}\n\nexport interface ISubscriptionParams {\n eventName: string;\n successCallback: any;\n params?: any;\n}\n\nexport interface IMessagesParams extends IBaseParams {\n Kick: IBaseParams;\n OMG: IOMGParams;\n Restrictions: IBaseParams;\n BetRejected: IBaseParams;\n Toasters: IToastersParams;\n}\n\nexport interface IOMGParams extends IBaseParams {\n OMGVersion: string;\n}\n\nexport interface IToastersParams extends IBaseParams {\n toasterVersion: string;\n}\n\nexport const MESSAGES_FEATURES_DEFAULTS: IMessagesParams = {\n OMG: {\n OMGVersion: '4',\n enabled: false\n },\n Toasters: {\n toasterVersion: '1',\n enabled: false\n },\n Kick: {\n enabled: false\n },\n Restrictions: {\n enabled: false\n },\n BetRejected: {\n enabled: false\n },\n enabled: false\n}\n\nexport interface IWheelOfFortuneData extends IMessageData {\n Cid: number;\n IndicationInClientPromotionsIds: number[];\n IsPromotionDisplayedInClient: boolean;\n}\n\n","import FirebaseHandlerBase from \"../firebase_handler_base\";\nimport Event from \"../../../../utils/event\";\nimport {SYSTEM_EVENTS} from \"../../../../events/events\";\nimport _ from \"../../../../utils/underscore\";\nimport {\n IInitGeoData,\n IKickData,\n IMessageData,\n IMessagesParams, IntrusiveMessageData,\n IOMGReceivedData,\n IRestrictionData,\n ISubscriptionParams,\n IWheelOfFortuneData,\n MESSAGE_ANIMATION_TYPE,\n MESSAGE_DISPLAY_MODE,\n MESSAGES_FEATURES_DEFAULTS,\n PLATFORM_MESSAGE_TYPE\n} from \"../firebase_const\";\nimport {Check} from \"@sparkware/app-utils\";\nimport {\n IGamblingSessionActionData, IGamblingSessionActionDataReceivedFromPlatform, IGamblingSessionActionEvent,\n IMessageDataJson,\n IOMGParsedData,\n IReceivedMessage,\n MESSAGE_TYPE,\n OpenWithinGameType\n} from \"./messages_handler_interfaces\";\n\n\n\nexport default class MessagesHandler extends FirebaseHandlerBase{\n static CLASS = \"MessagesHandler\";\n private _messagesConfig: IMessagesParams;\n\n protected setFeatureParams(messagesParams: IMessagesParams){\n super.setFeatureParams(messagesParams);\n this._messagesConfig = _.mergeDeep(MESSAGES_FEATURES_DEFAULTS, messagesParams);\n }\n\n protected getSubscriptionParams(): ISubscriptionParams {\n return {\n eventName: 'messages',\n successCallback: this._updateMessages,\n params: {omgVersion:this._messagesConfig.OMG.OMGVersion, toasterVersion:this._messagesConfig.Toasters.toasterVersion}\n };\n }\n\n protected getFeatureName(): string {\n return \"Messages\";\n }\n\n protected getFeatureLabel(): string {\n return \"OMG/Toaster/Kick/Restrictions/BetRejected\";\n }\n\n protected getFallbackServiceName(): string{\n return null;\n }\n\n private _updateMessages = (messages: IReceivedMessage[]) => {\n this.logger.debug('Firebase got OMG/Toaster/Kick/Restrictions/BetRejected messages: ' + JSON.stringify(messages));\n\n if (messages.length === 0) {\n return;\n }\n\n const restrictions: IRestrictionData[] = [];\n\n let category = null;\n messages.forEach((message: IReceivedMessage) => {\n const data: IMessageData = message.data;\n\n if(message.type !== MESSAGE_TYPE.ADDED){\n return; // only messages with type = ADDED are implemented\n }\n\n category = PLATFORM_MESSAGE_TYPE[data.PlatformMessagesType];\n if(category) {\n this.logger.debug(`Firebase ${category} message: ${JSON.stringify(data)}`);\n }\n\n switch(data.PlatformMessagesType) {\n\n case PLATFORM_MESSAGE_TYPE.OMG:\n if(this._messagesConfig.OMG.enabled) {\n const omgData: IOMGParsedData = this.parseOmgMessage(data as IOMGReceivedData);\n this.OMGFieldsValueChange(omgData);\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_OMG_RECEIVED, omgData);\n } else {\n this.logger.debug('Firebase OMG feature is disabled');\n }\n break;\n\n case PLATFORM_MESSAGE_TYPE.TOASTER:\n if (this._messagesConfig.Toasters.enabled) {\n const toasterData: IOMGReceivedData = data as IOMGReceivedData;\n if (toasterData.MessageDataJson) {\n this._handleToasterTypeMessages(JSON.parse(toasterData.MessageDataJson));\n } else {\n this.logger.debug('Firebase TOASTER feature is disabled');\n }\n }\n break;\n\n case PLATFORM_MESSAGE_TYPE.KICK:\n if(this._messagesConfig.Kick.enabled) {\n const kickData: IKickData = data as IKickData;\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_KICK, {\n KickType: kickData.KickType.toString(),\n KickReasonId: kickData.KickReasonId.toString(),\n LimitExpirationDateInSeconds: kickData.LimitExpirationDate?.seconds, //Only applicable for ukgc soft kick right now\n CorrelationID: kickData.CorrelationID || kickData.CorrelationId\n });\n } else {\n this.logger.debug('Firebase KICK feature is disabled');\n }\n break;\n case PLATFORM_MESSAGE_TYPE.INIT_GEO:\n const initGeoDataData: IInitGeoData = data as IInitGeoData;\n Event.fire(SYSTEM_EVENTS.GEO_PERIODIC_UPDATE, {\n mobileNumber: initGeoDataData.Mobile,\n licenseKey: initGeoDataData.GeoComplyLicense,\n licenseWebKey: initGeoDataData.GeoComplyWebLicense,\n locationTransactionId: initGeoDataData.LocationTransactionId\n });\n break;\n case PLATFORM_MESSAGE_TYPE.UPDATE_RESTRICTION_V2:\n if(this._messagesConfig.Restrictions.enabled) {\n const restrictionData: IRestrictionData = data as IRestrictionData;\n restrictions.push(restrictionData as IRestrictionData);\n if(restrictions.length > 0){\n this._updateRestrictions(data, restrictions);\n }\n } else {\n this.logger.debug('Firebase RESTRICTIONS feature is disabled');\n }\n break;\n case PLATFORM_MESSAGE_TYPE.BET_REJECTED:\n if(this._messagesConfig.BetRejected.enabled) {\n Event.fire(SYSTEM_EVENTS.BONUS_ABUSE_PARKING_MONEY, data);\n } else {\n this.logger.debug('Firebase BetRejected feature is disabled');\n }\n break;\n case PLATFORM_MESSAGE_TYPE.PROMOTION_DISPLAY_IN_CLIENT:\n Event.fire(SYSTEM_EVENTS.PROMOTIONS_CHANGED, data as IWheelOfFortuneData);\n break;\n case PLATFORM_MESSAGE_TYPE.INTRUSIVE_MESSAGE:\n const toasterData: IOMGReceivedData = data as IOMGReceivedData;\n if (toasterData.MessageDataJson) {\n this._handleIntrusiveMessages(JSON.parse(toasterData.MessageDataJson));\n }\n break;\n\n case PLATFORM_MESSAGE_TYPE.GAMBLING_SESSION_ACTION:\n\n const gamblingSessionActionEvent = data as IGamblingSessionActionEvent;\n if(!gamblingSessionActionEvent.MessageDataJson) {\n this.logger.error('Received gambling session action event with empty MessageDataJson');\n return;\n }\n\n let actionsReceivedFromPlatform: IGamblingSessionActionDataReceivedFromPlatform | IGamblingSessionActionDataReceivedFromPlatform[];\n\n try {\n actionsReceivedFromPlatform = JSON.parse(gamblingSessionActionEvent.MessageDataJson);\n } catch (err) {\n this.logger.error(`Failed to parse gambling session event MessageDataJson: ${gamblingSessionActionEvent.MessageDataJson}`, err);\n return;\n }\n\n if(!Check.isArray(actionsReceivedFromPlatform)) {\n actionsReceivedFromPlatform = [actionsReceivedFromPlatform];\n }\n\n for(let dataFromPlatform of actionsReceivedFromPlatform) {\n const dataToSend: IGamblingSessionActionData = {\n messageType: dataFromPlatform.MessageType,\n gamblingSessionId: dataFromPlatform.SessionId,\n sessionDurationInSeconds: dataFromPlatform.SessionDurationInSeconds,\n sessionTotalWins: dataFromPlatform.SessionTotalWins,\n sessionTotalBets: dataFromPlatform.SessionTotalBets,\n messageTimeStamp: dataFromPlatform.MessageTimeStamp,\n correlationID: dataFromPlatform.CorrelationID\n }\n Event.fire(SYSTEM_EVENTS.GAMBLING_SESSION_ACTION, dataToSend);\n }\n break;\n\n\n }\n });\n\n if (category){\n this.serviceFactory.firebaseElasticService().sendMessageUpdate(category, JSON.stringify(messages))\n }\n };\n\n private _updateRestrictions(data: IMessageData, restrictions: IRestrictionData[]) {\n let restrictionsByActions = [];\n restrictions.forEach((restriction) => {\n restriction.RestrictionsByAction.forEach((restrictionByAction)=> {\n restrictionsByActions.push(restrictionByAction);\n })\n });\n\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_UPDATERESTRICTION_RECEIVED, restrictionsByActions);\n \n //fire SYSTEM_EVENTS.GEO_RESTRICTIONS_UPDATE must happen after SYSTEM_EVENTS.SESSION_EVENT_UPDATERESTRICTION_RECEIVED\n Event.fire(SYSTEM_EVENTS.GEO_RESTRICTIONS_UPDATE, {KickReasonId: data?.ReasonID?.toString(), DetailedMessages: data?.TroubleshooterMessages, TroubleshooterRetry: Boolean(data?.TroubleshooterRetry)});\n\n\n }\n\n private _handleIntrusiveMessages(dataJsonArray: IntrusiveMessageData[]): void {\n //Seems like for this type of message we'll also get an array, like we do for toasters.\n if (!Check.isArray(dataJsonArray)) {\n dataJsonArray = [dataJsonArray];\n }\n\n dataJsonArray.forEach(dataJson => {\n this.serviceFactory.orbitComponentRenderService().showIntrusiveMessagePopup({\n title: dataJson.Title,\n text: dataJson.Text,\n buttonText: dataJson.ButtonText,\n correlationId: dataJson.CorrelationID\n });\n });\n }\n\n private _handleToasterTypeMessages(dataJsonArray: IMessageDataJson[]): void {\n\n if (!Check.isArray(dataJsonArray)) {\n dataJsonArray = [dataJsonArray];\n }\n\n const playerBurnoutMessages = [];\n const regularToasterMessages = [];\n\n dataJsonArray.forEach(dj => {\n if (this._isPlayerBurnoutMessage(dj)) {\n playerBurnoutMessages.push(dj);\n } else {\n regularToasterMessages.push(dj);\n }\n });\n\n //This comes as an array from Firebase, but in the burnout scenario\n // (where we can show only one animation at a given time),\n // I think it's correct to only consider the 1st one in the array\n if(playerBurnoutMessages.length > 0) {\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_PLAYER_BURNOUT_MESSAGE_RECEIVED, playerBurnoutMessages[0]);\n }\n\n if(regularToasterMessages.length > 0) {\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_RECEIVED_TOASTER, regularToasterMessages);\n }\n }\n\n private _isPlayerBurnoutMessage(dataJson: IMessageDataJson): boolean {\n return (dataJson.DisplayMode === MESSAGE_DISPLAY_MODE.ANIMATION &&\n dataJson.AnimationType === MESSAGE_ANIMATION_TYPE.BURNOUT)\n }\n\n private parseOmgMessage(data: IOMGReceivedData): IOMGParsedData {\n const omg: IOMGParsedData = {\n MessageDataJson: data.MessageDataJson,\n Messages: data.MessageData,\n OmgType: data.OmgType.toString(),\n OpenedWithinGame: data.DisplayInGame.toString() as OpenWithinGameType,\n };\n\n return omg;\n }\n\n private OMGFieldsValueChange(parsedMessage: IOMGParsedData) {\n if (!parsedMessage.MessageDataJson) {\n parsedMessage.OpenedWithinGame = '0';\n this.logger.debug('Doesnt get MessageDataJson field meaning that OMG is waiting messages type, OpenedWithinGame field is false');\n }\n }\n}\n","import FirebaseHandlerBase from \"../firebase_handler_base\";\nimport {ISubscriptionParams} from \"../firebase_const\";\nimport {SYSTEM_EVENTS} from \"../../../../events/events\";\nimport Event from '../../../../utils/event';\nimport {INetPositionGameTypeData, INPReceivedInfo} from \"./netposition_handler.interfaces\";\n\nexport default class NetPositionHandler extends FirebaseHandlerBase{\n static class: string = \"NetPositionHandler\";\n\n protected getSubscriptionParams(): ISubscriptionParams {\n return {\n eventName: 'casinoGamesNetPosition',\n successCallback: this._updateNetPosition\n };\n }\n\n protected getFeatureName(): string {\n return \"NetPosition\";\n }\n\n protected getFeatureLabel(): string {\n return \"NetPosition\";\n }\n\n protected getFallbackServiceName(): string{\n return null;\n }\n\n private _updateNetPosition = (collectionData: INPReceivedInfo[]) => {\n if(collectionData.length !== 0){\n const updatedGameTypes: INetPositionGameTypeData[] = collectionData.map(t => t.data);\n\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_NET_POSITION_UPDATE, updatedGameTypes);\n\n this.logger.debug('Firebase got net positions message. Parsed data: ' + JSON.stringify(updatedGameTypes));\n\n //Filter elastic Net position updates only for vip users, avoiding too much reporting\n const accountData = this.serviceFactory.userService().getAccountData();\n if (accountData && accountData.IsVip) {\n this.serviceFactory.firebaseElasticService().sendMessageUpdate(this.getFeatureLabel(), JSON.stringify(updatedGameTypes));\n }\n }\n }\n}","export const MESSAGES_SOURCE = {\n MAIN_PROXY: 'mainProxy',\n FIREBASE: 'firebase'\n}\nexport const KICK_TYPE = {\n FULL_KICK: '1',\n SOFT_KICK: '2'\n};\n\nexport const KICK_REASON = {\n // full kick\n KickUserAlreadyLoggedIn: '20',\n KickUserMobileLocation: '21',\n KickUserNoWiFi: '23',\n KickUserRDPDetected: '24',\n KickUserOutsideCountry: '25',\n KickUserTechProblem: '26',\n KickUserPluginNotInstalled: '27',\n KickUserPluginNotUpdated: '28',\n KickUserLocationProcessTimeOut: '29',\n KickUserWagerMobileFailed: '31',\n KickUserOptInError: '32',\n KickUserNetworkSwitch: '33',\n KickUserGCTimeout: '34',\n KickUserLocationDisabled: '35',\n KickUserKnownProxy: '36',\n KickUserRestrictedPlay: '50',\n KickUserPendingAction: '51',\n // soft kick\n KickUserDailyReached: '30',\n KickUserWeeklyReached: '39',\n KickUserMonthlyReached: '40',\n KickUserUkNightLimit: '60'\n};\n\nexport const KICK_REASONS = [\n KICK_REASON.KickUserAlreadyLoggedIn,\n KICK_REASON.KickUserMobileLocation,\n KICK_REASON.KickUserNoWiFi,\n KICK_REASON.KickUserRDPDetected,\n KICK_REASON.KickUserOutsideCountry,\n KICK_REASON.KickUserTechProblem,\n KICK_REASON.KickUserPluginNotInstalled,\n KICK_REASON.KickUserPluginNotUpdated,\n KICK_REASON.KickUserLocationProcessTimeOut,\n KICK_REASON.KickUserWagerMobileFailed,\n KICK_REASON.KickUserOptInError,\n KICK_REASON.KickUserNetworkSwitch,\n KICK_REASON.KickUserGCTimeout,\n KICK_REASON.KickUserLocationDisabled,\n KICK_REASON.KickUserKnownProxy,\n KICK_REASON.KickUserRestrictedPlay,\n KICK_REASON.KickUserPendingAction,\n KICK_REASON.KickUserDailyReached,\n KICK_REASON.KickUserWeeklyReached,\n KICK_REASON.KickUserMonthlyReached\n];\nexport const GEO_LOCATION_KICK_REASONS = [\n KICK_REASON.KickUserMobileLocation,\n KICK_REASON.KickUserNoWiFi,\n KICK_REASON.KickUserRDPDetected,\n KICK_REASON.KickUserOutsideCountry,\n KICK_REASON.KickUserTechProblem,\n KICK_REASON.KickUserPluginNotInstalled,\n KICK_REASON.KickUserPluginNotUpdated,\n KICK_REASON.KickUserLocationProcessTimeOut,\n KICK_REASON.KickUserWagerMobileFailed,\n KICK_REASON.KickUserOptInError,\n KICK_REASON.KickUserNetworkSwitch,\n KICK_REASON.KickUserGCTimeout,\n KICK_REASON.KickUserLocationDisabled,\n KICK_REASON.KickUserKnownProxy\n];","const PLAYER_EVENT_TYPES = {\n KICKED: 1,\n KICKED_TO_LOBBY: 2,\n RESTRICTION_UPDATED: 3,\n GEO_REQUIRED: 4,\n OMG: 100\n}\n\n\nexport {PLAYER_EVENT_TYPES}","import BaseObject from \"../../../base/base_object\";\nimport _ from \"../../../utils/underscore\";\n\nexport default class MainRestrictionParser extends BaseObject {\n parse(restrictionData) {\n let restriction = restrictionData.Restrictions;\n let restrictionsByAction = [];\n\n if (!restriction) {\n this.logger.info('Restriction key is not found in event data. There is no restrictions!');\n return [];\n }\n\n if (!restriction.RestrictionAction && !restriction.RestrictionActions) {\n this.logger.info('There is no restriction action / actions found in event data!');\n return [];\n }\n\n // single action\n if (restriction.RestrictionAction) {\n restrictionsByAction.push(this._formatToCGPRestrictionAction(restriction.RestrictionAction));\n }\n\n // multiple actions\n if (restriction.RestrictionActions) {\n restriction.RestrictionActions.forEach((action) => {\n let restrictionObj = this._formatToCGPRestrictionAction(action);\n restrictionsByAction.push(restrictionObj);\n });\n }\n\n return restrictionsByAction;\n }\n\n\n _formatToCGPRestrictionAction(restrictionAction) {\n let action = {\n ActionId: restrictionAction['@Id'],\n ActionName: restrictionAction['@Name'],\n };\n let entities = [];\n if (restrictionAction.Restriction) {\n // multiple entities\n if(_.isArray(restrictionAction.Restriction)) {\n restrictionAction.Restriction.forEach((restriction) => {\n entities.push(this._parseEntity(restriction));\n });\n } else {\n // single entity\n entities.push(this._parseEntity(restrictionAction.Restriction));\n }\n }\n // multiple entities\n if (restrictionAction.Restrictions && _.isArray(restrictionAction.Restrictions)) {\n restrictionAction.Restrictions.forEach((restriction) => {\n entities.push(this._parseEntity(restriction));\n });\n }\n\n action.Entities = entities;\n return action;\n }\n\n _parseEntity(restriction) {\n let entity = {\n EntityId: restriction['@EntityID'],\n EntityName: restriction['@EntityName'],\n Values: []\n };\n\n let restrictionValues = [];\n if (restriction.Value) {\n restrictionValues = _.isArray(restriction.Value) ? restriction.Value : [restriction.Value];\n }\n if (restriction.Values && _.isArray(restriction.Values)) {\n restrictionValues = restriction.Values;\n }\n restrictionValues.forEach((value) => {\n entity.Values.push(this._parseRestrictionValue(value));\n });\n\n return entity;\n }\n\n\n _parseRestrictionValue(restrictionValue) {\n return {\n ExpirationDate: restrictionValue['@ExpirationDate'],\n ReasonId: restrictionValue['@ReasonID'],\n SecondsToExpire: restrictionValue['@SecondsToExpire'],\n Value: restrictionValue['#text']\n }\n }\n}","import Event from \"../../../utils/event\";\nimport {SYSTEM_EVENTS} from \"../../../events/events\";\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport {PLAYER_EVENT_TYPES} from \"./main_proxy_consts\";\nimport _ from '../../../utils/underscore';\nimport BaseObject from \"../../../base/base_object\";\nimport {FALLBACK_HANDLERS} from \"../fallback/fallback_service_consts\";\nimport {KICK_TYPE} from \"../player_messages_consts\";\nimport MainRestrictionParser from \"./main_restriction_parser\";\n\n\nconst REFRESH_EVENTS_INTERVAL = 20;\n\nclass MainProxyStrategy extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'MainProxyStrategy';\n\n\n init(params) {\n super.init(params);\n this.serviceFactory = params.serviceFactory;\n this._uri = params.uri || '/cgpapi/playerEvents/getplayerevents';\n this._refreshInterval = params.refreshInterval || REFRESH_EVENTS_INTERVAL;\n this._omgVersion = params.omgVersion;\n this._subscribe();\n this.isConnected = true;\n // We need it because geo need to know that firebase is ready. so in case we don't use firebase as in NJ we need to told him that we ready. temporary until NJ will move also to firebase\n Event.fire(SYSTEM_EVENTS.PLAYER_MESSAGES_STRATEGY_READY);\n }\n\n isConnected = false;\n\n\n _subscribe() {\n Event.on(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, () => {\n Event.fire(SYSTEM_EVENTS.PLAYER_MESSAGES_STRATEGY_READY);\n this._onStateChanged(this.serviceFactory.oAuth2Service().isAuthorized());\n });\n Event.on(SYSTEM_EVENTS.ON_INIT_COMPLETE, () => {\n this._onStateChanged(this.serviceFactory.oAuth2Service().isAuthorized());\n });\n }\n\n _onStateChanged(isAuthorized) {\n if (this._intervalObserver) {\n this._intervalObserver.dispose();\n }\n if (isAuthorized) {\n // start fallback to wallet and FP\n this.serviceFactory.fallbackService().start(FALLBACK_HANDLERS.WALLET);\n this._intervalObserver = this.serviceFactory.observableFactoryService().fromInterval(TimeSpan.fromSeconds(this._refreshInterval))\n .forEach(() => {\n this._getPlayerMessages();\n });\n } else {\n // stop fallback and pulling\n this.serviceFactory.fallbackService().stop();\n }\n }\n\n\n _getPlayerMessages() {\n\n this.serviceFactory.http2Service().post(this._uri)\n .then((response) => {\n this.logger.debug('Received Player Events', JSON.stringify(response));\n this._readPlayerEvents(response.Events);\n })\n .catch((error) => {\n this.logger.error(error);\n });\n }\n\n _readPlayerEvents(playerEventsMessage) {\n // handle PlayerEvents\n if (!playerEventsMessage) {\n this.logger.error('Player events data is null or undefined');\n return;\n } else {\n this._handlePlayerEvents(playerEventsMessage)\n }\n }\n\n\n _handlePlayerEvents(playerEvents) {\n if (!_.isArray(playerEvents) || playerEvents.length === 0) {\n this.logger.debug('There is no Player events to handle. PlayerEvents data is empty');\n return;\n }\n\n playerEvents.forEach((playerEvent) => {\n this._handlePlayerEvent(playerEvent);\n });\n }\n\n _handlePlayerEvent(playerEvent) {\n let eventType = playerEvent.EventType;\n let eventData = _.safeJSON(playerEvent.EventDataJson);\n if (!eventData) {\n this.logger.error(`EventData property is null or undefined!`);\n return;\n }\n switch (eventType) {\n case PLAYER_EVENT_TYPES.KICKED:\n this._onKickReceived(eventData);\n return;\n case PLAYER_EVENT_TYPES.KICKED_TO_LOBBY:\n // N/A\n return;\n case PLAYER_EVENT_TYPES.GEO_REQUIRED:\n this._onGeoReceived(eventData);\n return;\n case PLAYER_EVENT_TYPES.RESTRICTION_UPDATED:\n this._onRestrictionReceived(eventData);\n return;\n case PLAYER_EVENT_TYPES.OMG:\n this._onOMGReceived(eventData);\n return;\n default:\n this.logger.error(`Invalid player event type ${eventType} in event ${JSON.stringify(playerEvent)}`);\n return;\n }\n }\n\n\n _onKickReceived(data) {\n this.logger.info('Player event KICK received', JSON.stringify(data));\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_KICK, {KickType: KICK_TYPE.FULL_KICK, KickReasonId: data.KickReasonId + ''});\n }\n\n _onGeoReceived(data) {\n this.logger.info('Player event GEO received', JSON.stringify(data));\n Event.fire(SYSTEM_EVENTS.GEO_PERIODIC_UPDATE, {\n mobileNumber: data.Mobile,\n licenseKey: data.GeoComplyLicense,\n locationTransactionId: data.LocationTransactionId\n });\n }\n\n\n _onRestrictionReceived(data) {\n this.logger.info('Player event RESTRICTION UPDATE received', JSON.stringify(data));\n let parser = MainRestrictionParser.create();\n let restrictions = parser.parse(data);\n\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_UPDATERESTRICTION_RECEIVED, restrictions);\n\n //fire SYSTEM_EVENTS.GEO_RESTRICTIONS_UPDATE must happen after SYSTEM_EVENTS.SESSION_EVENT_UPDATERESTRICTION_RECEIVED\n Event.fire(SYSTEM_EVENTS.GEO_RESTRICTIONS_UPDATE, {KickReasonId: data?.KickReason?.toString(), DetailedMessages: data?.TroubleshooterMessages, TroubleshooterRetry: false});\n\n\n }\n \n _onOMGReceived(data) {\n this.logger.info('Player event OMG received', JSON.stringify(data));\n if (!this._isOMGCanBeDisplayed(data)) {\n this.logger.info('OMG can not be displayed because of OMG version is higher than supported one!');\n return;\n }\n\n if (data.OmgType === 2 || data.OmgType === 3) {\n this.logger.error(`Unsupported OMG type ${data.OmgType} received. Stop handle OMG message!`);\n return;\n }\n\n // standard OMG message\n Event.fire(SYSTEM_EVENTS.SESSION_EVENT_OMG_RECEIVED, {\n Messages: data.SerializedMessagesDetails,\n OMGType: data.OmgType,\n OpenedWithinGame: data.DisplayInGame ? '1' : '0'\n });\n }\n\n\n _isOMGCanBeDisplayed(message) {\n return this._omgVersion >= message.SupportVersion;\n }\n}\n\nexport default MainProxyStrategy;","import BaseObject from \"../../../base/base_object\";\nimport Event, {SystemEventSubscription} from \"../../../utils/event\";\nimport {SYSTEM_EVENTS} from \"../../../events/events\";\nimport ServiceFactory from \"../../service_factory\";\nimport ReconnectHelper, {IReconnectHelper, IReconnectHelperParams, RetryItem} from \"../../../utils/reconnect_helper\";\nimport _ from \"../../../utils/underscore\";\nimport FirebaseHandlerBase from \"./firebase_handler_base\";\nimport {IBaseParams, IMessagesParams} from \"./firebase_const\";\nimport {ITokenResponse} from \"../../oauth/user/user_service_interface\";\nimport {Check} from \"@sparkware/app-utils\";\n\nexport interface IFirebaseParams {\n serviceFactory: ServiceFactory;\n libUrl: string;\n OMGConfig: IMessagesParams;\n FPConfig?: IBaseParams;\n reconnectionHelperFactory?: () => ReconnectHelper;\n forceFallback?: boolean;\n}\n\nexport const RETRY_INTERVALS: RetryItem[] = [\n {durationInSeconds:5, repeatTimes:3},\n {durationInSeconds:10, repeatTimes:3},\n {durationInSeconds:120, repeatTimes:0}\n];\n\nexport default class FirebaseStrategy extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = \"FirebaseStrategy\";\n\n private _firebaseConnectionFactory;\n private _firebaseConnection;\n private _initParams: IFirebaseParams;\n private _reconnectHelper: IReconnectHelper;\n private _firebaseHandlers: FirebaseHandlerBase[] = [];\n private _sendMonitoringRetriesNo: number[] = [];\n private _onOAuthStateChangedSubscription: SystemEventSubscription;\n private _onInitCompletedSubscription: SystemEventSubscription;\n isConnected = false;\n init(params: IFirebaseParams) {\n super.init(params);\n this._initParams = params;\n this.setKeyRetries();\n this._reconnectionHelperFactory = params.reconnectionHelperFactory || this._reconnectionHelperFactory;\n this._subscribeToInitComplete();\n }\n\n private _subscribeToInitComplete() {\n if (!this._onInitCompletedSubscription) {\n this._onInitCompletedSubscription = Event.on(SYSTEM_EVENTS.ON_INIT_COMPLETE, this._onInitComplete.bind(this), this);\n }\n }\n private _subscribeToOAuthStateChanged() {\n if (!this._onOAuthStateChangedSubscription) {\n this._onOAuthStateChangedSubscription = Event.on(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, this._onAuthStateChanged.bind(this), this);\n }\n }\n\n private _onInitComplete() {\n if (this._isAuthorized()) {\n this._getFirebaseAndConnect()\n .then(() => this._subscribeToOAuthStateChanged())\n .catch(() => this._subscribeToOAuthStateChanged());\n } else {\n this._subscribeToOAuthStateChanged();\n }\n }\n\n private _onAuthStateChanged() {\n if (this._isAuthorized()) {\n this._getFirebaseAndConnect()\n } else {\n this._disconnect();\n }\n }\n\n private async _getFirebaseAndConnect(): Promise {\n await this._initParams.serviceFactory.oAuth2Service().waitForAutologin();\n if (!this._firebaseConnectionFactory) {\n try {\n await this._loadTripleMessaging();\n this._firebaseConnectionFactory = this._getFirebaseConnectorFromWindow();\n } catch (err) {\n this._startFallbackService();\n throw err;\n }\n }\n this._startConnectFirebase();\n }\n\n private async _connectToFirebase(): Promise {\n let token;\n try {\n token = await this._getToken();\n this._initParams.serviceFactory.userService().setFirebaseLoginToken(token.token);\n this._firebaseConnection = await this._firebaseConnectionFactory.createWithCallback(token.token, (data) => this._enhanceAndReportFirebaseSDKEvent(data), {});\n } catch (err) {\n this._sendFailMonitoring(err);\n if (this._reconnectHelper.getNumberOfRetries() === 2) {\n this._startFallbackService();\n }\n this.logger.warn('Connect to Firebase failed.', err);\n throw err;\n }\n\n\n Event.fire(SYSTEM_EVENTS.FIREBASE_GOT_NEW_TOKEN, {token: token.token});\n\n this._initParams.serviceFactory.fallbackService().stopAllButThis();\n this._subscribeToFirebaseEvents();\n this.isConnected = true;\n Event.fire(SYSTEM_EVENTS.PLAYER_MESSAGES_STRATEGY_READY);\n this.logger.info('Firebase CONNECTED');\n this._initParams.serviceFactory.firebaseElasticService().sendConnected();\n\n return true;\n }\n\n private _loadTripleMessaging():Promise{\n return this._initParams.serviceFactory.scriptLoaderService().loadScript({\n url: this._initParams.libUrl,\n tagId: \"triple8MessagingLibrary\"\n });\n }\n\n private _getFirebaseConnectorFromWindow(){\n return this._initParams.serviceFactory.windowService().getGlobalProperty('triple8Messaging');\n }\n\n private _subscribeToFirebaseEvents() {\n this._firebaseHandlers = this._readHandlers();\n }\n\n private _readHandlers(): FirebaseHandlerBase[] {\n const context = require.context('./handlers/', true, /^.*(handler)\\.[jt]s$/);\n return context.keys().map(context).map((moduleExport: any) => {\n return moduleExport.default.create({\n firebaseMessaging: this._firebaseConnection,\n config: this._initParams\n });\n });\n }\n\n private _getToken():Promise {\n return this._initParams.serviceFactory.userService().renewLoginToken({\n TargetType: 4,\n TargetTypeValue: \"firebase\"\n });\n }\n\n private _disconnect() {\n if (this._firebaseConnectionFactory) {\n if (_.isFunction(this._firebaseConnectionFactory.logOut)) {\n this._firebaseConnectionFactory.logOut();\n } else {\n this._firebaseHandlers.forEach(h => h.unsubscribe());\n }\n }\n\n this.isConnected = false;\n this._firebaseConnection = null;\n this._removeReconnectHelper();\n this.logger.info('Firebase DISCONNECTED');\n\n }\n\n private _isAuthorized() {\n return this._initParams.serviceFactory.oAuth2Service().isAuthorized();\n }\n\n //// RECONNECT HELPER\n\n private _reconnectionHelperFactory(params: IReconnectHelperParams): IReconnectHelper {\n return ReconnectHelper.create(params);\n }\n\n private _startConnectFirebase() {\n this._removeReconnectHelper();\n if (!this._reconnectHelper) {\n this._reconnectHelper = this._createReconnectionHelper();\n }\n this._reconnectHelper.start();\n }\n\n private _createReconnectionHelper() {\n return this._reconnectionHelperFactory({\n retryFunc: () => this._connectToFirebase(),\n retryIntervals: RETRY_INTERVALS,\n name: 'FIREBASE',\n });\n }\n\n private _removeReconnectHelper() {\n if (!_.isNullOrUndefined(this._reconnectHelper)) {\n this._reconnectHelper.stop();\n this._reconnectHelper = null;\n }\n }\n\n private _startFallbackService() {\n this._initParams.serviceFactory.fallbackService().start();\n this.logger.info('Firebase Connection Fail, start Fallback Service');\n this._initParams.serviceFactory.firebaseElasticService().sendFallbackStarted(\"All\")\n }\n\n private _sendFailMonitoring(err: any) {\n if (this._sendMonitoringRetriesNo.includes(this._reconnectHelper.getNumberOfRetries())) {\n this._initParams.serviceFactory.firebaseElasticService().sendConnectionFailed(this._reconnectHelper.getNumberOfRetries() + 1, JSON.stringify(err))\n }\n }\n\n private setKeyRetries() {\n let crt = 0;\n this._sendMonitoringRetriesNo = [crt];\n for (const interval of RETRY_INTERVALS) {\n if (interval.repeatTimes !== 0) {\n crt += interval.repeatTimes;\n this._sendMonitoringRetriesNo.push(crt);\n }\n }\n }\n\n private _enhanceAndReportFirebaseSDKEvent(data) {\n try {\n if(!Check.isObject(data)){\n console.log(\"Failed on call to _enhanceAndReportEvent. The data parameter is not an object\");\n return;\n }\n\n if(!data[\"eventHeader\"] || !Check.isObject(data[\"eventHeader\"])){\n console.log(\"Failed on call to _enhanceAndReportEvent. The data object does not contain a valid eventHeader object\");\n return;\n }\n Object.assign(data[\"eventHeader\"],{target:\"platform-firebase\"});\n\n const sessionData = {\n globalSessionID: this._initParams.serviceFactory.oAuth2Service().getToken().initialSessionId,\n playerSessionID: this._initParams.serviceFactory.oAuth2Service().getToken().sessionId\n }\n const userData = {\n cid: this._initParams.serviceFactory.userService().getCID(),\n brand: this._initParams.serviceFactory.skinService().getBrandName(),\n brandId: this._initParams.serviceFactory.skinService().getBrandID()\n }\n const bakedEvent = Object.assign({userData:userData,sessionData:sessionData},data);\n const storageUrl = this._initParams.serviceFactory.configService().getConfig().StructuredLogging.storageUrl;\n this._initParams.serviceFactory.http2Service().postJSON(storageUrl, {body : bakedEvent,keepalive : true});\n }\n catch (err) {\n console.log(\"Failed on call to _enhanceAndReportEvent. Error: \" + err);\n }\n }\n}","import BaseObject from \"../../base/base_object\";\nimport {MESSAGES_SOURCE} from \"./player_messages_consts\";\nimport MainProxyStrategy from './main/main_proxy_strategy';\nimport FirebaseStrategy from \"./firebase/firebase_strategy\";\n\nexport default class PlayerMessagesFactory extends BaseObject {\n static CLASS = 'PlayerMessagesFactory';\n\n createMessageSourceComponent(source, sourceParams, dependensies) {\n let component;\n switch (source) {\n case MESSAGES_SOURCE.FIREBASE:\n component = FirebaseStrategy.create(Object.assign({}, sourceParams.Firebase, dependensies));\n break;\n case MESSAGES_SOURCE.MAIN_PROXY:\n component = MainProxyStrategy.create(Object.assign({}, sourceParams.MainProxy, dependensies));\n break;\n default:\n component = FirebaseStrategy.create(Object.assign({}, sourceParams.Firebase, dependensies));\n component.start();\n break;\n }\n\n return component;\n }\n\n\n}","import BaseService from \"../../base/base_service\";\nimport PlayerMessagesFactory from \"./player_messages_factory\";\n\nclass PlayerMessagesService extends BaseService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'PlayerMessagesService';\n\n _activeMessageSource;\n\n _source = null;\n _sourceInitParams = null;\n\n\n\n init(params) {\n super.init(params);\n if (params) {\n this._source = params.source;\n this._sourceInitParams = {\n MainProxy: params.MainProxy,\n Firebase: params.Firebase\n };\n this._dependenciesFactory = params.dependenciesFactory || PlayerMessagesFactory.create();\n }\n }\n\n doAsyncJobs() {\n this._activateMessagesSourceService();\n return Promise.resolve();\n }\n\n get isConnected() {\n if(!this._activeMessageSource) {\n return false;\n }\n\n if(!this.serviceFactory.oAuth2Service().isAuthorized()) {\n return false;\n }\n\n return this._activeMessageSource.isConnected;\n }\n\n _activateMessagesSourceService() {\n this._activeMessageSource = this._dependenciesFactory.createMessageSourceComponent(this._source, this._sourceInitParams, {serviceFactory: this.serviceFactory})\n }\n\n getClientPlatformVersion() {\n return this._activeMessageSource && this._activeMessageSource.getClientPlatformVersion();\n }\n\n getMessageStrategy() {\n return this._activeMessageSource;\n }\n\n\n}\n\nexport default PlayerMessagesService;","import BaseService from '../../base/base_service';\nimport DOM from '../../utils/dom';\nimport Event from '../../utils/event';\nimport {SYSTEM_EVENTS} from '../../events/events';\n\nclass PostMessageService extends BaseService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'PostMessageService';\n\n\n /**\n *\n * @param params\n */\n init(params) {\n super.init(params);\n\n this._onListenEvent();\n }\n\n\n /**\n * Getting the post message object, and should get in the event.data a function name\n * And the listener should redirect and fire the specifiec function if it exist in the\n * Post messages.\n *\n * @param postEvent\n * @public\n */\n listener(postEvent) {\n if (!postEvent) {\n this.logger.error('The incoming event in undefined');\n return;\n }\n\n this.logger.debug(postEvent);\n Event.fire(SYSTEM_EVENTS.POST_MESSAGE_ARRIVE, postEvent);\n }\n\n\n /**\n * Listen to the message event, and when it kick in the listener function should fire.\n *\n * @private\n */\n _onListenEvent() {\n if (window.addEventListener) {\n DOM.addEventListener(window, 'message', this.listener.bind(this), false);\n } else {\n // IE shits..\n window.attachEvent('onmessage', this.listener.bind(this));\n }\n }\n\n\n /**\n * Send post message\n */\n sendPostMessage(targetWindow, message = {}, targetOrigin = \"*\"){\n this.logger.info('Send post message', message);\n targetWindow.postMessage(message, targetOrigin);\n }\n}\n\n\nexport default PostMessageService;","import BaseService from '../../base/base_service';\nimport _ from '../../utils/underscore';\nimport Event from '../../utils/event';\nimport {SYSTEM_EVENTS} from '../../events/events';\nimport {Check, TimeSpan} from \"@sparkware/app-utils\";\nimport Store from '../../utils/store';\nimport {TokenType} from \"../../../../common/const/token_type\";\nimport MIGRATION from \"../../../../common/const/migration_consts\";\n\n\nconst EMPTY = '';\n\nclass QueryStringDetectorService extends BaseService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'QueryStringDetectorService';\n\n _handlersMap = null;\n\n /**\n * Initialize query string detector service.\n *\n * @param params\n */\n init(params) {\n super.init(params);\n this.onPageLoadCGP();\n }\n\n\n /**\n * On page load cgp for handling.\n *\n * @returns {QueryStringDetectorService}\n */\n onPageLoadCGP() {\n this.onSystemEvent(SYSTEM_EVENTS.ON_ORBIT_INIT_COMPLETE, () => {\n let queryStringParams = _.getQueryParameters();\n Object.keys(queryStringParams).forEach((queryParamName) => {\n if (EMPTY === queryParamName) {\n return;\n }\n\n let handler = this._getQueryHandler(queryParamName);\n\n if (_.isFunction(handler)) {\n handler.call(this, queryStringParams);\n }\n });\n\n // we subscribe to this only after all handlers run becasue if we have autologin it will logout and login the user.\n this.onSystemEvent(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, () => {\n if(!this.serviceFactory.oAuth2Service().isAuthorized()) {\n this._clearStore();\n }\n });\n });\n\n return this;\n }\n\n isInAutologin() {\n return !_.isEmpty(this._getTokenWithType(_.getQueryParameters())?.token);\n }\n\n _initializeHandlersMap() {\n this._handlersMap = {\n [this._autologinParameterName()]: this.tokenHandler,\n [MIGRATION.MIGRATION_TOKEN_QUERY_PARAM]: this.tokenHandler,\n reason: this.reasonHandler,\n sourcesubbrand: this.sourceSubBrandHandler,\n linkid: this.linkIDHandler,\n sourceproductpackage: this.sourceProductPackageHandler,\n clientversion:this.clientVersionHandler,\n specificnavigation: this.specificNavigationHandler\n };\n }\n\n /**\n *\n * @param queryParamName\n * @returns {*}\n * @private\n */\n _getQueryHandler(queryParamName) {\n queryParamName = queryParamName.toLowerCase();\n\n if(!this._handlersMap) {\n this._initializeHandlersMap();\n }\n\n return this._handlersMap[queryParamName];\n }\n\n _autologinParameterName() {\n return this.serviceFactory.oAuth2Service().getAutologinKey().toLowerCase();\n }\n\n /**\n * Reason handler.\n *\n * @param reason\n */\n reasonHandler(queryStringParams) {\n let reason = this._getQueryParamValue(queryStringParams,'reason');\n this.serviceFactory.gameReasonService().handleReason(reason);\n }\n\n _clearStore() {\n Store.del(['linkID', 'sourceProductPackage','sourceSubBrand', 'specificNavigation']);\n }\n\n _sendAnalytics(label, value) {\n let analyticsData = {\n category: '[Technical-event]',\n action: 'QueryDetector',\n label: label,\n value: value\n };\n\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, analyticsData);\n }\n\n\n sourceProductPackageHandler(queryStringParams) {\n let sourceProductPackage = this._getQueryParamValue(queryStringParams, 'sourceProductPackage');\n Store.set('sourceProductPackage', sourceProductPackage);\n }\n\n clientVersionHandler(queryStringParams) {\n let clientVersion = this._getQueryParamValue(queryStringParams, 'ClientVersion');\n Store.set('ClientVersion', clientVersion);\n }\n\n sourceSubBrandHandler(queryStringParams) {\n let sourceSubBrand = this._getQueryParamValue(queryStringParams, 'sourceSubBrand');\n Store.set('sourceSubBrand', sourceSubBrand);\n }\n\n linkIDHandler(queryStringParams) {\n let linkID = this._getQueryParamValue(queryStringParams, 'linkID');\n Store.set('linkID', linkID);\n }\n\n _getAutologinToken(queryStringParams) {\n return this._getQueryParamValue(queryStringParams, this._autologinParameterName());\n }\n\n _getAutoLoginMigrationToken(queryStringParams) {\n if(MIGRATION.MIGRATION_SOURCE_QUERY_PARAM_VALUE !== this._getQueryParamValue(queryStringParams, MIGRATION.MIGRATION_SOURCE_QUERY_PARAM)?.toLowerCase()) {\n return null;\n }\n\n return this._getQueryParamValue(queryStringParams, MIGRATION.MIGRATION_TOKEN_QUERY_PARAM);\n }\n\n _getTokenWithType(queryStringParams) {\n const migrationTokenValue = this._getAutoLoginMigrationToken(queryStringParams);\n\n if (!Check.isEmpty(migrationTokenValue)) {\n //We need to know whether the client was loaded with a migration token for analytics purposes.\n window.sessionStorage.setItem(MIGRATION.LOADED_WITH_MIGRATION_TOKEN_SESSION_STORAGE_KEY, \"true\");\n\n const result = {\n token: migrationTokenValue,\n tokenType: TokenType.MigrationToken,\n\n };\n\n const corrId = this._getQueryParamValue(queryStringParams, MIGRATION.BUSINESS_CORRELATION_ID_QUERY_PARAM);\n if(corrId) {\n result.businessCorrelationId = corrId;\n }\n\n return result;\n }\n\n return {\n token: this._getAutologinToken(queryStringParams),\n tokenType: TokenType.AuthenticationToken\n };\n }\n\n /**\n *\n * @param queryStringParams\n */\n tokenHandler(queryStringParams) {\n let {token, tokenType, businessCorrelationId } = this._getTokenWithType(queryStringParams);\n let sessionTimerOffset = this._extractSessionTimerOffset(queryStringParams);\n let sourceProductPackage = this._getQueryParamValue(queryStringParams, 'sourceProductPackage');\n let brandId = this._getQueryParamValue(queryStringParams, 'brandId');\n let sourceSubBrandId = this._getQueryParamValue(queryStringParams, 'sourceSubBrand');\n let targetSubBrandId = this._getQueryParamValue(queryStringParams, 'targetSubBrand');\n\n this.serviceFactory.oAuth2Service().runAutoLogin(token, sessionTimerOffset, sourceProductPackage, brandId, sourceSubBrandId, targetSubBrandId, tokenType, businessCorrelationId);\n }\n\n specificNavigationHandler(queryStringParams) {\n let specificNavigation = this._getQueryParamValue(queryStringParams, 'specificNavigation');\n\n Store.set('specificNavigation', specificNavigation);\n }\n\n getSourceSubBrand() {\n return Store.get('sourceSubBrand');\n }\n\n getExternalBrandCallbackURL() {\n if(!this._externalBrandCallbackURL) {\n this._parseSpecificNavigation();\n }\n\n return this._externalBrandCallbackURL;\n }\n\n getExternalBrandCallbackURLMethod() {\n if(!this._externalBrandCallbackURL) {\n this._parseSpecificNavigation();\n }\n\n return this._externalBrandCallbackURLMethod;\n }\n\n _parseSpecificNavigation() {\n let specificNavigationString = Store.get('specificNavigation');\n if(!specificNavigationString) {\n return;\n } else if (specificNavigationString.startsWith('http')) {\n this._externalBrandCallbackURL = specificNavigationString;\n } else {\n const specificNavigationDoc = _.parseXml(specificNavigationString);\n if (specificNavigationDoc) {\n const callbackUrlElems = specificNavigationDoc.getElementsByTagName(\"CallBackURL\");\n if (callbackUrlElems && callbackUrlElems.length) {\n this._externalBrandCallbackURL = callbackUrlElems.item(0).textContent;\n }\n\n const callbackMethodElems = specificNavigationDoc.getElementsByTagName(\"callbackMethod\");\n if (callbackMethodElems && callbackMethodElems.length) {\n this._externalBrandCallbackURLMethod = callbackMethodElems.item(0).textContent;\n }\n }\n }\n }\n\n _getQueryParamValue(queryStringParams, paramName) {\n paramName = paramName.toLowerCase();\n let keys = Object.keys(queryStringParams);\n\n for (let i = 0; i < keys.length; i++) {\n if (keys[i].toLowerCase() === paramName) {\n return queryStringParams[keys[i]];\n }\n }\n\n return null;\n }\n\n _extractSessionTimerOffset(queryStringParams) {\n let sessionTimerOffset = this._getQueryParamValue(queryStringParams, 'sessionTimer');\n try {\n if (sessionTimerOffset) {\n return TimeSpan.fromSeconds(sessionTimerOffset);\n }\n } catch (err) {\n this.logger.error(`Failed to parse sessionTimer from the query params! sessionTimer=${sessionTimerOffset}; Error: ${err}`);\n }\n\n return null;\n }\n}\n\n\nexport default QueryStringDetectorService;","import _ from '../../utils/underscore'; // eslint-disable-line id-length\nimport Event from '../../utils/event';\nimport BaseService from '../../base/base_service';\nimport { SYSTEM_EVENTS } from '../../events/events';\nimport IRecentlyPlayedService from './recently_played_service_interface';\nimport Store from \"../../utils/store\";\n\nconst RECENTLY_PLAYED_LOCAL_STORAGE_KEY= \"recently_played_games\";\n\nclass RecentlyPlayedService extends BaseService implements IRecentlyPlayedService{\n\n static CLASS: string = 'RecentlyPlayedService';\n\n //Internal copy of the recently played games list\n private _recentlyPlayedList: number[] = [];\n private _lastUpdateTime: number = null;\n private _refreshInterval: number = 10000;\n\n init(params) {\n super.init(params);\n this._subscribe();\n }\n\n //closeGame from GameManagerService triggers this update MANUALLY ( only if the game was in real mode ) since there is no event for this !!!\n private _subscribe(): void {\n this.onSystemEvent(SYSTEM_EVENTS.ON_ORBIT_INIT_COMPLETE, this._onOrbitInitComplete);\n this.onSystemEvent(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, this._updateRecentlyPlayedGames);\n this.onSystemEvent(SYSTEM_EVENTS.CLOSE_GAME, (data)=> {this._onCloseGame(data.gameType)});\n }\n\n private _isUpdateRequired(newTime: number): boolean {\n return _.isNull(this._lastUpdateTime) || newTime - this._lastUpdateTime >= this._refreshInterval;\n }\n\n //Getter for the internal games list -< will result in an update call if the list is undefined\n public getRecentlyPlayedList(): Promise {\n if (_.isEmpty(this._recentlyPlayedList) || this._isUpdateRequired(new Date().getTime())) {\n return this._updateRecentlyPlayedGames();\n }\n return Promise.resolve(this._recentlyPlayedList || []);\n }\n\n private _onCloseGame(gameType: number): void {\n if(!this._isAuthorized()) {\n return;\n }\n\n let recentlyPlayedListCopy = [...this._recentlyPlayedList];\n let gameTypeIndexInList = recentlyPlayedListCopy.indexOf(gameType);\n if(gameTypeIndexInList !== -1) {\n recentlyPlayedListCopy.splice(gameTypeIndexInList, 1);\n }\n\n recentlyPlayedListCopy.unshift(gameType);\n this._fireUpdateEvent(recentlyPlayedListCopy);\n }\n\n private _onOrbitInitComplete() {\n const recentlyPlayedFromLocalStorage = Store.get(RECENTLY_PLAYED_LOCAL_STORAGE_KEY);\n if(recentlyPlayedFromLocalStorage) {\n this._recentlyPlayedList = recentlyPlayedFromLocalStorage.split(\",\")?.map(Number);\n this._fireUpdateEvent(this._recentlyPlayedList);\n }\n }\n\n private _updateRecentlyPlayedGames(): Promise {\n if (!this._isAuthorized()) {\n return Promise.resolve(this._recentlyPlayedList || []);\n }\n\n return this._getRecentlyPlayedFromServer().then(recentlyPlayedList => {\n this._fireUpdateEvent(recentlyPlayedList);\n return this._recentlyPlayedList;\n });\n }\n\n private _getRecentlyPlayedFromServer(): Promise {\n return this.serviceFactory.historyService().getRecentlyPlayed()\n .then(data => {\n return data.gameTypes || [];\n })\n .then(recentlyPlayedGames => {\n return this._filterRestrictedGames(recentlyPlayedGames);\n })\n .then(recentlyPlayedGamesFilterRestrictions => {\n return this._filterByLayout(recentlyPlayedGamesFilterRestrictions);\n }).catch(() => []);\n }\n\n //Updates the internal refference to the recently played list received from the server\n //Fires a RECENTLY_PLAYED_GAMES_UPDATED event to notify the system of the update\n private _fireUpdateEvent(recentlyPlayedList: number[]): void {\n this._lastUpdateTime = new Date().getTime();\n this._recentlyPlayedList = recentlyPlayedList;\n Event.fire(SYSTEM_EVENTS.RECENTLY_PLAYED_GAMES_UPDATED, this._recentlyPlayedList || []);\n Store.set(RECENTLY_PLAYED_LOCAL_STORAGE_KEY, this._recentlyPlayedList || []);\n }\n\n //Filters the recently games list according to IntegrationService and restrictions\n private _filterRestrictedGames(recentlyPlayedGameTypes): Promise {\n return this.serviceFactory.gamesInformationService().getAllGamesInfo()\n .then((gamesInfo) => {\n const result = [];\n for (const gameType of recentlyPlayedGameTypes) {\n if (gamesInfo[gameType]) {\n result.push(gameType);\n }\n }\n return result;\n });\n }\n\n private _isAuthorized(): boolean {\n return this.serviceFactory.oAuth2Service().isAuthorized();\n }\n\n private _filterByLayout(recentlyPlayedGameTypes: number[]): Promise {\n const result = this.serviceFactory.integrationService().filterInLayoutGames(recentlyPlayedGameTypes);\n if (result) {\n return result;\n }\n\n return Promise.resolve(recentlyPlayedGameTypes);\n }\n}\n\nexport default RecentlyPlayedService;","import BaseModelService from '../../base/base_model_service.ts';\nimport _ from '../../utils/underscore';\nimport * as RegulationConst from './regulation_const';\n\n\n/**\n *\n *\n *\n */\nclass RegulationModel extends BaseModelService {\n\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'RegulationModel';\n\n\n /**\n *\n * @param params\n */\n init(params) {\n if (params) {\n this\n ._setRegulationCode(params.code)\n ._setReminderIntervals(params)\n ._setTimeLimitPercentageReminder(params)\n ._setMaxDurationsInMinutesForMobile(params)\n ._setMaxDurationsInMinutesForPC(params)\n ._setLossLimitPercentages(params)\n ._setIntervalReminderInMinutes(params)\n ._setRestrictionPeriodsInMinutes(params)\n ._setSessionCooldownConfigData(params);\n }\n }\n\n\n /**\n * Set the regulation code as an private property.\n *\n * @param code\n * @returns {RegulationModel}\n * @private\n */\n _setRegulationCode(code) {\n this._regulationCode = RegulationConst.REGULATION_CODE_TYPES[code] || \"UK\";\n return this;\n }\n\n _reminderIntervals = [];\n\n _setReminderIntervals(params) {\n\n this._reminderIntervals = this._splitCommaSeparatedNumbers(params.reminderIntervals);\n\n return this;\n }\n\n\t_setTimeLimitPercentageReminder(params) {\n\n let value = this._extractRegulationSpecificConfig(params, 'TimeLimitPercentageReminder');\n\n if (!_.isNullOrUndefined(value)) {\n this._timeLimitPercentageReminder = value / 100;\n }\n\n return this;\n }\n\n _splitCommaSeparatedNumbers(commaSeparatedNumbers) {\n if(_.isNullOrUndefined(commaSeparatedNumbers)) {\n return null;\n }\n return commaSeparatedNumbers.split(',')\n .map(n => n.trim())\n .filter(n => n !== '')\n .map(n => n * 1)\n }\n\n _setMaxDurationsInMinutesForMobile(params) {\n this._maxDurationsInMinutesForMobile = this._splitCommaSeparatedNumbers(this._extractRegulationSpecificConfig(params, 'MaxDurationsInMinutesForMobile'));\n return this;\n }\n\n getMaxDurationsInMinutesForMobile() {\n return this._maxDurationsInMinutesForMobile;\n }\n\n _setMaxDurationsInMinutesForPC(params) {\n this._maxDurationsInMinutesForPC = this._splitCommaSeparatedNumbers(this._extractRegulationSpecificConfig(params, 'MaxDurationsInMinutesForPC'));\n return this;\n }\n\n getMaxDurationsInMinutesForPC() {\n return this._maxDurationsInMinutesForPC;\n }\n\n\n _setLossLimitPercentages(params) {\n this._lossLimitPercentages = this._splitCommaSeparatedNumbers(this._extractRegulationSpecificConfig(params, 'LossLimitPercentages'));\n return this;\n }\n\n getLossLimitPercentages() {\n return this._lossLimitPercentages;\n }\n\n _setIntervalReminderInMinutes(params) {\n this._intervalReminderInMinutes = this._splitCommaSeparatedNumbers(this._extractRegulationSpecificConfig(params, 'IntervalReminderInMinutes'));\n return this;\n }\n\n getIntervalReminderInMinutes() {\n return this._intervalReminderInMinutes;\n }\n\n _setRestrictionPeriodsInMinutes(params) {\n this._restrictionPeriodsInMinutes = this._splitCommaSeparatedNumbers(this._extractRegulationSpecificConfig(params, 'RestrictionPeriodsInMinutes'));\n return this;\n }\n\n getRestrictionPeriodsInMinutes() {\n return this._restrictionPeriodsInMinutes;\n }\n\n _setSessionCooldownConfigData(params) {\n this._sessionCooldownConfig = {\n cooldownTime: params.sessionCooldownTime || \"00:00:00\"\n };\n return this;\n }\n\n getSessionCooldownConfigData() {\n return this._sessionCooldownConfig;\n }\n\n _extractRegulationSpecificConfig(params, configName) {\n let regulationCode = RegulationConst.REGULATION_CODE_TYPES[params.code] || RegulationConst.REGULATION_CODE_TYPES['SPAIN'];\n let regulationParams = params[RegulationConst.REGULATION_NAMES[regulationCode]];\n\n if (_.isNullOrUndefined(regulationParams)) {\n return null;\n }\n\n return regulationParams[configName];\n }\n\n\n\tgetTimeLimitPercentageReminder() {\n return this._timeLimitPercentageReminder;\n }\n\n /**\n * Get the sequence combination for the current regulation.\n *\n * @returns {*}\n * @public\n */\n getSequence(type, regulation) {\n type = type.toUpperCase();\n\n return this._sequences[type] && this._sequences[type][regulation];\n }\n\n /**\n *\n * @returns (string)\n * @public\n */\n getReminderIntervals() {\n return this._reminderIntervals;\n }\n\n}\nexport default RegulationModel;","import BaseObject from \"../../../base/base_object\";\nimport Event, {SystemEventSubscription} from \"../../../utils/event\";\nimport {SYSTEM_EVENTS} from \"../../../events/events\";\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport ServiceFactory from \"../../service_factory\";\nimport {IObservableSubscription} from '../../../utils/observable';\nimport {IElasticEventData} from \"../../../../../common/interfaces/structured-logging-service-interface\";\n\nconst SESSION_TIMER_INCREMENT_INTERVAL = TimeSpan.fromSeconds(1);\nconst HEART_BEAT_INTERVAL = TimeSpan.fromMinutes(5);\n\n\ninterface SessionTimerLogicHelperParams {\n serviceFactory: ServiceFactory\n}\n\nexport default class SessionTimerLogicHelper extends BaseObject {\n static CLASS = 'SessionTimerLogicHelper';\n\n _sessionTime = TimeSpan.fromMinutes(0);\n _sessionTimerObservable: IObservableSubscription = null;\n _heartBeatObservable: IObservableSubscription = null;\n _serviceFactory: ServiceFactory;\n\n init(params: SessionTimerLogicHelperParams) {\n super.init(params);\n\n params = params || ({} as SessionTimerLogicHelperParams);\n this._serviceFactory = params.serviceFactory || ServiceFactory.create();\n\n }\n\n private _focusGainSubscription: SystemEventSubscription = null;\n _subscribe(): void {\n this._focusGainSubscription = Event.on(SYSTEM_EVENTS.WINDOW_FOCUS_GAIN, this._readSessionTimeFromServerAndLog, this);\n }\n\n _unsubscribe() : void {\n if (this._focusGainSubscription) {\n this._focusGainSubscription.off();\n this._focusGainSubscription = null;\n }\n }\n\n private _startInProgress = false;\n start(): void {\n if(this._startInProgress) {\n return;\n }\n\n this._startInProgress = true;\n if(this._sessionTimerObservable) {\n this.stop();\n }\n\n this._startHeartBeat();\n this._subscribe();\n this._readSessionTimeFromServer().then(() => {\n this._startSessionTime();\n }).finally(() => {\n this._startInProgress = false;\n });\n\n }\n\n stop(): void {\n this._stopHeartBeat();\n this._stopSessionTimer();\n }\n\n dispose(): void {\n this.stop();\n this._unsubscribe();\n this._sessionTime = TimeSpan.fromMinutes(0);\n }\n\n getSessionTime(): TimeSpan {\n return this._sessionTime;\n }\n\n private _readSessionTimeFromServerAndLog(){\n this._readSessionTimeFromServer(this._serviceFactory.regulationService().getSessionCooldownConfig().featureEnabled);\n }\n\n private _readSessionTimeFromServer(sendToLogs:boolean = false):Promise {\n return this._serviceFactory.oAuth2Service().getTimeSinceLogin().then(sessionTime => {\n let prevSessionTime = this._sessionTime;\n this._sessionTime = sessionTime;\n this._fireUpdateEvent();\n\n if(sendToLogs){\n const data: IElasticEventData = {\n CGPEventCategory: 'Debug',\n CGPEventAction: 'session_timer_update',\n CGPEventValue: prevSessionTime.totalSeconds + \"_\" + sessionTime.totalSeconds\n };\n this._serviceFactory.structuredLoggingService().getLogger(data).info();\n }\n\n });\n }\n\n private _startSessionTime() {\n this._sessionTimerObservable = this._serviceFactory.observableFactoryService().fromInterval(SESSION_TIMER_INCREMENT_INTERVAL.totalMilliseconds, 'SESSION_TIMER_INCREMENT_INTERVAL')\n .forEach(() => {\n this._sessionTime = this._sessionTime.add(SESSION_TIMER_INCREMENT_INTERVAL);\n this._fireUpdateEvent();\n });\n }\n\n private _stopSessionTimer() {\n if(this._sessionTimerObservable) {\n this._sessionTimerObservable.dispose();\n this._sessionTimerObservable = null;\n }\n }\n\n private _startHeartBeat() {\n this._heartBeatObservable = this._serviceFactory.observableFactoryService().fromInterval(HEART_BEAT_INTERVAL.totalMilliseconds, \"SESSION_TIMER_HEART_BEAT_INTERVAL\")\n .forEach(() => {\n this._readSessionTimeFromServer();\n });\n }\n\n private _stopHeartBeat() {\n if (this._heartBeatObservable) {\n this._heartBeatObservable.dispose();\n this._heartBeatObservable = null;\n }\n }\n\n private _fireUpdateEvent() {\n Event.fire(SYSTEM_EVENTS.SESSION_TIMER_UPDATE, {\n sessionTime: this._sessionTime\n });\n }\n}","import BaseObject from '../../../base/base_object';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport Event, {SystemEventSubscription} from '../../../utils/event';\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport ServiceFactory from '../../service_factory';\nimport {StartSessionTimerContext} from \"../regulations/base_regulation\";\n\ninterface GenericRealityCheckMessageHandlerParams {\n serviceFactory: ServiceFactory;\n handleRealityCheckMessageCallback: (TimeSpan, closedCallback?:Function) => void;\n realityCheckInterval: TimeSpan;\n context: StartSessionTimerContext\n}\n\nexport default class GenericRealityCheckMessageHandler extends BaseObject {\n static CLASS = 'GenericRealityCheckMessageHandler';\n\n protected _initParams: GenericRealityCheckMessageHandlerParams;\n init(params: GenericRealityCheckMessageHandlerParams) {\n super.init(params);\n this._initParams = params;\n this._subscribe();\n\n if(this._initParams.context === StartSessionTimerContext.OnLogin) {\n this._onOAuthStateChange();\n }\n }\n\n private SESSION_TIMER_UPDATE_SUBSCRIPTION: SystemEventSubscription = null;\n private OAUTH_STATE_CHANGE_SUBSCRIPTION: SystemEventSubscription = null;\n private _subscribe(): void {\n this.SESSION_TIMER_UPDATE_SUBSCRIPTION = Event.on(SYSTEM_EVENTS.SESSION_TIMER_UPDATE, this._onSessionTimerUpdate.bind(this), this);\n this.OAUTH_STATE_CHANGE_SUBSCRIPTION = Event.on(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, this._onOAuthStateChange.bind(this), this);\n }\n\n private _unsubscribe(): void {\n if (this.SESSION_TIMER_UPDATE_SUBSCRIPTION) {\n this.SESSION_TIMER_UPDATE_SUBSCRIPTION.off();\n }\n\n if(this.OAUTH_STATE_CHANGE_SUBSCRIPTION) {\n this.OAUTH_STATE_CHANGE_SUBSCRIPTION.off();\n }\n }\n\n dispose() {\n this._unsubscribe();\n this._lastRealityCheckMessageIndexShown = 0;\n }\n\n private _onOAuthStateChange(): void {\n let beforeValue = this._lastRealityCheckMessageIndexShown;\n this._lastRealityCheckMessageIndexShown = 0;\n this.logger.info('RealityCheck _onOAuthStateChange before and after set:'+beforeValue.toString() + \" \" + this._lastRealityCheckMessageIndexShown.toString());\n }\n\n private _inMem_lastRealityCheckMessageIndexShown = 0;\n\n protected set _lastRealityCheckMessageIndexShown(value) {\n this._inMem_lastRealityCheckMessageIndexShown = value\n }\n\n protected get _lastRealityCheckMessageIndexShown() {\n return this._inMem_lastRealityCheckMessageIndexShown;\n }\n\n protected _onSessionTimerUpdate(eventData: {sessionTime: TimeSpan}): void {\n if(!this._initParams.serviceFactory.oAuth2Service().isAuthorized()) {\n return;\n }\n\n let currentRealityCheckMessageIndexToBeShown = Math.floor(eventData.sessionTime.totalMilliseconds / this._initParams.realityCheckInterval.totalMilliseconds);\n\n if(this._lastRealityCheckMessageIndexShown < currentRealityCheckMessageIndexToBeShown) {\n this._initParams.handleRealityCheckMessageCallback(eventData.sessionTime);\n this._lastRealityCheckMessageIndexShown = currentRealityCheckMessageIndexToBeShown;\n }\n }\n}","import BaseObject from '../../../base/base_object';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport SessionTimerLogicHelper from \"../helpers/session_timer_logic_helper\";\nimport {CLOCK_LOCALIZATION} from \"../../clock/clock_service_consts\";\nimport ServiceFactory from '../../service_factory';\nimport GenericRealityCheckMessageHandler from '../helpers/generic_reality_check_message_handler';\nimport {GNWP_SOURCES} from \"../../../../../app-react/services/gnwp/gnwp-consts\";\nimport { GameChildishIconMode } from '../../../../../common/enums/game-childish-icon-mode.enum';\nimport { REGULATION_STATUS_ID_MAP } from '../regulation_const';\n\nexport enum StartSessionTimerContext {\n OnAppStartup,\n OnLogin\n}\n\nexport interface IAccountData {\n RegulationStatusId: number,\n IdVerificationStatus: number\n}\n\nexport interface BaseRegulationParams {\n serviceFactory: ServiceFactory,\n cssSuffix: string,\n realityCheckInterval: string\n}\n\nexport default class BaseRegulation extends BaseObject{\n\n static CLASS = 'BaseRegulation';\n\n protected init(params: BaseRegulationParams) {\n super.init(params);\n this.serviceFactory = params.serviceFactory;\n this.cssSuffix = params.cssSuffix;\n this._realityCheckInterval = this._parseRealityCheckInterval(params.realityCheckInterval);\n }\n\n protected serviceFactory: ServiceFactory;\n private cssSuffix: string;\n private _sessionTimerHandler: SessionTimerLogicHelper = null;\n private _realityCheckMessageHandler: GenericRealityCheckMessageHandler | null = null;\n\n private _parseRealityCheckInterval(interval) {\n let defaultValue = TimeSpan.fromHours(1);\n if(!interval) {\n return defaultValue;\n }\n try {\n let timeSpan = TimeSpan.parse(interval);\n timeSpan = new TimeSpan(timeSpan.days, timeSpan.hours, timeSpan.minutes, 0, 0);\n if (timeSpan.totalMinutes < 1) {\n return TimeSpan.fromMinutes(1);\n }\n\n return timeSpan;\n }\n catch (err) {\n this.logger.error('Failed to parse RealityCheckInterval ' + interval);\n return defaultValue;\n }\n }\n\n private _realityCheckInterval: TimeSpan;\n getRealityCheckInterval(): TimeSpan {\n if(this.realityCheckEnabled()) {\n return this._realityCheckInterval;\n } else {\n return TimeSpan.fromMilliseconds(0);\n }\n }\n\n updateRealityCheckInterval(realityCheckIntevalMin: number): Promise {\n /**\n * Normally, the user cannot modify or update the reality check interval\n * This method is implemented in Malta and UK Regulations, regulations that allow the user to set a desired interval\n */\n return Promise.resolve();\n }\n\n hybridNyxClosedButtonEnabled(){\n return false;\n }\n\n\n forceHideCloseButtonInMembership() {\n return false;\n }\n\n getRealityCheckIntervalExpectedByTheGame() {\n let interval = this.getRealityCheckInterval();\n return {\n timeSpan: interval,\n expectedValueByTheGame: Math.round(interval.totalMinutes)\n }\n }\n\n dispose() {\n if (this._realityCheckMessageHandler) {\n this._realityCheckMessageHandler.dispose();\n }\n\n if (this._sessionTimerHandler) {\n this._sessionTimerHandler.dispose();\n }\n }\n\n protected _getRealityCheckMessageHandler(context: StartSessionTimerContext): GenericRealityCheckMessageHandler | null {\n if (!this.realityCheckEnabled()) {\n return null;\n }\n\n return GenericRealityCheckMessageHandler.create({\n serviceFactory: this.serviceFactory,\n realityCheckInterval: this.getRealityCheckInterval(),\n handleRealityCheckMessageCallback: this._handleRealityCheckMessage.bind(this),\n context: context\n });\n }\n\n protected _handleRealityCheckMessage(sessionTimer: TimeSpan, confirmCallback?:Function): void {\n\n }\n\n showSessionBalanceInAboutBox(): boolean {\n return false;\n }\n\n showTempAccountMessage(): void {\n }\n\n protected sessionTimerEnabled(): boolean {\n return false;\n }\n\n sessionTimerVisible(): boolean {\n return false;\n }\n\n protected realityCheckEnabled(): boolean {\n return false;\n }\n\n showResponsibleIcons(): boolean {\n return false;\n }\n\n showAgeResponsibleGameInDetailedHistory(): boolean {\n return false;\n }\n\n showAgeResponsibleIconInGame(): boolean {\n return true;\n }\n\n getCurrentSessionTime(): TimeSpan {\n if (this._sessionTimerHandler) {\n return this._sessionTimerHandler.getSessionTime();\n }\n return TimeSpan.fromMinutes(0);\n }\n\n\n getCssSuffix(): string {\n return this.cssSuffix;\n }\n\n startSessionTimer(context: StartSessionTimerContext): void {\n if (this.sessionTimerEnabled()) {\n\n if(!this._sessionTimerHandler) {\n this._sessionTimerHandler = SessionTimerLogicHelper.create();\n }\n\n if(this._realityCheckMessageHandler) {\n this._realityCheckMessageHandler.dispose();\n }\n\n this._realityCheckMessageHandler = this._getRealityCheckMessageHandler(context)\n\n\n this._sessionTimerHandler.start();\n }\n }\n\n\n stopSessionTimer(): void {\n if(this._realityCheckMessageHandler) {\n this._realityCheckMessageHandler.dispose();\n }\n\n if(this._sessionTimerHandler) {\n this._sessionTimerHandler.dispose();\n this._sessionTimerHandler = null;\n }\n }\n\n onKickEvent(kickParams): void {\n\n }\n\n\n openLimits(): void {\n\n }\n\n showLoginMessage(): Promise {\n return Promise.resolve();\n }\n\n showLogoutMessage(): void {}\n\n getClockLocalization(): string {\n return CLOCK_LOCALIZATION.LOCAL;\n }\n\n getErrorMessage(errorCode: number): string {\n return this.serviceFactory.languageService().translation(errorCode.toString());\n }\n\n isAnonymousPlayAllowed(): boolean {\n return true;\n }\n\n forceDemoButton(): boolean {\n return false;\n }\n\n supportWithdrawOnlyFromReal(): boolean {\n return true;\n }\n\n shouldPreventMoreThanOneOpenGame(): boolean {\n return true;\n }\n\n getTempAccountGnwpSource() {\n return GNWP_SOURCES.CASHIER;\n }\n\n postLoginActionsArePassed() {\n return true;\n }\n\n showHelpInAboutWindow() {\n return true;\n }\n\n isSessionCooldownEnabled(): boolean {\n return false;\n }\n\n showNetPosition(): boolean {\n return false;\n }\n\n overrideCurrencySymbol(): null | string {\n return null;\n }\n\n displayPopUpRatingAfterGame(): boolean {\n return true;\n }\n\n displayPopUpRatingAfterLogin(): boolean {\n return true;\n }\n\n\n shouldShowPlayerLimitsToaster(): boolean {\n return false;\n }\n\n checkIfCorrectAppInUse(country:string, state: string) {\n\n }\n\n shouldCallCountryByIP(country:string) {\n return false;\n }\n\n runConditionsBeforeOpenLink(source: string):Promise {\n return Promise.resolve();\n }\n\n fitToPlayModeEnabled(): boolean {\n return false;\n }\n\n stepsBeforeOpenLoginAndRegistration():Promise {\n return Promise.resolve();\n }\n\n getAgeResponsibleGamingLabel(): string | null {\n return null;\n }\n\n shouldRefreshTokenOnAppOpen() {\n return true;\n }\n\n showNightLimitMessage(nightLimitExpirationDate: Date) {\n\n }\n\n isLoginPopupEnabled(): boolean {\n return false;\n }\n\n isDeviceDetectionEnabled() : boolean {\n return false;\n }\n\n gameIconAnimationsAllowed() {\n return true;\n }\n\n protected isVerifiedForRegulation(): boolean {\n const userAccountData = this.serviceFactory.userService().getAccountData() as IAccountData;\n \n return userAccountData.RegulationStatusId === REGULATION_STATUS_ID_MAP.APPROVED_FOR_REGULATION;\n }\n \n getChildishIconMode(): GameChildishIconMode {\n return GameChildishIconMode.UseDefaultIcon;\n }\n}","import BaseRegulation from './base_regulation';\n\nclass DefaultRegulation extends BaseRegulation {\n\n\tstatic CLASS = 'DefaultRegulation';\n\n\tinit(params) {\n\t\tsuper.init(params);\n\t}\n\n}\n\nexport default DefaultRegulation;","import BaseObject from \"../../../base/base_object\";\nimport _ from \"../../../utils/underscore\";\nimport ServiceFactory from \"../../service_factory\";\nimport {TEMP_ACCOUNT_STATUS} from \"../../../../../common/const/temp_account_status\";\n\nexport default class TempAccountMessageRegulationHelper extends BaseObject {\n\n _serviceFactory: ServiceFactory = null;\n\n init(params) {\n super.init(params);\n params = params || {};\n if(!params.serviceFactory) {\n this.throwArgumentExpected('14', 'init', 'serviceFactory');\n }\n\n this._serviceFactory = params.serviceFactory;\n }\n\n _getDefaultAccountStatus() {\n const daysLeft = this._serviceFactory.userService().getAccountData().DaysToUploadDocument;\n if (_.isNullOrUndefined(daysLeft) || 0 > daysLeft)\n return {\n status: TEMP_ACCOUNT_STATUS.APPROVED\n };\n else {\n return {\n status: TEMP_ACCOUNT_STATUS.DOCUMENTS_NOT_RECEIVED,\n daysLeft: daysLeft\n };\n }\n }\n\n showTempAccountMessage(params) {\n const languageService = this._serviceFactory.languageService();\n const oauthService = this._serviceFactory.oAuth2Service();\n\n if (!oauthService.isAuthorized()) {\n return;\n }\n\n let tempAccountParams;\n if (!_.isNullOrUndefined(params.paramsFunc)) {\n tempAccountParams = params.paramsFunc.call();\n } else {\n tempAccountParams = Object.assign({}, this._getDefaultAccountStatus(), params);\n }\n if (tempAccountParams && tempAccountParams.status === TEMP_ACCOUNT_STATUS.APPROVED) {\n return;\n }\n\n this._serviceFactory.orbitComponentRenderService().showTempAccountPopup({\n status: tempAccountParams?.status,\n daysLeft: (tempAccountParams.hideDaysLeft || tempAccountParams?.status !== TEMP_ACCOUNT_STATUS.DOCUMENTS_NOT_RECEIVED) ? null : tempAccountParams.daysLeft,\n bodyText: languageService.translation(tempAccountParams?.messageKey),\n footerText: tempAccountParams?.footerMessageKey ? this._serviceFactory.languageService().translation(tempAccountParams?.footerMessageKey) : \"\"\n });\n }\n}\n","import BaseRegulation from '../base_regulation';\nimport TempAccountMessageRegulationHelper from '../../helpers/temp_account_message_helper';\nimport { GNWP_SOURCES } from '../../../../../../app-react/services/gnwp/gnwp-consts';\n\nclass ItalyRegulation extends BaseRegulation {\n\n\tstatic CLASS = 'ItalyRegulation';\n\n\n\t/**\n\t *\n\t * @param params\n\t */\n\tinit(params) {\n\t\tsuper.init(params);\n\t\tthis._tempAccountMessageHelper = params.tempAccountMessageHelper || TempAccountMessageRegulationHelper.create({\n\t\t\tserviceFactory: this.serviceFactory\n\t\t});\n\t}\n\n\t_tempAccountMessageHelper;\n\n\tshowTempAccountMessage() {\n this._tempAccountMessageHelper.showTempAccountMessage({\n\t\t\tmessageKey: 'it_temp_account_message',\n\t\t\tfooterMessageKey: 'it_temp_account_footer_message'\n\t\t});\n\t}\n\n\n getTempAccountGnwpSource() {\n return GNWP_SOURCES.DOCUMENT_UPLOAD;\n }\n}\n\nexport default ItalyRegulation;\n","import BaseObject from '../../../../../base/base_object';\nimport ServiceFactory from '../../../../service_factory';\n\nexport class DkStructuredLogging extends BaseObject {\n static CLASS = 'DkStructuredLogging';\n\n init(params = {}) {\n super.init(params);\n this.serviceFactory = params.serviceFactory || ServiceFactory.create();\n }\n\n realityCheckMessageSuccess(regulationData, sessionTime) {\n this._getLogger({\n event: 'RealityCheckMessage',\n currencyType: this.serviceFactory.currencyService().getCurrency(),\n netLoss: regulationData.TotalNetLoss / 100,\n loggedInTime: sessionTime,\n fullMessage: true,\n })\n .setTarget('Denmark-realityCheck')\n .info();\n }\n\n realityCheckMessageError(error, sessionTime) {\n this._getLogger({\n event: 'RealityCheckMessage',\n currencyType: this.serviceFactory.currencyService().getCurrency(),\n loggedInTime: sessionTime,\n fullMessage: false,\n errorDescription: error.ErrorDescription,\n })\n .setTarget('Denmark-realityCheck')\n .error();\n }\n\n _getLogger(eventData) {\n return this.serviceFactory.structuredLoggingService().getLogger(eventData);\n }\n}\n","import BaseRegulation from '../base_regulation';\nimport TempAccountMessageRegulationHelper from '../../helpers/temp_account_message_helper';\nimport { DkStructuredLogging } from './logging/dk_structured_logging';\nimport {Check} from \"@sparkware/app-utils\";\nimport { GameChildishIconMode } from '../../../../../../common/enums/game-childish-icon-mode.enum';\nimport {GNWP_SOURCES} from '../../../../../../app-react/services/gnwp/gnwp-consts';\n\nexport default class DkRegulation extends BaseRegulation {\n static CLASS = 'DkRegulation';\n\n _structuredLogger = null;\n\n\n\n init(params) {\n super.init(params);\n\n this._structuredLogger = DkStructuredLogging.create({\n serviceFactory: this.serviceFactory,\n });\n\n }\n\n sessionTimerVisible() {\n return true;\n }\n realityCheckEnabled() {\n return true;\n }\n\n sessionTimerEnabled() {\n return true;\n }\n\n showResponsibleIcons() {\n return true;\n }\n\n showAgeResponsibleGameInDetailedHistory() {\n return true;\n }\n\n showAgeResponsibleIconInGame() {\n return true;\n }\n\n getChildishIconMode() {\n if (!this.serviceFactory.oAuth2Service().isAuthorized()) {\n return GameChildishIconMode.UseLessNonChildishIcon;\n }\n\n return this.isVerifiedForRegulation()\n ? GameChildishIconMode.PreferLessNonChildishIcon\n : GameChildishIconMode.UseLessNonChildishIcon;\n }\n\n showTempAccountMessage() {\n TempAccountMessageRegulationHelper.create({\n serviceFactory: this.serviceFactory,\n }).showTempAccountMessage({\n messageKey: 'dk_temp_account_message'\n });\n }\n\n getTempAccountGnwpSource() {\n return GNWP_SOURCES.DOCUMENT_UPLOAD;\n }\n\n async _handleRealityCheckMessage(sessionTimer) {\n const isGameRunning = await this.serviceFactory.gameService().isGameRunning();\n if (isGameRunning) {\n if (!await this._realityCheckShouldBeDisplayedInGame()) {\n return;\n }\n }\n\n this.serviceFactory.userService().getRealityCheckData().then(data => {\n\n this.serviceFactory.gameService().stopCurrentGameAutoplay();\n\n this.serviceFactory.orbitComponentRenderService().showTimeSpentReminderWithBalance({\n playingTime: this.getCurrentSessionTime(),\n totalNetLoss: Check.isNullOrUndefined(data?.TotalNetLoss) ? 0 : data.TotalNetLoss,\n isInGame: isGameRunning,\n showPopupAboveSecondWebViewHybrid: true\n });\n\n this._structuredLogger.realityCheckMessageSuccess(data, this.getCurrentSessionTime());\n }).catch(err => {\n\n this.serviceFactory.gameService().stopCurrentGameAutoplay();\n\n this.serviceFactory.orbitComponentRenderService().showTimeSpentReminderWithBalance({\n playingTime: this.getCurrentSessionTime(),\n totalNetLoss: 0,\n isInGame: isGameRunning\n });\n\n this._structuredLogger.realityCheckMessageError(err, this.getCurrentSessionTime().toString());\n });\n\n }\n\n async _realityCheckShouldBeDisplayedInGame() {\n return await this.serviceFactory\n .gameService()\n .shouldShowRealityCheckMessageWhileGameIsOpen();\n }\n}\n","import BaseRegulation, {BaseRegulationParams} from '../base_regulation';\nimport TempAccountMessageRegulationHelper from '../../helpers/temp_account_message_helper';\nimport _ from '../../../../utils/underscore';\nimport {GNWP_SOURCES} from '../../../../../../app-react/services/gnwp/gnwp-consts';\nimport {TEMP_ACCOUNT_STATUS} from \"../../../../../../common/const/temp_account_status\";\nimport { REGULATION_STATUS_ID_MAP } from '../../regulation_const';\n\ninterface SpainRegulationParams extends BaseRegulationParams {\n tempAccountMessageHelper?: TempAccountMessageRegulationHelper;\n}\nconst TEMP_ACCOUNT_PARAMS:any = {\n [TEMP_ACCOUNT_STATUS.DOCUMENTS_NOT_RECEIVED]: {\n status: TEMP_ACCOUNT_STATUS.DOCUMENTS_NOT_RECEIVED,\n messageKey: 'spa_temp_account_message',\n footerMessageKey: 'spa_temp_account_footer_message'\n },\n [TEMP_ACCOUNT_STATUS.PENDING_VERIFICATION]: {\n status: TEMP_ACCOUNT_STATUS.PENDING_VERIFICATION,\n messageKey: 'spa_temp_account_verify_message'\n },\n [TEMP_ACCOUNT_STATUS.APPROVED]: {\n status: TEMP_ACCOUNT_STATUS.APPROVED\n }\n};\nexport default class SpainRegulation extends BaseRegulation {\n\n static CLASS = 'SpainRegulation';\n private _tempAccountMessageHelper: TempAccountMessageRegulationHelper;\n private _msgParams: any;\n\n\n public init(params: SpainRegulationParams): void {\n super.init(params);\n this._tempAccountMessageHelper = params.tempAccountMessageHelper || TempAccountMessageRegulationHelper.create({\n serviceFactory: this.serviceFactory\n });\n }\n\n public showTempAccountMessage():void {\n let accountData:any = this.serviceFactory.userService().getAccountData();\n let isDocUploadRequired:boolean = accountData.IsDocUploadRequired;\n let daysLeft:number = accountData.DaysToUploadDocument;\n let status:string = TEMP_ACCOUNT_STATUS.APPROVED;\n if (accountData.RegulationStatusId === REGULATION_STATUS_ID_MAP.PENDING_VERIFICATION || accountData.RegulationStatusId === REGULATION_STATUS_ID_MAP.PENDING_DOCUMENTS) {\n if (_.isNullOrUndefined(daysLeft)) {\n status = TEMP_ACCOUNT_STATUS.PENDING_VERIFICATION;\n } else if (daysLeft >= 0) {\n status = TEMP_ACCOUNT_STATUS.DOCUMENTS_NOT_RECEIVED;\n }\n }\n this._msgParams = Object.assign({}, {daysLeft: daysLeft}, TEMP_ACCOUNT_PARAMS[status]);\n this.logger.info('ES User status ' + status);\n if (isDocUploadRequired) {\n this.serviceFactory.externalLinksProxyService().openUploadDocumentFromMyAccount();\n } else {\n this._tempAccountMessageHelper.showTempAccountMessage({\n paramsFunc: this.getTempAccountParams.bind(this)\n });\n }\n }\n\n showResponsibleIcons() {\n return false;\n }\n\n private getTempAccountParams(): any{\n return this._msgParams;\n }\n\n public getTempAccountGnwpSource(){\n return GNWP_SOURCES.DOCUMENT_UPLOAD;\n }\n\n public isAnonymousPlayAllowed() : boolean {\n return this.serviceFactory.oAuth2Service().isAuthorized();\n }\n}","import BaseObject from '../../../../../base/base_object';\nimport _ from '../../../../../utils/underscore';\nimport ServiceFactory from \"../../../../service_factory\";\n\nexport class SwedenStructuredLogging extends BaseObject {\n\n static CLASS = \"SwedenStructuredLogging\";\n\n init(params = {}) {\n super.init(params);\n this.serviceFactory = params.serviceFactory || ServiceFactory.create();\n }\n\n loginMessageSuccess(limitsData) {\n this._getLogger(this._buildLoginSuccessEvent(limitsData)).setTarget('project-sweden-loginMessage').info();\n }\n\n loginMessageError(errorMessage = '') {\n this._getLogger(this._buildLoginErrorEvent(errorMessage)).setTarget('project-sweden-loginMessage').error();\n }\n\n realityCheckMessageSuccess(regulationData, sessionTime) {\n this._getLogger({\n event: 'RealityCheckMessage',\n currencyType: this.serviceFactory.currencyService().getCurrency(),\n netLoss: regulationData.TotalNetLoss / 100,\n loggedInTime: sessionTime,\n fullMessage: true\n }).setTarget('project-sweden-realityCheck').info();\n }\n\n realityCheckMessageError(error, sessionTime) {\n this._getLogger({\n event: 'RealityCheckMessage',\n currencyType: this.serviceFactory.currencyService().getCurrency(),\n loggedInTime: sessionTime,\n fullMessage: false,\n errorDescription: error.ErrorDescription\n }).setTarget('project-sweden-realityCheck').error();\n }\n\n _getLogger(eventData) {\n return this.serviceFactory.structuredLoggingService().getLogger(eventData);\n }\n\n _buildLoginSuccessEvent(limitsData) {\n let limits = [],\n currencyService = this.serviceFactory.currencyService();\n\n if (limitsData.DefinedDepositLimits.length !== 0) {\n limits = limitsData.DefinedDepositLimits.map(limit => {\n return {\n limitType: limit.Type,\n limitAmount: _.isNullOrUndefined(limit.Amount) ? 0 : limit.Amount / 100\n }\n })\n }\n\n return {\n event: 'LoginMessage',\n limits: limits,\n netLoss: _.isNullOrUndefined(limitsData.TotalNetLoss) ? 0 : limitsData.TotalNetLoss / 100,\n currencyType: currencyService.getCurrency(),\n fullMessage: true\n }\n\n }\n\n _buildLoginErrorEvent(errorMessage) {\n return {\n event: 'LoginMessage',\n currencyType: this.serviceFactory.currencyService().getCurrency(),\n fullMessage: false,\n errorDescription: errorMessage\n }\n }\n}","import BaseRegulation from '../base_regulation';\nimport TempAccountMessageRegulationHelper from '../../helpers/temp_account_message_helper';\nimport _ from '../../../../utils/underscore';\nimport {KICK_REASON, KICK_TYPE} from '../../../player_messages_service/player_messages_consts';\nimport {CGP_ERROR_CODES} from '../../../../exceptions/cgp_error_codes';\nimport Event from '../../../../utils/event';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\nimport {LOGIN_TYPE} from '../../../oauth/oauth_const';\nimport {SwedenStructuredLogging} from './logging/sweden_structured_logging';\nimport {CLOCK_LOCALIZATION} from '../../../clock/clock_service_consts';\nimport {Check, TimeSpan} from \"@sparkware/app-utils\";\nimport {CHANNEL_ELEMENTS} from \"../../../../../../common/const/casinofied-analytics-consts\";\nimport {AreaType, ControlCenterOpenSource} from \"@sparkware/uc-sdk-core\";\nimport {ToastCloseReason} from '../../../../../../app-react/services/toaster/toaster.service.interface';\nimport {GameChildishIconMode} from '../../../../../../common/enums/game-childish-icon-mode.enum';\n\nconst DEPOSIT_LIMIT_TYPES = {\n DAILY: 1,\n WEEKLY: 2,\n MONTHLY: 5\n};\n\nconst PENDING_APP_PP = 27;\n\nconst LOGIN_MESSAGE_DURATION_SEC = 8;\n\n\nexport default class SwedenRegulation extends BaseRegulation {\n\n\n static CLASS = 'SwedenRegulation';\n\n\n // logging object\n _structuredLogger = null;\n\n /**\n *\n * @param params\n */\n init(params) {\n super.init(params);\n\n this._structuredLogger = SwedenStructuredLogging.create({\n serviceFactory: this.serviceFactory\n });\n\n }\n\n\n showSessionBalanceInAboutBox() {\n return true;\n }\n\n\n sessionTimerVisible() {\n return true;\n }\n\n realityCheckEnabled() {\n return !this.serviceFactory.integrationService().isMiniCip();\n }\n\n sessionTimerEnabled() {\n return true;\n }\n\n showResponsibleIcons() {\n return true;\n }\n\n getChildishIconMode() {\n if (!this.serviceFactory.oAuth2Service().isAuthorized()) {\n return GameChildishIconMode.UseLessNonChildishIcon;\n }\n\n return this.isVerifiedForRegulation()\n ? GameChildishIconMode.PreferLessNonChildishIcon\n : GameChildishIconMode.UseLessNonChildishIcon;\n }\n\n getRealityCheckInterval() {\n if (this.serviceFactory.skinService().useControlCenterForReminderInterval()) {\n const accountData = this.serviceFactory.userService().getAccountData();\n if (accountData && !Check.isNullOrUndefined(accountData.RealityCheckDataIntervalInMins)) {\n return TimeSpan.fromMinutes(accountData.RealityCheckDataIntervalInMins);\n }\n }\n return super.getRealityCheckInterval();\n }\n\n async _realityCheckShouldBeDisplayedInGame() {\n return await this.serviceFactory\n .gameService()\n .shouldShowRealityCheckMessageWhileGameIsOpen();\n }\n\n /**\n * Overrides base class\n * @param sessionTimer\n * @private\n */\n async _handleRealityCheckMessage(sessionTimer) {\n const isGameRunning = await this.serviceFactory.gameService().isGameRunning();\n if (isGameRunning) {\n if (!await this._realityCheckShouldBeDisplayedInGame()) {\n return;\n }\n }\n\n this.serviceFactory.userService().getRealityCheckData().then(data => {\n\n this.serviceFactory.gameService().stopCurrentGameAutoplay();\n\n this._structuredLogger.realityCheckMessageSuccess(data, this.getCurrentSessionTime());\n\n this.serviceFactory.orbitComponentRenderService().showTimeSpentReminderWithBalance({\n playingTime: this.getCurrentSessionTime(),\n totalNetLoss: Check.isNullOrUndefined(data?.TotalNetLoss) ? 0 : data.TotalNetLoss,\n isInGame: isGameRunning,\n showPopupAboveSecondWebViewHybrid: true\n });\n }).catch(err => {\n\n this.serviceFactory.gameService().stopCurrentGameAutoplay();\n\n this._structuredLogger.realityCheckMessageError(err, this.getCurrentSessionTime().toString());\n\n this.serviceFactory.orbitComponentRenderService().showTimeSpentReminderWithBalance({\n playingTime: this.getCurrentSessionTime(),\n totalNetLoss: 0,\n isInGame: isGameRunning,\n showPopupAboveSecondWebViewHybrid: true\n });\n });\n }\n\n\n showTempAccountMessage() {\n TempAccountMessageRegulationHelper.create({\n serviceFactory: this.serviceFactory\n }).showTempAccountMessage({\n messageKey: 'sw_temp_account_message'\n });\n }\n\n /**\n * When got soft kick should open message when no open game.\n * @param kickParams\n */\n onKickEvent(kickParams) {\n let messageText = '';\n\n if (typeof kickParams !== 'object' || kickParams.KickType !== KICK_TYPE.SOFT_KICK) {\n return;\n }\n\n switch (kickParams.KickReasonId) {\n case KICK_REASON.KickUserDailyReached:\n messageText = this.getErrorMessage(CGP_ERROR_CODES.TIME_LIMIT_REACHED_DAILY);\n break;\n case KICK_REASON.KickUserWeeklyReached:\n messageText = this.getErrorMessage(CGP_ERROR_CODES.TIME_LIMIT_REACHED_WEEKLY);\n break;\n case KICK_REASON.KickUserMonthlyReached:\n messageText = this.getErrorMessage(CGP_ERROR_CODES.TIME_LIMIT_REACHED_MONTHLY);\n break;\n default:\n messageText = this.getErrorMessage(CGP_ERROR_CODES.GENERAL_ERROR_SUPPORT);\n break;\n }\n\n // no message means no popup\n if (!messageText) {\n return;\n }\n\n const shouldShowMessage = this._shouldShowMessage();\n\n if (shouldShowMessage) {\n this.serviceFactory.gameService().stopCurrentGameAutoplay();\n\n this.serviceFactory.messageManagerService().openMessage({\n text: messageText,\n closeButton: false,\n hasDefaultButton: false,\n buttons: [\n {\n name: this.serviceFactory.languageService().translation('mdp_ok'),\n callback: () => {\n this.serviceFactory.gameService().closeRunningGame();\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {category: 'time_limit_message', action: 'acknowledge'});\n },\n isClosable: true\n }\n ]\n });\n }\n }\n\n async _shouldShowMessage() {\n const isGameRunning = await this.serviceFactory.gameService().isGameRunning();\n\n // open message when no game opened\n let shouldShowMessage = !isGameRunning;\n\n // if game is running\n if (isGameRunning) {\n const gameService = this.serviceFactory.gameService();\n // Open message when company supports it and game is run in free play mode\n if (await gameService.isGameRunningInFreePlayMode() && await gameService.shouldShowTimeLimitMessageWhileGameIsOpen()) {\n shouldShowMessage = true;\n }\n }\n return shouldShowMessage;\n }\n\n showLoginMessage() {\n let oAuth2Service = this.serviceFactory.oAuth2Service();\n if (!oAuth2Service.isAuthorized()) {\n this.logger.debug('User is not authorized. Login message should not be displayed');\n return;\n }\n\n if (oAuth2Service.getLoginType() === LOGIN_TYPE.AUTOLOGIN && oAuth2Service.getSourceProductPackage() !== PENDING_APP_PP) { // autologin\n this.logger.debug('User has been authorized by autologin without Pending Application product package');\n return;\n }\n\n let limitsData = _.safeJSON(oAuth2Service.extractTokenProperty('regulationMessages'), null);\n\n let messageParams = this._getLoginMessageParams(limitsData);\n\n if (!_.isNullOrUndefined(limitsData)) {\n if (!_.isNullOrUndefined(limitsData.DefinedDepositLimits)) {\n this._structuredLogger.loginMessageSuccess(limitsData);\n } else {\n this._structuredLogger.loginMessageError(limitsData.ErrorMessage);\n }\n } else {\n this._structuredLogger.loginMessageError();\n }\n\n this.serviceFactory.orbitComponentRenderService().showLoginMessageToast(\n {\n id: 'sweden_login_message',\n toastOptions: {\n timeout: TimeSpan.fromSeconds(LOGIN_MESSAGE_DURATION_SEC)\n },\n contentProps: {\n contentText: messageParams.body,\n title: messageParams.title,\n },\n onToastClosed: (reason) => {\n if (reason === ToastCloseReason.CloseButton) {\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {\n category: 'Login_message_toaster',\n action: 'close',\n label: 'Sweden'\n });\n }\n }\n }\n )\n\n return Promise.resolve();\n }\n\n _getLoginMessageParams(limitsData) {\n\n let languageService = this.serviceFactory.languageService();\n let currencyService = this.serviceFactory.currencyService();\n\n if (!limitsData) {\n limitsData = {}\n }\n\n if (!limitsData.DefinedDepositLimits || limitsData.DefinedDepositLimits.length === 0) {\n limitsData.DefinedDepositLimits = [\n {Type: DEPOSIT_LIMIT_TYPES.DAILY, Amount: null},\n {Type: DEPOSIT_LIMIT_TYPES.WEEKLY, Amount: null},\n {Type: DEPOSIT_LIMIT_TYPES.MONTHLY, Amount: null}\n ];\n\n }\n\n let abs = (amount) => {\n if (_.isNullOrUndefined(amount)) {\n return null;\n }\n return Math.abs(amount);\n };\n\n let formatAmount = (amount) => {\n if (_.isNullOrUndefined(amount)) {\n return '';\n } else {\n return currencyService.formatMoney(amount);\n }\n };\n\n\n let bindingParams = {\n net_loss: formatAmount(abs(limitsData.TotalNetLoss))\n };\n\n // prepare deposit limit messages\n limitsData.DefinedDepositLimits.forEach((depositLimit) => {\n\n switch (depositLimit.Type) {\n case DEPOSIT_LIMIT_TYPES.DAILY:\n bindingParams.daily_limit = formatAmount(depositLimit.Amount);\n break;\n case DEPOSIT_LIMIT_TYPES.WEEKLY:\n bindingParams.weekly_limit = formatAmount(depositLimit.Amount);\n break;\n case DEPOSIT_LIMIT_TYPES.MONTHLY:\n bindingParams.monthly_limit = formatAmount(depositLimit.Amount);\n break;\n default:\n // maybe should throw an Exception here\n break;\n }\n });\n // prepare net loss message\n // A negative amount means the player won more than he lost\n // so in case the total loss less than 0, won message will be displayed\n let lossMsgSchema = (limitsData.TotalNetLoss || 0) < 0 ? 'login_message_total_win' : 'login_message_total_loss';\n\n return {\n title: languageService.translation('login_message_title'),\n body: languageService.translation(lossMsgSchema, bindingParams)\n }\n }\n\n openLimits() {\n this._sendAnalytics('OpenLimits');\n this.serviceFactory.externalLinksProxyService().openGameLimits(AreaType.button, CHANNEL_ELEMENTS.gamesLimitsLobbyButton, ControlCenterOpenSource.RgPolicy);\n }\n\n\n\n _sendAnalytics(action, value) {\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {\n category: 'Regulation',\n action: action,\n label: 'Sweden',\n value: value\n });\n }\n\n\n getClockLocalization() {\n return CLOCK_LOCALIZATION.LOCAL;\n }\n\n}\n","\nimport SwedenRegulation from './sweden_regulation'\nimport {GNWP_SOURCES} from '../../../../../../app-react/services/gnwp/gnwp-consts';\n\nexport default class MrgreenSwedenRegulation extends SwedenRegulation {\n static CLASS = 'MrgreenSwedenRegulation';\n\n getTempAccountGnwpSource() {\n return GNWP_SOURCES.DOCUMENT_UPLOAD;\n }\n\n}\n","import BaseRegulation from \"../base_regulation\";\nimport TempAccountMessageRegulationHelper from \"../../helpers/temp_account_message_helper\";\nimport {TEMP_ACCOUNT_STATUS} from \"../../../../../../common/const/temp_account_status\";\nimport { REGULATION_STATUS_ID_MAP } from \"../../regulation_const\";\n\nexport default class PortugalRegulation extends BaseRegulation {\n\n\tstatic CLASS = 'PortugalRegulation';\n\n\tinit(params) {\n\t\tsuper.init(params);\n\t\tthis._tempAccountMessageHelper = params.tempAccountMessageHelper || TempAccountMessageRegulationHelper.create({\n\t\t\tserviceFactory: this.serviceFactory\n\t\t});\n\t}\n\n\tprivate _tempAccountMessageHelper: TempAccountMessageRegulationHelper;\n\n\tshowTempAccountMessage() {\n this._tempAccountMessageHelper.showTempAccountMessage({\n paramsFunc: this._getTempAccountParams.bind(this),\n });\n\t}\n\t\n\tprivate _getTempAccountParams() {\n const accountData = this.serviceFactory.userService().getAccountData();\n\t\tlet daysLeft = accountData.DaysToUploadDocument;\n\t\tlet status = TEMP_ACCOUNT_STATUS.APPROVED;\n\n\t\tif (daysLeft >= 0 && (accountData.RegulationStatusId === REGULATION_STATUS_ID_MAP.PENDING_VERIFICATION || accountData.RegulationStatusId === REGULATION_STATUS_ID_MAP.PENDING_DOCUMENTS)) {\n\t\t\tstatus = TEMP_ACCOUNT_STATUS.DOCUMENTS_NOT_RECEIVED;\n\t\t}\n\n return {\n\t\t\tmessageKey: 'pt_temp_account_message',\n\t\t\tfooterMessageKey: 'pt_temp_account_footer_message',\n\t\t\tdaysLeft: daysLeft,\n\t\t\tstatus: status\n\t\t};\n }\n\n\tshowSessionBalanceInAboutBox() {\n\t\treturn true;\n\t}\n}","import { Check } from '@sparkware/app-utils';\nimport {ID_VERIFICATION_STATUS} from '../../../oauth/oauth_const';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport OptionsComponentController from '../../../../components/options/options_component_controller';\nimport BaseRegulation from \"../base_regulation\";\nimport { TSR_TYPE } from '../../../../../../common/interfaces/orbit-component-to-sdk-adapter/components-props/time-spent-reminder-options';\nimport {KICK_REASON} from \"../../../player_messages_service/player_messages_consts\";\nimport Underscore from \"../../../../utils/underscore\";\nimport {\n DISPLAY_MESSAGE_IDS,\n DISPLAY_MESSAGE_NAMES\n} from \"../../../../../../common/const/casinofied-analytics-consts\";\nimport { GameChildishIconMode } from '../../../../../../common/enums/game-childish-icon-mode.enum';\n\ninterface AccountData {\n IdVerificationStatus: number,\n AddressVerificationStatus: number,\n RealityCheckDataIntervalInMins: number\n}\n\nexport default class UKRegulation extends BaseRegulation {\n static CLASS = 'UKRegulation';\n\n private _getAccountData(): AccountData {\n return this.serviceFactory.userService().getAccountData() as AccountData;\n }\n\n isAnonymousPlayAllowed() : boolean {\n if(!this.serviceFactory.oAuth2Service().isAuthorized()) {\n return false;\n }\n\n return this._getAccountData().IdVerificationStatus === ID_VERIFICATION_STATUS.AGE_VERIFIED;\n }\n\n /**\n * In UK, the game animations are allowed only for authorized users that had their age verified\n * This is a requirement of the regulator regarding childish animations\n */\n gameIconAnimationsAllowed() {\n return this.serviceFactory.oAuth2Service().isAuthorized() && this._getAccountData().IdVerificationStatus === ID_VERIFICATION_STATUS.AGE_VERIFIED;\n }\n\n forceHideCloseButtonInMembership() {\n return true;\n }\n\n forceDemoButton(): boolean {\n\n return this.isAnonymousPlayAllowed() && this._getAccountData().AddressVerificationStatus !== ID_VERIFICATION_STATUS.ADDRESS_VERIFIDED;\n }\n\n protected realityCheckEnabled(): boolean {\n return true;\n }\n\n protected isVerifiedForRegulation(): boolean {\n return this._getAccountData().IdVerificationStatus === ID_VERIFICATION_STATUS.AGE_VERIFIED;\n }\n\n getChildishIconMode(): GameChildishIconMode {\n if (!this.serviceFactory.oAuth2Service().isAuthorized()) {\n return GameChildishIconMode.UseNonChildishIcon;\n }\n\n return this.isVerifiedForRegulation()\n ? GameChildishIconMode.PreferNonChildishIcon\n : GameChildishIconMode.UseNonChildishIcon;\n }\n\n getRealityCheckInterval(): TimeSpan {\n if (this.serviceFactory.skinService().useControlCenterForReminderInterval()) {\n if (this._getAccountData() && !Check.isNullOrUndefined(this._getAccountData().RealityCheckDataIntervalInMins)) {\n return TimeSpan.fromMinutes(this._getAccountData().RealityCheckDataIntervalInMins);\n }\n }\n\n return this.serviceFactory.componentFactoryService().createComponent(OptionsComponentController).getReminderInterval();\n }\n\n async updateRealityCheckInterval(realityCheckIntevalMin: number): Promise {\n if (!this.serviceFactory.oAuth2Service().isAuthorized()) {\n return Promise.reject();\n }\n\n // Update reminders\n // Set the reminder interval in account details and control center\n if (this.serviceFactory.skinService().useControlCenterForReminderInterval()) {\n let updateRealityCheckDataUrl = this.serviceFactory.userService().getUpdateRealityCheckDataUrl();\n try {\n // updates reality check in Control Center. Use this endpoint to migrate existing reality check\n await this.serviceFactory.http2Service().post(updateRealityCheckDataUrl, { realityCheckIntevalMin });\n } catch (error) {\n this.logger.error(\"Could not call update reality check to update the interval. url: \" + updateRealityCheckDataUrl, error);\n }\n // when the call is done, update the account details for the current session\n const accountData = this.serviceFactory.userService().getAccountData();\n if (accountData && !Check.isNullOrUndefined(accountData.RealityCheckDataIntervalInMins)) {\n accountData.RealityCheckDataIntervalInMins = realityCheckIntevalMin;\n this.serviceFactory.userService().updateTokenData(\"accountData\", accountData);\n }\n } else {\n // Set the reminder that use the setting from localStorage\n OptionsComponentController.create().load('ReminderSettings').set(realityCheckIntevalMin);\n }\n return Promise.resolve();\n }\n\n async attemptRealityCheckIntervalMigrationFromLocalStorageToControlCenter(): Promise {\n if (!this.serviceFactory.oAuth2Service().isAuthorized()) {\n return Promise.reject();\n }\n if (this.serviceFactory.skinService().useControlCenterForReminderInterval()) {\n // when using Control Center for reminder interval, first we check if the data was migrated from Storage to Control Center.\n let controlCenterReminderInterval: TimeSpan | undefined = undefined;\n if (this._getAccountData() && !Check.isNullOrUndefined(this._getAccountData().RealityCheckDataIntervalInMins)) {\n controlCenterReminderInterval = TimeSpan.fromMinutes(this._getAccountData().RealityCheckDataIntervalInMins);\n }\n\n if (controlCenterReminderInterval && controlCenterReminderInterval.totalMinutes > 0) {\n // 1. If data exists in Control center, ignore if anything exists in Local Storage. Attempt to delete from Local Storage\n OptionsComponentController.create().load('ReminderSettings').off();\n return Promise.resolve();\n }\n\n const localStorageReminderInterval: TimeSpan = this.serviceFactory.componentFactoryService().createComponent(OptionsComponentController).getReminderInterval();\n if (localStorageReminderInterval.totalMinutes > 0) {\n // 2. If data does not exists in Control Center, but exists in Local Storage, migrate:\n let updateRealityCheckDataUrl = this.serviceFactory.userService().getUpdateRealityCheckDataUrl();\n try {\n await this.serviceFactory.http2Service().post(updateRealityCheckDataUrl, { realityCheckIntevalMin: localStorageReminderInterval.totalMinutes });\n // and remove data from Local Storage with:\n OptionsComponentController.create().load('ReminderSettings').off();\n\n // when the call is done, update the account details for the current session\n const accountData = this.serviceFactory.userService().getAccountData();\n if (accountData && !Check.isNullOrUndefined(accountData.RealityCheckDataIntervalInMins)) {\n accountData.RealityCheckDataIntervalInMins = localStorageReminderInterval.totalMinutes;\n this.serviceFactory.userService().updateTokenData(\"accountData\", accountData);\n }\n } catch (error) {\n this.logger.error(\"Could not call update reality check to update the interval. url: \" + updateRealityCheckDataUrl, error);\n return Promise.reject();\n }\n }\n }\n return Promise.resolve();\n }\n\n getRealityCheckIntervalExpectedByTheGame() {\n let interval = this.getRealityCheckInterval();\n return {\n timeSpan: interval,\n expectedValueByTheGame: Math.round(interval.totalSeconds)\n }\n }\n\n showNetPosition(): boolean {\n return true;\n }\n\n sessionTimerEnabled() {\n const isMiniCip = this.serviceFactory.integrationService().isMiniCip();\n return !isMiniCip && (this.getRealityCheckInterval().totalMilliseconds > 0);\n }\n\n _handleRealityCheckMessage(sessionTimer) {\n this.serviceFactory.gameService().stopCurrentGameAutoplay();\n\n this.serviceFactory.orbitComponentRenderService().showTimeSpentReminderWithDropdown({\n timerType: TSR_TYPE.SESSION_TIMER,\n playingTime: this.getCurrentSessionTime()\n });\n }\n\n onKickEvent(kickParams) {\n super.onKickEvent(kickParams);\n\n if (kickParams.KickReasonId !== KICK_REASON.KickUserUkNightLimit) {\n return;\n }\n\n this.serviceFactory.gameService().closeRunningGame();\n\n if (this.serviceFactory.integrationService().isMiniOrbit()) {\n return; //On CIP8/CIS, the native app displays the message, we just need to soft kick the user.\n }\n\n const businessCorrelationId = Underscore.getGuid();\n const limitExpirationDate = new Date(kickParams.LimitExpirationDateInSeconds * 1000);\n const limitInHours = this.serviceFactory.timeService().findDifferenceBetweenDatesInHours(limitExpirationDate, new Date());\n //Looks like we lose 1 hour due to truncating and stuff, need to also check with real message to see if we need the +1\n const hoursString: string = (limitInHours + 1).toString();\n\n this.serviceFactory.casinofiedAnalyticsProxyService().messageDisplay({\n businessCorrelationID: businessCorrelationId,\n displayMessageName: DISPLAY_MESSAGE_NAMES.DISRUPTIVE_KICKOFF_MESSAGE_NAME,\n displayMessageID: DISPLAY_MESSAGE_IDS.nightLimitKick,\n correlationID: kickParams.CorrelationID\n });\n\n this.serviceFactory.messageManagerService().openMessage({\n title: this.serviceFactory.languageService().translation('night_limit_title'),\n text: this.serviceFactory.languageService().translation('night_limit_soft_kick_text', {\n hours: hoursString\n }),\n closeButton:false,\n hasDefaultButton: false,\n buttons: [\n {\n name: this.serviceFactory.languageService().translation('night_limit_cta'),\n callback: ()=> {\n this.serviceFactory.casinofiedAnalyticsProxyService().messageActionTaken({\n displayMessageName: DISPLAY_MESSAGE_NAMES.DISRUPTIVE_KICKOFF_MESSAGE_NAME,\n actionType: \"Confirmation\",\n correlationID: kickParams.CorrelationID,\n businessCorrelationID: businessCorrelationId\n });\n },\n isClosable: true\n }\n ]\n });\n }\n\n showNightLimitMessage(nightLimitExpirationDate: Date) {\n const locale = this.serviceFactory.skinService().getCulture();\n const hour = nightLimitExpirationDate.toLocaleTimeString(locale, {\n hour: '2-digit',\n minute: '2-digit',\n });\n const date = nightLimitExpirationDate.toLocaleDateString(locale);\n\n this.serviceFactory.messageManagerService().openMessage({\n title: this.serviceFactory.languageService().translation('night_limit_title'),\n text: this.serviceFactory.languageService().translation('night_limit_open_game_text', {\n hour: hour.toString(),\n date: date.toString(),\n }),\n closeButton:false,\n hasDefaultButton: false,\n buttons: [\n {\n name: this.serviceFactory.languageService().translation('night_limit_cta'),\n isClosable: true\n }]\n });\n }\n}","import BaseRegulation, {BaseRegulationParams} from '../base_regulation';\nimport TempAccountMessageRegulationHelper from '../../helpers/temp_account_message_helper';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport {SYSTEM_EVENTS} from \"../../../../events/events\";\nimport Event from \"../../../../utils/event\";\nimport {GNWP_SOURCES} from '../../../../../../app-react/services/gnwp/gnwp-consts';\n\ninterface RomaniaRegulationParams extends BaseRegulationParams {\n tempAccountMessageHelper?: TempAccountMessageRegulationHelper\n}\n\nexport default class RomaniaRegulation extends BaseRegulation {\n static CLASS = 'RomaniaRegulation';\n\n\tinit(params: RomaniaRegulationParams) {\n super.init(params);\n this._tempAccountMessageHelper = params.tempAccountMessageHelper || TempAccountMessageRegulationHelper.create({\n\t\t\tserviceFactory: this.serviceFactory\n\t\t});\n }\n\n _tempAccountMessageHelper: TempAccountMessageRegulationHelper;\n\n\tshowTempAccountMessage() {\n this._tempAccountMessageHelper.showTempAccountMessage({\n\t\t\tmessageKey: 'ro_temp_account_message',\n\t\t\tfooterMessageKey: 'ro_temp_account_footer_message'\n\t\t});\n\t}\n public getTempAccountGnwpSource(){\n return GNWP_SOURCES.DOCUMENT_UPLOAD;\n }\n\n protected realityCheckEnabled(): boolean {\n\t\treturn true;\n\t}\n\n protected sessionTimerEnabled(): boolean {\n\t return true;\n }\n\n\n\tprotected _handleRealityCheckMessage(sessionTimer: TimeSpan): void {\n\t const subTitleText = this.serviceFactory.languageService().translation('interval_reminder_body', {\n hours: sessionTimer.days * 24 + sessionTimer.hours,\n minutes: sessionTimer.minutes\n });\n\n\t if(this.serviceFactory.hybridService().isOnDemandStandAloneGameRunning()) {\n Event.fire(SYSTEM_EVENTS.HYBRID_ALERT, subTitleText);\n } else {\n this.serviceFactory.toasterProxyService().showAckStandardToast({\n id: 'romania_interval_reminder_message ' + Date.now(),\n toastOptions: {\n timeout: TimeSpan.fromSeconds(15)\n },\n contentProps: {\n title: this.serviceFactory.languageService().translation('interval_reminder_title'),\n message: subTitleText\n },\n onToastShown: () => {\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {\n category: 'romania_interval_reminder_toaster',\n action: 'displayed',\n label: 'toast opened',\n });\n }\n });\n }\n\t}\n}","import BaseRegulation from \"../base_regulation\";\n\nexport default class SHRegulation extends BaseRegulation {\n\n}","import BaseRegulation from \"../base_regulation\";\n\nexport default abstract class COMBaseRegulation extends BaseRegulation{\n static CLASS = 'COMBaseRegulation';\n\n}","import COMBaseRegulation from \"../com_base_regulation\";\nimport {Check, TimeSpan} from \"@sparkware/app-utils\";\nimport TempAccountMessageRegulationHelper from \"../../../helpers/temp_account_message_helper\";\n\ninterface AccountData {\n IdVerificationStatus: number,\n AddressVerificationStatus: number,\n RealityCheckDataIntervalInMins: number\n}\n\nexport default class MaltaRegulation extends COMBaseRegulation {\n static CLASS = 'MaltaRegulation';\n\n protected realityCheckEnabled(): boolean {\n return true;\n }\n\n showTempAccountMessage() {\n TempAccountMessageRegulationHelper.create({\n serviceFactory: this.serviceFactory\n }).showTempAccountMessage({\n messageKey: 'gib_temp_account_message'\n });\n }\n\n private _getAccountData(): AccountData {\n return this.serviceFactory.userService().getAccountData() as AccountData;\n }\n\n sessionTimerEnabled() {\n return this.getRealityCheckInterval().totalMilliseconds > 0;\n }\n\n getRealityCheckInterval(): TimeSpan {\n if (this.serviceFactory.skinService().useControlCenterForReminderInterval()) {\n if (this._getAccountData() && !Check.isNullOrUndefined(this._getAccountData().RealityCheckDataIntervalInMins)) {\n return TimeSpan.fromMinutes(this._getAccountData().RealityCheckDataIntervalInMins);\n }\n }\n return TimeSpan.fromMilliseconds(0);\n }\n\n async _handleRealityCheckMessage(sessionTimer): Promise {\n const isGameRunning = await this.serviceFactory.gameService().isGameRunning();\n\n this.serviceFactory.userService().getRealityCheckData().then(data => {\n\n this.serviceFactory.gameService().stopCurrentGameAutoplay();\n\n this.serviceFactory.orbitComponentRenderService().showTimeSpentReminderWithBalance({\n playingTime: this.getCurrentSessionTime(),\n totalNetLoss: Check.isNullOrUndefined(data?.TotalNetLoss) ? 0 : data.TotalNetLoss,\n isInGame: isGameRunning,\n amountWagered: Check.isNullOrUndefined(data?.WagerAmount) ? 0 : data.WagerAmount,\n subtitle: \"TSR_SUBTITLE_MALTA\"\n });\n\n }).catch(err => {\n\n this.serviceFactory.gameService().stopCurrentGameAutoplay();\n\n this.serviceFactory.orbitComponentRenderService().showTimeSpentReminderWithBalance({\n playingTime: this.getCurrentSessionTime(),\n totalNetLoss: 0,\n isInGame: isGameRunning,\n amountWagered: 0,\n subtitle: \"TSR_SUBTITLE_MALTA\"\n });\n });\n\n }\n}\n","import Event from '../../../../utils/event';\nimport {SYSTEM_EVENTS} from '../../../../events/events';\nimport BaseRegulation, { IAccountData } from '../base_regulation';\nimport { REGULATION_STATUS_ID_MAP } from '../../regulation_const';\n\nexport default class NetherlandsRegulation extends BaseRegulation {\n static CLASS = 'NetherlandsRegulation';\n\n\n\n /**\n *\n * @param params\n */\n init(params) {\n super.init(params);\n }\n\n private _getAccountData(): IAccountData {\n return this.serviceFactory.userService().getAccountData() as IAccountData;\n }\n\n isAnonymousPlayAllowed() : boolean {\n if(!this.serviceFactory.oAuth2Service().isAuthorized()) {\n return false;\n }\n\n return this._getAccountData().RegulationStatusId === REGULATION_STATUS_ID_MAP.APPROVED_FOR_REGULATION;\n }\n\n\n shouldShowPlayerLimitsToaster(): boolean {\n return true;\n }\n\n _sendAnalytics(action, value) {\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {\n category: 'Regulation',\n action: action,\n label: 'Netherlands',\n value: value\n });\n }\n\n sessionTimerEnabled() {\n return true;\n }\n\n sessionTimerVisible() {\n return true;\n }\n\n showResponsibleIcons() {\n return true;\n }\n\n showAgeResponsibleIconInGame() {\n return true;\n }\n\n showAgeResponsibleGameInDetailedHistory() {\n return true;\n }\n\n getAgeResponsibleGamingLabel() {\n return this.serviceFactory.languageService().translation('responsible_gaming_age_label');\n }\n}\n","import COMBaseRegulation from \"../com_base_regulation\";\nimport TempAccountMessageRegulationHelper from \"../../../helpers/temp_account_message_helper\";\n\nexport default class GibRegulation extends COMBaseRegulation {\n static CLASS = 'GibRegulation';\n\n showTempAccountMessage() {\n TempAccountMessageRegulationHelper.create({\n serviceFactory: this.serviceFactory\n }).showTempAccountMessage({\n messageKey: 'gib_temp_account_message'\n });\n }\n}","import BaseRegulation from '../base_regulation';\nimport Device from \"../../../../utils/device/device\";\nimport {CLOCK_LOCALIZATION} from '../../../clock/clock_service_consts';\n\nexport default abstract class USBaseRegulation extends BaseRegulation {\n\n static CLASS = 'USBaseRegulation';\n\n /**\n * The time after which the Last Login is replaced with the Session Timer in UI\n */\n protected _switchToSessionTimerWaitInterval = null;\n\n\n protected abstract _getRegulationType(): number;\n\n init(params) {\n super.init(params);\n this._switchToSessionTimerWaitInterval = (params.switchToSessionTimerWaitInterval && params.switchToSessionTimerWaitInterval[this._getRegulationType()]) || 60000;\n if(!this.shouldRefreshTokenOnAppOpen() && this.serviceFactory.oAuth2Service().isAuthorized()) {\n this.serviceFactory.oAuth2Service().logout({\n shouldShowLogoutMessage: false\n });\n }\n }\n\n shouldRefreshTokenOnAppOpen(): boolean {\n return !Device.hybrid.inCasino || this.serviceFactory.integrationService().isMiniOrbit();\n }\n\n hybridNyxClosedButtonEnabled(){\n return true;\n }\n\n\n sessionTimerVisible() {\n return true;\n }\n\n sessionTimerEnabled() {\n return true;\n }\n\n supportWithdrawOnlyFromReal() {\n return false;\n }\n\n getClockLocalization() {\n return CLOCK_LOCALIZATION.SERVER;\n }\n}\n","import TempAccountMessageRegulationHelper from \"../../../helpers/temp_account_message_helper\";\nimport {CGP_ERROR_CODES} from \"../../../../../exceptions/cgp_error_codes\";\nimport {REGULATION_CODE_TYPES} from '../../../regulation_const';\nimport USBaseRegulation from '../us_base_regulation';\n\n\nexport default class NewJerseyRegulation extends USBaseRegulation {\n\n static CLASS = 'NewJerseyRegulation';\n\n protected _getRegulationType(): number {\n return REGULATION_CODE_TYPES.NJ;\n }\n\n showTempAccountMessage() {\n TempAccountMessageRegulationHelper.create({\n serviceFactory: this.serviceFactory\n }).showTempAccountMessage({\n messageKey: 'nj_temp_account_message'\n });\n }\n\n forceHideCloseButtonInMembership() {\n return true;\n }\n\n /**\n * This hook has comment due to using of logoutUser() at \"new-jersey.regulation.ts\".\n * Using this will cause NJ to use CGP modal instead of dialog service!\n * Beware: if both hooks are in use, user will see two same popups at logout.\n */\n // showLogoutMessage() {\n // this.serviceFactory.messageManagerService().openMessage({\n // text: this.serviceFactory.languageService().translation('logout_message_text'),\n // title: this.serviceFactory.languageService().translation('logout_message_title'),\n // customCSSClassList: ['cgp-mdp-text-support-slash-n'],\n // hasDefaultButton: false,\n // buttons: [\n // {\n // name: this.serviceFactory.languageService().translation('mdp_ok'),\n // isClosable: true\n // }\n // ]\n // });\n // }\n\n getErrorMessage(errorCode) {\n errorCode = errorCode.toString();\n if(errorCode === CGP_ERROR_CODES.TIME_LIMIT_REACHED_DAILY.toString()) {\n return this.serviceFactory.languageService().translation(CGP_ERROR_CODES.TIME_LIMIT_REACHED_DAILY + '_nj');\n }\n\n return super.getErrorMessage(errorCode);\n }\n}\n","import BaseModelComponent from '../../../../base/base_model_component';\nimport ServiceFactory from '../../../../services/service_factory';\nimport {TimeSpan} from \"@sparkware/app-utils\";\n\nexport default class GenericRealityCheckComponentModel extends BaseModelComponent {\n static CLASS = 'GenericRealityCheckComponentModel';\n\n init(params) {\n super.init(params);\n\n this._setElapsedTime(params.elapsedTime)._setSessionBalance(params.sessionBalance);\n }\n\n _setElapsedTime(elapsedTime) {\n this._elapsedTime = elapsedTime || TimeSpan.fromMinutes(0);\n\n return this;\n }\n\n _setSessionBalance(balance) {\n this._sessionBalance = balance || 0;\n\n return this;\n }\n\n getElapsedTime() {\n return this._elapsedTime;\n }\n\n getSessionBalance() {\n if (this._sessionBalance < 0) {\n return -1 * this._sessionBalance;\n }\n\n return this._sessionBalance;\n }\n\n getSessionBalanceDescription() {\n let translationKey = this._sessionBalance > 0 ? 'reality_check_session_winnings_description' : 'reality_check_session_losses_description';\n\n return ServiceFactory.create()\n .languageService()\n .translation(translationKey);\n }\n}\n","import BaseComponent from '../../../../base/base_component';\nimport Model from './generic_reality_check_component_model';\n\nlet generic_view = require('./view/generic_reality_check.html');\nlet session_cooldown_view = require('./view/session_cooldown_reality_check.html');\n\nlet view = generic_view;\n\nexport default class GenericRealityCheckComponent extends BaseComponent {\n static CLASS = 'GenericRealityCheckComponent';\n\n _model = null;\n\n init(params) {\n super.init(params);\n this._model = Model.create(params);\n }\n\n start() {\n\n if (this.serviceFactory.regulationService().isSessionCooldownEnabled()) {\n view = session_cooldown_view;\n }\n\n let bakedHTML = this.bake(view, {\n elapsed_time: this._formatTime(this._model.getElapsedTime()),\n session_balance: this.serviceFactory.currencyService().formatMoney(this._model.getSessionBalance()),\n session_balance_description: this._model.getSessionBalanceDescription(),\n });\n this.setHTML(bakedHTML);\n\n return this;\n }\n\n _formatTime(time) {\n return time.hours.toString().padStart(2, '0') + 'h:' + time.minutes.toString().padStart(2, '0') + 'm';\n }\n}\n","import {TimeSpan} from \"@sparkware/app-utils\";\n\nimport Store from \"../../../utils/store\";\nimport GenericRealityCheckMessageHandler from \"./generic_reality_check_message_handler\";\nimport {IElasticEventData} from \"../../../../../common/interfaces/structured-logging-service-interface\";\n\nexport default class RealityCheckWithConfirmationMessageHandler extends GenericRealityCheckMessageHandler {\n static CLASS = 'RealityCheckWithConfirmationMessageHandler';\n\n private _awaitsRealityCheckConfirmation: boolean = false;\n\n protected set _lastRealityCheckMessageIndexShown(value) {\n try {\n Store.set(\"lastRealityCheckMessageIndexShown\", value);\n }\n catch (err) {\n const data: IElasticEventData = {\n CGPEventCategory: 'RealityCheck',\n CGPEventAction: 'set lastRealityCheckMessageIndexShown error',\n CGPEventLabel:err.toString(),\n CGPEventValue: value.toString()\n };\n this._initParams.serviceFactory.structuredLoggingService().getLogger(data).info();\n }\n }\n\n protected get _lastRealityCheckMessageIndexShown() {\n let lsValue = Store.get(\"lastRealityCheckMessageIndexShown\");\n let val = parseInt(lsValue ?? 0);\n if(isNaN(val)){\n const data: IElasticEventData = {\n CGPEventCategory: 'RealityCheck',\n CGPEventAction: 'get _lastRealityCheckMessageIndexShown is NaN',\n CGPEventValue: lsValue.toString()\n };\n this._initParams.serviceFactory.structuredLoggingService().getLogger(data).info();\n }\n return val;\n }\n\n private set _lastConfirmedRealityCheckMessageIndex(value) {\n try {\n Store.set(\"lastRealityCheckMessageIndexConfirmed\", value);\n }\n catch (err) {\n const data: IElasticEventData = {\n CGPEventCategory: 'RealityCheck',\n CGPEventAction: 'set lastRealityCheckMessageIndexConfirmed error',\n CGPEventLabel:err.toString(),\n CGPEventValue: value.toString()\n };\n this._initParams.serviceFactory.structuredLoggingService().getLogger(data).info();\n }\n }\n\n private get _lastConfirmedRealityCheckMessageIndex() {\n let lsValue = Store.get(\"lastRealityCheckMessageIndexConfirmed\");\n let val = parseInt(lsValue ?? 0)\n if(isNaN(val)){\n const data: IElasticEventData = {\n CGPEventCategory: 'RealityCheck',\n CGPEventAction: 'get _lastConfirmedRealityCheckMessageIndex is NaN',\n CGPEventValue: lsValue.toString()\n };\n this._initParams.serviceFactory.structuredLoggingService().getLogger(data).info();\n }\n return val;\n }\n\n _realityCheckConfirmed(){\n this._awaitsRealityCheckConfirmation = false;\n this._lastConfirmedRealityCheckMessageIndex = this._lastRealityCheckMessageIndexShown;\n }\n\n protected _onSessionTimerUpdate(eventData: {sessionTime: TimeSpan}): void {\n try {\n if (!this._initParams.serviceFactory.oAuth2Service().isAuthorized()) {\n return;\n }\n\n let currentRealityCheckMessageIndexToBeShown = Math.floor(eventData.sessionTime.totalMilliseconds / this._initParams.realityCheckInterval.totalMilliseconds);\n\n const indexNotShown = (currentRealityCheckMessageIndexToBeShown && (currentRealityCheckMessageIndexToBeShown !== this._lastRealityCheckMessageIndexShown));\n const indexNotConfirmed = (currentRealityCheckMessageIndexToBeShown > this._lastConfirmedRealityCheckMessageIndex);\n\n if (indexNotShown || (indexNotConfirmed && !this._awaitsRealityCheckConfirmation)) {\n this._initParams.handleRealityCheckMessageCallback(eventData.sessionTime, this._realityCheckConfirmed.bind(this));\n this._awaitsRealityCheckConfirmation = true;\n this._lastRealityCheckMessageIndexShown = currentRealityCheckMessageIndexToBeShown;\n }\n }catch (err) {\n const data: IElasticEventData = {\n CGPEventCategory: 'RealityCheck',\n CGPEventAction: 'onSessionTimerUpdate error',\n CGPEventLabel:err.toString(),\n CGPEventValue : 'lastRealityCheckMessageIndexShown: '+this._lastRealityCheckMessageIndexShown + ', lastConfirmedRealityCheckMessageIndex: '+this._lastConfirmedRealityCheckMessageIndex\n };\n this._initParams.serviceFactory.structuredLoggingService().getLogger(data).info();\n }\n }\n}","import BaseRegulation, {BaseRegulationParams, IAccountData, StartSessionTimerContext} from \"../base_regulation\";\nimport TempAccountMessageRegulationHelper from \"../../helpers/temp_account_message_helper\";\nimport Event from \"../../../../utils/event\";\nimport {SYSTEM_EVENTS, CLIENT_EVENTS} from \"../../../../events/events\";\nimport _ from \"../../../../utils/underscore\";\nimport GenericRealityCheckComponent\n from \"../../../../components/regulation_components/helpers/reality_check/generic_reality_check_component\";\nimport {GNWP_SOURCES} from \"../../../../../../app-react/services/gnwp/gnwp-consts\";\nimport {CyClass} from \"../../../../../../common/cy-classes\";\nimport {GermanyResponsibleGamingButtonPlacement} from \"../../../../../../common/const/responsible-gaming\";\nimport {BUTTON_TYPE} from \"../../../../components/message/message_consts\";\nimport {DISPLAY_MESSAGE_IDS, DISPLAY_MESSAGE_NAMES} from \"../../../../../../common/const/casinofied-analytics-consts\";\nimport GenericRealityCheckMessageHandler from \"../../helpers/generic_reality_check_message_handler\";\nimport RealityCheckWithConfirmationMessageHandler from \"../../helpers/reality_check_with_confirmation_message_handler\";\nimport { REGULATION_STATUS_ID_MAP } from \"../../regulation_const\";\n\ninterface GermanyRegulationParams extends BaseRegulationParams {\n tempAccountMessageHelper?: TempAccountMessageRegulationHelper,\n placement?:GermanyResponsibleGamingButtonPlacement\n}\n\ninterface IRealityCheckMessageConfig {\n title: string;\n text?: string;\n closeButton: boolean;\n buttons: [\n {\n name: string;\n isClosable: boolean;\n cssClass?: string;\n callback: () => void;\n type?: string;\n }\n ]\n}\n\nexport default class GermanyRegulation extends BaseRegulation {\n static CLASS = 'GermanyRegulation';\n\n init(params: GermanyRegulationParams) {\n super.init(params);\n }\n\n public getTempAccountGnwpSource() {\n return GNWP_SOURCES.DOCUMENT_UPLOAD;\n }\n\n showResponsibleIcons() {\n return this.serviceFactory.oAuth2Service().isAuthorized();\n }\n\n realityCheckEnabled() {\n return true;\n }\n\n sessionTimerEnabled() {\n return true;\n }\n\n isAnonymousPlayAllowed() : boolean {\n if(!this.serviceFactory.oAuth2Service().isAuthorized()) {\n return false;\n }\n\n return this._getAccountData().RegulationStatusId === REGULATION_STATUS_ID_MAP.APPROVED_FOR_REGULATION;\n }\n\n async showLoginMessage(): Promise {\n if (this._IsDocUploadRequired()) {\n await this.serviceFactory.externalLinksProxyService().openUploadDocumentFromMyAccount();\n }\n }\n\n private _IsDocUploadRequired(){\n const accountData = this.serviceFactory.userService().getAccountData();\n return accountData.IsDocUploadRequired;\n }\n\n protected _getRealityCheckMessageHandler(context: StartSessionTimerContext): GenericRealityCheckMessageHandler {\n return RealityCheckWithConfirmationMessageHandler.create({\n serviceFactory: this.serviceFactory,\n realityCheckInterval: this.getRealityCheckInterval(),\n handleRealityCheckMessageCallback: this._handleRealityCheckMessage.bind(this),\n context: context\n });\n }\n\n /**\n * Overrides base class\n * @param sessionTimer\n * @private\n */\n async _handleRealityCheckMessage(sessionTimer, confirmCallback:Function): Promise {\n const continueGAObj = {\n category: 'reality_check_message',\n action: 'continue_in_lobby'\n };\n\n const businessCorrelationId = _.getGuid();\n\n const languageService = this.serviceFactory.languageService();\n const messageConfig: IRealityCheckMessageConfig = {\n title: languageService.translation('reality_check_title'),\n closeButton: false,\n buttons: [{\n name: languageService.translation('reality_check_continue_btn'),\n cssClass: CyClass(\"cy-reality-check-close-button\"),\n isClosable: true,\n callback: () => {\n this.serviceFactory.gameService().continuePlayCurrentGame();\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, continueGAObj);\n\n this.serviceFactory.casinofiedAnalyticsProxyService().messageActionTaken({\n businessCorrelationID: businessCorrelationId,\n displayMessageName: DISPLAY_MESSAGE_NAMES.REALITY_CHECK_GERMANY_MESSAGE_NAME,\n actionType: \"Confirmation\"\n });\n Event.fire(CLIENT_EVENTS.REALITY_CHECK_CLOSED);\n confirmCallback();\n }\n }]\n };\n\n // Add close game button\n if (await this.serviceFactory.gameService().isGameRunning()) {\n if (!await this._realityCheckShouldBeDisplayedInGame()) {\n return;\n }\n\n continueGAObj.action = 'continue_in_game';\n\n messageConfig.buttons.unshift({\n name: languageService.translation('close_game'),\n type: BUTTON_TYPE.SECONDARY.typeName,\n isClosable: true,\n callback: () => {\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {\n category: 'reality_check_message',\n action: 'close_game'\n });\n\n this.serviceFactory.casinofiedAnalyticsProxyService().messageActionTaken({\n businessCorrelationID: businessCorrelationId,\n displayMessageName: DISPLAY_MESSAGE_NAMES.REALITY_CHECK_GERMANY_MESSAGE_NAME,\n actionType: \"Confirmation\"\n });\n\n Event.fire(CLIENT_EVENTS.REALITY_CHECK_CLOSED);\n this.serviceFactory.gameService().closeRunningGame();\n confirmCallback();\n }\n });\n }\n\n this.serviceFactory\n .userService()\n .getRealityCheckData()\n .then(data => {\n Event.fire(CLIENT_EVENTS.REALITY_CHECK_OPENED);\n\n this.serviceFactory.casinofiedAnalyticsProxyService().messageDisplay({\n displayMessageID: DISPLAY_MESSAGE_IDS.realityCheckGermany,\n displayMessageName: DISPLAY_MESSAGE_NAMES.REALITY_CHECK_GERMANY_MESSAGE_NAME,\n businessCorrelationID: businessCorrelationId\n });\n\n messageConfig.text = this._getRealityCheckMessageText(data);\n this._openRealityCheckMessage(messageConfig);\n })\n .catch(() => {\n messageConfig.text = this._getRealityCheckMessageText();\n this._openRealityCheckMessage(messageConfig);\n });\n }\n\n async _realityCheckShouldBeDisplayedInGame() {\n return await this.serviceFactory\n .gameService()\n .shouldShowRealityCheckMessageWhileGameIsOpen();\n }\n\n _openRealityCheckMessage(messageConfig) {\n messageConfig = {\n ...messageConfig,\n showPopupAboveSecondWebViewHybrid: true\n };\n\n this.serviceFactory.gameService().stopCurrentGameAutoplay();\n this.serviceFactory.messageManagerService().openMessage(messageConfig);\n }\n\n\n /**\n * Returns the text displayed in the reality check message according to the received (or not) reality check data\n * @param realityCheckData\n * @returns {String}\n * @private\n */\n _getRealityCheckMessageText(realityCheckData?) {\n let componentConfig,\n component;\n\n\n if (_.isNullOrUndefined(realityCheckData)) {\n componentConfig = {\n elapsedTime: this.getCurrentSessionTime(),\n sessionBalance: 0\n }\n } else {\n componentConfig = {\n elapsedTime: this.getCurrentSessionTime(),\n sessionBalance: -1 * realityCheckData.TotalNetLoss\n }\n }\n\n component = GenericRealityCheckComponent.create(componentConfig);\n component.start();\n\n return component.getEl();\n }\n\n isSessionCooldownEnabled(): boolean {\n return true;\n }\n\n private _getAccountData(): IAccountData {\n return this.serviceFactory.userService().getAccountData() as IAccountData;\n }\n\n isLoginPopupEnabled(): boolean {\n return true;\n }\n}","import BaseRegulation from '../../base_regulation';\nimport {GNWP_SOURCES} from \"../../../../../../../app-react/services/gnwp/gnwp-consts\";\n\nexport default class CanadaOntarioRegulation extends BaseRegulation {\n static CLASS = 'CanadaOntarioRegulation';\n\n\n\n displayPopUpRatingAfterGame(): boolean {\n return false;\n }\n\n overrideCurrencySymbol(): string {\n return '$';\n }\n\n showNetPosition(): boolean {\n return true;\n }\n\n shouldCallCountryByIP(country:string) {\n return true;\n }\n\n fitToPlayModeEnabled(): boolean {\n return true;\n }\n\n showAgeResponsibleIconInGame() {\n return false;\n }\n\n showResponsibleIcons() {\n return true;\n }\n\n stepsBeforeOpenLoginAndRegistration():Promise {\n return this.serviceFactory.orbitComponentRenderService().showLocationPopup({});\n }\n\n runConditionsBeforeOpenLink(source: string):Promise {\n if(source !== GNWP_SOURCES.MEMBERSHIP) {\n return Promise.resolve();\n }\n\n return this.stepsBeforeOpenLoginAndRegistration();\n }\n\n\n private sendAnalytics(category:string, action:string):void {\n const analyticsData:any = {\n CGPEventCategory: category,\n CGPEventAction: action\n };\n\n this.logger.debug(action, JSON.stringify(analyticsData));\n this.serviceFactory.structuredLoggingService().getLogger(analyticsData).info();\n }\n}","import {GNWP_SOURCES} from \"../../../../../../app-react/services/gnwp/gnwp-consts\";\nimport USBaseRegulation from \"../us/us_base_regulation\";\nimport {REGULATION_CODE_TYPES} from \"../../regulation_const\";\n\nexport default class MichiganRegulation extends USBaseRegulation {\n static CLASS = 'MichiganRegulation';\n\n protected _getRegulationType(): number {\n return REGULATION_CODE_TYPES.MICHIGAN;\n }\n\n stepsBeforeOpenLoginAndRegistration():Promise {\n return this.serviceFactory.orbitComponentRenderService().showLocationPopup({});\n }\n\n shouldRefreshTokenOnAppOpen(){\n return true;\n }\n\n runConditionsBeforeOpenLink(source: string):Promise {\n if(source !== GNWP_SOURCES.MEMBERSHIP) {\n return Promise.resolve();\n }\n\n return this.stepsBeforeOpenLoginAndRegistration();\n }\n\n supportWithdrawOnlyFromReal() {\n return true;\n }\n\n isDeviceDetectionEnabled() : boolean {\n return true;\n }\n}","import DkRegulation from \"./dk_regulation\";\nimport {Check, TimeSpan} from \"@sparkware/app-utils\";\n\n\nexport default class MrgreenDenmarkRegulation extends DkRegulation {\n static CLASS = 'MrgreenDenmarkRegulation';\n\n getRealityCheckInterval() {\n if (this.serviceFactory.skinService().useControlCenterForReminderInterval()) {\n const accountData = this.serviceFactory.userService().getAccountData();\n if (accountData && !Check.isNullOrUndefined(accountData.RealityCheckDataIntervalInMins)) {\n return TimeSpan.fromMinutes(accountData.RealityCheckDataIntervalInMins);\n }\n }\n return super.getRealityCheckInterval();\n }\n\n}\n","import BaseObject from '../../../base/base_object';\nimport {REGULATION_CODE_TYPES, REGULATION_SUFFIX, BRANDS} from '../regulation_const';\nimport DefaultRegulation from './default_regulation';\nimport ItalyRegulation from './italy/italy_regulation';\nimport DkRegulation from './denmark/dk_regulation';\nimport SpainRegulation from './spain/spain_regulation';\nimport SwedenRegulation from \"./sweden/sweden_regulation\";\nimport MrgreenSwedenRegulation from './sweden/mrgreen_sweeden_regulation';\nimport PortugalRegulation from \"./portugal/portugal_regulation\";\nimport UKRegulation from './uk/uk_regulation';\nimport RomaniaRegulation from './romania/romania_regulation';\nimport SHRegulation from \"./sh/sh\";\nimport MaltaRegulation from './com/malta/malta_regulation';\nimport NetherlandsRegulation from './netherlands/netherlands_regulation'\nimport GibRegulation from './com/gib/gib_regulation';\nimport NewJerseyRegulation from \"./us/new_jersey/new_jersey_regulation\";\nimport GermanyRegulation from \"./germany/germany_regulation\";\nimport CanadaOntarioRegulation from \"./canada/ontario/canada_ontario_regulation\";\nimport MichiganRegulation from \"./michigan/michigan_regulation\";\nimport MrgreenDenmarkRegulation from \"./denmark/mrgreen_denmark_regulation\";\n\nclass RegulationFactory extends BaseObject {\n\n\tstatic CLASS = \"RegulationFactory\";\n\n\t_regulations = {};\n\n\tinit(params) {\n\t\tsuper.init(params);\n\t\tthis.serviceFactory = params.serviceFactory;\n\t\tthis.configs = params.configs || {};\n\t}\n\n\tgetRegulation(regulationCode) {\n\t\tlet regulationKey = this._createRegulationKey(regulationCode);\n\t\tregulationCode = Number(regulationCode);\n\t\tif (!this._regulations[regulationKey]) {\n\t\t\tlet regulation = this._createRegulation(regulationCode);\n\t\t\tthis._regulations[regulationKey] = regulation;\n\t\t}\n\n\t\treturn this._regulations[regulationKey];\n\t}\n\n\t_createRegulationKey(regulationCode) {\n\t\tlet country = '_';\n\t\tif(this.serviceFactory.countryService().isNetherlands()) {\n\t\t\tcountry+= 'nld'\n\t\t}\n\n\t\treturn regulationCode + country;\n\t}\n\n\t_createRegulation(regulationCode) {\n\t\tlet regulation = null;\n\t\tlet regulationCreateParams = Object.assign({\n serviceFactory: this.serviceFactory,\n cssSuffix: REGULATION_SUFFIX[regulationCode]\n\t\t}, this.configs);\n\n\t\tswitch (regulationCode) {\n\t\t\tcase REGULATION_CODE_TYPES.ITALY:\n\t\t\t\tregulation = ItalyRegulation.create(regulationCreateParams);\n\t\t\t\tbreak;\n\t\t\tcase REGULATION_CODE_TYPES.DK:\n\t\t\t\tif(this.serviceFactory.skinService().getBrandID() === BRANDS.MRGREEN_DK) {\n\t\t\t\t\tregulation = MrgreenDenmarkRegulation.create(regulationCreateParams);\n\t\t\t\t} else {\n\t\t\t\t\tregulation = DkRegulation.create(regulationCreateParams);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n case REGULATION_CODE_TYPES.SPAIN:\n regulation = SpainRegulation.create(regulationCreateParams);\n break;\n case REGULATION_CODE_TYPES.SWEDEN:\n\t\t\t\tif(this.serviceFactory.skinService().getBrandID() === BRANDS.MRGREEN_SE) {\n\t\t\t\t\tregulation = MrgreenSwedenRegulation.create(regulationCreateParams);\n\t\t\t\t} else {\n\t\t\t\t\tregulation = SwedenRegulation.create(regulationCreateParams);\n\t\t\t\t}\n break;\n\t\t\tcase REGULATION_CODE_TYPES.PORTUGAL:\n\t\t\t\tregulation = PortugalRegulation.create(regulationCreateParams);\n\t\t\t\tbreak;\n case REGULATION_CODE_TYPES.NJ:\n regulation = NewJerseyRegulation.create(regulationCreateParams);\n break;\n\t\t\tcase REGULATION_CODE_TYPES.GERMANY:\n\t\t\t\tregulation = GermanyRegulation.create(regulationCreateParams);\n\t\t\t\tbreak;\n\t\t\tcase REGULATION_CODE_TYPES.CANADA_ONTARIO:\n\t\t\t\tregulation = CanadaOntarioRegulation.create(regulationCreateParams);\n\t\t\t\tbreak;\n\t\t\tcase REGULATION_CODE_TYPES.MICHIGAN:\n\t\t\t\tregulation = MichiganRegulation.create(regulationCreateParams);\n\t\t\t\tbreak;\n case REGULATION_CODE_TYPES.UK:\n regulation = UKRegulation.create(regulationCreateParams);\n break;\n\t\t\tcase REGULATION_CODE_TYPES.ROMANIA:\n\t\t\t\tregulation = RomaniaRegulation.create(regulationCreateParams);\n\t\t\t\tbreak;\n\t\t\tcase REGULATION_CODE_TYPES.SH:\n\t\t\t\tregulation = SHRegulation.create(regulationCreateParams);\n\t\t\t\tbreak;\n\t\t\tcase REGULATION_CODE_TYPES.MALTA:\n\t\t\t\tregulation = MaltaRegulation.create(regulationCreateParams);\n\t\t\t\tbreak;\n\t\t\tcase REGULATION_CODE_TYPES.NETHERLANDS:\n\t\t\t\tregulation = NetherlandsRegulation.create(regulationCreateParams);\n\t\t\t\tbreak;\n\t\t\tcase REGULATION_CODE_TYPES.GIB:\n\t\t\tcase REGULATION_CODE_TYPES.COM:\n\t\t\t\tif(this.serviceFactory.countryService().isNetherlands()) {\n\t\t\t\t\tregulation = NetherlandsRegulation.create(regulationCreateParams);\n\t\t\t\t} else {\n\t\t\t\t\tregulation = GibRegulation.create(regulationCreateParams);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.logger.warn(`NO CONFIGURATION FOR REGULATION CODE ${regulationCode}! Using the default one!`);\n\t\t\t\tregulation = DefaultRegulation.create(regulationCreateParams);\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn regulation;\n\t}\n}\n\nexport default RegulationFactory;","import BaseService from '../../base/base_service';\nimport Model from './regulation_model';\nimport RegulationFactory from './regulations/regulation_factory';\nimport { SYSTEM_EVENTS } from '../../events/events';\nimport DOM from '../../utils/dom';\nimport USBaseRegulation from './regulations/us/us_base_regulation';\nimport {StartSessionTimerContext} from \"./regulations/base_regulation\";\nclass RegulationService extends BaseService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'RegulationService';\n\n /**\n * @property\n * @type {object|null}\n * @private\n */\n _model = null;\n\n _regulationSuffix = null;\n\n _regulationFactory = null;\n\n _initParams = null;\n\n _registeredBeforeCurrentLogin = false;\n\n /**\n *\n * @param params\n */\n init(params) {\n super.init(params);\n this._initParams = params;\n this._model = Model.create(params);\n this._regulationFactory = params.regulationFactory;\n this._subscribe();\n }\n\n _logginMessagesAlreadyShowed = false;\n\n /**\n * Subscribe regulation events.\n *\n * @private\n */\n _subscribe() {\n this.onSystemEvent(\n SYSTEM_EVENTS.ON_INIT_COMPLETE,\n () => {\n this._setRegulationCSS();\n\n if (this.serviceFactory.oAuth2Service().isAuthorized()) {\n this._startSessionTimer(StartSessionTimerContext.OnAppStartup);\n }\n }\n );\n\n this.onSystemEvent(\n SYSTEM_EVENTS.REGISTRATION_COMPLETED,\n () => {\n this._registeredBeforeCurrentLogin = true;\n }\n );\n\n this.onSystemEvent(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, (params) => {\n if (!this._logginMessagesAlreadyShowed && this.serviceFactory.oAuth2Service().isAuthorized()) {\n if (this._registeredBeforeCurrentLogin === false) {\n this.getRegulation().showTempAccountMessage();\n }\n\n this.getRegulation().showLoginMessage();\n this._logginMessagesAlreadyShowed = true;\n }\n\n this._setRegulationCSS();\n\n if (this.serviceFactory.oAuth2Service().isAuthorized()) {\n this._startSessionTimer(StartSessionTimerContext.OnLogin);\n } else {\n this.getRegulation().stopSessionTimer();\n this._logginMessagesAlreadyShowed = false;\n this._registeredBeforeCurrentLogin = false;\n }\n });\n\n this.onSystemEvent(\n SYSTEM_EVENTS.SESSION_EVENT_KICK,\n data => {\n this.getRegulation().onKickEvent(data);\n }\n );\n\n this.onSystemEvent(SYSTEM_EVENTS.SECOND_WEB_VIEW_OPEN, () => {\n this._setSecondWebViewCSS(true);\n });\n\n this.onSystemEvent(SYSTEM_EVENTS.SECOND_WEB_VIEW_CLOSE, () => {\n this._setSecondWebViewCSS(false);\n });\n }\n\n _startSessionTimer(context) {\n return this.serviceFactory.oAuth2Service().waitForAutologin().then(() => {\n if(this.serviceFactory.oAuth2Service().isAuthorized()) {\n this.getRegulation().startSessionTimer(context);\n }\n });\n }\n\n /**\n * Set regulation css for HTML cgp-uk, cgp-sw...\n * @private\n */\n _setRegulationCSS() {\n let regSuffix = this.getRegulation().getCssSuffix();\n if (this._regulationSuffix) {\n DOM.removeClass(DOM.getHTML(), 'cgp-' + this._regulationSuffix);\n }\n DOM.addClass(DOM.getHTML(), 'cgp-' + regSuffix);\n this._regulationSuffix = regSuffix;\n }\n\n _setSecondWebViewCSS(isOpen) {\n let webViewClass = 'cgp-second-web-view-open';\n if (isOpen) {\n DOM.addClass(DOM.getHTML(), webViewClass);\n } else {\n DOM.removeClass(DOM.getHTML(), webViewClass);\n }\n }\n\n /**\n *\n * @returns {*}\n */\n getTimeLimitPercentageReminder() {\n return this._model.getTimeLimitPercentageReminder();\n }\n\n postLoginActionsArePassed() {\n return this.getRegulation().postLoginActionsArePassed();\n }\n\n getMaxDurationsInMinutesForMobile() {\n return this._model.getMaxDurationsInMinutesForMobile();\n }\n\n getMaxDurationsInMinutesForPC() {\n return this._model.getMaxDurationsInMinutesForPC();\n }\n\n getLossLimitPercentages() {\n return this._model.getLossLimitPercentages();\n }\n\n getIntervalReminderInMinutes() {\n return this._model.getIntervalReminderInMinutes();\n }\n\n getRestrictionPeriodsInMinutes() {\n return this._model.getRestrictionPeriodsInMinutes();\n }\n\n /**\n * Get reminder intervals appropriate to specific regulation\n *\n * @returns {Array}\n * @public\n *\n */\n getReminderIntervals() {\n return this._model.getReminderIntervals();\n }\n\n getSessionCooldownConfig() {\n return {\n cooldownTime: this._model.getSessionCooldownConfigData().cooldownTime,\n featureEnabled: this.isSessionCooldownEnabled()\n }\n }\n\n /**\n * Get current regulation code.\n * The function return regulation code appropriate to authorize status.\n * If user is authorized, then the code will be returned from oAuth data,\n * otherwise from Skin data\n *\n * @returns {string}\n * @public\n */\n getRegulationCode() {\n return this.serviceFactory.skinService().getRegulationID();\n }\n\n isUSRegulation() {\n return this.getRegulation() instanceof USBaseRegulation;\n }\n\n getRegulation() {\n if (!this._regulationFactory) {\n this._regulationFactory = RegulationFactory.create({\n serviceFactory: this.serviceFactory,\n configs: this._initParams,\n });\n }\n return this._regulationFactory.getRegulation(this.getRegulationCode());\n }\n\n showHelpInAboutWindow() {\n return this.getRegulation().showHelpInAboutWindow();\n }\n\n getClockLocalization() {\n return this.getRegulation().getClockLocalization();\n }\n\n getErrorMessage(errorCode) {\n if (!errorCode) {\n this.throwError('222', 'Argument errorCode is required');\n }\n\n return this.getRegulation().getErrorMessage(errorCode);\n }\n\n runConditionsBeforeOpenLink(source) {\n return this.getRegulation().runConditionsBeforeOpenLink(source);\n }\n\n isAnonymousPlayAllowed() {\n return this.getRegulation().isAnonymousPlayAllowed();\n }\n\n forceDemoButton() {\n return this.getRegulation().forceDemoButton();\n }\n\n stepsBeforeOpenLoginAndRegistration() {\n return this.getRegulation().stepsBeforeOpenLoginAndRegistration();\n }\n\n shouldPreventMoreThanOneOpenGame() {\n return this.getRegulation().shouldPreventMoreThanOneOpenGame();\n }\n\n getRealityCheckIntervalExpectedByTheGame() {\n return this.getRegulation().getRealityCheckIntervalExpectedByTheGame();\n }\n\n sessionTimerVisible() {\n return this.getRegulation().sessionTimerVisible();\n }\n\n getTempAccountGnwpSource() {\n return this.getRegulation().getTempAccountGnwpSource();\n }\n\n showSessionBalanceInAboutBox() {\n return this.getRegulation().showSessionBalanceInAboutBox();\n }\n\n isSessionCooldownEnabled() {\n return this.getRegulation().isSessionCooldownEnabled();\n }\n\n //@TODO - this should be removed once the feature is approved by the regulator\n summaryMessageForPortugalEnabled() {\n return this._initParams.enableSummaryMessageForPortugal || false;\n }\n\n shouldShowPlayerLimitsToaster() {\n return this.getRegulation().shouldShowPlayerLimitsToaster();\n }\n\n fitToPlayModeEnabled() {\n return this.getRegulation().fitToPlayModeEnabled();\n }\n\n checkIfCorrectAppInUse(country, state) {\n return this.getRegulation().checkIfCorrectAppInUse(country, state);\n }\n\n shouldCallCountryByIP(country) {\n return this.getRegulation().shouldCallCountryByIP(country);\n }\n\n shouldRefreshTokenOnAppOpen() {\n return this.getRegulation().shouldRefreshTokenOnAppOpen();\n }\n\n isLoginPopupEnabled() {\n return this.getRegulation().isLoginPopupEnabled();\n }\n}\n\nexport default RegulationService;\n","import BaseModelService from '../../base/base_model_service';\nimport Device from '../../utils/device/device';\n\nclass ResizeDetectorModel extends BaseModelService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'ResizeDetectorModel';\n\n\n /**\n *\n */\n init() {\n this\n .setWidth(Device.viewport.width)\n .setHeight(Device.viewport.height);\n }\n\n\n /**\n *\n * @param width\n * @returns {ResizeDetectorModel}\n * @public\n */\n setWidth(width) {\n this._width = width;\n return this;\n }\n\n\n /**\n *\n * @param height\n * @returns {ResizeDetectorModel}\n * @public\n */\n setHeight(height) {\n this._height = height;\n return this;\n }\n\n\n /**\n *\n * @param orientation\n * @returns {ResizeDetectorModel}\n * @public\n */\n setOrientation(orientation) {\n this._orientation = orientation;\n return this;\n }\n\n\n /**\n *\n * @param deviceType\n * @returns {ResizeDetectorModel}\n */\n setDeviceType(deviceType) {\n this._deviceType = deviceType;\n return this;\n }\n\n\n /**\n *\n * @returns {*}\n * @public\n */\n getWidth() {\n return this._width;\n }\n\n\n /**\n *\n * @returns {*}\n * @public\n */\n getHeight() {\n return this._height;\n }\n\n\n /**\n *\n * @returns {*}\n * @public\n */\n getOrientation() {\n return this._orientation;\n }\n\n\n /**\n *\n * @returns {*}\n */\n getDeviceType() {\n return this._deviceType;\n }\n}\n\nexport default ResizeDetectorModel;","import BaseService from '../../base/base_service';\nimport Model from './resize_detector_model';\nimport DOM from '../../utils/dom';\nimport Device from '../../utils/device/device';\nimport _ from '../../utils/underscore';\nimport Event from '../../utils/event';\nimport {SYSTEM_EVENTS, USER_EVENTS} from '../../events/events';\n\n\n/**\n *\n *\n *\n */\nclass ResizeDetectorService extends BaseService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'ResizeDetectorService';\n\n\n /**\n * @property\n * @type {object|null}\n * @private\n */\n _model = null;\n\n\n /**\n *\n * @param params\n */\n init(params) {\n super.init(params);\n\n this._model = Model.create(params);\n this.start();\n }\n\n\n\n /**\n *\n * @public\n */\n start() {\n this.logger.debug('Start resize detector service.');\n let width = this._model.getWidth(),\n height = this._model.getHeight();\n this\n ._onResizeScreenEventsDetector()\n ._onFullScreenEventsDetector()\n ._responsiveDeviceChange(width)\n ._orientationChanged(width, height)\n ._checkScreenHeight()\n ._checkScreenResolution()\n ._checkMobileOS()\n ._checkIpadDevice()\n ._checkIsAndroid()\n ._checkIphoneVersion()\n ._checkIsHybrid()\n ._checkIsEmbeddedHybrid()\n ._addStyleTagForEvoGames();\n }\n\n\n /**\n * Get the current height of the screnn.\n *\n * @returns {*}\n */\n getHeight() {\n return this._model.getHeight();\n }\n\n\n /**\n * Get the current width of the screen.\n *\n * @returns {*}\n */\n getWidth() {\n return this._model.getWidth();\n }\n\n\n /**\n * Subscribe screen changes events (onresize event and orientationchange).\n *\n *\n * @private\n */\n _onResizeScreenEventsDetector() {\n // Listener for resize width and height change.\n DOM.addEventListener(window, USER_EVENTS.ON_RESIZE, this._onResize.bind(this), false);\n\n return this;\n }\n\n\n /**\n *\n * @private\n */\n _onFullScreenEventsDetector() {\n if (document.addEventListener) {\n DOM.addEventListener(document, 'webkitfullscreenchange', this._onFullScreenChange.bind(this), false);\n DOM.addEventListener(document, 'mozfullscreenchange', this._onFullScreenChange.bind(this), false);\n DOM.addEventListener(document, 'fullscreenchange', this._onFullScreenChange.bind(this), false);\n DOM.addEventListener(document, 'MSFullscreenChange', this._onFullScreenChange.bind(this), false);\n }\n\n return this;\n }\n\n\n /**\n *\n * @private\n */\n _onFullScreenChange() {\n if (document.webkitIsFullScreen || document.mozFullScreen || document.msFullscreenElement !== null) {\n const fullScreenFlag = _.isFullScreen();\n const fullScreenElem = document.getElementsByClassName('cgp-navbar-game-fullscreen-btn')[0];\n if(!fullScreenElem) {\n return;\n }\n\n if (!fullScreenFlag) {\n // Change icon according to screen size state.\n fullScreenElem.classList.remove('cgp-themes-icons-fullscreen-off');\n fullScreenElem.classList.add('cgp-themes-icons-fullscreen-on');\n\n // Clear screen size.\n DOM.removeClass(DOM.getHTML(), 'cgp-property-gameframe-anon-size');\n DOM.removeClass(DOM.getHTML(), 'cgp-property-gameframe-real-size');\n\n DOM.removeClass(DOM.getHTML(), 'cgp-full-screen');\n } else {\n // Change icon according to screen size state.\n fullScreenElem.classList.remove('cgp-themes-icons-fullscreen-on');\n fullScreenElem.classList.add('cgp-themes-icons-fullscreen-off');\n\n DOM.addClass(DOM.getHTML(), 'cgp-full-screen');\n }\n\n Event.fire(SYSTEM_EVENTS.FULL_SCREEN_CHANGE, fullScreenFlag);\n }\n }\n\n\n /**\n * The current model width and height is the old width and height before the resize the screen.\n *\n * @private\n */\n _onResize() {\n let fireResize = () => {\n this\n ._responsiveDeviceChange()\n ._orientationChanged()\n ._checkScreenHeight()\n ._checkScreenResolution()\n ._addStyleTagForEvoGames();\n\n Event.fire(SYSTEM_EVENTS.SCREEN_RESIZE_CHANGED, {\n currentDeviceWidth: Device.viewport.width,\n currentDeviceHeight: Device.viewport.height\n });\n\n return this;\n };\n\n /**\n * Patch for all mobile devices to fix the following issues:\n * 1. iOS. Introduced in iOS 10.3.1. window.innerWidth & window.innerHeight are not correct.\n * It happens right after the rotation happens, the values are mixed and width actually returns the hieght!\n * Some point - it's related for a webkit bug rather than iOS.\n * 2. iOS and Android. During orientation process browser fire at least 2 resize events.\n * In some cases DOM manipulation right after the rotation has no effect to UI and cause freeze state.\n * The patch allows device to complete rotation process and prepare correctly for DOM changes from code\n * @see: https://bugs.webkit.org/show_bug.cgi?id=170595 (Bug 170595 - Summary: window.innerWidth/innerHeight are bogus after resize/orientationchange in WKW...)\n * @see: https://github.com/dimsemenov/PhotoSwipe/issues/1315\n * @see: http://www.openradar.me/31725316\n */\n if (Device.os.isMobileOS) {\n [300, 600, 2200].forEach(i => {\n DOM.setTimeout(() => {\n fireResize();\n }, i);\n });\n }\n\n return fireResize();\n }\n\n\n /**\n * @returns {ResizeDetectorService}\n * @private\n */\n _responsiveDeviceChange() {\n Device.isMobile() ? this._changeResponsiveDevice('mobile', 'pc') : this._changeResponsiveDevice('pc', 'mobile');\n\n return this;\n }\n\n\n /**\n * @private\n */\n _orientationChanged() {\n Device.isPortrait ? this._changeOrientation('portrait', 'landscape') : this._changeOrientation('landscape', 'portrait');\n\n return this;\n }\n\n\n /**\n * Overlay screen change.\n *\n * @returns {ResizeDetectorService}\n * @private\n */\n _overlayChanged() {\n let overlayOnDOM = DOM.$$('.cgp-overlay');\n\n overlayOnDOM.forEach((overlay) => {\n overlay.style.width = this._model.getWidth() + 'px';\n overlay.style.height = this._model.getHeight() + 'px';\n });\n\n return this;\n }\n\n\n /**\n *\n * @param orientationState\n * @private\n */\n _changeOrientation(addOrientationState, removeOrientationState) {\n if (this._model.getOrientation() === addOrientationState) {\n return;\n }\n\n // Blur username and password inputs when changing orientation to hide soft keyboard\n let inputText = document.querySelector('input[type=\"text\"]');\n let loginPasswordText = document.querySelector('#cgp-field-password');\n\n if (inputText) {\n inputText.blur();\n }\n\n if (loginPasswordText) {\n loginPasswordText.blur();\n }\n\n this._model.setOrientation(addOrientationState);\n\n DOM.removeClass(DOM.getHTML(), 'cgp-' + removeOrientationState);\n DOM.addClass(DOM.getHTML(), 'cgp-' + addOrientationState);\n\n Event.fire(SYSTEM_EVENTS.SCREEN_CHANGE_STATE, addOrientationState);\n }\n\n\n /**\n *\n * @param addDeviceType\n * @param removeDeviceType\n * @private\n */\n _changeResponsiveDevice(addDeviceType, removeDeviceType) {\n if (this._model.getDeviceType() === addDeviceType) {\n return;\n }\n\n this._model.setDeviceType(addDeviceType);\n\n DOM.removeClass(DOM.getHTML(), 'cgp-' + removeDeviceType);\n DOM.addClass(DOM.getHTML(), 'cgp-' + addDeviceType);\n\n // Fire device changed event.\n let bodyElem = document.getElementsByTagName('body')[0];\n\n if (document.createEvent) {\n let eventDetails = document.createEvent('Event');\n\n eventDetails.initEvent('ondevicechanged', true, true);\n bodyElem.dispatchEvent(eventDetails);\n } else {\n bodyElem.fireEvent('ondevicechanged');\n }\n\n\n Event.fire(SYSTEM_EVENTS.SCREEN_CHANGE_STATE, addDeviceType);\n }\n\n\n /**\n * Check screen resolution\n *\n * @private\n */\n _checkScreenResolution() {\n const LOW_RESOLUTION_SELECTOR = 'cgp-pc-low-resolution';\n\n if (Device.os.isPC && Device.viewport.width < 1480) {\n DOM.addClass(DOM.getHTML(), LOW_RESOLUTION_SELECTOR);\n } else {\n DOM.removeClass(DOM.getHTML(), LOW_RESOLUTION_SELECTOR);\n }\n\n return this;\n }\n\n\n /**\n * Check screen height\n *\n * @private\n */\n _checkScreenHeight() {\n const LOW_RESOLUTION_VALUE = 900,\n LOW_HEIGHT_SELECTOR = 'cgp-low-height';\n\n let windowScreen = Device.viewport.height;\n\n if (windowScreen <= LOW_RESOLUTION_VALUE) {\n DOM.addClass(DOM.getHTML(), LOW_HEIGHT_SELECTOR);\n return this;\n }\n\n DOM.removeClass(DOM.getHTML(), LOW_HEIGHT_SELECTOR);\n return this;\n }\n\n /**\n * detect android os\n * @private\n */\n _checkIsAndroid() {\n if (Device.os.isAndroid) {\n DOM.addClass(DOM.getHTML(), 'cgp-android');\n }\n return this;\n }\n\n /**\n * detect ipad real device. we need it because ipad in OS 13 don't recognize as mobile.\n */\n _checkIpadDevice() {\n if(Device.isProbablyIPad) {\n DOM.addClass(DOM.getHTML(), 'cgp-ipad-device');\n }\n\n return this;\n }\n\n /**\n * Detect mobile operation system - and not mobile OS to detect \"fake\" mobile(when user shrink the screen on PC)\n * @private\n */\n _checkMobileOS() {\n if (!Device.os.isMobileOS) {\n DOM.addClass(DOM.getHTML(), 'cgp-not-mobile-os'); // @todo: deprecated, should be removed from all code.\n } else {\n DOM.addClass(DOM.getHTML(), 'cgp-real-mobile');\n }\n\n return this;\n }\n\n\n /**\n * Detect iphone version\n * @private\n */\n _checkIphoneVersion() {\n if (Device.model.isIphone) {\n DOM.addClass(DOM.getHTML(), 'cgp-iphone-ver-' + Device.getIphoneVersion());\n }\n\n return this;\n }\n\n\n /**\n * Detect IsHybrid\n * @private\n */\n _checkIsHybrid() {\n if (Device.hybrid.inCasino) {\n DOM.addClass(DOM.getHTML(), 'cgp-hybrid');\n }\n\n return this;\n }\n\n _checkIsEmbeddedHybrid() {\n if (Device.hybrid.isEmbedded) {\n DOM.addClass(DOM.getHTML(), 'cgp-embedded-hybrid');\n }\n\n return this;\n }\n\n /**\n * @description Add style tag to the body with the screen height (portrait/landscape) + 1px\n * We add the height + 1px to the body for swipe purposes -This enabled the scroll momentum and then the user be able to minimize the address bar\n * @Note This style will effect the body only when a game is open (cgp-game-open class will be added to the body)\n * @return {ResizeDetectorService}\n * @private\n */\n _addStyleTagForEvoGames(){\n let styleTag;\n\n if(Device.os.isMobileOS){\n //Calc screen height\n let screenHeight;\n\n if (Device.viewport.width > Device.viewport.height) {\n screenHeight = Math.min(Device.viewport.screenWidth, Device.viewport.screenHeight);\n } else {\n screenHeight = Math.max(Device.viewport.screenWidth, Device.viewport.screenHeight);\n }\n\n //We add 1px to the body for Swipe purposes. This enabled to have scroll momentum. (and then the user be able to minimize the address bar)\n let cssClass = `.cgp-mobile body.cgp-game-open.cgp-overlay-open{ height: ${screenHeight + 1}px}`;\n\n //Check if the style tag already exists - if so remove it before we are adding new one with the updated height\n styleTag = document.getElementById('cgp-style-game-frame');\n if(styleTag){\n DOM.removeElement(DOM.getBody(), styleTag);\n }\n\n styleTag = DOM.injectStyleToDOM(cssClass);\n DOM.addAttribute(styleTag, 'id', 'cgp-style-game-frame');\n }\n\n return this;\n }\n}\n\n\nexport default ResizeDetectorService;","import BaseObject from '../../../base/base_object';\nimport IRestrictionValueBase from './restriction_value_base_interface';\n\nexport default class NoRestrictionValue extends BaseObject implements IRestrictionValueBase {\n static CLASS = 'NoRestrictionValue';\n\n public isGameAllowedInTheGrid(): boolean {\n return true;\n }\n\n public isGameAllowedToPlayReal(): boolean {\n return true;\n }\n\n public showUserMessage(): void {\n }\n\n\n public isExpired(): boolean {\n return true;\n }\n\n public isActiveRestrictionForOpenApplication(): boolean {\n return false;\n }\n}\n","import BaseObject from '../../../base/base_object';\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport Event from '../../../utils/event';\nimport DateFormatter from '../../../utils/date_formatter';\nimport ServiceFactory from '../../service_factory';\nimport IRestrictionMessages from './restriction_messages_interface';\n\n\nconst DEFAULT_DATETIME_FORMATTING = 'dd.mm.yyyy H:MM';\n\nexport default class RestrictionMessages extends BaseObject implements IRestrictionMessages{\n static CLASS = 'GenericRestrictionMessage';\n private _serviceFactory: ServiceFactory;\n\n init(params) {\n super.init(params);\n this._serviceFactory = params.serviceFactory;\n }\n\n public showGenericMessage(): void {\n Event.fire(SYSTEM_EVENTS.MESSAGE_OPEN, {\n text: this._serviceFactory.languageService().translation('100200'),\n customCSSClassList: ['cgp-mdp-text-support-slash-n'],\n type: 'error',\n analytic: {category: 'Client_RestrictionError'}\n });\n }\n\n public showSessionLimitMessage(expirationDate: any): void {\n Event.fire(SYSTEM_EVENTS.MESSAGE_OPEN, {\n title: this._serviceFactory.languageService().translation('generic_notification_popup_title'),\n text: this._serviceFactory.languageService().translation('gambling_session_self_restriction_message', {\n restrictionExpirationDate: this._formatDate(expirationDate)\n }),\n type: 'error',\n analytic: {category: 'Client_SelfRestrictionError'}\n });\n }\n\n private _formatDate(date: any) {\n return DateFormatter.format(date, this._serviceFactory.skinService().getDateTimeFormat() || DEFAULT_DATETIME_FORMATTING);\n }\n}","import DateTimeUtils from '../../../utils/date_time_utils';\nimport RestrictionMessages from '../messages/restriction_messages';\nimport ServiceFactory from '../../service_factory';\nimport IRestrictionMessages from '../messages/restriction_messages_interface';\nimport BaseObject from '../../../base/base_object';\nimport IRestrictionValueBase from './restriction_value_base_interface';\n\nconst RESTRICTION_REASONS = {\n SESSION_LIMIT_REACHED: '8'\n};\n\nconst RESTRICTION_ACTIONS = {\n PLAY: '3',\n OPEN_APPLICATION: '4'\n};\n\n\nexport default class GenericRestrictionValue extends BaseObject implements IRestrictionValueBase {\n static CLASS = 'GenericRestrictionValue';\n private _serviceFactory: ServiceFactory = null;\n private _actionId: string;\n private _reasonId: string;\n private _value: string;\n private _expirationDate: number | null;\n\n\n init(params) {\n super.init(params);\n this._serviceFactory = params.serviceFactory;\n this._createRestrictionMessage = params.createRestrictionMessage || this._createRestrictionMessage;\n\n this._actionId = params.actionId.toString();\n this._reasonId = params.restrictionData.ReasonId && params.restrictionData.ReasonId.toString();\n this._value = params.restrictionData.Value && params.restrictionData.Value.toString().toLowerCase();\n if(params.restrictionData.ExpirationDate) {\n const date = this._serviceFactory.timeService().parseDate(params.restrictionData.ExpirationDate);\n this._expirationDate = date.getTime() - date.getTimezoneOffset() * 60 * 1000;\n } else if(params.restrictionData.SecondsToExpire) {\n this._expirationDate = this._serviceFactory.timeService().now() + DateTimeUtils.secondsToMilliseconds(params.restrictionData.SecondsToExpire);\n }\n\n }\n\n\n public isExpired(): boolean {\n if(!this._expirationDate) {\n return false;\n }\n\n return this._expirationDate < this._serviceFactory.timeService().now();\n }\n\n public isGameAllowedInTheGrid(): boolean {\n return this.isExpired()\n || this._reasonId === RESTRICTION_REASONS.SESSION_LIMIT_REACHED\n || this._value === 'all';\n }\n\n public isGameAllowedToPlayReal(): boolean {\n return this.isExpired();\n }\n\n public isActiveRestrictionForOpenApplication(): boolean {\n return !this.isExpired() && this._actionId === RESTRICTION_ACTIONS.OPEN_APPLICATION;\n }\n\n private _createRestrictionMessage(): IRestrictionMessages {\n return RestrictionMessages.create({\n serviceFactory: this._serviceFactory\n });\n }\n\n public showUserMessage(): void {\n const restrictionMessages = this._createRestrictionMessage();\n if(this._reasonId === RESTRICTION_REASONS.SESSION_LIMIT_REACHED) {\n restrictionMessages.showSessionLimitMessage(this._expirationDate);\n } else {\n restrictionMessages.showGenericMessage();\n }\n }\n}","import BaseObject from '../../../base/base_object';\nimport ServiceFactory from '../../service_factory';\nimport GenericRestrictionValue from '../values/generic_restriction_value';\nimport IRestrictionValueBase from '../values/restriction_value_base_interface';\n\nexport interface IRestrictionValueFactory {\n createRestrictionValue(actionId: number, restrictionData: any): IRestrictionValueBase;\n}\n\nclass RestrictionValueFactory extends BaseObject implements IRestrictionValueFactory{\n static CLASS = 'RestrictionValueFactory';\n private _serviceFactory: ServiceFactory;\n\n init(params) {\n super.init(params);\n this._serviceFactory = params.serviceFactory;\n }\n\n public createRestrictionValue(actionId: number, restrictionData: any): IRestrictionValueBase {\n return GenericRestrictionValue.create({\n serviceFactory: this._serviceFactory,\n restrictionData: restrictionData,\n actionId: actionId,\n });\n }\n}\n\nexport { RestrictionValueFactory };","import BaseObject from '../../../base/base_object';\nimport NoRestrictionValue from '../values/no_restriction_value';\nimport { IRestrictionValueFactory, RestrictionValueFactory } from './value_factory';\nimport ServiceFactory from '../../service_factory';\nimport IRestrictionValueBase from '../values/restriction_value_base_interface';\nimport IRestrictionsPool, { IRestrictionsMap } from './restrictions_pool_interface';\n\nconst RESTRICTION_ENTITY_TYPE = {\n SUB_BRAND: '1',\n GAME_TYPE: '2',\n PACKAGE: '3',\n GAME_GROUP: '8',\n GAME_VENDOR: '9'\n};\n\nexport default class RestrictionsPool extends BaseObject implements IRestrictionsPool {\n static CLASS = 'RestrictionsPool';\n private _serviceFactory: ServiceFactory;\n private _restrictionValueFactory: IRestrictionValueFactory;\n private _currentPackageId: string;\n private _currentSubBrandId: string;\n private _noRestriction: IRestrictionValueBase;\n private _restrictionsMap: IRestrictionsMap;\n\n init(params) {\n super.init(params);\n this._serviceFactory = params.serviceFactory;\n this._restrictionValueFactory = params.restrictionValueFactory || RestrictionValueFactory.create({\n serviceFactory: params.serviceFactory\n });\n\n this._currentPackageId = this._serviceFactory.skinService().getProductPackageID().toString();\n this._currentSubBrandId = this._serviceFactory.skinService().getSubBrandID().toString();\n\n this._noRestriction = NoRestrictionValue.create();\n this._loadRestrictions(params.restrictionsByAction);\n }\n\n public getGameRestriction(gameType: number, gameGroupId: number, vendorID: number): any {\n const restriction = this._getFirstNonExpiredRestriction(\n this._restrictionsMap.allGameTypes,\n this._restrictionsMap.gameGroups[gameGroupId],\n this._restrictionsMap.gameVendors[vendorID],\n this._restrictionsMap.gameTypes[gameType],\n this._restrictionsMap.currentSubBrand,\n this._restrictionsMap.currentPackage);\n\n return restriction;\n }\n\n public isPackageRestrictedForOpen(): boolean {\n for(let i = 0; i < this._restrictionsMap.currentPackage.length; i++) {\n const packageRestriction = this._restrictionsMap.currentPackage[i];\n if(packageRestriction.isActiveRestrictionForOpenApplication()) {\n return true;\n }\n }\n return false;\n }\n\n public isSubBrandRestrictedForOpen(): boolean {\n for(let i = 0; i < this._restrictionsMap.currentSubBrand.length; i++) {\n const subBrandRestriction = this._restrictionsMap.currentSubBrand[i];\n if(subBrandRestriction.isActiveRestrictionForOpenApplication()) {\n return true;\n }\n }\n return false;\n }\n\n private _getFirstNonExpiredRestriction(...restrictionSections: any[]): any {\n for(let i = 0; i < restrictionSections.length; i++) {\n const section = restrictionSections[i];\n if(section) {\n for(let j = 0; j < section.length; j++) {\n const restrictionValue = section[j];\n if(!restrictionValue.isExpired()) {\n return restrictionValue;\n }\n }\n }\n }\n\n return this._noRestriction;\n }\n\n\n private _createRestrictionValue(actionId: any, restrictionData: any): IRestrictionValueBase {\n return this._restrictionValueFactory.createRestrictionValue(actionId, restrictionData);\n }\n\n\n private _loadRestrictions(restrictionsByAction: any[]): void {\n\n const restrictionsMap = this._initRestrictionsMap();\n\n if(restrictionsByAction) {\n restrictionsByAction.forEach(restrictionByAction => {\n restrictionByAction.Entities.forEach(restrictionEntity => {\n this._appendRestrictionEntityValues(restrictionsMap, restrictionByAction.ActionId, restrictionEntity);\n });\n });\n }\n\n this._restrictionsMap = restrictionsMap;\n }\n\n private _initRestrictionsMap(): IRestrictionsMap {\n return {\n gameTypes: {\n },\n gameGroups: {\n\n },\n gameVendors: {\n\n },\n allGameTypes: [],\n currentPackage: [],\n currentSubBrand: []\n };\n }\n\n\n private _appendRestrictionEntityValues(restrictionsMap: IRestrictionsMap, actionId: any, restrictionEntity: any): void {\n try {\n if (!(restrictionEntity && restrictionEntity.Values && restrictionEntity.EntityId)) {\n return;\n }\n\n switch (restrictionEntity.EntityId.toString()) {\n\n case RESTRICTION_ENTITY_TYPE.GAME_GROUP:\n restrictionEntity.Values.forEach(restrictionValue => {\n const gameGroupRestrictions = this._initRestrictionsMapSection(restrictionsMap, 'gameGroups',restrictionValue.Value);\n gameGroupRestrictions.push(this._createRestrictionValue(actionId, restrictionValue));\n });\n break;\n\n case RESTRICTION_ENTITY_TYPE.GAME_TYPE:\n restrictionEntity.Values.forEach(restrictionValue => {\n if(restrictionValue.Value.toLowerCase() === 'all') {\n const allGameTypesRestrictions = this._initRestrictionsMapSection(restrictionsMap, 'allGameTypes');\n allGameTypesRestrictions.push(this._createRestrictionValue(actionId, restrictionValue));\n } else {\n const gameTypeRestrictions = this._initRestrictionsMapSection(restrictionsMap, 'gameTypes', restrictionValue.Value);\n gameTypeRestrictions.push(this._createRestrictionValue(actionId, restrictionValue));\n }\n\n });\n break;\n\n case RESTRICTION_ENTITY_TYPE.PACKAGE:\n restrictionEntity.Values.forEach(restrictionValue => {\n if(restrictionValue.Value.toString() === this._currentPackageId) {\n const currentPackageRestrictions = this._initRestrictionsMapSection(restrictionsMap, 'currentPackage');\n currentPackageRestrictions.push(this._createRestrictionValue(actionId, restrictionValue));\n }\n });\n break;\n\n case RESTRICTION_ENTITY_TYPE.SUB_BRAND:\n restrictionEntity.Values.forEach(restrictionValue => {\n if(restrictionValue.Value.toString() === this._currentSubBrandId) {\n const currentSubBrandRestrictions = this._initRestrictionsMapSection(restrictionsMap, 'currentSubBrand');\n currentSubBrandRestrictions.push(this._createRestrictionValue(actionId, restrictionValue));\n }\n });\n break;\n\n case RESTRICTION_ENTITY_TYPE.GAME_VENDOR:\n restrictionEntity.Values.forEach(restrictionValue => {\n const gameVendorRestrictions = this._initRestrictionsMapSection(restrictionsMap, 'gameVendors',restrictionValue.Value);\n gameVendorRestrictions.push(this._createRestrictionValue(actionId, restrictionValue));\n });\n break;\n\n case '10':\n this.logger.debug( `restriction entity 10 (childish games) is ignore by Orbit, behind the scenes Platform are converting it to restriction on play/open application for all the relevant game type`);\n //in the future they should remove the duplication so we'll not get the entity 9 (GameVendor) at all\n break;\n default:\n this.logger.error('183', ` restriction entity id ${restrictionEntity.EntityId} is not supported`);\n\n }\n } catch(err) {\n this.logger.error('187', `Can't handle restriction due to Error: ${err}`);\n }\n }\n\n private _initRestrictionsMapSection(restrictionsMap: IRestrictionsMap, sectionName: string, value?: any) {\n let section = null;\n if(value) {\n section = restrictionsMap[sectionName][value];\n } else {\n section = restrictionsMap[sectionName];\n }\n if(!section) {\n section = [];\n if(value) {\n restrictionsMap[sectionName][value] = section;\n } else {\n restrictionsMap[sectionName] = section;\n }\n }\n return section;\n }\n}\n\n","import BaseObject from '../../../base/base_object';\nimport RestrictionsPool from '../pool/restrictions_pool';\nimport Event from '../../../utils/event';\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport ServiceFactory from '../../service_factory';\nimport IRestrictionsPool from '../pool/restrictions_pool_interface';\nimport IRestrictionsStrategyBase from './restrictions_strategy_base_interface';\n\n\nexport default abstract class RestrictionsStrategyBase extends BaseObject implements IRestrictionsStrategyBase {\n static CLASS = 'RestrictionsStrategyBase';\n //protected _serviceFactory: ServiceFactory;\n protected _serviceFactoryCallback: () => ServiceFactory;\n protected abstract getRestrictionsPool(): IRestrictionsPool;\n\n init(params) {\n super.init(params);\n this._serviceFactoryCallback = params.getServiceFactoryCallback;\n }\n\n protected get _serviceFactory(): ServiceFactory {\n return this._serviceFactoryCallback();\n }\n\n public get restrictionsPool(): IRestrictionsPool {\n return this.getRestrictionsPool();\n }\n\n doAsyncJobs() {\n return Promise.resolve();\n }\n\n public setRestrictions(restrictions: any): void {\n\n }\n\n protected _createRestrictionsPool(restrictionsByAction: any[]): IRestrictionsPool {\n restrictionsByAction = restrictionsByAction || [];\n return RestrictionsPool.create({\n serviceFactory: this._serviceFactory,\n restrictionsByAction: restrictionsByAction\n });\n }\n\n public getGameRestriction(gameType: number, gameGroupId: number, vendorId: number): any {\n return this.restrictionsPool.getGameRestriction(gameType, gameGroupId, vendorId);\n }\n\n public isApplicationRestricted(): boolean {\n if(this.restrictionsPool.isPackageRestrictedForOpen()) {\n this.logger.warn('Application is restricted because of package restriction for OpenApplication. Current product package ID is: ' + this._serviceFactory.skinService().getProductPackageID());\n this._sendRestrictionAnalytics('OpenPackageRestriction', this._serviceFactory.skinService().getProductPackageID());\n return true;\n }\n\n if(this.restrictionsPool.isSubBrandRestrictedForOpen()) {\n this.logger.warn('Application is restricted because of sub brand restriction for OpenApplication. Current sub brand ID is ' + this._serviceFactory.skinService().getSubBrandID());\n this._sendRestrictionAnalytics('OpenSubBrandRestriction', this._serviceFactory.skinService().getSubBrandID());\n return true;\n }\n\n return false;\n }\n\n private _sendRestrictionAnalytics(label: string, value: number): void {\n const analyticsData = {\n category: '[Technical-event]',\n action: 'Restrictions',\n label: label,\n value: value\n };\n\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, analyticsData)\n }\n\n}","import RestrictionsStrategyBase from './restrictions_strategy_base';\nimport Event from '../../../utils/event';\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport IRestrictionsPool from '../pool/restrictions_pool_interface';\n\nexport default class AnonymousRestrictionsStrategy extends RestrictionsStrategyBase {\n static CLASS = 'AnonymousRestrictionsStrategy';\n private _anonymousRestrictionsUri: string;\n private _restrictionsByAction: any[];\n private _restrictionsPool: IRestrictionsPool = null;\n\n\n init(params) {\n super.init(params);\n this._anonymousRestrictionsUri = params.anonymousRestrictionsUri;\n this._restrictionsByAction = params.anonymousRestrictions && params.anonymousRestrictions.RestrictionsByAction;\n }\n\n\n public getRestrictionsPool(): IRestrictionsPool {\n if(!this._restrictionsPool) {\n this._restrictionsPool = this._createRestrictionsPool(this._restrictionsByAction);\n }\n return this._restrictionsPool;\n }\n\n doAsyncJobs() {\n\n if(this._restrictionsByAction) {\n return Promise.resolve();\n }\n\n const skinService = this._serviceFactory.skinService();\n const request = {\n BrandId: skinService.getBrandID(),\n SubBrandId: skinService.getSubBrandID(),\n ProductPackage: skinService.getProductPackageID(),\n ClientVersion: skinService.getVersion()\n };\n\n return this._serviceFactory.http2Service()\n .post(this._anonymousRestrictionsUri, request)\n .then(data => {\n this._restrictionsByAction = data && (data as any).RestrictionsByAction;\n if(!this._serviceFactory.oAuth2Service().isAuthorized()) {\n Event.fire(SYSTEM_EVENTS.RESTRICTIONS_CHANGED);\n }\n });\n\n }\n\n //Used by automation team\n public setRestrictions(restrictions: any): void {\n if(restrictions.anonymousRestrictions) {\n this._restrictionsPool = this._createRestrictionsPool(restrictions.anonymousRestrictions.RestrictionsByAction);\n }\n }\n}","import RestrictionsStrategyBase from './restrictions_strategy_base';\nimport _ from '../../../utils/underscore';\nimport Event from '../../../utils/event';\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport Store from '../../../utils/store';\nimport IRestrictionsPool from '../pool/restrictions_pool_interface';\n\nconst RESTRICTION_STORAGE_KEY = 'last-restrictions';\nexport default class AuthorizedRestrictionsStrategy extends RestrictionsStrategyBase {\n static CLASS = 'AuthorizedRestrictionsStrategy';\n\n init(params) {\n super.init(params);\n this._subscribe();\n }\n\n private _restrictionsPool: IRestrictionsPool = null;\n\n public getRestrictionsPool(): IRestrictionsPool {\n if(!this._restrictionsPool) {\n this._loadRestrictions();\n }\n\n return this._restrictionsPool;\n }\n\n private _subscribe(): void {\n Event.on(SYSTEM_EVENTS.SESSION_EVENT_UPDATERESTRICTION_RECEIVED, this._onUpdateRestrictions, this);\n\n Event.on(SYSTEM_EVENTS.APP_RESUMED, () => {\n this._loadRestrictions(); // update restrictions cache\n }, this);\n\n Event.on(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, () => {\n if (this._serviceFactory.oAuth2Service().isAuthorized()) {\n this._loadRestrictions();\n } else {\n this._restrictionsPool = null;\n Store.del(RESTRICTION_STORAGE_KEY);\n }\n });\n }\n\n\n //Create restriction pool with a new data restrictions and save in in local storage\n private _onUpdateRestrictions(data: any): void {\n this._restrictionsPool = this._createRestrictionsPool(data);\n Store.set(RESTRICTION_STORAGE_KEY, JSON.stringify(data));\n Event.fire(SYSTEM_EVENTS.RESTRICTIONS_CHANGED);\n }\n\n //Load restrictions from local storage or token and create new restriction pool\n private _loadRestrictions(): void {\n // check if there are restrictions in local storage\n let restrictionJSON = Store.get(RESTRICTION_STORAGE_KEY);\n if (!restrictionJSON) {\n restrictionJSON = this._serviceFactory.oAuth2Service().extractTokenProperty('restrictions');\n }\n this._createRestrictionsByAction(restrictionJSON);\n }\n\n\n //Create new restriction pool from restriction json data\n private _createRestrictionsByAction(restrictionJSON: string): void {\n const restrictionsData = _.safeJSON(restrictionJSON, null);\n\n let restrictionsByAction = [];\n if(restrictionsData) {\n if (_.isArray(restrictionsData)) {\n restrictionsByAction = restrictionsData;\n } else {\n restrictionsByAction.push(restrictionsData)\n }\n }\n this._restrictionsPool = this._createRestrictionsPool(restrictionsByAction);\n }\n}","import BaseService from '../../base/base_service';\nimport Event from '../../utils/event';\nimport {SYSTEM_EVENTS} from '../../events/events';\nimport AnonymousRestrictionsStrategy from './strategies/anonymous_restrictions_strategy';\nimport AuthorizedRestrictionsStrategy from './strategies/authorized_restrictions_strategy';\nimport Device from '../../utils/device/device';\nimport IRestrictions, { RestrictionsServiceInitParams } from './restrictions_service_interface';\n\n\ntype CurrentStrategy = AnonymousRestrictionsStrategy | AuthorizedRestrictionsStrategy;\n\nexport default class RestrictionsService extends BaseService implements IRestrictions {\n\n static CLASS: string = 'RestrictionsService';\n private _initParams: RestrictionsServiceInitParams = null;\n private _anonymousRestrictionsStrategy: AnonymousRestrictionsStrategy = null;\n private _authorizedRestrictionStrategy: AuthorizedRestrictionsStrategy = null;\n private _currentRestrictionsStrategy: CurrentStrategy = null;\n\n init(params: RestrictionsServiceInitParams) {\n super.init(params);\n this._setInitParams(params);\n\n // Anonymous restrictions are always the same and they do not change after the application loaded.\n // So that's why we cache them.\n this._anonymousRestrictionsStrategy = AnonymousRestrictionsStrategy.create(Object.assign(this._getCommonStrategyParams(), params));\n this._subscribe();\n }\n\n private _setInitParams(params: RestrictionsServiceInitParams): void {\n this._initParams = {\n hybridPermittedMap: params.hybridPermittedMap ? params.hybridPermittedMap : {}\n };\n }\n\n private _getCommonStrategyParams() {\n return {\n getServiceFactoryCallback: () => this.serviceFactory\n };\n }\n\n get currentRestrictionsStrategy() {\n if(!this._currentRestrictionsStrategy) {\n this._switchStrategy(false);\n }\n\n return this._currentRestrictionsStrategy;\n }\n\n private _switchStrategy(fireEvent: boolean = true): void {\n //this._currentRestrictionsStrategy.dispose();\n if(this.serviceFactory.oAuth2Service().isAuthorized()) {\n //if we are already in the authorized strategy then we dont't need to recreate it and fire the event\n if(!(this._currentRestrictionsStrategy instanceof AuthorizedRestrictionsStrategy)) {\n if (!this._authorizedRestrictionStrategy) {\n this._authorizedRestrictionStrategy = AuthorizedRestrictionsStrategy.create(this._getCommonStrategyParams());;\n }\n this._currentRestrictionsStrategy = this._authorizedRestrictionStrategy;\n if(fireEvent) {\n Event.fire(SYSTEM_EVENTS.RESTRICTIONS_CHANGED);\n }\n }\n\n } else {\n //if we are already in the anonymous strategy then we dont't to fire event\n if(!(this._currentRestrictionsStrategy instanceof AnonymousRestrictionsStrategy)) {\n this._currentRestrictionsStrategy = this._anonymousRestrictionsStrategy;\n if(fireEvent) {\n Event.fire(SYSTEM_EVENTS.RESTRICTIONS_CHANGED);\n }\n }\n }\n }\n\n private _onOauthStateChanged(): void {\n this._switchStrategy();\n }\n\n public getGameRestriction(gameType: number, gameGroupId: number, vendorId: number): any {\n return this.currentRestrictionsStrategy.getGameRestriction(gameType, gameGroupId, vendorId);\n }\n\n public doAsyncJobs(): Promise {\n return this._anonymousRestrictionsStrategy.doAsyncJobs()\n .then(() => this.showClientRestrictionMessage());\n }\n\n public showClientRestrictionMessage(): void {\n const languageService = this.serviceFactory.languageService();\n if (this._anonymousRestrictionsStrategy.isApplicationRestricted()) {\n\n const titleText = languageService.translation('restriction_for_use_title');\n const restrictionText = languageService.translation('restriction_for_use_text');\n\n Event.fire(SYSTEM_EVENTS.MESSAGE_OPEN, {title: titleText, text: restrictionText, hasDefaultButton: false, closeButton: false, customCSSClassList: ['mdp-mobile-full-size']});\n }\n }\n\n //This method is intended for automation team usage\n public applyRestrictions(restrictions: any): void {\n this._anonymousRestrictionsStrategy.setRestrictions(restrictions);\n }\n\n private _subscribe(): void {\n this.onSystemEvent(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, this._onOauthStateChanged);\n if(Device.hybrid.inCasino && Device.os.isIOS) {\n this.onSystemEvent(SYSTEM_EVENTS.ADD_TAG_OPEN_APP_VER, this._onHybridInfoComplete);\n }\n }\n\n //show country restriction message to user that use app that not permitted in his country.\n private _onHybridInfoComplete(): void {\n const country = this.serviceFactory.countryService().getCountry();\n const appID = this.serviceFactory.hybridService().getAppleID();\n const permittedMap = this._initParams.hybridPermittedMap;\n const permittedCountries = permittedMap[appID] || permittedMap.DEFAULT;\n this.logger.info('[RestrictionService] permittedCountries:' + permittedCountries + 'current country:' + country);\n\n if(permittedCountries !== 'All' && permittedCountries !== country) {\n this.logger.info('[RestrictionService] Hybrid restricted for user country, country:' + country);\n\n this._openRelevantRestrictionMessage(permittedMap.messageType, country);\n }\n }\n\n //Open relevant restriction message according to message type.\n private _openRelevantRestrictionMessage(messageType: string, country: string): void {\n this._sendRestrictionAnalytics('hybrid_restriction_country', 'restricted_country', country);\n\n switch (messageType) {\n case '1':\n this._openCountryRestricitonMessage();\n break;\n default:\n this._openCountryRestricitonMessage();\n break;\n }\n }\n\n //Open country restriction message.\n private _openCountryRestricitonMessage(): void {\n const languageService = this.serviceFactory.languageService();\n const titleText = languageService.translation('restriction_for_use_title');\n const restrictionText = languageService.translation('restriction_for_use_text');\n\n Event.fire(SYSTEM_EVENTS.MESSAGE_OPEN, {title: titleText, text: restrictionText, hasDefaultButton: false, closeButton: false, customCSSClassList: ['mdp-mobile-full-size']});\n }\n\n\n private _sendRestrictionAnalytics(action: string, label: string, value: string): void {\n const analyticsData = {\n category: 'Restrictions',\n action: action,\n label: label,\n value: value\n };\n\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, analyticsData)\n }\n\n}","import BaseService from '../../base/base_service';\nimport DOM from '../../utils/dom';\nimport IScriptLoaderService from './script_loader_service_interface';\nimport {LoadScriptOptions} from \"../../../../common/interfaces/load-script-options\";\n\nexport default class ScriptLoaderService extends BaseService implements IScriptLoaderService {\n static CLASS = 'ScriptLoaderService'\n\n private _loadedScripts: Record> = {};\n\n loadScript(options: LoadScriptOptions): Promise {\n\n if(!this._loadedScripts[options.url]) {\n this._loadedScripts[options.url] = this._createLoadScriptPromise(options);\n }\n\n return this._loadedScripts[options.url].catch(err => {\n delete this._loadedScripts[options.url];\n throw err;\n });\n }\n\n\n private _createLoadScriptPromise(options: LoadScriptOptions): Promise {\n return new Promise((resolve, reject) => {\n let loadScriptWithRetry = (retryCount: number) => {\n let scriptTag = document.createElement('script');\n const ignoreOneTrustAtt = document.createAttribute(\"data-ot-ignore\");\n scriptTag.setAttributeNode(ignoreOneTrustAtt);\n if(options.tagId) {\n scriptTag.id = options.tagId;\n }\n\n scriptTag.src = options.url;\n if(options.scriptType) {\n scriptTag.type = options.scriptType;\n }\n scriptTag.onload = () => resolve();\n scriptTag.onerror = (err) => {\n document.body.removeChild(scriptTag);\n if(retryCount === 0) {\n reject(err);\n this.logger.error(`Failed to load script: ${options.url}`);\n\n } else {\n DOM.setTimeout(() => loadScriptWithRetry(retryCount - 1), 500);\n }\n };\n\n document.body.appendChild(scriptTag);\n };\n\n loadScriptWithRetry(6);\n });\n }\n}\n","import ServicesRegistry from './services_registry';\r\nimport BaseSingleton from '../base/base_singleton';\r\nimport IAbTestingService from './ab_testing/ab_testing_service_interface';\r\nimport IAiListService from './ai_list/ai_list_service_interface';\r\nimport IAnalyticsService from './analytics/analytics_service_interface';\r\nimport ICasinofiedAnalyticsProxyService from './analytics/casinofied_analytics_proxy_service_interface';\r\nimport ICashierProxy from './cashier_proxy/cashier_proxy_service_interface';\r\nimport IClockService from './clock/clock_service_interface';\r\nimport IConfigService from './config/config_service_interface';\r\nimport ICountryService from './country/country_service_interface';\r\nimport ICurrencyService from './currency/currency_service_interface';\r\nimport IEvolutionService from './evolution/evolution_service_interface';\r\nimport IExternalLinksProxyService from './external_links_proxy/external_links_proxy_service_interface';\r\nimport IGameRunnerProxyService from './game/game_runner_proxy_service_interface';\r\nimport IGamesInformationService from './games_information/games_information_service_interface';\r\nimport ISdkGnwpService from './gnwp/gnwp_service_interface';\r\nimport IHistoryService from './history/history_service_interface';\r\nimport IHttp2Service from './http/http2_service_interface';\r\nimport ILanguageService from './language/language_service_interface';\r\nimport ILinksNavigationProxyService from './links_navigation_proxy/links_navigation_proxy_service_interface';\r\nimport IJackpotFeedsService from './live_feeds/jackpots/jackpot_feeds_service_interface';\r\nimport ILiveTablesService from './live_tables/live_tables_service_interface';\r\nimport IMessageManagerService from './message_manager/message_manager_service_interface';\r\nimport INetEntService from './netent/netent_service_interface';\r\nimport IUserService from './oauth/user/user_service_interface';\r\nimport IObservableFactoryService from './observable_factory/observable_factory_service_interface';\r\nimport IOrbitComponentRenderService from './orbit_component_renderer/orbit_component_render_service_interface';\r\nimport IOverlayManager from './overlay_manager/overlay_manager_service_interface';\r\nimport IRecentlyPlayedService from './recently_played/recently_played_service_interface';\r\nimport IRestrictions from './restrictions/restrictions_service_interface';\r\nimport IScriptLoaderService from './script_loader/script_loader_service_interface';\r\nimport ISkinService from './skin/skin_service_interface';\r\nimport StructuredLoggingServiceInterface from './structured_logging/structured_logging_service_interface';\r\nimport ITimeService from './time/time_service_interface';\r\nimport IToasterProxyService from './toaster/toaster_proxy_service_interface';\r\nimport IWebPushService from './web_push/web_push_service_interface';\r\nimport IWindowService from './window/window_service_interface';\r\n\r\nexport default class ServiceFactory extends BaseSingleton {\r\n\r\n\tprivate servicesRegistry: ServicesRegistry;\r\n\r\n\tinit() {\r\n\t\tthis.servicesRegistry = ServicesRegistry.create({});\r\n\t}\r\n\tabTestingService(): IAbTestingService {\n\t\treturn this.servicesRegistry.getService('AbTestingService') as IAbTestingService;\n\t}\r\n\taiListService(): IAiListService {\n\t\treturn this.servicesRegistry.getService('AiListService') as IAiListService;\n\t}\r\n\tanalyticsService(): IAnalyticsService {\n\t\treturn this.servicesRegistry.getService('AnalyticsService') as IAnalyticsService;\n\t}\r\n\tcasinofiedAnalyticsProxyService(): ICasinofiedAnalyticsProxyService {\n\t\treturn this.servicesRegistry.getService('CasinofiedAnalyticsProxyService') as ICasinofiedAnalyticsProxyService;\n\t}\r\n\tbonusAbuseParkingMoneyInSportAndPokerService(): any {\n\t\treturn this.servicesRegistry.getService('BonusAbuseParkingMoneyInSportAndPokerService');\n\t}\r\n\tcashierProxyService(): ICashierProxy {\n\t\treturn this.servicesRegistry.getService('CashierProxyService') as ICashierProxy;\n\t}\r\n\tclockService(): IClockService {\n\t\treturn this.servicesRegistry.getService('ClockService') as IClockService;\n\t}\r\n\tcomponentFactoryService(): any {\n\t\treturn this.servicesRegistry.getService('ComponentFactoryService');\n\t}\r\n\tconfigService(): IConfigService {\n\t\treturn this.servicesRegistry.getService('ConfigService') as IConfigService;\n\t}\r\n\tcountryService(): ICountryService {\n\t\treturn this.servicesRegistry.getService('CountryService') as ICountryService;\n\t}\r\n\tcurrencyService(): ICurrencyService {\n\t\treturn this.servicesRegistry.getService('CurrencyService') as ICurrencyService;\n\t}\r\n\tdomainDetectionService(): any {\n\t\treturn this.servicesRegistry.getService('DomainDetectionService');\n\t}\r\n\tevolutionService(): IEvolutionService {\n\t\treturn this.servicesRegistry.getService('EvolutionService') as IEvolutionService;\n\t}\r\n\texternalLinksProxyService(): IExternalLinksProxyService {\n\t\treturn this.servicesRegistry.getService('ExternalLinksProxyService') as IExternalLinksProxyService;\n\t}\r\n\tgameRunnerProxyService(): IGameRunnerProxyService {\n\t\treturn this.servicesRegistry.getService('GameRunnerProxyService') as IGameRunnerProxyService;\n\t}\r\n\tgameService(): any {\n\t\treturn this.servicesRegistry.getService('GameService');\n\t}\r\n\tgamesCorrelationService(): any {\n\t\treturn this.servicesRegistry.getService('GamesCorrelationService');\n\t}\r\n\tgamesInformationService(): IGamesInformationService {\n\t\treturn this.servicesRegistry.getService('GamesInformationService') as IGamesInformationService;\n\t}\r\n\tgamesQuestionnaireService(): any {\n\t\treturn this.servicesRegistry.getService('GamesQuestionnaireService');\n\t}\r\n\tgameManagerService(): any {\n\t\treturn this.servicesRegistry.getService('GameManagerService');\n\t}\r\n\tgameReasonService(): any {\n\t\treturn this.servicesRegistry.getService('GameReasonService');\n\t}\r\n\tgnwpService(): ISdkGnwpService {\n\t\treturn this.servicesRegistry.getService('GnwpService') as ISdkGnwpService;\n\t}\r\n\thistoryService(): IHistoryService {\n\t\treturn this.servicesRegistry.getService('HistoryService') as IHistoryService;\n\t}\r\n\thttp2Service(): IHttp2Service {\n\t\treturn this.servicesRegistry.getService('Http2Service') as IHttp2Service;\n\t}\r\n\thybridService(): any {\n\t\treturn this.servicesRegistry.getService('HybridService');\n\t}\r\n\thybridVersionHandlerService(): any {\n\t\treturn this.servicesRegistry.getService('HybridVersionHandlerService');\n\t}\r\n\tidleRecommendationsService(): any {\n\t\treturn this.servicesRegistry.getService('IdleRecommendationsService');\n\t}\r\n\tintegrationService(): any {\n\t\treturn this.servicesRegistry.getService('IntegrationService');\n\t}\r\n\tjackpotToastersService(): any {\n\t\treturn this.servicesRegistry.getService('JackpotToastersService');\n\t}\r\n\tlanguageService(): ILanguageService {\n\t\treturn this.servicesRegistry.getService('LanguageService') as ILanguageService;\n\t}\r\n\tlinksNavigationProxyService(): ILinksNavigationProxyService {\n\t\treturn this.servicesRegistry.getService('LinksNavigationProxyService') as ILinksNavigationProxyService;\n\t}\r\n\tjackpotFeedsService(): IJackpotFeedsService {\n\t\treturn this.servicesRegistry.getService('JackpotFeedsService') as IJackpotFeedsService;\n\t}\r\n\tliveTablesService(): ILiveTablesService {\n\t\treturn this.servicesRegistry.getService('LiveTablesService') as ILiveTablesService;\n\t}\r\n\tmessageManagerService(): IMessageManagerService {\n\t\treturn this.servicesRegistry.getService('MessageManagerService') as IMessageManagerService;\n\t}\r\n\tnetEntService(): INetEntService {\n\t\treturn this.servicesRegistry.getService('NetEntService') as INetEntService;\n\t}\r\n\toAuth2Service(): any {\n\t\treturn this.servicesRegistry.getService('OAuth2Service');\n\t}\r\n\tuserService(): IUserService {\n\t\treturn this.servicesRegistry.getService('UserService') as IUserService;\n\t}\r\n\tobservableFactoryService(): IObservableFactoryService {\n\t\treturn this.servicesRegistry.getService('ObservableFactoryService') as IObservableFactoryService;\n\t}\r\n\torbitComponentRenderService(): IOrbitComponentRenderService {\n\t\treturn this.servicesRegistry.getService('OrbitComponentRenderService') as IOrbitComponentRenderService;\n\t}\r\n\toverlayManagerService(): IOverlayManager {\n\t\treturn this.servicesRegistry.getService('OverlayManagerService') as IOverlayManager;\n\t}\r\n\tplayerMigrationProxyService(): any {\n\t\treturn this.servicesRegistry.getService('PlayerMigrationProxyService');\n\t}\r\n\tplayerMessagesService(): any {\n\t\treturn this.servicesRegistry.getService('PlayerMessagesService');\n\t}\r\n\tfallbackService(): any {\n\t\treturn this.servicesRegistry.getService('FallbackService');\n\t}\r\n\tfirebaseElasticService(): any {\n\t\treturn this.servicesRegistry.getService('FirebaseElasticService');\n\t}\r\n\tpostMessageService(): any {\n\t\treturn this.servicesRegistry.getService('PostMessageService');\n\t}\r\n\tqueryStringDetectorService(): any {\n\t\treturn this.servicesRegistry.getService('QueryStringDetectorService');\n\t}\r\n\trecentlyPlayedService(): IRecentlyPlayedService {\n\t\treturn this.servicesRegistry.getService('RecentlyPlayedService') as IRecentlyPlayedService;\n\t}\r\n\tregulationService(): any {\n\t\treturn this.servicesRegistry.getService('RegulationService');\n\t}\r\n\tresizeDetectorService(): any {\n\t\treturn this.servicesRegistry.getService('ResizeDetectorService');\n\t}\r\n\trestrictionsService(): IRestrictions {\n\t\treturn this.servicesRegistry.getService('RestrictionsService') as IRestrictions;\n\t}\r\n\tscriptLoaderService(): IScriptLoaderService {\n\t\treturn this.servicesRegistry.getService('ScriptLoaderService') as IScriptLoaderService;\n\t}\r\n\tskinService(): ISkinService {\n\t\treturn this.servicesRegistry.getService('SkinService') as ISkinService;\n\t}\r\n\tspinnerProxyService(): any {\n\t\treturn this.servicesRegistry.getService('SpinnerProxyService');\n\t}\r\n\tstructuredLoggingService(): StructuredLoggingServiceInterface {\n\t\treturn this.servicesRegistry.getService('StructuredLoggingService') as StructuredLoggingServiceInterface;\n\t}\r\n\tthemesService(): any {\n\t\treturn this.servicesRegistry.getService('ThemesService');\n\t}\r\n\ttimeService(): ITimeService {\n\t\treturn this.servicesRegistry.getService('TimeService') as ITimeService;\n\t}\r\n\ttoasterProxyService(): IToasterProxyService {\n\t\treturn this.servicesRegistry.getService('ToasterProxyService') as IToasterProxyService;\n\t}\r\n\ttrackjsService(): any {\n\t\treturn this.servicesRegistry.getService('TrackjsService');\n\t}\r\n\tvisibilityDetectorService(): any {\n\t\treturn this.servicesRegistry.getService('VisibilityDetectorService');\n\t}\r\n\twalletService(): any {\n\t\treturn this.servicesRegistry.getService('WalletService');\n\t}\r\n\twebLoginService(): any {\n\t\treturn this.servicesRegistry.getService('WebLoginService');\n\t}\r\n\twebPushService(): IWebPushService {\n\t\treturn this.servicesRegistry.getService('WebPushService') as IWebPushService;\n\t}\r\n\twindowService(): IWindowService {\n\t\treturn this.servicesRegistry.getService('WindowService') as IWindowService;\n\t}\r\n}\r\n\r\n","import BaseSingleton from '../base/base_singleton';\nimport ServiceFactory from './service_factory';\n\n\nexport default class ServicesRegistry extends BaseSingleton {\n\n static CLASS = 'ServicesRegistry';\n\n _services: any = {};\n\n registerService(servicePrototype: any) : void {\n this._services[servicePrototype.CLASS] = {\n servicePrototype: servicePrototype\n };\n }\n\n getService(className: string): any {\n let serviceDescriptor = this._services[className];\n if (!serviceDescriptor) {\n this.throwError('20', 'There is no registered service with CLASS ' + className, null);\n }\n let serviceInstance = serviceDescriptor.servicePrototype.create();\n if(!serviceDescriptor.dependenciesInjected) {\n serviceInstance.injectDependencies({\n createServiceFactoryFunction: () => ServiceFactory.create({})\n });\n serviceDescriptor.dependenciesInjected = true;\n }\n return serviceInstance;\n }\n}\n\n","import BaseSingleton from '../../../base/base_singleton';\nimport Device from '../../../utils/device/device';\n\nexport interface ProductPackageParams {\n webapp: {\n pc: number,\n iphone: number,\n ipad: number,\n other: number,\n }\n native: {\n iphone: number,\n ipad: number,\n other: number,\n }\n}\n\nconst DEVICE_TYPE = {\n PC: 'pc',\n OTHER: 'other',\n IPHONE_NATIVE: 'iphone',\n IPHONE: 'iphone',\n IPAD_NATIVE: 'ipad',\n IPAD: 'ipad'\n};\n\n/**\n */\nexport default class ProductPackage extends BaseSingleton {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'ProductPackage';\n\n\n /**\n * @property\n * @type {object|null}\n * @private\n */\n private _params: ProductPackageParams = null;\n\n\n /**\n *\n * @param params\n */\n init(params: ProductPackageParams) {\n this._params = params;\n }\n\n /**\n * Used to detected if user clicked and loaded the app using home screen\n *\n * @returns {boolean} - Returns true if the app is running in standalone mode (iOS only)\n */\n private getDeviceTypeName(): string {\n\n const hybridTypeByDevice = () => {\n if (Device.model.isIphone) {\n return DEVICE_TYPE.IPHONE_NATIVE;\n } else if (Device.model.isIpad) {\n return DEVICE_TYPE.IPAD_NATIVE;\n }\n\n return DEVICE_TYPE.OTHER;\n };\n\n const notHybridTypeByDevice = () => {\n\n if (Device.model.isIphone) {\n return DEVICE_TYPE.IPHONE;\n } else if (Device.model.isIpad) {\n return DEVICE_TYPE.IPAD;\n } else if (Device.os.isMobileOS) {\n return DEVICE_TYPE.OTHER;\n }\n\n return DEVICE_TYPE.PC\n };\n\n if (!Device.hybrid.inCasino) {\n return notHybridTypeByDevice();\n }\n\n return hybridTypeByDevice();\n }\n\n /**\n * Getter pkg id\n *\n */\n getProductPackageID(): number {\n const type = this.getDeviceTypeName();\n\n let packageId = 0;\n if (Device.hybrid.isHybrid) {\n packageId = (this._params.native as any)[type];\n } else {\n packageId = (this._params.webapp as any)[type];\n }\n return packageId;\n }\n\n\n /**\n * Get 'pc' key from webapp\n */\n getProductPackageGroupPC(): number[] {\n return [this._params.webapp.pc];\n }\n\n\n /**\n * Get all mobile packages id except one for 'pc' key\n */\n getProductPackageGroupMobile(): number[] {\n let filterPackages = (productPackageGroup: ProductPackageParams[\"webapp\"] | ProductPackageParams[\"native\"]) => {\n return Object.keys(productPackageGroup).reduce((acc, productPackageKey) => {\n if ('pc' !== productPackageKey) {\n acc.push(productPackageGroup[productPackageKey]);\n }\n return acc;\n }, []);\n };\n\n let filteredProductPackage: number[] = [];\n [this._params.webapp, this._params.native].forEach((productPackageGroup) => {\n filteredProductPackage = filteredProductPackage.concat(\n filterPackages(productPackageGroup)\n );\n });\n return filteredProductPackage;\n }\n}\n","const SERIAL_PROVIDER = {\n 'APP_FLYER': 0\n};\n\n\nexport {SERIAL_PROVIDER};","import BaseObject from '../../../../../../base/base_object';\nimport _ from '../../../../../../utils/underscore'; // eslint-disable-line id-length\nimport {AF} from './app_flayer_const';\nimport Device from '../../../../../../utils/device/device';\nimport {KEY_NAME} from '../../../../native/native_const';\n\n\n/**\n *\n */\nclass AppFlayerModel extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'AppFlayerModel';\n\n\n /**\n * @property\n * @type {string}\n * @private\n */\n _afID = '';\n _appName = '';\n _deviceID = '';\n _afinstall = '';\n _serialData = '';\n _serialDataDecode = '';\n _idfv='';\n\n\n /**\n * Merge Marketing Data with hybrid params\n *\n * @param json: the original json\n * @returns {merged json}\n * @private\n */\n _mergeMarketingData(json) {\n let output = Object.assign({}, json, this._getCommonData());\n return output;\n }\n\n _getCommonData() {\n let output = {\n [AF.ID]: this._afID,\n [AF.APP_NAME]: this._appName,\n [AF.DEVICE_ID]: this._deviceID,\n [AF.AF_INSTALL]: this._afinstall\n };\n\n return output;\n }\n\n /**\n * fill the data from hybrid\n *\n * @param json\n * @private\n */\n _fillGeneralData(orgData) {\n\n let json = _.safeJSONandDecode(orgData)\n\n let error = json[KEY_NAME.ERROR];\n if (error !== 0) {\n return;\n }\n let data = json[KEY_NAME.DATA];\n\n\n this._appName = (Device.os.isIOS && Device.hybrid.inCasino) ? 'id' + data[AF.APP_NAME] : data[AF.APP_NAME];\n this._afID = data[AF.ID];\n this._deviceID = data[AF.DEVICE_ID];\n this._serialData = data[AF.SERIAL_DATA];\n this._idfv = Device.os.isIOS ? data[AF.APP_IDFV] : null;\n this._afinstall = decodeURIComponent(this._serialData);\n this._serialDataDecode = _.safeJSONandDecode(this._serialData);\n }\n\n getSerialData() {\n return this._serialDataDecode;\n }\n\n /**\n * Get the Marketing Data to return\n *\n * @param marketingData: the original json from the site\n * @returns {retVal merged with/without hybrid response}\n * @private\n */\n _getMarketingData(marketingData) {\n return this._mergeMarketingData(marketingData);\n }\n\n\n /**\n * Update the marketingData with the appsflayer data\n *\n * @param marketingData: the original json from the site\n * @param data: the data from the hybrid appsflayer\n * @returns {marketingData merged with the hybrid response}\n */\n updateData(marketingData, data) {\n this._fillGeneralData(data);\n return this._getMarketingData(marketingData);\n }\n\n _getData(key, val){\n return '\"' + key + '\" :' + val;\n }\n\n getSmartLinkData() {\n\n let strAFInstall = this._getData(AF.AFInstall , this._afinstall);\n let strAppsFlyerID = this._getData(AF.AppsFlyerID ,'\"' + this._afID + '\"');\n\n let data = '{' + strAFInstall + ',' + strAppsFlyerID + '}';\n\n return data;\n }\n\n getAppMareketingData(){\n const data = {AppsFlyerID: this._afID, AppID: this._appName, DeviceID: this._deviceID, IDFV : this._idfv};\n\n return data;\n }\n\n getAFInstall() {\n return this._afinstall;\n }\n}\n\nexport default AppFlayerModel;","import BaseObject from '../../../../../../base/base_object';\nimport Model from './app_flayer_model';\nimport HybridService from '../../../../hybrid_service';\nimport Event from \"../../../../../../utils/event\";\nimport {SYSTEM_EVENTS} from \"../../../../../../events/events\";\nimport Device from \"../../../../../../utils/device/device\";\n\n\n/**\n *The AppFlayer is responsible to get the serial & testdata from the hybrid\n *The class get the original marketingData and add and replace the new serial and testdata\n *with the old values\n */\nclass AppFlayer extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'AppFlayer';\n _model = null;\n\n\n /**\n *\n * @param params\n */\n init(params) {\n this._model = Model.create(params);\n\n if (Device.os.isIOS){\n Event.on(SYSTEM_EVENTS.SERIAL_UPDATE, this._update, this);\n }\n }\n\n _update(data){\n\n this._model.updateData({}, data);\n const smartLinkData = this._model.getSmartLinkData();\n HybridService.create().setSmartLinkData(smartLinkData,this);\n }\n\n\n\n /**\n * Get the serial data from the hybrid\n *\n * @param marketingData: the original json from the site\n * @returns {Promise : marketingData merged with the hybrid response}\n */\n getSerialData(marketingData) {\n\n return new Promise((resolve, reject) => {\n HybridService.create().getSerialData().then(data => {\n marketingData = this._model.updateData(marketingData, data);\n this.logger.info([\n 'getSerialData from Hybrid:',\n 'marketingData: ' + JSON.stringify(marketingData)\n ]);\n\n const smartLinkData = this._model.getSmartLinkData();\n HybridService.create().setSmartLinkData(smartLinkData,this);\n\n const serialData = this._model.getSerialData();\n Event.fire(SYSTEM_EVENTS.APPS_FLAYER_READY, serialData);\n\n resolve(marketingData);\n }).catch(() => {\n reject(marketingData);\n });\n });\n }\n\n getAppMareketingData(){\n return this._model.getAppMareketingData();\n }\n\n getAFInstall() {\n return this._model.getAFInstall();\n }\n}\n\nexport default AppFlayer;","import BaseObject from '../../../../../base/base_object';\nimport {SERIAL_PROVIDER} from '../serial_const';\nimport AppFlayer from './appsflyer/app_flayer';\n\nclass SerialProvider extends BaseObject {\n\n static CLASS = 'SerialProvider';\n\n\n /**\n *\n * @param type: the provider(appsflayer, ADX...)\n * @param param:\n * @returns {*}\n */\n getCurrentProvider(type, param) {\n switch (type) {\n case SERIAL_PROVIDER.APP_FLYER:\n return AppFlayer.create(param);\n default:\n return null;\n }\n }\n}\n\nexport default SerialProvider;","import BaseObject from '../../../base/base_object';\nimport HybridSerialProvider from '../../hybrid/features/serial/providers/provider';\nimport * as SerialConst from '../../hybrid/features/serial/serial_const';\nimport Device from '../../../utils/device/device';\nimport Event from '../../../utils/event';\nimport {SYSTEM_EVENTS} from '../../../events/events';\n\n/**\n *\n *\n *\n */\nclass Serial extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'Serial';\n\n _currentProvider = null;\n\n\n /**\n *\n * @param params\n */\n init(params) {\n\n this._currentProvider = HybridSerialProvider.create(params).getCurrentProvider(SerialConst.SERIAL_PROVIDER.APP_FLYER, params);\n this._subscribe();\n }\n\n\n _subscribe() {\n Event.on(SYSTEM_EVENTS.ON_INIT_COMPLETE, () => {\n this.getSerialData();\n });\n }\n\n\n /**\n * @param json\n * @returns merge json with hybrid params\n * @public\n */\n getSerialData(marketingData){\n\n if (Device.hybrid.inCasino) {\n return this._currentProvider.getSerialData(marketingData);\n }\n\n return Promise.resolve(marketingData);\n }\n}\nexport default Serial;\n","import BaseModel from '../../../base/base_model';\n\n/**\n *\n *\n *\n */\nclass InfoModel extends BaseModel {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'InfoModel';\n\n\n _webInfo = 'MC-WEB';\n\n /**\n * @static\n * @param params\n * @returns {params}\n */\n\n static create(params) {\n return super.create(params);\n }\n\n /**\n * @constructor\n * @param params\n */\n setData(str){\n this._webInfo = str;\n }\n\n /**\n * Getter Serial.\n *\n * @returns {*}\n * @public\n */\n getData(infoOk){\n return new Promise(()=> {\n //this.logger.info('get info Data --> ', this.sr);\n // resolve(infoOk);\n this.setData('MC-Web-11-22')\n infoOk(this._webInfo);\n });\n }\n}\n\nexport default InfoModel;","import BaseObject from '../../../base/base_object';\nimport Model from './info_model';\nimport Device from '../../../utils/device/device';\nimport HybridInfo from '../../hybrid/features/info/info_hybrid_feature';\n\n/**\n *\n *\n *\n */\nclass InfoService extends BaseObject {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'InfoService';\n\n\n /**\n * @property\n * @type {null}\n * @private\n */\n _model = null;\n\n /**\n *\n * @param params\n */\n init(params) {\n this._model = Model.create(params);\n }\n\n /**\n *\n * @returns {*}\n */\n getData(infoOk, infoError){\n\n let infoWebOk = (strWeb)=>{\n\n let infoHybridOk = (strHybrid)=> {\n infoOk(strWeb + \" !!! \" + strHybrid);\n }\n\n if (Device.hybrid.inCasino || Device.hybrid.isEmbedded) {//collect data from the poker Embedded also\n HybridInfo.create().getInfo(infoHybridOk, infoError);\n }else{\n infoOk(strWeb);\n }\n }\n\n this._model.getData(infoWebOk, infoError);\n }\n}\nexport default InfoService;","import BaseService from '../../base/base_service';\nimport ProductPackage from './product_package/product_package';\nimport HybridService from '../hybrid/hybrid_service';\nimport Serial from './serial/serial';\nimport Info from './info/info';\nimport Device from '../../utils/device/device';\nimport {REGULATION_CODE_TYPES} from \"../regulation/regulation_const\";\nimport ISkinService from './skin_service_interface';\nimport _ from '../../utils/underscore';\nimport {SDK_VERSION} from '../../sdk-version';\n\nexport interface ProductPackageParams {\n webApp: {\n pc: number,\n iphone: number,\n ipad: number,\n other: number,\n };\n native: {\n iphone: number,\n ipad: number,\n other: number,\n };\n}\n\nexport interface SerialParams {\n other: number;\n iphoneNative: number;\n iphone: number;\n ipadNative: number;\n ipad: number;\n}\n\nexport interface SkinServiceParams {\n regulationID: number;\n iosDefaultHybridSerial: string;\n androidDefaultHybridSerial: string;\n brandName: string;\n brandID: number;\n subBrandID: number;\n clientID: string;\n clientVersion: string;\n platformSystemID: string;\n minimumAge: number;\n productPackage: ProductPackageParams;\n productPackageID?: number;\n serial: SerialParams;\n dateTimeFormat: string;\n dateFormat: string;\n timeFormat: string;\n dateTimeHistoryFormat: string;\n disableCheckIfCorrectAppInUse: boolean;\n clientPlatform: string;\n appDownloadLinkIos: string;\n appDownloadLinkNonIos: string;\n culture: string;\n isComRelatedBrand: boolean;\n useControlCenterForReminderInterval: boolean;\n wrongLocationDetectionPath?: string;\n}\n\n\n/**\n *\n *\n *\n */\nexport default class SkinService extends BaseService implements ISkinService {\n /**\n * @static\n */\n static CLASS = 'SkinService';\n\n private _params: SkinServiceParams = null;\n private _platformSystemID: string = '';\n private _clientIDPattern = '';\n private _clientVersionPattern = '';\n private _productPackage: ProductPackage = null;\n private _serial: Serial = null;\n private _info: Info = null;\n private _defaultHybridSerial: string = null;\n private _clientPlatform: string = \"2\";\n\n /**\n *\n * @param params\n */\n init(params: SkinServiceParams) {\n this._params = params;\n if (params) {\n this._clientIDPattern = params.clientID;\n this._clientVersionPattern = params.clientVersion;\n this._platformSystemID = params.platformSystemID;\n this._serial = Serial.create(params.serial);\n this._clientPlatform = params.clientPlatform;\n\n // if (typeof params.productPackageID === 'number') {\n // params.productPackage.productPackageID = params.productPackageID;\n // }\n this._productPackage = ProductPackage.create(params.productPackage);\n this._info = Info.create(params);\n this._setDefaultHybridSerial(params.androidDefaultHybridSerial, params.iosDefaultHybridSerial);\n }\n }\n\n\n private _setDefaultHybridSerial(androidDefaultHybridSerial: string, iosDefaultHybridSerial: string) {\n if (Device.hybrid.inCasino) {\n if (androidDefaultHybridSerial && Device.os.isAndroid) {\n this._defaultHybridSerial = androidDefaultHybridSerial;\n }\n else if (iosDefaultHybridSerial && Device.os.isIOS) {\n this._defaultHybridSerial = iosDefaultHybridSerial;\n }\n }\n }\n\n getDefaultHybridSerial(): string {\n return this._defaultHybridSerial;\n }\n\n getClientPlatform(): string {\n return this._clientPlatform;\n }\n\n getAppDownloadPageURL(): string {\n let link: string = \"\";\n if (Device.os.isIOS || Device.isProbablyIOSDevice) {\n link = this._params.appDownloadLinkIos;\n } else {\n link = this._params.appDownloadLinkNonIos;\n }\n\n // check if relative or absolute link\n if (!_.isAbsoluteLink(link)) {\n link = this.serviceFactory.windowService().getLocationOrigin() + link;\n }\n\n return link;\n }\n\n disableCheckIfCorrectAppInUse(): boolean {\n return this._params.disableCheckIfCorrectAppInUse || false;\n }\n\n getProductPackageActiveGroup(): number[] {\n return Device.isMobile() ?\n this._productPackage.getProductPackageGroupMobile()\n : this._productPackage.getProductPackageGroupPC();\n }\n\n getAllProductPackages(): number[] {\n const mobilePackages = this._productPackage.getProductPackageGroupMobile();\n const pcPackages = this._productPackage.getProductPackageGroupPC();\n\n return pcPackages.concat(mobilePackages);\n }\n\n\n getInfoData(infoOk: Function, infoError: Function) {\n return this._info.getData(infoOk, infoError);\n }\n\n\n getBrandID(): number {\n\n let oAuth2Service = this.serviceFactory.oAuth2Service();\n if (oAuth2Service.isAuthorized()) {\n return parseInt(oAuth2Service.getToken().brandId);\n } else {\n return this._params.brandID;\n }\n\n }\n\n getWrongLocationDetectionPath() {\n return this._params.wrongLocationDetectionPath || '';\n }\n\n isCOMBrand(): boolean {\n return this._params.isComRelatedBrand;\n }\n\n getSubBrandID(): number {\n let oAuth2Service = this.serviceFactory.oAuth2Service();\n if (oAuth2Service.isAuthorized()) {\n return parseInt(oAuth2Service.getToken().subBrandId);\n } else {\n return this._params.subBrandID;\n }\n }\n\n getRegulationID(): number {\n let oAuth2Service = this.serviceFactory.oAuth2Service();\n if (oAuth2Service.isAuthorized()) {\n return parseInt(oAuth2Service.getToken().regId);\n } else {\n if (this.serviceFactory.countryService().isUK()) {\n return REGULATION_CODE_TYPES.UK;\n }\n return this._params.regulationID;\n }\n }\n\n\n /**\n * Get the clientID\n *\n */\n getClientID(): string {\n return this._clientIDPattern\n .replace('{{BRANDNAME}}', this.serviceFactory.windowService().getDomain())\n .replace('{{BRANDID}}', this.getBrandID().toString())\n .replace('{{LANG}}', this.serviceFactory.languageService().getISO3())\n .replace('{{PRODUCTPACKAGEID}}', this.getProductPackageID().toString())\n .replace('{{SUBRANDID}}', this.getSubBrandID().toString())\n .toUpperCase();\n }\n\n private _getOrbitVersion() {\n const orbit = this.serviceFactory.windowService().getGlobalProperty('orbit');\n if(orbit) {\n return `,${orbit.version}`;\n } else {\n return '';\n }\n }\n\n private _getIsPWA(): string {\n if (Device.isProgressiveWebApp) {\n return \"-PWA\";\n }\n return \"\";\n }\n\n getPlatformSystemID(): string {\n return this._platformSystemID;\n }\n\n /**\n * Get client version\n *\n */\n getVersion(): string {\n const outputVersion = this._clientVersionPattern\n .replace('{{BRANDNAME}}', this.serviceFactory.windowService().getDomain())\n .replace('{{BRANDID}}', this.getBrandID().toString())\n .replace('{{LANG}}', this.serviceFactory.languageService().getISO3())\n .replace('{{PRODUCTPACKAGEID}}', this.getProductPackageID().toString())\n .replace('{{SUBRANDID}}', this.getSubBrandID().toString())\n .replace('{{CGP_VERSION}}', SDK_VERSION)\n .replace('{{HYBRID_VERSION}}', HybridService.create().getVersion())\n .replace('{{ORBIT_VERSION}}', this._getOrbitVersion())\n .replace('{{PWA}}', this._getIsPWA())\n .toUpperCase();\n\n return outputVersion;\n }\n\n\n /**\n * Getter for the minimum age\n */\n getMinimumAge(): number {\n return this._params.minimumAge ? this._params.minimumAge : 18;\n }\n\n /**\n * Getter brand name.\n *\n */\n getBrandName(): string {\n return this._params.brandName.toString();\n }\n\n /**\n * When true, take the reminder interval from control center, else take it from localstorage (old implementation)\n * For UK\n */\n useControlCenterForReminderInterval(): boolean {\n return this._params.useControlCenterForReminderInterval;\n }\n\n /**\n * Getter for the active product package ID.\n *\n */\n getProductPackageID(): number {\n return this._productPackage.getProductPackageID();\n }\n\n\n /**\n * Getter serial.\n */\n getSerialData(marketingData) {\n return this._serial.getSerialData(marketingData);\n }\n\n\n /**\n * Getter dateTime format\n *\n */\n getDateTimeFormat(): string {\n return this._params.dateTimeFormat;\n }\n\n\n /**\n * Getter dateTime format\n *\n */\n getDateFormat(): string {\n return this._params.dateFormat;\n }\n\n\n /**\n * Getter dateTime format\n *\n */\n getTimeFormat(): string {\n return this._params.timeFormat;\n }\n\n\n /**\n * Getter dateTime format\n *\n */\n getDateTimeHistoryFormat(): string {\n return this._params.dateTimeHistoryFormat;\n }\n\n getCulture(): string {\n return this._params.culture;\n }\n}\n","import BaseService from \"../../base/base_service\";\nimport ISpinnerProxyService from \"./spinner_proxy_service.interface\";\nimport {ISpinnerService} from \"../../../../common/interfaces/spinner.service.interface\";\n\ninterface SpinnerProxyServiceParams {\n getSpinnerService: () => ISpinnerService;\n}\n\nexport default class SpinnerProxyService extends BaseService implements ISpinnerProxyService {\n static CLASS = 'SpinnerProxyService';\n private _params: SpinnerProxyServiceParams;\n\n init(params: SpinnerProxyServiceParams) {\n this._params = params;\n }\n\n startSpinner(isMigrationSpinner?: boolean): void {\n return this._params.getSpinnerService().startSpinner(isMigrationSpinner);\n }\n\n stopSpinner(): void {\n return this._params.getSpinnerService().stopSpinner();\n }\n}","import ServiceFactory from '../../service_factory';\nimport {EventType, ILogEventHeader, ILogEventType} from '../interfaces/log-event-header.interface';\nimport DateFormatter from '../../../utils/date_formatter';\nimport {Check} from '@sparkware/app-utils';\nimport { v4 as uuidv4 } from 'uuid';\n\n\nexport class LogEventHeaderBuilder {\n constructor(private readonly services: ServiceFactory, private readonly _environment: string) {\n }\n\n build(level: string): ILogEventHeader {\n const headerData: ILogEventHeader = {\n clientDateTime: DateFormatter.formatCurrentDateToUtc(),\n correlationID: this._correlationID || uuidv4(),\n environment: this._environment,\n eventType: this._eventType,\n level: this.getLogLevel(this._target, level),\n logVersionFormat: this.getLogVersionFormat(this._target),\n target: this._target\n }\n\n if(this._appID) {\n headerData.appID = this._appID;\n }\n\n if(this._businessCorrelationID) {\n headerData.businessCorrelationID = this._businessCorrelationID;\n }\n if(this._productPackageID) {\n headerData.productPackageID = this._productPackageID;\n } else {\n headerData.productPackageID = this.services.skinService().getProductPackageID();\n }\n\n if(!Check.isNullOrUndefined(this._sequentialNumber)) {\n headerData.sequentialNumber = this._sequentialNumber;\n }\n\n if(this._sessionID) {\n headerData.sessionID = this._sessionID;\n }\n\n if(this.services.oAuth2Service().isAuthorized()) {\n let decodedToken = this.services.oAuth2Service().getToken();\n let skinService = this.services.skinService();\n //userData is here just for backward compatibility with the log v1\n headerData.userData = {\n cid: parseInt(decodedToken.cid),\n brand: skinService.getBrandName()\n };\n }\n\n return headerData;\n }\n\n private _target = 'casino-orbit';\n\n setTarget(target): void {\n this._target = target;\n }\n\n private _correlationID: string = null;\n setCorrelationId(correlationID: string): void {\n this._correlationID = correlationID;\n }\n\n private _businessCorrelationID: string = null;\n setBusinessCorrelationID(businessCorrelationID: string): void {\n this._businessCorrelationID = businessCorrelationID;\n }\n\n private _sessionID: string = null;\n setSessionID(sessionID: string): void {\n this._sessionID = sessionID;\n }\n\n private _appID: string = 'CASINO_CLIENT';\n setAppID(appID: string): void {\n this._appID = appID;\n }\n\n _productPackageID: number = null;\n setProductPackageID(productPackageID: number): void {\n this._productPackageID = productPackageID;\n }\n\n _sequentialNumber: number = null;\n setSequentialNumber(sequentialNumber: number): void {\n this._sequentialNumber = sequentialNumber;\n }\n\n private _eventType: ILogEventType = {\n name: 'CGP_GENERIC_EVENT',\n type: ['Log']\n }\n\n setEventType(eventName: string, ...eventTypes: EventType[]): this {\n if(!eventTypes || eventTypes.length === 0) {\n eventTypes = ['Log'];\n }\n this._eventType = {\n name: eventName,\n type: eventTypes\n };\n\n return this;\n }\n\n private getLogVersionFormat(target: string):string | number {\n if(this.isNTSTarget(target)){\n return 'V2';\n }\n else {\n return 2;\n }\n }\n\n private getLogLevel(target: string, level: string):string | number {\n if(this.isNTSTarget(target)){\n return 2;\n }\n else {\n return level;\n }\n }\n\n private isNTSTarget(target: string):boolean{\n switch (target){\n case 'nts-deposit-logs':\n case 'nts-cashout-logs':\n case 'nts-transaction-history-logs':\n return true;\n default:\n return false;\n }\n }\n\n}\n","import ServiceFactory from '../../service_factory';\nimport {IElasticEventData} from '../../../../../common/interfaces/structured-logging-service-interface';\nimport {Check} from '@sparkware/app-utils';\n\nexport class LogEventDataBuilder {\n constructor(private readonly services: ServiceFactory, private readonly _eventData: IElasticEventData) {\n this._eventData = _eventData || {};\n //validate data from the commonly reported fields\n this.addCategory(_eventData.CGPEventCategory);\n this.addAction(_eventData.CGPEventAction);\n this.addLabel(_eventData.CGPEventLabel);\n this.addValue(_eventData.CGPEventValue);\n this.addEventName(_eventData.eventName);\n this._eventData.event = 'CGP_GENERIC_EVENT';\n if (this.services.integrationService().isMiniCip()) {\n this._eventData.isMiniCIP = true;\n }\n\n if (this.services.integrationService().isMiniCis()) {\n this._eventData.isMiniCIS = true;\n }\n }\n\n build(): IElasticEventData {\n return this._eventData;\n }\n\n addCategory(category:string): void {\n if(!Check.isNullOrUndefined(category)) {\n this._eventData.CGPEventCategory = this._prepareString(category);\n }\n }\n addAction(action:string): void {\n if(!Check.isNullOrUndefined(action)) {\n this._eventData.CGPEventAction = this._prepareString(action);\n }\n }\n addLabel(label:string): void {\n if(!Check.isNullOrUndefined(label)) {\n this._eventData.CGPEventLabel = this._prepareString(label);\n }\n }\n addValue(value:string): void {\n if(!Check.isNullOrUndefined(value)) {\n this._eventData.CGPEventValue = this._prepareString(value);\n const valueAsNumber = Number(value);\n if (Check.isNumber(valueAsNumber)) {\n this._eventData.CGPEventValueAsNumber = valueAsNumber;\n }\n }\n }\n addEventName(eventName:string): void {\n if(!Check.isNullOrUndefined(eventName)) {\n this._eventData.eventName = this._prepareString(eventName);\n }\n }\n addCustomData(customData: object): void {\n if(!Check.isNullOrUndefined(customData)) {\n this._eventData.customData = {\n ...this._eventData.customData,\n ...customData\n };\n }\n }\n _prepareString(data:string):string{\n if((typeof data) === \"string\"){\n return data;\n }\n return JSON.stringify(data);\n }\n}\n","import {ILogDeviceData} from '../interfaces/log-device-data.interface';\nimport Device from '../../../utils/device/device';\n\nexport class LogDeviceDataBuilder {\n\n build(): ILogDeviceData {\n let result: ILogDeviceData ={\n userAgent: Device.userAgent,\n screenResolution: Device.viewport.screenWidth + 'x' + Device.viewport.screenHeight,\n isHybridEmbedded: Device.hybrid.isEmbedded,\n osName: Device.os.name\n };\n\n return result;\n }\n\n}\n","import ServiceFactory from '../../service_factory';\nimport {ILogClientData} from '../interfaces/log-client-data.interface';\n\nexport class LogClientDataBuilder {\n constructor(private readonly services: ServiceFactory) {\n }\n\n build(): ILogClientData {\n let skinService = this.services.skinService();\n let clientData:ILogClientData= {\n version: skinService.getVersion(),\n brand: skinService.getBrandID().toString(),\n subBrand: skinService.getSubBrandID().toString(),\n productPackage: skinService.getProductPackageID().toString(),\n language: this.services.languageService().getISO3(),\n regulationCode: this.services.regulationService().getRegulationCode(),\n browserTabId: this.services.windowService().getCurrentBrowserTabId()\n };\n let parentProductPackage = this.services.oAuth2Service().getSourceProductPackage();\n if(parentProductPackage) {\n clientData.parentProductPackage = parentProductPackage;\n }\n\n return clientData;\n }\n}\n","import {\n IElasticEventData,\n IStructuredLogger\n} from \"../../../../common/interfaces/structured-logging-service-interface\";\nimport ServiceFactory from \"../service_factory\";\nimport BaseObject from \"../../base/base_object\";\nimport {EventType} from './interfaces/log-event-header.interface';\nimport {LogEventHeaderBuilder} from './builders/log-event-header-builder';\nimport {LogEventDataBuilder} from './builders/log-event-data-builder';\nimport {ILogRequestPayload} from './interfaces/log-request-payload.interface';\nimport {LogDeviceDataBuilder} from './builders/log-device-data-builder';\nimport {LogClientDataBuilder} from './builders/log-client-data-builder';\nimport Store from \"../../utils/store\";\nimport {Check} from \"@sparkware/app-utils\";\n\n\nexport interface IElasticLoggerParams {\n serviceFactory: ServiceFactory,\n environment: string,\n storageUrl: string,\n eventData: IElasticEventData,\n}\n\nexport default class ElasticLogger extends BaseObject implements IStructuredLogger {\n static CLASS = \"ElasticLogger\";\n\n private _serviceFactory:ServiceFactory;\n private _storageUrl;\n private _headerBuilder: LogEventHeaderBuilder;\n private _deviceDataBuilder: LogDeviceDataBuilder\n private _clientDataBuilder: LogClientDataBuilder;\n private _eventDataBuilder: LogEventDataBuilder;\n\n\n init(params:IElasticLoggerParams) {\n if (!params.serviceFactory) {\n this.throwArgumentExpected('37', 'init', 'serviceFactory');\n }\n\n this._headerBuilder = new LogEventHeaderBuilder(params.serviceFactory, params.environment);\n this._deviceDataBuilder = new LogDeviceDataBuilder();\n this._clientDataBuilder = new LogClientDataBuilder(params.serviceFactory);\n this._eventDataBuilder = new LogEventDataBuilder(params.serviceFactory, params.eventData);\n\n this._serviceFactory = params.serviceFactory;\n this._storageUrl = params.storageUrl;\n\n if(params.environment === \"mirage\") {\n const storageURLFromLS = Store.get(\"customLogstashURL\", null);\n if(storageURLFromLS){\n this._storageUrl = storageURLFromLS;\n }\n }\n }\n\n\n setTarget(target): this {\n this._headerBuilder.setTarget(target);\n return this;\n }\n\n\n setCorrelationId(correlationID: string): this {\n this._headerBuilder.setCorrelationId(correlationID);\n return this;\n }\n\n setBusinessCorrelationID(businessCorrelationID: string): this {\n this._headerBuilder.setBusinessCorrelationID(businessCorrelationID);\n return this;\n }\n\n setSessionID(sessionID: string): this {\n this._headerBuilder.setSessionID(sessionID);\n return this;\n }\n\n\n setAppID(appID: string): this {\n this._headerBuilder.setAppID(appID);\n return this;\n }\n\n setProductPackageID(productPackageID: number): this {\n this._headerBuilder.setProductPackageID(productPackageID);\n return this;\n }\n\n\n setSequentialNumber(sequentialNumber: number): this {\n this._headerBuilder.setSequentialNumber(sequentialNumber);\n return this;\n }\n\n\n setEventType(eventName: string, ...eventTypes: EventType[]): this {\n this._headerBuilder.setEventType(eventName, ...eventTypes);\n return this;\n }\n\n addCategory(category: string): this {\n this._eventDataBuilder.addCategory(category);\n return this;\n }\n\n addAction(action: string): this {\n this._eventDataBuilder.addAction(action);\n return this;\n }\n\n addLabel(label: string): this {\n this._eventDataBuilder.addLabel(label);\n return this;\n }\n \n addValue(value: string): this {\n this._eventDataBuilder.addValue(value);\n return this;\n }\n\n addEventName(eventName: string): this {\n this._eventDataBuilder.addEventName(eventName);\n return this;\n }\n\n addCustomData(customData: object): this {\n this._eventDataBuilder.addCustomData(customData);\n return this;\n }\n\n _buildRequestPayload(level:string): ILogRequestPayload {\n let result: ILogRequestPayload = {\n eventHeader: this._headerBuilder.build(level),\n deviceData: this._deviceDataBuilder.build(),\n clientData: this._clientDataBuilder.build(),\n eventData: this._eventDataBuilder.build()\n };\n\n\n if(this._serviceFactory.oAuth2Service().isAuthorized()) {\n let decodedToken = this._serviceFactory.oAuth2Service().getToken();\n result.sessionData = {\n globalSessionID: parseInt(decodedToken.initialSessionId),\n playerSessionID: parseInt(decodedToken.sessionId)\n }\n\n let skinService = this._serviceFactory.skinService();\n result.userData = {\n cid: parseInt(decodedToken.cid),\n brand: skinService.getBrandName(),\n brandID: skinService.getBrandID()\n };\n }\n\n return result;\n }\n\n _send(level:string) {\n const payload = this._buildRequestPayload(level);\n this._serviceFactory.http2Service().postJSON(this._storageUrl, {body : payload, keepalive : true}).catch(err => {\n this.logger.error('Failed to send elastic event', err, payload);\n });\n }\n\n info(target?:string) {\n if(!Check.isNullOrUndefined(target)){\n this._headerBuilder.setTarget(target);\n }\n this._send('information');\n return this;\n }\n\n warn() {\n this._send('warning');\n return this;\n }\n\n error() {\n this._send('error');\n return this;\n }\n\n}\n","import BaseService from '../../base/base_service';\nimport {\n IElasticEventData,\n IStructuredLogger\n} from '../../../../common/interfaces/structured-logging-service-interface';\nimport ElasticLogger from \"./elastic_logger\";\nimport StructuredLoggingServiceInterface from './structured_logging_service_interface';\n\n\nexport default class StructuredLoggingService extends BaseService implements StructuredLoggingServiceInterface {\n static CLASS = 'StructuredLoggingService';\n private _environment: string;\n private _storageUrl: string;\n\n\n init(params) {\n super.init(params);\n this._storageUrl = params.storageUrl;\n this._environment = params.environment;\n }\n\n getLogger(eventData?: IElasticEventData): IStructuredLogger {\n return this._createElasticLogger(eventData || {});\n }\n\n getEnvironment(): string {\n return this._environment;\n }\n\n private _createElasticLogger(eventData: IElasticEventData): IStructuredLogger {\n return ElasticLogger.create({\n serviceFactory: this.serviceFactory,\n environment: this._environment,\n storageUrl: this._storageUrl,\n eventData: eventData\n });\n }\n}\n","/*\nproperties:\n * fonts type: fontTypes_main, fontTypes_secondary\n * font size: fontSizes_large, fontSizes_largesecondary, fontSizes_medium ,fontSizes_mediumsecondary, fontSizes_small, fontSizes_smallsecondary\n * colors: colors_main, colors_darkmain, colors_secondary, colors_base01, colors_base02, colors_base03, colors_base04\n * Text alignment: textAlignment.\n * corner radium: Xpx\n * Icons: icons_x, icons_login, icons_password, icons_fullscreenon, icons_fullscreenoff, icons_agelimit18, icons_agelimit21\n * Overlay: lightbox_bgcolor, lightbox_bgopacity\n*/\nconst BRANDED_THEMES = {\n \"0_111\": [\n {'className': 'cgp-themes-main-title', properties: [{name: 'color', value: 'colors_base04'}]},\n ]\n}\n\n\n\nconst THEMES_CLASSES_LIST = [\n /* login inputs */\n {'className': 'input[type=\"text\"].cgp-themes-login-form-input, input[type=\"text\"].cgp-themes-login-form-input', properties: [\n {name: 'background-color', value: 'colors_base05'},\n {name: 'border-left-color', value: 'colors_main'},\n {name: 'border-bottom-color', value: 'colors_darkmain'},\n {name: 'font-size', value: 'fontsizes_large3d'},\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'color', value: 'colors_base01'}\n ]},\n {'className': 'input[type=\"text\"].cgp-themes-login-form-input, input[type=\"text\"].cgp-themes-login-form-input:focus', properties: [\n {name: 'background-color', value: 'colors_base05'},\n {name: 'border-left-color', value: 'colors_main'},\n {name: 'border-bottom-color', value: 'colors_darkmain'},\n {name: 'font-size', value: 'fontsizes_large3d'},\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'color', value: 'colors_base01'}\n ]},\n {'className': 'input[type=\"password\"].cgp-themes-login-form-input, input[type=\"password\"].cgp-themes-login-form-input', properties: [\n {name: 'background-color', value: 'colors_base05'},\n {name: 'border-left-color', value: 'colors_main'},\n {name: 'border-bottom-color', value: 'colors_darkmain'},\n {name: 'font-size', value: 'fontsizes_large3d'},\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'color', value: 'colors_base01'}\n ]},\n {'className': 'input[type=\"password\"].cgp-themes-login-form-input, input[type=\"password\"].cgp-themes-login-form-input:focus', properties: [\n {name: 'background-color', value: 'colors_base05'},\n {name: 'border-left-color', value: 'colors_main'},\n {name: 'border-bottom-color', value: 'colors_darkmain'},\n {name: 'font-size', value: 'fontsizes_large3d'},\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'color', value: 'colors_base01'}\n ]},\n\n /* GUI Keys Titles*/\n {'className': 'cgp-themes-main-title', properties: [\n {name: 'font-family', value: 'fontTypes_secondary'},\n {name: 'font-size', value: 'fontsizes_large3d'},\n {name: 'color', value: 'colors_main'}\n ]},\n {'className': 'cgp-themes-main-title.cgp-modal-themes-main-title', properties: [\n {name: 'font-family', value: 'fontTypes_secondary'},\n {name: 'font-size', value: 'fontsizes_large3d'},\n {name: 'color', value: 'colors_base01'}\n ]},\n {'className': 'cgp-themes-main-title2', properties: [\n {name: 'font-family', value: 'fontTypes_secondary'},\n {name: 'font-size', value: 'fontsizes_large'},\n {name: 'color', value: 'colors_base01'}\n ]},\n {'className': 'cgp-themes-secondary-title', properties: [\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'font-size', value: 'fontsizes_medium'},\n {name: 'color', value: 'colors_secondary'}\n ]},\n {'className': 'cgp-themes-big-title', properties: [\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'font-size', value: 'fontsizes_xlarge'},\n {name: 'color', value: 'colors_main'}\n ]},\n\n /* GUI Keys Texts*/\n {'className': 'cgp-themes-main-text', properties: [\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'font-size', value: 'fontsizes_medium'},\n {name: 'color', value: 'colors_base01'}\n ]},\n {'className': 'cgp-msg-content .cgp-themes-main-text', properties: [\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'font-size', value: 'fontsizes_medium'},\n {name: 'color', value: 'colors_base01'}\n ]},\n {'className': 'cgp-themes-secondary-text', properties: [\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'font-size', value: 'fontsizes_large3d'},\n {name: 'color', value: 'colors_base01'}\n ]},\n {'className': 'cgp-themes-small-text', properties: [\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'font-size', value: 'fontsizes_small'},\n {name: 'color', value: 'colors_base02'}\n ]},\n {'className': 'cgp-themes-grayed-out-text', properties: [\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'font-size', value: 'fontsizes_mediumsecondary'},\n {name: 'color', value: 'colors_base02'}\n ]},\n {'className': 'cgp-themes-small-secondary-grayed-out-text', properties: [\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'font-size', value: 'fontsizes_smallsecondary'},\n {name: 'color', value: 'colors_base02'}\n ]},\n {'className': 'cgp-themes-error-text', properties: [\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'font-size', value: 'fontsizes_medium'},\n {name: 'color', value: 'colors_base04'}\n ]},\n {'className': 'cgp-themes-large-text', properties: [\n {name: 'font-family', value: 'fontTypes_secondary'},\n {name: 'font-size', value: 'fontsizes_medium'},\n {name: 'color', value: 'colors_base01'}\n ]},\n {'className': 'cgp-themes-grayed-out-text-placeholder::placeholder', properties: [\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'font-size', value: 'fontsizes_mediumSecondary'},\n {name: 'color', value: 'colors_base02'}\n ]},\n\n /* GUI Keys CTAs */\n {'className': 'cgp-themes-main-cta', properties: [\n {name: 'font-family', value: 'fontTypes_type04'},\n {name: 'font-size', value: 'fontSizes_mediumsecondary'},\n {name: 'color', value: 'colors_darkmain'},\n {name: 'background-color', value: 'colors_secondary'},\n {name: 'border-radius', value: 'ctacornerradius'}\n ]},\n {'className': 'cgp-themes-main-cta.cgp-modal-button', properties: [\n {name: 'font-family', value: 'fontTypes_type04'},\n {name: 'font-size', value: 'fontSizes_mediumsecondary'},\n {name: 'color', value: 'colors_darkmain'},\n {name: 'background-color', value: 'colors_main'},\n {name: 'border-radius', value: 'ctacornerradius'},\n {name: 'border-color', value: 'colors_main'}\n ]},\n {'className': 'cgp-pc .cgp-themes-main-cta:hover', properties: [\n {name: 'color', value: 'colors_secondary'},\n {name: 'background-color', value: 'colors_darkmain'},\n {name: 'border-color', value: 'colors_secondary'},\n {name: 'border-width', value: 'bordersize'}\n ]},\n {'className': 'cgp-pc .cgp-themes-main-cta.cgp-modal-button:hover', properties: [\n {name: 'font-family', value: 'fontTypes_type04'},\n {name: 'font-size', value: 'fontSizes_mediumsecondary'},\n {name: 'color', value: 'colors_main'},\n {name: 'background-color', value: 'colors_darkmain'},\n {name: 'border-radius', value: 'ctacornerradius'},\n {name: 'border-color', value: 'colors_main'}\n ]},\n {'className': 'cgp-themes-secondary-cta', properties: [\n {name: 'font-family', value: 'fontTypes_type04'},\n {name: 'font-size', value: 'fontsizes_mediumSecondary'},\n {name: 'color', value: 'colors_main'},\n {name: 'background-color', value: 'colors_base05'},\n {name: 'border-color', value: 'colors_main'},\n {name: 'border-radius', value: 'ctacornerradius'},\n {name: 'border-width', value: 'bordersize'}\n ]},\n {'className': 'cgp-pc .cgp-themes-secondary-cta:hover', properties: [\n {name: 'color', value: 'colors_darkmain'},\n {name: 'background', value: 'colors_main'}\n ]},\n {'className': 'cgp-themes-base-cta', properties: [\n {name: 'font-family', value: 'fontTypes_type04'},\n {name: 'font-size', value: 'fontsizes_mediumSecondary'},\n {name: 'color', value: 'colors_base01'},\n {name: 'background-color', value: 'colors_base05'},\n {name: 'border-color', value: 'colors_base02'},\n {name: 'border-radius', value: 'ctacornerradius'},\n {name: 'border-width', value: 'bordersize'}\n ]},\n {'className': 'cgp-themes-base-cta.cgp-modal-button', properties: [\n {name: 'font-family', value: 'fontTypes_type04'},\n {name: 'font-size', value: 'fontsizes_mediumSecondary'},\n {name: 'color', value: 'colors_base02'},\n {name: 'background-color', value: 'colors_darkmain'},\n {name: 'border-color', value: 'colors_base02'},\n {name: 'border-radius', value: 'ctacornerradius'},\n {name: 'border-width', value: 'bordersize'}\n ]},\n {'className': 'cgp-pc .cgp-themes-base-cta:hover', properties: [\n {name: 'color', value: 'colors_darkmain'},\n {name: 'background-color', value: 'colors_base01'}\n ]},\n {'className': 'cgp-pc .cgp-themes-base-cta.cgp-modal-button:hover', properties: [\n {name: 'color', value: 'colors_darkmain'},\n {name: 'background-color', value: 'colors_base02'},\n {name: 'border-radius', value: 'ctacornerradius'}\n ]},\n {'className': 'cgp-themes-small-base-cta', properties: [\n {name: 'font-family', value: 'fontTypes_secondary'},\n {name: 'font-size', value: 'fontsizes_small'},\n {name: 'color', value: 'colors_darkmain'},\n {name: 'background', value: 'colors_base01'},\n {name: 'border-radius', value: 'ctacornerradius'}\n ]},\n {'className': 'cgp-pc .cgp-themes-small-base-cta:hover', properties: [\n {name: 'color', value: 'colors_secondary'},\n {name: 'background', value: 'colors_darkmain'},\n {name: 'border-color', value: 'colors_secondary'},\n {name: 'border-width', value: 'bordersize'}\n ]},\n\n {'className': 'cgp-themes-small-secondary-cta', properties: [\n {name: 'font-family', value: 'fontTypes_main'},\n {name: 'font-size', value: 'fontsizes_mediumsecondary'},\n {name: 'color', value: 'colors_secondary'},\n {name: 'background', value: 'colors_main'},\n {name: 'border-radius', value: 'ctacornerradius'},\n {name: 'border-width', value: 'bordersize'},\n {name: 'border-color', value: 'colors_secondary'}\n ]},\n {'className': 'cgp-pc .cgp-themes-small-secondary-cta:hover', properties: [\n {name: 'color', value: 'colors_darkmain'},\n {name: 'background', value: 'colors_base01'}\n ]},\n {'className': 'cgp-themes-3rd-cta', properties: [\n {name: 'font-family', value: 'fontTypes_secondary'},\n {name: 'font-size', value: 'fontsizes_small'},\n {name: 'color', value: 'colors_secondary'},\n {name: 'background', value: 'colors_base05'},\n {name: 'border-radius', value: 'ctacornerradius'},\n {name: 'border-width', value: 'bordersize'},\n {name: 'border-color', value: 'colors_secondary'}\n ]},\n {'className': 'cgp-pc button.cgp-themes-3rd-cta:hover', properties: [\n {name: 'color', value: 'colors_darkmain'},\n {name: 'border-color', value: 'colors_secondary'},\n {name: 'background-color', value: 'colors_secondary'}\n ]},\n\n /* Arrows */\n\n {'className': 'cgp-themes-icons-right-arrow', properties: [{name: 'background-image', value: 'icons_rightarrow'}]},\n {'className': 'cgp-themes-icons-left-arrow', properties: [{name: 'background-image', value: 'icons_leftarrow'}]},\n {'className': 'cgp-themes-icons-up-arrow', properties: [{name: 'background-image', value: 'icons_uparrow'}]},\n {'className': 'cgp-themes-icons-down-arrow', properties: [{name: 'background-image', value: 'icons_downarrow'}]},\n /* Free Play message styles*/\n {'className': 'cgp-themes-icons-fp-voucher-back', properties: [{name: 'background-image', value: 'icons_fpvoucherback'}]},\n {'className': 'cgp-themes-icons-fp-voucher-newbadge ', properties: [{name: 'background-image', value: 'icons_fpvouchernewbadge'}]},\n {'className': 'cgp-themes-icons-fp-voucher-free-play ', properties: [{name: 'background-image', value: 'icons_fpvoucherfreeplay'}]},\n {'className': 'cgp-themes-icons-fp-voucher-free-spin ', properties: [{name: 'background-image', value: 'icons_fpvoucherfreespin'}]},\n {'className': 'cgp-themes-icons-fp-voucher-jackpot-free-play ', properties: [{name: 'background-image', value: 'icons_fpvoucherjackpotfreeplay'}]},\n {'className': 'cgp-themes-icons-fp-voucher-jackpot-free-spin ', properties: [{name: 'background-image', value: 'icons_fpvoucherjackpotfreespin'}]},\n {'className': 'cgp-themes-icons-fp-voucher-info-open ', properties: [{name: 'background-image', value: 'icons_fpvoucherinfoopen'}]},\n {'className': 'cgp-themes-icons-fp-voucher-info-close', properties: [{name: 'background-image', value: 'icons_fpvoucherinfoclose'}]},\n {'className': 'cgp-themes-vouchers-bg', properties: [{name: 'background-image', value: 'icons_fp_vouchers_bg'}]},\n {'className': 'cgp-themes-icons-fp-right-arrow', properties: [{name: 'background-image', value: 'icons_fp_right_arrow'}]},\n {'className': 'cgp-themes-icons-fp-left-arrow', properties: [{name: 'background-image', value: 'icons_fp_left_arrow'}]},\n {'className': 'cgp-themes-icons-fp-voucher-bg-free-play', properties: [{name: 'background-image', value: 'icons_fp_voucher_bg_free_play'}]},\n {'className': 'cgp-themes-icons-fp-voucher-bg-free-spin', properties: [{name: 'background-image', value: 'icons_fp_voucher_bg_free_spin'}]},\n {'className': 'cgp-themes-icons-fp-voucher-bg-jackpot-free-spin', properties: [{name: 'background-image', value: 'icons_fp_voucher_bg_jackpot_free_spin'}]},\n {'className': 'cgp-themes-icons-fp-voucher-bg-jackpot-free-play', properties: [{name: 'background-image', value: 'icons_fp_voucher_bg_jackpot_free_play'}]},\n {'className': 'cgp-themes-fp-games-container-title-background', properties: [{name: 'border-bottom-color', value: 'colors_base05'}]},\n {'className': 'cgp-themes-item-dot', properties: [{name: 'background', value: 'colors_base01'}]},\n {'className': 'cgp-themes-fp-games-container-title', properties: [{name: 'font-size', value: 'fontSizes_small'}]},\n {'className': 'cgp-fp-expiration.cgp-theme-property-color-base04', properties: [{name: 'background-color', value: 'colors_darkMain'}]},\n {'className': 'cgp-themes-property-icons-touch-finger', properties: [{name: 'background-image', value: 'icons_touchFinger'}]},\n\n /* Toaster message*/\n {'className': 'CGPToasterLayout > .iziToast-cover.cgp-general-notification-toaster-icon', properties: [{name: 'background-image', value: 'icons_toastergeneralmessage'}, {name: 'background-color', value: 'colors_base05'}]},\n {'className': 'iziToast.CGPToasterLayout', properties: [{name: 'border-color', value: 'colors_base05'}]},\n\n\n /* Post-Pre Login*/\n {'className': 'cgp-themes-icons-password', properties: [{name: 'background', value: 'icons_password'}]},\n {'className': 'cgp-themes-icons-username', properties: [{name: 'background-image', value: 'icons_username'}]},\n {'className': 'cgp-themes-icons-new-member-left', properties: [{name: 'background-image', value: 'icons_newmemberleft'}]},\n {'className': 'cgp-themes-icons-new-member-right', properties: [{name: 'background-image', value: 'icons_newmemberright'}]},\n {'className': 'cgp-themes-property-icons-post-login-mobile', properties: [{name: 'background-image', value: 'icons_postloginmobile'}]},\n {'className': 'cgp-themes-touch-id-auto-enabled-cta', properties: [{name: 'background-color', value: 'colors_main'},{name: 'color', value: 'colors_darkMain'}]},\n\n {'className': 'cgp-theme-property-history-table-width-pc', properties: [{name: 'max-width', value: 'historytable_sizepc'}]},\n {'className': 'cgp-theme-property-lightbox-background-color', properties: [{name: 'background', value: 'lightboxbgcolor'}]},\n {'className': 'cgp-theme-property-corner-radius', properties: [{name: 'border-radius', value: 'ctacornerradius'}]},\n\n // Last-Login\n {'className': 'cgp-themes-directive-last_login', properties: [{name: 'color', value: 'base05'}]},\n\n // X close\n {'className': 'iziToast.CGPToasterLayout>.iziToast-close', properties: [\n {name: 'background-image', value: 'icons_xclose01'}\n ]},\n {'className': 'cgp-themes-icons-x', properties: [\n {name: 'width', value: 'modalCloseButtonSize'},\n {name: 'height', value: 'modalCloseButtonSize'},\n {name: 'background-image', value: 'icons_xclose01'}\n ]},\n {'className': 'cgp-themes-icons-x:hover', properties: [{name: 'opacity', value: 'xMouseoverOpcaity'}]},\n {'className': 'cgp-themes-icons-x-no-header:hover', properties: [{name: 'opacity', value: 'xMouseoverOpcaity'}]},\n {'className': 'cgp-themes-icons-x-no-header', properties: [{name: 'background-image', value: 'icons_xclose02'}]},\n\n /* Game Frame*/\n {'className': 'cgp-themes-icons-fullscreen-on', properties: [{name: 'background-image', value: 'icons_fullscreenon'}]},\n {'className': 'cgp-themes-icons-fullscreen-off', properties: [{name: 'background-image', value: 'icons_fullscreenoff'}]},\n {'className': 'cgp-themes-icons-age-limit-21-round', properties: [{name: 'background-image', value: 'icons_agelimit21round'}]},\n {'className': 'cgp-themes-icons-age-limit-21-flat', properties: [{name: 'background-image', value: 'icons_agelimit21flat'}]},\n {'className': 'cgp-themes-icons-age-limit.cgp-themes-icons-age-limit-18-capsule', properties: [{name: 'background-image', value: 'icons_agelimit18capsule'}]},\n {'className': 'cgp-themes-icons-age-limit-18-round', properties: [{name: 'background-image', value: 'icons_agelimit18round'},{name: 'width', value: 'iconswidth_agelimit18round'}, {name: 'height', value: 'iconsheight_agelimit18flat'}]},\n {'className': 'cgp-themes-icons-age-limit-18-flat', properties: [{name: 'background-image', value: 'icons_agelimit18flat'}, {name: 'width', value: 'iconswidth_agelimit18flat'}, {name: 'height', value: 'iconsheight_agelimit18flat'}]},\n {'className': 'cgp-mobile .cgp-themes-icons-age-limit-18-round', properties: [{name: 'width', value: 'iconswidthmobile_agelimit18round'}, {name: 'height', value: 'iconsheightmobile_agelimit18round'}]},\n {'className': 'cgp-mobile .cgp-themes-icons-age-limit-18-flat', properties: [{name: 'width', value: 'iconswidthmobile_agelimit18flat'}, {name: 'height', value: 'iconsheightmobile_agelimit18flat'}]},\n {'className': 'cgp-themes-icons-placeholder-game', properties: [{name: 'background-image', value: 'icons_gamebackground'}]},\n {'className': 'cgp-themes-property-icons-vertical-line-glow', properties: [{name: 'background-image', value: 'icons_verticalLineGlow'}]},\n {'className': 'cgp-themes-icons-game-frame-fp-indicator', properties: [{name: 'background-image', value: 'icons_gameframefpindicator'}]},\n {'className': 'cgp-themes-icons-gameframe-bg-fp-left', properties: [{name: 'background-image', value: 'icons_gameframebgfpleft'}]},\n {'className': 'cgp-themes-icons-gameframe-bg-fp-right', properties: [{name: 'background-image', value: 'icons_gameframebgfpright'}]},\n {'className': 'cgp-themes-icons-gameframe-bg-real-left', properties: [{name: 'background-image', value: 'icons_gameframebgrealleft'}]},\n {'className': 'cgp-themes-icons-gameframe-bg-real-right', properties: [{name: 'background-image', value: 'icons_gameframebgrealright'}]},\n {'className': 'cgp-themes-icons-gameframe-bg-demo-left', properties: [{name: 'background-image', value: 'icons_gameframebgdemoleft'}]},\n {'className': 'cgp-themes-icons-gameframe-bg-demo-right', properties: [{name: 'background-image', value: 'icons_gameframebgdemoright'}]},\n\n {'className': 'cgp-property-gameframe-real-size', properties: [{name: 'width', value: 'gameFrameRealSize'}]},\n {'className': 'cgp-property-gameframe-anon-size', properties: [{name: 'width', value: 'gameFrameAnonSize'}]},\n {'className': 'cgp-property-gameframe-anon-horizontal-position', properties: [{name: 'align-items', value: 'gameframeanonhorizontalposition'}]},\n {'className': 'cgp-property-gameframe-real-horizontal-position', properties: [{name: 'align-items', value: 'gameframerealhorizontalposition'}]},\n\n /* History table */\n {'className': 'cgp-themes-icons-history-calendar', properties: [{name: 'background-image', value: 'icons_historycalendar'}]},\n {'className': 'cgp-themes-icons-details-left-corner', properties: [{name: 'background-image', value: 'icons_historydetailsleftcorner'}]},\n {'className': 'cgp-themes-history-from-last-days-select', properties: [\n {name: 'background-color', value: 'colors_darkMain'},\n {name: 'border-color', value: 'colors_base05'}\n ]\n },\n {'className': 'cgp-themes-history-from-last-days-select:focus', properties: [\n {name: 'background-color', value: 'colors_darkMain'},\n {name: 'border-color', value: 'colors_base05'}\n ]\n },\n {'className': 'cgp-themes-history-icons-down-arrow', properties: [{name: 'background-image', value: 'icons_downarrowhistory'}]},\n {'className': 'cgp-history .cgp-title', properties: [{name: 'background-color', value: 'historyPage_titleBackgroundColor'}]},\n {'className': 'cgp-history .cgp-history-table-area', properties: [{name: 'background-color', value: 'historyPage_itemsListBackgroundColor'}]},\n {'className': 'cgp-history .cgp-game-date', properties: [{name: 'color', value: 'historyPage_dateTextColor'}]},\n {'className': 'cgp-history .cgp-game-body-more-details', properties: [{name: 'background-color', value: 'historyPage_showMoreBackgroundColor'}]},\n {'className': 'cgp-history .cgp-to-details', properties: [{name: 'color', value: 'historyPage_showMoreTextColor'}]},\n\n\n /* DropDownBox */\n {'className': 'cgp-themes-drop-down-box', properties: [\n {name: 'border-color', value: 'colors_base02'},\n {name: 'background-color', value: 'colors_base05'}\n\n ]\n },\n {'className': 'cgp-themes-drop-down-box:focus', properties: [\n {name: 'background-color', value: 'colors_base05'},\n {name: 'border-color', value: 'colors_base02'}\n ]\n },\n\n /* Reminder */\n {'className': 'cgp-themes-reminder-selector', properties: [\n {name: 'border-color', value: 'colors_base02'},\n {name: 'background-color', value: 'colors_base05'}\n\n ]\n },\n {'className': 'cgp-themes-reminder-selector:focus', properties: [\n {name: 'background-color', value: 'colors_base05'},\n {name: 'border-color', value: 'colors_base02'}\n ]\n },\n {'className': 'cgp-themes-plus-minus-button i:before', properties: [\n {name: 'background', value: 'colors_base01'},\n ]\n },\n {'className': 'cgp-themes-plus-minus-button i:after', properties: [\n {name: 'background', value: 'colors_base01'},\n ]\n },\n\n /* Inactivity timeout settings */\n {'className': 'select.cgp-themes-inactivity-timeout-selector', properties: [\n {name: 'border-color', value: 'colors_base02'},\n {name: 'background-color', value: 'colors_base05'}\n ]},\n\n {'className': 'cgp-themes-icons-login-form-tab', properties: [{name: 'background-image', value: 'icons_loginformtab'}]},\n\n {'className': 'cgp-themes-icons-login-mobile', properties: [{name: 'background-image', value: 'icons_loginmobile'}]},\n {'className': 'cgp-themes-icons-default-game', properties: [{name: 'background-image', value: 'icons_default_game'}]},\n\n {'className': 'cgp-theme-property-background-color-main', properties: [{name: 'background-color', value: 'colors_main'}]},\n\n {'className': 'cgp-themes-property-icons-touch-finger', properties: [{name: 'background-image', value: 'icons_touchfinger'}]},\n\n /* Font types properties*/\n {'className': 'cgp-theme-property-font-type-main', properties: [{name: 'font-family', value: 'fontTypes_main'}]},\n {'className': 'cgp-theme-property-font-type-secondary', properties: [{name: 'font-family', value: 'fontTypes_secondary'}]},\n {'className': 'cgp-theme-property-font-type-3', properties: [{name: 'font-family', value: 'fontTypes_type03'}]},\n {'className': 'cgp-theme-property-font-type-4', properties: [{name: 'font-family', value: 'fontTypes_type04'}]},\n {'className': 'cgp-theme-property-font-type-5', properties: [{name: 'font-family', value: 'fontTypes_type05'}]},\n {'className': 'cgp-theme-property-font-type-6', properties: [{name: 'font-family', value: 'fontTypes_type06'}]},\n {'className': 'cgp-theme-property-font-type-7', properties: [{name: 'font-family', value: 'fontTypes_type07'}]},\n\n /* text link */\n {'className': 'cgp-themes-link', properties: [{name: 'color', value: 'colors_main'}]},\n {'className': 'cgp-themes-link:link', properties: [{name: 'color', value: 'colors_main'}]},\n {'className': 'cgp-themes-link:visited', properties: [{name: 'color', value: 'colors_main'}]},\n {'className': 'cgp-themes-link:hover', properties: [{name: 'color', value: 'colors_main'}]},\n\n /* Font sizes properties*/\n {'className': 'cgp-theme-property-font-size-xlarge', properties: [{name: 'font-size', value: 'fontsizes_xlarge'}]},\n {'className': 'cgp-theme-property-font-size-large', properties: [{name: 'font-size', value: 'fontsizes_large'}]},\n {'className': 'cgp-theme-property-font-size-large-secondary', properties: [{name: 'font-size', value: 'fontsizes_largesecondary'}]},\n {'className': 'cgp-theme-property-font-size-medium', properties: [{name: 'font-size', value: 'fontsizes_medium'}]},\n {'className': 'cgp-theme-property-font-size-medium-secondary', properties: [{name: 'font-size', value: 'fontsizes_mediumsecondary'}]},\n {'className': 'cgp-theme-property-font-size-small', properties: [{name: 'font-size', value: 'fontsizes_small'}]},\n {'className': 'cgp-theme-property-font-size-small-secondary', properties: [{name: 'font-size', value: 'fontsizes_smallsecondary'}]},\n {'className': 'cgp-theme-property-font-size-xxxlarge', properties: [{name: 'font-size', value: 'fontsizes_xxxlarge'}]},\n {'className': 'cgp-theme-property-font-size-xxlarge', properties: [{name: 'font-size', value: 'fontsizes_xxlarge'}]},\n {'className': 'cgp-theme-property-font-size-large3d', properties: [{name: 'font-size', value: 'fontsizes_large3d'}]},\n {'className': 'cgp-theme-property-font-size-xsmall', properties: [{name: 'font-size', value: 'fontsizes_xsmall'}]},\n\n /* Text alignment property */\n {'className': 'cgp-theme-property-text-align', properties: [{name: 'text-align', value: 'textalignment'}]},\n\n /* Corner radius properties*/\n {'className': 'cgp-theme-property-cta-corner-radius', properties: [{name: 'border-radius', value: 'ctacornerradius'}]},\n {'className': 'cgp-theme-property-lb-corner-radius', properties: [{name: 'border-radius', value: 'lbcornerradius'}]},\n /* Border size property */\n {'className': 'cgp-theme-property-border-size', properties: [{name: 'border-width', value: 'bordersize'}]},\n\n /* Full border properties */\n {'className': 'cgp-theme-property-border-color-main', properties: [{name: 'border-color', value: 'colors_main'}]},\n {'className': 'cgp-theme-property-border-color-secondary', properties: [{name: 'border-color', value: 'colors_secondary'}]},\n {'className': 'cgp-theme-property-border-color-base02', properties: [{name: 'border-color', value: 'colors_base02'}]},\n /* Bottom border properties*/\n {'className': 'cgp-theme-property-border-bottom-color-main', properties: [{name: 'border-bottom-color', value: 'colors_main'}]},\n {'className': 'cgp-theme-property-border-bottom-color-base03', properties: [{name: 'border-bottom-color', value: 'colors_base03'}]},\n {'className': 'cgp-theme-property-border-bottom-color-base04', properties: [{name: 'border-bottom-color', value: 'colors_base04'}]},\n {'className': 'cgp-theme-property-border-bottom-color-darkmain', properties: [{name: 'border-bottom-color', value: 'colors_darkmain'}]},\n /* Left border properties */\n {'className': 'cgp-theme-property-border-left-color-main', properties: [{name: 'border-left-color', value: 'colors_main'}]},\n {'className': 'cgp-theme-property-border-left-color-base03', properties: [{name: 'border-left-color', value: 'colors_base03'}]},\n {'className': 'cgp-theme-property-border-left-color-base04', properties: [{name: 'border-left-color', value: 'colors_base04'}]},\n {'className': 'cgp-theme-property-border-left-color-base05', properties: [{name: 'border-left-color', value: 'colors_base05'}]},\n /* Background properties */\n {'className': 'cgp-theme-property-background-color-base01', properties: [{name: 'background-color', value: 'colors_base01'}]},\n {'className': 'cgp-theme-property-background-color-base03', properties: [{name: 'background-color', value: 'colors_base03'}]},\n {'className': 'cgp-theme-property-background-color-base04', properties: [{name: 'background-color', value: 'colors_base04'}]},\n {'className': 'cgp-theme-property-background-color-base05', properties: [{name: 'background-color', value: 'colors_base05'}]},\n {'className': 'cgp-theme-property-background-color-secondary', properties: [{name: 'background-color', value: 'colors_secondary'}]},\n {'className': 'cgp-theme-property-background-color-darkmain', properties: [{name: 'background-color', value: 'colors_darkmain'}]},\n {'className': 'cgp-modal-theme-property-background-color', properties: [{name: 'background-color', value: 'colors_darkmain'}]},\n {'className': 'cgp-theme-property-background-color-main', properties: [{name: 'background-color', value: 'colors_main'}]},\n {'className': 'cgp-theme-property-message-title-decoration', properties: [{name: 'background', value: 'colors_messageTitleDecoration'}]},\n /* Colors properties*/\n {'className': 'cgp-theme-property-color-main', properties: [{name: 'color', value: 'colors_main'}]},\n {'className': 'cgp-theme-property-color-dark-main', properties: [{name: 'color', value: 'colors_darkMain'}]},\n {'className': 'cgp-theme-property-color-secondary', properties: [{name: 'color', value: 'colors_secondary'}]},\n {'className': 'cgp-theme-property-color-base01', properties: [{name: 'color', value: 'colors_base01'}]},\n {'className': 'cgp-theme-property-color-base02', properties: [{name: 'color', value: 'colors_base02'}]},\n {'className': 'cgp-theme-property-color-base03', properties: [{name: 'color', value: 'colors_base03'}]},\n {'className': 'cgp-theme-property-color-base04', properties: [{name: 'color', value: 'colors_base04'}]},\n {'className': 'cgp-theme-property-color-base05', properties: [{name: 'color', value: 'colors_base05'}]},\n {'className': 'cgp-theme-property-color-dark-grey', properties: [{name: 'color', value: 'colors_darkGrey'}]},\n {'className': 'cgp-theme-property-color-dark-white', properties: [{name: 'color', value: 'colors_darkWhite'}]},\n\n];\n\nconst THEMES_DEFAULTS = {\n FONT_TYPES: {\n 'Main': 'Arial',\n 'Secondary': 'Arial',\n 'Type03': 'Arial',\n 'Type04': 'Arial',\n 'Type05': 'Arial',\n 'Type06': 'Arial'\n },\n FONT_SIZES: {\n 'xxxLarge': 20,\n 'xxLarge': 22,\n 'xLarge': 20,\n 'large': 18,\n 'largeSecondary': 17,\n 'medium': 15,\n 'mediumSecondary': 14,\n 'small': 13,\n 'smallSecondary': 11,\n 'Large3D': 16\n },\n COLORS: {\n 'main': '#7ff800',\n 'darkMain': '#000000',\n 'secondary': '#fce403',\n 'base01': '#ffffff',\n 'base02': '#717171',\n 'base03': '#232323',\n 'base04': '#ff014f',\n 'base05': '#171717',\n 'base06': '#323232',\n 'base07': \"#000000\",\n 'base08': \"#ffffff\",\n 'darkGrey': '#555555',\n 'darkWhite': '#d3d3d3'\n },\n CAPTCHA_THEME: 'dark'\n};\n\nconst THEMES_LIMITS = {\n FONT_SIZES: {\n 'xxxLarge': 36,\n 'xxLarge': 26,\n 'xLarge': 30,\n 'large': 25,\n 'largeSecondary': 25,\n 'medium': 20,\n 'mediumSecondary': 20,\n 'small': 20,\n 'smallSecondary': 20,\n 'Large3D': 20\n }\n}\nexport {THEMES_CLASSES_LIST, BRANDED_THEMES, THEMES_DEFAULTS, THEMES_LIMITS};","import BaseModel from '../../base/base_model';\nimport {THEMES_DEFAULTS, THEMES_LIMITS} from './themes_consts';\n\n/**\n *\n *\n *\n */\nclass ThemesModel extends BaseModel {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'ThemesModel';\n\n\n\t/**\n * The merged result of sdk defaults and user preferences will be stored here ( avoids unnecessary computation )\n\t * @type {{}}\n\t * @private\n\t */\n\t_mergedPreferences = {\n\t\tfonts: {},\n\t\tfontSizes: {},\n\t\tcolors: {}\n\t};\n\n\n /**\n *\n * @param params\n */\n init(params) {\n super.init(params);\n this.userPreferences(params);\n this.mergeDefaultsWithUserPrefs(this._mergedPreferences.fonts, THEMES_DEFAULTS.FONT_TYPES,\n this.userPreferences.fontTypes)\n .mergeDefaultsWithUserPrefs(this._mergedPreferences.fontSizes,\n THEMES_DEFAULTS.FONT_SIZES,\n this.userPreferences.fontSizes,\n THEMES_LIMITS.FONT_SIZES)\n .mergeDefaultsWithUserPrefs(this._mergedPreferences.colors,\n THEMES_DEFAULTS.COLORS,\n this.userPreferences.colors);\n this._mergedPreferences.captcha = params.captcha || THEMES_DEFAULTS.CAPTCHA_THEME;\n }\n\n getMergedPreferences() {\n return this._mergedPreferences;\n }\n\n\n userPreferences(userPreferences) {\n this.userPreferences = userPreferences;\n\n if (this.userPreferences && this.userPreferences.origin) {\n delete this.userPreferences.origin;\n }\n }\n\n\n getUserPreferences() {\n return this.userPreferences;\n }\n\n\n\t/**\n * Merges 2 \"preference\" objects, case insensitive\n\t * @param resultObj the result object of the merge\n\t * @param defaults default property values ( default object )\n\t * @param userObject ( the user preference object which is used )\n\t * @param limits an object with the maximum values for properties ( only works for numbers since this was added for font sizes atm )\n\t * @returns {ThemesModel}\n\t */\n mergeDefaultsWithUserPrefs(resultObj, defaults, userObject, limits) {\n\t\tresultObj = Object.assign(resultObj, defaults);\n if (userObject) {\n\t\t\tfor (var defaultProp in defaults) {\n\t\t\t\tfor (var userProp in userObject) {\n\t\t\t\t\tif (!userObject[userProp]) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif (defaultProp.toLowerCase() === userProp.toLowerCase()) {\n\t\t\t\t\t\tif (!limits || !limits[defaultProp] || userObject[userProp] <= limits[defaultProp]) {\n\t\t\t\t\t\t\tresultObj[defaultProp] = userObject[userProp];\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n return this;\n }\n\n\n // getFlatObjectByProperty(obj, property) {\n \t// let flatObject = Object.assign({}, obj);\n \t// Object.keys(flatObject, (key) => {\n \t// \tif (typeof flatObject[key] === 'object') {\n \t//\n\t// \t\t}\n\t// \t});\n //\n\t// }\n\n}\n\n\nexport default ThemesModel;","import BaseService from '../../base/base_service';\nimport Model from './themes_model';\nimport * as Consts from './themes_consts';\nimport {SYSTEM_EVENTS} from '../../events/events';\nimport DOM from '../../utils/dom';\nimport _ from '../../utils/underscore';\n\n/**\n *\n *\n *\n */\nclass ThemesService extends BaseService {\n\t/**\n * @static\n * @type {string}\n */\n\tstatic CLASS = 'ThemesService';\n\n\n\t\t/**\n\t\t * @property\n\t\t * @type {null}\n\t\t * @private\n\t\t */\n _model = null;\n\n\n\t\t/**\n\t\t *\n\t\t * @param params\n\t\t */\n init(params) {\n\t\t super.init(params);\n\t\t this._subscribe();\n\t\t this._model = Model.create(params);\n\t}\n\n\n\t/**\n * Update the themes classes according to user preferences.\n *\n * @public\n **/\n\tchangeThemeAccordingToUserPreferences() {\n\t\tlet userPreferences = this._model.getUserPreferences();\n\n\t\t// Finish if no user preferences.\n\t\tif (!userPreferences) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet userPrefernceAfterRenaming = this._renameAllToIncludeAllPath(userPreferences);\n\t\tlet output = [];\n\n\t\t// Search and override the property in every relevant class.\n\t\tlet brandKey = this._getThemesBrandKey();\n\t\tfor (var index = 0; index < Consts.THEMES_CLASSES_LIST.length; index++) {\n\t\t\tlet classPropertiesChangedFlag = false;\n\t\t\tlet currentClass = Consts.THEMES_CLASSES_LIST[index];\n\n currentClass = this._getThemesBrandedClass(currentClass, brandKey);\n\t\t\tlet classStyle = [];\n\t\t\tlet currentClassProperties = currentClass.properties;\n let setOfUserPreferences = new Set(currentClassProperties.map((property) => {\n return property.value;\n }));\n\n // Convert user preferences to real language.\n setOfUserPreferences.forEach((propertyName) => {\n this._changeValueAccordingToUserValue(propertyName, userPrefernceAfterRenaming);\n\t\t\t});\n\n currentClassProperties.forEach((property) => {\n for (var propertyName in userPrefernceAfterRenaming) {\n\t\t\t\t\tif (property.value && property.value.toLowerCase() === propertyName) {\n if (!classPropertiesChangedFlag) {\n classStyle.push('.' + currentClass.className + ' {');\n }\n\n classPropertiesChangedFlag = true;\n if (!this._checkLimits(propertyName, userPrefernceAfterRenaming)) {\n break;\n }\n\n // Add px suffix for sizes.\n this._addSuffix(propertyName, userPrefernceAfterRenaming);\n\t\t\t\t\t\tif (_.includes(propertyName, 'icons')) {\n\t\t\t\t\t\t\tif(_.includes(propertyName, 'iconsheight')) {\n\t\t\t\t\t\t\t\tclassStyle.push('height:' + userPrefernceAfterRenaming[propertyName] + 'px;');\n\t\t\t\t\t\t\t} else if(_.includes(propertyName, 'iconswidth')) {\n\t\t\t\t\t\t\t\tclassStyle.push('width:' + userPrefernceAfterRenaming[propertyName] + 'px;');\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// Override this property in the class.\n\t\t\t\t\t\t\t\tclassStyle.push(property.name + ': url(' + userPrefernceAfterRenaming[propertyName] + ');');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n // Override this property in the class.\n classStyle.push(property.name + ':' + userPrefernceAfterRenaming[propertyName] + ';');\n\t\t\t\t\t\t}\n\n }\n }\n\t\t\t});\n\n\t\t\tif (classPropertiesChangedFlag) {\n\t\t\t\tclassStyle.push('}');\n\t\t\t\toutput = output.concat(classStyle);\n\t\t\t}\n\t\t}\n\t\t// Add the override properties for this class to DOM.\n\t\tif (output.length > 0) {\n DOM.injectStyleToDOM(output.join(''));\n\t\t}\n\t}\n\n\t_getThemesBrandKey() {\n return this.serviceFactory.skinService().getBrandID() + '_' + this.serviceFactory.skinService().getSubBrandID();\n\t}\n\n\n\t_getThemesBrandedClass(defaultClass, brandKey) {\n let brandedClasses = Consts.BRANDED_THEMES[brandKey];\n if (!brandedClasses) {\n return defaultClass;\n }\n let brandedClass = brandedClasses.find((brandedClass) => {\n\t\t\treturn brandedClass.className === defaultClass.className;\n\t\t});\n\n if (!brandedClass) {\n \treturn defaultClass;\n\t\t}\n let mergedClass = Object.assign({}, defaultClass);\n\n mergedClass.properties.forEach((prop) => {\n \tlet brandedProp = brandedClass.properties.find((brandProperty) => {\n return brandProperty.name === prop.name;\n\t\t\t});\n \tif (brandedProp) {\n prop.value = brandedProp.value;\n\t\t\t}\n\t\t});\n\n return mergedClass;\n\t}\n\n\n\t/**\n * return the user preferences.\n *\n * @public\n */\n\tgetUserPreferences() {\n\t\treturn this._model.userPreferences;\n\t}\n\n\n\t/**\n * Return text alignment from user preferences or default one (center)\n * @returns {*}\n */\n\tgetTextAlignment() {\n\t\tif (this._model.userPreferences && this._model.userPreferences.textAlignment) {\n\t\t\treturn this._model.userPreferences.textAlignment;\n\t\t} else {\n\t\t\treturn 'center';\n\t\t}\n\t}\n\n\n\t/**\n\t *\n\t * @returns Merged object from sdk defaults and user prefferences for fonts\n\t */\n\tgetFonts() {\n\t\treturn this._model.getMergedPreferences().fonts;\n\t}\n\n\n /**\n\t * @returns Merged object from sdk defaults and user preferences for captcha\n * @returns {*}\n */\n\tgetCaptchaTheme() {\n\t\treturn this._model.getMergedPreferences().captcha;\n\t}\n\n\n\t/**\n\t *\n\t * @returns Merged object from sdk defaults and user prefferences for colors\n\t */\n\tgetColors() {\n\t\treturn this._model.getMergedPreferences().colors;\n\t}\n\n\n /**\n\t *\n\t * @returns Merged object from sdk defaults and user prefferences for font sizes\n */\n\tgetFontSizes() {\n\t\treturn this._model.getMergedPreferences().fontSizes;\n\t}\n\n\n\t/**\n * Change the name of the param to be appropriate to the themes classes list\n *\n * @private\n */\n\t_renameAllToIncludeAllPath(themes) {\n\t\tlet themesWithNewNames = {};\n\n\t\tfor (var propertyName in themes) {\n\t\t\tthis._renameToIncludeAllPath(propertyName, themes[propertyName], themesWithNewNames);\n\t\t}\n\n\t\treturn themesWithNewNames;\n\t}\n\n\n\t/**\n * Subscribe initialize application startup events.\n */\n\t_subscribe() {\n\t\tthis.onSystemEvent(SYSTEM_EVENTS.ON_INIT_COMPLETE, this.changeThemeAccordingToUserPreferences);\n\t}\n\n\n _addSuffix(propertyName, userPrefernceAfterRenaming) {\n if (propertyName.toLowerCase().includes('fontsizes_') && userPrefernceAfterRenaming[propertyName] && !_.isString(userPrefernceAfterRenaming[propertyName])) {\n // Add px suffix to font size.\n userPrefernceAfterRenaming[propertyName] = userPrefernceAfterRenaming[propertyName].toString() + 'px';\n }\n }\n\n\n _changeValueAccordingToUserValue(propertyName, userPrefernceAfterRenaming) {\n\t\tlet propertyNameLowerCase = propertyName.toLowerCase();\n\n\t\tif ('gameframeanonhorizontalposition' === propertyNameLowerCase || 'gameframerealhorizontalposition' === propertyNameLowerCase) {\n // The align is with flex so we should convert it to flex language.\n if (userPrefernceAfterRenaming[propertyNameLowerCase] === 'right') {\n userPrefernceAfterRenaming[propertyNameLowerCase] = 'flex-end';\n } else if ((userPrefernceAfterRenaming[propertyNameLowerCase] === 'left')) {\n userPrefernceAfterRenaming[propertyNameLowerCase] = 'flex-start';\n }\n } else if ('gameframerealsize' === propertyNameLowerCase || 'gameframeanonsize' === propertyNameLowerCase) {\n userPrefernceAfterRenaming[propertyNameLowerCase] += ' !important';\n\t\t} else if ('historytable_sizepc' === propertyNameLowerCase) {\n userPrefernceAfterRenaming[propertyNameLowerCase] = (1280 * userPrefernceAfterRenaming[propertyNameLowerCase]).toString() + 'px';\n\t\t}\n\t}\n\n\t/**\n * Change the name of the param to be appropriate to the themes classes list\n *\n * @private\n */\n\t_renameToIncludeAllPath(themeName, themeContent, themesWithNewNames) {\n\t\tif (!_.isObject(themeContent)) {\n themesWithNewNames[themeName.toLowerCase()] = themeContent;\n\t\t\treturn;\n\t\t}\n\n\t\tfor (var propertyName in themeContent) {\n\t\t\tlet newPath = themeName + '_' + propertyName;\n\n\t\t\tif (!_.isObject(themeContent[propertyName])) {\n\t\t\t\tthemesWithNewNames[newPath.toLowerCase()] = themeContent[propertyName];\n\t\t\t} else {\n\t\t\t\tthis._renameToIncludeAllPath(newPath, themeContent[propertyName], themesWithNewNames);\n\t\t\t}\n\t\t}\n\t}\n\n\n\t/**\n * Check if the value is forbidden is yes change to the max limit.\n *\n * @private\n */\n\t_checkLimits(propertyName, property) {\n\t\tlet fontsSizesLimits = {'xlarge': 30, 'large': 25, 'largesecondary': 25, 'medium': 20, 'mediumsecondary': 20, 'small': 20, 'smallsecondary': 20};\n\t\tlet borderSizesLimits = 5;\n\t\tlet propertyValue = property[propertyName];\n\t\tlet firstProperty = propertyName.split('_')[0];\n\n\t\tif (firstProperty.toLowerCase().includes('fontsizes')) {\n let secondPropertyName = propertyName.split('_')[1];\n\n if (!secondPropertyName) {\n return true;\n }\n\n let maxValue = fontsSizesLimits[secondPropertyName];\n\n // If the value is forbidden change to the maximum.\n if (propertyValue > maxValue) {\n delete property[propertyName];\n return false;\n }\n\t\t} else if ('bordersize' === firstProperty.toLowerCase()) {\n if (propertyValue > borderSizesLimits) {\n delete property[propertyName];\n return false;\n }\n }\n\n return true;\n\t}\n}\n\nexport default ThemesService;","import BaseService from '../../base/base_service';\nimport DateFormatter from '../../utils/date_formatter';\n\nexport default class TimeService extends BaseService {\n\n static CLASS = 'TimeService';\n\n now() {\n return Date.now();\n }\n\n getCurrentDate() {\n return new Date();\n }\n\n formatUtc(date) {\n return DateFormatter.formatUtc(date);\n }\n\n findDifferenceBetweenDatesInDays(firstDate: Date, secondDate: Date) {\n return this._findDifferenceBetweenDates(firstDate, secondDate, 'days');\n }\n\n findDifferenceBetweenDatesInHours(firstDate: Date, secondDate: Date) {\n return this._findDifferenceBetweenDates(firstDate, secondDate, 'hours');\n }\n\n findDifferenceBetweenDatesInMinutes(firstDate: Date, secondDate: Date) {\n return this._findDifferenceBetweenDates(firstDate, secondDate, 'minutes');\n }\n\n findDifferenceBetweenDatesInSeconds(firstDate: Date, secondDate: Date) {\n return this._findDifferenceBetweenDates(firstDate, secondDate, 'seconds');\n }\n\n private _findDifferenceBetweenDates(firstDate: Date, secondDate: Date, differenceType: string) {\n // seconds = milliseconds/1000\n // minutes = seconds/60\n // hours = minutes/60\n // Days = hours/24\n let divideBy;\n switch (differenceType && differenceType.toLowerCase()) {\n case 'days':\n divideBy = 1000 * 60 * 60 * 24;\n break;\n case 'hours':\n divideBy = 1000 * 60 * 60;\n break;\n case 'minutes':\n divideBy = 1000 * 60;\n break;\n case 'seconds':\n default:\n divideBy = 1000;\n break;\n }\n\n return Math.floor((Number(firstDate) - Number(secondDate)) / divideBy);\n }\n\n parseDate(dateAsString: string) {\n return new Date(dateAsString);\n }\n}","import BaseService from \"../../base/base_service\";\nimport {IStandardToastDefinition, IIdleRecomToastDef} from \"../../../../common/interfaces/toaster_proxy_service_interface\";\nimport IToasterProxyService from \"./toaster_proxy_service_interface\";\n\ninterface ToasterProxyServiceParams {\n toasterService: () => IToasterProxyService;\n}\n\nexport default class ToasterProxyService extends BaseService implements IToasterProxyService {\n static CLASS = 'ToasterProxyService';\n\n private _params: ToasterProxyServiceParams;\n\n init(params: ToasterProxyServiceParams) {\n this._params = params;\n }\n\n showStandardToast(options: IStandardToastDefinition) {\n return this._params.toasterService().showStandardToast(options);\n }\n\n showAckStandardToast(options: IStandardToastDefinition) {\n return this._params.toasterService().showAckStandardToast(options);\n }\n\n showIdleRecommendationToast(options: IIdleRecomToastDef) {\n return this._params.toasterService().showIdleRecommendationToast(options);\n }\n}\n\n","import BaseService from '../../base/base_service';\nimport { SYSTEM_EVENTS } from '../../events/events';\nimport { TrackJS } from \"trackjs\";\n\ninterface ITrackJsParams {\n enabled: boolean;\n application: string;\n token: string;\n}\n\nclass TrackjsService extends BaseService {\n\n static CLASS = 'TrackjsService';\n\n private _application: string;\n private _token: string;\n private _userCID: string;\n private _version: string;\n\n init(params: ITrackJsParams) {\n super.init(params);\n\n this._application = params.application;\n this._token = params.token;\n\n if(params.enabled) {\n this.onSystemEvent(SYSTEM_EVENTS.ON_INIT_COMPLETE, () => {\n this._initTrackJS();\n });\n }\n }\n\n private _initTrackJsExtraInformation(): void {\n this._userCID = this._getUserCID();\n this._version = this.serviceFactory.skinService().getVersion();\n\n this.onSystemEvent(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, () => {\n this._userCID = this._getUserCID();\n\n TrackJS.removeMetadata(\"CID\");\n TrackJS.addMetadata(\"CID\", this._userCID);\n });\n }\n\n private _initTrackJS(): void {\n this._initTrackJsExtraInformation();\n\n TrackJS.install({\n token: this._token,\n version: this._version,\n application: this._application\n });\n\n TrackJS.addMetadata(\"CID\", this._userCID);\n }\n\n private _getUserCID(): string {\n if (this.serviceFactory.oAuth2Service().isAuthorized())\n return this.serviceFactory.userService().getCID();\n\n return \"user_not_logged\";\n }\n}\n\nexport default TrackjsService;","import BaseService from '../../base/base_service';\nimport DOM from '../../utils/dom';\nimport Event from '../../utils/event';\nimport {SYSTEM_EVENTS} from '../../events/events';\n\nexport default class VisibilityDetectorService extends BaseService {\n static CLASS = 'VisibilityDetectorService';\n\n init(params) {\n super.init(params);\n this.start();\n }\n\n start() {\n this.logger.debug('Start visibility detector service.');\n DOM.addEventListener(window.document, 'visibilitychange', this.onVisibilityChange);\n }\n\n /**\n * Listener for the visibilitychange event\n */\n private onVisibilityChange = () => {\n if (this.isActive()) {\n Event.fire(SYSTEM_EVENTS.APP_RESUMED);\n } else {\n Event.fire(SYSTEM_EVENTS.APP_PAUSED);\n }\n return this;\n }\n\n /**\n * check if current tab is active\n */\n isActive() {\n if (!window.document.visibilityState) {\n return true;\n }\n return window.document.visibilityState === \"visible\";\n }\n\n}\n","import BaseService from '../../base/base_service';\nimport Event from '../../utils/event';\nimport _ from '../../utils/underscore';\nimport {SYSTEM_EVENTS} from '../../events/events';\nimport { BalanceType } from '../../../../common/const/wallet_balance_type';\n\nclass WalletService extends BaseService {\n /**\n * @static\n * @type {string}\n */\n static CLASS = 'WalletService';\n\n _previousBalance = null;\n\n /**\n *\n * @param params\n */\n init(params) {\n super.init(params);\n this._subscribe();\n }\n\n\n /**\n *\n *\n * @description subscribe language service events.\n * @private\n */\n _subscribe() {\n this.onSystemEvent(SYSTEM_EVENTS.SESSION_EVENT_WALLET, (data) => {\n this.refreshWallet(data);\n });\n\n\n this.onSystemEvent([SYSTEM_EVENTS.ON_INIT_COMPLETE, SYSTEM_EVENTS.OAUTH_STATE_CHANGE], () => {\n this._updateWalletLocally();\n });\n }\n\n\n /**\n * Update wallet data and refresh balance from local storage\n * @private\n */\n _updateWalletLocally() {\n if (this.serviceFactory.oAuth2Service().isAuthorized()) {\n this.refreshWallet();\n return;\n }\n this._previousBalance = null;\n }\n\n /**\n * Refresh wallet.\n */\n refreshWallet(bankroll = {}) {\n let originalWalletData = _.safeJSON(this._previousBalance);\n let newWalletData = this._updateWallet(bankroll.Balance, bankroll.Currency, bankroll.RealMoneyBankroll);\n\n const isNewBCurrency = !_.isNullOrUndefined(bankroll.Currency) &&\n (_.isNullOrUndefined(originalWalletData) || (!_.isNullOrUndefined(originalWalletData) && originalWalletData.currency !== bankroll.Currency));\n\n if (isNewBCurrency){\n Event.fire(SYSTEM_EVENTS.CURRENCY_UPDATED, newWalletData.currency);\n }\n\n const isNewBalance = !_.isNullOrUndefined(bankroll.Balance) &&\n (_.isNullOrUndefined(originalWalletData) || (_.safeStringToNumber(originalWalletData.balance) !== _.safeStringToNumber(bankroll.Balance)));\n const isNewRealMoneyBankroll = !_.isNullOrUndefined(bankroll.RealMoneyBankroll) &&\n (_.isNullOrUndefined(originalWalletData) || (_.safeStringToNumber(originalWalletData.RealMoneyBankroll) !== _.safeStringToNumber(bankroll.RealMoneyBankroll)));\n\n if (isNewBalance || isNewRealMoneyBankroll) {\n Event.fire(SYSTEM_EVENTS.BALANCE_UPDATED, newWalletData.balance);\n }\n }\n\n\n /**\n * Update balance and currency in local storage\n * Strategy to update / initialize wallet data\n * 1. Get from params (real time update)\n * 2. Get from local storage (updated before refresh)\n * 3. Get from token (updated on last Login)\n * @private\n */\n _updateWallet(balance, currency, RealMoneyBankroll) {\n let walletData = _.safeJSON(this._previousBalance);\n let tokenWallet = this._getTokenWalletData();\n\n if (_.isUndefined(walletData) || _.isNull(walletData)) {\n walletData = {};\n if (!_.isNull(tokenWallet)) {\n walletData.balance = tokenWallet.AvailableMoney;\n walletData.currency = tokenWallet.CurrencyCode;\n walletData.RealMoneyBankroll = tokenWallet.RealMoneyBankroll;\n }\n }\n\n walletData.balance = !_.isNullOrUndefined(balance) ? Math.floor(balance) : walletData.balance;\n walletData.currency = !_.isNullOrUndefined(currency) ? currency : walletData.currency;\n walletData.RealMoneyBankroll = !_.isNullOrUndefined(RealMoneyBankroll) ? Math.floor(RealMoneyBankroll) : walletData.RealMoneyBankroll;\n this._previousBalance = JSON.stringify(walletData);\n\n return walletData;\n }\n\n\n /**\n * Get wallet data from local storage if exist.\n *\n * @private\n */\n _getTokenWalletData() {\n return _.safeJSON(this.serviceFactory.oAuth2Service().extractTokenProperty('walletData'), null);\n }\n\n\n /**\n * Get the wallet data that exist in the model.\n *\n * @returns {*}\n * @public\n */\n getBalance(balanceType) {\n balanceType = _.isNullOrUndefined(balanceType) ? BalanceType.BOTH : balanceType;\n let balanceProperties = _.safeJSON(this._previousBalance, {});\n let balance;\n let tokenWalletData = this._getTokenWalletData();\n\n switch (balanceType) {\n case BalanceType.CASH:\n balance = balanceProperties.RealMoneyBankroll;\n if (_.isUndefined(balance) && !_.isNull(tokenWalletData)) {\n balance = tokenWalletData.RealMoneyBankroll;\n }\n break;\n case BalanceType.BONUS:\n balance = balanceProperties.balance - balanceProperties.RealMoneyBankroll;\n if (_.isUndefined(balance) && !_.isNull(tokenWalletData)) {\n balance = tokenWalletData.AvailableMoney - tokenWalletData.RealMoneyBankroll;\n }\n break;\n case BalanceType.BOTH:\n default:\n balance = balanceProperties.balance;\n if (_.isUndefined(balance) && !_.isNull(tokenWalletData)) {\n balance = tokenWalletData.AvailableMoney;\n }\n }\n\n if (_.isNullOrUndefined(balance)) {\n throw Error('Could not get balance.');\n }\n\n return balance;\n }\n\n\n /**\n * Get active currency code.\n *\n * @returns {string}\n */\n getCurrency() {\n let currency = this.serviceFactory.currencyService().getCurrency();\n\n return currency.toUpperCase();\n }\n\n getBonusBalance() {\n return this.getBalance(BalanceType.BONUS);\n }\n\n getCashBalance() {\n return this.getBalance(BalanceType.CASH);\n }\n\n /**\n * Get current bankroll (balance) string appropriate to currency symbol and thousand and decimal separators\n *\n * @return {string|number}\n */\n getBankroll(bankrollType = BalanceType.BOTH, plainNumber = false) {\n if (!this.serviceFactory.oAuth2Service().isAuthorized()) {\n return null;\n }\n\n if(plainNumber){\n return this.getBalance(bankrollType);\n }\n\n return this.serviceFactory.currencyService().formatMoney(this.getBalance(bankrollType));\n }\n}\n\nexport default WalletService;","import BaseObject from '../../../base/base_object';\nexport default class LoginActionHandlerBase extends BaseObject {\n static CLASS = 'LoginActionHandlerBase';\n\n init(params) {\n super.init(params);\n this._serviceFactory = params.serviceFactory;\n }\n\n _serviceFactory = null;\n get serviceFactory() {\n return this._serviceFactory;\n }\n\n actionName() {\n this.throwError('16', 'Method actionName is not implemented');\n }\n\n execute(params) {\n this.throwError('20', 'Method execute is not implemented');\n }\n}\n","import LoginActionHandlerBase from './action_handler_base';\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport Event from '../../../utils/event';\n\nexport default class CloseActionHandler extends LoginActionHandlerBase {\n static CLASS = 'CloseActionHandler';\n\n actionName() {\n return 'onclose';\n }\n\n execute() {\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {category: 'Client_LoginPopup', action: 'CloseClick'});\n\n return this.serviceFactory.webLoginService().closeLoginForm();\n\n }\n}","import LoginActionHandlerBase from './action_handler_base';\nimport Event from '../../../utils/event';\nimport {SYSTEM_EVENTS} from '../../../events/events';\n\n\nexport default class ExternalLinkActionHandler extends LoginActionHandlerBase {\n static CLASS = 'ExternalLinkActionHandler';\n\n actionName() {\n return 'onexternallink';\n }\n\n execute(params) {\n this.serviceFactory.windowService().openInNewWindow(params.target);\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {\n category: 'Client_LoginPopup',\n action: 'ExternalLink',\n label: params.target\n });\n }\n}","import LoginActionHandlerBase from './action_handler_base';\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport Event from '../../../utils/event';\n\n\nexport default class ForgotYourPasswordActionHandler extends LoginActionHandlerBase {\n static CLASS = 'ForgotYourPasswordActionHandler';\n\n actionName() {\n return 'onfyp';\n }\n\n execute() {\n this.serviceFactory.webLoginService().closeLoginForm();\n\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {\n category: 'Client_LoginPopup',\n action: 'ForgotPassword'\n });\n\n this.serviceFactory.externalLinksProxyService().openForgotPassword();\n\n }\n}","import LoginActionHandlerBase from './action_handler_base';\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport Event from '../../../utils/event';\n\n\nexport default class ForgotYourUsernameActionHandler extends LoginActionHandlerBase {\n static CLASS = 'ForgotYourUsernameActionHandler';\n\n actionName() {\n return 'onfyu';\n }\n\n execute() {\n this.serviceFactory.webLoginService().closeLoginForm();\n\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {\n category: 'Client_LoginPopup',\n action: 'ForgotUsername'\n });\n\n this.serviceFactory.externalLinksProxyService().openForgotUserName();\n }\n}","import LoginActionHandlerBase from \"./action_handler_base\";\nimport Device from '../../../utils/device/device'\n\nexport default class OnRedirectLinkActionHandler extends LoginActionHandlerBase {\n static CLASS = 'OnRedirectLinkActionHandler';\n actionName() {\n return 'onredirectlink';\n }\n\n execute(params) {\n\n if(Device.hybrid.inCasino || Device.hybrid.isEmbedded) {\n this.serviceFactory.hybridService().openExternalLink(params.target);\n } else if(this.serviceFactory.integrationService().isMiniOrbit()) {\n this.serviceFactory.windowService().openInNewWindow(params.target);\n } else {\n this.serviceFactory.windowService().redirect(params.target);\n }\n }\n}","import LoginActionHandlerBase from './action_handler_base';\n\nexport default class PlayForFunActionHandler extends LoginActionHandlerBase {\n static CLASS = 'PlayForFunActionHandler';\n\n actionName() {\n return 'onplayforfun';\n }\n\n execute() {\n this.serviceFactory.webLoginService().closeLoginForm();\n }\n}","import LoginActionHandlerBase from './action_handler_base';\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport Event from '../../../utils/event';\n\nexport default class RegistrationActionHandler extends LoginActionHandlerBase {\n static CLASS = 'RegistrationActionHandler';\n\n actionName() {\n return 'onregister';\n }\n\n execute() {\n this.serviceFactory.webLoginService().closeLoginForm();\n\n let marketingParams = this.serviceFactory.webLoginService().getWebLoginMarketingParams();\n\n\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {\n category: 'Client_LoginPopup',\n action: 'Register'\n });\n\n return this.serviceFactory.externalLinksProxyService().openMembership({\n marketingParams: marketingParams\n });\n }\n}","import LoginActionHandlerBase from './action_handler_base';\nimport {SYSTEM_EVENTS} from '../../../events/events';\nimport Event from '../../../utils/event';\nimport {Check} from \"@sparkware/app-utils\";\n\nexport default class SubmitActionHandler extends LoginActionHandlerBase {\n static CLASS = 'SubmitActionHandler';\n\n actionName() {\n return 'onsubmit';\n }\n\n execute(params) {\n let marketingParams = this.serviceFactory.webLoginService().getWebLoginMarketingParams();\n //I don't really think is necessary here this thing with marketing data\n if(marketingParams) {\n Event.fire(SYSTEM_EVENTS.INCOMING_MARKETING_DATA, window['getMarketingData'](marketingParams.dl));\n }\n\n if(Check.isObject(params) && Check.isEmpty(params)){\n const fitToPlayModeEnabled = this.serviceFactory.regulationService().fitToPlayModeEnabled();\n\n if(fitToPlayModeEnabled){\n Event.fire(SYSTEM_EVENTS.TOUCH_ID_AUTO_LOGIN, { fitToPlaySubmit: true });\n this.serviceFactory.webLoginService().closeLoginForm();\n\n return Promise.resolve();\n }\n }\n\n return this.serviceFactory.oAuth2Service().login({\n authenticationdata: JSON.stringify(params.authenticationdata),\n remember_me: params.isremembermerequest\n })\n .then(() => {\n this.serviceFactory.webLoginService().closeLoginForm();\n if(params.isremembermerequest) {\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {category: 'Client_LoginPopup', action: 'RememberMe'});\n }\n })\n .catch(err => {\n this.logger.error('SubmitActionHandler.execute failed', err);\n this.serviceFactory.webLoginService().processLoginResponse(err);\n });\n }\n}","import BaseObject from '../../../base/base_object';\n\nexport default class LoginErrorHandlerBase extends BaseObject {\n static CLASS = 'LoginErrorHandlerBase';\n init(params) {\n super.init(params);\n this._serviceFactory = params.serviceFactory;\n }\n\n get serviceFactory() {\n return this._serviceFactory;\n }\n\n _handledErrorCode() {\n this.throwError('15', 'Method errorCode is not implemented');\n }\n\n canHandle(errorProcessingResult) {\n return errorProcessingResult.loginResponse.error_code === this._handledErrorCode();\n }\n\n handle(errorProcessingResult) {\n this.throwError('23', 'Method execute is not implemented');\n }\n}","import LoginErrorHandlerBase from './login_error_hadler_base';\nimport {CGP_ERROR_CODES} from '../../../exceptions/cgp_error_codes';\n\n\nexport default class PendingActionErrorHandler extends LoginErrorHandlerBase {\n static CLASS = 'PendingActionErrorHandler';\n\n _handledErrorCode() {\n return CGP_ERROR_CODES.PENDING_ACTION_REQUIRED;\n }\n\n handle(errorProcessingResult) {\n this.serviceFactory.webLoginService().closeLoginForm();\n\n this.serviceFactory.externalLinksProxyService().openPendingLogin({\n token: errorProcessingResult.loginResponse.data.pendingActionToken\n });\n }\n}","import LoginErrorHandlerBase from './login_error_hadler_base';\nimport {CGP_ERROR_CODES} from '../../../exceptions/cgp_error_codes';\n\nexport default class TokenNotValidErrorHandler extends LoginErrorHandlerBase {\n static CLASS = 'TokenNotValidErrorHandler';\n\n _handledErrorCode() {\n return CGP_ERROR_CODES.TOKEN_NOT_VALID;\n }\n\n handle(errorProcessingResult) {\n this.serviceFactory.oAuth2Service().clearTokenInfoFromLocalStorage();\n }\n}\n","import merge from 'lodash/merge';\nimport BaseSingleton from '../../base/base_singleton';\nimport DOM from '../../utils/dom';\nimport ObservableFactory from '../../utils/observable_factory';\n\n\nexport default class WebLoginComponent extends BaseSingleton {\n\n static CLASS = 'WebLoginComponent';\n\n init(params) {\n super.init(params);\n\n this._serviceFactory = params.serviceFactory;\n\n if(!params.sdkUrl) {\n this._serviceFactory.structuredLoggingService()\n .getLogger()\n .addCategory('web_login_component')\n .addAction('missing_sdkUrl_config')\n .error();\n this.throwError('22', 'Missing WebLogin.sdkUrl configuration parameter! Make sure you provided this value in the web.config');\n }\n\n this._sdkUrl = params.sdkUrl;\n this._initObjectBuilder = params.initObjectBuilder;\n this._eventsObjectBuilder = params.eventsObjectBuilder;\n this._observableFactory = ObservableFactory.create();\n this._loadWebLoginSDK();\n }\n\n _initObjectBuilder = null;\n _eventsObjectBuilder = null;\n _sdkUrl = null;\n _isWebLoginComponentLoaded = false;\n _observableFactory = null;\n\n\n _loadWebLoginSDK() {\n this._serviceFactory\n .scriptLoaderService()\n .loadScript({\n url: this._sdkUrl,\n tagId: 'rllogin_loader'\n })\n .then(() => {\n window.rllogin = new window.RL.PF.Web.LoginUi.Login(this._buildInitObject(), this._buildEventsObject());\n }, () => {\n this.logger.error(`Failed to load web login component sdk from ${this._sdkUrl}.`);\n this._serviceFactory.structuredLoggingService()\n .getLogger()\n .addCategory('web_login_component')\n .addAction('sdk_load_failed')\n .addValue(this._sdkUrl)\n .error();\n\n const secondsUntilNewRetryBulk = 15;\n DOM.setTimeout(() => {\n this._loadWebLoginSDK();\n },\n secondsUntilNewRetryBulk * 1000);\n });\n }\n\n _buildEventsObject() {\n let commonEventsObject = {\n onerror: (err) => {\n this.logger.error('WebLoginComponent error', err);\n },\n onload: () => {\n this._isWebLoginComponentLoaded = true;\n }\n };\n return Object.assign(commonEventsObject, this._eventsObjectBuilder.buildEventsObject());\n }\n\n _buildInitObject() {\n return this._initObjectBuilder.buildInitObject();\n }\n\n\n _loginComponentWrapperElement = null;\n show(params = {}) {\n return this._getWebLoginComponent().then(component => {\n component.updateform( merge(this._initObjectBuilder.buildFormOptions(), params) );\n //component.show();\n });\n }\n\n hide() {\n return this._getWebLoginComponent().then(component => {\n component.hide();\n if(this._loginComponentWrapperElement) {\n document.removeChild(this._loginComponentWrapperElement)\n }\n });\n }\n\n processResponse(response) {\n return this._getWebLoginComponent()\n .then(() => {\n return window.RL.PF.Web.LoginUi.Login.processresponse(response);\n });\n }\n\n getDeviceUUID() {\n return this._getWebLoginComponent()\n .then(component => {\n return component.getDeviceUUID();\n });\n }\n\n _getWebLoginComponent() {\n if(this._isWebLoginComponentLoaded) {\n return Promise.resolve(window.rllogin);\n }\n\n return new Promise(this._getWebLoginComponentPromiseHandler.bind(this));\n }\n\n _getWebLoginComponentPromiseHandler(resolve, reject) {\n let retryCount = 200; // we retry maximum 200 times every 100 milliseconds => 20 seconds\n\n let subscription = this._observableFactory.fromInterval(100).forEach(() => {\n if(this._isWebLoginComponentLoaded) {\n subscription.dispose();\n resolve(window.rllogin);\n }\n else {\n if(retryCount === 0) {\n subscription.dispose();\n this._serviceFactory.structuredLoggingService()\n .getLogger()\n .addCategory('web_login_component')\n .addAction('get_handler_timeout')\n .error();\n reject('Failed to load WebLoginComponent');\n }\n retryCount--;\n }\n });\n }\n}\n","import BaseObject from '../../base/base_object';\n\nexport default class EventsObjectBuilder extends BaseObject {\n static CLASS = 'EventsObjectBuilder';\n init(params) {\n this.serviceFactory = params.serviceFactory;\n this._handlersModulesReader = params.handlersModulesReader || this._handlersModulesReader;\n }\n\n _handlersModulesReader = {\n read: () => {\n let handlersContext = require.context('./action_handlers/', true, /^.*(_actionhandler)\\.js$/);\n return handlersContext.keys().map(handlersContext);\n }\n };\n\n\n _eventsObject = null;\n buildEventsObject() {\n if(!this._eventsObject) {\n\n this._eventsObject = {};\n\n this._handlersModulesReader.read().forEach(handlerModule => {\n let handler = handlerModule.default.create({\n serviceFactory: this.serviceFactory\n });\n\n this._eventsObject[handler.actionName()] = handler.execute.bind(handler);\n });\n }\n\n return this._eventsObject;\n }\n}","import BaseObject from '../../base/base_object';\nimport Device from '../../utils/device/device';\n\nexport default class InitObjectBuilder extends BaseObject {\n static CLASS = 'InitObjectBuilder';\n\n init(params) {\n this.serviceFactory = params.serviceFactory;\n this._enableCaptcha = params.enableCaptcha;\n }\n\n buildInitObject() {\n return {\n subbrandid: this.serviceFactory.skinService().getSubBrandID(),\n productpackageid: this.serviceFactory.skinService().getProductPackageID(),\n languagecode: this.serviceFactory.languageService().getISO3(),\n formoptions: this.buildFormOptions(),\n showclosebutton: true,\n logoptions: {\n disabletrackjs: true\n }\n //containerselector: '.cgp-web-login-wrapper'\n };\n }\n\n buildFormOptions() {\n return {\n mode: {\n type: 'pwd',\n errorcodeid: 0,\n modeoptions: {\n username: this._getLastLoginUserName(),\n showrememberme: !Device.os.isMobileOS\n }\n },\n enablecaptcha: this._enableCaptcha\n };\n }\n\n _getLastLoginUserName() {\n let userData = this.serviceFactory.oAuth2Service().getUserData();\n if(userData && userData.userName) {\n return userData.userName;\n }\n\n return null;\n }\n}\n","import BaseObject from '../../base/base_object';\n\nexport default class LoginErrorHandler extends BaseObject {\n static CLASS = 'LoginErrorHandler';\n\n\n init(params) {\n this._serviceFactory = params.serviceFactory;\n }\n\n _readErrorHandlers(){\n let handlersContext = require.context('./error_handlers/', true, /^.*(_errorhandler)\\.js$/);\n return handlersContext.keys().map(handlersContext).map(errorHandlerModule => errorHandlerModule.default.create({\n serviceFactory: this._serviceFactory\n }));\n\n };\n\n handleError(errorProcessingResult) {\n let errorHandlers = this._readErrorHandlers();\n errorHandlers.forEach(errorHandler => {\n if(errorHandler.canHandle(errorProcessingResult)) {\n errorHandler.handle(errorProcessingResult);\n }\n });\n }\n}","import BaseObject from '../../base/base_object';\nimport WebLoginComponent from './web_login_component';\nimport EventsObjectBuilder from './events_object_builder';\nimport InitObjectBuilder from './init_object_builder';\nimport LoginErrorHandler from './login_error_handler';\n\n\n\nexport default class WebLoginServiceDependenciesFactory extends BaseObject {\n static CLASS = 'WebLoginServiceDependenciesFactory';\n\n createWebLoginComponent(params) {\n return WebLoginComponent.create(params);\n }\n\n createEventsObjectBuilder(params) {\n return EventsObjectBuilder.create(params);\n }\n\n createInitObjectBuilder(params) {\n return InitObjectBuilder.create(params);\n }\n\n createLoginErrorHandler(params) {\n return LoginErrorHandler.create(params);\n }\n}","import BaseService from '../../base/base_service';\nimport WebLoginServiceDependenciesFactory from './web_login_service_dependencies_factory';\nimport _ from '../../utils/underscore';\nimport Event from '../../utils/event';\nimport {SYSTEM_EVENTS} from '../../events/events';\n\nexport default class WebLoginService extends BaseService {\n static CLASS = 'WebLoginService';\n\n init(params) {\n super.init(params);\n\n this._sdkUrl = params.sdkUrl;\n if (!_.isNullOrUndefined(params.enableCaptcha)) {\n this._enableCaptcha = params.enableCaptcha;\n }\n this._dependenciesFactory = params.dependenciesFactory || WebLoginServiceDependenciesFactory.create();\n Event.on(SYSTEM_EVENTS.ON_INIT_COMPLETE, this._createWebLoginComponent, this);\n }\n\n _sdkUrl = null;\n _enableCaptcha = true;\n _dependenciesFactory = null;\n _webLoginComponent = null;\n _latestOpenLoginParams = {};\n\n get _eventsObjectBuilder() {\n return this._dependenciesFactory.createEventsObjectBuilder({\n serviceFactory: this.serviceFactory\n });\n }\n\n get _initObjectBuilder() {\n return this._dependenciesFactory.createInitObjectBuilder({\n serviceFactory: this.serviceFactory,\n enableCaptcha: this._enableCaptcha\n });\n }\n\n get _loginErrorHandler() {\n return this._dependenciesFactory.createLoginErrorHandler({\n serviceFactory: this.serviceFactory\n });\n }\n\n _createWebLoginComponent() {\n this._webLoginComponent = this._dependenciesFactory.createWebLoginComponent({\n sdkUrl: this._sdkUrl,\n initObjectBuilder: this._initObjectBuilder,\n eventsObjectBuilder: this._eventsObjectBuilder,\n serviceFactory: this.serviceFactory\n });\n }\n\n _openLoginFormPromisesResolvers = [];\n\n openLoginForm(params) {\n return this.serviceFactory.oAuth2Service().tryToRememberMe().catch(() => {\n return this.serviceFactory.regulationService().stepsBeforeOpenLoginAndRegistration().then(()=> {\n this._latestOpenLoginParams = {};\n if (params) {\n this._latestOpenLoginParams.marketingParams = params.marketingParams;\n this._latestOpenLoginParams.onCloseCallback = params.onCloseCallback;\n }\n\n return new Promise((resolve, reject) => {\n this._openLoginFormPromisesResolvers.push({\n resolve: resolve,\n reject: reject\n });\n\n this._webLoginComponent.show().then(() => {\n Event.fire(SYSTEM_EVENTS.LOGIN_FORM_OPEN);\n Event.fire(SYSTEM_EVENTS.ANALYTIC_TRIGGER_ACTIVATED, {category: 'Client_LoginPopup', action: 'Open'});\n }).catch(err => {\n this._openLoginFormPromisesResolvers = [];\n reject(err);\n });\n });\n });\n });\n\n }\n\n /**\n * Change the login form mode type, currently use only for fit-to-play on ontario\n * @param type: WEB_LOGIN_MODES[type]\n */\n updateLoginFormModeType(type){\n this._webLoginComponent.show( { mode: { type } })\n }\n\n getWebLoginMarketingParams() {\n return this._latestOpenLoginParams.marketingParams;\n }\n\n closeLoginForm() {\n return this._webLoginComponent.hide().then(() => {\n if (this._latestOpenLoginParams.onCloseCallback) {\n this._latestOpenLoginParams.onCloseCallback();\n }\n\n if (this.serviceFactory.oAuth2Service().isAuthorized()) {\n this._openLoginFormPromisesResolvers.forEach(promiseResolver => promiseResolver.resolve());\n } else {\n this._openLoginFormPromisesResolvers.forEach(promiseResolver => promiseResolver.reject());\n }\n\n this._openLoginFormPromisesResolvers = [];\n\n Event.fire(SYSTEM_EVENTS.LOGIN_FORM_CLOSE)\n });\n }\n\n processLoginResponse(loginResponse) {\n let originalLoginResponse = loginResponse.data && loginResponse.data.originalLoginResponse;\n return this._webLoginComponent.processResponse(originalLoginResponse)\n .then(loginProcessingResult => {\n if (_.isArray(loginProcessingResult.actionhandler)) {\n if (loginProcessingResult.actionhandler.filter(ah => ah === 'caller').length > 0) {\n this._loginErrorHandler.handleError({\n loginProcessingResult: loginProcessingResult,\n loginResponse: loginResponse\n });\n }\n }\n });\n }\n\n getDeviceUUID() { \n return this._webLoginComponent.getDeviceUUID()\n .catch(err => {\n this.logger.error('WebLoginComponent.getDeviceUUID failed', err);\n \n return null; \n });\n }\n}","import BaseService from '../../base/base_service';\nimport { SYSTEM_EVENTS } from '../../events/events';\nimport Device from '../../utils/device/device';\nimport _ from '../../utils/underscore';\nimport {QA_ENV_URBAN_DEFAULT_SETTINGS} from \"../../../../common/const/service-worker-constants\";\nimport IWebPushService from \"./web_push_service_interface\";\nimport {isOrbitInQAMode} from \"../../../../utils/qa-mode-utils\";\n\nexport interface IUrbanAirshipData {\n defaultIcon: string;\n defaultTitle: string;\n defaultActionURL: string;\n appKey: string;\n token: string;\n vapidPublicKey: string;\n}\n\nexport interface IWebPushParams {\n enabled: boolean;\n urbanAirshipSdkUrl: string;\n prodSettings: IUrbanAirshipData;\n loadWebPush: () => Promise;\n testSettings?: IUrbanAirshipData;\n uaSdkLoadTestPromise?: (uaSdkLoadPromise: Promise) => void;\n}\n\nexport interface IUASdk {\n register: () => Promise;\n canRegister:boolean;\n getChannel: () => Promise<{\n namedUser: {\n set: (paramName: string) => void;\n remove: (paramName: string) => void;\n };\n\n tags: {\n add: (paramName: string) => void;\n remove: (paramName: string) => void;\n }\n }>\n}\n\nconst LOAD_UA_SDK_INTERVAL: number = 40000;\n\nexport default class WebPushService extends BaseService implements IWebPushService{\n static CLASS = 'WebPushService';\n\n private _initParams: IWebPushParams;\n private _swUrl:string;\n private _loadUAScriptObservable;\n\n private _uaSdkLoadPromise: Promise = null;\n private _uaSdkLoadPromiseResolve = null;\n private _uaSdkLoadPromiseReject = null;\n\n init(params: IWebPushParams): void {\n super.init(params);\n\n if (!params.enabled || Device.hybrid.isHybrid || Device.os.isIOS){\n return;\n }\n\n if(_.isNullOrUndefined(params.urbanAirshipSdkUrl)) {\n this.throwError('64',`${this.getClassName()} expects parameter urbanAirshipSdkUrl which was not supplied`, {params});\n }\n\n this._initParams = params;\n\n this._uaSdkLoadPromise = new Promise( (resolve,reject) => {\n this._uaSdkLoadPromiseResolve = () => {\n this._clearTimeout();\n resolve();\n }\n this._uaSdkLoadPromiseReject = reject;\n });\n\n this._uaSdkLoadPromise\n .then(() => this._setChannelInfo())\n .catch( err => {\n this._sendElasticData('Web push fatal error: Airship SDK load error:' + (err && err.message), true);\n })\n\n this.onSystemEvent(SYSTEM_EVENTS.ON_INIT_COMPLETE, () => this._onInitComplete());\n this.onSystemEvent(SYSTEM_EVENTS.OAUTH_STATE_CHANGE, () => this._uaSdkLoadPromise.then( () => this._setChannelInfo()));\n\n // used for unit tests\n if (_.isFunction(params.loadWebPush)) {\n this._loadWebPush = params.loadWebPush;\n }\n if(_.isFunction(params.uaSdkLoadTestPromise)){\n params.uaSdkLoadTestPromise(this._uaSdkLoadPromise);\n }\n //\n }\n\n private _onInitComplete(){\n const getServiceWorkerUrl = this.serviceFactory.windowService().getGlobalProperty('getOrbitServiceWorkerUrl');\n if (_.isFunction(getServiceWorkerUrl)) {\n this._swUrl = getServiceWorkerUrl();\n } else {\n this._sendElasticData('Web push fatal error: getOrbitServiceWorkerUrl does not exist in window, service-worker.js was not loaded', true);\n return;\n }\n\n this._startTimeout();\n }\n\n private _startTimeout(){\n this._loadUAScriptObservable = this.serviceFactory.observableFactoryService().fromTimeout(LOAD_UA_SDK_INTERVAL)\n .forEach(() => {\n this._loadWebPush();\n })\n }\n\n private _getSDK(): PromiseLike {\n const UA = this.serviceFactory.windowService().getGlobalProperty('UA');\n\n UA.catch(() => {\n this._sendElasticData('Error Loading UA SDK object', true);\n });\n\n return UA;\n }\n\n private _registerToUA(): void {\n this._uaSdkLoadPromise && this._uaSdkLoadPromise.then(() => {\n return this._getSDK().then( (SDK: IUASdk) => {\n if (\"Notification\" in window && Notification.permission === \"denied\") {\n this.logger.warn('User chose to deny push notifications');\n }\n\n if (SDK.canRegister) {\n //we check if window.Notification exists and notification is default/ask\n const shouldSendAnalytics = \"Notification\" in window && Notification.permission === \"default\";\n\n if (shouldSendAnalytics) {\n this._sendAnalytics(\"Prompt\");\n }\n\n //since UA register API is the one that actually call Notification.requestPermission()\n //we must rely on that\n //this fragment below is from Urban Airship v1 source code - https://aswpsdkus.com/notify/v1/ua-sdk.js\n /*\n export default function getRegistration(\n workerRegistration: ServiceWorkerRegistration | null\n ): Promise {\n const showPerm = (\n swRegistration: ServiceWorkerRegistration\n ): Promise => {\n return Notification.requestPermission().then(\n (perm: NotificationPermission) => {\n if (perm === 'granted') {\n return swRegistration\n }\n throw new Error('Notification permission is denied.')\n }\n )\n }\n \n if (workerRegistration) {\n return showPerm(workerRegistration)\n .then(getVapidSubscription)\n .then((sub) => {\n return LocaleOverride.fromStorage().then((loc) => {\n const regBase = getRegistrationBase(loc)\n return getVapidData(sub, regBase)\n })\n })\n }\n \n return Promise.reject('Worker registration failed')\n }\n */\n \n SDK.register()\n .then(() => {\n if (shouldSendAnalytics) {\n this._checkNotificationChange();\n }\n })\n .catch(() => {\n if (shouldSendAnalytics) {\n this._checkNotificationChange();\n }\n });\n }\n })\n });\n }\n\n _checkNotificationChange() {\n if (Notification.permission === \"granted\") {\n this._sendAnalytics(\"ALLOW\");\n } else {\n if (Notification.permission !== \"default\") {\n this._sendAnalytics(\"BLOCK\");\n }\n }\n }\n\n private _sendAnalytics(action: string) {\n const cid = this.serviceFactory.userService().getCID();\n this.serviceFactory.analyticsService().sendOrbitUserFlowEvent({\n category: 'Push Notification',\n action: action,\n label: cid\n });\n }\n\n private async _setChannelInfo() {\n if (!this.serviceFactory.oAuth2Service().isAuthorized()) { // are we sure we don't have to do anything when the user logs out?\n return;\n }\n\n this._getSDK().then( async (SDK: IUASdk) => {\n const channel = await SDK.getChannel();\n\n const cid = this.serviceFactory.userService().getCID();\n channel.namedUser.set(String(cid));\n channel.tags.add(`CID-${String(cid)}`);\n\n const lang = this.serviceFactory.languageService().getISO3();\n channel.tags.add(`Language-${lang}`);\n\n const b2cDataString = this.serviceFactory.oAuth2Service().extractTokenProperty('b2c');\n const b2cData = b2cDataString ? JSON.parse(b2cDataString) : null;\n\n if (b2cData && b2cData.sessionParamsMsg) {\n\n const spm = b2cData.sessionParamsMsg;\n\n channel.tags.add(`RegistrationCountry-${spm.RegistrationCountry}`);\n channel.tags.add(`PlayerStatus-${spm.PlayerStatus}`);\n channel.tags.add(`CStatus-${spm.IsFTD ? 'ftd' : 'reg'}`);\n }\n this._sendElasticData(`Web push registered for CID: ${cid}`);\n });\n }\n\n private _getUASettings():IUrbanAirshipData{\n const isQAModeEnabledFromWindow = isOrbitInQAMode();\n const isQAEnv = isQAModeEnabledFromWindow ? isQAModeEnabledFromWindow : false;\n if (isQAEnv){\n return this._initParams.testSettings ? this._initParams.testSettings : QA_ENV_URBAN_DEFAULT_SETTINGS;\n } else {\n return this._initParams.prodSettings\n }\n }\n\n private _getUrbanAppDetails(): Partial & {workerUrl: string} {\n const settings = this._getUASettings();\n return {\n workerUrl: this._swUrl,\n vapidPublicKey: settings?.vapidPublicKey || '',\n appKey: settings?.appKey || '',\n token: settings?.token || ''\n };\n }\n\n _clearTimeout() {\n if (this._loadUAScriptObservable) {\n this._loadUAScriptObservable.dispose();\n this._loadUAScriptObservable = null;\n }\n }\n\n private _sendElasticData(logText: string, isError:boolean = false): void {\n const analyticsData: any = {\n CGPEventCategory: WebPushService.CLASS,\n CGPEventAction: logText\n };\n if(isError){\n this.serviceFactory.structuredLoggingService().getLogger(analyticsData).error();\n } else {\n this.serviceFactory.structuredLoggingService().getLogger(analyticsData).info();\n }\n }\n\n private _uaSDKOnLoad(){\n this._uaSdkLoadPromiseResolve();\n }\n\n // tslint:disable\n /**\n * @param {} n - window\n * @param {} t - document\n * @param {} c - urban sdk\n * @param {} e -'UA'\n * @param {} u - urban app details\n * @returns {}\n */\n private _loadWebPush = _.once(async () => {\n if(!this._initParams || !this._initParams.urbanAirshipSdkUrl){\n return;\n }\n\n let n = window,\n t = document,\n c = this._initParams.urbanAirshipSdkUrl,\n e = 'UA',\n u = this._getUrbanAppDetails();\n\n this._clearTimeout();\n\n const waitForScriptLoad = new Promise(resolve => {\n function r(n){ try{ f=n(u) } catch(n){ return (h=n,void i(p,n)) } i(s,f) }\n function i(n,t){ for(let c=0;c {\n Event.fire(SYSTEM_EVENTS.LOCAL_STORAGE_CHANGED);\n });\n\n window.addEventListener(USER_EVENTS.ON_FOCUS, () => {\n Event.fire(SYSTEM_EVENTS.WINDOW_FOCUS_GAIN);\n });\n\n window.addEventListener(USER_EVENTS.ON_BLUR, () => {\n Event.fire(SYSTEM_EVENTS.WINDOW_FOCUS_LOSS);\n });\n\n\n window.addEventListener('pagehide', () => {\n Event.fire(SYSTEM_EVENTS.ON_BROWSER_PAGE_HIDE);\n });\n\n }\n\n\n getCurrentBrowserTabId() {\n return this._browserTabId;\n }\n\n\n getLocationOrigin() {\n return window.location.origin;\n }\n\n getComputedStyle(element: Element) {\n return window.getComputedStyle(element);\n }\n\n getComputedSize(element: Element) {\n if (Check.isNullOrUndefined(element)) {\n return {\n width: 0,\n height: 0\n };\n }\n\n const elementStyle: any = this.getComputedStyle(element);\n return {\n width: elementStyle.width.replace('px', '') * 1,\n height: elementStyle.height.replace('px', '') * 1\n };\n }\n\n createBlankWindow() {\n return window.open('about:blank', '_blank');\n }\n\n getPathName(){\n return window.location.pathname;\n }\n\n getProtocol() {\n return window.location.protocol;\n }\n\n /**\n * Get the domain hostname.\n */\n getDomain() {\n return window.location.hostname;\n }\n\n getHost() {\n return window.location.host;\n }\n\n getHref() {\n return window.location.href;\n }\n\n /**\n * Refresh the web page.\n *\n */\n reload() {\n window.location.reload();\n }\n\n /**\n * Get Query String or \"string\" as Object\n *\n */\n getQueryParameters() {\n const pairs = window.location.search.slice(1).split('&');\n const result = {};\n\n pairs.forEach(pair => {\n try {\n const pairMatch = pair.match(/([^?=]+)=(([^&]*))/).slice(1);\n result[pairMatch[0]] = decodeURIComponent(pairMatch[1] || '');\n } catch(e) {\n //failed to parse QS\n }\n });\n\n return JSON.parse(JSON.stringify(result));\n }\n\n /**\n * Get domain from specific url\n *\n */\n extractDomain(url: string): string {\n let domain: string;\n //find & remove protocol (http, ftp, etc.) and get domain\n if (url.indexOf('://') > -1) {\n domain = url.split('/')[2];\n }\n else {\n domain = url.split('/')[0];\n }\n\n //find & remove port number\n return domain.split(':')[0];\n }\n\n private _getLinkProxyExecution() {\n return this.serviceFactory.integrationService().getLinkProxyExecution();\n }\n\n private get _openInNewWindowHook() {\n return this.serviceFactory.integrationService().openInNewWindowHook();\n }\n\n /**\n * Redirect the web page to other url.\n */\n redirect(url: string) {\n\n const linkExecutionProxy = this._getLinkProxyExecution();\n if (_.isFunction(linkExecutionProxy)) {\n linkExecutionProxy(url);\n } else {\n window.location.href = url;\n }\n\n this.serviceFactory.gameService().closeRunningGame();\n }\n\n openInNewWindow(url, specs?) {\n const randomHash = Math.random();\n\n if((Device.hybrid.inCasino || Device.hybrid.isEmbedded) && !this._openInNewWindowHook) {\n return this.serviceFactory.hybridService().openExternalLink(url);\n } else {\n if(this._openInNewWindowHook) {\n return this._openInNewWindowHook(url);\n } else {\n return window.open(url, '_blank'+randomHash, specs);\n }\n }\n }\n\n getWindowInnerDimensions() {\n return {\n width: window.innerWidth,\n height: window.innerHeight\n };\n }\n\n getScreenDimensions(){\n return {\n width: window.screen.width,\n height: window.screen.height\n };\n }\n\n scrollTo(x: number, y: number) {\n window.scrollTo(x, y);\n }\n\n getGlobalProperty(propertyName: string) {\n return window[propertyName];\n }\n\n openBankId(url: string): void {\n if(Device.hybrid.inCasino) {\n this.serviceFactory.hybridService().openExternalLink(url);\n } else {\n /*\n BankId url is an url with custom schema something like 'bankid:///?autostarttoken\n This will basically rely on the browser that will ask the operating system to handle bankid schema which in the end will open an application.\n On some browsers this works with window.location.assign and on others with window.open. This is the reason we do those two subsequent calls.\n Only one of them will be succesfull. And even if both will succeed the BankID application is a single instance application so only one instance will be opened.\n */\n window.location.assign(url);\n const tab = window.open(url);\n tab && tab.close();\n }\n }\n getHash(): string {\n return window.location.hash;\n }\n}\n","class DateTimeUtils {\n secondsToMilliseconds(seconds: number) : number {\n return seconds * 1000;\n }\n\n minutesToMilliseconds(minutes: number) : number {\n return this.secondsToMilliseconds(minutes * 60);\n }\n\n millisecondsToSeconds(milliseconds: number) : number {\n return milliseconds / 1000;\n }\n}\n\nexport default new DateTimeUtils();","import Logger from './logger';\nimport _ from './underscore';\n\n/**\n * Created by andreyna on 6/9/2016.\n */\n/**\n * Loader of the modules\n *\n */\n\nclass Loader {\n logger;\n\n /**\n * @constructor\n */\n constructor() {\n this.logger = new Logger('LOADER', window.LOG_LEVEL);\n }\n\n /**\n * Convert the require in to the default export\n *\n * @throws {Error} - if the instance not contain default export\n * @throws {Error} - if the class in the instance not contain static CLASS\n * @param req - the request instance to module\n * @returns {*} - the default class in the require file\n * @public\n */\n getDefault(req) {\n return req.keys().map((name)=> {\n let obj = req(name);\n if (_.isUndefined(obj.default)) {\n this.logger.error('module doesn\\'t contain default => ' + name);\n throw new Error('module doesn\\'t contain default => ' + name);\n }\n if (_.isUndefined(obj.default.CLASS)) {\n this.logger.error('class doesn\\'t contain CLASS => ' + name);\n throw new Error('class doesn\\'t contain CLASS => ' + name);\n }\n this.logger.debug('loader - append => ' + obj.default.CLASS);\n return obj.default;\n });\n }\n\n /**\n * Get the services class\n *\n * @returns {*} - the services class\n * @public\n */\n\n services() {\n let req = require.context('../services', true, /^.*(service)\\.(js|ts)$/);\n return this.getDefault(req);\n }\n\n /**\n * Get the option components class\n * @function\n * @returns {*} - the module class\n * @public\n */\n optionComponents() {\n let req = require.context('../components/options/option_components', true, /^.*(controller)\\.js$/);\n return this.getDefault(req);\n }\n\n /**\n * Don't use this method. It used by ExperimentalService only\n * @returns {*}\n */\n components() {\n let req = require.context('../components', true, /^.*(controller)\\.js$/);\n return this.getDefault(req);\n }\n\n}\n\nexport default Loader;","export interface IObservableSubscription {\n dispose(): void;\n}\n\ninterface IObserver {\n onNext: (data?: any) => void,\n onError: (err?: any) => void,\n onCompleted: () => void\n}\n\nexport default class Observable {\n\n private _publisher: (observer: IObserver) => IObservableSubscription;\n\n constructor(publisher: (observer: IObserver) => IObservableSubscription) {\n this._publisher = publisher;\n }\n\n forEach(onNext: (data?: any) => void,\n onError?: (err?: any) => void,\n onCompleted?: () => void) : IObservableSubscription {\n\n let observer = {\n onNext: onNext,\n onError: onError || (() => {}),\n onCompleted: onCompleted || (() => {})\n };\n\n return this._publisher(observer);\n }\n\n}","import Observable from './observable';\nimport BaseObject from '../base/base_object';\nimport DOM from './dom';\nimport {TimeSpan} from \"@sparkware/app-utils\";\nimport {TimeIntervalName} from '../../../common/utils/time-interval-names';\n\nexport default class ObservableFactory extends BaseObject {\n static CLASS = \"ObservableFactory\";\n\n private _getTimeInMilliseconds(time: TimeSpan | number) : number {\n if (typeof time === 'number') {\n return time;\n }\n\n return (time as TimeSpan).totalMilliseconds;\n }\n\n fromTimeout(timeout: TimeSpan | number, name?: TimeIntervalName) : Observable {\n let timeoutInMilliseconds = this._getTimeInMilliseconds(timeout);\n\n return new Observable((observer) => {\n const callback = () => {\n observer.onNext();\n observer.onCompleted();\n };\n\n let handler = DOM.setTimeout(callback, timeoutInMilliseconds, name);\n\n return {\n dispose: () => DOM.clearTimeout(handler)\n };\n });\n }\n\n fromInterval(interval: TimeSpan | number, name?: TimeIntervalName) : Observable {\n let intervalInMilliseconds = this._getTimeInMilliseconds(interval);\n\n return new Observable((observer) => {\n let handler: number;\n const callback = () => observer.onNext();\n handler = DOM.setInterval(callback, intervalInMilliseconds, name);\n\n return {\n dispose: () => DOM.clearInterval(handler)\n };\n });\n }\n\n fromEvent(element: HTMLElement, eventName: string, options: any) : Observable {\n return new Observable((observer) => {\n let handler = (e) => observer.onNext(e);\n let subscription = DOM.addEventListener(element, eventName, handler, options);\n\n // returns a subscription object\n return {\n dispose: () => {\n subscription.remove();\n }\n }\n });\n }\n}","import BaseObject from \"../base/base_object\";\nimport ObservableFactory from \"./observable_factory\";\nimport {IObservableSubscription} from \"./observable\";\n\nexport interface RetryItem {\n durationInSeconds: number;\n repeatTimes: number;\n}\n\nexport interface IReconnectHelperParams {\n retryFunc(): void,\n retryIntervals: RetryItem[],\n name: string\n}\n\nexport interface IReconnectHelper{\n init(params:IReconnectHelperParams);\n getNumberOfRetries(): number;\n start(): void;\n stop(): void;\n}\n\nexport default class ReconnectHelper extends BaseObject implements IReconnectHelper{\n static CLASS='ReconnectHelper';\n\n _retryFunc = null;\n _retryIntervals: RetryItem[] = null;\n _currentIntervalIdx: number = 0; //current index of _retryIntervals\n _currentRepeatCount:number = 0; //repeatTimes count for current interval\n _numberOfRetries:number = 0;\n _reconnectTimerObservable:IObservableSubscription = null; //used for timeout connection // , dar da eroare\n _observableFactory:ObservableFactory = null;\n _serviceName: string;\n\n init(params:IReconnectHelperParams){\n this._retryFunc = params.retryFunc || null;\n this._retryIntervals = params.retryIntervals || [];\n this._serviceName = params.name || \"UNKNOWN SERVICE USING RECONNECT HELPER\";\n this._observableFactory = ObservableFactory.create();\n }\n\n getNumberOfRetries(): number {\n return this._numberOfRetries;\n }\n\n /**\n * call connect function and if it fails, it will start the reconnection process\n */\n start() {\n this._callConnectFunction();\n }\n\n /**\n * clears timeout and resets counters\n */\n stop() {\n this._currentIntervalIdx = 0;\n this._currentRepeatCount = 0;\n this._numberOfRetries = 0;\n\n this._clearTimeout();\n }\n\n /**\n * starts timeout and call connection function\n */\n private _startTimeout() {\n this._clearTimeout();\n this._numberOfRetries++;\n let currentInterval = this._retryIntervals[this._currentIntervalIdx];\n\n this._reconnectTimerObservable = this._observableFactory.fromTimeout(currentInterval.durationInSeconds * 1000)\n .forEach(() => {\n if (currentInterval.repeatTimes > 0) {\n this._currentRepeatCount++;\n if (this._currentRepeatCount === currentInterval.repeatTimes) {\n this._currentIntervalIdx++;\n this._currentRepeatCount = 0;\n if (this._currentIntervalIdx >= this._retryIntervals.length) {\n this.stop();\n return;\n }\n }\n }\n // call connect function and if it fails it will renew the timout ( continues reconnection process )\n this._callConnectFunction();\n })\n }\n\n /**\n * calls reconnection function. if successful, stops the helper, otherwise restarts the timeout\n */\n private _callConnectFunction() {\n this._retryFunc()\n .then(() => {\n this.logger.info(`${this._serviceName} RECONNECT HELPER :: CONNECTION SUCCESSFUL ON ATTEMPT ${this._numberOfRetries}`);\n this.stop();\n })\n .catch(() => {\n this.logger.info(`${this._serviceName} RECONNECT HELPER :: CONNECTION FAILED, RECONNECT ATTEMPT ${this._numberOfRetries}, RETRY INTERVAL ATTEMPT NO: ${this._currentRepeatCount}`, this._retryIntervals[this._currentIntervalIdx]);\n this._startTimeout();\n });\n }\n\n /**\n * clears the retry timeout\n */\n private _clearTimeout() {\n if (this._reconnectTimerObservable) {\n this._reconnectTimerObservable.dispose();\n this._reconnectTimerObservable = null;\n }\n }\n}","module.exports = \"
\\n
\\n
\";","module.exports = \"
\\n
\\n
{title | text}
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n
\\n\\n
\\n
\\n
\\n
\\n
\\n \\n
\\n\\n\";","module.exports = \"
\\n {titleEl | inject}\\n
\\n\";","module.exports = \"
\\n\\n
\\n\\n \\n
\";","module.exports = \"
\\n
\\n {reminder_content | translate}\\n
\\n \\n\\n
\\n
\\n
\\n \\n
\\n {reminder_more_info_title | translate}\\n
\\n
\\n { reminder_more_info | translate }\\n
\\n
\\n
\\n\";","module.exports = \"
\\n \\n {touch_id_caption | translate}\\n \\n\\n
\\n \\n
\\n\\n \\n {touch_id_sub_caption | translate}\\n \\n\\n
\\n \\n \\n\\n \\n { touch_id_info | translate }\\n \\n
\\n
\";","module.exports = \"
\\n \\n {touch_id_caption | translate}\\n \\n\\n
\\n {touch_id_info_caption | translate}\\n\\n
\\n \\n \\n
\\n\\n
\\n
\";","module.exports = \"
\\n
\\n
\\n
\\n
\";","module.exports = \"
\\n\\n\\n\";","module.exports = \"\\n \\n \\n \\n \\n \\n \\n \\n \\n
{reality_check_session_time_description | translate}{elapsed_time | inject}
{session_balance_description | inject}{session_balance | inject}
\\n\";","module.exports = \"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n
{reality_check_session_cooldown_description | translate}
{reality_check_session_time_description | translate}{elapsed_time | inject}
{session_balance_description | inject}{session_balance | inject}
{reality_check_session_cooldown_remaining | translate}
{reality_check_thank_you_message | translate}
\\n\";","var map = {\n\t\"./base_options_component_controller.js\": 19881,\n\t\"./inactivity_timeout_settings/inactivity_timeout_settings_controller.js\": 25097,\n\t\"./reminder_settings/reminder_settings_component_controller.js\": 84709,\n\t\"./touch_id/touch_id_component_controller.js\": 72657\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 25158;","var map = {\n\t\"./live_feeds/game_jackpot/game_jackpot_component_controller.js\": 41083,\n\t\"./options/option_components/base_options_component_controller.js\": 19881,\n\t\"./options/option_components/inactivity_timeout_settings/inactivity_timeout_settings_controller.js\": 25097,\n\t\"./options/option_components/reminder_settings/reminder_settings_component_controller.js\": 84709,\n\t\"./options/option_components/touch_id/touch_id_component_controller.js\": 72657,\n\t\"./options/options_component_controller.js\": 97010\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 53353;","var map = {\n\t\"./3d_touch/three_d_touch_hybrid_feature.js\": 75577,\n\t\"./deep_link/deep_link_hybrid_feature.js\": 50865,\n\t\"./depositwidget/deposit_widget_hybrid_feature.js\": 31599,\n\t\"./device_detection/device_detection_hybrid_feature.js\": 95763,\n\t\"./fabric/fabric_hybrid_feature.js\": 74747,\n\t\"./firebase/firebase_hybrid_feature.js\": 66990,\n\t\"./game_launcher/game_launcher_hybrid_feature.js\": 33342,\n\t\"./geo/geo_hybrid_feature.js\": 50499,\n\t\"./info/info_hybrid_feature.js\": 84306,\n\t\"./lexis_nexis/lexis_nexis_hybrid_feature.js\": 50051,\n\t\"./lobby_pop_up/lobby_pop_up_hybrid_feature.js\": 33734,\n\t\"./migration/migration_hybrid_feature.js\": 71681,\n\t\"./native_logs/native_logs_hybrid_feature.js\": 12737,\n\t\"./on_demand/on_demand_hybrid_feature.js\": 4614,\n\t\"./on_demand/on_demand_nyx_hybrid_feature.js\": 89324,\n\t\"./push/push_hybrid_feature.js\": 27299,\n\t\"./rating_popup/rating_popup_hybrid_feature.js\": 79825,\n\t\"./scheme/scheme_hybrid_feature.js\": 666,\n\t\"./serial/serial_hybrid_feature.js\": 73821,\n\t\"./touch_id/touch_id_hybrid_feature.js\": 15155,\n\t\"./url_scheme/url_scheme_hybrid_feature.js\": 20099,\n\t\"./web_view_manager/web_view_manager_hybrid_feature.js\": 78642\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 90840;","var map = {\n\t\"./wallet_fallback_handler.ts\": 37363\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 27414;","var map = {\n\t\"./bankroll_handler.ts\": 95362,\n\t\"./freeplay_handler.ts\": 72757,\n\t\"./gamblingsession_handler.ts\": 97432,\n\t\"./messages_handler.ts\": 69207,\n\t\"./netposition_handler.ts\": 3111\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 55735;","var map = {\n\t\"./close_actionhandler.js\": 10464,\n\t\"./externallink_actionhandler.js\": 24423,\n\t\"./forgot_your_password_actionhandler.js\": 81086,\n\t\"./forgot_your_username_actionhandler.js\": 93715,\n\t\"./onredirectlink_actionhandler.js\": 43012,\n\t\"./playforfun_actionhandler.js\": 32121,\n\t\"./registration_actionhandler.js\": 63181,\n\t\"./submit_actionhandler.js\": 24847\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 95930;","var map = {\n\t\"./pending_action_errorhandler.js\": 84826,\n\t\"./token_not_valid_errorhandler.js\": 9247\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 10871;","var map = {\n\t\"./ab_testing/ab_testing_service.ts\": 19871,\n\t\"./ai_list/ai_list_service.ts\": 86425,\n\t\"./analytics/analytics_service.ts\": 78805,\n\t\"./analytics/casinofied_analytics_proxy_service.ts\": 20771,\n\t\"./bonus_abuse/bonus_abuse_parking_money_in_sport_and_poker_service.ts\": 86559,\n\t\"./cashier_proxy/cashier_proxy_service.ts\": 33138,\n\t\"./clock/clock_service.ts\": 97856,\n\t\"./component_factory/component_factory_service.js\": 24600,\n\t\"./config/config_service.ts\": 89752,\n\t\"./country/country_service.ts\": 43508,\n\t\"./currency/currency_service.ts\": 95015,\n\t\"./domain_detection/domain_detection_service.ts\": 79198,\n\t\"./evolution/evolution_service.ts\": 50422,\n\t\"./external_links_proxy/external_links_proxy_service.ts\": 72025,\n\t\"./game/game_runner_proxy_service.ts\": 27296,\n\t\"./game/game_service.js\": 85993,\n\t\"./game_manager/game_manager_service.js\": 92480,\n\t\"./game_reason/game_reason_service.js\": 37405,\n\t\"./games_correlation/games_correlation_service.js\": 30780,\n\t\"./games_information/games_information_service.ts\": 868,\n\t\"./games_questionnaire/games_questionnaire_service.ts\": 45489,\n\t\"./gnwp/gnwp_service.ts\": 50419,\n\t\"./history/history_service.ts\": 21441,\n\t\"./http/http2_service.ts\": 84592,\n\t\"./hybrid/hybrid_service.js\": 25236,\n\t\"./hybrid/hybrid_version_handler_service.js\": 74125,\n\t\"./idle_recommendations/idle_recommendations_service.ts\": 60205,\n\t\"./integration/integration_service.js\": 51432,\n\t\"./jackpot_toasters/jackpot_toasters_service.ts\": 5915,\n\t\"./language/language_service.ts\": 25566,\n\t\"./links_navigation_proxy/links_navigation_proxy_service.ts\": 43845,\n\t\"./live_feeds/jackpots/jackpot_feeds_service.ts\": 62387,\n\t\"./live_tables/live_tables_service.ts\": 17733,\n\t\"./message_manager/message_manager_service.ts\": 45060,\n\t\"./netent/netent_service.ts\": 64376,\n\t\"./oauth/oauth2_service.js\": 82909,\n\t\"./oauth/user/user_service.ts\": 12642,\n\t\"./observable_factory/observable_factory_service.ts\": 54194,\n\t\"./orbit_component_renderer/orbit_component_render_service.ts\": 42586,\n\t\"./overlay_manager/overlay_manager_service.ts\": 47910,\n\t\"./player-migration/player_migration_proxy_service.ts\": 14809,\n\t\"./player_messages_service/fallback/fallback_service.js\": 36857,\n\t\"./player_messages_service/firebase/firebase_elastic_service.ts\": 59716,\n\t\"./player_messages_service/player_messages_service.js\": 86136,\n\t\"./post_message/post_message_service.js\": 96423,\n\t\"./query_string_detector/query_string_detector_service.js\": 77027,\n\t\"./recently_played/recently_played_service.ts\": 84265,\n\t\"./regulation/regulation_service.js\": 60382,\n\t\"./resize_detector/resize_detector_service.js\": 10108,\n\t\"./restrictions/restrictions_service.ts\": 40699,\n\t\"./script_loader/script_loader_service.ts\": 46076,\n\t\"./skin/skin_service.ts\": 26453,\n\t\"./spinner_proxy_service/spinner_proxy_service.ts\": 49774,\n\t\"./structured_logging/structured_logging_service.ts\": 80771,\n\t\"./themes/themes_service.js\": 61263,\n\t\"./time/time_service.ts\": 86880,\n\t\"./toaster/toaster_proxy_service.ts\": 72797,\n\t\"./trackjs/trackjs_service.ts\": 23583,\n\t\"./visibility_detector/visibility_detector_service.ts\": 55816,\n\t\"./wallet/wallet_service.js\": 36882,\n\t\"./web_login/web_login_service.js\": 85030,\n\t\"./web_push/web_push_service.ts\": 39008,\n\t\"./window/window_service.ts\": 33094\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 10501;"],"names":["GeoLocationReason","GeoValidationResult","QA_ENV_URBAN_DEFAULT_SETTINGS","defaultIcon","defaultTitle","defaultActionURL","appKey","token","vapidPublicKey","PWA_PROMPT_EVENT","PWA_PROMPT_CALLBACK","PWA_INSTALLED_CALLBACK","PWA_SHOULD_AUTO_POPUP_LOCAL_STORAGE_KEY","TokenType","ControlledPromise","_promise","_resolve","_reject","this","Promise","resolve","reject","data","err","callBack","then","catch","BaseComponent","_selector","serviceFactory","_isDirective","_styleSelectors","el","innerComponentsRef","Array","_systemEventsSubscriptions","_domEventsSubscriptions","_timeoutSubscriptions","_intervalSubscriptions","_model","params","ServiceFactory","isDirective","Object","assign","getDefaultStyleSelectors","_","styleSelectors","createRootElement","bake","innerHtml","addClass","_getIsolationSelector","_setPropertiesSelectors","abTestingParams","abTestingService","getAbTestingDataForFeature","getClassName","applyABTestingStyleClass","DOM","html","logger","error","componentEl","Error","bindingParams","Strings","getCurlyBracesBinding","forEach","bind","bindingFunction","fn","replace","to","value","method","text","key","languageService","translation","inject","translate","toString","childComponent","onAppendedToDOM","getStyleSelectors","keys","selectorKey","setClassSelectorToEl","getPropertiesStyleMapper","elClass","selector","contentElements","getEl","getElementsByClassName","i","length","className","_detachSystemEvents","_detachDOMEvents","_clearTimeouts","_shutDownChildComponents","Event","subscription","remove","comp","shutDown","ref","querySelector","querySelectorAll","containerSelector","parentElement","throwError","appendChild","push","childComponentIndex","findIndex","splice","attribute","element","eventName","handler","index","item","onDOMEvent","childElementSelector","callback","_createEventSubscription","off","timeout","name","timeoutRef","clear","clearInterval","indexOfTimeoutRef","analyticsData","SYSTEM_EVENTS","category","properties","Properties","BaseObject","CLASS","BaseModel","BaseModelComponent","BaseModelService","_createLogger","Logger","lineNumber","message","context","theError","stackTrace","stack","JSON","stringify","methodName","argumentName","innerError","thisProto","getPrototypeOf","constructor","$instance","init","apply","arguments","BaseService","featureEnabled","_isToggledAlready","_createServiceFactoryFunction","shouldApplyFeatureToggleABTesting","applyABTestingLogic","toggleFeatureOn","oAuth2Service","isAuthorized","_safeGetPropertyLowerCase","propertyName","toLowerCase","dependencies","createServiceFactoryFunction","BaseSingleton","create","gameJackpotView","require","GameJackpotComponentController","_gameType","gametypeid","_subscribe","jackpotValue","jackpotFeedsService","getJackpotAmountInCentsByGame","_displayJackpotValue","onSystemEvent","_onJackpotsUpdated","gamesJackpots","_liveFeedContentElement","currencyService","formatMoney","amount","DIRECTIVE","MESSAGE_TYPE","INFO","WARNING","ERROR","SUCCESS","TEXT_ALIGNMENT","CENTER","LEFT","RIGHT","BUTTON_TYPE","MAIN","typeName","class","SECONDARY","CUSTOM","MDP_IMG_CSS_CLASS_SELECTORS","COMMON_ERROR","LOGIN_ERROR_CONTACT_SUPPORT","LOGIN_RESTRICTED_COUNTRY_ERROR","LOGIN_USERNAME_PASSWORD_WRONG","LOGIN_AGE_VERIFICATION_WARNING","LOGIN_CAPS_LOCK","GAME_LOW_RESOLUTION","GAME_RESTRICTED_ERROR","GAME_UNAVAILABLE","GAME_REAL_MONEY_ONLY","OAUTH_INACTIVITY_WARNING","OAUTH_DISCONNECT_NOTIFY","COOKIE_ENABLE_NOTIFY","BaseOptionsComponentController","start","_openInMDP","priority","getOverlayPriority","btnCloseCallback","onCloseBtnClicked","closeCallback","onComponentClosed","additionalClasses","contentAdditionalClasses","openCallback","_onComponentOpened","contentEl","title","_getOptionTitle","closeButton","_isCloseButtonEnabled","hasDefaultButton","customCSSClassList","_getCustomCSSClassList","buttons","_getButtons","onComponentOpened","titleLangKey","_getTitleKey","type","getOptions","PRIORITY_LEVEL","BaseOptionsModel","_options","options","view","CSS","InactivityTimeoutSettingsController","_currentSessionTimeoutSettings","_oAuthService","getCurrentSessionTimeoutSettings","bakedHTML","setHTML","_bindOptions","_setSelectorLabelText","action","label","innerHTML","_languageService","possibleSessionTimeoutValues","map","timeSpan","Math","round","totalMinutes","possibleValues","_getPossibleSessionTimeouts","_getSelectorEl","minutes","option","currentSessionTimeout","selectedIndex","isClosable","event","_onSaveBtnClicked","forceAnalytic","selectedValue","Number","parseInt","_sendAnalytics","setCustomSessionTimeout","TimeSpan","ReminderSettingsModel","_title","_initOptions","isStored","reminder","REMINDER_SETTINGS_SELECTORS","ELASTIC_ACTION_NAMES","SAVE","CANCEL","CLOSE","MOREINFO","ReminderSettingsController","Model","_initModel","accountData","userService","getAccountData","REMINDER_STORAGE_KEY","Cid","optionsObj","intervals","_getIntervals","storedReminderValue","Store","_getReminderKey","reminderIntervalAsNumber","_subscribeDOMEvents","setOptions","undefined","find","regulationService","getReminderIntervals","reminderIntervals","ddlReminder","optionItem","injectIntoCurly","reminderValue","selectedReminder","onChildElementEvent","USER_EVENTS","reminderText","reminderInfo","openType","window","getComputedStyle","display","analyticsService","sendOrbitUserFlowEvent","_sendElasticRegulationData","eventData","CGPEventCategory","CGPEventAction","RegulationID","getRegulationCode","CGPEventValue","CGPEventValueAsNumber","structuredLoggingService","getLogger","setTarget","info","_getReminderValue","set","concat","_onCancelBtnClicked","_onSaveReminder","reminderOptions","reminderIntervalInSeconds","totalSeconds","TOUCH_ID","INIT_VIEW","MODIFY_VIEW","ACTIVATION_BUTTON_CONFIRM","ELEMENT_CHECKBOX_LABEL","ELEMENT_CHECKBOX","TOUCH_ID_SCREENS","INIT_SCREEN","MODIFY_SCREEN","TOUCH_ID_CTL_OPENED","TOUCH_ID_CTL_CLOSED","TouchIdComponentModel","TouchIdBaseScreen","_parent","_html","parent","screen","close","bChecked","TouchIdAutoInitScreen","_checkboxToggle","_butNext","_setHtml","onInitScreenShow","getTokenFromSrv","TouchIdModifyScreen","checkToOpenTouchIdSettings","hybrid","hybridService","isOpenSettingSupported","isDeviceTouchEnable","bVal","_touchidfeature","getModel","openTouchIdSettings","checkTouchEnable","strToggle","checked","bOpen","onCheckTouchEnable","sendClickstreamEvent","TouchIdController","_screenType","_currentScreen","_onTryAgainSkip","_onCheckTouchEnable","_onNativeCancel","onNativeCancel","onTryAgainSkip","screenType","setParent","show","_setHtmlScreen","onClosedByClicked","OptionsComponentController","optionComponentNameToLoad","findOptionComponentByName","Loader","optionComponents","optionComponent","_isOptionExist","optionComponentName","load","OVERLAY_DOM_PROPERTIES","ID","ID_NAME","CLASS_NAME","CONTENT_CLASS_NAME","OVERLAY_COMPONENT_PROPERTIES","OVERLAY_CONTENT_PROPERTIES","TYPES_CLASS_MAP","FLAT","FULL_SCREEN","LIGHTBOX_BACKGROUND_COLOR_CLASS","ClockComponentController","_datetime","_timeClockInterval","_setInitParams","_updateTime","dateTimeFormat","skinService","getDateTimeFormat","datetime","clockService","currentDate","getCurrentDate","currentDateInRegulationTimeZone","convertToRegulationTimeZone","time","DateFormatter","date","isUTC","innerText","ComponentRenderer","_componentPrototype","_hostElement","_componentInstance","hostElement","props","_disposeComponent","removeChild","Directive","_prefix","_cgpAllowedQuery","getValueSelector","cgpLoadedDirectives","CLEAN_DIRECTIVES_INTERVAL","_loadDirectives","render","_setTimeoutRemoveDirectives","_initDOMObserver","document","body","forceRender","directive","debug","isReRenderable","_drawDirective","directiveInstance","isOnDOM","cgpElement","query","cgpDirectiveOptions","_makeDirectiveOptions","loadedDirective","configuration","_loadDirective","_cleanDirectives","elements","HTMLElement","_tryLoadDirective","_getCGPDirectiveQuery","componentSelector","_getDynamicDirectiveSelector","warn","children","match","getAttribute","indexOf","observerRoot","MutationObserver","WebKitMutationObserver","eventListenerSupported","addEventListener","_obs","mutations","record","addedNodes","_onElementsAdded","observe","childList","subtree","_onDOMNodeInserted","mutationEvent","target","cleanDirectivesTimeout","offsetParent","directiveName","split","table","_shutDownDirectives","removeEventListener","disconnect","componentId","componentDescriptor","componentOptions","directiveRaw","console","clock","Clock","game_jackpot","GameJackpot","CGP_START_SELECTOR","onInitCompleteCallback","configs","ConfigService","getConfig","loader","LOG_LEVEL","services","_initializeServices","loadDeviceSetting","subscribe","_registerAllServices","_doServicesAsyncJobs","_executeServicesOnInitializationCompleted","e","loadDirective","initializeService","_getClassProperties","ex","service","defaults","deviceType","Device","osName","classObject","objectName","servicesRegistry","ServicesRegistry","srv","registerService","asyncJobsPromises","serviceInstance","getService","doAsyncJobs","all","promises","onInitializationCompleted","_Logger","API","modelSettings","version","SDK_VERSION","_isSdkReady","_onOrbitInitCompleteFired","setDefaultConfig","userSettings","setUserConfig","Initialize","logout","autoLoginParams","sessionTimer","Check","runAutoLogin","sourceProductPackage","brandId","sourceSubBrand","targetSubBrand","marketingParams","webLoginService","openLoginForm","onCloseCallback","overlayOptions","getDateFormat","getTimeFormat","dateTime","dateTimeHistory","getDateTimeHistoryFormat","recentlyPlayedService","getRecentlyPlayedList","eventOptions","getUsername","getToken","sessionId","isLoginFromRegistration","isVIP","getUserData","integrationService","getUserSegments","getSerialData","marketingData","gameType","isOnDemandHtmlGame","url","openExternalLink","getHybrid","displayHybrid","getProductPackageID","specs","windowService","openInNewWindow","getPlatformToken","getFirebaseLoginToken","listTypeIds","aiListService","getTrendingRecommendedGamesForPlayer","renewLoginToken","innerScreen","setScreen","getTouchIDFeaturer","setTouchIdComponentController","getSubBrandID","queryStringDetectorService","getExternalBrandCallbackURL","getExternalBrandCallbackURLMethod","sourceSubBrandID","getSourceSubBrand","sourceSubBrandName","includes","getBrandID","txt","hasImage","openMail","encodeURIComponent","openMessage","openSafariTest","messageOptions","overlayManagerService","getCGPMaxOverlayZIndex","analyticObject","pushDataToDataLayer","getGoogleClientID","dataLayerObject","cents","roundIfZero","getCurrency","playerMessagesService","getMessageStrategy","KICKUpdateHandler","featureName","msgFields","fullTopic","gameTypes","gamesInformationService","getGamesInfo","themes","vendors","companies","getGamesInfoWithoutAnyFiltering","getAllGameTypes","topic","fields","FPUpdateHandler","restrictions","restrictionsService","applyRestrictions","maxGames","filterOutRecentlyPlayedGames","numberOfRecentlyPlayedGameToFilterOut","getAIList","getAINewGamesList","getAbTestingData","waitForAnonymousAbTestingData","shouldDefaultToLocalStorageData","getAnonymousPlayerAbTestingDataForFeature","countPlayerChallenges","routeParams","getDiagnosticMessages","getLoginTime","messages","OMGUpdateHandler","gameService","getGRSEnvironments","numberOfGames","gamesCorrelationService","getCorrelatedGames","setServerTime","setRegulationOffset","getCurrentServerDate","dateFormattedToRegulation","formatToRegulationOffset","_getPlayerMessages","isConnected","liveTablesService","getTablesInfo","stop","gamesQuestionnaireService","_showOverlay","historyService","getDailyDealCampaigns","getJackpotsById","getJackpotsByGameType","balanceType","plainNumber","walletService","getBankroll","getEnvironment","countryService","countryName","getCountry","supportedStates","getWrongLocationDetectionPath","localStorage","requestData","http2Service","post","get","waitForAutologin","scriptLoaderService","loadScript","getRefreshToken","OMG","PRIORITY_LEVEL_ZINDEX_MAPPER","GAME_FRAME","isInAutologin","getGeoLocationInfo","getAppDownloadPageURL","isDepositWidgetSupported","webPushService","promptPermission","content","openPopUpOnSecondWebView","closePopUpOnSecondWebView","getRegulation","getCurrentBrowserTabId","isActiveOverlayExists","gnwpService","tokenProperty","extractTokenProperty","updateTokenData","isLoginPopupEnabled","getTempAccountGnwpSource","intervalMS","log","observableFactoryService","fromInterval","gameGroupId","vendorId","getGameRestriction","AB_TESTING_DATA_LOCAL_STORAGE_KEY","AB_TESTING_ANONYMOUS_PLAYER_ID_LOCAL_STORAGE_KEY","AbTestingService","_params","_cachedABTestingData","_anonymousPlayerId","_getAnonymousPlayerDataPromise","_getAnonymousPlayerDataPromiseTimeout","_anonymousPlayerData","ErrorDescription","Features","AnonymousPlayerId","_resetCache","_readAbTestingDataFromToken","_updateAnonymousAbTestingData","_resetCacheData","container","feature","_getFeature","defaultsToLocalStorageData","featureData","_getLocalStorageABTestingData","isAnonymousPlayerSupportEnabled","_getLocalStorageAnonymousPlayerId","request","subBrandId","countryCode","isMobile","anonymousPlayerId","_resetTimeout","setTimeout","getTestsForAnonymousPlayerUrl","_saveLocalStorageAnonymousPlayerId","clearTimeout","result","waitForPromise","abTestingDataTokenProperty","_saveLocalStorageABTestingData","getCID","localStorageABTestingData","abTestingData","parse","AI_ENGINE_TYPE","MAX_AI_GAMES","AI_NEW_GAMES_KEY","AI_GAMES_KEY","AiListService","_cachedRecommendedGames","_cachedNewGamesRecommendations","_cachedRecommendedGamesForPlayerByListType","_getGameRecommendationsPromise","shouldFilterByRecentlyPlayed","_resolveAIList","getGameRecommendations","_playerHasRecommendations","engine","gameTypesOrderDict","engineId","_getEngineID","_getGameRecommendationsEngine","getGameRecommendationsForPlayerUrl","engineType","GameTypes","Engine","_convertToGameTypesDict","_getNewGameRecommendations","aiEngine","aiGameTypesArray","getNewGamesRecommendationsForPlayerUrl","ML888","getTrendingRecommendedGamesForPlayerApiUrl","every","listID","hasOwnProperty","gameTypesPerListID","_filterGameTypes","gameRecommendations","_sortGames","apiFunction","storeKey","defaultValueForKey","aiGamesStored","_filterRecommendedGames","aiGames","aiRecommendations","slice","_filterByRecentlyPlayed","filteredGameTypes","_filterByLayout","_filterAllowedToPlayRealGames","recentlyPlayedGameTypes","filter","filterInLayoutGames","filterAllowedToPlayRealGames","FEATURE_GAME_RECOMMENDATIONS","toUpperCase","dict","gameTypesDict","sort","gt1","gt2","index1","index2","PROD_DATA_LAYER_NAME","AnalyticsService","_initParams","_GTMDataLayer","_isInitialisedByB2C","GTMContainerID","UATrackingID","GTMDataLayerName","_initGTMDataLayer","cgpIsAuthenticated","cgpIsRegistered","cgpCID","cgpIsFTD","cgpPlayerStatus","cgpLoginSessionID","dataLayerName","GTMContainerId","Date","getTime","firstScript","getElementsByTagName","newScript","createElement","dataLayer","async","src","parentNode","insertBefore","cgpIsVip","IsVip","b2cData","_getB2CData","sessionParamsMsg","PlayerStatus","IsFTD","IsRegistered","IsAuthenticated","cgpExperiment","_createDataLayer","_loadGTM","_selectPlatformDataLayerIfExists","_initGTM","dataToSend","CGP_EventCategory","CGP_EventAction","CGP_EventLabel","CGP_EventValue","omitStructuredLogger","_sendAnalyticsToElasticSearch","_resetDataLayer","CGPEventLabel","valueAsNumber","_getDataLayerObject","pop","cgpUATrackingID","_getCGPVersionInfo","_getCGPEventData","cgpProductPackage","cgpVersion","getVersion","addCategory","addAction","addLabel","addValue","setEventType","ga","getGlobalProperty","getAll","_getGoogleSessionObject","CasinofiedAnalyticsProxyService","getCasinofiedAnalyticsService","messageDisplay","messageActionTaken","BET_REJECT_REASON_ID_MAP","BonusAbuseParkingMoneyInSportAndPokerService","_showBonusAbuseParkingMoneyMessage","RejectionReasonId","contentText","RealMoneyBalance","GameTypeID","isGameRunning","contentAlign","MDP_CONSTS","cashierProxyService","openCashier","sessionType","CashierSessionType","channel","source","CHANNEL_SOURCE","area","AreaType","CHANNEL_ELEMENTS","closeRunningGame","showPopupAboveSecondWebViewHybrid","CashierProxyService","getCashierService","isEligibleForDepositWidget","isCashierInRedirectMode","getProductPackage","openDeposit","openWithdraw","openTransactionHistory","openUploadDocumentsFromCashier","openOldCashier","RETRY_INTERVALS","durationInSeconds","repeatTimes","ClockService","_serverUpdateInterval","_timeData","_updateOnce","_regulationOffset","_retryGetClockHelper","clockUpdateFromServerInterval","CLOCK_CONSTS","getClockUrl","_getLocalDate","getLocalDate","_onInitComplete","_readServerClock","_tryReadServerClock","totalMilliseconds","_removeRetryReadClockHelper","_createRetryReadClockHelper","ReconnectHelper","retryFunc","retryIntervals","_increaseTimer","utcTime","getClockLocalization","serverTime","_restartTimerInterval","regOffset","useLocalTime","CLOCK_LOCALIZATION","_getClockLocalization","getRegulationOffset","response","DateTimeUtcFormated","RegulationOffsetInMilliseconds","_timeUpdatedFromServer","LOCAL","SERVER","TIMER_UPDATE_INTERVAL","DEFAULT_CLOCK_UPDATE_FROM_SERVER_INTERVAL","ComponentFactoryService","componentPrototype","STOP_CONFIGS","_configs","_pushQueryStringParameters","queryParams","_convertToObject","_pushConfig","_cleanConfig","obj","param","val","miniObj","reduceRight","prev","idx","arr","newObj","level","config","_deleteByPath","object","path","currentObject","nestedProperties","lastProperty","configValues","unshift","CountryService","_geoLocationInfo","_shouldCallCountryByIP","_countryByIP","checkIfCorrectAppInUse","default","country","state","uri","supportLoginAndRegisterRedirect","anonymousCountryTTL","mustCallCountryByIPApiFlag","RegistrationCountry","currentCountry","disableCheckIfCorrectAppInUse","geolocationResponse","countryISO3","stateId","shouldCallCountryByIP","CURRENCY_SYMBOLS","CAD","NOK","USD","EUR","GBP","DKK","SEK","RON","BRL","CURRENCY_DEFAULT_FORMAT","WALLET_TOKEN_PROPERTY_KEY","CurrencyService","_currencyFormat","currency","anonymousCurrency","precision","Accounting","_modifyAccountingLibraryFunctionality","_currencyCode","_refreshCurrencyFormat","structureFormat","currSymbol","overrideCurrencySymbol","getCurrencySymbol","format","getAnonymousCurrency","tokenCurrency","_localStorageTokenCurrency","walletToken","CurrencyCode","currencyFormat","splitFormat","fullFormat","symbol","thousand","decimal","_createFormatting","_asyncAnonymousCurrency","_languageFormatting","defaultCountry","getDefaultCountry","countryCurrencyMap","_anonymousCurrencyPostActions","DomainDetectionService","_verifyDomain","domains","getDomain","enable","_isDomainApproved","_cleanDom","_sendElasticEvent","currentDomain","getHost","some","domain","endsWith","getHref","EvolutionService","useNewIntegration","supportOneStopShop","ExternalLinksProxyService","externalLinksService","openMembership","openForgotPassword","openForgotUserName","openPendingLogin","openUploadDocumentFromMyAccount","openGameLimits","TRIPLE_EIGHT_COMPANY_NAME","NYX_COMPANY_NAME","GameRunnerProxyService","getGameRunnerService","_getGameRunner","r","isGameRunningLegacy","isGameRunningInFreePlayModeLegacy","currentRunningGameCompanyNameLegacy","continuePlayCurrentGameLegacy","stopCurrentGameAutoplayLegacy","shouldShowRealityCheckMessageWhileGameIsOpenLegacy","shouldShowTimeLimitMessageWhileGameIsOpenLegacy","isOpenGameInProgress","openRealGameFromSdkRequest","openDemoGameFromSdkRequest","GameService","_resolveGameImagePath","resolveGameImagePath","_openAnonymousGameApiUrl","openAnonymousGameApiUrl","GRS","_customChillUrl","CustomChillUrl","_customGameResourcesPath","CustomGameResourcesPath","_grsConfiguration","gameState","GameState","additionalState","AdditionalState","gameTechnology","GameTechnology","GRSEnvironment","enableVersionSending","imageFileName","origin","getLocationOrigin","gameRunnerProxyService","gameOptions","gameTypeId","isSupportFlash","isSupportHTML5","GrsData","regulationId","currencyCode","languageCode","getISO3","currentRoute","getPathName","isHybridEmbedded","productPackage","vendorEnvironment","GrsEnvironment","useNetEntGameInclusion","useEvolutionNewIntegration","useAdapterIntegration","useAdapter","gameVersion","getCompiledGameVersion","gameConfigurationFromServer","grsData","customChillUrl","chillUrl","customGameResourcesPath","requestParams","_createCommonReadGameConfigurationRequest","gameConfiguration","_handleGameConfigurationResult","GameServiceModel","_useDefaults","useDefaults","_setCashierOpenType","cashierOpenType","_setNavbarCustomClientProperties","navbar","_setResponsibleGameView","responsibleGameView","_responsibleGameView","_cashierOpenType","navbarProps","_navbarProps","GameManagerService","getNavbarProps","getCashierOpenType","getResponsibleGameView","GAME_REASON_CTA","LOBBY","CASHIER_DEPOSIT","LOBBY_FROM_GAME_LOAD","HISTORY","SELF_TEST_SWEDEN","OPEN_LIMITS_SWEDEN","SELF_EXCLUSION_SWEDEN","RESPONSIBLE_GAMING","GAME_POST_MESSAGES","GOTO_LOBBY","CASHIER","OPEN_GAME_HISTORY","GameReasonService","reason","isGameClose","numReason","gameEvent","isNaN","linksNavigationProxyService","openGamingHistoryPage","openSelfTest","openLimits","openSelfExclusion","openResponsibleGaming","_tryToSendReasonPostMessage","EventId","top","postMessageService","sendPostMessage","GamesCorrelationService","_cachedCorrelatedGames","_getCorrelatedGamesUrl","getCorrelatedGamesUrl","_readCorrelatedGames","correlatedGames","_filterRecentlyPlayed","filteredGames","_filterByGamesInformation","correlatedGameTypes","recentlyPlayedMap","gt","gamesInfo","gameInfo","restriction","isGameAllowedToPlayReal","GamesDiagnosticMessages","_gameRestrictedMessages","_gameFilteredByPlatformTypeMessges","_gameNotApprovedMessages","_onRestrictionsChanged","values","GamesInfoCache","_getServiceFactory","_gamesDiagnostics","_onRestrictionsChangedSubscription","_onOAuthStateChangedSubscription","_onInitCompletedSubscription","_shouldUpdateBetsFromLiveTables","_previousRegulationIDForBets","_gamesFromBackend","_gamesInfoCache","_gamesSubTypeToGameTypeMappingCache","_activeCurrency","_activePlatform","_activePlatformIndex","getServiceFactory","gamesDiagnostics","_setActivePlatform","_unsubscribe","_onOAuthStateChanged","getRegulationID","getRegulationIDForMinMaxBet","gameFromBackend","isAnonymousSupported","AllowDemo","isAnonymousPlayAllowed","forceDemoButton","minBet","_extractMinBetLimit","Bets","MaxBetPerBrand","maxBet","gamesFromBackend","Id","getBetLimitsFromTableFeedsEnabled","notFoundGames","liveTables","_shouldUseLiveTableFeeds","_createGameInfoFromBackendInfo","liveTable","MinBet","MaxBet","gameSubTypes","res","subType","cgpGameId","externalGameCode","_extractExternalGameCode","ExtId","externalGameSubType","_extractExternalSubTypeGameCode","ExtSubType","Title","isEliteLounge","IsEliteLounge","allowWithdrawOnlyFromReal","AllowWithdrawOnlyFromReal","supportWithdrawOnlyFromReal","hasJackpot","HasJackpot","jackpotFeedsDisabled","VendorId","vendorName","Vendor","companyId","CompanyId","companyName","Company","gameGroup","Group","GroupId","subGroupName","SubGroup","numberOfLines","NumberOfLines","hasFreeSpins","HasFreeSpins","allowedPlatformType","PlatformType","hasSideBets","HasSideBets","isMultiHand","IsMultiHand","maxBetPerSpot","MaxBetPerSpot","numberOfDecks","Decks","hasBonusGames","HasBonusGames","approvals","Approvals","gameThemes","GameThemes","volatility","_getVolatility","Volatility","isChildish","IsChildish","hasNonChildishIcon","HasNonChildishIcon","hasLessNonChildishIcon","HasLessNonChildishIcon","_applyPlatformRestrictions","VOLATILITY_LIMITS","GAME_VOLATILITY","betsConfiguration","maxBetPerBrand","_extractBetLimit","betType","betLimits","_getActiveCurrency","typeInfo","activePlatformIndex","subTypeInfo","PLATFORM_TYPES","platformType","_isPlatformMatch","_isGameAllowedForCurrentPlatform","isCurrentPlatformAllowed","logGameFilteredByPlatformType","GamesInformationService","_getGameTypesInfoUri","_getAllGameTypesApiUri","_allowUnfilteredGames","_createGamesInfoCache","appendBackendGamesInfo","allowUnfilteredGames","dispose","resultFromCache","finalGamesInfo","_readFromServer","childishIconMode","getChildishIconMode","GameChildishIconMode","overrideUnfilteredGames","currentRegulationType","_applyRestriction","_isGameApprovedForRegulation","_shouldFilterOutChildishGame","logGameNotApproved","isGameAllowedInTheGrid","isGameAllowedAndExistsInHybrid","isGameAllowed","isGameApproved","logGameRestricted","_httpService","getGamesSubTypesMappings","gamesType","_skinService","regulationID","apiUri","BrandID","Country","gs","Games","cacheResponse","reThrowError","GAME_GROUP","isVideoSlotOrSlotsGameGroup","getAllDiagnosticMessages","join","HTTPLoader","elem","GQ_LOCAL_STORAGE_KEY","GQ_CONTAINER_ID","GamesQuestionnaireService","_cashierSubscription","_membershipSubscription","_loginSubscription","_loader","_gqContainer","_isListeningToCashier","_gamesQuestionnaireBuilder","_startTimeMs","currentRegulationCode","sourceUrl","enabledForRegulation","_isEnabledForCurrentRegulation","_startListeningToCashier","_listenToLogin","featureToggle","_handleCloseCashier","_sendElasticAnalytics","GNWP_SOURCES","tagId","_getContextObject","contextObject","onReady","onReadyHandler","onError","onErrorHandler","onComplete","onCompleteHandler","now","overlayClass","isCloseBtnAllowed","_displayLoader","_initializeScript","langISO3","userInfo","systemId","getPlatformSystemID","lang","clientPlatform","getClientPlatform","clientVersion","timeElapsedSecs","toFixed","substr","_closeGamesQuestionnaire","arePreferencesSaved","clearGamesRecommendationsCache","_fireGamesQuestionariesCompleted","elasticData","isError","_buildElasticData","GNWPServiceModel","_apiURI","_navigationURI","_templates","_setTemplates","templates","_setURI","_setNavigationURI","sharedNavigationURI","isValid","template","t","DEVICE_ENUM_TYPE","TARGET_VIEWS","REQUEST_METHODS","GNWPResponse","navigationParams","baseUrl","_setBaseUrl","_setNavigationParams","navigation","form","prop","setAttribute","hiddenField","frameName","GNWP_CONSTS","_performToIframeNavigation","_performToNewWindowNavigation","getGNWPUrl","getElementsByName","getGNWPPostForm","submit","open","GnwpService","GNWPRequestModel","_getMarketingData","marketingRes","GNWPRequest","_getGNWPParams","error_code","getRedirectUri","_replaceNavigationParams","tempMarketingData","isMarketingDataExist","getRecentMarketData","_appendMarketingDataToTestData","getLexisNexisSession","testData","getAppMareketingData","TestData","isValidTemplate","templateName","fixVersion","sizeDiff","startIndex","IOS","ANDROID","NON","STATE_OF_RESIDENCE_COOKIE_KEY","GNWPUri","getGNWPUri","_isValidRequest","brandID","subBrandID","_fixVersionMaxSize","isNative","storeRegistrationCookiesData","REGISTRATION_DATA_KEY","googleSessionID","getGoogleSessionID","userSelectedState","_getUserSelectedState","optanonConsent","_getOptanonConsent","OptanonConsent","defaultHybridSerial","getDefaultHybridSerial","sr","hybridSmartLink","getSwitchBackSmartLinkToOpen","hybridScheme","getUrlSchemeToOpen","device","getDeviceTypeForGNWP","hybridNativeType","getNativeType","regId","registrationCountry","navResp","refreshToken","HistoryService","recentlyPlayedUri","aiRecommendedGameListUri","RecommendedGameList","popupCampaignsUrl","MarketingCampaigns","Http2Service","location","isAbsolutUrl","_urlEncodeOneParam","_applicationParams","_urlEncodeUrlParams","CGP_ERROR_CODES","error_description","fetch","encodeBody","headers","keepalive","status","parseFetchResponse","_parseFetchError","_logFetchError","errorStatusCode","errorStatusText","statusText","appendOrigin","_executeFetch","_encodeXFormBodyParams","authenticationData","credentials","password","fullURL","URL","search","href","brandName","getBrandName","productPackageId","screenWidth","screenHeight","language","operatingSystem","getBearerToken","getTokenAuthorizeHeader","Authorization","clientRequestId","clientProperties","_getClientProperties","fakeClientIp","getFakeClientIP","FakeClientIP","cmsSource","getCmsSourceIfValid","CGP_CMSSource","CGP_DomainOrigin","CGP_State","CGP_Skin","skin","CGP_SkinOverride","skinOverride","CGP_Country","CGP_UseCountryAsState","useCountryAsState","T3D_TOUCH","ACT_QUICK_DEPOSIT","ACT_LOGIN","ACT_PLAY_GAME","ACTION","CAPTION","VAL","CLIENT_ACTION","CLIENT_VAL","INIT_GAME_ID","RECENTLY_PLAYED_GAME_ID","ThreeDTouchModel","_gameCaption","caption","newGameId","saveRecentlyPlayedGame","gameId","ShourtcutsLaunch","KEY_NAME","ThreeDTouch","_HybridService","hybridSrv","initThreeDTouch","updateRecentlyPlayed","_getCurrectShourtcutsLaunchTxt","shourtcutsLaunch","init3DTouchShourtcutsLaunch","getParams","bResolve","shourtcutData","setShourtcutGameCaption","saveInitGameId","getRecentlyPlayedGame","getCurrectGameName","shortcutData","_gamesInformationService","getUpdateShortcutDataObj","update3DTouchShortcut","getShourtcutGameCaption","gamesList","updateGameShourtcut","shourtcuts","CGP","openGame","gametype","isReal","delete3DTouchShourtcut","deleteAll3DTouchShourtcuts","get3DTouchShortcutLaunch","getShortcutLaunch","DEEP_LINK_HYBRID","DeepLinkModel","_deepLinkObject","extractDeepLinkObject","deepLinkObject","DeepLinkHybrid","updateData","getDeepLinkObject","DepositWidget","_bEnable","_bDepositWidgetSupported","ios","android","initFeature","dt","checkHybridSupportDepositWidget","updateDepositWidgetSupported","DEVICE_DETECTION","DeviceDetection","isDeviceDetectionEnabled","getDeviceDetectionInfo","_checkIfNeedPopUp","datainfo","bIsEmulator","_getVal","bIsRootMethod1","bIsRootMethod2","bIsRootMethod3","bIsJailBroken","showPopUp","btntxt","_showPopUp","messageManagerService","closeApp","FABRIC","FabricModel","_ev","getEv","Fabric","_addEvent","ev","_IsValid","addFabricEvent","evName","evkeys","startsWith","createEvName","addEvKeyVal","FIREBASE","FireBase","_InstanceId","_AppId","_getData","getFireBaseData","json","fbdata","FirebaseAppID","FirebaseAppInstanceID","GameLauncher","_bEnableLocalGameLauncher","checkLocalGameLauncher","keyData","isSupported","loadGameLauncher","loadGamePreLoader","setLocalGameLauncherSupported","GEO","GeoModel","datatmp","decodeURIComponent","string","isEmpty","stripslashes","setString","replaceAll","code","Geo","_isFeatureEnable","_isPermissionPopupSupported","_updateEnable","onHybridDirectCall","_onGetGeoLocation","setCbFunction","SERIVCES_FUNC_LIST","FEATURE_CB_FUNC","bValid","isValidData","isPeriodic","_getGeoLocation","geoparams","_getSessionId","_getGeoLocationFromHybrid","getGeoLocation","_showGeoOrbitMsg","showGeoLocationPermissionPopUp","_executeFunc","getFuncName","allData","geoLocationRes","isPermissionPopupSupported","GEO_PERMISSION","orbitComponentRenderService","showGeoPermissionPopup","onOkPressed","onMessageClosed","HybridInfoModel","_debugMode","_autologinToken","_sessionTimerOffset","_reload","_url","_urlType","_ListInfo","checkData","_updateAllKeys","_addKeys","_addToList","objIndex","defaultVal","HybridInfo","_initInfo","_updateKey","getAllInfo","setUrl","autologinToken","getAutologinToken","runAutologin","userinfo","getSessionTimerOffset","getUrl","reload","getReload","isDebugMode","getInfo","updateAllInfo","ver","getFullVersion","getBuild","getVal","count","LEXIS_NEXIS_CONST","LexisNexis","_bLexisNexisSupport","_bIsDeviceSupportWithAnswer","_origid","_server","_timeout","_profilingSessionId","_startTime","origid","server","IsLexisNexisSupported","getLexisNexisInfo","bWaitToResponse","_isDeviceNotSupport","_getLexisNexisInfoFromDevics","getProfilingSessionId","_mergeMarketingData","LEXIS_NEXIS","timeinseconds","LobbyPopUp","_nPreviosHeight","_bLobbyPopUpSupport","_popUpTimeOut","_dataObjSrc","_onResizeEvent","_nCountInterval","_resizeInterval","_left","_right","_top","_bottom","isPopUpAboveSecounpSupported","_onShow","_onClose","dataObj","rect","msgObj","getBoundingClientRect","height","outerHeight","width","outerWidth","rectwidth","rectheight","left","x","right","y","bottom","showHybridPopUp","isFirstShow","_getParams","clearTimeOut","_onShowTimeOut","isGameOpenAndSupportLobbyPopUp","_onResize","popUpAboveSecoundShow","newParam","oldParam","_isValid","self","setInterval","bClearInterval","_isPopUpReady","getCurrentRunningGamecompanyName","gameSupported","popUpAboveSecoundClose","BUSINESS_COR_ID","HybridMigration","_migrationToken","_businessCorrId","_bRunAutoLoginOnlyOnce","_getHybridToken","_onAppsFlayerReady","_onDeepLinkReady","_runAutoLoginWhenDataIsReady","URLSearchParams","getMigrationToken","_extractToken","bIgnoreBusinessCorrId","playerMigrationProxyService","sendClientVisitAnalytics","businessCorrelationId","migrationToken","NATIVE_LOGS","CB_FN","L_NON","L_INFO","L_ERROR","NativeLogs","_logLevel","updateLogLevel","loglevel","logArr","logLevel","ON_DEMAND","STATUS_BAR_DATA","ODR_GAMES","OnDemandModel","_nTimeOut","_bEnableChillRemoteLoading","enableChillRemoteLoading","sharedFolder","ODR_SHARED_GAMES","_gatValToStore","allvals","games","gameArr","allGames","getAllOnDemandGames","OnDemand","_isOdrRealProgress","getTimeOut","deleteAllOnDemandGames","loadRemoteChill","isEnableChillRemoteLoading","readAnonymousGameConfiguration","_getChillUrl","_logError","grschillUrl","b","updateProgressBarV2","updateProgressBarV1","statusBar","progressbarfake","progressbarreal","resourcename","resourcexofmeny","sharedolder","numberOfPackages","saveOnDemandLoadedGame","isOnDemandLoadedGame","_deleteGameFolder","deleteGameFolder","remianGames","deleteGameFolders","OnDemandNyx","_bUpdateHeaderHeight","_onDemandGameIsRunning","_isIframeSupport","_iframeEnable","_gameIndicatorInterval","_gameIndicatorCounter","_gameIndicatorTimout","_bIsFakegameIndicator","iframeEnable","headerShift","gameIndicatorTimout","checkNyxIframeSupport","dataToSent","getNyxLocalHostUrl","urlLocalHost","gameStartFakeIndicator","allGameIds","NYX_ALL_GAME_IDS","_storeifNotExistGameId","_simulateGameLoadingIndicator","canHandle","_onCloseAllWebViews","_onCloseNyx","_onGameSequenceFinish","navigateForOnDemandNyx","_updateHeaderheight","isCOMBrand","BRANDS","headerClassName","_getHeaderClassName","startTime","intervalRef","elementRef","offsetHeight","headerShiftDisable","netPositionDisable","showNetPosition","_waitForTheHeaderElementToBeInDOM","hybridNyxClosedButtonEnabled","xp","yp","xl","yl","_getBrandenable","_getHeaderHeight","headerHeight","_getCloseButPosition","changeHeaderHeightOnDemandNyx","_getReason","gameReasonService","handleReason","onclose","msg","gcmevent","closeNyxODRGame","_closeAndInit","isOnDemandStandAloneGameRunning","extractFirstPart","matchedURL","isArray","NYX_TYPE","PUSH","PushModel","_bFeatureEnable","_actionData","_bIsLazyPopUp","isNullOrEmpty","isEnable","str","toReplace","substring","pushNotificationdData","_replaceIfExistAt","initData","parsePerDevice","parseData","Push","_dataVersion","_cidData","isFeatureEnable","isPushDeviceEnable","updateEnable","onDisplayWebView","_addTagOpenAppVer","_addTag","_remTag","_setAlias","isLazyPopUp","addTag","tag","remTag","cidData","newCid","setAlias","runAction","getPushActions","parseInitData","actionData","getActionData","Rating","_hybridService","_onGameCloseListener","_displayPopUpRatingAfterGame","_displayPopUpRatingAfterLogin","_onAuthChanged","displayPopUpRatingAfterGame","displayPopUpRatingAfterLogin","_removeGameCloseListener","_checkLoginCondition","_checkGamePlayedCondition","_triggerRatingPopup","isNewLoggedIn","getLoginType","LOGIN_TYPE","_onGameClose","bSend","displayRatingPopup","Scheme","_bSchemeSupported","_strGamescheme","checkSchemeSupported","httpsSupported","setSchemeSupported","gameschcme","AF","APP_NAME","DEVICE_ID","AF_INSTALL","SERIAL_DATA","AFInstall","AppsFlyerID","APP_IDFV","SERLAI_DATA","SerialExtentions","dtEncode","_replaceInfoKey","TouchIDModel","_token","_srvtoken","_deviceId","_bundleId","_deviceTouchEnable","_success","_reason","_loginWithTouch","_autoLogin","_displayAlsoFaceId","displayAlsoFaceId","_initSuccess","_getIsInitScreenShowed","isTokenEmpty","id","tokenData","_updateTouchEnable","_updateTokenData","saveTokenData","targetvalueParams","WEB_LOGIN_MODES","FIT_TO_PLAY","TouchID","_TouchIdComponentController","_bIsOpenSettingsSupported","isDisplayAlsoFaceId","setSupportedFaceId","isOpenSettingsSupported","initComplete","_onAutoLogin","_successLogin","_failLogin","setInitScreenShowed","getTokenAndCheckEnable","clearToken","loginerror","_touchCtlOpend","_touchCtlClosed","_triggerFitToPlayOrLogin","_touchIdAutoLoginOnInit","isloginWithTouch","setloginWithTouch","clearAll","fitToPlayModeEnabled","fitToPlaySubmit","_getTouchIdToken","updateLoginFormModeType","triggerTouchIdLogin","getTouchIdToken","setTokenData","isTokenEnable","callOpenTouchId","_loginWithToken","setResTouchParams","isSuccess","getParamsForToken","saveParamsForToken","getParamsForLogin","setAutoLogin","isAutoLogin","_checkOtherCid","canDisplayInitializeScreen","showInitBiometricDialog","lastCid","control","getText","openTouchId","isTokenAndCheckEnable","setSrvToken","setTokenRes","setToken","getSrvToken","isTouchIdSuported","setEnableRes","closeComponentController","onTouchVerifyError","skip","tryAgain","errorlog","getReason","onTryAgain","SCHEME","UrlSchemeModel","_featureData","_featueName","jsonData","_setfeatureName","tmpData","logData","splitDeepLinkDataArray","deepLinkData","schamaParamsMap","sessiontimer","UrlScheme","_getInfoUrlScheme","getInfoUrlScheme","dataDecode","_isDeepLink","_updateDeepLinkAndCallFeature","_updateAndCallFeature","setDeepLinkData","clearUrlScheme","onHybridUrlScheme","convertedObject","paramObject","paramName","paramValue","convertQueryStringToObject","setInfoUrlScheme","getFeatueName","getFeatureData","WEB_VIEW_TYPES","MASTER","SECOND","SAFARI","WEB_VIEW_IDS","MASTER_ID","GAME_ID","SAFARI_ID","DEPOSIT_WIDGET_ID","WEB_VIEW_REASON","UN_DEFINED","WEB_SECOND_NOT_SUPPORTED","CLOSE_BUT_CLICKED","CLOSE_BY_WEB","CLIENT_TAPED_ON_VIEW","OPEN_LINK","DEVICE_SHIFTS","IPHONE_DEFAULT","IPHONE_X_PORTRATE","IPHONE_X_LANDSCAPE","IPHONE_X_12_PRO_LANDSCAPE","ANDROID_X_BUTL","ANDROID_DEFAULT","ANDROID_S9_WIDTH","ANDROID_S9_HEIGHT","ANDROID_S9_DENSITY_2","ANDROID_S9_DENSITY_4","ANDROID_S9_DP_2","ANDROID_S9_DP_4","ANDROID_S9_LANDSCAPE","ANDROID_PORTRATE_NAV_BAR_DISPLAY","ANDROID_PORTRATE_NAV_BAR_NOT_DISPLAY","WINDOW_ELEMENTS","SPORT","WEB_VIEW_INFO","TYPE","ENAABLE_SNAP_SHOT","INJECT_FUNC","DEL_INJECT","FRAME_OFFSET_TOP_Y","FRAME_OFFSET_TOP_PORTRATE_Y","FRAME_TOP_LANDSCAPE_Y","FRAME_TOP_PORTRATE_Y","FRAME_TOP_PORTRATE_IPHONE_X","FRAME_OFFSET_BOTTOM_Y","DISPLAY_GAME_TIME_OUT","TAP_KEEP_ALIVE","BUT_INIT","BUT_RTL","BUT_W","BUT_H","BUT_X","BUT_Y","DP_TO_PX","BUT_LANDSCARE_X","BUT_LANDSCARE_Y","CLOSE_CALLED_BY_WEB","TAP_ON_VIEW","ORIENTATION","REMOTE_URL","WINDOW_ELEMENT","SHIFT_FROM_BOTTOM","ANDROID_PORTRATE","ANDROID_LANDSCAPE","BaseWebView","_id","_type","valid","RegExp","test","urlsecondwebview","openLinksAccomplished","getWebId","getType","MasterWebView","_disableSecondWebView","checkOpenLinks","reasonID","setFeatureGameDisable","SecondWebView","_onOldHybridCall","onHybridCall","_onTapped","SafariWebView","WebViewManager","_isFeatureGameEnable","_isFeatureCasheirEnable","_ListWebViews","_displayHybridTimeout","_frameOffsetTopGameDemoY","_frameOffsetTopGameY","_frameGameRealPortrate","_frameGameDemoPortrate","_frameOffsetTopSportY","_frameOffsetTopSportPortrateY","_frameOffsetTopSportPortrate","_frameOffsetTopLandScapeY","_frameOffsetTopPortrateY","_frameOffsetTopPortrateIphoneX","_frameOffsetTopCashierY","_frameOffsetBottomCashierY","_displayGameTimeOut","_butInitGame","_butInitCashier","_butInitSport","_butRtl","_butW","_butH","_butX","_butY","_but_landscape_x","_but_landscape_y","_nLocalHostPort","_allHtmlCompiledGames","_ndpToPx","enable_game","enable_casheir","display_hybrid_timeout","display_game_time_out","frame_offset_top_game_demo_y","frame_offset_top_game_real_y","game_r_portrate","game_d_portrate","game_sport_portrate","frame_offset_top_sport_y","iphoneXtopLandScapeY","iphoneXtopPortrateY","iphonetopPortrateY","frame_offset_top_cashier_y","frame_offset_bottom_cashier_y","but_initSport","but_initGame","but_initCashier","but_rtl","iphonex","but_landscape_x","but_landscape_y","but_w","but_h","but_x","but_y","webview","_isAlreadyExist","isValidId","allWebViews","ii","newId","bShowCloseBut","_fillCloseButInfo","gameTimeOut","bReal","_getNextGameId","_fillGTValues","bottomMenu","HYBRID_EMBEDDED_NAV_MENU","getEmbeddedNavMenuHeight","innerHeight","innerWidth","_addSpecificDeviceAdaptations","addSportCommonInfo","fillSportInfo","addIosInfo","addAndroidInfo","nWebId","nextId","max","dpToPx","allHtmlCompiledGames","PX_DEFAULT","initWebView","getWebViewById","setCbFunctions","setHybridDisplayTimeOut","getDpToPx","_getLogger","openDepositWidget","openMitId","_onOauthStateChange","_onPushMsgArrived","_closAllWebViews","isFeatureGameEnable","isFeatureCasheirEnable","_openCashierDirect","_openSport","_onScreenState","timeOut","getDisplayHybridTimeout","nId","webView","bEncode","webId","webType","_getObjUrl","fillFrameOffset","objWithFrameOffset","filledObj","fillGameInfo","_navigate","filWidgetInfo","openWidget","getUrlScheme","strJson","fillCashierInfo","getHeaderRegulationDataElement","headerRegulationDataElement","sportObj","fillSportInfoInSecondWebView","getParamsForCasheir","openCasheir","navigateWebView","_showWithTimeOut","scrollTo","isDepositPSPRedirect","addCustomData","depositWindowData","_show","errorDetails","closeWebView","addOrientationState","isPortrate","getallOpenwebViews","updateScreenSize","showWebView","_onOrientationStateInit","Native","_idd","serviceFuncName","jsonParams","autoGeneratedCBID","getID","serviceName","allParams","extractFunctionName","_extractFunctionConvenstion","payloadForHybrid","callToHandler","NativeIOS","webkit","messageHandlers","METHOD_NAME_IOS","postMessage","NativeAndroid","WrapperInterfaceCGP","NativeIOSPoker","NativeIOSSport","HybridFactory","WaitForHybridGameStepLogicHandler","_vendorName","_companyName","_folderStruct","folderStruct","_sharedFolder","waitForOnDemandId","_onerror","_writeToLog","floor","nTime","_getTime","errorMsg","HybridService","_wrapper","_threedtouchfeature","_fabricfeature","_pushfeature","_ondemandfeature","_ondemandnyxfeature","_webviewmanagerfeature","_hybridinfofeature","_lexisnexisfeature","_depositwidgetfeature","_appflayerfeature","_firebasefeature","_schemefeature","_gamelauncherfeature","_bDisplayWebView","_allCompiledGamesMetadata","_strSmartLinkData","_smartLink","_bSchemeGameSupported","_bLocalGameLauncherSupported","_initWrapper","_initFeatures","_updateHybridCompiledGames","initHybrid","alert","_closeGame","_onStopProgressBar","tokenParams","tokenHandler","gamesMetadata","port","setCompiledGamesMetadata","isHybridSuportHtmlCompiledGames","isCompiledHtmlGame","ondemand","isSchemeSupported","isLocalGameLauncherSupported","region","isOnDemandStandalone","navigate","getCompiledGameMetadata","setGamescheme","hostname","gameUrlBuilder","pathname","protocol","host","gameUrl","getLocalHostAndPortForOnDemand","reg","getDefault","fearureInstance","initFeatures","_saveFeature","getHybridWrapper","initHybridDirectCall","msgToHybrid","objParams","getPushFeature","getThreeDTouchFeature","_checkThreeDTouch","displayWebView","_clearHybridDisplayTimeOut","clearHybridDisplayTimeOut","shortcut","initOndemandfeature","_getSmartLink","alertProperties","rotation","srcurl","convertToAbsoluteLink","buildExternalLinkForEmbeddedHybrid","link","absoluteLink","cbFuncName","privatedata","publicdata","closeGame","inidFeature","setStartOndemand","useScheme","canUseScheme","canUseLocalGameLauncherSupported","getGameExternalName","stopgameIndicator","configService","TripleEight","gameLauncherUrl","getCurrentCompiledRegionName","headerheight","isIframeSupported","updatOnDemandGameIsRunning","SERIVCES_PARAMS_LIST","smartLinkData","appflayerfeature","OPEN_SETTINGS","openSettings","bEnable","testSafari","isWebviewmanagerfeature","isNativeSupportSecondWebView","isNativeSupportSafariCashier","closeSecondWebView","infoFeature","getInfoFeature","getInfoForDisplay","getAppleID","setDepositWidgetSupported","appsFlayerData","fireBaseData","getAFInstall","isNotHybridConnection","wrapperIsNull","isInsideAutomation","strReplace","getReplaceLocalhost","LOCAL_HOST","redirectFullURL","getProtocol","dataforHybrid","run","HybridVersionHandlerModel","_setBlockMinVersionIOS","blockMinVersionIOS","_setBlockMinVersionAndroid","blockMinVersionAndroid","_setMessageMinVersionIOS","messageMinVersionIOS","_setMessageMinVersionAndroid","messageMinVersionAndroid","_setAppStoreLink","appStoreLink","_setGooglePlayLink","googlePlayLink","_blockMinVersionIOS","_blockMinVersionAndroid","_messageMinVersionIOS","_messageMinVersionAndroid","HybridVersionHandlerService","openUrl","openMode","messageType","langService","_openApplicationStore","getApplicationStore","_showMessage","userVersion","minVersion","userSubVersions","minSubVersions","_logger","onSystemEventOnce","getBlockMinVersion","getMessageMinVersion","_isLowerThenMinVersion","_showLowVersionBlockMessage","_showLowVersionRegularMessage","ACTIVITY_DETECTION_INTERVAL","IDLE_DETECTION_INTERVAL","IDLE_RECOMMENDATIONS_LOCAL_STORAGE_KEY","DISPLAY_INTERVAL","IdleRecommendationsService","_idleDetectionInterval","_numberOfAppearancesInSession","_maxAppearancesAllowedPerSession","_idleDetectionSubscription","_userActivityDetector","_isIdleRecToasterDisplayed","_displayInterval","_recommendedGameType","_toasterDisposer","_defaultOnCloseAnalytics","_openedAnotherGameWhileIdleIsActiveAnalytics","_openedRecommendedGameAnalytics","_onCloseAnalytics","idleDetectionInterval","maxAppearancesPerSession","_getNoOfAppearancesInSessionFromLocalStorage","displayInterval","_stopIdleDetection","_startIdleDetection","_resetIdleDetectionTimer","_resetAppearancesInSession","_closeToasterWhenOpeningAnotherGame","_startUserIdleDetection","_startUserActivityDetection","_disposeIdleDetectionTimer","UserActivityDetector","userActivityDetectionInterval","onUserActivityCallback","_showIdleRecommendationToaster","_getRecentlyPlayedGame","recentlyPlayedGame","_getRecommendedGameBasedOnCorrelation","recomGameType","_getRecommendedGameInfo","recomGameTypeInfo","_showToaster","toasterHandler","toasterProxyService","showIdleRecommendationToast","toastOptions","hideProgressBar","contentProps","onPlayRecommendedGameHandler","onToastShown","_onOpened","_increaseAppearancesInSession","onToastClosed","_onClosed","recentlyGamesPlayed","random","recentlyGamePlayed","gameDataInfo","noOfAppearancesInSession","_setIdleRecommendationDataInLocalStorage","IntegrationModel","_allowedRoles","_defaultRole","_marketData","_marketingFlowType","_headerElementMethod","_richSettings","_openInNewWindowHook","_isMiniCipFunc","_isMiniCisFunc","setRole","role","_setHeaderElementMethod","headerElement","_setHeaderRegulationDataElement","_setProxyLink","proxyLink","_setGameTypeMapper","gameTypeMapper","_setGamesList","_setParamsUrl","urlSessionParams","_setAboutHelpLink","aboutHelpLink","_setLobbyUrlLink","lobbyUrlLink","_setThirdPartyCookieLink","thirdPartyCookieLink","_setMDPImageMapper","MDPImageMapper","_setRichSettings","rich","_setCMSSource","CMSSource","_setOpenInNewWindowHook","openInNewWindowHook","_setIsMiniCipFunc","isMiniCipFunc","_setIsMiniCisFunc","isMiniCisFunc","richSettings","isMiniCipFuc","isMiniCisFuc","_headerRegulationDataElementMethod","headerRegulationDataElementMethod","headerElementMethod","campaignId","richPageUrl","campaignid","_role","allowedRole","_thirdPartyCookieLink","marketingFlowType","marketData","gameTypeMapperRef","_gameTypeMapperRef","_proxyLink","_gamesList","_urlParams","_aboutHelpLink","_lobbyUrlLink","_myAccountToLobbyUrlLink","mapper","_MDPImageMapper","_cmsSource","BaseIntegration","property","stringUtil","IntegrationB2C","IntegrationService","_integrationMapFactory","_selectedVendor","_providerData","_initializeIntegrationMap","getProxyLink","getNavbarContainerElementSelector","getNavbarRegulationElementSelector","vendor","getRole","getAboutHelpLink","getLobbyUrlLink","gameTypeList","getGameTypeMapper","gameTypeMapperRefPromise","gameTypeMapperIsPromiseMiddleWare","gamesMap","gameTypesToFilter","getMarketingFlowType","getMDPImageMapper","_updateMarketingData","_updateMarketingFlowType","flowType","_updateMarketData","responseError","getIsMiniCip","getIsMiniCis","isMiniCip","isMiniCis","oauth","providerData","getRichPageUrl","tempMarketData","marketingDataFunctionCall","parsedFunction","marketingFunctionRef","functionName","functionStringParams","hook","getOpenInNewWindowHook","getCMSSource","_addAODSegments","_addB2CSegment","cookie_cstatus","cookie_tstatus","b2cSegments","b2cFeatureName","isAuth","B2CABTest","messageKey","signatureKey","providerDataObj","getProviderTokenData","sessionParams","SubBrandID","SystemId","getISO2","IsEmbeddedHybrid","IsHybrid","ProductPackage","lastSessionData","getLastSessionData","RegulationStatusId","IsRisky","_addRunTimeSegments","bakeParams","signature","DAILY_JACKPOTS_STATES","DAILY_JACKPOTS_AMOUNT_THRESHOLDS_DEFAULT","threshold","toasterName","TWILIGHT_JACKPOTS_AMOUNT_THRESHOLDS_DEFAULT","JackpotToastersService","_previousJackpot","_previousJackpotPerGameType","_stateJackpotUpdate","progressiveJackpot","enabled","toasterPerGame","_onJackpotUpdate","clearPreviousJackpotsAmounts","toasterPerGameItem","jackpotAmount","_checkThreshold","thresholds","showGameIcon","gameData","images","icon","oldJackpotAmount","gameTypeToPlay","titleText","currentThresholdData","currentJackpotData","jackpotID","JackpotState","SUPER_COLD","_showJackpotDropToaster","toasterData","showStandardToast","LastWinAmount","image","toasterImage","button","onClick","closeToast","redirect","gameName","currencySymbol","jackpotThreshold","_getResolvedGameImagePath","stateJackpot","thresholdReachedTitleText","dropTitleText","AmountInCents","_checkIfJackpotDrop","jackpotsWithState","JackpotInternalId","_stateJackpotToaster","Jackpot","dailyJackpotAmountThresholds","dailyJackpot","twilightJackpotAmountThresholds","twilightJackpot","LanguageService","_setRTLLanguageClass","isRTL","iso3","iso2","trim","textTemplate","CGP_RTL","LinksNavigationProxyService","linksNavigation","linkId","_linksNavigation","getLinkUrl","navigateLink","openPoker","openSport","openSecondaryResponsibleGaming","openSafeToPlay","GamesJackpotsPublisher","_publishQueue","_observableSubscription","throwArgumentExpected","refreshInterval","_serviceFactory","_refreshInterval","gamesJackpotsObject","gamesJackpotsArray","_createGamesJackpotsArray","_disposeObservableSubscription","gameJackpot","_publishGame","shift","amountInCents","JackpotFeedsReader","_getJackpotsUrl","_getGameJackpotUrl","getJackpotsUrl","getGameJackpotUrl","JackpotFeedsServiceDependenciesFactory","_jackpotsRefreshInterval","jackpotsRefreshInterval","milliseconds","JackpotFeedsService","_jackpotData","_dependenciesFactory","_gamesJackpotsPublisher","_jackpotFeedsReader","intervalReference","_isRequestPaused","_timeoutGuard","dependenciesFactory","disableJackpotFeeds","_onCloseGame","createFeedsObservable","_readAndPublish","createGamesJackpotsPublisher","createJackpotFeedsReader","_startOrStopJackpotRequest","_applyGuardedRequestDecision","_createIntervalReference","closedGame","readGameJackpot","forcePublish","force","readAll","jackpotData","ByGameType","ById","_buildJackpotDataById","TotalJackpotsInCents","_publishJackpotsById","delayPublish","jackpotUpdates","jpIdString","jpId","jackpot","currentJackpot","jackpotIsEqual","jackpotDataById","gameJackpotData","Jackpots","JackpotId","firstJP","secondJP","MustHitTime","LiveTablesStore","_isStarted","_currentFeedsRegulationID","_currentFeeds","_feedsInterval","feedsIntervalFrequency","liveTablesUrl","LiveTables","_evaluateBetLimitsForCurrentFeeds","getOwnPropertyNames","relevantLimit","Limits","LiveTablesService","_tablesStore","LiveTableFeedsStore","REGULATION_CODE_TYPES","RegulationTypeId","getBetLimitsFromLiveTablesEnabled","BUTTONS_DEFAULT_CLASS","cssClass","buttomTypeClass","MessageModel","footerText","hasButton","footerContentEl","defaultOptions","hasTitle","buttonPosition","imgClass","ignoreMobile","titleElements","footerClickedCallback","MessageButton","_createContentEl","_createFooterContentEl","titleElTemplate","IMAGE_CONTENT_SELECTOR","CLOSE_BUTTON_SELECTOR","FOOTER_CONTENT_AREA","MessageComponent","alignmentClass","contentArea","getDOMElementByClassName","themesService","getTextAlignment","getIsRTL","footerDiv","messageTitle","titleEl","outerHTML","newTitleEl","mouseTargetElement","firstElementChild","customClass","buttonArea","alignment","btnOptions","htmlButton","closeMessage","analytic","call","_isHasImage","contentWrapper","_injectButtons","_injectContent","_injectFooterContent","_injectTitleElements","_handleMessageTitle","_handleContentImage","component","_getAdditionalClasses","_onMessageOpen","_onMessageClosed","messageMapper","MessageManagerService","_subscribeEvents","msgOptions","_messageUiDecorator","getErrorMessage","cgpMessage","NetEntExtend","_netEntExtendObject","netEntExtendObject","resize","NetEntService","_loadNetEntSdk","netEntSdk","successFunc","netEntExtendObj","netEntExtend","errorFunc","_createNetEntLaunchGameConfig","launch","netEntGameType","gameSessionId","staticServerURL","_buildStaticServerUrl","gameServerURL","gameServerUrl","walletMode","enforceRatio","launchType","lobbyURL","depositAvailable","disableDeviceDetection","sdk","_getSdkFromWindow","sdkUrl","timeService","prepareGameUrl","staticServerUrlTemplate","_getCasinoId","casinoId","LoginTimeAnalytics","_action","duration","DateTimeUtils","_fail","errorCode","OAuth2BackendProxy","_tokenUrl","_logoutUrl","_inactivityTimeoutSettingsPersister","tokenUrl","logoutUrl","inactivityTimeoutSettingsPersister","sessionTimerOffset","sourceSubBrandId","targetSubBrandId","tokenType","forAutologinWithToken","measure","autoLogingParams","_fixPlusSignEncoding","_autologin","touchIdToken","touchParams","touch_token","forAutologinWithTouchId","deviceid","DeviceId","bundleid","BundleId","grant_type","GRANT_TYPES","getDeviceUUID","deviceUUID","_login","forLoginWithPassword","loginParams","_buildLoginParams","_buildCustomSessionTimeTokenRequestParam","playerMigrated","isPlayerMigrated","_addPlayerAppDataToLoginParams","_addMarketingDataToLoginParams","isMigrationEnabledFromConfig","_setMigrationSuccessfulCookie","authenticationdata","MIGRATION","timeSinceLastActivity","refreshTokenParams","refresh_token","time_since_last_user_activity","executeRefreshToken","err1","isRefreshTokenError","err2","customSessionTimeout","tryGetCustomAccessTokenLifeTime","custom_session_timeout","appMareketingData","playerAppDetails","gaSessionID","getMarketingData","client_id","getClientID","client_version","integration","isHybrid","devicePixelRatio","benchmark","langISO2","getAnonymousPlayerId","OAuth2State","throwNotImplemented","filedName","fieldValue","fromOnInitCompleteEvent","EmptyToken","_userData","_deleteOrphanTokenPropertiesFromStorage","TOKEN_PROPERTIES","_deleteTokenRelatedProperties","fieldName","Token","_now","_tokenData","_lastRefreshTimestamp","_jwtDecoder","_hasRememberMe","_accountData","_decodedAccessToken","jwtDecoder","_saveToStorage","_updateLastRefreshTimestamp","lastRefreshTimestamp","_setHasRememberMe","hasRememberMe","_mergeTokenFieldsOverrides","stringifiedTokenData","access_token","_saveB2CData","b2c","sessionParamsSignature","timeStamp","fieldsOverrides","_getTokenFieldsOverrides","_saveTokenFieldsOverrides","overrides","getFieldValue","newUserData","_createUserDataFromTokenData","oldUserData","cid","rawHistoryData","historyData","userName","FirstName","LastName","StatusGroupId","FTDSubBrand","genderID","GenderId","DWHGameGroupOrientation","TimeSinceRegistration","PlayerRMStatus","JoinDate","IsPromotionPermitted","TaxId","MobileNumber","LastLogin","LastLoginDateInTimeZone","getAccessTokenField","timeSinceLastRefresh","getLastRefreshTime","tokenExpirationTime","expires_in","getTimeUntilExpiration","REFRESH_TOKEN_REASONS","GENERAL_KICK_TRANSLATION_KEY","OAuth2AuthorizedState","_currentToken","_stateChangedCallback","_backendProxy","_oauth2StateFactory","_logoutUserTimer","_logoutUserCancelTimer","_kickInactiveUserTimer","_getSessionTimerUrl","_sessionEventKickSubscription","_appResumeSubscription","_localStorageChangedSubscription","_lastRefreshOnAppResume","stateChangedCallback","backendProxy","oauth2StateFactory","getSessionTimerUrl","OAUTH2_CSS","_accessTokenLifeTimeMS","shouldRefreshTokenOnAppOpen","_startKickInactiveUserTimer","_subscribeToLocalStorageChanged","_onKickEvent","_onAppResumed","_unsubscribeFromLocalStorageChanged","_onLocalStorageChanged","_killTimers","updatePostLoginData","_sendOptionsConfig","sendEvent","getAccessTokenLifeTime","getTimeSinceLastUserActivity","defaultValue","_timeSinceLastUserActivityMS","_timeBeforeWhichTheUserShouldBeNotifiedMS","timeAfterWhichTheIdlePopUpMessageShouldBeShown","_timeAfterWhichTheIdlePopUpMessageShouldBeShownMS","fromTimeout","timeSinceLastUserActivity","_startLogoutTimer","_startLogoutTimerCanceler","_showIdlePopUpMessage","setLastTimeUserPerformedAction","onClickCallback","okButton","timer","_switchToAnonymousState","logoutReason","LOGOUT_REASONS","showDisconnectPopup","isInStorage","getAccessTokenFieldFromLocalStorage","fromStorage","delete","kickParams","KickType","KICK_TYPE","kickReason","KickReasonId","visibilityDetectorService","isActive","textKey","_getIfKnownKickReason","showDefaultKickPopup","reasonId","KICK_REASONS","newState","createAnonymousState","_closeAllOverlays","reportAnalytics","executeOnLogout","autoLoginWithToken","tokenResponse","fromNew","_updateNewLoginData","loginType","_handleAutologinError","processLoginResponse","getDecodedAccessToken","getHttpAuthorizationHeader","setFieldValue","isMiniOrbit","SessionTimer","authorizedState","OAuth2AnonymousState","_emptyToken","_autologinWithTouchIdDebounceTimer","_onRunAutologin","_onRegistrationCompleted","_onAutologinWithTouchId","isExpired","_switchToAuthorizedState","autologinWithToken","postMessageData","UserInfo","SourceProductPackage","autoLoginWithTouchId","closeLoginForm","finally","fromRegistration","spinnerProxyService","stopSpinner","createAuthorizedStateForNewLogin","createAuthorizedStateForExistingToken","initializationParams","tryToRememberMe","loginWithPassword","remember_me","OAuth2StateFactory","_getDependencies","forNewLogin","_getAuthorizedStateParams","forExistingToken","InactivityTimeoutSettingsPersister","_getServiceFactoryFunc","_defaultAccessTokenLifetime","_accessTokenLifeTimeForRegulation","_minAccessTokenLifeTime","_maxAccessTokenLifeTime","getServiceFactoryFunc","defaultAccessTokenLifetime","accessTokenLifeTimeForRegulation","minAccessTokenLifeTime","maxAccessTokenLifeTime","_getDefaultAccessTokenLifetime","_limitCustomAccessTokenLifeTime","timeSpanAsString","minValueInMinutes","maxValueInMinutes","OAuth2Service","_currentState","_loginFromCompletedRegistration","_isInAutologinFromRegistration","_onBeginLoginFromRegistration","_waitForAutoLoginPromise","_waitForAutoLoginResolver","_onLoginCompletedAfterRegistration","_onLoginFailedAfterRegistration","defaultAccessTokenLifeTime","_getOAuth2StateFactory","createInitialState","getLastSessionFromStorage","onInitComplete","fakeClientIP","_changeState","_getBackendProxy","_onOauthChange","_onInitCompleteHandler","login","startSpinner","resolveWaitForAutologin","autologinWithTokenFunc","shouldShowLogoutMessage","showLogoutMessage","autologinKey","setCustomAccessTokenLifeTime","minSessionTimeout","getMinAccessTokenLifeTime","maxSessionTimeout","getMaxAccessTokenLifeTime","getPossibleAccessTokenLifeTimeValues","getTimeSinceLogin","getSourceProductPackage","OAUTH_STORAGE_KEY","OAUTH_EXPIRE_KEY_IN_STORAGE","OAUTH_LAST_REFRESH_TOKEN_TIMESTAMP","OAUTH_LAST_USER_DATA","OAUTH_LAST_SESSION_DATA","OAUTH_HAS_REMEMBER_ME","OAUTH_LAST_TIME_ACTIVITY","OAUTH_CUSTOM_SESSION_TIMEOUT","OAUTH_ACCESS_TOKEN","OAUTH_TOKEN_FIELDS_OVERRIDES","PASSWORD","REFRESH_TOKEN","AUTOLOGIN","AUTHORIZED_USER_CLASS","NEW_LOGIN","ID_VERIFICATION_STATUS","AGE_VERIFIED","ADDRESS_VERIFIDED","EXPLICIT_LOGOUT","USER_IDLE","AUTOLOGIN_FAILED","REFRESH_TOKEN_FAILED","ACCESS_TOKEN_REMOVED","USER_KICKED","UserScrollDetector","_getScrollY","scrollY","_scrollCheckingInterval","_lastScrollY","_lastScrollTime","_onScrollCallback","_scrollCheckTimer","scrollCheckingInterval","onScrollCallback","_setLastScrollTime","_setLastScrollY","_startScrollCheckTimer","_stopScrollCheckTimer","_userScrollDetector","_userActivityDetectionInterval","_onUserActivityCallback","_userActivityEventsSubscription","_userActivityDetectionTimer","userScrollDetector","setOnScrollCallback","_startUserActivityDetectionTimer","userActivityEvents","USER_ACTIVITY_EVENTS_FOR_HYBRID","USER_ACTIVITY_EVENTS_ALL","getLastTimeUserPerformedAction","getUserActivityDetectionInterval","_unSubscribe","UserService","_firebaseLoginToken","realityCheckDataUrl","updateRealityCheckDataUrl","_onLogin","regulation","attemptRealityCheckIntervalMigrationFromLocalStorageToControlCenter","_oAuth2Service","_getB2C","history","_getHistory","_extractTokenPropertyByName","propertyValue","properyToExtract","propertyToReturn","loginData","numberOfChallenges","NumberOfChallenges","realityCheckIntevalMin","updateRealityCheckData","ObservableFactoryService","_observableFactory","ObservableFactory","interval","fromEvent","OrbitComponentRenderService","_getOrbitComponentToSdkAdapter","getOrbitComponentToSdkAdapter","renderGermanyResponsibleGamingButtons","showLocationPopup","showTimeSpentReminderWithDropdown","showTimeSpentReminderWithBalance","showIntrusiveMessagePopup","renderIdleRecommendations","showAboutDialog","showTempAccountPopup","popupTextKey","showLoginMessageToast","TYPES","overlayContent","closeOverlayStrip","OverlayComponentController","_onChangePriorityEvent","changePriorityParams","classList","contains","_setPriority","newPriority","isCloseByEscape","awaitForDisplay","isHasHeader","overlayElement","_getOverlayClassToPriority","OverlayConst","_getOverlayClassToType","_getOverlayContetEl","_getContentAdditionalClasses","draw","closeBtnDOMElement","closeBtnClass","btnCloseFunction","overlayContentEl","closeEl","_getCloseEl","openFunction","typeClass","classToBeRemoved","classToBeAdded","OverlayWrapperComponentController","ExtendableError","exceptionParams","fileName","model","onerror","column","errorObj","OverlayException","QueueModel","queueList","size","OverlayManagerService","_counter","_overlayQueues","_overlayWrapper","makeObservable","observable","destroy","destroyAll","_add","_setOverlayWrapperZIndex","_initQueues","overlay","instance","appendBody","stopCurrentGameAutoplay","overlayToDestroy","closeParams","continuePlayCurrentGame","OVERLAY_ID","cleanResources","_destroyOverlayWrapper","queue","dequeue","getOverlayClasses","_createComponentOverlayOptions","_createOverlay","getPriorityNameByValue","runInAction","overlayId","_getOverlayById","changeState","isShow","activeOverlay","overlayInstance","newOverlay","foundOverlay","WRAPPER_DEFAULT_INDEX","priorityValue","PlayerMigrationProxyService","getPlayerMigrationService","FallbackHandlerDependenciesFactory","_handlerParams","handlerName","FALLBACK_HANDLERS","WalletFallbackHandler","Wallet","FallbackService","_handlersContext","_fallbackHandlers","createHandler","FallbackName","getFallbackName","fallbackName","fallback","_startFallback","_getFallbackByName","_stopFallback","excludedFallbacks","h","WALLET","FREE_PLAY","BaseFallbackHandler","_isActive","_subscription","_eventInstances","_uri","_lastReceivedVouchers","_startWalletRefresh","walletResponse","walletData","_handleWalletData","_handleFreePlay","FreePlay","Balance","AvailableMoney","Currency","RealMoneyBankroll","fpData","FreePlayList","vouchers","freePlay","_convertToVoucher","CurrentBalance","CurrAmount","Winnings","FreeBetWinning","FreePlayTypeId","FreePlayTypeID","OriginAmount","OrigAmount","CreationDate","ExpirationDate","FreePlayExpirationDate","SpinBetAmount","MaxBetAmount","GameTypeIDList","GameTypeList","_getGameTypesFromWalletFreePlay","GameType","game","newReceivedVouchers","_convertWalletFreePlays","removedVouchers","_extractRemovedVouchers","voucher","newVouchers","oldVoucher","newVoucher","_receiveWallet","FirebaseElasticService","forced","FirebaseHandlerBase","firebaseMessaging","forceFallback","_subscriptionParams","_successCallback","getFallbackServiceName","fallbackService","successCallback","errorCallback","startFallback","firebaseElasticService","sendSubscriptionError","getFeatureLabel","optionalParams","getFeatureName","setFeatureParams","getSubscriptionParams","unSubscribe","sendFallbackStarted","BankrollHandler","_updateBankroll","balanceData","_getBalance","realBR","sendMessageUpdate","bonus","casinoRM","FreeplayHandler","_updateFreePlay","vouchersChanges","_parseVouchers","addedVouchers","updatedVouchers","freePlayData","receivedVoucher","receivedData","voucherData","FreePlayId","FP_VOUCHER_TYPES","seconds","GameTypeIdList","PendingDeletion","ADDED","MODIFIED","modifiedVoucher","REMOVED","GamblingSessionHandler","_updateGamblingSession","MESSAGE_DISPLAY_MODE","MESSAGE_ANIMATION_TYPE","PLATFORM_MESSAGE_TYPE","MESSAGES_FEATURES_DEFAULTS","OMGVersion","Toasters","toasterVersion","Kick","Restrictions","BetRejected","MessagesHandler","_messagesConfig","_updateMessages","PlatformMessagesType","omgData","parseOmgMessage","OMGFieldsValueChange","TOASTER","MessageDataJson","_handleToasterTypeMessages","KICK","kickData","LimitExpirationDateInSeconds","LimitExpirationDate","CorrelationID","CorrelationId","INIT_GEO","initGeoDataData","mobileNumber","Mobile","licenseKey","GeoComplyLicense","licenseWebKey","GeoComplyWebLicense","locationTransactionId","LocationTransactionId","UPDATE_RESTRICTION_V2","restrictionData","_updateRestrictions","BET_REJECTED","PROMOTION_DISPLAY_IN_CLIENT","INTRUSIVE_MESSAGE","_handleIntrusiveMessages","GAMBLING_SESSION_ACTION","actionsReceivedFromPlatform","gamblingSessionActionEvent","dataFromPlatform","MessageType","gamblingSessionId","SessionId","sessionDurationInSeconds","SessionDurationInSeconds","sessionTotalWins","SessionTotalWins","sessionTotalBets","SessionTotalBets","messageTimeStamp","MessageTimeStamp","correlationID","messagesParams","omgVersion","restrictionsByActions","RestrictionsByAction","restrictionByAction","ReasonID","DetailedMessages","TroubleshooterMessages","TroubleshooterRetry","Boolean","dataJsonArray","dataJson","Text","buttonText","ButtonText","correlationId","playerBurnoutMessages","regularToasterMessages","dj","_isPlayerBurnoutMessage","DisplayMode","ANIMATION","AnimationType","BURNOUT","Messages","MessageData","OmgType","OpenedWithinGame","DisplayInGame","parsedMessage","NetPositionHandler","_updateNetPosition","collectionData","updatedGameTypes","MESSAGES_SOURCE","MAIN_PROXY","FULL_KICK","SOFT_KICK","KICK_REASON","KickUserAlreadyLoggedIn","KickUserMobileLocation","KickUserNoWiFi","KickUserRDPDetected","KickUserOutsideCountry","KickUserTechProblem","KickUserPluginNotInstalled","KickUserPluginNotUpdated","KickUserLocationProcessTimeOut","KickUserWagerMobileFailed","KickUserOptInError","KickUserNetworkSwitch","KickUserGCTimeout","KickUserLocationDisabled","KickUserKnownProxy","KickUserRestrictedPlay","KickUserPendingAction","KickUserDailyReached","KickUserWeeklyReached","KickUserMonthlyReached","KickUserUkNightLimit","PLAYER_EVENT_TYPES","MainRestrictionParser","restrictionsByAction","RestrictionAction","RestrictionActions","_formatToCGPRestrictionAction","restrictionObj","restrictionAction","ActionId","ActionName","entities","Restriction","_parseEntity","Entities","entity","EntityId","EntityName","Values","restrictionValues","Value","_parseRestrictionValue","restrictionValue","ReasonId","SecondsToExpire","MainProxyStrategy","_omgVersion","_onStateChanged","_intervalObserver","_readPlayerEvents","Events","playerEventsMessage","_handlePlayerEvents","playerEvents","playerEvent","_handlePlayerEvent","eventType","EventType","EventDataJson","_onKickReceived","_onGeoReceived","_onRestrictionReceived","_onOMGReceived","KickReason","_isOMGCanBeDisplayed","SerializedMessagesDetails","OMGType","SupportVersion","FirebaseStrategy","_firebaseConnectionFactory","_firebaseConnection","_reconnectHelper","_firebaseHandlers","_sendMonitoringRetriesNo","setKeyRetries","_reconnectionHelperFactory","reconnectionHelperFactory","_subscribeToInitComplete","_onAuthStateChanged","_isAuthorized","_getFirebaseAndConnect","_subscribeToOAuthStateChanged","_disconnect","_loadTripleMessaging","_getFirebaseConnectorFromWindow","_startFallbackService","_startConnectFirebase","_getToken","setFirebaseLoginToken","createWithCallback","_enhanceAndReportFirebaseSDKEvent","_sendFailMonitoring","getNumberOfRetries","stopAllButThis","_subscribeToFirebaseEvents","sendConnected","libUrl","_readHandlers","moduleExport","TargetType","TargetTypeValue","logOut","unsubscribe","_removeReconnectHelper","_createReconnectionHelper","_connectToFirebase","sendConnectionFailed","crt","sessionData","globalSessionID","initialSessionId","playerSessionID","userData","brand","bakedEvent","storageUrl","StructuredLogging","postJSON","PlayerMessagesFactory","sourceParams","dependensies","Firebase","MainProxy","PlayerMessagesService","_source","_sourceInitParams","_activateMessagesSourceService","_activeMessageSource","createMessageSourceComponent","getClientPlatformVersion","PostMessageService","_onListenEvent","postEvent","listener","attachEvent","targetWindow","targetOrigin","QueryStringDetectorService","_handlersMap","onPageLoadCGP","queryStringParams","queryParamName","_getQueryHandler","_clearStore","_getTokenWithType","_autologinParameterName","reasonHandler","sourceSubBrandHandler","linkIDHandler","sourceProductPackageHandler","clientVersionHandler","specificNavigationHandler","_initializeHandlersMap","getAutologinKey","_getQueryParamValue","linkID","migrationTokenValue","_getAutoLoginMigrationToken","sessionStorage","setItem","corrId","_getAutologinToken","_extractSessionTimerOffset","specificNavigation","_externalBrandCallbackURL","_parseSpecificNavigation","_externalBrandCallbackURLMethod","specificNavigationString","specificNavigationDoc","callbackUrlElems","textContent","callbackMethodElems","RECENTLY_PLAYED_LOCAL_STORAGE_KEY","RecentlyPlayedService","_recentlyPlayedList","_lastUpdateTime","_onOrbitInitComplete","_updateRecentlyPlayedGames","newTime","_isUpdateRequired","recentlyPlayedListCopy","gameTypeIndexInList","_fireUpdateEvent","recentlyPlayedFromLocalStorage","_getRecentlyPlayedFromServer","recentlyPlayedList","getRecentlyPlayed","recentlyPlayedGames","_filterRestrictedGames","recentlyPlayedGamesFilterRestrictions","getAllGamesInfo","RegulationModel","_reminderIntervals","_setRegulationCode","_setReminderIntervals","_setTimeLimitPercentageReminder","_setMaxDurationsInMinutesForMobile","_setMaxDurationsInMinutesForPC","_setLossLimitPercentages","_setIntervalReminderInMinutes","_setRestrictionPeriodsInMinutes","_setSessionCooldownConfigData","_regulationCode","RegulationConst","_splitCommaSeparatedNumbers","_extractRegulationSpecificConfig","_timeLimitPercentageReminder","commaSeparatedNumbers","n","_maxDurationsInMinutesForMobile","_maxDurationsInMinutesForPC","_lossLimitPercentages","_intervalReminderInMinutes","_restrictionPeriodsInMinutes","_sessionCooldownConfig","cooldownTime","sessionCooldownTime","configName","regulationCode","regulationParams","_sequences","SESSION_TIMER_INCREMENT_INTERVAL","HEART_BEAT_INTERVAL","SessionTimerLogicHelper","_sessionTime","_sessionTimerObservable","_heartBeatObservable","_focusGainSubscription","_startInProgress","_readSessionTimeFromServerAndLog","_startHeartBeat","_readSessionTimeFromServer","_startSessionTime","_stopHeartBeat","_stopSessionTimer","getSessionCooldownConfig","sendToLogs","sessionTime","prevSessionTime","add","GenericRealityCheckMessageHandler","SESSION_TIMER_UPDATE_SUBSCRIPTION","OAUTH_STATE_CHANGE_SUBSCRIPTION","_inMem_lastRealityCheckMessageIndexShown","StartSessionTimerContext","OnLogin","_onOAuthStateChange","_onSessionTimerUpdate","_lastRealityCheckMessageIndexShown","beforeValue","currentRealityCheckMessageIndexToBeShown","realityCheckInterval","handleRealityCheckMessageCallback","BaseRegulation","cssSuffix","_sessionTimerHandler","_realityCheckMessageHandler","_realityCheckInterval","_parseRealityCheckInterval","days","hours","realityCheckEnabled","getRealityCheckInterval","expectedValueByTheGame","_handleRealityCheckMessage","confirmCallback","getSessionTime","sessionTimerEnabled","_getRealityCheckMessageHandler","nightLimitExpirationDate","REGULATION_STATUS_ID_MAP","DefaultRegulation","TempAccountMessageRegulationHelper","daysLeft","DaysToUploadDocument","TEMP_ACCOUNT_STATUS","tempAccountParams","paramsFunc","_getDefaultAccountStatus","hideDaysLeft","bodyText","footerMessageKey","ItalyRegulation","_tempAccountMessageHelper","tempAccountMessageHelper","showTempAccountMessage","DkStructuredLogging","regulationData","currencyType","netLoss","TotalNetLoss","loggedInTime","fullMessage","errorDescription","DkRegulation","_structuredLogger","isVerifiedForRegulation","_realityCheckShouldBeDisplayedInGame","getRealityCheckData","playingTime","getCurrentSessionTime","totalNetLoss","isInGame","realityCheckMessageSuccess","realityCheckMessageError","shouldShowRealityCheckMessageWhileGameIsOpen","TEMP_ACCOUNT_PARAMS","SpainRegulation","_msgParams","isDocUploadRequired","IsDocUploadRequired","externalLinksProxyService","getTempAccountParams","SwedenStructuredLogging","limitsData","_buildLoginSuccessEvent","errorMessage","_buildLoginErrorEvent","limits","DefinedDepositLimits","limit","limitType","Type","limitAmount","Amount","DEPOSIT_LIMIT_TYPES","SwedenRegulation","useControlCenterForReminderInterval","RealityCheckDataIntervalInMins","messageText","_shouldShowMessage","shouldShowMessage","isGameRunningInFreePlayMode","shouldShowTimeLimitMessageWhileGameIsOpen","messageParams","_getLoginMessageParams","loginMessageError","ErrorMessage","loginMessageSuccess","ToastCloseReason","formatAmount","net_loss","abs","depositLimit","daily_limit","weekly_limit","monthly_limit","lossMsgSchema","ControlCenterOpenSource","MrgreenSwedenRegulation","PortugalRegulation","_getTempAccountParams","UKRegulation","_getAccountData","IdVerificationStatus","AddressVerificationStatus","componentFactoryService","createComponent","getReminderInterval","getUpdateRealityCheckDataUrl","controlCenterReminderInterval","localStorageReminderInterval","timerType","TSR_TYPE","Underscore","limitExpirationDate","hoursString","findDifferenceBetweenDatesInHours","casinofiedAnalyticsProxyService","businessCorrelationID","displayMessageName","DISPLAY_MESSAGE_NAMES","displayMessageID","DISPLAY_MESSAGE_IDS","actionType","locale","getCulture","hour","toLocaleTimeString","minute","toLocaleDateString","RomaniaRegulation","subTitleText","showAckStandardToast","SHRegulation","COMBaseRegulation","MaltaRegulation","amountWagered","WagerAmount","subtitle","NetherlandsRegulation","GibRegulation","USBaseRegulation","_switchToSessionTimerWaitInterval","switchToSessionTimerWaitInterval","_getRegulationType","NewJerseyRegulation","GenericRealityCheckComponentModel","_setElapsedTime","elapsedTime","_setSessionBalance","sessionBalance","_elapsedTime","balance","_sessionBalance","translationKey","generic_view","session_cooldown_view","GenericRealityCheckComponent","isSessionCooldownEnabled","elapsed_time","_formatTime","getElapsedTime","session_balance","getSessionBalance","session_balance_description","getSessionBalanceDescription","padStart","RealityCheckWithConfirmationMessageHandler","_awaitsRealityCheckConfirmation","lsValue","_lastConfirmedRealityCheckMessageIndex","indexNotShown","indexNotConfirmed","_realityCheckConfirmed","GermanyRegulation","_IsDocUploadRequired","continueGAObj","messageConfig","CyClass","CLIENT_EVENTS","_getRealityCheckMessageText","_openRealityCheckMessage","realityCheckData","componentConfig","CanadaOntarioRegulation","stepsBeforeOpenLoginAndRegistration","MichiganRegulation","MrgreenDenmarkRegulation","RegulationFactory","_regulations","regulationKey","_createRegulationKey","_createRegulation","isNetherlands","regulationCreateParams","REGULATION_SUFFIX","RegulationService","_regulationSuffix","_regulationFactory","_registeredBeforeCurrentLogin","_logginMessagesAlreadyShowed","regulationFactory","_setRegulationCSS","_startSessionTimer","OnAppStartup","showLoginMessage","stopSessionTimer","onKickEvent","_setSecondWebViewCSS","startSessionTimer","regSuffix","getCssSuffix","isOpen","webViewClass","getTimeLimitPercentageReminder","postLoginActionsArePassed","getMaxDurationsInMinutesForMobile","getMaxDurationsInMinutesForPC","getLossLimitPercentages","getIntervalReminderInMinutes","getRestrictionPeriodsInMinutes","getSessionCooldownConfigData","showHelpInAboutWindow","runConditionsBeforeOpenLink","shouldPreventMoreThanOneOpenGame","getRealityCheckIntervalExpectedByTheGame","sessionTimerVisible","showSessionBalanceInAboutBox","enableSummaryMessageForPortugal","shouldShowPlayerLimitsToaster","ResizeDetectorModel","setWidth","setHeight","_width","_height","orientation","_orientation","_deviceType","ResizeDetectorService","getWidth","getHeight","_onResizeScreenEventsDetector","_onFullScreenEventsDetector","_responsiveDeviceChange","_orientationChanged","_checkScreenHeight","_checkScreenResolution","_checkMobileOS","_checkIpadDevice","_checkIsAndroid","_checkIphoneVersion","_checkIsHybrid","_checkIsEmbeddedHybrid","_addStyleTagForEvoGames","_onFullScreenChange","webkitIsFullScreen","mozFullScreen","msFullscreenElement","fullScreenFlag","fullScreenElem","fireResize","currentDeviceWidth","currentDeviceHeight","_changeResponsiveDevice","_changeOrientation","style","removeOrientationState","getOrientation","inputText","loginPasswordText","blur","setOrientation","addDeviceType","removeDeviceType","getDeviceType","setDeviceType","bodyElem","createEvent","eventDetails","initEvent","dispatchEvent","fireEvent","LOW_RESOLUTION_SELECTOR","LOW_HEIGHT_SELECTOR","styleTag","min","getElementById","NoRestrictionValue","RestrictionMessages","expirationDate","restrictionExpirationDate","_formatDate","RESTRICTION_REASONS","RESTRICTION_ACTIONS","GenericRestrictionValue","_actionId","_reasonId","_value","_expirationDate","_createRestrictionMessage","createRestrictionMessage","actionId","parseDate","getTimezoneOffset","restrictionMessages","showSessionLimitMessage","showGenericMessage","RestrictionValueFactory","RESTRICTION_ENTITY_TYPE","RestrictionsPool","_restrictionValueFactory","_currentPackageId","_currentSubBrandId","_noRestriction","_restrictionsMap","restrictionValueFactory","_loadRestrictions","vendorID","_getFirstNonExpiredRestriction","allGameTypes","gameGroups","gameVendors","currentSubBrand","currentPackage","isActiveRestrictionForOpenApplication","section","j","createRestrictionValue","restrictionsMap","_initRestrictionsMap","restrictionEntity","_appendRestrictionEntityValues","_initRestrictionsMapSection","_createRestrictionValue","sectionName","RestrictionsStrategyBase","_serviceFactoryCallback","getServiceFactoryCallback","getRestrictionsPool","restrictionsPool","isPackageRestrictedForOpen","_sendRestrictionAnalytics","isSubBrandRestrictedForOpen","AnonymousRestrictionsStrategy","_anonymousRestrictionsUri","_restrictionsByAction","_restrictionsPool","anonymousRestrictionsUri","anonymousRestrictions","_createRestrictionsPool","BrandId","SubBrandId","ClientVersion","RESTRICTION_STORAGE_KEY","AuthorizedRestrictionsStrategy","_onUpdateRestrictions","restrictionJSON","_createRestrictionsByAction","restrictionsData","RestrictionsService","_anonymousRestrictionsStrategy","_authorizedRestrictionStrategy","_currentRestrictionsStrategy","_getCommonStrategyParams","hybridPermittedMap","_switchStrategy","currentRestrictionsStrategy","showClientRestrictionMessage","isApplicationRestricted","restrictionText","setRestrictions","_onOauthStateChanged","_onHybridInfoComplete","appID","permittedMap","permittedCountries","DEFAULT","_openRelevantRestrictionMessage","_openCountryRestricitonMessage","ScriptLoaderService","_loadedScripts","_createLoadScriptPromise","loadScriptWithRetry","retryCount","scriptTag","ignoreOneTrustAtt","createAttribute","setAttributeNode","scriptType","onload","_services","servicePrototype","serviceDescriptor","dependenciesInjected","injectDependencies","DEVICE_TYPE","getDeviceTypeName","native","webapp","pc","filteredProductPackage","productPackageGroup","reduce","acc","productPackageKey","filterPackages","SERIAL_PROVIDER","AppFlayerModel","_afID","_appName","_deviceID","_afinstall","_serialData","_serialDataDecode","_idfv","_getCommonData","orgData","_fillGeneralData","AppID","DeviceID","IDFV","AppFlayer","_update","getSmartLinkData","setSmartLinkData","serialData","SerialProvider","Serial","_currentProvider","HybridSerialProvider","getCurrentProvider","SerialConst","InfoModel","_webInfo","infoOk","setData","InfoService","infoError","getData","strWeb","strHybrid","SkinService","_platformSystemID","_clientIDPattern","_clientVersionPattern","_productPackage","_serial","_info","_defaultHybridSerial","_clientPlatform","clientID","platformSystemID","serial","Info","_setDefaultHybridSerial","androidDefaultHybridSerial","iosDefaultHybridSerial","appDownloadLinkIos","appDownloadLinkNonIos","getProductPackageGroupMobile","getProductPackageGroupPC","mobilePackages","wrongLocationDetectionPath","isComRelatedBrand","isUK","orbit","_getOrbitVersion","_getIsPWA","minimumAge","dateFormat","timeFormat","dateTimeHistoryFormat","culture","SpinnerProxyService","isMigrationSpinner","getSpinnerService","LogEventHeaderBuilder","_environment","_target","_correlationID","_businessCorrelationID","_sessionID","_appID","_productPackageID","_sequentialNumber","_eventType","headerData","clientDateTime","uuidv4","environment","getLogLevel","logVersionFormat","getLogVersionFormat","productPackageID","sequentialNumber","sessionID","decodedToken","eventTypes","isNTSTarget","LogEventDataBuilder","_eventData","addEventName","isMiniCIP","isMiniCIS","_prepareString","customData","LogDeviceDataBuilder","userAgent","screenResolution","LogClientDataBuilder","clientData","subBrand","browserTabId","parentProductPackage","ElasticLogger","_storageUrl","_headerBuilder","_deviceDataBuilder","_clientDataBuilder","_eventDataBuilder","storageURLFromLS","setCorrelationId","setBusinessCorrelationID","setSessionID","setAppID","setProductPackageID","setSequentialNumber","eventHeader","build","deviceData","payload","_buildRequestPayload","_send","StructuredLoggingService","_createElasticLogger","BRANDED_THEMES","THEMES_CLASSES_LIST","THEMES_DEFAULTS","THEMES_LIMITS","ThemesModel","_mergedPreferences","fonts","fontSizes","colors","userPreferences","mergeDefaultsWithUserPrefs","fontTypes","captcha","resultObj","userObject","defaultProp","userProp","ThemesService","getUserPreferences","userPrefernceAfterRenaming","_renameAllToIncludeAllPath","output","brandKey","_getThemesBrandKey","classPropertiesChangedFlag","currentClass","Consts","_getThemesBrandedClass","classStyle","currentClassProperties","Set","_changeValueAccordingToUserValue","_checkLimits","_addSuffix","defaultClass","brandedClasses","brandedClass","mergedClass","brandedProp","brandProperty","textAlignment","getMergedPreferences","themesWithNewNames","_renameToIncludeAllPath","changeThemeAccordingToUserPreferences","propertyNameLowerCase","themeName","themeContent","newPath","firstProperty","secondPropertyName","TimeService","firstDate","secondDate","_findDifferenceBetweenDates","differenceType","divideBy","dateAsString","ToasterProxyService","toasterService","TrackjsService","_application","_userCID","_version","application","_initTrackJS","_getUserCID","TrackJS","_initTrackJsExtraInformation","VisibilityDetectorService","onVisibilityChange","visibilityState","WalletService","_previousBalance","refreshWallet","_updateWalletLocally","bankroll","originalWalletData","newWalletData","_updateWallet","isNewBalance","isNewRealMoneyBankroll","tokenWallet","_getTokenWalletData","BalanceType","balanceProperties","tokenWalletData","getBalance","bankrollType","LoginActionHandlerBase","CloseActionHandler","ExternalLinkActionHandler","ForgotYourPasswordActionHandler","ForgotYourUsernameActionHandler","OnRedirectLinkActionHandler","PlayForFunActionHandler","RegistrationActionHandler","getWebLoginMarketingParams","SubmitActionHandler","dl","isremembermerequest","LoginErrorHandlerBase","errorProcessingResult","loginResponse","_handledErrorCode","PendingActionErrorHandler","pendingActionToken","TokenNotValidErrorHandler","clearTokenInfoFromLocalStorage","WebLoginComponent","_initObjectBuilder","_eventsObjectBuilder","_sdkUrl","_isWebLoginComponentLoaded","_loginComponentWrapperElement","initObjectBuilder","eventsObjectBuilder","_loadWebLoginSDK","rllogin","RL","PF","Web","LoginUi","Login","_buildInitObject","_buildEventsObject","secondsUntilNewRetryBulk","commonEventsObject","buildEventsObject","buildInitObject","_getWebLoginComponent","updateform","merge","buildFormOptions","hide","processresponse","_getWebLoginComponentPromiseHandler","EventsObjectBuilder","_handlersModulesReader","read","handlersContext","_eventsObject","handlersModulesReader","handlerModule","actionName","execute","InitObjectBuilder","_enableCaptcha","enableCaptcha","subbrandid","productpackageid","languagecode","formoptions","showclosebutton","logoptions","disabletrackjs","mode","errorcodeid","modeoptions","username","_getLastLoginUserName","showrememberme","enablecaptcha","LoginErrorHandler","errorHandlerModule","_readErrorHandlers","errorHandler","handle","WebLoginServiceDependenciesFactory","WebLoginService","_webLoginComponent","_latestOpenLoginParams","_openLoginFormPromisesResolvers","_createWebLoginComponent","createEventsObjectBuilder","createInitObjectBuilder","createLoginErrorHandler","createWebLoginComponent","promiseResolver","originalLoginResponse","processResponse","loginProcessingResult","actionhandler","ah","_loginErrorHandler","handleError","WebPushService","_swUrl","_loadUAScriptObservable","_uaSdkLoadPromise","_uaSdkLoadPromiseResolve","_uaSdkLoadPromiseReject","_loadWebPush","urbanAirshipSdkUrl","c","u","_getUrbanAppDetails","_clearTimeout","waitForScriptLoad","d","o","f","s","p","l","_setup","v","rel","head","_uaSDKOnLoad","_setChannelInfo","_sendElasticData","loadWebPush","uaSdkLoadTestPromise","getServiceWorkerUrl","_startTimeout","UA","_getSDK","SDK","Notification","permission","canRegister","shouldSendAnalytics","register","_checkNotificationChange","getChannel","namedUser","String","tags","b2cDataString","spm","isQAModeEnabledFromWindow","isOrbitInQAMode","testSettings","prodSettings","settings","_getUASettings","workerUrl","logText","_registerToUA","WindowService","_browserTabId","elementStyle","pairs","pair","pairMatch","getLinkProxyExecution","linkExecutionProxy","_getLinkProxyExecution","randomHash","tab","hash","secondsToMilliseconds","req","Observable","publisher","_publisher","onNext","onCompleted","observer","timeoutInMilliseconds","_getTimeInMilliseconds","intervalInMilliseconds","_retryFunc","_retryIntervals","_currentIntervalIdx","_currentRepeatCount","_numberOfRetries","_reconnectTimerObservable","_serviceName","_callConnectFunction","currentInterval","module","exports","webpackContext","webpackContextResolve","__webpack_require__"],"sourceRoot":""}