@optimizely/optimizely-sdk
Version:
JavaScript SDK for Optimizely X Full Stack
1 lines • 63.2 kB
JavaScript
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("@optimizely/js-sdk-logging"),r=require("@optimizely/js-sdk-event-processor"),i=require("@optimizely/js-sdk-utils"),n=require("@optimizely/js-sdk-datafile-manager"),o=(e=require("murmurhash"))&&"object"==typeof e&&"default"in e?e.default:e,a=function(){return(a=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}).apply(this,arguments)};function s(){for(var e=0,t=0,r=arguments.length;t<r;t++)e+=arguments[t].length;var i=Array(e),n=0;for(t=0;t<r;t++)for(var o=arguments[t],a=0,s=o.length;a<s;a++,n++)i[n]=o[a];return i}var u={NOTSET:0,DEBUG:1,INFO:2,WARNING:3,ERROR:4},l={CONDITION_EVALUATOR_ERROR:"%s: Error evaluating audience condition of type %s: %s",DATAFILE_AND_SDK_KEY_MISSING:"%s: You must provide at least one of sdkKey or datafile. Cannot start Optimizely",EXPERIMENT_KEY_NOT_IN_DATAFILE:"%s: Experiment key %s is not in datafile.",FEATURE_NOT_IN_DATAFILE:"%s: Feature key %s is not in datafile.",IMPROPERLY_FORMATTED_EXPERIMENT:"%s: Experiment key %s is improperly formatted.",INVALID_ATTRIBUTES:"%s: Provided attributes are in an invalid format.",INVALID_BUCKETING_ID:"%s: Unable to generate hash for bucketing ID %s: %s",INVALID_DATAFILE:"%s: Datafile is invalid - property %s: %s",INVALID_DATAFILE_MALFORMED:"%s: Datafile is invalid because it is malformed.",INVALID_CONFIG:"%s: Provided Optimizely config is in an invalid format.",INVALID_JSON:"%s: JSON object is not valid.",INVALID_ERROR_HANDLER:'%s: Provided "errorHandler" is in an invalid format.',INVALID_EVENT_DISPATCHER:'%s: Provided "eventDispatcher" is in an invalid format.',INVALID_EVENT_TAGS:"%s: Provided event tags are in an invalid format.",INVALID_EXPERIMENT_KEY:"%s: Experiment key %s is not in datafile. It is either invalid, paused, or archived.",INVALID_EXPERIMENT_ID:"%s: Experiment ID %s is not in datafile.",INVALID_GROUP_ID:"%s: Group ID %s is not in datafile.",INVALID_LOGGER:'%s: Provided "logger" is in an invalid format.',INVALID_ROLLOUT_ID:"%s: Invalid rollout ID %s attached to feature %s",INVALID_USER_ID:"%s: Provided user ID is in an invalid format.",INVALID_USER_PROFILE_SERVICE:"%s: Provided user profile service instance is in an invalid format: %s.",NO_DATAFILE_SPECIFIED:"%s: No datafile specified. Cannot start optimizely.",NO_JSON_PROVIDED:"%s: No JSON object to validate against schema.",NO_VARIATION_FOR_EXPERIMENT_KEY:"%s: No variation key %s defined in datafile for experiment %s.",UNDEFINED_ATTRIBUTE:"%s: Provided attribute: %s has an undefined value.",UNRECOGNIZED_ATTRIBUTE:"%s: Unrecognized attribute %s provided. Pruning before sending event to Optimizely.",UNABLE_TO_CAST_VALUE:"%s: Unable to cast value %s to type %s, returning null.",USER_NOT_IN_FORCED_VARIATION:"%s: User %s is not in the forced variation map. Cannot remove their forced variation.",USER_PROFILE_LOOKUP_ERROR:'%s: Error while looking up user profile for user ID "%s": %s.',USER_PROFILE_SAVE_ERROR:'%s: Error while saving user profile for user ID "%s": %s.',VARIABLE_KEY_NOT_IN_DATAFILE:'%s: Variable with key "%s" associated with feature with key "%s" is not in datafile.',VARIATION_ID_NOT_IN_DATAFILE:"%s: No variation ID %s defined in datafile for experiment %s.",VARIATION_ID_NOT_IN_DATAFILE_NO_EXPERIMENT:"%s: Variation ID %s is not in the datafile.",INVALID_INPUT_FORMAT:"%s: Provided %s is in an invalid format.",INVALID_DATAFILE_VERSION:"%s: This version of the JavaScript SDK does not support the given datafile version: %s",INVALID_VARIATION_KEY:"%s: Provided variation key is in an invalid format."},E={ACTIVATE_USER:"%s: Activating user %s in experiment %s.",DISPATCH_CONVERSION_EVENT:"%s: Dispatching conversion event to URL %s with params %s.",DISPATCH_IMPRESSION_EVENT:"%s: Dispatching impression event to URL %s with params %s.",DEPRECATED_EVENT_VALUE:"%s: Event value is deprecated in %s call.",EVENT_KEY_NOT_FOUND:"%s: Event key %s is not in datafile.",EXPERIMENT_NOT_RUNNING:"%s: Experiment %s is not running.",FEATURE_ENABLED_FOR_USER:"%s: Feature %s is enabled for user %s.",FEATURE_NOT_ENABLED_FOR_USER:"%s: Feature %s is not enabled for user %s.",FEATURE_HAS_NO_EXPERIMENTS:"%s: Feature %s is not attached to any experiments.",FAILED_TO_PARSE_VALUE:'%s: Failed to parse event value "%s" from event tags.',FAILED_TO_PARSE_REVENUE:'%s: Failed to parse revenue value "%s" from event tags.',FORCED_BUCKETING_FAILED:"%s: Variation key %s is not in datafile. Not activating user %s.",INVALID_OBJECT:"%s: Optimizely object is not valid. Failing %s.",INVALID_CLIENT_ENGINE:"%s: Invalid client engine passed: %s. Defaulting to node-sdk.",INVALID_VARIATION_ID:"%s: Bucketed into an invalid variation ID. Returning null.",NOTIFICATION_LISTENER_EXCEPTION:"%s: Notification listener for (%s) threw exception: %s",NO_ROLLOUT_EXISTS:"%s: There is no rollout of feature %s.",NOT_ACTIVATING_USER:"%s: Not activating user %s for experiment %s.",NOT_TRACKING_USER:"%s: Not tracking user %s.",PARSED_REVENUE_VALUE:'%s: Parsed revenue value "%s" from event tags.',PARSED_NUMERIC_VALUE:'%s: Parsed event value "%s" from event tags.',RETURNING_STORED_VARIATION:'%s: Returning previously activated variation "%s" of experiment "%s" for user "%s" from user profile.',ROLLOUT_HAS_NO_EXPERIMENTS:"%s: Rollout of feature %s has no experiments",SAVED_VARIATION:'%s: Saved variation "%s" of experiment "%s" for user "%s".',SAVED_VARIATION_NOT_FOUND:"%s: User %s was previously bucketed into variation with ID %s for experiment %s, but no matching variation was found.",SHOULD_NOT_DISPATCH_ACTIVATE:'%s: Experiment %s is not in "Running" state. Not activating user.',SKIPPING_JSON_VALIDATION:"%s: Skipping JSON schema validation.",TRACK_EVENT:"%s: Tracking event %s for user %s.",USER_ASSIGNED_TO_EXPERIMENT_BUCKET:"%s: Assigned bucket %s to user with bucketing ID %s.",USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP:"%s: User %s is in experiment %s of group %s.",USER_BUCKETED_INTO_TARGETING_RULE:"%s: User %s bucketed into targeting rule %s.",USER_IN_FEATURE_EXPERIMENT:"%s: User %s is in variation %s of experiment %s on the feature %s.",USER_IN_ROLLOUT:"%s: User %s is in rollout of feature %s.",USER_BUCKETED_INTO_EVERYONE_TARGETING_RULE:"%s: User %s bucketed into everyone targeting rule.",USER_NOT_BUCKETED_INTO_EVERYONE_TARGETING_RULE:"%s: User %s not bucketed into everyone targeting rule due to traffic allocation.",USER_NOT_BUCKETED_INTO_EXPERIMENT_IN_GROUP:"%s: User %s is not in experiment %s of group %s.",USER_NOT_BUCKETED_INTO_ANY_EXPERIMENT_IN_GROUP:"%s: User %s is not in any experiment of group %s.",USER_NOT_BUCKETED_INTO_TARGETING_RULE:"%s User %s not bucketed into targeting rule %s due to traffic allocation. Trying everyone rule.",USER_NOT_IN_FEATURE_EXPERIMENT:"%s: User %s is not in any experiment on the feature %s.",USER_NOT_IN_ROLLOUT:"%s: User %s is not in rollout of feature %s.",USER_FORCED_IN_VARIATION:"%s: User %s is forced in variation %s.",USER_MAPPED_TO_FORCED_VARIATION:"%s: Set variation %s for experiment %s and user %s in the forced variation map.",USER_DOESNT_MEET_CONDITIONS_FOR_TARGETING_RULE:"%s: User %s does not meet conditions for targeting rule %s.",USER_MEETS_CONDITIONS_FOR_TARGETING_RULE:"%s: User %s meets conditions for targeting rule %s.",USER_HAS_VARIATION:"%s: User %s is in variation %s of experiment %s.",USER_HAS_FORCED_VARIATION:"%s: Variation %s is mapped to experiment %s and user %s in the forced variation map.",USER_HAS_NO_VARIATION:"%s: User %s is in no variation of experiment %s.",USER_HAS_NO_FORCED_VARIATION:"%s: User %s is not in the forced variation map.",USER_HAS_NO_FORCED_VARIATION_FOR_EXPERIMENT:"%s: No experiment %s mapped to user %s in the forced variation map.",USER_NOT_IN_ANY_EXPERIMENT:"%s: User %s is not in any experiment of group %s.",USER_NOT_IN_EXPERIMENT:"%s: User %s does not meet conditions to be in experiment %s.",USER_RECEIVED_DEFAULT_VARIABLE_VALUE:'%s: User "%s" is not in any variation or rollout rule. Returning default value for variable "%s" of feature flag "%s".',FEATURE_NOT_ENABLED_RETURN_DEFAULT_VARIABLE_VALUE:'%s: Feature "%s" is not enabled for user %s. Returning the default variable value "%s".',VARIABLE_NOT_USED_RETURN_DEFAULT_VARIABLE_VALUE:'%s: Variable "%s" is not used in variation "%s". Returning default value.',USER_RECEIVED_VARIABLE_VALUE:'%s: Got variable value "%s" for variable "%s" of feature flag "%s"',VALID_DATAFILE:"%s: Datafile is valid.",VALID_USER_PROFILE_SERVICE:"%s: Valid user profile service provided.",VARIATION_REMOVED_FOR_USER:"%s: Variation mapped to experiment %s has been removed for user %s.",VARIABLE_REQUESTED_WITH_WRONG_TYPE:'%s: Requested variable type "%s", but variable is of type "%s". Use correct API to retrieve value. Returning None.',VALID_BUCKETING_ID:'%s: BucketingId is valid: "%s"',BUCKETING_ID_NOT_STRING:"%s: BucketingID attribute is not a string. Defaulted to userId",EVALUATING_AUDIENCE:'%s: Starting to evaluate audience "%s" with conditions: %s.',EVALUATING_AUDIENCES_COMBINED:'%s: Evaluating audiences for %s "%s": %s.',AUDIENCE_EVALUATION_RESULT:'%s: Audience "%s" evaluated to %s.',AUDIENCE_EVALUATION_RESULT_COMBINED:"%s: Audiences for %s %s collectively evaluated to %s.",MISSING_ATTRIBUTE_VALUE:'%s: Audience condition %s evaluated to UNKNOWN because no value was passed for user attribute "%s".',UNEXPECTED_CONDITION_VALUE:"%s: Audience condition %s evaluated to UNKNOWN because the condition value is not supported.",UNEXPECTED_TYPE:'%s: Audience condition %s evaluated to UNKNOWN because a value of type "%s" was passed for user attribute "%s".',UNEXPECTED_TYPE_NULL:'%s: Audience condition %s evaluated to UNKNOWN because a null value was passed for user attribute "%s".',UNKNOWN_CONDITION_TYPE:"%s: Audience condition %s has an unknown condition type. You may need to upgrade to a newer release of the Optimizely SDK.",UNKNOWN_MATCH_TYPE:"%s: Audience condition %s uses an unknown match type. You may need to upgrade to a newer release of the Optimizely SDK.",UPDATED_OPTIMIZELY_CONFIG:"%s: Updated Optimizely config to revision %s (project id %s)",OUT_OF_BOUNDS:'%s: Audience condition %s evaluated to UNKNOWN because the number value for user attribute "%s" is not in the range [-2^53, +2^53].',UNABLE_TO_ATTACH_UNLOAD:'%s: unable to bind optimizely.close() to page unload event: "%s"'},f={REVENUE:"revenue",VALUE:"value"},_={BOT_FILTERING:"$opt_bot_filtering",BUCKETING_ID:"$opt_bucketing_id",STICKY_BUCKETING_KEY:"$opt_experiment_bucket_map",USER_AGENT:"$opt_user_agent"},g=["node-sdk","react-sdk","javascript-sdk"],I=i.NOTIFICATION_TYPES,c={AB_TEST:"ab-test",FEATURE:"feature",FEATURE_TEST:"feature-test",FEATURE_VARIABLE:"feature-variable",ALL_FEATURE_VARIABLES:"all-feature-variables"},p={FEATURE_TEST:"feature-test",ROLLOUT:"rollout",EXPERIMENT:"experiment"},d={RULE:"rule",EXPERIMENT:"experiment"},N={BOOLEAN:"boolean",DOUBLE:"double",INTEGER:"integer",STRING:"string",JSON:"json"},R={V2:"2",V3:"3",V4:"4"},O=Object.freeze({__proto__:null,LOG_LEVEL:u,ERROR_MESSAGES:l,LOG_MESSAGES:E,RESERVED_EVENT_KEYWORDS:f,CONTROL_ATTRIBUTES:_,JAVASCRIPT_CLIENT_ENGINE:"javascript-sdk",NODE_CLIENT_ENGINE:"node-sdk",REACT_CLIENT_ENGINE:"react-sdk",NODE_CLIENT_VERSION:"4.4.0",VALID_CLIENT_ENGINES:g,NOTIFICATION_TYPES:I,DECISION_NOTIFICATION_TYPES:c,DECISION_SOURCES:p,AUDIENCE_EVALUATION_TYPES:d,FEATURE_VARIABLE_TYPES:N,DATAFILE_VERSIONS:R}),T="CONFIG_VALIDATOR",v=[R.V2,R.V3,R.V4],h=function(e){if("object"==typeof e&&null!==e){if(e.errorHandler&&"function"!=typeof e.errorHandler.handleError)throw new Error(i.sprintf(l.INVALID_ERROR_HANDLER,T));if(e.eventDispatcher&&"function"!=typeof e.eventDispatcher.dispatchEvent)throw new Error(i.sprintf(l.INVALID_EVENT_DISPATCHER,T));if(e.logger&&"function"!=typeof e.logger.log)throw new Error(i.sprintf(l.INVALID_LOGGER,T));return!0}throw new Error(i.sprintf(l.INVALID_CONFIG,T))},A=function(e){if(!e)throw new Error(i.sprintf(l.NO_DATAFILE_SPECIFIED,T));if("string"==typeof e)try{e=JSON.parse(e)}catch(e){throw new Error(i.sprintf(l.INVALID_DATAFILE_MALFORMED,T))}if("object"==typeof e&&!Array.isArray(e)&&null!==e&&-1===v.indexOf(e.version))throw new Error(i.sprintf(l.INVALID_DATAFILE_VERSION,T,e.version));return e},y={handleError:function(){}},U=function(e){return Object.keys(e).map((function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])})).join("&")},L={dispatchEvent:function(e,t){var r,i=e.url,n=e.params;"POST"===e.httpVerb?((r=new XMLHttpRequest).open("POST",i,!0),r.setRequestHeader("Content-Type","application/json"),r.onreadystatechange=function(){if(4===r.readyState&&t&&"function"==typeof t)try{t({statusCode:r.status})}catch(e){}},r.send(JSON.stringify(n))):(i+="?wxhr=true",n&&(i+="&"+U(n)),(r=new XMLHttpRequest).open("GET",i,!0),r.onreadystatechange=function(){if(4===r.readyState&&t&&"function"==typeof t)try{t()}catch(e){}},r.send())}};function m(){}m.prototype.log=function(){};var V={createLogger:function(e){return new t.ConsoleLogHandler(e)},createNoOpLogger:function(){return new m}},S=Math.pow(2,53);var D={assign:function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];if(!e)return{};if("function"==typeof Object.assign)return Object.assign.apply(Object,s([e],t));for(var i=Object(e),n=0;n<t.length;n++){var o=t[n];if(null!=o)for(var a in o)Object.prototype.hasOwnProperty.call(o,a)&&(i[a]=o[a])}return i},currentTimestamp:function(){return Math.round((new Date).getTime())},isSafeInteger:function(e){return"number"==typeof e&&Math.abs(e)<=S},keyBy:function(e,t){return e?i.keyBy(e,(function(e){return e[t]})):{}},uuid:i.generateUUID,isNumber:function(e){return"number"==typeof e}},P="PROJECT_CONFIG";var C=function(e,t){void 0===t&&(t=null);var r,n,o=(r=e,(n=D.assign({},r)).audiences=(r.audiences||[]).map((function(e){return D.assign({},e)})),n.experiments=(r.experiments||[]).map((function(e){return D.assign({},e)})),n.featureFlags=(r.featureFlags||[]).map((function(e){return D.assign({},e)})),n.groups=(r.groups||[]).map((function(e){var t=D.assign({},e);return t.experiments=(e.experiments||[]).map((function(e){return D.assign({},e)})),t})),n.rollouts=(r.rollouts||[]).map((function(e){var t=D.assign({},e);return t.experiments=(e.experiments||[]).map((function(e){return D.assign({},e)})),t})),n);return o.__datafileStr=null===t?JSON.stringify(e):t,(o.audiences||[]).forEach((function(e){e.conditions=JSON.parse(e.conditions)})),o.audiencesById=D.keyBy(o.audiences,"id"),D.assign(o.audiencesById,D.keyBy(o.typedAudiences,"id")),o.attributeKeyMap=D.keyBy(o.attributes,"key"),o.eventKeyMap=D.keyBy(o.events,"key"),o.groupIdMap=D.keyBy(o.groups,"id"),Object.keys(o.groupIdMap||{}).forEach((function(e){(o.groupIdMap[e].experiments||[]).forEach((function(t){o.experiments.push(D.assign(t,{groupId:e}))}))})),o.rolloutIdMap=D.keyBy(o.rollouts||[],"id"),i.objectValues(o.rolloutIdMap||{}).forEach((function(e){(e.experiments||[]).forEach((function(e){o.experiments.push(e),e.variationKeyMap=D.keyBy(e.variations,"key")}))})),o.experimentKeyMap=D.keyBy(o.experiments,"key"),o.experimentIdMap=D.keyBy(o.experiments,"id"),o.variationIdMap={},o.variationVariableUsageMap={},(o.experiments||[]).forEach((function(e){e.variationKeyMap=D.keyBy(e.variations,"key"),D.assign(o.variationIdMap,D.keyBy(e.variations,"id")),i.objectValues(e.variationKeyMap||{}).forEach((function(e){e.variables&&(o.variationVariableUsageMap[e.id]=D.keyBy(e.variables,"id"))}))})),o.experimentFeatureMap={},o.featureKeyMap=D.keyBy(o.featureFlags||[],"key"),i.objectValues(o.featureKeyMap||{}).forEach((function(e){e.variables.forEach((function(e){e.type===N.STRING&&e.subType===N.JSON&&(e.type=N.JSON,delete e.subType)})),e.variableKeyMap=D.keyBy(e.variables,"key"),(e.experimentIds||[]).forEach((function(t){o.experimentFeatureMap[t]?o.experimentFeatureMap[t].push(e.id):o.experimentFeatureMap[t]=[e.id];var r=o.experimentIdMap[t];r.groupId&&!e.groupId&&(e.groupId=r.groupId)}))})),o},b=function(e,t){var r=e.experimentKeyMap[t];if(!r)throw new Error(i.sprintf(l.INVALID_EXPERIMENT_KEY,P,t));return r.id},F=function(e,t){var r=e.experimentKeyMap[t];if(!r)throw new Error(i.sprintf(l.INVALID_EXPERIMENT_KEY,P,t));return r.status},M=function(e,t){return"Running"===F(e,t)},k=function(e,t,r){var i=e.experimentKeyMap[t];return i.variationKeyMap.hasOwnProperty(r)?i.variationKeyMap[r].id:null},B=function(e,t){if(e.experimentKeyMap.hasOwnProperty(t)){var r=e.experimentKeyMap[t];if(r)return r}throw new Error(i.sprintf(l.EXPERIMENT_KEY_NOT_IN_DATAFILE,P,t))},x=function(e,t,r){if(e.featureKeyMap.hasOwnProperty(t)){var n=e.featureKeyMap[t];if(n)return n}return r.log(u.ERROR,i.sprintf(l.FEATURE_NOT_IN_DATAFILE,P,t)),null},K=function(e,t,r,n){var o=e.featureKeyMap[t];if(!o)return n.log(u.ERROR,i.sprintf(l.FEATURE_NOT_IN_DATAFILE,P,t)),null;var a=o.variableKeyMap[r];return a||(n.log(u.ERROR,i.sprintf(l.VARIABLE_KEY_NOT_IN_DATAFILE,P,r,t)),null)},G=function(e,t,r,n){if(!t||!r)return null;if(!e.variationVariableUsageMap.hasOwnProperty(r.id))return n.log(u.ERROR,i.sprintf(l.VARIATION_ID_NOT_IN_DATAFILE_NO_EXPERIMENT,P,r.id)),null;var o=e.variationVariableUsageMap[r.id][t.id];return o?o.value:null},w=function(e,t,r){var n;switch(t){case N.BOOLEAN:"true"!==e&&"false"!==e?(r.log(u.ERROR,i.sprintf(l.UNABLE_TO_CAST_VALUE,P,e,t)),n=null):n="true"===e;break;case N.INTEGER:n=parseInt(e,10),isNaN(n)&&(r.log(u.ERROR,i.sprintf(l.UNABLE_TO_CAST_VALUE,P,e,t)),n=null);break;case N.DOUBLE:n=parseFloat(e),isNaN(n)&&(r.log(u.ERROR,i.sprintf(l.UNABLE_TO_CAST_VALUE,P,e,t)),n=null);break;case N.JSON:try{n=JSON.parse(e)}catch(o){r.log(u.ERROR,i.sprintf(l.UNABLE_TO_CAST_VALUE,P,e,t)),n=null}break;default:n=e}return n},j=function(e,t){return e.eventKeyMap.hasOwnProperty(t)},Y=function(e,t){return e.experimentFeatureMap.hasOwnProperty(t)},H=function(e){return!!e.sendFlagDecisions},X=b,J=function(e,t){var r=e.experimentIdMap[t];if(!r)throw new Error(i.sprintf(l.INVALID_EXPERIMENT_ID,P,t));return r.layerId},z=function(e,t,r){var n=e.attributeKeyMap[t],o=0===t.indexOf("$opt_");return n?(o&&r.log(u.WARN,i.sprintf("Attribute %s unexpectedly has reserved prefix %s; using attribute ID instead of reserved attribute name.",t,"$opt_")),n.id):o?t:(r.log(u.DEBUG,i.sprintf(l.UNRECOGNIZED_ATTRIBUTE,P,t)),null)},Z=function(e,t){var r=e.eventKeyMap[t];return r?r.id:null},W=function(e,t){return"Running"===F(e,t)},q=function(e,t){var r=e.experimentKeyMap[t];if(!r)throw new Error(i.sprintf(l.INVALID_EXPERIMENT_KEY,P,t));return r.audienceConditions||r.audienceIds},$=function(e,t){return e.variationIdMap.hasOwnProperty(t)?e.variationIdMap[t].key:null},Q=k,ee=B,te=function(e,t){var r=e.experimentKeyMap[t];if(!r)throw new Error(i.sprintf(l.INVALID_EXPERIMENT_KEY,P,t));return r.trafficAllocation},re=function(e,t,r){if(e.experimentIdMap.hasOwnProperty(t)){var n=e.experimentIdMap[t];if(n)return n}return r.log(u.ERROR,i.sprintf(l.INVALID_EXPERIMENT_ID,P,t)),null},ie=function(e){return e.audiencesById},ne=function(e){return e.__datafileStr},oe=function(e){var t;try{t=A(e.datafile)}catch(e){return{configObj:null,error:e}}if(e.jsonSchemaValidator)try{e.jsonSchemaValidator.validate(t),e.logger.log(u.INFO,i.sprintf(E.VALID_DATAFILE,P))}catch(e){return{configObj:null,error:e}}else e.logger.log(u.INFO,i.sprintf(E.SKIPPING_JSON_VALIDATION,P));var r=[t];return"string"==typeof e.datafile&&r.push(e.datafile),{configObj:C.apply(void 0,r),error:null}};function ae(e,t,r,i){var n=e.experimentFeatureMap[r],o={};if(n){var a=i[n],s=(t.variables||[]).reduce((function(e,t){return e[t.id]={id:t.id,value:t.value},e}),{});o=(a||[]).reduce((function(e,r){var i=s[r.id],n=t.featureEnabled&&i?i.value:r.defaultValue;return e[r.key]={id:r.id,key:r.key,type:r.type,value:n},e}),{})}return o}function se(e,t){this.experimentsMap=function(e){var t=(e.rollouts||[]).reduce((function(e,t){return t.experiments.forEach((function(t){e[t.id]=!0})),e}),{}),r=(e.featureFlags||[]).reduce((function(e,t){return e[t.id]=t.variables,e}),{});return(e.experiments||[]).reduce((function(i,n){return t[n.id]||(i[n.key]={id:n.id,key:n.key,variationsMap:(n.variations||[]).reduce((function(t,i){return t[i.key]={id:i.id,key:i.key,variablesMap:ae(e,i,n.id,r)},Y(e,n.id)&&(t[i.key].featureEnabled=i.featureEnabled),t}),{})}),i}),{})}(e),this.featuresMap=function(e,t){return(e.featureFlags||[]).reduce((function(r,i){return r[i.key]={id:i.id,key:i.key,experimentsMap:(i.experimentIds||[]).reduce((function(r,i){var n=e.experimentIdMap[i].key;return r[n]=t[n],r}),{}),variablesMap:(i.variables||[]).reduce((function(e,t){return e[t.key]={id:t.id,key:t.key,type:t.type,value:t.defaultValue},e}),{})},r}),{})}(e,this.experimentsMap),this.revision=e.revision,this.__datafile=t}se.prototype.getDatafile=function(){return this.__datafile};var ue={OptimizelyConfig:se},le=t.getLogger();function Ee(e,t){return e instanceof Error?e.message:t||"Unknown error"}function fe(e){try{this.__initialize(e)}catch(e){le.error(e),this.__updateListeners=[],this.__configObj=null,this.__optimizelyConfigObj=null,this.__readyPromise=Promise.resolve({success:!1,reason:Ee(e,"Error in initialize")})}}fe.prototype.__initialize=function(e){if(this.__updateListeners=[],this.jsonSchemaValidator=e.jsonSchemaValidator,!e.datafile&&!e.sdkKey){this.__configObj=null;var t=new Error(i.sprintf(l.DATAFILE_AND_SDK_KEY_MISSING,"PROJECT_CONFIG_MANAGER"));return this.__readyPromise=Promise.resolve({success:!1,reason:Ee(t)}),void le.error(t)}var r;if(e.datafile?(r=this.__handleNewDatafile(e.datafile))&&(this.__configObj=null):this.__configObj=null,e.sdkKey){var o={sdkKey:e.sdkKey};this.__validateDatafileOptions(e.datafileOptions)&&D.assign(o,e.datafileOptions),this.__configObj&&(o.datafile=ne(this.__configObj)),this.datafileManager=new n.HttpPollingDatafileManager(o),this.datafileManager.start(),this.__readyPromise=this.datafileManager.onReady().then(this.__onDatafileManagerReadyFulfill.bind(this),this.__onDatafileManagerReadyReject.bind(this)),this.datafileManager.on("update",this.__onDatafileManagerUpdate.bind(this))}else this.__configObj?this.__readyPromise=Promise.resolve({success:!0}):this.__readyPromise=Promise.resolve({success:!1,reason:Ee(r,"Invalid datafile")})},fe.prototype.__onDatafileManagerReadyFulfill=function(){var e=this.__handleNewDatafile(this.datafileManager.get());return e?{success:!1,reason:Ee(e)}:{success:!0}},fe.prototype.__onDatafileManagerReadyReject=function(e){return{success:!1,reason:Ee(e,"Failed to become ready")}},fe.prototype.__onDatafileManagerUpdate=function(){this.__handleNewDatafile(this.datafileManager.get())},fe.prototype.__validateDatafileOptions=function(e){return void 0===e||"object"==typeof e&&null!==e},fe.prototype.__handleNewDatafile=function(e){var t=oe({datafile:e,jsonSchemaValidator:this.jsonSchemaValidator,logger:le}),r=t.configObj,i=t.error;i?le.error(i):(this.__configObj?this.__configObj.revision:"null")!==r.revision&&(this.__configObj=r,this.__optimizelyConfigObj=new ue.OptimizelyConfig(this.__configObj,ne(this.__configObj)),this.__updateListeners.forEach((function(e){e(r)})));return i},fe.prototype.getConfig=function(){return this.__configObj},fe.prototype.getOptimizelyConfig=function(){return this.__optimizelyConfigObj},fe.prototype.onReady=function(){return this.__readyPromise},fe.prototype.onUpdate=function(e){return this.__updateListeners.push(e),function(){var t=this.__updateListeners.indexOf(e);t>-1&&this.__updateListeners.splice(t,1)}.bind(this)},fe.prototype.stop=function(){this.datafileManager&&this.datafileManager.stop(),this.__updateListeners=[]};function _e(e){this.logger=e.logger,this.errorHandler=e.errorHandler,this.__notificationListeners={},i.objectValues(I).forEach(function(e){this.__notificationListeners[e]=[]}.bind(this)),this.__listenerId=1}_e.prototype.addNotificationListener=function(e,t){try{if(!(i.objectValues(I).indexOf(e)>-1))return-1;this.__notificationListeners[e]||(this.__notificationListeners[e]=[]);var r=!1;if((this.__notificationListeners[e]||[]).forEach((function(e){if(e.callback===t)return r=!0,!1})),r)return-1;this.__notificationListeners[e].push({id:this.__listenerId,callback:t});var n=this.__listenerId;return this.__listenerId+=1,n}catch(e){return this.logger.log(u.ERROR,e.message),this.errorHandler.handleError(e),-1}},_e.prototype.removeNotificationListener=function(e){try{var t,r;if(Object.keys(this.__notificationListeners).some(function(i){if((this.__notificationListeners[i]||[]).every((function(n,o){return n.id!==e||(t=o,r=i,!1)})),void 0!==t&&void 0!==r)return!0}.bind(this)),void 0!==t&&void 0!==r)return this.__notificationListeners[r].splice(t,1),!0}catch(e){this.logger.log(u.ERROR,e.message),this.errorHandler.handleError(e)}return!1},_e.prototype.clearAllNotificationListeners=function(){try{i.objectValues(I).forEach(function(e){this.__notificationListeners[e]=[]}.bind(this))}catch(e){this.logger.log(u.ERROR,e.message),this.errorHandler.handleError(e)}},_e.prototype.clearNotificationListeners=function(e){try{this.__notificationListeners[e]=[]}catch(e){this.logger.log(u.ERROR,e.message),this.errorHandler.handleError(e)}},_e.prototype.sendNotifications=function(e,t){try{(this.__notificationListeners[e]||[]).forEach(function(r){var n=r.callback;try{n(t)}catch(t){this.logger.log(u.ERROR,i.sprintf(E.NOTIFICATION_LISTENER_EXCEPTION,"NOTIFICATION_CENTER",e,t.message))}}.bind(this))}catch(e){this.logger.log(u.ERROR,e.message),this.errorHandler.handleError(e)}};var ge=Math.pow(2,32),Ie={bucket:function(e){var t=e.experimentKeyMap[e.experimentKey].groupId;if(t){var r=e.groupIdMap[t];if(!r)throw new Error(i.sprintf(l.INVALID_GROUP_ID,"BUCKETER",t));if("random"===r.policy){var n=this.bucketUserIntoExperiment(r,e.bucketingId,e.userId,e.logger);if(null===n){var o=i.sprintf(E.USER_NOT_IN_ANY_EXPERIMENT,"BUCKETER",e.userId,t);return e.logger.log(u.INFO,o),null}if(n!==e.experimentId){var a=i.sprintf(E.USER_NOT_BUCKETED_INTO_EXPERIMENT_IN_GROUP,"BUCKETER",e.userId,e.experimentKey,t);return e.logger.log(u.INFO,a),null}var s=i.sprintf(E.USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP,"BUCKETER",e.userId,e.experimentKey,t);e.logger.log(u.INFO,s)}}var f=i.sprintf("%s%s",e.bucketingId,e.experimentId),_=this._generateBucketValue(f),g=i.sprintf(E.USER_ASSIGNED_TO_EXPERIMENT_BUCKET,"BUCKETER",_,e.userId);e.logger.log(u.DEBUG,g);var I=this._findBucket(_,e.trafficAllocationConfig);if(!e.variationIdMap.hasOwnProperty(I)){if(I){var c=i.sprintf(E.INVALID_VARIATION_ID,"BUCKETER");e.logger.log(u.WARNING,c)}return null}return I},bucketUserIntoExperiment:function(e,t,r,n){var o=i.sprintf("%s%s",t,e.id),a=this._generateBucketValue(o);n.log(u.DEBUG,i.sprintf(E.USER_ASSIGNED_TO_EXPERIMENT_BUCKET,"BUCKETER",a,r));var s=e.trafficAllocation;return this._findBucket(a,s)},_findBucket:function(e,t){for(var r=0;r<t.length;r++)if(e<t[r].endOfRange)return t[r].entityId;return null},_generateBucketValue:function(e){try{var t=o.v3(e,1);return parseInt(1e4*(t/ge),10)}catch(t){throw new Error(i.sprintf(l.INVALID_BUCKETING_ID,"BUCKETER",e,t.message))}}},ce=["and","or","not"];function pe(e,t){if(Array.isArray(e)){var r=e[0],i=e.slice(1);switch("string"==typeof r&&-1===ce.indexOf(r)&&(r="or",i=e),r){case"and":return function(e,t){var r=!1;if(Array.isArray(e)){for(var i=0;i<e.length;i++){var n=pe(e[i],t);if(!1===n)return!1;null===n&&(r=!0)}return!r||null}return null}(i,t);case"not":return function(e,t){if(Array.isArray(e)&&e.length>0){var r=pe(e[0],t);return null===r?null:!r}return null}(i,t);default:return function(e,t){var r=!1;if(Array.isArray(e)){for(var i=0;i<e.length;i++){var n=pe(e[i],t);if(!0===n)return!0;null===n&&(r=!0)}return!!r&&null}return null}(i,t)}}return t(e)}var de=t.getLogger();function Ne(e){return/^\d+$/.test(e)}function Re(e){var t=e.indexOf("-"),r=e.indexOf("+");return!(t<0)&&(r<0||t<r)}function Oe(e){var t=e.indexOf("-"),r=e.indexOf("+");return!(r<0)&&(t<0||r<t)}function Te(e){var t=e,r="";if(function(e){return/\s/.test(e)}(e))return de.warn(E.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null;if(Re(e)?(t=e.substring(0,e.indexOf("-")),r=e.substring(e.indexOf("-")+1)):Oe(e)&&(t=e.substring(0,e.indexOf("+")),r=e.substring(e.indexOf("+")+1)),"string"!=typeof t||"string"!=typeof r)return null;var i=t.split(".").length-1;if(i>2)return de.warn(E.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null;var n=t.split(".");if(n.length!=i+1)return de.warn(E.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null;for(var o=0,a=n;o<a.length;o++){if(!Ne(a[o]))return de.warn(E.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null}return r&&n.push(r),n}var ve="CUSTOM_ATTRIBUTE_CONDITION_EVALUATOR",he=t.getLogger(),Ae=["exact","exists","gt","ge","lt","le","substring","semver_eq","semver_lt","semver_le","semver_gt","semver_ge"],ye={};function Ue(e){return"string"==typeof e||"boolean"==typeof e||D.isNumber(e)}function Le(e,t){var r=e.value,i=typeof r,n=e.name,o=t[n],a=typeof o;return!Ue(r)||D.isNumber(r)&&!D.isSafeInteger(r)?(he.warn(E.UNEXPECTED_CONDITION_VALUE,ve,JSON.stringify(e)),null):null===o?(he.debug(E.UNEXPECTED_TYPE_NULL,ve,JSON.stringify(e),n),null):Ue(o)&&i===a?D.isNumber(o)&&!D.isSafeInteger(o)?(he.warn(E.OUT_OF_BOUNDS,ve,JSON.stringify(e),n),null):r===o:(he.warn(E.UNEXPECTED_TYPE,ve,JSON.stringify(e),a,n),null)}function me(e,t){var r=e.name,i=t[r],n=typeof i,o=e.value;return null!==o&&D.isSafeInteger(o)?null===i?(he.debug(E.UNEXPECTED_TYPE_NULL,ve,JSON.stringify(e),r),!1):D.isNumber(i)?!!D.isSafeInteger(i)||(he.warn(E.OUT_OF_BOUNDS,ve,JSON.stringify(e),r),!1):(he.warn(E.UNEXPECTED_TYPE,ve,JSON.stringify(e),n,r),!1):(he.warn(E.UNEXPECTED_CONDITION_VALUE,ve,JSON.stringify(e)),!1)}function Ve(e,t){var r=e.name,i=t[r],n=typeof i,o=e.value;return"string"!=typeof o?(he.warn(E.UNEXPECTED_CONDITION_VALUE,ve,JSON.stringify(e)),null):null===i?(he.debug(E.UNEXPECTED_TYPE_NULL,ve,JSON.stringify(e),r),null):"string"!=typeof i?(he.warn(E.UNEXPECTED_TYPE,ve,JSON.stringify(e),n,r),null):function(e,t){var r=Te(t),i=Te(e);if(!r||!i)return null;for(var n=r.length,o=0;o<i.length;o++){if(n<=o)return Re(e)||Oe(e)?1:-1;if(Ne(r[o])){var a=parseInt(r[o]),s=parseInt(i[o]);if(a>s)return 1;if(a<s)return-1}else{if(r[o]<i[o])return Re(e)&&!Re(t)?1:-1;if(r[o]>i[o])return!Re(e)&&Re(t)?-1:1}}return Re(t)&&!Re(e)?-1:0}(o,i)}ye.exact=Le,ye.exists=function(e,t){var r=t[e.name];return null!=r},ye.gt=function(e,t){var r=t[e.name],i=e.value;if(!me(e,t)||null===i)return null;return r>i},ye.ge=function(e,t){var r=t[e.name],i=e.value;if(!me(e,t)||null===i)return null;return r>=i},ye.lt=function(e,t){var r=t[e.name],i=e.value;if(!me(e,t)||null===i)return null;return r<i},ye.le=function(e,t){var r=t[e.name],i=e.value;if(!me(e,t)||null===i)return null;return r<=i},ye.substring=function(e,t){var r=e.name,i=t[e.name],n=typeof i,o=e.value;if("string"!=typeof o)return he.warn(E.UNEXPECTED_CONDITION_VALUE,ve,JSON.stringify(e)),null;if(null===i)return he.debug(E.UNEXPECTED_TYPE_NULL,ve,JSON.stringify(e),r),null;if("string"!=typeof i)return he.warn(E.UNEXPECTED_TYPE,ve,JSON.stringify(e),n,r),null;return-1!==i.indexOf(o)},ye.semver_eq=function(e,t){var r=Ve(e,t);if(null===r)return null;return 0===r},ye.semver_gt=function(e,t){var r=Ve(e,t);if(null===r)return null;return r>0},ye.semver_ge=function(e,t){var r=Ve(e,t);if(null===r)return null;return r>=0},ye.semver_lt=function(e,t){var r=Ve(e,t);if(null===r)return null;return r<0},ye.semver_le=function(e,t){var r=Ve(e,t);if(null===r)return null;return r<=0};var Se=Object.freeze({__proto__:null,evaluate:function(e,t){var r=e.match;if(void 0!==r&&-1===Ae.indexOf(r))return he.warn(E.UNKNOWN_MATCH_TYPE,ve,JSON.stringify(e)),null;var i=e.name;return t.hasOwnProperty(i)||"exists"==r?(r&&ye[r]||Le)(e,t):(he.debug(E.MISSING_ATTRIBUTE_VALUE,ve,JSON.stringify(e),i),null)}}),De=t.getLogger();function Pe(e){this.typeToEvaluatorMap=D.assign({},e,{custom_attribute:Se})}function Ce(e){return"string"==typeof e&&""!==e}Pe.prototype.evaluate=function(e,t,r){if(!e||0===e.length)return!0;r||(r={});var n=function(e){var n=t[e];if(n){De.log(u.DEBUG,i.sprintf(E.EVALUATING_AUDIENCE,"AUDIENCE_EVALUATOR",e,JSON.stringify(n.conditions)));var o=pe(n.conditions,this.evaluateConditionWithUserAttributes.bind(this,r)),a=null===o?"UNKNOWN":o.toString().toUpperCase();return De.log(u.DEBUG,i.sprintf(E.AUDIENCE_EVALUATION_RESULT,"AUDIENCE_EVALUATOR",e,a)),o}return null}.bind(this);return pe(e,n)||!1},Pe.prototype.evaluateConditionWithUserAttributes=function(e,t){var r=this.typeToEvaluatorMap[t.type];if(!r)return De.log(u.WARNING,i.sprintf(E.UNKNOWN_CONDITION_TYPE,"AUDIENCE_EVALUATOR",JSON.stringify(t))),null;try{return r.evaluate(t,e,De)}catch(e){De.log(u.ERROR,i.sprintf(l.CONDITION_EVALUATOR_ERROR,"AUDIENCE_EVALUATOR",t.type,e.message))}return null};var be="DECISION_SERVICE",Fe=l,Me=u,ke=E,Be=p,xe=d;function Ke(e){this.audienceEvaluator=new Pe(e.UNSTABLE_conditionEvaluators),this.forcedVariationMap={},this.logger=e.logger,this.userProfileService=e.userProfileService||null}Ke.prototype.getVariation=function(e,t,r,n){var o=this._getBucketingId(r,n);if(!this.__checkIfExperimentIsActive(e,t))return null;var a=e.experimentKeyMap[t],s=this.getForcedVariation(e,t,r);if(s)return s;var u=this.__getWhitelistedVariation(a,r);if(u)return u.key;var l=this.__resolveExperimentBucketMap(r,n);if(u=this.__getStoredVariation(e,a,r,l))return this.logger.log(Me.INFO,i.sprintf(ke.RETURNING_STORED_VARIATION,be,u.key,t,r)),u.key;if(!this.__checkIfUserIsInAudience(e,t,xe.EXPERIMENT,r,n,"")){var E=i.sprintf(ke.USER_NOT_IN_EXPERIMENT,be,r,t);return this.logger.log(Me.INFO,E),null}var f=this.__buildBucketerParams(e,t,o,r),_=Ie.bucket(f);if(!(u=e.variationIdMap[_])){var g=i.sprintf(ke.USER_HAS_NO_VARIATION,be,r,t);return this.logger.log(Me.DEBUG,g),null}var I=i.sprintf(ke.USER_HAS_VARIATION,be,r,u.key,t);return this.logger.log(Me.INFO,I),this.__saveUserProfile(a,u,r,l),u.key},Ke.prototype.__resolveExperimentBucketMap=function(e,t){t=t||{};var r=this.__getUserProfile(e)||{},i=t[_.STICKY_BUCKETING_KEY];return D.assign({},r.experiment_bucket_map,i)},Ke.prototype.__checkIfExperimentIsActive=function(e,t){if(!W(e,t)){var r=i.sprintf(ke.EXPERIMENT_NOT_RUNNING,be,t);return this.logger.log(Me.INFO,r),!1}return!0},Ke.prototype.__getWhitelistedVariation=function(e,t){if(e.forcedVariations&&e.forcedVariations.hasOwnProperty(t)){var r=e.forcedVariations[t];if(e.variationKeyMap.hasOwnProperty(r)){var n=i.sprintf(ke.USER_FORCED_IN_VARIATION,be,t,r);return this.logger.log(Me.INFO,n),e.variationKeyMap[r]}var o=i.sprintf(ke.FORCED_BUCKETING_FAILED,be,r,t);return this.logger.log(Me.ERROR,o),null}return null},Ke.prototype.__checkIfUserIsInAudience=function(e,t,r,n,o,a){var s=q(e,t),u=ie(e);this.logger.log(Me.DEBUG,i.sprintf(ke.EVALUATING_AUDIENCES_COMBINED,be,r,a||t,JSON.stringify(s)));var l=this.audienceEvaluator.evaluate(s,u,o);return this.logger.log(Me.INFO,i.sprintf(ke.AUDIENCE_EVALUATION_RESULT_COMBINED,be,r,a||t,l.toString().toUpperCase())),l},Ke.prototype.__buildBucketerParams=function(e,t,r,i){var n={};return n.experimentKey=t,n.experimentId=X(e,t),n.userId=i,n.trafficAllocationConfig=te(e,t),n.experimentKeyMap=e.experimentKeyMap,n.groupIdMap=e.groupIdMap,n.variationIdMap=e.variationIdMap,n.logger=this.logger,n.bucketingId=r,n},Ke.prototype.__getStoredVariation=function(e,t,r,n){if(n.hasOwnProperty(t.id)){var o=n[t.id],a=o.variation_id;if(e.variationIdMap.hasOwnProperty(a))return e.variationIdMap[o.variation_id];this.logger.log(Me.INFO,i.sprintf(ke.SAVED_VARIATION_NOT_FOUND,be,r,a,t.key))}return null},Ke.prototype.__getUserProfile=function(e){var t={user_id:e,experiment_bucket_map:{}};if(!this.userProfileService)return t;try{return this.userProfileService.lookup(e)}catch(t){this.logger.log(Me.ERROR,i.sprintf(Fe.USER_PROFILE_LOOKUP_ERROR,be,e,t.message))}},Ke.prototype.__saveUserProfile=function(e,t,r,n){if(this.userProfileService)try{n[e.id]={variation_id:t.id},this.userProfileService.save({user_id:r,experiment_bucket_map:n}),this.logger.log(Me.INFO,i.sprintf(ke.SAVED_VARIATION,be,t.key,e.key,r))}catch(e){this.logger.log(Me.ERROR,i.sprintf(Fe.USER_PROFILE_SAVE_ERROR,be,r,e.message))}},Ke.prototype.getVariationForFeature=function(e,t,r,n){var o=this._getVariationForFeatureExperiment(e,t,r,n);if(null!==o.variation)return o;var a=this._getVariationForRollout(e,t,r,n);return null!==a.variation?(this.logger.log(Me.DEBUG,i.sprintf(ke.USER_IN_ROLLOUT,be,r,t.key)),a):(this.logger.log(Me.DEBUG,i.sprintf(ke.USER_NOT_IN_ROLLOUT,be,r,t.key)),a)},Ke.prototype._getVariationForFeatureExperiment=function(e,t,r,n){var o=null,a=null;if(t.hasOwnProperty("groupId")){var s=e.groupIdMap[t.groupId];s&&(o=this._getExperimentInGroup(e,s,r))&&-1!==t.experimentIds.indexOf(o.id)&&(a=this.getVariation(e,o.key,r,n))}else t.experimentIds.length>0?(o=re(e,t.experimentIds[0],this.logger))&&(a=this.getVariation(e,o.key,r,n)):this.logger.log(Me.DEBUG,i.sprintf(ke.FEATURE_HAS_NO_EXPERIMENTS,be,t.key));var u=null;return null!==a&&null!==o&&(u=o.variationKeyMap[a]),{experiment:o,variation:u,decisionSource:Be.FEATURE_TEST}},Ke.prototype._getExperimentInGroup=function(e,t,r){var n=Ie.bucketUserIntoExperiment(t,r,r,this.logger);if(n){this.logger.log(Me.INFO,i.sprintf(ke.USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP,be,r,n,t.id));var o=re(e,n,this.logger);if(o)return o}return this.logger.log(Me.INFO,i.sprintf(ke.USER_NOT_BUCKETED_INTO_ANY_EXPERIMENT_IN_GROUP,be,r,t.id)),null},Ke.prototype._getVariationForRollout=function(e,t,r,n){if(!t.rolloutId)return this.logger.log(Me.DEBUG,i.sprintf(ke.NO_ROLLOUT_EXISTS,be,t.key)),{experiment:null,variation:null,decisionSource:Be.ROLLOUT};var o=e.rolloutIdMap[t.rolloutId];if(!o)return this.logger.log(Me.ERROR,i.sprintf(Fe.INVALID_ROLLOUT_ID,be,t.rolloutId,t.key)),{experiment:null,variation:null,decisionSource:Be.ROLLOUT};if(0===o.experiments.length)return this.logger.log(Me.ERROR,i.sprintf(ke.ROLLOUT_HAS_NO_EXPERIMENTS,be,t.rolloutId)),{experiment:null,variation:null,decisionSource:Be.ROLLOUT};var a,s,u,l,E,f,_=this._getBucketingId(r,n),g=o.experiments.length-1;for(a=0;a<g;a++){if(s=e.experimentKeyMap[o.experiments[a].key],f=a+1,this.__checkIfUserIsInAudience(e,s.key,xe.RULE,r,n,f)){if(this.logger.log(Me.DEBUG,i.sprintf(ke.USER_MEETS_CONDITIONS_FOR_TARGETING_RULE,be,r,f)),u=this.__buildBucketerParams(e,s.key,_,r),l=Ie.bucket(u),E=e.variationIdMap[l])return this.logger.log(Me.DEBUG,i.sprintf(ke.USER_BUCKETED_INTO_TARGETING_RULE,be,r,f)),{experiment:s,variation:E,decisionSource:Be.ROLLOUT};this.logger.log(Me.DEBUG,i.sprintf(ke.USER_NOT_BUCKETED_INTO_TARGETING_RULE,be,r,f));break}this.logger.log(Me.DEBUG,i.sprintf(ke.USER_DOESNT_MEET_CONDITIONS_FOR_TARGETING_RULE,be,r,f))}var I=e.experimentKeyMap[o.experiments[g].key];if(this.__checkIfUserIsInAudience(e,I.key,xe.RULE,r,n,"Everyone Else")){if(this.logger.log(Me.DEBUG,i.sprintf(ke.USER_MEETS_CONDITIONS_FOR_TARGETING_RULE,be,r,"Everyone Else")),u=this.__buildBucketerParams(e,I.key,_,r),l=Ie.bucket(u),E=e.variationIdMap[l])return this.logger.log(Me.DEBUG,i.sprintf(ke.USER_BUCKETED_INTO_EVERYONE_TARGETING_RULE,be,r)),{experiment:I,variation:E,decisionSource:Be.ROLLOUT};this.logger.log(Me.DEBUG,i.sprintf(ke.USER_NOT_BUCKETED_INTO_EVERYONE_TARGETING_RULE,be,r))}return{experiment:null,variation:null,decisionSource:Be.ROLLOUT}},Ke.prototype._getBucketingId=function(e,t){var r=e;return null!=t&&"object"==typeof t&&t.hasOwnProperty(_.BUCKETING_ID)&&("string"==typeof t[_.BUCKETING_ID]?(r=t[_.BUCKETING_ID],this.logger.log(Me.DEBUG,i.sprintf(ke.VALID_BUCKETING_ID,be,r))):this.logger.log(Me.WARNING,i.sprintf(ke.BUCKETING_ID_NOT_STRING,be))),r},Ke.prototype.removeForcedVariation=function(e,t,r){if(!e)throw new Error(i.sprintf(Fe.INVALID_USER_ID,be));if(!this.forcedVariationMap.hasOwnProperty(e))throw new Error(i.sprintf(Fe.USER_NOT_IN_FORCED_VARIATION,be,e));delete this.forcedVariationMap[e][t],this.logger.log(Me.DEBUG,i.sprintf(ke.VARIATION_REMOVED_FOR_USER,be,r,e))},Ke.prototype.__setInForcedVariationMap=function(e,t,r){this.forcedVariationMap.hasOwnProperty(e)||(this.forcedVariationMap[e]={}),this.forcedVariationMap[e][t]=r,this.logger.log(Me.DEBUG,i.sprintf(ke.USER_MAPPED_TO_FORCED_VARIATION,be,r,t,e))},Ke.prototype.getForcedVariation=function(e,t,r){var n,o=this.forcedVariationMap[r];if(!o)return this.logger.log(Me.DEBUG,i.sprintf(ke.USER_HAS_NO_FORCED_VARIATION,be,r)),null;try{var a=ee(e,t);if(!a.hasOwnProperty("id"))return this.logger.log(Me.ERROR,i.sprintf(Fe.IMPROPERLY_FORMATTED_EXPERIMENT,be,t)),null;n=a.id}catch(e){return this.logger.log(Me.ERROR,e.message),null}var s=o[n];if(!s)return this.logger.log(Me.DEBUG,i.sprintf(ke.USER_HAS_NO_FORCED_VARIATION_FOR_EXPERIMENT,be,t,r)),null;var u=$(e,s);return u?this.logger.log(Me.DEBUG,i.sprintf(ke.USER_HAS_FORCED_VARIATION,be,u,t,r)):this.logger.log(Me.DEBUG,i.sprintf(ke.USER_HAS_NO_FORCED_VARIATION_FOR_EXPERIMENT,be,t,r)),u},Ke.prototype.setForcedVariation=function(e,t,r,n){if(null!=n&&!Ce(n))return this.logger.log(Me.ERROR,i.sprintf(Fe.INVALID_VARIATION_KEY,be)),!1;var o;try{var a=ee(e,t);if(!a.hasOwnProperty("id"))return this.logger.log(Me.ERROR,i.sprintf(Fe.IMPROPERLY_FORMATTED_EXPERIMENT,be,t)),!1;o=a.id}catch(e){return this.logger.log(Me.ERROR,e.message),!1}if(null==n)try{return this.removeForcedVariation(r,o,t,this.logger),!0}catch(e){return this.logger.log(Me.ERROR,e.message),!1}var s=Q(e,t,n);if(!s)return this.logger.log(Me.ERROR,i.sprintf(Fe.NO_VARIATION_FOR_EXPERIMENT_KEY,be,n,t)),!1;try{return this.__setInForcedVariationMap(r,o,s),!0}catch(e){return this.logger.log(Me.ERROR,e.message),!1}};var Ge=f.REVENUE,we=f.VALUE;function je(e,t){if(e.hasOwnProperty(Ge)){var r=e[Ge],n=void 0;return"string"==typeof r?(n=parseInt(r),isNaN(n)?(t.log(u.INFO,i.sprintf(E.FAILED_TO_PARSE_REVENUE,"EVENT_TAG_UTILS",r)),null):(t.log(u.INFO,i.sprintf(E.PARSED_REVENUE_VALUE,"EVENT_TAG_UTILS",n)),n)):"number"==typeof r?(n=r,t.log(u.INFO,i.sprintf(E.PARSED_REVENUE_VALUE,"EVENT_TAG_UTILS",n)),n):null}return null}function Ye(e,t){if(e.hasOwnProperty(we)){var r=e[we],n=void 0;return"string"==typeof r?(n=parseFloat(r),isNaN(n)?(t.log(u.INFO,i.sprintf(E.FAILED_TO_PARSE_VALUE,"EVENT_TAG_UTILS",r)),null):(t.log(u.INFO,i.sprintf(E.PARSED_NUMERIC_VALUE,"EVENT_TAG_UTILS",n)),n)):"number"==typeof r?(n=r,t.log(u.INFO,i.sprintf(E.PARSED_NUMERIC_VALUE,"EVENT_TAG_UTILS",n)),n):null}return null}function He(e,t){return"string"==typeof e&&("string"==typeof t||"boolean"==typeof t||D.isNumber(t)&&D.isSafeInteger(t))}var Xe="https://logx.optimizely.com/v1/events";function Je(e){var t=e.attributes,r=e.configObj,i=r.anonymizeIP,n=r.botFiltering;null==i&&(i=!1);var o={snapshots:[],visitor_id:e.userId,attributes:[]},a={account_id:r.accountId,project_id:r.projectId,visitors:[o],revision:r.revision,client_name:e.clientEngine,client_version:e.clientVersion,anonymize_ip:i,enrich_decisions:!0};return Object.keys(t||{}).forEach((function(r){if(He(r,t[r])){var i=z(e.configObj,r,e.logger);i&&a.visitors[0].attributes.push({entity_id:i,key:r,type:"custom",value:t[r]})}})),"boolean"==typeof n&&a.visitors[0].attributes.push({entity_id:_.BOT_FILTERING,key:_.BOT_FILTERING,type:"custom",value:n}),a}var ze=function(e){var t={httpVerb:"POST"},r=Je(e);t.url=Xe;var i=function(e,t,r,i,n,o){var a=null;null!==t&&(a=J(e,t));var s=$(e,r);return null===s&&(s=""),{decisions:[{campaign_id:a,experiment_id:t,variation_id:r,metadata:{flag_key:o,rule_key:i,rule_type:n,variation_key:s}}],events:[{entity_id:a,timestamp:D.currentTimestamp(),key:"campaign_activated",uuid:D.uuid()}]}}(e.configObj,e.experimentId,e.variationId,e.ruleKey,e.ruleType,e.flagKey);return r.visitors[0].snapshots.push(i),t.params=r,t},Ze=function(e){var t={httpVerb:"POST"},r=Je(e);t.url=Xe;var i=function(e,t,r,i){var n={events:[]},o={entity_id:Z(e,t),timestamp:D.currentTimestamp(),uuid:D.uuid(),key:t};if(r){var a=je(r,i);null!==a&&(o[f.REVENUE]=a);var s=Ye(r,i);null!==s&&(o[f.VALUE]=s),o.tags=r}return n.events.push(o),n}(e.configObj,e.eventKey,e.eventTags,e.logger);return r.visitors[0].snapshots=[i],t.params=r,t};function We(e){var t,r;return null!==(r=null===(t=e.experiment)||void 0===t?void 0:t.key)&&void 0!==r?r:""}function qe(e){var t,r;return null!==(r=null===(t=e.variation)||void 0===t?void 0:t.key)&&void 0!==r?r:""}function $e(e){var t,r;return null!==(r=null===(t=e.variation)||void 0===t?void 0:t.featureEnabled)&&void 0!==r&&r}var Qe=t.getLogger("EVENT_BUILDER");function et(e,t){var r=[];return Object.keys(t||{}).forEach((function(i){if(He(i,t[i])){var n=z(e,i,Qe);n&&r.push({entityId:n,key:i,value:t[i]})}})),r}var tt={createEventProcessor:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return new(r.LogTierV1EventProcessor.bind.apply(r.LogTierV1EventProcessor,s([void 0],e)))},LocalStoragePendingEventsDispatcher:r.LocalStoragePendingEventsDispatcher};var rt="USER_PROFILE_SERVICE_VALIDATOR";var it=function(){function e(e){var t=this,r=e.clientEngine;-1===g.indexOf(r)&&(e.logger.log(u.INFO,i.sprintf(E.INVALID_CLIENT_ENGINE,"OPTIMIZELY",r)),r="node-sdk"),this.clientEngine=r,this.clientVersion=e.clientVersion||"4.4.0",this.errorHandler=e.errorHandler,this.eventDispatcher=e.eventDispatcher,this.isOptimizelyConfigValid=e.isValidInstance,this.logger=e.logger,this.projectConfigManager=function(e){return new fe(e)}({datafile:e.datafile,datafileOptions:e.datafileOptions,jsonSchemaValidator:e.jsonSchemaValidator,sdkKey:e.sdkKey}),this.disposeOnUpdate=this.projectConfigManager.onUpdate((function(e){t.logger.log(u.INFO,i.sprintf(E.UPDATED_OPTIMIZELY_CONFIG,"OPTIMIZELY",e.revision,e.projectId)),t.notificationCenter.sendNotifications(I.OPTIMIZELY_CONFIG_UPDATE)}));var n=this.projectConfigManager.onReady(),o=null;if(e.userProfileService)try{(function(e){if("object"==typeof e&&null!==e){if("function"!=typeof e.lookup)throw new Error(i.sprintf(l.INVALID_USER_PROFILE_SERVICE,rt,"Missing function 'lookup'"));if("function"!=typeof e.save)throw new Error(i.sprintf(l.INVALID_USER_PROFILE_SERVICE,rt,"Missing function 'save'"));return!0}throw new Error(i.sprintf(l.INVALID_USER_PROFILE_SERVICE,rt))})(e.userProfileService)&&(o=e.userProfileService,this.logger.log(u.INFO,i.sprintf(E.VALID_USER_PROFILE_SERVICE,"OPTIMIZELY")))}catch(e){this.logger.log(u.WARNING,e.message)}this.decisionService=new Ke({userProfileService:o,logger:this.logger,UNSTABLE_conditionEvaluators:e.UNSTABLE_conditionEvaluators}),this.notificationCenter=function(e){return new _e(e)}({logger:this.logger,errorHandler:this.errorHandler});var a={dispatcher:this.eventDispatcher,flushInterval:e.eventFlushInterval,batchSize:e.eventBatchSize,maxQueueSize:e.eventMaxQueueSize,notificationCenter:this.notificationCenter};this.eventProcessor=tt.createEventProcessor(a);var s=this.eventProcessor.start();this.readyPromise=Promise.all([n,s]).then((function(e){return e[0]})),this.readyTimeouts={},this.nextReadyTimeoutId=0}return e.prototype.isValidInstance=function(){return this.isOptimizelyConfigValid&&!!this.projectConfigManager.getConfig()},e.prototype.activate=function(e,t,r){try{if(!this.isValidInstance())return this.logger.log(u.ERROR,i.sprintf(E.INVALID_OBJECT,"OPTIMIZELY","activate")),null;if(!this.validateInputs({experiment_key:e,user_id:t},r))return this.notActivatingExperiment(e,t);var n=this.projectConfigManager.getConfig();if(!n)return null;try{var o=this.getVariation(e,t,r);if(null===o)return this.notActivatingExperiment(e,t);if(!M(n,e)){var a=i.sprintf(E.SHOULD_NOT_DISPATCH_ACTIVATE,"OPTIMIZELY",e);return this.logger.log(u.DEBUG,a),o}var s=B(n,e),l={experiment:s,variation:s.variationKeyMap[o],decisionSource:p.EXPERIMENT};return this.sendImpressionEvent(l,"",t,r),o}catch(r){this.logger.log(u.ERROR,r.message);var f=i.sprintf(E.NOT_ACTIVATING_USER,"OPTIMIZELY",t,e);return this.logger.log(u.INFO,f),this.errorHandler.handleError(r),null}}catch(e){return this.logger.log(u.ERROR,e.message),this.errorHandler.handleError(e),null}},e.prototype.sendImpressionEvent=function(e,t,r,i){var n=this.projectConfigManager.getConfig();if(n){var o=function(e){var t=e.configObj,r=e.decisionObj,i=e.userId,n=e.flagKey,o=e.userAttributes,a=e.clientEngine,s=e.clientVersion,u=r.decisionSource,l=We(r),E=qe(r),f=null,_=null;""!==l&&""!==E&&(_=Q(t,l,E)),""!==l&&(f=X(t,l));var g=null;return null!==f&&(g=J(t,f)),{type:"impression",timestamp:D.currentTimestamp(),uuid:D.uuid(),user:{id:i,attributes:et(t,o)},context:{accountId:t.accountId,projectId:t.projectId,revision:t.revision,clientName:a,clientVersion:s,anonymizeIP:t.anonymizeIP||!1,botFiltering:t.botFiltering},layer:{id:g},experiment:{id:f,key:l},variation:{id:_,key:E},ruleKey:l,flagKey:n,ruleType:u}}({decisionObj:e,flagKey:t,userId:r,userAttributes:i,clientEngine:this.clientEngine,clientVersion:this.clientVersion,configObj:n});this.eventProcessor.process(o),this.emitNotificationCenterActivate(e,t,r,i)}},e.prototype.emitNotificationCenterActivate=function(e,t,r,i){var n=this.projectConfigManager.getConfig();if(n){var o=e.decisionSource,a=We(e),s=qe(e),u=null,l=null;""!==a&&""!==s&&(l=k(n,a,s),u=b(n,a));var E,f={attributes:i,clientEngine:this.clientEngine,clientVersion:this.clientVersion,configObj:n,experimentId:u,ruleKey:a,flagKey:t,ruleType:o,userId:r,variationId:l,logger:this.logger},_=ze(f),g=n.experimentKeyMap[a];g&&g.variationKeyMap&&""!==s&&(E=g.variationKeyMap[s]),this.notificationCenter.sendNotifications(I.ACTIVATE,{experiment:g,userId:r,attributes:i,variation:E,logEvent:_})}},e.prototype.track=function(e,t,r,n){try{if(!this.isValidInstance())return void this.logger.log(u.ERROR,i.sprintf(E.INVALID_OBJECT,"OPTIMIZELY","track"));if(!this.validateInputs({user_id:t,event_key:e},r,n))return;var o=this.projectConfigManager.getConfig();if(!o)return;if(!j(o,e))return this.logger.log(u.WARNING,i.sprintf(E.EVENT_KEY_NOT_FOUND,"OPTIMIZELY",e)),void this.logger.log(u.WARNING,i.sprintf(E.NOT_TRACKING_USER,"OPTIMIZELY",t));var a=function(e){var t=e.configObj,r=e.userId,i=e.userAttributes,n=e.clientEngine,o=e.clientVersion,a=e.eventKey,s=e.eventTags,u=Z(t,a),l=null,E=null;return s&&(l=je(s,Qe),E=Ye(s,Qe)),{type:"conversion",timestamp:D.currentTimestamp(),uuid:D.uuid(),user:{id:r,attributes:et(t,i)},context:{accountId: