{"version":3,"file":"chunk.149.1d6b066e959d41464dc9.js","names":["HeaderNames","PersistentCacheKeys","AADAuthorityConstants","AADServerParamKeys","ClaimsRequestKeys","Constants","LIBRARY_NAME","SKU","CACHE_PREFIX","DEFAULT_AUTHORITY","DEFAULT_AUTHORITY_HOST","DEFAULT_COMMON_TENANT","ADFS","DSTS","AAD_INSTANCE_DISCOVERY_ENDPT","CIAM_AUTH_URL","AAD_TENANT_DOMAIN_SUFFIX","RESOURCE_DELIM","NO_ACCOUNT","CLAIMS","CONSUMER_UTID","OPENID_SCOPE","PROFILE_SCOPE","OFFLINE_ACCESS_SCOPE","EMAIL_SCOPE","CODE_RESPONSE_TYPE","CODE_GRANT_TYPE","RT_GRANT_TYPE","FRAGMENT_RESPONSE_MODE","S256_CODE_CHALLENGE_METHOD","URL_FORM_CONTENT_TYPE","AUTHORIZATION_PENDING","NOT_DEFINED","EMPTY_STRING","NOT_APPLICABLE","FORWARD_SLASH","IMDS_ENDPOINT","IMDS_VERSION","IMDS_TIMEOUT","AZURE_REGION_AUTO_DISCOVER_FLAG","REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX","REGIONAL_AUTH_NON_MSI_QUERY_STRING","KNOWN_PUBLIC_CLOUDS","TOKEN_RESPONSE_TYPE","ID_TOKEN_RESPONSE_TYPE","SHR_NONCE_VALIDITY","INVALID_INSTANCE","OIDC_DEFAULT_SCOPES","OIDC_SCOPES","__spreadArrays","CONTENT_TYPE","RETRY_AFTER","CCS_HEADER","WWWAuthenticate","AuthenticationInfo","X_MS_REQUEST_ID","X_MS_HTTP_VERSION","ID_TOKEN","CLIENT_INFO","ADAL_ID_TOKEN","ERROR","ERROR_DESC","ACTIVE_ACCOUNT","ACTIVE_ACCOUNT_FILTERS","COMMON","ORGANIZATIONS","CONSUMERS","CLIENT_ID","REDIRECT_URI","RESPONSE_TYPE","RESPONSE_MODE","GRANT_TYPE","SCOPE","ERROR_DESCRIPTION","ACCESS_TOKEN","REFRESH_TOKEN","EXPIRES_IN","STATE","NONCE","PROMPT","SESSION_STATE","CODE","CODE_CHALLENGE","CODE_CHALLENGE_METHOD","CODE_VERIFIER","CLIENT_REQUEST_ID","X_CLIENT_SKU","X_CLIENT_VER","X_CLIENT_OS","X_CLIENT_CPU","X_CLIENT_CURR_TELEM","X_CLIENT_LAST_TELEM","X_MS_LIB_CAPABILITY","X_APP_NAME","X_APP_VER","POST_LOGOUT_URI","ID_TOKEN_HINT","DEVICE_CODE","CLIENT_SECRET","CLIENT_ASSERTION","CLIENT_ASSERTION_TYPE","TOKEN_TYPE","REQ_CNF","OBO_ASSERTION","REQUESTED_TOKEN_USE","ON_BEHALF_OF","FOCI","RETURN_SPA_CODE","NATIVE_BROKER","LOGOUT_HINT","XMS_CC","SSOTypes","PromptValue","LOGIN","SELECT_ACCOUNT","CONSENT","NONE","CREATE","NO_SESSION","ACCOUNT","SID","LOGIN_HINT","DOMAIN_HINT","ACCOUNT_ID","HOMEACCOUNT_ID","ResponseMode","GrantType","CacheAccountType","Separators","CredentialType","CacheType","CodeChallengeMethodValues","PLAIN","S256","QUERY","FRAGMENT","FORM_POST","IMPLICIT_GRANT","AUTHORIZATION_CODE_GRANT","CLIENT_CREDENTIALS_GRANT","RESOURCE_OWNER_PASSWORD_GRANT","REFRESH_TOKEN_GRANT","DEVICE_CODE_GRANT","JWT_BEARER","MSSTS_ACCOUNT_TYPE","ADFS_ACCOUNT_TYPE","MSAV1_ACCOUNT_TYPE","GENERIC_ACCOUNT_TYPE","CACHE_KEY_SEPARATOR","CLIENT_INFO_SEPARATOR","ACCESS_TOKEN_WITH_AUTH_SCHEME","MSA","MSSTS","GENERIC","APP_METADATA","UNDEFINED","AuthorityMetadataSource","THE_FAMILY_ID","AUTHORITY_METADATA_CONSTANTS","CONFIG","CACHE","NETWORK","HARDCODED_VALUES","AuthenticationScheme","SERVER_TELEM_CONSTANTS","SCHEMA_VERSION","MAX_CUR_HEADER_BYTES","MAX_LAST_HEADER_BYTES","MAX_CACHED_ERRORS","CACHE_KEY","CATEGORY_SEPARATOR","VALUE_SEPARATOR","OVERFLOW_TRUE","OVERFLOW_FALSE","UNKNOWN_ERROR","BEARER","POP","SSH","PasswordGrantConstants","ResponseCodes","RegionDiscoverySources","RegionDiscoveryOutcomes","CacheOutcome","JsonTypes","ThrottlingConstants","username","password","httpSuccess","httpBadRequest","FAILED_AUTO_DETECTION","INTERNAL_CACHE","ENVIRONMENT_VARIABLE","IMDS","CONFIGURED_MATCHES_DETECTED","CONFIGURED_NO_AUTO_DETECTION","CONFIGURED_NOT_DETECTED","AUTO_DETECTION_REQUESTED_SUCCESSFUL","AUTO_DETECTION_REQUESTED_FAILED","NO_CACHE_HIT","FORCE_REFRESH","NO_CACHED_ACCESS_TOKEN","CACHED_ACCESS_TOKEN_EXPIRED","REFRESH_CACHED_ACCESS_TOKEN","CLAIMS_REQUESTED_CACHE_SKIPPED","Jwt","Jwk","Pop","AuthorityType","ProtocolMode","AuthErrorMessage","unexpectedError","code","desc","postRequestFailed","AuthError","_super","errorCode","errorMessage","suberror","_this","this","errorString","call","Object","setPrototypeOf","prototype","subError","name","i","__extends","setCorrelationId","correlationId","createUnexpectedError","errDesc","createPostRequestFailed","Error","ClientAuthErrorMessage","clientInfoDecodingError","clientInfoEmptyError","tokenParsingError","nullOrEmptyToken","endpointResolutionError","networkError","unableToGetOpenidConfigError","hashNotDeserialized","blankGuidGenerated","invalidStateError","stateMismatchError","stateNotFoundError","nonceMismatchError","nonceNotFoundError","authTimeNotFoundError","maxAgeTranspiredError","noTokensFoundError","multipleMatchingTokens","multipleMatchingAccounts","multipleMatchingAppMetadata","tokenRequestCannotBeMade","appendEmptyScopeError","removeEmptyScopeError","appendScopeSetError","emptyInputScopeSetError","DeviceCodePollingCancelled","DeviceCodeExpired","DeviceCodeUnknownError","NoAccountInSilentRequest","invalidCacheRecord","invalidCacheEnvironment","noAccountFound","CachePluginError","noCryptoObj","invalidCacheType","unexpectedAccountType","unexpectedCredentialType","invalidAssertion","invalidClientCredential","tokenRefreshRequired","userTimeoutReached","tokenClaimsRequired","noAuthorizationCodeFromServer","noAzureRegionDetected","accessTokenEntityNullError","bindingKeyNotRemovedError","logoutNotSupported","keyIdMissing","noNetworkConnectivity","userCanceledError","ClientAuthError","createClientInfoDecodingError","caughtError","createClientInfoEmptyError","createTokenParsingError","caughtExtractionError","createTokenNullOrEmptyError","invalidRawTokenString","createEndpointDiscoveryIncompleteError","errDetail","createNetworkError","endpoint","split","createUnableToGetOpenidConfigError","createHashNotDeserializedError","hashParamObj","createInvalidStateError","invalidState","createStateMismatchError","createStateNotFoundError","missingState","createNonceMismatchError","createAuthTimeNotFoundError","createMaxAgeTranspiredError","createNonceNotFoundError","missingNonce","createMultipleMatchingTokensInCacheError","createMultipleMatchingAccountsInCacheError","createMultipleMatchingAppMetadataInCacheError","createTokenRequestCannotBeMadeError","createAppendEmptyScopeToSetError","givenScope","createRemoveEmptyScopeFromSetError","createAppendScopeSetError","appendError","createEmptyInputScopeSetError","createDeviceCodeCancelledError","createDeviceCodeExpiredError","createDeviceCodeUnknownError","createNoAccountInSilentRequestError","createNullOrUndefinedCacheRecord","createInvalidCacheEnvironmentError","createNoAccountFoundError","createCachePluginError","createNoCryptoObjectError","operationName","createInvalidCacheTypeError","createUnexpectedAccountTypeError","createUnexpectedCredentialTypeError","createInvalidAssertionError","createInvalidCredentialError","createRefreshRequiredError","createUserTimeoutReachedError","createTokenClaimsRequiredError","createNoAuthCodeInServerResponseError","createBindingKeyNotRemovedError","createLogoutNotSupportedError","createKeyIdMissingError","createNoNetworkConnectivityError","createUserCanceledError","CredentialEntity","generateAccountId","generateAccountIdForCacheKey","homeAccountId","environment","generateCredentialId","generateCredentialIdForCacheKey","credentialType","clientId","realm","familyId","generateTarget","generateTargetForCacheKey","target","generateCredentialKey","generateCredentialCacheKey","tokenType","requestedClaimsHash","generateType","generateClaimsHashForCacheKey","generateSchemeForCacheKey","join","toLowerCase","scopes","IdTokenEntity","createIdTokenEntity","idToken","tenantId","idTokenEntity","secret","isIdTokenEntity","entity","hasOwnProperty","ClientConfigurationErrorMessage","redirectUriNotSet","postLogoutUriNotSet","claimsRequestParsingError","authorityUriInsecure","urlParseError","urlEmptyError","emptyScopesError","nonArrayScopesError","clientIdSingleScopeError","invalidPrompt","invalidClaimsRequest","tokenRequestEmptyError","logoutRequestEmptyError","invalidCodeChallengeMethod","invalidCodeChallengeParams","invalidCloudDiscoveryMetadata","invalidAuthorityMetadata","untrustedAuthority","invalidAzureCloudInstance","missingSshJwk","missingSshKid","missingNonceAuthenticationHeader","invalidAuthenticationHeader","authorityMismatch","ClientConfigurationError","createRedirectUriEmptyError","createPostLogoutRedirectUriEmptyError","createClaimsRequestParsingError","claimsRequestParseError","createInsecureAuthorityUriError","urlString","createUrlParseError","createUrlEmptyError","createEmptyScopesArrayError","createClientIdSingleScopeError","inputScopes","createInvalidPromptError","promptValue","createInvalidClaimsRequestError","createEmptyLogoutRequestError","createEmptyTokenRequestError","createInvalidCodeChallengeMethodError","createInvalidCodeChallengeParamsError","createInvalidCloudDiscoveryMetadataError","createInvalidAuthorityMetadataError","createUntrustedAuthorityError","createInvalidAzureCloudInstanceError","createMissingSshJwkError","createMissingSshKidError","createMissingNonceAuthenticationHeadersError","createInvalidAuthenticationHeaderError","invalidHeaderName","details","createAuthorityMismatchError","StringUtils","decodeAuthToken","authToken","isEmpty","matches","exec","length","JSON","stringify","header","JWSPayload","JWSSig","str","isEmptyObj","strObj","obj","parse","keys","e","startsWith","search","indexOf","endsWith","lastIndexOf","queryStringToObject","query","params","decode","s","decodeURIComponent","replace","forEach","pair","trim","_a","key","value","trimArrayEntries","arr","map","entry","removeEmptyStringsFromArray","filter","jsonParseHelper","matchPattern","pattern","input","RegExp","test","ScopeSet","scopeArr","filteredInput","validateInputScopes","Set","scope","add","fromString","inputScopeString","createSearchScopes","scopeSet","containsOnlyOIDCScopes","removeScope","removeOIDCScopes","containsScope","lowerCaseScopesSet","printScopesLowerCase","has","containsScopeSet","size","asArray","every","defaultScopeCount","defaultScope","appendScope","newScope","appendScopes","newScopes","delete","unionScopeSets","otherScopes","unionScopes","intersectingScopeSets","sizeOtherScopes","getScopeCount","sizeThisScopes","array","val","push","printScopes","buildClientInfo","rawClientInfo","crypto","decodedClientInfo","base64Decode","message","buildClientInfoFromHomeAccountId","clientInfoParts","uid","utid","Default","Adfs","Dsts","Ciam","AAD","OIDC","CcsCredentialType","AccountEntity","generateAccountKey","generateAccountCacheKey","localAccountId","getAccountInfo","idTokenClaims","nativeAccountId","authorityType","accountInterface","createAccount","accountDetails","authority","account","protocolMode","clientInfo","env","getPreferredCache","tid","oid","sub","preferredUsername","preferred_username","email","emails","upn","cloudGraphHostName","msGraphHost","createFromAccountInfo","accountInfo","generateHomeAccountId","serverClientInfo","authType","logger","cryptoObj","accountId","verbose","isAccountEntity","accountInfoIsEqual","accountA","accountB","compareClaims","claimsMatch","accountAClaims","accountBClaims","iat","nonce","AuthToken","rawToken","claims","extractTokenClaims","encodedToken","decodedToken","base64TokenPayload","base64Decoded","err","checkMaxAge","authTime","maxAge","Date","now","version","CacheManager","cryptoImpl","commonLogger","clone","getAllAccounts","allAccountKeys","getAccountKeys","accountEntities","reduce","accounts","getAccount","accountEntity","getAccountInfoFromEntity","getAccountInfoFilteredBy","accountFilter","allAccounts","getAccountsFilteredBy","getIdToken","saveCacheRecord","cacheRecord","setAccount","setIdTokenCredential","accessToken","saveAccessToken","sent","refreshToken","setRefreshTokenCredential","appMetadata","setAppMetadata","credential","accessTokenFilter","tokenKeys","getTokenKeys","currentScopes","removedAccessTokens","accessTokenKeyMatchesFilter","tokenEntity","getAccessTokenCredential","credentialMatchesFilter","removeAccessToken","Promise","all","setAccessTokenCredential","matchingAccounts","cacheKey","isAccountKey","matchHomeAccountId","matchLocalAccountId","matchUsername","matchEnvironment","matchRealm","matchNativeAccountId","includes","isCredentialKey","lowerCaseKey","clientIdValidation","familyIdValidation","matchClientId","userAssertionHash","matchUserAssertionHash","matchCredentialType","matchFamilyId","matchTarget","matchTokenType","keyId","matchKeyId","getAppMetadataFilteredBy","getAppMetadataFilteredByInternal","allCacheKeys","getKeys","matchingAppMetadata","isAppMetadata","getAppMetadata","getAuthorityMetadataByAlias","host","getAuthorityMetadataKeys","matchedEntity","isAuthorityMetadata","getAuthorityMetadata","aliases","removeAllAccounts","g","t","n","m","r","label","removedAccounts","removeAccount","accountKey","removeAccountContext","removeItem","allTokenKeys","removedCredentials","removeIdToken","removeRefreshToken","kid","trys","removeTokenBindingKey","removeAppMetadata","readCacheRecord","request","cachedAccount","readAccountFromCache","cachedIdToken","cachedAccessToken","getAccessToken","cachedRefreshToken","getRefreshToken","cachedAppMetadata","readAppMetadataFromCache","trace","idTokenFilter","idTokens","getIdTokensByFilter","numIdTokens","info","idTokenKeys","idTokenKeyMatchesFilter","__assign","getIdTokenCredential","inputKey","authScheme","authenticationScheme","sshKid","accessTokenKeys","accessTokens","numAccessTokens","keyMustContainAllScopes","getAccessTokensByFilter","familyRT","id","refreshTokenFilter","refreshTokenKeys","refreshTokens","refreshTokenKeyMatchesFilter","getRefreshTokenCredential","appMetadataFilter","appMetadataEntries","numAppMetadata","isAppMetadataFOCI","cloudMetadata","generateAuthorityMetadataCacheKey","toObject","json","propertyName","DefaultStorageClass","setServerTelemetry","getServerTelemetry","setAuthorityMetadata","setThrottlingCache","getThrottlingCache","containsKey","clear","updateCredentialCacheKey","TimeUtils","nowSeconds","Math","round","getTime","isTokenExpired","expiresOn","offset","expirationSec","Number","wasClockTurnedBack","cachedAt","delay","resolve","setTimeout","AccessTokenEntity","createAccessTokenEntity","extExpiresOn","cryptoUtils","refreshOn","requestedClaims","atEntity","currentTime","toString","extendedExpiresOn","tokenClaims","_b","cnf","isAccessTokenEntity","RefreshTokenEntity","createRefreshTokenEntity","rtEntity","isRefreshTokenEntity","AppMetadataEntity","generateAppMetadataKey","generateAppMetadataCacheKey","createAppMetadataEntity","isAppMetadataEntity","ServerTelemetryEntity","failedRequests","errors","cacheHits","isServerTelemetryEntity","validateKey","validateEntity","AuthorityMetadataEntity","expiresAt","updateCloudDiscoveryMetadata","metadata","fromNetwork","preferred_cache","preferred_network","aliasesFromNetwork","updateEndpointMetadata","authorization_endpoint","token_endpoint","end_session_endpoint","issuer","endpointsFromNetwork","jwks_uri","updateCanonicalAuthority","canonical_authority","resetExpiresAt","isExpired","isAuthorityMetadataEntity","ThrottlingEntity","isThrottlingEntity","ProtocolUtils","setRequestState","userState","meta","libraryState","generateLibraryState","stateObj","createNewGuid","stateString","base64Encode","parseRequestState","state","splitState","slice","libraryStateString","libraryStateObj","userRequestState","HOME_ACCOUNT_ID","UPN","NativeExtensionMethod","BrowserCacheLocation","HTTP_REQUEST_TYPE","TemporaryCacheKeys","StaticCacheKeys","InMemoryCacheKeys","ApiId","InteractionType","InteractionStatus","CacheRecord","accessTokenEntity","refreshTokenEntity","appMetadataEntity","DEFAULT_CRYPTO_IMPLEMENTATION","generatePkceCodes","getPublicKeyThumbprint","clearKeystore","signJwt","hashString","BrowserAuthErrorMessage","pkceNotGenerated","cryptoDoesNotExist","httpMethodNotImplementedError","emptyNavigateUriError","hashEmptyError","hashDoesNotContainStateError","hashDoesNotContainKnownPropertiesError","unableToParseStateError","stateInteractionTypeMismatchError","interactionInProgress","popupWindowError","emptyWindowError","userCancelledError","monitorPopupTimeoutError","monitorIframeTimeoutError","redirectInIframeError","blockTokenRequestsInHiddenIframeError","blockAcquireTokenInPopupsError","iframeClosedPrematurelyError","silentLogoutUnsupportedError","noAccountError","silentPromptValueError","noTokenRequestCacheError","unableToParseTokenRequestCacheError","noCachedAuthorityError","authRequestNotSet","notInBrowserEnvironment","databaseNotOpen","getRequestFailed","failedToParseNetworkResponse","unableToLoadTokenError","signingKeyNotFoundInStorage","authCodeRequired","authCodeOrNativeAccountRequired","spaCodeAndNativeAccountPresent","databaseUnavailable","unableToAcquireTokenFromNativePlatform","nativeHandshakeTimeout","nativeExtensionNotInstalled","nativeConnectionNotEstablished","nativeBrokerCalledBeforeInitialize","nativePromptNotSupported","BrowserAuthError","o","createPkceNotGeneratedError","createCryptoNotAvailableError","createHttpMethodNotImplementedError","method","createEmptyNavigationUriError","createEmptyHashError","hashValue","createHashDoesNotContainStateError","createHashDoesNotContainKnownPropertiesError","createUnableToParseStateError","createStateInteractionTypeMismatchError","createInteractionInProgressError","createPopupWindowError","createEmptyWindowCreatedError","createUserCancelledError","createMonitorPopupTimeoutError","createMonitorIframeTimeoutError","createRedirectInIframeError","windowParentCheck","createBlockReloadInHiddenIframeError","createBlockAcquireTokenInPopupsError","createIframeClosedPrematurelyError","createSilentLogoutUnsupportedError","createNoAccountError","createSilentPromptValueError","givenPrompt","createUnableToParseTokenRequestCacheError","createNoTokenRequestCacheError","createAuthRequestNotSetError","createNoCachedAuthorityError","createNonBrowserEnvironmentError","createDatabaseNotOpenError","createPostRequestFailedError","errorDesc","createGetRequestFailedError","createFailedToParseNetworkResponseError","createUnableToLoadTokenError","errorDetail","createSigningKeyNotFoundInStorageError","createAuthCodeRequiredError","createAuthCodeOrNativeAccountIdRequiredError","createSpaCodeAndNativeAccountIdPresentError","createDatabaseUnavailableError","createUnableToAcquireTokenFromNativePlatformError","createNativeHandshakeTimeoutError","createNativeExtensionNotInstalledError","createNativeConnectionNotEstablishedError","createNativeBrokerCalledBeforeInitialize","createNativePromptParameterNotSupportedError","BrowserConstants","INTERACTION_IN_PROGRESS_VALUE","INVALID_GRANT_ERROR","POPUP_WIDTH","POPUP_HEIGHT","POPUP_NAME_PREFIX","DEFAULT_POLL_INTERVAL_MS","MSAL_SKU","NativeConstants","HandshakeRequest","HandshakeResponse","GetToken","Response","LocalStorage","SessionStorage","MemoryStorage","GET","POST","AUTHORITY","ACQUIRE_TOKEN_ACCOUNT","REQUEST_STATE","NONCE_IDTOKEN","ORIGIN_URI","RENEW_STATUS","URL_HASH","REQUEST_PARAMS","SCOPES","INTERACTION_STATUS_KEY","CCS_CREDENTIAL","CORRELATION_ID","NATIVE_REQUEST","REDIRECT_CONTEXT","ACCOUNT_KEYS","TOKEN_KEYS","WRAPPER_SKU","WRAPPER_VER","acquireTokenRedirect","acquireTokenPopup","ssoSilent","acquireTokenSilent_authCode","handleRedirectPromise","acquireTokenByCode","acquireTokenSilent_silentFlow","logout","logoutPopup","Redirect","Popup","Silent","None","Startup","Login","Logout","AcquireToken","SsoSilent","HandleRedirect","WrapperSKU","DEFAULT_REQUEST","KEY_FORMAT_JWK","React","Angular","CacheLookupPolicy","DB_NAME","DB_TABLE_NAME","AccessToken","AccessTokenAndRefreshToken","RefreshToken","RefreshTokenAndNetwork","Skip","PerformanceEvents","PerformanceEventStatus","BrowserConfigurationAuthErrorMessage","storageNotSupportedError","noRedirectCallbacksSet","invalidCallbackObject","stubPcaInstanceCalled","inMemRedirectUnavailable","entropyNotProvided","BrowserConfigurationAuthError","createStorageNotSupportedError","givenStorageLocation","createRedirectCallbacksNotSetError","createStubPcaInstanceCalledError","createInMemoryRedirectUnavailableError","createEntropyNotProvided","BrowserStorage","cacheLocation","validateWindowStorage","windowStorage","window","getItem","setItem","cache","Map","get","set","cacheKeys","UrlString","url","_urlString","getHash","canonicalizeUri","defineProperty","lowerCaseUrl","validateAsUri","components","getUrlComponents","HostNameAndPort","PathSegments","Protocol","appendQueryString","queryString","removeHashFromUrl","replaceTenantPath","urlObject","pathArray","constructAuthorityUriFromObject","parseHash","regEx","match","urlComponents","AbsolutePath","QueryString","pathSegments","substring","getDomainFromUrl","getAbsoluteUrl","relativeUrl","baseUrl","baseComponents","hashIndex1","hashIndex2","parseQueryString","queryIndex1","queryIndex2","getDeserializedHash","hash","parsedHash","deserializedHash","getDeserializedQueryString","parsedQueryString","deserializedQueryString","hashContainsKnownProperties","parameters","error_description","error","BrowserProtocolUtils","extractBrowserRequestState","browserCrypto","parseServerResponseFromHash","locationHash","hashUrlString","BrowserCacheManager","cacheConfig","COOKIE_LIFE_MULTIPLIER","internalStorage","browserStorage","setupBrowserStorage","temporaryCacheStorage","setupTemporaryCacheStorage","temporaryCacheLocation","cacheMigrationEnabled","migrateCacheEntries","createKeyMaps","idTokenKey","clientInfoKey","errorKey","errorDescKey","values","index","migrateCacheEntry","newKey","setTemporaryCache","accountKeys","credObj","validateAndParseJson","tracePii","addTokenKey","accountObj","addAccountKeyToMap","jsonValue","parsedJson","removeAccountKeyFromMap","parsedAccount","removalIndex","splice","removeTokenKey","item","type","infoPii","idRemoval","accessRemoval","refreshRemoval","parsedIdToken","accessTokenKey","parsedAccessToken","refreshTokenKey","parsedRefreshToken","appMetadataKey","parsedMetadata","serverTelemetryKey","serverTelemetry","setWrapperMetadata","wrapperSKU","wrapperVersion","getWrapperMetadata","getActiveAccount","activeAccountKeyFilters","generateCacheKey","activeAccountValueFilters","activeAccountKeyLocal","activeAccountValueLocal","activeAccount","getAccountInfoByFilter","setActiveAccount","activeAccountValueObj","activeAccountKey","activeAccountValue","getAccountInfoByHints","loginHint","sid","accountSid","throttlingCacheKey","parsedThrottlingCache","throttlingCache","getTemporaryCache","generateKey","storeAuthStateInCookie","itemCookie","getItemCookie","setItemCookie","clearItemCookie","__spread","c","u","clearTokensAndKeysWithClaims","warning","cookieName","cookieValue","expires","cookieStr","encodeURIComponent","getCookieExpirationTime","secureCookies","document","cookie","cookieList","charAt","clearMsalCookies","cookiePrefix","cookieKey","cookieLifeDays","today","toUTCString","getCache","setCache","generateAuthorityKey","stateId","generateNonceKey","generateStateKey","getCachedAuthority","cachedState","stateCacheKey","authorityCacheKey","updateCacheEntries","authorityInstance","nonceCacheKey","ccsCredential","resetRequestCache","setInteractionInProgress","cleanRequestByState","stateKey","cleanRequestByInteractionType","interactionType","stateValue","parsedState","cacheCodeRequest","authCodeRequest","encodedValue","getCachedRequest","encodedTokenRequest","parsedRequest","cachedAuthority","getCachedNativeRequest","cachedRequest","isInteractionInProgress","getInteractionInProgress","inProgress","getLegacyLoginHint","adalIdTokenString","msalIdTokenString","cachedIdTokenString","IdToken","currentCacheKey","updatedCacheKey","cacheItem","getRedirectRequestContext","setRedirectRequestContext","hydrateCache","result","claimsHash","_g","_c","_d","_e","_f","AcquireTokenByCode","AcquireTokenByRefreshToken","AcquireTokenSilent","AcquireTokenSilentAsync","AcquireTokenPopup","CryptoOptsGetPublicKeyThumbprint","CryptoOptsSignJwt","SilentCacheClientAcquireToken","SilentIframeClientAcquireToken","SilentRefreshClientAcquireToken","StandardInteractionClientGetDiscoveredAuthority","FetchAccountIdWithNativeBroker","NativeInteractionClientAcquireToken","BaseClientCreateTokenRequestHeaders","BrokerHandhshake","AcquireTokenByRefreshTokenInBroker","AcquireTokenByBroker","RefreshTokenClientExecuteTokenRequest","RefreshTokenClientAcquireToken","RefreshTokenClientAcquireTokenWithCachedRefreshToken","RefreshTokenClientAcquireTokenByRefreshToken","RefreshTokenClientCreateTokenRequestBody","AcquireTokenFromCache","AcquireTokenBySilentIframe","InitializeBaseRequest","InitializeSilentRequest","InitializeClientApplication","SilentIframeClientTokenHelper","SilentHandlerInitiateAuthRequest","SilentHandlerMonitorIframeForHash","SilentHandlerLoadFrame","StandardInteractionClientCreateAuthCodeClient","StandardInteractionClientGetClientConfiguration","StandardInteractionClientInitializeAuthorizationRequest","StandardInteractionClientInitializeAuthorizationCodeRequest","GetAuthCodeUrl","HandleCodeResponseFromServer","HandleCodeResponseFromHash","UpdateTokenEndpointAuthority","AuthClientAcquireToken","AuthClientExecuteTokenRequest","AuthClientCreateTokenRequestBody","AuthClientCreateQueryString","PopTokenGenerateCnf","PopTokenGenerateKid","HandleServerTokenResponse","AuthorityFactoryCreateDiscoveredInstance","AuthorityResolveEndpointsAsync","AuthorityGetCloudDiscoveryMetadataFromNetwork","AuthorityUpdateCloudDiscoveryMetadata","AuthorityGetEndpointMetadataFromNetwork","AuthorityUpdateEndpointMetadata","AuthorityUpdateMetadataWithRegionalInformation","RegionDiscoveryDetectRegion","RegionDiscoveryGetRegionFromIMDS","RegionDiscoveryGetCurrentVersion","AcquireTokenByCodeAsync","GetEndpointMetadataFromNetwork","GetCloudDiscoveryMetadataFromNetworkMeasurement","HandleRedirectPromiseMeasurement","UpdateCloudDiscoveryMetadataMeasurement","UsernamePasswordClientAcquireToken","NativeMessageHandlerHandshake","ClearTokensAndKeysWithClaims","NotStarted","InProgress","Completed","LogLevel","IntFields","Warning","Info","Verbose","Trace","AzureCloudInstance","Logger","loggerOptions","packageName","packageVersion","level","setLoggerOptions","createDefaultLoggerOptions","localCallback","loggerCallback","piiLoggingEnabled","logLevel","logMessage","options","containsPii","timestamp","log","executeCallback","errorPii","warningPii","verbosePii","isPiiLoggingEnabled","AzurePublic","AzurePpe","AzureChina","AzureGermany","AzureUsGovernment","KeyLocation","DEFAULT_SYSTEM_OPTIONS","tokenRenewalOffsetSeconds","preventCorsPreflight","DEFAULT_LOGGER_IMPLEMENTATION","DEFAULT_CACHE_OPTIONS","claimsBasedCachingEnabled","DEFAULT_NETWORK_IMPLEMENTATION","sendGetRequestAsync","sendPostRequestAsync","DEFAULT_LIBRARY_INFO","sku","cpu","os","DEFAULT_CLIENT_CREDENTIALS","clientSecret","clientAssertion","DEFAULT_AZURE_CLOUD_OPTIONS","azureCloudInstance","tenant","DEFAULT_TELEMETRY_OPTIONS","application","appName","appVersion","ServerError","ThrottlingUtils","generateThrottlingStorageKey","thumbprint","preProcess","cacheManager","throttleTime","errorCodes","postProcess","response","checkResponseStatus","checkResponseForRetryAfter","thumbprintValue","calculateThrottleTime","parseInt","headers","body","error_codes","status","time","currentSeconds","floor","min","removeThrottle","homeAccountIdentifier","resourceRequestMethod","resourceRequestUri","shrClaims","NetworkManager","networkClient","sendPostRequest","tokenEndpoint","e_1","RequestValidator","validateRedirectUri","redirectUri","validatePrompt","prompt","promptValues","validateClaims","validateCodeChallengeParams","codeChallenge","codeChallengeMethod","validateCodeChallengeMethod","sanitizeEQParams","eQParams","queryParams","fromEntries","entries","RequestParameterBuilder","addResponseTypeCode","addResponseTypeForTokenAndIdToken","addResponseMode","responseMode","addNativeBroker","addScopes","addOidcScopes","requestScopes","addClientId","addRedirectUri","addPostLogoutRedirectUri","addIdTokenHint","idTokenHint","addDomainHint","domainHint","addLoginHint","addCcsUpn","addCcsOid","addSid","addClaims","clientCapabilities","mergedClaims","addClientCapabilitiesToClaims","addCorrelationId","addLibraryInfo","libraryInfo","addApplicationTelemetry","appTelemetry","addPrompt","addState","addNonce","addCodeChallengeParams","addAuthorizationCode","addDeviceCode","addRefreshToken","addCodeVerifier","codeVerifier","addClientSecret","addClientAssertion","addClientAssertionType","clientAssertionType","addOboAssertion","oboAssertion","addRequestTokenUse","tokenUse","addGrantType","grantType","addClientInfo","addExtraQueryParameters","sanitizedEQParams","addUsername","addPassword","addPopToken","cnfString","addSshJwk","sshJwkString","addServerTelemetry","serverTelemetryManager","generateCurrentRequestHeaderValue","generateLastRequestHeaderValue","addThrottling","addLogoutHint","logoutHint","createQueryString","queryParameterArray","Array","BaseClient","configuration","performanceClient","authOptions","userAuthOptions","userSystemOptions","userLoggerOption","userCacheOptions","storageImplementation","networkImplementation","cryptoImplementation","clientCredentials","telemetry","persistencePlugin","serializableCache","config","systemOptions","cacheOptions","storageInterface","networkInterface","cryptoInterface","azureCloudOptions","skipAuthorityMetadataCache","networkManager","createTokenRequestHeaders","ccsCred","executePostToTokenEndpoint","clearTelemetryCache","updateAuthority","updatedAuthority","discoveryComplete","createTokenQueryParameters","parameterBuilder","tokenQueryParameters","InteractionRequiredServerErrorMessage","InteractionRequiredAuthSubErrorMessage","InteractionRequiredAuthErrorMessage","native_account_unavailable","InteractionRequiredAuthError","traceId","isInteractionRequiredError","isInteractionRequiredErrorCode","isInteractionRequiredSubError","isInteractionRequiredErrorDesc","some","irErrorCode","createNoTokensFoundError","createNativeAccountUnavailableError","SW","UHW","PopTokenGenerator","generateCnf","addQueueMeasurement","setPreQueueTime","generateKid","reqCnf","reqCnfString","reqCnfHash","xms_ksl","signPopToken","signPayload","payload","shrNonce","resourceUrlString","resourceUrlComponents","at","ts","toUpperCase","p","q","client_claims","TokenCacheContext","tokenCache","hasChanged","ResponseHandler","cacheStorage","validateServerAuthorizationCodeResponse","serverResponseHash","trace_id","correlation_id","client_info","validateTokenResponse","serverResponse","errString","handleServerTokenResponse","serverTokenResponse","reqTimestamp","authCodePayload","handlingRefreshTokenResponse","forceCacheRefreshTokenResponse","serverRequestId","id_token","idTokenObj","auth_time","requestStateObj","key_id","generateCacheRecord","cacheContext","beforeCacheAccess","generateAuthenticationResult","afterCacheAccess","cloud_graph_host_name","msgraph_host","access_token","responseScopes","expiresIn","expires_in","extExpiresIn","ext_expires_in","refreshIn","refresh_in","tokenExpirationSeconds","extendedTokenExpirationSeconds","refreshOnSeconds","token_type","refresh_token","foci","fromTokenCache","requestState","requestId","popTokenGenerator","spa_accountid","canonicalAuthority","uniqueId","fromCache","spa_code","fromNativeBroker","AuthorizationCodeClient","includeRedirectUri","getAuthCodeUrl","createAuthCodeUrlQueryString","authorizationEndpoint","acquireToken","atsMeasurement","startMeasurement","executeTokenRequest","httpVerAuthority","addStaticFields","responseHandler","undefined","then","endMeasurement","success","catch","subErrorCode","handleFragmentResponse","hashFragment","serverParams","getLogoutUri","logoutRequest","createLogoutUrlQueryString","endSessionEndpoint","queryParametersString","createTokenRequestBody","requestBody","assertion","assertionType","reqCnfData","sshJwk","d","tokenBodyParameters","enableSpaAuthorizationCode","l","extraScopesToConsent","extractAccountSid","accountLoginHintClaim","extractLoginHint","extraQueryParameters","nativeBroker","postLogoutRedirectUri","login_hint","isOpenIdConfigResponse","EventType","NativeStatusCode","EndpointMetadata","token_endpoint_auth_methods_supported","response_modes_supported","subject_types_supported","id_token_signing_alg_values_supported","response_types_supported","scopes_supported","request_uri_parameter_supported","userinfo_endpoint","device_authorization_endpoint","http_logout_supported","frontchannel_logout_supported","claims_supported","kerberos_endpoint","tenant_region_scope","cloud_instance_name","rbac_url","InstanceDiscoveryMetadata","tenant_discovery_endpoint","RegionDiscovery","detectRegion","environmentRegion","regionDiscoveryMetadata","autodetectedRegionName","IMDS_OPTIONS","h","getRegionFromIMDS","localIMDSVersionResponse","region_source","getCurrentVersion","currentIMDSVersion","currentIMDSVersionResponse","Metadata","Authority","authorityOptions","_canonicalAuthority","region_used","region_outcome","regionDiscovery","getAuthorityType","authorityUri","canonicalAuthorityUrlComponents","_canonicalAuthorityUrlComponents","enumerable","configurable","replacePath","canReplaceTenant","reservedTenantDomains","replaceTenant","cachedAuthorityUrlComponents","cachedAuthorityParts","currentPart","cachedPart","resolveEndpointsAsync","a","metadataEntity","hostnameAndPort","cloudDiscoverySource","endpointSource","getEndpointMetadataFromConfig","isAuthoritySameType","getEndpointMetadataFromNetwork","azureRegionConfiguration","azureRegion","updateMetadataWithRegionalInformation","harcodedMetadata","getEndpointMetadataFromHardcodedValues","defaultOpenIdConfigurationEndpoint","authorityMetadata","userConfiguredAzureRegion","replaceWithRegionalInformation","knownAuthorities","getCloudDiscoveryMetadataFromConfig","metadataEntityExpired","getCloudDiscoveryMetadataFromNetwork","getCloudDiscoveryMetadataFromHarcodedValues","createCloudDiscoveryMetadataFromHost","cloudDiscoveryMetadata","parsedResponse","getCloudDiscoveryMetadataFromNetworkResponse","isInKnownAuthorities","instanceDiscoveryEndpoint","typedResponseBody","error_1","typedError","generateAuthority","authorityString","authorityAzureCloudInstance","isAlias","isPublicCloudAuthority","buildRegionalAuthorityString","region","authorityUrlInstance","authorityUrlParts","hostNameAndPort","transformCIAMAuthority","ciamAuthority","authorityUrlComponents","AuthorityFactory","createDiscoveredInstance","authorityUriFinal","acquireTokenAuthority","createInstance","authorityUrl","ServerTelemetryManager","telemetryRequest","cacheOutcome","apiId","wrapperVer","telemetryCacheKey","platformFields","requestWithRegionDiscoveryFields","getRegionDiscoveryFields","lastRequests","getLastRequests","maxErrors","maxErrorsToSend","errorCount","cacheFailedRequest","shift","incrementCacheHits","initialValue","numErrorsFlushed","serverTelemEntity","serverTelemetryEntity","dataSize","regionDiscoveryFields","regionUsed","regionSource","regionOutcome","updateRegionDiscoveryMetadata","setCacheOutcome","FetchClient","fetch","getFetchHeaders","navigator","onLine","getHeaderDict","reqBody","e_3","Headers","optionsHeaders","append","headerDict","XhrClient","sendRequestAsync","reject","xhr","XMLHttpRequest","open","setXhrHeaders","onload","jsonResponse","responseText","networkResponse","onerror","send","headers_1","setRequestHeader","headerArr","getAllResponseHeaders","parts","headerName","headerVal","BrowserUtils","clearHash","contentWindow","location","history","replaceState","origin","pathname","replaceHash","urlParts","isInIframe","parent","isInPopup","opener","getCurrentUri","href","getHomepage","getBrowserNetworkClient","blockReloadInHiddenIframes","blockRedirectInIframe","allowRedirectInIframe","isIframedApp","blockAcquireTokenInPopups","blockNonBrowserEnvironment","isBrowserEnvironment","blockNativeBrokerCalledBeforeInitialized","allowNativeBroker","initialized","detectIEOrEdge","ua","userAgent","msie","msie11","msedge","BaseInteractionClient","storageImpl","eventHandler","navigationClient","nativeMessageHandler","system","clearCacheOnLogout","initializeBaseRequest","auth","validateRequestAuthority","validatedRequest","getRedirectUri","requestRedirectUri","getDiscoveredAuthority","initializeServerTelemetryManager","forceRefresh","telemetryPayload","requestAuthority","StandardInteractionClient","initializeAuthorizationCodeRequest","generatedPkceParams","verifier","challenge","initializeLogoutRequest","validLogoutRequest","getLogoutHintFromIdTokenClaims","createAuthCodeClient","requestAzureCloudOptions","getClientConfiguration","clientConfig","discoveredAuthority","validateAndExtractStateFromHash","requestCorrelationId","platformStateObj","getAuthorityMeasurement","userAuthority","builtAuthority","initializeAuthorizationRequest","browserState","apply","concat","legacyLoginHint","InteractionHandler","authCodeModule","authModule","handleCodeResponseFromHash","networkModule","authCodeResponse","handleCodeResponseFromServer","validateNonce","nonceKey","cachedNonce","cloud_instance_host_name","updateTokenEndpointAuthority","cachedCcsCred","checkCcsCredentials","tokenResponse","cloudInstanceHostname","cloudInstanceAuthorityUri","cloudInstanceAuthority","RedirectHandler","initiateAuthRequest","requestUrl","redirectStartPage","navigationOptions","timeout","redirectTimeout","noHistory","onRedirectNavigate","navigateExternal","INITIALIZE_START","INITIALIZE_END","ACCOUNT_ADDED","ACCOUNT_REMOVED","LOGIN_START","LOGIN_SUCCESS","LOGIN_FAILURE","ACQUIRE_TOKEN_START","ACQUIRE_TOKEN_SUCCESS","ACQUIRE_TOKEN_FAILURE","ACQUIRE_TOKEN_NETWORK_START","SSO_SILENT_START","SSO_SILENT_SUCCESS","SSO_SILENT_FAILURE","ACQUIRE_TOKEN_BY_CODE_START","ACQUIRE_TOKEN_BY_CODE_SUCCESS","ACQUIRE_TOKEN_BY_CODE_FAILURE","HANDLE_REDIRECT_START","HANDLE_REDIRECT_END","POPUP_OPENED","LOGOUT_START","LOGOUT_SUCCESS","LOGOUT_FAILURE","LOGOUT_END","RESTORE_FROM_BFCACHE","USER_INTERACTION_REQUIRED","USER_CANCEL","NO_NETWORK","TRANSIENT_ERROR","PERSISTENT_ERROR","DISABLED","ACCOUNT_UNAVAILABLE","CryptoKeyStoreNames","NativeAuthError","description","ext","isFatal","NativeAuthErrorMessage","createError","createUserSwitchError","createTokensNotFoundInCacheError","RefreshTokenClient","_h","httpVerToken","refreshTokenSize","forceCache","acquireTokenByRefreshToken","acquireTokenWithCachedRefreshToken","noFamilyRTInCache","clientMismatchErrorWithFamilyRT","discardMeasurement","refreshTokenRequest","acquireTokenMeasurement","SilentFlowClient","acquireCachedToken","generateResultFromCacheRecord","SilentCacheClient","silentRequest","createSilentFlowClient","silentAuthClient","cachedToken","initializeSilentRequest","NativeInteractionClient","provider","nativeStorageImpl","nativeStorageManager","silentCacheClient","nativeATMeasurement","initializeNativeRequest","nativeRequest","acquireTokensFromCache","isNativeBroker","messageBody","sendMessage","validatedResponse","validateNativeResponse","handleNativeResponse","createSilentCacheRequest","fullAccount","redirectNavigationTimeout","navigateToLoginRequestUrl","__rest","e_4","createIdTokenObj","createHomeAccountIdentifier","cacheAccount","cacheNativeTokens","generateScopes","generatePopAccessToken","shr","shrParameters","mats","addTelemetryFromNativeResponse","accountProperties","properties","UID","TenantId","responseAccessToken","isResponseFromCache","nativeCacheRecord","getMATSFromResponse","extensionId","getExtensionId","extensionVersion","getExtensionVersion","matsBrokerVersion","broker_version","matsAccountJoinOnStart","account_join_on_start","matsAccountJoinOnEnd","account_join_on_end","matsDeviceJoin","device_join","matsPromptBehavior","prompt_behavior","matsApiErrorCode","api_error_code","matsUiVisible","ui_visible","matsSilentCode","silent_code","matsSilentBiSubCode","silent_bi_sub_code","matsSilentMessage","silent_message","matsSilentStatus","silent_status","matsHttpStatus","http_status","matsHttpEventCount","http_event_count","MATS","is_cached","remainingProperties","getPrompt","windowTitleSubstring","title","extraParameters","extendedExpiryToken","NativeMessageHandler","handshakeTimeoutMs","resolvers","handshakeResolvers","responseId","messageChannel","MessageChannel","windowListener","onWindowMessage","bind","handshakeEvent","req","channel","port1","postMessage","createProvider","preferredProvider","sendHandshakeRequest","backupProvider","addEventListener","extensionHandshakeTimeoutMs","onmessage","event","onChannelMessage","port2","timeoutId","removeEventListener","close","extensionHandshakeTimedOut","source","data","clearTimeout","handshakeResolver","extensionInstalled","resolver","isNativeAvailable","nativeExtensionProvider","RedirectClient","nativeStorage","validRequest","handleBackButton","persisted","emitEvent","authClient","interactionHandler","navigateUrl","getRedirectStartPage","responseHash","getRedirectResponseHash","loginRequestUrl","loginRequestUrlNormalized","currentUrlNormalized","handleHash","handleHashResult","processHashOnRedirect","homepage","navigateInternal","e_2","cachedHash","nativeInteractionClient","finally","currentAuthority","logoutUri","requestStartPage","PopupClient","unloadWindow","popupName","generatePopupName","popupWindowAttributes","asyncPopups","acquireTokenPopupAsync","popup","openSizedPopup","generateLogoutPopupName","mainWindowRedirectUri","logoutPopupAsync","fetchNativeAccountIdMeasurement","popupParameters","popupWindow","monitorPopupForHash","state_1","E","openPopup","waitForLogoutPopup","absoluteUrl","maxTicks","windowHashTimeout","pollIntervalMilliseconds","ticks","intervalId","setInterval","closed","cleanPopup","clearInterval","urlNavigate","popupParams","assign","focus","currentWindow","winLeft","screenLeft","screenX","winTop","screenTop","screenY","winWidth","innerWidth","documentElement","clientWidth","winHeight","innerHeight","clientHeight","width","popupSize","height","top","popupPosition","left","max","preventDefault","StubbedNetworkModule","NavigationClient","defaultNavigateWindow","DEFAULT_IFRAME_TIMEOUT_MS","SilentHandler","navigateFrameWait","loadFrame","loadFrameSync","monitorIframeForHash","iframe","timeoutMark","performance","removeHiddenIframe","contentHash","frameHandle","createHiddenIframe","src","authFrame","createElement","className","style","visibility","position","border","setAttribute","getElementsByTagName","appendChild","parentNode","removeChild","SilentIframeClient","silentTokenHelper","silentHandler","msalFrame","iframeHashTimeout","SilentRefreshClient","createRefreshTokenClient","refreshTokenClient","EventHandler","eventCallbacks","listeningToStorageEvents","handleAccountCacheChange","addEventCallback","callback","callbackId","removeEventCallback","enableAccountStorageEvents","disableAccountStorageEvents","eventType","message_1","cacheValue","newValue","oldValue","parsedValue","JoseHeaderError","createMissingKidError","JoseHeaderErrorMessage","createMissingAlgError","JoseHeader","typ","alg","getShrHeaderString","shrHeaderOptions","shrHeader","MathUtils","decimalToHex","num","hex","GuidGenerator","generateGuid","buffer","Uint8Array","getRandomValues","guidHolder","guidResponse","random","isGuid","guid","BrowserStringUtils","stringToUtf8Arr","sDOMStr","nChr","nArrLen","nStrLen","nMapIdx","charCodeAt","aBytes","nIdx","nChrIdx","stringToArrayBuffer","dataString","ArrayBuffer","dataView","utf8ArrToString","sView","nPart","nLen","String","fromCharCode","getSortedObjectString","sort","Base64Encode","urlEncode","encode","urlEncodeArr","inputArr","base64EncArr","inputUtf8Arr","eqLen","sB64Enc","nMod3","nUint24","uint6ToB64","nUint6","Base64Decode","encodedString","base64DecToArr","base64String","nBlockSize","nInLen","nOutLen","ceil","nMod4","nOutIdx","nInIdx","b64ToUint6","charNum","PkceGenerator","generateCodes","generateCodeVerifier","generateCodeChallengeFromVerifier","pkceCodeVerifier","sha256Digest","pkceHashedCodeVerifier","ModernBrowserCrypto","dataBuffer","algorithm","extractable","keyUsages","subtle","exportKey","importKey","keyData","sign","digest","MsrBrowserCrypto","initPrng","entropy","msrCrypto","MsBrowserCrypto","msCrypto","msGenerateKey","msExportKey","resultBuffer","resultString","keyString","keyBuffer","msImportKey","msSign","digestOperation","S256_HASH_ALG","PUBLIC_EXPONENT","BrowserCrypto","cryptoOptions","hasBrowserCrypto","subtleCrypto","hasIECrypto","hasMsrCrypto","useMsrCrypto","keygenAlgorithmOptions","modulusLength","publicExponent","generateKeyPair","usages","exportJwk","importJwk","DatabaseStorage","dbName","tableName","dbOpen","openDB","indexedDB","createObjectStore","db","closeConnection","validateDbIsOpen","dbGet","transaction","objectStore","dbPut","put","dbDelete","dbGetKeys","getAllKeys","dbContainsKey","count","deleteDatabase","deleteDbRequest","AsyncMemoryStorage","storeName","inMemoryCache","indexedDBCache","handleDatabaseAccessError","e_5","clearInMemory","clearPersistent","dbDeleted","e_6","asymmetricKeys","symmetricKeys","CryptoKeyStore","CryptoOps","cryptoConfig","b64Encode","b64Decode","guidGenerator","pkceGenerator","publicKeyThumbMeasurement","EXTRACTABLE","POP_KEY_USAGES","keyPair","publicKey","publicKeyJwk","pubKeyThumprintObj","kty","publicJwkString","publicJwkHash","privateKey","privateKeyJwk","unextractablePrivateKey","requestMethod","requestUri","signJwtMeasurement","cachedKeyPair","publicKeyJwkString","encodedKeyIdThumbprint","encodedShrHeader","jwk","encodedPayload","tokenString","tokenBuffer","signatureBuffer","encodedSignature","signedJwt","plainText","hashBuffer","hashBytes","PerformanceClient","libraryName","libraryVersion","applicationTelemetry","callbacks","eventsByCorrelationId","queueMeasurements","preQueueTimeByCorrelationId","startPerformanceMeasurement","measureName","startPerformanceMeasuremeant","getIntFields","getPreQueueTime","eventName","preQueueEvent","calculateQueuedTime","preQueueTime","queueTime","manuallyCompleted","queueMeasurement","existingMeasurements","measurementArray","eventCorrelationId","generateId","performanceMeasurement","inProgressEvent","eventId","startTimeMs","cacheEventByCorrelationId","discardMeasurements","fields","increment","counters","measurement","rootEvent","isRoot","queueInfo","totalQueueTime","totalQueueCount","manuallyCompletedCount","getQueueInfo","discardCache","incompleteSubMeasurements","durationMs","flushMeasurement","finalEvent","incompleteSubsCount","subMeasurement","queuedTimeMs","queuedCount","queuedManuallyCompletedCount","truncateIntegralFields","emitEvents","counter","queueMeasurementForCorrelationId","addPerformanceCallback","removePerformanceCallback","events","intFields","BrowserPerformanceMeasurement","makeMeasureName","startMark","makeStartMark","endMark","makeEndMark","supportsBrowserPerformance","mark","measure","clearMarks","clearMeasures","getEntriesByName","flushMeasurements","measurements","entriesForMeasurement","duration","BrowserPerformanceClient","getPageVisibility","visibilityState","deleteIncompleteSubMeasurements","isRootEvent","incompleteMeasurements","supportsBrowserPerformanceNow","startPageVisibility","res","endPageVisibility","resQueueTime","StubPerformanceMeasurement","StubPerformanceClient","TokenCache","storage","loadExternalTokens","cacheRecordAccount","loadIdToken","loadAccessToken","loadRefreshToken","loadAccount","requestHomeAccountId","HybridSpaAuthorizationCodeClient","SilentAuthCodeClient","cloudInstanceHostName","ClientApplication","userInputAuth","userInputCache","userInputSystem","userInputTelemetry","DEFAULT_AUTH_OPTIONS","DEFAULT_LOGGER_OPTIONS","DEFAULT_BROWSER_SYSTEM_OPTIONS","loadFrameTimeout","nativeBrokerHandshakeTimeout","providedSystemOptions","redirectResponse","hybridAuthCodeResponses","nativeCacheOptions","nativeInternalStorage","trackPageVisibilityWithMeasurement","initialize","initMeasurement","claimsTokensRemovalMeasurement","loggedInAccounts","redirectResponseKey","nativeClient","redirectClient","createRedirectClient","getRequestCorrelationId","preflightBrowserEnvironmentCheck","isLoggedIn","canUseNative","getNativeAccountId","atPopupMeasurement","acquireTokenNative","createPopupClient","accessTokenSize","idTokenSize","ssoSilentMeasurement","acquireTokenByCodeAsyncMeasurement","visibilityChangeCount","createSilentIframeClient","silentIframeClient","atbcMeasurement","hybridAuthCode_1","acquireTokenByCodeAsync","createSilentAuthCodeClient","tokenRenewalError","acquireTokenFromCache","commonRequest","cacheLookupPolicy","silentRefreshClient","createSilentRefreshClient","acquireTokenBySilentIframe","logoutRedirect","getAccountByUsername","getAccountByHomeId","getAccountByLocalId","preflightInteractiveRequest","createSilentCacheClient","getTokenCache","getLogger","setLogger","initializeWrapperLibrary","setNavigationClient","getConfiguration","PublicClientApplication","astsAsyncMeasurement","activeSilentTokenRequests","trackPageVisibility","loginRedirect","loginPopup","acquireTokenSilent","silentRequestKey","cachedResponse","acquireTokenSilentAsync","__awaiter","silentRequest_1","requestWithCLP_1","cacheError","refreshTokenError","isServerError","rtNotFound","isInvalidGrantError","stubbedPublicClientApplication","EventMessageUtils","getInteractionStatusFromEvent","currentStatus","SignedHttpRequest","shrOptions","cryptoOps","generatePublicKeyThumbprint","signRequest","publicKeyThumbprint","removeKeys","AuthenticationHeaderParser","getShrNonce","authenticationInfo","authenticationInfoChallenges","parseChallenges","nextnonce","wwwAuthenticate","wwwAuthenticateChallenges","schemeSeparator","challenges","substr","challengeMap","unescape","esCompat","__esModule","default","A","DEFAULT_INTL_CONFIG","He","IntlError","Ne","IntlErrorCode","Re","IntlFormatError","De","InvalidConfigError","xe","MessageFormatError","Ue","MissingDataError","Me","MissingTranslationError","Le","UnsupportedFormatterError","Pe","createFormatters","qe","createIntl","gt","createIntlCache","Be","defineMessage","yt","defineMessages","mt","filterProps","Fe","formatDate","Je","formatDateToParts","Ze","formatDisplayName","nt","formatList","it","formatMessage","Ye","formatNumber","pt","formatNumberToParts","ft","formatPlural","ct","formatRelativeTime","lt","formatTime","Xe","formatTimeToParts","et","getNamedFormat","ze","extendStatics","b","__proto__","TypeError","__","constructor","create","arguments","__spreadArray","to","from","pack","ar","memoize","fn","cacheDefault","serializer","serializerDefault","strategy","strategyDefault","monadic","arg","computedValue","variadic","args","assemble","context","serialize","ErrorKind","TYPE","SKELETON_TYPE","ObjectWithoutPrototypeCache","strategies","isLiteralElement","el","literal","isArgumentElement","argument","isNumberElement","number","isDateElement","date","isTimeElement","isSelectElement","select","isPluralElement","plural","isPoundElement","pound","isTagElement","tag","isNumberSkeleton","isDateTimeSkeleton","dateTime","EXPECT_ARGUMENT_CLOSING_BRACE","EMPTY_ARGUMENT","MALFORMED_ARGUMENT","EXPECT_ARGUMENT_TYPE","INVALID_ARGUMENT_TYPE","EXPECT_ARGUMENT_STYLE","INVALID_NUMBER_SKELETON","INVALID_DATE_TIME_SKELETON","EXPECT_NUMBER_SKELETON","EXPECT_DATE_TIME_SKELETON","UNCLOSED_QUOTE_IN_ARGUMENT_STYLE","EXPECT_SELECT_ARGUMENT_OPTIONS","EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE","INVALID_PLURAL_ARGUMENT_OFFSET_VALUE","EXPECT_SELECT_ARGUMENT_SELECTOR","EXPECT_PLURAL_ARGUMENT_SELECTOR","EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT","EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT","INVALID_PLURAL_ARGUMENT_SELECTOR","DUPLICATE_PLURAL_ARGUMENT_SELECTOR","DUPLICATE_SELECT_ARGUMENT_SELECTOR","MISSING_OTHER_CLAUSE","INVALID_TAG","INVALID_TAG_NAME","UNMATCHED_CLOSING_TAG","UNCLOSED_TAG","SPACE_SEPARATOR_REGEX","DATE_TIME_REGEX","parseDateTimeSkeleton","skeleton","len","era","year","RangeError","month","day","weekday","hour12","hourCycle","hour","minute","second","timeZoneName","WHITE_SPACE_REGEX","icuUnitToEcma","unit","FRACTION_PRECISION_REGEX","SIGNIFICANT_PRECISION_REGEX","INTEGER_WIDTH_REGEX","CONCISE_INTEGER_WIDTH_REGEX","parseSignificantPrecision","roundingPriority","_","g1","g2","minimumSignificantDigits","maximumSignificantDigits","parseSign","signDisplay","currencySign","parseConciseScientificAndEngineeringStem","stem","notation","minimumIntegerDigits","parseNotationOptions","opt","parseNumberSkeleton","tokens","_i","tokens_1","token","scale","currency","useGrouping","maximumFractionDigits","compactDisplay","currencyDisplay","unitDisplay","parseFloat","roundingMode","g3","g4","g5","minimumFractionDigits","trailingZeroDisplay","signOpts","conciseScientificAndEngineeringOpts","timeData","AC","AD","AE","AF","AG","AI","AL","AM","AO","AR","AS","AT","AU","AW","AX","AZ","BA","BB","BD","BE","BF","BG","BH","BI","BJ","BL","BM","BN","BO","BQ","BR","BS","BT","BW","BY","BZ","CA","CC","CD","CF","CG","CH","CI","CK","CL","CM","CN","CO","CP","CR","CU","CV","CW","CX","CY","CZ","DE","DG","DJ","DK","DM","DO","DZ","EA","EC","EE","EG","EH","ER","ES","ET","FI","FJ","FK","FM","FO","FR","GA","GB","GD","GE","GF","GG","GH","GI","GL","GM","GN","GP","GQ","GR","GT","GU","GW","GY","HK","HN","HR","HU","IC","ID","IE","IL","IM","IN","IO","IQ","IR","IS","IT","JE","JM","JO","JP","KE","KG","KH","KI","KM","KN","KP","KR","KW","KY","KZ","LA","LB","LC","LI","LK","LR","LS","LT","LU","LV","LY","MA","MC","MD","ME","MF","MG","MH","MK","ML","MM","MN","MO","MP","MQ","MR","MS","MT","MU","MV","MW","MX","MY","MZ","NA","NC","NE","NF","NG","NI","NL","NO","NP","NR","NU","NZ","OM","PA","PE","PF","PG","PH","PK","PL","PM","PN","PR","PS","PT","PW","PY","QA","RE","RO","RS","RU","RW","SA","SB","SC","SD","SE","SG","SH","SI","SJ","SK","SL","SM","SN","SO","SR","SS","ST","SV","SX","SY","SZ","TA","TC","TD","TF","TG","TH","TJ","TL","TM","TN","TO","TR","TT","TW","TZ","UA","UG","UM","US","UY","UZ","VA","VC","VE","VG","VI","VN","VU","WF","WS","XK","YE","YT","ZA","ZM","ZW","getDefaultHourSymbolFromLocale","locale","hourCycles","regionTag","languageTag","language","maximize","SPACE_SEPARATOR_START_REGEX","SPACE_SEPARATOR_END_REGEX","createLocation","start","end","hasNativeStartsWith","hasNativeFromCodePoint","fromCodePoint","hasNativeFromEntries","hasNativeCodePointAt","codePointAt","hasTrimStart","trimStart","hasTrimEnd","trimEnd","isSafeInteger","isFinite","abs","REGEX_SUPPORTS_U_AND_Y","matchIdentifierAtIndex","codePoints","elements","entries_1","k","v","first","flag","IDENTIFIER_PREFIX_RE_1","lastIndex","_isWhiteSpace","_isPatternSyntax","ErrorCode","Parser","line","column","ignoreTag","requiresOtherClause","shouldParseSkeletons","parseMessage","nestingLevel","parentArgType","expectingCloseTag","isEOF","char","parseArgument","peek","clonePosition","_isAlpha","parseTag","parseLiteral","bump","startPosition","tagName","parseTagName","bumpSpace","bumpIf","childrenResult","children","endTagStartPosition","closingTagNameStartPosition","startOffset","_isPotentialElementNameChar","parseQuoteResult","tryParseQuote","parseUnquotedResult","tryParseUnquoted","parseLeftAngleResult","tryParseLeftAngleBracket","codepoint","ch","openingBracePosition","parseIdentifierIfPossible","parseArgumentOptions","startingPosition","endOffset","bumpTo","typeStartPosition","argType","typeEndPosition","styleAndLocation","styleStartPosition","parseSimpleArgStyleIfPossible","styleLocation","argCloseResult","tryParseArgumentClose","location_1","parseNumberSkeletonFromString","dateTimePattern","skeletonCopy","patternPos","patternChar","extraLength","hourLen","dayPeriodLen","hourChar","parsedOptions","typeEndPosition_1","identifierAndLocation","pluralOffset","tryParseDecimalInteger","optionsResult","tryParsePluralOrSelectOptions","location_2","pluralType","nestedBraces","apostrophePosition","bumpUntil","stringTokens_1","x","stemAndOptions","options_1","expectCloseTag","parsedFirstIdentifier","hasOtherClause","parsedSelectors","selector","selectorLocation","fragmentResult","expectNumberError","invalidNumberError","hasDigits","decimal","kind","prefix","currentOffset","targetOffset","nextCode","pruneLocation","els","opts","SyntaxError","originalMessage","captureLocation","MISSING_VALUE","INVALID_VALUE","MISSING_INTL_API","PART_TYPE","FormatError","msg","InvalidValueError","variableId","InvalidValueTypeError","MissingValueError","isFormatXMLElementFn","formatToParts","locales","formatters","formats","currentPluralValue","els_1","getNumberFormat","format","varName","object","getDateTimeFormat","medium","value_1","formatFn","chunks","isArray","other","Intl","PluralRules","rule","getPluralRules","part","lastPart","createFastMemoizeCache","store","IntlMessageFormat","overrideFormats","defaultLocale","defaultConfig","configs","formatterCache","pluralRules","ast","resolvedOptions","resolvedLocale","NumberFormat","supportedLocalesOf","getAst","resolveLocale","__parse","parseOpts","getOwnPropertySymbols","propertyIsEnumerable","c1","c2","DateTimeFormat","memoizedDefaultLocale","Locale","supportedLocales","integer","percent","short","long","full","FORMAT_ERROR","UNSUPPORTED_FORMATTER","INVALID_CONFIG","MISSING_DATA","MISSING_TRANSLATION","exception","stack","captureStackTrace","descriptor","defaultMessage","props","allowlist","defaults","filtered","messages","timeZone","defaultFormats","fallbackOnEmptyString","onError","onWarn","relativeTime","list","displayNames","RelativeTimeFormat","ListFormat","DisplayNames","getMessageFormat","getRelativeTimeFormat","getListFormat","getDisplayNames","formatType","setTimeZoneInOptions","deepMergeOptions","opts1","opts2","deepMergeFormatsAndSetTimeZone","f1","mfFormats","messageDescriptor","defaultRichTextElements","msgId","condition","Err","DATE_TIME_FORMAT_OPTIONS","getFormatter","filteredOptions","timeStyle","dateStyle","formatDateTimeRange","fromDate","toDate","formatRange","DISPLAY_NAMES_OPTONS","of","LIST_FORMAT_OPTIONS","results","formatListToParts","richValues_1","serializedValues","PLURAL_FORMAT_OPTIONS","RELATIVE_TIME_FORMAT_OPTIONS","NUMBER_FORMAT_OPTIONS","resolvedConfig","$t","msgs","global","__pretenderNodePolyfill","self","afterMain","S","afterRead","afterWrite","applyStyles","P","arrow","Q","auto","basePlacements","beforeMain","beforeRead","y","beforeWrite","w","bottom","clippingParents","computeStyles","ne","createPopper","createPopperBase","Oe","createPopperLite","detectOverflow","ye","eventListeners","oe","flip","ve","hide","Ee","main","modifierPhases","C","Se","placements","popper","popperGenerator","popperOffsets","we","preventOverflow","Te","read","reference","f","right","variationPlacements","viewport","write","T","acc","placement","getNodeName","element","nodeName","getWindow","node","ownerDocument","defaultView","isElement","Element","isHTMLElement","HTMLElement","isShadowRoot","ShadowRoot","modifiers_applyStyles","enabled","phase","_ref","styles","attributes","removeAttribute","effect","_ref2","initialStyles","margin","property","attribute","requires","getBasePlacement","getUAString","uaData","userAgentData","brands","brand","isLayoutViewport","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","offsetWidth","offsetHeight","visualViewport","addVisualOffsets","offsetLeft","offsetTop","getLayoutRect","contains","child","rootNode","getRootNode","next","isSameNode","getComputedStyle","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","currentNode","css","transform","perspective","contain","willChange","getMainAxisFromPlacement","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","modifiers_arrow","_state$modifiersData$","arrowElement","modifiersData","basePlacement","axis","padding","rects","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","center","axisProp","centerOffset","_options$element","querySelector","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","_ref4","dpr","devicePixelRatio","modifiers_computeStyles","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","instance","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","pageXOffset","scrollTop","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","_element$ownerDocumen","isBody","updatedList","rectToClientRect","rect","getClientRectFromMixedType","clippingParent","html","layoutViewport","clientTop","clientLeft","winScroll","scrollWidth","scrollHeight","direction","computeOffsets","commonX","commonY","mainAxis","_options","_options$placement","_options$strategy","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","mainClippingParents","clipperElement","firstClippingParent","clippingRect","accRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","modifiers_flip","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","flipVariations","allowedAutoPlacements","preferredPlacement","oppositePlacement","_options$allowedAutoP","allPlacements","allowedPlacements","overflows","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","check","_loop","fittingPlacement","find","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","side","modifiers_hide","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","modifiers_offset","_options$offset","invertDistance","skidding","distance","_data$state$placement","modifiers_popperOffsets","modifiers_preventOverflow","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","order","modifiers","visited","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","_key","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","current","existing","_ref$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","destroy","onFirstUpdate","BrowserClient","core","parentSpanIsAlwaysRootSpan","sdkSource","helpers","WINDOW","SENTRY_SDK_SOURCE","getSDKSource","applySdkMetadata","super","sendClientReports","_flushOutcomes","eventFromException","hint","eventbuilder","stackParser","attachStacktrace","eventFromMessage","captureUserFeedback","feedback","_isEnabled","debugBuild","DEBUG_BUILD","warn","envelope","userfeedback","createUserFeedbackEnvelope","getSdkMetadata","dsn","getDsn","tunnel","getOptions","sendEnvelope","_prepareEvent","platform","__SENTRY_DEBUG__","exceptionFromError","ex","frames","parseStackFrames","extractType","extractMessage","stacktrace","eventFromError","skipLines","reactMinifiedRegexp","framesToPop","isWebAssemblyException","WebAssembly","Exception","eventFromUnknownInput","syntheticException","isUnhandledRejection","isErrorEvent","isDOMError","isDOMException","domException","eventFromString","addExceptionTypeValue","tags","isError","isPlainObject","isEvent","client","getClient","normalizeDepth","errorFromProp","prop","extra","__serialized__","normalizeToSize","getNonErrorObjectExceptionValue","addExceptionMechanism","synthetic","isParameterizedString","__sentry_template_string__","__sentry_template_values__","logentry","extractExceptionKeysForMessage","captureType","getPrototypeOf","event_id","resolvedSyncPromise","feedbackAsyncIntegration","buildFeedbackIntegration","lazyLoadIntegration","feedbackSyncIntegration","getModalIntegration","feedbackModalIntegration","getScreenshotIntegration","feedbackScreenshotIntegration","GLOBAL_OBJ","ignoreOnError","shouldIgnoreOnError","wrap","wrapper","__sentry_wrapped__","getOriginalFunction","sentryWrapped","wrappedArguments","withScope","addEventProcessor","mechanism","captureException","e2","markFunctionWrapped","addNonEnumerableProperty","getOwnPropertyDescriptor","e3","I","R","O","N","M","SDK_VERSION","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","Scope","addBreadcrumb","addIntegration","addTracingExtensions","captureConsoleIntegration","captureEvent","captureFeedback","captureMessage","captureSession","continueTrace","createTransport","debugIntegration","dedupeIntegration","endSession","extraErrorDataIntegration","flush","functionToStringIntegration","getActiveSpan","getCurrentHub","getCurrentScope","getGlobalScope","getIsolationScope","getRootSpan","getSpanDescendants","getSpanStatusFromHttpCode","inboundFiltersIntegration","isInitialized","lastEventId","makeMultiplexedTransport","moduleMetadataIntegration","parameterize","registerSpanErrorInstrumentation","rewriteFramesIntegration","sessionTimingIntegration","setContext","setCurrentClient","setExtra","setExtras","setHttpStatus","setMeasurement","setTag","setTags","setUser","spanToBaggageHeader","spanToJSON","spanToTraceHeader","startInactiveSpan","startNewTrace","startSession","startSpan","startSpanManual","suppressTracing","thirdPartyErrorFilterIntegration","updateSpanName","withActiveSpan","withIsolationScope","zodErrorsIntegration","makeFetchTransport","chromeStackLineParser","defaultStackLineParsers","defaultStackParser","geckoStackLineParser","opera10StackLineParser","opera11StackLineParser","winjsStackLineParser","forceLoad","getDefaultIntegrations","init","onLoad","showReportDialog","breadcrumbsIntegration","globalHandlersIntegration","httpContextIntegration","linkedErrorsIntegration","browserApiErrorsIntegration","reportingObserverIntegration","httpClientIntegration","contextLinesIntegration","getReplay","replayIntegration","replayCanvasIntegration","feedbackIntegration","getFeedback","sendFeedback","metrics","defaultRequestInstrumentationOptions","instrumentOutgoingRequests","browserTracingIntegration","startBrowserTracingNavigationSpan","startBrowserTracingPageLoadSpan","makeBrowserOfflineTransport","browserProfilingIntegration","spotlightBrowserIntegration","browserSessionIntegration","featureFlagsIntegration","buildLaunchDarklyFlagUsedHandler","launchDarklyIntegration","OpenFeatureIntegrationHook","openFeatureIntegration","defineIntegration","_breadcrumbsIntegration","console","dom","sentry","setup","addConsoleInstrumentationHandler","handlerData","breadcrumb","category","severityLevelFromString","safeJoin","browserUtils","addClickKeypressInstrumentationHandler","componentName","keyAttrs","serializeAttribute","maxStringLength","htmlTreeAsString","getComponentName","addXhrInstrumentationHandler","startTimestamp","endTimestamp","sentryXhrData","SENTRY_XHR_DATA_KEY","status_code","getBreadcrumbLogLevelFromHttpStatusCode","addFetchInstrumentationHandler","fetchData","addHistoryInstrumentationHandler","parsedLoc","parseUrl","parsedFrom","parsedTo","path","protocol","relative","on","getEventDescription","DEFAULT_EVENT_TARGET","_browserApiErrorsIntegration","eventTarget","requestAnimationFrame","setupOnce","fill","_wrapTimeFunction","_wrapRAF","_wrapXHR","eventTargetOption","_wrapEventTarget","original","originalCallback","function","getFunctionName","handled","handler","originalSend","wrapOptions","originalFunction","targetObj","proto","handleEvent","originalRemoveEventListener","originalEventHandler","ignoreDuration","_contextLinesIntegration","contextLines","frameContextLines","processEvent","doc","htmlFilename","stripUrlQueryAndFragment","exceptions","innerHTML","htmlLines","frame","linesOfContext","filename","lineno","addContextToFrame","_hint","_client","featureFlags","copyFlagsFromScopeToEvent","addFeatureFlag","insertFlagToScope","synchronous","flagKey","flagDetail","_context","after","_hookContext","evaluationDetails","hookContext","_error","_hookHints","defaultValue","_globalHandlersIntegration","onunhandledrejection","stackTraceLimit","addGlobalErrorInstrumentationHandler","ev","ev0","ev0s","ev0sf","colno","isString","getLocationHref","UNKNOWN_FUNCTION","in_app","originalException","globalHandlerLog","addGlobalUnhandledRejectionInstrumentationHandler","isPrimitive","reason","detail","_httpClientIntegration","failedRequestStatusCodes","failedRequestTargets","supportsNativeFetch","virtualError","requestInfo","requestInit","_shouldCaptureResponse","Request","bodyUsed","requestHeaders","responseHeaders","requestCookies","responseCookies","_shouldSendDefaultPii","_parseCookieHeaders","_createEvent","request_headers","responseURL","cookieString","getResponseHeader","_parseCookieString","e4","cookieHeader","cookies","_getResponseSizeFromHeaders","contentLength","range","givenRequestTarget","isSentryRequestUrl","virtualStackTrace","contexts","body_size","Boolean","sendDefaultPii","preprocessEvent","referrer","Referer","_linkedErrorsIntegration","limit","applyAggregateErrorsToEvent","maxValueLength","SETUP_CLIENTS","WeakMap","_reportingObserverIntegration","types","reports","report","plainBody","crashId","supportsReportingObserver","ReportingObserver","buffered","observe","_spotlightIntegration","sidecarUrl","spans","op","afterAllSetup","makeFetch","getNativeImplementation","failCount","serializeEnvelope","mode","BrowserMetricsAggregator","distribution","gauge","timing","_browserProfilingIntegration","activeSpan","rootSpan","utils","isAutomatedPageLoadSpan","shouldProfileSpan","startProfileForSpan","span","getActiveProfilesCount","profiledTransactionEvents","findProfiledTransactionsFromEnvelope","profilesToAddToEnvelope","profiledTransaction","profile_id","profile","start_timestamp","takeProfileFromGlobalCache","profileEvent","createProfilingEvent","addProfilesToEnvelope","timestampInSeconds","profiler","startJSSelfProfile","profileId","uuid4","async","onProfileHandler","stop","maxDurationTimeoutID","addProfileToGlobalCache","MAX_PROFILE_DURATION_MS","originalEnd","MS_TO_NS","THREAD_ID_STRING","OS_PLATFORM","OS_PLATFORM_VERSION","OS_ARCH","OS_BROWSER","OS_MODEL","OS_LOCALE","languages","enrichWithThreadInformation","EMPTY_STACK_ID","STACK_ID","samples","stacks","thread_metadata","firstSample","timeOrigin","browserPerformanceTimeOrigin","adjustForOriginChange","jsSample","stackId","elapsed_since_start_ns","toFixed","stack_id","thread_id","stackTop","frameId","abs_path","resourceId","resources","parentId","sample","applyDebugMetadata","resource_paths","getDebugImagesForResources","getHighEntropyValues","architecture","model","platformVersion","fullVersionList","firstUa","PROFILING_CONSTRUCTOR_FAILED","PROFILE_MAP","last","profiles","processed_profile","enrichedThreadProfile","transactionStartMs","transactionEndMs","toISOString","release","DEFAULT_ENVIRONMENT","runtime","build_number","device","manufacturer","is_emulator","debug_meta","images","transactions","active_thread_id","relative_start_ns","relative_end_ns","forEachEnvelopeItem","j","isRecording","profilesSampleRate","rate","isNaN","JSProfilerConstructor","Profiler","maxSamples","sampleInterval","maxBufferSize","integrations","browserapierrors","breadcrumbs","globalhandlers","linkederrors","httpcontext","autoSessionTracking","browsersession","browserOptions","optionsArg","defaultIntegrations","__SENTRY_RELEASE__","SENTRY_RELEASE","skipBrowserExtensionCheck","windowWithMaybeExtension","extensionObject","chrome","runtimeId","isDedicatedExtensionPage","isNWjs","nw","consoleSandbox","supportsFetch","clientOptions","stackParserFromStackParserOptions","stackParsers","getIntegrationsToSetup","transport","initAndBind","user","getUser","script","crossOrigin","getReportDialogEndpoint","onClose","reportDialogClosedMessageHandler","injectionPoint","head","createFrame","func","chromeRegexNoFnName","chromeRegex","chromeEvalRegex","noFnParts","col","subMatch","extractSafariExtensionDetails","geckoREgex","geckoEvalRegex","winjsRegex","opera10Regex","opera11Regex","createStackParser","isSafariExtension","isSafariWebExtension","hidden","cancelledStatus","setStatus","SPAN_STATUS_ERROR","DEFAULT_BROWSER_TRACING_OPTIONS","TRACING_DEFAULTS","instrumentNavigation","instrumentPageLoad","markBackgroundSpan","enableLongTask","enableLongAnimationFrame","enableInp","_experiments","spanOptions","traceOptions","emit","setTransactionName","setPropagationContext","generateTraceId","getMetaContent","metaName","metaTag","getDomElement","getAttribute","enableInteractions","enableStandaloneClsSpans","beforeStartSpan","idleTimeout","finalTimeout","childSpanTimeout","traceFetch","traceXHR","trackFetchStreamPerformance","shouldCreateSpanForRequest","enableHTTPTimings","_collectWebVitals","startTrackingWebVitals","recordClsStandaloneSpans","startTrackingINP","PerformanceObserver","supportedEntryTypes","startTrackingLongAnimationFrames","startTrackingLongTasks","startTrackingInteractions","latestRoute","_createRouteSpan","startSpanOptions","isPageloadTransaction","finalStartSpanOptions","idleSpan","startIdleSpan","disableAutoFinish","beforeSpanEnd","addPerformanceEntries","recordClsOnPageloadSpan","emitFinish","readyState","startingUrl","maybeEndActiveSpan","sentryTrace","baggage","propagationContext","propagationContextFromHeaders","oldPropagationContext","getPropagationContext","sampled","spanIsSampled","dsc","getDynamicSamplingContextFromSpan","startTime","backgroundtab","registerBackgroundTabDetection","inflightInteractionSpan","registerInteractionTransaction","currentRootSpanOp","SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON","once","capture","registerInpInteractionListener","tracePropagationTargets","responseToSpanId","spanIdToEndTimestamp","addHTTPTimings","cleanup","addPerformanceInstrumentationHandler","entryType","nextHopProtocol","initiatorType","resourceTiming","_name","timingSpanData","getAbsoluteTime","redirectStart","fetchStart","domainLookupStart","domainLookupEnd","connectStart","secureConnectionStart","connectEnd","requestStart","responseStart","responseEnd","getFullURL","URL","shouldCreateSpan","shouldAttachHeadersWithTargets","targetUrl","resolvedUrl","currentOrigin","isSameOriginRequest","stringMatchesSomePattern","isRelativeSameOriginRequest","updatedTimestamp","span_id","addFetchEndInstrumentationHandler","createdSpan","instrumentFetchRequest","__span","fullUrl","setAttributes","shouldAttachHeaders","__sentry_own_request__","shouldCreateSpanResult","hasTracingEnabled","spanId","__sentry_xhr_span_id__","hasParent","SentryNonRecordingSpan","spanContext","getTraceData","sentryTraceHeader","sentryBaggageHeader","nativeFetch","pendingBodySize","pendingCount","requestSize","requestOptions","referrerPolicy","keepalive","fetchOptions","clearCachedImplementation","rejectedSyncPromise","statusCode","promisifyRequest","oncomplete","onsuccess","onabort","createIndexedDbStore","getStore","onupgradeneeded","dbp","serialized","maxQueueSize","unshift","deserialized","firstKey","parseEnvelope","createStore","makeOfflineTransport","sent_at","sdk","dsnToString","createEnvelope","flagContext","getScopeData","flags","flagBuffer","maxSize","scopeContexts","findIndex","LazyLoadableIntegrations","WindowWithMaybeIntegration","scriptNonce","bundle","sentryOnWindow","Sentry","baseURL","cdnBaseUrl","waitForLoad","currentScript","parentElement","integrationFn","getBaseApiEndpoint","port","getEnvelopeEndpointWithUrlEncodedAuth","sdkInfo","projectId","sentry_version","sentry_key","sentry_client","URLSearchParams","dsnLike","dialogOptions","dsn$1","makeDsn","encodedOptions","getAsyncContextStrategy","carrier$1","carrier","getSentryCarrier","acs","stackStrategy","getStackAsyncContextStrategy","setAsyncContextStrategy","registry","getMainCarrier","AsyncContextStack","scope$1","isolationScope","assignedScope","assignedIsolationScope","_stack","_isolationScope","_pushScope","maybePromiseResult","_popScope","is","isThenable","getStackTop","getScope","pop","getAsyncContextStack","defaultScopes","getDefaultCurrentScope","getDefaultIsolationScope","withSetScope","withSetIsolationScope","ALREADY_SEEN_ERROR","isTransactionEvent","_integrations","_numProcessing","_outcomes","_hooks","_eventProcessors","_dsn","api","_metadata","_transport","recordDroppedEvent","transportOptions","undefinedOption","option","misc","checkOrSetAlreadyCaught","hintWithEventId","_process","_captureEvent","currentScope","eventMessage","promisedEvent","capturedSpanScope","sdkProcessingMetadata","session$1","sendSession","session","updateSession","getTransport","_isClientDoneProcessing","clientFinished","transportFlushed","syncpromise","getEventProcessors","eventProcessor","_setupIntegrations","getIntegrationByName","integrationName","integration$1","isAlreadyInstalled","integration","setupIntegration","afterSetupIntegrations","sendEvent","createEventEnvelope","attachment","attachments","envelope$1","addItemToEnvelope","createAttachmentEnvelopeItem","promise","sendResponse","createSessionEnvelope","eventOrCount","hook","hooks","cbIndex","rest","setupIntegrations","_updateSessionFromEvent","crashed","errored","sessionNonTerminal","SyncPromise","ticked","interval","setLastEventId","prepareEvent","evt","getTraceContextFromScope","dynamicSamplingContext$1","dynamicSamplingContext","getDynamicSamplingContextFromScope","_processEvent","sentryError","sampleRate","isTransaction","beforeSendLabel","parsedSampleRate","parseSampleRate","SentryError","dataCategory","capturedSpanIsolationScope","prepared","__sentry__","beforeSend","beforeSendTransaction","beforeSendSpan","processedSpans","processedSpan","spanUtils","showSpanDropWarning","spanCountBefore","spanCountBeforeProcessing","beforeSendResult","invalidValueError","processedEvent","spanCount","getSession","droppedSpanCount","transactionInfo","transaction_info","_clearOutcomes","outcomes","quantity","clientreport","createClientReportEnvelope","DEFAULT_BREADCRUMBS","beforeBreadcrumb","maxBreadcrumbs","mergedBreadcrumb","dateTimestampInSeconds","finalBreadcrumb","__SENTRY__","worldwide","createCheckInEnvelope","checkIn","dropUndefinedKeys","getGlobalSingleton","parentSpanId","parent_span_id","getSdkMetadataForEnvelopeHeader","packages","envelopeHeaders","createEventEnvelopeHeaders","eventItem","envelopeItem","toJSON","createSpanEnvelope","public_key","convertToSpanJSON","spanJson","items","createSpanEnvelopeItem","notifyEventProcessors","processors","processor","final","captureCheckIn","upsertMonitorConfig","closeSession","_sendSessionUpdate","setSession","parseEventHintOrCaptureContext","captureContext","isEnabled","extras","constants","makeSession","currentSession","withMonitor","monitorSlug","checkInId","finishCheckIn","associatedEventId","feedbackEvent","contact_email","associated_event_id","_addTracingHeadersToFetchRequest","fetchOptionsObj","traceHeaders","traceData","isInstanceOf","newHeaders","prevBaggageHeader","prevHeaderStrippedFromSentryBaggage","stripBaggageHeaderOfSentryBaggageValues","headerValue","existingBaggageHeader","newBaggageHeaders","headerItem","baggageHeader","baggageEntry","SENTRY_BAGGAGE_KEY_PREFIX","addTracingHeadersToFetchRequest","_scope","spanOrigin","spanstatus","contentLengthNum","url$1","semanticAttributes","sentryNonRecordingSpan","getCurrentHubShim","bindClient","setClient","exports$1","getIntegration","installedIntegrations","integrationIndex","userIntegrations","isDefaultInstance","resolvedUserIntegrations","finalIntegrations","integrationsByName","currentInstance","existingInstance","debugIndex","debugInstance","_captureConsoleIntegration","levels","CONSOLE_LEVELS","severity","string","_debugIntegration","debugger","_dedupeIntegration","previousEvent","currentEvent","currentMessage","previousMessage","_isSameFingerprint","_isSameStacktrace","previousException","_getExceptionFromEvent","currentException","_oO","currentFrames","getFramesFromEvent","previousFrames","frameA","frameB","currentFingerprint","fingerprint","previousFingerprint","_extraErrorDataIntegration","depth","captureErrorCause","exceptionName","errorData","nativeKeys","extraErrorInfo","truncate","cause","serializedError","oO","normalizedErrorData","normalize","originalFunctionToString","_functionToStringIntegration","Function","DEFAULT_IGNORE_ERRORS","_inboundFiltersIntegration","mergedOptions","internalOptions","allowUrls","denyUrls","ignoreErrors","disableErrorDefaults","ignoreTransactions","ignoreInternal","possibleMessages","lastException","_getEventFilterUrl","aggregateErrors","stripMetadataFromStackFrames","addMetadataToStackFrames","include","ip","query_string","transactionNamingScheme","requestDataIntegration","_requestDataIntegration","normalizedRequest","addRequestDataOptions","integrationOptions","requestIncludeKeys","addReqDataUserOpt","userIncludeKeys","ipAddress","socket","remoteAddress","requestdata","addNormalizedRequestDataToEvent","addRequestDataToEvent","root","isBrowser","iteratee","isWindowsFrame","startsWithSlash","oldFilename","base","basename","originalEvent","_sessionTimingIntegration","frameKeys","module_metadata","BUNDLER_PLUGIN_APP_KEY_PREFIX","behaviour","filterKeys","third_party_code","formatIssueTitle","issue","unionErrors","formatIssueMessage","zodError","errorKeyMap","iss","issues","errorKeys","_zodErrorsIntegration","filenameMetadataMap","parsedStacks","getMetadataForUrl","parser","_sentryModuleMetadata","reverse","MetricsAggregator","_buckets","_bucketsTotalWeight","_interval","_flush","DEFAULT_FLUSH_INTERVAL","unref","_flushShift","_forceFlush","metricType","unsanitizedName","unsanitizedUnit","unsanitizedTags","maybeFloatTimestamp","sanitizeMetricKey","sanitizeTags","sanitizeUnit","bucketKey","getBucketKey","bucketItem","previousWeight","SET_METRIC_TYPE","metric","weight","METRIC_MAP","updateMetricSummaryOnActiveSpan","MAX_WEIGHT","_captureMetrics","cutoffSeconds","flushedBuckets","bucket","buckets","captureAggregateMetrics","DEFAULT_BROWSER_FLUSH_INTERVAL","metricBuckets","COUNTER_METRIC_TYPE","DISTRIBUTION_METRIC_TYPE","GAUGE_METRIC_TYPE","metricBucketItems","metricsEnvelope","serializeMetricBuckets","metricsDefault","aggregator","getMetricsAggregatorForClient","Aggregator","globalMetricsAggregators","newAggregator","addToMetricsAggregator","transactionName","metricTags","ensureNumber","onlyIfParent","handleCallbackErrors","endTime","_value","_last","_sum","_count","simpleHash","METRICS_SPAN_FIELD","getMetricSummaryJsonForSpan","output","summary","updateMetricSummaryOnSpan","sanitizedName","sum","sanitizeTagKey","tagValueReplacements","sanitizeTagValue","replacement","localeCompare","out","tagEntries","maybeTags","rv","isProfilingIntegrationWithProfiler","_profiler","startProfiler","stopProfiler","ScopeClass","_notifyingListeners","_scopeListeners","_breadcrumbs","_attachments","_user","_tags","_extra","_contexts","_sdkProcessingMetadata","_propagationContext","generateSpanId","_level","_session","_transactionName","_fingerprint","_requestSession","_lastEventId","spanOnScope","_setSpanForScope","_getSpanForScope","addScopeListener","ip_address","_notifyScopeListeners","getRequestSession","setRequestSession","requestSession","setFingerprint","setLevel","scopeToMerge","scopeInstance","maxCrumbs","getLastBreadcrumb","clearBreadcrumbs","addAttachment","clearAttachments","eventProcessors","setSDKProcessingMetadata","newData","merge","clientClass","debug","enable","initialScope","SEMANTIC_ATTRIBUTE_CACHE_HIT","SEMANTIC_ATTRIBUTE_CACHE_ITEM_SIZE","SEMANTIC_ATTRIBUTE_CACHE_KEY","SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME","SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD","SEMANTIC_ATTRIBUTE_PROFILE_ID","SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME","SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT","SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE","SEMANTIC_ATTRIBUTE_URL_FULL","ServerRuntimeClient","baseclient","_sessionFlusher","initSessionFlusher","sessionflusher","SessionFlusher","monitorConfig","serializedCheckIn","check_in_id","monitor_slug","monitor_config","schedule","checkin_margin","checkinMargin","max_runtime","maxRuntime","timezone","failure_issue_threshold","failureIssueThreshold","recovery_threshold","recoveryThreshold","traceContext","_getTraceInfoFromScope","checkin","_captureRequestSession","incrementSessionStatusCount","serverName","server_name","spanToTraceContext","did","abnormal_mechanism","started","startingTime","attrs","user_agent","flushTimeout","_pendingAggregates","_intervalId","_sessionAttrs","sessionAggregates","getSessionAggregates","aggregates","_incrementSessionStatusCount","sessionStartedTrunc","setSeconds","aggregationCounts","exited","FROZEN_DSC_FIELD","getDynamicSamplingContextFromClient","frozenDsc","traceState","traceStateDsc","dscOnTraceState","baggageHeaderToDynamicSamplingContext","jsonSpan","maybeSampleRate","sample_rate","freezeDscOnSpan","spanWithMaybeDsc","dynamicSamplingContextToSentryBaggageHeader","errorsInstrumented","errorCallback","globalError","globalUnhandledRejection","activities","_idleTimeoutID","_finished","_finishReason","_autoFinishAllowed","_cleanupHooks","previousActiveSpan","_cancelIdleTimeout","_restartIdleTimeout","_restartChildSpanTimeout","onIdleSpanEnded","spanJSON","childSpans","discardedSpans","childSpan","childSpanJSON","childEndTimestamp","childStartTimestamp","spanStartedBeforeIdleSpanEnd","spanEndedBeforeFinalTimeout","stringifiedSpan","removeChildSpanFromSpan","Proxy","thisArg","definedEndTimestamp","spanEndTimestamp","spanTimeInputToSeconds","Reflect","childEndTimestamps","latestSpanEndTimestamp","spanStartTimestamp","Infinity","startedSpan","endedSpan","spanToAllowAutoFinish","logSpanEnd","logSpanStart","isRootSpan","infoParts","addEvent","timedEventsToMeasurements","sampleSpan","samplingContext","enhancedSamplingContext","tracesSampler","parentSampled","tracesSampleRate","_traceId","_spanId","traceFlags","TRACE_FLAG_NONE","_timestamp","_values","_status","updateName","_attributesOrStartTime","_startTime","addLink","_link","addLinks","_links","recordException","_exception","_time","SentrySpan","_attributes","_parentSpanId","_sampled","_endTime","_events","_isStandaloneSpan","isStandalone","_onSpanEnded","TRACE_FLAG_SAMPLED","updateStartTime","timeInput","logSpans","getSpanJSON","getStatusMessage","_metrics_summary","metricSummary","exclusive_time","is_segment","segment_id","attributesOrStartTime","time$1","isSpanTimeInput","isStandaloneSpan","spanItems","transactionEvent","_convertSpanToTransaction","getCapturedScopesOnSpan","isFullFinishedSpan","spanToTransactionTraceContext","httpStatus","SPAN_STATUS_OK","SPAN_STATUS_UNSET","spanStatus","SUPPRESS_TRACING_KEY","getAcs","createChildOrRootSpan","parentSpan","spanArguments","forceTransaction","sentrySpan","addChildSpanToSpan","_startRootSpan","setCapturedScopesOnSpan","parseSentrySpanArguments","initialCtx","experimental","standalone","ctx","sampling","transactionContext","getParentSpan","getActiveSpanWrapper","tracing","customParentSpan","finishAndSetSpan","SCOPE_ON_START_SPAN_FIELD","ISOLATION_SCOPE_ON_START_SPAN_FIELD","getEventForEnvelopeItem","makeRequest","promisebuffer","makePromiseBuffer","bufferSize","rateLimits","filteredEnvelopeItems","envelopeItemTypeToDataCategory","ratelimit","isRateLimited","filteredEnvelope","recordEnvelopeLoss","requestTask","updateRateLimits","error$1","drain","eventFromEnvelope","overrideDsn","matcher","fallbackTransport","otherTransports","validatedDsn","dsnFromString","transports","getEvent","eventTypes","transportsWithFallback","allTransports","flushTimer","retryDelay","flushIn","found","flushWithBackOff","isRetry","envelopeContainsItemType","parseRetryAfterHeader","shouldStore","flushAtStartup","trpcCaptureContext","trpcMiddleware","rawInput","getRawInput","trpcContext","procedure_path","procedure_type","attachRpcInput","rawRes","nextResult","ok","aggregateExceptionsFromError","exceptionFromErrorImplementation","prevExceptions","exceptionId","newExceptions","applyExceptionGroupFieldsForParentException","newException","newExceptionId","applyExceptionGroupFieldsForChildException","childError","is_exception_group","exception_id","parent_id","maxValueLimit","callFrameToStackFrame","getModuleFromFilename","columnNumber","lineNumber","module","functionName","nodeStackTrace","filenameIsInApp","watchdogTimer","createTimer","pollInterval","anrThreshold","timer","triggered","diffMs","getTimeMs","poll","flatten","flattenHelper","SENTRY_BAGGAGE_KEY_PREFIX_REGEX","parseBaggageHeader","curr","currBaggageObject","baggageHeaderToObject","keyOrValue","BAGGAGE_HEADER_NAME","MAX_BAGGAGE_STRING_LENGTH","baggageObject","objectKey","objectValue","currentIndex","newBaggageHeader","dscKey","dscValue","_htmlElementAsString","elem","dataset","sentryComponent","sentryElement","keyAttrPairs","keyAttr","keyAttrPair","classes","allowedAttrs","attr","currentElem","MAX_TRAVERSE_HEIGHT","separator","sepLength","nextStr","_asyncNullishCoalesce","lhs","rhsFn","_nullishCoalesce","_asyncOptionalChain","ops","lastAccessLHS","_asyncOptionalChainDelete","_optionalChain","_optionalChainDelete","makeFifoCache","evictionOrder","evictCandidate","discarded_events","clientReportItem","parseCookie","eqIdx","endIdx","parsedStackResults","lastKeysCount","cachedFilenameDebugIds","getFilenameToDebugIdMap","debugIdMap","_sentryDebugIds","debugIdKeys","stackKey","parsedStack","stackFrame","debugId","filenameDebugIdMap","code_file","debug_id","DSN_REGEX","pass","lastPath","projectMatch","dsnFromComponents","withPassword","component","isBrowserBundle","__SENTRY_BROWSER_BUNDLE__","envelopeItems","encodeUTF8","encodePolyfill","TextEncoder","ITEM_TYPE_TO_DATA_CATEGORY_MAP","sessions","client_report","user_report","profile_chunk","replay_event","replay_recording","check_in","statsd","raw_security","newItem","content_type","contentType","attachment_type","attachmentType","metadataOrEvent","readBinary","bin","subarray","readJson","decodePolyfill","TextDecoder","envelopeHeader","itemHeader","binaryLength","envHeaders","itemHeaders","stringifiedPayload","buffers","totalLength","buf","getException","instrumentConsole","originalConsoleMethod","originalConsoleMethods","handlers","triggerHandlers","addHandler","maybeInstrument","instrumentFetch","onFetchResolved","skipNativeFetchCheck","supports","originalFetch","fetchArgs","getUrlFromResource","hasProp","streamHandler","clonedResponseForResolving","onFinishedResolving","responseReader","getReader","maxFetchDurationTimeout","cancel","readingActive","chunkTimeout","done","releaseLock","resource","_oldOnErrorHandler","instrumentError","__SENTRY_INSTRUMENTED__","_oldOnUnhandledRejectionHandler","instrumentUnhandledRejection","instrumented","instrumentFn","resetInstrumentationHandlers","typeHandlers","objectToString","isBuiltin","wat","Event","isRegExp","isSyntheticEvent","isVueViewModel","__isVue","_isVue","isNodeEnv","process","wrappedFuncs","wrappedLevels","disable","LRUMap","_maxSize","_cache","remove","memoBuilder","hasWeakSet","WeakSet","inner","getFirstException","SEMVER_REGEXP","_parseInt","lines","maxLines","sourceLine","pre_context","snipLine","lineIndex","context_line","post_context","newMechanism","firstException","currentMechanism","mergedData","arrayify","maybeArray","__sentry_captured__","parseSemver","major","minor","patch","buildmetadata","prerelease","gbl","getRandomByte","randomUUID","typedArray","isNative","getModule","FILENAME_MATCH","FULL_MATCH","lineMatch","typeName","methodName","methodStart","objectEnd","decodeURI","_parseIntOrUndefined","nodeStackLineParser","nmd","dynamicRequire","mod","require","loadModule","moduleName","cwd","maxProperties","visit","memo$1","memo","unmemoize","stringified","objName","__sentry_skip_normalization__","remainingDepth","__sentry_override_normalization_depth__","valueWithToJSON","normalized","numAdded","visitable","convertToPlainObject","visitKey","visitValue","encodeURI","normalizeUrlToBase","basePath","escapedBase","newUrl","_Oo","writable","o_O","wrapped","getOwnProperties","newObj","serializeEventTarget","currentTarget","CustomEvent","browser","extractedProps","_dropUndefinedKeys","inputValue","memoizationMap","memoVal","returnValue","getOwnPropertyNames","maxLength","includedKeys","replacementFactory","__sentry_original__","objectify","objectified","normalizeArray","allowAboveRoot","up","splitPathRe","splitPath","truncated","resolvedPath","resolvedAbsolute","normalizePath","isPathAbsolute","isAbsolute","trailingSlash","normalizedPath","dirname","dir","fromParts","toParts","samePartsLength","outputParts","task","$","taskProducer","capturedSetTimeout","generatePropagationContext","headerDelay","headerDate","disabledUntil","limits","DEFAULT_RETRY_AFTER","updatedRateLimits","rateLimitHeader","retryAfterHeader","retryAfter","categories","namespaces","DEFAULT_INCLUDES","DEFAULT_REQUEST_INCLUDES","DEFAULT_USER_INCLUDES","extractUserData","extractedUser","extractRequestData","requestData","hostname","encrypted","originalUrl","getIpAddress","ipHeaderNames","ipHeaderName","stringBody","winterCGHeadersToDict","winterCGHeaders","headersToDict","reqHeaders","extractQueryParamsFromUrl","additionalData","includeRequest","extractedRequestData","includeKeys","getClientIPAddress","extractPathForTransaction","customRoute","route","httpRequestToRequestData","winterCGRequestToRequestData","validSeverityLevels","WEBPACK_ERROR_REGEXP","STRIP_FRAME_REGEXP","parsers","sortedParsers","skipFirstLines","cleanedLine","stripSentryFramesAndReverse","localStack","getLastStackFrame","defaultFunctionName","isMatchingPattern","requireExactStringMatch","delimiter","newLine","lineLength","testString","patterns","isNativeFunction","supportsDOMError","DOMError","supportsDOMException","DOMException","supportsErrorEvent","ErrorEvent","EdgeRuntime","sandbox","supportsReferrerPolicy","States","PENDING","RESOLVED","REJECTED","executor","__init","__init2","__init3","__init4","_state","_handlers","_resolve","_reject","onfulfilled","onrejected","_executeHandlers","onfinally","isRejected","_setResult","cachedHandlers","approxStartingTimeOrigin","exports","threshold","performanceNow","dateNow","timeOriginDelta","timeOriginIsReliable","navigationStart","navigationStartDelta","TRACEPARENT_REGEXP","extractTraceparentData","traceparent","generateSentryTraceHeader","sampledString","baggage$1","traceparentData","getNumberOfUrlSegments","getSanitizedUrlString","fragment","urlPath","escapeStringForRegex","regexString","rawValue","chromeVar","isChromePackagedApp","app","hasHistoryApi","pushState","vercelWaitUntil","vercelRequestContextGlobal","Symbol","for","waitUntil","globalThis","creator","versionedCarrier","mergeAndOverwriteScopeData","mergeVal","applyScopeDataToEvent","cleanedExtra","cleanedTags","cleanedUser","cleanedContexts","mergedBreadcrumbs","mergeScopeData","mergeData","onFinally","maybeOptions","__SENTRY_TRACING__","enableTracing","removeTrailingSlash","initialObj","mergeObj","getTraceMetaTags","strings","formatted","raw","getFinalScope","finalScope","captureContextKeys","normalizeMaxBreadth","dist","integrationNames","debugIds","clientEventProcessors","isolationData","finalScopeData","eventProcessors$1","maxBreadth","names","SCOPE_SPAN_FIELD","hasShownSpanDropWarning","ensureTimestampInSeconds","castSpan","CHILD_SPANS_FIELD","ROOT_SPAN_FIELD","resultSet","addSpanChildren","isRemote","cachedImplementations","cached","impl","addClsInstrumentationHandler","addFidInstrumentationHandler","addInpInstrumentationHandler","addLcpInstrumentationHandler","addTtfbInstrumentationHandler","debounceTimerID","lastCapturedEventType","lastCapturedEventTargetId","instrumentDOM","triggerDOMHandler","globalDOMEventHandler","makeDOMEventHandler","originalAddEventListener","listener","__sentry_instrumentation_handlers__","handlerForType","refCount","globalListener","_sentryCaptured","isContentEditable","_sentryId","lastHref","instrumentHistory","supportsHistory","oldOnPopState","onpopstate","historyReplacementFunction","originalHistoryFunction","instrumentXHR","xhrproto","originalOpen","xhrOpenThisArg","xhrOpenArgArray","onreadystatechangeHandler","xhrInfo","onreadystatechange","originalOnreadystatechange","onreadystatechangeThisArg","onreadystatechangeArgArray","originalSetRequestHeader","setRequestHeaderThisArg","setRequestHeaderArgArray","sendThisArg","sendArgArray","_lcpEntry","_clsEntry","_performanceCursor","_measurements","_addPerformanceNavigationTiming","eventEnd","startAndEndSpan","msToSec","setResourceEntrySizeData","dataKey","entryVal","getBrowserPerformanceAPI","getEntries","performanceEntries","transactionStartTime","requestStartTimestamp","responseEndTimestamp","responseStartTimestamp","navEntry","getNavigationEntry","requestTime","measureStartTimestamp","startTimeStamp","measureEndTimestamp","firstHidden","getVisibilityWatcher","shouldRecord","firstHiddenTime","fp","fcp","resourceUrl","parsedUrl","deliveryType","renderBlockingStatus","connection","effectiveType","isMeasurementValue","rtt","deviceMemory","hardwareConcurrency","fidMark","fid","cls","measurementName","getActivationStart","loadTime","renderTime","sources","instrument","scripts","parentStartTimestamp","parentOp","initialScript","invoker","invokerType","sourceURL","sourceFunctionName","sourceCharPosition","fidCleanupCallback","lcpCleanupCallback","lcp","ttfbCleanupCallback","ttfb","clsCleanupCallback","trackClsAsStandaloneSpan","standaloneClsEntry","pageloadSpanId","standaloneCLsValue","sentSpan","_collectClsOnce","clsValue","routeName","startStandaloneWebVitalSpan","cleanupClsHandler","onHidden","unsubscribeStartNavigation","LAST_INTERACTIONS","INTERACTIONS_SPAN_MAP","INP_ENTRY_MAP","click","pointerdown","pointerup","mousedown","mouseup","touchstart","touchend","mouseover","mouseout","mouseenter","mouseleave","pointerover","pointerout","pointerenter","pointerleave","dragstart","dragend","drag","dragenter","dragleave","dragover","drop","keydown","keyup","keypress","_latestRoute","handleEntries","activeRootSpan","isPerformanceEventTiming","interactionId","inpCallback","spanToUse","_previousCls","_previousFid","_previousLcp","_previousTtfb","_previousInp","instrumentCls","getCLS","onCLS","reportAllChanges","instrumentFid","getFID","onFID","instrumentLcp","getLCP","onLCP","instrumentTtfb","onTTFB","instrumentInp","getINP","onINP","addMetricObserver","previousValue","stopOnCallback","stopListening","getCleanupCallback","durationThreshold","startTimeInSeconds","parentStartTime","passedAttributes","replay","replayId","getReplayId","userDisplay","replay_id","CLSThresholds","onReport","onFCP","runOnce","initMetric","sessionValue","sessionEntries","hadRecentInput","firstSessionEntry","lastSessionEntry","po","bindReporter","takeRecords","FIDThresholds","whenActivated","visibilityWatcher","handleEntry","processingStart","disconnect","INPThresholds","PerformanceEventTiming","interactionCountPolyfill","initInteractionCountPolyfill","whenIdle","interactions","processInteractionEntry","inp","estimateP98LongestInteraction","latency","DEFAULT_DURATION_THRESHOLD","LCPThresholds","reportedMetricIDs","thresholds","prevValue","delta","forceReport","rating","getRating","generateUniqueID","activationStart","checkResponseStart","navigationEntry","getEntriesByType","onVisibilityUpdate","timeStamp","removeChangeListeners","prerendering","navigationType","wasDiscarded","longestInteractionList","longestInteractionMap","entryPreProcessingCallbacks","candidateInteractionIndex","getInteractionCount","cb","minLongestInteraction","existingInteraction","interaction","onHiddenOrPageHide","interactionCountEstimate","minKnownInteractionId","maxKnownInteractionId","updateEstimate","interactionCount","called","rIC","requestIdleCallback","handle","FCPThresholds","TTFBThresholds","whenReady","DOCUMENT","NAVIGATOR","TRIGGER_LABEL","includeReplay","mergeOptions","optionOverrides","onFormOpen","onFormClose","onSubmitSuccess","onSubmitError","onFormSubmitted","themeDark","themeLight","setAttributesNS","setAttributeNS","PURPLE","DEFAULT_LIGHT","foreground","background","accentForeground","accentBackground","successColor","errorColor","boxShadow","outline","interactiveFilter","DEFAULT_DARK","getThemedCssVariables","theme","l$1","u$1","i$1","o$1","r$1","f$1","c$1","s$1","a$1","h$1","v$1","p$1","y$1","defaultProps","d$1","ref","__k","__b","__e","__d","__c","__v","__i","__u","vnode","g$1","b$1","m$1","w$1","__P","__n","ownerSVGElement","k$1","x$1","C$1","__r","debounceRendering","j$1","P$1","nextSibling","insertBefore","nodeType","T$1","setProperty","A$1","cssText","L","D$1","H","contextType","__E","render","q$1","__h","_sb","__s","getDerivedStateFromProps","componentWillMount","componentDidMount","componentWillReceiveProps","shouldComponentUpdate","componentWillUpdate","componentDidUpdate","getChildContext","getSnapshotBeforeUpdate","z$1","diffed","localName","createTextNode","createElementNS","childNodes","__html","unmount","componentWillUnmount","getDerivedStateFromError","setState","componentDidCatch","__H","__V","D","__N","z","B","__m","cancelAnimationFrame","useCallback","me","useContext","useDebugValue","useEffect","useErrorBoundary","useId","useImperativeHandle","useLayoutEffect","fe","useMemo","ge","useReducer","pe","useRef","useState","he","SentryLogo","svg","viewBox","DialogHeader","logoHtml","outerHTML","class","formTitle","showBranding","rel","dangerouslySetInnerHTML","retrieveStringValue","formData","Form","defaultEmail","defaultName","onSubmit","showEmail","showName","screenshotInput","addScreenshotButtonLabel","removeScreenshotButtonLabel","cancelButtonLabel","emailLabel","emailPlaceholder","isEmailRequired","isNameRequired","messageLabel","messagePlaceholder","nameLabel","namePlaceholder","submitButtonLabel","isRequiredLabel","setError","showScreenshotInput","setShowScreenshotInput","ScreenshotInputComponent","screenshotError","setScreenshotError","onScreenshotError","hasAllRequiredFields","missingFields","emptyFields","handleSubmit","HTMLFormElement","FormData","LabelText","isRequired","placeholder","required","autoFocus","rows","onClick","prev","SuccessIcon","clipPath","path2","speakerDefs","speakerClipPathDef","speakerRect","Dialog","successIconHtml","setTimeoutId","handleOnSuccessClick","successMessageText","stopPropagation","createScreenshotInputStyles","styleNonce","surface200","gray100","textContent","CROP_BUTTON_OFFSET","CROP_BUTTON_SIZE","DPI","constructRect","box","startX","endX","startY","endY","getContainedSize","img","imgClientHeight","imgClientWidth","ratio","ScreenshotEditorFactory","imageBuffer","dialog","useTakeScreenshot","onBeforeScreenshot","onScreenshot","onAfterScreenshot","stream","mediaDevices","getDisplayMedia","video","audio","monitorTypeSurfaces","preferCurrentTab","selfBrowserSurface","surfaceSwitching","srcObject","onloadedmetadata","getTracks","track","play","innerText","CropCorner","corner","onGrabButton","onMouseDown","canvasContainerRef","cropContainerRef","croppingRef","croppingRect","setCroppingRect","confirmCrop","setConfirmCrop","isResizing","setIsResizing","resizeCropper","cropper","imageDimensions","getContext","cropButton","handleMouseMove","makeHandleMouseMove","handleMouseUp","croppingBox","clearRect","fillStyle","fillRect","strokeStyle","lineWidth","strokeRect","cropCanvas","cropBoundingRect","mouseX","clientX","mouseY","clientY","initialPositionRef","initialX","initialY","display","imageSource","videoWidth","videoHeight","drawImage","container","zIndex","moveEvent","deltaX","deltaY","newStartX","newStartY","newEndX","newEndY","cursor","cutoutCanvas","imageBox","cutoutCtx","confirmButtonLabel","autoInject","enableScreenshot","useSentryUser","colorScheme","triggerLabel","triggerAriaLabel","_shadow","_subscriptions","_createShadow","attachShadow","_loadAndRenderDialog","screenshotRequired","maxTouchPoints","isSecureContext","modalIntegration","screenshotIntegration","screenshotIntegrationFn","createDialog","shadow","_attachTo","targetEl","handleClick","removeFromDom","appendToDom","unsubscribe","_createActor","actor","ariaHidden","ariaLabel","show","attachTo","createWidget","createForm","shadowRoot","userKey","currentUser","isolationUser","globalUser","originalOverflow","renderContent","createInput","firstChild","blob","toBlob","arrayBuffer","NodeType","distanceToMatch","matchPredicate","ELEMENT_NODE","createMatchPredicate","regex","eIndex","classList","Document","DocumentType","Text","CDATA","Comment","DEPARTED_MIRROR_ACCESS_WARNING","_mirror","getId","getNode","removeNodeFromMap","hookSetter","isRevoked","defineProperties","__rrweb_original__","isBlocked","blockClass","blockSelector","unblockSelector","checkAncestors","blockDistance","unblockDistance","receiver","getImplementation","onRequestAnimationFrame","CanvasContext","CanvasContext2","WebGL","WebGL2","errorHandler","callbackWrapper","rrwebWrapped","chars","lookup","canvasVarMap","saveWebGLVar","isInstanceOfWebGLObject","ctor","contextMap","serializeArg","Float32Array","Float64Array","Int32Array","Uint32Array","Uint16Array","Int16Array","Int8Array","Uint8ClampedArray","rr_type","base64","arraybuffer","bytes","DataView","byteOffset","byteLength","HTMLImageElement","HTMLCanvasElement","toDataURL","ImageData","serializeArgs","supportedWebGLConstructorNames","initCanvasContextObserver","setPreserveDrawingBufferToTrue","restoreHandler","ctxName","__context","contextAttributes","preserveDrawingBuffer","patchGLPrototype","mirror","canvas","recordArgs","mutation","hookHandler","setter","CanvasManager","pendingCanvasMutations","restoreHandlers","windowsSet","windows","shadowDoms","worker","_2","terminate","_3","snapshotInProgressMap","freeze","frozen","unfreeze","lock","locked","unlock","rafStamps","latestId","invokeId","processMutation","maxCanvasSize","recordCanvas","dataURLOptions","mutationCb","registerErrorHandler","enableManualSnapshot","initFPSWorker","addWindow","startRAFTimestamping","startPendingCanvasMutationFlusher","initCanvasFPSObserver","WeakRef","initCanvasMutationObserver","canvasContextReset","addShadowRoot","resetShadowRoots","Worker","Blob","createObjectURL","commands","fps","rafId","takeSnapshot","canvas2DReset","props2D","CanvasRenderingContext2D","canvasWebGL1and2Reset","WebGLRenderingContext","WebGL2RenderingContext","snapshot","canvasElement","isManualSnapshot","timeBetweenSnapshots","lastSnapshotTime","getCanvas","matchedCanvas","searchCanvas","querySelectorAll","deref","takeCanvasSnapshots","hasNode","_4","getContextAttributes","_5","_6","COLOR_BUFFER_BIT","createImageBitmap","bitmap","_7","_8","_9","flushPendingCanvasMutations","setLatestRAFTimestamp","flushPendingCanvasMutationFor","valuesWithType","CANVAS_QUALITY","low","quality","high","DEFAULT_MAX_CANVAS_SIZE","_replayCanvasIntegration","maxCanvasWidth","maxCanvasHeight","_canvasOptions","canvasManagerResolve","_canvasManager","getCanvasManager","getCanvasManagerOptions","manager","__rrweb__","REPLAY_SESSION_KEY","UNABLE_TO_SEND_REPLAY","NETWORK_BODY_MAX_SIZE","CONSOLE_ARG_MAX_SIZE","REPLAY_MAX_EVENT_BUFFER_SIZE","_nullishCoalesce$1","_optionalChain$5","NodeType$3","isNativeShadowDom","stringifyStylesheet","rules","cssRules","stringifyRule","importStringified","styleSheet","statement","layerName","supportsText","media","mediaText","needsSafariColonFix","selectorText","needsAllFix","styleDeclaration","isImportant","getPropertyPriority","getPropertyValue","Mirror","idNodeMap","nodeMetaMap","getMeta","getIds","childNode","oldNode","shouldMaskInput","maskInputOptions","text","maskInputValue","isMasked","maskInputFn","repeat","ORIGINAL_ATTRIBUTE_NAME","getInputType","hasAttribute","getInputValue","extractFileExtension","cachedImplementations$1","getImplementation$1","setTimeout$2","clearTimeout$2","getIframeContentDocument","contentDocument","_id","tagNameRegex","genId","canvasService","canvasCtx","URL_IN_CSS_REF","URL_PROTOCOL_MATCH","URL_WWW_MATCH","DATA_URI","absoluteToStylesheet","quote1","path1","quote2","path3","filePath","maybeQuote","SRCSET_NOT_SPACES","SRCSET_COMMAS_OR_SPACES","cachedDocument","absoluteToDoc","attributeValue","getHref","customHref","transformAttribute","maskAttributeFn","pos","collectCharacters","descriptorsStr","inParens","ignoreAttribute","needMaskingText","maskTextClass","maskTextSelector","unmaskTextClass","unmaskTextSelector","maskAllText","autocomplete","maskDistance","unmaskDistance","lowerIfExists","maybeAttr","serializeNodeWithId","skipChild","inlineStylesheet","maskTextFn","slimDOMOptions","inlineImages","onSerialize","onIframeLoad","iframeLoadTimeout","onStylesheetLoad","stylesheetLoadTimeout","keepIframeSrcFn","newlyAddedElement","preserveWhiteSpace","_serializedNode","rootId","docId","DOCUMENT_NODE","compatMode","DOCUMENT_TYPE_NODE","publicId","systemId","needBlock","processedTagName","stylesheet","styleSheets","crossorigin","_cssText","sheet","checked","forceMask","selected","getImageData","originalGetImageData","pixel","rr_dataURL","canvasDataURL","blankCanvas","image","imageSrc","currentSrc","priorCrossOrigin","recordInlineImage","naturalWidth","naturalHeight","complete","rr_mediaState","paused","rr_mediaCurrentTime","rr_scrollLeft","rr_scrollTop","rr_width","rr_height","isCustomElement","rr_src","customElements","isSVG","isCustom","TEXT_NODE","parentTagName","isStyle","isScript","isTextarea","previousSibling","textarea","CDATA_SECTION_NODE","COMMENT_NODE","sn","comment","headFavicon","headMetaDescKeywords","headMetaSocial","headMetaRobots","headMetaHttpEquiv","headMetaAuthorship","headMetaVerification","serializedNode","recordChild","isShadowHost","headWhitespace","bypassOptions","childN","serializedChildNode","isShadow","iframeEl","fired","blankUrl","iframeDoc","serializedIframeNode","link","styleSheetLoadTimeout","styleSheetLoaded","serializedLinkNode","_optionalChain$4","throttle$1","wait","previous","leading","remaining","trailing","setTimeout$1","nowTimestamp","scrollingElement","_10","_11","_12","_13","_14","getWindowHeight","getWindowWidth","closestElementOfNode","blockedPredicate","isUnblocked","isIgnored","isAncestorRemoved","legacy_isTouchEvent","changedTouches","isSerializedIframe","isSerializedStylesheet","hasShadowRoot","_18","StyleSheetMirror","styleIDMap","idStyleMap","newId","getStyle","getShadowHost","shadowHost","_19","_20","_21","Node","DOCUMENT_FRAGMENT_NODE","inDom","rootShadowHost","NodeType$1","NodeType$2","EventType2","DomContentLoaded","Load","FullSnapshot","IncrementalSnapshot","Meta","Custom","Plugin","IncrementalSource","IncrementalSource2","Mutation","MouseMove","MouseInteraction","Scroll","ViewportResize","Input","TouchMove","MediaInteraction","StyleSheetRule","CanvasMutation","Font","Log","Drag","StyleDeclaration","Selection","AdoptedStyleSheet","CustomElement","MouseInteractions","MouseInteractions2","MouseUp","MouseDown","Click","ContextMenu","DblClick","Focus","Blur","TouchStart","TouchMove_Departed","TouchEnd","TouchCancel","PointerTypes","PointerTypes2","Mouse","Pen","Touch","getIFrameContentDocument","_optionalChain$3","isNodeInLinkedList","PLACEHOLDER","ATTRIBUTE_NODE","ENTITY_REFERENCE_NODE","ENTITY_NODE","PROCESSING_INSTRUCTION_NODE","DoubleLinkedList","tail","addNode","__ln","removeNode","moveKey","MutationBuffer","texts","attributeMap","removes","mapRemoves","movedMap","addedSet","movedSet","droppedSet","processMutations","mutations","adds","addedIds","addList","getNextId","ns","nextId","pushAdd","currentN","iframeManager","addIframe","stylesheetManager","trackLinkElement","shadowDomManager","childSn","attachIframe","canvasManager","observeAttachShadow","attachLinkElement","isParentRemoved","isAncestorInSet","candidate","tailNode","_node","unhandledNode","diffAsStr","styleDiff","unchangedAsStr","_unchangedStyles","attributeName","isInputMasked","unattachedDoc","implementation","createHTMLDocument","old","pname","newPriority","addedNodes","genAdds","removedNodes","nodeId","deepDelete","processedNodeManager","inOtherBuffer","targetId","isFrozen","addsSet","_isAncestorInSet","_optionalChain$2","mutationBuffers","getEventTarget","composedPath","initMutationObserver","rootEl","mutationBuffer","mutationObserverCtor","MutationObserver","__rrMutationObserver","angularZoneSymbol","Zone","__symbol__","observer","onMutation","attributeOldValue","characterData","characterDataOldValue","childList","subtree","initScrollObserver","scrollCb","scrollLeftTop","INPUT_TAGS","lastInputValueMap","initInputObserver","inputCb","ignoreClass","ignoreSelector","userTriggeredOnInput","userTriggered","isTrusted","isChecked","cbWithDedup","lastInputValue","propertyDescriptor","HTMLInputElement","hookProperties","HTMLSelectElement","HTMLTextAreaElement","HTMLOptionElement","getNestedCSSRulePositions","childRule","hasNestedCSSRule","parentRule","CSSGroupingRule","CSSMediaRule","CSSSupportsRule","CSSConditionRule","parentStyleSheet","getIdAndStyleId","styleMirror","styleId","ownerNode","initAdoptedStyleSheetObserver","hostId","patchTarget","originalPropertyDescriptor","sheets","_15","_16","adoptStyleSheets","initObservers","mutationObserver","recordDOM","mousemoveHandler","mousemoveCb","mousemove","callbackThreshold","mousemoveCallback","timeBaseline","positions","wrappedCb","totalOffset","timeOffset","updatePosition","DragEvent","MouseEvent","mouseInteractionHandler","mouseInteractionCb","mouseInteraction","disableMap","currentPointerType","eventKey","pointerType","thisEventKey","PointerEvent","scrollHandler","viewportResizeHandler","viewportResizeCb","lastH","lastW","inputHandler","mediaInteractionHandler","mediaInteractionCb","volume","muted","playbackRate","styleSheetObserver","adoptedStyleSheetObserver","styleDeclarationObserver","fontObserver","styleSheetRuleCb","CSSStyleSheet","insertRule","argumentsList","deleteRule","replaceSync","supportedNestedCSSRuleTypes","canMonkeyPatchNestedCSSRule","unmodifiedFunctions","typeKey","styleDeclarationCb","ignoreCSSAttributes","CSSStyleDeclaration","priority","_17","removeProperty","collectFonts","fontCb","fontMap","originalFontFace","FontFace","family","descriptors","fontFace","fontSource","fonts","selectionObserver","param","selectionCb","collapsed","updateSelection","selection","getSelection","isCollapsed","ranges","rangeCount","getRangeAt","startContainer","endContainer","customElementObserver","customElementCb","define","pluginHandlers","plugin","plugins","_22","_23","CrossOriginIframeMirror","generateIdFn","iframeIdToRemoteIdMap","iframeRemoteIdToIdMap","remoteId","idToRemoteMap","remoteToIdMap","idToRemoteIdMap","getIdToRemoteIdMap","remoteIdToIdMap","getRemoteIdToIdMap","getRemoteId","getRemoteIds","ids","_optionalChain$1","IframeManagerNoop","crossOriginIframeMirror","crossOriginIframeRootIdMap","addLoadListener","IframeManager","iframes","crossOriginIframeMap","wrappedEmit","recordCrossOriginIframes","crossOriginIframeStyleMirror","handleMessage","loadListener","isAttachIframe","adoptedStyleSheets","crossOriginMessageEvent","transformedEvent","transformCrossOriginEvent","isCheckout","replaceIdOnNode","patchRootIdOnNode","replaceIds","replaceStyleIds","iframeMirror","ShadowDomManagerNoop","ShadowDomManager","patchAttachShadow","iframeElement","iframeWindow","CanvasManagerNoop","StylesheetManager","trackedLinkElements","adoptedStyleSheetCb","linkEl","trackStylesheetInLinkElement","adoptedStyleSheetData","styleIds","CSSRule","ProcessedNodeManager","nodeMap","active","thisBuffer","_takeFullSnapshot","cleanFrame","record","checkoutEveryNms","checkoutEveryNth","maskAllInputs","_maskInputOptions","_slimDOMOptions","packFn","mousemoveWait","recordAfter","inEmittingFrame","passEmitsToParent","color","tel","week","radio","checkbox","lastFullSnapshotEvent","NodeList","DOMTokenList","incrementalSnapshotCount","exceedCount","exceedTime","takeFullSnapshot","wrappedMutationEmit","wrappedScrollEmit","wrappedCanvasMutationEmit","__RRWEB_EXCLUDE_IFRAME__","getMirror","nodeMirror","getCanvasManagerFn","__RRWEB_EXCLUDE_SHADOW_DOM__","slimDOM","initialOffset","canvasMutationCb","unregisterErrorHandler","timestampToMs","timestampToS","addBreadcrumbEvent","triggerUserActivity","checkAndHandleExpiredSession","addUpdate","throttledAddEvent","getClosestInteractive","closest","getClickTargetNode","getTargetNode","IncrementalMutationSources","ClickDetector","slowClickConfig","_addBreadcrumbEvent","_lastMutation","_lastScroll","_clicks","_timeout","_threshold","_scrollTimeout","scrollTimeout","_replay","_ignoreSelector","addListeners","cleanupWindowOpen","nowInSeconds","originalWindowOpen","_teardown","removeListeners","_checkClickTimeout","SLOW_CLICK_TAGS","newClick","clickBreadcrumb","clickCount","_scheduleCheckClicks","registerMutation","registerScroll","registerClick","_handleMultiClick","_getClicks","_checkClicks","timedOutClicks","mutationAfter","scrollAfter","_generateBreadcrumbs","hadScroll","hadMutation","isSlowClick","timeAfterClickMs","endReason","getCurrentRoute","createBreadcrumb","ATTRIBUTES_TO_RECORD","getAttributesToRecord","normalizedKey","getBaseDomBreadcrumb","ENTRY_TYPES","decodedBodySize","encodedBodySize","responseStatus","transferSize","paint","navigation","domComplete","domContentLoadedEventStart","domContentLoadedEventEnd","domInteractive","loadEventStart","loadEventEnd","redirectCount","webVitalHandler","getter","replayPerformanceEntries","createPerformanceEntry","getLargestContentfulPaint","lastEntry","getWebVital","isLayoutShift","getCumulativeLayoutShift","layoutShifts","nodes","nodeIds","getFirstInputDelay","getInteractionToNextPaint","attributions","PREFIX","_addBreadcrumb","_capture","_trace","_logger","infoTick","setConfig","captureExceptions","traceInternals","EventBufferSizeExceededError","EventBufferArray","_totalSize","hasCheckout","waitForCheckout","hasEvents","eventSize","finish","eventsRet","getEarliestTimestamp","WorkerHandler","_worker","ensureReady","_ensureReadyPromise","_getAndIncrementId","EventBufferCompressionWorker","_earliestTimestamp","_sendEventToWorker","_finishRequest","EventBufferProxy","_fallback","_compression","_used","_ensureWorkerIsLoadedPromise","_ensureWorkerIsLoaded","ensureWorkerIsLoaded","_switchToCompressionWorker","addEventPromises","hasSessionStorage","sessionStorage","isSampled","lastActivity","segmentId","previousSessionId","saveSession","createSession","sessionSampleRate","allowBuffering","stickySession","initialTime","expiry","targetTime","isSessionExpired","maxReplayDuration","sessionIdleExpire","shouldRefreshSession","loadOrCreateSession","sessionOptions","existingSession","sessionStringFromStorage","sessionObj","addEventSync","shouldAddEvent","_addEvent","eventBuffer","isBufferMode","recordingMode","eventAfterPossibleCallback","beforeAddRecordingEvent","isExceeded","handleException","isPaused","timestampInMs","timeouts","sessionIdlePause","initialTimestamp","isFeedbackEvent","isBreadcrumbWithCategory","resetReplayIdOnDynamicSamplingContext","createPerformanceSpans","addNetworkBreadcrumb","getBodySize","textEncoder","formDataStr","_serializeFormData","parseContentLengthHeader","getBodyString","mergeWarning","_meta","warnings","newMeta","existingWarnings","makeNetworkReplayBreadcrumb","buildSkippedNetworkRequestOrResponse","bodySize","buildNetworkRequestOrResponse","normalizedBody","exceedsSizeLimit","isProbablyJson","truncatedBody","getAllowedHeaders","allowedHeaders","filteredHeaders","urlMatches","urls","baseURI","fixedUrl","_getFetchRequestArgBody","getAllHeaders","allHeaders","getHeadersFromOptions","createMemoryEntry","memoryEntry","jsHeapSizeLimit","totalJSHeapSize","usedJSHeapSize","memory","getHandleRecordingEmit","hadFirstEvent","_isCheckout","clickDetector","setInitialState","shouldRecordCanvas","isRecordingCanvas","errorSampleRate","useCompressionOption","useCompression","blockAllMedia","networkDetailHasUrls","networkDetailAllowUrls","networkCaptureBodies","networkRequestHasHeaders","networkRequestHeaders","networkResponseHasHeaders","networkResponseHeaders","earliestEvent","TransportStatusCodeError","RateLimitError","sendReplay","replayData","retryConfig","recordingData","eventContext","preparedRecordingData","payloadWithSequence","replayHeaders","sequence","errorIds","traceIds","baseEvent","replay_start_timestamp","error_ids","trace_ids","replay_type","replayEvent","eventHint","preparedEvent","_retryCount","THROTTLED","ReplayContainer","recordingOptions","__init5","__init6","_lastActivity","_isPaused","_requiresManualStart","_hasInitializedCoreListeners","initialUrl","_recordingOptions","_debouncedFlush","callbackReturnValue","timerId","maxTimerId","maxWait","invokeFunc","cancelTimers","debounced","flushMinDelay","flushMaxDelay","_throttledAddEvent","isThrottled","wasThrottled","slowClickTimeout","slowClickIgnoreSelectors","experiments","_canvas","initializeSampling","requiresManualStart","_initializeSessionForSampling","_initializeRecording","_updateUserActivity","startBuffering","startRecording","canvasOptions","_stopRecording","continuousCheckout","_onMutationHandler","stopRecording","forceFlush","_removeListeners","force","pause","resume","_checkSession","sendBufferedReplayOrFlush","continueRecording","flushImmediate","activityTime","hasStoppedRecording","_updateSessionActivity","_maybeSaveSession","cbResult","updateUserActivity","conditionalFlush","cancelFlush","getSessionId","_clearContext","lastActiveSpan","lastRootSpan","workerUrl","customWorkerUrl","__SENTRY_EXCLUDE_REPLAY_WORKER__","_addListeners","_refreshSession","_handleVisibilityChange","_handleWindowBlur","_handleWindowFocus","_handleKeyboardEvent","isClick","altKey","metaKey","ctrlKey","shiftKey","isTruncated","normalizedArgs","normalizedArg","networkDetailDenyUrls","reqSize","resSize","responseType","request_body_size","response_body_size","requestBodySize","responseBodySize","requestWarning","responseBody","responseWarning","captureDetails","bodyStr","bodyText","txt","handleNetworkBreadcrumbs","feedbackId","isErrorEventSampled","exceptionValue","replayContext","beforeErrorSampling","_performanceCleanupCallback","addPerformanceEntry","onEntries","clearCallbacks","clearCallback","_doChangeToForegroundTasks","_doChangeToBackgroundTasks","hasModifierKey","isCharacterKey","_createCustomBreadcrumb","_addPerformanceEntries","initialTimestampInSeconds","_updateInitialTimestampFromEventBuffer","_popEventContext","_runFlush","dropReason","tooShort","minReplayDuration","tooLong","_flushInProgress","_flushLock","mutationLimit","overMutationLimit","mutationBreadcrumbLimit","getOption","selectors","defaultSelectors","MEDIA_SELECTORS","DEFAULT_NETWORK_HEADERS","_initialized","Replay","__initStatic","MAX_REPLAY_DURATION","mask","maskAttributes","unmask","block","unblock","ignore","maskFn","privacyOptions","_initialOptions","_getMergedNetworkHeaders","_isInitialized","_setup","_initialize","getRecordingMode","_maybeLoadFromReplayCanvasIntegration","finalOptions","initialOptions","replaysSessionSampleRate","replaysOnErrorSampleRate","canvasIntegration","taskHelperClosure","helperName","taskMethod","_args","outerArgs","innerArgs","assert","cancelHelper","cancelable","cancelAll","helper","maybeReportError","performHelper","perform","positional","_curry","Task","Ge","TaskGroup","TaskGroupProperty","TaskInstance","TaskProperty","Y","Yieldable","bt","allSettled","Et","animationFrame","didCancel","de","dropTask","dropTaskGroup","enqueueTask","ut","enqueueTaskGroup","forever","getModifier","hasModifier","wt","hashSettled","Tt","keepLatestTask","keepLatestTaskGroup","lastValue","st","race","St","rawTimeout","registerModifier","restartableTask","dt","restartableTaskGroup","taskGroup","vt","waitForEvent","xt","waitForProperty","Mt","waitForQueue","Pt","Environment","reportUncaughtRejection","defer","deferable","globalDebuggingEnabled","EMBER_ENVIRONMENT","Ember","DEBUG_TASKS","cancelableSymbol","yieldableSymbol","YIELDABLE_CONTINUE","YIELDABLE_RETURN","YieldableState","taskInstance","resumeIndex","_taskInstance","_resumeIndex","getTaskInstance","proceed","return","throw","onYield","_deferable","def","_toPromise","thinInstance","_index","resumeType","maybeDisposer","AnimationFrameYieldable","RawTimeoutYieldable","ms","EmberYieldable","TimeoutYieldable","later","BoundedPolicy","maxConcurrency","TYPE_CANCELLED","TYPE_STARTED","STARTED","QUEUED","makeCancelState","EnqueuedReducer","remainingSlots","step","EnqueuedPolicy","makeReducer","CANCELLED","DropReducer","DropPolicy","KeepLatestReducer","numToCancel","KeepLatestPolicy","numRunning","numQueued","totalRunning","RestartableReducer","RestartablePolicy","taskFactorySymbol","propertyModifiers","restartable","setBufferPolicy","enqueue","keepLatest","setMaxConcurrency","group","taskGroupPath","setGroup","evented","setEvented","setDebug","onState","setOnState","callSuperSetup","setName","_setupEmberKVO","addPerformEvents","cancelOn","addCancelEvents","observes","addObserverKeys","setDecorator","taskComputed","cp","computed","X","LAST_APPLIED_TAGS","Refresh","schedulerPolicy","stateTracker","taskInstances","initialTaskInstances","startingInstances","filterFinishedTaskInstances","reducer","finalTaskInstances","setTaskInstanceExecutionState","computeFinalStates","applyState","taskState","stateFor","executorState","isFinished","onCompletion","hasStarted","desiredState","counted","onPerformed","onStart","onRunning","TYPE_QUEUED","onQueued","taskable","numPerformedInc","RefreshState","completionState","lastRunning","lastComplete","COMPLETION_SUCCESS","lastSuccessful","COMPLETION_ERROR","lastErrored","COMPLETION_CANCEL","lastCanceled","lastIncomplete","lastPerformed","recurseTaskGroups","applyStateFrom","CURRENT_REFRESH_TAGS","StateTracker","states","currentTag","computeRecursiveState","forEachState","lastState","NULL_STATE","NullStateTracker","Scheduler","stateTrackingEnabled","cancelRequest","cancelations","guids","cancelation","onFinalize","scheduleRefresh","refresh","SINGLETON_REDUCER","UnboundedPolicy","DEFAULT_STATE","performCount","TASK_CANCELATION_NAME","CANCEL_KIND_EXPLICIT","CANCEL_KIND_LIFESPAN_END","CancelRequest","finalize","guidId","Taskable","enabledModifiers","hasEnabledEvents","modifierOptions","onStateCallback","scheduler","cancelRequestKind","resetState","_resetState","_isAlive","isRunning","isQueued","isIdle","GeneratorStepResult","GeneratorState","generatorFactory","iterator","resolvedValue","iteratorMethod","getIterator","INITIAL_STATE","COMPLETION_PENDING","isSuccessful","isCanceled","PERFORM_TYPE_DEFAULT","PERFORM_TYPE_UNLINKED","PERFORM_TYPE_LINKED","CANCEL_RETURN_VALUE_SENTINEL","TASK_INSTANCE_STACK","TaskInstanceExecutor","generatorState","disposers","finalizeCallbacks","proceedSync","onStarted","requestCancel","proceedWithCancelAsync","finalizeWithCancel","proceedChecked","yieldResumeType","advanceIndex","YIELDABLE_CANCEL","proceedAsync","dispose","handleResolvedReturnedValue","handleResolvedContinueValue","resumeValue","beforeIndex","stepResult","generatorStep","handleYieldedValue","YIELDABLE_THROW","handleYieldedUnknownThenable","thenable","yieldedValue","addDisposer","invokeYieldable","proceedWithSimpleValue","disposer","nextValue","_expectsLinkedYield","performType","maybeResolveDefer","runFinalizeCallbacks","maybeThrowUnhandledTaskErrorLater","asyncErrorsHandled","finalizeShared","cancelReason","formatCancelReason","debugEnabled","dispatchFinalizeEvents","onSuccess","onCancel","onYielded","getPerformType","detectSelfCancelLoop","parentCancelRequest","selfCancelLoopWarning","TaskLinkProxy","linkedObject","_performShared","Ie","_perform","linked","unlinked","_clone","_curryArgs","fullArgs","_taskInstanceFactory","_taskInstanceOptions","_linkedObject","Ae","MODIFIER_REGISTRY","factory","groupName","taskDefinition","_defineProperty","_processModifierOptions","createTask","getTaskOptions","Task$1","createTaskGroup","TaskGroup$1","getScheduler","_onStateCallback","_taskGroupPath","_schedulerPolicyClass","_maxConcurrency","_debug","_hasEnabledEvents","_enabledModifiers","policy","_hasSetBufferPolicy","_hasSetConcurrencyConstraint","setTaskDefinition","BaseTaskInstance","parentTaskInstance","isDropped","applyTracked","initial","propDesc","initializer","tracked","TRACKED_INITIAL_TASK_STATE","TRACKED_INITIAL_INSTANCE_STATE","_recomputeState","triggerEvent","getName","parentName","childName","allArgs","eventNamespace","trigger","TASKABLE_MIXIN","_performCount","derivedState","isDestroying","registerDestructor","currentTaskInstanceSymbol","EncapsulatedTask","taskObj","_encapsulatedTaskStates","_encapsulatedTaskInstanceProxies","_getEncapsulatedTaskClass","encapsulatedTaskImplClass","_encapsulatedTaskImplClass","EmberObject","unknownProperty","taskInstanceProxy","owner","getOwner","encapsulatedTaskImpl","setOwner","_wrappedEncapsulatedTaskInstance","proxy","ownKeys","EmberScheduler","handlerCounter","registerOnPrototype","addListenerOrObserver","taskName","handlerName","makeTaskCallback","scheduleOnce","ensureArray","possibleArr","eventNames","propertyPaths","TaskFactory","TaskFactory$1","cancelEventNames","_cancelEventNames","_observes","_eventNames","addListener","addObserver","taskFn","taskFromPropertyDescriptor","factoryClass","displayName","tasks","taskGroupPropertyDescriptor","_target","_descriptor","taskGroups","decoratorWithParams","descriptorFn","possibleDesc","createDecorator","baseOptions","userOptions","createTaskDecorator","createTaskGroupDecorator","lastInstance","taskFnOrProtoOrDecoratorOptions","isDecoratorOptions","task$1","taskProperty","possibleDecoratorOptions","taskGroup$1","tp","possibleOptions","taskAwareVariantOf","RSVP","identity","Promise$1","getValues","castForPromiseHelper","castable","getItems","awaitable","awaitables","arrOrHash","hasCancelled","WaitForQueueYieldable","queueName","WaitForEventYieldable","usesDOMEvents","off","WaitForPropertyYieldable","predicateCallback","observerBound","observerFn","removeObserver","one","DEFAULTS","CookiesService","Service","_fastBoot","_getDocumentCookies","_document","_filterDocumentCookies","_getFastBootCookies","fastBootCookies","fastBootCookiesCache","_fastBootCookiesCache","mergedFastBootCookies","_filterCachedFastBootCookies","domain","_isFastBoot","_decodeValue","signed","_encodeValue","_isCookieSizeAcceptable","_writeFastBootCookie","httpOnly","_normalizedDefaultPath","_writeDocumentCookie","exists","serializedCookie","_serializeCookie","_cacheFastBootCookie","replaced","getAll","fastBootCache","cachedOptions","getSeconds","requestPath","optionsPath","isNone","unfilteredCookies","separatorIndex","isPresent","serializeCookie","typeOf","secure","sameSite","partitioned","_byteCount","isFastBoot","toPrimitive","UNINITIALIZED","ElementHelper","Helper","compute","componentClass","ensureSafeComponent","EmberComponent","runInDebug","getDataSupport","DataTransferWrapper","dataTransfer","itemDetails","getData","filesOrItems","files","DragListener","_class$1","dropzone","_dropzone","beginListening","_handlersAttached","endListening","addEventListeners","_listeners","insertAt","removeEventListeners","findListener","getEventSource","areSomeTypesFiles","getDataTransferItemDetails","lastListener","scheduleEvent","_listener","isDuplicate","queuedEvent","cancelledEvent","_scheduled","sendEvents","_applyDecoratedDescriptor","action","DragListenerModifier","Modifier","modify","TEMPLATE","createTemplateFactory","isStrictMode","FileDropzoneComponent","_class","Component","_initializerDefineProperty","_descriptor2","_descriptor3","queue","fileQueue","findOrCreate","DEFAULT_QUEUE","multiple","dataTransferWrapper","isAllowed","resolveRegistration","allowUploadsFromWebsites","didEnterDropzone","dropEffect","onDragEnter","didLeaveDropzone","onDragLeave","didDragOver","didDrop","addedFiles","addFiles","onDrop","file","File","uploadFile","UploadFile","FileSource","DragAndDrop","inject","setComponentTemplate","_source","_name$1","_size","_classPrivateFieldInitSpec","guidFor","_descriptor4","_descriptor5","_classPrivateFieldSet","_classPrivateFieldGet","estimatedRate","rates","extension","uploadBinary","upload","uploadStarted","form","fileKey","readAsArrayBuffer","UploadFileReader","readAsDataURL","readAsBinaryString","readAsText","fromBlob","fromDataURL","dataURL","DataUrl","typeInfo","mimeType","binaryString","atob","binaryData","FileState","Queued","Queue","_distinctFiles","Uploading","loaded","progress","TrackedSet","_positional","onFilesSelected","changeHandler","fileList","selectedFiles","Browse","eager","removeListener","onFileAdded","onFileRemoved","onUploadStarted","uploadSucceeded","onUploadSucceeded","uploadFailed","onUploadFailed","Uploaded","Aborted","_queues","FileQueueService","TrackedMap","queues","FileQueueHelper","named","_Event","bubbles","defaultPrevented","httpStatusCodes","unsafeHeaders","Connection","Cookie","Cookie2","Expect","Host","TE","Trailer","Upgrade","Via","_addEventListener","EventedObject","_eventListeners","FakeXMLHttpRequest","UNSENT","statusText","onloadend","onloadstart","onprogress","ontimeout","listeners","dispatchEvent","_progress","lengthComputable","total","OPENED","HEADERS_RECEIVED","LOADING","DONE","FakeXMLHttpRequestProto","withCredentials","responseXML","sendFlag","_readyStateChange","verifyState","hasContentTypeHeader","errorFlag","onSend","abort","aborted","overrideMimeType","forceMimeType","_setResponseHeaders","_setResponseBody","chunkSize","xmlDoc","DOMParser","parseFromString","ActiveXObject","loadXML","respond","__WEBPACK_DEFAULT_EXPORT__","cw","ZH","_k","td","z9","classCallCheck","Constructor","createClass","protoProps","staticProps","icPart","instances","Inflector","plurals","singulars","uncountables","humans","acronyms","acronymRegex","word","singular","s0","sRest","p0","pRest","sRestIC","pRestIC","words","defaults$1","en","inflector","irregular","uncountable","inflections","getInstance","applyInflections","ii","pluralize","singularize","capitalize","camelize","term","uppercaseFirstLetter","idx","underscore","camelCasedWord","$1","$2","dasherize","underscoredWord","DEFAULT_APPROXIMATIONS","instances$1","Transliterator","approximations","approximate","construct","sham","valueOf","re","ReferenceError","ie","se","ce","le","ae","ue","referenceSort","edges","uniq","sorted","predecessors","outgoing","edge","preds","ActiveModelSerializer","Collection","Factory","IdentityManager","JSONAPISerializer","rt","Model","tt","PretenderInterceptor","RestSerializer","Serializer","Server","_t","_Db","_DbCollection","_RouteHandler","_SerializerRegistry","ot","_assert","_ormAssociationsAssociation","_ormAssociationsBelongsTo","_ormAssociationsHasMany","je","_ormPolymorphicCollection","_ormSchema","_routeHandlersBase","_routeHandlersFunction","_routeHandlersObject","Ke","_routeHandlersShorthandsBase","We","_routeHandlersShorthandsDelete","_routeHandlersShorthandsGet","_routeHandlersShorthandsHead","_routeHandlersShorthandsPost","$e","_routeHandlersShorthandsPut","Ve","_utilsExtend","_utilsInflectorCamelize","_utilsInflectorCapitalize","_utilsInflectorDasherize","ke","_utilsInflectorUnderscore","Ce","_utilsIsAssociation","_utilsReferenceSort","_utilsUuid","association","belongsTo","createServer","kt","hasMany","trait","build","topLevelAttrs","afterCreate","isTrait","refs","buildAttrs","_buildSingleValue","mapValues","isFunction","extend","newAttrs","Subclass","extractAfterCreateCallbacks","_this2","traits","afterCreateCallbacks","attrName","__isTrait__","_classCallCheck","_nextId","_ids","uniqueIdentifier","inc","traitsAndOverrides","__isAssociation__","camelizeCache","dasherizeCache","underscoreCache","capitalizeCache","camelized","camelize$1","lowerFirst","dasherized","dasherize$1","underscored","underscore$1","capitalized","capitalize$1","isAssociation","errorProps","bool","MirageError","tmp","Association","modelName","_typeof","ownerModelName","schema","isExplicitReflexive","inverse","isImplicitReflexive","polymorphic","getForeignKey","identifierCache$1","BelongsTo","_Association","identifier","foreignKey","ModelClass","modelPrototype","associationHash","belongsToAssociations","belongsToAssociationFks","addDependentAssociation","associationKeys","associationIdKeys","_tempAssociations","tempParent","isPolymorphic","toCollectionName","foreignKeyId","hasInverseFor","inverseFor","associate","new","save","reload","fk","where","potentialOwner","models","dependent","disassociate","duplicate","DbCollection","initialData","_records","identityManager","insert","_insertRecord","_findRecords","_findRecord","_findRecordBy","_findRecordsWhere","attributesForCreate","_slicedToArray","mergedAttributes","records","changedRecords","oldRecord","_updateRecord","isEqual","_this3","queryFunction","currentId","Db","identityManagers","_collections","registerIdentityManagers","loadData","createCollection","cloneDeep","collection","_IdentityManager","identityManagerFor","newCollection","recordsCopy","collections","_identityManagers","_container","invokeMap","filteredModels","sortedModels","_this$models","slicedModels","PolymorphicCollection","identifierCache","HasMany","hasManyAssociations","hasManyAssociationFks","tempChildren","compact","currentIds","pathModelClassCache","BaseRouteHandler","fullPath","segment","jsonApiDoc","serializerOrRegistry","_getJsonApiDocForRequest","_getIdForRequest","relationships","relationshipName","valueForRelationship","relationship","modelClassFor","associationFor","urlEncodedPart","_urlEncodedPart$split2","FunctionRouteHandler","_BaseRouteHandler","userFunction","server","serializerType","serializerFor","explicit","lowerCaseHeaders","_getAttrsForFormRequest","getModelClassFromPath","hasModelForModelName","_getAttrsForRequest","ObjectRouteHandler","BaseShorthandRouteHandler","shorthand","modelClass","handleStringShorthand","modelClasses","handleArrayShorthand","GetShorthandRouteHandler","_BaseShorthandRouteHa","camelizedModelName","coalesce","getCoalescedIds","PostShorthandRouteHandler","PutShorthandRouteHandler","DeleteShorthandRouteHandler","HeadShorthandRouteHandler","_model","DEFAULT_CODES","post","RouteHandler","verb","rawHandler","customizedCode","middleware","_construct","_getMirageResponseForRequest","mirageResponse","serializedMirageResponse","toRackResponse","setRequest","handleWithMiddleware","_toConsumableArray","_toMirageResponse","_middleware","_this4","_getCodeForResponse","Child","_inherits","_createSuper","_protoProps$construct","_assertThisInitialized","fks","_schema","_validateAttr","_setupAttr","_setupRelationship","toInternalCollectionName","isNew","_definePlainAttribute","isSaving","_saveAssociations","isSaved","_disassociateFromDependents","hasDbRecord","collectionName","getOwnPropertyDescriptors","associationsFor","associations","_explicitInverseFor","_implicitInverseFor","_checkForMultipleExplicitInverses","matchingPolymorphic","matchingInverse","modelMatches","inverseKeyMatches","candidateInverse","candidateIsImplicitInverse","candidateIsExplicitInverse","associatedModelOrCollection","alreadyAssociatedWith","existingProperty","isFk","_validateForeignKeyExistsInDatabase","isNull","isCollection","isArrayOfModels","isModelOrCollection","_isArrayOfModels","modelOrCollection","foreignKeyName","foreignKeys","foreignKeyLabel","_found","_association","_foreignKeyLabel","_saveBelongsToAssociations","_saveHasManyAssociations","_disassociateFromOldInverses","_saveNewAssociates","_associateWithNewInverses","_this5","_disassociateFromHasManyInverses","_disassociateFromBelongsToInverse","_this6","tempAssociation","associateIds","associateId","_updateInDb","_this7","dependentAssociationsFor","disassociateAllDependentsFromTarget","tempAssociate","__isSavingNewChildren","equals","fkValue","_syncTempAssociations","_this8","_associateModelWithInverse","_this9","inverseFk","ownerId","_newId","inverseCollection","currentIdsForInverse","newIdsForInverse","_this10","idLabel","findBelongsToAssociation","associationType","embed","_embedFn","serializeIds","primaryKey","primaryResource","buildPayload","toInclude","didSerialize","_this$getHashForPrima2","getHashForPrimaryResource","resourceHash","newIncludes","newDidSerialize","nextIncludedResource","_this$getHashForInclu2","getHashForIncludedResource","_resourceHash","newToInclude","_newDidSerialize","newJson","mergePayloads","hashWithRoot","_this$getHashForResou2","getHashForResource","addToIncludes","keyForResource","_serializer$getHashFo2","newModels","rootKey","keyForRelationship","removeForeignKeys","isModel","_hashForModel","modelSerializer","uniqBy","getKeysForIncluded","resourceHashKey","keyForModel","keyForCollection","_attrsForModel","getKeysForEmbedded","associatedResource","associatedResourceHash","formattedKey","keyForEmbeddedRelationship","_maybeAddAssociationIds","_formatAttributeKeys","newHash","keyForRelationshipIds","formattedTypeKey","keyForPolymorphicForeignKeyType","formattedIdKey","keyForPolymorphicForeignKeyId","_formattedKey","keyForForeignKey","_formattedKey2","keyForId","getAssociationKeys","formattedAttrs","formattedValue","valueForId","keyForAttribute","_Serializer","alwaysIncludeLinkageData","_createRequestedIncludesGraph","getAddToIncludesForResource","included","hasQueryParamIncludes","getResourceObjectForModel","relationshipPaths","getQueryParamIncludes","getAddToIncludesForResourceAndPaths","relationshipNames","getIncludesForResourceAndPath","nameForCurrentResource","modelsToAdd","typeKeyForModel","_maybeAddRelationshipsToResourceObjectForModel","relationshipKey","relationshipHash","hasLinksForRelationship","links","shouldIncludeLinkageData","_relationshipIsIncludedForModel","graphResource","graph","_includesGraph","graphKey","_graphKeyForModel","primaryResourceKey","_addPrimaryModelToRequestedIncludesGraph","includesPath","relationshipKeys","graphRelationshipKey","normalizedRelationshipKey","relationshipData","_addResourceToRequestedIncludesGraph","_addModelToRequestedIncludesGraph","resourceKey","_addResourceRelationshipsToRequestedIncludesGraph","SerializerRegistry","serializerMap","_serializerMap","_isModelOrCollection","_isCollection","_ref$explicit","SerializerForResponse","_isModel","newSerializerMaps","currentSerializerMap","collectionNameCache","internalCollectionNameCache","modelNameCache","Schema","modelsMap","_registry","_dependentAssociations","registerModels","forIn","registerModel","dependentAssociations","fksAddedFromThisModel","associationProperty","toModelName","setSchema","_association$getForei2","getForeignKeyArray","fkHolder","_addForeignKeyToRegistry","addMethodsToModelClass","findBy","findOrCreateBy","none","_instantiateModel","collectionForType","_hydrate","directDependents","polymorphicAssociations","modelFor","internalCollectionName","_modelFor","_foreignKeysFor","defaultInflector$1","Container","Class","defaultContainer","defaultPassthroughs","defaultRouteOptions","PretenderConfig","mirageServer","pretender","_create","passthroughChecks","alias","_this$pretender","_extractRouteArgument2","lastArg","allOptions","optionKeys","registerRouteHandler","_getFullPath","_config","_config$timing","useDefaultPassthroughs","_configureDefaultPassthroughs","trackRequests","urlPrefix","namespace","passthroughUrl","passthrough","Pretender","passthroughRequest","shouldLog","handledRequest","groupCollapsed","loggedRequest","loggedResponse","groupEnd","originalCheckPassthrough","checkPassthrough","passthroughCheck","unhandledRequest","namespaceError","_len2","paths","_key2","verbs","namespaceSub","shutdown","isPluralForModelCache","defaultInflector","interceptor","_this$interceptor$sta","_this$interceptor","routes","baseConfig","seeds","scenarios","register","logging","testConfig","registerSerializers","serializers","hasFactories","_hasModulesOfType","hasDefaultScenario","loadConfig","isTest","loadFactories","factories","loadFixtures","_this$interceptor$pas","_this$interceptor2","fixtures","camelizedArgs","missingKeys","pick","factoryMap","currentFactoryMap","_factoryMap","camelizedType","_len3","_key3","overrides","factorySequences","OriginalFactory","factoryFor","_validateTraits","mergedExtensions","_mergeExtensions","_mapAssociationsFromAttributes","amount","isInteger","_len4","_key4","buildArgs","_modelOrFactoryExistsForType","_len5","_key5","modelOrRecord","collectionFromCreateList","_len6","_key6","createArguments","resourceName","only","except","actionsMethodsAndsPathsMappings","methods","allActions","methodsWithPath","routeHandler","_mirageResponse","_serialize","modules","modulesOfType","typeOrCollectionName","modelOrFactoryExists","_modelOrFactoryExistsForTypeOrCollectionName","isPlural","isUncountable","isPluralForModel","modelExists","dbCollectionExists","_typeIsPluralForModel","traitName","allExtensions","accum","factoryAssociation","normalizeIds","belongsToKeys","hasManyKeys","jsonApiPayload","associationModel","_associationModel","restSerializer","uuid","commonjsGlobal","requiresPort","querystringify_1","pairs","slashes","protocolre","windowsDriveLetter","trimLeft","address","isSpecial","NaN","lolcation","loc","finaldestination","Url","scheme","extractProtocol","forwardSlashes","otherSlashes","slashesCount","extracted","instruction","instructions","ins","qs","urlParse","parseURL","fullpath","Registry","RouteRecognizer","PUT","DELETE","PATCH","HEAD","OPTIONS","Hosts","registries","forURL","global$1","support","viewClasses","isArrayBufferView","isView","normalizeName","normalizeValue","iteratorFor","consumed","fileReaderReady","reader","readBlobAsArrayBuffer","FileReader","bufferClone","view","Body","_initBody","_bodyInit","_bodyText","isPrototypeOf","_bodyBlob","_bodyFormData","_bodyArrayBuffer","rejected","decode$1","upcased","credentials","signal","reParamSearch","bodyInit","redirectStatuses","redirect","abortXhr","rawHeaders","polyfill","FakeFetch","NoopArray","_items","scheduleProgressEvent","totalTime","totalSize","elapsedTime","progressTransmitted","PASSTHROUGH","verbify","hosts","shouldNotTrack","handledRequests","passthroughRequests","unhandledRequests","requestReferences","forcePassthrough","disableUnhandled","_nativeXMLHttpRequest","running","FakeRequest","sendArguments","handleRequest","fakeXHR","nativeXMLHttpRequest","evts","uploadEvents","lifecycleProps","_passthroughRequest","eventable","createHandler","propertyNames","fromXHR","toXHR","createUploadHandler","_passthroughCheck","_fetchProps","argLength","maps","handlerInstance","numberOfCalls","recognized","recognize","_handlerFor","async_1","pretender_1","_handleRequest_1","statusHeadersAndBody","prepareHeaders","prepareBody","handleResponse","resolvedResult","erroredRequest","pretender_2","requiresManualResolution","_headers","_verb","_path","_request","ee","te","createObject","createMap","Target","delegate","willAddRoute","addChild","Matcher","generateMatch","startingPath","addRoute","routeArray","eachRoute","baseRoute","binding","nested","normalizeSegment","contextEntered","SEGMENT_RESERVED_CHARS","PATH_SEGMENT_ENCODINGS","encodePathSegment","escapeRegex","getParam","eachChar","currentState","generate","ENCODE_AND_DECODE_PATH_SEGMENTS","EmptyObject","EmptyArray","segments","shouldDecodes","isEqualCharSpec","spec","negate","State","nextStates","_regex","isMatch","recognizeChar","child$1","returned","RecognizeResults","decodeQueryParamPart","rootState","allSegments","as","handlersFor","hasRoute","generateQueryString","arrayPair","keyLength","isSlashDropped","hashStart","queryStart","originalPath","pathLen","solutions","astatics","adynamics","astars","ref$1","bstatics","bdynamics","bstars","captures","currentCapture","isDynamic","VERSION","Normalizer","addRouteCallback","pipelines","gif","byte4","byte5","hasAdditionalMetadata","animated","_file","Image","videoEl","load","audioEl","wired","wifi","dsl","gprs","offline","uploadHandler","network","esc","speed","ProgressEvent","timedOut","metadataPipelines","additionalMetadata","F","U","parseResponse","headerString","HTTPRequest","newPromise","_async","usename","TimedOut","Failed","Web","updateRate","updatedTime","timestampWhenProgressLastUpdated","timeElapsedSinceLastUpdate","bytesWhenProgressLastUpdated","uploadFn","accepts","Accept","isUploadComplete","waitForPromise","cancellablePromise","cancellable","THRESHOLDS","proportion","allRates","CALCULATE_FROM_LAST","weights","totalRates","proportions","proportionTotal","candidateSelectors","candidateSelector","NoElement","msMatchesSelector","webkitMatchesSelector","getCandidates","includeContainer","candidates","getCandidatesIteratively","elementsToCheck","assigned","assignedElements","nestedCandidates","getShadowRoot","validShadowRoot","shadowRootFilter","_nestedCandidates","getTabindex","isScope","tabIndex","sortOrderedTabbables","documentOrder","isInput","isZeroArea","_node$getBoundingClie","isNodeMatchingSelectorFocusable","disabled","displayCheck","nodeUnderDetails","nodeRootHost","nodeIsAttached","originalNode","getClientRects","isNodeMatchingSelectorTabbable","radioSet","radioScope","queryRadios","CSS","escape","isValidShadowRootTabbable","shadowHostNode","sortByOrder","regularTabbables","orderedTabbables","candidateTabindex","content","sortable","tabbable","isTabbable","focusableCandidateSelector","isFocusable","trapQueue","activeFocusTraps","activateTrap","trap","activeTrap","trapIndex","deactivateTrap","unpause","valueOrHandler","getActualTarget","createFocusTrap","_objectSpread2","returnFocusOnDeactivate","escapeDeactivates","delayInitialFocus","containers","containerGroups","tabbableGroups","nodeFocusedBeforeActivation","mostRecentlyFocusedNode","delayInitialFocusTimer","configOverrideOptions","optionName","configOptionName","findContainerIndex","tabbableNodes","getNodeForOption","optionValue","getInitialFocusNode","activeElement","firstTabbableGroup","firstTabbableNode","updateTabbableNodes","tabbableOptions","focusableNodes","lastTabbableNode","nextTabbableNode","forward","nodeIdx","tryFocus","preventScroll","getReturnFocusNode","previousActiveElement","checkPointerDown","clickOutsideDeactivates","deactivate","returnFocus","allowOutsideClick","checkFocusIn","targetContained","stopImmediatePropagation","checkKey","keyCode","destinationNode","containerIndex","containerGroup","startOfGroupIndex","destinationGroupIndex","lastOfGroupIndex","_destinationGroupIndex","checkClick","activate","activateOptions","onActivate","onPostActivate","checkCanFocusTrap","finishActivation","deactivateOptions","onDeactivate","onPostDeactivate","checkCanReturnFocus","finishDeactivation","updateContainerElements","containerElements","elementsAsArray","cap","capabilities","focusTrap","setModifierManager","createModifier","focusTrapOptions","isActive","shouldSelfFocus","installModifier","additionalElements","_createFocusTrap","initialFocus","createFocusTrap$1","updateModifier","destroyModifier","decorators","decorator","validModifiers","ifKey","keyCombo","KeyboardEvent","isKey","listenerName","_class2","service","emberService","activated","keyboardActivated","keyboardPriority","keyboardHandlers","keyboard","willDestroy","unregister","getMouseName","buttonCode","findPropertyDescriptor","keyResponder","DecoratedClass","_ClassAsKeyResponder","responder","keyboardHandlerNames","propertyValue","_emberKeyboardOnKeyDecoratorData","listenerNames","DEFAULT_EVENT_NAME","onKey","onKeyClassic","parentKeyboardHandlerNames","validKeys","formattedListener","keysString","mouseDown","mouseUp","touchEnd","touchStart","triggerKeyEvent","KeyboardListener","createMatchingKeyboardEvent","triggerKeyDown","triggerKeyPress","triggerKeyUp","getCode","getKeyCode","LL","u2","xZ","keyDown","keyPress","keyUp","ONLY_WHEN_FOCUSED_TAG_NAMES","onlyWhenFocused","onFocus","onFocusOut","setupProperties","activatedParamValue","isFocused","keyboardFirstResponder","canHandleKeyboardEvent","handleKeyboardEvent","ekEvent","modifier$1","triggerResponderListener","responderListenerName","KeyboardService","emberService__default","activeResponders","registeredResponders","sortedResponders","propName","convertValue","diff","firstResponders","normalResponders","FastBoot","emberKeyboardConfig","emberKeyboard","disableOnInputFields","_disableOnInput","_respond","run","isImmediatePropagationStopped","isPropagationStopped","previousPriorityLevel","POSITIVE_INFINITY","currentPriorityLevel","SHIFT_KEY_MAP","G","J","K","V","W","Z","MAC_ALT_KEY_MAP","å","ç","ƒ","µ","ø","π","œ","ß","Ω","ª","º","æ","MAC_SHIFT_ALT_KEY_MAP","Å","ı","Î","Ï","Ó","ˆ","Ô","Ò","Â","Ø","Œ","Í","ˇ","Á","ﬁ","ﬂ","Ú","Æ","ALL_SYMBOL","listenerOrListenerName","getPlatform","keyOrCode","keyboardEvent","mouseEvent","button","keyboardListener","onlyModifiers","ALL_MODIFIERS_EXCEPT_CMD","ALT_REGEX","SHIFT_REGEX","CTRL_REGEX","META_REGEX","CMD_REGEX","maybePlus","keyArrayOrString","keyArray","osName","_setRegisteredPollers","_setRegisteredTimers","cancelDebounce","cancelPoll","cancelTask","debounceTask","getTimeoutOrTestFallback","pollTask","runTask","scheduleTask","setShouldPoll","throttleTask","getTask","taskOrName","registeredTimers","mapForTesting","getTimers","destroyable","timers","cancelId","NULL_TIMER_ID","taskWrapper","taskArgs","throttleArgs","lastArgument","spacing","throttle","registeredPollers","_shouldPollOverride","getQueuedPollTasks","symbol","globalObj","queuedPollTasks","getNextToken","tick","pollers","pollToken","registeredDebounces","debounceArgs","pendingDebounces","debounces","debouncedTask","debounce","testTimeout","scaling","ClassBasedModifierManager","modifierClass","createdState","installedState","ClassBasedModifier","MANAGER","teardown","getDebugName","getDebugInstance","PageTitle","_dec","tokenId","scheduleTitleUpdate","RouterEvent","configKeys","PageTitleService","_dec2","prepend","_updateTitle","_validateExistingTitleElement","fromEnv","pageTitle","configValue","_defaultConfig","router","applyTokenDefaults","defaultSeparator","defaultPrepend","defaultReplace","inheritFromPrevious","tokenForId","_findTokenById","visibleTokens","visible","sortedTokens","appending","groups","frontGroups","front","lastToken","toBeTitle","updateFastbootTitle","titleDidUpdate","headElement","headChildNodes","titleEl","titleContents","_title","IsActiveHelper","_params","trackActiveRoute","handleQueryParams","ReplaceWithHelper","maybeEvent","replaceWith","RootURLHelper","rootURL","RouteParams","_router","_inputParams","_transitionTo","_replaceWith","_processedParams","urlFor","transitionTo","RouteParamsHelper","TransitionToHelper","UrlForHelper","possibleQueryParams","isQueryParams","currentURL","currentRouteName","maybeValue","set$1","isObject","StyleModifier","setStyles","newStyles","existingStyles","rulesToRemove","flat","AndHelper","truthConvert","eq","forceNumber","gte","isArray$1","lte","notEq","not","OrHelper","xor","isTruthy","keyList","equal","arrA","arrB","dateA","dateB","regexpA","regexpB","elementExists","getElement","addElement","removeElement","destroyRegistry","noop","CallbackType","enter","exit","Notifications","addCallback","removeElementNotification","elementNotificationExists","dispatchCallback","elementRegistry","setupObserver","unobserve","matchingRootEntry","findMatchingRootEntry","clearRootEntry","clearDefaultRoot","addEnterCallback","addExitCallback","dispatchEnterCallback","dispatchExitCallback","setupOnIntersection","ioEntries","onIntersection","potentialRootMatch","findRootFromRegistry","matchingEntryForRoot","determineMatchingElements","intersectionObserver","observerEntry","newObserver","stringifiedOptions","stringifyOptions","rootMargin","newIO","IntersectionObserver","isIntersecting","intersectionRatio","matchingRoot","matchingStringifiedOptions","comparableOptions","areOptionsSame","type1","type2","replacer","classToken","windowRoot","converter","defaultAttributes","stringifiedAttributes","jar","withAttributes","withConverter","__WEBPACK_AMD_DEFINE_RESULT__","JS_SHA256_NO_WINDOW","WEB_WORKER","NODE_JS","JS_SHA256_NO_NODE_JS","versions","COMMON_JS","JS_SHA256_NO_COMMON_JS","AMD","ARRAY_BUFFER","JS_SHA256_NO_ARRAY_BUFFER","HEX_CHARS","EXTRA","SHIFT","OUTPUT_TYPES","blocks","JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW","createOutputMethod","outputType","is224","Sha256","createMethod","nodeWrap","eval","Buffer","nodeMethod","createHash","createHmacOutputMethod","HmacSha256","createHmacMethod","sharedMemory","h0","h1","h2","h3","h4","h5","h6","h7","hBytes","finalized","hashed","oKeyPad","iKeyPad","notString","lastByteIndex","s1","maj","t1","ab","da","cd","bc","setUint32","innerHash","sha256","sha224","hmac","__webpack_require__","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","setCacheAdd","setCacheHas","SetCache","__data__","stackClear","stackDelete","stackGet","stackHas","stackSet","Stack","predicate","resIndex","baseIndexOf","comparator","baseTimes","isArguments","isBuffer","isIndex","isTypedArray","inherited","isArr","isArg","isBuff","isType","skipIndexes","baseAssignValue","objValue","copyObject","keysIn","arrayEach","assignValue","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","getAllKeysIn","getTag","initCloneArray","initCloneByTag","initCloneObject","isMap","isSet","argsTag","funcTag","objectTag","cloneableTags","baseClone","bitmask","customizer","isDeep","isFlat","isFull","isFunc","stacked","subValue","objectCreate","baseCreate","baseForOwn","baseEach","fromIndex","fromRight","arrayPush","isFlattenable","baseFlatten","isStrict","baseFor","castPath","toKey","keysFunc","symbolsFunc","getRawTag","symToStringTag","toStringTag","baseFindIndex","baseIsNaN","strictIndexOf","baseGetTag","isObjectLike","baseIsEqualDeep","baseIsEqual","equalArrays","equalByTag","equalObjects","arrayTag","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","toSource","reIsHostCtor","funcProto","objectProto","funcToString","reIsNative","isLength","typedArrayTags","baseMatches","baseMatchesProperty","isPrototype","nativeKeysIn","isProto","isArrayLike","baseIsMatch","getMatchData","matchesStrictComparable","hasIn","isStrictComparable","basePickBy","baseGet","baseSet","overRest","setToString","constant","baseSetToString","arrayMap","isSymbol","symbolProto","symbolToString","baseToString","trimmedEndIndex","reTrimStart","arrayIncludes","arrayIncludesWith","cacheHas","createSet","setToArray","isCommon","seen","outer","seenIndex","stringToPath","baseSlice","freeExports","freeModule","allocUnsafe","copy","cloneArrayBuffer","reFlags","regexp","symbolValueOf","getSymbols","getSymbolsIn","coreJsData","baseRest","isIterateeCall","assigner","guard","eachFunc","iterable","castSlice","hasUnicode","stringToArray","strSymbols","chr","baseIteratee","findIndexFunc","getNative","arraySome","isPartial","arrLength","othLength","arrStacked","othStacked","arrValue","othValue","compared","othIndex","mapToArray","convert","objProps","objLength","objStacked","skipCtor","objCtor","othCtor","freeGlobal","baseGetAllKeys","isKeyable","baseIsNative","getValue","getPrototype","nativeObjectToString","isOwn","unmasked","arrayFilter","stubArray","nativeGetSymbols","mapTag","promiseTag","weakMapTag","dataViewTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","Ctor","ctorString","hasFunc","reHasUnicode","nativeCreate","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","spreadableSymbol","isConcatSpreadable","reIsUint","reIsDeepProp","reIsPlainProp","maskSrcKey","IE_PROTO","assocIndexOf","getMapData","freeProcess","nodeUtil","nativeMax","otherArgs","freeSelf","nativeNow","lastCalled","stamp","LARGE_ARRAY_SIZE","asciiToArray","unicodeToArray","memoizeCapped","rePropName","reEscapeChar","quote","subString","reWhitespace","rsAstralRange","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsModifier","rsOptVar","rsSeq","rsSymbol","reUnicode","createAssigner","CLONE_DEEP_FLAG","toInteger","castFunction","baseHas","hasPath","baseHasIn","baseInvoke","baseIsArguments","stubFalse","baseKeys","baseIsMap","baseUnary","nodeIsMap","objectCtorString","baseIsSet","nodeIsSet","baseIsTypedArray","nodeIsTypedArray","arrayLikeKeys","baseKeysIn","baseMap","memoized","Cache","basePick","baseProperty","basePropertyDeep","toNumber","INFINITY","toFinite","remainder","baseTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","isBinary","baseUniq","baseValues","RAFAdmin","pool","elementId","isUndefined","addClass","getClass","classPrefix","removeClass","updateClasses","deferred","_scrollBarSize","getScrollBarSize","pointerEvents","widthContained","widthScroll","zeroPosCache","zeroElement","getBounds","docEl","_getActualBoundingClientRect","boundingRect","frameElement","frameRect","Abutment","_this$cache","targetPos","getTargetBounds","abutted","targetPosSide","_this$options","addTargetClasses","BOUNDS_FORMAT","Constraint","targetAttachment","constraints","bodyElement","lastSize","_this$lastSize","targetSize","targetHeight","targetWidth","allClasses","constraint","outOfBoundsClass","pinnedClass","addClasses","tAttachment","eAttachment","changeAttachX","changeAttachY","pin","_attachment$split","bounds","pinned","oob","oobClass","updateAttachClasses","Shift","shiftTop","shiftLeft","_shift","Evented","_proto","bindings","MIRROR_LR","MIRROR_TB","middle","OFFSET_MAP","addOffset","attachmentToOffset","offsetToPx","parseTopLeft","_value$split","TetherBase","isFullscreenElement","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","lastCall","lastDuration","pendingTimeout","transformKey","transforms","tethers","TetherClass","_Evented","targetModifier","jquery","_addClasses","parents","_style","targetScrollTop","targetIsBody","scrollBottom","borderTopWidth","borderBottomWidth","borderLeftWidth","fitAdj","pow","scrollPercentage","clearCache","_this$options2","_this$options3","_removeClasses","elementAttach","targetAttach","_this$options4","_addAttachClasses","flushChanges","relativeToAttachment","elementPos","manualOffset","manualTargetOffset","ret","scrollbarSize","page","optimizations","moveElement","offsetPosition","offsetParentStyle","offsetParentSize","offsetBorder","move","same","point","transcribe","_same","_pos","yPos","xPos","gpu","allowPositionFixed","moved","offsetParentIsBody","writeCSS","_this$options5","_this$options6","Tether","_this$options7","markers","dot","_this$markers$type$do","TrackedArray","TrackedObject","TrackedWeakMap","TrackedWeakSet","readStorageFor","storages","createStorage","dirtyStorageFor","setValue","vals","storageFor","union","intersection","difference","symmetricDifference","isSubsetOf","isSupersetOf","isDisjointFrom","ARRAY_GETTER_METHODS","ARRAY_WRITE_THEN_READ_METHODS","convertToInt","_collection","_storages","_TrackedArray_brand","mapfn","boundFns","nativelyAccessingLengthFromPushOrUnshift","_assertClassBrand","_readStorageFor","_dirtyStorageFor","_dirtyCollection","TrackedObjectImplementation","_TrackedObjectImplementation_brand","descs","deleteProperty","tracked$1","dedupeTracked","localCopy","trackedReset","getOrCreateMeta","metas","memoFn","prevRemote","incomingValue","memoOrConfig","_prototype","caches","createCache","BufferedChangeset","CHANGESET","Change","Changeset","ValidatedChangeset","ValidationChangeset","ValidationChangesetFactory","arrayToObject","buildOldValues","changeset","getChangeValue","getDeep","getKeyValues","isArrayObject","isChange","isChangeset","isPromise","keyInObject","lookupValidator","mergeDeep","mergeNested","normalizeObject","objectToArray","objectWithout","propertyIsUnsafe","pureAssign","setDeep","take","EMPTY","serialize_toString","PRIMITIVE","asString","ARRAY","OBJECT","DATE","REGEXP","MAP","SET","shouldSkip","esm","structuredClone","any","deserialize","lossy","strict","BIGINT","deserializer","unpair","BigInt","VALUE","maybeChange","validation","keysUpToValue","getKeyErrorValues","handleValidationsAsync","validations","maybeFailed","getSubObject","validationMap","changes","validator","validate","validators","Notifier","notifierForEvent","_eventedNotifiers","notifier","hasKey","safeGet","pathInChanges","isObj","hasChanges","objects","validatorMap","keysUpToFunction","flattenValidations","__changeset__","baseKey","findSiblings","leafKey","isValidKey","safeSet","orig","isComplex","changeValue","siblings","nestedKeys","validated_changeset_es5_keys","finalObj","change","propertyIsOnObject","buildPathToValue","kv","possibleKeys","possible","mergeTargetAndSource","stringValue","sourceIsArray","targetIsArray","sourceIsArrayLike","objectProxyHandler","childValue","childContent","ObjectTreeNode","nodeContent","defaultSafeGet","isObject$1","unwrap","excludedKeys","originalObj","keysToTake","keys$1","CONTENT","PREVIOUS_CONTENT","CHANGES","ERRORS","ERRORS_CACHE","maybeUnwrapProxy","newFormat","isValid","isPristine","validationKeys","userChangesetKeys","changesetKeys","isInvalid","isDirty","setUnknownProperty","chKey","_setProperty","execute","oldContent","unexecute","rollback","_rollbackKeys","_notifyVirtualProperties","rollbackInvalid","_deleteKey","errKey","addError","newError","removeError","removeErrors","pushErrors","newErrors","existingError","getChangesForSnapshot","restore","newChanges","getChangesFromSnapshot","getChangeForProp","v2","v1","previousNode","currentKey","changesValue","baseChanges","normalizedBaseChanges","baseContent","subContent","subChanges","targetBuffer","keys$2","CONTENT$1","PREVIOUS_CONTENT$1","CHANGES$1","ERRORS$1","ERRORS_CACHE$1","VALIDATOR","OPTIONS$1","RUNNING_VALIDATIONS","AFTER_VALIDATION_EVENT","defaultValidatorFn","skipValidate","maybeUnwrapProxy$1","validateFn","validatorMapKeys","initValidate","_collectErrors","_bareChanges","_handleValidation","_validateKey","prepare","prepareChangesFn","preparedChanges","savePromise","maybePromise","e1","newChangeset","ValidatedChangeset$1","mergedErrors","mergedChanges","rollbackProperty","cast","allowed","casted","isValidating","runningValidations","ks","_validate","_setIsValidating","promises","resolvedValidation","_isValidResult","validationResult","validationError","changeset$1","Changeset$1","errorSummary","responseJSON","asyncIterator","_invoke","_sent","dispatchException","abrupt","__await","resultName","nextLoc","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","completion","isGeneratorFunction","awrap","AsyncIterator","rval","delegateYield","regeneratorRuntime","getJSON","_cancelHandlers","_isPending","_isCanceled","_rejectOnCancel","_promise","shouldReject","CancelError","ir","Ct","It","At","Rt","Dt","Ut","Lt","Ft","Ht","Bt","jt","qt","zt","Gt","Ot","Nt","Kt","Wt","Yt","Vt","rn","an","Zt","un","Jt","tn","nn","ln","dn","hn","yn","vn","_n","bn","En","Yn","errorLink","errorId","errorCauses","btoa","UTC","documentMode","be","saveAuthnState","storageUtil","storageManager","getHttpCache","cacheResponse","getStorage","Authorization","httpRequestClient","stateToken","updateStorage","transformErrorXHR","getIssuerOrigin","httpRequest","rememberDevice","autoPush","transactionCallBack","isPolling","factorResult","hints","allow","factorType","updatePhone","_embedded","tx","_get","DEFAULT_CODE_CHALLENGE_METHOD","generateVerifier","computeChallenge","storageName","storageProvider","clearStorage","setStorage","storageManagerOptions","cookieOptions","storageType","storageTypes","findStorageType","getStorageByType","getOptionsForSection","storageKey","interactionHandle","Qe","legacyWidgetSupport","saveNonceCookie","saveStateCookie","saveParamsCookie","getTransactionStorage","oauth","clearLegacyOAuthParams","pkce","clearLegacyPKCE","ignoreSignature","loadLegacyOAuthParams","loadLegacyPKCE","testStorageType","getLegacyPKCEStorage","getLegacyOAuthParamsStorage","template","tokenUrl","authorizeUrl","userinfoUrl","revokeUrl","logoutUrl","transformAuthState","restoreOriginalUri","devMode","transactionManager","introspect","ht","getPKCEStorage","browserHasLocalStorage","getLocalStorage","testStorage","browserHasSessionStorage","getSessionStorage","getCookieStorage","getInMemoryStorage","localStorage","useMultipleCookies","checkAccountSetupComplete","redirectUrl","client_id","code_challenge","code_challenge_method","idp","idp_scope","idpScope","max_age","redirect_uri","response_mode","response_type","sessionToken","authorizationCode","interactionCode","grant_type","code_verifier","interaction_code","attachEvent","detachEvent","popupTitle","Xt","features","isPKCESupported","isHTTPS","hasTextEncoder","code_challenge_methods_supported","Qt","aud","exp","maxClockSkew","signature","token_type_hint","use","verify","isTokenVerifySupported","at_hash","isPopupPostMessageSupported","cn","tokenManager","getTokens","pn","gn","getWithRedirect","_setLocation","mn","parseFromUrl","_getLocation","_getHistory","_getDocument","Tn","localOffset","autoRenew","autoRemove","expireEarlySeconds","_storageEventDelay","Sn","On","An","xn","Pn","clock","Cn","emitter","Rn","Un","jn","Qn","In","expireTimeouts","renewPromise","Mn","Ln","Nn","Dn","Fn","Hn","Kn","isLocalhost","qn","Bn","Gn","Wn","zn","Jn","wn","Vn","renewTokensWithRefresh","renew","Xn","tokenKey","$n","Zn","getTokenStorage","hasExpired","setTokens","_getStorageKeyByType","_clearExpireEventTimeoutAll","_getOptions","_resetExpireEventTimeoutAll","_emitEventsForCrossTabsStorageUpdate","er","thisObject","tr","nr","rr","isPending","isAuthenticated","or","updateAuthStatePromise","canceledTimes","_sdk","_pending","_authState","_logOptions","_setLogOptions","updateAuthState","authStateChange","sr","ur","cr","fr","lr","handleLogin","setCookieAndRedirect","_tokenQueue","prepareTokenParams","exchangeCodeForTokens","getWithoutPrompt","getWithPopup","revoke","renewTokens","getUserInfo","isLoginRedirect","authStateManager","signInWithCredentials","sendFingerprint","originalUri","setOriginalUri","revokeAccessToken","revokeRefreshToken","getAuthState","subscribe","getOriginalUri","removeOriginalUri","storeTokensFromRedirect","t0","hasResponseType","hr","InvalidTokenError","decoded","_WINDOW","_DOCUMENT","_MUTATION_OBSERVER","_PERFORMANCE","MUTATION_OBSERVER","PERFORMANCE","IS_DOM","IS_IE","classic","fa","fas","far","fal","fat","fab","duotone","fad","fadr","fadl","fadt","sharp","fass","fasr","fasl","fast","fasds","fasdr","fasdl","fasdt","defaultShortPrefixId","defaultStyleId","futureStyleIds","defaultFontWeight","t$1","GROUP","SWAP_OPACITY","PRIMARY","SECONDARY","bt$1","ga","Ia","F$1","ma","NAMESPACE_IDENTIFIER","UNITS_IN_GRID","DEFAULT_REPLACEMENT_CLASS","DATA_FA_I2SVG","DATA_FA_PSEUDO_ELEMENT","DATA_PREFIX","DATA_ICON","HTML_CLASS_I2SVG_BASE_CLASS","TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS","PRODUCTION","e$$1","familyProxy","_PREFIX_TO_STYLE","fak","fakd","PREFIX_TO_STYLE","_STYLE_TO_PREFIX","solid","regular","light","thin","kit","STYLE_TO_PREFIX","_PREFIX_TO_LONG_STYLE","PREFIX_TO_LONG_STYLE","_LONG_STYLE_TO_PREFIX","ICON_SELECTION_SYNTAX_PATTERN","LAYERS_TEXT_CLASSNAME","FONT_FAMILY_PATTERN","ATTRIBUTES_WATCHED_FOR_MUTATION","normal","RESERVED_CLASSES","FontAwesomeConfig","_default","styleDefault","familyDefault","cssPrefix","replacementClass","autoReplaceSvg","autoAddCss","autoA11y","searchPseudoElements","observeMutations","mutateApproach","keepOriginalSource","measurePerformance","showMissingIcons","familyPrefix","_onChangeCb","d$2","meaninglessTransform","rotate","flipX","flipY","nextUniqueId","toArray","classArray","htmlEscape","joinStyles","styleName","transformIsMeaningful","dcp","drc","rc","dPatt","customPropPatt","rPatt","_cssInserted","ensureCss","headChildren","beforeChild","InjectCSS","mixout","insertCss","beforeDOMElementCreation","beforeI2svg","shims","functions","toHtml","abstractNodes","iconFromMapping","mapping","iconName","icon","doScroll","subject","thisContext","toHex","unicode","normalizeIcons","icons","defineIcons","skipHooks","addPack","FAMILY_NAMES","PREFIXES_FOR_FAMILY","_defaultUsablePrefix","_byUnicode","_byLigature","_byOldName","_byOldUnicode","_byAlias","o$$1","a$$1","hasRegular","autoFetchSvg","shimLookups","shim","maybeNameMaybeUnicode","unicodes","getCanonicalPrefix","byUnicode","byAlias","byOldName","getDefaultUsablePrefix","styleOrPrefix","defined","sortedUniqueValues","getCanonicalIcon","skipLookups","givenPrefix","faCombinedClasses","faStyleOrFamilyClasses","nonStyleOrFamilyClasses","faStyles","styleFromValues","famProps","v$$1","canonical","classNames","prefixOptions","config$$1","isDuotoneFamily","valuesHasDuotone","defaultFamilyIsDuotone","canonicalPrefixIsDuotone","newCanonicalFamilies","newCanonicalStyles","defaultPrefix","aliasIconName","c$$1","_plugins","providers","defaultProviderKeys","chainHooks","accumulator","hookFn","callHooks","callProvided","findIconDefinition","iconLookup","library","definitions","additions","_pullDefinitions","longPrefix","definition","i2svg","watch","autoReplaceSvgRoot","autoReplace","canonicalIcon","noAuto","domVariants","abstractCreator","abstract","makeInlineSvgAbstract","maskId","titleId","watchable","isUploadedIcon","attrClass","role","xmlns","uploadedIconWidthStyle","makeLayersTextAbstract","startCentered","styleString","styles$1","asFoundIcon","vectorData","missingIconResolutionMixin","findIcon","noop$1","p$2","preamble","perf","noop$2","isWatched","convertSVG","abstractObj","ceFn","mutators","createComment","replaceChild","nest","forSvg","splitClasses","toSvg","toNode","newInnerHTML","performOperationSync","callbackFunction","mutator","disableObservation","enableObservation","mo","treeCallback","nodeCallback","pseudoElementsCallback","observeMutationsRoot","mutationRecord","parseMeta","styleParser","extraClasses","existingPrefix","existingIconName","ligature","extraAttributes","focusable","pluginMeta","extraStyles","styles$2","generateMutation","nodeMeta","onTree","htmlClassList","hclAdd","suffix","hclRemove","prefixes","prefixesDomQuery","p$$1","resolvedMutations","onNode","iconDefinition","ReplaceElements","maybeIconDefinition","mutationObserverCallbacks","provides","providers$$1","generateSvgReplacementMutation","generateAbstractIcon","nextChild","containerWidth","iconWidth","Layers","layer","assembler","LayersCounter","LayersText","generateLayersText","computedFontSize","fontSize","boundingClientRect","CLEAN_CONTENT_PATTERN","SECONDARY_UNICODE_RANGE","_FONT_FAMILY_WEIGHT_TO_PREFIX","FontAwesome","FONT_FAMILY_WEIGHT_TO_PREFIX","FONT_FAMILY_WEIGHT_FALLBACK","fontFamily","replaceForPosition","pendingAttribute","alreadyProcessedPseudoElement","fontFamilyMatch","fontWeight","fontFamilySanitized","fontWeightInteger","fontWeightSanitized","hexValue","isSecondary","cleaned","codePoint","isPrependTen","isDoubled","isV4","iconIdentifier","iconName4","oldUnicode","newUnicode","processable","operations","PseudoElements","pseudoElements2svg","_unwatched","MutationObserver$1","unwatch","bootstrap","parseTransformString","transformString","PowerTransforms","parseNodeAttributes","generateAbstractTransformGrouping","innerTranslate","innerScale","innerRotate","ALL_SPACE","fillBlack","Masks","maskData","generateAbstractMask","explicitMaskId","mainWidth","mainPath","maskWidth","maskPath","trans","maskRect","maskInnerGroupChildrenMixin","maskInnerGroup","maskOuterGroup","clipId","maskTag","maskUnits","maskContentUnits","defs","MissingIconIndicator","reduceMotion","matchMedia","missingIconAbstract","gChildren","FILL","ANIMATION_BASE","attributeType","repeatCount","dur","OPACITY_ANIMATE","cx","cy","opacity","nextPlugins","mixoutsTo","tk","sk","symbolData","noAuto$1","config$1","library$1","dom$1","parse$1","findIconDefinition$1","toHtml$1","resolveInitializer","loadInitializers","explicitModules","initializerPrefix","instanceInitializerPrefix","initializers","instanceInitializers","requirejs","_eak_seen","moduleNames","instanceInitializer","b64","lens","getLens","validLen","placeHoldersLen","Arr","curByte","revLookup","uint8","extraBytes","maxChunkLength","len2","encodeChunk","tripletToBase64","Keycloak","adapter","callbackStorage","kc","refreshQueue","loginIframe","callbackList","iframeVersion","useNonce","logInfo","createLogger","logWarn","generateRandomString","alphabet","randomData","getRealmUrl","authServerUrl","processCallback","timeLocal","kc_action_status","onActionUpdate","onAuthError","setSuccess","flow","authSuccess","endpoints","scheduleCheckIframe","fulfillPromise","setToken","tokenParsed","storedNonce","refreshTokenParsed","idTokenParsed","clearToken","onAuthSuccess","fileLoaded","tokenTimeoutHandle","decodeToken","sessionId","session_state","authenticated","realmAccess","realm_access","resourceAccess","resource_access","timeSkew","onTokenExpired","createUUID","hexDigits","parseCallback","supportedParams","parsed","queryIndex","fragmentIndex","parseCallbackParams","paramsString","oauthParams","oauthState","valid","createPromise","setupCheckLoginIframe","authUrl","authorize","iframeOrigin","checkSessionIframe","checkLoginIframe","unchanged","check3pCookiesSupported","silentCheckSsoRedirectUri","thirdPartyCookiesIframe","messageCallback","silentCheckSsoFallback","timeoutHandle","timeoutPromise","messageReceiveTimeout","loadAdapter","login","createLoginUrl","createLogoutUrl","createRegisterUrl","accountManagement","accountUrl","createAccountUrl","encodeHash","cordovaOpenWindowWrapper","loginUrl","cordova","InAppBrowser","createCordovaOptions","cordovaOptions","cordovaRedirectUri","completed","closeBrowser","registerUrl","universalLinks","browsertab","openUrl","initOptions","didInitialize","CookieStorage","Cordova","checkLoginIframeInterval","loginRequired","pkceMethod","enableLogging","initPromise","onReady","configPromise","configUrl","setupOidcEndoints","oidcConfiguration","check_session_iframe","userinfo","oidcProvider","oidcProviderConfigUrl","doLogin","checkSsoSilently","ifrm","processInit","updateToken","checkReadyState","callbackState","idpHint","acr","claimsParameter","pkceChallenge","hasRealmRole","access","roles","hasResourceRole","loadUserProfile","loadUserInfo","userInfo","minValidity","onAuthRefreshSuccess","onAuthRefreshError","onAuthLogout","clearExpired","cs","getCookie","setCookie","cookieExpiration","minutes","setTime","ca","expirationDate"],"sources":["webpack://__ember_auto_import__/src/utils/Constants.ts","webpack://__ember_auto_import__/src/authority/AuthorityType.ts","webpack://__ember_auto_import__/src/authority/ProtocolMode.ts","webpack://__ember_auto_import__/src/error/AuthError.ts","webpack://__ember_auto_import__/src/error/ClientAuthError.ts","webpack://__ember_auto_import__/src/cache/entities/CredentialEntity.ts","webpack://__ember_auto_import__/src/cache/entities/IdTokenEntity.ts","webpack://__ember_auto_import__/src/error/ClientConfigurationError.ts","webpack://__ember_auto_import__/src/utils/StringUtils.ts","webpack://__ember_auto_import__/src/request/ScopeSet.ts","webpack://__ember_auto_import__/src/account/ClientInfo.ts","webpack://__ember_auto_import__/src/cache/entities/AccountEntity.ts","webpack://__ember_auto_import__/src/account/CcsCredential.ts","webpack://__ember_auto_import__/src/account/AuthToken.ts","webpack://__ember_auto_import__/src/packageMetadata.ts","webpack://__ember_auto_import__/src/cache/CacheManager.ts","webpack://__ember_auto_import__/src/utils/TimeUtils.ts","webpack://__ember_auto_import__/src/cache/entities/AccessTokenEntity.ts","webpack://__ember_auto_import__/src/cache/entities/RefreshTokenEntity.ts","webpack://__ember_auto_import__/src/cache/entities/AppMetadataEntity.ts","webpack://__ember_auto_import__/src/cache/entities/ServerTelemetryEntity.ts","webpack://__ember_auto_import__/src/cache/entities/AuthorityMetadataEntity.ts","webpack://__ember_auto_import__/src/cache/entities/ThrottlingEntity.ts","webpack://__ember_auto_import__/src/utils/ProtocolUtils.ts","webpack://__ember_auto_import__/src/cache/entities/CacheRecord.ts","webpack://__ember_auto_import__/src/utils/BrowserConstants.ts","webpack://__ember_auto_import__/src/crypto/ICrypto.ts","webpack://__ember_auto_import__/src/error/BrowserAuthError.ts","webpack://__ember_auto_import__/src/error/BrowserConfigurationAuthError.ts","webpack://__ember_auto_import__/src/telemetry/performance/PerformanceEvent.ts","webpack://__ember_auto_import__/src/cache/BrowserStorage.ts","webpack://__ember_auto_import__/src/cache/MemoryStorage.ts","webpack://__ember_auto_import__/src/url/UrlString.ts","webpack://__ember_auto_import__/src/utils/BrowserProtocolUtils.ts","webpack://__ember_auto_import__/src/cache/BrowserCacheManager.ts","webpack://__ember_auto_import__/src/logger/Logger.ts","webpack://__ember_auto_import__/src/authority/AuthorityOptions.ts","webpack://__ember_auto_import__/src/config/ClientConfiguration.ts","webpack://__ember_auto_import__/src/crypto/PopTokenGenerator.ts","webpack://__ember_auto_import__/src/error/ServerError.ts","webpack://__ember_auto_import__/src/network/ThrottlingUtils.ts","webpack://__ember_auto_import__/src/network/NetworkManager.ts","webpack://__ember_auto_import__/src/request/RequestValidator.ts","webpack://__ember_auto_import__/src/request/RequestParameterBuilder.ts","webpack://__ember_auto_import__/src/client/BaseClient.ts","webpack://__ember_auto_import__/src/error/InteractionRequiredAuthError.ts","webpack://__ember_auto_import__/src/cache/persistence/TokenCacheContext.ts","webpack://__ember_auto_import__/src/response/ResponseHandler.ts","webpack://__ember_auto_import__/src/client/AuthorizationCodeClient.ts","webpack://__ember_auto_import__/src/authority/OpenIdConfigResponse.ts","webpack://__ember_auto_import__/src/authority/AuthorityMetadata.ts","webpack://__ember_auto_import__/src/event/EventType.ts","webpack://__ember_auto_import__/src/error/NativeAuthError.ts","webpack://__ember_auto_import__/src/authority/RegionDiscovery.ts","webpack://__ember_auto_import__/src/authority/Authority.ts","webpack://__ember_auto_import__/src/authority/CloudInstanceDiscoveryResponse.ts","webpack://__ember_auto_import__/src/authority/CloudInstanceDiscoveryErrorResponse.ts","webpack://__ember_auto_import__/src/authority/AuthorityFactory.ts","webpack://__ember_auto_import__/src/telemetry/server/ServerTelemetryManager.ts","webpack://__ember_auto_import__/src/network/FetchClient.ts","webpack://__ember_auto_import__/src/network/XhrClient.ts","webpack://__ember_auto_import__/src/utils/BrowserUtils.ts","webpack://__ember_auto_import__/src/interaction_client/BaseInteractionClient.ts","webpack://__ember_auto_import__/src/interaction_client/StandardInteractionClient.ts","webpack://__ember_auto_import__/src/interaction_handler/InteractionHandler.ts","webpack://__ember_auto_import__/src/interaction_handler/RedirectHandler.ts","webpack://__ember_auto_import__/src/cache/CryptoKeyStore.ts","webpack://__ember_auto_import__/src/client/RefreshTokenClient.ts","webpack://__ember_auto_import__/src/client/SilentFlowClient.ts","webpack://__ember_auto_import__/src/interaction_client/SilentCacheClient.ts","webpack://__ember_auto_import__/src/interaction_client/NativeInteractionClient.ts","webpack://__ember_auto_import__/src/broker/nativeBroker/NativeMessageHandler.ts","webpack://__ember_auto_import__/src/interaction_client/RedirectClient.ts","webpack://__ember_auto_import__/src/interaction_client/PopupClient.ts","webpack://__ember_auto_import__/src/network/INetworkModule.ts","webpack://__ember_auto_import__/src/navigation/NavigationClient.ts","webpack://__ember_auto_import__/src/config/Configuration.ts","webpack://__ember_auto_import__/src/interaction_handler/SilentHandler.ts","webpack://__ember_auto_import__/src/interaction_client/SilentIframeClient.ts","webpack://__ember_auto_import__/src/interaction_client/SilentRefreshClient.ts","webpack://__ember_auto_import__/src/event/EventHandler.ts","webpack://__ember_auto_import__/src/error/JoseHeaderError.ts","webpack://__ember_auto_import__/src/crypto/JoseHeader.ts","webpack://__ember_auto_import__/src/utils/MathUtils.ts","webpack://__ember_auto_import__/src/crypto/GuidGenerator.ts","webpack://__ember_auto_import__/src/utils/BrowserStringUtils.ts","webpack://__ember_auto_import__/src/encode/Base64Encode.ts","webpack://__ember_auto_import__/src/encode/Base64Decode.ts","webpack://__ember_auto_import__/src/crypto/PkceGenerator.ts","webpack://__ember_auto_import__/src/crypto/ModernBrowserCrypto.ts","webpack://__ember_auto_import__/src/crypto/MsrBrowserCrypto.ts","webpack://__ember_auto_import__/src/crypto/MsBrowserCrypto.ts","webpack://__ember_auto_import__/src/crypto/BrowserCrypto.ts","webpack://__ember_auto_import__/src/cache/DatabaseStorage.ts","webpack://__ember_auto_import__/src/cache/AsyncMemoryStorage.ts","webpack://__ember_auto_import__/src/crypto/CryptoOps.ts","webpack://__ember_auto_import__/src/telemetry/performance/PerformanceClient.ts","webpack://__ember_auto_import__/src/telemetry/BrowserPerformanceMeasurement.ts","webpack://__ember_auto_import__/src/telemetry/BrowserPerformanceClient.ts","webpack://__ember_auto_import__/src/telemetry/performance/StubPerformanceClient.ts","webpack://__ember_auto_import__/src/cache/TokenCache.ts","webpack://__ember_auto_import__/src/interaction_client/HybridSpaAuthorizationCodeClient.ts","webpack://__ember_auto_import__/src/interaction_client/SilentAuthCodeClient.ts","webpack://__ember_auto_import__/src/app/ClientApplication.ts","webpack://__ember_auto_import__/src/app/PublicClientApplication.ts","webpack://__ember_auto_import__/src/app/IPublicClientApplication.ts","webpack://__ember_auto_import__/src/event/EventMessage.ts","webpack://__ember_auto_import__/src/crypto/SignedHttpRequest.ts","webpack://__ember_auto_import__/src/request/AuthenticationHeaderParser.ts","webpack://__ember_auto_import__/node_modules/.pnpm/@embroider+macros@1.16.10/node_modules/@embroider/macros/src/addon/es-compat2.js","webpack://__ember_auto_import__/node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.es6.mjs","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+fast-memoize@2.2.6/node_modules/@formatjs/fast-memoize/lib/index.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+icu-messageformat-parser@2.9.8/node_modules/@formatjs/icu-messageformat-parser/lib/error.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+icu-messageformat-parser@2.9.8/node_modules/@formatjs/icu-messageformat-parser/lib/types.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+icu-messageformat-parser@2.9.8/node_modules/@formatjs/icu-messageformat-parser/lib/regex.generated.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+icu-skeleton-parser@1.8.12/node_modules/@formatjs/icu-skeleton-parser/lib/date-time.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+icu-skeleton-parser@1.8.12/node_modules/@formatjs/icu-skeleton-parser/lib/regex.generated.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+icu-skeleton-parser@1.8.12/node_modules/@formatjs/icu-skeleton-parser/lib/number.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+icu-messageformat-parser@2.9.8/node_modules/@formatjs/icu-messageformat-parser/lib/time-data.generated.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+icu-messageformat-parser@2.9.8/node_modules/@formatjs/icu-messageformat-parser/lib/parser.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+icu-messageformat-parser@2.9.8/node_modules/@formatjs/icu-messageformat-parser/lib/date-time-pattern-generator.js","webpack://__ember_auto_import__/node_modules/.pnpm/intl-messageformat@10.7.11/node_modules/intl-messageformat/lib/src/error.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+icu-messageformat-parser@2.9.8/node_modules/@formatjs/icu-messageformat-parser/lib/index.js","webpack://__ember_auto_import__/node_modules/.pnpm/intl-messageformat@10.7.11/node_modules/intl-messageformat/lib/src/formatters.js","webpack://__ember_auto_import__/node_modules/.pnpm/intl-messageformat@10.7.11/node_modules/intl-messageformat/lib/src/core.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+intl@3.1.0_typescript@5.7.3/node_modules/@formatjs/intl/lib/src/error.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+intl@3.1.0_typescript@5.7.3/node_modules/@formatjs/intl/lib/src/utils.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+intl@3.1.0_typescript@5.7.3/node_modules/@formatjs/intl/lib/src/message.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+intl@3.1.0_typescript@5.7.3/node_modules/@formatjs/intl/lib/src/dateTime.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+intl@3.1.0_typescript@5.7.3/node_modules/@formatjs/intl/lib/src/displayName.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+intl@3.1.0_typescript@5.7.3/node_modules/@formatjs/intl/lib/src/list.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+intl@3.1.0_typescript@5.7.3/node_modules/@formatjs/intl/lib/src/plural.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+intl@3.1.0_typescript@5.7.3/node_modules/@formatjs/intl/lib/src/relativeTime.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+intl@3.1.0_typescript@5.7.3/node_modules/@formatjs/intl/lib/src/number.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+intl@3.1.0_typescript@5.7.3/node_modules/@formatjs/intl/lib/src/create-intl.js","webpack://__ember_auto_import__/node_modules/.pnpm/@formatjs+intl@3.1.0_typescript@5.7.3/node_modules/@formatjs/intl/lib/index.js","webpack://__ember_auto_import__/node_modules/.pnpm/@miragejs+pretender-node-polyfill@0.1.2/node_modules/@miragejs/pretender-node-polyfill/after.js","webpack://__ember_auto_import__/node_modules/.pnpm/@miragejs+pretender-node-polyfill@0.1.2/node_modules/@miragejs/pretender-node-polyfill/before.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/enums.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/math.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/userAgent.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/within.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getVariation.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/flip.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/hide.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/offset.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/createPopper.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/debounce.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/popper.js","webpack://__ember_auto_import__/node_modules/.pnpm/@popperjs+core@2.11.8/node_modules/@popperjs/core/lib/popper-lite.js","webpack://__ember_auto_import__/src/client.ts","webpack://__ember_auto_import__/src/debug-build.ts","webpack://__ember_auto_import__/src/eventbuilder.ts","webpack://__ember_auto_import__/src/feedbackAsync.ts","webpack://__ember_auto_import__/src/feedbackSync.ts","webpack://__ember_auto_import__/src/helpers.ts","webpack://__ember_auto_import__/src/integrations/breadcrumbs.ts","webpack://__ember_auto_import__/src/integrations/browserapierrors.ts","webpack://__ember_auto_import__/src/integrations/browsersession.ts","webpack://__ember_auto_import__/src/integrations/contextlines.ts","webpack://__ember_auto_import__/src/integrations/featureFlags/featureFlagsIntegration.ts","webpack://__ember_auto_import__/src/integrations/featureFlags/launchdarkly/integration.ts","webpack://__ember_auto_import__/src/integrations/featureFlags/openfeature/integration.ts","webpack://__ember_auto_import__/src/integrations/globalhandlers.ts","webpack://__ember_auto_import__/src/integrations/httpclient.ts","webpack://__ember_auto_import__/src/integrations/httpcontext.ts","webpack://__ember_auto_import__/src/integrations/linkederrors.ts","webpack://__ember_auto_import__/src/integrations/reportingobserver.ts","webpack://__ember_auto_import__/src/integrations/spotlight.ts","webpack://__ember_auto_import__/src/metrics.ts","webpack://__ember_auto_import__/src/profiling/integration.ts","webpack://__ember_auto_import__/src/profiling/startProfileForSpan.ts","webpack://__ember_auto_import__/src/profiling/utils.ts","webpack://__ember_auto_import__/src/sdk.ts","webpack://__ember_auto_import__/src/stack-parsers.ts","webpack://__ember_auto_import__/src/tracing/backgroundtab.ts","webpack://__ember_auto_import__/src/tracing/browserTracingIntegration.ts","webpack://__ember_auto_import__/src/tracing/request.ts","webpack://__ember_auto_import__/src/transports/fetch.ts","webpack://__ember_auto_import__/src/transports/offline.ts","webpack://__ember_auto_import__/src/userfeedback.ts","webpack://__ember_auto_import__/src/utils/featureFlags.ts","webpack://__ember_auto_import__/src/utils/lazyLoadIntegration.ts","webpack://__ember_auto_import__/src/api.ts","webpack://__ember_auto_import__/src/asyncContext/index.ts","webpack://__ember_auto_import__/src/asyncContext/stackStrategy.ts","webpack://__ember_auto_import__/src/baseclient.ts","webpack://__ember_auto_import__/src/breadcrumbs.ts","webpack://__ember_auto_import__/src/carrier.ts","webpack://__ember_auto_import__/src/checkin.ts","webpack://__ember_auto_import__/src/constants.ts","webpack://__ember_auto_import__/src/currentScopes.ts","webpack://__ember_auto_import__/src/defaultScopes.ts","webpack://__ember_auto_import__/src/envelope.ts","webpack://__ember_auto_import__/src/eventProcessors.ts","webpack://__ember_auto_import__/src/exports.ts","webpack://__ember_auto_import__/src/feedback.ts","webpack://__ember_auto_import__/src/fetch.ts","webpack://__ember_auto_import__/src/getCurrentHubShim.ts","webpack://__ember_auto_import__/src/integration.ts","webpack://__ember_auto_import__/src/integrations/captureconsole.ts","webpack://__ember_auto_import__/src/integrations/debug.ts","webpack://__ember_auto_import__/src/integrations/dedupe.ts","webpack://__ember_auto_import__/src/integrations/extraerrordata.ts","webpack://__ember_auto_import__/src/integrations/functiontostring.ts","webpack://__ember_auto_import__/src/integrations/inboundfilters.ts","webpack://__ember_auto_import__/src/integrations/metadata.ts","webpack://__ember_auto_import__/src/integrations/requestdata.ts","webpack://__ember_auto_import__/src/integrations/rewriteframes.ts","webpack://__ember_auto_import__/src/integrations/sessiontiming.ts","webpack://__ember_auto_import__/src/integrations/third-party-errors-filter.ts","webpack://__ember_auto_import__/src/integrations/zoderrors.ts","webpack://__ember_auto_import__/src/metadata.ts","webpack://__ember_auto_import__/src/metrics/aggregator.ts","webpack://__ember_auto_import__/src/metrics/browser-aggregator.ts","webpack://__ember_auto_import__/src/metrics/constants.ts","webpack://__ember_auto_import__/src/metrics/envelope.ts","webpack://__ember_auto_import__/src/metrics/exports-default.ts","webpack://__ember_auto_import__/src/metrics/exports.ts","webpack://__ember_auto_import__/src/metrics/instance.ts","webpack://__ember_auto_import__/src/metrics/metric-summary.ts","webpack://__ember_auto_import__/src/metrics/utils.ts","webpack://__ember_auto_import__/src/profiling.ts","webpack://__ember_auto_import__/src/scope.ts","webpack://__ember_auto_import__/src/semanticAttributes.ts","webpack://__ember_auto_import__/src/server-runtime-client.ts","webpack://__ember_auto_import__/src/session.ts","webpack://__ember_auto_import__/src/sessionflusher.ts","webpack://__ember_auto_import__/src/tracing/dynamicSamplingContext.ts","webpack://__ember_auto_import__/src/tracing/errors.ts","webpack://__ember_auto_import__/src/tracing/hubextensions.ts","webpack://__ember_auto_import__/src/tracing/idleSpan.ts","webpack://__ember_auto_import__/src/tracing/logSpans.ts","webpack://__ember_auto_import__/src/tracing/measurement.ts","webpack://__ember_auto_import__/src/tracing/sampling.ts","webpack://__ember_auto_import__/src/tracing/sentryNonRecordingSpan.ts","webpack://__ember_auto_import__/src/tracing/sentrySpan.ts","webpack://__ember_auto_import__/src/tracing/spanstatus.ts","webpack://__ember_auto_import__/src/tracing/trace.ts","webpack://__ember_auto_import__/src/tracing/utils.ts","webpack://__ember_auto_import__/src/transports/base.ts","webpack://__ember_auto_import__/src/transports/multiplexed.ts","webpack://__ember_auto_import__/src/trpc.ts","webpack://__ember_auto_import__/src/utils-hoist/aggregate-errors.ts","webpack://__ember_auto_import__/src/utils-hoist/anr.ts","webpack://__ember_auto_import__/src/utils-hoist/array.ts","webpack://__ember_auto_import__/src/utils-hoist/baggage.ts","webpack://__ember_auto_import__/src/utils-hoist/breadcrumb-log-level.ts","webpack://__ember_auto_import__/src/utils-hoist/browser.ts","webpack://__ember_auto_import__/src/utils-hoist/buildPolyfills/_asyncNullishCoalesce.ts","webpack://__ember_auto_import__/src/utils-hoist/buildPolyfills/_asyncOptionalChain.ts","webpack://__ember_auto_import__/src/utils-hoist/buildPolyfills/_asyncOptionalChainDelete.ts","webpack://__ember_auto_import__/src/utils-hoist/buildPolyfills/_nullishCoalesce.ts","webpack://__ember_auto_import__/src/utils-hoist/buildPolyfills/_optionalChain.ts","webpack://__ember_auto_import__/src/utils-hoist/buildPolyfills/_optionalChainDelete.ts","webpack://__ember_auto_import__/src/utils-hoist/cache.ts","webpack://__ember_auto_import__/src/utils-hoist/clientreport.ts","webpack://__ember_auto_import__/src/utils-hoist/cookie.ts","webpack://__ember_auto_import__/src/utils-hoist/debug-build.ts","webpack://__ember_auto_import__/src/utils-hoist/debug-ids.ts","webpack://__ember_auto_import__/src/utils-hoist/dsn.ts","webpack://__ember_auto_import__/src/utils-hoist/env.ts","webpack://__ember_auto_import__/src/utils-hoist/envelope.ts","webpack://__ember_auto_import__/src/utils-hoist/error.ts","webpack://__ember_auto_import__/src/utils-hoist/eventbuilder.ts","webpack://__ember_auto_import__/src/utils-hoist/instrument/console.ts","webpack://__ember_auto_import__/src/utils-hoist/instrument/fetch.ts","webpack://__ember_auto_import__/src/utils-hoist/instrument/globalError.ts","webpack://__ember_auto_import__/src/utils-hoist/instrument/globalUnhandledRejection.ts","webpack://__ember_auto_import__/src/utils-hoist/instrument/handlers.ts","webpack://__ember_auto_import__/src/utils-hoist/is.ts","webpack://__ember_auto_import__/src/utils-hoist/isBrowser.ts","webpack://__ember_auto_import__/src/utils-hoist/logger.ts","webpack://__ember_auto_import__/src/utils-hoist/lru.ts","webpack://__ember_auto_import__/src/utils-hoist/memo.ts","webpack://__ember_auto_import__/src/utils-hoist/misc.ts","webpack://__ember_auto_import__/src/utils-hoist/node-stack-trace.ts","webpack://__ember_auto_import__/src/utils-hoist/node.ts","webpack://__ember_auto_import__/src/utils-hoist/normalize.ts","webpack://__ember_auto_import__/src/utils-hoist/object.ts","webpack://__ember_auto_import__/src/utils-hoist/path.ts","webpack://__ember_auto_import__/src/utils-hoist/promisebuffer.ts","webpack://__ember_auto_import__/src/utils-hoist/propagationContext.ts","webpack://__ember_auto_import__/src/utils-hoist/ratelimit.ts","webpack://__ember_auto_import__/src/utils-hoist/requestdata.ts","webpack://__ember_auto_import__/src/utils-hoist/severity.ts","webpack://__ember_auto_import__/src/utils-hoist/stacktrace.ts","webpack://__ember_auto_import__/src/utils-hoist/string.ts","webpack://__ember_auto_import__/src/utils-hoist/supports.ts","webpack://__ember_auto_import__/src/utils-hoist/syncpromise.ts","webpack://__ember_auto_import__/src/utils-hoist/time.ts","webpack://__ember_auto_import__/src/utils-hoist/tracing.ts","webpack://__ember_auto_import__/src/utils-hoist/url.ts","webpack://__ember_auto_import__/src/utils-hoist/vendor/escapeStringForRegex.ts","webpack://__ember_auto_import__/src/utils-hoist/vendor/getIpAddress.ts","webpack://__ember_auto_import__/src/utils-hoist/vendor/supportsHistory.ts","webpack://__ember_auto_import__/src/utils-hoist/vercelWaitUntil.ts","webpack://__ember_auto_import__/src/utils-hoist/version.ts","webpack://__ember_auto_import__/src/utils-hoist/worldwide.ts","webpack://__ember_auto_import__/src/utils/applyScopeDataToEvent.ts","webpack://__ember_auto_import__/src/utils/handleCallbackErrors.ts","webpack://__ember_auto_import__/src/utils/hasTracingEnabled.ts","webpack://__ember_auto_import__/src/utils/isSentryRequestUrl.ts","webpack://__ember_auto_import__/src/utils/merge.ts","webpack://__ember_auto_import__/src/utils/meta.ts","webpack://__ember_auto_import__/src/utils/parameterize.ts","webpack://__ember_auto_import__/src/utils/parseSampleRate.ts","webpack://__ember_auto_import__/src/utils/prepareEvent.ts","webpack://__ember_auto_import__/src/utils/sdkMetadata.ts","webpack://__ember_auto_import__/src/utils/spanOnScope.ts","webpack://__ember_auto_import__/src/utils/spanUtils.ts","webpack://__ember_auto_import__/src/utils/traceData.ts","webpack://__ember_auto_import__/src/getNativeImplementation.ts","webpack://__ember_auto_import__/src/instrument/dom.ts","webpack://__ember_auto_import__/src/instrument/history.ts","webpack://__ember_auto_import__/src/instrument/xhr.ts","webpack://__ember_auto_import__/src/metrics/browserMetrics.ts","webpack://__ember_auto_import__/src/metrics/cls.ts","webpack://__ember_auto_import__/src/metrics/inp.ts","webpack://__ember_auto_import__/src/metrics/instrument.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/getCLS.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/getFID.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/getINP.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/getLCP.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/lib/bindReporter.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/lib/generateUniqueID.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/lib/getActivationStart.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/lib/getNavigationEntry.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/lib/getVisibilityWatcher.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/lib/initMetric.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/lib/interactions.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/lib/observe.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/lib/onHidden.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/lib/polyfills/interactionCountPolyfill.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/lib/runOnce.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/lib/whenActivated.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/lib/whenIdle.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/onFCP.ts","webpack://__ember_auto_import__/src/metrics/web-vitals/onTTFB.ts","webpack://__ember_auto_import__/src/types.ts","webpack://__ember_auto_import__/src/constants/index.ts","webpack://__ember_auto_import__/src/core/sendFeedback.ts","webpack://__ember_auto_import__/src/util/debug-build.ts","webpack://__ember_auto_import__/src/util/mergeOptions.ts","webpack://__ember_auto_import__/src/util/setAttributesNS.ts","webpack://__ember_auto_import__/src/core/createMainStyles.ts","webpack://__ember_auto_import__/node_modules/preact/dist/preact.mjs","webpack://__ember_auto_import__/node_modules/preact/hooks/dist/hooks.mjs","webpack://__ember_auto_import__/src/modal/components/SentryLogo.ts","webpack://__ember_auto_import__/src/modal/components/DialogHeader.tsx","webpack://__ember_auto_import__/src/modal/components/Form.tsx","webpack://__ember_auto_import__/src/util/validate.ts","webpack://__ember_auto_import__/src/modal/components/SuccessIcon.ts","webpack://__ember_auto_import__/src/modal/components/Dialog.tsx","webpack://__ember_auto_import__/src/screenshot/components/ScreenshotInput.css.ts","webpack://__ember_auto_import__/src/screenshot/components/ScreenshotEditor.tsx","webpack://__ember_auto_import__/src/screenshot/components/useTakeScreenshot.tsx","webpack://__ember_auto_import__/src/screenshot/components/CropCorner.tsx","webpack://__ember_auto_import__/src/core/integration.ts","webpack://__ember_auto_import__/src/util/isScreenshotSupported.ts","webpack://__ember_auto_import__/src/core/components/Actor.ts","webpack://__ember_auto_import__/src/core/components/FeedbackIcon.ts","webpack://__ember_auto_import__/src/core/components/Actor.css.ts","webpack://__ember_auto_import__/src/modal/integration.tsx","webpack://__ember_auto_import__/src/modal/components/Dialog.css.ts","webpack://__ember_auto_import__/src/screenshot/integration.ts","webpack://__ember_auto_import__/src/core/getFeedback.ts","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb-snapshot/es/rrweb-snapshot.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/utils.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/types/dist/rrweb-types.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/error-handler.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/serialize-args.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/webgl.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/canvas-manager.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb-worker/es/rrweb-worker/index.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb-worker/es/rrweb-worker/image-bitmap-data-url-worker.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/observers/canvas/2d.js","webpack://__ember_auto_import__/src/canvas.ts","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrdom/es/rrdom.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/mutation.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/observer.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/cross-origin-iframe-mirror.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/iframe-manager.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/shadow-dom-manager.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/stylesheet-manager.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/processed-node-manager.js","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb/es/rrweb/packages/rrweb/src/record/index.js","webpack://__ember_auto_import__/src/util/timestamp.ts","webpack://__ember_auto_import__/src/coreHandlers/util/addBreadcrumbEvent.ts","webpack://__ember_auto_import__/src/coreHandlers/util/domUtils.ts","webpack://__ember_auto_import__/src/coreHandlers/util/onWindowOpen.ts","webpack://__ember_auto_import__/src/coreHandlers/handleClick.ts","webpack://__ember_auto_import__/src/util/createBreadcrumb.ts","webpack://__ember_auto_import__/node_modules/@sentry-internal/rrweb-snapshot/es/rrweb-snapshot.js","webpack://__ember_auto_import__/src/coreHandlers/util/getAttributesToRecord.ts","webpack://__ember_auto_import__/src/coreHandlers/handleDom.ts","webpack://__ember_auto_import__/src/util/createPerformanceEntries.ts","webpack://__ember_auto_import__/src/util/logger.ts","webpack://__ember_auto_import__/src/eventBuffer/error.ts","webpack://__ember_auto_import__/src/eventBuffer/EventBufferArray.ts","webpack://__ember_auto_import__/src/eventBuffer/WorkerHandler.ts","webpack://__ember_auto_import__/src/eventBuffer/EventBufferCompressionWorker.ts","webpack://__ember_auto_import__/src/eventBuffer/EventBufferProxy.ts","webpack://__ember_auto_import__/src/util/hasSessionStorage.ts","webpack://__ember_auto_import__/src/util/isSampled.ts","webpack://__ember_auto_import__/src/session/Session.ts","webpack://__ember_auto_import__/src/session/saveSession.ts","webpack://__ember_auto_import__/src/session/createSession.ts","webpack://__ember_auto_import__/src/util/isExpired.ts","webpack://__ember_auto_import__/src/util/isSessionExpired.ts","webpack://__ember_auto_import__/src/session/shouldRefreshSession.ts","webpack://__ember_auto_import__/src/session/loadOrCreateSession.ts","webpack://__ember_auto_import__/src/session/fetchSession.ts","webpack://__ember_auto_import__/src/util/addEvent.ts","webpack://__ember_auto_import__/src/util/eventUtils.ts","webpack://__ember_auto_import__/src/coreHandlers/handleBreadcrumbs.ts","webpack://__ember_auto_import__/src/util/resetReplayIdOnDynamicSamplingContext.ts","webpack://__ember_auto_import__/src/util/createPerformanceSpans.ts","webpack://__ember_auto_import__/src/coreHandlers/util/addNetworkBreadcrumb.ts","webpack://__ember_auto_import__/src/util/shouldFilterRequest.ts","webpack://__ember_auto_import__/src/coreHandlers/util/networkUtils.ts","webpack://__ember_auto_import__/src/coreHandlers/util/fetchUtils.ts","webpack://__ember_auto_import__/src/util/addMemoryEntry.ts","webpack://__ember_auto_import__/src/util/handleRecordingEmit.ts","webpack://__ember_auto_import__/src/types/rrweb.ts","webpack://__ember_auto_import__/src/util/sendReplayRequest.ts","webpack://__ember_auto_import__/src/util/sendReplay.ts","webpack://__ember_auto_import__/src/util/prepareRecordingData.ts","webpack://__ember_auto_import__/src/util/prepareReplayEvent.ts","webpack://__ember_auto_import__/src/util/createReplayEnvelope.ts","webpack://__ember_auto_import__/src/util/throttle.ts","webpack://__ember_auto_import__/src/replay.ts","webpack://__ember_auto_import__/src/util/debounce.ts","webpack://__ember_auto_import__/src/session/clearSession.ts","webpack://__ember_auto_import__/src/eventBuffer/index.ts","webpack://__ember_auto_import__/replay-worker/build/esm/index.js","webpack://__ember_auto_import__/replay-worker/build/esm/worker.ts","webpack://__ember_auto_import__/src/util/addGlobalListeners.ts","webpack://__ember_auto_import__/src/coreHandlers/handleHistory.ts","webpack://__ember_auto_import__/src/coreHandlers/handleNetworkBreadcrumbs.ts","webpack://__ember_auto_import__/src/coreHandlers/util/xhrUtils.ts","webpack://__ember_auto_import__/src/coreHandlers/handleGlobalEvent.ts","webpack://__ember_auto_import__/src/coreHandlers/util/addFeedbackBreadcrumb.ts","webpack://__ember_auto_import__/src/util/isRrwebError.ts","webpack://__ember_auto_import__/src/coreHandlers/util/shouldSampleForBufferEvent.ts","webpack://__ember_auto_import__/src/coreHandlers/handleBeforeSendEvent.ts","webpack://__ember_auto_import__/src/coreHandlers/handleAfterSendEvent.ts","webpack://__ember_auto_import__/src/coreHandlers/performanceObserver.ts","webpack://__ember_auto_import__/src/coreHandlers/handleKeyboardEvent.ts","webpack://__ember_auto_import__/src/util/getPrivacyOptions.ts","webpack://__ember_auto_import__/src/util/maskAttribute.ts","webpack://__ember_auto_import__/src/util/getReplay.ts","webpack://__ember_auto_import__/src/-private/helpers.js","webpack://__ember_auto_import__/src/helpers/cancel-all.ts","webpack://__ember_auto_import__/src/helpers/perform.ts","webpack://__ember_auto_import__/src/helpers/task.ts","webpack://__ember_auto_import__/src/-private/external/environment.js","webpack://__ember_auto_import__/src/-private/ember-environment.js","webpack://__ember_auto_import__/src/-private/external/yieldables.js","webpack://__ember_auto_import__/src/-private/utils.js","webpack://__ember_auto_import__/src/-private/external/scheduler/policies/bounded-policy.js","webpack://__ember_auto_import__/src/-private/external/scheduler/policies/execution-states.js","webpack://__ember_auto_import__/src/-private/external/scheduler/policies/enqueued-policy.js","webpack://__ember_auto_import__/src/-private/external/scheduler/policies/drop-policy.js","webpack://__ember_auto_import__/src/-private/external/scheduler/policies/keep-latest-policy.js","webpack://__ember_auto_import__/src/-private/external/scheduler/policies/restartable-policy.js","webpack://__ember_auto_import__/src/-private/task-properties.js","webpack://__ember_auto_import__/src/-private/external/scheduler/refresh.js","webpack://__ember_auto_import__/src/-private/external/scheduler/state-tracker/state.js","webpack://__ember_auto_import__/src/-private/external/scheduler/state-tracker/state-tracker.js","webpack://__ember_auto_import__/src/-private/external/scheduler/state-tracker/null-state-tracker.js","webpack://__ember_auto_import__/src/-private/external/scheduler/state-tracker/null-state.js","webpack://__ember_auto_import__/src/-private/external/scheduler/scheduler.js","webpack://__ember_auto_import__/src/-private/external/scheduler/policies/unbounded-policy.js","webpack://__ember_auto_import__/src/-private/external/task/default-state.js","webpack://__ember_auto_import__/src/-private/external/task-instance/cancelation.js","webpack://__ember_auto_import__/src/-private/external/task/taskable.js","webpack://__ember_auto_import__/src/-private/external/generator-state.js","webpack://__ember_auto_import__/src/-private/external/task-instance/initial-state.js","webpack://__ember_auto_import__/src/-private/external/task-instance/executor.js","webpack://__ember_auto_import__/src/-private/external/task/task.js","webpack://__ember_auto_import__/src/-private/external/task/task-group.js","webpack://__ember_auto_import__/src/-private/external/task-factory.js","webpack://__ember_auto_import__/src/-private/external/task-instance/base.js","webpack://__ember_auto_import__/src/-private/tracked-state.js","webpack://__ember_auto_import__/src/-private/task-instance.js","webpack://__ember_auto_import__/src/-private/taskable-mixin.js","webpack://__ember_auto_import__/src/-private/task.js","webpack://__ember_auto_import__/src/-private/task-group.js","webpack://__ember_auto_import__/src/-private/scheduler/ember-scheduler.js","webpack://__ember_auto_import__/src/-private/task-factory.js","webpack://__ember_auto_import__/src/-private/external/task-decorators.js","webpack://__ember_auto_import__/src/-private/task-decorators.js","webpack://__ember_auto_import__/src/-private/task-public-api.js","webpack://__ember_auto_import__/src/-private/cancelable-promise-helpers.js","webpack://__ember_auto_import__/src/-private/wait-for.js","webpack://__ember_auto_import__/src/services/cookies.ts","webpack://__ember_auto_import__/src/utils/serialize-cookie.ts","webpack://__ember_auto_import__/src/helpers/element.ts","webpack://__ember_auto_import__/src/system/data-transfer-wrapper.ts","webpack://__ember_auto_import__/src/system/drag-listener.ts","webpack://__ember_auto_import__/src/system/drag-listener-modifier.ts","webpack://__ember_auto_import__/src/components/file-dropzone.hbs","webpack://__ember_auto_import__/src/components/file-dropzone.ts","webpack://__ember_auto_import__/src/upload-file.ts","webpack://__ember_auto_import__/src/queue.ts","webpack://__ember_auto_import__/src/services/file-queue.ts","webpack://__ember_auto_import__/src/helpers/file-queue.ts","webpack://__ember_auto_import__/node_modules/.pnpm/fake-xml-http-request@2.1.2/node_modules/fake-xml-http-request/src/fake-xml-http-request.js","webpack://__ember_auto_import__/node_modules/.pnpm/inflected@2.1.0/node_modules/inflected/dist/esm/inflected.js","webpack://__ember_auto_import__/lib/utils/reference-sort.js","webpack://__ember_auto_import__/lib/factory.js","webpack://__ember_auto_import__/lib/identity-manager.js","webpack://__ember_auto_import__/lib/association.js","webpack://__ember_auto_import__/lib/trait.js","webpack://__ember_auto_import__/lib/response.js","webpack://__ember_auto_import__/lib/utils/inflector.js","webpack://__ember_auto_import__/lib/utils/is-association.js","webpack://__ember_auto_import__/lib/assert.js","webpack://__ember_auto_import__/lib/orm/associations/association.js","webpack://__ember_auto_import__/lib/orm/associations/belongs-to.js","webpack://__ember_auto_import__/lib/db-collection.js","webpack://__ember_auto_import__/lib/db.js","webpack://__ember_auto_import__/lib/orm/collection.js","webpack://__ember_auto_import__/lib/orm/polymorphic-collection.js","webpack://__ember_auto_import__/lib/orm/associations/has-many.js","webpack://__ember_auto_import__/lib/route-handlers/base.js","webpack://__ember_auto_import__/lib/route-handlers/function.js","webpack://__ember_auto_import__/lib/route-handlers/object.js","webpack://__ember_auto_import__/lib/route-handlers/shorthands/base.js","webpack://__ember_auto_import__/lib/route-handlers/shorthands/get.js","webpack://__ember_auto_import__/lib/route-handlers/shorthands/post.js","webpack://__ember_auto_import__/lib/route-handlers/shorthands/put.js","webpack://__ember_auto_import__/lib/route-handlers/shorthands/delete.js","webpack://__ember_auto_import__/lib/route-handlers/shorthands/head.js","webpack://__ember_auto_import__/lib/route-handler.js","webpack://__ember_auto_import__/lib/utils/extend.js","webpack://__ember_auto_import__/lib/orm/model.js","webpack://__ember_auto_import__/lib/serializer.js","webpack://__ember_auto_import__/lib/serializers/json-api-serializer.js","webpack://__ember_auto_import__/lib/serializer-registry.js","webpack://__ember_auto_import__/lib/orm/schema.js","webpack://__ember_auto_import__/lib/container.js","webpack://__ember_auto_import__/lib/mock-server/pretender-config.js","webpack://__ember_auto_import__/lib/server.js","webpack://__ember_auto_import__/lib/serializers/active-model-serializer.js","webpack://__ember_auto_import__/lib/serializers/rest-serializer.js","webpack://__ember_auto_import__/lib/utils/uuid.js","webpack://__ember_auto_import__/lib/index.js","webpack://__ember_auto_import__/node_modules/.pnpm/pretender@3.4.7/node_modules/pretender/dist/pretender.es.js","webpack://__ember_auto_import__/route-recognizer/util.ts","webpack://__ember_auto_import__/route-recognizer/dsl.ts","webpack://__ember_auto_import__/route-recognizer/normalizer.ts","webpack://__ember_auto_import__/route-recognizer.ts/","webpack://__ember_auto_import__/src/mirage/utils.ts","webpack://__ember_auto_import__/src/mirage/upload-handler.ts","webpack://__ember_auto_import__/src/system/http-request.ts","webpack://__ember_auto_import__/src/interfaces.ts","webpack://__ember_auto_import__/src/system/upload.ts","webpack://__ember_auto_import__/src/system/upload-file-reader.ts","webpack://__ember_auto_import__/src/system/rate.ts","webpack://__ember_auto_import__/src/index.js","webpack://__ember_auto_import__/index.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-focus-trap@1.1.1_ember-source@5.12.0_@glimmer+component@1.1.2_@babel+core@7.26.9__0e096e63eab7d9c09a4355c4094b6b02/node_modules/ember-focus-trap/dist/modifiers/focus-trap.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/_rollupPluginBabelHelpers-2fc49ad3.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/fixtures/modifiers-array.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/helpers/if-key.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/helpers/on-key.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/utils/get-mouse-code.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/decorators/key-responder.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/decorators/on-key.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/listeners/mouse-events.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/fixtures/mouse-buttons-array.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/listeners/touch-events.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/utils/trigger-event.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/index.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/listeners/key-events.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/modifiers/on-key.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/services/keyboard.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/utils/handle-key-event.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/utils/sort.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/utils/get-mouse-name.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/fixtures/key-maps.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/utils/is-key.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/utils/keyboard-listener.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/utils/listener-name.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/utils/get-cmd-key.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-keyboard@9.0.4_@babel+core@7.26.9_@ember+test-helpers@4.0.5_@babel+core@7.26.9_em_3ec0a0959d4b6705c10e28338c05a5cf/node_modules/ember-keyboard/dist/utils/platform.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-lifeline@7.0.0_@ember+test-helpers@4.0.5_@babel+core@7.26.9_ember-source@5.12.0_@_c98ce9b6acea13fe6267a98a929e6321/node_modules/ember-lifeline/dist/utils/get-task.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-lifeline@7.0.0_@ember+test-helpers@4.0.5_@babel+core@7.26.9_ember-source@5.12.0_@_c98ce9b6acea13fe6267a98a929e6321/node_modules/ember-lifeline/dist/cancel-task.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-lifeline@7.0.0_@ember+test-helpers@4.0.5_@babel+core@7.26.9_ember-source@5.12.0_@_c98ce9b6acea13fe6267a98a929e6321/node_modules/ember-lifeline/dist/run-task.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-lifeline@7.0.0_@ember+test-helpers@4.0.5_@babel+core@7.26.9_ember-source@5.12.0_@_c98ce9b6acea13fe6267a98a929e6321/node_modules/ember-lifeline/dist/schedule-task.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-lifeline@7.0.0_@ember+test-helpers@4.0.5_@babel+core@7.26.9_ember-source@5.12.0_@_c98ce9b6acea13fe6267a98a929e6321/node_modules/ember-lifeline/dist/throttle-task.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-lifeline@7.0.0_@ember+test-helpers@4.0.5_@babel+core@7.26.9_ember-source@5.12.0_@_c98ce9b6acea13fe6267a98a929e6321/node_modules/ember-lifeline/dist/poll-task.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-lifeline@7.0.0_@ember+test-helpers@4.0.5_@babel+core@7.26.9_ember-source@5.12.0_@_c98ce9b6acea13fe6267a98a929e6321/node_modules/ember-lifeline/dist/debounce-task.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-lifeline@7.0.0_@ember+test-helpers@4.0.5_@babel+core@7.26.9_ember-source@5.12.0_@_c98ce9b6acea13fe6267a98a929e6321/node_modules/ember-lifeline/dist/utils/get-timeout-or-test-fallback.js","webpack://__ember_auto_import__/src/-private/class-based/modifier-manager.ts","webpack://__ember_auto_import__/src/-private/class-based/modifier.ts","webpack://__ember_auto_import__/src/-private/function-based/modifier.ts","webpack://__ember_auto_import__/src/-private/function-based/modifier-manager.ts","webpack://__ember_auto_import__/src/helpers/page-title.ts","webpack://__ember_auto_import__/src/services/page-title.ts","webpack://__ember_auto_import__/node_modules/.pnpm/ember-router-helpers@1.0.0/node_modules/ember-router-helpers/dist/_rollupPluginBabelHelpers-7db585ca.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-router-helpers@1.0.0/node_modules/ember-router-helpers/dist/helpers/is-active.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-router-helpers@1.0.0/node_modules/ember-router-helpers/dist/helpers/replace-with.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-router-helpers@1.0.0/node_modules/ember-router-helpers/dist/helpers/root-url.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-router-helpers@1.0.0/node_modules/ember-router-helpers/dist/helpers/route-params.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-router-helpers@1.0.0/node_modules/ember-router-helpers/dist/utils/route-params.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-router-helpers@1.0.0/node_modules/ember-router-helpers/dist/helpers/transition-to.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-router-helpers@1.0.0/node_modules/ember-router-helpers/dist/helpers/url-for.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-router-helpers@1.0.0/node_modules/ember-router-helpers/dist/utils/handle-query-params.js","webpack://__ember_auto_import__/node_modules/.pnpm/ember-router-helpers@1.0.0/node_modules/ember-router-helpers/dist/utils/track-active-route.js","webpack://__ember_auto_import__/src/helpers/set.ts","webpack://__ember_auto_import__/src/modifiers/style.ts","webpack://__ember_auto_import__/src/helpers/and.ts","webpack://__ember_auto_import__/src/helpers/eq.ts","webpack://__ember_auto_import__/src/helpers/gt.ts","webpack://__ember_auto_import__/src/helpers/gte.ts","webpack://__ember_auto_import__/src/helpers/is-array.ts","webpack://__ember_auto_import__/src/helpers/lt.ts","webpack://__ember_auto_import__/src/helpers/lte.ts","webpack://__ember_auto_import__/src/helpers/not-eq.ts","webpack://__ember_auto_import__/src/helpers/not.ts","webpack://__ember_auto_import__/src/helpers/or.ts","webpack://__ember_auto_import__/src/helpers/xor.ts","webpack://__ember_auto_import__/src/utils/truth-convert.ts","webpack://__ember_auto_import__/node_modules/.pnpm/fast-deep-equal@2.0.1/node_modules/fast-deep-equal/index.js","webpack://__ember_auto_import__/src/registry.ts","webpack://__ember_auto_import__/src/notification.ts","webpack://__ember_auto_import__/src/index.ts","webpack://__ember_auto_import__/node_modules/.pnpm/js-cookie@3.0.5/node_modules/js-cookie/dist/js.cookie.js","webpack://__ember_auto_import__/node_modules/.pnpm/js-sha256@0.9.0/node_modules/js-sha256/src/sha256.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_DataView.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Hash.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_ListCache.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Map.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_MapCache.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Promise.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Set.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_SetCache.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Stack.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Symbol.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_Uint8Array.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_WeakMap.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_apply.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayEach.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayFilter.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayIncludes.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayIncludesWith.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayLikeKeys.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayMap.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arrayPush.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_arraySome.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_asciiToArray.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_assignValue.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_assocIndexOf.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseAssign.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseAssignIn.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseAssignValue.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseClone.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseCreate.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseEach.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseFindIndex.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseFlatten.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseFor.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseForOwn.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseGet.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseGetAllKeys.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseGetTag.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseHas.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseHasIn.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIndexOf.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseInvoke.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsArguments.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsEqual.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsEqualDeep.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsMap.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsMatch.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsNaN.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsNative.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsSet.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIsTypedArray.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseIteratee.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseKeys.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseKeysIn.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseMap.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseMatches.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseMatchesProperty.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_basePick.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_basePickBy.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseProperty.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_basePropertyDeep.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseRest.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseSet.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseSetToString.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseSlice.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseTimes.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseToString.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseTrim.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseUnary.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseUniq.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_baseValues.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_cacheHas.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_castFunction.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_castPath.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_castSlice.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_cloneArrayBuffer.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_cloneBuffer.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_cloneDataView.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_cloneRegExp.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_cloneSymbol.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_cloneTypedArray.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_copyArray.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_copyObject.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_copySymbols.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_copySymbolsIn.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_coreJsData.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createAssigner.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createBaseEach.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createBaseFor.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createCaseFirst.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createFind.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_createSet.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_defineProperty.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_equalArrays.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_equalByTag.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_equalObjects.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_flatRest.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_freeGlobal.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getAllKeys.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getAllKeysIn.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getMapData.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getMatchData.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getNative.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getPrototype.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getRawTag.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getSymbols.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getSymbolsIn.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getTag.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_getValue.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hasPath.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hasUnicode.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashClear.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashDelete.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashGet.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashHas.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_hashSet.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_initCloneArray.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_initCloneByTag.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_initCloneObject.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isFlattenable.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isIndex.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isIterateeCall.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isKey.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isKeyable.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isMasked.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isPrototype.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_isStrictComparable.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheClear.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheDelete.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheGet.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheHas.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_listCacheSet.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheClear.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheDelete.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheGet.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheHas.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapCacheSet.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_mapToArray.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_matchesStrictComparable.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_memoizeCapped.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_nativeCreate.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_nativeKeys.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_nativeKeysIn.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_nodeUtil.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_objectToString.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_overArg.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_overRest.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_parent.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_root.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_setCacheAdd.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_setCacheHas.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_setToArray.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_setToString.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_shortOut.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_stackClear.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_stackDelete.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_stackGet.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_stackHas.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_stackSet.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_strictIndexOf.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_stringToArray.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_stringToPath.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_toKey.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_toSource.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_trimmedEndIndex.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/_unicodeToArray.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/assign.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/cloneDeep.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/compact.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/constant.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/eq.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/find.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/findIndex.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/flatten.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/forIn.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/get.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/has.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/hasIn.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/identity.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/invokeMap.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isArguments.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isArray.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isArrayLike.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isBuffer.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isEmpty.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isEqual.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isFunction.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isInteger.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isLength.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isMap.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isObject.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isObjectLike.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isPlainObject.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isSet.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isSymbol.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/isTypedArray.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/keys.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/keysIn.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/last.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/lowerFirst.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/map.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/mapValues.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/memoize.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/noop.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/pick.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/property.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/stubArray.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/stubFalse.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toFinite.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toInteger.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toNumber.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/toString.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/uniq.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/uniqBy.js","webpack://__ember_auto_import__/node_modules/.pnpm/lodash@4.17.21/node_modules/lodash/values.js","webpack://__ember_auto_import__/src/js/utils/type-check.js","webpack://__ember_auto_import__/src/js/utils/classes.js","webpack://__ember_auto_import__/src/js/utils/deferred.js","webpack://__ember_auto_import__/src/js/utils/general.js","webpack://__ember_auto_import__/src/js/utils/bounds.js","webpack://__ember_auto_import__/src/js/abutment.js","webpack://__ember_auto_import__/src/js/constraint.js","webpack://__ember_auto_import__/src/js/shift.js","webpack://__ember_auto_import__/src/js/evented.js","webpack://__ember_auto_import__/src/js/utils/offset.js","webpack://__ember_auto_import__/src/js/utils/parents.js","webpack://__ember_auto_import__/src/js/tether.js","webpack://__ember_auto_import__/src/-private/map.ts","webpack://__ember_auto_import__/src/-private/set.ts","webpack://__ember_auto_import__/src/-private/array.ts","webpack://__ember_auto_import__/src/-private/object.ts","webpack://__ember_auto_import__/src/-private/decorator.ts","webpack://__ember_auto_import__/node_modules/.pnpm/tracked-toolbox@2.0.0_@babel+core@7.26.9_ember-source@5.12.0_@glimmer+component@1.1.2_@_af4bc4663c266d33e7276b72e1c21689/node_modules/tracked-toolbox/dist/index.js","webpack://__ember_auto_import__/node_modules/.pnpm/@ungap+structured-clone@0.3.4/node_modules/@ungap/structured-clone/esm/deserialize.js","webpack://__ember_auto_import__/node_modules/.pnpm/@ungap+structured-clone@0.3.4/node_modules/@ungap/structured-clone/esm/serialize.js","webpack://__ember_auto_import__/node_modules/.pnpm/@ungap+structured-clone@0.3.4/node_modules/@ungap/structured-clone/esm/index.js","webpack://__ember_auto_import__/src/utils/is-object.ts","webpack://__ember_auto_import__/src/-private/change.ts","webpack://__ember_auto_import__/src/-private/err.ts","webpack://__ember_auto_import__/src/utils/get-key-values.ts","webpack://__ember_auto_import__/src/utils/is-promise.ts","webpack://__ember_auto_import__/src/utils/handle-multiple-validations.ts","webpack://__ember_auto_import__/src/utils/get-deep.ts","webpack://__ember_auto_import__/src/utils/validator-lookup.ts","webpack://__ember_auto_import__/src/-private/notifier.ts","webpack://__ember_auto_import__/src/-private/evented.ts","webpack://__ember_auto_import__/src/utils/has-key.ts","webpack://__ember_auto_import__/src/utils/normalize-object.ts","webpack://__ember_auto_import__/src/utils/has-changes.ts","webpack://__ember_auto_import__/src/utils/assign.ts","webpack://__ember_auto_import__/src/utils/flatten-validations.ts","webpack://__ember_auto_import__/src/utils/is-changeset.ts","webpack://__ember_auto_import__/src/utils/key-in-object.ts","webpack://__ember_auto_import__/src/utils/array-object.ts","webpack://__ember_auto_import__/src/utils/set-deep.ts","webpack://__ember_auto_import__/src/utils/merge-nested.ts","webpack://__ember_auto_import__/src/utils/build-old-values.ts","webpack://__ember_auto_import__/src/utils/merge-deep.ts","webpack://__ember_auto_import__/src/utils/object-tree-node.ts","webpack://__ember_auto_import__/src/utils/object-without.ts","webpack://__ember_auto_import__/src/utils/take.ts","webpack://__ember_auto_import__/src/validated.ts","webpack://__ember_auto_import__/OktaAuth/webpack/universalModuleDefinition","webpack://__ember_auto_import__/OktaAuth/webpack/bootstrap","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/classCallCheck.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/regenerator/index.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/assertThisInitialized.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/getPrototypeOf.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/createClass.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/inherits.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/possibleConstructorReturn.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/typeof.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/defineProperty.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/setPrototypeOf.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/wrapNativeSuper.js","webpack://__ember_auto_import__/OktaAuth/lib/fetch/fetchRequest.ts","webpack://__ember_auto_import__/OktaAuth/node_modules/cross-fetch/dist/browser-ponyfill.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/slicedToArray.js","webpack://__ember_auto_import__/OktaAuth/node_modules/regenerator-runtime/runtime.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/isNativeFunction.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/construct.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/isNativeReflectConstruct.js","webpack://__ember_auto_import__/OktaAuth/(webpack)/buildin/global.js","webpack://__ember_auto_import__/OktaAuth/node_modules/js-cookie/src/js.cookie.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/arrayWithHoles.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/arrayLikeToArray.js","webpack://__ember_auto_import__/OktaAuth/node_modules/@babel/runtime/helpers/nonIterableRest.js","webpack://__ember_auto_import__/OktaAuth/node_modules/p-cancelable/index.js","webpack://__ember_auto_import__/OktaAuth/node_modules/tiny-emitter/index.js","webpack://__ember_auto_import__/OktaAuth/lib/errors/CustomError.ts","webpack://__ember_auto_import__/OktaAuth/lib/errors/AuthSdkError.ts","webpack://__ember_auto_import__/OktaAuth/lib/util.ts","webpack://__ember_auto_import__/OktaAuth/lib/errors/AuthApiError.ts","webpack://__ember_auto_import__/OktaAuth/lib/constants.ts","webpack://__ember_auto_import__/OktaAuth/lib/http.ts","webpack://__ember_auto_import__/OktaAuth/lib/tx/util.ts","webpack://__ember_auto_import__/OktaAuth/lib/errors/AuthPollStopError.ts","webpack://__ember_auto_import__/OktaAuth/lib/tx/poll.ts","webpack://__ember_auto_import__/OktaAuth/lib/tx/AuthTransaction.ts","webpack://__ember_auto_import__/OktaAuth/lib/tx/api.ts","webpack://__ember_auto_import__/OktaAuth/lib/tx/TransactionState.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/util/pkce.ts","webpack://__ember_auto_import__/OktaAuth/lib/SavedObject.ts","webpack://__ember_auto_import__/OktaAuth/lib/StorageManager.ts","webpack://__ember_auto_import__/OktaAuth/lib/errors/OAuthError.ts","webpack://__ember_auto_import__/OktaAuth/lib/types/Transaction.ts","webpack://__ember_auto_import__/OktaAuth/lib/types/Token.ts","webpack://__ember_auto_import__/OktaAuth/lib/TransactionManager.ts","webpack://__ember_auto_import__/OktaAuth/lib/OktaAuthBase.ts","webpack://__ember_auto_import__/OktaAuth/lib/builderUtil.ts","webpack://__ember_auto_import__/OktaAuth/lib/browser/features.ts","webpack://__ember_auto_import__/OktaAuth/lib/browser/browserStorage.ts","webpack://__ember_auto_import__/OktaAuth/lib/session.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/endpoints/authorize.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/endpoints/token.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/endpoints/well-known.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/util/browser.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/util/oauth.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/util/defaultTokenParams.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/util/errors.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/util/loginRedirect.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/util/prepareTokenParams.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/util/urlParams.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/util/validateClaims.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/decodeToken.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/revokeToken.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/exchangeCodeForTokens.ts","webpack://__ember_auto_import__/OktaAuth/lib/crypto.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/verifyToken.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/handleOAuthResponse.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/getToken.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/getWithoutPrompt.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/renewToken.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/renewTokensWithRefresh.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/renewTokens.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/getUserInfo.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/getWithPopup.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/getWithRedirect.ts","webpack://__ember_auto_import__/OktaAuth/lib/oidc/parseFromUrl.ts","webpack://__ember_auto_import__/OktaAuth/lib/clock.ts","webpack://__ember_auto_import__/OktaAuth/lib/TokenManager.ts","webpack://__ember_auto_import__/OktaAuth/lib/PromiseQueue.ts","webpack://__ember_auto_import__/OktaAuth/lib/browser/fingerprint.ts","webpack://__ember_auto_import__/OktaAuth/lib/AuthStateManager.ts","webpack://__ember_auto_import__/OktaAuth/lib/browser/browser.ts","webpack://__ember_auto_import__/node_modules/.pnpm/jwt-decode@4.0.0/node_modules/jwt-decode/build/cjs/index.js","webpack://__ember_auto_import__/node_modules/.pnpm/@fortawesome+fontawesome-svg-core@6.7.2/node_modules/@fortawesome/fontawesome-svg-core/index.mjs","webpack://__ember_auto_import__/node_modules/.pnpm/ember-load-initializers@3.0.1_ember-source@5.12.0_@glimmer+component@1.1.2_@babel+core@_89b19a70f4f43d0924b683dcd72199c9/node_modules/ember-load-initializers/dist/index.js","webpack://__ember_auto_import__/node_modules/.pnpm/base64-js@1.5.1/node_modules/base64-js/index.js","webpack://__ember_auto_import__/node_modules/.pnpm/keycloak-js@22.0.5/node_modules/keycloak-js/dist/keycloak.mjs"],"sourcesContent":["/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nexport const Constants = {\r\n    LIBRARY_NAME: \"MSAL.JS\",\r\n    SKU: \"msal.js.common\",\r\n    // Prefix for all library cache entries\r\n    CACHE_PREFIX: \"msal\",\r\n    // default authority\r\n    DEFAULT_AUTHORITY: \"https://login.microsoftonline.com/common/\",\r\n    DEFAULT_AUTHORITY_HOST: \"login.microsoftonline.com\",\r\n    DEFAULT_COMMON_TENANT: \"common\",\r\n    // ADFS String\r\n    ADFS: \"adfs\",\r\n    DSTS: \"dstsv2\",\r\n    // Default AAD Instance Discovery Endpoint\r\n    AAD_INSTANCE_DISCOVERY_ENDPT: \"https://login.microsoftonline.com/common/discovery/instance?api-version=1.1&authorization_endpoint=\",\r\n    // CIAM URL\r\n    CIAM_AUTH_URL: \".ciamlogin.com\",\r\n    AAD_TENANT_DOMAIN_SUFFIX: \".onmicrosoft.com\",\r\n    // Resource delimiter - used for certain cache entries\r\n    RESOURCE_DELIM: \"|\",\r\n    // Placeholder for non-existent account ids/objects\r\n    NO_ACCOUNT: \"NO_ACCOUNT\",\r\n    // Claims\r\n    CLAIMS: \"claims\",\r\n    // Consumer UTID\r\n    CONSUMER_UTID: \"9188040d-6c67-4c5b-b112-36a304b66dad\",\r\n    // Default scopes\r\n    OPENID_SCOPE: \"openid\",\r\n    PROFILE_SCOPE: \"profile\",\r\n    OFFLINE_ACCESS_SCOPE: \"offline_access\",\r\n    EMAIL_SCOPE: \"email\",\r\n    // Default response type for authorization code flow\r\n    CODE_RESPONSE_TYPE: \"code\",\r\n    CODE_GRANT_TYPE: \"authorization_code\",\r\n    RT_GRANT_TYPE: \"refresh_token\",\r\n    FRAGMENT_RESPONSE_MODE: \"fragment\",\r\n    S256_CODE_CHALLENGE_METHOD: \"S256\",\r\n    URL_FORM_CONTENT_TYPE: \"application/x-www-form-urlencoded;charset=utf-8\",\r\n    AUTHORIZATION_PENDING: \"authorization_pending\",\r\n    NOT_DEFINED: \"not_defined\",\r\n    EMPTY_STRING: \"\",\r\n    NOT_APPLICABLE: \"N/A\",\r\n    FORWARD_SLASH: \"/\",\r\n    IMDS_ENDPOINT: \"http://169.254.169.254/metadata/instance/compute/location\",\r\n    IMDS_VERSION: \"2020-06-01\",\r\n    IMDS_TIMEOUT: 2000,\r\n    AZURE_REGION_AUTO_DISCOVER_FLAG: \"TryAutoDetect\",\r\n    REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX: \"login.microsoft.com\",\r\n    REGIONAL_AUTH_NON_MSI_QUERY_STRING: \"allowestsrnonmsi=true\",\r\n    KNOWN_PUBLIC_CLOUDS: [\"login.microsoftonline.com\", \"login.windows.net\", \"login.microsoft.com\", \"sts.windows.net\"],\r\n    TOKEN_RESPONSE_TYPE: \"token\",\r\n    ID_TOKEN_RESPONSE_TYPE: \"id_token\",\r\n    SHR_NONCE_VALIDITY: 240,\r\n    INVALID_INSTANCE: \"invalid_instance\",\r\n};\r\n\r\nexport const OIDC_DEFAULT_SCOPES = [\r\n    Constants.OPENID_SCOPE,\r\n    Constants.PROFILE_SCOPE,\r\n    Constants.OFFLINE_ACCESS_SCOPE\r\n];\r\n\r\nexport const OIDC_SCOPES = [\r\n    ...OIDC_DEFAULT_SCOPES,\r\n    Constants.EMAIL_SCOPE\r\n];\r\n\r\n/**\r\n * Request header names\r\n */\r\nexport enum HeaderNames {\r\n    CONTENT_TYPE = \"Content-Type\",\r\n    RETRY_AFTER = \"Retry-After\",\r\n    CCS_HEADER = \"X-AnchorMailbox\",\r\n    WWWAuthenticate = \"WWW-Authenticate\",\r\n    AuthenticationInfo = \"Authentication-Info\",\r\n    X_MS_REQUEST_ID = \"x-ms-request-id\",\r\n    X_MS_HTTP_VERSION= \"x-ms-httpver\"\r\n}\r\n\r\n/**\r\n * Persistent cache keys MSAL which stay while user is logged in.\r\n */\r\nexport enum PersistentCacheKeys {\r\n    ID_TOKEN = \"idtoken\",\r\n    CLIENT_INFO = \"client.info\",\r\n    ADAL_ID_TOKEN = \"adal.idtoken\",\r\n    ERROR = \"error\",\r\n    ERROR_DESC = \"error.description\",\r\n    ACTIVE_ACCOUNT = \"active-account\", // Legacy active-account cache key, use new key instead\r\n    ACTIVE_ACCOUNT_FILTERS = \"active-account-filters\" // new cache entry for active_account for a more robust version for browser\r\n}\r\n\r\n/**\r\n * String constants related to AAD Authority\r\n */\r\nexport enum AADAuthorityConstants {\r\n    COMMON = \"common\",\r\n    ORGANIZATIONS = \"organizations\",\r\n    CONSUMERS = \"consumers\"\r\n}\r\n\r\n/**\r\n * Keys in the hashParams sent by AAD Server\r\n */\r\nexport enum AADServerParamKeys {\r\n    CLIENT_ID = \"client_id\",\r\n    REDIRECT_URI = \"redirect_uri\",\r\n    RESPONSE_TYPE = \"response_type\",\r\n    RESPONSE_MODE = \"response_mode\",\r\n    GRANT_TYPE = \"grant_type\",\r\n    CLAIMS = \"claims\",\r\n    SCOPE = \"scope\",\r\n    ERROR = \"error\",\r\n    ERROR_DESCRIPTION = \"error_description\",\r\n    ACCESS_TOKEN = \"access_token\",\r\n    ID_TOKEN = \"id_token\",\r\n    REFRESH_TOKEN = \"refresh_token\",\r\n    EXPIRES_IN = \"expires_in\",\r\n    STATE = \"state\",\r\n    NONCE = \"nonce\",\r\n    PROMPT = \"prompt\",\r\n    SESSION_STATE = \"session_state\",\r\n    CLIENT_INFO = \"client_info\",\r\n    CODE = \"code\",\r\n    CODE_CHALLENGE = \"code_challenge\",\r\n    CODE_CHALLENGE_METHOD = \"code_challenge_method\",\r\n    CODE_VERIFIER = \"code_verifier\",\r\n    CLIENT_REQUEST_ID = \"client-request-id\",\r\n    X_CLIENT_SKU = \"x-client-SKU\",\r\n    X_CLIENT_VER = \"x-client-VER\",\r\n    X_CLIENT_OS = \"x-client-OS\",\r\n    X_CLIENT_CPU = \"x-client-CPU\",\r\n    X_CLIENT_CURR_TELEM = \"x-client-current-telemetry\",\r\n    X_CLIENT_LAST_TELEM = \"x-client-last-telemetry\",\r\n    X_MS_LIB_CAPABILITY = \"x-ms-lib-capability\",\r\n    X_APP_NAME = \"x-app-name\",\r\n    X_APP_VER = \"x-app-ver\",\r\n    POST_LOGOUT_URI = \"post_logout_redirect_uri\",\r\n    ID_TOKEN_HINT = \"id_token_hint\",\r\n    DEVICE_CODE = \"device_code\",\r\n    CLIENT_SECRET = \"client_secret\",\r\n    CLIENT_ASSERTION = \"client_assertion\",\r\n    CLIENT_ASSERTION_TYPE = \"client_assertion_type\",\r\n    TOKEN_TYPE = \"token_type\",\r\n    REQ_CNF = \"req_cnf\",\r\n    OBO_ASSERTION = \"assertion\",\r\n    REQUESTED_TOKEN_USE = \"requested_token_use\",\r\n    ON_BEHALF_OF = \"on_behalf_of\",\r\n    FOCI = \"foci\",\r\n    CCS_HEADER = \"X-AnchorMailbox\",\r\n    RETURN_SPA_CODE = \"return_spa_code\",\r\n    NATIVE_BROKER = \"nativebroker\",\r\n    LOGOUT_HINT = \"logout_hint\"\r\n}\r\n\r\n/**\r\n * Claims request keys\r\n */\r\nexport enum ClaimsRequestKeys {\r\n    ACCESS_TOKEN = \"access_token\",\r\n    XMS_CC = \"xms_cc\"\r\n}\r\n\r\n/**\r\n * we considered making this \"enum\" in the request instead of string, however it looks like the allowed list of\r\n * prompt values kept changing over past couple of years. There are some undocumented prompt values for some\r\n * internal partners too, hence the choice of generic \"string\" type instead of the \"enum\"\r\n */\r\nexport const PromptValue = {\r\n    LOGIN: \"login\",\r\n    SELECT_ACCOUNT: \"select_account\",\r\n    CONSENT: \"consent\",\r\n    NONE: \"none\",\r\n    CREATE: \"create\",\r\n    NO_SESSION: \"no_session\"\r\n};\r\n\r\n/**\r\n * SSO Types - generated to populate hints\r\n */\r\nexport enum SSOTypes {\r\n    ACCOUNT = \"account\",\r\n    SID = \"sid\",\r\n    LOGIN_HINT = \"login_hint\",\r\n    ID_TOKEN = \"id_token\",\r\n    DOMAIN_HINT = \"domain_hint\",\r\n    ORGANIZATIONS = \"organizations\",\r\n    CONSUMERS = \"consumers\",\r\n    ACCOUNT_ID = \"accountIdentifier\",\r\n    HOMEACCOUNT_ID = \"homeAccountIdentifier\"\r\n}\r\n\r\n/**\r\n * allowed values for codeVerifier\r\n */\r\nexport const CodeChallengeMethodValues = {\r\n    PLAIN: \"plain\",\r\n    S256: \"S256\"\r\n};\r\n\r\n/**\r\n * The method used to encode the code verifier for the code challenge parameter. can be one\r\n * of plain or s256. if excluded, code challenge is assumed to be plaintext. for more\r\n * information, see the pkce rcf: https://tools.ietf.org/html/rfc7636\r\n */\r\nexport const CodeChallengeMethodValuesArray: string[] = [\r\n    CodeChallengeMethodValues.PLAIN,\r\n    CodeChallengeMethodValues.S256\r\n];\r\n\r\n/**\r\n * allowed values for response_mode\r\n */\r\nexport enum ResponseMode {\r\n    QUERY = \"query\",\r\n    FRAGMENT = \"fragment\",\r\n    FORM_POST = \"form_post\"\r\n}\r\n\r\n/**\r\n * allowed grant_type\r\n */\r\nexport enum GrantType {\r\n    IMPLICIT_GRANT = \"implicit\",\r\n    AUTHORIZATION_CODE_GRANT = \"authorization_code\",\r\n    CLIENT_CREDENTIALS_GRANT = \"client_credentials\",\r\n    RESOURCE_OWNER_PASSWORD_GRANT = \"password\",\r\n    REFRESH_TOKEN_GRANT = \"refresh_token\",\r\n    DEVICE_CODE_GRANT = \"device_code\",\r\n    JWT_BEARER = \"urn:ietf:params:oauth:grant-type:jwt-bearer\"\r\n}\r\n\r\n/**\r\n * Account types in Cache\r\n */\r\nexport enum CacheAccountType {\r\n    MSSTS_ACCOUNT_TYPE = \"MSSTS\",\r\n    ADFS_ACCOUNT_TYPE = \"ADFS\",\r\n    MSAV1_ACCOUNT_TYPE = \"MSA\",\r\n    GENERIC_ACCOUNT_TYPE = \"Generic\" // NTLM, Kerberos, FBA, Basic etc\r\n}\r\n\r\n/**\r\n * Separators used in cache\r\n */\r\nexport enum Separators {\r\n    CACHE_KEY_SEPARATOR = \"-\",\r\n    CLIENT_INFO_SEPARATOR = \".\"\r\n}\r\n\r\n/**\r\n * Credential Type stored in the cache\r\n */\r\nexport enum CredentialType {\r\n    ID_TOKEN = \"IdToken\",\r\n    ACCESS_TOKEN = \"AccessToken\",\r\n    ACCESS_TOKEN_WITH_AUTH_SCHEME = \"AccessToken_With_AuthScheme\",\r\n    REFRESH_TOKEN = \"RefreshToken\",\r\n}\r\n\r\n/**\r\n * Combine all cache types\r\n */\r\nexport enum CacheType {\r\n    ADFS = 1001,\r\n    MSA = 1002,\r\n    MSSTS = 1003,\r\n    GENERIC = 1004,\r\n    ACCESS_TOKEN = 2001,\r\n    REFRESH_TOKEN = 2002,\r\n    ID_TOKEN = 2003,\r\n    APP_METADATA = 3001,\r\n    UNDEFINED = 9999\r\n}\r\n\r\n/**\r\n * More Cache related constants\r\n */\r\nexport const APP_METADATA = \"appmetadata\";\r\nexport const CLIENT_INFO = \"client_info\";\r\nexport const THE_FAMILY_ID = \"1\";\r\n\r\nexport const AUTHORITY_METADATA_CONSTANTS = {\r\n    CACHE_KEY: \"authority-metadata\",\r\n    REFRESH_TIME_SECONDS: 3600 * 24 // 24 Hours\r\n};\r\n\r\nexport enum AuthorityMetadataSource {\r\n    CONFIG = \"config\",\r\n    CACHE = \"cache\",\r\n    NETWORK = \"network\",\r\n    HARDCODED_VALUES= \"hardcoded_values\",\r\n}\r\n\r\nexport const SERVER_TELEM_CONSTANTS = {\r\n    SCHEMA_VERSION: 5,\r\n    MAX_CUR_HEADER_BYTES: 80, // ESTS limit is 100B, set to 80 to provide a 20B buffer\r\n    MAX_LAST_HEADER_BYTES: 330, // ESTS limit is 350B, set to 330 to provide a 20B buffer,\r\n    MAX_CACHED_ERRORS: 50, // Limit the number of errors that can be stored to prevent uncontrolled size gains\r\n    CACHE_KEY: \"server-telemetry\",\r\n    CATEGORY_SEPARATOR: \"|\",\r\n    VALUE_SEPARATOR: \",\",\r\n    OVERFLOW_TRUE: \"1\",\r\n    OVERFLOW_FALSE: \"0\",\r\n    UNKNOWN_ERROR: \"unknown_error\"\r\n};\r\n\r\n/**\r\n * Type of the authentication request\r\n */\r\nexport enum AuthenticationScheme {\r\n    BEARER = \"Bearer\",\r\n    POP = \"pop\",\r\n    SSH = \"ssh-cert\"\r\n}\r\n\r\n/**\r\n * Constants related to throttling\r\n */\r\nexport const ThrottlingConstants = {\r\n    // Default time to throttle RequestThumbprint in seconds\r\n    DEFAULT_THROTTLE_TIME_SECONDS: 60,\r\n    // Default maximum time to throttle in seconds, overrides what the server sends back\r\n    DEFAULT_MAX_THROTTLE_TIME_SECONDS: 3600,\r\n    // Prefix for storing throttling entries\r\n    THROTTLING_PREFIX: \"throttling\",\r\n    // Value assigned to the x-ms-lib-capability header to indicate to the server the library supports throttling\r\n    X_MS_LIB_CAPABILITY_VALUE: \"retry-after, h429\"\r\n};\r\n\r\nexport const Errors = {\r\n    INVALID_GRANT_ERROR: \"invalid_grant\",\r\n    CLIENT_MISMATCH_ERROR: \"client_mismatch\",\r\n};\r\n\r\n/**\r\n * Password grant parameters\r\n */\r\nexport enum PasswordGrantConstants {\r\n    username = \"username\",\r\n    password = \"password\"\r\n}\r\n\r\n/**\r\n * Response codes\r\n */\r\nexport enum  ResponseCodes {\r\n    httpSuccess = 200,\r\n    httpBadRequest = 400\r\n}\r\n\r\n/**\r\n * Region Discovery Sources\r\n */\r\nexport enum RegionDiscoverySources {\r\n    FAILED_AUTO_DETECTION = \"1\",\r\n    INTERNAL_CACHE = \"2\",\r\n    ENVIRONMENT_VARIABLE = \"3\",\r\n    IMDS = \"4\",\r\n}\r\n\r\n/**\r\n * Region Discovery Outcomes\r\n */\r\nexport enum RegionDiscoveryOutcomes {\r\n    CONFIGURED_MATCHES_DETECTED = \"1\",\r\n    CONFIGURED_NO_AUTO_DETECTION = \"2\",\r\n    CONFIGURED_NOT_DETECTED = \"3\",\r\n    AUTO_DETECTION_REQUESTED_SUCCESSFUL = \"4\",\r\n    AUTO_DETECTION_REQUESTED_FAILED = \"5\"\r\n}\r\n\r\nexport enum CacheOutcome {\r\n    NO_CACHE_HIT = \"0\",\r\n    FORCE_REFRESH = \"1\",\r\n    NO_CACHED_ACCESS_TOKEN = \"2\",\r\n    CACHED_ACCESS_TOKEN_EXPIRED = \"3\",\r\n    REFRESH_CACHED_ACCESS_TOKEN = \"4\",\r\n    CLAIMS_REQUESTED_CACHE_SKIPPED = \"5\"\r\n}\r\n\r\nexport enum JsonTypes {\r\n    Jwt = \"JWT\",\r\n    Jwk = \"JWK\",\r\n    Pop = \"pop\"\r\n}\r\n\r\nexport const ONE_DAY_IN_MS = 86400000;\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n/**\r\n * Authority types supported by MSAL.\r\n */\r\nexport enum AuthorityType {\r\n    Default,\r\n    Adfs,\r\n    Dsts,\r\n    Ciam\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n/**\r\n * Protocol modes supported by MSAL.\r\n */\r\nexport enum ProtocolMode {\r\n    AAD = \"AAD\",\r\n    OIDC = \"OIDC\"\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Constants } from \"../utils/Constants\";\r\n\r\n/**\r\n * AuthErrorMessage class containing string constants used by error codes and messages.\r\n */\r\nexport const AuthErrorMessage = {\r\n    unexpectedError: {\r\n        code: \"unexpected_error\",\r\n        desc: \"Unexpected error in authentication.\"\r\n    },\r\n    postRequestFailed: {\r\n        code: \"post_request_failed\",\r\n        desc: \"Post request failed from the network, could be a 4xx/5xx or a network unavailability. Please check the exact error code for details.\"\r\n    }\r\n};\r\n\r\n/**\r\n * General error class thrown by the MSAL.js library.\r\n */\r\nexport class AuthError extends Error {\r\n\r\n    /**\r\n     * Short string denoting error\r\n     */\r\n    errorCode: string;\r\n\r\n    /**\r\n     * Detailed description of error\r\n     */\r\n    errorMessage: string;\r\n\r\n    /**\r\n     * Describes the subclass of an error\r\n     */\r\n    subError: string;\r\n\r\n    /**\r\n     * CorrelationId associated with the error\r\n     */\r\n    correlationId: string;\r\n\r\n    constructor(errorCode?: string, errorMessage?: string, suberror?: string) {\r\n        const errorString = errorMessage ? `${errorCode}: ${errorMessage}` : errorCode;\r\n        super(errorString);\r\n        Object.setPrototypeOf(this, AuthError.prototype);\r\n\r\n        this.errorCode = errorCode || Constants.EMPTY_STRING;\r\n        this.errorMessage = errorMessage || Constants.EMPTY_STRING;\r\n        this.subError = suberror || Constants.EMPTY_STRING;\r\n        this.name = \"AuthError\";\r\n    }\r\n\r\n    setCorrelationId(correlationId: string): void {\r\n        this.correlationId = correlationId;\r\n    }\r\n\r\n    /**\r\n     * Creates an error that is thrown when something unexpected happens in the library.\r\n     * @param errDesc\r\n     */\r\n    static createUnexpectedError(errDesc: string): AuthError {\r\n        return new AuthError(AuthErrorMessage.unexpectedError.code, `${AuthErrorMessage.unexpectedError.desc}: ${errDesc}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error for post request failures.\r\n     * @param errDesc \r\n     * @returns \r\n     */\r\n    static createPostRequestFailed(errDesc: string): AuthError {\r\n        return new AuthError(AuthErrorMessage.postRequestFailed.code, `${AuthErrorMessage.postRequestFailed.desc}: ${errDesc}`);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthError } from \"./AuthError\";\r\n\r\n/**\r\n * ClientAuthErrorMessage class containing string constants used by error codes and messages.\r\n */\r\nexport const ClientAuthErrorMessage = {\r\n    clientInfoDecodingError: {\r\n        code: \"client_info_decoding_error\",\r\n        desc: \"The client info could not be parsed/decoded correctly. Please review the trace to determine the root cause.\"\r\n    },\r\n    clientInfoEmptyError: {\r\n        code: \"client_info_empty_error\",\r\n        desc: \"The client info was empty. Please review the trace to determine the root cause.\"\r\n    },\r\n    tokenParsingError: {\r\n        code: \"token_parsing_error\",\r\n        desc: \"Token cannot be parsed. Please review stack trace to determine root cause.\"\r\n    },\r\n    nullOrEmptyToken: {\r\n        code: \"null_or_empty_token\",\r\n        desc: \"The token is null or empty. Please review the trace to determine the root cause.\"\r\n    },\r\n    endpointResolutionError: {\r\n        code: \"endpoints_resolution_error\",\r\n        desc: \"Error: could not resolve endpoints. Please check network and try again.\"\r\n    },\r\n    networkError: {\r\n        code: \"network_error\",\r\n        desc: \"Network request failed. Please check network trace to determine root cause.\"\r\n    },\r\n    unableToGetOpenidConfigError: {\r\n        code: \"openid_config_error\",\r\n        desc: \"Could not retrieve endpoints. Check your authority and verify the .well-known/openid-configuration endpoint returns the required endpoints.\"\r\n    },\r\n    hashNotDeserialized: {\r\n        code: \"hash_not_deserialized\",\r\n        desc: \"The hash parameters could not be deserialized. Please review the trace to determine the root cause.\"\r\n    },\r\n    blankGuidGenerated: {\r\n        code: \"blank_guid_generated\",\r\n        desc: \"The guid generated was blank. Please review the trace to determine the root cause.\"\r\n    },\r\n    invalidStateError: {\r\n        code: \"invalid_state\",\r\n        desc: \"State was not the expected format. Please check the logs to determine whether the request was sent using ProtocolUtils.setRequestState().\"\r\n    },\r\n    stateMismatchError: {\r\n        code: \"state_mismatch\",\r\n        desc: \"State mismatch error. Please check your network. Continued requests may cause cache overflow.\"\r\n    },\r\n    stateNotFoundError: {\r\n        code: \"state_not_found\",\r\n        desc: \"State not found\"\r\n    },\r\n    nonceMismatchError: {\r\n        code: \"nonce_mismatch\",\r\n        desc: \"Nonce mismatch error. This may be caused by a race condition in concurrent requests.\"\r\n    },\r\n    nonceNotFoundError: {\r\n        code: \"nonce_not_found\",\r\n        desc: \"nonce not found\"\r\n    },\r\n    authTimeNotFoundError: {\r\n        code: \"auth_time_not_found\",\r\n        desc: \"Max Age was requested and the ID token is missing the auth_time variable.\" +\r\n            \" auth_time is an optional claim and is not enabled by default - it must be enabled.\" +\r\n            \" See https://aka.ms/msaljs/optional-claims for more information.\"\r\n    },\r\n    maxAgeTranspiredError: {\r\n        code: \"max_age_transpired\",\r\n        desc: \"Max Age is set to 0, or too much time has elapsed since the last end-user authentication.\"\r\n    },\r\n    noTokensFoundError: {\r\n        code: \"no_tokens_found\",\r\n        desc: \"No tokens were found for the given scopes, and no authorization code was passed to acquireToken. You must retrieve an authorization code before making a call to acquireToken().\"\r\n    },\r\n    multipleMatchingTokens: {\r\n        code: \"multiple_matching_tokens\",\r\n        desc: \"The cache contains multiple tokens satisfying the requirements. \" +\r\n            \"Call AcquireToken again providing more requirements such as authority or account.\"\r\n    },\r\n    multipleMatchingAccounts: {\r\n        code: \"multiple_matching_accounts\",\r\n        desc: \"The cache contains multiple accounts satisfying the given parameters. Please pass more info to obtain the correct account\"\r\n    },\r\n    multipleMatchingAppMetadata: {\r\n        code: \"multiple_matching_appMetadata\",\r\n        desc: \"The cache contains multiple appMetadata satisfying the given parameters. Please pass more info to obtain the correct appMetadata\"\r\n    },\r\n    tokenRequestCannotBeMade: {\r\n        code: \"request_cannot_be_made\",\r\n        desc: \"Token request cannot be made without authorization code or refresh token.\"\r\n    },\r\n    appendEmptyScopeError: {\r\n        code: \"cannot_append_empty_scope\",\r\n        desc: \"Cannot append null or empty scope to ScopeSet. Please check the stack trace for more info.\"\r\n    },\r\n    removeEmptyScopeError: {\r\n        code: \"cannot_remove_empty_scope\",\r\n        desc: \"Cannot remove null or empty scope from ScopeSet. Please check the stack trace for more info.\"\r\n    },\r\n    appendScopeSetError: {\r\n        code: \"cannot_append_scopeset\",\r\n        desc: \"Cannot append ScopeSet due to error.\"\r\n    },\r\n    emptyInputScopeSetError: {\r\n        code: \"empty_input_scopeset\",\r\n        desc: \"Empty input ScopeSet cannot be processed.\"\r\n    },\r\n    DeviceCodePollingCancelled: {\r\n        code: \"device_code_polling_cancelled\",\r\n        desc: \"Caller has cancelled token endpoint polling during device code flow by setting DeviceCodeRequest.cancel = true.\"\r\n    },\r\n    DeviceCodeExpired: {\r\n        code: \"device_code_expired\",\r\n        desc: \"Device code is expired.\"\r\n    },\r\n    DeviceCodeUnknownError: {\r\n        code: \"device_code_unknown_error\",\r\n        desc: \"Device code stopped polling for unknown reasons.\"\r\n    },\r\n    NoAccountInSilentRequest: {\r\n        code: \"no_account_in_silent_request\",\r\n        desc: \"Please pass an account object, silent flow is not supported without account information\"\r\n    },\r\n    invalidCacheRecord: {\r\n        code: \"invalid_cache_record\",\r\n        desc: \"Cache record object was null or undefined.\"\r\n    },\r\n    invalidCacheEnvironment: {\r\n        code: \"invalid_cache_environment\",\r\n        desc: \"Invalid environment when attempting to create cache entry\"\r\n    },\r\n    noAccountFound: {\r\n        code: \"no_account_found\",\r\n        desc: \"No account found in cache for given key.\"\r\n    },\r\n    CachePluginError: {\r\n        code: \"no cache plugin set on CacheManager\",\r\n        desc: \"ICachePlugin needs to be set before using readFromStorage or writeFromStorage\"\r\n    },\r\n    noCryptoObj: {\r\n        code: \"no_crypto_object\",\r\n        desc: \"No crypto object detected. This is required for the following operation: \"\r\n    },\r\n    invalidCacheType: {\r\n        code: \"invalid_cache_type\",\r\n        desc: \"Invalid cache type\"\r\n    },\r\n    unexpectedAccountType: {\r\n        code: \"unexpected_account_type\",\r\n        desc: \"Unexpected account type.\"\r\n    },\r\n    unexpectedCredentialType: {\r\n        code: \"unexpected_credential_type\",\r\n        desc: \"Unexpected credential type.\"\r\n    },\r\n    invalidAssertion: {\r\n        code: \"invalid_assertion\",\r\n        desc: \"Client assertion must meet requirements described in https://tools.ietf.org/html/rfc7515\"\r\n    },\r\n    invalidClientCredential: {\r\n        code: \"invalid_client_credential\",\r\n        desc: \"Client credential (secret, certificate, or assertion) must not be empty when creating a confidential client. An application should at most have one credential\"\r\n    },\r\n    tokenRefreshRequired: {\r\n        code: \"token_refresh_required\",\r\n        desc: \"Cannot return token from cache because it must be refreshed. This may be due to one of the following reasons: forceRefresh parameter is set to true, claims have been requested, there is no cached access token or it is expired.\"\r\n    },\r\n    userTimeoutReached: {\r\n        code: \"user_timeout_reached\",\r\n        desc: \"User defined timeout for device code polling reached\",\r\n    },\r\n    tokenClaimsRequired: {\r\n        code: \"token_claims_cnf_required_for_signedjwt\",\r\n        desc: \"Cannot generate a POP jwt if the token_claims are not populated\"\r\n    },\r\n    noAuthorizationCodeFromServer: {\r\n        code: \"authorization_code_missing_from_server_response\",\r\n        desc: \"Server response does not contain an authorization code to proceed\"\r\n    },\r\n    noAzureRegionDetected: {\r\n        code: \"no_azure_region_detected\",\r\n        desc: \"No azure region was detected and no fallback was made available\"\r\n    },\r\n    accessTokenEntityNullError: {\r\n        code: \"access_token_entity_null\",\r\n        desc: \"Access token entity is null, please check logs and cache to ensure a valid access token is present.\"\r\n    },\r\n    bindingKeyNotRemovedError: {\r\n        code: \"binding_key_not_removed\",\r\n        desc: \"Could not remove the credential's binding key from storage.\"\r\n    },\r\n    logoutNotSupported: {\r\n        code: \"end_session_endpoint_not_supported\",\r\n        desc: \"Provided authority does not support logout.\"\r\n    },\r\n    keyIdMissing: {\r\n        code: \"key_id_missing\",\r\n        desc: \"A keyId value is missing from the requested bound token's cache record and is required to match the token to it's stored binding key.\"\r\n    },\r\n    noNetworkConnectivity: {\r\n        code: \"no_network_connectivity\",\r\n        desc: \"No network connectivity. Check your internet connection.\"\r\n    },\r\n    userCanceledError: {\r\n        code: \"user_canceled\",\r\n        desc: \"User canceled the flow.\"\r\n    }\r\n};\r\n\r\n/**\r\n * Error thrown when there is an error in the client code running on the browser.\r\n */\r\nexport class ClientAuthError extends AuthError {\r\n\r\n    constructor(errorCode: string, errorMessage?: string) {\r\n        super(errorCode, errorMessage);\r\n        this.name = \"ClientAuthError\";\r\n\r\n        Object.setPrototypeOf(this, ClientAuthError.prototype);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when client info object doesn't decode correctly.\r\n     * @param caughtError\r\n     */\r\n    static createClientInfoDecodingError(caughtError: string): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.clientInfoDecodingError.code,\r\n            `${ClientAuthErrorMessage.clientInfoDecodingError.desc} Failed with error: ${caughtError}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown if the client info is empty.\r\n     * @param rawClientInfo\r\n     */\r\n    static createClientInfoEmptyError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.clientInfoEmptyError.code,\r\n            `${ClientAuthErrorMessage.clientInfoEmptyError.desc}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the id token extraction errors out.\r\n     * @param err\r\n     */\r\n    static createTokenParsingError(caughtExtractionError: string): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.tokenParsingError.code,\r\n            `${ClientAuthErrorMessage.tokenParsingError.desc} Failed with error: ${caughtExtractionError}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the id token string is null or empty.\r\n     * @param invalidRawTokenString\r\n     */\r\n    static createTokenNullOrEmptyError(invalidRawTokenString: string): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.nullOrEmptyToken.code,\r\n            `${ClientAuthErrorMessage.nullOrEmptyToken.desc} Raw Token Value: ${invalidRawTokenString}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the endpoint discovery doesn't complete correctly.\r\n     */\r\n    static createEndpointDiscoveryIncompleteError(errDetail: string): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.endpointResolutionError.code,\r\n            `${ClientAuthErrorMessage.endpointResolutionError.desc} Detail: ${errDetail}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the fetch client throws\r\n     */\r\n    static createNetworkError(endpoint: string, errDetail: string): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.networkError.code,\r\n            `${ClientAuthErrorMessage.networkError.desc} | Fetch client threw: ${errDetail} | Attempted to reach: ${endpoint.split(\"?\")[0]}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the openid-configuration endpoint cannot be reached or does not contain the required data\r\n     */\r\n    static createUnableToGetOpenidConfigError(errDetail: string): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.unableToGetOpenidConfigError.code,\r\n            `${ClientAuthErrorMessage.unableToGetOpenidConfigError.desc} Attempted to retrieve endpoints from: ${errDetail}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the hash cannot be deserialized.\r\n     * @param hashParamObj\r\n     */\r\n    static createHashNotDeserializedError(hashParamObj: string): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.hashNotDeserialized.code,\r\n            `${ClientAuthErrorMessage.hashNotDeserialized.desc} Given Object: ${hashParamObj}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the state cannot be parsed.\r\n     * @param invalidState\r\n     */\r\n    static createInvalidStateError(invalidState: string, errorString?: string): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.invalidStateError.code,\r\n            `${ClientAuthErrorMessage.invalidStateError.desc} Invalid State: ${invalidState}, Root Err: ${errorString}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when two states do not match.\r\n     */\r\n    static createStateMismatchError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.stateMismatchError.code,\r\n            ClientAuthErrorMessage.stateMismatchError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the state is not present\r\n     * @param missingState\r\n     */\r\n    static createStateNotFoundError(missingState: string): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.stateNotFoundError.code,\r\n            `${ClientAuthErrorMessage.stateNotFoundError.desc}:  ${missingState}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the nonce does not match.\r\n     */\r\n    static createNonceMismatchError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.nonceMismatchError.code,\r\n            ClientAuthErrorMessage.nonceMismatchError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when max_age was provided in the request, but auth_time is not in the token claims\r\n     * @param missingNonce\r\n     */\r\n    static createAuthTimeNotFoundError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.authTimeNotFoundError.code,\r\n            ClientAuthErrorMessage.authTimeNotFoundError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when too much time has elapsed since the last end-user authentication\r\n     */\r\n    static createMaxAgeTranspiredError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.maxAgeTranspiredError.code,\r\n            ClientAuthErrorMessage.maxAgeTranspiredError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the mnonce is not present\r\n     * @param missingNonce\r\n     */\r\n    static createNonceNotFoundError(missingNonce: string): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.nonceNotFoundError.code,\r\n            `${ClientAuthErrorMessage.nonceNotFoundError.desc}:  ${missingNonce}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error when multiple tokens are in cache.\r\n     */\r\n    static createMultipleMatchingTokensInCacheError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingTokens.code,\r\n            `${ClientAuthErrorMessage.multipleMatchingTokens.desc}.`);\r\n    }\r\n\r\n    /**\r\n     * Throws error when multiple accounts are in cache for the given params\r\n     */\r\n    static createMultipleMatchingAccountsInCacheError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingAccounts.code,\r\n            ClientAuthErrorMessage.multipleMatchingAccounts.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws error when multiple appMetada are in cache for the given clientId.\r\n     */\r\n    static createMultipleMatchingAppMetadataInCacheError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.multipleMatchingAppMetadata.code,\r\n            ClientAuthErrorMessage.multipleMatchingAppMetadata.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws error when no auth code or refresh token is given to ServerTokenRequestParameters.\r\n     */\r\n    static createTokenRequestCannotBeMadeError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.tokenRequestCannotBeMade.code, ClientAuthErrorMessage.tokenRequestCannotBeMade.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws error when attempting to append a null, undefined or empty scope to a set\r\n     * @param givenScope\r\n     */\r\n    static createAppendEmptyScopeToSetError(givenScope: string): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.appendEmptyScopeError.code, `${ClientAuthErrorMessage.appendEmptyScopeError.desc} Given Scope: ${givenScope}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error when attempting to append a null, undefined or empty scope to a set\r\n     * @param givenScope\r\n     */\r\n    static createRemoveEmptyScopeFromSetError(givenScope: string): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.removeEmptyScopeError.code, `${ClientAuthErrorMessage.removeEmptyScopeError.desc} Given Scope: ${givenScope}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error when attempting to append null or empty ScopeSet.\r\n     * @param appendError\r\n     */\r\n    static createAppendScopeSetError(appendError: string): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.appendScopeSetError.code, `${ClientAuthErrorMessage.appendScopeSetError.desc} Detail Error: ${appendError}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error if ScopeSet is null or undefined.\r\n     * @param givenScopeSet\r\n     */\r\n    static createEmptyInputScopeSetError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.emptyInputScopeSetError.code, `${ClientAuthErrorMessage.emptyInputScopeSetError.desc}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error if user sets CancellationToken.cancel = true during polling of token endpoint during device code flow\r\n     */\r\n    static createDeviceCodeCancelledError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.DeviceCodePollingCancelled.code, `${ClientAuthErrorMessage.DeviceCodePollingCancelled.desc}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error if device code is expired\r\n     */\r\n    static createDeviceCodeExpiredError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.DeviceCodeExpired.code, `${ClientAuthErrorMessage.DeviceCodeExpired.desc}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error if device code is expired\r\n     */\r\n    static createDeviceCodeUnknownError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.DeviceCodeUnknownError.code, `${ClientAuthErrorMessage.DeviceCodeUnknownError.desc}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error when silent requests are made without an account object\r\n     */\r\n    static createNoAccountInSilentRequestError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.NoAccountInSilentRequest.code, `${ClientAuthErrorMessage.NoAccountInSilentRequest.desc}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error when cache record is null or undefined.\r\n     */\r\n    static createNullOrUndefinedCacheRecord(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.invalidCacheRecord.code, ClientAuthErrorMessage.invalidCacheRecord.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws error when provided environment is not part of the CloudDiscoveryMetadata object\r\n     */\r\n    static createInvalidCacheEnvironmentError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.invalidCacheEnvironment.code, ClientAuthErrorMessage.invalidCacheEnvironment.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws error when account is not found in cache.\r\n     */\r\n    static createNoAccountFoundError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.noAccountFound.code, ClientAuthErrorMessage.noAccountFound.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws error if ICachePlugin not set on CacheManager.\r\n     */\r\n    static createCachePluginError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.CachePluginError.code, `${ClientAuthErrorMessage.CachePluginError.desc}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error if crypto object not found.\r\n     * @param operationName\r\n     */\r\n    static createNoCryptoObjectError(operationName: string): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.noCryptoObj.code, `${ClientAuthErrorMessage.noCryptoObj.desc}${operationName}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error if cache type is invalid.\r\n     */\r\n    static createInvalidCacheTypeError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.invalidCacheType.code, `${ClientAuthErrorMessage.invalidCacheType.desc}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error if unexpected account type.\r\n     */\r\n    static createUnexpectedAccountTypeError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.unexpectedAccountType.code, `${ClientAuthErrorMessage.unexpectedAccountType.desc}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error if unexpected credential type.\r\n     */\r\n    static createUnexpectedCredentialTypeError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.unexpectedCredentialType.code, `${ClientAuthErrorMessage.unexpectedCredentialType.desc}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error if client assertion is not valid.\r\n     */\r\n    static createInvalidAssertionError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.invalidAssertion.code, `${ClientAuthErrorMessage.invalidAssertion.desc}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error if client assertion is not valid.\r\n     */\r\n    static createInvalidCredentialError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.invalidClientCredential.code, `${ClientAuthErrorMessage.invalidClientCredential.desc}`);\r\n    }\r\n\r\n    /**\r\n     * Throws error if token cannot be retrieved from cache due to refresh being required.\r\n     */\r\n    static createRefreshRequiredError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.tokenRefreshRequired.code, ClientAuthErrorMessage.tokenRefreshRequired.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws error if the user defined timeout is reached.\r\n     */\r\n    static createUserTimeoutReachedError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.userTimeoutReached.code, ClientAuthErrorMessage.userTimeoutReached.desc);\r\n    }\r\n\r\n    /*\r\n     * Throws error if token claims are not populated for a signed jwt generation\r\n     */\r\n    static createTokenClaimsRequiredError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.tokenClaimsRequired.code, ClientAuthErrorMessage.tokenClaimsRequired.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws error when the authorization code is missing from the server response\r\n     */\r\n    static createNoAuthCodeInServerResponseError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.noAuthorizationCodeFromServer.code, ClientAuthErrorMessage.noAuthorizationCodeFromServer.desc);\r\n    }\r\n\r\n    static createBindingKeyNotRemovedError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.bindingKeyNotRemovedError.code, ClientAuthErrorMessage.bindingKeyNotRemovedError.desc);\r\n    }\r\n\r\n    /**\r\n     * Thrown when logout is attempted for an authority that doesnt have an end_session_endpoint\r\n     */\r\n    static createLogoutNotSupportedError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.logoutNotSupported.code, ClientAuthErrorMessage.logoutNotSupported.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error when kid attribute is missing from a PoP token's cache record\r\n     */\r\n    static createKeyIdMissingError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.keyIdMissing.code, ClientAuthErrorMessage.keyIdMissing.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error when the client does not have network connectivity\r\n     */\r\n    static createNoNetworkConnectivityError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.noNetworkConnectivity.code, ClientAuthErrorMessage.noNetworkConnectivity.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error when the user cancels the flow\r\n     */\r\n    static createUserCanceledError(): ClientAuthError {\r\n        return new ClientAuthError(ClientAuthErrorMessage.userCanceledError.code, ClientAuthErrorMessage.userCanceledError.desc);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Separators, CredentialType, CacheType, Constants, AuthenticationScheme } from \"../../utils/Constants\";\r\nimport { ClientAuthError } from \"../../error/ClientAuthError\";\r\n\r\n/**\r\n * Base type for credentials to be stored in the cache: eg: ACCESS_TOKEN, ID_TOKEN etc\r\n *\r\n * Key:Value Schema:\r\n *\r\n * Key: <home_account_id*>-<environment>-<credential_type>-<client_id>-<realm*>-<target*>-<requestedClaims*>-<scheme*>\r\n *\r\n * Value Schema:\r\n * {\r\n *      homeAccountId: home account identifier for the auth scheme,\r\n *      environment: entity that issued the token, represented as a full host\r\n *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other\r\n *      clientId: client ID of the application\r\n *      secret: Actual credential as a string\r\n *      familyId: Family ID identifier, usually only used for refresh tokens\r\n *      realm: Full tenant or organizational identifier that the account belongs to\r\n *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.\r\n *      tokenType: Matches the authentication scheme for which the token was issued (i.e. Bearer or pop)\r\n *      requestedClaimsHash: Matches the SHA 256 hash of the claims object included in the token request\r\n *      userAssertionHash: Matches the SHA 256 hash of the obo_assertion for the OBO flow\r\n * }\r\n */\r\nexport class CredentialEntity {\r\n    homeAccountId: string;\r\n    environment: string;\r\n    credentialType: CredentialType;\r\n    clientId: string;\r\n    secret: string;\r\n    familyId?: string;\r\n    realm?: string;\r\n    target?: string;\r\n    userAssertionHash?: string;\r\n    tokenType?: AuthenticationScheme;\r\n    keyId?: string;\r\n    requestedClaimsHash?: string;\r\n\r\n    /**\r\n     * Generate Account Id key component as per the schema: <home_account_id>-<environment>\r\n     */\r\n    generateAccountId(): string {\r\n        return CredentialEntity.generateAccountIdForCacheKey(this.homeAccountId, this.environment);\r\n    }\r\n\r\n    /**\r\n     * Generate Credential Id key component as per the schema: <credential_type>-<client_id>-<realm>\r\n     */\r\n    generateCredentialId(): string {\r\n        return CredentialEntity.generateCredentialIdForCacheKey(\r\n            this.credentialType,\r\n            this.clientId,\r\n            this.realm,\r\n            this.familyId\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Generate target key component as per schema: <target>\r\n     */\r\n    generateTarget(): string {\r\n        return CredentialEntity.generateTargetForCacheKey(this.target);\r\n    }\r\n\r\n    /**\r\n     * generates credential key\r\n     */\r\n    generateCredentialKey(): string {\r\n        return CredentialEntity.generateCredentialCacheKey(\r\n            this.homeAccountId,\r\n            this.environment,\r\n            this.credentialType,\r\n            this.clientId,\r\n            this.realm,\r\n            this.target,\r\n            this.familyId,\r\n            this.tokenType,\r\n            this.requestedClaimsHash,\r\n        );\r\n    }\r\n\r\n    /**\r\n     * returns the type of the cache (in this case credential)\r\n     */\r\n    generateType(): number {\r\n        switch (this.credentialType) {\r\n            case CredentialType.ID_TOKEN:\r\n                return CacheType.ID_TOKEN;\r\n            case CredentialType.ACCESS_TOKEN:\r\n            case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME:\r\n                return CacheType.ACCESS_TOKEN;\r\n            case CredentialType.REFRESH_TOKEN:\r\n                return CacheType.REFRESH_TOKEN;\r\n            default: {\r\n                throw ClientAuthError.createUnexpectedCredentialTypeError();\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * generates credential key\r\n     * <home_account_id*>-\\<environment>-<credential_type>-<client_id>-<realm\\*>-<target\\*>-<scheme\\*>\r\n     */\r\n    static generateCredentialCacheKey(\r\n        homeAccountId: string,\r\n        environment: string,\r\n        credentialType: CredentialType,\r\n        clientId: string,\r\n        realm?: string,\r\n        target?: string,\r\n        familyId?: string,\r\n        tokenType?: AuthenticationScheme,\r\n        requestedClaimsHash?: string\r\n    ): string {\r\n        const credentialKey = [\r\n            this.generateAccountIdForCacheKey(homeAccountId, environment),\r\n            this.generateCredentialIdForCacheKey(credentialType, clientId, realm, familyId),\r\n            this.generateTargetForCacheKey(target),\r\n            this.generateClaimsHashForCacheKey(requestedClaimsHash),\r\n            this.generateSchemeForCacheKey(tokenType)\r\n        ];\r\n\r\n        return credentialKey.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();\r\n    }\r\n\r\n    /**\r\n     * generates Account Id for keys\r\n     * @param homeAccountId\r\n     * @param environment\r\n     */\r\n    private static generateAccountIdForCacheKey(\r\n        homeAccountId: string,\r\n        environment: string\r\n    ): string {\r\n        const accountId: Array<string> = [homeAccountId, environment];\r\n        return accountId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();\r\n    }\r\n\r\n    /**\r\n     * Generates Credential Id for keys\r\n     * @param credentialType\r\n     * @param realm\r\n     * @param clientId\r\n     * @param familyId\r\n     */\r\n    private static generateCredentialIdForCacheKey(\r\n        credentialType: CredentialType,\r\n        clientId: string,\r\n        realm?: string,\r\n        familyId?: string\r\n    ): string {\r\n        const clientOrFamilyId =\r\n            credentialType === CredentialType.REFRESH_TOKEN\r\n                ? familyId || clientId\r\n                : clientId;\r\n        const credentialId: Array<string> = [\r\n            credentialType,\r\n            clientOrFamilyId,\r\n            realm || Constants.EMPTY_STRING,\r\n        ];\r\n\r\n        return credentialId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();\r\n    }\r\n\r\n    /**\r\n     * Generate target key component as per schema: <target>\r\n     */\r\n    private static generateTargetForCacheKey(scopes?: string): string {\r\n        return (scopes || Constants.EMPTY_STRING).toLowerCase();\r\n    }\r\n\r\n    /**\r\n     * Generate requested claims key component as per schema: <requestedClaims>\r\n     */\r\n    private static generateClaimsHashForCacheKey(requestedClaimsHash?: string): string {\r\n        return(requestedClaimsHash || Constants.EMPTY_STRING).toLowerCase();\r\n    }\r\n\r\n    /**\r\n     * Generate scheme key componenet as per schema: <scheme>\r\n     */\r\n    private static generateSchemeForCacheKey(tokenType?: string): string {\r\n        /*\r\n         * PoP Tokens and SSH certs include scheme in cache key\r\n         * Cast to lowercase to handle \"bearer\" from ADFS\r\n         */\r\n        return (tokenType && tokenType.toLowerCase() !== AuthenticationScheme.BEARER.toLowerCase()) ? tokenType.toLowerCase() : Constants.EMPTY_STRING;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { CredentialEntity } from \"./CredentialEntity\";\r\nimport { CredentialType } from \"../../utils/Constants\";\r\n\r\n/**\r\n * ID_TOKEN Cache\r\n *\r\n * Key:Value Schema:\r\n *\r\n * Key Example: uid.utid-login.microsoftonline.com-idtoken-clientId-contoso.com-\r\n *\r\n * Value Schema:\r\n * {\r\n *      homeAccountId: home account identifier for the auth scheme,\r\n *      environment: entity that issued the token, represented as a full host\r\n *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other\r\n *      clientId: client ID of the application\r\n *      secret: Actual credential as a string\r\n *      realm: Full tenant or organizational identifier that the account belongs to\r\n * }\r\n */\r\nexport class IdTokenEntity extends CredentialEntity {\r\n    realm: string;\r\n\r\n    /**\r\n     * Create IdTokenEntity\r\n     * @param homeAccountId\r\n     * @param authenticationResult\r\n     * @param clientId\r\n     * @param authority\r\n     */\r\n    static createIdTokenEntity(\r\n        homeAccountId: string,\r\n        environment: string,\r\n        idToken: string,\r\n        clientId: string,\r\n        tenantId: string,\r\n    ): IdTokenEntity {\r\n        const idTokenEntity = new IdTokenEntity();\r\n\r\n        idTokenEntity.credentialType = CredentialType.ID_TOKEN;\r\n        idTokenEntity.homeAccountId = homeAccountId;\r\n        idTokenEntity.environment = environment;\r\n        idTokenEntity.clientId = clientId;\r\n        idTokenEntity.secret = idToken;\r\n        idTokenEntity.realm = tenantId;\r\n\r\n        return idTokenEntity;\r\n    }\r\n\r\n    /**\r\n     * Validates an entity: checks for all expected params\r\n     * @param entity\r\n     */\r\n    static isIdTokenEntity(entity: object): boolean {\r\n\r\n        if (!entity) {\r\n            return false;\r\n        }\r\n\r\n        return (\r\n            entity.hasOwnProperty(\"homeAccountId\") &&\r\n            entity.hasOwnProperty(\"environment\") &&\r\n            entity.hasOwnProperty(\"credentialType\") &&\r\n            entity.hasOwnProperty(\"realm\") &&\r\n            entity.hasOwnProperty(\"clientId\") &&\r\n            entity.hasOwnProperty(\"secret\") &&\r\n            entity[\"credentialType\"] === CredentialType.ID_TOKEN\r\n        );\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ClientAuthError } from \"./ClientAuthError\";\r\n\r\n/**\r\n * ClientConfigurationErrorMessage class containing string constants used by error codes and messages.\r\n */\r\nexport const ClientConfigurationErrorMessage = {\r\n    redirectUriNotSet: {\r\n        code: \"redirect_uri_empty\",\r\n        desc: \"A redirect URI is required for all calls, and none has been set.\"\r\n    },\r\n    postLogoutUriNotSet: {\r\n        code: \"post_logout_uri_empty\",\r\n        desc: \"A post logout redirect has not been set.\"\r\n    },\r\n    claimsRequestParsingError: {\r\n        code: \"claims_request_parsing_error\",\r\n        desc: \"Could not parse the given claims request object.\"\r\n    },\r\n    authorityUriInsecure: {\r\n        code: \"authority_uri_insecure\",\r\n        desc: \"Authority URIs must use https.  Please see here for valid authority configuration options: https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-js-initializing-client-applications#configuration-options\"\r\n    },\r\n    urlParseError: {\r\n        code: \"url_parse_error\",\r\n        desc: \"URL could not be parsed into appropriate segments.\"\r\n    },\r\n    urlEmptyError: {\r\n        code: \"empty_url_error\",\r\n        desc: \"URL was empty or null.\"\r\n    },\r\n    emptyScopesError: {\r\n        code: \"empty_input_scopes_error\",\r\n        desc: \"Scopes cannot be passed as null, undefined or empty array because they are required to obtain an access token.\"\r\n    },\r\n    nonArrayScopesError: {\r\n        code: \"nonarray_input_scopes_error\",\r\n        desc: \"Scopes cannot be passed as non-array.\"\r\n    },\r\n    clientIdSingleScopeError: {\r\n        code: \"clientid_input_scopes_error\",\r\n        desc: \"Client ID can only be provided as a single scope.\"\r\n    },\r\n    invalidPrompt: {\r\n        code: \"invalid_prompt_value\",\r\n        desc: \"Supported prompt values are 'login', 'select_account', 'consent', 'create', 'none' and 'no_session'.  Please see here for valid configuration options: https://azuread.github.io/microsoft-authentication-library-for-js/ref/modules/_azure_msal_common.html#commonauthorizationurlrequest\",\r\n    },\r\n    invalidClaimsRequest: {\r\n        code: \"invalid_claims\",\r\n        desc: \"Given claims parameter must be a stringified JSON object.\"\r\n    },\r\n    tokenRequestEmptyError: {\r\n        code: \"token_request_empty\",\r\n        desc: \"Token request was empty and not found in cache.\"\r\n    },\r\n    logoutRequestEmptyError: {\r\n        code: \"logout_request_empty\",\r\n        desc: \"The logout request was null or undefined.\"\r\n    },\r\n    invalidCodeChallengeMethod: {\r\n        code: \"invalid_code_challenge_method\",\r\n        desc: \"code_challenge_method passed is invalid. Valid values are \\\"plain\\\" and \\\"S256\\\".\"\r\n    },\r\n    invalidCodeChallengeParams: {\r\n        code: \"pkce_params_missing\",\r\n        desc: \"Both params: code_challenge and code_challenge_method are to be passed if to be sent in the request\"\r\n    },\r\n    invalidCloudDiscoveryMetadata: {\r\n        code: \"invalid_cloud_discovery_metadata\",\r\n        desc: \"Invalid cloudDiscoveryMetadata provided. Must be a stringified JSON object containing tenant_discovery_endpoint and metadata fields\"\r\n    },\r\n    invalidAuthorityMetadata: {\r\n        code: \"invalid_authority_metadata\",\r\n        desc: \"Invalid authorityMetadata provided. Must by a stringified JSON object containing authorization_endpoint, token_endpoint, issuer fields.\"\r\n    },\r\n    untrustedAuthority: {\r\n        code: \"untrusted_authority\",\r\n        desc: \"The provided authority is not a trusted authority. Please include this authority in the knownAuthorities config parameter.\"\r\n    },\r\n    invalidAzureCloudInstance: {\r\n        code: \"invalid_azure_cloud_instance\",\r\n        desc: \"Invalid AzureCloudInstance provided. Please refer MSAL JS docs: aks.ms/msaljs/azure_cloud_instance for valid values\"\r\n    },\r\n    missingSshJwk: {\r\n        code: \"missing_ssh_jwk\",\r\n        desc: \"Missing sshJwk in SSH certificate request. A stringified JSON Web Key is required when using the SSH authentication scheme.\"\r\n    },\r\n    missingSshKid: {\r\n        code: \"missing_ssh_kid\",\r\n        desc: \"Missing sshKid in SSH certificate request. A string that uniquely identifies the public SSH key is required when using the SSH authentication scheme.\"\r\n    },\r\n    missingNonceAuthenticationHeader: {\r\n        code: \"missing_nonce_authentication_header\",\r\n        desc: \"Unable to find an authentication header containing server nonce. Either the Authentication-Info or WWW-Authenticate headers must be present in order to obtain a server nonce.\"\r\n    },\r\n    invalidAuthenticationHeader: {\r\n        code: \"invalid_authentication_header\",\r\n        desc: \"Invalid authentication header provided\"\r\n    },\r\n    authorityMismatch: {\r\n        code: \"authority_mismatch\",\r\n        desc: \"Authority mismatch error. Authority provided in login request or PublicClientApplication config does not match the environment of the provided account. Please use a matching account or make an interactive request to login to this authority.\"\r\n    }\r\n};\r\n\r\n/**\r\n * Error thrown when there is an error in configuration of the MSAL.js library.\r\n */\r\nexport class ClientConfigurationError extends ClientAuthError {\r\n\r\n    constructor(errorCode: string, errorMessage?: string) {\r\n        super(errorCode, errorMessage);\r\n        this.name = \"ClientConfigurationError\";\r\n        Object.setPrototypeOf(this, ClientConfigurationError.prototype);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the redirect uri is empty (not set by caller)\r\n     */\r\n    static createRedirectUriEmptyError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.redirectUriNotSet.code,\r\n            ClientConfigurationErrorMessage.redirectUriNotSet.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the post-logout redirect uri is empty (not set by caller)\r\n     */\r\n    static createPostLogoutRedirectUriEmptyError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.postLogoutUriNotSet.code,\r\n            ClientConfigurationErrorMessage.postLogoutUriNotSet.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the claims request could not be successfully parsed\r\n     */\r\n    static createClaimsRequestParsingError(claimsRequestParseError: string): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.claimsRequestParsingError.code,\r\n            `${ClientConfigurationErrorMessage.claimsRequestParsingError.desc} Given value: ${claimsRequestParseError}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown if authority uri is given an insecure protocol.\r\n     * @param urlString\r\n     */\r\n    static createInsecureAuthorityUriError(urlString: string): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.authorityUriInsecure.code,\r\n            `${ClientConfigurationErrorMessage.authorityUriInsecure.desc} Given URI: ${urlString}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown if URL string does not parse into separate segments.\r\n     * @param urlString\r\n     */\r\n    static createUrlParseError(urlParseError: string): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.urlParseError.code,\r\n            `${ClientConfigurationErrorMessage.urlParseError.desc} Given Error: ${urlParseError}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown if URL string is empty or null.\r\n     * @param urlString\r\n     */\r\n    static createUrlEmptyError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.urlEmptyError.code,\r\n            ClientConfigurationErrorMessage.urlEmptyError.desc);\r\n    }\r\n\r\n    /**\r\n     * Error thrown when scopes are empty.\r\n     * @param scopesValue\r\n     */\r\n    static createEmptyScopesArrayError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.emptyScopesError.code,\r\n            `${ClientConfigurationErrorMessage.emptyScopesError.desc}`);\r\n    }\r\n\r\n    /**\r\n     * Error thrown when client id scope is not provided as single scope.\r\n     * @param inputScopes\r\n     */\r\n    static createClientIdSingleScopeError(inputScopes: Array<string>): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.clientIdSingleScopeError.code,\r\n            `${ClientConfigurationErrorMessage.clientIdSingleScopeError.desc} Given Scopes: ${inputScopes}`);\r\n    }\r\n\r\n    /**\r\n     * Error thrown when prompt is not an allowed type.\r\n     * @param promptValue\r\n     */\r\n    static createInvalidPromptError(promptValue: string): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidPrompt.code,\r\n            `${ClientConfigurationErrorMessage.invalidPrompt.desc} Given value: ${promptValue}`);\r\n    }\r\n\r\n    /**\r\n     * Creates error thrown when claims parameter is not a stringified JSON object\r\n     */\r\n    static createInvalidClaimsRequestError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidClaimsRequest.code,\r\n            ClientConfigurationErrorMessage.invalidClaimsRequest.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws error when token request is empty and nothing cached in storage.\r\n     */\r\n    static createEmptyLogoutRequestError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(\r\n            ClientConfigurationErrorMessage.logoutRequestEmptyError.code,\r\n            ClientConfigurationErrorMessage.logoutRequestEmptyError.desc\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Throws error when token request is empty and nothing cached in storage.\r\n     */\r\n    static createEmptyTokenRequestError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(\r\n            ClientConfigurationErrorMessage.tokenRequestEmptyError.code,\r\n            ClientConfigurationErrorMessage.tokenRequestEmptyError.desc\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Throws error when an invalid code_challenge_method is passed by the user\r\n     */\r\n    static createInvalidCodeChallengeMethodError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(\r\n            ClientConfigurationErrorMessage.invalidCodeChallengeMethod.code,\r\n            ClientConfigurationErrorMessage.invalidCodeChallengeMethod.desc\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Throws error when both params: code_challenge and code_challenge_method are not passed together\r\n     */\r\n    static createInvalidCodeChallengeParamsError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(\r\n            ClientConfigurationErrorMessage.invalidCodeChallengeParams.code,\r\n            ClientConfigurationErrorMessage.invalidCodeChallengeParams.desc\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Throws an error when the user passes invalid cloudDiscoveryMetadata\r\n     */\r\n    static createInvalidCloudDiscoveryMetadataError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidCloudDiscoveryMetadata.code,\r\n            ClientConfigurationErrorMessage.invalidCloudDiscoveryMetadata.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws an error when the user passes invalid cloudDiscoveryMetadata\r\n     */\r\n    static createInvalidAuthorityMetadataError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAuthorityMetadata.code,\r\n            ClientConfigurationErrorMessage.invalidAuthorityMetadata.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws error when provided authority is not a member of the trusted host list\r\n     */\r\n    static createUntrustedAuthorityError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.untrustedAuthority.code,\r\n            ClientConfigurationErrorMessage.untrustedAuthority.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws error when the AzureCloudInstance is set to an invalid value\r\n     */\r\n    static createInvalidAzureCloudInstanceError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAzureCloudInstance.code,\r\n            ClientConfigurationErrorMessage.invalidAzureCloudInstance.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws an error when the authentication scheme is set to SSH but the SSH public key is omitted from the request\r\n     */\r\n    static createMissingSshJwkError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.missingSshJwk.code,\r\n            ClientConfigurationErrorMessage.missingSshJwk.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws an error when the authentication scheme is set to SSH but the SSH public key ID is omitted from the request\r\n     */\r\n    static createMissingSshKidError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.missingSshKid.code,\r\n            ClientConfigurationErrorMessage.missingSshKid.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws error when provided headers don't contain a header that a server nonce can be extracted from\r\n     */\r\n    static createMissingNonceAuthenticationHeadersError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.missingNonceAuthenticationHeader.code,\r\n            ClientConfigurationErrorMessage.missingNonceAuthenticationHeader.desc);\r\n    }\r\n\r\n    /**\r\n     * Throws error when a provided header is invalid in any way\r\n     */\r\n    static createInvalidAuthenticationHeaderError(invalidHeaderName: string, details: string): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.invalidAuthenticationHeader.code,\r\n            `${ClientConfigurationErrorMessage.invalidAuthenticationHeader.desc}. Invalid header: ${invalidHeaderName}. Details: ${details}`);\r\n    }\r\n    \r\n    /**\r\n     * Create an error when the authority provided in request does not match authority provided in account or MSAL.js configuration.\r\n     */\r\n    static createAuthorityMismatchError(): ClientConfigurationError {\r\n        return new ClientConfigurationError(ClientConfigurationErrorMessage.authorityMismatch.code, ClientConfigurationErrorMessage.authorityMismatch.desc);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { DecodedAuthToken } from \"../account/DecodedAuthToken\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\n\r\n/**\r\n * @hidden\r\n */\r\nexport class StringUtils {\r\n\r\n    /**\r\n     * decode a JWT\r\n     *\r\n     * @param authToken\r\n     */\r\n    static decodeAuthToken(authToken: string): DecodedAuthToken {\r\n        if (StringUtils.isEmpty(authToken)) {\r\n            throw ClientAuthError.createTokenNullOrEmptyError(authToken);\r\n        }\r\n        const tokenPartsRegex = /^([^\\.\\s]*)\\.([^\\.\\s]+)\\.([^\\.\\s]*)$/;\r\n        const matches = tokenPartsRegex.exec(authToken);\r\n        if (!matches || matches.length < 4) {\r\n            throw ClientAuthError.createTokenParsingError(`Given token is malformed: ${JSON.stringify(authToken)}`);\r\n        }\r\n        const crackedToken: DecodedAuthToken = {\r\n            header: matches[1],\r\n            JWSPayload: matches[2],\r\n            JWSSig: matches[3]\r\n        };\r\n        return crackedToken;\r\n    }\r\n\r\n    /**\r\n     * Check if a string is empty.\r\n     *\r\n     * @param str\r\n     */\r\n    static isEmpty(str?: string): boolean {\r\n        return (typeof str === \"undefined\" || !str || 0 === str.length);\r\n    }\r\n\r\n    /**\r\n     * Check if stringified object is empty\r\n     * @param strObj \r\n     */\r\n    static isEmptyObj(strObj?: string): boolean {\r\n        if (strObj && !StringUtils.isEmpty(strObj)) {\r\n            try {\r\n                const obj = JSON.parse(strObj);\r\n                return Object.keys(obj).length === 0;\r\n            } catch (e) {}\r\n        }\r\n        return true;\r\n    }\r\n\r\n    static startsWith(str: string, search: string): boolean {\r\n        return str.indexOf(search) === 0;\r\n    }\r\n\r\n    static endsWith(str: string, search: string): boolean {\r\n        return (str.length >= search.length) && (str.lastIndexOf(search) === (str.length - search.length));\r\n    }\r\n\r\n    /**\r\n     * Parses string into an object.\r\n     *\r\n     * @param query\r\n     */\r\n    static queryStringToObject<T>(query: string): T {\r\n        const obj: {} = {};\r\n        const params = query.split(\"&\");\r\n        const decode = (s: string) => decodeURIComponent(s.replace(/\\+/g, \" \"));\r\n        params.forEach((pair) => {\r\n            if (pair.trim()) {\r\n                const [key, value] = pair.split(/=(.+)/g, 2); // Split on the first occurence of the '=' character\r\n                if (key && value) {\r\n                    obj[decode(key)] = decode(value);\r\n                }\r\n            }\r\n        });\r\n        return obj as T;\r\n    }\r\n\r\n    /**\r\n     * Trims entries in an array.\r\n     *\r\n     * @param arr\r\n     */\r\n    static trimArrayEntries(arr: Array<string>): Array<string> {\r\n        return arr.map(entry => entry.trim());\r\n    }\r\n\r\n    /**\r\n     * Removes empty strings from array\r\n     * @param arr\r\n     */\r\n    static removeEmptyStringsFromArray(arr: Array<string>): Array<string> {\r\n        return arr.filter(entry => {\r\n            return !StringUtils.isEmpty(entry);\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Attempts to parse a string into JSON\r\n     * @param str\r\n     */\r\n    static jsonParseHelper<T>(str: string): T | null {\r\n        try {\r\n            return JSON.parse(str) as T;\r\n        } catch (e) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Tests if a given string matches a given pattern, with support for wildcards and queries.\r\n     * @param pattern Wildcard pattern to string match. Supports \"*\" for wildcards and \"?\" for queries\r\n     * @param input String to match against\r\n     */\r\n    static matchPattern(pattern: string, input: string): boolean {\r\n        /**\r\n         * Wildcard support: https://stackoverflow.com/a/3117248/4888559\r\n         * Queries: replaces \"?\" in string with escaped \"\\?\" for regex test\r\n         */\r\n        const regex: RegExp = new RegExp(pattern.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\*/g, \"[^ ]*\").replace(/\\?/g, \"\\\\\\?\")); // eslint-disable-line security/detect-non-literal-regexp\r\n\r\n        return regex.test(input);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ClientConfigurationError } from \"../error/ClientConfigurationError\";\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\nimport { Constants, OIDC_SCOPES } from \"../utils/Constants\";\r\n\r\n/**\r\n * The ScopeSet class creates a set of scopes. Scopes are case-insensitive, unique values, so the Set object in JS makes\r\n * the most sense to implement for this class. All scopes are trimmed and converted to lower case strings in intersection and union functions\r\n * to ensure uniqueness of strings.\r\n */\r\nexport class ScopeSet {\r\n    // Scopes as a Set of strings\r\n    private scopes: Set<string>;\r\n\r\n    constructor(inputScopes: Array<string>) {\r\n        // Filter empty string and null/undefined array items\r\n        const scopeArr = inputScopes ? StringUtils.trimArrayEntries([...inputScopes]) : [];\r\n        const filteredInput = scopeArr ? StringUtils.removeEmptyStringsFromArray(scopeArr) : [];\r\n\r\n        // Validate and filter scopes (validate function throws if validation fails)\r\n        this.validateInputScopes(filteredInput);\r\n\r\n        this.scopes = new Set<string>(); // Iterator in constructor not supported by IE11\r\n        filteredInput.forEach(scope => this.scopes.add(scope));\r\n    }\r\n\r\n    /**\r\n     * Factory method to create ScopeSet from space-delimited string\r\n     * @param inputScopeString\r\n     * @param appClientId\r\n     * @param scopesRequired\r\n     */\r\n    static fromString(inputScopeString: string): ScopeSet {\r\n        const scopeString = inputScopeString || Constants.EMPTY_STRING;\r\n        const inputScopes: Array<string> = scopeString.split(\" \");\r\n        return new ScopeSet(inputScopes);\r\n    }\r\n\r\n    /**\r\n     * Creates the set of scopes to search for in cache lookups\r\n     * @param inputScopeString \r\n     * @returns \r\n     */\r\n    static createSearchScopes(inputScopeString: Array<string>): ScopeSet {\r\n        const scopeSet = new ScopeSet(inputScopeString);\r\n        if (!scopeSet.containsOnlyOIDCScopes()) {\r\n            scopeSet.removeOIDCScopes();\r\n        } else {\r\n            scopeSet.removeScope(Constants.OFFLINE_ACCESS_SCOPE);\r\n        }\r\n\r\n        return scopeSet;\r\n    }\r\n\r\n    /**\r\n     * Used to validate the scopes input parameter requested  by the developer.\r\n     * @param {Array<string>} inputScopes - Developer requested permissions. Not all scopes are guaranteed to be included in the access token returned.\r\n     * @param {boolean} scopesRequired - Boolean indicating whether the scopes array is required or not\r\n     */\r\n    private validateInputScopes(inputScopes: Array<string>): void {\r\n        // Check if scopes are required but not given or is an empty array\r\n        if (!inputScopes || inputScopes.length < 1) {\r\n            throw ClientConfigurationError.createEmptyScopesArrayError();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Check if a given scope is present in this set of scopes.\r\n     * @param scope\r\n     */\r\n    containsScope(scope: string): boolean {\r\n        const lowerCaseScopes = this.printScopesLowerCase().split(\" \");\r\n        const lowerCaseScopesSet = new ScopeSet(lowerCaseScopes);\r\n        // compare lowercase scopes\r\n        return !StringUtils.isEmpty(scope) ? lowerCaseScopesSet.scopes.has(scope.toLowerCase()) : false;\r\n    }\r\n\r\n    /**\r\n     * Check if a set of scopes is present in this set of scopes.\r\n     * @param scopeSet\r\n     */\r\n    containsScopeSet(scopeSet: ScopeSet): boolean {\r\n        if (!scopeSet || scopeSet.scopes.size <= 0) {\r\n            return false;\r\n        }\r\n\r\n        return (this.scopes.size >= scopeSet.scopes.size && scopeSet.asArray().every(scope => this.containsScope(scope)));\r\n    }\r\n\r\n    /**\r\n     * Check if set of scopes contains only the defaults\r\n     */\r\n    containsOnlyOIDCScopes(): boolean {\r\n        let defaultScopeCount = 0;\r\n        OIDC_SCOPES.forEach((defaultScope: string) => {\r\n            if (this.containsScope(defaultScope)) {\r\n                defaultScopeCount += 1;\r\n            }\r\n        });\r\n\r\n        return this.scopes.size === defaultScopeCount;\r\n    }\r\n\r\n    /**\r\n     * Appends single scope if passed\r\n     * @param newScope\r\n     */\r\n    appendScope(newScope: string): void {\r\n        if (!StringUtils.isEmpty(newScope)) {\r\n            this.scopes.add(newScope.trim());\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Appends multiple scopes if passed\r\n     * @param newScopes\r\n     */\r\n    appendScopes(newScopes: Array<string>): void {\r\n        try {\r\n            newScopes.forEach(newScope => this.appendScope(newScope));\r\n        } catch (e) {\r\n            throw ClientAuthError.createAppendScopeSetError(e);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Removes element from set of scopes.\r\n     * @param scope\r\n     */\r\n    removeScope(scope: string): void {\r\n        if (StringUtils.isEmpty(scope)) {\r\n            throw ClientAuthError.createRemoveEmptyScopeFromSetError(scope);\r\n        }\r\n        this.scopes.delete(scope.trim());\r\n    }\r\n\r\n    /**\r\n     * Removes default scopes from set of scopes\r\n     * Primarily used to prevent cache misses if the default scopes are not returned from the server\r\n     */\r\n    removeOIDCScopes(): void {\r\n        OIDC_SCOPES.forEach((defaultScope: string) => {\r\n            this.scopes.delete(defaultScope);\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Combines an array of scopes with the current set of scopes.\r\n     * @param otherScopes\r\n     */\r\n    unionScopeSets(otherScopes: ScopeSet): Set<string> {\r\n        if (!otherScopes) {\r\n            throw ClientAuthError.createEmptyInputScopeSetError();\r\n        }\r\n        const unionScopes = new Set<string>(); // Iterator in constructor not supported in IE11\r\n        otherScopes.scopes.forEach(scope => unionScopes.add(scope.toLowerCase()));\r\n        this.scopes.forEach(scope => unionScopes.add(scope.toLowerCase()));\r\n        return unionScopes;\r\n    }\r\n\r\n    /**\r\n     * Check if scopes intersect between this set and another.\r\n     * @param otherScopes\r\n     */\r\n    intersectingScopeSets(otherScopes: ScopeSet): boolean {\r\n        if (!otherScopes) {\r\n            throw ClientAuthError.createEmptyInputScopeSetError();\r\n        }\r\n        \r\n        // Do not allow OIDC scopes to be the only intersecting scopes\r\n        if (!otherScopes.containsOnlyOIDCScopes()) {\r\n            otherScopes.removeOIDCScopes();\r\n        }\r\n        const unionScopes = this.unionScopeSets(otherScopes);\r\n        const sizeOtherScopes = otherScopes.getScopeCount();\r\n        const sizeThisScopes = this.getScopeCount();\r\n        const sizeUnionScopes = unionScopes.size;\r\n        return sizeUnionScopes < (sizeThisScopes + sizeOtherScopes);\r\n    }\r\n\r\n    /**\r\n     * Returns size of set of scopes.\r\n     */\r\n    getScopeCount(): number {\r\n        return this.scopes.size;\r\n    }\r\n\r\n    /**\r\n     * Returns the scopes as an array of string values\r\n     */\r\n    asArray(): Array<string> {\r\n        const array: Array<string> = [];\r\n        this.scopes.forEach(val => array.push(val));\r\n        return array;\r\n    }\r\n\r\n    /**\r\n     * Prints scopes into a space-delimited string\r\n     */\r\n    printScopes(): string {\r\n        if (this.scopes) {\r\n            const scopeArr = this.asArray();\r\n            return scopeArr.join(\" \");\r\n        }\r\n        return Constants.EMPTY_STRING;\r\n    }\r\n\r\n    /**\r\n     * Prints scopes into a space-delimited lower-case string (used for caching)\r\n     */\r\n    printScopesLowerCase(): string {\r\n        return this.printScopes().toLowerCase();\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\nimport { ICrypto } from \"../crypto/ICrypto\";\r\nimport { Separators, Constants } from \"../utils/Constants\";\r\n\r\n/**\r\n * Client info object which consists of two IDs. Need to add more info here.\r\n */\r\nexport type ClientInfo = {\r\n    uid: string,\r\n    utid: string\r\n};\r\n\r\n/**\r\n * Function to build a client info object from server clientInfo string\r\n * @param rawClientInfo\r\n * @param crypto\r\n */\r\nexport function buildClientInfo(rawClientInfo: string, crypto: ICrypto): ClientInfo {\r\n    if (StringUtils.isEmpty(rawClientInfo)) {\r\n        throw ClientAuthError.createClientInfoEmptyError();\r\n    }\r\n\r\n    try {\r\n        const decodedClientInfo: string = crypto.base64Decode(rawClientInfo);\r\n        return JSON.parse(decodedClientInfo) as ClientInfo;\r\n    } catch (e) {\r\n        throw ClientAuthError.createClientInfoDecodingError((e as ClientAuthError).message);\r\n    }\r\n}\r\n\r\n/**\r\n * Function to build a client info object from cached homeAccountId string\r\n * @param homeAccountId \r\n */\r\nexport function buildClientInfoFromHomeAccountId(homeAccountId: string): ClientInfo {\r\n    if (StringUtils.isEmpty(homeAccountId)) {\r\n        throw ClientAuthError.createClientInfoDecodingError(\"Home account ID was empty.\");\r\n    }\r\n    const clientInfoParts: string[] = homeAccountId.split(Separators.CLIENT_INFO_SEPARATOR, 2);\r\n    return {\r\n        uid: clientInfoParts[0],\r\n        utid: clientInfoParts.length < 2 ? Constants.EMPTY_STRING : clientInfoParts[1]\r\n    };\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport {\r\n    Separators,\r\n    CacheAccountType,\r\n    Constants,\r\n} from \"../../utils/Constants\";\r\nimport { Authority } from \"../../authority/Authority\";\r\nimport { ICrypto } from \"../../crypto/ICrypto\";\r\nimport { buildClientInfo } from \"../../account/ClientInfo\";\r\nimport { StringUtils } from \"../../utils/StringUtils\";\r\nimport { AccountInfo } from \"../../account/AccountInfo\";\r\nimport { ClientAuthError } from \"../../error/ClientAuthError\";\r\nimport { AuthorityType } from \"../../authority/AuthorityType\";\r\nimport { Logger } from \"../../logger/Logger\";\r\nimport { TokenClaims } from \"../../account/TokenClaims\";\r\nimport { ProtocolMode } from \"../../authority/ProtocolMode\";\r\n\r\n/**\r\n * Type that defines required and optional parameters for an Account field (based on universal cache schema implemented by all MSALs).\r\n *\r\n * Key : Value Schema\r\n *\r\n * Key: <home_account_id>-<environment>-<realm*>\r\n *\r\n * Value Schema:\r\n * {\r\n *      homeAccountId: home account identifier for the auth scheme,\r\n *      environment: entity that issued the token, represented as a full host\r\n *      realm: Full tenant or organizational identifier that the account belongs to\r\n *      localAccountId: Original tenant-specific accountID, usually used for legacy cases\r\n *      username: primary username that represents the user, usually corresponds to preferred_username in the v2 endpt\r\n *      authorityType: Accounts authority type as a string\r\n *      clientInfo: Full base64 encoded client info received from ESTS\r\n *      name: Full name for the account, including given name and family name\r\n *      lastModificationTime: last time this entity was modified in the cache\r\n *      lastModificationApp:\r\n *      idTokenClaims: Object containing claims parsed from ID token\r\n *      nativeAccountId: Account identifier on the native device\r\n * }\r\n */\r\nexport class AccountEntity {\r\n    homeAccountId: string;\r\n    environment: string;\r\n    realm: string;\r\n    localAccountId: string;\r\n    username: string;\r\n    authorityType: string;\r\n    clientInfo?: string;\r\n    name?: string;\r\n    lastModificationTime?: string;\r\n    lastModificationApp?: string;\r\n    cloudGraphHostName?: string;\r\n    msGraphHost?: string;\r\n    idTokenClaims?: TokenClaims;\r\n    nativeAccountId?: string;\r\n\r\n    /**\r\n     * Generate Account Id key component as per the schema: <home_account_id>-<environment>\r\n     */\r\n    generateAccountId(): string {\r\n        const accountId: Array<string> = [this.homeAccountId, this.environment];\r\n        return accountId.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();\r\n    }\r\n\r\n    /**\r\n     * Generate Account Cache Key as per the schema: <home_account_id>-<environment>-<realm*>\r\n     */\r\n    generateAccountKey(): string {\r\n        return AccountEntity.generateAccountCacheKey({\r\n            homeAccountId: this.homeAccountId,\r\n            environment: this.environment,\r\n            tenantId: this.realm,\r\n            username: this.username,\r\n            localAccountId: this.localAccountId\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Returns the AccountInfo interface for this account.\r\n     */\r\n    getAccountInfo(): AccountInfo {\r\n        return {\r\n            homeAccountId: this.homeAccountId,\r\n            environment: this.environment,\r\n            tenantId: this.realm,\r\n            username: this.username,\r\n            localAccountId: this.localAccountId,\r\n            name: this.name,\r\n            idTokenClaims: this.idTokenClaims,\r\n            nativeAccountId: this.nativeAccountId,\r\n            authorityType: this.authorityType\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Generates account key from interface\r\n     * @param accountInterface\r\n     */\r\n    static generateAccountCacheKey(accountInterface: AccountInfo): string {\r\n        const accountKey = [\r\n            accountInterface.homeAccountId,\r\n            accountInterface.environment || Constants.EMPTY_STRING,\r\n            accountInterface.tenantId || Constants.EMPTY_STRING,\r\n        ];\r\n\r\n        return accountKey.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();\r\n    }\r\n\r\n    /**\r\n     * Build Account cache from account properties.\r\n     * @param accountDetails\r\n     * @param authority\r\n     */\r\n    static createAccount(\r\n        accountDetails: {\r\n            homeAccountId: string,\r\n            idTokenClaims: TokenClaims,\r\n            clientInfo?: string,\r\n            cloudGraphHostName?: string,\r\n            msGraphHost?: string,\r\n            environment?: string,\r\n            nativeAccountId?: string\r\n        },\r\n        authority: Authority\r\n    ): AccountEntity {\r\n        const account: AccountEntity = new AccountEntity();\r\n\r\n        if (authority.authorityType === AuthorityType.Adfs) {\r\n            account.authorityType = CacheAccountType.ADFS_ACCOUNT_TYPE;\r\n        } else if (authority.protocolMode === ProtocolMode.AAD) {\r\n            account.authorityType = CacheAccountType.MSSTS_ACCOUNT_TYPE;\r\n        } else {\r\n            account.authorityType = CacheAccountType.GENERIC_ACCOUNT_TYPE;\r\n        }\r\n\r\n        account.clientInfo = accountDetails.clientInfo;\r\n        account.homeAccountId = accountDetails.homeAccountId;\r\n        account.nativeAccountId = accountDetails.nativeAccountId;\r\n\r\n        const env = accountDetails.environment || (authority && authority.getPreferredCache());\r\n\r\n        if (!env) {\r\n            throw ClientAuthError.createInvalidCacheEnvironmentError();\r\n        }\r\n\r\n        account.environment = env;\r\n        // non AAD scenarios can have empty realm\r\n        account.realm = accountDetails.idTokenClaims.tid || Constants.EMPTY_STRING;\r\n\r\n        account.idTokenClaims = accountDetails.idTokenClaims;\r\n\r\n        // How do you account for MSA CID here?\r\n        account.localAccountId = accountDetails.idTokenClaims.oid ||  accountDetails.idTokenClaims.sub || Constants.EMPTY_STRING;\r\n\r\n        /*\r\n         * In B2C scenarios the emails claim is used instead of preferred_username and it is an array.\r\n         * In most cases it will contain a single email. This field should not be relied upon if a custom \r\n         * policy is configured to return more than 1 email.\r\n         */\r\n        if (account.authorityType === CacheAccountType.MSSTS_ACCOUNT_TYPE) {\r\n            const preferredUsername = accountDetails.idTokenClaims.preferred_username;\r\n            const email = (accountDetails.idTokenClaims.emails) ? accountDetails.idTokenClaims.emails[0] : null;\r\n                \r\n            account.username = preferredUsername || email || \"\";\r\n        } else {\r\n            account.username = accountDetails.idTokenClaims.upn || \"\";\r\n        }\r\n        account.name = accountDetails.idTokenClaims.name;\r\n\r\n        account.cloudGraphHostName = accountDetails.cloudGraphHostName;\r\n        account.msGraphHost = accountDetails.msGraphHost;\r\n\r\n        return account;\r\n    }\r\n\r\n    /**\r\n     * Creates an account object from AccountInfo\r\n     * @param accountInfo\r\n     * @param cloudGraphHostName\r\n     * @param msGraphHost\r\n     * @returns AccountEntity\r\n     */\r\n    static createFromAccountInfo(\r\n        accountInfo: AccountInfo,\r\n        cloudGraphHostName?: string,\r\n        msGraphHost?: string\r\n    ): AccountEntity {\r\n        const account: AccountEntity = new AccountEntity();\r\n\r\n        account.authorityType =\r\n            accountInfo.authorityType || CacheAccountType.GENERIC_ACCOUNT_TYPE;\r\n        account.homeAccountId = accountInfo.homeAccountId;\r\n        account.localAccountId = accountInfo.localAccountId;\r\n        account.nativeAccountId = accountInfo.nativeAccountId;\r\n        \r\n        account.realm = accountInfo.tenantId;\r\n        account.environment = accountInfo.environment;\r\n\r\n        account.username = accountInfo.username;\r\n        account.name = accountInfo.name;\r\n        account.idTokenClaims = accountInfo.idTokenClaims;\r\n\r\n        account.cloudGraphHostName = cloudGraphHostName;\r\n        account.msGraphHost = msGraphHost;\r\n\r\n        return account;\r\n    }\r\n\r\n    /**\r\n     * Generate HomeAccountId from server response\r\n     * @param serverClientInfo\r\n     * @param authType\r\n     */\r\n    static generateHomeAccountId(\r\n        serverClientInfo: string,\r\n        authType: AuthorityType,\r\n        logger: Logger,\r\n        cryptoObj: ICrypto,\r\n        idTokenClaims?: TokenClaims\r\n    ): string {\r\n\r\n        const accountId = idTokenClaims?.sub ? idTokenClaims.sub : Constants.EMPTY_STRING;\r\n\r\n        // since ADFS does not have tid and does not set client_info\r\n        if (authType === AuthorityType.Adfs || authType === AuthorityType.Dsts) {\r\n            return accountId;\r\n        }\r\n\r\n        // for cases where there is clientInfo\r\n        if (serverClientInfo) {\r\n            try {\r\n                const clientInfo = buildClientInfo(serverClientInfo, cryptoObj);\r\n                if (!StringUtils.isEmpty(clientInfo.uid) && !StringUtils.isEmpty(clientInfo.utid)) {\r\n                    return `${clientInfo.uid}${Separators.CLIENT_INFO_SEPARATOR}${clientInfo.utid}`;\r\n                }\r\n            } catch (e) {}\r\n        }\r\n\r\n        // default to \"sub\" claim\r\n        logger.verbose(\"No client info in response\");\r\n        return accountId;\r\n    }\r\n\r\n    /**\r\n     * Validates an entity: checks for all expected params\r\n     * @param entity\r\n     */\r\n    static isAccountEntity(entity: object): boolean {\r\n\r\n        if (!entity) {\r\n            return false;\r\n        }\r\n\r\n        return (\r\n            entity.hasOwnProperty(\"homeAccountId\") &&\r\n            entity.hasOwnProperty(\"environment\") &&\r\n            entity.hasOwnProperty(\"realm\") &&\r\n            entity.hasOwnProperty(\"localAccountId\") &&\r\n            entity.hasOwnProperty(\"username\") &&\r\n            entity.hasOwnProperty(\"authorityType\")\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Helper function to determine whether 2 accountInfo objects represent the same account\r\n     * @param accountA\r\n     * @param accountB\r\n     * @param compareClaims - If set to true idTokenClaims will also be compared to determine account equality\r\n     */\r\n    static accountInfoIsEqual(accountA: AccountInfo | null, accountB: AccountInfo | null, compareClaims?: boolean): boolean {\r\n        if (!accountA || !accountB) {\r\n            return false;\r\n        }\r\n\r\n        let claimsMatch = true; // default to true so as to not fail comparison below if compareClaims: false\r\n        if (compareClaims) {\r\n            const accountAClaims = (accountA.idTokenClaims || {}) as TokenClaims;\r\n            const accountBClaims = (accountB.idTokenClaims || {}) as TokenClaims;\r\n\r\n            // issued at timestamp and nonce are expected to change each time a new id token is acquired\r\n            claimsMatch = (accountAClaims.iat === accountBClaims.iat) &&\r\n            (accountAClaims.nonce === accountBClaims.nonce);\r\n        }\r\n\r\n        return (accountA.homeAccountId === accountB.homeAccountId) &&\r\n            (accountA.localAccountId === accountB.localAccountId) &&\r\n            (accountA.username === accountB.username) &&\r\n            (accountA.tenantId === accountB.tenantId) &&\r\n            (accountA.environment === accountB.environment) &&\r\n            (accountA.nativeAccountId === accountB.nativeAccountId) &&\r\n            claimsMatch;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nexport type CcsCredential = {\r\n    credential: string,\r\n    type: CcsCredentialType\r\n};\r\n\r\nexport enum CcsCredentialType {\r\n    HOME_ACCOUNT_ID = \"home_account_id\",\r\n    UPN = \"UPN\"\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { TokenClaims } from \"./TokenClaims\";\r\nimport { DecodedAuthToken } from \"./DecodedAuthToken\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\nimport { ICrypto } from \"../crypto/ICrypto\";\r\n\r\n/**\r\n * JWT Token representation class. Parses token string and generates claims object.\r\n */\r\nexport class AuthToken {\r\n\r\n    // Raw Token string\r\n    rawToken: string;\r\n    // Claims inside token\r\n    claims: TokenClaims;\r\n    constructor(rawToken: string, crypto: ICrypto) {\r\n        if (StringUtils.isEmpty(rawToken)) {\r\n            throw ClientAuthError.createTokenNullOrEmptyError(rawToken);\r\n        }\r\n\r\n        this.rawToken = rawToken;\r\n        this.claims = AuthToken.extractTokenClaims(rawToken, crypto);\r\n    }\r\n\r\n    /**\r\n     * Extract token by decoding the rawToken\r\n     *\r\n     * @param encodedToken\r\n     */\r\n    static extractTokenClaims(encodedToken: string, crypto: ICrypto): TokenClaims {\r\n\r\n        const decodedToken: DecodedAuthToken = StringUtils.decodeAuthToken(encodedToken);\r\n\r\n        // token will be decoded to get the username\r\n        try {\r\n            const base64TokenPayload = decodedToken.JWSPayload;\r\n\r\n            // base64Decode() should throw an error if there is an issue\r\n            const base64Decoded = crypto.base64Decode(base64TokenPayload);\r\n            return JSON.parse(base64Decoded) as TokenClaims;\r\n        } catch (err) {\r\n            throw ClientAuthError.createTokenParsingError(err);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Determine if the token's max_age has transpired\r\n     */\r\n    static checkMaxAge(authTime: number, maxAge: number): void {\r\n        /*\r\n         * per https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest\r\n         * To force an immediate re-authentication: If an app requires that a user re-authenticate prior to access,\r\n         * provide a value of 0 for the max_age parameter and the AS will force a fresh login.\r\n         */\r\n        const fiveMinuteSkew = 300000; // five minutes in milliseconds\r\n        if ((maxAge === 0) || ((Date.now() - fiveMinuteSkew) > (authTime + maxAge))) {\r\n            throw ClientAuthError.createMaxAgeTranspiredError();\r\n        }\r\n    }\r\n}\r\n","/* eslint-disable header/header */\nexport const name = \"@azure/msal-common\";\nexport const version = \"13.3.3\";\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AccountFilter, CredentialFilter, ValidCredentialType, AppMetadataFilter, AppMetadataCache, TokenKeys } from \"./utils/CacheTypes\";\r\nimport { CacheRecord } from \"./entities/CacheRecord\";\r\nimport { CredentialType, APP_METADATA, THE_FAMILY_ID, AUTHORITY_METADATA_CONSTANTS, AuthenticationScheme, Separators } from \"../utils/Constants\";\r\nimport { CredentialEntity } from \"./entities/CredentialEntity\";\r\nimport { ScopeSet } from \"../request/ScopeSet\";\r\nimport { AccountEntity } from \"./entities/AccountEntity\";\r\nimport { AccessTokenEntity } from \"./entities/AccessTokenEntity\";\r\nimport { IdTokenEntity } from \"./entities/IdTokenEntity\";\r\nimport { RefreshTokenEntity } from \"./entities/RefreshTokenEntity\";\r\nimport { AuthError } from \"../error/AuthError\";\r\nimport { ICacheManager } from \"./interface/ICacheManager\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\nimport { AccountInfo } from \"../account/AccountInfo\";\r\nimport { AppMetadataEntity } from \"./entities/AppMetadataEntity\";\r\nimport { ServerTelemetryEntity } from \"./entities/ServerTelemetryEntity\";\r\nimport { ThrottlingEntity } from \"./entities/ThrottlingEntity\";\r\nimport { AuthToken } from \"../account/AuthToken\";\r\nimport { ICrypto } from \"../crypto/ICrypto\";\r\nimport { AuthorityMetadataEntity } from \"./entities/AuthorityMetadataEntity\";\r\nimport { BaseAuthRequest } from \"../request/BaseAuthRequest\";\r\nimport { Logger } from \"../logger/Logger\";\r\nimport { name, version } from \"../packageMetadata\";\r\n\r\n/**\r\n * Interface class which implement cache storage functions used by MSAL to perform validity checks, and store tokens.\r\n */\r\nexport abstract class CacheManager implements ICacheManager {\r\n    protected clientId: string;\r\n    protected cryptoImpl: ICrypto;\r\n    // Instance of logger for functions defined in the msal-common layer\r\n    private commonLogger: Logger;\r\n\r\n    constructor(clientId: string, cryptoImpl: ICrypto, logger: Logger) {\r\n        this.clientId = clientId;\r\n        this.cryptoImpl = cryptoImpl;\r\n        this.commonLogger = logger.clone(name, version);\r\n    }\r\n\r\n    /**\r\n     * fetch the account entity from the platform cache\r\n     *  @param accountKey\r\n     */\r\n    abstract getAccount(accountKey: string): AccountEntity | null;\r\n\r\n    /**\r\n     * set account entity in the platform cache\r\n     * @param account\r\n     */\r\n    abstract setAccount(account: AccountEntity): void;\r\n\r\n    /**\r\n     * fetch the idToken entity from the platform cache\r\n     * @param idTokenKey\r\n     */\r\n    abstract getIdTokenCredential(idTokenKey: string): IdTokenEntity | null;\r\n\r\n    /**\r\n     * set idToken entity to the platform cache\r\n     * @param idToken\r\n     */\r\n    abstract setIdTokenCredential(idToken: IdTokenEntity): void;\r\n\r\n    /**\r\n     * fetch the idToken entity from the platform cache\r\n     * @param accessTokenKey\r\n     */\r\n    abstract getAccessTokenCredential(accessTokenKey: string): AccessTokenEntity | null;\r\n\r\n    /**\r\n     * set idToken entity to the platform cache\r\n     * @param accessToken\r\n     */\r\n    abstract setAccessTokenCredential(accessToken: AccessTokenEntity): void;\r\n\r\n    /**\r\n     * fetch the idToken entity from the platform cache\r\n     * @param refreshTokenKey\r\n     */\r\n    abstract getRefreshTokenCredential(refreshTokenKey: string): RefreshTokenEntity | null;\r\n\r\n    /**\r\n     * set idToken entity to the platform cache\r\n     * @param refreshToken\r\n     */\r\n    abstract setRefreshTokenCredential(refreshToken: RefreshTokenEntity): void;\r\n\r\n    /**\r\n     * fetch appMetadata entity from the platform cache\r\n     * @param appMetadataKey\r\n     */\r\n    abstract getAppMetadata(appMetadataKey: string): AppMetadataEntity | null;\r\n\r\n    /**\r\n     * set appMetadata entity to the platform cache\r\n     * @param appMetadata\r\n     */\r\n    abstract setAppMetadata(appMetadata: AppMetadataEntity): void;\r\n\r\n    /**\r\n     * fetch server telemetry entity from the platform cache\r\n     * @param serverTelemetryKey\r\n     */\r\n    abstract getServerTelemetry(serverTelemetryKey: string): ServerTelemetryEntity | null;\r\n\r\n    /**\r\n     * set server telemetry entity to the platform cache\r\n     * @param serverTelemetryKey\r\n     * @param serverTelemetry\r\n     */\r\n    abstract setServerTelemetry(serverTelemetryKey: string, serverTelemetry: ServerTelemetryEntity): void;\r\n\r\n    /**\r\n     * fetch cloud discovery metadata entity from the platform cache\r\n     * @param key\r\n     */\r\n    abstract getAuthorityMetadata(key: string): AuthorityMetadataEntity | null;\r\n\r\n    /**\r\n     *\r\n     */\r\n    abstract getAuthorityMetadataKeys(): Array<string>;\r\n\r\n    /**\r\n     * set cloud discovery metadata entity to the platform cache\r\n     * @param key\r\n     * @param value\r\n     */\r\n    abstract setAuthorityMetadata(key: string, value: AuthorityMetadataEntity): void;\r\n\r\n    /**\r\n     * fetch throttling entity from the platform cache\r\n     * @param throttlingCacheKey\r\n     */\r\n    abstract getThrottlingCache(throttlingCacheKey: string): ThrottlingEntity | null;\r\n\r\n    /**\r\n     * set throttling entity to the platform cache\r\n     * @param throttlingCacheKey\r\n     * @param throttlingCache\r\n     */\r\n    abstract setThrottlingCache(throttlingCacheKey: string, throttlingCache: ThrottlingEntity): void;\r\n\r\n    /**\r\n     * Function to remove an item from cache given its key.\r\n     * @param key\r\n     */\r\n    abstract removeItem(key: string): void;\r\n\r\n    /**\r\n     * Function which returns boolean whether cache contains a specific key.\r\n     * @param key\r\n     */\r\n    abstract containsKey(key: string, type?: string): boolean;\r\n\r\n    /**\r\n     * Function which retrieves all current keys from the cache.\r\n     */\r\n    abstract getKeys(): string[];\r\n\r\n    /**\r\n     * Function which retrieves all account keys from the cache\r\n     */\r\n    abstract getAccountKeys(): string[];\r\n\r\n    /**\r\n     * Function which retrieves all token keys from the cache\r\n     */\r\n    abstract getTokenKeys(): TokenKeys;\r\n\r\n    /**\r\n     * Function which clears cache.\r\n     */\r\n    abstract clear(): Promise<void>;\r\n\r\n    /**\r\n     * Function which updates an outdated credential cache key\r\n     */\r\n    abstract updateCredentialCacheKey(currentCacheKey: string, credential: ValidCredentialType): string;\r\n\r\n    /**\r\n     * Returns all accounts in cache\r\n     */\r\n    getAllAccounts(): AccountInfo[] {\r\n        const allAccountKeys = this.getAccountKeys();\r\n        if (allAccountKeys.length < 1) {\r\n            return [];\r\n        }\r\n\r\n        const accountEntities: AccountEntity[] = allAccountKeys.reduce((accounts: AccountEntity[], key: string) => {\r\n            const entity: AccountEntity | null = this.getAccount(key);\r\n\r\n            if (!entity) {\r\n                return accounts;\r\n            }\r\n            accounts.push(entity);\r\n            return accounts;\r\n        }, []);\r\n\r\n        if (accountEntities.length < 1) {\r\n            return [];\r\n        } else {\r\n            const allAccounts = accountEntities.map<AccountInfo>((accountEntity) => {\r\n                return this.getAccountInfoFromEntity(accountEntity);\r\n            });\r\n            return allAccounts;\r\n        }\r\n    }\r\n\r\n    /** \r\n     * Gets accountInfo object based on provided filters\r\n     */\r\n    getAccountInfoFilteredBy(accountFilter: AccountFilter): AccountInfo | null{\r\n        const allAccounts = this.getAccountsFilteredBy(accountFilter);\r\n        if (allAccounts.length > 0) {\r\n            return this.getAccountInfoFromEntity(allAccounts[0]);\r\n        } else {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    private getAccountInfoFromEntity(accountEntity: AccountEntity): AccountInfo {\r\n        const accountInfo = accountEntity.getAccountInfo();\r\n        const idToken = this.getIdToken(accountInfo);\r\n        if (idToken) {\r\n            accountInfo.idToken = idToken.secret;\r\n            accountInfo.idTokenClaims = new AuthToken(idToken.secret, this.cryptoImpl).claims;\r\n        }\r\n        return accountInfo;\r\n    }\r\n\r\n    /**\r\n     * saves a cache record\r\n     * @param cacheRecord\r\n     */\r\n    async saveCacheRecord(cacheRecord: CacheRecord): Promise<void> {\r\n        if (!cacheRecord) {\r\n            throw ClientAuthError.createNullOrUndefinedCacheRecord();\r\n        }\r\n\r\n        if (!!cacheRecord.account) {\r\n            this.setAccount(cacheRecord.account);\r\n        }\r\n\r\n        if (!!cacheRecord.idToken) {\r\n            this.setIdTokenCredential(cacheRecord.idToken);\r\n        }\r\n\r\n        if (!!cacheRecord.accessToken) {\r\n            await this.saveAccessToken(cacheRecord.accessToken);\r\n        }\r\n\r\n        if (!!cacheRecord.refreshToken) {\r\n            this.setRefreshTokenCredential(cacheRecord.refreshToken);\r\n        }\r\n\r\n        if (!!cacheRecord.appMetadata) {\r\n            this.setAppMetadata(cacheRecord.appMetadata);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * saves access token credential\r\n     * @param credential\r\n     */\r\n    private async saveAccessToken(credential: AccessTokenEntity): Promise<void> {\r\n        const accessTokenFilter: CredentialFilter = {\r\n            clientId: credential.clientId,\r\n            credentialType: credential.credentialType,\r\n            environment: credential.environment,\r\n            homeAccountId: credential.homeAccountId,\r\n            realm: credential.realm,\r\n            tokenType: credential.tokenType,\r\n            requestedClaimsHash: credential.requestedClaimsHash\r\n        };\r\n\r\n        const tokenKeys = this.getTokenKeys();\r\n        const currentScopes = ScopeSet.fromString(credential.target);\r\n\r\n        const removedAccessTokens: Array<Promise<void>> = [];\r\n        tokenKeys.accessToken.forEach((key) => {\r\n            if(!this.accessTokenKeyMatchesFilter(key, accessTokenFilter, false)) {\r\n                return;\r\n            }\r\n            \r\n            const tokenEntity = this.getAccessTokenCredential(key);\r\n\r\n            if (tokenEntity && this.credentialMatchesFilter(tokenEntity, accessTokenFilter)) {\r\n                const tokenScopeSet = ScopeSet.fromString(tokenEntity.target);\r\n                if (tokenScopeSet.intersectingScopeSets(currentScopes)) {\r\n                    removedAccessTokens.push(this.removeAccessToken(key));\r\n                }\r\n            }\r\n        });\r\n        await Promise.all(removedAccessTokens);\r\n        this.setAccessTokenCredential(credential);\r\n    }\r\n\r\n    /**\r\n     * retrieve accounts matching all provided filters; if no filter is set, get all accounts\r\n     * not checking for casing as keys are all generated in lower case, remember to convert to lower case if object properties are compared\r\n     * @param homeAccountId\r\n     * @param environment\r\n     * @param realm\r\n     */\r\n    getAccountsFilteredBy(accountFilter: AccountFilter): AccountEntity[] {\r\n        const allAccountKeys = this.getAccountKeys();\r\n        const matchingAccounts: AccountEntity[] = [];\r\n\r\n        allAccountKeys.forEach((cacheKey) => {\r\n            if (!this.isAccountKey(cacheKey, accountFilter.homeAccountId, accountFilter.realm)) {\r\n                // Don't parse value if the key doesn't match the account filters\r\n                return;\r\n            }\r\n\r\n            const entity: AccountEntity | null = this.getAccount(cacheKey);\r\n\r\n            if (!entity) {\r\n                return;\r\n            }\r\n\r\n            if (!!accountFilter.homeAccountId && !this.matchHomeAccountId(entity, accountFilter.homeAccountId)) {\r\n                return;\r\n            }\r\n\r\n            if (!!accountFilter.localAccountId && !this.matchLocalAccountId(entity, accountFilter.localAccountId)) {\r\n                return;\r\n            }\r\n\r\n            if (!!accountFilter.username && !this.matchUsername(entity, accountFilter.username)) {\r\n                return;\r\n            }\r\n\r\n            if (!!accountFilter.environment && !this.matchEnvironment(entity, accountFilter.environment)) {\r\n                return;\r\n            }\r\n\r\n            if (!!accountFilter.realm && !this.matchRealm(entity, accountFilter.realm)) {\r\n                return;\r\n            }\r\n\r\n            if (!!accountFilter.nativeAccountId && !this.matchNativeAccountId(entity, accountFilter.nativeAccountId)) {\r\n                return;\r\n            }\r\n\r\n            matchingAccounts.push(entity);\r\n        });\r\n\r\n        return matchingAccounts;\r\n    }\r\n\r\n    /**\r\n     * Returns true if the given key matches our account key schema. Also matches homeAccountId and/or tenantId if provided\r\n     * @param key \r\n     * @param homeAccountId \r\n     * @param tenantId \r\n     * @returns \r\n     */\r\n    isAccountKey(key: string, homeAccountId?: string, tenantId?: string): boolean {\r\n        if (key.split(Separators.CACHE_KEY_SEPARATOR).length < 3) {\r\n            // Account cache keys contain 3 items separated by '-' (each item may also contain '-')\r\n            return false;\r\n        }\r\n\r\n        if (homeAccountId && !key.toLowerCase().includes(homeAccountId.toLowerCase())) {\r\n            return false;\r\n        }\r\n\r\n        if (tenantId && !key.toLowerCase().includes(tenantId.toLowerCase())) {\r\n            return false;\r\n        }\r\n\r\n        // Do not check environment as aliasing can cause false negatives\r\n\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * Returns true if the given key matches our credential key schema.\r\n     * @param key \r\n     */\r\n    isCredentialKey(key: string): boolean {\r\n        if (key.split(Separators.CACHE_KEY_SEPARATOR).length < 6) {\r\n            // Credential cache keys contain 6 items separated by '-' (each item may also contain '-')\r\n            return false;\r\n        }\r\n\r\n        const lowerCaseKey = key.toLowerCase();\r\n        // Credential keys must indicate what credential type they represent\r\n        if (lowerCaseKey.indexOf(CredentialType.ID_TOKEN.toLowerCase()) === -1 &&\r\n            lowerCaseKey.indexOf(CredentialType.ACCESS_TOKEN.toLowerCase()) === -1 &&\r\n            lowerCaseKey.indexOf(CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase()) === -1 &&\r\n            lowerCaseKey.indexOf(CredentialType.REFRESH_TOKEN.toLowerCase()) === -1\r\n        ) {\r\n            return false;\r\n        }\r\n\r\n        if (lowerCaseKey.indexOf(CredentialType.REFRESH_TOKEN.toLowerCase()) > -1) {\r\n            // Refresh tokens must contain the client id or family id\r\n            const clientIdValidation = `${CredentialType.REFRESH_TOKEN}${Separators.CACHE_KEY_SEPARATOR}${this.clientId}${Separators.CACHE_KEY_SEPARATOR}`;\r\n            const familyIdValidation = `${CredentialType.REFRESH_TOKEN}${Separators.CACHE_KEY_SEPARATOR}${THE_FAMILY_ID}${Separators.CACHE_KEY_SEPARATOR}`;\r\n            if (lowerCaseKey.indexOf(clientIdValidation.toLowerCase()) === -1 && lowerCaseKey.indexOf(familyIdValidation.toLowerCase()) === -1) {\r\n                return false;\r\n            }\r\n        } else if (lowerCaseKey.indexOf(this.clientId.toLowerCase()) === -1) {\r\n            // Tokens must contain the clientId\r\n            return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * Returns whether or not the given credential entity matches the filter\r\n     * @param entity \r\n     * @param filter \r\n     * @returns \r\n     */\r\n    credentialMatchesFilter(entity: ValidCredentialType, filter: CredentialFilter): boolean {\r\n        if (!!filter.clientId && !this.matchClientId(entity, filter.clientId)) {\r\n            return false;\r\n        }\r\n\r\n        if (!!filter.userAssertionHash && !this.matchUserAssertionHash(entity, filter.userAssertionHash)) {\r\n            return false;\r\n        }\r\n\r\n        /*\r\n         * homeAccountId can be undefined, and we want to filter out cached items that have a homeAccountId of \"\"\r\n         * because we don't want a client_credential request to return a cached token that has a homeAccountId\r\n         */\r\n        if ((typeof filter.homeAccountId === \"string\") && !this.matchHomeAccountId(entity, filter.homeAccountId)) {\r\n            return false;\r\n        }\r\n\r\n        if (!!filter.environment && !this.matchEnvironment(entity, filter.environment)) {\r\n            return false;\r\n        }\r\n\r\n        if (!!filter.realm && !this.matchRealm(entity, filter.realm)) {\r\n            return false;\r\n        }\r\n\r\n        if (!!filter.credentialType && !this.matchCredentialType(entity, filter.credentialType)) {\r\n            return false;\r\n        }\r\n\r\n        if (!!filter.familyId && !this.matchFamilyId(entity, filter.familyId)) {\r\n            return false;\r\n        }\r\n\r\n        /*\r\n         * idTokens do not have \"target\", target specific refreshTokens do exist for some types of authentication\r\n         * Resource specific refresh tokens case will be added when the support is deemed necessary\r\n         */\r\n        if (!!filter.target && !this.matchTarget(entity, filter.target)) {\r\n            return false;\r\n        }\r\n\r\n        // If request OR cached entity has requested Claims Hash, check if they match\r\n        if (filter.requestedClaimsHash || entity.requestedClaimsHash) {\r\n            // Don't match if either is undefined or they are different\r\n            if (entity.requestedClaimsHash !== filter.requestedClaimsHash) {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        // Access Token with Auth Scheme specific matching\r\n        if (entity.credentialType === CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME) {\r\n            if(!!filter.tokenType && !this.matchTokenType(entity, filter.tokenType)) {\r\n                return false;\r\n            }\r\n\r\n            // KeyId (sshKid) in request must match cached SSH certificate keyId because SSH cert is bound to a specific key\r\n            if (filter.tokenType === AuthenticationScheme.SSH) {\r\n                if(filter.keyId && !this.matchKeyId(entity, filter.keyId)) {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * retrieve appMetadata matching all provided filters; if no filter is set, get all appMetadata\r\n     * @param filter\r\n     */\r\n    getAppMetadataFilteredBy(filter: AppMetadataFilter): AppMetadataCache {\r\n        return this.getAppMetadataFilteredByInternal(\r\n            filter.environment,\r\n            filter.clientId,\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Support function to help match appMetadata\r\n     * @param environment\r\n     * @param clientId\r\n     */\r\n    private getAppMetadataFilteredByInternal(\r\n        environment?: string,\r\n        clientId?: string\r\n    ): AppMetadataCache {\r\n\r\n        const allCacheKeys = this.getKeys();\r\n        const matchingAppMetadata: AppMetadataCache = {};\r\n\r\n        allCacheKeys.forEach((cacheKey) => {\r\n            // don't parse any non-appMetadata type cache entities\r\n            if (!this.isAppMetadata(cacheKey)) {\r\n                return;\r\n            }\r\n\r\n            // Attempt retrieval\r\n            const entity = this.getAppMetadata(cacheKey);\r\n\r\n            if (!entity) {\r\n                return;\r\n            }\r\n\r\n            if (!!environment && !this.matchEnvironment(entity, environment)) {\r\n                return;\r\n            }\r\n\r\n            if (!!clientId && !this.matchClientId(entity, clientId)) {\r\n                return;\r\n            }\r\n\r\n            matchingAppMetadata[cacheKey] = entity;\r\n\r\n        });\r\n\r\n        return matchingAppMetadata;\r\n    }\r\n\r\n    /**\r\n     * retrieve authorityMetadata that contains a matching alias\r\n     * @param filter\r\n     */\r\n    getAuthorityMetadataByAlias(host: string): AuthorityMetadataEntity | null {\r\n        const allCacheKeys = this.getAuthorityMetadataKeys();\r\n        let matchedEntity = null;\r\n\r\n        allCacheKeys.forEach((cacheKey) => {\r\n            // don't parse any non-authorityMetadata type cache entities\r\n            if (!this.isAuthorityMetadata(cacheKey) || cacheKey.indexOf(this.clientId) === -1) {\r\n                return;\r\n            }\r\n\r\n            // Attempt retrieval\r\n            const entity = this.getAuthorityMetadata(cacheKey);\r\n\r\n            if (!entity) {\r\n                return;\r\n            }\r\n\r\n            if (entity.aliases.indexOf(host) === -1) {\r\n                return;\r\n            }\r\n\r\n            matchedEntity = entity;\r\n\r\n        });\r\n\r\n        return matchedEntity;\r\n    }\r\n\r\n    /**\r\n     * Removes all accounts and related tokens from cache.\r\n     */\r\n    async removeAllAccounts(): Promise<void> {\r\n        const allAccountKeys = this.getAccountKeys();\r\n        const removedAccounts: Array<Promise<void>> = [];\r\n\r\n        allAccountKeys.forEach((cacheKey) => {\r\n            removedAccounts.push(this.removeAccount(cacheKey));\r\n        });\r\n\r\n        await Promise.all(removedAccounts);\r\n    }\r\n\r\n    /**\r\n     * Removes the account and related tokens for a given account key\r\n     * @param account\r\n     */\r\n    async removeAccount(accountKey: string): Promise<void> {\r\n        const account = this.getAccount(accountKey);\r\n        if (!account) {\r\n            throw ClientAuthError.createNoAccountFoundError();\r\n        }\r\n        await this.removeAccountContext(account);\r\n        this.removeItem(accountKey);\r\n    }\r\n\r\n    /**\r\n     * Removes credentials associated with the provided account\r\n     * @param account\r\n     */\r\n    async removeAccountContext(account: AccountEntity): Promise<void> {\r\n        const allTokenKeys = this.getTokenKeys();\r\n        const accountId = account.generateAccountId();\r\n        const removedCredentials: Array<Promise<void>> = [];\r\n\r\n        allTokenKeys.idToken.forEach((key) => {\r\n            if (key.indexOf(accountId) === 0) {\r\n                this.removeIdToken(key);\r\n            }\r\n        });\r\n\r\n        allTokenKeys.accessToken.forEach((key) => {\r\n            if (key.indexOf(accountId) === 0) {\r\n                removedCredentials.push(this.removeAccessToken(key));\r\n            }\r\n        });\r\n\r\n        allTokenKeys.refreshToken.forEach((key) => {\r\n            if (key.indexOf(accountId) === 0) {\r\n                this.removeRefreshToken(key);\r\n            }\r\n        });\r\n\r\n        await Promise.all(removedCredentials);\r\n    }\r\n\r\n    /**\r\n     * returns a boolean if the given credential is removed\r\n     * @param credential\r\n     */\r\n    async removeAccessToken(key: string): Promise<void> {\r\n        const credential = this.getAccessTokenCredential(key);\r\n        if (!credential) {\r\n            return;\r\n        }\r\n\r\n        // Remove Token Binding Key from key store for PoP Tokens Credentials\r\n        if (credential.credentialType.toLowerCase() === CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME.toLowerCase()) {\r\n            if(credential.tokenType === AuthenticationScheme.POP) {\r\n                const accessTokenWithAuthSchemeEntity = credential as AccessTokenEntity;\r\n                const kid = accessTokenWithAuthSchemeEntity.keyId;\r\n\r\n                if (kid) {\r\n                    try {\r\n                        await this.cryptoImpl.removeTokenBindingKey(kid);\r\n                    } catch (error) {\r\n                        throw ClientAuthError.createBindingKeyNotRemovedError();\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return this.removeItem(key);\r\n    }\r\n\r\n    /**\r\n     * Removes all app metadata objects from cache.\r\n     */\r\n    removeAppMetadata(): boolean {\r\n        const allCacheKeys = this.getKeys();\r\n        allCacheKeys.forEach((cacheKey) => {\r\n            if (this.isAppMetadata(cacheKey)) {\r\n                this.removeItem(cacheKey);\r\n            }\r\n        });\r\n\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * Retrieve the cached credentials into a cacherecord\r\n     * @param account\r\n     * @param clientId\r\n     * @param scopes\r\n     * @param environment\r\n     * @param authScheme\r\n     */\r\n    readCacheRecord(account: AccountInfo, request: BaseAuthRequest, environment: string): CacheRecord {\r\n        const tokenKeys = this.getTokenKeys();\r\n        const cachedAccount = this.readAccountFromCache(account);\r\n        const cachedIdToken = this.getIdToken(account, tokenKeys);\r\n        const cachedAccessToken = this.getAccessToken(account, request, tokenKeys);\r\n        const cachedRefreshToken = this.getRefreshToken(account, false, tokenKeys);\r\n        const cachedAppMetadata = this.readAppMetadataFromCache(environment);\r\n\r\n        if (cachedAccount && cachedIdToken) {\r\n            cachedAccount.idTokenClaims = new AuthToken(cachedIdToken.secret, this.cryptoImpl).claims;\r\n        }\r\n\r\n        return {\r\n            account: cachedAccount,\r\n            idToken: cachedIdToken,\r\n            accessToken: cachedAccessToken,\r\n            refreshToken: cachedRefreshToken,\r\n            appMetadata: cachedAppMetadata,\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Retrieve AccountEntity from cache\r\n     * @param account\r\n     */\r\n    readAccountFromCache(account: AccountInfo): AccountEntity | null {\r\n        const accountKey: string = AccountEntity.generateAccountCacheKey(account);\r\n        return this.getAccount(accountKey);\r\n    }\r\n\r\n    /**\r\n     * Retrieve IdTokenEntity from cache\r\n     * @param clientId\r\n     * @param account\r\n     * @param inputRealm\r\n     */\r\n    getIdToken(account: AccountInfo, tokenKeys?: TokenKeys): IdTokenEntity | null {\r\n        this.commonLogger.trace(\"CacheManager - getIdToken called\");\r\n        const idTokenFilter: CredentialFilter = {\r\n            homeAccountId: account.homeAccountId,\r\n            environment: account.environment,\r\n            credentialType: CredentialType.ID_TOKEN,\r\n            clientId: this.clientId,\r\n            realm: account.tenantId,\r\n        };\r\n\r\n        const idTokens: IdTokenEntity[] = this.getIdTokensByFilter(idTokenFilter, tokenKeys);\r\n        const numIdTokens = idTokens.length;\r\n\r\n        if (numIdTokens < 1) {\r\n            this.commonLogger.info(\"CacheManager:getIdToken - No token found\");\r\n            return null;\r\n        } else if (numIdTokens > 1) {\r\n            this.commonLogger.info(\r\n                \"CacheManager:getIdToken - Multiple id tokens found, clearing them\"\r\n            );\r\n            idTokens.forEach((idToken) => {\r\n                this.removeIdToken(idToken.generateCredentialKey());\r\n            });\r\n            return null;\r\n        }\r\n\r\n        this.commonLogger.info(\"CacheManager:getIdToken - Returning id token\");\r\n        return idTokens[0];\r\n    }\r\n\r\n    /**\r\n     * Gets all idTokens matching the given filter\r\n     * @param filter \r\n     * @returns \r\n     */\r\n    getIdTokensByFilter(filter: CredentialFilter, tokenKeys?: TokenKeys): IdTokenEntity[] {\r\n        const idTokenKeys = tokenKeys && tokenKeys.idToken || this.getTokenKeys().idToken;\r\n\r\n        const idTokens: IdTokenEntity[] = [];\r\n        idTokenKeys.forEach((key) => {\r\n            if (!this.idTokenKeyMatchesFilter(key, {clientId: this.clientId, ...filter})) {\r\n                return;\r\n            }\r\n\r\n            const idToken = this.getIdTokenCredential(key);\r\n            if (idToken && this.credentialMatchesFilter(idToken, filter)) {\r\n                idTokens.push(idToken);\r\n            }\r\n        });\r\n\r\n        return idTokens;\r\n    }\r\n\r\n    /**\r\n     * Validate the cache key against filter before retrieving and parsing cache value\r\n     * @param key \r\n     * @param filter\r\n     * @returns \r\n     */\r\n    idTokenKeyMatchesFilter(inputKey: string, filter: CredentialFilter): boolean {\r\n        const key = inputKey.toLowerCase();\r\n        if (filter.clientId && key.indexOf(filter.clientId.toLowerCase()) === -1) {\r\n            return false;\r\n        }\r\n\r\n        if (filter.homeAccountId && key.indexOf(filter.homeAccountId.toLowerCase()) === -1) {\r\n            return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * Removes idToken from the cache\r\n     * @param key \r\n     */\r\n    removeIdToken(key: string): void {\r\n        this.removeItem(key);\r\n    }\r\n\r\n    /**\r\n     * Removes refresh token from the cache\r\n     * @param key \r\n     */\r\n    removeRefreshToken(key: string): void {\r\n        this.removeItem(key);\r\n    }\r\n\r\n    /**\r\n     * Retrieve AccessTokenEntity from cache\r\n     * @param clientId\r\n     * @param account\r\n     * @param scopes\r\n     * @param authScheme\r\n     */\r\n    getAccessToken(account: AccountInfo, request: BaseAuthRequest, tokenKeys?: TokenKeys): AccessTokenEntity | null {\r\n        this.commonLogger.trace(\"CacheManager - getAccessToken called\");\r\n        const scopes =  ScopeSet.createSearchScopes(request.scopes);\r\n        const authScheme = request.authenticationScheme || AuthenticationScheme.BEARER;\r\n        /*\r\n         * Distinguish between Bearer and PoP/SSH token cache types\r\n         * Cast to lowercase to handle \"bearer\" from ADFS\r\n         */\r\n        const credentialType = (authScheme && authScheme.toLowerCase() !== AuthenticationScheme.BEARER.toLowerCase()) ? CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME : CredentialType.ACCESS_TOKEN;\r\n\r\n        const accessTokenFilter: CredentialFilter = {\r\n            homeAccountId: account.homeAccountId,\r\n            environment: account.environment,\r\n            credentialType: credentialType,\r\n            clientId: this.clientId,\r\n            realm: account.tenantId,\r\n            target: scopes,\r\n            tokenType: authScheme,\r\n            keyId: request.sshKid,\r\n            requestedClaimsHash: request.requestedClaimsHash,\r\n        };\r\n\r\n        const accessTokenKeys = tokenKeys && tokenKeys.accessToken || this.getTokenKeys().accessToken;\r\n        const accessTokens: AccessTokenEntity[] = [];\r\n\r\n        accessTokenKeys.forEach((key) => {\r\n            // Validate key\r\n            if (this.accessTokenKeyMatchesFilter(key, accessTokenFilter, true)) {\r\n                const accessToken = this.getAccessTokenCredential(key);\r\n\r\n                // Validate value\r\n                if (accessToken && this.credentialMatchesFilter(accessToken, accessTokenFilter)) {\r\n                    accessTokens.push(accessToken);\r\n                }\r\n            }\r\n        });\r\n\r\n        const numAccessTokens = accessTokens.length;\r\n        if (numAccessTokens < 1) {\r\n            this.commonLogger.info(\"CacheManager:getAccessToken - No token found\");\r\n            return null;\r\n        } else if (numAccessTokens > 1) {\r\n            this.commonLogger.info(\r\n                \"CacheManager:getAccessToken - Multiple access tokens found, clearing them\"\r\n            );\r\n            accessTokens.forEach((accessToken) => {\r\n                this.removeAccessToken(accessToken.generateCredentialKey());\r\n            });\r\n            return null;\r\n        }\r\n\r\n        this.commonLogger.info(\"CacheManager:getAccessToken - Returning access token\");\r\n        return accessTokens[0];\r\n    }\r\n\r\n    /**\r\n     * Validate the cache key against filter before retrieving and parsing cache value\r\n     * @param key \r\n     * @param filter \r\n     * @param keyMustContainAllScopes \r\n     * @returns \r\n     */\r\n    accessTokenKeyMatchesFilter(inputKey: string, filter: CredentialFilter, keyMustContainAllScopes: boolean): boolean {\r\n        const key = inputKey.toLowerCase();\r\n        if (filter.clientId && key.indexOf(filter.clientId.toLowerCase()) === -1) {\r\n            return false;\r\n        }\r\n\r\n        if (filter.homeAccountId && key.indexOf(filter.homeAccountId.toLowerCase()) === -1) {\r\n            return false;\r\n        }\r\n\r\n        if (filter.realm && key.indexOf(filter.realm.toLowerCase()) === -1) {\r\n            return false;\r\n        }\r\n\r\n        if (filter.requestedClaimsHash && key.indexOf(filter.requestedClaimsHash.toLowerCase()) === -1) {\r\n            return false;\r\n        }\r\n\r\n        if (filter.target) {\r\n            const scopes = filter.target.asArray();\r\n            for (let i = 0; i < scopes.length; i++) {\r\n                if (keyMustContainAllScopes && !key.includes(scopes[i].toLowerCase())) {\r\n                    // When performing a cache lookup a missing scope would be a cache miss\r\n                    return false;\r\n                } else if (!keyMustContainAllScopes && key.includes(scopes[i].toLowerCase())) {\r\n                    // When performing a cache write, any token with a subset of requested scopes should be replaced\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * Gets all access tokens matching the filter\r\n     * @param filter \r\n     * @returns \r\n     */\r\n    getAccessTokensByFilter(filter: CredentialFilter): AccessTokenEntity[] {\r\n        const tokenKeys = this.getTokenKeys();\r\n\r\n        const accessTokens: AccessTokenEntity[] = [];\r\n        tokenKeys.accessToken.forEach((key) => {\r\n            if (!this.accessTokenKeyMatchesFilter(key, filter, true)) {\r\n                return;\r\n            }\r\n\r\n            const accessToken = this.getAccessTokenCredential(key);\r\n            if (accessToken && this.credentialMatchesFilter(accessToken, filter)) {\r\n                accessTokens.push(accessToken);\r\n            }\r\n        });\r\n\r\n        return accessTokens;\r\n    }\r\n\r\n    /**\r\n     * Helper to retrieve the appropriate refresh token from cache\r\n     * @param clientId\r\n     * @param account\r\n     * @param familyRT\r\n     */\r\n    getRefreshToken(account: AccountInfo, familyRT: boolean, tokenKeys?: TokenKeys): RefreshTokenEntity | null {\r\n        this.commonLogger.trace(\"CacheManager - getRefreshToken called\");\r\n        const id = familyRT ? THE_FAMILY_ID : undefined;\r\n        const refreshTokenFilter: CredentialFilter = {\r\n            homeAccountId: account.homeAccountId,\r\n            environment: account.environment,\r\n            credentialType: CredentialType.REFRESH_TOKEN,\r\n            clientId: this.clientId,\r\n            familyId: id,\r\n        };\r\n\r\n        const refreshTokenKeys = tokenKeys && tokenKeys.refreshToken || this.getTokenKeys().refreshToken;\r\n        const refreshTokens: RefreshTokenEntity[] = [];\r\n\r\n        refreshTokenKeys.forEach((key) => {\r\n            // Validate key\r\n            if (this.refreshTokenKeyMatchesFilter(key, refreshTokenFilter)) {\r\n                const refreshToken = this.getRefreshTokenCredential(key);\r\n                // Validate value\r\n                if (refreshToken && this.credentialMatchesFilter(refreshToken, refreshTokenFilter)) {\r\n                    refreshTokens.push(refreshToken);\r\n                }\r\n            }\r\n        });\r\n\r\n        const numRefreshTokens = refreshTokens.length;\r\n        if (numRefreshTokens < 1) {\r\n            this.commonLogger.info(\"CacheManager:getRefreshToken - No refresh token found.\");\r\n            return null;\r\n        }\r\n        // address the else case after remove functions address environment aliases\r\n\r\n        this.commonLogger.info(\"CacheManager:getRefreshToken - returning refresh token\");\r\n        return refreshTokens[0] as RefreshTokenEntity;\r\n    }\r\n\r\n    /**\r\n     * Validate the cache key against filter before retrieving and parsing cache value\r\n     * @param key\r\n     * @param filter\r\n     */\r\n    refreshTokenKeyMatchesFilter(inputKey: string, filter: CredentialFilter): boolean {\r\n        const key = inputKey.toLowerCase();\r\n        if (filter.familyId && key.indexOf(filter.familyId.toLowerCase()) === -1) {\r\n            return false;\r\n        }\r\n\r\n        // If familyId is used, clientId is not in the key\r\n        if (!filter.familyId && filter.clientId && key.indexOf(filter.clientId.toLowerCase()) === -1) {\r\n            return false;\r\n        }\r\n\r\n        if (filter.homeAccountId && key.indexOf(filter.homeAccountId.toLowerCase()) === -1) {\r\n            return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * Retrieve AppMetadataEntity from cache\r\n     */\r\n    readAppMetadataFromCache(environment: string): AppMetadataEntity | null {\r\n        const appMetadataFilter: AppMetadataFilter = {\r\n            environment,\r\n            clientId: this.clientId,\r\n        };\r\n\r\n        const appMetadata: AppMetadataCache = this.getAppMetadataFilteredBy(appMetadataFilter);\r\n        const appMetadataEntries: AppMetadataEntity[] = Object.keys(appMetadata).map((key) => appMetadata[key]);\r\n\r\n        const numAppMetadata = appMetadataEntries.length;\r\n        if (numAppMetadata < 1) {\r\n            return null;\r\n        } else if (numAppMetadata > 1) {\r\n            throw ClientAuthError.createMultipleMatchingAppMetadataInCacheError();\r\n        }\r\n\r\n        return appMetadataEntries[0] as AppMetadataEntity;\r\n    }\r\n\r\n    /**\r\n     * Return the family_id value associated  with FOCI\r\n     * @param environment\r\n     * @param clientId\r\n     */\r\n    isAppMetadataFOCI(environment: string): boolean {\r\n        const appMetadata = this.readAppMetadataFromCache(environment);\r\n        return !!(appMetadata && appMetadata.familyId === THE_FAMILY_ID);\r\n    }\r\n\r\n    /**\r\n     * helper to match account ids\r\n     * @param value\r\n     * @param homeAccountId\r\n     */\r\n    private matchHomeAccountId(entity: AccountEntity | CredentialEntity, homeAccountId: string): boolean {\r\n        return !!((typeof entity.homeAccountId === \"string\") && (homeAccountId === entity.homeAccountId));\r\n    }\r\n\r\n    /**\r\n     * helper to match account ids\r\n     * @param entity \r\n     * @param localAccountId \r\n     * @returns \r\n     */\r\n    private matchLocalAccountId(entity: AccountEntity, localAccountId: string): boolean {\r\n        return !!((typeof entity.localAccountId === \"string\") && (localAccountId === entity.localAccountId));\r\n    }\r\n\r\n    /**\r\n     * helper to match usernames\r\n     * @param entity \r\n     * @param username \r\n     * @returns \r\n     */\r\n    private matchUsername(entity: AccountEntity, username: string): boolean {\r\n        return !!((typeof entity.username === \"string\") && (username.toLowerCase() === entity.username.toLowerCase()));\r\n    }\r\n\r\n    /**\r\n     * helper to match assertion\r\n     * @param value\r\n     * @param oboAssertion\r\n     */\r\n    private matchUserAssertionHash(entity: CredentialEntity, userAssertionHash: string): boolean {\r\n        return !!(entity.userAssertionHash && userAssertionHash === entity.userAssertionHash);\r\n    }\r\n\r\n    /**\r\n     * helper to match environment\r\n     * @param value\r\n     * @param environment\r\n     */\r\n    private matchEnvironment(entity: AccountEntity | CredentialEntity | AppMetadataEntity, environment: string): boolean {\r\n        const cloudMetadata = this.getAuthorityMetadataByAlias(environment);\r\n        if (cloudMetadata && cloudMetadata.aliases.indexOf(entity.environment) > -1) {\r\n            return true;\r\n        }\r\n\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * helper to match credential type\r\n     * @param entity\r\n     * @param credentialType\r\n     */\r\n    private matchCredentialType(entity: CredentialEntity, credentialType: string): boolean {\r\n        return (entity.credentialType && credentialType.toLowerCase() === entity.credentialType.toLowerCase());\r\n    }\r\n\r\n    /**\r\n     * helper to match client ids\r\n     * @param entity\r\n     * @param clientId\r\n     */\r\n    private matchClientId(entity: CredentialEntity | AppMetadataEntity, clientId: string): boolean {\r\n        return !!(entity.clientId && clientId === entity.clientId);\r\n    }\r\n\r\n    /**\r\n     * helper to match family ids\r\n     * @param entity\r\n     * @param familyId\r\n     */\r\n    private matchFamilyId(entity: CredentialEntity | AppMetadataEntity, familyId: string): boolean {\r\n        return !!(entity.familyId && familyId === entity.familyId);\r\n    }\r\n\r\n    /**\r\n     * helper to match realm\r\n     * @param entity\r\n     * @param realm\r\n     */\r\n    private matchRealm(entity: AccountEntity | CredentialEntity, realm: string): boolean {\r\n        return !!(entity.realm && realm === entity.realm);\r\n    }\r\n\r\n    /**\r\n     * helper to match nativeAccountId\r\n     * @param entity\r\n     * @param nativeAccountId\r\n     * @returns boolean indicating the match result\r\n     */\r\n    private matchNativeAccountId(entity: AccountEntity, nativeAccountId: string): boolean {\r\n        return !!(entity.nativeAccountId && nativeAccountId === entity.nativeAccountId);\r\n    }\r\n\r\n    /**\r\n     * Returns true if the target scopes are a subset of the current entity's scopes, false otherwise.\r\n     * @param entity\r\n     * @param target\r\n     */\r\n    private matchTarget(entity: CredentialEntity, target: ScopeSet): boolean {\r\n        const isNotAccessTokenCredential = (entity.credentialType !== CredentialType.ACCESS_TOKEN && entity.credentialType !== CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME);\r\n\r\n        if ( isNotAccessTokenCredential || !entity.target) {\r\n            return false;\r\n        }\r\n\r\n        const entityScopeSet: ScopeSet = ScopeSet.fromString(entity.target);\r\n\r\n        return entityScopeSet.containsScopeSet(target);\r\n    }\r\n\r\n    /**\r\n     * Returns true if the credential's tokenType or Authentication Scheme matches the one in the request, false otherwise\r\n     * @param entity\r\n     * @param tokenType\r\n     */\r\n    private matchTokenType(entity: CredentialEntity, tokenType: AuthenticationScheme): boolean {\r\n        return !!(entity.tokenType && entity.tokenType === tokenType);\r\n    }\r\n\r\n    /**\r\n     * Returns true if the credential's keyId matches the one in the request, false otherwise\r\n     * @param entity\r\n     * @param tokenType\r\n     */\r\n    private matchKeyId(entity: CredentialEntity, keyId: string): boolean {\r\n        return !!(entity.keyId && entity.keyId === keyId);\r\n    }\r\n\r\n    /**\r\n     * returns if a given cache entity is of the type appmetadata\r\n     * @param key\r\n     */\r\n    private isAppMetadata(key: string): boolean {\r\n        return key.indexOf(APP_METADATA) !== -1;\r\n    }\r\n\r\n    /**\r\n     * returns if a given cache entity is of the type authoritymetadata\r\n     * @param key\r\n     */\r\n    protected isAuthorityMetadata(key: string): boolean {\r\n        return key.indexOf(AUTHORITY_METADATA_CONSTANTS.CACHE_KEY) !== -1;\r\n    }\r\n\r\n    /**\r\n     * returns cache key used for cloud instance metadata\r\n     */\r\n    generateAuthorityMetadataCacheKey(authority: string): string {\r\n        return `${AUTHORITY_METADATA_CONSTANTS.CACHE_KEY}-${this.clientId}-${authority}`;\r\n    }\r\n\r\n    /**\r\n     * Helper to convert serialized data to object\r\n     * @param obj\r\n     * @param json\r\n     */\r\n    static toObject<T>(obj: T, json: object): T {\r\n        for (const propertyName in json) {\r\n            obj[propertyName] = json[propertyName];\r\n        }\r\n        return obj;\r\n    }\r\n}\r\n\r\nexport class DefaultStorageClass extends CacheManager {\r\n    setAccount(): void {\r\n        const notImplErr = \"Storage interface - setAccount() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    getAccount(): AccountEntity {\r\n        const notImplErr = \"Storage interface - getAccount() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    setIdTokenCredential(): void {\r\n        const notImplErr = \"Storage interface - setIdTokenCredential() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    getIdTokenCredential(): IdTokenEntity {\r\n        const notImplErr = \"Storage interface - getIdTokenCredential() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    setAccessTokenCredential(): void {\r\n        const notImplErr = \"Storage interface - setAccessTokenCredential() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    getAccessTokenCredential(): AccessTokenEntity {\r\n        const notImplErr = \"Storage interface - getAccessTokenCredential() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    setRefreshTokenCredential(): void {\r\n        const notImplErr = \"Storage interface - setRefreshTokenCredential() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    getRefreshTokenCredential(): RefreshTokenEntity {\r\n        const notImplErr = \"Storage interface - getRefreshTokenCredential() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    setAppMetadata(): void {\r\n        const notImplErr = \"Storage interface - setAppMetadata() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    getAppMetadata(): AppMetadataEntity {\r\n        const notImplErr = \"Storage interface - getAppMetadata() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    setServerTelemetry(): void {\r\n        const notImplErr = \"Storage interface - setServerTelemetry() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    getServerTelemetry(): ServerTelemetryEntity {\r\n        const notImplErr = \"Storage interface - getServerTelemetry() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    setAuthorityMetadata(): void {\r\n        const notImplErr = \"Storage interface - setAuthorityMetadata() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    getAuthorityMetadata(): AuthorityMetadataEntity | null {\r\n        const notImplErr = \"Storage interface - getAuthorityMetadata() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    getAuthorityMetadataKeys(): Array<string> {\r\n        const notImplErr = \"Storage interface - getAuthorityMetadataKeys() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    setThrottlingCache(): void {\r\n        const notImplErr = \"Storage interface - setThrottlingCache() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    getThrottlingCache(): ThrottlingEntity {\r\n        const notImplErr = \"Storage interface - getThrottlingCache() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    removeItem(): boolean {\r\n        const notImplErr = \"Storage interface - removeItem() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    containsKey(): boolean {\r\n        const notImplErr = \"Storage interface - containsKey() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    getKeys(): string[] {\r\n        const notImplErr = \"Storage interface - getKeys() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    getAccountKeys(): string[] {\r\n        const notImplErr = \"Storage interface - getAccountKeys() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    getTokenKeys(): TokenKeys {\r\n        const notImplErr = \"Storage interface - getTokenKeys() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    async clear(): Promise<void> {\r\n        const notImplErr = \"Storage interface - clear() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n    updateCredentialCacheKey(): string {\r\n        const notImplErr = \"Storage interface - updateCredentialCacheKey() has not been implemented for the cacheStorage interface.\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n/**\r\n * Utility class which exposes functions for managing date and time operations.\r\n */\r\nexport class TimeUtils {\r\n\r\n    /**\r\n     * return the current time in Unix time (seconds).\r\n     */\r\n    static nowSeconds(): number {\r\n        // Date.getTime() returns in milliseconds.\r\n        return Math.round(new Date().getTime() / 1000.0);\r\n    }\r\n    \r\n    /**\r\n     * check if a token is expired based on given UTC time in seconds.\r\n     * @param expiresOn\r\n     */\r\n    static isTokenExpired(expiresOn: string, offset: number): boolean {\r\n        // check for access token expiry\r\n        const expirationSec = Number(expiresOn) || 0;\r\n        const offsetCurrentTimeSec = TimeUtils.nowSeconds() + offset;\r\n\r\n        // If current time + offset is greater than token expiration time, then token is expired.\r\n        return (offsetCurrentTimeSec > expirationSec);\r\n    }\r\n\r\n    /**\r\n     * If the current time is earlier than the time that a token was cached at, we must discard the token\r\n     * i.e. The system clock was turned back after acquiring the cached token\r\n     * @param cachedAt \r\n     * @param offset \r\n     */\r\n    static wasClockTurnedBack(cachedAt: string): boolean {\r\n        const cachedAtSec = Number(cachedAt);\r\n\r\n        return cachedAtSec > TimeUtils.nowSeconds();\r\n    }\r\n\r\n    /**\r\n     * Waits for t number of milliseconds\r\n     * @param t number\r\n     * @param value T\r\n     */\r\n    static delay<T>(t: number, value?: T): Promise<T | void> {\r\n        return new Promise((resolve) => setTimeout(() => resolve(value), t));\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { CredentialEntity } from \"./CredentialEntity\";\r\nimport { CredentialType, AuthenticationScheme } from \"../../utils/Constants\";\r\nimport { TimeUtils } from \"../../utils/TimeUtils\";\r\nimport { StringUtils } from \"../../utils/StringUtils\";\r\nimport { ICrypto } from \"../../crypto/ICrypto\";\r\nimport { TokenClaims } from \"../../account/TokenClaims\";\r\nimport { AuthToken } from \"../../account/AuthToken\";\r\nimport { ClientAuthError } from \"../../error/ClientAuthError\";\r\n\r\n/**\r\n * ACCESS_TOKEN Credential Type\r\n *\r\n * Key:Value Schema:\r\n *\r\n * Key Example: uid.utid-login.microsoftonline.com-accesstoken-clientId-contoso.com-user.read\r\n *\r\n * Value Schema:\r\n * {\r\n *      homeAccountId: home account identifier for the auth scheme,\r\n *      environment: entity that issued the token, represented as a full host\r\n *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other\r\n *      clientId: client ID of the application\r\n *      secret: Actual credential as a string\r\n *      familyId: Family ID identifier, usually only used for refresh tokens\r\n *      realm: Full tenant or organizational identifier that the account belongs to\r\n *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.\r\n *      cachedAt: Absolute device time when entry was created in the cache.\r\n *      expiresOn: Token expiry time, calculated based on current UTC time in seconds. Represented as a string.\r\n *      extendedExpiresOn: Additional extended expiry time until when token is valid in case of server-side outage. Represented as string in UTC seconds.\r\n *      keyId: used for POP and SSH tokenTypes\r\n *      tokenType: Type of the token issued. Usually \"Bearer\"\r\n * }\r\n */\r\nexport class AccessTokenEntity extends CredentialEntity {\r\n    realm: string;\r\n    target: string;\r\n    cachedAt: string;\r\n    expiresOn: string;\r\n    extendedExpiresOn?: string;\r\n    refreshOn?: string;\r\n    keyId?: string; // for POP and SSH tokenTypes\r\n    tokenType?: AuthenticationScheme;\r\n    requestedClaims?: string;\r\n    requestedClaimsHash?: string;\r\n\r\n    /**\r\n     * Create AccessTokenEntity\r\n     * @param homeAccountId\r\n     * @param environment\r\n     * @param accessToken\r\n     * @param clientId\r\n     * @param tenantId\r\n     * @param scopes\r\n     * @param expiresOn\r\n     * @param extExpiresOn\r\n     */\r\n    static createAccessTokenEntity(\r\n        homeAccountId: string,\r\n        environment: string,\r\n        accessToken: string,\r\n        clientId: string,\r\n        tenantId: string,\r\n        scopes: string,\r\n        expiresOn: number,\r\n        extExpiresOn: number,\r\n        cryptoUtils: ICrypto,\r\n        refreshOn?: number,\r\n        tokenType?: AuthenticationScheme,\r\n        userAssertionHash?:string,\r\n        keyId?: string,\r\n        requestedClaims?: string,\r\n        requestedClaimsHash?: string\r\n    ): AccessTokenEntity {\r\n        const atEntity: AccessTokenEntity = new AccessTokenEntity();\r\n\r\n        atEntity.homeAccountId = homeAccountId;\r\n        atEntity.credentialType = CredentialType.ACCESS_TOKEN;\r\n        atEntity.secret = accessToken;\r\n\r\n        const currentTime = TimeUtils.nowSeconds();\r\n        atEntity.cachedAt = currentTime.toString();\r\n\r\n        /*\r\n         * Token expiry time.\r\n         * This value should be  calculated based on the current UTC time measured locally and the value  expires_in Represented as a string in JSON.\r\n         */\r\n        atEntity.expiresOn = expiresOn.toString();\r\n        atEntity.extendedExpiresOn = extExpiresOn.toString();\r\n        if (refreshOn) {\r\n            atEntity.refreshOn = refreshOn.toString();\r\n        }\r\n\r\n        atEntity.environment = environment;\r\n        atEntity.clientId = clientId;\r\n        atEntity.realm = tenantId;\r\n        atEntity.target = scopes;\r\n        atEntity.userAssertionHash = userAssertionHash;\r\n\r\n        atEntity.tokenType = StringUtils.isEmpty(tokenType) ? AuthenticationScheme.BEARER : tokenType;\r\n\r\n        if (requestedClaims) {\r\n            atEntity.requestedClaims = requestedClaims;\r\n            atEntity.requestedClaimsHash = requestedClaimsHash;\r\n        }\r\n\r\n        /*\r\n         * Create Access Token With Auth Scheme instead of regular access token\r\n         * Cast to lower to handle \"bearer\" from ADFS\r\n         */\r\n        if (atEntity.tokenType?.toLowerCase() !== AuthenticationScheme.BEARER.toLowerCase()) {\r\n            atEntity.credentialType = CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME;\r\n            switch (atEntity.tokenType) {\r\n                case AuthenticationScheme.POP:\r\n                    // Make sure keyId is present and add it to credential\r\n                    const tokenClaims: TokenClaims | null = AuthToken.extractTokenClaims(accessToken, cryptoUtils);\r\n                    if (!tokenClaims?.cnf?.kid) {\r\n                        throw ClientAuthError.createTokenClaimsRequiredError();\r\n                    }\r\n                    atEntity.keyId = tokenClaims.cnf.kid;\r\n                    break;\r\n                case AuthenticationScheme.SSH:\r\n                    atEntity.keyId = keyId;\r\n            }\r\n        }\r\n\r\n        return atEntity;\r\n    }\r\n\r\n    /**\r\n     * Validates an entity: checks for all expected params\r\n     * @param entity\r\n     */\r\n    static isAccessTokenEntity(entity: object): boolean {\r\n\r\n        if (!entity) {\r\n            return false;\r\n        }\r\n\r\n        return (\r\n            entity.hasOwnProperty(\"homeAccountId\") &&\r\n            entity.hasOwnProperty(\"environment\") &&\r\n            entity.hasOwnProperty(\"credentialType\") &&\r\n            entity.hasOwnProperty(\"realm\") &&\r\n            entity.hasOwnProperty(\"clientId\") &&\r\n            entity.hasOwnProperty(\"secret\") &&\r\n            entity.hasOwnProperty(\"target\") &&\r\n            (entity[\"credentialType\"] === CredentialType.ACCESS_TOKEN || entity[\"credentialType\"] === CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME)\r\n        );\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { CredentialEntity } from \"./CredentialEntity\";\r\nimport { CredentialType } from \"../../utils/Constants\";\r\n\r\n/**\r\n * REFRESH_TOKEN Cache\r\n *\r\n * Key:Value Schema:\r\n *\r\n * Key Example: uid.utid-login.microsoftonline.com-refreshtoken-clientId--\r\n *\r\n * Value:\r\n * {\r\n *      homeAccountId: home account identifier for the auth scheme,\r\n *      environment: entity that issued the token, represented as a full host\r\n *      credentialType: Type of credential as a string, can be one of the following: RefreshToken, AccessToken, IdToken, Password, Cookie, Certificate, Other\r\n *      clientId: client ID of the application\r\n *      secret: Actual credential as a string\r\n *      familyId: Family ID identifier, '1' represents Microsoft Family\r\n *      realm: Full tenant or organizational identifier that the account belongs to\r\n *      target: Permissions that are included in the token, or for refresh tokens, the resource identifier.\r\n * }\r\n */\r\nexport class RefreshTokenEntity extends CredentialEntity {\r\n    familyId?: string;\r\n\r\n    /**\r\n     * Create RefreshTokenEntity\r\n     * @param homeAccountId\r\n     * @param authenticationResult\r\n     * @param clientId\r\n     * @param authority\r\n     */\r\n    static createRefreshTokenEntity(\r\n        homeAccountId: string,\r\n        environment: string,\r\n        refreshToken: string,\r\n        clientId: string,\r\n        familyId?: string,\r\n        userAssertionHash?: string\r\n    ): RefreshTokenEntity {\r\n        const rtEntity = new RefreshTokenEntity();\r\n\r\n        rtEntity.clientId = clientId;\r\n        rtEntity.credentialType = CredentialType.REFRESH_TOKEN;\r\n        rtEntity.environment = environment;\r\n        rtEntity.homeAccountId = homeAccountId;\r\n        rtEntity.secret = refreshToken;\r\n        rtEntity.userAssertionHash = userAssertionHash;\r\n\r\n        if (familyId)\r\n            rtEntity.familyId = familyId;\r\n\r\n        return rtEntity;\r\n    }\r\n\r\n    /**\r\n     * Validates an entity: checks for all expected params\r\n     * @param entity\r\n     */\r\n    static isRefreshTokenEntity(entity: object): boolean {\r\n\r\n        if (!entity) {\r\n            return false;\r\n        }\r\n\r\n        return (\r\n            entity.hasOwnProperty(\"homeAccountId\") &&\r\n            entity.hasOwnProperty(\"environment\") &&\r\n            entity.hasOwnProperty(\"credentialType\") &&\r\n            entity.hasOwnProperty(\"clientId\") &&\r\n            entity.hasOwnProperty(\"secret\") &&\r\n            entity[\"credentialType\"] === CredentialType.REFRESH_TOKEN\r\n        );\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { APP_METADATA, Separators } from \"../../utils/Constants\";\r\n\r\n/**\r\n * APP_METADATA Cache\r\n *\r\n * Key:Value Schema:\r\n *\r\n * Key: appmetadata-<environment>-<client_id>\r\n *\r\n * Value:\r\n * {\r\n *      clientId: client ID of the application\r\n *      environment: entity that issued the token, represented as a full host\r\n *      familyId: Family ID identifier, '1' represents Microsoft Family\r\n * }\r\n */\r\nexport class AppMetadataEntity {\r\n    clientId: string;\r\n    environment: string;\r\n    familyId?: string;\r\n\r\n    /**\r\n     * Generate AppMetadata Cache Key as per the schema: appmetadata-<environment>-<client_id>\r\n     */\r\n    generateAppMetadataKey(): string {\r\n        return AppMetadataEntity.generateAppMetadataCacheKey(this.environment, this.clientId);\r\n    }\r\n\r\n    /**\r\n     * Generate AppMetadata Cache Key\r\n     */\r\n    static generateAppMetadataCacheKey(environment: string, clientId: string): string {\r\n        const appMetaDataKeyArray: Array<string> = [\r\n            APP_METADATA,\r\n            environment,\r\n            clientId,\r\n        ];\r\n        return appMetaDataKeyArray.join(Separators.CACHE_KEY_SEPARATOR).toLowerCase();\r\n    }\r\n\r\n    /**\r\n     * Creates AppMetadataEntity\r\n     * @param clientId\r\n     * @param environment\r\n     * @param familyId\r\n     */\r\n    static createAppMetadataEntity(clientId: string, environment: string, familyId?: string): AppMetadataEntity {\r\n        const appMetadata = new AppMetadataEntity();\r\n\r\n        appMetadata.clientId = clientId;\r\n        appMetadata.environment = environment;\r\n        if (familyId) {\r\n            appMetadata.familyId = familyId;\r\n        }\r\n\r\n        return appMetadata;\r\n    }\r\n\r\n    /**\r\n     * Validates an entity: checks for all expected params\r\n     * @param entity\r\n     */\r\n    static isAppMetadataEntity(key: string, entity: object): boolean {\r\n\r\n        if (!entity) {\r\n            return false;\r\n        }\r\n\r\n        return (\r\n            key.indexOf(APP_METADATA) === 0 &&\r\n            entity.hasOwnProperty(\"clientId\") &&\r\n            entity.hasOwnProperty(\"environment\")\r\n        );\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { SERVER_TELEM_CONSTANTS } from \"../../utils/Constants\";\r\n\r\nexport class ServerTelemetryEntity {\r\n    failedRequests: Array<string|number>;\r\n    errors: string[];\r\n    cacheHits: number;\r\n\r\n    constructor() {\r\n        this.failedRequests = [];\r\n        this.errors = [];\r\n        this.cacheHits = 0;\r\n    }\r\n\r\n    /**\r\n     * validates if a given cache entry is \"Telemetry\", parses <key,value>\r\n     * @param key\r\n     * @param entity\r\n     */\r\n    static isServerTelemetryEntity(key: string, entity?: object): boolean {\r\n\r\n        const validateKey: boolean = key.indexOf(SERVER_TELEM_CONSTANTS.CACHE_KEY) === 0;\r\n        let validateEntity: boolean = true;\r\n\r\n        if (entity) {\r\n            validateEntity =\r\n                entity.hasOwnProperty(\"failedRequests\") &&\r\n                entity.hasOwnProperty(\"errors\") &&\r\n                entity.hasOwnProperty(\"cacheHits\");\r\n        }\r\n\r\n        return validateKey && validateEntity;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { CloudDiscoveryMetadata } from \"../../authority/CloudDiscoveryMetadata\";\r\nimport { OpenIdConfigResponse } from \"../../authority/OpenIdConfigResponse\";\r\nimport { AUTHORITY_METADATA_CONSTANTS } from \"../../utils/Constants\";\r\nimport { TimeUtils } from \"../../utils/TimeUtils\";\r\n\r\nexport class AuthorityMetadataEntity {\r\n    aliases: Array<string>;\r\n    preferred_cache: string;\r\n    preferred_network: string;\r\n    canonical_authority: string;\r\n    authorization_endpoint: string;\r\n    token_endpoint: string;\r\n    end_session_endpoint?: string;\r\n    issuer: string;\r\n    aliasesFromNetwork: boolean;\r\n    endpointsFromNetwork: boolean;\r\n    expiresAt: number;\r\n    jwks_uri: string;\r\n\r\n    constructor() {\r\n        this.expiresAt = TimeUtils.nowSeconds() + AUTHORITY_METADATA_CONSTANTS.REFRESH_TIME_SECONDS;\r\n    }\r\n\r\n    /**\r\n     * Update the entity with new aliases, preferred_cache and preferred_network values\r\n     * @param metadata \r\n     * @param fromNetwork \r\n     */\r\n    updateCloudDiscoveryMetadata(metadata: CloudDiscoveryMetadata, fromNetwork: boolean): void {\r\n        this.aliases = metadata.aliases;\r\n        this.preferred_cache = metadata.preferred_cache;\r\n        this.preferred_network = metadata.preferred_network;\r\n        this.aliasesFromNetwork = fromNetwork;\r\n    }\r\n\r\n    /**\r\n     * Update the entity with new endpoints\r\n     * @param metadata \r\n     * @param fromNetwork \r\n     */\r\n    updateEndpointMetadata(metadata: OpenIdConfigResponse, fromNetwork: boolean): void {\r\n        this.authorization_endpoint = metadata.authorization_endpoint;\r\n        this.token_endpoint = metadata.token_endpoint;\r\n        this.end_session_endpoint = metadata.end_session_endpoint;\r\n        this.issuer = metadata.issuer;\r\n        this.endpointsFromNetwork = fromNetwork;\r\n        this.jwks_uri = metadata.jwks_uri;\r\n    }\r\n\r\n    /**\r\n     * Save the authority that was used to create this cache entry\r\n     * @param authority \r\n     */\r\n    updateCanonicalAuthority(authority: string): void {\r\n        this.canonical_authority = authority;\r\n    }\r\n\r\n    /**\r\n     * Reset the exiresAt value\r\n     */\r\n    resetExpiresAt(): void {\r\n        this.expiresAt = TimeUtils.nowSeconds() + AUTHORITY_METADATA_CONSTANTS.REFRESH_TIME_SECONDS;\r\n    }\r\n\r\n    /**\r\n     * Returns whether or not the data needs to be refreshed\r\n     */\r\n    isExpired(): boolean {\r\n        return this.expiresAt <= TimeUtils.nowSeconds();\r\n    }\r\n\r\n    /**\r\n     * Validates an entity: checks for all expected params\r\n     * @param entity\r\n     */\r\n    static isAuthorityMetadataEntity(key: string, entity: object): boolean {\r\n\r\n        if (!entity) {\r\n            return false;\r\n        }\r\n\r\n        return (\r\n            key.indexOf(AUTHORITY_METADATA_CONSTANTS.CACHE_KEY) === 0 &&\r\n            entity.hasOwnProperty(\"aliases\") &&\r\n            entity.hasOwnProperty(\"preferred_cache\") &&\r\n            entity.hasOwnProperty(\"preferred_network\") &&\r\n            entity.hasOwnProperty(\"canonical_authority\") &&\r\n            entity.hasOwnProperty(\"authorization_endpoint\") &&\r\n            entity.hasOwnProperty(\"token_endpoint\") &&\r\n            entity.hasOwnProperty(\"issuer\") &&\r\n            entity.hasOwnProperty(\"aliasesFromNetwork\") &&\r\n            entity.hasOwnProperty(\"endpointsFromNetwork\") &&\r\n            entity.hasOwnProperty(\"expiresAt\") &&\r\n            entity.hasOwnProperty(\"jwks_uri\")\r\n        );\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ThrottlingConstants } from \"../../utils/Constants\";\r\n\r\nexport class ThrottlingEntity {\r\n    // Unix-time value representing the expiration of the throttle\r\n    throttleTime: number;\r\n    // Information provided by the server\r\n    error?: string;\r\n    errorCodes?: Array<string>;\r\n    errorMessage?: string;\r\n    subError?: string;\r\n\r\n    /**\r\n     * validates if a given cache entry is \"Throttling\", parses <key,value>\r\n     * @param key\r\n     * @param entity\r\n     */\r\n    static isThrottlingEntity(key: string, entity?: object): boolean {\r\n        \r\n        let validateKey: boolean = false;\r\n        if (key) {\r\n            validateKey = key.indexOf(ThrottlingConstants.THROTTLING_PREFIX) === 0;\r\n        }\r\n        \r\n        let validateEntity: boolean = true;\r\n        if (entity) {\r\n            validateEntity = entity.hasOwnProperty(\"throttleTime\");\r\n        }\r\n\r\n        return validateKey && validateEntity;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { StringUtils } from \"./StringUtils\";\r\nimport { Constants } from \"./Constants\";\r\nimport { ICrypto } from \"../crypto/ICrypto\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\n\r\n/**\r\n * Type which defines the object that is stringified, encoded and sent in the state value.\r\n * Contains the following:\r\n * - id - unique identifier for this request\r\n * - ts - timestamp for the time the request was made. Used to ensure that token expiration is not calculated incorrectly.\r\n * - platformState - string value sent from the platform.\r\n */\r\nexport type LibraryStateObject = {\r\n    id: string,\r\n    meta?: Record<string, string>\r\n};\r\n\r\n/**\r\n * Type which defines the stringified and encoded object sent to the service in the authorize request.\r\n */\r\nexport type RequestStateObject = {\r\n    userRequestState: string,\r\n    libraryState: LibraryStateObject\r\n};\r\n\r\n/**\r\n * Class which provides helpers for OAuth 2.0 protocol specific values\r\n */\r\nexport class ProtocolUtils {\r\n\r\n    /**\r\n     * Appends user state with random guid, or returns random guid.\r\n     * @param userState \r\n     * @param randomGuid \r\n     */\r\n    static setRequestState(cryptoObj: ICrypto, userState?: string, meta?: Record<string, string>): string {\r\n        const libraryState = ProtocolUtils.generateLibraryState(cryptoObj, meta);\r\n        return !StringUtils.isEmpty(userState) ? `${libraryState}${Constants.RESOURCE_DELIM}${userState}` : libraryState;\r\n    }\r\n\r\n    /**\r\n     * Generates the state value used by the common library.\r\n     * @param randomGuid \r\n     * @param cryptoObj \r\n     */\r\n    static generateLibraryState(cryptoObj: ICrypto, meta?: Record<string, string>): string {\r\n        if (!cryptoObj) {\r\n            throw ClientAuthError.createNoCryptoObjectError(\"generateLibraryState\");\r\n        }\r\n\r\n        // Create a state object containing a unique id and the timestamp of the request creation\r\n        const stateObj: LibraryStateObject = {\r\n            id: cryptoObj.createNewGuid()\r\n        };\r\n\r\n        if (meta) {\r\n            stateObj.meta = meta;\r\n        }\r\n\r\n        const stateString = JSON.stringify(stateObj);\r\n\r\n        return cryptoObj.base64Encode(stateString);\r\n    }\r\n\r\n    /**\r\n     * Parses the state into the RequestStateObject, which contains the LibraryState info and the state passed by the user.\r\n     * @param state \r\n     * @param cryptoObj \r\n     */\r\n    static parseRequestState(cryptoObj: ICrypto, state: string): RequestStateObject {\r\n        if (!cryptoObj) {\r\n            throw ClientAuthError.createNoCryptoObjectError(\"parseRequestState\");\r\n        }\r\n\r\n        if (StringUtils.isEmpty(state)) {\r\n            throw ClientAuthError.createInvalidStateError(state, \"Null, undefined or empty state\");\r\n        }\r\n\r\n        try {\r\n            // Split the state between library state and user passed state and decode them separately\r\n            const splitState = state.split(Constants.RESOURCE_DELIM);\r\n            const libraryState = splitState[0];\r\n            const userState = splitState.length > 1 ? splitState.slice(1).join(Constants.RESOURCE_DELIM) : Constants.EMPTY_STRING;\r\n            const libraryStateString = cryptoObj.base64Decode(libraryState);\r\n            const libraryStateObj = JSON.parse(libraryStateString) as LibraryStateObject;\r\n            return {\r\n                userRequestState: !StringUtils.isEmpty(userState) ? userState : Constants.EMPTY_STRING,\r\n                libraryState: libraryStateObj\r\n            };\r\n        } catch(e) {\r\n            throw ClientAuthError.createInvalidStateError(state, e);\r\n        }\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { IdTokenEntity } from \"./IdTokenEntity\";\r\nimport { AccessTokenEntity } from \"./AccessTokenEntity\";\r\nimport { RefreshTokenEntity } from \"./RefreshTokenEntity\";\r\nimport { AccountEntity } from \"./AccountEntity\";\r\nimport { AppMetadataEntity } from \"./AppMetadataEntity\";\r\n\r\nexport class CacheRecord {\r\n    account: AccountEntity | null;\r\n    idToken: IdTokenEntity | null;\r\n    accessToken: AccessTokenEntity | null;\r\n    refreshToken: RefreshTokenEntity | null;\r\n    appMetadata: AppMetadataEntity | null;\r\n\r\n    constructor(accountEntity?: AccountEntity | null, idTokenEntity?: IdTokenEntity | null, accessTokenEntity?: AccessTokenEntity | null, refreshTokenEntity?: RefreshTokenEntity | null, appMetadataEntity?: AppMetadataEntity | null) {\r\n        this.account = accountEntity || null;\r\n        this.idToken = idTokenEntity || null;\r\n        this.accessToken = accessTokenEntity || null;\r\n        this.refreshToken = refreshTokenEntity || null;\r\n        this.appMetadata = appMetadataEntity || null;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { OIDC_DEFAULT_SCOPES } from \"@azure/msal-common\";\r\nimport { PopupRequest } from \"../request/PopupRequest\";\r\nimport { RedirectRequest } from \"../request/RedirectRequest\";\r\n\r\n/**\r\n * Constants\r\n */\r\nexport const BrowserConstants = {\r\n    /**\r\n     * Interaction in progress cache value\r\n     */\r\n    INTERACTION_IN_PROGRESS_VALUE: \"interaction_in_progress\",\r\n    /**\r\n     * Invalid grant error code\r\n     */\r\n    INVALID_GRANT_ERROR: \"invalid_grant\",\r\n    /**\r\n     * Default popup window width\r\n     */\r\n    POPUP_WIDTH: 483,\r\n    /**\r\n     * Default popup window height\r\n     */\r\n    POPUP_HEIGHT: 600,\r\n    /**\r\n     * Name of the popup window starts with\r\n     */\r\n    POPUP_NAME_PREFIX: \"msal\",\r\n    /**\r\n     * Default popup monitor poll interval in milliseconds\r\n     */\r\n    DEFAULT_POLL_INTERVAL_MS: 30,\r\n    /**\r\n     * Msal-browser SKU\r\n     */\r\n    MSAL_SKU: \"msal.js.browser\",\r\n};\r\n\r\nexport const NativeConstants = {\r\n    CHANNEL_ID: \"53ee284d-920a-4b59-9d30-a60315b26836\",\r\n    PREFERRED_EXTENSION_ID: \"ppnbnpeolgkicgegkbkbjmhlideopiji\",\r\n    MATS_TELEMETRY: \"MATS\"\r\n};\r\n\r\nexport enum NativeExtensionMethod {\r\n    HandshakeRequest = \"Handshake\",\r\n    HandshakeResponse = \"HandshakeResponse\",\r\n    GetToken = \"GetToken\",\r\n    Response = \"Response\"\r\n}\r\n\r\nexport enum BrowserCacheLocation {\r\n    LocalStorage = \"localStorage\",\r\n    SessionStorage = \"sessionStorage\",\r\n    MemoryStorage = \"memoryStorage\"\r\n}\r\n\r\n/**\r\n * HTTP Request types supported by MSAL.\r\n */\r\nexport enum HTTP_REQUEST_TYPE {\r\n    GET = \"GET\",\r\n    POST = \"POST\"\r\n}\r\n\r\n/**\r\n * Temporary cache keys for MSAL, deleted after any request.\r\n */\r\nexport enum TemporaryCacheKeys {\r\n    AUTHORITY = \"authority\",\r\n    ACQUIRE_TOKEN_ACCOUNT = \"acquireToken.account\",\r\n    SESSION_STATE = \"session.state\",\r\n    REQUEST_STATE = \"request.state\",\r\n    NONCE_IDTOKEN = \"nonce.id_token\",\r\n    ORIGIN_URI = \"request.origin\",\r\n    RENEW_STATUS = \"token.renew.status\",\r\n    URL_HASH = \"urlHash\",\r\n    REQUEST_PARAMS = \"request.params\",\r\n    SCOPES = \"scopes\",\r\n    INTERACTION_STATUS_KEY = \"interaction.status\",\r\n    CCS_CREDENTIAL = \"ccs.credential\",\r\n    CORRELATION_ID = \"request.correlationId\",\r\n    NATIVE_REQUEST = \"request.native\",\r\n    REDIRECT_CONTEXT = \"request.redirect.context\"\r\n}\r\n\r\nexport enum StaticCacheKeys {\r\n    ACCOUNT_KEYS = \"msal.account.keys\",\r\n    TOKEN_KEYS = \"msal.token.keys\"\r\n}\r\n\r\n/**\r\n * Cache keys stored in-memory\r\n */\r\nexport enum InMemoryCacheKeys {\r\n    WRAPPER_SKU = \"wrapper.sku\",\r\n    WRAPPER_VER = \"wrapper.version\"\r\n}\r\n\r\n/**\r\n * API Codes for Telemetry purposes. \r\n * Before adding a new code you must claim it in the MSAL Telemetry tracker as these number spaces are shared across all MSALs\r\n * 0-99 Silent Flow\r\n * 800-899 Auth Code Flow\r\n */\r\nexport enum ApiId {\r\n    acquireTokenRedirect = 861,\r\n    acquireTokenPopup = 862,\r\n    ssoSilent = 863,\r\n    acquireTokenSilent_authCode = 864,\r\n    handleRedirectPromise = 865,\r\n    acquireTokenByCode = 866,\r\n    acquireTokenSilent_silentFlow = 61,\r\n    logout = 961,\r\n    logoutPopup = 962\r\n}\r\n\r\n/*\r\n * Interaction type of the API - used for state and telemetry\r\n */\r\nexport enum InteractionType {\r\n    Redirect = \"redirect\",\r\n    Popup = \"popup\",\r\n    Silent = \"silent\",\r\n    None = \"none\"\r\n}\r\n\r\n/**\r\n * Types of interaction currently in progress.\r\n * Used in events in wrapper libraries to invoke functions when certain interaction is in progress or all interactions are complete.\r\n */\r\nexport enum InteractionStatus {\r\n    /**\r\n     * Initial status before interaction occurs\r\n     */\r\n    Startup = \"startup\",\r\n    /**\r\n     * Status set when all login calls occuring\r\n     */\r\n    Login = \"login\",\r\n    /**\r\n     * Status set when logout call occuring\r\n     */ \r\n    Logout = \"logout\",\r\n    /**\r\n     * Status set for acquireToken calls\r\n     */\r\n    AcquireToken = \"acquireToken\",\r\n    /**\r\n     * Status set for ssoSilent calls\r\n     */\r\n    SsoSilent = \"ssoSilent\",\r\n    /**\r\n     * Status set when handleRedirect in progress\r\n     */\r\n    HandleRedirect = \"handleRedirect\",\r\n    /**\r\n     * Status set when interaction is complete\r\n     */\r\n    None = \"none\"\r\n}\r\n\r\nexport const DEFAULT_REQUEST: RedirectRequest|PopupRequest = {\r\n    scopes: OIDC_DEFAULT_SCOPES\r\n};\r\n\r\n/**\r\n * JWK Key Format string (Type MUST be defined for window crypto APIs)\r\n */\r\nexport const KEY_FORMAT_JWK = \"jwk\";\r\n\r\n// Supported wrapper SKUs\r\nexport enum WrapperSKU {\r\n    React = \"@azure/msal-react\",\r\n    Angular = \"@azure/msal-angular\"\r\n}\r\n\r\n// DatabaseStorage Constants\r\nexport const DB_NAME = \"msal.db\";\r\nexport const DB_VERSION = 1;\r\nexport const DB_TABLE_NAME = `${DB_NAME}.keys`;\r\n\r\nexport enum CacheLookupPolicy {\r\n    /*\r\n     * acquireTokenSilent will attempt to retrieve an access token from the cache. If the access token is expired\r\n     * or cannot be found the refresh token will be used to acquire a new one. Finally, if the refresh token\r\n     * is expired acquireTokenSilent will attempt to acquire new access and refresh tokens.\r\n     */\r\n    Default = 0, // 0 is falsy, is equivalent to not passing in a CacheLookupPolicy\r\n    /*\r\n     * acquireTokenSilent will only look for access tokens in the cache. It will not attempt to renew access or\r\n     * refresh tokens.\r\n     */\r\n    AccessToken = 1,\r\n    /*\r\n     * acquireTokenSilent will attempt to retrieve an access token from the cache. If the access token is expired or\r\n     * cannot be found, the refresh token will be used to acquire a new one. If the refresh token is expired, it\r\n     * will not be renewed and acquireTokenSilent will fail.\r\n     */\r\n    AccessTokenAndRefreshToken = 2,\r\n    /*\r\n     * acquireTokenSilent will not attempt to retrieve access tokens from the cache and will instead attempt to\r\n     * exchange the cached refresh token for a new access token. If the refresh token is expired, it will not be\r\n     * renewed and acquireTokenSilent will fail.\r\n     */\r\n    RefreshToken = 3,\r\n    /*\r\n     * acquireTokenSilent will not look in the cache for the access token. It will go directly to network with the\r\n     * cached refresh token. If the refresh token is expired an attempt will be made to renew it. This is equivalent to\r\n     * setting \"forceRefresh: true\".\r\n     */\r\n    RefreshTokenAndNetwork = 4,\r\n    /*\r\n     * acquireTokenSilent will attempt to renew both access and refresh tokens. It will not look in the cache. This will\r\n     * always fail if 3rd party cookies are blocked by the browser.\r\n     */\r\n    Skip = 5,\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthError } from \"../error/AuthError\";\r\nimport { BaseAuthRequest } from \"../request/BaseAuthRequest\";\r\nimport { SignedHttpRequest } from \"./SignedHttpRequest\";\r\n\r\n/**\r\n * The PkceCodes type describes the structure\r\n * of objects that contain PKCE code\r\n * challenge and verifier pairs\r\n */\r\nexport type PkceCodes = {\r\n    verifier: string,\r\n    challenge: string\r\n};\r\n\r\nexport type SignedHttpRequestParameters = Pick<BaseAuthRequest, \"resourceRequestMethod\" | \"resourceRequestUri\" | \"shrClaims\" | \"shrNonce\" > & {\r\n    correlationId?: string\r\n};\r\n\r\n/**\r\n * Interface for crypto functions used by library\r\n */\r\nexport interface ICrypto {\r\n    /**\r\n     * Creates a guid randomly.\r\n     */\r\n    createNewGuid(): string;\r\n    /**\r\n     * base64 Encode string\r\n     * @param input \r\n     */\r\n    base64Encode(input: string): string;\r\n    /**\r\n     * base64 decode string\r\n     * @param input \r\n     */\r\n    base64Decode(input: string): string;\r\n    /**\r\n     * Generate PKCE codes for OAuth. See RFC here: https://tools.ietf.org/html/rfc7636\r\n     */\r\n    generatePkceCodes(): Promise<PkceCodes>;\r\n    /**\r\n     * Generates an JWK RSA S256 Thumbprint\r\n     * @param request\r\n     */\r\n    getPublicKeyThumbprint(request: SignedHttpRequestParameters): Promise<string>;\r\n    /**\r\n     * Removes cryptographic keypair from key store matching the keyId passed in\r\n     * @param kid \r\n     */\r\n    removeTokenBindingKey(kid: string): Promise<boolean>;\r\n    /**\r\n     * Removes all cryptographic keys from IndexedDB storage\r\n     */\r\n    clearKeystore(): Promise<boolean>;\r\n    /** \r\n     * Returns a signed proof-of-possession token with a given acces token that contains a cnf claim with the required kid.\r\n     * @param accessToken \r\n     */\r\n    signJwt(payload: SignedHttpRequest, kid: string, correlationId?: string): Promise<string>;\r\n    /**\r\n     * Returns the SHA-256 hash of an input string\r\n     * @param plainText\r\n     */\r\n    hashString(plainText: string): Promise<string>;\r\n}\r\n\r\nexport const DEFAULT_CRYPTO_IMPLEMENTATION: ICrypto = {\r\n    createNewGuid: (): string => {\r\n        const notImplErr = \"Crypto interface - createNewGuid() has not been implemented\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    },\r\n    base64Decode: (): string => {\r\n        const notImplErr = \"Crypto interface - base64Decode() has not been implemented\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    },\r\n    base64Encode: (): string => {\r\n        const notImplErr = \"Crypto interface - base64Encode() has not been implemented\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    },\r\n    async generatePkceCodes(): Promise<PkceCodes> {\r\n        const notImplErr = \"Crypto interface - generatePkceCodes() has not been implemented\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    },\r\n    async getPublicKeyThumbprint(): Promise<string> {\r\n        const notImplErr = \"Crypto interface - getPublicKeyThumbprint() has not been implemented\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    },\r\n    async removeTokenBindingKey(): Promise<boolean> {\r\n        const notImplErr = \"Crypto interface - removeTokenBindingKey() has not been implemented\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    },\r\n    async clearKeystore(): Promise<boolean> {\r\n        const notImplErr = \"Crypto interface - clearKeystore() has not been implemented\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    },\r\n    async signJwt(): Promise<string> {\r\n        const notImplErr = \"Crypto interface - signJwt() has not been implemented\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    },\r\n    async hashString(): Promise<string> {\r\n        const notImplErr = \"Crypto interface - hashString() has not been implemented\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n};\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthError, StringUtils } from \"@azure/msal-common\";\r\n\r\n/**\r\n * BrowserAuthErrorMessage class containing string constants used by error codes and messages.\r\n */\r\nexport const BrowserAuthErrorMessage = {\r\n    pkceNotGenerated: {\r\n        code: \"pkce_not_created\",\r\n        desc: \"The PKCE code challenge and verifier could not be generated.\"\r\n    },\r\n    cryptoDoesNotExist: {\r\n        code: \"crypto_nonexistent\",\r\n        desc: \"The crypto object or function is not available.\"\r\n    },\r\n    httpMethodNotImplementedError: {\r\n        code: \"http_method_not_implemented\",\r\n        desc: \"The HTTP method given has not been implemented in this library.\"\r\n    },\r\n    emptyNavigateUriError: {\r\n        code: \"empty_navigate_uri\",\r\n        desc: \"Navigation URI is empty. Please check stack trace for more info.\"\r\n    },\r\n    hashEmptyError: {\r\n        code: \"hash_empty_error\",\r\n        desc: \"Hash value cannot be processed because it is empty. Please verify that your redirectUri is not clearing the hash. For more visit: aka.ms/msaljs/browser-errors.\"\r\n    },\r\n    hashDoesNotContainStateError: {\r\n        code: \"no_state_in_hash\",\r\n        desc: \"Hash does not contain state. Please verify that the request originated from msal.\"\r\n    },\r\n    hashDoesNotContainKnownPropertiesError: {\r\n        code: \"hash_does_not_contain_known_properties\",\r\n        desc: \"Hash does not contain known properites. Please verify that your redirectUri is not changing the hash. For more visit: aka.ms/msaljs/browser-errors.\"\r\n    },\r\n    unableToParseStateError: {\r\n        code: \"unable_to_parse_state\",\r\n        desc: \"Unable to parse state. Please verify that the request originated from msal.\"\r\n    },\r\n    stateInteractionTypeMismatchError: {\r\n        code: \"state_interaction_type_mismatch\",\r\n        desc: \"Hash contains state but the interaction type does not match the caller.\"\r\n    },\r\n    interactionInProgress: {\r\n        code: \"interaction_in_progress\",\r\n        desc: \"Interaction is currently in progress. Please ensure that this interaction has been completed before calling an interactive API.  For more visit: aka.ms/msaljs/browser-errors.\"\r\n    },\r\n    popupWindowError: {\r\n        code: \"popup_window_error\",\r\n        desc: \"Error opening popup window. This can happen if you are using IE or if popups are blocked in the browser.\"\r\n    },\r\n    emptyWindowError: {\r\n        code: \"empty_window_error\",\r\n        desc: \"window.open returned null or undefined window object.\"\r\n    },\r\n    userCancelledError: {\r\n        code: \"user_cancelled\",\r\n        desc: \"User cancelled the flow.\"\r\n    },\r\n    monitorPopupTimeoutError: {\r\n        code: \"monitor_window_timeout\",\r\n        desc: \"Token acquisition in popup failed due to timeout. For more visit: aka.ms/msaljs/browser-errors.\"\r\n    },\r\n    monitorIframeTimeoutError: {\r\n        code: \"monitor_window_timeout\",\r\n        desc: \"Token acquisition in iframe failed due to timeout. For more visit: aka.ms/msaljs/browser-errors.\"\r\n    },\r\n    redirectInIframeError: {\r\n        code: \"redirect_in_iframe\",\r\n        desc: \"Redirects are not supported for iframed or brokered applications. Please ensure you are using MSAL.js in a top frame of the window if using the redirect APIs, or use the popup APIs.\"\r\n    },\r\n    blockTokenRequestsInHiddenIframeError: {\r\n        code: \"block_iframe_reload\",\r\n        desc: \"Request was blocked inside an iframe because MSAL detected an authentication response. For more visit: aka.ms/msaljs/browser-errors\"\r\n    },\r\n    blockAcquireTokenInPopupsError: {\r\n        code: \"block_nested_popups\",\r\n        desc: \"Request was blocked inside a popup because MSAL detected it was running in a popup.\"\r\n    },\r\n    iframeClosedPrematurelyError: {\r\n        code: \"iframe_closed_prematurely\",\r\n        desc: \"The iframe being monitored was closed prematurely.\"\r\n    },\r\n    silentLogoutUnsupportedError: {\r\n        code: \"silent_logout_unsupported\",\r\n        desc: \"Silent logout not supported. Please call logoutRedirect or logoutPopup instead.\"\r\n    },\r\n    noAccountError: {\r\n        code: \"no_account_error\",\r\n        desc: \"No account object provided to acquireTokenSilent and no active account has been set. Please call setActiveAccount or provide an account on the request.\"\r\n    },\r\n    silentPromptValueError: {\r\n        code: \"silent_prompt_value_error\",\r\n        desc: \"The value given for the prompt value is not valid for silent requests - must be set to 'none' or 'no_session'.\"\r\n    },\r\n    noTokenRequestCacheError: {\r\n        code: \"no_token_request_cache_error\",\r\n        desc: \"No token request found in cache.\"\r\n    },\r\n    unableToParseTokenRequestCacheError: {\r\n        code: \"unable_to_parse_token_request_cache_error\",\r\n        desc: \"The cached token request could not be parsed.\"\r\n    },\r\n    noCachedAuthorityError: {\r\n        code: \"no_cached_authority_error\",\r\n        desc: \"No cached authority found.\"\r\n    },\r\n    authRequestNotSet: {\r\n        code: \"auth_request_not_set_error\",\r\n        desc: \"Auth Request not set. Please ensure initiateAuthRequest was called from the InteractionHandler\"\r\n    },\r\n    invalidCacheType: {\r\n        code: \"invalid_cache_type\",\r\n        desc: \"Invalid cache type\"\r\n    },\r\n    notInBrowserEnvironment: {\r\n        code: \"non_browser_environment\",\r\n        desc: \"Login and token requests are not supported in non-browser environments.\"\r\n    },\r\n    databaseNotOpen: {\r\n        code: \"database_not_open\",\r\n        desc: \"Database is not open!\"\r\n    },\r\n    noNetworkConnectivity: {\r\n        code: \"no_network_connectivity\",\r\n        desc: \"No network connectivity. Check your internet connection.\"\r\n    },\r\n    postRequestFailed: {\r\n        code: \"post_request_failed\",\r\n        desc: \"Network request failed: If the browser threw a CORS error, check that the redirectUri is registered in the Azure App Portal as type 'SPA'\"\r\n    },\r\n    getRequestFailed: {\r\n        code: \"get_request_failed\",\r\n        desc: \"Network request failed. Please check the network trace to determine root cause.\"\r\n    },\r\n    failedToParseNetworkResponse: {\r\n        code: \"failed_to_parse_response\",\r\n        desc: \"Failed to parse network response. Check network trace.\"\r\n    },\r\n    unableToLoadTokenError: {\r\n        code: \"unable_to_load_token\",\r\n        desc: \"Error loading token to cache.\"\r\n    },\r\n    signingKeyNotFoundInStorage: {\r\n        code: \"crypto_key_not_found\",\r\n        desc: \"Cryptographic Key or Keypair not found in browser storage.\"\r\n    },\r\n    authCodeRequired: {\r\n        code: \"auth_code_required\",\r\n        desc: \"An authorization code must be provided (as the `code` property on the request) to this flow.\"\r\n    },\r\n    authCodeOrNativeAccountRequired: {\r\n        code: \"auth_code_or_nativeAccountId_required\",\r\n        desc: \"An authorization code or nativeAccountId must be provided to this flow.\"\r\n    },\r\n    spaCodeAndNativeAccountPresent: {\r\n        code: \"spa_code_and_nativeAccountId_present\",\r\n        desc: \"Request cannot contain both spa code and native account id.\"\r\n    },\r\n    databaseUnavailable: {\r\n        code: \"database_unavailable\",\r\n        desc: \"IndexedDB, which is required for persistent cryptographic key storage, is unavailable. This may be caused by browser privacy features which block persistent storage in third-party contexts.\"\r\n    },\r\n    unableToAcquireTokenFromNativePlatform: {\r\n        code: \"unable_to_acquire_token_from_native_platform\",\r\n        desc: \"Unable to acquire token from native platform. For a list of possible reasons visit aka.ms/msaljs/browser-errors.\"\r\n    },\r\n    nativeHandshakeTimeout: {\r\n        code: \"native_handshake_timeout\",\r\n        desc: \"Timed out while attempting to establish connection to browser extension\"\r\n    },\r\n    nativeExtensionNotInstalled: {\r\n        code: \"native_extension_not_installed\",\r\n        desc: \"Native extension is not installed. If you think this is a mistake call the initialize function.\"\r\n    },\r\n    nativeConnectionNotEstablished: {\r\n        code: \"native_connection_not_established\",\r\n        desc: \"Connection to native platform has not been established. Please install a compatible browser extension and run initialize(). For more please visit aka.ms/msaljs/browser-errors.\"\r\n    },\r\n    nativeBrokerCalledBeforeInitialize: {\r\n        code: \"native_broker_called_before_initialize\",\r\n        desc: \"You must call and await the initialize function before attempting to call any other MSAL API when native brokering is enabled. For more please visit aka.ms/msaljs/browser-errors.\"\r\n    },\r\n    nativePromptNotSupported: {\r\n        code: \"native_prompt_not_supported\",\r\n        desc: \"The provided prompt is not supported by the native platform. This request should be routed to the web based flow.\"\r\n    }\r\n};\r\n\r\n/**\r\n * Browser library error class thrown by the MSAL.js library for SPAs\r\n */\r\nexport class BrowserAuthError extends AuthError {\r\n\r\n    constructor(errorCode: string, errorMessage?: string) {\r\n        super(errorCode, errorMessage);\r\n\r\n        Object.setPrototypeOf(this, BrowserAuthError.prototype);\r\n        this.name = \"BrowserAuthError\";\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when PKCE is not implemented.\r\n     * @param errDetail\r\n     */\r\n    static createPkceNotGeneratedError(errDetail: string): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.pkceNotGenerated.code,\r\n            `${BrowserAuthErrorMessage.pkceNotGenerated.desc} Detail:${errDetail}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the crypto object is unavailable.\r\n     * @param errDetail\r\n     */\r\n    static createCryptoNotAvailableError(errDetail: string): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.cryptoDoesNotExist.code,\r\n            `${BrowserAuthErrorMessage.cryptoDoesNotExist.desc} Detail:${errDetail}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when an HTTP method hasn't been implemented by the browser class.\r\n     * @param method\r\n     */\r\n    static createHttpMethodNotImplementedError(method: string): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.httpMethodNotImplementedError.code,\r\n            `${BrowserAuthErrorMessage.httpMethodNotImplementedError.desc} Given Method: ${method}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the navigation URI is empty.\r\n     */\r\n    static createEmptyNavigationUriError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.emptyNavigateUriError.code, BrowserAuthErrorMessage.emptyNavigateUriError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the hash string value is unexpectedly empty.\r\n     * @param hashValue\r\n     */\r\n    static createEmptyHashError(hashValue: string): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.hashEmptyError.code, `${BrowserAuthErrorMessage.hashEmptyError.desc} Given Url: ${hashValue}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the hash string value is unexpectedly empty.\r\n     */\r\n    static createHashDoesNotContainStateError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.hashDoesNotContainStateError.code, BrowserAuthErrorMessage.hashDoesNotContainStateError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the hash string value does not contain known properties\r\n     */\r\n    static createHashDoesNotContainKnownPropertiesError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.hashDoesNotContainKnownPropertiesError.code, BrowserAuthErrorMessage.hashDoesNotContainKnownPropertiesError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the hash string value is unexpectedly empty.\r\n     */\r\n    static createUnableToParseStateError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.unableToParseStateError.code, BrowserAuthErrorMessage.unableToParseStateError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the state value in the hash does not match the interaction type of the API attempting to consume it.\r\n     */\r\n    static createStateInteractionTypeMismatchError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.stateInteractionTypeMismatchError.code, BrowserAuthErrorMessage.stateInteractionTypeMismatchError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when a browser interaction (redirect or popup) is in progress.\r\n     */\r\n    static createInteractionInProgressError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.interactionInProgress.code, BrowserAuthErrorMessage.interactionInProgress.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the popup window could not be opened.\r\n     * @param errDetail\r\n     */\r\n    static createPopupWindowError(errDetail?: string): BrowserAuthError {\r\n        let errorMessage = BrowserAuthErrorMessage.popupWindowError.desc;\r\n        errorMessage = !StringUtils.isEmpty(errDetail) ? `${errorMessage} Details: ${errDetail}` : errorMessage;\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.popupWindowError.code, errorMessage);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when window.open returns an empty window object.\r\n     * @param errDetail\r\n     */\r\n    static createEmptyWindowCreatedError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.emptyWindowError.code, BrowserAuthErrorMessage.emptyWindowError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the user closes a popup.\r\n     */\r\n    static createUserCancelledError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.userCancelledError.code,\r\n            BrowserAuthErrorMessage.userCancelledError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when monitorPopupFromHash times out for a given popup.\r\n     */\r\n    static createMonitorPopupTimeoutError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.monitorPopupTimeoutError.code,\r\n            BrowserAuthErrorMessage.monitorPopupTimeoutError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when monitorIframeFromHash times out for a given iframe.\r\n     */\r\n    static createMonitorIframeTimeoutError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.monitorIframeTimeoutError.code,\r\n            BrowserAuthErrorMessage.monitorIframeTimeoutError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when navigateWindow is called inside an iframe or brokered applications.\r\n     * @param windowParentCheck\r\n     */\r\n    static createRedirectInIframeError(windowParentCheck: boolean): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.redirectInIframeError.code,\r\n            `${BrowserAuthErrorMessage.redirectInIframeError.desc} (window.parent !== window) => ${windowParentCheck}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when an auth reload is done inside an iframe.\r\n     */\r\n    static createBlockReloadInHiddenIframeError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.blockTokenRequestsInHiddenIframeError.code,\r\n            BrowserAuthErrorMessage.blockTokenRequestsInHiddenIframeError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when a popup attempts to call an acquireToken API\r\n     * @returns\r\n     */\r\n    static createBlockAcquireTokenInPopupsError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.blockAcquireTokenInPopupsError.code,\r\n            BrowserAuthErrorMessage.blockAcquireTokenInPopupsError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when an iframe is found to be closed before the timeout is reached.\r\n     */\r\n    static createIframeClosedPrematurelyError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.iframeClosedPrematurelyError.code, BrowserAuthErrorMessage.iframeClosedPrematurelyError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the logout API is called on any of the silent interaction clients\r\n     */\r\n    static createSilentLogoutUnsupportedError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.silentLogoutUnsupportedError.code, BrowserAuthErrorMessage.silentLogoutUnsupportedError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the account object is not provided in the acquireTokenSilent API.\r\n     */\r\n    static createNoAccountError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.noAccountError.code, BrowserAuthErrorMessage.noAccountError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when a given prompt value is invalid for silent requests.\r\n     */\r\n    static createSilentPromptValueError(givenPrompt: string): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.silentPromptValueError.code, `${BrowserAuthErrorMessage.silentPromptValueError.desc} Given value: ${givenPrompt}`);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the cached token request could not be retrieved from the cache\r\n     */\r\n    static createUnableToParseTokenRequestCacheError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.unableToParseTokenRequestCacheError.code,\r\n            BrowserAuthErrorMessage.unableToParseTokenRequestCacheError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the token request could not be retrieved from the cache\r\n     */\r\n    static createNoTokenRequestCacheError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.noTokenRequestCacheError.code,\r\n            BrowserAuthErrorMessage.noTokenRequestCacheError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when handleCodeResponse is called before initiateAuthRequest (InteractionHandler)\r\n     */\r\n    static createAuthRequestNotSetError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.authRequestNotSet.code,\r\n            BrowserAuthErrorMessage.authRequestNotSet.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the authority could not be retrieved from the cache\r\n     */\r\n    static createNoCachedAuthorityError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.noCachedAuthorityError.code,\r\n            BrowserAuthErrorMessage.noCachedAuthorityError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown if cache type is invalid.\r\n     */\r\n    static createInvalidCacheTypeError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.invalidCacheType.code, `${BrowserAuthErrorMessage.invalidCacheType.desc}`);\r\n    }\r\n\r\n    /**\r\n     * Create an error thrown when login and token requests are made from a non-browser environment\r\n     */\r\n    static createNonBrowserEnvironmentError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.notInBrowserEnvironment.code, BrowserAuthErrorMessage.notInBrowserEnvironment.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error thrown when indexDB database is not open\r\n     */\r\n    static createDatabaseNotOpenError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.databaseNotOpen.code, BrowserAuthErrorMessage.databaseNotOpen.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error thrown when token fetch fails due to no internet\r\n     */\r\n    static createNoNetworkConnectivityError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.noNetworkConnectivity.code, BrowserAuthErrorMessage.noNetworkConnectivity.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error thrown when token fetch fails due to reasons other than internet connectivity\r\n     */\r\n    static createPostRequestFailedError(errorDesc: string, endpoint: string): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.postRequestFailed.code, `${BrowserAuthErrorMessage.postRequestFailed.desc} | Network client threw: ${errorDesc} | Attempted to reach: ${endpoint.split(\"?\")[0]}`);\r\n    }\r\n\r\n    /**\r\n     * Create an error thrown when get request fails due to reasons other than internet connectivity\r\n     */\r\n    static createGetRequestFailedError(errorDesc: string, endpoint: string): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.getRequestFailed.code, `${BrowserAuthErrorMessage.getRequestFailed.desc} | Network client threw: ${errorDesc} | Attempted to reach: ${endpoint.split(\"?\")[0]}`);\r\n    }\r\n\r\n    /**\r\n     * Create an error thrown when network client fails to parse network response\r\n     */\r\n    static createFailedToParseNetworkResponseError(endpoint: string): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.failedToParseNetworkResponse.code, `${BrowserAuthErrorMessage.failedToParseNetworkResponse.desc} | Attempted to reach: ${endpoint.split(\"?\")[0]}`);\r\n    }\r\n\r\n    /**\r\n     * Create an error thrown when the necessary information is not available to sideload tokens\r\n     */\r\n    static createUnableToLoadTokenError(errorDetail: string): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.unableToLoadTokenError.code, `${BrowserAuthErrorMessage.unableToLoadTokenError.desc} | ${errorDetail}`);\r\n    }\r\n\r\n    /**\r\n     * Create an error thrown when the queried cryptographic key is not found in IndexedDB\r\n     */\r\n    static createSigningKeyNotFoundInStorageError(keyId: string): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.signingKeyNotFoundInStorage.code, `${BrowserAuthErrorMessage.signingKeyNotFoundInStorage.desc} | No match found for KeyId: ${keyId}`);\r\n    }\r\n\r\n    /**\r\n     * Create an error when an authorization code is required but not provided\r\n     */\r\n    static createAuthCodeRequiredError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.authCodeRequired.code, BrowserAuthErrorMessage.authCodeRequired.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error when an authorization code or native account ID is required but not provided\r\n     */\r\n    static createAuthCodeOrNativeAccountIdRequiredError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.authCodeOrNativeAccountRequired.code, BrowserAuthErrorMessage.authCodeOrNativeAccountRequired.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error when both authorization code and native account ID are provided\r\n     */\r\n    static createSpaCodeAndNativeAccountIdPresentError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.spaCodeAndNativeAccountPresent.code, BrowserAuthErrorMessage.spaCodeAndNativeAccountPresent.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error when IndexedDB is unavailable\r\n     */\r\n    static createDatabaseUnavailableError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.databaseUnavailable.code, BrowserAuthErrorMessage.databaseUnavailable.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error when native token acquisition is not possible\r\n     */\r\n    static createUnableToAcquireTokenFromNativePlatformError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.unableToAcquireTokenFromNativePlatform.code, BrowserAuthErrorMessage.unableToAcquireTokenFromNativePlatform.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error thrown when Handshake with browser extension times out\r\n     */\r\n    static createNativeHandshakeTimeoutError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.nativeHandshakeTimeout.code, BrowserAuthErrorMessage.nativeHandshakeTimeout.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error thrown when browser extension is not installed\r\n     */\r\n    static createNativeExtensionNotInstalledError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.nativeExtensionNotInstalled.code, BrowserAuthErrorMessage.nativeExtensionNotInstalled.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error when native connection has not been established\r\n     * @returns\r\n     */\r\n    static createNativeConnectionNotEstablishedError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.nativeConnectionNotEstablished.code, BrowserAuthErrorMessage.nativeConnectionNotEstablished.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error thrown when the initialize function hasn't been called\r\n     */\r\n    static createNativeBrokerCalledBeforeInitialize(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.nativeBrokerCalledBeforeInitialize.code, BrowserAuthErrorMessage.nativeBrokerCalledBeforeInitialize.desc);\r\n    }\r\n\r\n    /**\r\n     * Create an error thrown when requesting a token directly from the native platform with an unsupported prompt parameter e.g. select_account, login or create\r\n     * These requests must go through eSTS to ensure eSTS is aware of the new account\r\n     */\r\n    static createNativePromptParameterNotSupportedError(): BrowserAuthError {\r\n        return new BrowserAuthError(BrowserAuthErrorMessage.nativePromptNotSupported.code, BrowserAuthErrorMessage.nativePromptNotSupported.desc);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthError } from \"@azure/msal-common\";\r\n\r\n/**\r\n * BrowserAuthErrorMessage class containing string constants used by error codes and messages.\r\n */\r\nexport const BrowserConfigurationAuthErrorMessage = {\r\n    redirectUriNotSet: {\r\n        code: \"redirect_uri_empty\",\r\n        desc: \"A redirect URI is required for all calls, and none has been set.\"\r\n    },\r\n    postLogoutUriNotSet: {\r\n        code: \"post_logout_uri_empty\",\r\n        desc: \"A post logout redirect has not been set.\"\r\n    },\r\n    storageNotSupportedError: {\r\n        code: \"storage_not_supported\",\r\n        desc: \"Given storage configuration option was not supported.\"\r\n    },\r\n    noRedirectCallbacksSet: {\r\n        code: \"no_redirect_callbacks\",\r\n        desc: \"No redirect callbacks have been set. Please call setRedirectCallbacks() with the appropriate function arguments before continuing. \" +\r\n            \"More information is available here: https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/MSAL-basics.\"\r\n    },\r\n    invalidCallbackObject: {\r\n        code: \"invalid_callback_object\",\r\n        desc: \"The object passed for the callback was invalid. \" +\r\n          \"More information is available here: https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/MSAL-basics.\"\r\n    },\r\n    stubPcaInstanceCalled: {\r\n        code: \"stubbed_public_client_application_called\",\r\n        desc: \"Stub instance of Public Client Application was called. If using msal-react, please ensure context is not used without a provider. For more visit: aka.ms/msaljs/browser-errors\"\r\n    },\r\n    inMemRedirectUnavailable: {\r\n        code: \"in_mem_redirect_unavailable\",\r\n        desc: \"Redirect cannot be supported. In-memory storage was selected and storeAuthStateInCookie=false, which would cause the library to be unable to handle the incoming hash. If you would like to use the redirect API, please use session/localStorage or set storeAuthStateInCookie=true.\"\r\n    },\r\n    entropyNotProvided: {\r\n        code: \"entropy_not_provided\",\r\n        desc: \"The available browser crypto interface requires entropy set via system.cryptoOptions.entropy configuration option.\"\r\n    }\r\n};\r\n\r\n/**\r\n * Browser library error class thrown by the MSAL.js library for SPAs\r\n */\r\nexport class BrowserConfigurationAuthError extends AuthError {\r\n\r\n    constructor(errorCode: string, errorMessage?: string) {\r\n        super(errorCode, errorMessage);\r\n        this.name = \"BrowserConfigurationAuthError\";\r\n\r\n        Object.setPrototypeOf(this, BrowserConfigurationAuthError.prototype);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the redirect uri is empty (not set by caller)\r\n     */\r\n    static createRedirectUriEmptyError(): BrowserConfigurationAuthError {\r\n        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.redirectUriNotSet.code,\r\n            BrowserConfigurationAuthErrorMessage.redirectUriNotSet.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the post-logout redirect uri is empty (not set by caller)\r\n     */\r\n    static createPostLogoutRedirectUriEmptyError(): BrowserConfigurationAuthError {\r\n        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.postLogoutUriNotSet.code,\r\n            BrowserConfigurationAuthErrorMessage.postLogoutUriNotSet.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates error thrown when given storage location is not supported.\r\n     * @param givenStorageLocation \r\n     */\r\n    static createStorageNotSupportedError(givenStorageLocation: string): BrowserConfigurationAuthError {\r\n        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.storageNotSupportedError.code, `${BrowserConfigurationAuthErrorMessage.storageNotSupportedError.desc} Given Location: ${givenStorageLocation}`);\r\n    }\r\n\r\n    /**\r\n     * Creates error thrown when redirect callbacks are not set before calling loginRedirect() or acquireTokenRedirect().\r\n     */\r\n    static createRedirectCallbacksNotSetError(): BrowserConfigurationAuthError {\r\n        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.noRedirectCallbacksSet.code, \r\n            BrowserConfigurationAuthErrorMessage.noRedirectCallbacksSet.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates error thrown when the stub instance of PublicClientApplication is called.\r\n     */\r\n    static createStubPcaInstanceCalledError(): BrowserConfigurationAuthError {\r\n        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.stubPcaInstanceCalled.code,\r\n            BrowserConfigurationAuthErrorMessage.stubPcaInstanceCalled.desc);\r\n    }\r\n\r\n    /*\r\n     * Create an error thrown when in-memory storage is used and storeAuthStateInCookie=false.\r\n     */\r\n    static createInMemoryRedirectUnavailableError(): BrowserConfigurationAuthError {\r\n        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.inMemRedirectUnavailable.code, BrowserConfigurationAuthErrorMessage.inMemRedirectUnavailable.desc);\r\n    }\r\n    \r\n    /**\r\n     * Creates an error thrown when a crypto interface that requires entropy is initialized without entropy\r\n     */\r\n    static createEntropyNotProvided(): BrowserConfigurationAuthError {\r\n        return new BrowserConfigurationAuthError(BrowserConfigurationAuthErrorMessage.entropyNotProvided.code, BrowserConfigurationAuthErrorMessage.entropyNotProvided.desc);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n/**\r\n * Enumeration of operations that are instrumented by have their performance measured by the PerformanceClient.\r\n *\r\n * @export\r\n * @enum {number}\r\n */\r\nexport enum PerformanceEvents {\r\n\r\n    /**\r\n     * acquireTokenByCode API (msal-browser and msal-node).\r\n     * Used to acquire tokens by trading an authorization code against the token endpoint.\r\n     */\r\n    AcquireTokenByCode = \"acquireTokenByCode\",\r\n\r\n    /**\r\n     * acquireTokenByRefreshToken API (msal-browser and msal-node).\r\n     * Used to renew an access token using a refresh token against the token endpoint.\r\n     */\r\n    AcquireTokenByRefreshToken = \"acquireTokenByRefreshToken\",\r\n\r\n    /**\r\n     * acquireTokenSilent API (msal-browser and msal-node).\r\n     * Used to silently acquire a new access token (from the cache or the network).\r\n     */\r\n    AcquireTokenSilent = \"acquireTokenSilent\",\r\n\r\n    /**\r\n     * acquireTokenSilentAsync (msal-browser).\r\n     * Internal API for acquireTokenSilent.\r\n     */\r\n    AcquireTokenSilentAsync = \"acquireTokenSilentAsync\",\r\n\r\n    /**\r\n     * acquireTokenPopup (msal-browser).\r\n     * Used to acquire a new access token interactively through pop ups\r\n     */\r\n    AcquireTokenPopup = \"acquireTokenPopup\",\r\n\r\n    /**\r\n     * getPublicKeyThumbprint API in CryptoOpts class (msal-browser).\r\n     * Used to generate a public/private keypair and generate a public key thumbprint for pop requests.\r\n     */\r\n    CryptoOptsGetPublicKeyThumbprint = \"cryptoOptsGetPublicKeyThumbprint\",\r\n\r\n    /**\r\n     * signJwt API in CryptoOpts class (msal-browser).\r\n     * Used to signed a pop token.\r\n     */\r\n    CryptoOptsSignJwt = \"cryptoOptsSignJwt\",\r\n\r\n    /**\r\n     * acquireToken API in the SilentCacheClient class (msal-browser).\r\n     * Used to read access tokens from the cache.\r\n     */\r\n    SilentCacheClientAcquireToken = \"silentCacheClientAcquireToken\",\r\n\r\n    /**\r\n     * acquireToken API in the SilentIframeClient class (msal-browser).\r\n     * Used to acquire a new set of tokens from the authorize endpoint in a hidden iframe.\r\n     */\r\n    SilentIframeClientAcquireToken = \"silentIframeClientAcquireToken\",\r\n\r\n    /**\r\n     * acquireToken API in SilentRereshClient (msal-browser).\r\n     * Used to acquire a new set of tokens from the token endpoint using a refresh token.\r\n     */\r\n    SilentRefreshClientAcquireToken = \"silentRefreshClientAcquireToken\",\r\n\r\n    /**\r\n     * ssoSilent API (msal-browser).\r\n     * Used to silently acquire an authorization code and set of tokens using a hidden iframe.\r\n     */\r\n    SsoSilent = \"ssoSilent\",\r\n\r\n    /**\r\n     * getDiscoveredAuthority API in StandardInteractionClient class (msal-browser).\r\n     * Used to load authority metadata for a request.\r\n     */\r\n    StandardInteractionClientGetDiscoveredAuthority = \"standardInteractionClientGetDiscoveredAuthority\",\r\n\r\n    /**\r\n     * acquireToken APIs in msal-browser.\r\n     * Used to make an /authorize endpoint call with native brokering enabled.\r\n     */\r\n    FetchAccountIdWithNativeBroker = \"fetchAccountIdWithNativeBroker\",\r\n\r\n    /**\r\n     * acquireToken API in NativeInteractionClient class (msal-browser).\r\n     * Used to acquire a token from Native component when native brokering is enabled.\r\n     */\r\n    NativeInteractionClientAcquireToken = \"nativeInteractionClientAcquireToken\",\r\n    /**\r\n     * Time spent creating default headers for requests to token endpoint\r\n     */\r\n    BaseClientCreateTokenRequestHeaders = \"baseClientCreateTokenRequestHeaders\",\r\n    /**\r\n     * Used to measure the time taken for completing embedded-broker handshake (PW-Broker).\r\n     */\r\n    BrokerHandhshake = \"brokerHandshake\",\r\n    /**\r\n     * acquireTokenByRefreshToken API in BrokerClientApplication (PW-Broker) .\r\n     */\r\n    AcquireTokenByRefreshTokenInBroker = \"acquireTokenByRefreshTokenInBroker\",\r\n    /**\r\n     * Time taken for token acquisition by broker\r\n     */\r\n    AcquireTokenByBroker = \"acquireTokenByBroker\",\r\n\r\n    /**\r\n     * Time spent on the network for refresh token acquisition\r\n     */\r\n    RefreshTokenClientExecuteTokenRequest = \"refreshTokenClientExecuteTokenRequest\",\r\n\r\n    /**\r\n     * Time taken for acquiring refresh token , records RT size\r\n     */\r\n    RefreshTokenClientAcquireToken = \"refreshTokenClientAcquireToken\",\r\n\r\n    /**\r\n     * Time taken for acquiring cached refresh token\r\n     */\r\n    RefreshTokenClientAcquireTokenWithCachedRefreshToken = \"refreshTokenClientAcquireTokenWithCachedRefreshToken\",\r\n\r\n    /**\r\n     * acquireTokenByRefreshToken API in RefreshTokenClient (msal-common).\r\n     */\r\n    RefreshTokenClientAcquireTokenByRefreshToken = \"refreshTokenClientAcquireTokenByRefreshToken\",\r\n\r\n    /**\r\n     * Helper function to create token request body in RefreshTokenClient (msal-common).\r\n     */\r\n    RefreshTokenClientCreateTokenRequestBody = \"refreshTokenClientCreateTokenRequestBody\",\r\n\r\n    /**\r\n     * acquireTokenFromCache (msal-browser).\r\n     * Internal API for acquiring token from cache\r\n     */\r\n    AcquireTokenFromCache = \"acquireTokenFromCache\",\r\n\r\n    /**\r\n     * acquireTokenBySilentIframe (msal-browser).\r\n     * Internal API for acquiring token by silent Iframe\r\n     */\r\n    AcquireTokenBySilentIframe = \"acquireTokenBySilentIframe\",\r\n\r\n    /**\r\n     * Internal API for initializing base request in BaseInteractionClient (msal-browser)\r\n     */\r\n    InitializeBaseRequest = \"initializeBaseRequest\",\r\n\r\n    /**\r\n     * Internal API for initializing silent request in SilentCacheClient (msal-browser)\r\n     */\r\n    InitializeSilentRequest = \"initializeSilentRequest\",\r\n\r\n    InitializeClientApplication = \"initializeClientApplication\",\r\n\r\n    /**\r\n     * Helper function in SilentIframeClient class (msal-browser).\r\n     */\r\n    SilentIframeClientTokenHelper = \"silentIframeClientTokenHelper\",\r\n\r\n    /**\r\n     * SilentHandler\r\n     */\r\n    SilentHandlerInitiateAuthRequest = \"silentHandlerInitiateAuthRequest\",\r\n    SilentHandlerMonitorIframeForHash = \"silentHandlerMonitorIframeForHash\",\r\n    SilentHandlerLoadFrame = \"silentHandlerLoadFrame\",\r\n\r\n    /**\r\n     * Helper functions in StandardInteractionClient class (msal-browser)\r\n     */\r\n    StandardInteractionClientCreateAuthCodeClient = \"standardInteractionClientCreateAuthCodeClient\",\r\n    StandardInteractionClientGetClientConfiguration = \"standardInteractionClientGetClientConfiguration\",\r\n    StandardInteractionClientInitializeAuthorizationRequest = \"standardInteractionClientInitializeAuthorizationRequest\",\r\n    StandardInteractionClientInitializeAuthorizationCodeRequest = \"standardInteractionClientInitializeAuthorizationCodeRequest\",\r\n\r\n    /**\r\n     * getAuthCodeUrl API (msal-browser and msal-node).\r\n     */\r\n    GetAuthCodeUrl = \"getAuthCodeUrl\",\r\n\r\n    /**\r\n     * Functions from InteractionHandler (msal-browser)\r\n     */\r\n    HandleCodeResponseFromServer = \"handleCodeResponseFromServer\",\r\n    HandleCodeResponseFromHash = \"handleCodeResponseFromHash\",\r\n    UpdateTokenEndpointAuthority = \"updateTokenEndpointAuthority\",\r\n\r\n    /**\r\n     * APIs in Authorization Code Client (msal-common)\r\n     */\r\n    AuthClientAcquireToken = \"authClientAcquireToken\",\r\n    AuthClientExecuteTokenRequest = \"authClientExecuteTokenRequest\",\r\n    AuthClientCreateTokenRequestBody = \"authClientCreateTokenRequestBody\",\r\n    AuthClientCreateQueryString = \"authClientCreateQueryString\",\r\n\r\n    /**\r\n     * Generate functions in PopTokenGenerator (msal-common)\r\n     */\r\n    PopTokenGenerateCnf = \"popTokenGenerateCnf\",\r\n    PopTokenGenerateKid = \"popTokenGenerateKid\",\r\n\r\n    /**\r\n     * handleServerTokenResponse API in ResponseHandler (msal-common)\r\n     */\r\n    HandleServerTokenResponse = \"handleServerTokenResponse\",\r\n\r\n    /**\r\n     * Authority functions\r\n     */\r\n    AuthorityFactoryCreateDiscoveredInstance = \"authorityFactoryCreateDiscoveredInstance\",\r\n    AuthorityResolveEndpointsAsync = \"authorityResolveEndpointsAsync\",\r\n    AuthorityGetCloudDiscoveryMetadataFromNetwork = \"authorityGetCloudDiscoveryMetadataFromNetwork\",\r\n    AuthorityUpdateCloudDiscoveryMetadata = \"authorityUpdateCloudDiscoveryMetadata\",\r\n    AuthorityGetEndpointMetadataFromNetwork = \"authorityGetEndpointMetadataFromNetwork\",\r\n    AuthorityUpdateEndpointMetadata = \"authorityUpdateEndpointMetadata\",\r\n    AuthorityUpdateMetadataWithRegionalInformation = \"authorityUpdateMetadataWithRegionalInformation\",\r\n\r\n    /**\r\n     * Region Discovery functions\r\n     */\r\n    RegionDiscoveryDetectRegion = \"regionDiscoveryDetectRegion\",\r\n    RegionDiscoveryGetRegionFromIMDS = \"regionDiscoveryGetRegionFromIMDS\",\r\n    RegionDiscoveryGetCurrentVersion = \"regionDiscoveryGetCurrentVersion\",\r\n\r\n    AcquireTokenByCodeAsync = \"acquireTokenByCodeAsync\",\r\n\r\n    GetEndpointMetadataFromNetwork = \"getEndpointMetadataFromNetwork\",\r\n    GetCloudDiscoveryMetadataFromNetworkMeasurement = \"getCloudDiscoveryMetadataFromNetworkMeasurement\",\r\n\r\n    HandleRedirectPromiseMeasurement= \"handleRedirectPromiseMeasurement\",\r\n\r\n    UpdateCloudDiscoveryMetadataMeasurement = \"updateCloudDiscoveryMetadataMeasurement\",\r\n\r\n    UsernamePasswordClientAcquireToken = \"usernamePasswordClientAcquireToken\",\r\n\r\n    NativeMessageHandlerHandshake = \"nativeMessageHandlerHandshake\",\r\n\r\n    /**\r\n     * Cache operations\r\n     */\r\n    ClearTokensAndKeysWithClaims = \"clearTokensAndKeysWithClaims\",\r\n}\r\n\r\n/**\r\n * State of the performance event.\r\n *\r\n * @export\r\n * @enum {number}\r\n */\r\nexport enum PerformanceEventStatus {\r\n    NotStarted,\r\n    InProgress,\r\n    Completed\r\n}\r\n\r\n/**\r\n * Fields whose value will not change throughout a request\r\n */\r\nexport type StaticFields = {\r\n    /**\r\n     * The Silent Token Cache Lookup Policy\r\n     *\r\n     * @type {?(number | undefined)}\r\n     */\r\n    cacheLookupPolicy?: number | undefined,\r\n\r\n    /**\r\n     * Size of the id token\r\n     *\r\n     * @type {number}\r\n     */\r\n    idTokenSize?: number,\r\n\r\n    /**\r\n     *\r\n     * Size of the access token\r\n     *\r\n     * @type {number}\r\n     */\r\n\r\n    accessTokenSize?: number,\r\n\r\n    /**\r\n     *\r\n     * Size of the refresh token\r\n     *\r\n     * @type {number}\r\n     */\r\n\r\n    refreshTokenSize?: number | undefined,\r\n\r\n    /**\r\n     * Application name as specified by the app.\r\n     *\r\n     * @type {?string}\r\n     */\r\n    appName?: string,\r\n\r\n    /**\r\n     * Application version as specified by the app.\r\n     *\r\n     * @type {?string}\r\n     */\r\n    appVersion?: string,\r\n\r\n    /**\r\n     * The following are fields that may be emitted in native broker scenarios\r\n     */\r\n    extensionId?: string,\r\n    extensionVersion?: string\r\n    matsBrokerVersion?: string;\r\n    matsAccountJoinOnStart?: string;\r\n    matsAccountJoinOnEnd?: string;\r\n    matsDeviceJoin?: string;\r\n    matsPromptBehavior?: string;\r\n    matsApiErrorCode?: number;\r\n    matsUiVisible?: boolean;\r\n    matsSilentCode?: number;\r\n    matsSilentBiSubCode?: number;\r\n    matsSilentMessage?: string;\r\n    matsSilentStatus?: number;\r\n    matsHttpStatus?: number\r\n    matsHttpEventCount?: number;\r\n    httpVerToken?: string;\r\n    httpVerAuthority?: string;\r\n\r\n    /**\r\n     * Native broker fields\r\n     */\r\n    allowNativeBroker?: boolean;\r\n    extensionInstalled?: boolean;\r\n    extensionHandshakeTimeoutMs?: number;\r\n    extensionHandshakeTimedOut?: boolean;\r\n};\r\n\r\n/**\r\n * Fields whose value may change throughout a request\r\n */\r\nexport type Counters = {\r\n    visibilityChangeCount?: number;\r\n    incompleteSubsCount?: number;\r\n    /**\r\n     * Amount of times queued in the JS event queue.\r\n     *\r\n     * @type {?number}\r\n     */\r\n    queuedCount?: number\r\n    /**\r\n     * Amount of manually completed queue events.\r\n     *\r\n     * @type {?number}\r\n     */\r\n    queuedManuallyCompletedCount?: number;\r\n};\r\n\r\nexport type SubMeasurement = {\r\n    name: PerformanceEvents,\r\n    startTimeMs: number\r\n};\r\n\r\n/**\r\n * Performance measurement taken by the library, including metadata about the request and application.\r\n *\r\n * @export\r\n * @typedef {PerformanceEvent}\r\n */\r\nexport type PerformanceEvent = StaticFields & Counters & {\r\n    /**\r\n     * Unique id for the event\r\n     *\r\n     * @type {string}\r\n     */\r\n    eventId: string,\r\n\r\n    /**\r\n     * State of the perforance measure.\r\n     *\r\n     * @type {PerformanceEventStatus}\r\n     */\r\n    status: PerformanceEventStatus,\r\n\r\n    /**\r\n     * Login authority used for the request\r\n     *\r\n     * @type {string}\r\n     */\r\n    authority: string,\r\n\r\n    /**\r\n     * Client id for the application\r\n     *\r\n     * @type {string}\r\n     */\r\n    clientId: string\r\n\r\n    /**\r\n     * Correlation ID used for the request\r\n     *\r\n     * @type {string}\r\n     */\r\n    correlationId: string,\r\n\r\n    /**\r\n     * End-to-end duration in milliseconds.\r\n     * @date 3/22/2022 - 3:40:05 PM\r\n     *\r\n     * @type {number}\r\n     */\r\n    durationMs?: number,\r\n\r\n    /**\r\n     * Visibility of the page when the event completed.\r\n     * Read from: https://developer.mozilla.org/docs/Web/API/Page_Visibility_API\r\n     *\r\n     * @type {?(string | null)}\r\n     */\r\n    endPageVisibility?: string | null,\r\n\r\n    /**\r\n     * Whether the result was retrieved from the cache.\r\n     *\r\n     * @type {(boolean | null)}\r\n     */\r\n    fromCache?: boolean | null,\r\n\r\n    /**\r\n     * Event name (usually in the form of classNameFunctionName)\r\n     *\r\n     * @type {PerformanceEvents}\r\n     */\r\n    name: PerformanceEvents,\r\n\r\n    /**\r\n     * Visibility of the page when the event completed.\r\n     * Read from: https://developer.mozilla.org/docs/Web/API/Page_Visibility_API\r\n     *\r\n     * @type {?(string | null)}\r\n     */\r\n    startPageVisibility?: string | null,\r\n\r\n    /**\r\n     * Unix millisecond timestamp when the event was initiated.\r\n     *\r\n     * @type {number}\r\n     */\r\n    startTimeMs: number,\r\n\r\n    /**\r\n     * Whether or the operation completed successfully.\r\n     *\r\n     * @type {(boolean | null)}\r\n     */\r\n    success?: boolean | null,\r\n\r\n    /**\r\n     * Add specific error code in case of failure\r\n     *\r\n     * @type {string}\r\n     */\r\n    errorCode?: string,\r\n\r\n    /**\r\n     * Add specific sub error code in case of failure\r\n     *\r\n     * @type {string}\r\n     */\r\n    subErrorCode?: string,\r\n\r\n    /**\r\n     * Name of the library used for the operation.\r\n     *\r\n     * @type {string}\r\n     */\r\n    libraryName: string,\r\n\r\n    /**\r\n     * Version of the library used for the operation.\r\n     *\r\n     * @type {string}\r\n     */\r\n    libraryVersion: string,\r\n\r\n    /**\r\n     * Whether the response is from a native component (e.g., WAM)\r\n     *\r\n     * @type {?boolean}\r\n     */\r\n    isNativeBroker?: boolean,\r\n\r\n    /**\r\n     * Request ID returned from the response\r\n     *\r\n     * @type {?string}\r\n     */\r\n    requestId?: string\r\n\r\n    /**\r\n     * Cache lookup policy\r\n     *\r\n     * @type {?number}\r\n     */\r\n    cacheLookupPolicy?: number | undefined,\r\n\r\n    /**\r\n     * Amount of time spent in the JS queue in milliseconds.\r\n     *\r\n     * @type {?number}\r\n     */\r\n    queuedTimeMs?: number,\r\n\r\n    /**\r\n     * Sub-measurements for internal use. To be deleted before flushing.\r\n     */\r\n    incompleteSubMeasurements?: Map<string, SubMeasurement>\r\n};\r\n\r\nexport const IntFields: ReadonlySet<string> = new Set([\r\n    \"accessTokenSize\",\r\n    \"durationMs\",\r\n    \"idTokenSize\",\r\n    \"matsSilentStatus\",\r\n    \"matsHttpStatus\",\r\n    \"refreshTokenSize\",\r\n    \"queuedTimeMs\",\r\n    \"startTimeMs\",\r\n    \"status\",\r\n]);\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { BrowserConfigurationAuthError } from \"../error/BrowserConfigurationAuthError\";\r\nimport { BrowserCacheLocation } from \"../utils/BrowserConstants\";\r\nimport { IWindowStorage } from \"./IWindowStorage\";\r\n\r\nexport class BrowserStorage implements IWindowStorage<string> {\r\n\r\n    private windowStorage: Storage;\r\n\r\n    constructor(cacheLocation: string) {\r\n        this.validateWindowStorage(cacheLocation);\r\n        this.windowStorage = window[cacheLocation];\r\n    }\r\n\r\n    private validateWindowStorage(cacheLocation: string): void {\r\n        if (cacheLocation !== BrowserCacheLocation.LocalStorage && cacheLocation !== BrowserCacheLocation.SessionStorage) {\r\n            throw BrowserConfigurationAuthError.createStorageNotSupportedError(cacheLocation);\r\n        }\r\n        const storageSupported = !!window[cacheLocation];\r\n        if (!storageSupported) {\r\n            throw BrowserConfigurationAuthError.createStorageNotSupportedError(cacheLocation);\r\n        }\r\n    }\r\n\r\n    getItem(key: string): string | null {\r\n        return this.windowStorage.getItem(key);\r\n    }\r\n\r\n    setItem(key: string, value: string): void {\r\n        this.windowStorage.setItem(key, value);\r\n    }\r\n\r\n    removeItem(key: string): void {\r\n        this.windowStorage.removeItem(key);\r\n    }\r\n\r\n    getKeys(): string[] {\r\n        return Object.keys(this.windowStorage);\r\n    }\r\n\r\n    containsKey(key: string): boolean {\r\n        return this.windowStorage.hasOwnProperty(key);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { IWindowStorage } from \"./IWindowStorage\";\r\n\r\nexport class MemoryStorage<T> implements IWindowStorage<T> {\r\n\r\n    private cache: Map<string, T>;\r\n\r\n    constructor() {\r\n        this.cache = new Map<string, T>();\r\n    }\r\n\r\n    getItem(key: string): T | null {\r\n        return this.cache.get(key) || null;\r\n    }\r\n\r\n    setItem(key: string, value: T): void {\r\n        this.cache.set(key, value);\r\n    }\r\n\r\n    removeItem(key: string): void {\r\n        this.cache.delete(key);\r\n    }\r\n\r\n    getKeys(): string[] {\r\n        const cacheKeys: string[] = [];\r\n        this.cache.forEach((value: T, key: string) => {\r\n            cacheKeys.push(key);\r\n        });\r\n        return cacheKeys;\r\n    }\r\n\r\n    containsKey(key: string): boolean {\r\n        return this.cache.has(key);\r\n    }\r\n\r\n    clear() :void {\r\n        this.cache.clear();\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ServerAuthorizationCodeResponse } from \"../response/ServerAuthorizationCodeResponse\";\r\nimport { ClientConfigurationError } from \"../error/ClientConfigurationError\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\nimport { IUri } from \"./IUri\";\r\nimport { AADAuthorityConstants, Constants } from \"../utils/Constants\";\r\n\r\n/**\r\n * Url object class which can perform various transformations on url strings.\r\n */\r\nexport class UrlString {\r\n\r\n    // internal url string field\r\n    private _urlString: string;\r\n    public get urlString(): string {\r\n        return this._urlString;\r\n    }\r\n\r\n    constructor(url: string) {\r\n        this._urlString = url;\r\n        if (StringUtils.isEmpty(this._urlString)) {\r\n            // Throws error if url is empty\r\n            throw ClientConfigurationError.createUrlEmptyError();\r\n        }\r\n\r\n        if (StringUtils.isEmpty(this.getHash())) {\r\n            this._urlString = UrlString.canonicalizeUri(url);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Ensure urls are lower case and end with a / character.\r\n     * @param url\r\n     */\r\n    static canonicalizeUri(url: string): string {\r\n        if (url) {\r\n            let lowerCaseUrl = url.toLowerCase();\r\n\r\n            if (StringUtils.endsWith(lowerCaseUrl, \"?\")) {\r\n                lowerCaseUrl = lowerCaseUrl.slice(0, -1);\r\n            } else if (StringUtils.endsWith(lowerCaseUrl, \"?/\")) {\r\n                lowerCaseUrl = lowerCaseUrl.slice(0, -2);\r\n            }\r\n\r\n            if (!StringUtils.endsWith(lowerCaseUrl, \"/\")) {\r\n                lowerCaseUrl += \"/\";\r\n            }\r\n\r\n            return lowerCaseUrl;\r\n        }\r\n\r\n        return url;\r\n    }\r\n\r\n    /**\r\n     * Throws if urlString passed is not a valid authority URI string.\r\n     */\r\n    validateAsUri(): void {\r\n        // Attempts to parse url for uri components\r\n        let components;\r\n        try {\r\n            components = this.getUrlComponents();\r\n        } catch (e) {\r\n            throw ClientConfigurationError.createUrlParseError(e);\r\n        }\r\n\r\n        // Throw error if URI or path segments are not parseable.\r\n        if (!components.HostNameAndPort || !components.PathSegments) {\r\n            throw ClientConfigurationError.createUrlParseError(`Given url string: ${this.urlString}`);\r\n        }\r\n\r\n        // Throw error if uri is insecure.\r\n        if(!components.Protocol || components.Protocol.toLowerCase() !== \"https:\") {\r\n            throw ClientConfigurationError.createInsecureAuthorityUriError(this.urlString);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Given a url and a query string return the url with provided query string appended\r\n     * @param url\r\n     * @param queryString\r\n     */\r\n    static appendQueryString(url: string, queryString: string): string {\r\n        if (StringUtils.isEmpty(queryString)) {\r\n            return url;\r\n        }\r\n\r\n        return url.indexOf(\"?\") < 0 ? `${url}?${queryString}` : `${url}&${queryString}`;\r\n    }\r\n\r\n    /**\r\n     * Returns a url with the hash removed\r\n     * @param url\r\n     */\r\n    static removeHashFromUrl(url: string): string {\r\n        return UrlString.canonicalizeUri(url.split(\"#\")[0]);\r\n    }\r\n\r\n    /**\r\n     * Given a url like https://a:b/common/d?e=f#g, and a tenantId, returns https://a:b/tenantId/d\r\n     * @param href The url\r\n     * @param tenantId The tenant id to replace\r\n     */\r\n    replaceTenantPath(tenantId: string): UrlString {\r\n        const urlObject = this.getUrlComponents();\r\n        const pathArray = urlObject.PathSegments;\r\n        if (tenantId && (pathArray.length !== 0 && (pathArray[0] === AADAuthorityConstants.COMMON || pathArray[0] === AADAuthorityConstants.ORGANIZATIONS))) {\r\n            pathArray[0] = tenantId;\r\n        }\r\n        return UrlString.constructAuthorityUriFromObject(urlObject);\r\n    }\r\n\r\n    /**\r\n     * Returns the anchor part(#) of the URL\r\n     */\r\n    getHash(): string {\r\n        return UrlString.parseHash(this.urlString);\r\n    }\r\n\r\n    /**\r\n     * Parses out the components from a url string.\r\n     * @returns An object with the various components. Please cache this value insted of calling this multiple times on the same url.\r\n     */\r\n    getUrlComponents(): IUri {\r\n        // https://gist.github.com/curtisz/11139b2cfcaef4a261e0\r\n        const regEx = RegExp(\"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\\\?([^#]*))?(#(.*))?\");\r\n\r\n        // If url string does not match regEx, we throw an error\r\n        const match = this.urlString.match(regEx);\r\n        if (!match) {\r\n            throw ClientConfigurationError.createUrlParseError(`Given url string: ${this.urlString}`);\r\n        }\r\n\r\n        // Url component object\r\n        const urlComponents = {\r\n            Protocol: match[1],\r\n            HostNameAndPort: match[4],\r\n            AbsolutePath: match[5],\r\n            QueryString: match[7]\r\n        } as IUri;\r\n\r\n        let pathSegments = urlComponents.AbsolutePath.split(\"/\");\r\n        pathSegments = pathSegments.filter((val) => val && val.length > 0); // remove empty elements\r\n        urlComponents.PathSegments = pathSegments;\r\n\r\n        if (!StringUtils.isEmpty(urlComponents.QueryString) && urlComponents.QueryString.endsWith(\"/\")) {\r\n            urlComponents.QueryString = urlComponents.QueryString.substring(0, urlComponents.QueryString.length-1);\r\n        }\r\n        return urlComponents;\r\n    }\r\n\r\n    static getDomainFromUrl(url: string): string {\r\n        const regEx = RegExp(\"^([^:/?#]+://)?([^/?#]*)\");\r\n\r\n        const match = url.match(regEx);\r\n\r\n        if (!match) {\r\n            throw ClientConfigurationError.createUrlParseError(`Given url string: ${url}`);\r\n        }\r\n\r\n        return match[2];\r\n    }\r\n\r\n    static getAbsoluteUrl(relativeUrl: string, baseUrl: string): string {\r\n        if (relativeUrl[0] === Constants.FORWARD_SLASH) {\r\n            const url = new UrlString(baseUrl);\r\n            const baseComponents = url.getUrlComponents();\r\n\r\n            return baseComponents.Protocol + \"//\" + baseComponents.HostNameAndPort + relativeUrl;\r\n        }\r\n\r\n        return relativeUrl;\r\n    }\r\n\r\n    /**\r\n     * Parses hash string from given string. Returns empty string if no hash symbol is found.\r\n     * @param hashString\r\n     */\r\n    static parseHash(hashString: string): string {\r\n        const hashIndex1 = hashString.indexOf(\"#\");\r\n        const hashIndex2 = hashString.indexOf(\"#/\");\r\n        if (hashIndex2 > -1) {\r\n            return hashString.substring(hashIndex2 + 2);\r\n        } else if (hashIndex1 > -1) {\r\n            return hashString.substring(hashIndex1 + 1);\r\n        }\r\n        return Constants.EMPTY_STRING;\r\n    }\r\n\r\n    /**\r\n     * Parses query string from given string. Returns empty string if no query symbol is found.\r\n     * @param queryString\r\n     */\r\n    static parseQueryString(queryString: string): string {\r\n        const queryIndex1 = queryString.indexOf(\"?\");\r\n        const queryIndex2 = queryString.indexOf(\"/?\");\r\n        if (queryIndex2 > -1) {\r\n            return queryString.substring(queryIndex2 + 2);\r\n        } else if (queryIndex1 > -1) {\r\n            return queryString.substring(queryIndex1 + 1);\r\n        }\r\n        return Constants.EMPTY_STRING;\r\n    }\r\n\r\n    static constructAuthorityUriFromObject(urlObject: IUri): UrlString {\r\n        return new UrlString(urlObject.Protocol + \"//\" + urlObject.HostNameAndPort + \"/\" + urlObject.PathSegments.join(\"/\"));\r\n    }\r\n\r\n    /**\r\n     * Returns URL hash as server auth code response object.\r\n     */\r\n    static getDeserializedHash(hash: string): ServerAuthorizationCodeResponse {\r\n        // Check if given hash is empty\r\n        if (StringUtils.isEmpty(hash)) {\r\n            return {};\r\n        }\r\n        // Strip the # symbol if present\r\n        const parsedHash = UrlString.parseHash(hash);\r\n        // If # symbol was not present, above will return empty string, so give original hash value\r\n        const deserializedHash: ServerAuthorizationCodeResponse = StringUtils.queryStringToObject<ServerAuthorizationCodeResponse>(StringUtils.isEmpty(parsedHash) ? hash : parsedHash);\r\n        // Check if deserialization didn't work\r\n        if (!deserializedHash) {\r\n            throw ClientAuthError.createHashNotDeserializedError(JSON.stringify(deserializedHash));\r\n        }\r\n        return deserializedHash;\r\n    }\r\n\r\n    /**\r\n     * Returns URL query string as server auth code response object.\r\n     */\r\n    static getDeserializedQueryString(query: string): ServerAuthorizationCodeResponse {\r\n        // Check if given query is empty\r\n        if (StringUtils.isEmpty(query)) {\r\n            return {};\r\n        }\r\n        // Strip the ? symbol if present\r\n        const parsedQueryString = UrlString.parseQueryString(query);\r\n        // If ? symbol was not present, above will return empty string, so give original query value\r\n        const deserializedQueryString: ServerAuthorizationCodeResponse = StringUtils.queryStringToObject<ServerAuthorizationCodeResponse>(StringUtils.isEmpty(parsedQueryString) ? query : parsedQueryString);\r\n        // Check if deserialization didn't work\r\n        if (!deserializedQueryString) {\r\n            throw ClientAuthError.createHashNotDeserializedError(JSON.stringify(deserializedQueryString));\r\n        }\r\n        return deserializedQueryString;\r\n    }\r\n\r\n    /**\r\n     * Check if the hash of the URL string contains known properties\r\n     */\r\n    static hashContainsKnownProperties(hash: string): boolean {\r\n        if (StringUtils.isEmpty(hash) || hash.indexOf(\"=\") < 0) {\r\n            // Hash doesn't contain key/value pairs\r\n            return false;\r\n        }\r\n\r\n        const parameters: ServerAuthorizationCodeResponse = UrlString.getDeserializedHash(hash);\r\n        return !!(\r\n            parameters.code ||\r\n            parameters.error_description ||\r\n            parameters.error ||\r\n            parameters.state\r\n        );\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { InteractionType } from \"./BrowserConstants\";\r\nimport { StringUtils, ClientAuthError, ICrypto, RequestStateObject, ProtocolUtils, ServerAuthorizationCodeResponse, UrlString } from \"@azure/msal-common\";\r\n\r\nexport type BrowserStateObject = {\r\n    interactionType: InteractionType\r\n};\r\n\r\nexport class BrowserProtocolUtils {\r\n\r\n    /**\r\n     * Extracts the BrowserStateObject from the state string.\r\n     * @param browserCrypto \r\n     * @param state \r\n     */\r\n    static extractBrowserRequestState(browserCrypto: ICrypto, state: string): BrowserStateObject | null {\r\n        if (StringUtils.isEmpty(state)) {\r\n            return null;\r\n        }\r\n\r\n        try {\r\n            const requestStateObj: RequestStateObject = ProtocolUtils.parseRequestState(browserCrypto, state);\r\n            return requestStateObj.libraryState.meta as BrowserStateObject;\r\n        } catch (e) {\r\n            throw ClientAuthError.createInvalidStateError(state, e);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Parses properties of server response from url hash\r\n     * @param locationHash Hash from url\r\n     */\r\n    static parseServerResponseFromHash(locationHash: string): ServerAuthorizationCodeResponse {\r\n        if (!locationHash) {\r\n            return {};\r\n        }\r\n        \r\n        const hashUrlString = new UrlString(locationHash);\r\n        return UrlString.getDeserializedHash(hashUrlString.getHash());\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Constants, PersistentCacheKeys, StringUtils, CommonAuthorizationCodeRequest, ICrypto, AccountEntity, IdTokenEntity, AccessTokenEntity, RefreshTokenEntity, AppMetadataEntity, CacheManager, ServerTelemetryEntity, ThrottlingEntity, ProtocolUtils, Logger, AuthorityMetadataEntity, DEFAULT_CRYPTO_IMPLEMENTATION, AccountInfo, ActiveAccountFilters, CcsCredential, CcsCredentialType, IdToken, ValidCredentialType, ClientAuthError, TokenKeys, CredentialType, AuthenticationResult, AuthenticationScheme, CacheRecord } from \"@azure/msal-common\";\r\nimport { CacheOptions } from \"../config/Configuration\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { BrowserCacheLocation, InteractionType, TemporaryCacheKeys, InMemoryCacheKeys, StaticCacheKeys } from \"../utils/BrowserConstants\";\r\nimport { BrowserStorage } from \"./BrowserStorage\";\r\nimport { MemoryStorage } from \"./MemoryStorage\";\r\nimport { IWindowStorage } from \"./IWindowStorage\";\r\nimport { BrowserProtocolUtils } from \"../utils/BrowserProtocolUtils\";\r\nimport { NativeTokenRequest } from \"../broker/nativeBroker/NativeRequest\";\r\nimport { SilentRequest } from \"../request/SilentRequest\";\r\nimport { SsoSilentRequest } from \"../request/SsoSilentRequest\";\r\nimport { RedirectRequest } from \"../request/RedirectRequest\";\r\nimport { PopupRequest } from \"../request/PopupRequest\";\r\n\r\n/**\r\n * This class implements the cache storage interface for MSAL through browser local or session storage.\r\n * Cookies are only used if storeAuthStateInCookie is true, and are only used for\r\n * parameters such as state and nonce, generally.\r\n */\r\nexport class BrowserCacheManager extends CacheManager {\r\n\r\n    // Cache configuration, either set by user or default values.\r\n    protected cacheConfig: Required<CacheOptions>;\r\n    // Window storage object (either local or sessionStorage)\r\n    protected browserStorage: IWindowStorage<string>;\r\n    // Internal in-memory storage object used for data used by msal that does not need to persist across page loads\r\n    protected internalStorage: MemoryStorage<string>;\r\n    // Temporary cache\r\n    protected temporaryCacheStorage: IWindowStorage<string>;\r\n    // Logger instance\r\n    protected logger: Logger;\r\n\r\n    // Cookie life calculation (hours * minutes * seconds * ms)\r\n    protected readonly COOKIE_LIFE_MULTIPLIER = 24 * 60 * 60 * 1000;\r\n\r\n    constructor(clientId: string, cacheConfig: Required<CacheOptions>, cryptoImpl: ICrypto, logger: Logger) {\r\n        super(clientId, cryptoImpl, logger);\r\n        this.cacheConfig = cacheConfig;\r\n        this.logger = logger;\r\n        this.internalStorage = new MemoryStorage();\r\n        this.browserStorage = this.setupBrowserStorage(this.cacheConfig.cacheLocation);\r\n        this.temporaryCacheStorage = this.setupTemporaryCacheStorage(this.cacheConfig.temporaryCacheLocation, this.cacheConfig.cacheLocation);\r\n\r\n        // Migrate cache entries from older versions of MSAL.\r\n        if (cacheConfig.cacheMigrationEnabled) {\r\n            this.migrateCacheEntries();\r\n            this.createKeyMaps();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Returns a window storage class implementing the IWindowStorage interface that corresponds to the configured cacheLocation.\r\n     * @param cacheLocation\r\n     */\r\n    protected setupBrowserStorage(cacheLocation: BrowserCacheLocation | string): IWindowStorage<string> {\r\n        switch (cacheLocation) {\r\n            case BrowserCacheLocation.LocalStorage:\r\n            case BrowserCacheLocation.SessionStorage:\r\n                try {\r\n                    return new BrowserStorage(cacheLocation);\r\n                } catch (e) {\r\n                    this.logger.verbose(e);\r\n                    break;\r\n                }\r\n            case BrowserCacheLocation.MemoryStorage:\r\n            default:\r\n                break;\r\n        }\r\n        this.cacheConfig.cacheLocation = BrowserCacheLocation.MemoryStorage;\r\n        return new MemoryStorage();\r\n    }\r\n\r\n    /**\r\n     * Returns a window storage class implementing the IWindowStorage interface that corresponds to the configured temporaryCacheLocation.\r\n     * @param temporaryCacheLocation\r\n     * @param cacheLocation\r\n     */\r\n    protected setupTemporaryCacheStorage(temporaryCacheLocation: BrowserCacheLocation | string, cacheLocation: BrowserCacheLocation | string): IWindowStorage<string> {\r\n        switch (cacheLocation) {\r\n            case BrowserCacheLocation.LocalStorage:\r\n            case BrowserCacheLocation.SessionStorage:\r\n                try {\r\n                    /*\r\n                     * When users do not explicitly choose their own temporaryCacheLocation, \r\n                     * temporary cache items will always be stored in session storage to mitigate problems caused by multiple tabs\r\n                     */\r\n                    return new BrowserStorage(temporaryCacheLocation || BrowserCacheLocation.SessionStorage);\r\n                } catch (e) {\r\n                    this.logger.verbose(e);\r\n                    return this.internalStorage;\r\n                }\r\n            case BrowserCacheLocation.MemoryStorage:\r\n            default:\r\n                return this.internalStorage;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Migrate all old cache entries to new schema. No rollback supported.\r\n     * @param storeAuthStateInCookie\r\n     */\r\n    protected migrateCacheEntries(): void {\r\n        const idTokenKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.ID_TOKEN}`;\r\n        const clientInfoKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.CLIENT_INFO}`;\r\n        const errorKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.ERROR}`;\r\n        const errorDescKey = `${Constants.CACHE_PREFIX}.${PersistentCacheKeys.ERROR_DESC}`;\r\n\r\n        const idTokenValue = this.browserStorage.getItem(idTokenKey);\r\n        const clientInfoValue = this.browserStorage.getItem(clientInfoKey);\r\n        const errorValue = this.browserStorage.getItem(errorKey);\r\n        const errorDescValue = this.browserStorage.getItem(errorDescKey);\r\n\r\n        const values = [idTokenValue, clientInfoValue, errorValue, errorDescValue];\r\n        const keysToMigrate = [PersistentCacheKeys.ID_TOKEN, PersistentCacheKeys.CLIENT_INFO, PersistentCacheKeys.ERROR, PersistentCacheKeys.ERROR_DESC];\r\n\r\n        keysToMigrate.forEach((cacheKey: string, index: number) => this.migrateCacheEntry(cacheKey, values[index]));\r\n    }\r\n\r\n    /**\r\n     * Utility function to help with migration.\r\n     * @param newKey\r\n     * @param value\r\n     * @param storeAuthStateInCookie\r\n     */\r\n    protected migrateCacheEntry(newKey: string, value: string | null): void {\r\n        if (value) {\r\n            this.setTemporaryCache(newKey, value, true);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Searches all cache entries for MSAL accounts and creates the account key map\r\n     * This is used to migrate users from older versions of MSAL which did not create the map.\r\n     * @returns \r\n     */\r\n    private createKeyMaps(): void {\r\n        this.logger.trace(\"BrowserCacheManager - createKeyMaps called.\");\r\n        const accountKeys = this.getItem(StaticCacheKeys.ACCOUNT_KEYS);\r\n        const tokenKeys = this.getItem(`${StaticCacheKeys.TOKEN_KEYS}.${this.clientId}`);\r\n        if (accountKeys && tokenKeys) {\r\n            this.logger.verbose(\"BrowserCacheManager:createKeyMaps - account and token key maps already exist, skipping migration.\");\r\n            // Key maps already exist, no need to iterate through cache\r\n            return;\r\n        }\r\n\r\n        const allKeys = this.browserStorage.getKeys();\r\n        allKeys.forEach((key) => {\r\n            if (this.isCredentialKey(key)) {\r\n                // Get item, parse, validate and write key to map\r\n                const value = this.getItem(key);\r\n                if (value) {\r\n                    const credObj = this.validateAndParseJson(value);\r\n                    if (credObj && credObj.hasOwnProperty(\"credentialType\")) {\r\n                        switch (credObj[\"credentialType\"]) {\r\n                            case CredentialType.ID_TOKEN:\r\n                                if (IdTokenEntity.isIdTokenEntity(credObj)) {\r\n                                    this.logger.trace(\"BrowserCacheManager:createKeyMaps - idToken found, saving key to token key map\");\r\n                                    this.logger.tracePii(`BrowserCacheManager:createKeyMaps - idToken with key: ${key} found, saving key to token key map`);\r\n                                    const idTokenEntity = CacheManager.toObject(new IdTokenEntity(), credObj);\r\n                                    const newKey = this.updateCredentialCacheKey(key, idTokenEntity);\r\n                                    this.addTokenKey(newKey, CredentialType.ID_TOKEN);\r\n                                    return;\r\n                                } else {\r\n                                    this.logger.trace(\"BrowserCacheManager:createKeyMaps - key found matching idToken schema with value containing idToken credentialType field but value failed IdTokenEntity validation, skipping.\");\r\n                                    this.logger.tracePii(`BrowserCacheManager:createKeyMaps - failed idToken validation on key: ${key}`);\r\n                                }\r\n                                break;\r\n                            case CredentialType.ACCESS_TOKEN:\r\n                            case CredentialType.ACCESS_TOKEN_WITH_AUTH_SCHEME:\r\n                                if (AccessTokenEntity.isAccessTokenEntity(credObj)) {\r\n                                    this.logger.trace(\"BrowserCacheManager:createKeyMaps - accessToken found, saving key to token key map\");\r\n                                    this.logger.tracePii(`BrowserCacheManager:createKeyMaps - accessToken with key: ${key} found, saving key to token key map`);\r\n                                    const accessTokenEntity = CacheManager.toObject(new AccessTokenEntity(), credObj);\r\n                                    const newKey = this.updateCredentialCacheKey(key, accessTokenEntity);\r\n                                    this.addTokenKey(newKey, CredentialType.ACCESS_TOKEN);\r\n                                    return;\r\n                                } else {\r\n                                    this.logger.trace(\"BrowserCacheManager:createKeyMaps - key found matching accessToken schema with value containing accessToken credentialType field but value failed AccessTokenEntity validation, skipping.\");\r\n                                    this.logger.tracePii(`BrowserCacheManager:createKeyMaps - failed accessToken validation on key: ${key}`);\r\n                                }\r\n                                break;\r\n                            case CredentialType.REFRESH_TOKEN:\r\n                                if (RefreshTokenEntity.isRefreshTokenEntity(credObj)) {\r\n                                    this.logger.trace(\"BrowserCacheManager:createKeyMaps - refreshToken found, saving key to token key map\");\r\n                                    this.logger.tracePii(`BrowserCacheManager:createKeyMaps - refreshToken with key: ${key} found, saving key to token key map`);\r\n                                    const refreshTokenEntity = CacheManager.toObject(new RefreshTokenEntity(), credObj);\r\n                                    const newKey = this.updateCredentialCacheKey(key, refreshTokenEntity);\r\n                                    this.addTokenKey(newKey, CredentialType.REFRESH_TOKEN);\r\n                                    return;\r\n                                } else {\r\n                                    this.logger.trace(\"BrowserCacheManager:createKeyMaps - key found matching refreshToken schema with value containing refreshToken credentialType field but value failed RefreshTokenEntity validation, skipping.\");\r\n                                    this.logger.tracePii(`BrowserCacheManager:createKeyMaps - failed refreshToken validation on key: ${key}`);\r\n                                }\r\n                                break;\r\n                            default:\r\n                                // If credentialType isn't one of our predefined ones, it may not be an MSAL cache value. Ignore.\r\n                        }\r\n                    }\r\n                }\r\n            } \r\n            \r\n            if (this.isAccountKey(key)) {\r\n                const value = this.getItem(key);\r\n                if (value) {\r\n                    const accountObj = this.validateAndParseJson(value);\r\n                    if (accountObj && AccountEntity.isAccountEntity(accountObj)) {\r\n                        this.logger.trace(\"BrowserCacheManager:createKeyMaps - account found, saving key to account key map\");\r\n                        this.logger.tracePii(`BrowserCacheManager:createKeyMaps - account with key: ${key} found, saving key to account key map`);\r\n                        this.addAccountKeyToMap(key);\r\n                    }\r\n                }\r\n            }\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Parses passed value as JSON object, JSON.parse() will throw an error.\r\n     * @param input\r\n     */\r\n    protected validateAndParseJson(jsonValue: string): object | null {\r\n        try {\r\n            const parsedJson = JSON.parse(jsonValue);\r\n            /**\r\n             * There are edge cases in which JSON.parse will successfully parse a non-valid JSON object\r\n             * (e.g. JSON.parse will parse an escaped string into an unescaped string), so adding a type check\r\n             * of the parsed value is necessary in order to be certain that the string represents a valid JSON object.\r\n             *\r\n             */\r\n            return (parsedJson && typeof parsedJson === \"object\") ? parsedJson : null;\r\n        } catch (error) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * fetches the entry from the browser storage based off the key\r\n     * @param key\r\n     */\r\n    getItem(key: string): string | null {\r\n        return this.browserStorage.getItem(key);\r\n    }\r\n\r\n    /**\r\n     * sets the entry in the browser storage\r\n     * @param key\r\n     * @param value\r\n     */\r\n    setItem(key: string, value: string): void {\r\n        this.browserStorage.setItem(key, value);\r\n    }\r\n\r\n    /**\r\n     * fetch the account entity from the platform cache\r\n     * @param accountKey\r\n     */\r\n    getAccount(accountKey: string): AccountEntity | null {\r\n        this.logger.trace(\"BrowserCacheManager.getAccount called\");\r\n        const account = this.getItem(accountKey);\r\n        if (!account) {\r\n            this.removeAccountKeyFromMap(accountKey);\r\n            return null;\r\n        }\r\n\r\n        const parsedAccount = this.validateAndParseJson(account);\r\n        if (!parsedAccount || !AccountEntity.isAccountEntity(parsedAccount)) {\r\n            this.removeAccountKeyFromMap(accountKey);\r\n            return null;\r\n        }\r\n\r\n        return CacheManager.toObject<AccountEntity>(new AccountEntity(), parsedAccount);\r\n    }\r\n\r\n    /**\r\n     * set account entity in the platform cache\r\n     * @param key\r\n     * @param value\r\n     */\r\n    setAccount(account: AccountEntity): void {\r\n        this.logger.trace(\"BrowserCacheManager.setAccount called\");\r\n        const key = account.generateAccountKey();\r\n        this.setItem(key, JSON.stringify(account));\r\n        this.addAccountKeyToMap(key);\r\n    }\r\n\r\n    /**\r\n     * Returns the array of account keys currently cached\r\n     * @returns \r\n     */\r\n    getAccountKeys(): Array<string> {\r\n        this.logger.trace(\"BrowserCacheManager.getAccountKeys called\");\r\n        const accountKeys = this.getItem(StaticCacheKeys.ACCOUNT_KEYS);\r\n        if (accountKeys) {\r\n            return JSON.parse(accountKeys);\r\n        }\r\n\r\n        this.logger.verbose(\"BrowserCacheManager.getAccountKeys - No account keys found\");\r\n        return [];\r\n    }\r\n\r\n    /**\r\n     * Add a new account to the key map\r\n     * @param key \r\n     */\r\n    addAccountKeyToMap(key: string): void {\r\n        this.logger.trace(\"BrowserCacheManager.addAccountKeyToMap called\");\r\n        this.logger.tracePii(`BrowserCacheManager.addAccountKeyToMap called with key: ${key}`);\r\n        const accountKeys = this.getAccountKeys();\r\n        if (accountKeys.indexOf(key) === -1) {\r\n            // Only add key if it does not already exist in the map\r\n            accountKeys.push(key);\r\n            this.setItem(StaticCacheKeys.ACCOUNT_KEYS, JSON.stringify(accountKeys));\r\n            this.logger.verbose(\"BrowserCacheManager.addAccountKeyToMap account key added\");\r\n        } else {\r\n            this.logger.verbose(\"BrowserCacheManager.addAccountKeyToMap account key already exists in map\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Remove an account from the key map\r\n     * @param key \r\n     */\r\n    removeAccountKeyFromMap(key: string): void {\r\n        this.logger.trace(\"BrowserCacheManager.removeAccountKeyFromMap called\");\r\n        this.logger.tracePii(`BrowserCacheManager.removeAccountKeyFromMap called with key: ${key}`);\r\n        const accountKeys = this.getAccountKeys();\r\n        const removalIndex = accountKeys.indexOf(key);\r\n        if (removalIndex > -1) {\r\n            accountKeys.splice(removalIndex, 1);\r\n            this.setItem(StaticCacheKeys.ACCOUNT_KEYS, JSON.stringify(accountKeys));\r\n            this.logger.trace(\"BrowserCacheManager.removeAccountKeyFromMap account key removed\");\r\n        } else {\r\n            this.logger.trace(\"BrowserCacheManager.removeAccountKeyFromMap key not found in existing map\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Extends inherited removeAccount function to include removal of the account key from the map\r\n     * @param key \r\n     */\r\n    async removeAccount(key: string): Promise<void> {\r\n        super.removeAccount(key);\r\n        this.removeAccountKeyFromMap(key);\r\n    }\r\n\r\n    /**\r\n     * Removes given idToken from the cache and from the key map\r\n     * @param key \r\n     */\r\n    removeIdToken(key: string): void {\r\n        super.removeIdToken(key);\r\n        this.removeTokenKey(key, CredentialType.ID_TOKEN);\r\n    }\r\n\r\n    /**\r\n     * Removes given accessToken from the cache and from the key map\r\n     * @param key \r\n     */\r\n    async removeAccessToken(key: string): Promise<void> {\r\n        super.removeAccessToken(key);\r\n        this.removeTokenKey(key, CredentialType.ACCESS_TOKEN);\r\n    }\r\n\r\n    /**\r\n     * Removes given refreshToken from the cache and from the key map\r\n     * @param key \r\n     */\r\n    removeRefreshToken(key: string): void {\r\n        super.removeRefreshToken(key);\r\n        this.removeTokenKey(key, CredentialType.REFRESH_TOKEN);\r\n    }\r\n\r\n    /**\r\n     * Gets the keys for the cached tokens associated with this clientId\r\n     * @returns \r\n     */\r\n    getTokenKeys(): TokenKeys {\r\n        this.logger.trace(\"BrowserCacheManager.getTokenKeys called\");\r\n        const item = this.getItem(`${StaticCacheKeys.TOKEN_KEYS}.${this.clientId}`);\r\n        if (item) {\r\n            const tokenKeys = this.validateAndParseJson(item);\r\n            if (tokenKeys && \r\n                tokenKeys.hasOwnProperty(\"idToken\") &&\r\n                tokenKeys.hasOwnProperty(\"accessToken\") &&\r\n                tokenKeys.hasOwnProperty(\"refreshToken\")\r\n            ) {\r\n                return tokenKeys as TokenKeys;\r\n            } else {\r\n                this.logger.error(\"BrowserCacheManager.getTokenKeys - Token keys found but in an unknown format. Returning empty key map.\");\r\n            }\r\n        } else {\r\n            this.logger.verbose(\"BrowserCacheManager.getTokenKeys - No token keys found\");\r\n        }\r\n\r\n        return {\r\n            idToken: [],\r\n            accessToken: [],\r\n            refreshToken: []\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Adds the given key to the token key map\r\n     * @param key \r\n     * @param type \r\n     */\r\n    addTokenKey(key: string, type: CredentialType): void {\r\n        this.logger.trace(\"BrowserCacheManager addTokenKey called\");\r\n        const tokenKeys = this.getTokenKeys();\r\n\r\n        switch (type) {\r\n            case CredentialType.ID_TOKEN:\r\n                if (tokenKeys.idToken.indexOf(key) === -1) {\r\n                    this.logger.info(\"BrowserCacheManager: addTokenKey - idToken added to map\");\r\n                    tokenKeys.idToken.push(key);\r\n                }\r\n                break;\r\n            case CredentialType.ACCESS_TOKEN:\r\n                if (tokenKeys.accessToken.indexOf(key) === -1) {\r\n                    this.logger.info(\"BrowserCacheManager: addTokenKey - accessToken added to map\");\r\n                    tokenKeys.accessToken.push(key);\r\n                }\r\n                break;\r\n            case CredentialType.REFRESH_TOKEN:\r\n                if (tokenKeys.refreshToken.indexOf(key) === -1) {\r\n                    this.logger.info(\"BrowserCacheManager: addTokenKey - refreshToken added to map\");\r\n                    tokenKeys.refreshToken.push(key);\r\n                }\r\n                break;\r\n            default:\r\n                this.logger.error(`BrowserCacheManager:addTokenKey - CredentialType provided invalid. CredentialType: ${type}`);\r\n                ClientAuthError.createUnexpectedCredentialTypeError();\r\n        }\r\n\r\n        this.setItem(`${StaticCacheKeys.TOKEN_KEYS}.${this.clientId}`, JSON.stringify(tokenKeys));\r\n    }\r\n\r\n    /**\r\n     * Removes the given key from the token key map\r\n     * @param key \r\n     * @param type \r\n     */\r\n    removeTokenKey(key: string, type: CredentialType): void {\r\n        this.logger.trace(\"BrowserCacheManager removeTokenKey called\");\r\n        const tokenKeys = this.getTokenKeys();\r\n\r\n        switch (type) {\r\n            case CredentialType.ID_TOKEN:\r\n                this.logger.infoPii(`BrowserCacheManager: removeTokenKey - attempting to remove idToken with key: ${key} from map`);\r\n                const idRemoval = tokenKeys.idToken.indexOf(key);\r\n                if (idRemoval > -1) {\r\n                    this.logger.info(\"BrowserCacheManager: removeTokenKey - idToken removed from map\");\r\n                    tokenKeys.idToken.splice(idRemoval, 1);\r\n                } else {\r\n                    this.logger.info(\"BrowserCacheManager: removeTokenKey - idToken does not exist in map. Either it was previously removed or it was never added.\");\r\n                }\r\n                break;\r\n            case CredentialType.ACCESS_TOKEN:\r\n                this.logger.infoPii(`BrowserCacheManager: removeTokenKey - attempting to remove accessToken with key: ${key} from map`);\r\n                const accessRemoval = tokenKeys.accessToken.indexOf(key);\r\n                if (accessRemoval > -1) {\r\n                    this.logger.info(\"BrowserCacheManager: removeTokenKey - accessToken removed from map\");\r\n                    tokenKeys.accessToken.splice(accessRemoval, 1);\r\n                } else {\r\n                    this.logger.info(\"BrowserCacheManager: removeTokenKey - accessToken does not exist in map. Either it was previously removed or it was never added.\");\r\n                }\r\n                break;\r\n            case CredentialType.REFRESH_TOKEN:\r\n                this.logger.infoPii(`BrowserCacheManager: removeTokenKey - attempting to remove refreshToken with key: ${key} from map`);\r\n                const refreshRemoval = tokenKeys.refreshToken.indexOf(key);\r\n                if (refreshRemoval > -1) {\r\n                    this.logger.info(\"BrowserCacheManager: removeTokenKey - refreshToken removed from map\");\r\n                    tokenKeys.refreshToken.splice(refreshRemoval, 1);\r\n                } else {\r\n                    this.logger.info(\"BrowserCacheManager: removeTokenKey - refreshToken does not exist in map. Either it was previously removed or it was never added.\");\r\n                }\r\n                break;\r\n            default:\r\n                this.logger.error(`BrowserCacheManager:removeTokenKey - CredentialType provided invalid. CredentialType: ${type}`);\r\n                ClientAuthError.createUnexpectedCredentialTypeError();\r\n        }\r\n\r\n        this.setItem(`${StaticCacheKeys.TOKEN_KEYS}.${this.clientId}`, JSON.stringify(tokenKeys));\r\n    }\r\n\r\n    /**\r\n     * generates idToken entity from a string\r\n     * @param idTokenKey\r\n     */\r\n    getIdTokenCredential(idTokenKey: string): IdTokenEntity | null {\r\n        const value = this.getItem(idTokenKey);\r\n        if (!value) {\r\n            this.logger.trace(\"BrowserCacheManager.getIdTokenCredential: called, no cache hit\");\r\n            this.removeTokenKey(idTokenKey, CredentialType.ID_TOKEN);\r\n            return null;\r\n        }\r\n\r\n        const parsedIdToken = this.validateAndParseJson(value);\r\n        if (!parsedIdToken || !IdTokenEntity.isIdTokenEntity(parsedIdToken)) {\r\n            this.logger.trace(\"BrowserCacheManager.getIdTokenCredential: called, no cache hit\");\r\n            this.removeTokenKey(idTokenKey, CredentialType.ID_TOKEN);\r\n            return null;\r\n        }\r\n\r\n        this.logger.trace(\"BrowserCacheManager.getIdTokenCredential: cache hit\");\r\n        return CacheManager.toObject(new IdTokenEntity(), parsedIdToken);\r\n    }\r\n\r\n    /**\r\n     * set IdToken credential to the platform cache\r\n     * @param idToken\r\n     */\r\n    setIdTokenCredential(idToken: IdTokenEntity): void {\r\n        this.logger.trace(\"BrowserCacheManager.setIdTokenCredential called\");\r\n        const idTokenKey = idToken.generateCredentialKey();\r\n\r\n        this.setItem(idTokenKey, JSON.stringify(idToken));\r\n\r\n        this.addTokenKey(idTokenKey, CredentialType.ID_TOKEN);\r\n    }\r\n\r\n    /**\r\n     * generates accessToken entity from a string\r\n     * @param key\r\n     */\r\n    getAccessTokenCredential(accessTokenKey: string): AccessTokenEntity | null {\r\n        const value = this.getItem(accessTokenKey);\r\n        if (!value) {\r\n            this.logger.trace(\"BrowserCacheManager.getAccessTokenCredential: called, no cache hit\");\r\n            this.removeTokenKey(accessTokenKey, CredentialType.ACCESS_TOKEN);\r\n            return null;\r\n        }\r\n        const parsedAccessToken = this.validateAndParseJson(value);\r\n        if (!parsedAccessToken || !AccessTokenEntity.isAccessTokenEntity(parsedAccessToken)) {\r\n            this.logger.trace(\"BrowserCacheManager.getAccessTokenCredential: called, no cache hit\");\r\n            this.removeTokenKey(accessTokenKey, CredentialType.ACCESS_TOKEN);\r\n            return null;\r\n        }\r\n\r\n        this.logger.trace(\"BrowserCacheManager.getAccessTokenCredential: cache hit\");\r\n        return CacheManager.toObject(new AccessTokenEntity(), parsedAccessToken);\r\n    }\r\n\r\n    /**\r\n     * set accessToken credential to the platform cache\r\n     * @param accessToken\r\n     */\r\n    setAccessTokenCredential(accessToken: AccessTokenEntity): void {\r\n        this.logger.trace(\"BrowserCacheManager.setAccessTokenCredential called\");\r\n        const accessTokenKey = accessToken.generateCredentialKey();\r\n        this.setItem(accessTokenKey, JSON.stringify(accessToken));\r\n\r\n        this.addTokenKey(accessTokenKey, CredentialType.ACCESS_TOKEN);\r\n    }\r\n\r\n    /**\r\n     * generates refreshToken entity from a string\r\n     * @param refreshTokenKey\r\n     */\r\n    getRefreshTokenCredential(refreshTokenKey: string): RefreshTokenEntity | null {\r\n        const value = this.getItem(refreshTokenKey);\r\n        if (!value) {\r\n            this.logger.trace(\"BrowserCacheManager.getRefreshTokenCredential: called, no cache hit\");\r\n            this.removeTokenKey(refreshTokenKey, CredentialType.REFRESH_TOKEN);\r\n            return null;\r\n        }\r\n        const parsedRefreshToken = this.validateAndParseJson(value);\r\n        if (!parsedRefreshToken || !RefreshTokenEntity.isRefreshTokenEntity(parsedRefreshToken)) {\r\n            this.logger.trace(\"BrowserCacheManager.getRefreshTokenCredential: called, no cache hit\");\r\n            this.removeTokenKey(refreshTokenKey, CredentialType.REFRESH_TOKEN);\r\n            return null;\r\n        }\r\n\r\n        this.logger.trace(\"BrowserCacheManager.getRefreshTokenCredential: cache hit\");\r\n        return CacheManager.toObject(new RefreshTokenEntity(), parsedRefreshToken);\r\n    }\r\n\r\n    /**\r\n     * set refreshToken credential to the platform cache\r\n     * @param refreshToken\r\n     */\r\n    setRefreshTokenCredential(refreshToken: RefreshTokenEntity): void {\r\n        this.logger.trace(\"BrowserCacheManager.setRefreshTokenCredential called\");\r\n        const refreshTokenKey = refreshToken.generateCredentialKey();\r\n        this.setItem(refreshTokenKey, JSON.stringify(refreshToken));\r\n\r\n        this.addTokenKey(refreshTokenKey, CredentialType.REFRESH_TOKEN);\r\n    }\r\n\r\n    /**\r\n     * fetch appMetadata entity from the platform cache\r\n     * @param appMetadataKey\r\n     */\r\n    getAppMetadata(appMetadataKey: string): AppMetadataEntity | null {\r\n        const value = this.getItem(appMetadataKey);\r\n        if (!value) {\r\n            this.logger.trace(\"BrowserCacheManager.getAppMetadata: called, no cache hit\");\r\n            return null;\r\n        }\r\n\r\n        const parsedMetadata = this.validateAndParseJson(value);\r\n        if (!parsedMetadata || !AppMetadataEntity.isAppMetadataEntity(appMetadataKey, parsedMetadata)) {\r\n            this.logger.trace(\"BrowserCacheManager.getAppMetadata: called, no cache hit\");\r\n            return null;\r\n        }\r\n\r\n        this.logger.trace(\"BrowserCacheManager.getAppMetadata: cache hit\");\r\n        return CacheManager.toObject(new AppMetadataEntity(), parsedMetadata);\r\n    }\r\n\r\n    /**\r\n     * set appMetadata entity to the platform cache\r\n     * @param appMetadata\r\n     */\r\n    setAppMetadata(appMetadata: AppMetadataEntity): void {\r\n        this.logger.trace(\"BrowserCacheManager.setAppMetadata called\");\r\n        const appMetadataKey = appMetadata.generateAppMetadataKey();\r\n        this.setItem(appMetadataKey, JSON.stringify(appMetadata));\r\n    }\r\n\r\n    /**\r\n     * fetch server telemetry entity from the platform cache\r\n     * @param serverTelemetryKey\r\n     */\r\n    getServerTelemetry(serverTelemetryKey: string): ServerTelemetryEntity | null {\r\n        const value = this.getItem(serverTelemetryKey);\r\n        if (!value) {\r\n            this.logger.trace(\"BrowserCacheManager.getServerTelemetry: called, no cache hit\");\r\n            return null;\r\n        }\r\n        const parsedMetadata = this.validateAndParseJson(value);\r\n        if (!parsedMetadata || !ServerTelemetryEntity.isServerTelemetryEntity(serverTelemetryKey, parsedMetadata)) {\r\n            this.logger.trace(\"BrowserCacheManager.getServerTelemetry: called, no cache hit\");\r\n            return null;\r\n        }\r\n\r\n        this.logger.trace(\"BrowserCacheManager.getServerTelemetry: cache hit\");\r\n        return CacheManager.toObject(new ServerTelemetryEntity(), parsedMetadata);\r\n    }\r\n\r\n    /**\r\n     * set server telemetry entity to the platform cache\r\n     * @param serverTelemetryKey\r\n     * @param serverTelemetry\r\n     */\r\n    setServerTelemetry(serverTelemetryKey: string, serverTelemetry: ServerTelemetryEntity): void {\r\n        this.logger.trace(\"BrowserCacheManager.setServerTelemetry called\");\r\n        this.setItem(serverTelemetryKey, JSON.stringify(serverTelemetry));\r\n    }\r\n\r\n    /**\r\n     *\r\n     */\r\n    getAuthorityMetadata(key: string): AuthorityMetadataEntity | null {\r\n        const value = this.internalStorage.getItem(key);\r\n        if (!value) {\r\n            this.logger.trace(\"BrowserCacheManager.getAuthorityMetadata: called, no cache hit\");\r\n            return null;\r\n        }\r\n        const parsedMetadata = this.validateAndParseJson(value);\r\n        if (parsedMetadata && AuthorityMetadataEntity.isAuthorityMetadataEntity(key, parsedMetadata)) {\r\n            this.logger.trace(\"BrowserCacheManager.getAuthorityMetadata: cache hit\");\r\n            return CacheManager.toObject(new AuthorityMetadataEntity(), parsedMetadata);\r\n        }\r\n        return null;\r\n    }\r\n\r\n    /**\r\n     *\r\n     */\r\n    getAuthorityMetadataKeys(): Array<string> {\r\n        const allKeys = this.internalStorage.getKeys();\r\n        return allKeys.filter((key) => {\r\n            return this.isAuthorityMetadata(key);\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Sets wrapper metadata in memory\r\n     * @param wrapperSKU\r\n     * @param wrapperVersion\r\n     */\r\n    setWrapperMetadata(wrapperSKU: string, wrapperVersion: string): void {\r\n        this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_SKU, wrapperSKU);\r\n        this.internalStorage.setItem(InMemoryCacheKeys.WRAPPER_VER, wrapperVersion);\r\n    }\r\n\r\n    /**\r\n     * Returns wrapper metadata from in-memory storage\r\n     */\r\n    getWrapperMetadata(): [string, string] {\r\n        const sku = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_SKU) || Constants.EMPTY_STRING;\r\n        const version = this.internalStorage.getItem(InMemoryCacheKeys.WRAPPER_VER) || Constants.EMPTY_STRING;\r\n        return [sku, version];\r\n    }\r\n\r\n    /**\r\n     *\r\n     * @param entity\r\n     */\r\n    setAuthorityMetadata(key: string, entity: AuthorityMetadataEntity): void {\r\n        this.logger.trace(\"BrowserCacheManager.setAuthorityMetadata called\");\r\n        this.internalStorage.setItem(key, JSON.stringify(entity));\r\n    }\r\n\r\n    /**\r\n     * Gets the active account\r\n     */\r\n    getActiveAccount(): AccountInfo | null {\r\n        const activeAccountKeyFilters = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);\r\n        const activeAccountValueFilters = this.getItem(activeAccountKeyFilters);\r\n        if (!activeAccountValueFilters) {\r\n            // if new active account cache type isn't found, it's an old version, so look for that instead\r\n            this.logger.trace(\"BrowserCacheManager.getActiveAccount: No active account filters cache schema found, looking for legacy schema\");\r\n            const activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);\r\n            const activeAccountValueLocal = this.getItem(activeAccountKeyLocal);\r\n            if (!activeAccountValueLocal) {\r\n                this.logger.trace(\"BrowserCacheManager.getActiveAccount: No active account found\");\r\n                return null;\r\n            }\r\n            const activeAccount = this.getAccountInfoByFilter({ localAccountId: activeAccountValueLocal })[0] || null;\r\n            if (activeAccount) {\r\n                this.logger.trace(\"BrowserCacheManager.getActiveAccount: Legacy active account cache schema found\");\r\n                this.logger.trace(\"BrowserCacheManager.getActiveAccount: Adding active account filters cache schema\");\r\n                this.setActiveAccount(activeAccount);\r\n                return activeAccount;\r\n            }\r\n            return null;\r\n        }\r\n        const activeAccountValueObj = this.validateAndParseJson(activeAccountValueFilters) as AccountInfo;\r\n        if (activeAccountValueObj) {\r\n            this.logger.trace(\"BrowserCacheManager.getActiveAccount: Active account filters schema found\");\r\n            return this.getAccountInfoByFilter({\r\n                homeAccountId: activeAccountValueObj.homeAccountId,\r\n                localAccountId: activeAccountValueObj.localAccountId\r\n            })[0] || null;\r\n        }\r\n        this.logger.trace(\"BrowserCacheManager.getActiveAccount: No active account found\");\r\n        return null;\r\n    }\r\n\r\n    /**\r\n     * Sets the active account's localAccountId in cache\r\n     * @param account\r\n     */\r\n    setActiveAccount(account: AccountInfo | null): void {\r\n        const activeAccountKey = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT_FILTERS);\r\n        const activeAccountKeyLocal = this.generateCacheKey(PersistentCacheKeys.ACTIVE_ACCOUNT);\r\n        if (account) {\r\n            this.logger.verbose(\"setActiveAccount: Active account set\");\r\n            const activeAccountValue: ActiveAccountFilters = {\r\n                homeAccountId: account.homeAccountId,\r\n                localAccountId: account.localAccountId\r\n            };\r\n            this.browserStorage.setItem(activeAccountKey, JSON.stringify(activeAccountValue));\r\n            this.browserStorage.setItem(activeAccountKeyLocal, account.localAccountId);\r\n        } else {\r\n            this.logger.verbose(\"setActiveAccount: No account passed, active account not set\");\r\n            this.browserStorage.removeItem(activeAccountKey);\r\n            this.browserStorage.removeItem(activeAccountKeyLocal);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Gets a list of accounts that match all of the filters provided\r\n     * @param account\r\n     */\r\n    getAccountInfoByFilter(accountFilter: Partial<Omit<AccountInfo, \"idTokenClaims\" | \"name\">>): AccountInfo[] {\r\n        const allAccounts = this.getAllAccounts();\r\n        this.logger.trace(`BrowserCacheManager.getAccountInfoByFilter: total ${allAccounts.length} accounts found`);\r\n\r\n        return allAccounts.filter((accountObj) => {\r\n            if (accountFilter.username && accountFilter.username.toLowerCase() !== accountObj.username.toLowerCase()) {\r\n                return false;\r\n            }\r\n\r\n            if (accountFilter.homeAccountId && accountFilter.homeAccountId !== accountObj.homeAccountId) {\r\n                return false;\r\n            }\r\n\r\n            if (accountFilter.localAccountId && accountFilter.localAccountId !== accountObj.localAccountId) {\r\n                return false;\r\n            }\r\n\r\n            if (accountFilter.tenantId && accountFilter.tenantId !== accountObj.tenantId) {\r\n                return false;\r\n            }\r\n\r\n            if (accountFilter.environment && accountFilter.environment !== accountObj.environment) {\r\n                return false;\r\n            }\r\n\r\n            return true;\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Checks the cache for accounts matching loginHint or SID\r\n     * @param loginHint\r\n     * @param sid\r\n     */\r\n    getAccountInfoByHints(loginHint?: string, sid?: string): AccountInfo | null {\r\n        const matchingAccounts = this.getAllAccounts().filter((accountInfo) => {\r\n            if (sid) {\r\n                const accountSid = accountInfo.idTokenClaims && accountInfo.idTokenClaims[\"sid\"];\r\n                return sid === accountSid;\r\n            }\r\n\r\n            if (loginHint) {\r\n                return loginHint === accountInfo.username;\r\n            }\r\n\r\n            return false;\r\n        });\r\n\r\n        if (matchingAccounts.length === 1) {\r\n            return matchingAccounts[0];\r\n        } else if (matchingAccounts.length > 1) {\r\n            throw ClientAuthError.createMultipleMatchingAccountsInCacheError();\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n    /**\r\n     * fetch throttling entity from the platform cache\r\n     * @param throttlingCacheKey\r\n     */\r\n    getThrottlingCache(throttlingCacheKey: string): ThrottlingEntity | null {\r\n        const value = this.getItem(throttlingCacheKey);\r\n        if (!value) {\r\n            this.logger.trace(\"BrowserCacheManager.getThrottlingCache: called, no cache hit\");\r\n            return null;\r\n        }\r\n\r\n        const parsedThrottlingCache = this.validateAndParseJson(value);\r\n        if (!parsedThrottlingCache || !ThrottlingEntity.isThrottlingEntity(throttlingCacheKey, parsedThrottlingCache)) {\r\n            this.logger.trace(\"BrowserCacheManager.getThrottlingCache: called, no cache hit\");\r\n            return null;\r\n        }\r\n\r\n        this.logger.trace(\"BrowserCacheManager.getThrottlingCache: cache hit\");\r\n        return CacheManager.toObject(new ThrottlingEntity(), parsedThrottlingCache);\r\n    }\r\n\r\n    /**\r\n     * set throttling entity to the platform cache\r\n     * @param throttlingCacheKey\r\n     * @param throttlingCache\r\n     */\r\n    setThrottlingCache(throttlingCacheKey: string, throttlingCache: ThrottlingEntity): void {\r\n        this.logger.trace(\"BrowserCacheManager.setThrottlingCache called\");\r\n        this.setItem(throttlingCacheKey, JSON.stringify(throttlingCache));\r\n    }\r\n\r\n    /**\r\n     * Gets cache item with given key.\r\n     * Will retrieve from cookies if storeAuthStateInCookie is set to true.\r\n     * @param key\r\n     */\r\n    getTemporaryCache(cacheKey: string, generateKey?: boolean): string | null {\r\n        const key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;\r\n        if (this.cacheConfig.storeAuthStateInCookie) {\r\n            const itemCookie = this.getItemCookie(key);\r\n            if (itemCookie) {\r\n                this.logger.trace(\"BrowserCacheManager.getTemporaryCache: storeAuthStateInCookies set to true, retrieving from cookies\");\r\n                return itemCookie;\r\n            }\r\n        }\r\n\r\n        const value = this.temporaryCacheStorage.getItem(key);\r\n        if (!value) {\r\n            // If temp cache item not found in session/memory, check local storage for items set by old versions\r\n            if (this.cacheConfig.cacheLocation === BrowserCacheLocation.LocalStorage) {\r\n                const item = this.browserStorage.getItem(key);\r\n                if (item) {\r\n                    this.logger.trace(\"BrowserCacheManager.getTemporaryCache: Temporary cache item found in local storage\");\r\n                    return item;\r\n                }\r\n            }\r\n            this.logger.trace(\"BrowserCacheManager.getTemporaryCache: No cache item found in local storage\");\r\n            return null;\r\n        }\r\n        this.logger.trace(\"BrowserCacheManager.getTemporaryCache: Temporary cache item returned\");\r\n        return value;\r\n    }\r\n\r\n    /**\r\n     * Sets the cache item with the key and value given.\r\n     * Stores in cookie if storeAuthStateInCookie is set to true.\r\n     * This can cause cookie overflow if used incorrectly.\r\n     * @param key\r\n     * @param value\r\n     */\r\n    setTemporaryCache(cacheKey: string, value: string, generateKey?: boolean): void {\r\n        const key = generateKey ? this.generateCacheKey(cacheKey) : cacheKey;\r\n\r\n        this.temporaryCacheStorage.setItem(key, value);\r\n        if (this.cacheConfig.storeAuthStateInCookie) {\r\n            this.logger.trace(\"BrowserCacheManager.setTemporaryCache: storeAuthStateInCookie set to true, setting item cookie\");\r\n            this.setItemCookie(key, value);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Removes the cache item with the given key.\r\n     * Will also clear the cookie item if storeAuthStateInCookie is set to true.\r\n     * @param key\r\n     */\r\n    removeItem(key: string): void {\r\n        this.browserStorage.removeItem(key);\r\n        this.temporaryCacheStorage.removeItem(key);\r\n        if (this.cacheConfig.storeAuthStateInCookie) {\r\n            this.logger.trace(\"BrowserCacheManager.removeItem: storeAuthStateInCookie is true, clearing item cookie\");\r\n            this.clearItemCookie(key);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Checks whether key is in cache.\r\n     * @param key\r\n     */\r\n    containsKey(key: string): boolean {\r\n        return this.browserStorage.containsKey(key) || this.temporaryCacheStorage.containsKey(key);\r\n    }\r\n\r\n    /**\r\n     * Gets all keys in window.\r\n     */\r\n    getKeys(): string[] {\r\n        return [\r\n            ...this.browserStorage.getKeys(),\r\n            ...this.temporaryCacheStorage.getKeys()\r\n        ];\r\n    }\r\n\r\n    /**\r\n     * Clears all cache entries created by MSAL.\r\n     */\r\n    async clear(): Promise<void> {\r\n        // Removes all accounts and their credentials\r\n        await this.removeAllAccounts();\r\n        this.removeAppMetadata();\r\n\r\n        // Removes all remaining MSAL cache items\r\n        this.getKeys().forEach((cacheKey: string) => {\r\n            // Check if key contains msal prefix; For now, we are clearing all the cache items created by MSAL.js\r\n            if ((this.browserStorage.containsKey(cacheKey) || this.temporaryCacheStorage.containsKey(cacheKey)) && ((cacheKey.indexOf(Constants.CACHE_PREFIX) !== -1) || (cacheKey.indexOf(this.clientId) !== -1))) {\r\n                this.removeItem(cacheKey);\r\n            }\r\n        });\r\n\r\n        this.internalStorage.clear();\r\n    }\r\n\r\n    /**\r\n     * Clears all access tokes that have claims prior to saving the current one\r\n     * @param credential \r\n     * @returns \r\n     */\r\n    async clearTokensAndKeysWithClaims(): Promise<void> {\r\n\r\n        this.logger.trace(\"BrowserCacheManager.clearTokensAndKeysWithClaims called\");\r\n        const tokenKeys = this.getTokenKeys();\r\n            \r\n        const removedAccessTokens: Array<Promise<void>> = [];\r\n        tokenKeys.accessToken.forEach((key: string) => {\r\n            // if the access token has claims in its key, remove the token key and the token\r\n            const credential = this.getAccessTokenCredential(key);\r\n            if(credential?.requestedClaimsHash && key.includes(credential.requestedClaimsHash.toLowerCase())) {\r\n                removedAccessTokens.push(this.removeAccessToken(key));\r\n            }\r\n        });\r\n        await Promise.all(removedAccessTokens);\r\n\r\n        // warn if any access tokens are removed\r\n        if(removedAccessTokens.length > 0) {\r\n            this.logger.warning(`${removedAccessTokens.length} access tokens with claims in the cache keys have been removed from the cache.`);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Add value to cookies\r\n     * @param cookieName\r\n     * @param cookieValue\r\n     * @param expires\r\n     */\r\n    setItemCookie(cookieName: string, cookieValue: string, expires?: number): void {\r\n        let cookieStr = `${encodeURIComponent(cookieName)}=${encodeURIComponent(cookieValue)};path=/;SameSite=Lax;`;\r\n        if (expires) {\r\n            const expireTime = this.getCookieExpirationTime(expires);\r\n            cookieStr += `expires=${expireTime};`;\r\n        }\r\n\r\n        if (this.cacheConfig.secureCookies) {\r\n            cookieStr += \"Secure;\";\r\n        }\r\n\r\n        document.cookie = cookieStr;\r\n    }\r\n\r\n    /**\r\n     * Get one item by key from cookies\r\n     * @param cookieName\r\n     */\r\n    getItemCookie(cookieName: string): string {\r\n        const name = `${encodeURIComponent(cookieName)}=`;\r\n        const cookieList = document.cookie.split(\";\");\r\n        for (let i: number = 0; i < cookieList.length; i++) {\r\n            let cookie = cookieList[i];\r\n            while (cookie.charAt(0) === \" \") {\r\n                cookie = cookie.substring(1);\r\n            }\r\n            if (cookie.indexOf(name) === 0) {\r\n                return decodeURIComponent(cookie.substring(name.length, cookie.length));\r\n            }\r\n        }\r\n        return Constants.EMPTY_STRING;\r\n    }\r\n\r\n    /**\r\n     * Clear all msal-related cookies currently set in the browser. Should only be used to clear temporary cache items.\r\n     */\r\n    clearMsalCookies(): void {\r\n        const cookiePrefix = `${Constants.CACHE_PREFIX}.${this.clientId}`;\r\n        const cookieList = document.cookie.split(\";\");\r\n        cookieList.forEach((cookie: string): void => {\r\n            while (cookie.charAt(0) === \" \") {\r\n                // eslint-disable-next-line no-param-reassign\r\n                cookie = cookie.substring(1);\r\n            }\r\n            if (cookie.indexOf(cookiePrefix) === 0) {\r\n                const cookieKey = cookie.split(\"=\")[0];\r\n                this.clearItemCookie(cookieKey);\r\n            }\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Clear an item in the cookies by key\r\n     * @param cookieName\r\n     */\r\n    clearItemCookie(cookieName: string): void {\r\n        this.setItemCookie(cookieName, Constants.EMPTY_STRING, -1);\r\n    }\r\n\r\n    /**\r\n     * Get cookie expiration time\r\n     * @param cookieLifeDays\r\n     */\r\n    getCookieExpirationTime(cookieLifeDays: number): string {\r\n        const today = new Date();\r\n        const expr = new Date(today.getTime() + cookieLifeDays * this.COOKIE_LIFE_MULTIPLIER);\r\n        return expr.toUTCString();\r\n    }\r\n\r\n    /**\r\n     * Gets the cache object referenced by the browser\r\n     */\r\n    getCache(): object {\r\n        return this.browserStorage;\r\n    }\r\n\r\n    /**\r\n     * interface compat, we cannot overwrite browser cache; Functionality is supported by individual entities in browser\r\n     */\r\n    setCache(): void {\r\n        // sets nothing\r\n    }\r\n\r\n    /**\r\n     * Prepend msal.<client-id> to each key; Skip for any JSON object as Key (defined schemas do not need the key appended: AccessToken Keys or the upcoming schema)\r\n     * @param key\r\n     * @param addInstanceId\r\n     */\r\n    generateCacheKey(key: string): string {\r\n        const generatedKey = this.validateAndParseJson(key);\r\n        if (!generatedKey) {\r\n            if (StringUtils.startsWith(key, Constants.CACHE_PREFIX) || StringUtils.startsWith(key, PersistentCacheKeys.ADAL_ID_TOKEN)) {\r\n                return key;\r\n            }\r\n            return `${Constants.CACHE_PREFIX}.${this.clientId}.${key}`;\r\n        }\r\n\r\n        return JSON.stringify(key);\r\n    }\r\n\r\n    /**\r\n     * Create authorityKey to cache authority\r\n     * @param state\r\n     */\r\n    generateAuthorityKey(stateString: string): string {\r\n        const {\r\n            libraryState: {\r\n                id: stateId\r\n            }\r\n        } = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString);\r\n\r\n        return this.generateCacheKey(`${TemporaryCacheKeys.AUTHORITY}.${stateId}`);\r\n    }\r\n\r\n    /**\r\n     * Create Nonce key to cache nonce\r\n     * @param state\r\n     */\r\n    generateNonceKey(stateString: string): string {\r\n        const {\r\n            libraryState: {\r\n                id: stateId\r\n            }\r\n        } = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString);\r\n\r\n        return this.generateCacheKey(`${TemporaryCacheKeys.NONCE_IDTOKEN}.${stateId}`);\r\n    }\r\n\r\n    /**\r\n     * Creates full cache key for the request state\r\n     * @param stateString State string for the request\r\n     */\r\n    generateStateKey(stateString: string): string {\r\n        // Use the library state id to key temp storage for uniqueness for multiple concurrent requests\r\n        const {\r\n            libraryState: {\r\n                id: stateId\r\n            }\r\n        } = ProtocolUtils.parseRequestState(this.cryptoImpl, stateString);\r\n        return this.generateCacheKey(`${TemporaryCacheKeys.REQUEST_STATE}.${stateId}`);\r\n    }\r\n\r\n    /**\r\n     * Gets the cached authority based on the cached state. Returns empty if no cached state found.\r\n     */\r\n    getCachedAuthority(cachedState: string): string | null {\r\n        const stateCacheKey = this.generateStateKey(cachedState);\r\n        const state = this.getTemporaryCache(stateCacheKey);\r\n        if (!state) {\r\n            return null;\r\n        }\r\n\r\n        const authorityCacheKey = this.generateAuthorityKey(state);\r\n        return this.getTemporaryCache(authorityCacheKey);\r\n    }\r\n\r\n    /**\r\n     * Updates account, authority, and state in cache\r\n     * @param serverAuthenticationRequest\r\n     * @param account\r\n     */\r\n    updateCacheEntries(state: string, nonce: string, authorityInstance: string, loginHint: string, account: AccountInfo | null): void {\r\n        this.logger.trace(\"BrowserCacheManager.updateCacheEntries called\");\r\n        // Cache the request state\r\n        const stateCacheKey = this.generateStateKey(state);\r\n        this.setTemporaryCache(stateCacheKey, state, false);\r\n\r\n        // Cache the nonce\r\n        const nonceCacheKey = this.generateNonceKey(state);\r\n        this.setTemporaryCache(nonceCacheKey, nonce, false);\r\n\r\n        // Cache authorityKey\r\n        const authorityCacheKey = this.generateAuthorityKey(state);\r\n        this.setTemporaryCache(authorityCacheKey, authorityInstance, false);\r\n\r\n        if (account) {\r\n            const ccsCredential: CcsCredential = {\r\n                credential: account.homeAccountId,\r\n                type: CcsCredentialType.HOME_ACCOUNT_ID\r\n            };\r\n            this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);\r\n        } else if (!StringUtils.isEmpty(loginHint)) {\r\n            const ccsCredential: CcsCredential = {\r\n                credential: loginHint,\r\n                type: CcsCredentialType.UPN\r\n            };\r\n            this.setTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, JSON.stringify(ccsCredential), true);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Reset all temporary cache items\r\n     * @param state\r\n     */\r\n    resetRequestCache(state: string): void {\r\n        this.logger.trace(\"BrowserCacheManager.resetRequestCache called\");\r\n        // check state and remove associated cache items\r\n        if (!StringUtils.isEmpty(state)) {\r\n            this.getKeys().forEach(key => {\r\n                if (key.indexOf(state) !== -1) {\r\n                    this.removeItem(key);\r\n                }\r\n            });\r\n        }\r\n\r\n        // delete generic interactive request parameters\r\n        if (state) {\r\n            this.removeItem(this.generateStateKey(state));\r\n            this.removeItem(this.generateNonceKey(state));\r\n            this.removeItem(this.generateAuthorityKey(state));\r\n        }\r\n        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));\r\n        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.ORIGIN_URI));\r\n        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.URL_HASH));\r\n        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.CORRELATION_ID));\r\n        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.CCS_CREDENTIAL));\r\n        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.NATIVE_REQUEST));\r\n        this.setInteractionInProgress(false);\r\n    }\r\n\r\n    /**\r\n     * Removes temporary cache for the provided state\r\n     * @param stateString\r\n     */\r\n    cleanRequestByState(stateString: string): void {\r\n        this.logger.trace(\"BrowserCacheManager.cleanRequestByState called\");\r\n        // Interaction is completed - remove interaction status.\r\n        if (stateString) {\r\n            const stateKey = this.generateStateKey(stateString);\r\n            const cachedState = this.temporaryCacheStorage.getItem(stateKey);\r\n            this.logger.infoPii(`BrowserCacheManager.cleanRequestByState: Removing temporary cache items for state: ${cachedState}`);\r\n            this.resetRequestCache(cachedState || Constants.EMPTY_STRING);\r\n        }\r\n        this.clearMsalCookies();\r\n    }\r\n\r\n    /**\r\n     * Looks in temporary cache for any state values with the provided interactionType and removes all temporary cache items for that state\r\n     * Used in scenarios where temp cache needs to be cleaned but state is not known, such as clicking browser back button.\r\n     * @param interactionType\r\n     */\r\n    cleanRequestByInteractionType(interactionType: InteractionType): void {\r\n        this.logger.trace(\"BrowserCacheManager.cleanRequestByInteractionType called\");\r\n        // Loop through all keys to find state key\r\n        this.getKeys().forEach((key) => {\r\n            // If this key is not the state key, move on\r\n            if (key.indexOf(TemporaryCacheKeys.REQUEST_STATE) === -1) {\r\n                return;\r\n            }\r\n\r\n            // Retrieve state value, return if not a valid value\r\n            const stateValue = this.temporaryCacheStorage.getItem(key);\r\n            if (!stateValue) {\r\n                return;\r\n            }\r\n            // Extract state and ensure it matches given InteractionType, then clean request cache\r\n            const parsedState = BrowserProtocolUtils.extractBrowserRequestState(this.cryptoImpl, stateValue);\r\n            if (parsedState && parsedState.interactionType === interactionType) {\r\n                this.logger.infoPii(`BrowserCacheManager.cleanRequestByInteractionType: Removing temporary cache items for state: ${stateValue}`);\r\n                this.resetRequestCache(stateValue);\r\n            }\r\n        });\r\n        this.clearMsalCookies();\r\n        this.setInteractionInProgress(false);\r\n    }\r\n\r\n    cacheCodeRequest(authCodeRequest: CommonAuthorizationCodeRequest, browserCrypto: ICrypto): void {\r\n        this.logger.trace(\"BrowserCacheManager.cacheCodeRequest called\");\r\n\r\n        const encodedValue = browserCrypto.base64Encode(JSON.stringify(authCodeRequest));\r\n        this.setTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, encodedValue, true);\r\n    }\r\n\r\n    /**\r\n     * Gets the token exchange parameters from the cache. Throws an error if nothing is found.\r\n     */\r\n    getCachedRequest(state: string, browserCrypto: ICrypto): CommonAuthorizationCodeRequest {\r\n        this.logger.trace(\"BrowserCacheManager.getCachedRequest called\");\r\n        // Get token request from cache and parse as TokenExchangeParameters.\r\n        const encodedTokenRequest = this.getTemporaryCache(TemporaryCacheKeys.REQUEST_PARAMS, true);\r\n        if (!encodedTokenRequest) {\r\n            throw BrowserAuthError.createNoTokenRequestCacheError();\r\n        }\r\n\r\n        const parsedRequest = this.validateAndParseJson(browserCrypto.base64Decode(encodedTokenRequest)) as CommonAuthorizationCodeRequest;\r\n        if (!parsedRequest) {\r\n            throw BrowserAuthError.createUnableToParseTokenRequestCacheError();\r\n        }\r\n        this.removeItem(this.generateCacheKey(TemporaryCacheKeys.REQUEST_PARAMS));\r\n\r\n        // Get cached authority and use if no authority is cached with request.\r\n        if (StringUtils.isEmpty(parsedRequest.authority)) {\r\n            const authorityCacheKey: string = this.generateAuthorityKey(state);\r\n            const cachedAuthority = this.getTemporaryCache(authorityCacheKey);\r\n            if (!cachedAuthority) {\r\n                throw BrowserAuthError.createNoCachedAuthorityError();\r\n            }\r\n            parsedRequest.authority = cachedAuthority;\r\n        }\r\n\r\n        return parsedRequest;\r\n    }\r\n\r\n    /**\r\n     * Gets cached native request for redirect flows\r\n     */\r\n    getCachedNativeRequest(): NativeTokenRequest | null {\r\n        this.logger.trace(\"BrowserCacheManager.getCachedNativeRequest called\");\r\n        const cachedRequest = this.getTemporaryCache(TemporaryCacheKeys.NATIVE_REQUEST, true);\r\n        if (!cachedRequest) {\r\n            this.logger.trace(\"BrowserCacheManager.getCachedNativeRequest: No cached native request found\");\r\n            return null;\r\n        }\r\n\r\n        const parsedRequest = this.validateAndParseJson(cachedRequest) as NativeTokenRequest;\r\n        if (!parsedRequest) {\r\n            this.logger.error(\"BrowserCacheManager.getCachedNativeRequest: Unable to parse native request\");\r\n            return null;\r\n        }\r\n\r\n        return parsedRequest;\r\n    }\r\n\r\n    isInteractionInProgress(matchClientId?: boolean): boolean {\r\n        const clientId = this.getInteractionInProgress();\r\n\r\n        if (matchClientId) {\r\n            return clientId === this.clientId;\r\n        } else {\r\n            return !!clientId;\r\n        }\r\n    }\r\n\r\n    getInteractionInProgress(): string | null {\r\n        const key = `${Constants.CACHE_PREFIX}.${TemporaryCacheKeys.INTERACTION_STATUS_KEY}`;\r\n        return this.getTemporaryCache(key, false);\r\n    }\r\n\r\n    setInteractionInProgress(inProgress: boolean): void {\r\n        // Ensure we don't overwrite interaction in progress for a different clientId\r\n        const key = `${Constants.CACHE_PREFIX}.${TemporaryCacheKeys.INTERACTION_STATUS_KEY}`;\r\n        if (inProgress) {\r\n            if (this.getInteractionInProgress()) {\r\n                throw BrowserAuthError.createInteractionInProgressError();\r\n            } else {\r\n                // No interaction is in progress\r\n                this.setTemporaryCache(key, this.clientId, false);\r\n            }\r\n        } else if (!inProgress && this.getInteractionInProgress() === this.clientId) {\r\n            this.removeItem(key);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Returns username retrieved from ADAL or MSAL v1 idToken\r\n     */\r\n    getLegacyLoginHint(): string | null {\r\n        // Only check for adal/msal token if no SSO params are being used\r\n        const adalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ADAL_ID_TOKEN);\r\n        if (adalIdTokenString) {\r\n            this.browserStorage.removeItem(PersistentCacheKeys.ADAL_ID_TOKEN);\r\n            this.logger.verbose(\"Cached ADAL id token retrieved.\");\r\n        }\r\n\r\n        // Check for cached MSAL v1 id token\r\n        const msalIdTokenString = this.getTemporaryCache(PersistentCacheKeys.ID_TOKEN, true);\r\n        if (msalIdTokenString) {\r\n            this.removeItem(this.generateCacheKey(PersistentCacheKeys.ID_TOKEN));\r\n            this.logger.verbose(\"Cached MSAL.js v1 id token retrieved\");\r\n        }\r\n\r\n        const cachedIdTokenString = msalIdTokenString || adalIdTokenString;\r\n        if (cachedIdTokenString) {\r\n            const cachedIdToken = new IdToken(cachedIdTokenString, this.cryptoImpl);\r\n            if (cachedIdToken.claims && cachedIdToken.claims.preferred_username) {\r\n                this.logger.verbose(\"No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 preferred_username as loginHint\");\r\n                return cachedIdToken.claims.preferred_username;\r\n            }\r\n            else if (cachedIdToken.claims && cachedIdToken.claims.upn) {\r\n                this.logger.verbose(\"No SSO params used and ADAL/MSAL v1 token retrieved, setting ADAL/MSAL v1 upn as loginHint\");\r\n                return cachedIdToken.claims.upn;\r\n            }\r\n            else {\r\n                this.logger.verbose(\"No SSO params used and ADAL/MSAL v1 token retrieved, however, no account hint claim found. Enable preferred_username or upn id token claim to get SSO.\");\r\n            }\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n    /**\r\n     * Updates a credential's cache key if the current cache key is outdated\r\n     */\r\n    updateCredentialCacheKey(currentCacheKey: string, credential: ValidCredentialType): string {\r\n        const updatedCacheKey = credential.generateCredentialKey();\r\n\r\n        if (currentCacheKey !== updatedCacheKey) {\r\n            const cacheItem = this.getItem(currentCacheKey);\r\n            if (cacheItem) {\r\n                this.removeItem(currentCacheKey);\r\n                this.setItem(updatedCacheKey, cacheItem);\r\n                this.logger.verbose(`Updated an outdated ${credential.credentialType} cache key`);\r\n                return updatedCacheKey;\r\n            } else {\r\n                this.logger.error(`Attempted to update an outdated ${credential.credentialType} cache key but no item matching the outdated key was found in storage`);\r\n            }\r\n        }\r\n\r\n        return currentCacheKey;\r\n    }\r\n\r\n    /**\r\n     * Returns application id as redirect context during AcquireTokenRedirect flow.\r\n     */\r\n    getRedirectRequestContext(): string | null {\r\n        return this.getTemporaryCache(TemporaryCacheKeys.REDIRECT_CONTEXT, true);\r\n    }\r\n\r\n    /**\r\n     * Sets application id as the redirect context during AcquireTokenRedirect flow.\r\n     * @param value\r\n     */\r\n    setRedirectRequestContext(value: string): void {\r\n        this.setTemporaryCache(TemporaryCacheKeys.REDIRECT_CONTEXT, value, true);\r\n    }\r\n\r\n    /**\r\n     * Builds credential entities from AuthenticationResult object and saves the resulting credentials to the cache\r\n     * @param result\r\n     * @param request\r\n     */\r\n    async hydrateCache(\r\n        result: AuthenticationResult,\r\n        request: SilentRequest\r\n        | SsoSilentRequest\r\n        | RedirectRequest\r\n        | PopupRequest\r\n    ): Promise<void> {\r\n        const idTokenEntity = IdTokenEntity.createIdTokenEntity(\r\n            result.account?.homeAccountId || \"\" ,\r\n            result.account?.environment || \"\",\r\n            result.idToken,\r\n            this.clientId,\r\n            result.tenantId\r\n        );\r\n\r\n        let claimsHash;\r\n        if (request.claims) {\r\n            claimsHash = await this.cryptoImpl.hashString(request.claims);\r\n        }\r\n        const accessTokenEntity = AccessTokenEntity.createAccessTokenEntity(\r\n            result.account?.homeAccountId || \"\",\r\n            result.account?.environment || \"\",\r\n            result.accessToken,\r\n            this.clientId,\r\n            result.tenantId,\r\n            result.scopes.join(\" \"),\r\n            result.expiresOn?.getTime() || 0,\r\n            result.extExpiresOn?.getTime() || 0,\r\n            this.cryptoImpl,\r\n            undefined, // refreshOn\r\n            result.tokenType as AuthenticationScheme,\r\n            undefined, // userAssertionHash\r\n            request.sshKid,\r\n            request.claims,\r\n            claimsHash\r\n        );\r\n\r\n        const cacheRecord = new CacheRecord(\r\n            undefined,\r\n            idTokenEntity,\r\n            accessTokenEntity\r\n        );\r\n        return this.saveCacheRecord(cacheRecord);\r\n    }\r\n}\r\n\r\nexport const DEFAULT_BROWSER_CACHE_MANAGER = (clientId: string, logger: Logger): BrowserCacheManager => {\r\n    const cacheOptions: Required<CacheOptions> = {\r\n        cacheLocation: BrowserCacheLocation.MemoryStorage,\r\n        temporaryCacheLocation: BrowserCacheLocation.MemoryStorage,\r\n        storeAuthStateInCookie: false,\r\n        secureCookies: false,\r\n        cacheMigrationEnabled: false,\r\n        claimsBasedCachingEnabled: true\r\n    };\r\n    return new BrowserCacheManager(clientId, cacheOptions, DEFAULT_CRYPTO_IMPLEMENTATION, logger);\r\n};\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\nimport { LoggerOptions } from \"../config/ClientConfiguration\";\r\nimport { Constants } from \"../utils/Constants\";\r\n\r\n/**\r\n * Options for logger messages.\r\n */\r\nexport type LoggerMessageOptions = {\r\n    logLevel: LogLevel,\r\n    containsPii?: boolean,\r\n    context?: string,\r\n    correlationId?: string\r\n};\r\n\r\n/**\r\n * Log message level.\r\n */\r\nexport enum LogLevel {\r\n    Error,\r\n    Warning,\r\n    Info,\r\n    Verbose,\r\n    Trace\r\n}\r\n\r\n/**\r\n * Callback to send the messages to.\r\n */\r\nexport interface ILoggerCallback {\r\n    (level: LogLevel, message: string, containsPii: boolean): void;\r\n}\r\n\r\n/**\r\n * Class which facilitates logging of messages to a specific place.\r\n */\r\nexport class Logger {\r\n\r\n    // Correlation ID for request, usually set by user.\r\n    private correlationId: string;\r\n\r\n    // Current log level, defaults to info.\r\n    private level: LogLevel = LogLevel.Info;\r\n\r\n    // Boolean describing whether PII logging is allowed.\r\n    private piiLoggingEnabled: boolean;\r\n\r\n    // Callback to send messages to.\r\n    private localCallback: ILoggerCallback;\r\n\r\n    // Package name implementing this logger\r\n    private packageName: string;\r\n\r\n    // Package version implementing this logger\r\n    private packageVersion: string;\r\n\r\n    constructor(loggerOptions: LoggerOptions, packageName?: string, packageVersion?: string) {\r\n        const defaultLoggerCallback = () => {\r\n            return;\r\n        };\r\n        const setLoggerOptions = loggerOptions || Logger.createDefaultLoggerOptions();\r\n        this.localCallback = setLoggerOptions.loggerCallback || defaultLoggerCallback;\r\n        this.piiLoggingEnabled = setLoggerOptions.piiLoggingEnabled || false;\r\n        this.level = typeof(setLoggerOptions.logLevel) === \"number\" ? setLoggerOptions.logLevel : LogLevel.Info;\r\n        this.correlationId = setLoggerOptions.correlationId || Constants.EMPTY_STRING;\r\n        this.packageName = packageName || Constants.EMPTY_STRING;\r\n        this.packageVersion = packageVersion || Constants.EMPTY_STRING;\r\n    }\r\n    \r\n    private static createDefaultLoggerOptions(): LoggerOptions {\r\n        return {\r\n            loggerCallback: () => {\r\n                // allow users to not set loggerCallback\r\n            },\r\n            piiLoggingEnabled: false,\r\n            logLevel: LogLevel.Info\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Create new Logger with existing configurations.\r\n     */\r\n    public clone(packageName: string, packageVersion: string, correlationId?: string): Logger {\r\n        return new Logger({loggerCallback: this.localCallback, piiLoggingEnabled: this.piiLoggingEnabled, logLevel: this.level, correlationId: correlationId || this.correlationId}, packageName, packageVersion);\r\n    }\r\n\r\n    /**\r\n     * Log message with required options.\r\n     */\r\n    private logMessage(logMessage: string, options: LoggerMessageOptions): void {\r\n        if ((options.logLevel > this.level) || (!this.piiLoggingEnabled && options.containsPii)) {\r\n            return;\r\n        }\r\n        const timestamp = new Date().toUTCString();\r\n\r\n        // Add correlationId to logs if set, correlationId provided on log messages take precedence\r\n        let logHeader: string;\r\n        if (!StringUtils.isEmpty(options.correlationId)) {\r\n            logHeader = `[${timestamp}] : [${options.correlationId}]`;\r\n        } else if (!StringUtils.isEmpty(this.correlationId)) {\r\n            logHeader = `[${timestamp}] : [${this.correlationId}]`;\r\n        } else {\r\n            logHeader = `[${timestamp}]`;\r\n        }\r\n\r\n        const log = `${logHeader} : ${this.packageName}@${this.packageVersion} : ${LogLevel[options.logLevel]} - ${logMessage}`;\r\n        // debug(`msal:${LogLevel[options.logLevel]}${options.containsPii ? \"-Pii\": Constants.EMPTY_STRING}${options.context ? `:${options.context}` : Constants.EMPTY_STRING}`)(logMessage);\r\n        this.executeCallback(options.logLevel, log, options.containsPii || false);\r\n    }\r\n\r\n    /**\r\n     * Execute callback with message.\r\n     */\r\n    executeCallback(level: LogLevel, message: string, containsPii: boolean): void {\r\n        if (this.localCallback) {\r\n            this.localCallback(level, message, containsPii);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Logs error messages.\r\n     */\r\n    error(message: string, correlationId?: string): void {\r\n        this.logMessage(message, {\r\n            logLevel: LogLevel.Error,\r\n            containsPii: false,\r\n            correlationId: correlationId || Constants.EMPTY_STRING\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Logs error messages with PII.\r\n     */\r\n    errorPii(message: string, correlationId?: string): void {\r\n        this.logMessage(message, {\r\n            logLevel: LogLevel.Error,\r\n            containsPii: true,\r\n            correlationId: correlationId || Constants.EMPTY_STRING\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Logs warning messages.\r\n     */\r\n    warning(message: string, correlationId?: string): void {\r\n        this.logMessage(message, {\r\n            logLevel: LogLevel.Warning,\r\n            containsPii: false,\r\n            correlationId: correlationId || Constants.EMPTY_STRING\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Logs warning messages with PII.\r\n     */\r\n    warningPii(message: string, correlationId?: string): void {\r\n        this.logMessage(message, {\r\n            logLevel: LogLevel.Warning,\r\n            containsPii: true,\r\n            correlationId: correlationId || Constants.EMPTY_STRING\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Logs info messages.\r\n     */\r\n    info(message: string, correlationId?: string): void {\r\n        this.logMessage(message, {\r\n            logLevel: LogLevel.Info,\r\n            containsPii: false,\r\n            correlationId: correlationId || Constants.EMPTY_STRING\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Logs info messages with PII.\r\n     */\r\n    infoPii(message: string, correlationId?: string): void {\r\n        this.logMessage(message, {\r\n            logLevel: LogLevel.Info,\r\n            containsPii: true,\r\n            correlationId: correlationId || Constants.EMPTY_STRING\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Logs verbose messages.\r\n     */\r\n    verbose(message: string, correlationId?: string): void {\r\n        this.logMessage(message, {\r\n            logLevel: LogLevel.Verbose,\r\n            containsPii: false,\r\n            correlationId: correlationId || Constants.EMPTY_STRING\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Logs verbose messages with PII.\r\n     */\r\n    verbosePii(message: string, correlationId?: string): void {\r\n        this.logMessage(message, {\r\n            logLevel: LogLevel.Verbose,\r\n            containsPii: true,\r\n            correlationId: correlationId || Constants.EMPTY_STRING\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Logs trace messages.\r\n     */\r\n    trace(message: string, correlationId?: string): void {\r\n        this.logMessage(message, {\r\n            logLevel: LogLevel.Trace,\r\n            containsPii: false,\r\n            correlationId: correlationId || Constants.EMPTY_STRING\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Logs trace messages with PII.\r\n     */\r\n    tracePii(message: string, correlationId?: string): void {\r\n        this.logMessage(message, {\r\n            logLevel: LogLevel.Trace,\r\n            containsPii: true,\r\n            correlationId: correlationId || Constants.EMPTY_STRING\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Returns whether PII Logging is enabled or not.\r\n     */\r\n    isPiiLoggingEnabled(): boolean {\r\n        return this.piiLoggingEnabled || false;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ProtocolMode } from \"./ProtocolMode\";\r\nimport { AzureRegionConfiguration } from \"./AzureRegionConfiguration\";\r\n\r\nexport type AuthorityOptions = {\r\n    protocolMode: ProtocolMode;\r\n    knownAuthorities: Array<string>;\r\n    cloudDiscoveryMetadata: string;\r\n    authorityMetadata: string;\r\n    skipAuthorityMetadataCache?: boolean;\r\n    azureRegionConfiguration?: AzureRegionConfiguration;\r\n};\r\n\r\nexport enum AzureCloudInstance {\r\n    // AzureCloudInstance is not specified.\r\n    None,\r\n\r\n    // Microsoft Azure public cloud\r\n    AzurePublic = \"https://login.microsoftonline.com\",\r\n\r\n    // Microsoft PPE\r\n    AzurePpe = \"https://login.windows-ppe.net\",\r\n\r\n    // Microsoft Chinese national cloud\r\n    AzureChina = \"https://login.chinacloudapi.cn\",\r\n\r\n    // Microsoft German national cloud (\"Black Forest\")\r\n    AzureGermany = \"https://login.microsoftonline.de\",\r\n\r\n    // US Government cloud\r\n    AzureUsGovernment = \"https://login.microsoftonline.us\",\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { INetworkModule } from \"../network/INetworkModule\";\r\nimport { DEFAULT_CRYPTO_IMPLEMENTATION, ICrypto } from \"../crypto/ICrypto\";\r\nimport { AuthError } from \"../error/AuthError\";\r\nimport { ILoggerCallback, Logger, LogLevel } from \"../logger/Logger\";\r\nimport { Constants } from \"../utils/Constants\";\r\nimport { version } from \"../packageMetadata\";\r\nimport { Authority } from \"../authority/Authority\";\r\nimport { AzureCloudInstance } from \"../authority/AuthorityOptions\";\r\nimport { CacheManager, DefaultStorageClass } from \"../cache/CacheManager\";\r\nimport { ServerTelemetryManager } from \"../telemetry/server/ServerTelemetryManager\";\r\nimport { ICachePlugin } from \"../cache/interface/ICachePlugin\";\r\nimport { ISerializableTokenCache } from \"../cache/interface/ISerializableTokenCache\";\r\nimport { ClientCredentials } from \"../account/ClientCredentials\";\r\n\r\n// Token renewal offset default in seconds\r\nconst DEFAULT_TOKEN_RENEWAL_OFFSET_SEC = 300;\r\n\r\n/**\r\n * Use the configuration object to configure MSAL Modules and initialize the base interfaces for MSAL.\r\n *\r\n * This object allows you to configure important elements of MSAL functionality:\r\n * - authOptions                - Authentication for application\r\n * - cryptoInterface            - Implementation of crypto functions\r\n * - libraryInfo                - Library metadata\r\n * - telemetry                  - Telemetry options and data\r\n * - loggerOptions              - Logging for application\r\n * - cacheOptions               - Cache options for application\r\n * - networkInterface           - Network implementation\r\n * - storageInterface           - Storage implementation\r\n * - systemOptions              - Additional library options\r\n * - clientCredentials          - Credentials options for confidential clients\r\n */\r\nexport type ClientConfiguration = {\r\n    authOptions: AuthOptions,\r\n    systemOptions?: SystemOptions,\r\n    loggerOptions?: LoggerOptions,\r\n    cacheOptions?: CacheOptions,\r\n    storageInterface?: CacheManager,\r\n    networkInterface?: INetworkModule,\r\n    cryptoInterface?: ICrypto,\r\n    clientCredentials?: ClientCredentials,\r\n    libraryInfo?: LibraryInfo\r\n    telemetry?: TelemetryOptions,\r\n    serverTelemetryManager?: ServerTelemetryManager | null,\r\n    persistencePlugin?: ICachePlugin | null,\r\n    serializableCache?: ISerializableTokenCache | null,   \r\n};\r\n\r\nexport type CommonClientConfiguration = {\r\n    authOptions: Required<AuthOptions>,\r\n    systemOptions: Required<SystemOptions>,\r\n    loggerOptions : Required<LoggerOptions>,\r\n    cacheOptions: Required<CacheOptions>,\r\n    storageInterface: CacheManager,\r\n    networkInterface : INetworkModule,\r\n    cryptoInterface : Required<ICrypto>,\r\n    libraryInfo : LibraryInfo,\r\n    telemetry: Required<TelemetryOptions>,\r\n    serverTelemetryManager: ServerTelemetryManager | null,\r\n    clientCredentials: ClientCredentials,\r\n    persistencePlugin: ICachePlugin | null,\r\n    serializableCache: ISerializableTokenCache | null,    \r\n};\r\n\r\n/**\r\n * Use this to configure the auth options in the ClientConfiguration object\r\n *\r\n * - clientId                    - Client ID of your app registered with our Application registration portal : https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview in Microsoft Identity Platform\r\n * - authority                   - You can configure a specific authority, defaults to \" \" or \"https://login.microsoftonline.com/common\"\r\n * - knownAuthorities            - An array of URIs that are known to be valid. Used in B2C scenarios.\r\n * - cloudDiscoveryMetadata      - A string containing the cloud discovery response. Used in AAD scenarios.\r\n * - clientCapabilities          - Array of capabilities which will be added to the claims.access_token.xms_cc request property on every network request.\r\n * - protocolMode                - Enum that represents the protocol that msal follows. Used for configuring proper endpoints.\r\n * - skipAuthorityMetadataCache      - A flag to choose whether to use or not use the local metadata cache during authority initialization. Defaults to false.\r\n */\r\nexport type AuthOptions = {\r\n    clientId: string;\r\n    authority: Authority;\r\n    clientCapabilities?: Array<string>;\r\n    azureCloudOptions?: AzureCloudOptions;\r\n    skipAuthorityMetadataCache?: boolean;\r\n};\r\n\r\n/**\r\n * Use this to configure token renewal info in the Configuration object\r\n *\r\n * - tokenRenewalOffsetSeconds    - Sets the window of offset needed to renew the token before expiry\r\n */\r\nexport type SystemOptions = {\r\n    tokenRenewalOffsetSeconds?: number;\r\n    preventCorsPreflight?: boolean;\r\n};\r\n\r\n/**\r\n *  Use this to configure the logging that MSAL does, by configuring logger options in the Configuration object\r\n *\r\n * - loggerCallback                - Callback for logger\r\n * - piiLoggingEnabled             - Sets whether pii logging is enabled\r\n * - logLevel                      - Sets the level at which logging happens\r\n * - correlationId                 - Sets the correlationId printed by the logger\r\n */\r\nexport type LoggerOptions = {\r\n    loggerCallback?: ILoggerCallback,\r\n    piiLoggingEnabled?: boolean,\r\n    logLevel?: LogLevel,\r\n    correlationId?: string\r\n};\r\n\r\n/**\r\n *  Use this to configure credential cache preferences in the ClientConfiguration object\r\n *\r\n * - claimsBasedCachingEnabled   - Sets whether tokens should be cached based on the claims hash. Default is true.\r\n */\r\nexport type CacheOptions = {\r\n    claimsBasedCachingEnabled?: boolean;\r\n};\r\n\r\n/**\r\n * Library-specific options\r\n */\r\nexport type LibraryInfo = {\r\n    sku: string,\r\n    version: string,\r\n    cpu: string,\r\n    os: string\r\n};\r\n\r\n/**\r\n * AzureCloudInstance specific options\r\n *\r\n * - azureCloudInstance             - string enum providing short notation for soverign and public cloud authorities\r\n * - tenant                         - provision to provide the tenant info\r\n */\r\nexport type AzureCloudOptions = {\r\n    azureCloudInstance: AzureCloudInstance;\r\n    tenant?: string,\r\n};\r\n\r\nexport type TelemetryOptions = {\r\n    application: ApplicationTelemetry;\r\n};\r\n\r\n/**\r\n * Telemetry information sent on request\r\n * - appName: Unique string name of an application\r\n * - appVersion: Version of the application using MSAL\r\n */\r\nexport type ApplicationTelemetry = {\r\n    appName: string;\r\n    appVersion: string;\r\n};\r\n\r\nexport const DEFAULT_SYSTEM_OPTIONS: Required<SystemOptions> = {\r\n    tokenRenewalOffsetSeconds: DEFAULT_TOKEN_RENEWAL_OFFSET_SEC,\r\n    preventCorsPreflight: false\r\n};\r\n\r\nconst DEFAULT_LOGGER_IMPLEMENTATION: Required<LoggerOptions> = {\r\n    loggerCallback: () => {\r\n        // allow users to not set loggerCallback\r\n    },\r\n    piiLoggingEnabled: false,\r\n    logLevel: LogLevel.Info,\r\n    correlationId: Constants.EMPTY_STRING\r\n};\r\n\r\nconst DEFAULT_CACHE_OPTIONS: Required<CacheOptions> = {\r\n    claimsBasedCachingEnabled: true\r\n};\r\n\r\nconst DEFAULT_NETWORK_IMPLEMENTATION: INetworkModule = {\r\n    async sendGetRequestAsync<T>(): Promise<T> {\r\n        const notImplErr = \"Network interface - sendGetRequestAsync() has not been implemented\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    },\r\n    async sendPostRequestAsync<T>(): Promise<T> {\r\n        const notImplErr = \"Network interface - sendPostRequestAsync() has not been implemented\";\r\n        throw AuthError.createUnexpectedError(notImplErr);\r\n    }\r\n};\r\n\r\nconst DEFAULT_LIBRARY_INFO: LibraryInfo = {\r\n    sku: Constants.SKU,\r\n    version: version,\r\n    cpu: Constants.EMPTY_STRING,\r\n    os: Constants.EMPTY_STRING\r\n};\r\n\r\nconst DEFAULT_CLIENT_CREDENTIALS: ClientCredentials = {\r\n    clientSecret: Constants.EMPTY_STRING,\r\n    clientAssertion: undefined\r\n};\r\n\r\nconst DEFAULT_AZURE_CLOUD_OPTIONS: AzureCloudOptions = {\r\n    azureCloudInstance: AzureCloudInstance.None,\r\n    tenant: `${Constants.DEFAULT_COMMON_TENANT}`\r\n};\r\n\r\nconst DEFAULT_TELEMETRY_OPTIONS: Required<TelemetryOptions> = {\r\n    application: {\r\n        appName: \"\",\r\n        appVersion: \"\"\r\n    }\r\n};\r\n\r\n/**\r\n * Function that sets the default options when not explicitly configured from app developer\r\n *\r\n * @param Configuration\r\n *\r\n * @returns Configuration\r\n */\r\nexport function buildClientConfiguration(\r\n    {\r\n        authOptions: userAuthOptions,\r\n        systemOptions: userSystemOptions,\r\n        loggerOptions: userLoggerOption,\r\n        cacheOptions: userCacheOptions,\r\n        storageInterface: storageImplementation,\r\n        networkInterface: networkImplementation,\r\n        cryptoInterface: cryptoImplementation,\r\n        clientCredentials: clientCredentials,\r\n        libraryInfo: libraryInfo,\r\n        telemetry: telemetry,\r\n        serverTelemetryManager: serverTelemetryManager,\r\n        persistencePlugin: persistencePlugin,\r\n        serializableCache: serializableCache,             \r\n    }: ClientConfiguration): CommonClientConfiguration {\r\n\r\n    const loggerOptions = { ...DEFAULT_LOGGER_IMPLEMENTATION, ...userLoggerOption };\r\n\r\n    return {\r\n        authOptions: buildAuthOptions(userAuthOptions),\r\n        systemOptions: { ...DEFAULT_SYSTEM_OPTIONS, ...userSystemOptions },\r\n        loggerOptions: loggerOptions,\r\n        cacheOptions: {...DEFAULT_CACHE_OPTIONS, ...userCacheOptions },\r\n        storageInterface: storageImplementation || new DefaultStorageClass(userAuthOptions.clientId, DEFAULT_CRYPTO_IMPLEMENTATION, new Logger(loggerOptions)),\r\n        networkInterface: networkImplementation || DEFAULT_NETWORK_IMPLEMENTATION,\r\n        cryptoInterface: cryptoImplementation || DEFAULT_CRYPTO_IMPLEMENTATION,\r\n        clientCredentials: clientCredentials || DEFAULT_CLIENT_CREDENTIALS,\r\n        libraryInfo: { ...DEFAULT_LIBRARY_INFO, ...libraryInfo },\r\n        telemetry: { ...DEFAULT_TELEMETRY_OPTIONS, ...telemetry },\r\n        serverTelemetryManager: serverTelemetryManager || null,\r\n        persistencePlugin: persistencePlugin || null,\r\n        serializableCache: serializableCache || null,             \r\n    };\r\n}\r\n\r\n/**\r\n * Construct authoptions from the client and platform passed values\r\n * @param authOptions\r\n */\r\nfunction buildAuthOptions(authOptions: AuthOptions): Required<AuthOptions> {\r\n    return {\r\n        clientCapabilities: [],\r\n        azureCloudOptions: DEFAULT_AZURE_CLOUD_OPTIONS,\r\n        skipAuthorityMetadataCache: false,\r\n        ...authOptions\r\n    };\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ICrypto, SignedHttpRequestParameters } from \"./ICrypto\";\r\nimport { TimeUtils } from \"../utils/TimeUtils\";\r\nimport { UrlString } from \"../url/UrlString\";\r\nimport { IPerformanceClient } from \"../telemetry/performance/IPerformanceClient\";\r\nimport { PerformanceEvents } from \"../telemetry/performance/PerformanceEvent\";\r\n\r\n/**\r\n * See eSTS docs for more info.\r\n * - A kid element, with the value containing an RFC 7638-compliant JWK thumbprint that is base64 encoded.\r\n * -  xms_ksl element, representing the storage location of the key's secret component on the client device. One of two values:\r\n *      - sw: software storage\r\n *      - uhw: hardware storage\r\n */\r\ntype ReqCnf = {\r\n    kid: string;\r\n    xms_ksl: KeyLocation;\r\n};\r\n\r\nexport type ReqCnfData = {\r\n    kid: string;\r\n    reqCnfString: string;\r\n    reqCnfHash: string;\r\n};\r\n\r\nenum KeyLocation {\r\n    SW = \"sw\",\r\n    UHW = \"uhw\"\r\n}\r\n\r\nexport class PopTokenGenerator {\r\n\r\n    private cryptoUtils: ICrypto;\r\n    private performanceClient?: IPerformanceClient;\r\n\r\n    constructor(cryptoUtils: ICrypto, performanceClient?: IPerformanceClient) {\r\n        this.cryptoUtils = cryptoUtils;\r\n        this.performanceClient = performanceClient;\r\n    }\r\n\r\n    /**\r\n     * Generates the req_cnf validated at the RP in the POP protocol for SHR parameters\r\n     * and returns an object containing the keyid, the full req_cnf string and the req_cnf string hash\r\n     * @param request\r\n     * @returns\r\n     */\r\n    async generateCnf(request: SignedHttpRequestParameters): Promise<ReqCnfData> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.PopTokenGenerateCnf, request.correlationId);\r\n\r\n        this.performanceClient?.setPreQueueTime(PerformanceEvents.PopTokenGenerateKid, request.correlationId);\r\n        const reqCnf = await this.generateKid(request);\r\n        const reqCnfString: string = this.cryptoUtils.base64Encode(JSON.stringify(reqCnf));\r\n\r\n        return {\r\n            kid: reqCnf.kid,\r\n            reqCnfString, \r\n            reqCnfHash: await this.cryptoUtils.hashString(reqCnfString) \r\n        };\r\n    }\r\n\r\n    /**\r\n     * Generates key_id for a SHR token request\r\n     * @param request\r\n     * @returns\r\n     */\r\n    async generateKid(request: SignedHttpRequestParameters): Promise<ReqCnf> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.PopTokenGenerateKid, request.correlationId);\r\n\r\n        const kidThumbprint = await this.cryptoUtils.getPublicKeyThumbprint(request);\r\n\r\n        return {\r\n            kid: kidThumbprint,\r\n            xms_ksl: KeyLocation.SW\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Signs the POP access_token with the local generated key-pair\r\n     * @param accessToken\r\n     * @param request\r\n     * @returns\r\n     */\r\n    async signPopToken(accessToken: string, keyId: string, request: SignedHttpRequestParameters): Promise<string> {\r\n        return this.signPayload(accessToken, keyId, request);\r\n    }\r\n\r\n    /**\r\n     * Utility function to generate the signed JWT for an access_token\r\n     * @param payload\r\n     * @param kid\r\n     * @param request\r\n     * @param claims\r\n     * @returns\r\n     */\r\n    async signPayload(payload: string, keyId: string, request: SignedHttpRequestParameters, claims?: object): Promise<string> {\r\n\r\n        // Deconstruct request to extract SHR parameters\r\n        const { resourceRequestMethod, resourceRequestUri, shrClaims, shrNonce } = request;\r\n\r\n        const resourceUrlString = (resourceRequestUri) ? new UrlString(resourceRequestUri) : undefined;\r\n        const resourceUrlComponents = resourceUrlString?.getUrlComponents();\r\n        return await this.cryptoUtils.signJwt({\r\n            at: payload,\r\n            ts: TimeUtils.nowSeconds(),\r\n            m: resourceRequestMethod?.toUpperCase(),\r\n            u: resourceUrlComponents?.HostNameAndPort,\r\n            nonce: shrNonce || this.cryptoUtils.createNewGuid(),\r\n            p: resourceUrlComponents?.AbsolutePath,\r\n            q: (resourceUrlComponents?.QueryString) ? [[], resourceUrlComponents.QueryString] : undefined,\r\n            client_claims: shrClaims || undefined,\r\n            ...claims\r\n        }, keyId, request.correlationId);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthError } from \"./AuthError\";\r\n\r\n/**\r\n * Error thrown when there is an error with the server code, for example, unavailability.\r\n */\r\nexport class ServerError extends AuthError {\r\n\r\n    constructor(errorCode?: string, errorMessage?: string, subError?: string) {\r\n        super(errorCode, errorMessage, subError);\r\n        this.name = \"ServerError\";\r\n\r\n        Object.setPrototypeOf(this, ServerError.prototype);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { NetworkResponse } from \"./NetworkManager\";\r\nimport { ServerAuthorizationTokenResponse } from \"../response/ServerAuthorizationTokenResponse\";\r\nimport { HeaderNames, ThrottlingConstants, Constants } from \"../utils/Constants\";\r\nimport { CacheManager } from \"../cache/CacheManager\";\r\nimport { ServerError } from \"../error/ServerError\";\r\nimport { RequestThumbprint } from \"./RequestThumbprint\";\r\nimport { ThrottlingEntity } from \"../cache/entities/ThrottlingEntity\";\r\nimport { BaseAuthRequest } from \"../request/BaseAuthRequest\";\r\n\r\nexport class ThrottlingUtils {\r\n\r\n    /**\r\n     * Prepares a RequestThumbprint to be stored as a key.\r\n     * @param thumbprint\r\n     */\r\n    static generateThrottlingStorageKey(thumbprint: RequestThumbprint): string {\r\n        return `${ThrottlingConstants.THROTTLING_PREFIX}.${JSON.stringify(thumbprint)}`;\r\n    }\r\n\r\n    /**\r\n     * Performs necessary throttling checks before a network request.\r\n     * @param cacheManager\r\n     * @param thumbprint\r\n     */\r\n    static preProcess(cacheManager: CacheManager, thumbprint: RequestThumbprint): void {\r\n        const key = ThrottlingUtils.generateThrottlingStorageKey(thumbprint);\r\n        const value = cacheManager.getThrottlingCache(key);\r\n\r\n        if (value) {\r\n            if (value.throttleTime < Date.now()) {\r\n                cacheManager.removeItem(key);\r\n                return;\r\n            }\r\n            throw new ServerError(value.errorCodes?.join(\" \") || Constants.EMPTY_STRING, value.errorMessage, value.subError);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Performs necessary throttling checks after a network request.\r\n     * @param cacheManager\r\n     * @param thumbprint\r\n     * @param response\r\n     */\r\n    static postProcess(cacheManager: CacheManager, thumbprint: RequestThumbprint, response: NetworkResponse<ServerAuthorizationTokenResponse>): void {\r\n        if (ThrottlingUtils.checkResponseStatus(response) || ThrottlingUtils.checkResponseForRetryAfter(response)) {\r\n            const thumbprintValue: ThrottlingEntity = {\r\n                throttleTime: ThrottlingUtils.calculateThrottleTime(parseInt(response.headers[HeaderNames.RETRY_AFTER])),\r\n                error: response.body.error,\r\n                errorCodes: response.body.error_codes,\r\n                errorMessage: response.body.error_description,\r\n                subError: response.body.suberror\r\n            };\r\n            cacheManager.setThrottlingCache(\r\n                ThrottlingUtils.generateThrottlingStorageKey(thumbprint),\r\n                thumbprintValue\r\n            );\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Checks a NetworkResponse object's status codes against 429 or 5xx\r\n     * @param response\r\n     */\r\n    static checkResponseStatus(response: NetworkResponse<ServerAuthorizationTokenResponse>): boolean {\r\n        return response.status === 429 || response.status >= 500 && response.status < 600;\r\n    }\r\n\r\n    /**\r\n     * Checks a NetworkResponse object's RetryAfter header\r\n     * @param response\r\n     */\r\n    static checkResponseForRetryAfter(response: NetworkResponse<ServerAuthorizationTokenResponse>): boolean {\r\n        if (response.headers) {\r\n            return response.headers.hasOwnProperty(HeaderNames.RETRY_AFTER) && (response.status < 200 || response.status >= 300);\r\n        }\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * Calculates the Unix-time value for a throttle to expire given throttleTime in seconds.\r\n     * @param throttleTime\r\n     */\r\n    static calculateThrottleTime(throttleTime: number): number {\r\n        const time = throttleTime <= 0 ? 0 : throttleTime;\r\n\r\n        const currentSeconds = Date.now() / 1000;\r\n        return Math.floor(Math.min(\r\n            currentSeconds + (time || ThrottlingConstants.DEFAULT_THROTTLE_TIME_SECONDS),\r\n            currentSeconds + ThrottlingConstants.DEFAULT_MAX_THROTTLE_TIME_SECONDS\r\n        ) * 1000);\r\n    }\r\n\r\n    static removeThrottle(cacheManager: CacheManager, clientId: string, request: BaseAuthRequest, homeAccountIdentifier?: string): void {\r\n        const thumbprint: RequestThumbprint = {\r\n            clientId: clientId,\r\n            authority: request.authority,\r\n            scopes: request.scopes,\r\n            homeAccountIdentifier: homeAccountIdentifier,\r\n            claims: request.claims,\r\n            authenticationScheme: request.authenticationScheme,\r\n            resourceRequestMethod: request.resourceRequestMethod,\r\n            resourceRequestUri: request.resourceRequestUri,\r\n            shrClaims: request.shrClaims,\r\n            sshKid: request.sshKid\r\n        };\r\n\r\n        const key = this.generateThrottlingStorageKey(thumbprint);\r\n        cacheManager.removeItem(key);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { INetworkModule, NetworkRequestOptions } from \"./INetworkModule\";\r\nimport { RequestThumbprint } from \"./RequestThumbprint\";\r\nimport { ThrottlingUtils } from \"./ThrottlingUtils\";\r\nimport { CacheManager } from \"../cache/CacheManager\";\r\nimport { AuthError } from \"../error/AuthError\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\n\r\nexport type NetworkResponse<T> = {\r\n    headers: Record<string, string>;\r\n    body: T;\r\n    status: number;\r\n};\r\n\r\nexport type UrlToHttpRequestOptions = {\r\n    protocol: string;\r\n    hostname: string;\r\n    hash: string;\r\n    search: string;\r\n    pathname: string;\r\n    path: string;\r\n    href: string;\r\n    port?: number;\r\n    auth?: string;\r\n};\r\n\r\nexport class NetworkManager {\r\n    private networkClient: INetworkModule;\r\n    private cacheManager: CacheManager;\r\n\r\n    constructor(networkClient: INetworkModule, cacheManager: CacheManager) {\r\n        this.networkClient = networkClient;\r\n        this.cacheManager = cacheManager;\r\n    }\r\n\r\n    /**\r\n     * Wraps sendPostRequestAsync with necessary preflight and postflight logic\r\n     * @param thumbprint\r\n     * @param tokenEndpoint\r\n     * @param options\r\n     */\r\n    async sendPostRequest<T>(thumbprint: RequestThumbprint, tokenEndpoint: string, options: NetworkRequestOptions): Promise<NetworkResponse<T>> {\r\n        ThrottlingUtils.preProcess(this.cacheManager, thumbprint);\r\n\r\n        let response;\r\n        try {\r\n            response = await this.networkClient.sendPostRequestAsync<T>(tokenEndpoint, options);\r\n        } catch (e) {\r\n            if (e instanceof AuthError) {\r\n                throw e;\r\n            } else {\r\n                throw ClientAuthError.createNetworkError(tokenEndpoint, e);\r\n            }\r\n        }\r\n\r\n        ThrottlingUtils.postProcess(this.cacheManager, thumbprint, response);\r\n\r\n        return response;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\nimport { ClientConfigurationError } from \"../error/ClientConfigurationError\";\r\nimport { PromptValue, CodeChallengeMethodValues} from \"../utils/Constants\";\r\nimport { StringDict } from \"../utils/MsalTypes\";\r\n\r\n/**\r\n * Validates server consumable params from the \"request\" objects\r\n */\r\nexport class RequestValidator {\r\n\r\n    /**\r\n     * Utility to check if the `redirectUri` in the request is a non-null value\r\n     * @param redirectUri\r\n     */\r\n    static validateRedirectUri(redirectUri: string) : void {\r\n        if (StringUtils.isEmpty(redirectUri)) {\r\n            throw ClientConfigurationError.createRedirectUriEmptyError();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Utility to validate prompt sent by the user in the request\r\n     * @param prompt\r\n     */\r\n    static validatePrompt(prompt: string) : void {\r\n        const promptValues = [];\r\n\r\n        for (const value in PromptValue) {\r\n            promptValues.push(PromptValue[value]);\r\n        }\r\n\r\n        if (promptValues.indexOf(prompt) < 0) {\r\n            throw ClientConfigurationError.createInvalidPromptError(prompt);\r\n        }\r\n    }\r\n\r\n    static validateClaims(claims: string) : void {\r\n        try {\r\n            JSON.parse(claims);\r\n        } catch(e) {\r\n            throw ClientConfigurationError.createInvalidClaimsRequestError();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Utility to validate code_challenge and code_challenge_method\r\n     * @param codeChallenge\r\n     * @param codeChallengeMethod\r\n     */\r\n    static validateCodeChallengeParams(codeChallenge: string, codeChallengeMethod: string) : void  {\r\n        if (StringUtils.isEmpty(codeChallenge) || StringUtils.isEmpty(codeChallengeMethod)) {\r\n            throw ClientConfigurationError.createInvalidCodeChallengeParamsError();\r\n        } else {\r\n            this.validateCodeChallengeMethod(codeChallengeMethod);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Utility to validate code_challenge_method\r\n     * @param codeChallengeMethod\r\n     */\r\n    static validateCodeChallengeMethod(codeChallengeMethod: string) : void {\r\n        if (\r\n            [\r\n                CodeChallengeMethodValues.PLAIN,\r\n                CodeChallengeMethodValues.S256\r\n            ].indexOf(codeChallengeMethod) < 0\r\n        ) {\r\n            throw ClientConfigurationError.createInvalidCodeChallengeMethodError();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Removes unnecessary, duplicate, and empty string query parameters from extraQueryParameters\r\n     * @param request\r\n     */\r\n    static sanitizeEQParams(eQParams: StringDict, queryParams: Map<string, string>) : StringDict {\r\n        if (!eQParams) {\r\n            return {};\r\n        }\r\n\r\n        // Remove any query parameters already included in SSO params\r\n        queryParams.forEach((value, key) => {\r\n            if (eQParams[key]) {\r\n                delete eQParams[key];\r\n            }\r\n        });\r\n\r\n        // remove empty string parameters\r\n        // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n        return Object.fromEntries(Object.entries(eQParams).filter(([key, value]) => value !== \"\"));\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AADServerParamKeys, Constants, ResponseMode, SSOTypes, CLIENT_INFO, AuthenticationScheme, ClaimsRequestKeys, PasswordGrantConstants, OIDC_DEFAULT_SCOPES, ThrottlingConstants, HeaderNames} from \"../utils/Constants\";\r\nimport { ScopeSet } from \"./ScopeSet\";\r\nimport { ClientConfigurationError } from \"../error/ClientConfigurationError\";\r\nimport { StringDict } from \"../utils/MsalTypes\";\r\nimport { RequestValidator } from \"./RequestValidator\";\r\nimport { ApplicationTelemetry, LibraryInfo } from \"../config/ClientConfiguration\";\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\nimport { ServerTelemetryManager } from \"../telemetry/server/ServerTelemetryManager\";\r\nimport { ClientInfo } from \"../account/ClientInfo\";\r\n\r\nexport class RequestParameterBuilder {\r\n\r\n    private parameters: Map<string, string>;\r\n\r\n    constructor() {\r\n        this.parameters = new Map<string, string>();\r\n    }\r\n\r\n    /**\r\n     * add response_type = code\r\n     */\r\n    addResponseTypeCode(): void {\r\n        this.parameters.set(\r\n            AADServerParamKeys.RESPONSE_TYPE, encodeURIComponent(Constants.CODE_RESPONSE_TYPE)\r\n        );\r\n    }\r\n\r\n    /**\r\n     * add response_type = token id_token\r\n     */\r\n    addResponseTypeForTokenAndIdToken(): void {\r\n        this.parameters.set(\r\n            AADServerParamKeys.RESPONSE_TYPE, encodeURIComponent(`${Constants.TOKEN_RESPONSE_TYPE} ${Constants.ID_TOKEN_RESPONSE_TYPE}`)\r\n        );\r\n    }\r\n\r\n    /**\r\n     * add response_mode. defaults to query.\r\n     * @param responseMode\r\n     */\r\n    addResponseMode(responseMode?: ResponseMode): void {\r\n        this.parameters.set(\r\n            AADServerParamKeys.RESPONSE_MODE,\r\n            encodeURIComponent((responseMode) ? responseMode : ResponseMode.QUERY)\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Add flag to indicate STS should attempt to use WAM if available\r\n     */\r\n    addNativeBroker(): void {\r\n        this.parameters.set(\r\n            AADServerParamKeys.NATIVE_BROKER,\r\n            encodeURIComponent(\"1\")\r\n        );\r\n    }\r\n\r\n    /**\r\n     * add scopes. set addOidcScopes to false to prevent default scopes in non-user scenarios\r\n     * @param scopeSet\r\n     * @param addOidcScopes\r\n     */\r\n    addScopes(scopes: string[], addOidcScopes: boolean = true): void {\r\n        const requestScopes = addOidcScopes ? [...scopes || [], ...OIDC_DEFAULT_SCOPES] : scopes || [];\r\n        const scopeSet = new ScopeSet(requestScopes);\r\n        this.parameters.set(AADServerParamKeys.SCOPE, encodeURIComponent(scopeSet.printScopes()));\r\n    }\r\n\r\n    /**\r\n     * add clientId\r\n     * @param clientId\r\n     */\r\n    addClientId(clientId: string): void {\r\n        this.parameters.set(AADServerParamKeys.CLIENT_ID, encodeURIComponent(clientId));\r\n    }\r\n\r\n    /**\r\n     * add redirect_uri\r\n     * @param redirectUri\r\n     */\r\n    addRedirectUri(redirectUri: string): void {\r\n        RequestValidator.validateRedirectUri(redirectUri);\r\n        this.parameters.set(AADServerParamKeys.REDIRECT_URI, encodeURIComponent(redirectUri));\r\n    }\r\n\r\n    /**\r\n     * add post logout redirectUri\r\n     * @param redirectUri\r\n     */\r\n    addPostLogoutRedirectUri(redirectUri: string): void {\r\n        RequestValidator.validateRedirectUri(redirectUri);\r\n        this.parameters.set(AADServerParamKeys.POST_LOGOUT_URI, encodeURIComponent(redirectUri));\r\n    }\r\n\r\n    /**\r\n     * add id_token_hint to logout request\r\n     * @param idTokenHint\r\n     */\r\n    addIdTokenHint(idTokenHint: string): void {\r\n        this.parameters.set(AADServerParamKeys.ID_TOKEN_HINT, encodeURIComponent(idTokenHint));\r\n    }\r\n\r\n    /**\r\n     * add domain_hint\r\n     * @param domainHint\r\n     */\r\n    addDomainHint(domainHint: string): void {\r\n        this.parameters.set(SSOTypes.DOMAIN_HINT, encodeURIComponent(domainHint));\r\n    }\r\n\r\n    /**\r\n     * add login_hint\r\n     * @param loginHint\r\n     */\r\n    addLoginHint(loginHint: string): void {\r\n        this.parameters.set(SSOTypes.LOGIN_HINT, encodeURIComponent(loginHint));\r\n    }\r\n\r\n    /**\r\n     * Adds the CCS (Cache Credential Service) query parameter for login_hint\r\n     * @param loginHint\r\n     */\r\n    addCcsUpn(loginHint: string): void {\r\n        this.parameters.set(HeaderNames.CCS_HEADER, encodeURIComponent(`UPN:${loginHint}`));\r\n    }\r\n\r\n    /**\r\n     * Adds the CCS (Cache Credential Service) query parameter for account object\r\n     * @param loginHint\r\n     */\r\n    addCcsOid(clientInfo: ClientInfo): void {\r\n        this.parameters.set(HeaderNames.CCS_HEADER, encodeURIComponent(`Oid:${clientInfo.uid}@${clientInfo.utid}`));\r\n    }\r\n\r\n    /**\r\n     * add sid\r\n     * @param sid\r\n     */\r\n    addSid(sid: string): void {\r\n        this.parameters.set(SSOTypes.SID, encodeURIComponent(sid));\r\n    }\r\n\r\n    /**\r\n     * add claims\r\n     * @param claims\r\n     */\r\n    addClaims(claims?: string, clientCapabilities?: Array<string>): void {\r\n        const mergedClaims = this.addClientCapabilitiesToClaims(claims, clientCapabilities);\r\n        RequestValidator.validateClaims(mergedClaims);\r\n        this.parameters.set(AADServerParamKeys.CLAIMS, encodeURIComponent(mergedClaims));\r\n    }\r\n\r\n    /**\r\n     * add correlationId\r\n     * @param correlationId\r\n     */\r\n    addCorrelationId(correlationId: string): void {\r\n        this.parameters.set(AADServerParamKeys.CLIENT_REQUEST_ID, encodeURIComponent(correlationId));\r\n    }\r\n\r\n    /**\r\n     * add library info query params\r\n     * @param libraryInfo\r\n     */\r\n    addLibraryInfo(libraryInfo: LibraryInfo): void {\r\n        // Telemetry Info\r\n        this.parameters.set(AADServerParamKeys.X_CLIENT_SKU, libraryInfo.sku);\r\n        this.parameters.set(AADServerParamKeys.X_CLIENT_VER, libraryInfo.version);\r\n        if (libraryInfo.os) {\r\n            this.parameters.set(AADServerParamKeys.X_CLIENT_OS, libraryInfo.os);\r\n        }\r\n        if (libraryInfo.cpu) {\r\n            this.parameters.set(AADServerParamKeys.X_CLIENT_CPU, libraryInfo.cpu);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Add client telemetry parameters\r\n     * @param appTelemetry\r\n     */\r\n    addApplicationTelemetry(appTelemetry: ApplicationTelemetry): void {\r\n        if (appTelemetry?.appName) {\r\n            this.parameters.set(AADServerParamKeys.X_APP_NAME, appTelemetry.appName);\r\n        }\r\n\r\n        if (appTelemetry?.appVersion) {\r\n            this.parameters.set(AADServerParamKeys.X_APP_VER, appTelemetry.appVersion);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * add prompt\r\n     * @param prompt\r\n     */\r\n    addPrompt(prompt: string): void {\r\n        RequestValidator.validatePrompt(prompt);\r\n        this.parameters.set(`${AADServerParamKeys.PROMPT}`, encodeURIComponent(prompt));\r\n    }\r\n\r\n    /**\r\n     * add state\r\n     * @param state\r\n     */\r\n    addState(state: string): void {\r\n        if (!StringUtils.isEmpty(state)) {\r\n            this.parameters.set(AADServerParamKeys.STATE, encodeURIComponent(state));\r\n        }\r\n    }\r\n\r\n    /**\r\n     * add nonce\r\n     * @param nonce\r\n     */\r\n    addNonce(nonce: string): void {\r\n        this.parameters.set(AADServerParamKeys.NONCE, encodeURIComponent(nonce));\r\n    }\r\n\r\n    /**\r\n     * add code_challenge and code_challenge_method\r\n     * - throw if either of them are not passed\r\n     * @param codeChallenge\r\n     * @param codeChallengeMethod\r\n     */\r\n    addCodeChallengeParams(\r\n        codeChallenge: string,\r\n        codeChallengeMethod: string\r\n    ): void {\r\n        RequestValidator.validateCodeChallengeParams(codeChallenge, codeChallengeMethod);\r\n        if (codeChallenge && codeChallengeMethod) {\r\n            this.parameters.set(AADServerParamKeys.CODE_CHALLENGE, encodeURIComponent(codeChallenge));\r\n            this.parameters.set(AADServerParamKeys.CODE_CHALLENGE_METHOD, encodeURIComponent(codeChallengeMethod));\r\n        } else {\r\n            throw ClientConfigurationError.createInvalidCodeChallengeParamsError();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * add the `authorization_code` passed by the user to exchange for a token\r\n     * @param code\r\n     */\r\n    addAuthorizationCode(code: string): void {\r\n        this.parameters.set(AADServerParamKeys.CODE, encodeURIComponent(code));\r\n    }\r\n\r\n    /**\r\n     * add the `authorization_code` passed by the user to exchange for a token\r\n     * @param code\r\n     */\r\n    addDeviceCode(code: string): void {\r\n        this.parameters.set(AADServerParamKeys.DEVICE_CODE, encodeURIComponent(code));\r\n    }\r\n\r\n    /**\r\n     * add the `refreshToken` passed by the user\r\n     * @param refreshToken\r\n     */\r\n    addRefreshToken(refreshToken: string): void {\r\n        this.parameters.set(AADServerParamKeys.REFRESH_TOKEN, encodeURIComponent(refreshToken));\r\n    }\r\n\r\n    /**\r\n     * add the `code_verifier` passed by the user to exchange for a token\r\n     * @param codeVerifier\r\n     */\r\n    addCodeVerifier(codeVerifier: string): void {\r\n        this.parameters.set(AADServerParamKeys.CODE_VERIFIER, encodeURIComponent(codeVerifier));\r\n    }\r\n\r\n    /**\r\n     * add client_secret\r\n     * @param clientSecret\r\n     */\r\n    addClientSecret(clientSecret: string): void {\r\n        this.parameters.set(AADServerParamKeys.CLIENT_SECRET, encodeURIComponent(clientSecret));\r\n    }\r\n\r\n    /**\r\n     * add clientAssertion for confidential client flows\r\n     * @param clientAssertion\r\n     */\r\n    addClientAssertion(clientAssertion: string): void {\r\n        if (!StringUtils.isEmpty(clientAssertion)) {\r\n            this.parameters.set(AADServerParamKeys.CLIENT_ASSERTION, encodeURIComponent(clientAssertion));\r\n        }\r\n    }\r\n\r\n    /**\r\n     * add clientAssertionType for confidential client flows\r\n     * @param clientAssertionType\r\n     */\r\n    addClientAssertionType(clientAssertionType: string): void {\r\n        if (!StringUtils.isEmpty(clientAssertionType)) {\r\n            this.parameters.set(AADServerParamKeys.CLIENT_ASSERTION_TYPE, encodeURIComponent(clientAssertionType));\r\n        }\r\n    }\r\n\r\n    /**\r\n     * add OBO assertion for confidential client flows\r\n     * @param clientAssertion\r\n     */\r\n    addOboAssertion(oboAssertion: string): void {\r\n        this.parameters.set(AADServerParamKeys.OBO_ASSERTION, encodeURIComponent(oboAssertion));\r\n    }\r\n\r\n    /**\r\n     * add grant type\r\n     * @param grantType\r\n     */\r\n    addRequestTokenUse(tokenUse: string): void {\r\n        this.parameters.set(AADServerParamKeys.REQUESTED_TOKEN_USE, encodeURIComponent(tokenUse));\r\n    }\r\n\r\n    /**\r\n     * add grant type\r\n     * @param grantType\r\n     */\r\n    addGrantType(grantType: string): void {\r\n        this.parameters.set(AADServerParamKeys.GRANT_TYPE, encodeURIComponent(grantType));\r\n    }\r\n\r\n    /**\r\n     * add client info\r\n     *\r\n     */\r\n    addClientInfo(): void {\r\n        this.parameters.set(CLIENT_INFO, \"1\");\r\n    }\r\n\r\n    /**\r\n     * add extraQueryParams\r\n     * @param eQParams\r\n     */\r\n    addExtraQueryParameters(eQParams: StringDict): void {\r\n        const sanitizedEQParams = RequestValidator.sanitizeEQParams(eQParams, this.parameters);\r\n        Object.keys(sanitizedEQParams).forEach((key) => {\r\n            this.parameters.set(key, eQParams[key]);\r\n        });\r\n    }\r\n\r\n    addClientCapabilitiesToClaims(claims?: string, clientCapabilities?: Array<string>): string {\r\n        let mergedClaims: object;\r\n\r\n        // Parse provided claims into JSON object or initialize empty object\r\n        if (!claims) {\r\n            mergedClaims = {};\r\n        } else {\r\n            try {\r\n                mergedClaims = JSON.parse(claims);\r\n            } catch(e) {\r\n                throw ClientConfigurationError.createInvalidClaimsRequestError();\r\n            }\r\n        }\r\n\r\n        if (clientCapabilities && clientCapabilities.length > 0) {\r\n            if (!mergedClaims.hasOwnProperty(ClaimsRequestKeys.ACCESS_TOKEN)){\r\n                // Add access_token key to claims object\r\n                mergedClaims[ClaimsRequestKeys.ACCESS_TOKEN] = {};\r\n            }\r\n\r\n            // Add xms_cc claim with provided clientCapabilities to access_token key\r\n            mergedClaims[ClaimsRequestKeys.ACCESS_TOKEN][ClaimsRequestKeys.XMS_CC] = {\r\n                values: clientCapabilities\r\n            };\r\n        }\r\n\r\n        return JSON.stringify(mergedClaims);\r\n    }\r\n\r\n    /**\r\n     * adds `username` for Password Grant flow\r\n     * @param username\r\n     */\r\n    addUsername(username: string): void {\r\n        this.parameters.set(PasswordGrantConstants.username, encodeURIComponent(username));\r\n    }\r\n\r\n    /**\r\n     * adds `password` for Password Grant flow\r\n     * @param password\r\n     */\r\n    addPassword(password: string): void {\r\n        this.parameters.set(PasswordGrantConstants.password, encodeURIComponent(password));\r\n    }\r\n\r\n    /**\r\n     * add pop_jwk to query params\r\n     * @param cnfString\r\n     */\r\n    addPopToken(cnfString: string): void {\r\n        if (!StringUtils.isEmpty(cnfString)) {\r\n            this.parameters.set(AADServerParamKeys.TOKEN_TYPE, AuthenticationScheme.POP);\r\n            this.parameters.set(AADServerParamKeys.REQ_CNF, encodeURIComponent(cnfString));\r\n        }\r\n    }\r\n\r\n    /**\r\n     * add SSH JWK and key ID to query params\r\n     */\r\n    addSshJwk(sshJwkString: string): void {\r\n        if(!StringUtils.isEmpty(sshJwkString)) {\r\n            this.parameters.set(AADServerParamKeys.TOKEN_TYPE, AuthenticationScheme.SSH);\r\n            this.parameters.set(AADServerParamKeys.REQ_CNF, encodeURIComponent(sshJwkString));\r\n        }\r\n    }\r\n\r\n    /**\r\n     * add server telemetry fields\r\n     * @param serverTelemetryManager\r\n     */\r\n    addServerTelemetry(serverTelemetryManager: ServerTelemetryManager): void {\r\n        this.parameters.set(AADServerParamKeys.X_CLIENT_CURR_TELEM, serverTelemetryManager.generateCurrentRequestHeaderValue());\r\n        this.parameters.set(AADServerParamKeys.X_CLIENT_LAST_TELEM, serverTelemetryManager.generateLastRequestHeaderValue());\r\n    }\r\n\r\n    /**\r\n     * Adds parameter that indicates to the server that throttling is supported\r\n     */\r\n    addThrottling(): void {\r\n        this.parameters.set(AADServerParamKeys.X_MS_LIB_CAPABILITY, ThrottlingConstants.X_MS_LIB_CAPABILITY_VALUE);\r\n    }\r\n\r\n    /**\r\n     * Adds logout_hint parameter for \"silent\" logout which prevent server account picker\r\n     */\r\n    addLogoutHint(logoutHint: string): void {\r\n        this.parameters.set(AADServerParamKeys.LOGOUT_HINT, encodeURIComponent(logoutHint));\r\n    }\r\n\r\n    /**\r\n     * Utility to create a URL from the params map\r\n     */\r\n    createQueryString(): string {\r\n        const queryParameterArray: Array<string> = new Array<string>();\r\n\r\n        this.parameters.forEach((value, key) => {\r\n            queryParameterArray.push(`${key}=${value}`);\r\n        });\r\n\r\n        return queryParameterArray.join(\"&\");\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ClientConfiguration, buildClientConfiguration, CommonClientConfiguration } from \"../config/ClientConfiguration\";\r\nimport { INetworkModule } from \"../network/INetworkModule\";\r\nimport { NetworkManager, NetworkResponse } from \"../network/NetworkManager\";\r\nimport { ICrypto } from \"../crypto/ICrypto\";\r\nimport { Authority } from \"../authority/Authority\";\r\nimport { Logger } from \"../logger/Logger\";\r\nimport { Constants, HeaderNames } from \"../utils/Constants\";\r\nimport { ServerAuthorizationTokenResponse } from \"../response/ServerAuthorizationTokenResponse\";\r\nimport { CacheManager } from \"../cache/CacheManager\";\r\nimport { ServerTelemetryManager } from \"../telemetry/server/ServerTelemetryManager\";\r\nimport { RequestThumbprint } from \"../network/RequestThumbprint\";\r\nimport { version, name } from \"../packageMetadata\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\nimport { CcsCredential, CcsCredentialType } from \"../account/CcsCredential\";\r\nimport { buildClientInfoFromHomeAccountId } from \"../account/ClientInfo\";\r\nimport { IPerformanceClient } from \"../telemetry/performance/IPerformanceClient\";\r\nimport { RequestParameterBuilder } from \"../request/RequestParameterBuilder\";\r\nimport { BaseAuthRequest } from \"../request/BaseAuthRequest\";\r\n\r\n/**\r\n * Base application class which will construct requests to send to and handle responses from the Microsoft STS using the authorization code flow.\r\n */\r\nexport abstract class BaseClient {\r\n    // Logger object\r\n    public logger: Logger;\r\n\r\n    // Application config\r\n    protected config: CommonClientConfiguration;\r\n\r\n    // Crypto Interface\r\n    protected cryptoUtils: ICrypto;\r\n\r\n    // Storage Interface\r\n    protected cacheManager: CacheManager;\r\n\r\n    // Network Interface\r\n    protected networkClient: INetworkModule;\r\n\r\n    // Server Telemetry Manager\r\n    protected serverTelemetryManager: ServerTelemetryManager | null;\r\n\r\n    // Network Manager\r\n    protected networkManager: NetworkManager;\r\n\r\n    // Default authority object\r\n    public authority: Authority;\r\n\r\n    // Performance telemetry client\r\n    protected performanceClient?: IPerformanceClient;\r\n\r\n    protected constructor(configuration: ClientConfiguration, performanceClient?: IPerformanceClient) {\r\n        // Set the configuration\r\n        this.config = buildClientConfiguration(configuration);\r\n\r\n        // Initialize the logger\r\n        this.logger = new Logger(this.config.loggerOptions, name, version);\r\n\r\n        // Initialize crypto\r\n        this.cryptoUtils = this.config.cryptoInterface;\r\n\r\n        // Initialize storage interface\r\n        this.cacheManager = this.config.storageInterface;\r\n\r\n        // Set the network interface\r\n        this.networkClient = this.config.networkInterface;\r\n\r\n        // Set the NetworkManager\r\n        this.networkManager = new NetworkManager(this.networkClient, this.cacheManager);\r\n\r\n        // Set TelemetryManager\r\n        this.serverTelemetryManager = this.config.serverTelemetryManager;\r\n\r\n        // set Authority\r\n        this.authority = this.config.authOptions.authority;\r\n\r\n        // set performance telemetry client\r\n        this.performanceClient = performanceClient;\r\n    }\r\n\r\n    /**\r\n     * Creates default headers for requests to token endpoint\r\n     */\r\n    protected createTokenRequestHeaders(ccsCred?: CcsCredential): Record<string, string> {   \r\n        const headers: Record<string, string> = {};\r\n        headers[HeaderNames.CONTENT_TYPE] = Constants.URL_FORM_CONTENT_TYPE;\r\n        if (!this.config.systemOptions.preventCorsPreflight && ccsCred) {\r\n            switch (ccsCred.type) {\r\n                case CcsCredentialType.HOME_ACCOUNT_ID:\r\n                    try {\r\n                        const clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);\r\n                        headers[HeaderNames.CCS_HEADER] = `Oid:${clientInfo.uid}@${clientInfo.utid}`;\r\n                    } catch (e) {\r\n                        this.logger.verbose(\"Could not parse home account ID for CCS Header: \" + e);\r\n                    }\r\n                    break;\r\n                case CcsCredentialType.UPN:\r\n                    headers[HeaderNames.CCS_HEADER] = `UPN: ${ccsCred.credential}`;\r\n                    break;\r\n            }\r\n        }   \r\n        return headers;\r\n    }\r\n\r\n    /**\r\n     * Http post to token endpoint\r\n     * @param tokenEndpoint\r\n     * @param queryString\r\n     * @param headers\r\n     * @param thumbprint\r\n     */\r\n    protected async executePostToTokenEndpoint(tokenEndpoint: string, queryString: string, headers: Record<string, string>, thumbprint: RequestThumbprint): Promise<NetworkResponse<ServerAuthorizationTokenResponse>> {\r\n        const response = await this.networkManager.sendPostRequest<ServerAuthorizationTokenResponse>(\r\n            thumbprint,\r\n            tokenEndpoint,\r\n            { body: queryString, headers: headers }\r\n        );\r\n\r\n        if (this.config.serverTelemetryManager && response.status < 500 && response.status !== 429) {\r\n            // Telemetry data successfully logged by server, clear Telemetry cache\r\n            this.config.serverTelemetryManager.clearTelemetryCache();\r\n        }\r\n\r\n        return response;\r\n    }\r\n\r\n    /**\r\n     * Updates the authority object of the client. Endpoint discovery must be completed.\r\n     * @param updatedAuthority\r\n     */\r\n    updateAuthority(updatedAuthority: Authority): void {\r\n        if (!updatedAuthority.discoveryComplete()) {\r\n            throw ClientAuthError.createEndpointDiscoveryIncompleteError(\"Updated authority has not completed endpoint discovery.\");\r\n        }\r\n        this.authority = updatedAuthority;\r\n    }\r\n\r\n    /**\r\n     * Creates query string for the /token request\r\n     * @param request\r\n     */\r\n    createTokenQueryParameters(request: BaseAuthRequest): string {\r\n        const parameterBuilder = new RequestParameterBuilder();\r\n\r\n        if (request.tokenQueryParameters) {\r\n            parameterBuilder.addExtraQueryParameters(request.tokenQueryParameters);\r\n        }\r\n\r\n        return parameterBuilder.createQueryString();\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Constants } from \"../utils/Constants\";\r\nimport { AuthError } from \"./AuthError\";\r\n\r\n/**\r\n * InteractionRequiredServerErrorMessage contains string constants used by error codes and messages returned by the server indicating interaction is required\r\n */\r\nexport const InteractionRequiredServerErrorMessage = [\r\n    \"interaction_required\",\r\n    \"consent_required\",\r\n    \"login_required\"\r\n];\r\n\r\nexport const InteractionRequiredAuthSubErrorMessage = [\r\n    \"message_only\",\r\n    \"additional_action\",\r\n    \"basic_action\",\r\n    \"user_password_expired\",\r\n    \"consent_required\"\r\n];\r\n\r\n/**\r\n * Interaction required errors defined by the SDK\r\n */\r\nexport const InteractionRequiredAuthErrorMessage = {\r\n    noTokensFoundError: {\r\n        code: \"no_tokens_found\",\r\n        desc: \"No refresh token found in the cache. Please sign-in.\"\r\n    },\r\n    native_account_unavailable: {\r\n        code: \"native_account_unavailable\",\r\n        desc: \"The requested account is not available in the native broker. It may have been deleted or logged out. Please sign-in again using an interactive API.\"\r\n    }\r\n};\r\n\r\n/**\r\n * Error thrown when user interaction is required.\r\n */\r\nexport class InteractionRequiredAuthError extends AuthError {\r\n    /**\r\n     * The time the error occured at\r\n     */\r\n    timestamp: string;\r\n\r\n    /**\r\n     * TraceId associated with the error\r\n     */\r\n    traceId: string;\r\n\r\n    /**\r\n     * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-common/docs/claims-challenge.md\r\n     * \r\n     * A string with extra claims needed for the token request to succeed\r\n     * web site: redirect the user to the authorization page and set the extra claims\r\n     * web api: include the claims in the WWW-Authenticate header that are sent back to the client so that it knows to request a token with the extra claims\r\n     * desktop application or browser context: include the claims when acquiring the token interactively\r\n     * app to app context (client_credentials): include the claims in the AcquireTokenByClientCredential request\r\n     */\r\n    claims: string;\r\n\r\n    constructor(errorCode?: string, errorMessage?: string, subError?: string, timestamp?: string, traceId?: string, correlationId?: string, claims?: string) {\r\n        super(errorCode, errorMessage, subError);\r\n        Object.setPrototypeOf(this, InteractionRequiredAuthError.prototype);\r\n        \r\n        this.timestamp = timestamp || Constants.EMPTY_STRING;\r\n        this.traceId = traceId || Constants.EMPTY_STRING;\r\n        this.correlationId = correlationId || Constants.EMPTY_STRING;\r\n        this.claims = claims || Constants.EMPTY_STRING;\r\n        this.name = \"InteractionRequiredAuthError\";\r\n    }\r\n\r\n    /**\r\n     * Helper function used to determine if an error thrown by the server requires interaction to resolve\r\n     * @param errorCode \r\n     * @param errorString \r\n     * @param subError \r\n     */\r\n    static isInteractionRequiredError(errorCode?: string, errorString?: string, subError?: string): boolean {\r\n        const isInteractionRequiredErrorCode = !!errorCode && InteractionRequiredServerErrorMessage.indexOf(errorCode) > -1;\r\n        const isInteractionRequiredSubError = !!subError && InteractionRequiredAuthSubErrorMessage.indexOf(subError) > -1;\r\n        const isInteractionRequiredErrorDesc = !!errorString && InteractionRequiredServerErrorMessage.some((irErrorCode) => {\r\n            return errorString.indexOf(irErrorCode) > -1;\r\n        });\r\n\r\n        return isInteractionRequiredErrorCode || isInteractionRequiredErrorDesc || isInteractionRequiredSubError;\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the authorization code required for a token request is null or empty.\r\n     */\r\n    static createNoTokensFoundError(): InteractionRequiredAuthError {\r\n        return new InteractionRequiredAuthError(InteractionRequiredAuthErrorMessage.noTokensFoundError.code, InteractionRequiredAuthErrorMessage.noTokensFoundError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when the native broker returns ACCOUNT_UNAVAILABLE status, indicating that the account was removed and interactive sign-in is required\r\n     * @returns \r\n     */\r\n    static createNativeAccountUnavailableError(): InteractionRequiredAuthError {\r\n        return new InteractionRequiredAuthError(InteractionRequiredAuthErrorMessage.native_account_unavailable.code, InteractionRequiredAuthErrorMessage.native_account_unavailable.desc);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ISerializableTokenCache } from \"../interface/ISerializableTokenCache\";\r\n\r\n/**\r\n * This class instance helps track the memory changes facilitating\r\n * decisions to read from and write to the persistent cache\r\n */export class TokenCacheContext {\r\n    /**\r\n     * boolean indicating cache change\r\n     */\r\n    hasChanged: boolean;\r\n    /**\r\n     * serializable token cache interface\r\n     */\r\n    cache: ISerializableTokenCache;\r\n\r\n    constructor(tokenCache: ISerializableTokenCache, hasChanged: boolean) {\r\n        this.cache = tokenCache;\r\n        this.hasChanged = hasChanged;\r\n    }\r\n\r\n    /**\r\n     * boolean which indicates the changes in cache\r\n     */\r\n    get cacheHasChanged(): boolean {\r\n        return this.hasChanged;\r\n    }\r\n\r\n    /**\r\n     * function to retrieve the token cache\r\n     */\r\n    get tokenCache(): ISerializableTokenCache {\r\n        return this.cache;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ServerAuthorizationTokenResponse } from \"./ServerAuthorizationTokenResponse\";\r\nimport { buildClientInfo} from \"../account/ClientInfo\";\r\nimport { ICrypto } from \"../crypto/ICrypto\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\nimport { ServerAuthorizationCodeResponse } from \"./ServerAuthorizationCodeResponse\";\r\nimport { Logger } from \"../logger/Logger\";\r\nimport { ServerError } from \"../error/ServerError\";\r\nimport { AuthToken } from \"../account/AuthToken\";\r\nimport { ScopeSet } from \"../request/ScopeSet\";\r\nimport { AuthenticationResult } from \"./AuthenticationResult\";\r\nimport { AccountEntity } from \"../cache/entities/AccountEntity\";\r\nimport { Authority } from \"../authority/Authority\";\r\nimport { IdTokenEntity } from \"../cache/entities/IdTokenEntity\";\r\nimport { AccessTokenEntity } from \"../cache/entities/AccessTokenEntity\";\r\nimport { RefreshTokenEntity } from \"../cache/entities/RefreshTokenEntity\";\r\nimport { InteractionRequiredAuthError } from \"../error/InteractionRequiredAuthError\";\r\nimport { CacheRecord } from \"../cache/entities/CacheRecord\";\r\nimport { CacheManager } from \"../cache/CacheManager\";\r\nimport { ProtocolUtils, RequestStateObject } from \"../utils/ProtocolUtils\";\r\nimport { AuthenticationScheme, Constants, THE_FAMILY_ID } from \"../utils/Constants\";\r\nimport { PopTokenGenerator } from \"../crypto/PopTokenGenerator\";\r\nimport { AppMetadataEntity } from \"../cache/entities/AppMetadataEntity\";\r\nimport { ICachePlugin } from \"../cache/interface/ICachePlugin\";\r\nimport { TokenCacheContext } from \"../cache/persistence/TokenCacheContext\";\r\nimport { ISerializableTokenCache } from \"../cache/interface/ISerializableTokenCache\";\r\nimport { AuthorizationCodePayload } from \"./AuthorizationCodePayload\";\r\nimport { BaseAuthRequest } from \"../request/BaseAuthRequest\";\r\nimport { IPerformanceClient } from \"../telemetry/performance/IPerformanceClient\";\r\nimport { PerformanceEvents } from \"../telemetry/performance/PerformanceEvent\";\r\n\r\n/**\r\n * Class that handles response parsing.\r\n */\r\nexport class ResponseHandler {\r\n    private clientId: string;\r\n    private cacheStorage: CacheManager;\r\n    private cryptoObj: ICrypto;\r\n    private logger: Logger;\r\n    private homeAccountIdentifier: string;\r\n    private serializableCache: ISerializableTokenCache | null;\r\n    private persistencePlugin: ICachePlugin | null;\r\n    private performanceClient?: IPerformanceClient;\r\n\r\n    constructor(clientId: string, cacheStorage: CacheManager, cryptoObj: ICrypto, logger: Logger, serializableCache: ISerializableTokenCache | null, persistencePlugin: ICachePlugin | null, performanceClient?: IPerformanceClient) {\r\n        this.clientId = clientId;\r\n        this.cacheStorage = cacheStorage;\r\n        this.cryptoObj = cryptoObj;\r\n        this.logger = logger;\r\n        this.serializableCache = serializableCache;\r\n        this.persistencePlugin = persistencePlugin;\r\n        this.performanceClient = performanceClient;\r\n    }\r\n\r\n    /**\r\n     * Function which validates server authorization code response.\r\n     * @param serverResponseHash\r\n     * @param cachedState\r\n     * @param cryptoObj\r\n     */\r\n    validateServerAuthorizationCodeResponse(serverResponseHash: ServerAuthorizationCodeResponse, cachedState: string, cryptoObj: ICrypto): void {\r\n\r\n        if (!serverResponseHash.state || !cachedState) {\r\n            throw !serverResponseHash.state ? ClientAuthError.createStateNotFoundError(\"Server State\") : ClientAuthError.createStateNotFoundError(\"Cached State\");\r\n        }\r\n\r\n        if (decodeURIComponent(serverResponseHash.state) !== decodeURIComponent(cachedState)) {\r\n            throw ClientAuthError.createStateMismatchError();\r\n        }\r\n\r\n        // Check for error\r\n        if (serverResponseHash.error || serverResponseHash.error_description || serverResponseHash.suberror) {\r\n            if (InteractionRequiredAuthError.isInteractionRequiredError(serverResponseHash.error, serverResponseHash.error_description, serverResponseHash.suberror)) {\r\n                throw new InteractionRequiredAuthError(\r\n                    serverResponseHash.error || Constants.EMPTY_STRING,\r\n                    serverResponseHash.error_description,\r\n                    serverResponseHash.suberror,\r\n                    serverResponseHash.timestamp || Constants.EMPTY_STRING,\r\n                    serverResponseHash.trace_id || Constants.EMPTY_STRING,\r\n                    serverResponseHash.correlation_id || Constants.EMPTY_STRING,\r\n                    serverResponseHash.claims || Constants.EMPTY_STRING,\r\n                );\r\n            }\r\n\r\n            throw new ServerError(serverResponseHash.error || Constants.EMPTY_STRING, serverResponseHash.error_description, serverResponseHash.suberror);\r\n        }\r\n\r\n        if (serverResponseHash.client_info) {\r\n            buildClientInfo(serverResponseHash.client_info, cryptoObj);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Function which validates server authorization token response.\r\n     * @param serverResponse\r\n     */\r\n    validateTokenResponse(serverResponse: ServerAuthorizationTokenResponse): void {\r\n        // Check for error\r\n        if (serverResponse.error || serverResponse.error_description || serverResponse.suberror) {\r\n            if (InteractionRequiredAuthError.isInteractionRequiredError(serverResponse.error, serverResponse.error_description, serverResponse.suberror)) {\r\n                throw new InteractionRequiredAuthError(\r\n                    serverResponse.error,\r\n                    serverResponse.error_description,\r\n                    serverResponse.suberror,\r\n                    serverResponse.timestamp || Constants.EMPTY_STRING,\r\n                    serverResponse.trace_id || Constants.EMPTY_STRING,\r\n                    serverResponse.correlation_id || Constants.EMPTY_STRING,\r\n                    serverResponse.claims || Constants.EMPTY_STRING,\r\n                );\r\n            }\r\n\r\n            const errString = `${serverResponse.error_codes} - [${serverResponse.timestamp}]: ${serverResponse.error_description} - Correlation ID: ${serverResponse.correlation_id} - Trace ID: ${serverResponse.trace_id}`;\r\n            throw new ServerError(serverResponse.error, errString, serverResponse.suberror);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Returns a constructed token response based on given string. Also manages the cache updates and cleanups.\r\n     * @param serverTokenResponse\r\n     * @param authority\r\n     */\r\n    async handleServerTokenResponse(\r\n        serverTokenResponse: ServerAuthorizationTokenResponse,\r\n        authority: Authority,\r\n        reqTimestamp: number,\r\n        request: BaseAuthRequest,\r\n        authCodePayload?: AuthorizationCodePayload,\r\n        userAssertionHash?: string,\r\n        handlingRefreshTokenResponse?: boolean,\r\n        forceCacheRefreshTokenResponse?: boolean,\r\n        serverRequestId?: string): Promise<AuthenticationResult> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.HandleServerTokenResponse, serverTokenResponse.correlation_id);\r\n\r\n        // create an idToken object (not entity)\r\n        let idTokenObj: AuthToken | undefined;\r\n        if (serverTokenResponse.id_token) {\r\n            idTokenObj = new AuthToken(serverTokenResponse.id_token || Constants.EMPTY_STRING, this.cryptoObj);\r\n\r\n            // token nonce check (TODO: Add a warning if no nonce is given?)\r\n            if (authCodePayload && !StringUtils.isEmpty(authCodePayload.nonce)) {\r\n                if (idTokenObj.claims.nonce !== authCodePayload.nonce) {\r\n                    throw ClientAuthError.createNonceMismatchError();\r\n                }\r\n            }\r\n\r\n            // token max_age check\r\n            if (request.maxAge || (request.maxAge === 0)) {\r\n                const authTime = idTokenObj.claims.auth_time;\r\n                if (!authTime) {\r\n                    throw ClientAuthError.createAuthTimeNotFoundError();\r\n                }\r\n\r\n                AuthToken.checkMaxAge(authTime, request.maxAge);\r\n            }\r\n        }\r\n\r\n        // generate homeAccountId\r\n        this.homeAccountIdentifier = AccountEntity.generateHomeAccountId(serverTokenResponse.client_info || Constants.EMPTY_STRING, authority.authorityType, this.logger, this.cryptoObj, idTokenObj?.claims);\r\n\r\n        // save the response tokens\r\n        let requestStateObj: RequestStateObject | undefined;\r\n        if (!!authCodePayload && !!authCodePayload.state) {\r\n            requestStateObj = ProtocolUtils.parseRequestState(this.cryptoObj, authCodePayload.state);\r\n        }\r\n\r\n        // Add keyId from request to serverTokenResponse if defined\r\n        serverTokenResponse.key_id = serverTokenResponse.key_id || request.sshKid || undefined;\r\n\r\n        const cacheRecord = this.generateCacheRecord(serverTokenResponse, authority, reqTimestamp, request, idTokenObj, userAssertionHash, authCodePayload);\r\n        let cacheContext;\r\n        try {\r\n            if (this.persistencePlugin && this.serializableCache) {\r\n                this.logger.verbose(\"Persistence enabled, calling beforeCacheAccess\");\r\n                cacheContext = new TokenCacheContext(this.serializableCache, true);\r\n                await this.persistencePlugin.beforeCacheAccess(cacheContext);\r\n            }\r\n            /*\r\n             * When saving a refreshed tokens to the cache, it is expected that the account that was used is present in the cache.\r\n             * If not present, we should return null, as it's the case that another application called removeAccount in between\r\n             * the calls to getAllAccounts and acquireTokenSilent. We should not overwrite that removal, unless explicitly flagged by\r\n             * the developer, as in the case of refresh token flow used in ADAL Node to MSAL Node migration.\r\n             */\r\n            if (handlingRefreshTokenResponse && !forceCacheRefreshTokenResponse && cacheRecord.account) {\r\n                const key = cacheRecord.account.generateAccountKey();\r\n                const account = this.cacheStorage.getAccount(key);\r\n                if (!account) {\r\n                    this.logger.warning(\"Account used to refresh tokens not in persistence, refreshed tokens will not be stored in the cache\");\r\n                    return ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenObj, requestStateObj, undefined, serverRequestId);\r\n                }\r\n            }\r\n            await this.cacheStorage.saveCacheRecord(cacheRecord);\r\n        } finally {\r\n            if (this.persistencePlugin && this.serializableCache && cacheContext) {\r\n                this.logger.verbose(\"Persistence enabled, calling afterCacheAccess\");\r\n                await this.persistencePlugin.afterCacheAccess(cacheContext);\r\n            }\r\n        }\r\n        return ResponseHandler.generateAuthenticationResult(this.cryptoObj, authority, cacheRecord, false, request, idTokenObj, requestStateObj, serverTokenResponse, serverRequestId);\r\n    }\r\n\r\n    /**\r\n     * Generates CacheRecord\r\n     * @param serverTokenResponse\r\n     * @param idTokenObj\r\n     * @param authority\r\n     */\r\n    private generateCacheRecord(serverTokenResponse: ServerAuthorizationTokenResponse, authority: Authority, reqTimestamp: number, request: BaseAuthRequest, idTokenObj?: AuthToken, userAssertionHash?: string, authCodePayload?: AuthorizationCodePayload): CacheRecord {\r\n        const env = authority.getPreferredCache();\r\n        if (StringUtils.isEmpty(env)) {\r\n            throw ClientAuthError.createInvalidCacheEnvironmentError();\r\n        }\r\n\r\n        // IdToken: non AAD scenarios can have empty realm\r\n        let cachedIdToken: IdTokenEntity | undefined;\r\n        let cachedAccount: AccountEntity | undefined;\r\n        if (!StringUtils.isEmpty(serverTokenResponse.id_token) && !!idTokenObj) {\r\n            cachedIdToken = IdTokenEntity.createIdTokenEntity(\r\n                this.homeAccountIdentifier,\r\n                env,\r\n                serverTokenResponse.id_token || Constants.EMPTY_STRING,\r\n                this.clientId,\r\n                idTokenObj.claims.tid || Constants.EMPTY_STRING,\r\n            );\r\n\r\n            cachedAccount = AccountEntity.createAccount(\r\n                {\r\n                    homeAccountId: this.homeAccountIdentifier,\r\n                    idTokenClaims: idTokenObj.claims,\r\n                    clientInfo: serverTokenResponse.client_info || Constants.EMPTY_STRING,\r\n                    cloudGraphHostName: authCodePayload?.cloud_graph_host_name,\r\n                    msGraphHost: authCodePayload?.msgraph_host,\r\n                },\r\n                authority\r\n            );\r\n        }\r\n\r\n        // AccessToken\r\n        let cachedAccessToken: AccessTokenEntity | null = null;\r\n        if (!StringUtils.isEmpty(serverTokenResponse.access_token)) {\r\n\r\n            // If scopes not returned in server response, use request scopes\r\n            const responseScopes = serverTokenResponse.scope ? ScopeSet.fromString(serverTokenResponse.scope) : new ScopeSet(request.scopes || []);\r\n\r\n            /*\r\n             * Use timestamp calculated before request\r\n             * Server may return timestamps as strings, parse to numbers if so.\r\n             */\r\n            const expiresIn: number = (typeof serverTokenResponse.expires_in === \"string\" ? parseInt(serverTokenResponse.expires_in, 10) : serverTokenResponse.expires_in) || 0;\r\n            const extExpiresIn: number = (typeof serverTokenResponse.ext_expires_in === \"string\" ? parseInt(serverTokenResponse.ext_expires_in, 10) : serverTokenResponse.ext_expires_in) || 0;\r\n            const refreshIn: number | undefined = (typeof serverTokenResponse.refresh_in === \"string\" ? parseInt(serverTokenResponse.refresh_in, 10) : serverTokenResponse.refresh_in) || undefined;\r\n            const tokenExpirationSeconds = reqTimestamp + expiresIn;\r\n            const extendedTokenExpirationSeconds = tokenExpirationSeconds + extExpiresIn;\r\n            const refreshOnSeconds = refreshIn && refreshIn > 0 ? reqTimestamp + refreshIn : undefined;\r\n\r\n            // non AAD scenarios can have empty realm\r\n            cachedAccessToken = AccessTokenEntity.createAccessTokenEntity(\r\n                this.homeAccountIdentifier,\r\n                env,\r\n                serverTokenResponse.access_token || Constants.EMPTY_STRING,\r\n                this.clientId,\r\n                idTokenObj ? idTokenObj.claims.tid || Constants.EMPTY_STRING : authority.tenant,\r\n                responseScopes.printScopes(),\r\n                tokenExpirationSeconds,\r\n                extendedTokenExpirationSeconds,\r\n                this.cryptoObj,\r\n                refreshOnSeconds,\r\n                serverTokenResponse.token_type,\r\n                userAssertionHash,\r\n                serverTokenResponse.key_id,\r\n                request.claims,\r\n                request.requestedClaimsHash\r\n            );\r\n        }\r\n\r\n        // refreshToken\r\n        let cachedRefreshToken: RefreshTokenEntity | null = null;\r\n        if (!StringUtils.isEmpty(serverTokenResponse.refresh_token)) {\r\n            cachedRefreshToken = RefreshTokenEntity.createRefreshTokenEntity(\r\n                this.homeAccountIdentifier,\r\n                env,\r\n                serverTokenResponse.refresh_token || Constants.EMPTY_STRING,\r\n                this.clientId,\r\n                serverTokenResponse.foci,\r\n                userAssertionHash\r\n            );\r\n        }\r\n\r\n        // appMetadata\r\n        let cachedAppMetadata: AppMetadataEntity | null = null;\r\n        if (!StringUtils.isEmpty(serverTokenResponse.foci)) {\r\n            cachedAppMetadata = AppMetadataEntity.createAppMetadataEntity(this.clientId, env, serverTokenResponse.foci);\r\n        }\r\n\r\n        return new CacheRecord(cachedAccount, cachedIdToken, cachedAccessToken, cachedRefreshToken, cachedAppMetadata);\r\n    }\r\n\r\n    /**\r\n     * Creates an @AuthenticationResult from @CacheRecord , @IdToken , and a boolean that states whether or not the result is from cache.\r\n     *\r\n     * Optionally takes a state string that is set as-is in the response.\r\n     *\r\n     * @param cacheRecord\r\n     * @param idTokenObj\r\n     * @param fromTokenCache\r\n     * @param stateString\r\n     */\r\n    static async generateAuthenticationResult(\r\n        cryptoObj: ICrypto,\r\n        authority: Authority,\r\n        cacheRecord: CacheRecord,\r\n        fromTokenCache: boolean,\r\n        request: BaseAuthRequest,\r\n        idTokenObj?: AuthToken,\r\n        requestState?: RequestStateObject,\r\n        serverTokenResponse?: ServerAuthorizationTokenResponse,\r\n        requestId?: string,\r\n    ): Promise<AuthenticationResult> {\r\n        let accessToken: string = Constants.EMPTY_STRING;\r\n        let responseScopes: Array<string> = [];\r\n        let expiresOn: Date | null = null;\r\n        let extExpiresOn: Date | undefined;\r\n        let familyId: string = Constants.EMPTY_STRING;\r\n\r\n        if (cacheRecord.accessToken) {\r\n            if (cacheRecord.accessToken.tokenType === AuthenticationScheme.POP) {\r\n                const popTokenGenerator: PopTokenGenerator = new PopTokenGenerator(cryptoObj);\r\n                const { secret, keyId } = cacheRecord.accessToken;\r\n\r\n                if (!keyId) {\r\n                    throw ClientAuthError.createKeyIdMissingError();\r\n                }\r\n\r\n                accessToken = await popTokenGenerator.signPopToken(secret, keyId, request);\r\n            } else {\r\n                accessToken = cacheRecord.accessToken.secret;\r\n            }\r\n            responseScopes = ScopeSet.fromString(cacheRecord.accessToken.target).asArray();\r\n            expiresOn = new Date(Number(cacheRecord.accessToken.expiresOn) * 1000);\r\n            extExpiresOn = new Date(Number(cacheRecord.accessToken.extendedExpiresOn) * 1000);\r\n        }\r\n\r\n        if (cacheRecord.appMetadata) {\r\n            familyId = cacheRecord.appMetadata.familyId === THE_FAMILY_ID ? THE_FAMILY_ID : Constants.EMPTY_STRING;\r\n        }\r\n        const uid = idTokenObj?.claims.oid || idTokenObj?.claims.sub || Constants.EMPTY_STRING;\r\n        const tid = idTokenObj?.claims.tid || Constants.EMPTY_STRING;\r\n\r\n        // for hybrid + native bridge enablement, send back the native account Id\r\n        if(serverTokenResponse?.spa_accountid && !!cacheRecord.account){\r\n            cacheRecord.account.nativeAccountId = serverTokenResponse?.spa_accountid;\r\n        }\r\n\r\n        return {\r\n            authority: authority.canonicalAuthority,\r\n            uniqueId: uid,\r\n            tenantId: tid,\r\n            scopes: responseScopes,\r\n            account: cacheRecord.account ? cacheRecord.account.getAccountInfo() : null,\r\n            idToken: idTokenObj ? idTokenObj.rawToken : Constants.EMPTY_STRING,\r\n            idTokenClaims: idTokenObj ? idTokenObj.claims : {},\r\n            accessToken: accessToken,\r\n            fromCache: fromTokenCache,\r\n            expiresOn: expiresOn,\r\n            correlationId: request.correlationId,\r\n            requestId: requestId || Constants.EMPTY_STRING,\r\n            extExpiresOn: extExpiresOn,\r\n            familyId: familyId,\r\n            tokenType: cacheRecord.accessToken?.tokenType || Constants.EMPTY_STRING,\r\n            state: requestState ? requestState.userRequestState : Constants.EMPTY_STRING,\r\n            cloudGraphHostName: cacheRecord.account?.cloudGraphHostName || Constants.EMPTY_STRING,\r\n            msGraphHost: cacheRecord.account?.msGraphHost || Constants.EMPTY_STRING,\r\n            code: serverTokenResponse?.spa_code,\r\n            fromNativeBroker: false,\r\n        };\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { BaseClient } from \"./BaseClient\";\r\nimport { CommonAuthorizationUrlRequest } from \"../request/CommonAuthorizationUrlRequest\";\r\nimport { CommonAuthorizationCodeRequest } from \"../request/CommonAuthorizationCodeRequest\";\r\nimport { Authority } from \"../authority/Authority\";\r\nimport { RequestParameterBuilder } from \"../request/RequestParameterBuilder\";\r\nimport { GrantType, AuthenticationScheme, PromptValue, Separators, AADServerParamKeys, HeaderNames } from \"../utils/Constants\";\r\nimport { ClientConfiguration } from \"../config/ClientConfiguration\";\r\nimport { ServerAuthorizationTokenResponse } from \"../response/ServerAuthorizationTokenResponse\";\r\nimport { NetworkResponse } from \"../network/NetworkManager\";\r\nimport { ResponseHandler } from \"../response/ResponseHandler\";\r\nimport { AuthenticationResult } from \"../response/AuthenticationResult\";\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\nimport { UrlString } from \"../url/UrlString\";\r\nimport { ServerAuthorizationCodeResponse } from \"../response/ServerAuthorizationCodeResponse\";\r\nimport { CommonEndSessionRequest } from \"../request/CommonEndSessionRequest\";\r\nimport { PopTokenGenerator } from \"../crypto/PopTokenGenerator\";\r\nimport { RequestThumbprint } from \"../network/RequestThumbprint\";\r\nimport { AuthorizationCodePayload } from \"../response/AuthorizationCodePayload\";\r\nimport { TimeUtils } from \"../utils/TimeUtils\";\r\nimport { AccountInfo } from \"../account/AccountInfo\";\r\nimport { buildClientInfoFromHomeAccountId, buildClientInfo } from \"../account/ClientInfo\";\r\nimport { CcsCredentialType, CcsCredential } from \"../account/CcsCredential\";\r\nimport { ClientConfigurationError } from \"../error/ClientConfigurationError\";\r\nimport { RequestValidator } from \"../request/RequestValidator\";\r\nimport { IPerformanceClient } from \"../telemetry/performance/IPerformanceClient\";\r\nimport { PerformanceEvents } from \"../telemetry/performance/PerformanceEvent\";\r\n\r\n/**\r\n * Oauth2.0 Authorization Code client\r\n */\r\nexport class AuthorizationCodeClient extends BaseClient {\r\n    // Flag to indicate if client is for hybrid spa auth code redemption\r\n    protected includeRedirectUri: boolean = true;\r\n\r\n    constructor(configuration: ClientConfiguration, performanceClient?: IPerformanceClient) {\r\n        super(configuration, performanceClient);\r\n    }\r\n\r\n    /**\r\n     * Creates the URL of the authorization request letting the user input credentials and consent to the\r\n     * application. The URL target the /authorize endpoint of the authority configured in the\r\n     * application object.\r\n     *\r\n     * Once the user inputs their credentials and consents, the authority will send a response to the redirect URI\r\n     * sent in the request and should contain an authorization code, which can then be used to acquire tokens via\r\n     * acquireToken(AuthorizationCodeRequest)\r\n     * @param request\r\n     */\r\n    async getAuthCodeUrl(request: CommonAuthorizationUrlRequest): Promise<string> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.GetAuthCodeUrl, request.correlationId);\r\n\r\n        this.performanceClient?.setPreQueueTime(PerformanceEvents.AuthClientCreateQueryString, request.correlationId);\r\n        const queryString = await this.createAuthCodeUrlQueryString(request);\r\n\r\n        return UrlString.appendQueryString(this.authority.authorizationEndpoint, queryString);\r\n    }\r\n\r\n    /**\r\n     * API to acquire a token in exchange of 'authorization_code` acquired by the user in the first leg of the\r\n     * authorization_code_grant\r\n     * @param request\r\n     */\r\n    async acquireToken(request: CommonAuthorizationCodeRequest, authCodePayload?: AuthorizationCodePayload): Promise<AuthenticationResult> {\r\n        if (!request || !request.code) {\r\n            throw ClientAuthError.createTokenRequestCannotBeMadeError();\r\n        }\r\n\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientAcquireToken, request.correlationId);\r\n        \r\n        // @ts-ignore\r\n        const atsMeasurement = this.performanceClient?.startMeasurement(\"AuthCodeClientAcquireToken\", request.correlationId);\r\n        this.logger.info(\"in acquireToken call in auth-code client\");\r\n\r\n        const reqTimestamp = TimeUtils.nowSeconds();\r\n        this.performanceClient?.setPreQueueTime(PerformanceEvents.AuthClientExecuteTokenRequest, request.correlationId);\r\n        const response = await this.executeTokenRequest(this.authority, request);\r\n\r\n        // Retrieve requestId from response headers\r\n        const requestId = response.headers?.[HeaderNames.X_MS_REQUEST_ID];\r\n        const httpVerAuthority = response.headers?.[HeaderNames.X_MS_HTTP_VERSION];\r\n        if(httpVerAuthority)\r\n        {\r\n            atsMeasurement?.addStaticFields({\r\n                httpVerAuthority\r\n            });\r\n        }\r\n        const responseHandler = new ResponseHandler(\r\n            this.config.authOptions.clientId,\r\n            this.cacheManager,\r\n            this.cryptoUtils,\r\n            this.logger,\r\n            this.config.serializableCache,\r\n            this.config.persistencePlugin,\r\n            this.performanceClient\r\n        );\r\n\r\n        // Validate response. This function throws a server error if an error is returned by the server.\r\n        responseHandler.validateTokenResponse(response.body);\r\n\r\n        this.performanceClient?.setPreQueueTime(PerformanceEvents.HandleServerTokenResponse, request.correlationId);\r\n        return responseHandler.handleServerTokenResponse(\r\n            response.body,\r\n            this.authority,\r\n            reqTimestamp,\r\n            request,\r\n            authCodePayload,\r\n            undefined,\r\n            undefined,\r\n            undefined,\r\n            requestId\r\n        ).then((result: AuthenticationResult) => {\r\n            atsMeasurement?.endMeasurement({\r\n                success: true\r\n            });\r\n            return result;\r\n        })\r\n            .catch((error) => {\r\n                this.logger.verbose(\"Error in fetching token in ACC\", request.correlationId);\r\n                atsMeasurement?.endMeasurement({\r\n                    errorCode: error.errorCode,\r\n                    subErrorCode: error.subError,\r\n                    success: false\r\n                });\r\n                throw error;\r\n            });\r\n    }\r\n\r\n    /**\r\n     * Handles the hash fragment response from public client code request. Returns a code response used by\r\n     * the client to exchange for a token in acquireToken.\r\n     * @param hashFragment\r\n     */\r\n    handleFragmentResponse(hashFragment: string, cachedState: string): AuthorizationCodePayload {\r\n        // Handle responses.\r\n        const responseHandler = new ResponseHandler(this.config.authOptions.clientId, this.cacheManager, this.cryptoUtils, this.logger, null, null);\r\n\r\n        // Deserialize hash fragment response parameters.\r\n        const hashUrlString = new UrlString(hashFragment);\r\n        // Deserialize hash fragment response parameters.\r\n        const serverParams: ServerAuthorizationCodeResponse = UrlString.getDeserializedHash(hashUrlString.getHash());\r\n\r\n        // Get code response\r\n        responseHandler.validateServerAuthorizationCodeResponse(serverParams, cachedState, this.cryptoUtils);\r\n\r\n        // throw when there is no auth code in the response\r\n        if (!serverParams.code) {\r\n            throw ClientAuthError.createNoAuthCodeInServerResponseError();\r\n        }\r\n        return {\r\n            ...serverParams,\r\n            // Code param is optional in ServerAuthorizationCodeResponse but required in AuthorizationCodePaylod\r\n            code: serverParams.code\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Used to log out the current user, and redirect the user to the postLogoutRedirectUri.\r\n     * Default behaviour is to redirect the user to `window.location.href`.\r\n     * @param authorityUri\r\n     */\r\n    getLogoutUri(logoutRequest: CommonEndSessionRequest): string {\r\n        // Throw error if logoutRequest is null/undefined\r\n        if (!logoutRequest) {\r\n            throw ClientConfigurationError.createEmptyLogoutRequestError();\r\n        }\r\n        const queryString = this.createLogoutUrlQueryString(logoutRequest);\r\n\r\n        // Construct logout URI\r\n        return UrlString.appendQueryString(this.authority.endSessionEndpoint, queryString);\r\n    }\r\n\r\n    /**\r\n     * Executes POST request to token endpoint\r\n     * @param authority\r\n     * @param request\r\n     */\r\n    private async executeTokenRequest(authority: Authority, request: CommonAuthorizationCodeRequest): Promise<NetworkResponse<ServerAuthorizationTokenResponse>> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientExecuteTokenRequest, request.correlationId);\r\n        this.performanceClient?.setPreQueueTime(PerformanceEvents.AuthClientCreateTokenRequestBody, request.correlationId);\r\n        \r\n        const queryParametersString = this.createTokenQueryParameters(request);\r\n        const endpoint = UrlString.appendQueryString(authority.tokenEndpoint, queryParametersString);\r\n        \r\n        const requestBody = await this.createTokenRequestBody(request);\r\n        \r\n        let ccsCredential: CcsCredential | undefined = undefined;\r\n        if (request.clientInfo) {\r\n            try {\r\n                const clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils);\r\n                ccsCredential = {\r\n                    credential: `${clientInfo.uid}${Separators.CLIENT_INFO_SEPARATOR}${clientInfo.utid}`,\r\n                    type: CcsCredentialType.HOME_ACCOUNT_ID\r\n                };\r\n            } catch (e) {\r\n                this.logger.verbose(\"Could not parse client info for CCS Header: \" + e);\r\n            }\r\n        }\r\n        const headers: Record<string, string> = this.createTokenRequestHeaders(ccsCredential || request.ccsCredential);\r\n\r\n        const thumbprint: RequestThumbprint = {\r\n            clientId: this.config.authOptions.clientId,\r\n            authority: authority.canonicalAuthority,\r\n            scopes: request.scopes,\r\n            claims: request.claims,\r\n            authenticationScheme: request.authenticationScheme,\r\n            resourceRequestMethod: request.resourceRequestMethod,\r\n            resourceRequestUri: request.resourceRequestUri,\r\n            shrClaims: request.shrClaims,\r\n            sshKid: request.sshKid\r\n        };\r\n\r\n        return this.executePostToTokenEndpoint(endpoint, requestBody, headers, thumbprint);\r\n    }\r\n\r\n    /**\r\n     * Generates a map for all the params to be sent to the service\r\n     * @param request\r\n     */\r\n    private async createTokenRequestBody(request: CommonAuthorizationCodeRequest): Promise<string> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientCreateTokenRequestBody, request.correlationId);\r\n\r\n        const parameterBuilder = new RequestParameterBuilder();\r\n\r\n        parameterBuilder.addClientId(this.config.authOptions.clientId);\r\n\r\n        /*\r\n         * For hybrid spa flow, there will be a code but no verifier\r\n         * In this scenario, don't include redirect uri as auth code will not be bound to redirect URI\r\n         */\r\n        if (!this.includeRedirectUri) {\r\n            // Just validate\r\n            RequestValidator.validateRedirectUri(request.redirectUri);\r\n        } else {\r\n            // Validate and include redirect uri\r\n            parameterBuilder.addRedirectUri(request.redirectUri);\r\n        }\r\n\r\n        // Add scope array, parameter builder will add default scopes and dedupe\r\n        parameterBuilder.addScopes(request.scopes);\r\n\r\n        // add code: user set, not validated\r\n        parameterBuilder.addAuthorizationCode(request.code);\r\n\r\n        // Add library metadata\r\n        parameterBuilder.addLibraryInfo(this.config.libraryInfo);\r\n        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);\r\n        parameterBuilder.addThrottling();\r\n\r\n        if (this.serverTelemetryManager) {\r\n            parameterBuilder.addServerTelemetry(this.serverTelemetryManager);\r\n        }\r\n\r\n        // add code_verifier if passed\r\n        if (request.codeVerifier) {\r\n            parameterBuilder.addCodeVerifier(request.codeVerifier);\r\n        }\r\n\r\n        if (this.config.clientCredentials.clientSecret) {\r\n            parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);\r\n        }\r\n\r\n        if (this.config.clientCredentials.clientAssertion) {\r\n            const clientAssertion = this.config.clientCredentials.clientAssertion;\r\n            parameterBuilder.addClientAssertion(clientAssertion.assertion);\r\n            parameterBuilder.addClientAssertionType(clientAssertion.assertionType);\r\n        }\r\n\r\n        parameterBuilder.addGrantType(GrantType.AUTHORIZATION_CODE_GRANT);\r\n        parameterBuilder.addClientInfo();\r\n\r\n        if (request.authenticationScheme === AuthenticationScheme.POP) {\r\n            const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils, this.performanceClient);\r\n\r\n            this.performanceClient?.setPreQueueTime(PerformanceEvents.PopTokenGenerateCnf, request.correlationId);\r\n            const reqCnfData = await popTokenGenerator.generateCnf(request);\r\n            // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)\r\n            parameterBuilder.addPopToken(reqCnfData.reqCnfString);\r\n        } else if (request.authenticationScheme === AuthenticationScheme.SSH) {\r\n            if (request.sshJwk) {\r\n                parameterBuilder.addSshJwk(request.sshJwk);\r\n            } else {\r\n                throw ClientConfigurationError.createMissingSshJwkError();\r\n            }\r\n        }\r\n\r\n        const correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();\r\n        parameterBuilder.addCorrelationId(correlationId);\r\n\r\n        if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {\r\n            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);\r\n        }\r\n\r\n        let ccsCred: CcsCredential | undefined = undefined;\r\n        if (request.clientInfo) {\r\n            try {\r\n                const clientInfo = buildClientInfo(request.clientInfo, this.cryptoUtils);\r\n                ccsCred = {\r\n                    credential: `${clientInfo.uid}${Separators.CLIENT_INFO_SEPARATOR}${clientInfo.utid}`,\r\n                    type: CcsCredentialType.HOME_ACCOUNT_ID\r\n                };\r\n            } catch (e) {\r\n                this.logger.verbose(\"Could not parse client info for CCS Header: \" + e);\r\n            }\r\n        } else {\r\n            ccsCred = request.ccsCredential;\r\n        }\r\n\r\n        // Adds these as parameters in the request instead of headers to prevent CORS preflight request\r\n        if (this.config.systemOptions.preventCorsPreflight && ccsCred) {\r\n            switch (ccsCred.type) {\r\n                case CcsCredentialType.HOME_ACCOUNT_ID:\r\n                    try {\r\n                        const clientInfo = buildClientInfoFromHomeAccountId(ccsCred.credential);\r\n                        parameterBuilder.addCcsOid(clientInfo);\r\n                    } catch (e) {\r\n                        this.logger.verbose(\"Could not parse home account ID for CCS Header: \" + e);\r\n                    }\r\n                    break;\r\n                case CcsCredentialType.UPN:\r\n                    parameterBuilder.addCcsUpn(ccsCred.credential);\r\n                    break;\r\n            }\r\n        }\r\n\r\n        if (request.tokenBodyParameters) {\r\n            parameterBuilder.addExtraQueryParameters(request.tokenBodyParameters);\r\n        }\r\n\r\n        // Add hybrid spa parameters if not already provided\r\n        if (request.enableSpaAuthorizationCode && (!request.tokenBodyParameters || !request.tokenBodyParameters[AADServerParamKeys.RETURN_SPA_CODE])) {\r\n            parameterBuilder.addExtraQueryParameters({\r\n                [AADServerParamKeys.RETURN_SPA_CODE]: \"1\"\r\n            });\r\n        }\r\n\r\n        return parameterBuilder.createQueryString();\r\n    }\r\n\r\n    /**\r\n     * This API validates the `AuthorizationCodeUrlRequest` and creates a URL\r\n     * @param request\r\n     */\r\n    private async createAuthCodeUrlQueryString(request: CommonAuthorizationUrlRequest): Promise<string> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthClientCreateQueryString, request.correlationId);\r\n\r\n        const parameterBuilder = new RequestParameterBuilder();\r\n\r\n        parameterBuilder.addClientId(this.config.authOptions.clientId);\r\n\r\n        const requestScopes = [...request.scopes || [], ...request.extraScopesToConsent || []];\r\n        parameterBuilder.addScopes(requestScopes);\r\n\r\n        // validate the redirectUri (to be a non null value)\r\n        parameterBuilder.addRedirectUri(request.redirectUri);\r\n\r\n        // generate the correlationId if not set by the user and add\r\n        const correlationId = request.correlationId || this.config.cryptoInterface.createNewGuid();\r\n        parameterBuilder.addCorrelationId(correlationId);\r\n\r\n        // add response_mode. If not passed in it defaults to query.\r\n        parameterBuilder.addResponseMode(request.responseMode);\r\n\r\n        // add response_type = code\r\n        parameterBuilder.addResponseTypeCode();\r\n\r\n        // add library info parameters\r\n        parameterBuilder.addLibraryInfo(this.config.libraryInfo);\r\n        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);\r\n\r\n        // add client_info=1\r\n        parameterBuilder.addClientInfo();\r\n\r\n        if (request.codeChallenge && request.codeChallengeMethod) {\r\n            parameterBuilder.addCodeChallengeParams(request.codeChallenge, request.codeChallengeMethod);\r\n        }\r\n\r\n        if (request.prompt) {\r\n            parameterBuilder.addPrompt(request.prompt);\r\n        }\r\n\r\n        if (request.domainHint) {\r\n            parameterBuilder.addDomainHint(request.domainHint);\r\n        }\r\n\r\n        // Add sid or loginHint with preference for login_hint claim (in request) -> sid -> loginHint (upn/email) -> username of AccountInfo object\r\n        if (request.prompt !== PromptValue.SELECT_ACCOUNT) {\r\n            // AAD will throw if prompt=select_account is passed with an account hint\r\n            if (request.sid && request.prompt === PromptValue.NONE) {\r\n                // SessionID is only used in silent calls\r\n                this.logger.verbose(\"createAuthCodeUrlQueryString: Prompt is none, adding sid from request\");\r\n                parameterBuilder.addSid(request.sid);\r\n            } else if (request.account) {\r\n                const accountSid = this.extractAccountSid(request.account);\r\n                const accountLoginHintClaim = this.extractLoginHint(request.account);\r\n                // If login_hint claim is present, use it over sid/username\r\n                if (accountLoginHintClaim) {\r\n                    this.logger.verbose(\"createAuthCodeUrlQueryString: login_hint claim present on account\");\r\n                    parameterBuilder.addLoginHint(accountLoginHintClaim);\r\n                    try {\r\n                        const clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);\r\n                        parameterBuilder.addCcsOid(clientInfo);\r\n                    } catch (e) {\r\n                        this.logger.verbose(\"createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header\");\r\n                    }\r\n                } else if (accountSid && request.prompt === PromptValue.NONE) {\r\n                    /*\r\n                     * If account and loginHint are provided, we will check account first for sid before adding loginHint\r\n                     * SessionId is only used in silent calls\r\n                     */\r\n                    this.logger.verbose(\"createAuthCodeUrlQueryString: Prompt is none, adding sid from account\");\r\n                    parameterBuilder.addSid(accountSid);\r\n                    try {\r\n                        const clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);\r\n                        parameterBuilder.addCcsOid(clientInfo);\r\n                    } catch (e) {\r\n                        this.logger.verbose(\"createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header\");\r\n                    }\r\n                } else if (request.loginHint) {\r\n                    this.logger.verbose(\"createAuthCodeUrlQueryString: Adding login_hint from request\");\r\n                    parameterBuilder.addLoginHint(request.loginHint);\r\n                    parameterBuilder.addCcsUpn(request.loginHint);\r\n                } else if (request.account.username) {\r\n                    // Fallback to account username if provided\r\n                    this.logger.verbose(\"createAuthCodeUrlQueryString: Adding login_hint from account\");\r\n                    parameterBuilder.addLoginHint(request.account.username);\r\n                    try {\r\n                        const clientInfo = buildClientInfoFromHomeAccountId(request.account.homeAccountId);\r\n                        parameterBuilder.addCcsOid(clientInfo);\r\n                    } catch (e) {\r\n                        this.logger.verbose(\"createAuthCodeUrlQueryString: Could not parse home account ID for CCS Header\");\r\n                    }\r\n                }\r\n            } else if (request.loginHint) {\r\n                this.logger.verbose(\"createAuthCodeUrlQueryString: No account, adding login_hint from request\");\r\n                parameterBuilder.addLoginHint(request.loginHint);\r\n                parameterBuilder.addCcsUpn(request.loginHint);\r\n            }\r\n        } else {\r\n            this.logger.verbose(\"createAuthCodeUrlQueryString: Prompt is select_account, ignoring account hints\");\r\n        }\r\n\r\n        if (request.nonce) {\r\n            parameterBuilder.addNonce(request.nonce);\r\n        }\r\n\r\n        if (request.state) {\r\n            parameterBuilder.addState(request.state);\r\n        }\r\n\r\n        if (!StringUtils.isEmpty(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {\r\n            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);\r\n        }\r\n\r\n        if (request.extraQueryParameters) {\r\n            parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);\r\n        }\r\n\r\n        if (request.nativeBroker) {\r\n            // signal ests that this is a WAM call\r\n            parameterBuilder.addNativeBroker();\r\n\r\n            // pass the req_cnf for POP\r\n            if (request.authenticationScheme === AuthenticationScheme.POP) {\r\n                const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils);\r\n                // to reduce the URL length, it is recommended to send the short form of the req_cnf\r\n                const reqCnfData = await popTokenGenerator.generateCnf(request);\r\n                parameterBuilder.addPopToken(reqCnfData.reqCnfString);\r\n            }\r\n        }\r\n\r\n        return parameterBuilder.createQueryString();\r\n    }\r\n\r\n    /**\r\n     * This API validates the `EndSessionRequest` and creates a URL\r\n     * @param request\r\n     */\r\n    private createLogoutUrlQueryString(request: CommonEndSessionRequest): string {\r\n        const parameterBuilder = new RequestParameterBuilder();\r\n\r\n        if (request.postLogoutRedirectUri) {\r\n            parameterBuilder.addPostLogoutRedirectUri(request.postLogoutRedirectUri);\r\n        }\r\n\r\n        if (request.correlationId) {\r\n            parameterBuilder.addCorrelationId(request.correlationId);\r\n        }\r\n\r\n        if (request.idTokenHint) {\r\n            parameterBuilder.addIdTokenHint(request.idTokenHint);\r\n        }\r\n\r\n        if (request.state) {\r\n            parameterBuilder.addState(request.state);\r\n        }\r\n\r\n        if (request.logoutHint) {\r\n            parameterBuilder.addLogoutHint(request.logoutHint);\r\n        }\r\n\r\n        if (request.extraQueryParameters) {\r\n            parameterBuilder.addExtraQueryParameters(request.extraQueryParameters);\r\n        }\r\n\r\n        return parameterBuilder.createQueryString();\r\n    }\r\n\r\n    /**\r\n     * Helper to get sid from account. Returns null if idTokenClaims are not present or sid is not present.\r\n     * @param account\r\n     */\r\n    private extractAccountSid(account: AccountInfo): string | null {\r\n        return account.idTokenClaims?.sid || null;\r\n    }\r\n\r\n    private extractLoginHint(account: AccountInfo): string | null {\r\n        return account.idTokenClaims?.login_hint || null;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n/**\r\n * Tenant Discovery Response which contains the relevant OAuth endpoints and data needed for authentication and authorization.\r\n */\r\nexport type OpenIdConfigResponse = {\r\n    authorization_endpoint: string;\r\n    token_endpoint: string;\r\n    end_session_endpoint?: string;\r\n    issuer: string;\r\n    jwks_uri: string;\r\n};\r\n\r\nexport function isOpenIdConfigResponse(response: object): boolean {\r\n    return (\r\n        response.hasOwnProperty(\"authorization_endpoint\") &&\r\n        response.hasOwnProperty(\"token_endpoint\") && \r\n        response.hasOwnProperty(\"issuer\") &&\r\n        response.hasOwnProperty(\"jwks_uri\")\r\n    );\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nexport const rawMetdataJSON = {\"endpointMetadata\":{\"https://login.microsoftonline.com/common/\":{\"token_endpoint\":\"https://login.microsoftonline.com/common/oauth2/v2.0/token\",\"token_endpoint_auth_methods_supported\":[\"client_secret_post\",\"private_key_jwt\",\"client_secret_basic\"],\"jwks_uri\":\"https://login.microsoftonline.com/common/discovery/v2.0/keys\",\"response_modes_supported\":[\"query\",\"fragment\",\"form_post\"],\"subject_types_supported\":[\"pairwise\"],\"id_token_signing_alg_values_supported\":[\"RS256\"],\"response_types_supported\":[\"code\",\"id_token\",\"code id_token\",\"id_token token\"],\"scopes_supported\":[\"openid\",\"profile\",\"email\",\"offline_access\"],\"issuer\":\"https://login.microsoftonline.com/{tenantid}/v2.0\",\"request_uri_parameter_supported\":false,\"userinfo_endpoint\":\"https://graph.microsoft.com/oidc/userinfo\",\"authorization_endpoint\":\"https://login.microsoftonline.com/common/oauth2/v2.0/authorize\",\"device_authorization_endpoint\":\"https://login.microsoftonline.com/common/oauth2/v2.0/devicecode\",\"http_logout_supported\":true,\"frontchannel_logout_supported\":true,\"end_session_endpoint\":\"https://login.microsoftonline.com/common/oauth2/v2.0/logout\",\"claims_supported\":[\"sub\",\"iss\",\"cloud_instance_name\",\"cloud_instance_host_name\",\"cloud_graph_host_name\",\"msgraph_host\",\"aud\",\"exp\",\"iat\",\"auth_time\",\"acr\",\"nonce\",\"preferred_username\",\"name\",\"tid\",\"ver\",\"at_hash\",\"c_hash\",\"email\"],\"kerberos_endpoint\":\"https://login.microsoftonline.com/common/kerberos\",\"tenant_region_scope\":null,\"cloud_instance_name\":\"microsoftonline.com\",\"cloud_graph_host_name\":\"graph.windows.net\",\"msgraph_host\":\"graph.microsoft.com\",\"rbac_url\":\"https://pas.windows.net\"},\"https://login.chinacloudapi.cn/common/\":{\"token_endpoint\":\"https://login.chinacloudapi.cn/common/oauth2/v2.0/token\",\"token_endpoint_auth_methods_supported\":[\"client_secret_post\",\"private_key_jwt\",\"client_secret_basic\"],\"jwks_uri\":\"https://login.chinacloudapi.cn/common/discovery/v2.0/keys\",\"response_modes_supported\":[\"query\",\"fragment\",\"form_post\"],\"subject_types_supported\":[\"pairwise\"],\"id_token_signing_alg_values_supported\":[\"RS256\"],\"response_types_supported\":[\"code\",\"id_token\",\"code id_token\",\"id_token token\"],\"scopes_supported\":[\"openid\",\"profile\",\"email\",\"offline_access\"],\"issuer\":\"https://login.partner.microsoftonline.cn/{tenantid}/v2.0\",\"request_uri_parameter_supported\":false,\"userinfo_endpoint\":\"https://microsoftgraph.chinacloudapi.cn/oidc/userinfo\",\"authorization_endpoint\":\"https://login.chinacloudapi.cn/common/oauth2/v2.0/authorize\",\"device_authorization_endpoint\":\"https://login.chinacloudapi.cn/common/oauth2/v2.0/devicecode\",\"http_logout_supported\":true,\"frontchannel_logout_supported\":true,\"end_session_endpoint\":\"https://login.chinacloudapi.cn/common/oauth2/v2.0/logout\",\"claims_supported\":[\"sub\",\"iss\",\"cloud_instance_name\",\"cloud_instance_host_name\",\"cloud_graph_host_name\",\"msgraph_host\",\"aud\",\"exp\",\"iat\",\"auth_time\",\"acr\",\"nonce\",\"preferred_username\",\"name\",\"tid\",\"ver\",\"at_hash\",\"c_hash\",\"email\"],\"kerberos_endpoint\":\"https://login.chinacloudapi.cn/common/kerberos\",\"tenant_region_scope\":null,\"cloud_instance_name\":\"partner.microsoftonline.cn\",\"cloud_graph_host_name\":\"graph.chinacloudapi.cn\",\"msgraph_host\":\"microsoftgraph.chinacloudapi.cn\",\"rbac_url\":\"https://pas.chinacloudapi.cn\"},\"https://login.microsoftonline.us/common/\":{\"token_endpoint\":\"https://login.microsoftonline.us/common/oauth2/v2.0/token\",\"token_endpoint_auth_methods_supported\":[\"client_secret_post\",\"private_key_jwt\",\"client_secret_basic\"],\"jwks_uri\":\"https://login.microsoftonline.us/common/discovery/v2.0/keys\",\"response_modes_supported\":[\"query\",\"fragment\",\"form_post\"],\"subject_types_supported\":[\"pairwise\"],\"id_token_signing_alg_values_supported\":[\"RS256\"],\"response_types_supported\":[\"code\",\"id_token\",\"code id_token\",\"id_token token\"],\"scopes_supported\":[\"openid\",\"profile\",\"email\",\"offline_access\"],\"issuer\":\"https://login.microsoftonline.us/{tenantid}/v2.0\",\"request_uri_parameter_supported\":false,\"userinfo_endpoint\":\"https://graph.microsoft.com/oidc/userinfo\",\"authorization_endpoint\":\"https://login.microsoftonline.us/common/oauth2/v2.0/authorize\",\"device_authorization_endpoint\":\"https://login.microsoftonline.us/common/oauth2/v2.0/devicecode\",\"http_logout_supported\":true,\"frontchannel_logout_supported\":true,\"end_session_endpoint\":\"https://login.microsoftonline.us/common/oauth2/v2.0/logout\",\"claims_supported\":[\"sub\",\"iss\",\"cloud_instance_name\",\"cloud_instance_host_name\",\"cloud_graph_host_name\",\"msgraph_host\",\"aud\",\"exp\",\"iat\",\"auth_time\",\"acr\",\"nonce\",\"preferred_username\",\"name\",\"tid\",\"ver\",\"at_hash\",\"c_hash\",\"email\"],\"kerberos_endpoint\":\"https://login.microsoftonline.us/common/kerberos\",\"tenant_region_scope\":null,\"cloud_instance_name\":\"microsoftonline.us\",\"cloud_graph_host_name\":\"graph.windows.net\",\"msgraph_host\":\"graph.microsoft.com\",\"rbac_url\":\"https://pasff.usgovcloudapi.net\"},\"https://login.microsoftonline.com/consumers/\":{\"token_endpoint\":\"https://login.microsoftonline.com/consumers/oauth2/v2.0/token\",\"token_endpoint_auth_methods_supported\":[\"client_secret_post\",\"private_key_jwt\",\"client_secret_basic\"],\"jwks_uri\":\"https://login.microsoftonline.com/consumers/discovery/v2.0/keys\",\"response_modes_supported\":[\"query\",\"fragment\",\"form_post\"],\"subject_types_supported\":[\"pairwise\"],\"id_token_signing_alg_values_supported\":[\"RS256\"],\"response_types_supported\":[\"code\",\"id_token\",\"code id_token\",\"id_token token\"],\"scopes_supported\":[\"openid\",\"profile\",\"email\",\"offline_access\"],\"issuer\":\"https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0\",\"request_uri_parameter_supported\":false,\"userinfo_endpoint\":\"https://graph.microsoft.com/oidc/userinfo\",\"authorization_endpoint\":\"https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize\",\"device_authorization_endpoint\":\"https://login.microsoftonline.com/consumers/oauth2/v2.0/devicecode\",\"http_logout_supported\":true,\"frontchannel_logout_supported\":true,\"end_session_endpoint\":\"https://login.microsoftonline.com/consumers/oauth2/v2.0/logout\",\"claims_supported\":[\"sub\",\"iss\",\"cloud_instance_name\",\"cloud_instance_host_name\",\"cloud_graph_host_name\",\"msgraph_host\",\"aud\",\"exp\",\"iat\",\"auth_time\",\"acr\",\"nonce\",\"preferred_username\",\"name\",\"tid\",\"ver\",\"at_hash\",\"c_hash\",\"email\"],\"kerberos_endpoint\":\"https://login.microsoftonline.com/consumers/kerberos\",\"tenant_region_scope\":null,\"cloud_instance_name\":\"microsoftonline.com\",\"cloud_graph_host_name\":\"graph.windows.net\",\"msgraph_host\":\"graph.microsoft.com\",\"rbac_url\":\"https://pas.windows.net\"},\"https://login.chinacloudapi.cn/consumers/\":{\"token_endpoint\":\"https://login.chinacloudapi.cn/consumers/oauth2/v2.0/token\",\"token_endpoint_auth_methods_supported\":[\"client_secret_post\",\"private_key_jwt\",\"client_secret_basic\"],\"jwks_uri\":\"https://login.chinacloudapi.cn/consumers/discovery/v2.0/keys\",\"response_modes_supported\":[\"query\",\"fragment\",\"form_post\"],\"subject_types_supported\":[\"pairwise\"],\"id_token_signing_alg_values_supported\":[\"RS256\"],\"response_types_supported\":[\"code\",\"id_token\",\"code id_token\",\"id_token token\"],\"scopes_supported\":[\"openid\",\"profile\",\"email\",\"offline_access\"],\"issuer\":\"https://login.partner.microsoftonline.cn/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0\",\"request_uri_parameter_supported\":false,\"userinfo_endpoint\":\"https://microsoftgraph.chinacloudapi.cn/oidc/userinfo\",\"authorization_endpoint\":\"https://login.chinacloudapi.cn/consumers/oauth2/v2.0/authorize\",\"device_authorization_endpoint\":\"https://login.chinacloudapi.cn/consumers/oauth2/v2.0/devicecode\",\"http_logout_supported\":true,\"frontchannel_logout_supported\":true,\"end_session_endpoint\":\"https://login.chinacloudapi.cn/consumers/oauth2/v2.0/logout\",\"claims_supported\":[\"sub\",\"iss\",\"cloud_instance_name\",\"cloud_instance_host_name\",\"cloud_graph_host_name\",\"msgraph_host\",\"aud\",\"exp\",\"iat\",\"auth_time\",\"acr\",\"nonce\",\"preferred_username\",\"name\",\"tid\",\"ver\",\"at_hash\",\"c_hash\",\"email\"],\"kerberos_endpoint\":\"https://login.chinacloudapi.cn/consumers/kerberos\",\"tenant_region_scope\":null,\"cloud_instance_name\":\"partner.microsoftonline.cn\",\"cloud_graph_host_name\":\"graph.chinacloudapi.cn\",\"msgraph_host\":\"microsoftgraph.chinacloudapi.cn\",\"rbac_url\":\"https://pas.chinacloudapi.cn\"},\"https://login.microsoftonline.us/consumers/\":{\"token_endpoint\":\"https://login.microsoftonline.us/consumers/oauth2/v2.0/token\",\"token_endpoint_auth_methods_supported\":[\"client_secret_post\",\"private_key_jwt\",\"client_secret_basic\"],\"jwks_uri\":\"https://login.microsoftonline.us/consumers/discovery/v2.0/keys\",\"response_modes_supported\":[\"query\",\"fragment\",\"form_post\"],\"subject_types_supported\":[\"pairwise\"],\"id_token_signing_alg_values_supported\":[\"RS256\"],\"response_types_supported\":[\"code\",\"id_token\",\"code id_token\",\"id_token token\"],\"scopes_supported\":[\"openid\",\"profile\",\"email\",\"offline_access\"],\"issuer\":\"https://login.microsoftonline.us/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0\",\"request_uri_parameter_supported\":false,\"userinfo_endpoint\":\"https://graph.microsoft.com/oidc/userinfo\",\"authorization_endpoint\":\"https://login.microsoftonline.us/consumers/oauth2/v2.0/authorize\",\"device_authorization_endpoint\":\"https://login.microsoftonline.us/consumers/oauth2/v2.0/devicecode\",\"http_logout_supported\":true,\"frontchannel_logout_supported\":true,\"end_session_endpoint\":\"https://login.microsoftonline.us/consumers/oauth2/v2.0/logout\",\"claims_supported\":[\"sub\",\"iss\",\"cloud_instance_name\",\"cloud_instance_host_name\",\"cloud_graph_host_name\",\"msgraph_host\",\"aud\",\"exp\",\"iat\",\"auth_time\",\"acr\",\"nonce\",\"preferred_username\",\"name\",\"tid\",\"ver\",\"at_hash\",\"c_hash\",\"email\"],\"kerberos_endpoint\":\"https://login.microsoftonline.us/consumers/kerberos\",\"tenant_region_scope\":null,\"cloud_instance_name\":\"microsoftonline.us\",\"cloud_graph_host_name\":\"graph.windows.net\",\"msgraph_host\":\"graph.microsoft.com\",\"rbac_url\":\"https://pasff.usgovcloudapi.net\"},\"https://login.microsoftonline.com/organizations/\":{\"token_endpoint\":\"https://login.microsoftonline.com/organizations/oauth2/v2.0/token\",\"token_endpoint_auth_methods_supported\":[\"client_secret_post\",\"private_key_jwt\",\"client_secret_basic\"],\"jwks_uri\":\"https://login.microsoftonline.com/organizations/discovery/v2.0/keys\",\"response_modes_supported\":[\"query\",\"fragment\",\"form_post\"],\"subject_types_supported\":[\"pairwise\"],\"id_token_signing_alg_values_supported\":[\"RS256\"],\"response_types_supported\":[\"code\",\"id_token\",\"code id_token\",\"id_token token\"],\"scopes_supported\":[\"openid\",\"profile\",\"email\",\"offline_access\"],\"issuer\":\"https://login.microsoftonline.com/{tenantid}/v2.0\",\"request_uri_parameter_supported\":false,\"userinfo_endpoint\":\"https://graph.microsoft.com/oidc/userinfo\",\"authorization_endpoint\":\"https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize\",\"device_authorization_endpoint\":\"https://login.microsoftonline.com/organizations/oauth2/v2.0/devicecode\",\"http_logout_supported\":true,\"frontchannel_logout_supported\":true,\"end_session_endpoint\":\"https://login.microsoftonline.com/organizations/oauth2/v2.0/logout\",\"claims_supported\":[\"sub\",\"iss\",\"cloud_instance_name\",\"cloud_instance_host_name\",\"cloud_graph_host_name\",\"msgraph_host\",\"aud\",\"exp\",\"iat\",\"auth_time\",\"acr\",\"nonce\",\"preferred_username\",\"name\",\"tid\",\"ver\",\"at_hash\",\"c_hash\",\"email\"],\"kerberos_endpoint\":\"https://login.microsoftonline.com/organizations/kerberos\",\"tenant_region_scope\":null,\"cloud_instance_name\":\"microsoftonline.com\",\"cloud_graph_host_name\":\"graph.windows.net\",\"msgraph_host\":\"graph.microsoft.com\",\"rbac_url\":\"https://pas.windows.net\"},\"https://login.chinacloudapi.cn/organizations/\":{\"token_endpoint\":\"https://login.chinacloudapi.cn/organizations/oauth2/v2.0/token\",\"token_endpoint_auth_methods_supported\":[\"client_secret_post\",\"private_key_jwt\",\"client_secret_basic\"],\"jwks_uri\":\"https://login.chinacloudapi.cn/organizations/discovery/v2.0/keys\",\"response_modes_supported\":[\"query\",\"fragment\",\"form_post\"],\"subject_types_supported\":[\"pairwise\"],\"id_token_signing_alg_values_supported\":[\"RS256\"],\"response_types_supported\":[\"code\",\"id_token\",\"code id_token\",\"id_token token\"],\"scopes_supported\":[\"openid\",\"profile\",\"email\",\"offline_access\"],\"issuer\":\"https://login.partner.microsoftonline.cn/{tenantid}/v2.0\",\"request_uri_parameter_supported\":false,\"userinfo_endpoint\":\"https://microsoftgraph.chinacloudapi.cn/oidc/userinfo\",\"authorization_endpoint\":\"https://login.chinacloudapi.cn/organizations/oauth2/v2.0/authorize\",\"device_authorization_endpoint\":\"https://login.chinacloudapi.cn/organizations/oauth2/v2.0/devicecode\",\"http_logout_supported\":true,\"frontchannel_logout_supported\":true,\"end_session_endpoint\":\"https://login.chinacloudapi.cn/organizations/oauth2/v2.0/logout\",\"claims_supported\":[\"sub\",\"iss\",\"cloud_instance_name\",\"cloud_instance_host_name\",\"cloud_graph_host_name\",\"msgraph_host\",\"aud\",\"exp\",\"iat\",\"auth_time\",\"acr\",\"nonce\",\"preferred_username\",\"name\",\"tid\",\"ver\",\"at_hash\",\"c_hash\",\"email\"],\"kerberos_endpoint\":\"https://login.chinacloudapi.cn/organizations/kerberos\",\"tenant_region_scope\":null,\"cloud_instance_name\":\"partner.microsoftonline.cn\",\"cloud_graph_host_name\":\"graph.chinacloudapi.cn\",\"msgraph_host\":\"microsoftgraph.chinacloudapi.cn\",\"rbac_url\":\"https://pas.chinacloudapi.cn\"},\"https://login.microsoftonline.us/organizations/\":{\"token_endpoint\":\"https://login.microsoftonline.us/organizations/oauth2/v2.0/token\",\"token_endpoint_auth_methods_supported\":[\"client_secret_post\",\"private_key_jwt\",\"client_secret_basic\"],\"jwks_uri\":\"https://login.microsoftonline.us/organizations/discovery/v2.0/keys\",\"response_modes_supported\":[\"query\",\"fragment\",\"form_post\"],\"subject_types_supported\":[\"pairwise\"],\"id_token_signing_alg_values_supported\":[\"RS256\"],\"response_types_supported\":[\"code\",\"id_token\",\"code id_token\",\"id_token token\"],\"scopes_supported\":[\"openid\",\"profile\",\"email\",\"offline_access\"],\"issuer\":\"https://login.microsoftonline.us/{tenantid}/v2.0\",\"request_uri_parameter_supported\":false,\"userinfo_endpoint\":\"https://graph.microsoft.com/oidc/userinfo\",\"authorization_endpoint\":\"https://login.microsoftonline.us/organizations/oauth2/v2.0/authorize\",\"device_authorization_endpoint\":\"https://login.microsoftonline.us/organizations/oauth2/v2.0/devicecode\",\"http_logout_supported\":true,\"frontchannel_logout_supported\":true,\"end_session_endpoint\":\"https://login.microsoftonline.us/organizations/oauth2/v2.0/logout\",\"claims_supported\":[\"sub\",\"iss\",\"cloud_instance_name\",\"cloud_instance_host_name\",\"cloud_graph_host_name\",\"msgraph_host\",\"aud\",\"exp\",\"iat\",\"auth_time\",\"acr\",\"nonce\",\"preferred_username\",\"name\",\"tid\",\"ver\",\"at_hash\",\"c_hash\",\"email\"],\"kerberos_endpoint\":\"https://login.microsoftonline.us/organizations/kerberos\",\"tenant_region_scope\":null,\"cloud_instance_name\":\"microsoftonline.us\",\"cloud_graph_host_name\":\"graph.windows.net\",\"msgraph_host\":\"graph.microsoft.com\",\"rbac_url\":\"https://pasff.usgovcloudapi.net\"}},\"instanceDiscoveryMetadata\":{\"https://login.microsoftonline.com/common/\":{\"tenant_discovery_endpoint\":\"https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration\",\"api-version\":\"1.1\",\"metadata\":[{\"preferred_network\":\"login.microsoftonline.com\",\"preferred_cache\":\"login.windows.net\",\"aliases\":[\"login.microsoftonline.com\",\"login.windows.net\",\"login.microsoft.com\",\"sts.windows.net\"]},{\"preferred_network\":\"login.partner.microsoftonline.cn\",\"preferred_cache\":\"login.partner.microsoftonline.cn\",\"aliases\":[\"login.partner.microsoftonline.cn\",\"login.chinacloudapi.cn\"]},{\"preferred_network\":\"login.microsoftonline.de\",\"preferred_cache\":\"login.microsoftonline.de\",\"aliases\":[\"login.microsoftonline.de\"]},{\"preferred_network\":\"login.microsoftonline.us\",\"preferred_cache\":\"login.microsoftonline.us\",\"aliases\":[\"login.microsoftonline.us\",\"login.usgovcloudapi.net\"]},{\"preferred_network\":\"login-us.microsoftonline.com\",\"preferred_cache\":\"login-us.microsoftonline.com\",\"aliases\":[\"login-us.microsoftonline.com\"]}]},\"https://login.chinacloudapi.cn/common/\":{\"tenant_discovery_endpoint\":\"https://login.chinacloudapi.cn/common/v2.0/.well-known/openid-configuration\",\"api-version\":\"1.1\",\"metadata\":[{\"preferred_network\":\"login.microsoftonline.com\",\"preferred_cache\":\"login.windows.net\",\"aliases\":[\"login.microsoftonline.com\",\"login.windows.net\",\"login.microsoft.com\",\"sts.windows.net\"]},{\"preferred_network\":\"login.partner.microsoftonline.cn\",\"preferred_cache\":\"login.partner.microsoftonline.cn\",\"aliases\":[\"login.partner.microsoftonline.cn\",\"login.chinacloudapi.cn\"]},{\"preferred_network\":\"login.microsoftonline.de\",\"preferred_cache\":\"login.microsoftonline.de\",\"aliases\":[\"login.microsoftonline.de\"]},{\"preferred_network\":\"login.microsoftonline.us\",\"preferred_cache\":\"login.microsoftonline.us\",\"aliases\":[\"login.microsoftonline.us\",\"login.usgovcloudapi.net\"]},{\"preferred_network\":\"login-us.microsoftonline.com\",\"preferred_cache\":\"login-us.microsoftonline.com\",\"aliases\":[\"login-us.microsoftonline.com\"]}]},\"https://login.microsoftonline.us/common/\":{\"tenant_discovery_endpoint\":\"https://login.microsoftonline.us/common/v2.0/.well-known/openid-configuration\",\"api-version\":\"1.1\",\"metadata\":[{\"preferred_network\":\"login.microsoftonline.com\",\"preferred_cache\":\"login.windows.net\",\"aliases\":[\"login.microsoftonline.com\",\"login.windows.net\",\"login.microsoft.com\",\"sts.windows.net\"]},{\"preferred_network\":\"login.partner.microsoftonline.cn\",\"preferred_cache\":\"login.partner.microsoftonline.cn\",\"aliases\":[\"login.partner.microsoftonline.cn\",\"login.chinacloudapi.cn\"]},{\"preferred_network\":\"login.microsoftonline.de\",\"preferred_cache\":\"login.microsoftonline.de\",\"aliases\":[\"login.microsoftonline.de\"]},{\"preferred_network\":\"login.microsoftonline.us\",\"preferred_cache\":\"login.microsoftonline.us\",\"aliases\":[\"login.microsoftonline.us\",\"login.usgovcloudapi.net\"]},{\"preferred_network\":\"login-us.microsoftonline.com\",\"preferred_cache\":\"login-us.microsoftonline.com\",\"aliases\":[\"login-us.microsoftonline.com\"]}]},\"https://login.microsoftonline.com/consumers/\":{\"tenant_discovery_endpoint\":\"https://login.microsoftonline.com/consumers/v2.0/.well-known/openid-configuration\",\"api-version\":\"1.1\",\"metadata\":[{\"preferred_network\":\"login.microsoftonline.com\",\"preferred_cache\":\"login.windows.net\",\"aliases\":[\"login.microsoftonline.com\",\"login.windows.net\",\"login.microsoft.com\",\"sts.windows.net\"]},{\"preferred_network\":\"login.partner.microsoftonline.cn\",\"preferred_cache\":\"login.partner.microsoftonline.cn\",\"aliases\":[\"login.partner.microsoftonline.cn\",\"login.chinacloudapi.cn\"]},{\"preferred_network\":\"login.microsoftonline.de\",\"preferred_cache\":\"login.microsoftonline.de\",\"aliases\":[\"login.microsoftonline.de\"]},{\"preferred_network\":\"login.microsoftonline.us\",\"preferred_cache\":\"login.microsoftonline.us\",\"aliases\":[\"login.microsoftonline.us\",\"login.usgovcloudapi.net\"]},{\"preferred_network\":\"login-us.microsoftonline.com\",\"preferred_cache\":\"login-us.microsoftonline.com\",\"aliases\":[\"login-us.microsoftonline.com\"]}]},\"https://login.chinacloudapi.cn/consumers/\":{\"tenant_discovery_endpoint\":\"https://login.chinacloudapi.cn/consumers/v2.0/.well-known/openid-configuration\",\"api-version\":\"1.1\",\"metadata\":[{\"preferred_network\":\"login.microsoftonline.com\",\"preferred_cache\":\"login.windows.net\",\"aliases\":[\"login.microsoftonline.com\",\"login.windows.net\",\"login.microsoft.com\",\"sts.windows.net\"]},{\"preferred_network\":\"login.partner.microsoftonline.cn\",\"preferred_cache\":\"login.partner.microsoftonline.cn\",\"aliases\":[\"login.partner.microsoftonline.cn\",\"login.chinacloudapi.cn\"]},{\"preferred_network\":\"login.microsoftonline.de\",\"preferred_cache\":\"login.microsoftonline.de\",\"aliases\":[\"login.microsoftonline.de\"]},{\"preferred_network\":\"login.microsoftonline.us\",\"preferred_cache\":\"login.microsoftonline.us\",\"aliases\":[\"login.microsoftonline.us\",\"login.usgovcloudapi.net\"]},{\"preferred_network\":\"login-us.microsoftonline.com\",\"preferred_cache\":\"login-us.microsoftonline.com\",\"aliases\":[\"login-us.microsoftonline.com\"]}]},\"https://login.microsoftonline.us/consumers/\":{\"tenant_discovery_endpoint\":\"https://login.microsoftonline.us/consumers/v2.0/.well-known/openid-configuration\",\"api-version\":\"1.1\",\"metadata\":[{\"preferred_network\":\"login.microsoftonline.com\",\"preferred_cache\":\"login.windows.net\",\"aliases\":[\"login.microsoftonline.com\",\"login.windows.net\",\"login.microsoft.com\",\"sts.windows.net\"]},{\"preferred_network\":\"login.partner.microsoftonline.cn\",\"preferred_cache\":\"login.partner.microsoftonline.cn\",\"aliases\":[\"login.partner.microsoftonline.cn\",\"login.chinacloudapi.cn\"]},{\"preferred_network\":\"login.microsoftonline.de\",\"preferred_cache\":\"login.microsoftonline.de\",\"aliases\":[\"login.microsoftonline.de\"]},{\"preferred_network\":\"login.microsoftonline.us\",\"preferred_cache\":\"login.microsoftonline.us\",\"aliases\":[\"login.microsoftonline.us\",\"login.usgovcloudapi.net\"]},{\"preferred_network\":\"login-us.microsoftonline.com\",\"preferred_cache\":\"login-us.microsoftonline.com\",\"aliases\":[\"login-us.microsoftonline.com\"]}]},\"https://login.microsoftonline.com/organizations/\":{\"tenant_discovery_endpoint\":\"https://login.microsoftonline.com/organizations/v2.0/.well-known/openid-configuration\",\"api-version\":\"1.1\",\"metadata\":[{\"preferred_network\":\"login.microsoftonline.com\",\"preferred_cache\":\"login.windows.net\",\"aliases\":[\"login.microsoftonline.com\",\"login.windows.net\",\"login.microsoft.com\",\"sts.windows.net\"]},{\"preferred_network\":\"login.partner.microsoftonline.cn\",\"preferred_cache\":\"login.partner.microsoftonline.cn\",\"aliases\":[\"login.partner.microsoftonline.cn\",\"login.chinacloudapi.cn\"]},{\"preferred_network\":\"login.microsoftonline.de\",\"preferred_cache\":\"login.microsoftonline.de\",\"aliases\":[\"login.microsoftonline.de\"]},{\"preferred_network\":\"login.microsoftonline.us\",\"preferred_cache\":\"login.microsoftonline.us\",\"aliases\":[\"login.microsoftonline.us\",\"login.usgovcloudapi.net\"]},{\"preferred_network\":\"login-us.microsoftonline.com\",\"preferred_cache\":\"login-us.microsoftonline.com\",\"aliases\":[\"login-us.microsoftonline.com\"]}]},\"https://login.chinacloudapi.cn/organizations/\":{\"tenant_discovery_endpoint\":\"https://login.chinacloudapi.cn/organizations/v2.0/.well-known/openid-configuration\",\"api-version\":\"1.1\",\"metadata\":[{\"preferred_network\":\"login.microsoftonline.com\",\"preferred_cache\":\"login.windows.net\",\"aliases\":[\"login.microsoftonline.com\",\"login.windows.net\",\"login.microsoft.com\",\"sts.windows.net\"]},{\"preferred_network\":\"login.partner.microsoftonline.cn\",\"preferred_cache\":\"login.partner.microsoftonline.cn\",\"aliases\":[\"login.partner.microsoftonline.cn\",\"login.chinacloudapi.cn\"]},{\"preferred_network\":\"login.microsoftonline.de\",\"preferred_cache\":\"login.microsoftonline.de\",\"aliases\":[\"login.microsoftonline.de\"]},{\"preferred_network\":\"login.microsoftonline.us\",\"preferred_cache\":\"login.microsoftonline.us\",\"aliases\":[\"login.microsoftonline.us\",\"login.usgovcloudapi.net\"]},{\"preferred_network\":\"login-us.microsoftonline.com\",\"preferred_cache\":\"login-us.microsoftonline.com\",\"aliases\":[\"login-us.microsoftonline.com\"]}]},\"https://login.microsoftonline.us/organizations/\":{\"tenant_discovery_endpoint\":\"https://login.microsoftonline.us/organizations/v2.0/.well-known/openid-configuration\",\"api-version\":\"1.1\",\"metadata\":[{\"preferred_network\":\"login.microsoftonline.com\",\"preferred_cache\":\"login.windows.net\",\"aliases\":[\"login.microsoftonline.com\",\"login.windows.net\",\"login.microsoft.com\",\"sts.windows.net\"]},{\"preferred_network\":\"login.partner.microsoftonline.cn\",\"preferred_cache\":\"login.partner.microsoftonline.cn\",\"aliases\":[\"login.partner.microsoftonline.cn\",\"login.chinacloudapi.cn\"]},{\"preferred_network\":\"login.microsoftonline.de\",\"preferred_cache\":\"login.microsoftonline.de\",\"aliases\":[\"login.microsoftonline.de\"]},{\"preferred_network\":\"login.microsoftonline.us\",\"preferred_cache\":\"login.microsoftonline.us\",\"aliases\":[\"login.microsoftonline.us\",\"login.usgovcloudapi.net\"]},{\"preferred_network\":\"login-us.microsoftonline.com\",\"preferred_cache\":\"login-us.microsoftonline.com\",\"aliases\":[\"login-us.microsoftonline.com\"]}]}}};\r\n\r\nexport const EndpointMetadata = rawMetdataJSON.endpointMetadata;\r\nexport const InstanceDiscoveryMetadata = rawMetdataJSON.instanceDiscoveryMetadata;\r\n\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nexport enum EventType {\r\n    INITIALIZE_START = \"msal:initializeStart\",\r\n    INITIALIZE_END = \"msal:initializeEnd\",\r\n    ACCOUNT_ADDED = \"msal:accountAdded\",\r\n    ACCOUNT_REMOVED = \"msal:accountRemoved\",\r\n    LOGIN_START = \"msal:loginStart\",\r\n    LOGIN_SUCCESS = \"msal:loginSuccess\",\r\n    LOGIN_FAILURE = \"msal:loginFailure\",\r\n    ACQUIRE_TOKEN_START = \"msal:acquireTokenStart\",\r\n    ACQUIRE_TOKEN_SUCCESS = \"msal:acquireTokenSuccess\",\r\n    ACQUIRE_TOKEN_FAILURE = \"msal:acquireTokenFailure\",\r\n    ACQUIRE_TOKEN_NETWORK_START = \"msal:acquireTokenFromNetworkStart\",\r\n    SSO_SILENT_START = \"msal:ssoSilentStart\",\r\n    SSO_SILENT_SUCCESS = \"msal:ssoSilentSuccess\",\r\n    SSO_SILENT_FAILURE = \"msal:ssoSilentFailure\",\r\n    ACQUIRE_TOKEN_BY_CODE_START = \"msal:acquireTokenByCodeStart\",\r\n    ACQUIRE_TOKEN_BY_CODE_SUCCESS = \"msal:acquireTokenByCodeSuccess\",\r\n    ACQUIRE_TOKEN_BY_CODE_FAILURE = \"msal:acquireTokenByCodeFailure\",\r\n    HANDLE_REDIRECT_START = \"msal:handleRedirectStart\",\r\n    HANDLE_REDIRECT_END = \"msal:handleRedirectEnd\",\r\n    POPUP_OPENED = \"msal:popupOpened\",\r\n    LOGOUT_START = \"msal:logoutStart\",\r\n    LOGOUT_SUCCESS = \"msal:logoutSuccess\",\r\n    LOGOUT_FAILURE = \"msal:logoutFailure\",\r\n    LOGOUT_END = \"msal:logoutEnd\",\r\n    RESTORE_FROM_BFCACHE = \"msal:restoreFromBFCache\"\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthError, InteractionRequiredAuthError } from \"@azure/msal-common\";\r\nimport { BrowserAuthError } from \"./BrowserAuthError\";\r\n\r\nexport type OSError = {\r\n    error: number;\r\n    protocol_error: string;\r\n    properties: object;\r\n    status: string;\r\n    retryable?: boolean;\r\n};\r\n\r\nexport enum NativeStatusCode {\r\n    USER_INTERACTION_REQUIRED = \"USER_INTERACTION_REQUIRED\",\r\n    USER_CANCEL = \"USER_CANCEL\",\r\n    NO_NETWORK = \"NO_NETWORK\",\r\n    TRANSIENT_ERROR = \"TRANSIENT_ERROR\",\r\n    PERSISTENT_ERROR = \"PERSISTENT_ERROR\",\r\n    DISABLED = \"DISABLED\",\r\n    ACCOUNT_UNAVAILABLE = \"ACCOUNT_UNAVAILABLE\"\r\n}\r\n\r\nexport const NativeAuthErrorMessage = {\r\n    extensionError: {\r\n        code: \"ContentError\"\r\n    },\r\n    userSwitch: {\r\n        code: \"user_switch\",\r\n        desc: \"User attempted to switch accounts in the native broker, which is not allowed. All new accounts must sign-in through the standard web flow first, please try again.\"\r\n    },\r\n    tokensNotFoundInCache: {\r\n        code: \"tokens_not_found_in_internal_memory_cache\",\r\n        desc: \"Tokens not cached in MSAL JS internal memory, please make the WAM request\"\r\n    }\r\n};\r\n\r\nexport class NativeAuthError extends AuthError {\r\n    ext: OSError | undefined;\r\n\r\n    constructor(errorCode: string, description: string, ext?: OSError) {\r\n        super(errorCode, description);\r\n\r\n        Object.setPrototypeOf(this, NativeAuthError.prototype);\r\n        this.name = \"NativeAuthError\";\r\n        this.ext = ext;\r\n    }\r\n\r\n    /**\r\n     * These errors should result in a fallback to the 'standard' browser based auth flow.\r\n     */\r\n    isFatal(): boolean {\r\n        if (this.ext && this.ext.status && (this.ext.status === NativeStatusCode.PERSISTENT_ERROR || this.ext.status === NativeStatusCode.DISABLED)) {\r\n            return true;\r\n        }\r\n\r\n        switch (this.errorCode) {\r\n            case NativeAuthErrorMessage.extensionError.code:\r\n                return true;\r\n            default:\r\n                return false;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Create the appropriate error object based on the WAM status code.\r\n     * @param code\r\n     * @param description\r\n     * @param ext\r\n     * @returns\r\n     */\r\n    static createError(code: string, description: string, ext?: OSError): AuthError {\r\n        if (ext && ext.status) {\r\n            switch (ext.status) {\r\n                case NativeStatusCode.ACCOUNT_UNAVAILABLE:\r\n                    return InteractionRequiredAuthError.createNativeAccountUnavailableError();\r\n                case NativeStatusCode.USER_INTERACTION_REQUIRED:\r\n                    return new InteractionRequiredAuthError(code, description);\r\n                case NativeStatusCode.USER_CANCEL:\r\n                    return BrowserAuthError.createUserCancelledError();\r\n                case NativeStatusCode.NO_NETWORK:\r\n                    return BrowserAuthError.createNoNetworkConnectivityError();\r\n            }\r\n        }\r\n\r\n        return new NativeAuthError(code, description, ext);\r\n    }\r\n\r\n    /**\r\n     * Creates user switch error when the user chooses a different account in the native broker prompt\r\n     * @returns\r\n     */\r\n    static createUserSwitchError(): NativeAuthError {\r\n        return new NativeAuthError(NativeAuthErrorMessage.userSwitch.code, NativeAuthErrorMessage.userSwitch.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates a tokens not found error when the internal cache look up fails\r\n     * @returns NativeAuthError: tokensNotFoundInCache\r\n     */\r\n    static createTokensNotFoundInCacheError(): NativeAuthError {\r\n        return new NativeAuthError(NativeAuthErrorMessage.tokensNotFoundInCache.code, NativeAuthErrorMessage.tokensNotFoundInCache.desc);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { INetworkModule } from \"../network/INetworkModule\";\r\nimport { NetworkResponse } from \"../network/NetworkManager\";\r\nimport { IMDSBadResponse } from \"../response/IMDSBadResponse\";\r\nimport { Constants, RegionDiscoverySources, ResponseCodes } from \"../utils/Constants\";\r\nimport { RegionDiscoveryMetadata } from \"./RegionDiscoveryMetadata\";\r\nimport { ImdsOptions } from \"./ImdsOptions\";\r\nimport { IPerformanceClient } from \"../telemetry/performance/IPerformanceClient\";\r\nimport { PerformanceEvents } from \"../telemetry/performance/PerformanceEvent\";\r\n\r\nexport class RegionDiscovery {\r\n    // Network interface to make requests with.\r\n    protected networkInterface: INetworkModule;\r\n    // Performance client\r\n    protected performanceClient: IPerformanceClient | undefined;\r\n    // CorrelationId\r\n    protected correlationId: string | undefined;\r\n    // Options for the IMDS endpoint request\r\n    protected static IMDS_OPTIONS: ImdsOptions = {\r\n        headers: {\r\n            Metadata: \"true\",\r\n        },\r\n    };\r\n\r\n    constructor(networkInterface: INetworkModule, performanceClient?: IPerformanceClient, correlationId?: string) {\r\n        this.networkInterface = networkInterface;\r\n        this.performanceClient = performanceClient;\r\n        this.correlationId = correlationId;\r\n    }\r\n\r\n    /**\r\n     * Detect the region from the application's environment.\r\n     * \r\n     * @returns Promise<string | null>\r\n     */\r\n    public async detectRegion(environmentRegion: string | undefined, regionDiscoveryMetadata: RegionDiscoveryMetadata): Promise<string | null> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.RegionDiscoveryDetectRegion, this.correlationId);\r\n        \r\n        // Initialize auto detected region with the region from the envrionment \r\n        let autodetectedRegionName = environmentRegion;\r\n\r\n        // Check if a region was detected from the environment, if not, attempt to get the region from IMDS \r\n        if (!autodetectedRegionName) {\r\n            const options = RegionDiscovery.IMDS_OPTIONS;\r\n\r\n            try {\r\n                this.performanceClient?.setPreQueueTime(PerformanceEvents.RegionDiscoveryGetRegionFromIMDS, this.correlationId);\r\n                const localIMDSVersionResponse = await this.getRegionFromIMDS(Constants.IMDS_VERSION, options);\r\n                if (localIMDSVersionResponse.status === ResponseCodes.httpSuccess) {\r\n                    autodetectedRegionName = localIMDSVersionResponse.body;\r\n                    regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS;\r\n                } \r\n                \r\n                // If the response using the local IMDS version failed, try to fetch the current version of IMDS and retry. \r\n                if (localIMDSVersionResponse.status === ResponseCodes.httpBadRequest) {\r\n                    this.performanceClient?.setPreQueueTime(PerformanceEvents.RegionDiscoveryGetCurrentVersion, this.correlationId);\r\n                    const currentIMDSVersion = await this.getCurrentVersion(options);\r\n                    if (!currentIMDSVersion) {\r\n                        regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;\r\n                        return null;\r\n                    }\r\n\r\n                    this.performanceClient?.setPreQueueTime(PerformanceEvents.RegionDiscoveryGetRegionFromIMDS, this.correlationId);\r\n                    const currentIMDSVersionResponse = await this.getRegionFromIMDS(currentIMDSVersion, options);\r\n                    if (currentIMDSVersionResponse.status === ResponseCodes.httpSuccess) {\r\n                        autodetectedRegionName = currentIMDSVersionResponse.body;\r\n                        regionDiscoveryMetadata.region_source = RegionDiscoverySources.IMDS;\r\n                    }\r\n                }\r\n            } catch(e) {\r\n                regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;\r\n                return null;\r\n            } \r\n        } else {\r\n            regionDiscoveryMetadata.region_source = RegionDiscoverySources.ENVIRONMENT_VARIABLE;\r\n        }\r\n\r\n        // If no region was auto detected from the environment or from the IMDS endpoint, mark the attempt as a FAILED_AUTO_DETECTION\r\n        if (!autodetectedRegionName) {\r\n            regionDiscoveryMetadata.region_source = RegionDiscoverySources.FAILED_AUTO_DETECTION;\r\n        }\r\n\r\n        return autodetectedRegionName || null;\r\n    }\r\n\r\n    /**\r\n     * Make the call to the IMDS endpoint\r\n     * \r\n     * @param imdsEndpointUrl\r\n     * @returns Promise<NetworkResponse<string>>\r\n     */\r\n    private async getRegionFromIMDS(version: string, options: ImdsOptions): Promise<NetworkResponse<string>> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.RegionDiscoveryGetRegionFromIMDS, this.correlationId);\r\n        return this.networkInterface.sendGetRequestAsync<string>(`${Constants.IMDS_ENDPOINT}?api-version=${version}&format=text`, options, Constants.IMDS_TIMEOUT);\r\n    }\r\n\r\n    /**\r\n     * Get the most recent version of the IMDS endpoint available\r\n     *  \r\n     * @returns Promise<string | null>\r\n     */\r\n    private async getCurrentVersion(options: ImdsOptions): Promise<string | null> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.RegionDiscoveryGetCurrentVersion, this.correlationId);\r\n        try {\r\n            const response = await this.networkInterface.sendGetRequestAsync<IMDSBadResponse>(`${Constants.IMDS_ENDPOINT}?format=json`, options);\r\n\r\n            // When IMDS endpoint is called without the api version query param, bad request response comes back with latest version.\r\n            if (response.status === ResponseCodes.httpBadRequest && response.body && response.body[\"newest-versions\"] && response.body[\"newest-versions\"].length > 0) {\r\n                return response.body[\"newest-versions\"][0];\r\n            }\r\n\r\n            return null;\r\n        } catch (e) {\r\n            return null;\r\n        }\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthorityType } from \"./AuthorityType\";\r\nimport { isOpenIdConfigResponse, OpenIdConfigResponse } from \"./OpenIdConfigResponse\";\r\nimport { UrlString } from \"../url/UrlString\";\r\nimport { IUri } from \"../url/IUri\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\nimport { INetworkModule } from \"../network/INetworkModule\";\r\nimport { AADAuthorityConstants, AuthorityMetadataSource, Constants, RegionDiscoveryOutcomes } from \"../utils/Constants\";\r\nimport { EndpointMetadata, InstanceDiscoveryMetadata } from \"./AuthorityMetadata\";\r\nimport { ClientConfigurationError } from \"../error/ClientConfigurationError\";\r\nimport { ProtocolMode } from \"./ProtocolMode\";\r\nimport { ICacheManager } from \"../cache/interface/ICacheManager\";\r\nimport { AuthorityMetadataEntity } from \"../cache/entities/AuthorityMetadataEntity\";\r\nimport { AuthorityOptions, AzureCloudInstance } from \"./AuthorityOptions\";\r\nimport { CloudInstanceDiscoveryResponse, isCloudInstanceDiscoveryResponse } from \"./CloudInstanceDiscoveryResponse\";\r\nimport {\r\n    CloudInstanceDiscoveryErrorResponse,\r\n    isCloudInstanceDiscoveryErrorResponse\r\n} from \"./CloudInstanceDiscoveryErrorResponse\";\r\nimport { CloudDiscoveryMetadata } from \"./CloudDiscoveryMetadata\";\r\nimport { RegionDiscovery } from \"./RegionDiscovery\";\r\nimport { RegionDiscoveryMetadata } from \"./RegionDiscoveryMetadata\";\r\nimport { ImdsOptions } from \"./ImdsOptions\";\r\nimport { AzureCloudOptions } from \"../config/ClientConfiguration\";\r\nimport { Logger } from \"../logger/Logger\";\r\nimport { AuthError } from \"../error/AuthError\";\r\nimport { IPerformanceClient } from \"../telemetry/performance/IPerformanceClient\";\r\nimport { PerformanceEvents } from \"../telemetry/performance/PerformanceEvent\";\r\n\r\n/**\r\n * The authority class validates the authority URIs used by the user, and retrieves the OpenID Configuration Data from the\r\n * endpoint. It will store the pertinent config data in this object for use during token calls.\r\n */\r\nexport class Authority {\r\n    // Canonical authority url string\r\n    private _canonicalAuthority: UrlString;\r\n    // Canonicaly authority url components\r\n    private _canonicalAuthorityUrlComponents: IUri | null;\r\n    // Network interface to make requests with.\r\n    protected networkInterface: INetworkModule;\r\n    // Cache Manager to cache network responses\r\n    protected cacheManager: ICacheManager;\r\n    // Protocol mode to construct endpoints\r\n    private authorityOptions: AuthorityOptions;\r\n    // Authority metadata\r\n    private metadata: AuthorityMetadataEntity;\r\n    // Region discovery service\r\n    private regionDiscovery: RegionDiscovery;\r\n    // Region discovery metadata\r\n    public regionDiscoveryMetadata: RegionDiscoveryMetadata;\r\n    // Logger object\r\n    private logger: Logger;\r\n    // Performance client\r\n    protected performanceClient: IPerformanceClient | undefined;\r\n    // Correlation Id\r\n    protected correlationId: string | undefined;\r\n    // Reserved tenant domain names that will not be replaced with tenant id\r\n    private static reservedTenantDomains: Set<string> = (new Set([\r\n        \"{tenant}\",\r\n        \"{tenantid}\",\r\n        AADAuthorityConstants.COMMON,\r\n        AADAuthorityConstants.CONSUMERS,\r\n        AADAuthorityConstants.ORGANIZATIONS\r\n    ]));\r\n\r\n    constructor(\r\n        authority: string,\r\n        networkInterface: INetworkModule,\r\n        cacheManager: ICacheManager,\r\n        authorityOptions: AuthorityOptions,\r\n        logger: Logger,\r\n        performanceClient?: IPerformanceClient,\r\n        correlationId?: string\r\n    ) {\r\n        this.canonicalAuthority = authority;\r\n        this._canonicalAuthority.validateAsUri();\r\n        this.networkInterface = networkInterface;\r\n        this.cacheManager = cacheManager;\r\n        this.authorityOptions = authorityOptions;\r\n        this.regionDiscoveryMetadata = { region_used: undefined, region_source: undefined, region_outcome: undefined };\r\n        this.logger = logger;\r\n        this.performanceClient = performanceClient;\r\n        this.correlationId = correlationId;\r\n        this.regionDiscovery = new RegionDiscovery(networkInterface, this.performanceClient, this.correlationId);\r\n    }\r\n\r\n    /**\r\n     * Get {@link AuthorityType}\r\n     * @param authorityUri {@link IUri}\r\n     * @private\r\n     */\r\n    private getAuthorityType(authorityUri: IUri): AuthorityType {\r\n        // CIAM auth url pattern is being standardized as: <tenant>.ciamlogin.com\r\n        if (authorityUri.HostNameAndPort.endsWith(Constants.CIAM_AUTH_URL)) {\r\n            return AuthorityType.Ciam;\r\n        }\r\n\r\n        const pathSegments = authorityUri.PathSegments;\r\n        if (pathSegments.length) {\r\n            switch(pathSegments[0].toLowerCase()) {\r\n                case Constants.ADFS:\r\n                    return AuthorityType.Adfs;\r\n                case Constants.DSTS:\r\n                    return AuthorityType.Dsts;\r\n                default:\r\n                    break;\r\n            }\r\n        }\r\n        return AuthorityType.Default;\r\n    }\r\n\r\n    // See above for AuthorityType\r\n    public get authorityType(): AuthorityType {\r\n        return this.getAuthorityType(this.canonicalAuthorityUrlComponents);\r\n    }\r\n\r\n    /**\r\n     * ProtocolMode enum representing the way endpoints are constructed.\r\n     */\r\n    public get protocolMode(): ProtocolMode {\r\n        return this.authorityOptions.protocolMode;\r\n    }\r\n\r\n    /**\r\n     * Returns authorityOptions which can be used to reinstantiate a new authority instance\r\n     */\r\n    public get options(): AuthorityOptions {\r\n        return this.authorityOptions;\r\n    }\r\n\r\n    /**\r\n     * A URL that is the authority set by the developer\r\n     */\r\n    public get canonicalAuthority(): string {\r\n        return this._canonicalAuthority.urlString;\r\n    }\r\n\r\n    /**\r\n     * Sets canonical authority.\r\n     */\r\n    public set canonicalAuthority(url: string) {\r\n        this._canonicalAuthority = new UrlString(url);\r\n        this._canonicalAuthority.validateAsUri();\r\n        this._canonicalAuthorityUrlComponents = null;\r\n    }\r\n\r\n    /**\r\n     * Get authority components.\r\n     */\r\n    public get canonicalAuthorityUrlComponents(): IUri {\r\n        if (!this._canonicalAuthorityUrlComponents) {\r\n            this._canonicalAuthorityUrlComponents = this._canonicalAuthority.getUrlComponents();\r\n        }\r\n\r\n        return this._canonicalAuthorityUrlComponents;\r\n    }\r\n\r\n    /**\r\n     * Get hostname and port i.e. login.microsoftonline.com\r\n     */\r\n    public get hostnameAndPort(): string {\r\n        return this.canonicalAuthorityUrlComponents.HostNameAndPort.toLowerCase();\r\n    }\r\n\r\n    /**\r\n     * Get tenant for authority.\r\n     */\r\n    public get tenant(): string {\r\n        return this.canonicalAuthorityUrlComponents.PathSegments[0];\r\n    }\r\n\r\n    /**\r\n     * OAuth /authorize endpoint for requests\r\n     */\r\n    public get authorizationEndpoint(): string {\r\n        if(this.discoveryComplete()) {\r\n            return this.replacePath(this.metadata.authorization_endpoint);\r\n        } else {\r\n            throw ClientAuthError.createEndpointDiscoveryIncompleteError(\"Discovery incomplete.\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * OAuth /token endpoint for requests\r\n     */\r\n    public get tokenEndpoint(): string {\r\n        if(this.discoveryComplete()) {\r\n            return this.replacePath(this.metadata.token_endpoint);\r\n        } else {\r\n            throw ClientAuthError.createEndpointDiscoveryIncompleteError(\"Discovery incomplete.\");\r\n        }\r\n    }\r\n\r\n    public get deviceCodeEndpoint(): string {\r\n        if(this.discoveryComplete()) {\r\n            return this.replacePath(this.metadata.token_endpoint.replace(\"/token\", \"/devicecode\"));\r\n        } else {\r\n            throw ClientAuthError.createEndpointDiscoveryIncompleteError(\"Discovery incomplete.\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * OAuth logout endpoint for requests\r\n     */\r\n    public get endSessionEndpoint(): string {\r\n        if(this.discoveryComplete()) {\r\n            // ROPC policies may not have end_session_endpoint set\r\n            if (!this.metadata.end_session_endpoint) {\r\n                throw ClientAuthError.createLogoutNotSupportedError();\r\n            }\r\n            return this.replacePath(this.metadata.end_session_endpoint);\r\n        } else {\r\n            throw ClientAuthError.createEndpointDiscoveryIncompleteError(\"Discovery incomplete.\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * OAuth issuer for requests\r\n     */\r\n    public get selfSignedJwtAudience(): string {\r\n        if(this.discoveryComplete()) {\r\n            return this.replacePath(this.metadata.issuer);\r\n        } else {\r\n            throw ClientAuthError.createEndpointDiscoveryIncompleteError(\"Discovery incomplete.\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Jwks_uri for token signing keys\r\n     */\r\n    public get jwksUri(): string {\r\n        if(this.discoveryComplete()) {\r\n            return this.replacePath(this.metadata.jwks_uri);\r\n        } else {\r\n            throw ClientAuthError.createEndpointDiscoveryIncompleteError(\"Discovery incomplete.\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Returns a flag indicating that tenant name can be replaced in authority {@link IUri}\r\n     * @param authorityUri {@link IUri}\r\n     * @private\r\n     */\r\n    private canReplaceTenant(authorityUri: IUri): boolean {\r\n        return authorityUri.PathSegments.length === 1\r\n            && !Authority.reservedTenantDomains.has(authorityUri.PathSegments[0])\r\n            && this.getAuthorityType(authorityUri) === AuthorityType.Default\r\n            && this.protocolMode === ProtocolMode.AAD;\r\n    }\r\n\r\n    /**\r\n     * Replaces tenant in url path with current tenant. Defaults to common.\r\n     * @param urlString\r\n     */\r\n    private replaceTenant(urlString: string): string {\r\n        return urlString.replace(/{tenant}|{tenantid}/g, this.tenant);\r\n    }\r\n\r\n    /**\r\n     * Replaces path such as tenant or policy with the current tenant or policy.\r\n     * @param urlString\r\n     */\r\n    private replacePath(urlString: string): string {\r\n        let endpoint = urlString;\r\n        const cachedAuthorityUrl = new UrlString(this.metadata.canonical_authority);\r\n        const cachedAuthorityUrlComponents = cachedAuthorityUrl.getUrlComponents();\r\n        const cachedAuthorityParts = cachedAuthorityUrlComponents.PathSegments;\r\n        const currentAuthorityParts = this.canonicalAuthorityUrlComponents.PathSegments;\r\n\r\n        currentAuthorityParts.forEach((currentPart, index) => {\r\n            let cachedPart = cachedAuthorityParts[index];\r\n            if (index === 0 && this.canReplaceTenant(cachedAuthorityUrlComponents))\r\n            {\r\n                const tenantId = (new UrlString(this.metadata.authorization_endpoint)).getUrlComponents().PathSegments[0];\r\n                /**\r\n                 * Check if AAD canonical authority contains tenant domain name, for example \"testdomain.onmicrosoft.com\",\r\n                 * by comparing its first path segment to the corresponding authorization endpoint path segment, which is\r\n                 * always resolved with tenant id by OIDC.\r\n                 */\r\n                if (cachedPart !== tenantId) {\r\n                    this.logger.verbose(`Replacing tenant domain name ${cachedPart} with id ${tenantId}`);\r\n                    cachedPart = tenantId;\r\n                }\r\n            }\r\n            if (currentPart !== cachedPart) {\r\n                endpoint = endpoint.replace(`/${cachedPart}/`, `/${currentPart}/`);\r\n            }\r\n        });\r\n\r\n        return this.replaceTenant(endpoint);\r\n    }\r\n\r\n    /**\r\n     * The default open id configuration endpoint for any canonical authority.\r\n     */\r\n    protected get defaultOpenIdConfigurationEndpoint(): string {\r\n        if (\r\n            this.authorityType === AuthorityType.Adfs ||\r\n            this.authorityType === AuthorityType.Dsts ||\r\n            this.protocolMode === ProtocolMode.OIDC\r\n        ) {\r\n            return `${this.canonicalAuthority}.well-known/openid-configuration`;\r\n        }\r\n        return `${this.canonicalAuthority}v2.0/.well-known/openid-configuration`;\r\n    }\r\n\r\n    /**\r\n     * Boolean that returns whethr or not tenant discovery has been completed.\r\n     */\r\n    discoveryComplete(): boolean {\r\n        return !!this.metadata;\r\n    }\r\n\r\n    /**\r\n     * Perform endpoint discovery to discover aliases, preferred_cache, preferred_network\r\n     * and the /authorize, /token and logout endpoints.\r\n     */\r\n    public async resolveEndpointsAsync(): Promise<void> {\r\n\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthorityResolveEndpointsAsync, this.correlationId);\r\n\r\n        let metadataEntity = this.cacheManager.getAuthorityMetadataByAlias(this.hostnameAndPort);\r\n        if (!metadataEntity) {\r\n            metadataEntity = new AuthorityMetadataEntity();\r\n            metadataEntity.updateCanonicalAuthority(this.canonicalAuthority);\r\n        }\r\n\r\n        this.performanceClient?.setPreQueueTime(PerformanceEvents.AuthorityUpdateCloudDiscoveryMetadata, this.correlationId);\r\n        const cloudDiscoverySource = await this.updateCloudDiscoveryMetadata(metadataEntity);\r\n        this.canonicalAuthority = this.canonicalAuthority.replace(this.hostnameAndPort, metadataEntity.preferred_network);\r\n\r\n        this.performanceClient?.setPreQueueTime(PerformanceEvents.AuthorityUpdateEndpointMetadata, this.correlationId);\r\n        const endpointSource = await this.updateEndpointMetadata(metadataEntity);\r\n\r\n        if (cloudDiscoverySource !== AuthorityMetadataSource.CACHE && endpointSource !== AuthorityMetadataSource.CACHE) {\r\n            // Reset the expiration time unless both values came from a successful cache lookup\r\n            metadataEntity.resetExpiresAt();\r\n            metadataEntity.updateCanonicalAuthority(this.canonicalAuthority);\r\n        }\r\n\r\n        const cacheKey = this.cacheManager.generateAuthorityMetadataCacheKey(metadataEntity.preferred_cache);\r\n        this.cacheManager.setAuthorityMetadata(cacheKey, metadataEntity);\r\n        this.metadata = metadataEntity;\r\n    }\r\n\r\n    /**\r\n     * Update AuthorityMetadataEntity with new endpoints and return where the information came from\r\n     * @param metadataEntity\r\n     */\r\n    private async updateEndpointMetadata(metadataEntity: AuthorityMetadataEntity): Promise<AuthorityMetadataSource> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthorityUpdateEndpointMetadata, this.correlationId);\r\n\r\n        let metadata = this.getEndpointMetadataFromConfig();\r\n        if (metadata) {\r\n            metadataEntity.updateEndpointMetadata(metadata, false);\r\n            return AuthorityMetadataSource.CONFIG;\r\n        }\r\n\r\n        if (this.isAuthoritySameType(metadataEntity) && metadataEntity.endpointsFromNetwork && !metadataEntity.isExpired()) {\r\n            // No need to update\r\n            return AuthorityMetadataSource.CACHE;\r\n        }\r\n\r\n        this.performanceClient?.setPreQueueTime(PerformanceEvents.AuthorityGetEndpointMetadataFromNetwork, this.correlationId);\r\n        metadata = await this.getEndpointMetadataFromNetwork();\r\n        if (metadata) {\r\n            // If the user prefers to use an azure region replace the global endpoints with regional information.\r\n            if (this.authorityOptions.azureRegionConfiguration?.azureRegion) {\r\n                this.performanceClient?.setPreQueueTime(PerformanceEvents.AuthorityUpdateMetadataWithRegionalInformation, this.correlationId);\r\n                metadata = await this.updateMetadataWithRegionalInformation(metadata);\r\n            }\r\n\r\n            metadataEntity.updateEndpointMetadata(metadata, true);\r\n            return AuthorityMetadataSource.NETWORK;\r\n        }\r\n\r\n        let harcodedMetadata = this.getEndpointMetadataFromHardcodedValues();\r\n        if (harcodedMetadata && !this.authorityOptions.skipAuthorityMetadataCache) {\r\n            // If the user prefers to use an azure region replace the global endpoints with regional information.\r\n            if (this.authorityOptions.azureRegionConfiguration?.azureRegion) {\r\n                this.performanceClient?.setPreQueueTime(PerformanceEvents.AuthorityUpdateMetadataWithRegionalInformation, this.correlationId);\r\n                harcodedMetadata = await this.updateMetadataWithRegionalInformation(\r\n                    harcodedMetadata\r\n                );\r\n            }\r\n\r\n            metadataEntity.updateEndpointMetadata(harcodedMetadata, false);\r\n            return AuthorityMetadataSource.HARDCODED_VALUES;\r\n        } else {\r\n            throw ClientAuthError.createUnableToGetOpenidConfigError(\r\n                this.defaultOpenIdConfigurationEndpoint\r\n            );\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Compares the number of url components after the domain to determine if the cached\r\n     * authority metadata can be used for the requested authority. Protects against same domain different\r\n     * authority such as login.microsoftonline.com/tenant and login.microsoftonline.com/tfp/tenant/policy\r\n     * @param metadataEntity\r\n     */\r\n    private isAuthoritySameType(metadataEntity: AuthorityMetadataEntity): boolean {\r\n        const cachedAuthorityUrl = new UrlString(metadataEntity.canonical_authority);\r\n        const cachedParts = cachedAuthorityUrl.getUrlComponents().PathSegments;\r\n\r\n        return cachedParts.length === this.canonicalAuthorityUrlComponents.PathSegments.length;\r\n    }\r\n\r\n    /**\r\n     * Parse authorityMetadata config option\r\n     */\r\n    private getEndpointMetadataFromConfig(): OpenIdConfigResponse | null {\r\n        if (this.authorityOptions.authorityMetadata) {\r\n            try {\r\n                return JSON.parse(this.authorityOptions.authorityMetadata) as OpenIdConfigResponse;\r\n            } catch (e) {\r\n                throw ClientConfigurationError.createInvalidAuthorityMetadataError();\r\n            }\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n    /**\r\n     * Gets OAuth endpoints from the given OpenID configuration endpoint.\r\n     *\r\n     * @param hasHardcodedMetadata boolean\r\n     */\r\n    private async getEndpointMetadataFromNetwork(): Promise<OpenIdConfigResponse | null> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthorityGetEndpointMetadataFromNetwork, this.correlationId);\r\n\r\n        const options: ImdsOptions = {};\r\n\r\n        /*\r\n         * TODO: Add a timeout if the authority exists in our library's\r\n         * hardcoded list of metadata\r\n         */\r\n\r\n        try {\r\n            const response = await this.networkInterface.\r\n                sendGetRequestAsync<OpenIdConfigResponse>(this.defaultOpenIdConfigurationEndpoint, options);\r\n            return isOpenIdConfigResponse(response.body) ? response.body : null;\r\n        } catch (e) {\r\n            return null;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Get OAuth endpoints for common authorities.\r\n     */\r\n    private getEndpointMetadataFromHardcodedValues(): OpenIdConfigResponse | null {\r\n        if (this.canonicalAuthority in EndpointMetadata) {\r\n            return EndpointMetadata[this.canonicalAuthority];\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n    /**\r\n     * Update the retrieved metadata with regional information.\r\n     * User selected Azure region will be used if configured.\r\n     */\r\n    private async updateMetadataWithRegionalInformation(\r\n        metadata: OpenIdConfigResponse\r\n    ): Promise<OpenIdConfigResponse> {\r\n        this.performanceClient?.addQueueMeasurement(\r\n            PerformanceEvents.AuthorityUpdateMetadataWithRegionalInformation,\r\n            this.correlationId\r\n        );\r\n\r\n        const userConfiguredAzureRegion = this.authorityOptions.azureRegionConfiguration?.azureRegion;\r\n\r\n        if (userConfiguredAzureRegion) {\r\n            if (userConfiguredAzureRegion !== Constants.AZURE_REGION_AUTO_DISCOVER_FLAG) {\r\n                this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.CONFIGURED_NO_AUTO_DETECTION;\r\n                this.regionDiscoveryMetadata.region_used = userConfiguredAzureRegion;\r\n                return Authority.replaceWithRegionalInformation(\r\n                    metadata, \r\n                    userConfiguredAzureRegion\r\n                );\r\n            }\r\n    \r\n            this.performanceClient?.setPreQueueTime(\r\n                PerformanceEvents.RegionDiscoveryDetectRegion,\r\n                this.correlationId\r\n            );\r\n    \r\n            const autodetectedRegionName = await this.regionDiscovery.detectRegion(\r\n                this.authorityOptions.azureRegionConfiguration?.environmentRegion,\r\n                this.regionDiscoveryMetadata\r\n            );\r\n    \r\n            if (autodetectedRegionName) {\r\n                this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_SUCCESSFUL;\r\n                this.regionDiscoveryMetadata.region_used = autodetectedRegionName;\r\n                return Authority.replaceWithRegionalInformation(\r\n                    metadata, \r\n                    autodetectedRegionName\r\n                );\r\n            }\r\n    \r\n            this.regionDiscoveryMetadata.region_outcome = RegionDiscoveryOutcomes.AUTO_DETECTION_REQUESTED_FAILED;\r\n        }\r\n\r\n        return metadata;\r\n    }\r\n\r\n    /**\r\n     * Updates the AuthorityMetadataEntity with new aliases, preferred_network and preferred_cache\r\n     * and returns where the information was retrieved from\r\n     * @param metadataEntity\r\n     * @returns AuthorityMetadataSource\r\n     */\r\n    private async updateCloudDiscoveryMetadata(metadataEntity: AuthorityMetadataEntity): Promise<AuthorityMetadataSource> {\r\n\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthorityUpdateCloudDiscoveryMetadata, this.correlationId);\r\n\r\n        // attempt to read metadata from the config\r\n        this.logger.verbose(\"Attempting to get cloud discovery metadata in the config\");\r\n        this.logger.verbosePii(`Known Authorities: ${this.authorityOptions.knownAuthorities || Constants.NOT_APPLICABLE}`);\r\n        this.logger.verbosePii(`Authority Metadata: ${this.authorityOptions.authorityMetadata || Constants.NOT_APPLICABLE}`);\r\n        this.logger.verbosePii(`Canonical Authority: ${metadataEntity.canonical_authority || Constants.NOT_APPLICABLE}`);\r\n        let metadata = this.getCloudDiscoveryMetadataFromConfig();\r\n        if (metadata) {\r\n            this.logger.verbose(\"Found cloud discovery metadata in the config.\");\r\n            metadataEntity.updateCloudDiscoveryMetadata(metadata, false);\r\n            return AuthorityMetadataSource.CONFIG;\r\n        }\r\n\r\n        // If the cached metadata came from config but that config was not passed to this instance, we must go to the network\r\n        this.logger.verbose(\"Did not find cloud discovery metadata in the config... Attempting to get cloud discovery metadata from the cache.\");\r\n        const metadataEntityExpired = metadataEntity.isExpired();\r\n        if (this.isAuthoritySameType(metadataEntity) && metadataEntity.aliasesFromNetwork && !metadataEntityExpired) {\r\n            this.logger.verbose(\"Found metadata in the cache.\");\r\n            // No need to update\r\n            return AuthorityMetadataSource.CACHE;\r\n        } else if (metadataEntityExpired) {\r\n            this.logger.verbose(\"The metadata entity is expired.\");\r\n        }\r\n\r\n        this.logger.verbose(\"Did not find cloud discovery metadata in the cache... Attempting to get cloud discovery metadata from the network.\");\r\n        this.performanceClient?.setPreQueueTime(PerformanceEvents.AuthorityGetCloudDiscoveryMetadataFromNetwork, this.correlationId);\r\n        metadata = await this.getCloudDiscoveryMetadataFromNetwork();\r\n        if (metadata) {\r\n            this.logger.verbose(\"cloud discovery metadata was successfully returned from getCloudDiscoveryMetadataFromNetwork()\");\r\n            metadataEntity.updateCloudDiscoveryMetadata(metadata, true);\r\n            return AuthorityMetadataSource.NETWORK;\r\n        }\r\n\r\n        this.logger.verbose(\"Did not find cloud discovery metadata from the network... Attempting to get cloud discovery metadata from hardcoded values.\");\r\n        const harcodedMetadata = this.getCloudDiscoveryMetadataFromHarcodedValues();\r\n        if (harcodedMetadata && !this.options.skipAuthorityMetadataCache) {\r\n            this.logger.verbose(\"Found cloud discovery metadata from hardcoded values.\");\r\n            metadataEntity.updateCloudDiscoveryMetadata(harcodedMetadata, false);\r\n            return AuthorityMetadataSource.HARDCODED_VALUES;\r\n        }\r\n\r\n        // Metadata could not be obtained from the config, cache, network or hardcoded values\r\n        this.logger.error(\"Did not find cloud discovery metadata from hardcoded values... Metadata could not be obtained from config, cache, network or hardcoded values. Throwing Untrusted Authority Error.\");\r\n        throw ClientConfigurationError.createUntrustedAuthorityError();\r\n    }\r\n\r\n    /**\r\n     * Parse cloudDiscoveryMetadata config or check knownAuthorities\r\n     */\r\n    private getCloudDiscoveryMetadataFromConfig(): CloudDiscoveryMetadata | null {\r\n\r\n        // CIAM does not support cloud discovery metadata\r\n        if (this.authorityType === AuthorityType.Ciam) {\r\n            this.logger.verbose(\"CIAM authorities do not support cloud discovery metadata, generate the aliases from authority host.\");\r\n            return Authority.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort);\r\n        }\r\n\r\n        // Check if network response was provided in config\r\n        if (this.authorityOptions.cloudDiscoveryMetadata) {\r\n            this.logger.verbose(\"The cloud discovery metadata has been provided as a network response, in the config.\");\r\n            try {\r\n                this.logger.verbose(\"Attempting to parse the cloud discovery metadata.\");\r\n                const parsedResponse = JSON.parse(this.authorityOptions.cloudDiscoveryMetadata) as CloudInstanceDiscoveryResponse;\r\n                const metadata = Authority.getCloudDiscoveryMetadataFromNetworkResponse(\r\n                    parsedResponse.metadata,\r\n                    this.hostnameAndPort\r\n                );\r\n                this.logger.verbose(\"Parsed the cloud discovery metadata.\");\r\n                if (metadata) {\r\n                    this.logger.verbose(\"There is returnable metadata attached to the parsed cloud discovery metadata.\");\r\n                    return metadata;\r\n                } else {\r\n                    this.logger.verbose(\"There is no metadata attached to the parsed cloud discovery metadata.\");\r\n                }\r\n            } catch (e) {\r\n                this.logger.verbose(\"Unable to parse the cloud discovery metadata. Throwing Invalid Cloud Discovery Metadata Error.\");\r\n                throw ClientConfigurationError.createInvalidCloudDiscoveryMetadataError();\r\n            }\r\n        }\r\n\r\n        // If cloudDiscoveryMetadata is empty or does not contain the host, check knownAuthorities\r\n        if (this.isInKnownAuthorities()) {\r\n            this.logger.verbose(\"The host is included in knownAuthorities. Creating new cloud discovery metadata from the host.\");\r\n            return Authority.createCloudDiscoveryMetadataFromHost(this.hostnameAndPort);\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n    /**\r\n     * Called to get metadata from network if CloudDiscoveryMetadata was not populated by config\r\n     *\r\n     * @param hasHardcodedMetadata boolean\r\n     */\r\n    private async getCloudDiscoveryMetadataFromNetwork(): Promise<CloudDiscoveryMetadata | null> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.AuthorityGetCloudDiscoveryMetadataFromNetwork, this.correlationId);\r\n        const instanceDiscoveryEndpoint =\r\n            `${Constants.AAD_INSTANCE_DISCOVERY_ENDPT}${this.canonicalAuthority}oauth2/v2.0/authorize`;\r\n        const options: ImdsOptions = {};\r\n\r\n        /*\r\n         * TODO: Add a timeout if the authority exists in our library's\r\n         * hardcoded list of metadata\r\n         */\r\n\r\n        let match = null;\r\n        try {\r\n            const response =\r\n                await this.networkInterface.sendGetRequestAsync<CloudInstanceDiscoveryResponse | CloudInstanceDiscoveryErrorResponse>(\r\n                    instanceDiscoveryEndpoint,\r\n                    options\r\n                );\r\n\r\n            let typedResponseBody: CloudInstanceDiscoveryResponse | CloudInstanceDiscoveryErrorResponse;\r\n            let metadata: Array<CloudDiscoveryMetadata>;\r\n            if (isCloudInstanceDiscoveryResponse(response.body)) {\r\n                typedResponseBody = response.body as CloudInstanceDiscoveryResponse;\r\n                metadata = typedResponseBody.metadata;\r\n\r\n                this.logger.verbosePii(`tenant_discovery_endpoint is: ${typedResponseBody.tenant_discovery_endpoint}`);\r\n            } else if (isCloudInstanceDiscoveryErrorResponse(response.body)) {\r\n                this.logger.warning(`A CloudInstanceDiscoveryErrorResponse was returned. The cloud instance discovery network request's status code is: ${response.status}`);\r\n\r\n                typedResponseBody = response.body as CloudInstanceDiscoveryErrorResponse;\r\n                if (typedResponseBody.error === Constants.INVALID_INSTANCE) {\r\n                    this.logger.error(\"The CloudInstanceDiscoveryErrorResponse error is invalid_instance.\");\r\n                    return null;\r\n                }\r\n\r\n                this.logger.warning(`The CloudInstanceDiscoveryErrorResponse error is ${typedResponseBody.error}`);\r\n                this.logger.warning(`The CloudInstanceDiscoveryErrorResponse error description is ${typedResponseBody.error_description}`);\r\n\r\n                this.logger.warning(\"Setting the value of the CloudInstanceDiscoveryMetadata (returned from the network) to []\");\r\n                metadata = [];\r\n            } else {\r\n                this.logger.error(\"AAD did not return a CloudInstanceDiscoveryResponse or CloudInstanceDiscoveryErrorResponse\");\r\n                return null;\r\n            }\r\n\r\n            this.logger.verbose(\"Attempting to find a match between the developer's authority and the CloudInstanceDiscoveryMetadata returned from the network request.\");\r\n            match = Authority.getCloudDiscoveryMetadataFromNetworkResponse(\r\n                metadata,\r\n                this.hostnameAndPort\r\n            );\r\n        } catch (error) {\r\n            if (error instanceof AuthError) {\r\n                this.logger.error(`There was a network error while attempting to get the cloud discovery instance metadata.\\nError: ${error.errorCode}\\nError Description: ${error.errorMessage}`);\r\n            } else {\r\n                const typedError = error as Error;\r\n                this.logger.error(`A non-MSALJS error was thrown while attempting to get the cloud instance discovery metadata.\\nError: ${typedError.name}\\nError Description: ${typedError.message}`);\r\n            }\r\n\r\n            return null;\r\n        }\r\n\r\n        // Custom Domain scenario, host is trusted because Instance Discovery call succeeded\r\n        if (!match) {\r\n            this.logger.warning(\"The developer's authority was not found within the CloudInstanceDiscoveryMetadata returned from the network request.\");\r\n            this.logger.verbose(\"Creating custom Authority for custom domain scenario.\");\r\n\r\n            match = Authority.createCloudDiscoveryMetadataFromHost(\r\n                this.hostnameAndPort\r\n            );\r\n        }\r\n        return match;\r\n    }\r\n\r\n    /**\r\n     * Get cloud discovery metadata for common authorities\r\n     */\r\n    private getCloudDiscoveryMetadataFromHarcodedValues(): CloudDiscoveryMetadata | null {\r\n        if (this.canonicalAuthority in InstanceDiscoveryMetadata) {\r\n            return InstanceDiscoveryMetadata[this.canonicalAuthority];\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n    /**\r\n     * Helper function to determine if this host is included in the knownAuthorities config option\r\n     */\r\n    private isInKnownAuthorities(): boolean {\r\n        const matches = this.authorityOptions.knownAuthorities.filter((authority) => {\r\n            return UrlString.getDomainFromUrl(authority).toLowerCase() === this.hostnameAndPort;\r\n        });\r\n\r\n        return matches.length > 0;\r\n    }\r\n\r\n    /**\r\n     * helper function to populate the authority based on azureCloudOptions\r\n     * @param authorityString\r\n     * @param azureCloudOptions\r\n     */\r\n    static generateAuthority(authorityString: string, azureCloudOptions?: AzureCloudOptions): string {\r\n        let authorityAzureCloudInstance;\r\n\r\n        if (azureCloudOptions && azureCloudOptions.azureCloudInstance !== AzureCloudInstance.None) {\r\n            const tenant = azureCloudOptions.tenant ? azureCloudOptions.tenant : Constants.DEFAULT_COMMON_TENANT;\r\n            authorityAzureCloudInstance = `${azureCloudOptions.azureCloudInstance}/${tenant}/`;\r\n        }\r\n\r\n        return authorityAzureCloudInstance ? authorityAzureCloudInstance : authorityString;\r\n    }\r\n\r\n    /**\r\n     * Creates cloud discovery metadata object from a given host\r\n     * @param host\r\n     */\r\n    static createCloudDiscoveryMetadataFromHost(host: string): CloudDiscoveryMetadata {\r\n        return {\r\n            preferred_network: host,\r\n            preferred_cache: host,\r\n            aliases: [host]\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Searches instance discovery network response for the entry that contains the host in the aliases list\r\n     * @param response\r\n     * @param authority\r\n     */\r\n    static getCloudDiscoveryMetadataFromNetworkResponse(\r\n        response: CloudDiscoveryMetadata[],\r\n        authority: string\r\n    ): CloudDiscoveryMetadata | null {\r\n        for (let i = 0; i < response.length; i++) {\r\n            const metadata = response[i];\r\n            if (metadata.aliases.indexOf(authority) > -1) {\r\n                return metadata;\r\n            }\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n    /**\r\n     * helper function to generate environment from authority object\r\n     */\r\n    getPreferredCache(): string {\r\n        if(this.discoveryComplete()) {\r\n            return this.metadata.preferred_cache;\r\n        } else {\r\n            throw ClientAuthError.createEndpointDiscoveryIncompleteError(\"Discovery incomplete.\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Returns whether or not the provided host is an alias of this authority instance\r\n     * @param host\r\n     */\r\n    isAlias(host: string): boolean {\r\n        return this.metadata.aliases.indexOf(host) > -1;\r\n    }\r\n\r\n    /**\r\n     * Checks whether the provided host is that of a public cloud authority\r\n     *\r\n     * @param authority string\r\n     * @returns bool\r\n     */\r\n    static isPublicCloudAuthority(host: string): boolean {\r\n        return Constants.KNOWN_PUBLIC_CLOUDS.indexOf(host) >= 0;\r\n    }\r\n\r\n    /**\r\n     * Rebuild the authority string with the region\r\n     *\r\n     * @param host string\r\n     * @param region string\r\n     */\r\n    static buildRegionalAuthorityString(host: string, region: string, queryString?: string): string {\r\n        // Create and validate a Url string object with the initial authority string\r\n        const authorityUrlInstance = new UrlString(host);\r\n        authorityUrlInstance.validateAsUri();\r\n\r\n        const authorityUrlParts = authorityUrlInstance.getUrlComponents();\r\n\r\n        let hostNameAndPort= `${region}.${authorityUrlParts.HostNameAndPort}`;\r\n\r\n        if (this.isPublicCloudAuthority(authorityUrlParts.HostNameAndPort)) {\r\n            hostNameAndPort = `${region}.${Constants.REGIONAL_AUTH_PUBLIC_CLOUD_SUFFIX}`;\r\n        }\r\n\r\n        // Include the query string portion of the url\r\n        const url = UrlString.constructAuthorityUriFromObject({\r\n            ...authorityUrlInstance.getUrlComponents(),\r\n            HostNameAndPort: hostNameAndPort\r\n        }).urlString;\r\n\r\n        // Add the query string if a query string was provided\r\n        if (queryString) return `${url}?${queryString}`;\r\n\r\n        return url;\r\n    }\r\n\r\n    /**\r\n     * Replace the endpoints in the metadata object with their regional equivalents.\r\n     *\r\n     * @param metadata OpenIdConfigResponse\r\n     * @param azureRegion string\r\n     */\r\n    static replaceWithRegionalInformation(metadata: OpenIdConfigResponse, azureRegion: string): OpenIdConfigResponse {\r\n        metadata.authorization_endpoint = Authority.buildRegionalAuthorityString(metadata.authorization_endpoint, azureRegion);\r\n        // TODO: Enquire on whether we should leave the query string or remove it before releasing the feature\r\n        metadata.token_endpoint = Authority.buildRegionalAuthorityString(\r\n            metadata.token_endpoint, azureRegion, Constants.REGIONAL_AUTH_NON_MSI_QUERY_STRING\r\n        );\r\n\r\n        if (metadata.end_session_endpoint) {\r\n            metadata.end_session_endpoint = Authority.buildRegionalAuthorityString(metadata.end_session_endpoint, azureRegion);\r\n        }\r\n\r\n        return metadata;\r\n    }\r\n\r\n    /**\r\n     * Transform CIAM_AUTHORIY as per the below rules:\r\n     * If no path segments found and it is a CIAM authority (hostname ends with .ciamlogin.com), then transform it\r\n     *\r\n     * NOTE: The transformation path should go away once STS supports CIAM with the format: `tenantIdorDomain.ciamlogin.com`\r\n     * `ciamlogin.com` can also change in the future and we should accommodate the same\r\n     *\r\n     * @param authority\r\n     */\r\n    static transformCIAMAuthority(authority: string): string {\r\n        let ciamAuthority = authority.endsWith(Constants.FORWARD_SLASH) ? authority : `${authority}${Constants.FORWARD_SLASH}`;\r\n        const authorityUrl = new UrlString(authority);\r\n        const authorityUrlComponents = authorityUrl.getUrlComponents();\r\n\r\n        // check if transformation is needed\r\n        if (authorityUrlComponents.PathSegments.length === 0 && (authorityUrlComponents.HostNameAndPort.endsWith(Constants.CIAM_AUTH_URL))){\r\n            const tenantIdOrDomain = authorityUrlComponents.HostNameAndPort.split(\".\")[0];\r\n            ciamAuthority = `${ciamAuthority}${tenantIdOrDomain}${Constants.AAD_TENANT_DOMAIN_SUFFIX}`;\r\n        }\r\n\r\n        return ciamAuthority;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { CloudDiscoveryMetadata } from \"./CloudDiscoveryMetadata\";\r\n\r\n/**\r\n * The OpenID Configuration Endpoint Response type. Used by the authority class to get relevant OAuth endpoints.\r\n */\r\nexport type CloudInstanceDiscoveryResponse = {\r\n    tenant_discovery_endpoint: string;\r\n    metadata: Array<CloudDiscoveryMetadata>;\r\n};\r\n\r\nexport function isCloudInstanceDiscoveryResponse(response: object): boolean {\r\n    return (\r\n        response.hasOwnProperty(\"tenant_discovery_endpoint\") &&\r\n        response.hasOwnProperty(\"metadata\")\r\n    );\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n/**\r\n * The OpenID Configuration Endpoint Response type. Used by the authority class to get relevant OAuth endpoints.\r\n */\r\nexport type CloudInstanceDiscoveryErrorResponse = {\r\n    error: String;\r\n    error_description: String;\r\n    error_codes?: Array<Number>;\r\n    timestamp?: String;\r\n    trace_id?: String;\r\n    correlation_id?: String;\r\n    error_uri?: String;\r\n};\r\n\r\nexport function isCloudInstanceDiscoveryErrorResponse(response: object): boolean {\r\n    return (\r\n        response.hasOwnProperty(\"error\") &&\r\n        response.hasOwnProperty(\"error_description\")\r\n    );\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Authority } from \"./Authority\";\r\nimport { ClientConfigurationError } from \"../error/ClientConfigurationError\";\r\nimport { INetworkModule } from \"../network/INetworkModule\";\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\nimport { ICacheManager } from \"../cache/interface/ICacheManager\";\r\nimport { AuthorityOptions } from \"./AuthorityOptions\";\r\nimport { Logger } from \"../logger/Logger\";\r\nimport { IPerformanceClient } from \"../telemetry/performance/IPerformanceClient\";\r\nimport { PerformanceEvents } from \"../telemetry/performance/PerformanceEvent\";\r\n\r\nexport class AuthorityFactory {\r\n\r\n    /**\r\n     * Create an authority object of the correct type based on the url\r\n     * Performs basic authority validation - checks to see if the authority is of a valid type (i.e. aad, b2c, adfs)\r\n     *\r\n     * Also performs endpoint discovery.\r\n     *\r\n     * @param authorityUri\r\n     * @param networkClient\r\n     * @param protocolMode\r\n     */\r\n    static async createDiscoveredInstance(\r\n        authorityUri: string,\r\n        networkClient: INetworkModule,\r\n        cacheManager: ICacheManager,\r\n        authorityOptions: AuthorityOptions,\r\n        logger: Logger,\r\n        performanceClient?: IPerformanceClient,\r\n        correlationId?: string\r\n    ): Promise<Authority> {\r\n        performanceClient?.addQueueMeasurement(PerformanceEvents.AuthorityFactoryCreateDiscoveredInstance, correlationId);\r\n        \r\n        const authorityUriFinal = Authority.transformCIAMAuthority(authorityUri);\r\n\r\n        // Initialize authority and perform discovery endpoint check.\r\n        const acquireTokenAuthority: Authority = AuthorityFactory.createInstance(\r\n            authorityUriFinal,\r\n            networkClient,\r\n            cacheManager,\r\n            authorityOptions,\r\n            logger,\r\n            performanceClient,\r\n            correlationId\r\n        );\r\n\r\n        try {\r\n            performanceClient?.setPreQueueTime(PerformanceEvents.AuthorityResolveEndpointsAsync, correlationId);\r\n            await acquireTokenAuthority.resolveEndpointsAsync();\r\n            return acquireTokenAuthority;\r\n        } catch (e) {\r\n            throw ClientAuthError.createEndpointDiscoveryIncompleteError(e);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Create an authority object of the correct type based on the url\r\n     * Performs basic authority validation - checks to see if the authority is of a valid type (i.e. aad, b2c, adfs)\r\n     *\r\n     * Does not perform endpoint discovery.\r\n     *\r\n     * @param authorityUrl\r\n     * @param networkInterface\r\n     * @param protocolMode\r\n     */\r\n    static createInstance(\r\n        authorityUrl: string,\r\n        networkInterface: INetworkModule,\r\n        cacheManager: ICacheManager,\r\n        authorityOptions: AuthorityOptions,\r\n        logger: Logger,\r\n        performanceClient?: IPerformanceClient,\r\n        correlationId?: string\r\n    ): Authority {\r\n        // Throw error if authority url is empty\r\n        if (StringUtils.isEmpty(authorityUrl)) {\r\n            throw ClientConfigurationError.createUrlEmptyError();\r\n        }\r\n\r\n        return new Authority(authorityUrl, networkInterface, cacheManager, authorityOptions, logger, performanceClient, correlationId);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { SERVER_TELEM_CONSTANTS, Separators, CacheOutcome, Constants, RegionDiscoverySources, RegionDiscoveryOutcomes } from \"../../utils/Constants\";\r\nimport { CacheManager } from \"../../cache/CacheManager\";\r\nimport { AuthError } from \"../../error/AuthError\";\r\nimport { ServerTelemetryRequest } from \"./ServerTelemetryRequest\";\r\nimport { ServerTelemetryEntity } from \"../../cache/entities/ServerTelemetryEntity\";\r\nimport { StringUtils } from \"../../utils/StringUtils\";\r\nimport { RegionDiscoveryMetadata } from \"../../authority/RegionDiscoveryMetadata\";\r\n\r\nexport class ServerTelemetryManager {\r\n    private cacheManager: CacheManager;\r\n    private apiId: number;\r\n    private correlationId: string;\r\n    private telemetryCacheKey: string;\r\n    private wrapperSKU: String;\r\n    private wrapperVer: String;\r\n    private regionUsed: string | undefined;\r\n    private regionSource: RegionDiscoverySources | undefined;\r\n    private regionOutcome: RegionDiscoveryOutcomes | undefined;\r\n    private cacheOutcome: CacheOutcome = CacheOutcome.NO_CACHE_HIT;\r\n\r\n    constructor(telemetryRequest: ServerTelemetryRequest, cacheManager: CacheManager) {\r\n        this.cacheManager = cacheManager;\r\n        this.apiId = telemetryRequest.apiId;\r\n        this.correlationId = telemetryRequest.correlationId;\r\n        this.wrapperSKU = telemetryRequest.wrapperSKU || Constants.EMPTY_STRING;\r\n        this.wrapperVer = telemetryRequest.wrapperVer || Constants.EMPTY_STRING;\r\n\r\n        this.telemetryCacheKey = SERVER_TELEM_CONSTANTS.CACHE_KEY + Separators.CACHE_KEY_SEPARATOR + telemetryRequest.clientId;\r\n    }\r\n\r\n    /**\r\n     * API to add MSER Telemetry to request\r\n     */\r\n    generateCurrentRequestHeaderValue(): string {\r\n        const request = `${this.apiId}${SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR}${this.cacheOutcome}`;\r\n        const platformFields = [this.wrapperSKU, this.wrapperVer].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);\r\n        const regionDiscoveryFields = this.getRegionDiscoveryFields();\r\n        const requestWithRegionDiscoveryFields = [request, regionDiscoveryFields].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);\r\n\r\n        return [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, requestWithRegionDiscoveryFields, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR);\r\n    }\r\n\r\n    /**\r\n     * API to add MSER Telemetry for the last failed request\r\n     */\r\n    generateLastRequestHeaderValue(): string {\r\n        const lastRequests = this.getLastRequests();\r\n\r\n        const maxErrors = ServerTelemetryManager.maxErrorsToSend(lastRequests);\r\n        const failedRequests = lastRequests.failedRequests.slice(0, 2*maxErrors).join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);\r\n        const errors = lastRequests.errors.slice(0, maxErrors).join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);\r\n        const errorCount = lastRequests.errors.length;\r\n\r\n        // Indicate whether this header contains all data or partial data\r\n        const overflow = maxErrors < errorCount ? SERVER_TELEM_CONSTANTS.OVERFLOW_TRUE : SERVER_TELEM_CONSTANTS.OVERFLOW_FALSE;\r\n        const platformFields = [errorCount, overflow].join(SERVER_TELEM_CONSTANTS.VALUE_SEPARATOR);\r\n\r\n        return [SERVER_TELEM_CONSTANTS.SCHEMA_VERSION, lastRequests.cacheHits, failedRequests, errors, platformFields].join(SERVER_TELEM_CONSTANTS.CATEGORY_SEPARATOR);\r\n    }\r\n\r\n    /**\r\n     * API to cache token failures for MSER data capture\r\n     * @param error\r\n     */\r\n    cacheFailedRequest(error: AuthError): void {\r\n        const lastRequests = this.getLastRequests();\r\n        if (lastRequests.errors.length >= SERVER_TELEM_CONSTANTS.MAX_CACHED_ERRORS) {\r\n            // Remove a cached error to make room, first in first out\r\n            lastRequests.failedRequests.shift(); // apiId\r\n            lastRequests.failedRequests.shift(); // correlationId\r\n            lastRequests.errors.shift();\r\n        }\r\n        \r\n        lastRequests.failedRequests.push(this.apiId, this.correlationId);\r\n\r\n        if (!StringUtils.isEmpty(error.subError)) {\r\n            lastRequests.errors.push(error.subError);\r\n        } else if (!StringUtils.isEmpty(error.errorCode)) {\r\n            lastRequests.errors.push(error.errorCode);\r\n        } else if (!!error && error.toString()) {\r\n            lastRequests.errors.push(error.toString());\r\n        } else {\r\n            lastRequests.errors.push(SERVER_TELEM_CONSTANTS.UNKNOWN_ERROR);\r\n        }\r\n\r\n        this.cacheManager.setServerTelemetry(this.telemetryCacheKey, lastRequests);\r\n\r\n        return;\r\n    }\r\n\r\n    /**\r\n     * Update server telemetry cache entry by incrementing cache hit counter\r\n     */\r\n    incrementCacheHits(): number {\r\n        const lastRequests = this.getLastRequests();\r\n        lastRequests.cacheHits += 1;\r\n\r\n        this.cacheManager.setServerTelemetry(this.telemetryCacheKey, lastRequests);\r\n        return lastRequests.cacheHits;\r\n    }\r\n\r\n    /**\r\n     * Get the server telemetry entity from cache or initialize a new one\r\n     */\r\n    getLastRequests(): ServerTelemetryEntity {\r\n        const initialValue: ServerTelemetryEntity = new ServerTelemetryEntity();\r\n        const lastRequests = this.cacheManager.getServerTelemetry(this.telemetryCacheKey) as ServerTelemetryEntity;\r\n\r\n        return lastRequests || initialValue;\r\n    }\r\n\r\n    /**\r\n     * Remove server telemetry cache entry\r\n     */\r\n    clearTelemetryCache(): void {\r\n        const lastRequests = this.getLastRequests();\r\n        const numErrorsFlushed = ServerTelemetryManager.maxErrorsToSend(lastRequests);\r\n        const errorCount = lastRequests.errors.length;\r\n        if (numErrorsFlushed === errorCount) {\r\n            // All errors were sent on last request, clear Telemetry cache\r\n            this.cacheManager.removeItem(this.telemetryCacheKey);\r\n        } else {\r\n            // Partial data was flushed to server, construct a new telemetry cache item with errors that were not flushed\r\n            const serverTelemEntity = new ServerTelemetryEntity();\r\n            serverTelemEntity.failedRequests = lastRequests.failedRequests.slice(numErrorsFlushed*2); // failedRequests contains 2 items for each error\r\n            serverTelemEntity.errors = lastRequests.errors.slice(numErrorsFlushed);\r\n\r\n            this.cacheManager.setServerTelemetry(this.telemetryCacheKey, serverTelemEntity);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Returns the maximum number of errors that can be flushed to the server in the next network request\r\n     * @param serverTelemetryEntity\r\n     */\r\n    static maxErrorsToSend(serverTelemetryEntity: ServerTelemetryEntity): number {\r\n        let i;\r\n        let maxErrors = 0;\r\n        let dataSize = 0;\r\n        const errorCount = serverTelemetryEntity.errors.length;\r\n        for (i = 0; i < errorCount; i++) {\r\n            // failedRequests parameter contains pairs of apiId and correlationId, multiply index by 2 to preserve pairs\r\n            const apiId = serverTelemetryEntity.failedRequests[2*i] || Constants.EMPTY_STRING;\r\n            const correlationId = serverTelemetryEntity.failedRequests[2*i + 1] || Constants.EMPTY_STRING;\r\n            const errorCode = serverTelemetryEntity.errors[i] || Constants.EMPTY_STRING;\r\n\r\n            // Count number of characters that would be added to header, each character is 1 byte. Add 3 at the end to account for separators\r\n            dataSize += apiId.toString().length + correlationId.toString().length + errorCode.length + 3;\r\n\r\n            if (dataSize < SERVER_TELEM_CONSTANTS.MAX_LAST_HEADER_BYTES) {\r\n                // Adding this entry to the header would still keep header size below the limit\r\n                maxErrors += 1;\r\n            } else {\r\n                break;\r\n            }\r\n        }\r\n\r\n        return maxErrors;\r\n    }\r\n\r\n    /**\r\n     * Get the region discovery fields\r\n     * \r\n     * @returns string\r\n     */\r\n    getRegionDiscoveryFields(): string {\r\n        const regionDiscoveryFields: string[] = [];\r\n\r\n        regionDiscoveryFields.push(this.regionUsed || Constants.EMPTY_STRING);\r\n        regionDiscoveryFields.push(this.regionSource || Constants.EMPTY_STRING);\r\n        regionDiscoveryFields.push(this.regionOutcome || Constants.EMPTY_STRING);\r\n\r\n        return regionDiscoveryFields.join(\",\");\r\n    }\r\n\r\n    /**\r\n     * Update the region discovery metadata\r\n     * \r\n     * @param regionDiscoveryMetadata\r\n     * @returns void\r\n     */\r\n    updateRegionDiscoveryMetadata(regionDiscoveryMetadata: RegionDiscoveryMetadata): void {\r\n        this.regionUsed = regionDiscoveryMetadata.region_used;\r\n        this.regionSource = regionDiscoveryMetadata.region_source;\r\n        this.regionOutcome = regionDiscoveryMetadata.region_outcome;\r\n    }\r\n\r\n    /**\r\n     * Set cache outcome \r\n     */\r\n    setCacheOutcome(cacheOutcome: CacheOutcome): void {\r\n        this.cacheOutcome = cacheOutcome;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Constants, INetworkModule, NetworkRequestOptions, NetworkResponse } from \"@azure/msal-common\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { HTTP_REQUEST_TYPE } from \"../utils/BrowserConstants\";\r\n\r\n/**\r\n * This class implements the Fetch API for GET and POST requests. See more here: https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\r\n */\r\nexport class FetchClient implements INetworkModule {\r\n\r\n    /**\r\n     * Fetch Client for REST endpoints - Get request\r\n     * @param url \r\n     * @param headers \r\n     * @param body \r\n     */\r\n    async sendGetRequestAsync<T>(url: string, options?: NetworkRequestOptions): Promise<NetworkResponse<T>> {\r\n        let response;\r\n        try {\r\n            response = await fetch(url, {\r\n                method: HTTP_REQUEST_TYPE.GET,\r\n                headers: this.getFetchHeaders(options)\r\n            });\r\n        } catch (e) {\r\n            if (window.navigator.onLine) {\r\n                throw BrowserAuthError.createGetRequestFailedError(e, url);\r\n            } else {\r\n                throw BrowserAuthError.createNoNetworkConnectivityError();\r\n            }\r\n        }\r\n\r\n        try {\r\n            return {\r\n                headers: this.getHeaderDict(response.headers),\r\n                body: await response.json() as T,\r\n                status: response.status\r\n            };\r\n        } catch (e) {\r\n            throw BrowserAuthError.createFailedToParseNetworkResponseError(url);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Fetch Client for REST endpoints - Post request\r\n     * @param url \r\n     * @param headers \r\n     * @param body \r\n     */\r\n    async sendPostRequestAsync<T>(url: string, options?: NetworkRequestOptions): Promise<NetworkResponse<T>> {\r\n        const reqBody = (options && options.body) || Constants.EMPTY_STRING;\r\n\r\n        let response;\r\n        try {\r\n            response = await fetch(url, {\r\n                method: HTTP_REQUEST_TYPE.POST,\r\n                headers: this.getFetchHeaders(options),\r\n                body: reqBody\r\n            });\r\n        } catch (e) {\r\n            if (window.navigator.onLine) {\r\n                throw BrowserAuthError.createPostRequestFailedError(e, url);\r\n            } else {\r\n                throw BrowserAuthError.createNoNetworkConnectivityError();\r\n            }\r\n        }\r\n\r\n        try {\r\n            return {\r\n                headers: this.getHeaderDict(response.headers),\r\n                body: await response.json() as T,\r\n                status: response.status\r\n            };\r\n        } catch (e) {\r\n            throw BrowserAuthError.createFailedToParseNetworkResponseError(url);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Get Fetch API Headers object from string map\r\n     * @param inputHeaders \r\n     */\r\n    private getFetchHeaders(options?: NetworkRequestOptions): Headers {\r\n        const headers = new Headers();\r\n        if (!(options && options.headers)) {\r\n            return headers;\r\n        }\r\n        const optionsHeaders = options.headers;\r\n        Object.keys(optionsHeaders).forEach((key) => {\r\n            headers.append(key, optionsHeaders[key]);\r\n        });\r\n        return headers;\r\n    }\r\n\r\n    private getHeaderDict(headers: Headers): Record<string, string> {\r\n        const headerDict: Record<string, string> = {};\r\n        headers.forEach((value: string, key: string) => {\r\n            headerDict[key] = value;\r\n        });\r\n        return headerDict;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { INetworkModule, NetworkRequestOptions, NetworkResponse } from \"@azure/msal-common\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { HTTP_REQUEST_TYPE } from \"../utils/BrowserConstants\";\r\n\r\n/**\r\n * This client implements the XMLHttpRequest class to send GET and POST requests.\r\n */\r\nexport class XhrClient implements INetworkModule {\r\n\r\n    /**\r\n     * XhrClient for REST endpoints - Get request\r\n     * @param url \r\n     * @param headers \r\n     * @param body \r\n     */\r\n    async sendGetRequestAsync<T>(url: string, options?: NetworkRequestOptions): Promise<NetworkResponse<T>> {\r\n        return this.sendRequestAsync(url, HTTP_REQUEST_TYPE.GET, options);\r\n    }\r\n\r\n    /**\r\n     * XhrClient for REST endpoints - Post request\r\n     * @param url \r\n     * @param headers \r\n     * @param body \r\n     */\r\n    async sendPostRequestAsync<T>(url: string, options?: NetworkRequestOptions): Promise<NetworkResponse<T>> {\r\n        return this.sendRequestAsync(url, HTTP_REQUEST_TYPE.POST, options);\r\n    }\r\n\r\n    /**\r\n     * Helper for XhrClient requests.\r\n     * @param url \r\n     * @param method \r\n     * @param options \r\n     */\r\n    private sendRequestAsync<T>(url: string, method: HTTP_REQUEST_TYPE, options?: NetworkRequestOptions): Promise<NetworkResponse<T>> {\r\n        return new Promise<NetworkResponse<T>>((resolve, reject) => {\r\n            const xhr = new XMLHttpRequest();\r\n            xhr.open(method, url, /* async: */ true);\r\n            this.setXhrHeaders(xhr, options);\r\n            xhr.onload = (): void => {\r\n                if (xhr.status < 200 || xhr.status >= 300) {\r\n                    if (method === HTTP_REQUEST_TYPE.POST) {\r\n                        reject(BrowserAuthError.createPostRequestFailedError(`Failed with status ${xhr.status}`, url));\r\n                    } else {\r\n                        reject(BrowserAuthError.createGetRequestFailedError(`Failed with status ${xhr.status}`, url));\r\n                    }\r\n                }\r\n                try {\r\n                    const jsonResponse = JSON.parse(xhr.responseText) as T;\r\n                    const networkResponse: NetworkResponse<T> = {\r\n                        headers: this.getHeaderDict(xhr),\r\n                        body: jsonResponse,\r\n                        status: xhr.status\r\n                    };\r\n                    resolve(networkResponse);\r\n                } catch (e) {\r\n                    reject(BrowserAuthError.createFailedToParseNetworkResponseError(url));\r\n                }\r\n            };\r\n\r\n            xhr.onerror = (): void => {\r\n                if (window.navigator.onLine) {\r\n                    if (method === HTTP_REQUEST_TYPE.POST) {\r\n                        reject(BrowserAuthError.createPostRequestFailedError(`Failed with status ${xhr.status}`, url));\r\n                    } else {\r\n                        reject(BrowserAuthError.createGetRequestFailedError(`Failed with status ${xhr.status}`, url));\r\n                    }\r\n                } else {\r\n                    reject(BrowserAuthError.createNoNetworkConnectivityError());\r\n                }\r\n            };\r\n\r\n            if (method === HTTP_REQUEST_TYPE.POST && options && options.body) {\r\n                xhr.send(options.body);\r\n            } else if (method === HTTP_REQUEST_TYPE.GET) {\r\n                xhr.send();\r\n            } else {\r\n                throw BrowserAuthError.createHttpMethodNotImplementedError(method);\r\n            }\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Helper to set XHR headers for request.\r\n     * @param xhr \r\n     * @param options \r\n     */\r\n    private setXhrHeaders(xhr: XMLHttpRequest, options?: NetworkRequestOptions): void {\r\n        if (options && options.headers) {\r\n            const headers = options.headers;\r\n            Object.keys(headers).forEach((key: string) => {\r\n                xhr.setRequestHeader(key, headers[key]);\r\n            });\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Gets a string map of the headers received in the response.\r\n     * \r\n     * Algorithm comes from https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders\r\n     * @param xhr \r\n     */\r\n    private getHeaderDict(xhr: XMLHttpRequest): Record<string, string> {\r\n        const headerString = xhr.getAllResponseHeaders();\r\n        const headerArr = headerString.trim().split(/[\\r\\n]+/);\r\n        const headerDict: Record<string, string> = {};\r\n        headerArr.forEach((value: string) => {\r\n            const parts = value.split(\": \");\r\n            const headerName = parts.shift();\r\n            const headerVal = parts.join(\": \");\r\n            if (headerName && headerVal) {\r\n                headerDict[headerName] = headerVal;\r\n            }\r\n        });\r\n\r\n        return headerDict;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Constants, INetworkModule, UrlString } from \"@azure/msal-common\";\r\nimport { FetchClient } from \"../network/FetchClient\";\r\nimport { XhrClient } from \"../network/XhrClient\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { InteractionType, BrowserConstants } from \"./BrowserConstants\";\r\n\r\n/**\r\n * Utility class for browser specific functions\r\n */\r\nexport class BrowserUtils {\r\n\r\n    // #region Window Navigation and URL management\r\n\r\n    /**\r\n     * Clears hash from window url.\r\n     */\r\n    static clearHash(contentWindow: Window): void {\r\n        // Office.js sets history.replaceState to null\r\n        contentWindow.location.hash = Constants.EMPTY_STRING;\r\n        if (typeof contentWindow.history.replaceState === \"function\") {\r\n            // Full removes \"#\" from url\r\n            contentWindow.history.replaceState(null, Constants.EMPTY_STRING, `${contentWindow.location.origin}${contentWindow.location.pathname}${contentWindow.location.search}`);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Replaces current hash with hash from provided url\r\n     */\r\n    static replaceHash(url: string): void {\r\n        const urlParts = url.split(\"#\");\r\n        urlParts.shift(); // Remove part before the hash\r\n        window.location.hash = urlParts.length > 0 ? urlParts.join(\"#\") : Constants.EMPTY_STRING;\r\n    }\r\n\r\n    /**\r\n     * Returns boolean of whether the current window is in an iframe or not.\r\n     */\r\n    static isInIframe(): boolean {\r\n        return window.parent !== window;\r\n    }\r\n\r\n    /**\r\n     * Returns boolean of whether or not the current window is a popup opened by msal\r\n     */\r\n    static isInPopup(): boolean {\r\n        return typeof window !== \"undefined\" && !!window.opener && \r\n            window.opener !== window && \r\n            typeof window.name === \"string\" && \r\n            window.name.indexOf(`${BrowserConstants.POPUP_NAME_PREFIX}.`) === 0;\r\n    }\r\n\r\n    // #endregion\r\n\r\n    /**\r\n     * Returns current window URL as redirect uri\r\n     */\r\n    static getCurrentUri(): string {\r\n        return window.location.href.split(\"?\")[0].split(\"#\")[0];\r\n    }\r\n\r\n    /**\r\n     * Gets the homepage url for the current window location.\r\n     */\r\n    static getHomepage(): string {\r\n        const currentUrl = new UrlString(window.location.href);\r\n        const urlComponents = currentUrl.getUrlComponents();\r\n        return `${urlComponents.Protocol}//${urlComponents.HostNameAndPort}/`;\r\n    }\r\n\r\n    /**\r\n     * Returns best compatible network client object. \r\n     */\r\n    static getBrowserNetworkClient(): INetworkModule {\r\n        if (window.fetch && window.Headers) {\r\n            return new FetchClient();\r\n        } else {\r\n            return new XhrClient();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Throws error if we have completed an auth and are \r\n     * attempting another auth request inside an iframe.\r\n     */\r\n    static blockReloadInHiddenIframes(): void {\r\n        const isResponseHash = UrlString.hashContainsKnownProperties(window.location.hash);\r\n        // return an error if called from the hidden iframe created by the msal js silent calls\r\n        if (isResponseHash && BrowserUtils.isInIframe()) {\r\n            throw BrowserAuthError.createBlockReloadInHiddenIframeError();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Block redirect operations in iframes unless explicitly allowed\r\n     * @param interactionType Interaction type for the request\r\n     * @param allowRedirectInIframe Config value to allow redirects when app is inside an iframe\r\n     */\r\n    static blockRedirectInIframe(interactionType: InteractionType, allowRedirectInIframe: boolean): void {\r\n        const isIframedApp = BrowserUtils.isInIframe();\r\n        if (interactionType === InteractionType.Redirect && isIframedApp && !allowRedirectInIframe) {\r\n            // If we are not in top frame, we shouldn't redirect. This is also handled by the service.\r\n            throw BrowserAuthError.createRedirectInIframeError(isIframedApp);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Block redirectUri loaded in popup from calling AcquireToken APIs\r\n     */\r\n    static blockAcquireTokenInPopups(): void {\r\n        // Popups opened by msal popup APIs are given a name that starts with \"msal.\"\r\n        if (BrowserUtils.isInPopup()) {\r\n            throw BrowserAuthError.createBlockAcquireTokenInPopupsError();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Throws error if token requests are made in non-browser environment\r\n     * @param isBrowserEnvironment Flag indicating if environment is a browser.\r\n     */\r\n    static blockNonBrowserEnvironment(isBrowserEnvironment: boolean): void {\r\n        if (!isBrowserEnvironment) {\r\n            throw BrowserAuthError.createNonBrowserEnvironmentError();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Throws error if native brokering is enabled but initialize hasn't been called\r\n     * @param allowNativeBroker \r\n     * @param initialized \r\n     */\r\n    static blockNativeBrokerCalledBeforeInitialized(allowNativeBroker: boolean, initialized: boolean): void {\r\n        if (allowNativeBroker && !initialized) {\r\n            throw BrowserAuthError.createNativeBrokerCalledBeforeInitialize();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Returns boolean of whether current browser is an Internet Explorer or Edge browser.\r\n     */\r\n    static detectIEOrEdge(): boolean {\r\n        const ua = window.navigator.userAgent;\r\n        const msie = ua.indexOf(\"MSIE \");\r\n        const msie11 = ua.indexOf(\"Trident/\");\r\n        const msedge = ua.indexOf(\"Edge/\");\r\n        const isIE = msie > 0 || msie11 > 0;\r\n        const isEdge = msedge > 0;\r\n        return isIE || isEdge;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ICrypto, INetworkModule, Logger, AuthenticationResult, AccountInfo, AccountEntity, BaseAuthRequest, AuthenticationScheme, UrlString, ServerTelemetryManager, ServerTelemetryRequest, ClientConfigurationError, StringUtils, Authority, AuthorityOptions, AuthorityFactory, IPerformanceClient, PerformanceEvents } from \"@azure/msal-common\";\r\nimport { BrowserConfiguration } from \"../config/Configuration\";\r\nimport { BrowserCacheManager } from \"../cache/BrowserCacheManager\";\r\nimport { EventHandler } from \"../event/EventHandler\";\r\nimport { EndSessionRequest } from \"../request/EndSessionRequest\";\r\nimport { RedirectRequest } from \"../request/RedirectRequest\";\r\nimport { PopupRequest } from \"../request/PopupRequest\";\r\nimport { SsoSilentRequest } from \"../request/SsoSilentRequest\";\r\nimport { version } from \"../packageMetadata\";\r\nimport { BrowserConstants } from \"../utils/BrowserConstants\";\r\nimport { BrowserUtils } from \"../utils/BrowserUtils\";\r\nimport { INavigationClient } from \"../navigation/INavigationClient\";\r\nimport { NativeMessageHandler } from \"../broker/nativeBroker/NativeMessageHandler\";\r\n\r\nexport abstract class BaseInteractionClient {\r\n\r\n    protected config: BrowserConfiguration;\r\n    protected browserStorage: BrowserCacheManager;\r\n    protected browserCrypto: ICrypto;\r\n    protected networkClient: INetworkModule;\r\n    protected logger: Logger;\r\n    protected eventHandler: EventHandler;\r\n    protected navigationClient: INavigationClient;\r\n    protected nativeMessageHandler: NativeMessageHandler | undefined;\r\n    protected correlationId: string;\r\n    protected performanceClient: IPerformanceClient;\r\n\r\n    constructor(config: BrowserConfiguration, storageImpl: BrowserCacheManager, browserCrypto: ICrypto, logger: Logger, eventHandler: EventHandler, navigationClient: INavigationClient, performanceClient: IPerformanceClient, nativeMessageHandler?: NativeMessageHandler, correlationId?: string) {\r\n        this.config = config;\r\n        this.browserStorage = storageImpl;\r\n        this.browserCrypto = browserCrypto;\r\n        this.networkClient = this.config.system.networkClient;\r\n        this.eventHandler = eventHandler;\r\n        this.navigationClient = navigationClient;\r\n        this.nativeMessageHandler = nativeMessageHandler;\r\n        this.correlationId = correlationId || this.browserCrypto.createNewGuid();\r\n        this.logger = logger.clone(BrowserConstants.MSAL_SKU, version, this.correlationId);\r\n        this.performanceClient = performanceClient;\r\n    }\r\n\r\n    abstract acquireToken(request: RedirectRequest|PopupRequest|SsoSilentRequest): Promise<AuthenticationResult|void>;\r\n\r\n    abstract logout(request: EndSessionRequest): Promise<void>;\r\n\r\n    protected async clearCacheOnLogout(account?: AccountInfo| null): Promise<void> {\r\n        if (account) {\r\n            if (AccountEntity.accountInfoIsEqual(account, this.browserStorage.getActiveAccount(), false)) {\r\n                this.logger.verbose(\"Setting active account to null\");\r\n                this.browserStorage.setActiveAccount(null);\r\n            }\r\n            // Clear given account.\r\n            try {\r\n                await this.browserStorage.removeAccount(AccountEntity.generateAccountCacheKey(account));\r\n                this.logger.verbose(\"Cleared cache items belonging to the account provided in the logout request.\");\r\n            } catch (error) {\r\n                this.logger.error(\"Account provided in logout request was not found. Local cache unchanged.\");\r\n            }\r\n        } else {\r\n            try {\r\n                this.logger.verbose(\"No account provided in logout request, clearing all cache items.\", this.correlationId);\r\n                // Clear all accounts and tokens\r\n                await this.browserStorage.clear();\r\n                // Clear any stray keys from IndexedDB\r\n                await this.browserCrypto.clearKeystore();\r\n            } catch(e) {\r\n                this.logger.error(\"Attempted to clear all MSAL cache items and failed. Local cache unchanged.\");\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Initializer function for all request APIs\r\n     * @param request\r\n     */\r\n    protected async initializeBaseRequest(request: Partial<BaseAuthRequest>, account?: AccountInfo): Promise<BaseAuthRequest> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.InitializeBaseRequest, request.correlationId);\r\n        this.logger.verbose(\"Initializing BaseAuthRequest\");\r\n        const authority = request.authority || this.config.auth.authority;\r\n\r\n        if (account) {\r\n            await this.validateRequestAuthority(authority, account);\r\n        }\r\n\r\n        const scopes = [...((request && request.scopes) || [])];\r\n\r\n        const validatedRequest: BaseAuthRequest = {\r\n            ...request,\r\n            correlationId: this.correlationId,\r\n            authority,\r\n            scopes\r\n        };\r\n\r\n        // Set authenticationScheme to BEARER if not explicitly set in the request\r\n        if (!validatedRequest.authenticationScheme) {\r\n            validatedRequest.authenticationScheme = AuthenticationScheme.BEARER;\r\n            this.logger.verbose(\"Authentication Scheme wasn't explicitly set in request, defaulting to \\\"Bearer\\\" request\");\r\n        } else {\r\n            if (validatedRequest.authenticationScheme === AuthenticationScheme.SSH) {\r\n                if (!request.sshJwk) {\r\n                    throw ClientConfigurationError.createMissingSshJwkError();\r\n                }\r\n                if(!request.sshKid) {\r\n                    throw ClientConfigurationError.createMissingSshKidError();\r\n                }\r\n            }\r\n            this.logger.verbose(`Authentication Scheme set to \"${validatedRequest.authenticationScheme}\" as configured in Auth request`);\r\n        }\r\n\r\n        // Set requested claims hash if claims were requested and claims-based caching is enabled\r\n        if (this.config.cache.claimsBasedCachingEnabled && request.claims && !StringUtils.isEmptyObj(request.claims)) {\r\n            validatedRequest.requestedClaimsHash = await this.browserCrypto.hashString(request.claims);\r\n        }\r\n\r\n        return validatedRequest;\r\n    }\r\n\r\n    /**\r\n     *\r\n     * Use to get the redirect uri configured in MSAL or null.\r\n     * @param requestRedirectUri\r\n     * @returns Redirect URL\r\n     *\r\n     */\r\n    getRedirectUri(requestRedirectUri?: string): string {\r\n        this.logger.verbose(\"getRedirectUri called\");\r\n        const redirectUri = requestRedirectUri || this.config.auth.redirectUri || BrowserUtils.getCurrentUri();\r\n        return UrlString.getAbsoluteUrl(redirectUri, BrowserUtils.getCurrentUri());\r\n    }\r\n\r\n    /*\r\n     * If authority provided in the request does not match environment/authority specified \r\n     * in the account or MSAL config, we throw an error.\r\n     */\r\n    async validateRequestAuthority(authority: string, account: AccountInfo): Promise<void> {\r\n        const discoveredAuthority = await this.getDiscoveredAuthority(authority);\r\n        \r\n        if(!discoveredAuthority.isAlias(account.environment)) {\r\n            throw ClientConfigurationError.createAuthorityMismatchError();\r\n        }\r\n    }\r\n\r\n    /**\r\n     *\r\n     * @param apiId\r\n     * @param correlationId\r\n     * @param forceRefresh\r\n     */\r\n    protected initializeServerTelemetryManager(apiId: number, forceRefresh?: boolean): ServerTelemetryManager {\r\n        this.logger.verbose(\"initializeServerTelemetryManager called\");\r\n        const telemetryPayload: ServerTelemetryRequest = {\r\n            clientId: this.config.auth.clientId,\r\n            correlationId: this.correlationId,\r\n            apiId: apiId,\r\n            forceRefresh: forceRefresh || false,\r\n            wrapperSKU: this.browserStorage.getWrapperMetadata()[0],\r\n            wrapperVer: this.browserStorage.getWrapperMetadata()[1]\r\n        };\r\n\r\n        return new ServerTelemetryManager(telemetryPayload, this.browserStorage);\r\n    }\r\n\r\n    /**\r\n     * Used to get a discovered version of the default authority.\r\n     * @param requestAuthority\r\n     * @param requestCorrelationId\r\n     */\r\n    protected async getDiscoveredAuthority(requestAuthority?: string): Promise<Authority> {\r\n        this.logger.verbose(\"getDiscoveredAuthority called\");\r\n        const authorityOptions: AuthorityOptions = {\r\n            protocolMode: this.config.auth.protocolMode,\r\n            knownAuthorities: this.config.auth.knownAuthorities,\r\n            cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,\r\n            authorityMetadata: this.config.auth.authorityMetadata\r\n        };\r\n\r\n        if (requestAuthority) {\r\n            this.logger.verbose(\"Creating discovered authority with request authority\");\r\n            return await AuthorityFactory.createDiscoveredInstance(requestAuthority, this.config.system.networkClient, this.browserStorage, authorityOptions, this.logger);\r\n        }\r\n\r\n        this.logger.verbose(\"Creating discovered authority with configured authority\");\r\n        return await AuthorityFactory.createDiscoveredInstance(this.config.auth.authority, this.config.system.networkClient, this.browserStorage, authorityOptions, this.logger);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ServerTelemetryManager, CommonAuthorizationCodeRequest, Constants, AuthorizationCodeClient, ClientConfiguration, AuthorityOptions, Authority, AuthorityFactory, ServerAuthorizationCodeResponse, UrlString, CommonEndSessionRequest, ProtocolUtils, ResponseMode, StringUtils, IdTokenClaims, AccountInfo, AzureCloudOptions, PerformanceEvents, AuthError} from \"@azure/msal-common\";\r\nimport { BaseInteractionClient } from \"./BaseInteractionClient\";\r\nimport { AuthorizationUrlRequest } from \"../request/AuthorizationUrlRequest\";\r\nimport { BrowserConstants, InteractionType } from \"../utils/BrowserConstants\";\r\nimport { version } from \"../packageMetadata\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { BrowserProtocolUtils, BrowserStateObject } from \"../utils/BrowserProtocolUtils\";\r\nimport { EndSessionRequest } from \"../request/EndSessionRequest\";\r\nimport { BrowserUtils } from \"../utils/BrowserUtils\";\r\nimport { RedirectRequest } from \"../request/RedirectRequest\";\r\nimport { PopupRequest } from \"../request/PopupRequest\";\r\nimport { SsoSilentRequest } from \"../request/SsoSilentRequest\";\r\n\r\n/**\r\n * Defines the class structure and helper functions used by the \"standard\", non-brokered auth flows (popup, redirect, silent (RT), silent (iframe))\r\n */\r\nexport abstract class StandardInteractionClient extends BaseInteractionClient {\r\n    /**\r\n     * Generates an auth code request tied to the url request.\r\n     * @param request\r\n     */\r\n    protected async initializeAuthorizationCodeRequest(request: AuthorizationUrlRequest): Promise<CommonAuthorizationCodeRequest> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientInitializeAuthorizationCodeRequest, request.correlationId);\r\n        this.logger.verbose(\"initializeAuthorizationRequest called\", request.correlationId);\r\n        const generatedPkceParams = await this.browserCrypto.generatePkceCodes();\r\n\r\n        const authCodeRequest: CommonAuthorizationCodeRequest = {\r\n            ...request,\r\n            redirectUri: request.redirectUri,\r\n            code: Constants.EMPTY_STRING,\r\n            codeVerifier: generatedPkceParams.verifier\r\n        };\r\n\r\n        request.codeChallenge = generatedPkceParams.challenge;\r\n        request.codeChallengeMethod = Constants.S256_CODE_CHALLENGE_METHOD;\r\n\r\n        return authCodeRequest;\r\n    }\r\n\r\n    /**\r\n     * Initializer for the logout request.\r\n     * @param logoutRequest\r\n     */\r\n    protected initializeLogoutRequest(logoutRequest?: EndSessionRequest): CommonEndSessionRequest {\r\n        this.logger.verbose(\"initializeLogoutRequest called\", logoutRequest?.correlationId);\r\n\r\n        const validLogoutRequest: CommonEndSessionRequest = {\r\n            correlationId: this.correlationId || this.browserCrypto.createNewGuid(),\r\n            ...logoutRequest\r\n        };\r\n\r\n        /**\r\n         * Set logout_hint to be login_hint from ID Token Claims if present\r\n         * and logoutHint attribute wasn't manually set in logout request\r\n         */\r\n        if (logoutRequest) {\r\n            // If logoutHint isn't set and an account was passed in, try to extract logoutHint from ID Token Claims\r\n            if (!logoutRequest.logoutHint) {\r\n                if(logoutRequest.account) {\r\n                    const logoutHint = this.getLogoutHintFromIdTokenClaims(logoutRequest.account);\r\n                    if (logoutHint) {\r\n                        this.logger.verbose(\"Setting logoutHint to login_hint ID Token Claim value for the account provided\");\r\n                        validLogoutRequest.logoutHint = logoutHint;\r\n                    }\r\n                } else {\r\n                    this.logger.verbose(\"logoutHint was not set and account was not passed into logout request, logoutHint will not be set\");\r\n                }\r\n            } else {\r\n                this.logger.verbose(\"logoutHint has already been set in logoutRequest\");\r\n            }\r\n        } else {\r\n            this.logger.verbose(\"logoutHint will not be set since no logout request was configured\");\r\n        }\r\n\r\n        /*\r\n         * Only set redirect uri if logout request isn't provided or the set uri isn't null.\r\n         * Otherwise, use passed uri, config, or current page.\r\n         */\r\n        if (!logoutRequest || logoutRequest.postLogoutRedirectUri !== null) {\r\n            if (logoutRequest && logoutRequest.postLogoutRedirectUri) {\r\n                this.logger.verbose(\"Setting postLogoutRedirectUri to uri set on logout request\", validLogoutRequest.correlationId);\r\n                validLogoutRequest.postLogoutRedirectUri = UrlString.getAbsoluteUrl(logoutRequest.postLogoutRedirectUri, BrowserUtils.getCurrentUri());\r\n            } else if (this.config.auth.postLogoutRedirectUri === null) {\r\n                this.logger.verbose(\"postLogoutRedirectUri configured as null and no uri set on request, not passing post logout redirect\", validLogoutRequest.correlationId);\r\n            } else if (this.config.auth.postLogoutRedirectUri) {\r\n                this.logger.verbose(\"Setting postLogoutRedirectUri to configured uri\", validLogoutRequest.correlationId);\r\n                validLogoutRequest.postLogoutRedirectUri = UrlString.getAbsoluteUrl(this.config.auth.postLogoutRedirectUri, BrowserUtils.getCurrentUri());\r\n            } else {\r\n                this.logger.verbose(\"Setting postLogoutRedirectUri to current page\", validLogoutRequest.correlationId);\r\n                validLogoutRequest.postLogoutRedirectUri = UrlString.getAbsoluteUrl(BrowserUtils.getCurrentUri(), BrowserUtils.getCurrentUri());\r\n            }\r\n        } else {\r\n            this.logger.verbose(\"postLogoutRedirectUri passed as null, not setting post logout redirect uri\", validLogoutRequest.correlationId);\r\n        }\r\n\r\n        return validLogoutRequest;\r\n    }\r\n\r\n    /**\r\n     * Parses login_hint ID Token Claim out of AccountInfo object to be used as\r\n     * logout_hint in end session request.\r\n     * @param account\r\n     */\r\n    protected getLogoutHintFromIdTokenClaims(account: AccountInfo): string | null {\r\n        const idTokenClaims: IdTokenClaims | undefined = account.idTokenClaims;\r\n        if (idTokenClaims) {\r\n            if (idTokenClaims.login_hint) {\r\n                return idTokenClaims.login_hint;\r\n            } else {\r\n                this.logger.verbose(\"The ID Token Claims tied to the provided account do not contain a login_hint claim, logoutHint will not be added to logout request\");\r\n            }\r\n        } else {\r\n            this.logger.verbose(\"The provided account does not contain ID Token Claims, logoutHint will not be added to logout request\");\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n    /**\r\n     * Creates an Authorization Code Client with the given authority, or the default authority.\r\n     * @param serverTelemetryManager\r\n     * @param authorityUrl\r\n     */\r\n    protected async createAuthCodeClient(serverTelemetryManager: ServerTelemetryManager, authorityUrl?: string, requestAzureCloudOptions?: AzureCloudOptions): Promise<AuthorizationCodeClient> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, this.correlationId);\r\n        // Create auth module.\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientGetClientConfiguration, this.correlationId);\r\n        const clientConfig = await this.getClientConfiguration(serverTelemetryManager, authorityUrl, requestAzureCloudOptions);\r\n        return new AuthorizationCodeClient(clientConfig, this.performanceClient);\r\n    }\r\n\r\n    /**\r\n     * Creates a Client Configuration object with the given request authority, or the default authority.\r\n     * @param serverTelemetryManager\r\n     * @param requestAuthority\r\n     * @param requestCorrelationId\r\n     */\r\n    protected async getClientConfiguration(serverTelemetryManager: ServerTelemetryManager, requestAuthority?: string, requestAzureCloudOptions?: AzureCloudOptions): Promise<ClientConfiguration> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientGetClientConfiguration, this.correlationId);\r\n        this.logger.verbose(\"getClientConfiguration called\", this.correlationId);\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority, this.correlationId);\r\n        const discoveredAuthority = await this.getDiscoveredAuthority(requestAuthority, requestAzureCloudOptions);\r\n        const logger= this.config.system.loggerOptions;\r\n\r\n        return {\r\n            authOptions: {\r\n                clientId: this.config.auth.clientId,\r\n                authority: discoveredAuthority,\r\n                clientCapabilities: this.config.auth.clientCapabilities\r\n            },\r\n            systemOptions: {\r\n                tokenRenewalOffsetSeconds: this.config.system.tokenRenewalOffsetSeconds,\r\n                preventCorsPreflight: true\r\n            },\r\n            loggerOptions: {\r\n                loggerCallback: logger.loggerCallback,\r\n                piiLoggingEnabled: logger.piiLoggingEnabled,\r\n                logLevel: logger.logLevel,\r\n                correlationId: this.correlationId\r\n            },\r\n            cacheOptions: {\r\n                claimsBasedCachingEnabled: this.config.cache.claimsBasedCachingEnabled\r\n            },\r\n            cryptoInterface: this.browserCrypto,\r\n            networkInterface: this.networkClient,\r\n            storageInterface: this.browserStorage,\r\n            serverTelemetryManager: serverTelemetryManager,\r\n            libraryInfo: {\r\n                sku: BrowserConstants.MSAL_SKU,\r\n                version: version,\r\n                cpu: Constants.EMPTY_STRING,\r\n                os: Constants.EMPTY_STRING\r\n            },\r\n            telemetry: this.config.telemetry\r\n        };\r\n    }\r\n    \r\n    /**\r\n     * @param hash\r\n     * @param interactionType\r\n     */\r\n    protected validateAndExtractStateFromHash(serverParams: ServerAuthorizationCodeResponse, interactionType: InteractionType, requestCorrelationId?: string): string {\r\n        this.logger.verbose(\"validateAndExtractStateFromHash called\", requestCorrelationId);\r\n        if (!serverParams.state) {\r\n            throw BrowserAuthError.createHashDoesNotContainStateError();\r\n        }\r\n\r\n        const platformStateObj = BrowserProtocolUtils.extractBrowserRequestState(this.browserCrypto, serverParams.state);\r\n        if (!platformStateObj) {\r\n            throw BrowserAuthError.createUnableToParseStateError();\r\n        }\r\n\r\n        if (platformStateObj.interactionType !== interactionType) {\r\n            throw BrowserAuthError.createStateInteractionTypeMismatchError();\r\n        }\r\n\r\n        this.logger.verbose(\"Returning state from hash\", requestCorrelationId);\r\n        return serverParams.state;\r\n    }\r\n\r\n    /**\r\n     * Used to get a discovered version of the default authority.\r\n     * @param requestAuthority\r\n     * @param requestCorrelationId\r\n     */\r\n    protected async getDiscoveredAuthority(requestAuthority?: string, requestAzureCloudOptions?: AzureCloudOptions): Promise<Authority> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority, this.correlationId);\r\n        this.logger.verbose(\"getDiscoveredAuthority called\", this.correlationId);\r\n        const getAuthorityMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.StandardInteractionClientGetDiscoveredAuthority, this.correlationId);\r\n        const authorityOptions: AuthorityOptions = {\r\n            protocolMode: this.config.auth.protocolMode,\r\n            knownAuthorities: this.config.auth.knownAuthorities,\r\n            cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,\r\n            authorityMetadata: this.config.auth.authorityMetadata,\r\n            skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache\r\n        };\r\n\r\n        // build authority string based on auth params, precedence - azureCloudInstance + tenant >> authority\r\n        const userAuthority = requestAuthority ? requestAuthority : this.config.auth.authority;\r\n\r\n        // fall back to the authority from config\r\n        const builtAuthority = Authority.generateAuthority(userAuthority, requestAzureCloudOptions || this.config.auth.azureCloudOptions);\r\n        this.logger.verbose(\"Creating discovered authority with configured authority\", this.correlationId);\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.AuthorityFactoryCreateDiscoveredInstance, this.correlationId);\r\n        return await AuthorityFactory.createDiscoveredInstance(builtAuthority, this.config.system.networkClient, this.browserStorage, authorityOptions, this.logger, this.performanceClient, this.correlationId)\r\n            .then((result: Authority) => {\r\n                getAuthorityMeasurement.endMeasurement({\r\n                    success: true,\r\n                });\r\n\r\n                return result;\r\n            })\r\n            .catch((error:AuthError) => {\r\n                getAuthorityMeasurement.endMeasurement({\r\n                    errorCode: error.errorCode,\r\n                    subErrorCode: error.subError,\r\n                    success: false\r\n                });\r\n\r\n                throw error;\r\n            });\r\n    }\r\n\r\n    /**\r\n     * Helper to initialize required request parameters for interactive APIs and ssoSilent()\r\n     * @param request\r\n     * @param interactionType\r\n     */\r\n    protected async initializeAuthorizationRequest(request: RedirectRequest|PopupRequest|SsoSilentRequest, interactionType: InteractionType): Promise<AuthorizationUrlRequest> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, this.correlationId);\r\n        this.logger.verbose(\"initializeAuthorizationRequest called\", this.correlationId);\r\n        const redirectUri = this.getRedirectUri(request.redirectUri);\r\n        const browserState: BrowserStateObject = {\r\n            interactionType: interactionType\r\n        };\r\n        const state = ProtocolUtils.setRequestState(\r\n            this.browserCrypto,\r\n            (request && request.state)|| Constants.EMPTY_STRING,\r\n            browserState\r\n        );\r\n\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.InitializeBaseRequest, this.correlationId);\r\n        const validatedRequest: AuthorizationUrlRequest = {\r\n            ...await this.initializeBaseRequest(request),\r\n            redirectUri: redirectUri,\r\n            state: state,\r\n            nonce: request.nonce || this.browserCrypto.createNewGuid(),\r\n            responseMode: ResponseMode.FRAGMENT\r\n        };\r\n\r\n        const account = request.account || this.browserStorage.getActiveAccount();\r\n        if (account) {\r\n            this.logger.verbose(\"Setting validated request account\", this.correlationId);\r\n            this.logger.verbosePii(`Setting validated request account: ${account.homeAccountId}`, this.correlationId);\r\n            validatedRequest.account = account;\r\n        }\r\n\r\n        // Check for ADAL/MSAL v1 SSO\r\n        if (StringUtils.isEmpty(validatedRequest.loginHint) && !account) {\r\n            const legacyLoginHint = this.browserStorage.getLegacyLoginHint();\r\n            if (legacyLoginHint) {\r\n                validatedRequest.loginHint = legacyLoginHint;\r\n            }\r\n        }\r\n\r\n        return validatedRequest;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthorizationCodePayload, StringUtils, CommonAuthorizationCodeRequest, AuthenticationResult, AuthorizationCodeClient, AuthorityFactory, Authority, INetworkModule, ClientAuthError, CcsCredential, Logger, ServerError, IPerformanceClient, PerformanceEvents } from \"@azure/msal-common\";\r\n\r\nimport { BrowserCacheManager } from \"../cache/BrowserCacheManager\";\r\nimport { BrowserAuthError, BrowserAuthErrorMessage } from \"../error/BrowserAuthError\";\r\nimport { TemporaryCacheKeys } from \"../utils/BrowserConstants\";\r\n\r\nexport type InteractionParams = {};\r\n\r\n/**\r\n * Abstract class which defines operations for a browser interaction handling class.\r\n */\r\nexport class InteractionHandler {\r\n\r\n    protected authModule: AuthorizationCodeClient;\r\n    protected browserStorage: BrowserCacheManager;\r\n    protected authCodeRequest: CommonAuthorizationCodeRequest;\r\n    protected logger: Logger;\r\n    protected performanceClient: IPerformanceClient;\r\n\r\n    constructor(authCodeModule: AuthorizationCodeClient, storageImpl: BrowserCacheManager, authCodeRequest: CommonAuthorizationCodeRequest, logger: Logger, performanceClient: IPerformanceClient) {\r\n        this.authModule = authCodeModule;\r\n        this.browserStorage = storageImpl;\r\n        this.authCodeRequest = authCodeRequest;\r\n        this.logger = logger;\r\n        this.performanceClient = performanceClient;\r\n    }\r\n\r\n    /**\r\n     * Function to handle response parameters from hash.\r\n     * @param locationHash\r\n     */\r\n    async handleCodeResponseFromHash(locationHash: string, state: string, authority: Authority, networkModule: INetworkModule): Promise<AuthenticationResult> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.HandleCodeResponseFromHash, this.authCodeRequest.correlationId);\r\n        this.logger.verbose(\"InteractionHandler.handleCodeResponse called\");\r\n        // Check that location hash isn't empty.\r\n        if (StringUtils.isEmpty(locationHash)) {\r\n            throw BrowserAuthError.createEmptyHashError(locationHash);\r\n        }\r\n\r\n        // Handle code response.\r\n        const stateKey = this.browserStorage.generateStateKey(state);\r\n        const requestState = this.browserStorage.getTemporaryCache(stateKey);\r\n        if (!requestState) {\r\n            throw ClientAuthError.createStateNotFoundError(\"Cached State\");\r\n        }\r\n\r\n        let authCodeResponse;\r\n        try {\r\n            authCodeResponse = this.authModule.handleFragmentResponse(locationHash, requestState);\r\n        } catch (e) {\r\n            if (e instanceof ServerError && e.subError === BrowserAuthErrorMessage.userCancelledError.code) {\r\n                // Translate server error caused by user closing native prompt to corresponding first class MSAL error\r\n                throw BrowserAuthError.createUserCancelledError();\r\n            } else {\r\n                throw e;\r\n            }\r\n        }\r\n\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.HandleCodeResponseFromServer, this.authCodeRequest.correlationId);\r\n        return this.handleCodeResponseFromServer(authCodeResponse, state, authority, networkModule);\r\n    }\r\n\r\n    /**\r\n     * Process auth code response from AAD\r\n     * @param authCodeResponse \r\n     * @param state \r\n     * @param authority \r\n     * @param networkModule \r\n     * @returns \r\n     */\r\n    async handleCodeResponseFromServer(authCodeResponse: AuthorizationCodePayload, state: string, authority: Authority, networkModule: INetworkModule, validateNonce: boolean = true): Promise<AuthenticationResult> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.HandleCodeResponseFromServer, this.authCodeRequest.correlationId);\r\n        this.logger.trace(\"InteractionHandler.handleCodeResponseFromServer called\");\r\n\r\n        // Handle code response.\r\n        const stateKey = this.browserStorage.generateStateKey(state);\r\n        const requestState = this.browserStorage.getTemporaryCache(stateKey);\r\n        if (!requestState) {\r\n            throw ClientAuthError.createStateNotFoundError(\"Cached State\");\r\n        }\r\n\r\n        // Get cached items\r\n        const nonceKey = this.browserStorage.generateNonceKey(requestState);\r\n        const cachedNonce = this.browserStorage.getTemporaryCache(nonceKey);\r\n\r\n        // Assign code to request\r\n        this.authCodeRequest.code = authCodeResponse.code;\r\n\r\n        // Check for new cloud instance\r\n        if (authCodeResponse.cloud_instance_host_name) {\r\n            this.performanceClient.setPreQueueTime(PerformanceEvents.UpdateTokenEndpointAuthority, this.authCodeRequest.correlationId);\r\n            await this.updateTokenEndpointAuthority(authCodeResponse.cloud_instance_host_name, authority, networkModule);\r\n        }\r\n\r\n        // Nonce validation not needed when redirect not involved (e.g. hybrid spa, renewing token via rt)\r\n        if (validateNonce) {\r\n            authCodeResponse.nonce = cachedNonce || undefined;\r\n        }\r\n\r\n        authCodeResponse.state = requestState;\r\n\r\n        // Add CCS parameters if available\r\n        if (authCodeResponse.client_info) {\r\n            this.authCodeRequest.clientInfo = authCodeResponse.client_info;\r\n        } else {\r\n            const cachedCcsCred = this.checkCcsCredentials();\r\n            if (cachedCcsCred) {\r\n                this.authCodeRequest.ccsCredential = cachedCcsCred;\r\n            }\r\n        }\r\n\r\n        // Acquire token with retrieved code.\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.AuthClientAcquireToken, this.authCodeRequest.correlationId);\r\n        const tokenResponse = await this.authModule.acquireToken(this.authCodeRequest, authCodeResponse);\r\n        this.browserStorage.cleanRequestByState(state);\r\n        return tokenResponse;\r\n    }\r\n\r\n    /**\r\n     * Updates authority based on cloudInstanceHostname\r\n     * @param cloudInstanceHostname \r\n     * @param authority \r\n     * @param networkModule \r\n     */\r\n    protected async updateTokenEndpointAuthority(cloudInstanceHostname: string, authority: Authority, networkModule: INetworkModule): Promise<void> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.UpdateTokenEndpointAuthority, this.authCodeRequest.correlationId);\r\n        const cloudInstanceAuthorityUri = `https://${cloudInstanceHostname}/${authority.tenant}/`;\r\n        const cloudInstanceAuthority = await AuthorityFactory.createDiscoveredInstance(cloudInstanceAuthorityUri, networkModule, this.browserStorage, authority.options, this.logger, this.performanceClient, this.authCodeRequest.correlationId);\r\n        this.authModule.updateAuthority(cloudInstanceAuthority);\r\n    }\r\n\r\n    /**\r\n     * Looks up ccs creds in the cache\r\n     */\r\n    protected checkCcsCredentials(): CcsCredential | null {\r\n        // Look up ccs credential in temp cache\r\n        const cachedCcsCred = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.CCS_CREDENTIAL, true);\r\n        if (cachedCcsCred) {\r\n            try {\r\n                return JSON.parse(cachedCcsCred) as CcsCredential;\r\n            } catch (e) {\r\n                this.authModule.logger.error(\"Cache credential could not be parsed\");\r\n                this.authModule.logger.errorPii(`Cache credential could not be parsed: ${cachedCcsCred}`);\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthorizationCodeClient, StringUtils, CommonAuthorizationCodeRequest, ICrypto, AuthenticationResult, Authority, INetworkModule, ClientAuthError, Logger, ServerError, IPerformanceClient } from \"@azure/msal-common\";\r\nimport { BrowserAuthError, BrowserAuthErrorMessage } from \"../error/BrowserAuthError\";\r\nimport { ApiId, TemporaryCacheKeys } from \"../utils/BrowserConstants\";\r\nimport { BrowserCacheManager } from \"../cache/BrowserCacheManager\";\r\nimport { InteractionHandler, InteractionParams } from \"./InteractionHandler\";\r\nimport { INavigationClient } from \"../navigation/INavigationClient\";\r\nimport { NavigationOptions } from \"../navigation/NavigationOptions\";\r\n\r\nexport type RedirectParams = InteractionParams & {\r\n    navigationClient: INavigationClient;\r\n    redirectTimeout: number;\r\n    redirectStartPage: string;\r\n    onRedirectNavigate?: (url: string) => void | boolean;\r\n};\r\n\r\nexport class RedirectHandler extends InteractionHandler {\r\n\r\n    private browserCrypto: ICrypto;\r\n\r\n    constructor(authCodeModule: AuthorizationCodeClient, storageImpl: BrowserCacheManager, authCodeRequest: CommonAuthorizationCodeRequest, logger: Logger, browserCrypto: ICrypto, performanceClient: IPerformanceClient) {\r\n        super(authCodeModule, storageImpl, authCodeRequest, logger, performanceClient);\r\n        this.browserCrypto = browserCrypto;\r\n    }\r\n\r\n    /**\r\n     * Redirects window to given URL.\r\n     * @param urlNavigate\r\n     */\r\n    async initiateAuthRequest(requestUrl: string, params: RedirectParams): Promise<void> {\r\n        this.logger.verbose(\"RedirectHandler.initiateAuthRequest called\");\r\n        // Navigate if valid URL\r\n        if (!StringUtils.isEmpty(requestUrl)) {\r\n            // Cache start page, returns to this page after redirectUri if navigateToLoginRequestUrl is true\r\n            if (params.redirectStartPage) {\r\n                this.logger.verbose(\"RedirectHandler.initiateAuthRequest: redirectStartPage set, caching start page\");\r\n                this.browserStorage.setTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, params.redirectStartPage, true);\r\n            }\r\n\r\n            // Set interaction status in the library.\r\n            this.browserStorage.setTemporaryCache(TemporaryCacheKeys.CORRELATION_ID, this.authCodeRequest.correlationId, true);\r\n            this.browserStorage.cacheCodeRequest(this.authCodeRequest, this.browserCrypto);\r\n            this.logger.infoPii(`RedirectHandler.initiateAuthRequest: Navigate to: ${requestUrl}`);\r\n            const navigationOptions: NavigationOptions = {\r\n                apiId: ApiId.acquireTokenRedirect,\r\n                timeout: params.redirectTimeout,\r\n                noHistory: false\r\n            };\r\n            \r\n            // If onRedirectNavigate is implemented, invoke it and provide requestUrl\r\n            if (typeof params.onRedirectNavigate === \"function\") {\r\n                this.logger.verbose(\"RedirectHandler.initiateAuthRequest: Invoking onRedirectNavigate callback\");\r\n                const navigate = params.onRedirectNavigate(requestUrl);\r\n\r\n                // Returning false from onRedirectNavigate will stop navigation\r\n                if (navigate !== false) {\r\n                    this.logger.verbose(\"RedirectHandler.initiateAuthRequest: onRedirectNavigate did not return false, navigating\");\r\n                    await params.navigationClient.navigateExternal(requestUrl, navigationOptions);\r\n                    return;\r\n                } else {\r\n                    this.logger.verbose(\"RedirectHandler.initiateAuthRequest: onRedirectNavigate returned false, stopping navigation\");\r\n                    return;\r\n                }\r\n            } else {\r\n                // Navigate window to request URL\r\n                this.logger.verbose(\"RedirectHandler.initiateAuthRequest: Navigating window to navigate url\");\r\n                await params.navigationClient.navigateExternal(requestUrl, navigationOptions);\r\n                return;\r\n            }\r\n        } else {\r\n            // Throw error if request URL is empty.\r\n            this.logger.info(\"RedirectHandler.initiateAuthRequest: Navigate url is empty\");\r\n            throw BrowserAuthError.createEmptyNavigationUriError();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Handle authorization code response in the window.\r\n     * @param hash\r\n     */\r\n    async handleCodeResponseFromHash(locationHash: string, state: string, authority: Authority, networkModule: INetworkModule): Promise<AuthenticationResult> {\r\n        this.logger.verbose(\"RedirectHandler.handleCodeResponse called\");\r\n\r\n        // Check that location hash isn't empty.\r\n        if (StringUtils.isEmpty(locationHash)) {\r\n            throw BrowserAuthError.createEmptyHashError(locationHash);\r\n        }\r\n\r\n        // Interaction is completed - remove interaction status.\r\n        this.browserStorage.setInteractionInProgress(false);\r\n\r\n        // Handle code response.\r\n        const stateKey = this.browserStorage.generateStateKey(state);\r\n        const requestState = this.browserStorage.getTemporaryCache(stateKey);\r\n        if (!requestState) {\r\n            throw ClientAuthError.createStateNotFoundError(\"Cached State\");\r\n        }\r\n\r\n        let authCodeResponse;\r\n        try {\r\n            authCodeResponse = this.authModule.handleFragmentResponse(locationHash, requestState);\r\n        } catch (e) {\r\n            if (e instanceof ServerError && e.subError === BrowserAuthErrorMessage.userCancelledError.code) {\r\n                // Translate server error caused by user closing native prompt to corresponding first class MSAL error\r\n                throw BrowserAuthError.createUserCancelledError();\r\n            } else {\r\n                throw e;\r\n            }\r\n        }\r\n\r\n        // Get cached items\r\n        const nonceKey = this.browserStorage.generateNonceKey(requestState);\r\n        const cachedNonce = this.browserStorage.getTemporaryCache(nonceKey);\r\n\r\n        // Assign code to request\r\n        this.authCodeRequest.code = authCodeResponse.code;\r\n\r\n        // Check for new cloud instance\r\n        if (authCodeResponse.cloud_instance_host_name) {\r\n            await this.updateTokenEndpointAuthority(authCodeResponse.cloud_instance_host_name, authority, networkModule);\r\n        }\r\n\r\n        authCodeResponse.nonce = cachedNonce || undefined;\r\n        authCodeResponse.state = requestState;\r\n\r\n        // Add CCS parameters if available\r\n        if (authCodeResponse.client_info) {\r\n            this.authCodeRequest.clientInfo = authCodeResponse.client_info;\r\n        } else {\r\n            const cachedCcsCred = this.checkCcsCredentials();\r\n            if (cachedCcsCred) {\r\n                this.authCodeRequest.ccsCredential = cachedCcsCred;\r\n            }\r\n        }\r\n\r\n        // Acquire token with retrieved code.\r\n        const tokenResponse = await this.authModule.acquireToken(this.authCodeRequest, authCodeResponse);\r\n\r\n        this.browserStorage.cleanRequestByState(state);\r\n        return tokenResponse;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Logger } from \"@azure/msal-common\";\r\nimport { CachedKeyPair } from \"../crypto/CryptoOps\";\r\nimport { AsyncMemoryStorage } from \"./AsyncMemoryStorage\";\r\n\r\nexport enum CryptoKeyStoreNames {\r\n    asymmetricKeys = \"asymmetricKeys\",\r\n    symmetricKeys = \"symmetricKeys\"\r\n}\r\n/**\r\n * MSAL CryptoKeyStore DB Version 2\r\n */\r\nexport class CryptoKeyStore {\r\n    public asymmetricKeys: AsyncMemoryStorage<CachedKeyPair>;\r\n    public symmetricKeys: AsyncMemoryStorage<CryptoKey>;\r\n    public logger: Logger;\r\n\r\n    constructor(logger: Logger){\r\n        this.logger = logger;\r\n        this.asymmetricKeys = new AsyncMemoryStorage<CachedKeyPair>(this.logger, CryptoKeyStoreNames.asymmetricKeys);\r\n        this.symmetricKeys = new AsyncMemoryStorage<CryptoKey>(this.logger, CryptoKeyStoreNames.symmetricKeys);\r\n    }\r\n\r\n    async clear(): Promise<boolean> {\r\n        // Delete in-memory keystores\r\n        this.asymmetricKeys.clearInMemory();\r\n\t    this.symmetricKeys.clearInMemory();\r\n\t\t\r\n        /**\r\n         * There is only one database, so calling clearPersistent on asymmetric keystore takes care of\r\n         * every persistent keystore\r\n         */\r\n        try {\r\n            await this.asymmetricKeys.clearPersistent();\r\n            return true;\r\n        } catch (e) {\r\n            if (e instanceof Error) {\r\n                this.logger.error(`Clearing keystore failed with error: ${e.message}`);\r\n            } else {\r\n                this.logger.error(\"Clearing keystore failed with unknown error\");\r\n            }\r\n            \r\n            return false;\r\n        }\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ClientConfiguration } from \"../config/ClientConfiguration\";\r\nimport { BaseClient } from \"./BaseClient\";\r\nimport { CommonRefreshTokenRequest } from \"../request/CommonRefreshTokenRequest\";\r\nimport { Authority } from \"../authority/Authority\";\r\nimport { ServerAuthorizationTokenResponse } from \"../response/ServerAuthorizationTokenResponse\";\r\nimport { RequestParameterBuilder } from \"../request/RequestParameterBuilder\";\r\nimport { GrantType, AuthenticationScheme, Errors, HeaderNames } from \"../utils/Constants\";\r\nimport { ResponseHandler } from \"../response/ResponseHandler\";\r\nimport { AuthenticationResult } from \"../response/AuthenticationResult\";\r\nimport { PopTokenGenerator } from \"../crypto/PopTokenGenerator\";\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\nimport { RequestThumbprint } from \"../network/RequestThumbprint\";\r\nimport { NetworkResponse } from \"../network/NetworkManager\";\r\nimport { CommonSilentFlowRequest } from \"../request/CommonSilentFlowRequest\";\r\nimport { ClientConfigurationError } from \"../error/ClientConfigurationError\";\r\nimport { ClientAuthError } from \"../error/ClientAuthError\";\r\nimport { ServerError } from \"../error/ServerError\";\r\nimport { TimeUtils } from \"../utils/TimeUtils\";\r\nimport { UrlString } from \"../url/UrlString\";\r\nimport { CcsCredentialType } from \"../account/CcsCredential\";\r\nimport { buildClientInfoFromHomeAccountId } from \"../account/ClientInfo\";\r\nimport { InteractionRequiredAuthError, InteractionRequiredAuthErrorMessage } from \"../error/InteractionRequiredAuthError\";\r\nimport { PerformanceEvents } from \"../telemetry/performance/PerformanceEvent\";\r\nimport { IPerformanceClient } from \"../telemetry/performance/IPerformanceClient\";\r\n/**\r\n * OAuth2.0 refresh token client\r\n */\r\nexport class RefreshTokenClient extends BaseClient {\r\n    constructor(configuration: ClientConfiguration, performanceClient?: IPerformanceClient) {\r\n        super(configuration, performanceClient);\r\n\r\n    }\r\n    public async acquireToken(request: CommonRefreshTokenRequest): Promise<AuthenticationResult> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientAcquireToken, request.correlationId);\r\n\r\n        const atsMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.RefreshTokenClientAcquireToken, request.correlationId);\r\n        this.logger.verbose(\"RefreshTokenClientAcquireToken called\", request.correlationId);\r\n        const reqTimestamp = TimeUtils.nowSeconds();\r\n        this.performanceClient?.setPreQueueTime(PerformanceEvents.RefreshTokenClientExecuteTokenRequest, request.correlationId);\r\n        const response = await this.executeTokenRequest(request, this.authority);\r\n        const httpVerToken = response.headers?.[HeaderNames.X_MS_HTTP_VERSION];\r\n        atsMeasurement?.addStaticFields({\r\n            refreshTokenSize: response.body.refresh_token?.length || 0,\r\n        });\r\n        if(httpVerToken)\r\n        {\r\n            atsMeasurement?.addStaticFields({\r\n                httpVerToken,\r\n            });\r\n        }\r\n\r\n        // Retrieve requestId from response headers\r\n        const requestId = response.headers?.[HeaderNames.X_MS_REQUEST_ID];\r\n        const responseHandler = new ResponseHandler(\r\n            this.config.authOptions.clientId,\r\n            this.cacheManager,\r\n            this.cryptoUtils,\r\n            this.logger,\r\n            this.config.serializableCache,\r\n            this.config.persistencePlugin\r\n        );\r\n        responseHandler.validateTokenResponse(response.body);\r\n\r\n        this.performanceClient?.setPreQueueTime(PerformanceEvents.HandleServerTokenResponse, request.correlationId);\r\n        return responseHandler.handleServerTokenResponse(\r\n            response.body,\r\n            this.authority,\r\n            reqTimestamp,\r\n            request,\r\n            undefined,\r\n            undefined,\r\n            true,\r\n            request.forceCache,\r\n            requestId\r\n        ).then((result: AuthenticationResult) => {\r\n            atsMeasurement?.endMeasurement({\r\n                success: true\r\n            });\r\n            return result;\r\n        })\r\n            .catch((error) => {\r\n                this.logger.verbose(\"Error in fetching refresh token\", request.correlationId);\r\n                atsMeasurement?.endMeasurement({\r\n                    errorCode: error.errorCode,\r\n                    subErrorCode: error.subError,\r\n                    success: false\r\n                });\r\n                throw error;\r\n            });\r\n    }\r\n\r\n    /**\r\n     * Gets cached refresh token and attaches to request, then calls acquireToken API\r\n     * @param request\r\n     */\r\n    public async acquireTokenByRefreshToken(request: CommonSilentFlowRequest): Promise<AuthenticationResult> {\r\n        // Cannot renew token if no request object is given.\r\n        if (!request) {\r\n            throw ClientConfigurationError.createEmptyTokenRequestError();\r\n        }\r\n\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientAcquireTokenByRefreshToken, request.correlationId);\r\n\r\n        // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases\r\n        if (!request.account) {\r\n            throw ClientAuthError.createNoAccountInSilentRequestError();\r\n        }\r\n\r\n        // try checking if FOCI is enabled for the given application\r\n        const isFOCI = this.cacheManager.isAppMetadataFOCI(request.account.environment);\r\n\r\n        // if the app is part of the family, retrive a Family refresh token if present and make a refreshTokenRequest\r\n        if (isFOCI) {\r\n            try {\r\n                this.performanceClient?.setPreQueueTime(PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, request.correlationId);\r\n                return this.acquireTokenWithCachedRefreshToken(request, true);\r\n            } catch (e) {\r\n                const noFamilyRTInCache = e instanceof InteractionRequiredAuthError && e.errorCode === InteractionRequiredAuthErrorMessage.noTokensFoundError.code;\r\n                const clientMismatchErrorWithFamilyRT = e instanceof ServerError && e.errorCode === Errors.INVALID_GRANT_ERROR && e.subError === Errors.CLIENT_MISMATCH_ERROR;\r\n\r\n                // if family Refresh Token (FRT) cache acquisition fails or if client_mismatch error is seen with FRT, reattempt with application Refresh Token (ART)\r\n                if (noFamilyRTInCache || clientMismatchErrorWithFamilyRT) {\r\n                    this.performanceClient?.setPreQueueTime(PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, request.correlationId);\r\n                    return this.acquireTokenWithCachedRefreshToken(request, false);\r\n                    // throw in all other cases\r\n                } else {\r\n                    throw e;\r\n                }\r\n            }\r\n        }\r\n        // fall back to application refresh token acquisition\r\n        this.performanceClient?.setPreQueueTime(PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, request.correlationId);\r\n        return this.acquireTokenWithCachedRefreshToken(request, false);\r\n\r\n    }\r\n\r\n    /**\r\n     * makes a network call to acquire tokens by exchanging RefreshToken available in userCache; throws if refresh token is not cached\r\n     * @param request\r\n     */\r\n    private async acquireTokenWithCachedRefreshToken(request: CommonSilentFlowRequest, foci: boolean) {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, request.correlationId);\r\n\r\n        // fetches family RT or application RT based on FOCI value\r\n\r\n        const atsMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.RefreshTokenClientAcquireTokenWithCachedRefreshToken, request.correlationId);\r\n        this.logger.verbose(\"RefreshTokenClientAcquireTokenWithCachedRefreshToken called\", request.correlationId);\r\n        const refreshToken = this.cacheManager.getRefreshToken(request.account, foci);\r\n\r\n        if (!refreshToken) {\r\n            atsMeasurement?.discardMeasurement();\r\n            throw InteractionRequiredAuthError.createNoTokensFoundError();\r\n        }\r\n        // attach cached RT size to the current measurement\r\n        atsMeasurement?.endMeasurement({\r\n            success: true\r\n        });\r\n\r\n        const refreshTokenRequest: CommonRefreshTokenRequest = {\r\n            ...request,\r\n            refreshToken: refreshToken.secret,\r\n            authenticationScheme: request.authenticationScheme || AuthenticationScheme.BEARER,\r\n            ccsCredential: {\r\n                credential: request.account.homeAccountId,\r\n                type: CcsCredentialType.HOME_ACCOUNT_ID\r\n            }\r\n        };\r\n\r\n        this.performanceClient?.setPreQueueTime(PerformanceEvents.RefreshTokenClientAcquireToken, request.correlationId);\r\n        return this.acquireToken(refreshTokenRequest);\r\n    }\r\n\r\n    /**\r\n     * Constructs the network message and makes a NW call to the underlying secure token service\r\n     * @param request\r\n     * @param authority\r\n     */\r\n    private async executeTokenRequest(request: CommonRefreshTokenRequest, authority: Authority)\r\n        : Promise<NetworkResponse<ServerAuthorizationTokenResponse>> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientExecuteTokenRequest, request.correlationId);\r\n        const acquireTokenMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.RefreshTokenClientExecuteTokenRequest, request.correlationId);\r\n        this.performanceClient?.setPreQueueTime(PerformanceEvents.RefreshTokenClientCreateTokenRequestBody, request.correlationId);\r\n        \r\n        const queryParametersString = this.createTokenQueryParameters(request);\r\n        const endpoint = UrlString.appendQueryString(authority.tokenEndpoint, queryParametersString);\r\n        \r\n        const requestBody = await this.createTokenRequestBody(request);\r\n        const headers: Record<string, string> = this.createTokenRequestHeaders(request.ccsCredential);\r\n        const thumbprint: RequestThumbprint = {\r\n            clientId: this.config.authOptions.clientId,\r\n            authority: authority.canonicalAuthority,\r\n            scopes: request.scopes,\r\n            claims: request.claims,\r\n            authenticationScheme: request.authenticationScheme,\r\n            resourceRequestMethod: request.resourceRequestMethod,\r\n            resourceRequestUri: request.resourceRequestUri,\r\n            shrClaims: request.shrClaims,\r\n            sshKid: request.sshKid\r\n        };\r\n\r\n        return this.executePostToTokenEndpoint(endpoint, requestBody, headers, thumbprint)\r\n            .then((result) => {\r\n                acquireTokenMeasurement?.endMeasurement({\r\n                    success: true\r\n                });\r\n                return result;\r\n            })\r\n            .catch((error) => {\r\n                acquireTokenMeasurement?.endMeasurement({\r\n                    success: false\r\n                });\r\n                throw error;\r\n            });\r\n    }\r\n\r\n    /**\r\n     * Helper function to create the token request body\r\n     * @param request\r\n     */\r\n    private async createTokenRequestBody(request: CommonRefreshTokenRequest): Promise<string> {\r\n        this.performanceClient?.addQueueMeasurement(PerformanceEvents.RefreshTokenClientCreateTokenRequestBody, request.correlationId);\r\n\r\n        const correlationId = request.correlationId;\r\n        const acquireTokenMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.BaseClientCreateTokenRequestHeaders, correlationId);\r\n        const parameterBuilder = new RequestParameterBuilder();\r\n\r\n        parameterBuilder.addClientId(this.config.authOptions.clientId);\r\n\r\n        parameterBuilder.addScopes(request.scopes);\r\n\r\n        parameterBuilder.addGrantType(GrantType.REFRESH_TOKEN_GRANT);\r\n\r\n        parameterBuilder.addClientInfo();\r\n\r\n        parameterBuilder.addLibraryInfo(this.config.libraryInfo);\r\n        parameterBuilder.addApplicationTelemetry(this.config.telemetry.application);\r\n        parameterBuilder.addThrottling();\r\n\r\n        if (this.serverTelemetryManager) {\r\n            parameterBuilder.addServerTelemetry(this.serverTelemetryManager);\r\n        }\r\n\r\n        parameterBuilder.addCorrelationId(correlationId);\r\n\r\n        parameterBuilder.addRefreshToken(request.refreshToken);\r\n\r\n        if (this.config.clientCredentials.clientSecret) {\r\n            parameterBuilder.addClientSecret(this.config.clientCredentials.clientSecret);\r\n        }\r\n\r\n        if (this.config.clientCredentials.clientAssertion) {\r\n            const clientAssertion = this.config.clientCredentials.clientAssertion;\r\n            parameterBuilder.addClientAssertion(clientAssertion.assertion);\r\n            parameterBuilder.addClientAssertionType(clientAssertion.assertionType);\r\n        }\r\n\r\n        if (request.authenticationScheme === AuthenticationScheme.POP) {\r\n            const popTokenGenerator = new PopTokenGenerator(this.cryptoUtils, this.performanceClient);\r\n            this.performanceClient?.setPreQueueTime(PerformanceEvents.PopTokenGenerateCnf, request.correlationId);\r\n            const reqCnfData = await popTokenGenerator.generateCnf(request);\r\n            // SPA PoP requires full Base64Url encoded req_cnf string (unhashed)\r\n            parameterBuilder.addPopToken(reqCnfData.reqCnfString);\r\n        } else if (request.authenticationScheme === AuthenticationScheme.SSH) {\r\n            if (request.sshJwk) {\r\n                parameterBuilder.addSshJwk(request.sshJwk);\r\n            } else {\r\n                acquireTokenMeasurement?.endMeasurement({\r\n                    success: false\r\n                });\r\n                throw ClientConfigurationError.createMissingSshJwkError();\r\n            }\r\n        }\r\n\r\n        if (!StringUtils.isEmptyObj(request.claims) || this.config.authOptions.clientCapabilities && this.config.authOptions.clientCapabilities.length > 0) {\r\n            parameterBuilder.addClaims(request.claims, this.config.authOptions.clientCapabilities);\r\n        }\r\n\r\n        if (this.config.systemOptions.preventCorsPreflight && request.ccsCredential) {\r\n            switch (request.ccsCredential.type) {\r\n                case CcsCredentialType.HOME_ACCOUNT_ID:\r\n                    try {\r\n                        const clientInfo = buildClientInfoFromHomeAccountId(request.ccsCredential.credential);\r\n                        parameterBuilder.addCcsOid(clientInfo);\r\n                    } catch (e) {\r\n                        this.logger.verbose(\"Could not parse home account ID for CCS Header: \" + e);\r\n                    }\r\n                    break;\r\n                case CcsCredentialType.UPN:\r\n                    parameterBuilder.addCcsUpn(request.ccsCredential.credential);\r\n                    break;\r\n            }\r\n        }\r\n        acquireTokenMeasurement?.endMeasurement({\r\n            success: true\r\n        });\r\n        return parameterBuilder.createQueryString();\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { BaseClient } from \"./BaseClient\";\r\nimport { ClientConfiguration } from \"../config/ClientConfiguration\";\r\nimport { CommonSilentFlowRequest } from \"../request/CommonSilentFlowRequest\";\r\nimport { AuthenticationResult } from \"../response/AuthenticationResult\";\r\nimport { AuthToken } from \"../account/AuthToken\";\r\nimport { TimeUtils } from \"../utils/TimeUtils\";\r\nimport { RefreshTokenClient } from \"./RefreshTokenClient\";\r\nimport { ClientAuthError, ClientAuthErrorMessage } from \"../error/ClientAuthError\";\r\nimport { ClientConfigurationError } from \"../error/ClientConfigurationError\";\r\nimport { ResponseHandler } from \"../response/ResponseHandler\";\r\nimport { CacheRecord } from \"../cache/entities/CacheRecord\";\r\nimport { CacheOutcome } from \"../utils/Constants\";\r\nimport { IPerformanceClient } from \"../telemetry/performance/IPerformanceClient\";\r\nimport { StringUtils } from \"../utils/StringUtils\";\r\n\r\nexport class SilentFlowClient extends BaseClient {\r\n    \r\n    constructor(configuration: ClientConfiguration, performanceClient?: IPerformanceClient) {\r\n        super(configuration,performanceClient);\r\n    }\r\n    \r\n    /**\r\n     * Retrieves a token from cache if it is still valid, or uses the cached refresh token to renew\r\n     * the given token and returns the renewed token\r\n     * @param request\r\n     */\r\n    async acquireToken(request: CommonSilentFlowRequest): Promise<AuthenticationResult> {\r\n        try {\r\n            return await this.acquireCachedToken(request);\r\n        } catch (e) {\r\n            if (e instanceof ClientAuthError && e.errorCode === ClientAuthErrorMessage.tokenRefreshRequired.code) {\r\n                const refreshTokenClient = new RefreshTokenClient(this.config, this.performanceClient);\r\n                return refreshTokenClient.acquireTokenByRefreshToken(request);\r\n            } else {\r\n                throw e;\r\n            }\r\n        }\r\n    }\r\n    \r\n    /**\r\n     * Retrieves token from cache or throws an error if it must be refreshed.\r\n     * @param request\r\n     */\r\n    async acquireCachedToken(request: CommonSilentFlowRequest): Promise<AuthenticationResult> {\r\n        // Cannot renew token if no request object is given.\r\n        if (!request) {\r\n            throw ClientConfigurationError.createEmptyTokenRequestError();\r\n        }\r\n\r\n        if (request.forceRefresh) {\r\n            // Must refresh due to present force_refresh flag.\r\n            this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.FORCE_REFRESH);\r\n            this.logger.info(\"SilentFlowClient:acquireCachedToken - Skipping cache because forceRefresh is true.\");\r\n            throw ClientAuthError.createRefreshRequiredError();\r\n        } else if (!this.config.cacheOptions.claimsBasedCachingEnabled && !StringUtils.isEmptyObj(request.claims)) {\r\n            // Must refresh due to presence of claims in request preventing cache lookup\r\n            this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.CLAIMS_REQUESTED_CACHE_SKIPPED);\r\n            this.logger.info(\"SilentFlowClient:acquireCachedToken - Skipping cache because claims-based caching is disabled and claims were requested.\");\r\n            throw ClientAuthError.createRefreshRequiredError();\r\n        }\r\n\r\n        // We currently do not support silent flow for account === null use cases; This will be revisited for confidential flow usecases\r\n        if (!request.account) {\r\n            throw ClientAuthError.createNoAccountInSilentRequestError();\r\n        }\r\n\r\n        const environment = request.authority || this.authority.getPreferredCache();\r\n\r\n        const cacheRecord = this.cacheManager.readCacheRecord(request.account, request, environment);\r\n\r\n        if (!cacheRecord.accessToken) {\r\n            // Must refresh due to non-existent access_token.\r\n            this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.NO_CACHED_ACCESS_TOKEN);\r\n            this.logger.info(\"SilentFlowClient:acquireCachedToken - No access token found in cache for the given properties.\");\r\n            throw ClientAuthError.createRefreshRequiredError();\r\n        } else if (\r\n            TimeUtils.wasClockTurnedBack(cacheRecord.accessToken.cachedAt) ||\r\n            TimeUtils.isTokenExpired(cacheRecord.accessToken.expiresOn, this.config.systemOptions.tokenRenewalOffsetSeconds)\r\n        ) {\r\n            // Must refresh due to expired access_token.\r\n            this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.CACHED_ACCESS_TOKEN_EXPIRED);\r\n            this.logger.info(`SilentFlowClient:acquireCachedToken - Cached access token is expired or will expire within ${this.config.systemOptions.tokenRenewalOffsetSeconds} seconds.`);\r\n            throw ClientAuthError.createRefreshRequiredError();\r\n        } else if (cacheRecord.accessToken.refreshOn && TimeUtils.isTokenExpired(cacheRecord.accessToken.refreshOn, 0)) {\r\n            // Must refresh due to the refresh_in value.\r\n            this.serverTelemetryManager?.setCacheOutcome(CacheOutcome.REFRESH_CACHED_ACCESS_TOKEN);\r\n            this.logger.info(\"SilentFlowClient:acquireCachedToken - Cached access token's refreshOn property has been exceeded'.\");\r\n            throw ClientAuthError.createRefreshRequiredError();\r\n        }\r\n\r\n        if (this.config.serverTelemetryManager) {\r\n            this.config.serverTelemetryManager.incrementCacheHits();\r\n        }\r\n\r\n        return await this.generateResultFromCacheRecord(cacheRecord, request);\r\n    }\r\n\r\n    /**\r\n     * Helper function to build response object from the CacheRecord\r\n     * @param cacheRecord\r\n     */\r\n    private async generateResultFromCacheRecord(cacheRecord: CacheRecord, request: CommonSilentFlowRequest): Promise<AuthenticationResult> {\r\n        let idTokenObj: AuthToken | undefined;\r\n        if (cacheRecord.idToken) {\r\n            idTokenObj = new AuthToken(cacheRecord.idToken.secret, this.config.cryptoInterface);\r\n        }\r\n\r\n        // token max_age check\r\n        if (request.maxAge || (request.maxAge === 0)) {\r\n            const authTime = idTokenObj?.claims.auth_time;\r\n            if (!authTime) {\r\n                throw ClientAuthError.createAuthTimeNotFoundError();\r\n            }\r\n\r\n            AuthToken.checkMaxAge(authTime, request.maxAge);\r\n        }\r\n\r\n        return await ResponseHandler.generateAuthenticationResult(\r\n            this.cryptoUtils,\r\n            this.authority,\r\n            cacheRecord,\r\n            true,\r\n            request,\r\n            idTokenObj\r\n        );\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { StandardInteractionClient } from \"./StandardInteractionClient\";\r\nimport { CommonSilentFlowRequest, AuthenticationResult, SilentFlowClient, ServerTelemetryManager, AccountInfo, AzureCloudOptions, PerformanceEvents, AuthError } from \"@azure/msal-common\";\r\nimport { SilentRequest } from \"../request/SilentRequest\";\r\nimport { ApiId } from \"../utils/BrowserConstants\";\r\nimport { BrowserAuthError, BrowserAuthErrorMessage } from \"../error/BrowserAuthError\";\r\n\r\nexport class SilentCacheClient extends StandardInteractionClient {\r\n    /**\r\n     * Returns unexpired tokens from the cache, if available\r\n     * @param silentRequest\r\n     */\r\n    async acquireToken(silentRequest: CommonSilentFlowRequest): Promise<AuthenticationResult> {\r\n        const acquireTokenMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.SilentCacheClientAcquireToken, silentRequest.correlationId);\r\n        // Telemetry manager only used to increment cacheHits here\r\n        const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenSilent_silentFlow);\r\n\r\n        const silentAuthClient = await this.createSilentFlowClient(serverTelemetryManager, silentRequest.authority, silentRequest.azureCloudOptions);\r\n        this.logger.verbose(\"Silent auth client created\");\r\n\r\n        try {\r\n            const cachedToken = await silentAuthClient.acquireCachedToken(silentRequest);\r\n\r\n            acquireTokenMeasurement.endMeasurement({\r\n                success: true,\r\n                fromCache: true\r\n            });\r\n            return cachedToken;\r\n        } catch (error) {\r\n            if (error instanceof BrowserAuthError && error.errorCode === BrowserAuthErrorMessage.signingKeyNotFoundInStorage.code) {\r\n                this.logger.verbose(\"Signing keypair for bound access token not found. Refreshing bound access token and generating a new crypto keypair.\");\r\n            }\r\n            acquireTokenMeasurement.endMeasurement({\r\n                errorCode: error instanceof AuthError && error.errorCode || undefined,\r\n                subErrorCode: error instanceof AuthError && error.subError || undefined,\r\n                success: false\r\n            });\r\n            throw error;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Currently Unsupported\r\n     */\r\n    logout(): Promise<void> {\r\n        // Synchronous so we must reject\r\n        return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());\r\n    }\r\n\r\n    /**\r\n     * Creates an Silent Flow Client with the given authority, or the default authority.\r\n     * @param serverTelemetryManager\r\n     * @param authorityUrl\r\n     */\r\n    protected async createSilentFlowClient(serverTelemetryManager: ServerTelemetryManager, authorityUrl?: string, azureCloudOptions?: AzureCloudOptions): Promise<SilentFlowClient> {\r\n        // Create auth module.\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientGetClientConfiguration, this.correlationId);\r\n        const clientConfig = await this.getClientConfiguration(serverTelemetryManager, authorityUrl, azureCloudOptions);\r\n        return new SilentFlowClient(clientConfig, this.performanceClient);\r\n    }\r\n\r\n    async initializeSilentRequest(request: SilentRequest, account: AccountInfo): Promise<CommonSilentFlowRequest> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.InitializeSilentRequest, this.correlationId);\r\n\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.InitializeBaseRequest, this.correlationId);\r\n        return {\r\n            ...request,\r\n            ...await this.initializeBaseRequest(request, account),\r\n            account: account,\r\n            forceRefresh: request.forceRefresh || false\r\n        };\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthenticationResult, Logger, ICrypto, PromptValue, AuthToken, Constants, AccountEntity, AuthorityType, ScopeSet, TimeUtils, AuthenticationScheme, UrlString, OIDC_DEFAULT_SCOPES, PopTokenGenerator, SignedHttpRequestParameters, IPerformanceClient, PerformanceEvents, IdTokenEntity, AccessTokenEntity, ClientAuthError, AuthError, CommonSilentFlowRequest, AccountInfo, CacheRecord, TokenClaims } from \"@azure/msal-common\";\r\nimport { BaseInteractionClient } from \"./BaseInteractionClient\";\r\nimport { BrowserConfiguration } from \"../config/Configuration\";\r\nimport { BrowserCacheManager } from \"../cache/BrowserCacheManager\";\r\nimport { EventHandler } from \"../event/EventHandler\";\r\nimport { PopupRequest } from \"../request/PopupRequest\";\r\nimport { SilentRequest } from \"../request/SilentRequest\";\r\nimport { SsoSilentRequest } from \"../request/SsoSilentRequest\";\r\nimport { NativeMessageHandler } from \"../broker/nativeBroker/NativeMessageHandler\";\r\nimport { NativeExtensionMethod, ApiId, TemporaryCacheKeys, NativeConstants } from \"../utils/BrowserConstants\";\r\nimport { NativeExtensionRequestBody, NativeTokenRequest } from \"../broker/nativeBroker/NativeRequest\";\r\nimport { MATS, NativeResponse } from \"../broker/nativeBroker/NativeResponse\";\r\nimport { NativeAuthError } from \"../error/NativeAuthError\";\r\nimport { RedirectRequest } from \"../request/RedirectRequest\";\r\nimport { NavigationOptions } from \"../navigation/NavigationOptions\";\r\nimport { INavigationClient } from \"../navigation/INavigationClient\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { SilentCacheClient } from \"./SilentCacheClient\";\r\n\r\nexport class NativeInteractionClient extends BaseInteractionClient {\r\n    protected apiId: ApiId;\r\n    protected accountId: string;\r\n    protected nativeMessageHandler: NativeMessageHandler;\r\n    protected silentCacheClient: SilentCacheClient;\r\n    protected nativeStorageManager: BrowserCacheManager;\r\n\r\n    constructor(config: BrowserConfiguration, browserStorage: BrowserCacheManager, browserCrypto: ICrypto, logger: Logger, eventHandler: EventHandler, navigationClient: INavigationClient, apiId: ApiId, performanceClient: IPerformanceClient, provider: NativeMessageHandler, accountId: string, nativeStorageImpl: BrowserCacheManager, correlationId?: string) {\r\n        super(config, browserStorage, browserCrypto, logger, eventHandler, navigationClient, performanceClient, provider, correlationId);\r\n        this.apiId = apiId;\r\n        this.accountId = accountId;\r\n        this.nativeMessageHandler = provider;\r\n        this.nativeStorageManager = nativeStorageImpl;\r\n        this.silentCacheClient = new SilentCacheClient(config, this.nativeStorageManager, browserCrypto, logger, eventHandler, navigationClient, performanceClient, provider, correlationId);\r\n    }\r\n\r\n    /**\r\n     * Acquire token from native platform via browser extension\r\n     * @param request\r\n     */\r\n    async acquireToken(request: PopupRequest|SilentRequest|SsoSilentRequest): Promise<AuthenticationResult> {\r\n        this.logger.trace(\"NativeInteractionClient - acquireToken called.\");\r\n\r\n        // start the perf measurement\r\n        const nativeATMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.NativeInteractionClientAcquireToken, request.correlationId);\r\n        const reqTimestamp = TimeUtils.nowSeconds();\r\n\r\n        // initialize native request\r\n        const nativeRequest = await this.initializeNativeRequest(request);\r\n        \r\n        // check if the tokens can be retrieved from internal cache\r\n        try {\r\n            const result = await this.acquireTokensFromCache(this.accountId, nativeRequest);\r\n            nativeATMeasurement.endMeasurement({\r\n                success: true,\r\n                isNativeBroker: false, // Should be true only when the result is coming directly from the broker\r\n                fromCache: true\r\n            });\r\n            return result;\r\n        } catch (e) {\r\n            // continue with a native call for any and all errors\r\n            this.logger.info(\"MSAL internal Cache does not contain tokens, proceed to make a native call\");\r\n        }\r\n\r\n        // fall back to native calls\r\n        const messageBody: NativeExtensionRequestBody = {\r\n            method: NativeExtensionMethod.GetToken,\r\n            request: nativeRequest\r\n        };\r\n\r\n        const response: object = await this.nativeMessageHandler.sendMessage(messageBody);\r\n        const validatedResponse: NativeResponse = this.validateNativeResponse(response);\r\n\r\n        return this.handleNativeResponse(validatedResponse, nativeRequest, reqTimestamp)\r\n            .then((result: AuthenticationResult) => {\r\n                nativeATMeasurement.endMeasurement({\r\n                    success: true,\r\n                    isNativeBroker: true,\r\n                    requestId: result.requestId\r\n                });\r\n                return result;\r\n            })\r\n            .catch((error: AuthError) => {\r\n                nativeATMeasurement.endMeasurement({\r\n                    success: false,\r\n                    errorCode: error.errorCode,\r\n                    subErrorCode: error.subError,\r\n                    isNativeBroker: true\r\n                });\r\n                throw error;\r\n            });\r\n    }\r\n\r\n    /**\r\n     * Creates silent flow request\r\n     * @param request\r\n     * @param cachedAccount\r\n     * @returns CommonSilentFlowRequest\r\n     */\r\n    private createSilentCacheRequest(request: NativeTokenRequest, cachedAccount: AccountInfo): CommonSilentFlowRequest {\r\n        return {\r\n            authority: request.authority,\r\n            correlationId: this.correlationId,\r\n            scopes: ScopeSet.fromString(request.scope).asArray(),\r\n            account: cachedAccount,\r\n            forceRefresh: false,\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Fetches the tokens from the cache if un-expired\r\n     * @param nativeAccountId\r\n     * @param request\r\n     * @returns authenticationResult\r\n     */\r\n    protected async acquireTokensFromCache(nativeAccountId: string, request: NativeTokenRequest): Promise<AuthenticationResult> {\r\n        if (!nativeAccountId) {\r\n            this.logger.warning(\"NativeInteractionClient:acquireTokensFromCache - No nativeAccountId provided\");\r\n            throw ClientAuthError.createNoAccountFoundError();\r\n        }\r\n        // fetch the account from browser cache\r\n        const account = this.browserStorage.getAccountInfoFilteredBy({nativeAccountId});\r\n        if (!account) {\r\n            throw ClientAuthError.createNoAccountFoundError();\r\n        }\r\n\r\n        // leverage silent flow for cached tokens retrieval\r\n        try {\r\n            const silentRequest = this.createSilentCacheRequest(request, account);\r\n            const result = await this.silentCacheClient.acquireToken(silentRequest);\r\n\r\n            const fullAccount = {\r\n                ...account,\r\n                idTokenClaims: result.idTokenClaims as TokenClaims\r\n            };\r\n            return {\r\n                ...result, \r\n                account: fullAccount\r\n            };\r\n        } catch (e) {\r\n            throw e;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Acquires a token from native platform then redirects to the redirectUri instead of returning the response\r\n     * @param request\r\n     */\r\n    async acquireTokenRedirect(request: RedirectRequest): Promise<void> {\r\n        this.logger.trace(\"NativeInteractionClient - acquireTokenRedirect called.\");\r\n        const nativeRequest = await this.initializeNativeRequest(request);\r\n\r\n        const messageBody: NativeExtensionRequestBody = {\r\n            method: NativeExtensionMethod.GetToken,\r\n            request: nativeRequest\r\n        };\r\n\r\n        try {\r\n            const response: object = await this.nativeMessageHandler.sendMessage(messageBody);\r\n            this.validateNativeResponse(response);\r\n        } catch (e) {\r\n            // Only throw fatal errors here to allow application to fallback to regular redirect. Otherwise proceed and the error will be thrown in handleRedirectPromise\r\n            if (e instanceof NativeAuthError && e.isFatal()) {\r\n                throw e;\r\n            }\r\n        }\r\n        this.browserStorage.setTemporaryCache(TemporaryCacheKeys.NATIVE_REQUEST, JSON.stringify(nativeRequest), true);\r\n\r\n        const navigationOptions: NavigationOptions = {\r\n            apiId: ApiId.acquireTokenRedirect,\r\n            timeout: this.config.system.redirectNavigationTimeout,\r\n            noHistory: false\r\n        };\r\n        const redirectUri = this.config.auth.navigateToLoginRequestUrl ? window.location.href : this.getRedirectUri(request.redirectUri);\r\n        await this.navigationClient.navigateExternal(redirectUri, navigationOptions); // Need to treat this as external to ensure handleRedirectPromise is run again\r\n    }\r\n\r\n    /**\r\n     * If the previous page called native platform for a token using redirect APIs, send the same request again and return the response\r\n     */\r\n    async handleRedirectPromise(): Promise<AuthenticationResult | null> {\r\n        this.logger.trace(\"NativeInteractionClient - handleRedirectPromise called.\");\r\n        if (!this.browserStorage.isInteractionInProgress(true)) {\r\n            this.logger.info(\"handleRedirectPromise called but there is no interaction in progress, returning null.\");\r\n            return null;\r\n        }\r\n\r\n        // remove prompt from the request to prevent WAM from prompting twice\r\n        const cachedRequest = this.browserStorage.getCachedNativeRequest();\r\n        if (!cachedRequest) {\r\n            this.logger.verbose(\"NativeInteractionClient - handleRedirectPromise called but there is no cached request, returning null.\");\r\n            return null;\r\n        }\r\n\r\n        const { prompt, ...request} = cachedRequest;\r\n        if (prompt) {\r\n            this.logger.verbose(\"NativeInteractionClient - handleRedirectPromise called and prompt was included in the original request, removing prompt from cached request to prevent second interaction with native broker window.\");\r\n        }\r\n\r\n        this.browserStorage.removeItem(this.browserStorage.generateCacheKey(TemporaryCacheKeys.NATIVE_REQUEST));\r\n\r\n        const messageBody: NativeExtensionRequestBody = {\r\n            method: NativeExtensionMethod.GetToken,\r\n            request: request\r\n        };\r\n\r\n        const reqTimestamp = TimeUtils.nowSeconds();\r\n\r\n        try {\r\n            this.logger.verbose(\"NativeInteractionClient - handleRedirectPromise sending message to native broker.\");\r\n            const response: object = await this.nativeMessageHandler.sendMessage(messageBody);\r\n            this.validateNativeResponse(response);\r\n            const result = this.handleNativeResponse(response as NativeResponse, request, reqTimestamp);\r\n            this.browserStorage.setInteractionInProgress(false);\r\n            return result;\r\n        } catch (e) {\r\n            this.browserStorage.setInteractionInProgress(false);    \r\n            throw e;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Logout from native platform via browser extension\r\n     * @param request\r\n     */\r\n    logout(): Promise<void> {\r\n        this.logger.trace(\"NativeInteractionClient - logout called.\");\r\n        return Promise.reject(\"Logout not implemented yet\");\r\n    }\r\n\r\n    /**\r\n     * Transform response from native platform into AuthenticationResult object which will be returned to the end user\r\n     * @param response\r\n     * @param request\r\n     * @param reqTimestamp\r\n     */\r\n    protected async handleNativeResponse(response: NativeResponse, request: NativeTokenRequest, reqTimestamp: number): Promise<AuthenticationResult> {\r\n        this.logger.trace(\"NativeInteractionClient - handleNativeResponse called.\");\r\n\r\n        if (response.account.id !== request.accountId) {\r\n            // User switch in native broker prompt is not supported. All users must first sign in through web flow to ensure server state is in sync\r\n            throw NativeAuthError.createUserSwitchError();\r\n        }\r\n\r\n        // Get the preferred_cache domain for the given authority\r\n        const authority = await this.getDiscoveredAuthority(request.authority);\r\n\r\n        // generate identifiers\r\n        const idTokenObj = this.createIdTokenObj(response);\r\n        const homeAccountIdentifier = this.createHomeAccountIdentifier(response, idTokenObj);\r\n        const accountEntity = AccountEntity.createAccount(\r\n            {\r\n                homeAccountId: homeAccountIdentifier,\r\n                idTokenClaims: idTokenObj.claims,\r\n                clientInfo: response.client_info,\r\n                nativeAccountId: response.account.id,\r\n            },\r\n            authority\r\n        );\r\n        // generate authenticationResult\r\n        const result = await this.generateAuthenticationResult(response, request, idTokenObj, accountEntity, authority.canonicalAuthority, reqTimestamp);\r\n\r\n        // cache accounts and tokens in the appropriate storage\r\n        this.cacheAccount(accountEntity);\r\n        this.cacheNativeTokens(response, request, homeAccountIdentifier, idTokenObj, result.accessToken, result.tenantId, reqTimestamp);\r\n        \r\n        return result;\r\n    }\r\n\r\n    /**\r\n     * Create an idToken Object (not entity)\r\n     * @param response \r\n     * @returns \r\n     */\r\n    protected createIdTokenObj(response: NativeResponse): AuthToken {\r\n        return new AuthToken(response.id_token || Constants.EMPTY_STRING, this.browserCrypto);\r\n    }\r\n\r\n    /**\r\n     * creates an homeAccountIdentifier for the account\r\n     * @param response \r\n     * @param idTokenObj \r\n     * @returns \r\n     */\r\n    protected createHomeAccountIdentifier(response: NativeResponse, idTokenObj: AuthToken): string {\r\n        // Save account in browser storage\r\n        const homeAccountIdentifier = AccountEntity.generateHomeAccountId(response.client_info || Constants.EMPTY_STRING, AuthorityType.Default, this.logger, this.browserCrypto, idTokenObj.claims);\r\n\r\n        return homeAccountIdentifier;\r\n    }\r\n\r\n    /**\r\n     * Helper to generate scopes\r\n     * @param response \r\n     * @param request \r\n     * @returns \r\n     */\r\n    generateScopes(response: NativeResponse, request: NativeTokenRequest): ScopeSet {\r\n        return response.scope ? ScopeSet.fromString(response.scope) : ScopeSet.fromString(request.scope);\r\n    }\r\n\r\n    /**\r\n     * If PoP token is requesred, records the PoP token if returned from the WAM, else generates one in the browser\r\n     * @param request \r\n     * @param response \r\n     */\r\n    async generatePopAccessToken(response: NativeResponse, request: NativeTokenRequest): Promise<string> {\r\n        \r\n        if(request.tokenType === AuthenticationScheme.POP) {\r\n            /** \r\n             * This code prioritizes SHR returned from the native layer. In case of error/SHR not calculated from WAM and the AT \r\n             * is still received, SHR is calculated locally\r\n             */\r\n        \r\n            // Check if native layer returned an SHR token\r\n            if (response.shr) {\r\n                this.logger.trace(\"handleNativeServerResponse: SHR is enabled in native layer\");\r\n                return response.shr;\r\n            }\r\n\r\n            // Generate SHR in msal js if WAM does not compute it when POP is enabled\r\n            const popTokenGenerator: PopTokenGenerator = new PopTokenGenerator(this.browserCrypto);\r\n            const shrParameters: SignedHttpRequestParameters = {\r\n                resourceRequestMethod: request.resourceRequestMethod,\r\n                resourceRequestUri: request.resourceRequestUri,\r\n                shrClaims: request.shrClaims,\r\n                shrNonce: request.shrNonce\r\n            };\r\n\r\n            /**\r\n             * KeyID must be present in the native request from when the PoP key was generated in order for\r\n             * PopTokenGenerator to query the full key for signing\r\n             */\r\n            if (!request.keyId) {\r\n                throw ClientAuthError.createKeyIdMissingError();\r\n            }\r\n            return await popTokenGenerator.signPopToken(response.access_token, request.keyId, shrParameters);\r\n        } else {\r\n            return response.access_token;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Generates authentication result\r\n     * @param response \r\n     * @param request \r\n     * @param idTokenObj \r\n     * @param accountEntity \r\n     * @param authority \r\n     * @param reqTimestamp \r\n     * @returns \r\n     */\r\n    protected async generateAuthenticationResult(response: NativeResponse, request: NativeTokenRequest, idTokenObj: AuthToken, accountEntity: AccountEntity, authority: string, reqTimestamp: number): Promise<AuthenticationResult> {\r\n\r\n        // Add Native Broker fields to Telemetry\r\n        const mats = this.addTelemetryFromNativeResponse(response);\r\n\r\n        // If scopes not returned in server response, use request scopes\r\n        const responseScopes = response.scope ? ScopeSet.fromString(response.scope) : ScopeSet.fromString(request.scope);\r\n\r\n        const accountProperties = response.account.properties || {};\r\n        const uid = accountProperties[\"UID\"] || idTokenObj.claims.oid || idTokenObj.claims.sub || Constants.EMPTY_STRING;\r\n        const tid = accountProperties[\"TenantId\"] || idTokenObj.claims.tid || Constants.EMPTY_STRING;\r\n\r\n        // generate PoP token as needed\r\n        const responseAccessToken = await this.generatePopAccessToken(response, request);\r\n        const tokenType = (request.tokenType === AuthenticationScheme.POP) ? AuthenticationScheme.POP : AuthenticationScheme.BEARER;\r\n\r\n        const result: AuthenticationResult = {\r\n            authority: authority,\r\n            uniqueId: uid,\r\n            tenantId: tid,\r\n            scopes: responseScopes.asArray(),\r\n            account: accountEntity.getAccountInfo(),\r\n            idToken: response.id_token,\r\n            idTokenClaims: idTokenObj.claims,\r\n            accessToken: responseAccessToken,\r\n            fromCache: mats ? this.isResponseFromCache(mats) : false,\r\n            expiresOn: new Date(Number(reqTimestamp + response.expires_in) * 1000),\r\n            tokenType: tokenType,\r\n            correlationId: this.correlationId,\r\n            state: response.state,\r\n            fromNativeBroker: true\r\n        };\r\n\r\n        return result;\r\n    }\r\n\r\n    /**\r\n     * cache the account entity in browser storage\r\n     * @param accountEntity \r\n     */\r\n    cacheAccount(accountEntity: AccountEntity): void{\r\n        // Store the account info and hence `nativeAccountId` in browser cache\r\n        this.browserStorage.setAccount(accountEntity);\r\n\r\n        // Remove any existing cached tokens for this account in browser storage\r\n        this.browserStorage.removeAccountContext(accountEntity).catch((e) => {\r\n            this.logger.error(`Error occurred while removing account context from browser storage. ${e}`);\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Stores the access_token and id_token in inmemory storage\r\n     * @param response \r\n     * @param request \r\n     * @param homeAccountIdentifier \r\n     * @param idTokenObj \r\n     * @param responseAccessToken \r\n     * @param tenantId \r\n     * @param reqTimestamp \r\n     */\r\n    cacheNativeTokens(response: NativeResponse, request: NativeTokenRequest, homeAccountIdentifier: string, idTokenObj: AuthToken, responseAccessToken: string, tenantId: string, reqTimestamp: number): void {\r\n\r\n        const cachedIdToken: IdTokenEntity | null =\r\n            IdTokenEntity.createIdTokenEntity(\r\n                homeAccountIdentifier,\r\n                request.authority,\r\n                response.id_token || Constants.EMPTY_STRING,\r\n                request.clientId,\r\n                idTokenObj.claims.tid || Constants.EMPTY_STRING\r\n            );\r\n\r\n        // cache accessToken in inmemory storage\r\n        const expiresIn: number = (request.tokenType === AuthenticationScheme.POP)\r\n            ? Constants.SHR_NONCE_VALIDITY\r\n            : (\r\n                typeof response.expires_in === \"string\"\r\n                    ? parseInt(response.expires_in, 10)\r\n                    : response.expires_in\r\n            ) || 0;\r\n        const tokenExpirationSeconds = reqTimestamp + expiresIn;\r\n        const responseScopes = this.generateScopes(response, request);\r\n        const cachedAccessToken: AccessTokenEntity | null =\r\n            AccessTokenEntity.createAccessTokenEntity(\r\n                homeAccountIdentifier,\r\n                request.authority,\r\n                responseAccessToken,\r\n                request.clientId,\r\n                idTokenObj\r\n                    ? idTokenObj.claims.tid || Constants.EMPTY_STRING\r\n                    : tenantId,\r\n                responseScopes.printScopes(),\r\n                tokenExpirationSeconds,\r\n                0,\r\n                this.browserCrypto\r\n            );\r\n\r\n        const nativeCacheRecord = new CacheRecord(\r\n            undefined,\r\n            cachedIdToken,\r\n            cachedAccessToken\r\n        );\r\n\r\n        this.nativeStorageManager.saveCacheRecord(nativeCacheRecord);\r\n    }\r\n\r\n    protected addTelemetryFromNativeResponse(response: NativeResponse): MATS | null {\r\n\r\n        const mats = this.getMATSFromResponse(response);\r\n\r\n        if (!mats){\r\n            return null;\r\n        }\r\n        \r\n        this.performanceClient.addStaticFields({\r\n            extensionId: this.nativeMessageHandler.getExtensionId(),\r\n            extensionVersion: this.nativeMessageHandler.getExtensionVersion(),\r\n            matsBrokerVersion: mats.broker_version,\r\n            matsAccountJoinOnStart: mats.account_join_on_start,\r\n            matsAccountJoinOnEnd: mats.account_join_on_end,\r\n            matsDeviceJoin: mats.device_join,\r\n            matsPromptBehavior: mats.prompt_behavior,\r\n            matsApiErrorCode: mats.api_error_code,\r\n            matsUiVisible: mats.ui_visible,\r\n            matsSilentCode: mats.silent_code,\r\n            matsSilentBiSubCode: mats.silent_bi_sub_code,\r\n            matsSilentMessage: mats.silent_message,\r\n            matsSilentStatus: mats.silent_status,\r\n            matsHttpStatus: mats.http_status,\r\n            matsHttpEventCount: mats.http_event_count\r\n        }, this.correlationId);\r\n\r\n        return mats;\r\n    }\r\n\r\n    /**\r\n     * Validates native platform response before processing\r\n     * @param response\r\n     */\r\n    private validateNativeResponse(response: object): NativeResponse {\r\n        if (\r\n            response.hasOwnProperty(\"access_token\") &&\r\n            response.hasOwnProperty(\"id_token\") &&\r\n            response.hasOwnProperty(\"client_info\") &&\r\n            response.hasOwnProperty(\"account\") &&\r\n            response.hasOwnProperty(\"scope\") &&\r\n            response.hasOwnProperty(\"expires_in\")\r\n        ) {\r\n            return response as NativeResponse;\r\n        } else {\r\n            throw NativeAuthError.createUnexpectedError(\"Response missing expected properties.\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Gets MATS telemetry from native response\r\n     * @param response\r\n     * @returns\r\n     */\r\n    private getMATSFromResponse(response: NativeResponse): MATS|null {\r\n        if (response.properties.MATS) {\r\n            try {\r\n                return JSON.parse(response.properties.MATS);\r\n            } catch (e) {\r\n                this.logger.error(\"NativeInteractionClient - Error parsing MATS telemetry, returning null instead\");\r\n            }\r\n        }\r\n\r\n        return null;\r\n    }\r\n\r\n    /**\r\n     * Returns whether or not response came from native cache\r\n     * @param response\r\n     * @returns\r\n     */\r\n    protected isResponseFromCache(mats: MATS): boolean {\r\n        if (typeof mats.is_cached === \"undefined\") {\r\n            this.logger.verbose(\"NativeInteractionClient - MATS telemetry does not contain field indicating if response was served from cache. Returning false.\");\r\n            return false;\r\n        }\r\n\r\n        return !!mats.is_cached;\r\n    }\r\n\r\n    /**\r\n     * Translates developer provided request object into NativeRequest object\r\n     * @param request\r\n     */\r\n    protected async initializeNativeRequest(request: PopupRequest|SsoSilentRequest): Promise<NativeTokenRequest> {\r\n        this.logger.trace(\"NativeInteractionClient - initializeNativeRequest called\");\r\n\r\n        const authority = request.authority || this.config.auth.authority;\r\n\r\n        if (request.account) {\r\n            await this.validateRequestAuthority(authority, request.account);\r\n        }\r\n\r\n        const canonicalAuthority = new UrlString(authority);\r\n        canonicalAuthority.validateAsUri();\r\n\r\n        // scopes are expected to be received by the native broker as \"scope\" and will be added to the request below. Other properties that should be dropped from the request to the native broker can be included in the object destructuring here.\r\n        const { scopes, ...remainingProperties } = request; \r\n        const scopeSet = new ScopeSet(scopes || []);\r\n        scopeSet.appendScopes(OIDC_DEFAULT_SCOPES);\r\n\r\n        const getPrompt = () => {\r\n            // If request is silent, prompt is always none\r\n            switch (this.apiId) {\r\n                case ApiId.ssoSilent:\r\n                case ApiId.acquireTokenSilent_silentFlow:\r\n                    this.logger.trace(\"initializeNativeRequest: silent request sets prompt to none\");\r\n                    return PromptValue.NONE;\r\n                default:\r\n                    break;\r\n            }\r\n\r\n            // Prompt not provided, request may proceed and native broker decides if it needs to prompt\r\n            if (!request.prompt) {\r\n                this.logger.trace(\"initializeNativeRequest: prompt was not provided\");\r\n                return undefined;\r\n            }\r\n\r\n            // If request is interactive, check if prompt provided is allowed to go directly to native broker\r\n            switch (request.prompt) {\r\n                case PromptValue.NONE:\r\n                case PromptValue.CONSENT:\r\n                case PromptValue.LOGIN:\r\n                    this.logger.trace(\"initializeNativeRequest: prompt is compatible with native flow\");\r\n                    return request.prompt;\r\n                default:\r\n                    this.logger.trace(`initializeNativeRequest: prompt = ${request.prompt} is not compatible with native flow`);\r\n                    throw BrowserAuthError.createNativePromptParameterNotSupportedError();\r\n            }\r\n        };\r\n        \r\n        const validatedRequest: NativeTokenRequest = {\r\n            ...remainingProperties,\r\n            accountId: this.accountId,\r\n            clientId: this.config.auth.clientId,\r\n            authority: canonicalAuthority.urlString,\r\n            scope: scopeSet.printScopes(),\r\n            redirectUri: this.getRedirectUri(request.redirectUri),\r\n            prompt: getPrompt(),\r\n            correlationId: this.correlationId,\r\n            tokenType: request.authenticationScheme,\r\n            windowTitleSubstring: document.title,\r\n            extraParameters: {\r\n                ...request.extraQueryParameters,\r\n                ...request.tokenQueryParameters,\r\n                telemetry: NativeConstants.MATS_TELEMETRY\r\n            },\r\n            extendedExpiryToken: false // Make this configurable?\r\n        };\r\n\r\n        if (request.authenticationScheme === AuthenticationScheme.POP) {\r\n\r\n            // add POP request type\r\n            const shrParameters: SignedHttpRequestParameters = {\r\n                resourceRequestUri: request.resourceRequestUri,\r\n                resourceRequestMethod: request.resourceRequestMethod,\r\n                shrClaims: request.shrClaims,\r\n                shrNonce: request.shrNonce\r\n            };\r\n\r\n            const popTokenGenerator = new PopTokenGenerator(this.browserCrypto);\r\n            const reqCnfData = await popTokenGenerator.generateCnf(shrParameters);\r\n\r\n            // to reduce the URL length, it is recommended to send the short form of the req_cnf \r\n            validatedRequest.reqCnf = reqCnfData.reqCnfString;\r\n            validatedRequest.keyId = reqCnfData.kid;\r\n        }\r\n\r\n        return validatedRequest;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { NativeConstants, NativeExtensionMethod } from \"../../utils/BrowserConstants\";\r\nimport {\r\n    Logger,\r\n    AuthError,\r\n    AuthenticationScheme,\r\n    InProgressPerformanceEvent,\r\n    PerformanceEvents,\r\n    IPerformanceClient\r\n} from \"@azure/msal-common\";\r\nimport { NativeExtensionRequest, NativeExtensionRequestBody } from \"./NativeRequest\";\r\nimport { NativeAuthError } from \"../../error/NativeAuthError\";\r\nimport { BrowserAuthError } from \"../../error/BrowserAuthError\";\r\nimport { BrowserConfiguration } from \"../../config/Configuration\";\r\n\r\ntype ResponseResolvers<T> = {\r\n    resolve: (value:T|PromiseLike<T>) => void;\r\n    reject: (value:AuthError|Error|PromiseLike<Error>|PromiseLike<AuthError>)  => void;\r\n};\r\n\r\nexport class NativeMessageHandler {\r\n    private extensionId: string | undefined;\r\n    private extensionVersion: string | undefined;\r\n    private logger: Logger;\r\n    private readonly handshakeTimeoutMs: number;\r\n    private responseId: number;\r\n    private timeoutId: number | undefined;\r\n    private resolvers: Map<number, ResponseResolvers<object>>;\r\n    private handshakeResolvers: Map<number, ResponseResolvers<void>>;\r\n    private messageChannel: MessageChannel;\r\n    private readonly windowListener: (event: MessageEvent) => void;\r\n    private readonly performanceClient: IPerformanceClient;\r\n    private readonly handshakeEvent: InProgressPerformanceEvent;\r\n\r\n    constructor(logger: Logger, handshakeTimeoutMs: number, performanceClient: IPerformanceClient, extensionId?: string) {\r\n        this.logger = logger;\r\n        this.handshakeTimeoutMs = handshakeTimeoutMs;\r\n        this.extensionId = extensionId;\r\n        this.resolvers = new Map(); // Used for non-handshake messages\r\n        this.handshakeResolvers = new Map(); // Used for handshake messages\r\n        this.responseId = 0;\r\n        this.messageChannel = new MessageChannel();\r\n        this.windowListener = this.onWindowMessage.bind(this); // Window event callback doesn't have access to 'this' unless it's bound\r\n        this.performanceClient = performanceClient;\r\n        this.handshakeEvent = performanceClient.startMeasurement(PerformanceEvents.NativeMessageHandlerHandshake);\r\n    }\r\n\r\n    /**\r\n     * Sends a given message to the extension and resolves with the extension response\r\n     * @param body\r\n     */\r\n    async sendMessage(body: NativeExtensionRequestBody): Promise<object> {\r\n        this.logger.trace(\"NativeMessageHandler - sendMessage called.\");\r\n        const req: NativeExtensionRequest = {\r\n            channel: NativeConstants.CHANNEL_ID,\r\n            extensionId: this.extensionId,\r\n            responseId: this.responseId++,\r\n            body: body\r\n        };\r\n\r\n        this.logger.trace(\"NativeMessageHandler - Sending request to browser extension\");\r\n        this.logger.tracePii(`NativeMessageHandler - Sending request to browser extension: ${JSON.stringify(req)}`);\r\n        this.messageChannel.port1.postMessage(req);\r\n\r\n        return new Promise((resolve, reject) => {\r\n            this.resolvers.set(req.responseId, {resolve, reject});\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Returns an instance of the MessageHandler that has successfully established a connection with an extension\r\n     * @param {Logger} logger\r\n     * @param {number} handshakeTimeoutMs\r\n     * @param {IPerformanceClient} performanceClient\r\n     */\r\n    static async createProvider(logger: Logger, handshakeTimeoutMs: number, performanceClient: IPerformanceClient): Promise<NativeMessageHandler> {\r\n        logger.trace(\"NativeMessageHandler - createProvider called.\");\r\n        try {\r\n            const preferredProvider = new NativeMessageHandler(logger, handshakeTimeoutMs, performanceClient, NativeConstants.PREFERRED_EXTENSION_ID);\r\n            await preferredProvider.sendHandshakeRequest();\r\n            return preferredProvider;\r\n        } catch (e) {\r\n            // If preferred extension fails for whatever reason, fallback to using any installed extension\r\n            const backupProvider = new NativeMessageHandler(logger, handshakeTimeoutMs, performanceClient);\r\n            await backupProvider.sendHandshakeRequest();\r\n            return backupProvider;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Send handshake request helper.\r\n     */\r\n    private async sendHandshakeRequest(): Promise<void> {\r\n        this.logger.trace(\"NativeMessageHandler - sendHandshakeRequest called.\");\r\n        // Register this event listener before sending handshake\r\n        window.addEventListener(\"message\", this.windowListener, false); // false is important, because content script message processing should work first\r\n\r\n        const req: NativeExtensionRequest = {\r\n            channel: NativeConstants.CHANNEL_ID,\r\n            extensionId: this.extensionId,\r\n            responseId: this.responseId++,\r\n            body: {\r\n                method: NativeExtensionMethod.HandshakeRequest\r\n            }\r\n        };\r\n        this.handshakeEvent.addStaticFields({\r\n            extensionId: this.extensionId,\r\n            extensionHandshakeTimeoutMs: this.handshakeTimeoutMs\r\n        });\r\n\r\n        this.messageChannel.port1.onmessage = (event) => {\r\n            this.onChannelMessage(event);\r\n        };\r\n\r\n        window.postMessage(req, window.origin, [this.messageChannel.port2]);\r\n\r\n        return new Promise((resolve, reject) => {\r\n            this.handshakeResolvers.set(req.responseId, {resolve, reject});\r\n            this.timeoutId = window.setTimeout(() => {\r\n                /*\r\n                 * Throw an error if neither HandshakeResponse nor original Handshake request are received in a reasonable timeframe.\r\n                 * This typically suggests an event handler stopped propagation of the Handshake request but did not respond to it on the MessageChannel port\r\n                 */\r\n                window.removeEventListener(\"message\", this.windowListener, false);\r\n                this.messageChannel.port1.close();\r\n                this.messageChannel.port2.close();\r\n                this.handshakeEvent.endMeasurement({extensionHandshakeTimedOut: true, success: false});\r\n                reject(BrowserAuthError.createNativeHandshakeTimeoutError());\r\n                this.handshakeResolvers.delete(req.responseId);\r\n            }, this.handshakeTimeoutMs); // Use a reasonable timeout in milliseconds here\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Invoked when a message is posted to the window. If a handshake request is received it means the extension is not installed.\r\n     * @param event\r\n     */\r\n    private onWindowMessage(event: MessageEvent): void {\r\n        this.logger.trace(\"NativeMessageHandler - onWindowMessage called\");\r\n        // We only accept messages from ourselves\r\n        if (event.source !== window) {\r\n            return;\r\n        }\r\n\r\n        const request = event.data;\r\n\r\n        if (!request.channel || request.channel !== NativeConstants.CHANNEL_ID) {\r\n            return;\r\n        }\r\n\r\n        if (request.extensionId && request.extensionId !== this.extensionId) {\r\n            return;\r\n        }\r\n\r\n        if (request.body.method === NativeExtensionMethod.HandshakeRequest) {\r\n            // If we receive this message back it means no extension intercepted the request, meaning no extension supporting handshake protocol is installed\r\n            this.logger.verbose(request.extensionId ? `Extension with id: ${request.extensionId} not installed` : \"No extension installed\");\r\n            clearTimeout(this.timeoutId);\r\n            this.messageChannel.port1.close();\r\n            this.messageChannel.port2.close();\r\n            window.removeEventListener(\"message\", this.windowListener, false);\r\n            const handshakeResolver = this.handshakeResolvers.get(request.responseId);\r\n            if (handshakeResolver) {\r\n                this.handshakeEvent.endMeasurement({success: false, extensionInstalled: false});\r\n                handshakeResolver.reject(BrowserAuthError.createNativeExtensionNotInstalledError());\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Invoked when a message is received from the extension on the MessageChannel port\r\n     * @param event\r\n     */\r\n    private onChannelMessage(event: MessageEvent): void {\r\n        this.logger.trace(\"NativeMessageHandler - onChannelMessage called.\");\r\n        const request = event.data;\r\n\r\n        const resolver = this.resolvers.get(request.responseId);\r\n        const handshakeResolver = this.handshakeResolvers.get(request.responseId);\r\n\r\n        try {\r\n            const method = request.body.method;\r\n\r\n            if (method === NativeExtensionMethod.Response) {\r\n                if (!resolver) {\r\n                    return;\r\n                }\r\n                const response = request.body.response;\r\n                this.logger.trace(\"NativeMessageHandler - Received response from browser extension\");\r\n                this.logger.tracePii(`NativeMessageHandler - Received response from browser extension: ${JSON.stringify(response)}`);\r\n                if (response.status !== \"Success\") {\r\n                    resolver.reject(NativeAuthError.createError(response.code, response.description, response.ext));\r\n                } else if (response.result) {\r\n                    if (response.result[\"code\"] && response.result[\"description\"]) {\r\n                        resolver.reject(NativeAuthError.createError(response.result[\"code\"], response.result[\"description\"], response.result[\"ext\"]));\r\n                    } else {\r\n                        resolver.resolve(response.result);\r\n                    }\r\n                } else {\r\n                    throw AuthError.createUnexpectedError(\"Event does not contain result.\");\r\n                }\r\n                this.resolvers.delete(request.responseId);\r\n            } else if (method === NativeExtensionMethod.HandshakeResponse) {\r\n                if (!handshakeResolver) {\r\n                    return;\r\n                }\r\n                clearTimeout(this.timeoutId); // Clear setTimeout\r\n                window.removeEventListener(\"message\", this.windowListener, false); // Remove 'No extension' listener\r\n                this.extensionId = request.extensionId;\r\n                this.extensionVersion = request.body.version;\r\n                this.logger.verbose(`NativeMessageHandler - Received HandshakeResponse from extension: ${this.extensionId}`);\r\n                this.handshakeEvent.endMeasurement({extensionInstalled: true, success: true});\r\n\r\n                handshakeResolver.resolve();\r\n                this.handshakeResolvers.delete(request.responseId);\r\n            }\r\n            // Do nothing if method is not Response or HandshakeResponse\r\n        } catch (err) {\r\n            this.logger.error(\"Error parsing response from WAM Extension\");\r\n            this.logger.errorPii(`Error parsing response from WAM Extension: ${err.toString()}`);\r\n            this.logger.errorPii(`Unable to parse ${event}`);\r\n\r\n            if (resolver) {\r\n                resolver.reject(err as AuthError);\r\n            } else if (handshakeResolver) {\r\n                handshakeResolver.reject(err as AuthError);\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Returns the Id for the browser extension this handler is communicating with\r\n     * @returns\r\n     */\r\n    getExtensionId(): string | undefined {\r\n        return this.extensionId;\r\n    }\r\n\r\n    /**\r\n     * Returns the version for the browser extension this handler is communicating with\r\n     * @returns\r\n     */\r\n    getExtensionVersion(): string | undefined {\r\n        return this.extensionVersion;\r\n    }\r\n\r\n    /**\r\n     * Returns boolean indicating whether or not the request should attempt to use native broker\r\n     * @param logger\r\n     * @param config\r\n     * @param nativeExtensionProvider\r\n     * @param authenticationScheme\r\n     */\r\n    static isNativeAvailable(config: BrowserConfiguration, logger: Logger, nativeExtensionProvider?: NativeMessageHandler, authenticationScheme?: AuthenticationScheme): boolean {\r\n        logger.trace(\"isNativeAvailable called\");\r\n        if (!config.system.allowNativeBroker) {\r\n            logger.trace(\"isNativeAvailable: allowNativeBroker is not enabled, returning false\");\r\n            // Developer disabled WAM\r\n            return false;\r\n        }\r\n\r\n        if (!nativeExtensionProvider) {\r\n            logger.trace(\"isNativeAvailable: WAM extension provider is not initialized, returning false\");\r\n            // Extension is not available\r\n            return false;\r\n        }\r\n\r\n        if (authenticationScheme) {\r\n            switch(authenticationScheme) {\r\n                case AuthenticationScheme.BEARER:\r\n                case AuthenticationScheme.POP:\r\n                    logger.trace(\"isNativeAvailable: authenticationScheme is supported, returning true\");\r\n                    return true;\r\n                default:\r\n                    logger.trace(\"isNativeAvailable: authenticationScheme is not supported, returning false\");\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        return true;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthenticationResult, CommonAuthorizationCodeRequest, AuthorizationCodeClient, UrlString, AuthError, ServerTelemetryManager, Constants, ProtocolUtils, ServerAuthorizationCodeResponse, ThrottlingUtils, ICrypto, Logger, IPerformanceClient, PerformanceEvents } from \"@azure/msal-common\";\r\nimport { StandardInteractionClient } from \"./StandardInteractionClient\";\r\nimport { ApiId, InteractionType, TemporaryCacheKeys } from \"../utils/BrowserConstants\";\r\nimport { RedirectHandler } from \"../interaction_handler/RedirectHandler\";\r\nimport { BrowserUtils } from \"../utils/BrowserUtils\";\r\nimport { EndSessionRequest } from \"../request/EndSessionRequest\";\r\nimport { EventType } from \"../event/EventType\";\r\nimport { NavigationOptions } from \"../navigation/NavigationOptions\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { RedirectRequest } from \"../request/RedirectRequest\";\r\nimport { NativeInteractionClient } from \"./NativeInteractionClient\";\r\nimport { NativeMessageHandler } from \"../broker/nativeBroker/NativeMessageHandler\";\r\nimport { BrowserConfiguration } from \"../config/Configuration\";\r\nimport { BrowserCacheManager } from \"../cache/BrowserCacheManager\";\r\nimport { EventHandler } from \"../event/EventHandler\";\r\nimport { INavigationClient } from \"../navigation/INavigationClient\";\r\n\r\nexport class RedirectClient extends StandardInteractionClient {\r\n    protected nativeStorage: BrowserCacheManager;\r\n\r\n    constructor(config: BrowserConfiguration, storageImpl: BrowserCacheManager, browserCrypto: ICrypto, logger: Logger, eventHandler: EventHandler, navigationClient: INavigationClient, performanceClient: IPerformanceClient, nativeStorageImpl: BrowserCacheManager, nativeMessageHandler?: NativeMessageHandler, correlationId?: string) {\r\n        super(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId);\r\n        this.nativeStorage = nativeStorageImpl;\r\n    }\r\n\r\n    /**\r\n     * Redirects the page to the /authorize endpoint of the IDP\r\n     * @param request\r\n     */\r\n    async acquireToken(request: RedirectRequest): Promise<void> {\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, request.correlationId);\r\n        const validRequest = await this.initializeAuthorizationRequest(request, InteractionType.Redirect);\r\n        this.browserStorage.updateCacheEntries(validRequest.state, validRequest.nonce, validRequest.authority, validRequest.loginHint || Constants.EMPTY_STRING, validRequest.account || null);\r\n        const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenRedirect);\r\n\r\n        const handleBackButton = (event: PageTransitionEvent) => {\r\n            // Clear temporary cache if the back button is clicked during the redirect flow.\r\n            if (event.persisted) {\r\n                this.logger.verbose(\"Page was restored from back/forward cache. Clearing temporary cache.\");\r\n                this.browserStorage.cleanRequestByState(validRequest.state);\r\n                this.eventHandler.emitEvent(EventType.RESTORE_FROM_BFCACHE, InteractionType.Redirect);\r\n            }\r\n        };\r\n\r\n        try {\r\n            // Create auth code request and generate PKCE params\r\n            this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientInitializeAuthorizationCodeRequest, request.correlationId);\r\n            const authCodeRequest: CommonAuthorizationCodeRequest = await this.initializeAuthorizationCodeRequest(validRequest);\r\n\r\n            // Initialize the client\r\n            this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, request.correlationId);\r\n            const authClient: AuthorizationCodeClient = await this.createAuthCodeClient(serverTelemetryManager, validRequest.authority, validRequest.azureCloudOptions);\r\n            this.logger.verbose(\"Auth code client created\");\r\n\r\n            // Create redirect interaction handler.\r\n            const interactionHandler = new RedirectHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.browserCrypto, this.performanceClient);\r\n\r\n            // Create acquire token url.\r\n            const navigateUrl = await authClient.getAuthCodeUrl({\r\n                ...validRequest,\r\n                nativeBroker: NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, request.authenticationScheme)\r\n            });\r\n\r\n            const redirectStartPage = this.getRedirectStartPage(request.redirectStartPage);\r\n            this.logger.verbosePii(`Redirect start page: ${redirectStartPage}`);\r\n\r\n            // Clear temporary cache if the back button is clicked during the redirect flow.\r\n            window.addEventListener(\"pageshow\", handleBackButton);\r\n\r\n            // Show the UI once the url has been created. Response will come back in the hash, which will be handled in the handleRedirectCallback function.\r\n            return await interactionHandler.initiateAuthRequest(navigateUrl, {\r\n                navigationClient: this.navigationClient,\r\n                redirectTimeout: this.config.system.redirectNavigationTimeout,\r\n                redirectStartPage: redirectStartPage,\r\n                onRedirectNavigate: request.onRedirectNavigate\r\n            });\r\n        } catch (e) {\r\n            if (e instanceof AuthError) {\r\n                e.setCorrelationId(this.correlationId);\r\n            }\r\n            window.removeEventListener(\"pageshow\", handleBackButton);\r\n            serverTelemetryManager.cacheFailedRequest(e);\r\n            this.browserStorage.cleanRequestByState(validRequest.state);\r\n            throw e;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Checks if navigateToLoginRequestUrl is set, and:\r\n     * - if true, performs logic to cache and navigate\r\n     * - if false, handles hash string and parses response\r\n     * @param hash\r\n     */\r\n    async handleRedirectPromise(hash?: string): Promise<AuthenticationResult | null> {\r\n        const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.handleRedirectPromise);\r\n        try {\r\n            if (!this.browserStorage.isInteractionInProgress(true)) {\r\n                this.logger.info(\"handleRedirectPromise called but there is no interaction in progress, returning null.\");\r\n                return null;\r\n            }\r\n\r\n            const responseHash = this.getRedirectResponseHash(hash || window.location.hash);\r\n            if (!responseHash) {\r\n                // Not a recognized server response hash or hash not associated with a redirect request\r\n                this.logger.info(\"handleRedirectPromise did not detect a response hash as a result of a redirect. Cleaning temporary cache.\");\r\n                this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);\r\n                return null;\r\n            }\r\n\r\n            let state: string;\r\n            try {\r\n                // Deserialize hash fragment response parameters.\r\n                const serverParams: ServerAuthorizationCodeResponse = UrlString.getDeserializedHash(responseHash);\r\n                state = this.validateAndExtractStateFromHash(serverParams, InteractionType.Redirect);\r\n                this.logger.verbose(\"State extracted from hash\");\r\n            } catch (e) {\r\n                this.logger.info(`handleRedirectPromise was unable to extract state due to: ${e}`);\r\n                this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);\r\n                return null;\r\n            }\r\n\r\n            // If navigateToLoginRequestUrl is true, get the url where the redirect request was initiated\r\n            const loginRequestUrl = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, true) || Constants.EMPTY_STRING;\r\n            const loginRequestUrlNormalized = UrlString.removeHashFromUrl(loginRequestUrl);\r\n            const currentUrlNormalized = UrlString.removeHashFromUrl(window.location.href);\r\n\r\n            if (loginRequestUrlNormalized === currentUrlNormalized && this.config.auth.navigateToLoginRequestUrl) {\r\n                // We are on the page we need to navigate to - handle hash\r\n                this.logger.verbose(\"Current page is loginRequestUrl, handling hash\");\r\n                const handleHashResult = await this.handleHash(responseHash, state, serverTelemetryManager);\r\n\r\n                if (loginRequestUrl.indexOf(\"#\") > -1) {\r\n                    // Replace current hash with non-msal hash, if present\r\n                    BrowserUtils.replaceHash(loginRequestUrl);\r\n                }\r\n\r\n                return handleHashResult;\r\n            } else if (!this.config.auth.navigateToLoginRequestUrl) {\r\n                this.logger.verbose(\"NavigateToLoginRequestUrl set to false, handling hash\");\r\n                return this.handleHash(responseHash, state, serverTelemetryManager);\r\n            } else if (!BrowserUtils.isInIframe() || this.config.system.allowRedirectInIframe) {\r\n                /*\r\n                 * Returned from authority using redirect - need to perform navigation before processing response\r\n                 * Cache the hash to be retrieved after the next redirect\r\n                 */\r\n                this.browserStorage.setTemporaryCache(TemporaryCacheKeys.URL_HASH, responseHash, true);\r\n                const navigationOptions: NavigationOptions = {\r\n                    apiId: ApiId.handleRedirectPromise,\r\n                    timeout: this.config.system.redirectNavigationTimeout,\r\n                    noHistory: true\r\n                };\r\n\r\n                /**\r\n                 * Default behavior is to redirect to the start page and not process the hash now.\r\n                 * The start page is expected to also call handleRedirectPromise which will process the hash in one of the checks above.\r\n                 */\r\n                let processHashOnRedirect: boolean = true;\r\n                if (!loginRequestUrl || loginRequestUrl === \"null\") {\r\n                    // Redirect to home page if login request url is null (real null or the string null)\r\n                    const homepage = BrowserUtils.getHomepage();\r\n                    // Cache the homepage under ORIGIN_URI to ensure cached hash is processed on homepage\r\n                    this.browserStorage.setTemporaryCache(TemporaryCacheKeys.ORIGIN_URI, homepage, true);\r\n                    this.logger.warning(\"Unable to get valid login request url from cache, redirecting to home page\");\r\n                    processHashOnRedirect = await this.navigationClient.navigateInternal(homepage, navigationOptions);\r\n                } else {\r\n                    // Navigate to page that initiated the redirect request\r\n                    this.logger.verbose(`Navigating to loginRequestUrl: ${loginRequestUrl}`);\r\n                    processHashOnRedirect = await this.navigationClient.navigateInternal(loginRequestUrl, navigationOptions);\r\n                }\r\n\r\n                // If navigateInternal implementation returns false, handle the hash now\r\n                if (!processHashOnRedirect) {\r\n                    return this.handleHash(responseHash, state, serverTelemetryManager);\r\n                }\r\n            }\r\n\r\n            return null;\r\n        } catch (e) {\r\n            if (e instanceof AuthError) {\r\n                (e as AuthError).setCorrelationId(this.correlationId);\r\n            }\r\n            serverTelemetryManager.cacheFailedRequest(e);\r\n            this.browserStorage.cleanRequestByInteractionType(InteractionType.Redirect);\r\n            throw e;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Gets the response hash for a redirect request\r\n     * Returns null if interactionType in the state value is not \"redirect\" or the hash does not contain known properties\r\n     * @param hash\r\n     */\r\n    protected getRedirectResponseHash(hash: string): string | null {\r\n        this.logger.verbose(\"getRedirectResponseHash called\");\r\n        // Get current location hash from window or cache.\r\n        const isResponseHash: boolean = UrlString.hashContainsKnownProperties(hash);\r\n\r\n        if (isResponseHash) {\r\n            BrowserUtils.clearHash(window);\r\n            this.logger.verbose(\"Hash contains known properties, returning response hash\");\r\n            return hash;\r\n        }\r\n\r\n        const cachedHash = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.URL_HASH, true);\r\n        this.browserStorage.removeItem(this.browserStorage.generateCacheKey(TemporaryCacheKeys.URL_HASH));\r\n\r\n        this.logger.verbose(\"Hash does not contain known properties, returning cached hash\");\r\n        return cachedHash;\r\n    }\r\n\r\n    /**\r\n     * Checks if hash exists and handles in window.\r\n     * @param hash\r\n     * @param state\r\n     */\r\n    protected async handleHash(hash: string, state: string, serverTelemetryManager: ServerTelemetryManager): Promise<AuthenticationResult> {\r\n        const cachedRequest = this.browserStorage.getCachedRequest(state, this.browserCrypto);\r\n        this.logger.verbose(\"handleHash called, retrieved cached request\");\r\n\r\n        const serverParams: ServerAuthorizationCodeResponse = UrlString.getDeserializedHash(hash);\r\n\r\n        if (serverParams.accountId) {\r\n            this.logger.verbose(\"Account id found in hash, calling WAM for token\");\r\n            if (!this.nativeMessageHandler) {\r\n                throw BrowserAuthError.createNativeConnectionNotEstablishedError();\r\n            }\r\n            const nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.acquireTokenPopup, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.nativeStorage, cachedRequest.correlationId);\r\n            const { userRequestState } = ProtocolUtils.parseRequestState(this.browserCrypto, state);\r\n            return nativeInteractionClient.acquireToken({\r\n                ...cachedRequest,\r\n                state: userRequestState,\r\n                prompt: undefined // Server should handle the prompt, ideally native broker can do this part silently\r\n            }).finally(() => {\r\n                this.browserStorage.cleanRequestByState(state);\r\n            });\r\n        }\r\n\r\n        // Hash contains known properties - handle and return in callback\r\n        const currentAuthority = this.browserStorage.getCachedAuthority(state);\r\n        if (!currentAuthority) {\r\n            throw BrowserAuthError.createNoCachedAuthorityError();\r\n        }\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, cachedRequest.correlationId);\r\n        const authClient = await this.createAuthCodeClient(serverTelemetryManager, currentAuthority);\r\n        this.logger.verbose(\"Auth code client created\");\r\n        ThrottlingUtils.removeThrottle(this.browserStorage, this.config.auth.clientId, cachedRequest);\r\n        const interactionHandler = new RedirectHandler(authClient, this.browserStorage, cachedRequest, this.logger, this.browserCrypto, this.performanceClient);\r\n        return await interactionHandler.handleCodeResponseFromHash(hash, state, authClient.authority, this.networkClient);\r\n    }\r\n\r\n    /**\r\n     * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.\r\n     * Default behaviour is to redirect the user to `window.location.href`.\r\n     * @param logoutRequest\r\n     */\r\n    async logout(logoutRequest?: EndSessionRequest): Promise<void> {\r\n        this.logger.verbose(\"logoutRedirect called\");\r\n        const validLogoutRequest = this.initializeLogoutRequest(logoutRequest);\r\n        const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.logout);\r\n\r\n        try {\r\n            this.eventHandler.emitEvent(EventType.LOGOUT_START, InteractionType.Redirect, logoutRequest);\r\n\r\n            // Clear cache on logout\r\n            await this.clearCacheOnLogout(validLogoutRequest.account);\r\n\r\n            const navigationOptions: NavigationOptions = {\r\n                apiId: ApiId.logout,\r\n                timeout: this.config.system.redirectNavigationTimeout,\r\n                noHistory: false\r\n            };\r\n            this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, validLogoutRequest.correlationId);\r\n            const authClient = await this.createAuthCodeClient(serverTelemetryManager, logoutRequest && logoutRequest.authority);\r\n            this.logger.verbose(\"Auth code client created\");\r\n\r\n            // Create logout string and navigate user window to logout.\r\n            const logoutUri: string = authClient.getLogoutUri(validLogoutRequest);\r\n\r\n            this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Redirect, validLogoutRequest);\r\n            // Check if onRedirectNavigate is implemented, and invoke it if so\r\n            if (logoutRequest && typeof logoutRequest.onRedirectNavigate === \"function\") {\r\n                const navigate = logoutRequest.onRedirectNavigate(logoutUri);\r\n\r\n                if (navigate !== false) {\r\n                    this.logger.verbose(\"Logout onRedirectNavigate did not return false, navigating\");\r\n                    // Ensure interaction is in progress\r\n                    if (!this.browserStorage.getInteractionInProgress()) {\r\n                        this.browserStorage.setInteractionInProgress(true);\r\n                    }\r\n                    await this.navigationClient.navigateExternal(logoutUri, navigationOptions);\r\n                    return;\r\n                } else {\r\n                    // Ensure interaction is not in progress\r\n                    this.browserStorage.setInteractionInProgress(false);\r\n                    this.logger.verbose(\"Logout onRedirectNavigate returned false, stopping navigation\");\r\n                }\r\n            } else {\r\n                // Ensure interaction is in progress\r\n                if (!this.browserStorage.getInteractionInProgress()) {\r\n                    this.browserStorage.setInteractionInProgress(true);\r\n                }\r\n                await this.navigationClient.navigateExternal(logoutUri, navigationOptions);\r\n                return;\r\n            }\r\n        } catch(e) {\r\n            if (e instanceof AuthError) {\r\n                (e as AuthError).setCorrelationId(this.correlationId);\r\n            }\r\n            serverTelemetryManager.cacheFailedRequest(e);\r\n            this.eventHandler.emitEvent(EventType.LOGOUT_FAILURE, InteractionType.Redirect, null, e);\r\n            this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Redirect);\r\n            throw e;\r\n        }\r\n\r\n        this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Redirect);\r\n    }\r\n\r\n    /**\r\n     * Use to get the redirectStartPage either from request or use current window\r\n     * @param requestStartPage\r\n     */\r\n    protected getRedirectStartPage(requestStartPage?: string): string {\r\n        const redirectStartPage = requestStartPage || window.location.href;\r\n        return UrlString.getAbsoluteUrl(redirectStartPage, BrowserUtils.getCurrentUri());\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthenticationResult, CommonAuthorizationCodeRequest, AuthorizationCodeClient, ThrottlingUtils, CommonEndSessionRequest, UrlString, AuthError, OIDC_DEFAULT_SCOPES, Constants, ProtocolUtils, ServerAuthorizationCodeResponse, PerformanceEvents, StringUtils, IPerformanceClient, Logger, ICrypto } from \"@azure/msal-common\";\r\nimport { StandardInteractionClient } from \"./StandardInteractionClient\";\r\nimport { EventType } from \"../event/EventType\";\r\nimport { InteractionType, ApiId, BrowserConstants } from \"../utils/BrowserConstants\";\r\nimport { EndSessionPopupRequest } from \"../request/EndSessionPopupRequest\";\r\nimport { NavigationOptions } from \"../navigation/NavigationOptions\";\r\nimport { BrowserUtils } from \"../utils/BrowserUtils\";\r\nimport { PopupRequest } from \"../request/PopupRequest\";\r\nimport { NativeInteractionClient } from \"./NativeInteractionClient\";\r\nimport { NativeMessageHandler } from \"../broker/nativeBroker/NativeMessageHandler\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { INavigationClient } from \"../navigation/INavigationClient\";\r\nimport { EventHandler } from \"../event/EventHandler\";\r\nimport { BrowserCacheManager } from \"../cache/BrowserCacheManager\";\r\nimport { BrowserConfiguration } from \"../config/Configuration\";\r\nimport { InteractionHandler, InteractionParams } from \"../interaction_handler/InteractionHandler\";\r\nimport { PopupWindowAttributes } from \"../request/PopupWindowAttributes\";\r\n\r\nexport type PopupParams = InteractionParams & {\r\n    popup?: Window|null;\r\n    popupName: string;\r\n    popupWindowAttributes: PopupWindowAttributes\r\n};\r\n\r\nexport class PopupClient extends StandardInteractionClient {\r\n    private currentWindow: Window | undefined;\r\n    protected nativeStorage: BrowserCacheManager;\r\n\r\n    constructor(config: BrowserConfiguration, storageImpl: BrowserCacheManager, browserCrypto: ICrypto, logger: Logger, eventHandler: EventHandler, navigationClient: INavigationClient, performanceClient: IPerformanceClient, nativeStorageImpl: BrowserCacheManager, nativeMessageHandler?: NativeMessageHandler, correlationId?: string) {\r\n        super(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId);\r\n        // Properly sets this reference for the unload event.\r\n        this.unloadWindow = this.unloadWindow.bind(this);\r\n        this.nativeStorage = nativeStorageImpl;\r\n    }\r\n\r\n    /**\r\n     * Acquires tokens by opening a popup window to the /authorize endpoint of the authority\r\n     * @param request\r\n     */\r\n    acquireToken(request: PopupRequest): Promise<AuthenticationResult> {\r\n        try {\r\n            const popupName = this.generatePopupName(request.scopes || OIDC_DEFAULT_SCOPES, request.authority || this.config.auth.authority);\r\n            const popupWindowAttributes = request.popupWindowAttributes || {};\r\n\r\n            // asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.\r\n            if (this.config.system.asyncPopups) {\r\n                this.logger.verbose(\"asyncPopups set to true, acquiring token\");\r\n                // Passes on popup position and dimensions if in request\r\n                return this.acquireTokenPopupAsync(request, popupName, popupWindowAttributes);\r\n            } else {\r\n                // asyncPopups flag is set to false. Opens popup before acquiring token.\r\n                this.logger.verbose(\"asyncPopup set to false, opening popup before acquiring token\");\r\n                const popup = this.openSizedPopup(\"about:blank\", popupName, popupWindowAttributes);\r\n                return this.acquireTokenPopupAsync(request, popupName, popupWindowAttributes, popup);\r\n            }\r\n        } catch (e) {\r\n            return Promise.reject(e);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server\r\n     * @param logoutRequest\r\n     */\r\n    logout(logoutRequest?: EndSessionPopupRequest): Promise<void> {\r\n        try {\r\n            this.logger.verbose(\"logoutPopup called\");\r\n            const validLogoutRequest = this.initializeLogoutRequest(logoutRequest);\r\n\r\n            const popupName = this.generateLogoutPopupName(validLogoutRequest);\r\n            const authority = logoutRequest && logoutRequest.authority;\r\n            const mainWindowRedirectUri = logoutRequest && logoutRequest.mainWindowRedirectUri;\r\n            const popupWindowAttributes = logoutRequest?.popupWindowAttributes || {};\r\n\r\n            // asyncPopups flag is true. Acquires token without first opening popup. Popup will be opened later asynchronously.\r\n            if (this.config.system.asyncPopups) {\r\n                this.logger.verbose(\"asyncPopups set to true\");\r\n                // Passes on popup position and dimensions if in request\r\n                return this.logoutPopupAsync(validLogoutRequest, popupName, popupWindowAttributes, authority, undefined, mainWindowRedirectUri);\r\n            } else {\r\n                // asyncPopups flag is set to false. Opens popup before logging out.\r\n                this.logger.verbose(\"asyncPopup set to false, opening popup\");\r\n                const popup = this.openSizedPopup(\"about:blank\", popupName, popupWindowAttributes);\r\n                return this.logoutPopupAsync(validLogoutRequest, popupName, popupWindowAttributes, authority, popup, mainWindowRedirectUri);\r\n            }\r\n        } catch (e) {\r\n            // Since this function is synchronous we need to reject\r\n            return Promise.reject(e);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Helper which obtains an access_token for your API via opening a popup window in the user's browser\r\n     * @param validRequest\r\n     * @param popupName\r\n     * @param popup\r\n     * @param popupWindowAttributes\r\n     *\r\n     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n     */\r\n    protected async acquireTokenPopupAsync(request: PopupRequest, popupName: string, popupWindowAttributes: PopupWindowAttributes, popup?: Window|null): Promise<AuthenticationResult> {\r\n        this.logger.verbose(\"acquireTokenPopupAsync called\");\r\n        const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenPopup);\r\n\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, request.correlationId);\r\n        const validRequest = await this.initializeAuthorizationRequest(request, InteractionType.Popup);\r\n        this.browserStorage.updateCacheEntries(validRequest.state, validRequest.nonce, validRequest.authority, validRequest.loginHint || Constants.EMPTY_STRING, validRequest.account || null);\r\n\r\n        try {\r\n            // Create auth code request and generate PKCE params\r\n            this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientInitializeAuthorizationCodeRequest, request.correlationId);\r\n            const authCodeRequest: CommonAuthorizationCodeRequest = await this.initializeAuthorizationCodeRequest(validRequest);\r\n\r\n            // Initialize the client\r\n            this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, request.correlationId);\r\n            const authClient: AuthorizationCodeClient = await this.createAuthCodeClient(serverTelemetryManager, validRequest.authority, validRequest.azureCloudOptions);\r\n            this.logger.verbose(\"Auth code client created\");\r\n\r\n            const isNativeBroker = NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, request.authenticationScheme);\r\n            // Start measurement for server calls with native brokering enabled\r\n            let fetchNativeAccountIdMeasurement;\r\n            if (isNativeBroker) {\r\n                fetchNativeAccountIdMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.FetchAccountIdWithNativeBroker, request.correlationId);\r\n            }\r\n\r\n            // Create acquire token url.\r\n            const navigateUrl = await authClient.getAuthCodeUrl({\r\n                ...validRequest,\r\n                nativeBroker: isNativeBroker\r\n            });\r\n\r\n            // Create popup interaction handler.\r\n            const interactionHandler = new InteractionHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.performanceClient);\r\n\r\n            // Show the UI once the url has been created. Get the window handle for the popup.\r\n            const popupParameters: PopupParams = {\r\n                popup,\r\n                popupName,\r\n                popupWindowAttributes\r\n            };\r\n            const popupWindow: Window = this.initiateAuthRequest(navigateUrl, popupParameters);\r\n            this.eventHandler.emitEvent(EventType.POPUP_OPENED, InteractionType.Popup, {popupWindow}, null);\r\n\r\n            // Monitor the window for the hash. Return the string value and close the popup when the hash is received. Default timeout is 60 seconds.\r\n            const hash = await this.monitorPopupForHash(popupWindow);\r\n            // Deserialize hash fragment response parameters.\r\n            const serverParams: ServerAuthorizationCodeResponse = UrlString.getDeserializedHash(hash);\r\n            const state = this.validateAndExtractStateFromHash(serverParams, InteractionType.Popup, validRequest.correlationId);\r\n            // Remove throttle if it exists\r\n            ThrottlingUtils.removeThrottle(this.browserStorage, this.config.auth.clientId, authCodeRequest);\r\n\r\n            if (serverParams.accountId) {\r\n                this.logger.verbose(\"Account id found in hash, calling WAM for token\");\r\n                // end measurement for server call with native brokering enabled\r\n                if (fetchNativeAccountIdMeasurement) {\r\n                    fetchNativeAccountIdMeasurement.endMeasurement({\r\n                        success: true,\r\n                        isNativeBroker: true\r\n                    });\r\n                }\r\n\r\n                if (!this.nativeMessageHandler) {\r\n                    throw BrowserAuthError.createNativeConnectionNotEstablishedError();\r\n                }\r\n                const nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.acquireTokenPopup, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.nativeStorage, validRequest.correlationId);\r\n                const { userRequestState } = ProtocolUtils.parseRequestState(this.browserCrypto, state);\r\n                return nativeInteractionClient.acquireToken({\r\n                    ...validRequest,\r\n                    state: userRequestState,\r\n                    prompt: undefined // Server should handle the prompt, ideally native broker can do this part silently\r\n                }).finally(() => {\r\n                    this.browserStorage.cleanRequestByState(state);\r\n                });\r\n            }\r\n\r\n            // Handle response from hash string.\r\n            const result = await interactionHandler.handleCodeResponseFromHash(hash, state, authClient.authority, this.networkClient);\r\n\r\n            return result;\r\n        } catch (e) {\r\n            if (popup) {\r\n                // Close the synchronous popup if an error is thrown before the window unload event is registered\r\n                popup.close();\r\n            }\r\n\r\n            if (e instanceof AuthError) {\r\n                (e as AuthError).setCorrelationId(this.correlationId);\r\n            }\r\n\r\n            serverTelemetryManager.cacheFailedRequest(e);\r\n            this.browserStorage.cleanRequestByState(validRequest.state);\r\n            throw e;\r\n        }\r\n    }\r\n\r\n    /**\r\n     *\r\n     * @param validRequest\r\n     * @param popupName\r\n     * @param requestAuthority\r\n     * @param popup\r\n     * @param mainWindowRedirectUri\r\n     * @param popupWindowAttributes\r\n     */\r\n    protected async logoutPopupAsync(validRequest: CommonEndSessionRequest, popupName: string, popupWindowAttributes: PopupWindowAttributes, requestAuthority?: string, popup?: Window|null, mainWindowRedirectUri?: string): Promise<void> {\r\n        this.logger.verbose(\"logoutPopupAsync called\");\r\n        this.eventHandler.emitEvent(EventType.LOGOUT_START, InteractionType.Popup, validRequest);\r\n\r\n        const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.logoutPopup);\r\n\r\n        try {\r\n            // Clear cache on logout\r\n            await this.clearCacheOnLogout(validRequest.account);\r\n\r\n            // Initialize the client\r\n            this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, validRequest.correlationId);\r\n            const authClient = await this.createAuthCodeClient(serverTelemetryManager, requestAuthority);\r\n            this.logger.verbose(\"Auth code client created\");\r\n\r\n            // Create logout string and navigate user window to logout.\r\n            const logoutUri: string = authClient.getLogoutUri(validRequest);\r\n\r\n            this.eventHandler.emitEvent(EventType.LOGOUT_SUCCESS, InteractionType.Popup, validRequest);\r\n\r\n            // Open the popup window to requestUrl.\r\n            const popupWindow = this.openPopup(logoutUri, {popupName, popupWindowAttributes, popup});\r\n            this.eventHandler.emitEvent(EventType.POPUP_OPENED, InteractionType.Popup, {popupWindow}, null);\r\n\r\n            await this.waitForLogoutPopup(popupWindow);\r\n\r\n            if (mainWindowRedirectUri) {\r\n                const navigationOptions: NavigationOptions = {\r\n                    apiId: ApiId.logoutPopup,\r\n                    timeout: this.config.system.redirectNavigationTimeout,\r\n                    noHistory: false\r\n                };\r\n                const absoluteUrl = UrlString.getAbsoluteUrl(mainWindowRedirectUri, BrowserUtils.getCurrentUri());\r\n\r\n                this.logger.verbose(\"Redirecting main window to url specified in the request\");\r\n                this.logger.verbosePii(`Redirecting main window to: ${absoluteUrl}`);\r\n                this.navigationClient.navigateInternal(absoluteUrl, navigationOptions);\r\n            } else {\r\n                this.logger.verbose(\"No main window navigation requested\");\r\n            }\r\n        } catch (e) {\r\n            if (popup) {\r\n                // Close the synchronous popup if an error is thrown before the window unload event is registered\r\n                popup.close();\r\n            }\r\n\r\n            if (e instanceof AuthError) {\r\n                (e as AuthError).setCorrelationId(this.correlationId);\r\n            }\r\n\r\n            this.browserStorage.setInteractionInProgress(false);\r\n            this.eventHandler.emitEvent(EventType.LOGOUT_FAILURE, InteractionType.Popup, null, e);\r\n            this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Popup);\r\n            serverTelemetryManager.cacheFailedRequest(e);\r\n            throw e;\r\n        }\r\n\r\n        this.eventHandler.emitEvent(EventType.LOGOUT_END, InteractionType.Popup);\r\n    }\r\n\r\n    /**\r\n     * Opens a popup window with given request Url.\r\n     * @param requestUrl\r\n     */\r\n    initiateAuthRequest(requestUrl: string, params: PopupParams): Window {\r\n        // Check that request url is not empty.\r\n        if (!StringUtils.isEmpty(requestUrl)) {\r\n            this.logger.infoPii(`Navigate to: ${requestUrl}`);\r\n            // Open the popup window to requestUrl.\r\n            return this.openPopup(requestUrl, params);\r\n        } else {\r\n            // Throw error if request URL is empty.\r\n            this.logger.error(\"Navigate url is empty\");\r\n            throw BrowserAuthError.createEmptyNavigationUriError();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Monitors a window until it loads a url with the same origin.\r\n     * @param popupWindow - window that is being monitored\r\n     * @param timeout - timeout for processing hash once popup is redirected back to application\r\n     */\r\n    monitorPopupForHash(popupWindow: Window): Promise<string> {\r\n        return new Promise((resolve, reject) => {\r\n            /*\r\n             * Polling for popups needs to be tick-based,\r\n             * since a non-trivial amount of time can be spent on interaction (which should not count against the timeout).\r\n             */\r\n            const maxTicks = this.config.system.windowHashTimeout / this.config.system.pollIntervalMilliseconds;\r\n            let ticks = 0;\r\n\r\n            this.logger.verbose(\"PopupHandler.monitorPopupForHash - polling started\");\r\n\r\n            const intervalId = setInterval(() => {\r\n                // Window is closed\r\n                if (popupWindow.closed) {\r\n                    this.logger.error(\"PopupHandler.monitorPopupForHash - window closed\");\r\n                    this.cleanPopup();\r\n                    clearInterval(intervalId);\r\n                    reject(BrowserAuthError.createUserCancelledError());\r\n                    return;\r\n                }\r\n\r\n                let href: string = Constants.EMPTY_STRING;\r\n                let hash: string = Constants.EMPTY_STRING;\r\n                try {\r\n                    /*\r\n                     * Will throw if cross origin,\r\n                     * which should be caught and ignored\r\n                     * since we need the interval to keep running while on STS UI.\r\n                     */\r\n                    href = popupWindow.location.href;\r\n                    hash = popupWindow.location.hash;\r\n                } catch (e) {}\r\n\r\n                // Don't process blank pages or cross domain\r\n                if (StringUtils.isEmpty(href) || href === \"about:blank\") {\r\n                    return;\r\n                }\r\n\r\n                this.logger.verbose(\"PopupHandler.monitorPopupForHash - popup window is on same origin as caller\");\r\n\r\n                /*\r\n                 * Only run clock when we are on same domain for popups\r\n                 * as popup operations can take a long time.\r\n                 */\r\n                ticks++;\r\n\r\n                if (hash) {\r\n                    this.logger.verbose(\"PopupHandler.monitorPopupForHash - found hash in url\");\r\n                    clearInterval(intervalId);\r\n                    this.cleanPopup(popupWindow);\r\n\r\n                    if (UrlString.hashContainsKnownProperties(hash)) {\r\n                        this.logger.verbose(\"PopupHandler.monitorPopupForHash - hash contains known properties, returning.\");\r\n                        resolve(hash);\r\n                    } else {\r\n                        this.logger.error(\"PopupHandler.monitorPopupForHash - found hash in url but it does not contain known properties. Check that your router is not changing the hash prematurely.\");\r\n                        this.logger.errorPii(`PopupHandler.monitorPopupForHash - hash found: ${hash}`);\r\n                        reject(BrowserAuthError.createHashDoesNotContainKnownPropertiesError());\r\n                    }\r\n                } else if (ticks > maxTicks) {\r\n                    this.logger.error(\"PopupHandler.monitorPopupForHash - unable to find hash in url, timing out\");\r\n                    clearInterval(intervalId);\r\n                    reject(BrowserAuthError.createMonitorPopupTimeoutError());\r\n                }\r\n            }, this.config.system.pollIntervalMilliseconds);\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Waits for user interaction in logout popup window\r\n     * @param popupWindow\r\n     * @returns\r\n     */\r\n    waitForLogoutPopup(popupWindow: Window): Promise<void> {\r\n        return new Promise((resolve) => {\r\n            this.logger.verbose(\"PopupHandler.waitForLogoutPopup - polling started\");\r\n\r\n            const intervalId = setInterval(() => {\r\n                // Window is closed\r\n                if (popupWindow.closed) {\r\n                    this.logger.error(\"PopupHandler.waitForLogoutPopup - window closed\");\r\n                    this.cleanPopup();\r\n                    clearInterval(intervalId);\r\n                    resolve();\r\n                }\r\n\r\n                let href: string = Constants.EMPTY_STRING;\r\n                try {\r\n                    /*\r\n                     * Will throw if cross origin,\r\n                     * which should be caught and ignored\r\n                     * since we need the interval to keep running while on STS UI.\r\n                     */\r\n                    href = popupWindow.location.href;\r\n                } catch (e) {}\r\n\r\n                // Don't process blank pages or cross domain\r\n                if (StringUtils.isEmpty(href) || href === \"about:blank\") {\r\n                    return;\r\n                }\r\n\r\n                this.logger.verbose(\"PopupHandler.waitForLogoutPopup - popup window is on same origin as caller, closing.\");\r\n\r\n                clearInterval(intervalId);\r\n                this.cleanPopup(popupWindow);\r\n                resolve();\r\n            }, this.config.system.pollIntervalMilliseconds);\r\n        });\r\n    }\r\n\r\n    /**\r\n     * @hidden\r\n     *\r\n     * Configures popup window for login.\r\n     *\r\n     * @param urlNavigate\r\n     * @param title\r\n     * @param popUpWidth\r\n     * @param popUpHeight\r\n     * @param popupWindowAttributes\r\n     * @ignore\r\n     * @hidden\r\n     */\r\n    openPopup(urlNavigate: string, popupParams: PopupParams): Window {\r\n        try {\r\n            let popupWindow;\r\n            // Popup window passed in, setting url to navigate to\r\n            if (popupParams.popup) {\r\n                popupWindow = popupParams.popup;\r\n                this.logger.verbosePii(`Navigating popup window to: ${urlNavigate}`);\r\n                popupWindow.location.assign(urlNavigate);\r\n            } else if (typeof popupParams.popup === \"undefined\") {\r\n                // Popup will be undefined if it was not passed in\r\n                this.logger.verbosePii(`Opening popup window to: ${urlNavigate}`);\r\n                popupWindow = this.openSizedPopup(urlNavigate, popupParams.popupName, popupParams.popupWindowAttributes);\r\n            }\r\n\r\n            // Popup will be null if popups are blocked\r\n            if (!popupWindow) {\r\n                throw BrowserAuthError.createEmptyWindowCreatedError();\r\n            }\r\n            if (popupWindow.focus) {\r\n                popupWindow.focus();\r\n            }\r\n            this.currentWindow = popupWindow;\r\n            window.addEventListener(\"beforeunload\", this.unloadWindow);\r\n\r\n            return popupWindow;\r\n        } catch (e) {\r\n            this.logger.error(\"error opening popup \" + (e as AuthError).message);\r\n            this.browserStorage.setInteractionInProgress(false);\r\n            throw BrowserAuthError.createPopupWindowError((e as AuthError).toString());\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Helper function to set popup window dimensions and position\r\n     * @param urlNavigate\r\n     * @param popupName\r\n     * @param popupWindowAttributes\r\n     * @returns\r\n     */\r\n    openSizedPopup(urlNavigate: string, popupName: string, popupWindowAttributes: PopupWindowAttributes): Window|null {\r\n        /**\r\n         * adding winLeft and winTop to account for dual monitor\r\n         * using screenLeft and screenTop for IE8 and earlier\r\n         */\r\n        const winLeft = window.screenLeft ? window.screenLeft : window.screenX;\r\n        const winTop = window.screenTop ? window.screenTop : window.screenY;\r\n        /**\r\n         * window.innerWidth displays browser window\"s height and width excluding toolbars\r\n         * using document.documentElement.clientWidth for IE8 and earlier\r\n         */\r\n        const winWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;\r\n        const winHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;\r\n\r\n        let width = popupWindowAttributes.popupSize?.width;\r\n        let height = popupWindowAttributes.popupSize?.height;\r\n        let top = popupWindowAttributes.popupPosition?.top;\r\n        let left = popupWindowAttributes.popupPosition?.left;\r\n\r\n        if (!width || width < 0 || width > winWidth) {\r\n            this.logger.verbose(\"Default popup window width used. Window width not configured or invalid.\");\r\n            width = BrowserConstants.POPUP_WIDTH;\r\n        }\r\n\r\n        if (!height || height < 0 || height > winHeight) {\r\n            this.logger.verbose(\"Default popup window height used. Window height not configured or invalid.\");\r\n            height = BrowserConstants.POPUP_HEIGHT;\r\n        }\r\n\r\n        if (!top || top < 0 || top > winHeight) {\r\n            this.logger.verbose(\"Default popup window top position used. Window top not configured or invalid.\");\r\n            top = Math.max(0, ((winHeight / 2) - (BrowserConstants.POPUP_HEIGHT / 2)) + winTop);\r\n        }\r\n\r\n        if (!left || left < 0 || left > winWidth) {\r\n            this.logger.verbose(\"Default popup window left position used. Window left not configured or invalid.\");\r\n            left = Math.max(0, ((winWidth / 2) - (BrowserConstants.POPUP_WIDTH / 2)) + winLeft);\r\n        }\r\n\r\n        return window.open(urlNavigate, popupName, `width=${width}, height=${height}, top=${top}, left=${left}, scrollbars=yes`);\r\n    }\r\n\r\n    /**\r\n     * Event callback to unload main window.\r\n     */\r\n    unloadWindow(e: Event): void {\r\n        this.browserStorage.cleanRequestByInteractionType(InteractionType.Popup);\r\n        if (this.currentWindow) {\r\n            this.currentWindow.close();\r\n        }\r\n        // Guarantees browser unload will happen, so no other errors will be thrown.\r\n        e.preventDefault();\r\n    }\r\n\r\n    /**\r\n     * Closes popup, removes any state vars created during popup calls.\r\n     * @param popupWindow\r\n     */\r\n    cleanPopup(popupWindow?: Window): void {\r\n        if (popupWindow) {\r\n            // Close window.\r\n            popupWindow.close();\r\n        }\r\n        // Remove window unload function\r\n        window.removeEventListener(\"beforeunload\", this.unloadWindow);\r\n\r\n        // Interaction is completed - remove interaction status.\r\n        this.browserStorage.setInteractionInProgress(false);\r\n    }\r\n\r\n    /**\r\n     * Generates the name for the popup based on the client id and request\r\n     * @param clientId\r\n     * @param request\r\n     */\r\n    generatePopupName(scopes: Array<string>, authority: string): string {\r\n        return `${BrowserConstants.POPUP_NAME_PREFIX}.${this.config.auth.clientId}.${scopes.join(\"-\")}.${authority}.${this.correlationId}`;\r\n    }\r\n\r\n    /**\r\n     * Generates the name for the popup based on the client id and request for logouts\r\n     * @param clientId\r\n     * @param request\r\n     */\r\n    generateLogoutPopupName(request: CommonEndSessionRequest): string {\r\n        const homeAccountId = request.account && request.account.homeAccountId;\r\n        return `${BrowserConstants.POPUP_NAME_PREFIX}.${this.config.auth.clientId}.${homeAccountId}.${this.correlationId}`;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthError } from \"../error/AuthError\";\r\nimport { NetworkResponse } from \"./NetworkManager\";\r\n\r\n/**\r\n * Options allowed by network request APIs.\r\n */\r\nexport type NetworkRequestOptions = {\r\n    headers?: Record<string, string>,\r\n    body?: string;\r\n};\r\n\r\n/**\r\n * Client network interface to send backend requests.\r\n * @interface\r\n */\r\nexport interface INetworkModule {\r\n\r\n    /**\r\n     * Interface function for async network \"GET\" requests. Based on the Fetch standard: https://fetch.spec.whatwg.org/\r\n     * @param url\r\n     * @param requestParams\r\n     * @param enableCaching\r\n     */\r\n    sendGetRequestAsync<T>(url: string, options?: NetworkRequestOptions, cancellationToken?: number): Promise<NetworkResponse<T>>;\r\n\r\n    /**\r\n     * Interface function for async network \"POST\" requests. Based on the Fetch standard: https://fetch.spec.whatwg.org/\r\n     * @param url\r\n     * @param requestParams\r\n     * @param enableCaching\r\n     */\r\n    sendPostRequestAsync<T>(url: string, options?: NetworkRequestOptions): Promise<NetworkResponse<T>>;\r\n}\r\n\r\nexport const StubbedNetworkModule: INetworkModule = {\r\n    sendGetRequestAsync: () => {\r\n        const notImplErr = \"Network interface - sendGetRequestAsync() has not been implemented for the Network interface.\";\r\n        return Promise.reject(AuthError.createUnexpectedError(notImplErr));\r\n    },\r\n    sendPostRequestAsync: () => {\r\n        const notImplErr = \"Network interface - sendPostRequestAsync() has not been implemented for the Network interface.\";\r\n        return Promise.reject(AuthError.createUnexpectedError(notImplErr));\r\n    }\r\n};\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { INavigationClient } from \"./INavigationClient\";\r\nimport { NavigationOptions } from \"./NavigationOptions\";\r\n\r\nexport class NavigationClient implements INavigationClient {\r\n    /**\r\n     * Navigates to other pages within the same web application\r\n     * @param url \r\n     * @param options \r\n     */\r\n    navigateInternal(url: string, options: NavigationOptions): Promise<boolean>{\r\n        return NavigationClient.defaultNavigateWindow(url, options);\r\n    }\r\n\r\n    /**\r\n     * Navigates to other pages outside the web application i.e. the Identity Provider\r\n     * @param url \r\n     * @param options \r\n     */\r\n    navigateExternal(url: string, options: NavigationOptions): Promise<boolean> {\r\n        return NavigationClient.defaultNavigateWindow(url, options);\r\n    }\r\n\r\n    /**\r\n     * Default navigation implementation invoked by the internal and external functions\r\n     * @param url \r\n     * @param options \r\n     */\r\n    private static defaultNavigateWindow(url: string, options: NavigationOptions): Promise<boolean> {\r\n        if (options.noHistory) {\r\n            window.location.replace(url);\r\n        } else {\r\n            window.location.assign(url);\r\n        }\r\n\r\n        return new Promise((resolve) => {\r\n            setTimeout(() => {\r\n                resolve(true);\r\n            }, options.timeout);\r\n        });\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { SystemOptions, LoggerOptions, INetworkModule, DEFAULT_SYSTEM_OPTIONS, Constants, ProtocolMode, LogLevel, StubbedNetworkModule, AzureCloudInstance, AzureCloudOptions, ApplicationTelemetry } from \"@azure/msal-common\";\r\nimport { BrowserUtils } from \"../utils/BrowserUtils\";\r\nimport { BrowserCacheLocation, BrowserConstants } from \"../utils/BrowserConstants\";\r\nimport { INavigationClient } from \"../navigation/INavigationClient\";\r\nimport { NavigationClient } from \"../navigation/NavigationClient\";\r\n\r\n// Default timeout for popup windows and iframes in milliseconds\r\nexport const DEFAULT_POPUP_TIMEOUT_MS = 60000;\r\nexport const DEFAULT_IFRAME_TIMEOUT_MS = 6000;\r\nexport const DEFAULT_REDIRECT_TIMEOUT_MS = 30000;\r\nexport const DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS = 2000;\r\n\r\n/**\r\n * Use this to configure the auth options in the Configuration object\r\n */\r\nexport type BrowserAuthOptions = {\r\n    /**\r\n     * Client ID of your app registered with our Application registration portal : https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview in Microsoft Identity Platform\r\n     */\r\n    clientId: string;\r\n    /**\r\n     * You can configure a specific authority, defaults to \" \" or \"https://login.microsoftonline.com/common\"\r\n     */\r\n    authority?: string;\r\n    /**\r\n     * An array of URIs that are known to be valid. Used in B2C scenarios.\r\n     */\r\n    knownAuthorities?: Array<string>;\r\n    /**\r\n     * A string containing the cloud discovery response. Used in AAD scenarios.\r\n     */\r\n    cloudDiscoveryMetadata?: string;\r\n    /**\r\n     * A string containing the .well-known/openid-configuration endpoint response\r\n     */\r\n    authorityMetadata?: string;\r\n    /**\r\n     * The redirect URI where authentication responses can be received by your application. It must exactly match one of the redirect URIs registered in the Azure portal.\r\n     */\r\n    redirectUri?: string;\r\n    /**\r\n     * The redirect URI where the window navigates after a successful logout.\r\n     */\r\n    postLogoutRedirectUri?: string | null;\r\n    /**\r\n     * Boolean indicating whether to navigate to the original request URL after the auth server navigates to the redirect URL.\r\n     */\r\n    navigateToLoginRequestUrl?: boolean;\r\n    /**\r\n     * Array of capabilities which will be added to the claims.access_token.xms_cc request property on every network request.\r\n     */\r\n    clientCapabilities?: Array<string>;\r\n    /**\r\n     * Enum that represents the protocol that msal follows. Used for configuring proper endpoints.\r\n     */\r\n    protocolMode?: ProtocolMode;\r\n    /**\r\n     * Enum that represents the Azure Cloud to use.\r\n     */\r\n    azureCloudOptions?: AzureCloudOptions;\r\n    /**\r\n     * Flag of whether to use the local metadata cache\r\n     */\r\n    skipAuthorityMetadataCache?: boolean;\r\n};\r\n\r\n/**\r\n * Use this to configure the below cache configuration options:\r\n */\r\nexport type CacheOptions = {\r\n    /**\r\n     * Used to specify the cacheLocation user wants to set. Valid values are \"localStorage\", \"sessionStorage\" and \"memoryStorage\".\r\n     */\r\n    cacheLocation?: BrowserCacheLocation | string;\r\n    /**\r\n     * Used to specify the temporaryCacheLocation user wants to set. Valid values are \"localStorage\", \"sessionStorage\" and \"memoryStorage\".\r\n     */\r\n    temporaryCacheLocation?: BrowserCacheLocation | string;\r\n    /**\r\n     * If set, MSAL stores the auth request state required for validation of the auth flows in the browser cookies. By default this flag is set to false.\r\n     */\r\n    storeAuthStateInCookie?: boolean;\r\n    /**\r\n     * If set, MSAL sets the \"Secure\" flag on cookies so they can only be sent over HTTPS. By default this flag is set to false.\r\n     */\r\n    secureCookies?: boolean;\r\n    /**\r\n     * If set, MSAL will attempt to migrate cache entries from older versions on initialization. By default this flag is set to true if cacheLocation is localStorage, otherwise false.\r\n     */\r\n    cacheMigrationEnabled?: boolean;\r\n    /**\r\n     * Flag that determines whether access tokens are stored based on requested claims\r\n     */\r\n    claimsBasedCachingEnabled?: boolean;\r\n};\r\n\r\nexport type BrowserSystemOptions = SystemOptions & {\r\n    /**\r\n     * Used to initialize the Logger object (See ClientConfiguration.ts)\r\n     */\r\n    loggerOptions?: LoggerOptions;\r\n    /**\r\n     * Network interface implementation\r\n     */\r\n    networkClient?: INetworkModule;\r\n    /**\r\n     * Override the methods used to navigate to other webpages. Particularly useful if you are using a client-side router\r\n     */\r\n    navigationClient?: INavigationClient;\r\n    /**\r\n     * Sets the timeout for waiting for a response hash in a popup. Will take precedence over loadFrameTimeout if both are set.\r\n     */\r\n    windowHashTimeout?: number;\r\n    /**\r\n     * Sets the timeout for waiting for a response hash in an iframe. Will take precedence over loadFrameTimeout if both are set.\r\n     */\r\n    iframeHashTimeout?: number;\r\n    /**\r\n     * Sets the timeout for waiting for a response hash in an iframe or popup\r\n     */\r\n    loadFrameTimeout?: number;\r\n    /**\r\n     * Maximum time the library should wait for a frame to load\r\n     */\r\n    navigateFrameWait?: number;\r\n    /**\r\n     * Time to wait for redirection to occur before resolving promise\r\n     */\r\n    redirectNavigationTimeout?: number;\r\n    /**\r\n     * Sets whether popups are opened asynchronously. By default, this flag is set to false. When set to false, blank popups are opened before anything else happens. When set to true, popups are opened when making the network request.\r\n     */\r\n    asyncPopups?: boolean;\r\n    /**\r\n     * Flag to enable redirect opertaions when the app is rendered in an iframe (to support scenarios such as embedded B2C login).\r\n     */\r\n    allowRedirectInIframe?: boolean;\r\n    /**\r\n     * Flag to enable native broker support (e.g. acquiring tokens from WAM on Windows)\r\n     */\r\n    allowNativeBroker?: boolean;\r\n    /**\r\n     * Sets the timeout for waiting for the native broker handshake to resolve\r\n     */\r\n    nativeBrokerHandshakeTimeout?: number;\r\n    /**\r\n     * Options related to browser crypto APIs\r\n     */\r\n    cryptoOptions?: CryptoOptions;\r\n    /**\r\n     * Sets the interval length in milliseconds for polling the location attribute in popup windows (default is 30ms)\r\n     */\r\n    pollIntervalMilliseconds?: number;\r\n};\r\n\r\nexport type CryptoOptions = {\r\n\r\n    /**\r\n     * Enables the application to use the MSR Crypto interface, if available (and other interfaces are not)\r\n     * @type {?boolean}\r\n     */\r\n    useMsrCrypto?: boolean;\r\n\r\n    /**\r\n     * Entropy to seed browser crypto API (needed for MSR Crypto). Must be cryptographically strong random numbers (e.g. crypto.randomBytes(48) from Node)\r\n     * @type {?Uint8Array}\r\n     */\r\n    entropy?: Uint8Array;\r\n};\r\n\r\n/**\r\n * Telemetry Options\r\n */\r\nexport type BrowserTelemetryOptions = {\r\n    /**\r\n     * Telemetry information sent on request\r\n     * - appName: Unique string name of an application\r\n     * - appVersion: Version of the application using MSAL\r\n     */\r\n    application?: ApplicationTelemetry;\r\n};\r\n\r\n/**\r\n * This object allows you to configure important elements of MSAL functionality and is passed into the constructor of PublicClientApplication\r\n */\r\nexport type Configuration = {\r\n    /**\r\n     * This is where you configure auth elements like clientID, authority used for authenticating against the Microsoft Identity Platform\r\n     */\r\n    auth: BrowserAuthOptions,\r\n    /**\r\n     * This is where you configure cache location and whether to store cache in cookies\r\n     */\r\n    cache?: CacheOptions,\r\n    /**\r\n     * This is where you can configure the network client, logger, token renewal offset\r\n     */\r\n    system?: BrowserSystemOptions,\r\n    /**\r\n     * This is where you can configure telemetry data and options\r\n     */\r\n    telemetry?: BrowserTelemetryOptions\r\n};\r\n\r\nexport type BrowserConfiguration = {\r\n    auth: Required<BrowserAuthOptions>,\r\n    cache: Required<CacheOptions>,\r\n    system: Required<BrowserSystemOptions>,\r\n    telemetry: Required<BrowserTelemetryOptions>\r\n};\r\n\r\n/**\r\n * MSAL function that sets the default options when not explicitly configured from app developer\r\n *\r\n * @param auth\r\n * @param cache\r\n * @param system\r\n *\r\n * @returns Configuration object\r\n */\r\nexport function buildConfiguration({ auth: userInputAuth, cache: userInputCache, system: userInputSystem, telemetry: userInputTelemetry }: Configuration, isBrowserEnvironment: boolean): BrowserConfiguration {\r\n\r\n    // Default auth options for browser\r\n    const DEFAULT_AUTH_OPTIONS: Required<BrowserAuthOptions> = {\r\n        clientId: Constants.EMPTY_STRING,\r\n        authority: `${Constants.DEFAULT_AUTHORITY}`,\r\n        knownAuthorities: [],\r\n        cloudDiscoveryMetadata: Constants.EMPTY_STRING,\r\n        authorityMetadata: Constants.EMPTY_STRING,\r\n        redirectUri: Constants.EMPTY_STRING,\r\n        postLogoutRedirectUri: Constants.EMPTY_STRING,\r\n        navigateToLoginRequestUrl: true,\r\n        clientCapabilities: [],\r\n        protocolMode: ProtocolMode.AAD,\r\n        azureCloudOptions: {\r\n            azureCloudInstance: AzureCloudInstance.None,\r\n            tenant: Constants.EMPTY_STRING\r\n        },\r\n        skipAuthorityMetadataCache: false,  \r\n    };\r\n\r\n    // Default cache options for browser\r\n    const DEFAULT_CACHE_OPTIONS: Required<CacheOptions> = {\r\n        cacheLocation: BrowserCacheLocation.SessionStorage,\r\n        temporaryCacheLocation: BrowserCacheLocation.SessionStorage,\r\n        storeAuthStateInCookie: false,\r\n        secureCookies: false,\r\n        // Default cache migration to true if cache location is localStorage since entries are preserved across tabs/windows. Migration has little to no benefit in sessionStorage and memoryStorage\r\n        cacheMigrationEnabled: userInputCache && userInputCache.cacheLocation === BrowserCacheLocation.LocalStorage ? true : false,\r\n        claimsBasedCachingEnabled: true\r\n    };\r\n\r\n    // Default logger options for browser\r\n    const DEFAULT_LOGGER_OPTIONS: LoggerOptions = {\r\n        // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n        loggerCallback: (): void => {\r\n            // allow users to not set logger call back \r\n        },\r\n        logLevel: LogLevel.Info,\r\n        piiLoggingEnabled: false\r\n    };\r\n\r\n    // Default system options for browser\r\n    const DEFAULT_BROWSER_SYSTEM_OPTIONS: Required<BrowserSystemOptions> = {\r\n        ...DEFAULT_SYSTEM_OPTIONS,\r\n        loggerOptions: DEFAULT_LOGGER_OPTIONS,\r\n        networkClient: isBrowserEnvironment ? BrowserUtils.getBrowserNetworkClient() : StubbedNetworkModule,\r\n        navigationClient: new NavigationClient(),\r\n        loadFrameTimeout: 0,\r\n        // If loadFrameTimeout is provided, use that as default.\r\n        windowHashTimeout: userInputSystem?.loadFrameTimeout || DEFAULT_POPUP_TIMEOUT_MS,\r\n        iframeHashTimeout: userInputSystem?.loadFrameTimeout || DEFAULT_IFRAME_TIMEOUT_MS,\r\n        navigateFrameWait: isBrowserEnvironment && BrowserUtils.detectIEOrEdge() ? 500 : 0,\r\n        redirectNavigationTimeout: DEFAULT_REDIRECT_TIMEOUT_MS,\r\n        asyncPopups: false,\r\n        allowRedirectInIframe: false,\r\n        allowNativeBroker: false,\r\n        nativeBrokerHandshakeTimeout: userInputSystem?.nativeBrokerHandshakeTimeout || DEFAULT_NATIVE_BROKER_HANDSHAKE_TIMEOUT_MS,\r\n        pollIntervalMilliseconds: BrowserConstants.DEFAULT_POLL_INTERVAL_MS,\r\n        cryptoOptions: {\r\n            useMsrCrypto: false,\r\n            entropy: undefined\r\n        }\r\n    };\r\n\r\n    const providedSystemOptions: BrowserSystemOptions = {\r\n        ...userInputSystem,\r\n        loggerOptions: userInputSystem?.loggerOptions || DEFAULT_LOGGER_OPTIONS\r\n    };\r\n\r\n    const DEFAULT_TELEMETRY_OPTIONS: Required<BrowserTelemetryOptions> = {\r\n        application: {\r\n            appName: Constants.EMPTY_STRING,\r\n            appVersion: Constants.EMPTY_STRING\r\n        }\r\n    };\r\n\r\n    const overlayedConfig: BrowserConfiguration = {\r\n        auth: { ...DEFAULT_AUTH_OPTIONS, ...userInputAuth },\r\n        cache: { ...DEFAULT_CACHE_OPTIONS, ...userInputCache },\r\n        system: { ...DEFAULT_BROWSER_SYSTEM_OPTIONS, ...providedSystemOptions },\r\n        telemetry: { ...DEFAULT_TELEMETRY_OPTIONS, ...userInputTelemetry }\r\n    };\r\n    return overlayedConfig;\r\n}\r\n\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { UrlString, StringUtils, CommonAuthorizationCodeRequest, AuthorizationCodeClient, Constants, Logger, IPerformanceClient, PerformanceEvents } from \"@azure/msal-common\";\r\nimport { InteractionHandler } from \"./InteractionHandler\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { BrowserCacheManager } from \"../cache/BrowserCacheManager\";\r\nimport { BrowserSystemOptions, DEFAULT_IFRAME_TIMEOUT_MS } from \"../config/Configuration\";\r\n\r\nexport class SilentHandler extends InteractionHandler {\r\n\r\n    private navigateFrameWait: number;\r\n    private pollIntervalMilliseconds: number;\r\n\r\n    constructor(authCodeModule: AuthorizationCodeClient, storageImpl: BrowserCacheManager, authCodeRequest: CommonAuthorizationCodeRequest, logger: Logger, systemOptions: Required<Pick<BrowserSystemOptions, \"navigateFrameWait\" | \"pollIntervalMilliseconds\">>, performanceClient: IPerformanceClient) {\r\n        super(authCodeModule, storageImpl, authCodeRequest, logger, performanceClient);\r\n        this.navigateFrameWait = systemOptions.navigateFrameWait;\r\n        this.pollIntervalMilliseconds = systemOptions.pollIntervalMilliseconds;\r\n    }\r\n\r\n    /**\r\n     * Creates a hidden iframe to given URL using user-requested scopes as an id.\r\n     * @param urlNavigate\r\n     * @param userRequestScopes\r\n     */\r\n    async initiateAuthRequest(requestUrl: string): Promise<HTMLIFrameElement> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerInitiateAuthRequest, this.authCodeRequest.correlationId);\r\n\r\n        if (StringUtils.isEmpty(requestUrl)) {\r\n            // Throw error if request URL is empty.\r\n            this.logger.info(\"Navigate url is empty\");\r\n            throw BrowserAuthError.createEmptyNavigationUriError();\r\n        }\r\n\r\n        if (this.navigateFrameWait) {\r\n            this.performanceClient.setPreQueueTime(PerformanceEvents.SilentHandlerLoadFrame, this.authCodeRequest.correlationId);\r\n            return await this.loadFrame(requestUrl);\r\n        }\r\n        return this.loadFrameSync(requestUrl);\r\n    }\r\n\r\n    /**\r\n     * Monitors an iframe content window until it loads a url with a known hash, or hits a specified timeout.\r\n     * @param iframe\r\n     * @param timeout\r\n     */\r\n    monitorIframeForHash(iframe: HTMLIFrameElement, timeout: number): Promise<string> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerMonitorIframeForHash, this.authCodeRequest.correlationId);\r\n\r\n        return new Promise((resolve, reject) => {\r\n            if (timeout < DEFAULT_IFRAME_TIMEOUT_MS) {\r\n                this.logger.warning(`system.loadFrameTimeout or system.iframeHashTimeout set to lower (${timeout}ms) than the default (${DEFAULT_IFRAME_TIMEOUT_MS}ms). This may result in timeouts.`);\r\n            }\r\n\r\n            /*\r\n             * Polling for iframes can be purely timing based,\r\n             * since we don't need to account for interaction.\r\n             */\r\n            const nowMark = window.performance.now();\r\n            const timeoutMark = nowMark + timeout;\r\n\r\n            const intervalId = setInterval(() => {\r\n                if (window.performance.now() > timeoutMark) {\r\n                    this.removeHiddenIframe(iframe);\r\n                    clearInterval(intervalId);\r\n                    reject(BrowserAuthError.createMonitorIframeTimeoutError());\r\n                    return;\r\n                }\r\n\r\n                let href: string = Constants.EMPTY_STRING;\r\n                const contentWindow = iframe.contentWindow;\r\n                try {\r\n                    /*\r\n                     * Will throw if cross origin,\r\n                     * which should be caught and ignored\r\n                     * since we need the interval to keep running while on STS UI.\r\n                     */\r\n                    href = contentWindow ? contentWindow.location.href : Constants.EMPTY_STRING;\r\n                } catch (e) {}\r\n\r\n                if (StringUtils.isEmpty(href)) {\r\n                    return;\r\n                }\r\n\r\n                const contentHash = contentWindow ? contentWindow.location.hash: Constants.EMPTY_STRING;\r\n                if (UrlString.hashContainsKnownProperties(contentHash)) {\r\n                    // Success case\r\n                    this.removeHiddenIframe(iframe);\r\n                    clearInterval(intervalId);\r\n                    resolve(contentHash);\r\n                    return;\r\n                }\r\n            }, this.pollIntervalMilliseconds);\r\n        });\r\n    }\r\n\r\n    /**\r\n     * @hidden\r\n     * Loads iframe with authorization endpoint URL\r\n     * @ignore\r\n     */\r\n    private loadFrame(urlNavigate: string): Promise<HTMLIFrameElement> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentHandlerLoadFrame, this.authCodeRequest.correlationId);\r\n\r\n        /*\r\n         * This trick overcomes iframe navigation in IE\r\n         * IE does not load the page consistently in iframe\r\n         */\r\n\r\n        return new Promise((resolve, reject) => {\r\n            const frameHandle = this.createHiddenIframe();\r\n\r\n            setTimeout(() => {\r\n                if (!frameHandle) {\r\n                    reject(\"Unable to load iframe\");\r\n                    return;\r\n                }\r\n\r\n                frameHandle.src = urlNavigate;\r\n\r\n                resolve(frameHandle);\r\n            }, this.navigateFrameWait);\r\n        });\r\n    }\r\n\r\n    /**\r\n     * @hidden\r\n     * Loads the iframe synchronously when the navigateTimeFrame is set to `0`\r\n     * @param urlNavigate\r\n     * @param frameName\r\n     * @param logger\r\n     */\r\n    private loadFrameSync(urlNavigate: string): HTMLIFrameElement{\r\n        const frameHandle = this.createHiddenIframe();\r\n\r\n        frameHandle.src = urlNavigate;\r\n\r\n        return frameHandle;\r\n    }\r\n\r\n    /**\r\n     * @hidden\r\n     * Creates a new hidden iframe or gets an existing one for silent token renewal.\r\n     * @ignore\r\n     */\r\n    private createHiddenIframe(): HTMLIFrameElement {\r\n        const authFrame = document.createElement(\"iframe\");\r\n\r\n        authFrame.className = \"msalSilentIframe\";\r\n        authFrame.style.visibility = \"hidden\";\r\n        authFrame.style.position = \"absolute\";\r\n        authFrame.style.width = authFrame.style.height = \"0\";\r\n        authFrame.style.border = \"0\";\r\n        authFrame.setAttribute(\"sandbox\", \"allow-scripts allow-same-origin allow-forms\");\r\n        document.getElementsByTagName(\"body\")[0].appendChild(authFrame);\r\n\r\n        return authFrame;\r\n    }\r\n\r\n    /**\r\n     * @hidden\r\n     * Removes a hidden iframe from the page.\r\n     * @ignore\r\n     */\r\n    private removeHiddenIframe(iframe: HTMLIFrameElement): void {\r\n        if (document.body === iframe.parentNode) {\r\n            document.body.removeChild(iframe);\r\n        }\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthenticationResult, ICrypto, Logger, StringUtils, PromptValue, CommonAuthorizationCodeRequest, AuthorizationCodeClient, AuthError, Constants, UrlString, ServerAuthorizationCodeResponse, ProtocolUtils, IPerformanceClient, PerformanceEvents } from \"@azure/msal-common\";\r\nimport { StandardInteractionClient } from \"./StandardInteractionClient\";\r\nimport { AuthorizationUrlRequest } from \"../request/AuthorizationUrlRequest\";\r\nimport { BrowserConfiguration } from \"../config/Configuration\";\r\nimport { BrowserCacheManager } from \"../cache/BrowserCacheManager\";\r\nimport { EventHandler } from \"../event/EventHandler\";\r\nimport { INavigationClient } from \"../navigation/INavigationClient\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { InteractionType, ApiId } from \"../utils/BrowserConstants\";\r\nimport { SilentHandler } from \"../interaction_handler/SilentHandler\";\r\nimport { SsoSilentRequest } from \"../request/SsoSilentRequest\";\r\nimport { NativeMessageHandler } from \"../broker/nativeBroker/NativeMessageHandler\";\r\nimport { NativeInteractionClient } from \"./NativeInteractionClient\";\r\n\r\nexport class SilentIframeClient extends StandardInteractionClient {\r\n    protected apiId: ApiId;\r\n    protected nativeStorage: BrowserCacheManager;\r\n\r\n    constructor(config: BrowserConfiguration, storageImpl: BrowserCacheManager, browserCrypto: ICrypto, logger: Logger, eventHandler: EventHandler, navigationClient: INavigationClient, apiId: ApiId, performanceClient: IPerformanceClient, nativeStorageImpl: BrowserCacheManager, nativeMessageHandler?: NativeMessageHandler, correlationId?: string) {\r\n        super(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId);\r\n        this.apiId = apiId;\r\n        this.nativeStorage = nativeStorageImpl;\r\n    }\r\n\r\n    /**\r\n     * Acquires a token silently by opening a hidden iframe to the /authorize endpoint with prompt=none or prompt=no_session\r\n     * @param request\r\n     */\r\n    async acquireToken(request: SsoSilentRequest): Promise<AuthenticationResult> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentIframeClientAcquireToken, request.correlationId);\r\n        this.logger.verbose(\"acquireTokenByIframe called\");\r\n        const acquireTokenMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.SilentIframeClientAcquireToken, request.correlationId);\r\n        // Check that we have some SSO data\r\n        if (StringUtils.isEmpty(request.loginHint) && StringUtils.isEmpty(request.sid) && (!request.account || StringUtils.isEmpty(request.account.username))) {\r\n            this.logger.warning(\"No user hint provided. The authorization server may need more information to complete this request.\");\r\n        }\r\n\r\n        // Check that prompt is set to none or no_session, throw error if it is set to anything else.\r\n        if (request.prompt && (request.prompt !== PromptValue.NONE) && (request.prompt !== PromptValue.NO_SESSION)) {\r\n            acquireTokenMeasurement.endMeasurement({\r\n                success: false\r\n            });\r\n            throw BrowserAuthError.createSilentPromptValueError(request.prompt);\r\n        }\r\n\r\n        // Create silent request\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, request.correlationId);\r\n        const silentRequest: AuthorizationUrlRequest = await this.initializeAuthorizationRequest({\r\n            ...request,\r\n            prompt: request.prompt || PromptValue.NONE\r\n        }, InteractionType.Silent);\r\n        this.browserStorage.updateCacheEntries(silentRequest.state, silentRequest.nonce, silentRequest.authority, silentRequest.loginHint || Constants.EMPTY_STRING, silentRequest.account || null);\r\n\r\n        const serverTelemetryManager = this.initializeServerTelemetryManager(this.apiId);\r\n\r\n        try {\r\n            // Initialize the client\r\n            this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientCreateAuthCodeClient, request.correlationId);\r\n            const authClient: AuthorizationCodeClient = await this.createAuthCodeClient(serverTelemetryManager, silentRequest.authority, silentRequest.azureCloudOptions);\r\n            this.logger.verbose(\"Auth code client created\");\r\n\r\n            this.performanceClient.setPreQueueTime(PerformanceEvents.SilentIframeClientTokenHelper, request.correlationId);\r\n            return await this.silentTokenHelper(authClient, silentRequest).then((result: AuthenticationResult) => {\r\n                acquireTokenMeasurement.endMeasurement({\r\n                    success: true,\r\n                    fromCache: false,\r\n                    requestId: result.requestId\r\n                });\r\n                return result;\r\n            });\r\n        } catch (e) {\r\n            if (e instanceof AuthError) {\r\n                (e as AuthError).setCorrelationId(this.correlationId);\r\n            }\r\n            serverTelemetryManager.cacheFailedRequest(e);\r\n            this.browserStorage.cleanRequestByState(silentRequest.state);\r\n            acquireTokenMeasurement.endMeasurement({\r\n                errorCode: e instanceof AuthError && e.errorCode || undefined,\r\n                subErrorCode: e instanceof AuthError && e.subError || undefined,\r\n                success: false\r\n            });\r\n            throw e;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Currently Unsupported\r\n     */\r\n    logout(): Promise<void> {\r\n        // Synchronous so we must reject\r\n        return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());\r\n    }\r\n\r\n    /**\r\n     * Helper which acquires an authorization code silently using a hidden iframe from given url\r\n     * using the scopes requested as part of the id, and exchanges the code for a set of OAuth tokens.\r\n     * @param navigateUrl\r\n     * @param userRequestScopes\r\n     */\r\n    protected async silentTokenHelper(authClient: AuthorizationCodeClient, silentRequest: AuthorizationUrlRequest): Promise<AuthenticationResult> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentIframeClientTokenHelper, silentRequest.correlationId);\r\n\r\n        // Create auth code request and generate PKCE params\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientInitializeAuthorizationCodeRequest, silentRequest.correlationId);\r\n        const authCodeRequest: CommonAuthorizationCodeRequest = await this.initializeAuthorizationCodeRequest(silentRequest);\r\n        // Create authorize request url\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.GetAuthCodeUrl, silentRequest.correlationId);\r\n        const navigateUrl = await authClient.getAuthCodeUrl({\r\n            ...silentRequest,\r\n            nativeBroker: NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeMessageHandler, silentRequest.authenticationScheme)\r\n        });\r\n\r\n        // Create silent handler\r\n        const silentHandler = new SilentHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.config.system, this.performanceClient);\r\n        // Get the frame handle for the silent request\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.SilentHandlerInitiateAuthRequest, silentRequest.correlationId);\r\n        const msalFrame = await silentHandler.initiateAuthRequest(navigateUrl);\r\n        // Monitor the window for the hash. Return the string value and close the popup when the hash is received. Default timeout is 60 seconds.\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.SilentHandlerMonitorIframeForHash, silentRequest.correlationId);\r\n        const hash = await silentHandler.monitorIframeForHash(msalFrame, this.config.system.iframeHashTimeout);\r\n        // Deserialize hash fragment response parameters.\r\n        const serverParams: ServerAuthorizationCodeResponse = UrlString.getDeserializedHash(hash);\r\n        const state = this.validateAndExtractStateFromHash(serverParams, InteractionType.Silent, authCodeRequest.correlationId);\r\n\r\n        if (serverParams.accountId) {\r\n            this.logger.verbose(\"Account id found in hash, calling WAM for token\");\r\n            if (!this.nativeMessageHandler) {\r\n                throw BrowserAuthError.createNativeConnectionNotEstablishedError();\r\n            }\r\n            const nativeInteractionClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.apiId, this.performanceClient, this.nativeMessageHandler, serverParams.accountId, this.browserStorage, this.correlationId);\r\n            const { userRequestState } = ProtocolUtils.parseRequestState(this.browserCrypto, state);\r\n            return nativeInteractionClient.acquireToken({\r\n                ...silentRequest,\r\n                state: userRequestState,\r\n                prompt: silentRequest.prompt || PromptValue.NONE\r\n            }).finally(() => {\r\n                this.browserStorage.cleanRequestByState(state);\r\n            });\r\n        }\r\n\r\n        // Handle response from hash string\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.HandleCodeResponseFromHash, silentRequest.correlationId);\r\n        return silentHandler.handleCodeResponseFromHash(hash, state, authClient.authority, this.networkClient);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { StandardInteractionClient } from \"./StandardInteractionClient\";\r\nimport { CommonSilentFlowRequest, AuthenticationResult, ServerTelemetryManager, RefreshTokenClient, AuthError, AzureCloudOptions, PerformanceEvents } from \"@azure/msal-common\";\r\nimport { ApiId } from \"../utils/BrowserConstants\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\n\r\nexport class SilentRefreshClient extends StandardInteractionClient {\r\n    /**\r\n     * Exchanges the refresh token for new tokens\r\n     * @param request\r\n     */\r\n    async acquireToken(request: CommonSilentFlowRequest): Promise<AuthenticationResult> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.SilentRefreshClientAcquireToken, request.correlationId);\r\n\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.InitializeBaseRequest, request.correlationId);\r\n        const silentRequest: CommonSilentFlowRequest = {\r\n            ...request,\r\n            ...await this.initializeBaseRequest(request, request.account)\r\n        };\r\n        const acquireTokenMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.SilentRefreshClientAcquireToken, silentRequest.correlationId);\r\n        const serverTelemetryManager = this.initializeServerTelemetryManager(ApiId.acquireTokenSilent_silentFlow);\r\n\r\n        const refreshTokenClient = await this.createRefreshTokenClient(serverTelemetryManager, silentRequest.authority, silentRequest.azureCloudOptions);\r\n        this.logger.verbose(\"Refresh token client created\");\r\n        // Send request to renew token. Auth module will throw errors if token cannot be renewed.\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.RefreshTokenClientAcquireTokenByRefreshToken, request.correlationId);\r\n        return refreshTokenClient.acquireTokenByRefreshToken(silentRequest)\r\n            .then((result: AuthenticationResult) => {\r\n                acquireTokenMeasurement.endMeasurement({\r\n                    success: true,\r\n                    fromCache: result.fromCache,\r\n                    requestId: result.requestId\r\n                });\r\n\r\n                return result;\r\n            })\r\n            .catch((e: AuthError) => {\r\n                if (e instanceof AuthError) {\r\n                    (e as AuthError).setCorrelationId(this.correlationId);\r\n                }\r\n                serverTelemetryManager.cacheFailedRequest(e);\r\n                acquireTokenMeasurement.endMeasurement({\r\n                    errorCode: e.errorCode,\r\n                    subErrorCode: e.subError,\r\n                    success: false\r\n                });\r\n                throw e;\r\n            });\r\n    }\r\n\r\n    /**\r\n     * Currently Unsupported\r\n     */\r\n    logout(): Promise<void> {\r\n        // Synchronous so we must reject\r\n        return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());\r\n    }\r\n\r\n    /**\r\n     * Creates a Refresh Client with the given authority, or the default authority.\r\n     * @param serverTelemetryManager\r\n     * @param authorityUrl\r\n     */\r\n    protected async createRefreshTokenClient(serverTelemetryManager: ServerTelemetryManager, authorityUrl?: string, azureCloudOptions?: AzureCloudOptions): Promise<RefreshTokenClient> {\r\n        // Create auth module.\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientGetClientConfiguration, this.correlationId);\r\n        const clientConfig = await this.getClientConfiguration(serverTelemetryManager, authorityUrl, azureCloudOptions);\r\n        return new RefreshTokenClient(clientConfig, this.performanceClient);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ICrypto, Logger, AccountEntity, CacheManager } from \"@azure/msal-common\";\r\nimport { InteractionType } from \"../utils/BrowserConstants\";\r\nimport { EventCallbackFunction, EventError, EventMessage, EventPayload } from \"./EventMessage\";\r\nimport { EventType } from \"./EventType\";\r\n\r\nexport class EventHandler {\r\n    // Callback for subscribing to events\r\n    private eventCallbacks: Map<string, EventCallbackFunction>;\r\n    private logger: Logger;\r\n    private browserCrypto: ICrypto;\r\n    private listeningToStorageEvents: boolean;\r\n\r\n    constructor(logger: Logger, browserCrypto: ICrypto) {\r\n        this.eventCallbacks = new Map();\r\n        this.logger = logger;\r\n        this.browserCrypto = browserCrypto;\r\n        this.listeningToStorageEvents = false;\r\n        this.handleAccountCacheChange = this.handleAccountCacheChange.bind(this);\r\n    }\r\n\r\n    /**\r\n     * Adds event callbacks to array\r\n     * @param callback\r\n     */\r\n    addEventCallback(callback: EventCallbackFunction): string | null {\r\n        if (typeof window !== \"undefined\") {\r\n            const callbackId = this.browserCrypto.createNewGuid();\r\n            this.eventCallbacks.set(callbackId, callback);\r\n            this.logger.verbose(`Event callback registered with id: ${callbackId}`);\r\n    \r\n            return callbackId;\r\n        }\r\n        \r\n        return null;\r\n    }\r\n\r\n    /**\r\n     * Removes callback with provided id from callback array\r\n     * @param callbackId\r\n     */\r\n    removeEventCallback(callbackId: string): void {\r\n        this.eventCallbacks.delete(callbackId);\r\n        this.logger.verbose(`Event callback ${callbackId} removed.`);\r\n    }\r\n\r\n    /**\r\n     * Adds event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window\r\n     */\r\n    enableAccountStorageEvents(): void {\r\n        if (typeof window === \"undefined\") {\r\n            return;\r\n        }\r\n\r\n        if (!this.listeningToStorageEvents) {\r\n            this.logger.verbose(\"Adding account storage listener.\");\r\n            this.listeningToStorageEvents = true;\r\n            window.addEventListener(\"storage\", this.handleAccountCacheChange);\r\n        } else {\r\n            this.logger.verbose(\"Account storage listener already registered.\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Removes event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window\r\n     */\r\n    disableAccountStorageEvents(): void {\r\n        if (typeof window === \"undefined\") {\r\n            return;\r\n        }\r\n\r\n        if (this.listeningToStorageEvents) {\r\n            this.logger.verbose(\"Removing account storage listener.\");\r\n            window.removeEventListener(\"storage\", this.handleAccountCacheChange);\r\n            this.listeningToStorageEvents = false;\r\n        } else {\r\n            this.logger.verbose(\"No account storage listener registered.\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Emits events by calling callback with event message\r\n     * @param eventType\r\n     * @param interactionType\r\n     * @param payload\r\n     * @param error\r\n     */\r\n    emitEvent(eventType: EventType, interactionType?: InteractionType, payload?: EventPayload, error?: EventError): void {\r\n        if (typeof window !== \"undefined\") {\r\n            const message: EventMessage = {\r\n                eventType: eventType,\r\n                interactionType: interactionType || null,\r\n                payload: payload || null,\r\n                error: error || null,\r\n                timestamp: Date.now()\r\n            };\r\n\r\n            this.logger.info(`Emitting event: ${eventType}`);\r\n\r\n            this.eventCallbacks.forEach((callback: EventCallbackFunction, callbackId: string) => {\r\n                this.logger.verbose(`Emitting event to callback ${callbackId}: ${eventType}`);\r\n                callback.apply(null, [message]);\r\n            });\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Emit account added/removed events when cached accounts are changed in a different tab or frame\r\n     */\r\n    private handleAccountCacheChange(e: StorageEvent): void {\r\n        try {\r\n            const cacheValue = e.newValue || e.oldValue;\r\n            if (!cacheValue) {\r\n                return;\r\n            }\r\n            const parsedValue = JSON.parse(cacheValue);\r\n            if (typeof parsedValue !== \"object\" || !AccountEntity.isAccountEntity(parsedValue)) {\r\n                return;\r\n            }\r\n            const accountEntity = CacheManager.toObject<AccountEntity>(new AccountEntity(), parsedValue);\r\n            const accountInfo = accountEntity.getAccountInfo();\r\n            if (!e.oldValue && e.newValue) {\r\n                this.logger.info(\"Account was added to cache in a different window\");\r\n                this.emitEvent(EventType.ACCOUNT_ADDED, undefined, accountInfo);\r\n            } else if (!e.newValue && e.oldValue) {\r\n                this.logger.info(\"Account was removed from cache in a different window\");\r\n                this.emitEvent(EventType.ACCOUNT_REMOVED, undefined, accountInfo);\r\n            }\r\n        } catch (e) {\r\n            return;\r\n        }\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthError } from \"./AuthError\";\r\n\r\n/**\r\n * ClientAuthErrorMessage class containing string constants used by error codes and messages.\r\n */\r\nexport const JoseHeaderErrorMessage = {\r\n    missingKidError: {\r\n        code: \"missing_kid_error\",\r\n        desc: \"The JOSE Header for the requested JWT, JWS or JWK object requires a keyId to be configured as the 'kid' header claim. No 'kid' value was provided.\"\r\n    },\r\n    missingAlgError: {\r\n        code: \"missing_alg_error\",\r\n        desc: \"The JOSE Header for the requested JWT, JWS or JWK object requires an algorithm to be specified as the 'alg' header claim. No 'alg' value was provided.\"\r\n    },\r\n};\r\n\r\n/**\r\n * Error thrown when there is an error in the client code running on the browser.\r\n */\r\nexport class JoseHeaderError extends AuthError {\r\n    constructor(errorCode: string, errorMessage?: string) {\r\n        super(errorCode, errorMessage);\r\n        this.name = \"JoseHeaderError\";\r\n\r\n        Object.setPrototypeOf(this, JoseHeaderError.prototype);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when keyId isn't set on JOSE header.\r\n     */\r\n    static createMissingKidError(): JoseHeaderError {\r\n        return new JoseHeaderError(JoseHeaderErrorMessage.missingKidError.code, JoseHeaderErrorMessage.missingKidError.desc);\r\n    }\r\n\r\n    /**\r\n     * Creates an error thrown when algorithm isn't set on JOSE header.\r\n     */\r\n    static createMissingAlgError(): JoseHeaderError {\r\n        return new JoseHeaderError(JoseHeaderErrorMessage.missingAlgError.code, JoseHeaderErrorMessage.missingAlgError.desc);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { JoseHeaderError } from \"../error/JoseHeaderError\";\r\nimport { JsonTypes } from \"../utils/Constants\";\r\n\r\nexport type JoseHeaderOptions = {\r\n    typ?: JsonTypes,\r\n    alg?: string,\r\n    kid?: string\r\n};\r\n\r\nexport class JoseHeader {\r\n    public typ?: JsonTypes;\r\n    public alg?: string;\r\n    public kid?: string;\r\n\r\n    constructor (options: JoseHeaderOptions) {\r\n        this.typ = options.typ;\r\n        this.alg = options.alg;\r\n        this.kid = options.kid;\r\n    }\r\n\r\n    /**\r\n     * Builds SignedHttpRequest formatted JOSE Header from the\r\n     * JOSE Header options provided or previously set on the object and returns\r\n     * the stringified header object.\r\n     * Throws if keyId or algorithm aren't provided since they are required for Access Token Binding.\r\n     * @param shrHeaderOptions \r\n     * @returns \r\n     */\r\n    static getShrHeaderString(shrHeaderOptions: JoseHeaderOptions): string {\r\n        // KeyID is required on the SHR header\r\n        if (!shrHeaderOptions.kid) {\r\n            throw JoseHeaderError.createMissingKidError();\r\n        }\r\n\r\n        // Alg is required on the SHR header\r\n        if (!shrHeaderOptions.alg) {\r\n            throw JoseHeaderError.createMissingAlgError();\r\n        }\r\n\r\n        const shrHeader = new JoseHeader({\r\n            // Access Token PoP headers must have type pop, but the type header can be overriden for special cases\r\n            typ: shrHeaderOptions.typ || JsonTypes.Pop,\r\n            kid: shrHeaderOptions.kid,\r\n            alg: shrHeaderOptions.alg\r\n        });\r\n\r\n        return JSON.stringify(shrHeader);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\n/**\r\n * Utility class for math specific functions in browser.\r\n */\r\nexport class MathUtils {\r\n\r\n    /**\r\n     * Decimal to Hex\r\n     *\r\n     * @param num\r\n     */\r\n    static decimalToHex(num: number): string {\r\n        let hex: string = num.toString(16);\r\n        while (hex.length < 2) {\r\n            hex = \"0\" + hex;\r\n        }\r\n        return hex;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Constants , IGuidGenerator } from \"@azure/msal-common\";\r\nimport { MathUtils } from \"../utils/MathUtils\";\r\nimport { BrowserCrypto } from \"./BrowserCrypto\";\r\nexport class GuidGenerator implements IGuidGenerator {\r\n\r\n    // browser crypto object used to generate random values\r\n    private cryptoObj: BrowserCrypto;\r\n\r\n    constructor(cryptoObj: BrowserCrypto) {\r\n        this.cryptoObj = cryptoObj;\r\n    }\r\n\r\n    /*\r\n     * RFC4122: The version 4 UUID is meant for generating UUIDs from truly-random or\r\n     * pseudo-random numbers.\r\n     * The algorithm is as follows:\r\n     *     Set the two most significant bits (bits 6 and 7) of the\r\n     *        clock_seq_hi_and_reserved to zero and one, respectively.\r\n     *     Set the four most significant bits (bits 12 through 15) of the\r\n     *        time_hi_and_version field to the 4-bit version number from\r\n     *        Section 4.1.3. Version4\r\n     *     Set all the other bits to randomly (or pseudo-randomly) chosen\r\n     *     values.\r\n     * UUID                   = time-low \"-\" time-mid \"-\"time-high-and-version \"-\"clock-seq-reserved and low(2hexOctet)\"-\" node\r\n     * time-low               = 4hexOctet\r\n     * time-mid               = 2hexOctet\r\n     * time-high-and-version  = 2hexOctet\r\n     * clock-seq-and-reserved = hexOctet:\r\n     * clock-seq-low          = hexOctet\r\n     * node                   = 6hexOctet\r\n     * Format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\r\n     * y could be 1000, 1001, 1010, 1011 since most significant two bits needs to be 10\r\n     * y values are 8, 9, A, B\r\n     */\r\n    generateGuid(): string {\r\n        try {\r\n            const buffer: Uint8Array = new Uint8Array(16);\r\n            this.cryptoObj.getRandomValues(buffer);\r\n\r\n            // buffer[6] and buffer[7] represents the time_hi_and_version field. We will set the four most significant bits (4 through 7) of buffer[6] to represent decimal number 4 (UUID version number).\r\n            buffer[6] |= 0x40; // buffer[6] | 01000000 will set the 6 bit to 1.\r\n            buffer[6] &= 0x4f; // buffer[6] & 01001111 will set the 4, 5, and 7 bit to 0 such that bits 4-7 == 0100 = \"4\".\r\n\r\n            // buffer[8] represents the clock_seq_hi_and_reserved field. We will set the two most significant bits (6 and 7) of the clock_seq_hi_and_reserved to zero and one, respectively.\r\n            buffer[8] |= 0x80; // buffer[8] | 10000000 will set the 7 bit to 1.\r\n            buffer[8] &= 0xbf; // buffer[8] & 10111111 will set the 6 bit to 0.\r\n\r\n            return MathUtils.decimalToHex(buffer[0]) + MathUtils.decimalToHex(buffer[1])\r\n                + MathUtils.decimalToHex(buffer[2]) + MathUtils.decimalToHex(buffer[3])\r\n                + \"-\" + MathUtils.decimalToHex(buffer[4]) + MathUtils.decimalToHex(buffer[5])\r\n                + \"-\" + MathUtils.decimalToHex(buffer[6]) + MathUtils.decimalToHex(buffer[7])\r\n                + \"-\" + MathUtils.decimalToHex(buffer[8]) + MathUtils.decimalToHex(buffer[9])\r\n                + \"-\" + MathUtils.decimalToHex(buffer[10]) + MathUtils.decimalToHex(buffer[11])\r\n                + MathUtils.decimalToHex(buffer[12]) + MathUtils.decimalToHex(buffer[13])\r\n                + MathUtils.decimalToHex(buffer[14]) + MathUtils.decimalToHex(buffer[15]);\r\n        }\r\n        catch (err) {\r\n            const guidHolder: string = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\";\r\n            const hex: string = \"0123456789abcdef\";\r\n            let r: number = 0;\r\n            let guidResponse: string = Constants.EMPTY_STRING;\r\n            for (let i: number = 0; i < 36; i++) {\r\n                if (guidHolder[i] !== \"-\" && guidHolder[i] !== \"4\") {\r\n                    // each x and y needs to be random\r\n                    r = Math.random() * 16 | 0;\r\n                }\r\n                if (guidHolder[i] === \"x\") {\r\n                    guidResponse += hex[r];\r\n                } else if (guidHolder[i] === \"y\") {\r\n                    // clock-seq-and-reserved first hex is filtered and remaining hex values are random\r\n                    r &= 0x3; // bit and with 0011 to set pos 2 to zero ?0??\r\n                    r |= 0x8; // set pos 3 to 1 as 1???\r\n                    guidResponse += hex[r];\r\n                } else {\r\n                    guidResponse += guidHolder[i];\r\n                }\r\n            }\r\n            return guidResponse;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * verifies if a string is  GUID\r\n     * @param guid\r\n     */\r\n    isGuid(guid: string): boolean {\r\n        const regexGuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\r\n        return regexGuid.test(guid);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Constants } from \"@azure/msal-common\";\r\n\r\n/**\r\n * Utility functions for strings in a browser. See here for implementation details:\r\n * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64\r\n */\r\nexport class BrowserStringUtils {\r\n\r\n    /**\r\n     * Converts string to Uint8Array\r\n     * @param sDOMStr \r\n     */\r\n    static stringToUtf8Arr (sDOMStr: string): Uint8Array {\r\n        let nChr;\r\n        let nArrLen = 0;\r\n        const nStrLen = sDOMStr.length;\r\n        /* mapping... */\r\n        for (let nMapIdx = 0; nMapIdx < nStrLen; nMapIdx++) {\r\n            nChr = sDOMStr.charCodeAt(nMapIdx);\r\n            nArrLen += nChr < 0x80 ? 1 : nChr < 0x800 ? 2 : nChr < 0x10000 ? 3 : nChr < 0x200000 ? 4 : nChr < 0x4000000 ? 5 : 6;\r\n        }\r\n\r\n        const aBytes = new Uint8Array(nArrLen);\r\n\r\n        /* transcription... */\r\n\r\n        for (let nIdx = 0, nChrIdx = 0; nIdx < nArrLen; nChrIdx++) {\r\n            nChr = sDOMStr.charCodeAt(nChrIdx);\r\n            if (nChr < 128) {\r\n                /* one byte */\r\n                aBytes[nIdx++] = nChr;\r\n            } else if (nChr < 0x800) {\r\n                /* two bytes */\r\n                aBytes[nIdx++] = 192 + (nChr >>> 6);\r\n                aBytes[nIdx++] = 128 + (nChr & 63);\r\n            } else if (nChr < 0x10000) {\r\n                /* three bytes */\r\n                aBytes[nIdx++] = 224 + (nChr >>> 12);\r\n                aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);\r\n                aBytes[nIdx++] = 128 + (nChr & 63);\r\n            } else if (nChr < 0x200000) {\r\n                /* four bytes */\r\n                aBytes[nIdx++] = 240 + (nChr >>> 18);\r\n                aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);\r\n                aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);\r\n                aBytes[nIdx++] = 128 + (nChr & 63);\r\n            } else if (nChr < 0x4000000) {\r\n                /* five bytes */\r\n                aBytes[nIdx++] = 248 + (nChr >>> 24);\r\n                aBytes[nIdx++] = 128 + (nChr >>> 18 & 63);\r\n                aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);\r\n                aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);\r\n                aBytes[nIdx++] = 128 + (nChr & 63);\r\n            } else /* if (nChr <= 0x7fffffff) */ {\r\n                /* six bytes */\r\n                aBytes[nIdx++] = 252 + (nChr >>> 30);\r\n                aBytes[nIdx++] = 128 + (nChr >>> 24 & 63);\r\n                aBytes[nIdx++] = 128 + (nChr >>> 18 & 63);\r\n                aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);\r\n                aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);\r\n                aBytes[nIdx++] = 128 + (nChr & 63);\r\n            }\r\n        }\r\n\r\n        return aBytes;      \r\n    }\r\n\r\n    /**\r\n     * Converst string to ArrayBuffer\r\n     * @param dataString \r\n     */\r\n    static stringToArrayBuffer(dataString: string): ArrayBuffer {\r\n        const data = new ArrayBuffer(dataString.length);\r\n        const dataView = new Uint8Array(data);\r\n        for (let i: number = 0; i < dataString.length; i++) {\r\n            dataView[i] = dataString.charCodeAt(i);\r\n        }\r\n        return data;\r\n    }\r\n\r\n    /**\r\n     * Converts Uint8Array to a string\r\n     * @param aBytes \r\n     */\r\n    static utf8ArrToString (aBytes: Uint8Array): string {\r\n        let sView = Constants.EMPTY_STRING;\r\n        for (let nPart, nLen = aBytes.length, nIdx = 0; nIdx < nLen; nIdx++) {\r\n            nPart = aBytes[nIdx];\r\n            sView += String.fromCharCode(\r\n                nPart > 251 && nPart < 254 && nIdx + 5 < nLen ? /* six bytes */\r\n                    /* (nPart - 252 << 30) may be not so safe in ECMAScript! So...: */\r\n                    (nPart - 252) * 1073741824 + (aBytes[++nIdx] - 128 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128\r\n                    : nPart > 247 && nPart < 252 && nIdx + 4 < nLen ? /* five bytes */\r\n                        (nPart - 248 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128\r\n                        : nPart > 239 && nPart < 248 && nIdx + 3 < nLen ? /* four bytes */\r\n                            (nPart - 240 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128\r\n                            : nPart > 223 && nPart < 240 && nIdx + 2 < nLen ? /* three bytes */\r\n                                (nPart - 224 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128\r\n                                : nPart > 191 && nPart < 224 && nIdx + 1 < nLen ? /* two bytes */\r\n                                    (nPart - 192 << 6) + aBytes[++nIdx] - 128\r\n                                    : /* nPart < 127 ? */ /* one byte */\r\n                                    nPart\r\n            );\r\n        }\r\n        return sView;\r\n    }\r\n\r\n    /**\r\n     * Returns stringified jwk.\r\n     * @param jwk \r\n     */\r\n    static getSortedObjectString(obj: object): string {\r\n        return JSON.stringify(obj, Object.keys(obj).sort());\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Constants } from \"@azure/msal-common\";\r\nimport { BrowserStringUtils } from \"../utils/BrowserStringUtils\";\r\n\r\n/**\r\n * Class which exposes APIs to encode plaintext to base64 encoded string. See here for implementation details:\r\n * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64\r\n */\r\nexport class Base64Encode {\r\n    \r\n    /**\r\n     * Returns URL Safe b64 encoded string from a plaintext string.\r\n     * @param input \r\n     */\r\n    urlEncode(input: string): string {\r\n        return encodeURIComponent(this.encode(input)\r\n            .replace(/=/g, Constants.EMPTY_STRING)\r\n            .replace(/\\+/g, \"-\")\r\n            .replace(/\\//g, \"_\"));\r\n    }\r\n\r\n    /**\r\n     * Returns URL Safe b64 encoded string from an int8Array.\r\n     * @param inputArr \r\n     */\r\n    urlEncodeArr(inputArr: Uint8Array): string {\r\n        return this.base64EncArr(inputArr)\r\n            .replace(/=/g, Constants.EMPTY_STRING)\r\n            .replace(/\\+/g, \"-\")\r\n            .replace(/\\//g, \"_\");\r\n    }\r\n\r\n    /**\r\n     * Returns b64 encoded string from plaintext string.\r\n     * @param input \r\n     */\r\n    encode(input: string): string {\r\n        const inputUtf8Arr = BrowserStringUtils.stringToUtf8Arr(input);\r\n        return this.base64EncArr(inputUtf8Arr);\r\n    }\r\n\r\n    /**\r\n     * Base64 encode byte array\r\n     * @param aBytes \r\n     */\r\n    private base64EncArr(aBytes: Uint8Array): string {  \r\n        const eqLen = (3 - (aBytes.length % 3)) % 3;\r\n        let sB64Enc = Constants.EMPTY_STRING;\r\n      \r\n        for (let nMod3, nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {\r\n            nMod3 = nIdx % 3;\r\n            /* Uncomment the following line in order to split the output in lines 76-character long: */\r\n            /*\r\n             *if (nIdx > 0 && (nIdx * 4 / 3) % 76 === 0) { sB64Enc += \"\\r\\n\"; }\r\n             */\r\n            nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24);\r\n            if (nMod3 === 2 || aBytes.length - nIdx === 1) {\r\n                sB64Enc += String.fromCharCode(\r\n                    this.uint6ToB64(nUint24 >>> 18 & 63), \r\n                    this.uint6ToB64(nUint24 >>> 12 & 63), \r\n                    this.uint6ToB64(nUint24 >>> 6 & 63), \r\n                    this.uint6ToB64(nUint24 & 63)\r\n                );\r\n                nUint24 = 0;\r\n            }\r\n        }\r\n\r\n        return  eqLen === 0 ? sB64Enc : sB64Enc.substring(0, sB64Enc.length - eqLen) + (eqLen === 1 ? \"=\" : \"==\");\r\n    }\r\n\r\n    /**\r\n     * Base64 string to array encoding helper\r\n     * @param nUint6 \r\n     */\r\n    private uint6ToB64 (nUint6: number): number {\r\n        return nUint6 < 26 ?\r\n            nUint6 + 65\r\n            : nUint6 < 52 ?\r\n                nUint6 + 71\r\n                : nUint6 < 62 ?\r\n                    nUint6 - 4\r\n                    : nUint6 === 62 ?\r\n                        43\r\n                        : nUint6 === 63 ?\r\n                            47\r\n                            :\r\n                            65;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Constants } from \"@azure/msal-common\";\r\nimport { BrowserStringUtils } from \"../utils/BrowserStringUtils\";\r\n\r\n/**\r\n * Class which exposes APIs to decode base64 strings to plaintext. See here for implementation details:\r\n * https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_2_%E2%80%93_JavaScript's_UTF-16_%3E_UTF-8_%3E_base64\r\n */\r\nexport class Base64Decode {\r\n\r\n    /**\r\n     * Returns a URL-safe plaintext decoded string from b64 encoded input.\r\n     * @param input \r\n     */\r\n    decode(input: string): string {\r\n        let encodedString = input.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n        switch (encodedString.length % 4) {\r\n            case 0:\r\n                break;\r\n            case 2:\r\n                encodedString += \"==\";\r\n                break;\r\n            case 3:\r\n                encodedString += \"=\";\r\n                break;\r\n            default:\r\n                throw new Error(\"Invalid base64 string\");\r\n        }\r\n\r\n        const inputUtf8Arr = this.base64DecToArr(encodedString);\r\n        return BrowserStringUtils.utf8ArrToString(inputUtf8Arr);\r\n    }\r\n\r\n    /**\r\n     * Decodes base64 into Uint8Array\r\n     * @param base64String \r\n     * @param nBlockSize \r\n     */\r\n    private base64DecToArr(base64String: string, nBlockSize?: number): Uint8Array {\r\n        const sB64Enc = base64String.replace(/[^A-Za-z0-9\\+\\/]/g, Constants.EMPTY_STRING);\r\n        const nInLen = sB64Enc.length;\r\n        const nOutLen = nBlockSize ? Math.ceil((nInLen * 3 + 1 >>> 2) / nBlockSize) * nBlockSize : nInLen * 3 + 1 >>> 2;\r\n        const aBytes = new Uint8Array(nOutLen);\r\n\r\n        for (let nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) {\r\n            nMod4 = nInIdx & 3;\r\n            nUint24 |= this.b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4;\r\n            if (nMod4 === 3 || nInLen - nInIdx === 1) {\r\n                for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) {\r\n                    aBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255;\r\n                }\r\n                nUint24 = 0;\r\n            }\r\n        }\r\n\r\n        return aBytes;\r\n    }\r\n\r\n    /**\r\n     * Base64 string to array decoding helper\r\n     * @param charNum \r\n     */\r\n    private b64ToUint6(charNum: number): number {\r\n        return charNum > 64 && charNum < 91 ?\r\n            charNum - 65\r\n            : charNum > 96 && charNum < 123 ? \r\n                charNum - 71\r\n                : charNum > 47 && charNum < 58 ?\r\n                    charNum + 4\r\n                    : charNum === 43 ?\r\n                        62\r\n                        : charNum === 47 ?\r\n                            63\r\n                            :\r\n                            0;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { PkceCodes } from \"@azure/msal-common\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { Base64Encode } from \"../encode/Base64Encode\";\r\nimport { BrowserCrypto } from \"./BrowserCrypto\";\r\n\r\n// Constant byte array length\r\nconst RANDOM_BYTE_ARR_LENGTH = 32;\r\n\r\n/**\r\n * Class which exposes APIs to generate PKCE codes and code verifiers.\r\n */\r\nexport class PkceGenerator {\r\n\r\n    private base64Encode: Base64Encode;\r\n    private cryptoObj: BrowserCrypto;\r\n\r\n    constructor(cryptoObj: BrowserCrypto) {\r\n        this.base64Encode = new Base64Encode();\r\n        this.cryptoObj = cryptoObj;\r\n    }\r\n\r\n    /**\r\n     * Generates PKCE Codes. See the RFC for more information: https://tools.ietf.org/html/rfc7636\r\n     */\r\n    async generateCodes(): Promise<PkceCodes> {\r\n        const codeVerifier = this.generateCodeVerifier();\r\n        const codeChallenge = await this.generateCodeChallengeFromVerifier(codeVerifier);\r\n        return {\r\n            verifier: codeVerifier,\r\n            challenge: codeChallenge\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Generates a random 32 byte buffer and returns the base64\r\n     * encoded string to be used as a PKCE Code Verifier\r\n     */\r\n    private generateCodeVerifier(): string {\r\n        try {\r\n            // Generate random values as utf-8\r\n            const buffer: Uint8Array = new Uint8Array(RANDOM_BYTE_ARR_LENGTH);\r\n            this.cryptoObj.getRandomValues(buffer);\r\n            // encode verifier as base64\r\n            const pkceCodeVerifierB64: string = this.base64Encode.urlEncodeArr(buffer);\r\n            return pkceCodeVerifierB64;\r\n        } catch (e) {\r\n            throw BrowserAuthError.createPkceNotGeneratedError(e);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Creates a base64 encoded PKCE Code Challenge string from the\r\n     * hash created from the PKCE Code Verifier supplied\r\n     */\r\n    private async generateCodeChallengeFromVerifier(pkceCodeVerifier: string): Promise<string> {\r\n        try {\r\n            // hashed verifier\r\n            const pkceHashedCodeVerifier = await this.cryptoObj.sha256Digest(pkceCodeVerifier);\r\n            // encode hash as base64\r\n            return this.base64Encode.urlEncodeArr(new Uint8Array(pkceHashedCodeVerifier));\r\n        } catch (e) {\r\n            throw BrowserAuthError.createPkceNotGeneratedError(e);\r\n        }\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { KEY_FORMAT_JWK } from \"../utils/BrowserConstants\";\r\nimport { ISubtleCrypto } from \"./ISubtleCrypto\";\r\n\r\nexport class ModernBrowserCrypto implements ISubtleCrypto {\r\n    getRandomValues(dataBuffer: Uint8Array): Uint8Array {\r\n        return window.crypto.getRandomValues(dataBuffer);\r\n    }\r\n\r\n    async generateKey(algorithm: RsaHashedKeyGenParams, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKeyPair> {\r\n        return window.crypto.subtle.generateKey(algorithm, extractable, keyUsages) as Promise<CryptoKeyPair>;\r\n    }\r\n\r\n    async exportKey(key: CryptoKey): Promise<JsonWebKey> {\r\n        return window.crypto.subtle.exportKey(KEY_FORMAT_JWK, key) as Promise<JsonWebKey>;\r\n    }\r\n\r\n    async importKey(keyData: JsonWebKey, algorithm: RsaHashedImportParams, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey> {\r\n        return window.crypto.subtle.importKey(KEY_FORMAT_JWK, keyData, algorithm, extractable, keyUsages) as Promise<CryptoKey>;\r\n    }\r\n\r\n    async sign(algorithm: AlgorithmIdentifier, key: CryptoKey, data: ArrayBuffer): Promise<ArrayBuffer> {\r\n        return window.crypto.subtle.sign(algorithm, key, data) as Promise<ArrayBuffer>;\r\n    }\r\n\r\n    async digest(algorithm: AlgorithmIdentifier, data: Uint8Array): Promise<ArrayBuffer> {\r\n        return window.crypto.subtle.digest(algorithm, data) as Promise<ArrayBuffer>;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { KEY_FORMAT_JWK } from \"../utils/BrowserConstants\";\r\nimport { ISubtleCrypto } from \"./ISubtleCrypto\";\r\n\r\ndeclare global {\r\n    interface Window {\r\n        msrCrypto: Crypto & {\r\n            initPrng: (entropy: Uint8Array | number[]) => void\r\n        }\r\n    }\r\n}\r\n\r\nexport class MsrBrowserCrypto implements ISubtleCrypto {\r\n    initPrng(entropy : Uint8Array): void {\r\n        // Turn into array, as initPrng seems to not always like Uint8Array (even though it should support both)\r\n        return window.msrCrypto.initPrng([...entropy]);\r\n    }\r\n\r\n    getRandomValues(dataBuffer: Uint8Array): Uint8Array {\r\n        return window.msrCrypto.getRandomValues(dataBuffer);\r\n    }\r\n\r\n    async generateKey(algorithm: RsaHashedKeyGenParams, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKeyPair> {\r\n        return window.msrCrypto.subtle.generateKey(algorithm, extractable, keyUsages) as Promise<CryptoKeyPair>;\r\n    }\r\n\r\n    async exportKey(key: CryptoKey): Promise<JsonWebKey> {\r\n        return window.msrCrypto.subtle.exportKey(KEY_FORMAT_JWK, key) as Promise<JsonWebKey> as Promise<JsonWebKey>;\r\n    }\r\n\r\n    async importKey(keyData: JsonWebKey, algorithm: RsaHashedImportParams, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey> {\r\n        return window.msrCrypto.subtle.importKey(KEY_FORMAT_JWK, keyData, algorithm, extractable, keyUsages) as Promise<CryptoKey>;\r\n    }\r\n\r\n    async sign(algorithm: AlgorithmIdentifier, key: CryptoKey, data: ArrayBuffer): Promise<ArrayBuffer> {\r\n        return window.msrCrypto.subtle.sign(algorithm, key, data) as Promise<ArrayBuffer>;\r\n    }\r\n\r\n    async digest(algorithm: AlgorithmIdentifier, data: Uint8Array): Promise<ArrayBuffer> {\r\n        return window.msrCrypto.subtle.digest(algorithm, data) as Promise<ArrayBuffer>; \r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Constants } from \"@azure/msal-common\";\r\nimport { KEY_FORMAT_JWK } from \"../utils/BrowserConstants\";\r\nimport { BrowserStringUtils } from \"../utils/BrowserStringUtils\";\r\nimport { ISubtleCrypto } from \"./ISubtleCrypto\";\r\n\r\nexport class MsBrowserCrypto implements ISubtleCrypto {\r\n    getRandomValues(dataBuffer: Uint8Array): Uint8Array {\r\n        return window[\"msCrypto\"].getRandomValues(dataBuffer);\r\n    }\r\n\r\n    async generateKey(algorithm: RsaHashedKeyGenParams, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKeyPair> {\r\n        return new Promise((resolve: Function, reject: Function) => {\r\n            const msGenerateKey = window[\"msCrypto\"].subtle.generateKey(algorithm, extractable, keyUsages);\r\n            msGenerateKey.addEventListener(\"complete\", (e: { target: { result: CryptoKeyPair | PromiseLike<CryptoKeyPair>; }; }) => {\r\n                resolve(e.target.result);\r\n            });\r\n\r\n            msGenerateKey.addEventListener(\"error\", (error: string) => {\r\n                reject(error);\r\n            });\r\n        });\r\n    }\r\n\r\n    async exportKey(key: CryptoKey): Promise<JsonWebKey> {\r\n        return new Promise((resolve: Function, reject: Function) => {\r\n            const msExportKey = window[\"msCrypto\"].subtle.exportKey(KEY_FORMAT_JWK, key);\r\n            msExportKey.addEventListener(\"complete\", (e: { target: { result: ArrayBuffer; }; }) => {\r\n                const resultBuffer: ArrayBuffer = e.target.result;\r\n\r\n                const resultString = BrowserStringUtils.utf8ArrToString(new Uint8Array(resultBuffer))\r\n                    .replace(/\\r/g, Constants.EMPTY_STRING)\r\n                    .replace(/\\n/g, Constants.EMPTY_STRING)\r\n                    .replace(/\\t/g, Constants.EMPTY_STRING)\r\n                    .split(\" \").join(Constants.EMPTY_STRING)\r\n                    .replace(\"\\u0000\", Constants.EMPTY_STRING);\r\n\r\n                try {\r\n                    resolve(JSON.parse(resultString));\r\n                } catch (e) {\r\n                    reject(e);\r\n                }\r\n            });\r\n\r\n            msExportKey.addEventListener(\"error\", (error: string) => {\r\n                reject(error);\r\n            });\r\n        });\r\n    }\r\n\r\n    async importKey(keyData: JsonWebKey, algorithm: RsaHashedImportParams, extractable: boolean, keyUsages: KeyUsage[]): Promise<CryptoKey> {\r\n        const keyString = BrowserStringUtils.getSortedObjectString(keyData);\r\n        const keyBuffer = BrowserStringUtils.stringToArrayBuffer(keyString);\r\n\r\n        return new Promise((resolve: Function, reject: Function) => {\r\n            const msImportKey = window[\"msCrypto\"].subtle.importKey(KEY_FORMAT_JWK, keyBuffer, algorithm, extractable, keyUsages);\r\n            msImportKey.addEventListener(\"complete\", (e: { target: { result: CryptoKey | PromiseLike<CryptoKey>; }; }) => {\r\n                resolve(e.target.result);\r\n            });\r\n\r\n            msImportKey.addEventListener(\"error\", (error: string) => {\r\n                reject(error);\r\n            });\r\n        });\r\n    }\r\n\r\n    async sign(algorithm: AlgorithmIdentifier, key: CryptoKey, data: ArrayBuffer): Promise<ArrayBuffer> {\r\n        return new Promise((resolve: Function, reject: Function) => {\r\n            const msSign = window[\"msCrypto\"].subtle.sign(algorithm, key, data);\r\n            msSign.addEventListener(\"complete\", (e: { target: { result: ArrayBuffer | PromiseLike<ArrayBuffer>; }; }) => {\r\n                resolve(e.target.result);\r\n            });\r\n\r\n            msSign.addEventListener(\"error\", (error: string) => {\r\n                reject(error);\r\n            });\r\n        });\r\n    }\r\n    \r\n    async digest(algorithm: AlgorithmIdentifier, data: Uint8Array): Promise<ArrayBuffer> {\r\n        return new Promise((resolve, reject) => {\r\n            const digestOperation = window[\"msCrypto\"].subtle.digest(algorithm, data.buffer);\r\n            digestOperation.addEventListener(\"complete\", (e: { target: { result: ArrayBuffer | PromiseLike<ArrayBuffer>; }; }) => {\r\n                resolve(e.target.result);\r\n            });\r\n            digestOperation.addEventListener(\"error\", (error: string) => {\r\n                reject(error);\r\n            });\r\n        });\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { BrowserStringUtils } from \"../utils/BrowserStringUtils\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { ISubtleCrypto } from \"./ISubtleCrypto\";\r\nimport { ModernBrowserCrypto } from \"./ModernBrowserCrypto\";\r\nimport { MsrBrowserCrypto } from \"./MsrBrowserCrypto\";\r\nimport { MsBrowserCrypto } from \"./MsBrowserCrypto\";\r\nimport { Logger } from \"@azure/msal-common\";\r\nimport { BrowserConfigurationAuthError } from \"../error/BrowserConfigurationAuthError\";\r\nimport { CryptoOptions } from \"../config/Configuration\";\r\n/**\r\n * See here for more info on RsaHashedKeyGenParams: https://developer.mozilla.org/en-US/docs/Web/API/RsaHashedKeyGenParams\r\n */\r\n// RSA KeyGen Algorithm\r\nconst PKCS1_V15_KEYGEN_ALG = \"RSASSA-PKCS1-v1_5\";\r\n// SHA-256 hashing algorithm\r\nconst S256_HASH_ALG = \"SHA-256\";\r\n// MOD length for PoP tokens\r\nconst MODULUS_LENGTH = 2048;\r\n// Public Exponent\r\nconst PUBLIC_EXPONENT: Uint8Array = new Uint8Array([0x01, 0x00, 0x01]);\r\n\r\n/**\r\n * This class implements functions used by the browser library to perform cryptography operations such as\r\n * hashing and encoding. It also has helper functions to validate the availability of specific APIs.\r\n */\r\nexport class BrowserCrypto {\r\n\r\n    private keygenAlgorithmOptions: RsaHashedKeyGenParams;\r\n    private subtleCrypto: ISubtleCrypto;\r\n    private logger: Logger;\r\n    private cryptoOptions?: CryptoOptions;\r\n\r\n    constructor(logger: Logger, cryptoOptions?: CryptoOptions) {\r\n        this.logger = logger;\r\n        this.cryptoOptions = cryptoOptions;\r\n\r\n        if (this.hasBrowserCrypto()) {\r\n            // Use standard modern web crypto if available\r\n            this.logger.verbose(\"BrowserCrypto: modern crypto interface available\");\r\n            this.subtleCrypto = new ModernBrowserCrypto();\r\n        } else if (this.hasIECrypto()) {\r\n            // For IE11, use msCrypto interface\r\n            this.logger.verbose(\"BrowserCrypto: MS crypto interface available\");\r\n            this.subtleCrypto = new MsBrowserCrypto();\r\n        } else if (this.hasMsrCrypto() && this.cryptoOptions?.useMsrCrypto) {\r\n            // For other browsers, use MSR Crypto if found\r\n            this.logger.verbose(\"BrowserCrypto: MSR crypto interface available\");\r\n            this.subtleCrypto = new MsrBrowserCrypto();\r\n        } else {\r\n            if (this.hasMsrCrypto()) {\r\n                this.logger.info(\"BrowserCrypto: MSR Crypto interface available but system.cryptoOptions.useMsrCrypto not enabled\");\r\n            }\r\n            this.logger.error(\"BrowserCrypto: No crypto interfaces available.\");\r\n            throw BrowserAuthError.createCryptoNotAvailableError(\"Browser crypto, msCrypto, or msrCrypto interfaces not available.\");\r\n        }\r\n\r\n        // Mainly needed for MSR Crypto: https://github.com/microsoft/MSR-JavaScript-Crypto#random-number-generator-prng\r\n        if (this.subtleCrypto.initPrng) {\r\n            this.logger.verbose(\"BrowserCrypto: Interface requires entropy\");\r\n\r\n            if (!this.cryptoOptions?.entropy) {\r\n                this.logger.error(\"BrowserCrypto: Interface requires entropy but none provided.\");\r\n                throw BrowserConfigurationAuthError.createEntropyNotProvided();\r\n            }\r\n\r\n            this.logger.verbose(\"BrowserCrypto: Entropy provided\");\r\n            this.subtleCrypto.initPrng(this.cryptoOptions.entropy);\r\n        }\r\n\r\n        this.keygenAlgorithmOptions = {\r\n            name: PKCS1_V15_KEYGEN_ALG,\r\n            hash: S256_HASH_ALG,\r\n            modulusLength: MODULUS_LENGTH,\r\n            publicExponent: PUBLIC_EXPONENT\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Check whether IE crypto or other browser cryptography is available.\r\n     */\r\n    private hasIECrypto(): boolean {\r\n        return \"msCrypto\" in window;\r\n    }\r\n\r\n    /**\r\n     * Check whether browser crypto is available.\r\n     */\r\n    private hasBrowserCrypto(): boolean {\r\n        return \"crypto\" in window;\r\n    }\r\n\r\n    /**\r\n     * Check whether MSR crypto polyfill is available\r\n     */\r\n    private hasMsrCrypto(): boolean {\r\n        return \"msrCrypto\" in window;\r\n    }\r\n\r\n    /**\r\n     * Returns a sha-256 hash of the given dataString as an ArrayBuffer.\r\n     * @param dataString \r\n     */\r\n    async sha256Digest(dataString: string): Promise<ArrayBuffer> {\r\n        const data = BrowserStringUtils.stringToUtf8Arr(dataString);\r\n        // MSR Crypto wants object with name property, instead of string\r\n        return this.subtleCrypto.digest({ name: S256_HASH_ALG }, data);\r\n    }\r\n\r\n    /**\r\n     * Populates buffer with cryptographically random values.\r\n     * @param dataBuffer \r\n     */\r\n    getRandomValues(dataBuffer: Uint8Array): Uint8Array {\r\n        return this.subtleCrypto.getRandomValues(dataBuffer);\r\n    }\r\n\r\n    /**\r\n     * Generates a keypair based on current keygen algorithm config.\r\n     * @param extractable \r\n     * @param usages \r\n     */\r\n    async generateKeyPair(extractable: boolean, usages: Array<KeyUsage>): Promise<CryptoKeyPair> {\r\n        return this.subtleCrypto.generateKey(this.keygenAlgorithmOptions, extractable, usages);\r\n    }\r\n\r\n    /**\r\n     * Export key as Json Web Key (JWK)\r\n     * @param key \r\n     * @param format \r\n     */\r\n    async exportJwk(key: CryptoKey): Promise<JsonWebKey> {\r\n        return this.subtleCrypto.exportKey(key);\r\n    }\r\n\r\n    /**\r\n     * Imports key as Json Web Key (JWK), can set extractable and usages.\r\n     * @param key \r\n     * @param format \r\n     * @param extractable \r\n     * @param usages \r\n     */\r\n    async importJwk(key: JsonWebKey, extractable: boolean, usages: Array<KeyUsage>): Promise<CryptoKey> {\r\n        return this.subtleCrypto.importKey(key, this.keygenAlgorithmOptions, extractable, usages);\r\n    }\r\n\r\n    /**\r\n     * Signs given data with given key\r\n     * @param key \r\n     * @param data \r\n     */\r\n    async sign(key: CryptoKey, data: ArrayBuffer): Promise<ArrayBuffer> {\r\n        return this.subtleCrypto.sign(this.keygenAlgorithmOptions, key, data);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { DB_NAME, DB_TABLE_NAME, DB_VERSION } from \"../utils/BrowserConstants\";\r\nimport { IAsyncStorage } from \"./IAsyncMemoryStorage\";\r\n\r\ninterface IDBOpenDBRequestEvent extends Event {\r\n    target: IDBOpenDBRequest & EventTarget;\r\n}\r\n\r\ninterface IDBOpenOnUpgradeNeededEvent extends IDBVersionChangeEvent {\r\n    target: IDBOpenDBRequest & EventTarget;\r\n}\r\n\r\ninterface IDBRequestEvent extends Event {\r\n    target: IDBRequest & EventTarget;\r\n}\r\n\r\n/**\r\n * Storage wrapper for IndexedDB storage in browsers: https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API\r\n */\r\nexport class DatabaseStorage<T> implements IAsyncStorage<T> {\r\n    private db: IDBDatabase|undefined;\r\n    private dbName: string;\r\n    private tableName: string;\r\n    private version: number;\r\n    private dbOpen: boolean;\r\n\r\n    constructor() {\r\n        this.dbName = DB_NAME;\r\n        this.version = DB_VERSION;\r\n        this.tableName = DB_TABLE_NAME;\r\n        this.dbOpen = false;\r\n    }\r\n\r\n    /**\r\n     * Opens IndexedDB instance.\r\n     */\r\n    async open(): Promise<void> {\r\n        return new Promise((resolve, reject) => {\r\n            const openDB = window.indexedDB.open(this.dbName, this.version);\r\n            openDB.addEventListener(\"upgradeneeded\", (e: IDBVersionChangeEvent) => {\r\n                const event = e as IDBOpenOnUpgradeNeededEvent;\r\n                event.target.result.createObjectStore(this.tableName);\r\n            });\r\n            openDB.addEventListener(\"success\", (e: Event) => {\r\n                const event = e as IDBOpenDBRequestEvent;\r\n                this.db = event.target.result;\r\n                this.dbOpen = true;\r\n                resolve();\r\n            });\r\n            openDB.addEventListener(\"error\",  () => reject(BrowserAuthError.createDatabaseUnavailableError()));\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Closes the connection to IndexedDB database when all pending transactions\r\n     * complete.\r\n     */\r\n    closeConnection(): void {\r\n        const db = this.db;\r\n        if (db && this.dbOpen) {\r\n            db.close();\r\n            this.dbOpen = false;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Opens database if it's not already open\r\n     */\r\n    private async validateDbIsOpen(): Promise<void> {\r\n        if (!this.dbOpen) {\r\n            return await this.open();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Retrieves item from IndexedDB instance.\r\n     * @param key \r\n     */\r\n    async getItem(key: string): Promise<T | null> {\r\n        await this.validateDbIsOpen();\r\n        return new Promise<T>((resolve, reject) => {\r\n            // TODO: Add timeouts?\r\n            if (!this.db) {\r\n                return reject(BrowserAuthError.createDatabaseNotOpenError());\r\n            }\r\n            const transaction = this.db.transaction([this.tableName], \"readonly\");\r\n            const objectStore = transaction.objectStore(this.tableName);\r\n            const dbGet = objectStore.get(key);\r\n            \r\n            dbGet.addEventListener(\"success\", (e: Event) => {\r\n                const event = e as IDBRequestEvent;\r\n                this.closeConnection();\r\n                resolve(event.target.result);\r\n            });\r\n\r\n            dbGet.addEventListener(\"error\", (e: Event) => {\r\n                this.closeConnection();\r\n                reject(e);\r\n            });\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Adds item to IndexedDB under given key\r\n     * @param key \r\n     * @param payload \r\n     */\r\n    async setItem(key: string, payload: T): Promise<void> {\r\n        await this.validateDbIsOpen();\r\n        return new Promise<void>((resolve: Function, reject: Function) => {\r\n            // TODO: Add timeouts?\r\n            if (!this.db) {\r\n                return reject(BrowserAuthError.createDatabaseNotOpenError());\r\n            }\r\n            const transaction = this.db.transaction([this.tableName], \"readwrite\");\r\n\r\n            const objectStore = transaction.objectStore(this.tableName);\r\n\r\n            const dbPut = objectStore.put(payload, key);\r\n\r\n            dbPut.addEventListener(\"success\", () => {\r\n                this.closeConnection();\r\n                resolve();\r\n            });\r\n\r\n            dbPut.addEventListener(\"error\", (e) => {\r\n                this.closeConnection();\r\n                reject(e);\r\n            });\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Removes item from IndexedDB under given key\r\n     * @param key\r\n     */\r\n    async removeItem(key: string): Promise<void> {\r\n        await this.validateDbIsOpen();\r\n        return new Promise<void>((resolve: Function, reject: Function) => {\r\n            if (!this.db) {\r\n                return reject(BrowserAuthError.createDatabaseNotOpenError());\r\n            }\r\n\r\n            const transaction = this.db.transaction([this.tableName], \"readwrite\");\r\n            const objectStore = transaction.objectStore(this.tableName);\r\n            const dbDelete = objectStore.delete(key);\r\n\r\n            dbDelete.addEventListener(\"success\", () => {\r\n                this.closeConnection();\r\n                resolve();\r\n            });\r\n\r\n            dbDelete.addEventListener(\"error\", (e) => {\r\n                this.closeConnection();\r\n                reject(e);\r\n            });\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Get all the keys from the storage object as an iterable array of strings.\r\n     */\r\n    async getKeys(): Promise<string[]> {\r\n        await this.validateDbIsOpen();\r\n        return new Promise<string[]>((resolve: Function, reject: Function) => {\r\n            if (!this.db) {\r\n                return reject(BrowserAuthError.createDatabaseNotOpenError());\r\n            }\r\n\r\n            const transaction = this.db.transaction([this.tableName], \"readonly\");\r\n            const objectStore = transaction.objectStore(this.tableName);\r\n            const dbGetKeys = objectStore.getAllKeys();\r\n\r\n            dbGetKeys.addEventListener(\"success\", (e: Event) => {\r\n                const event = e as IDBRequestEvent;\r\n                this.closeConnection();\r\n                resolve(event.target.result);\r\n            });\r\n\r\n            dbGetKeys.addEventListener(\"error\",  (e: Event) => {\r\n                this.closeConnection();\r\n                reject(e);\r\n            });\r\n        });\r\n    }\r\n\r\n    /**\r\n     * \r\n     * Checks whether there is an object under the search key in the object store\r\n     */\r\n    async containsKey(key: string): Promise<boolean> {\r\n        await this.validateDbIsOpen();\r\n\r\n        return new Promise<boolean>((resolve: Function, reject: Function) => {\r\n            if (!this.db) {\r\n                return reject(BrowserAuthError.createDatabaseNotOpenError());\r\n            }\r\n\r\n            const transaction = this.db.transaction([this.tableName], \"readonly\");\r\n            const objectStore = transaction.objectStore(this.tableName);\r\n            const dbContainsKey = objectStore.count(key);\r\n\r\n            dbContainsKey.addEventListener(\"success\", (e: Event) => {\r\n                const event = e as IDBRequestEvent;\r\n                this.closeConnection();\r\n                resolve(event.target.result === 1);\r\n            });\r\n\r\n            dbContainsKey.addEventListener(\"error\", (e: Event) => {\r\n                this.closeConnection();\r\n                reject(e);\r\n            });\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Deletes the MSAL database. The database is deleted rather than cleared to make it possible\r\n     * for client applications to downgrade to a previous MSAL version without worrying about forward compatibility issues\r\n     * with IndexedDB database versions.\r\n     */\r\n    async deleteDatabase(): Promise<boolean> {\r\n        // Check if database being deleted exists\r\n\r\n        if (this.db && this.dbOpen) {\r\n            this.closeConnection();\r\n        }\r\n\r\n        return new Promise<boolean>((resolve: Function, reject: Function) => {\r\n            const deleteDbRequest = window.indexedDB.deleteDatabase(DB_NAME);\r\n            deleteDbRequest.addEventListener(\"success\", () => resolve(true));\r\n            deleteDbRequest.addEventListener(\"blocked\", () => resolve(true));\r\n            deleteDbRequest.addEventListener(\"error\", () => reject(false));\r\n        });\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { Logger } from \"@azure/msal-common\";\r\nimport { BrowserAuthError, BrowserAuthErrorMessage } from \"../error/BrowserAuthError\";\r\nimport { DatabaseStorage } from \"./DatabaseStorage\";\r\nimport { IAsyncStorage } from \"./IAsyncMemoryStorage\";\r\nimport { MemoryStorage } from \"./MemoryStorage\";\r\n\r\n/**\r\n * This class allows MSAL to store artifacts asynchronously using the DatabaseStorage IndexedDB wrapper,\r\n * backed up with the more volatile MemoryStorage object for cases in which IndexedDB may be unavailable.\r\n */\r\nexport class AsyncMemoryStorage<T> implements IAsyncStorage<T> {\r\n    private inMemoryCache: MemoryStorage<T>;\r\n    private indexedDBCache: DatabaseStorage<T>;\r\n    private logger: Logger;\r\n    private storeName: string;\r\n\r\n    constructor(logger: Logger, storeName: string) {\r\n        this.inMemoryCache = new MemoryStorage<T>();\r\n        this.indexedDBCache = new DatabaseStorage<T>();\r\n        this.logger = logger;\r\n        this.storeName = storeName;\r\n    }\r\n\r\n    private handleDatabaseAccessError(error: unknown): void {\r\n        if (error instanceof BrowserAuthError && error.errorCode === BrowserAuthErrorMessage.databaseUnavailable.code) {\r\n            this.logger.error(\"Could not access persistent storage. This may be caused by browser privacy features which block persistent storage in third-party contexts.\");\r\n        } else {\r\n            throw error;\r\n        }\r\n    }\r\n    /**\r\n     * Get the item matching the given key. Tries in-memory cache first, then in the asynchronous\r\n     * storage object if item isn't found in-memory.\r\n     * @param key \r\n     */\r\n    async getItem(key: string): Promise<T | null> {\r\n        const item = this.inMemoryCache.getItem(key);\r\n        if(!item) {\r\n            try {\r\n                this.logger.verbose(\"Queried item not found in in-memory cache, now querying persistent storage.\");\r\n                return await this.indexedDBCache.getItem(key);\r\n            } catch (e) {\r\n                this.handleDatabaseAccessError(e);\r\n            }\r\n        }\r\n        return item;\r\n    }\r\n\r\n    /**\r\n     * Sets the item in the in-memory cache and then tries to set it in the asynchronous\r\n     * storage object with the given key.\r\n     * @param key \r\n     * @param value \r\n     */\r\n    async setItem(key: string, value: T): Promise<void> {\r\n        this.inMemoryCache.setItem(key, value);\r\n        try {\r\n            await this.indexedDBCache.setItem(key, value);\r\n        } catch (e) {\r\n            this.handleDatabaseAccessError(e);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Removes the item matching the key from the in-memory cache, then tries to remove it from the asynchronous storage object.\r\n     * @param key \r\n     */\r\n    async removeItem(key: string): Promise<void> {\r\n        this.inMemoryCache.removeItem(key);\r\n        try {\r\n            await this.indexedDBCache.removeItem(key);\r\n        } catch (e) {\r\n            this.handleDatabaseAccessError(e);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Get all the keys from the in-memory cache as an iterable array of strings. If no keys are found, query the keys in the \r\n     * asynchronous storage object.\r\n     */\r\n    async getKeys(): Promise<string[]> {\r\n        const cacheKeys = this.inMemoryCache.getKeys();\r\n        if (cacheKeys.length === 0) {\r\n            try {\r\n                this.logger.verbose(\"In-memory cache is empty, now querying persistent storage.\");\r\n                return await this.indexedDBCache.getKeys();\r\n            } catch (e) {\r\n                this.handleDatabaseAccessError(e);\r\n            }\r\n        }\r\n        return cacheKeys;\r\n    }\r\n\r\n    /**\r\n     * Returns true or false if the given key is present in the cache.\r\n     * @param key \r\n     */\r\n    async containsKey(key: string): Promise<boolean> {\r\n        const containsKey = this.inMemoryCache.containsKey(key);\r\n        if(!containsKey) {\r\n            try {\r\n                this.logger.verbose(\"Key not found in in-memory cache, now querying persistent storage.\");\r\n                return await this.indexedDBCache.containsKey(key);\r\n            } catch (e) {\r\n                this.handleDatabaseAccessError(e);\r\n            }\r\n        }\r\n        return containsKey;\r\n    }\r\n\r\n    /**\r\n     * Clears in-memory Map\r\n     */\r\n    clearInMemory(): void {\r\n        // InMemory cache is a Map instance, clear is straightforward\r\n        this.logger.verbose(`Deleting in-memory keystore ${this.storeName}`);\r\n        this.inMemoryCache.clear();\r\n        this.logger.verbose(`In-memory keystore ${this.storeName} deleted`);\r\n    }\r\n\r\n    /**\r\n     * Tries to delete the IndexedDB database\r\n     * @returns\r\n     */\r\n    async clearPersistent(): Promise<boolean> {\r\n        try {\r\n            this.logger.verbose(\"Deleting persistent keystore\");\r\n            const dbDeleted = await this.indexedDBCache.deleteDatabase();\r\n            if (dbDeleted) {\r\n                this.logger.verbose(\"Persistent keystore deleted\");\r\n            }\r\n            \r\n            return dbDeleted;\r\n        } catch (e) {\r\n            this.handleDatabaseAccessError(e);\r\n            return false;\r\n        }\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ICrypto, IPerformanceClient, JoseHeader, Logger, PerformanceEvents, PkceCodes, SignedHttpRequest, SignedHttpRequestParameters } from \"@azure/msal-common\";\r\nimport { GuidGenerator } from \"./GuidGenerator\";\r\nimport { Base64Encode } from \"../encode/Base64Encode\";\r\nimport { Base64Decode } from \"../encode/Base64Decode\";\r\nimport { PkceGenerator } from \"./PkceGenerator\";\r\nimport { BrowserCrypto } from \"./BrowserCrypto\";\r\nimport { BrowserStringUtils } from \"../utils/BrowserStringUtils\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { CryptoKeyStore } from \"../cache/CryptoKeyStore\";\r\nimport { CryptoOptions } from \"../config/Configuration\";\r\n\r\nexport type CachedKeyPair = {\r\n    publicKey: CryptoKey,\r\n    privateKey: CryptoKey,\r\n    requestMethod?: string,\r\n    requestUri?: string\r\n};\r\n\r\n/**\r\n * This class implements MSAL's crypto interface, which allows it to perform base64 encoding and decoding, generating cryptographically random GUIDs and \r\n * implementing Proof Key for Code Exchange specs for the OAuth Authorization Code Flow using PKCE (rfc here: https://tools.ietf.org/html/rfc7636).\r\n */\r\nexport class CryptoOps implements ICrypto {\r\n\r\n    private browserCrypto: BrowserCrypto;\r\n    private guidGenerator: GuidGenerator;\r\n    private b64Encode: Base64Encode;\r\n    private b64Decode: Base64Decode;\r\n    private pkceGenerator: PkceGenerator;\r\n    private logger: Logger;\r\n\r\n    /**\r\n     * CryptoOps can be used in contexts outside a PCA instance,\r\n     * meaning there won't be a performance manager available.\r\n     */\r\n    private performanceClient: IPerformanceClient | undefined;\r\n\r\n    private static POP_KEY_USAGES: Array<KeyUsage> = [\"sign\", \"verify\"];\r\n    private static EXTRACTABLE: boolean = true;\r\n    private cache: CryptoKeyStore;\r\n\r\n    constructor(logger: Logger, performanceClient?: IPerformanceClient, cryptoConfig?: CryptoOptions) {\r\n        this.logger = logger;\r\n        // Browser crypto needs to be validated first before any other classes can be set.\r\n        this.browserCrypto = new BrowserCrypto(this.logger, cryptoConfig);\r\n        this.b64Encode = new Base64Encode();\r\n        this.b64Decode = new Base64Decode();\r\n        this.guidGenerator = new GuidGenerator(this.browserCrypto);\r\n        this.pkceGenerator = new PkceGenerator(this.browserCrypto);\r\n        this.cache = new CryptoKeyStore(this.logger);\r\n        this.performanceClient = performanceClient;\r\n    }\r\n\r\n    /**\r\n     * Creates a new random GUID - used to populate state and nonce.\r\n     * @returns string (GUID)\r\n     */\r\n    createNewGuid(): string {\r\n        return this.guidGenerator.generateGuid();\r\n    }\r\n\r\n    /**\r\n     * Encodes input string to base64.\r\n     * @param input \r\n     */\r\n    base64Encode(input: string): string {\r\n        return this.b64Encode.encode(input);\r\n    }    \r\n    \r\n    /**\r\n     * Decodes input string from base64.\r\n     * @param input \r\n     */\r\n    base64Decode(input: string): string {\r\n        return this.b64Decode.decode(input);\r\n    }\r\n\r\n    /**\r\n     * Generates PKCE codes used in Authorization Code Flow.\r\n     */\r\n    async generatePkceCodes(): Promise<PkceCodes> {\r\n        return this.pkceGenerator.generateCodes();\r\n    }\r\n\r\n    /**\r\n     * Generates a keypair, stores it and returns a thumbprint\r\n     * @param request\r\n     */\r\n    async getPublicKeyThumbprint(request: SignedHttpRequestParameters): Promise<string> {\r\n        const publicKeyThumbMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.CryptoOptsGetPublicKeyThumbprint, request.correlationId);\r\n\r\n        // Generate Keypair\r\n        const keyPair: CryptoKeyPair = await this.browserCrypto.generateKeyPair(CryptoOps.EXTRACTABLE, CryptoOps.POP_KEY_USAGES);\r\n\r\n        // Generate Thumbprint for Public Key\r\n        const publicKeyJwk: JsonWebKey = await this.browserCrypto.exportJwk(keyPair.publicKey);\r\n        \r\n        const pubKeyThumprintObj: JsonWebKey = {\r\n            e: publicKeyJwk.e,\r\n            kty: publicKeyJwk.kty,\r\n            n: publicKeyJwk.n\r\n        };\r\n        \r\n        const publicJwkString: string = BrowserStringUtils.getSortedObjectString(pubKeyThumprintObj);\r\n        const publicJwkHash = await this.hashString(publicJwkString);\r\n\r\n        // Generate Thumbprint for Private Key\r\n        const privateKeyJwk: JsonWebKey = await this.browserCrypto.exportJwk(keyPair.privateKey);\r\n        // Re-import private key to make it unextractable\r\n        const unextractablePrivateKey: CryptoKey = await this.browserCrypto.importJwk(privateKeyJwk, false, [\"sign\"]);\r\n\r\n        // Store Keypair data in keystore\r\n        await this.cache.asymmetricKeys.setItem(\r\n            publicJwkHash, \r\n            {\r\n                privateKey: unextractablePrivateKey,\r\n                publicKey: keyPair.publicKey,\r\n                requestMethod: request.resourceRequestMethod,\r\n                requestUri: request.resourceRequestUri\r\n            }\r\n        );\r\n\r\n        if (publicKeyThumbMeasurement) {\r\n            publicKeyThumbMeasurement.endMeasurement({\r\n                success: true\r\n            });\r\n        }\r\n\r\n        return publicJwkHash;\r\n    }\r\n\r\n    /**\r\n     * Removes cryptographic keypair from key store matching the keyId passed in\r\n     * @param kid \r\n     */\r\n    async removeTokenBindingKey(kid: string): Promise<boolean> {\r\n        await this.cache.asymmetricKeys.removeItem(kid);\r\n        const keyFound = await this.cache.asymmetricKeys.containsKey(kid);\r\n        return !keyFound;\r\n    }\r\n\r\n    /**\r\n     * Removes all cryptographic keys from IndexedDB storage\r\n     */\r\n    async clearKeystore(): Promise<boolean> {\r\n        return await this.cache.clear();\r\n    }\r\n\r\n    /**\r\n     * Signs the given object as a jwt payload with private key retrieved by given kid.\r\n     * @param payload \r\n     * @param kid \r\n     */\r\n    async signJwt(payload: SignedHttpRequest, kid: string, correlationId?: string): Promise<string> {\r\n        const signJwtMeasurement = this.performanceClient?.startMeasurement(PerformanceEvents.CryptoOptsSignJwt, correlationId);\r\n        const cachedKeyPair = await this.cache.asymmetricKeys.getItem(kid);\r\n        \r\n        if (!cachedKeyPair) {\r\n            throw BrowserAuthError.createSigningKeyNotFoundInStorageError(kid);\r\n        }\r\n\r\n        // Get public key as JWK\r\n        const publicKeyJwk = await this.browserCrypto.exportJwk(cachedKeyPair.publicKey);\r\n        const publicKeyJwkString = BrowserStringUtils.getSortedObjectString(publicKeyJwk);\r\n\r\n        // Base64URL encode public key thumbprint with keyId only: BASE64URL({ kid: \"FULL_PUBLIC_KEY_HASH\" })\r\n        const encodedKeyIdThumbprint = this.b64Encode.urlEncode(JSON.stringify({ kid: kid }));\r\n        \r\n        // Generate header\r\n        const shrHeader = JoseHeader.getShrHeaderString({ kid: encodedKeyIdThumbprint, alg: publicKeyJwk.alg });\r\n        const encodedShrHeader = this.b64Encode.urlEncode(shrHeader);\r\n\r\n        // Generate payload\r\n        payload.cnf = {\r\n            jwk: JSON.parse(publicKeyJwkString)\r\n        };\r\n        const encodedPayload = this.b64Encode.urlEncode(JSON.stringify(payload));\r\n\r\n        // Form token string\r\n        const tokenString = `${encodedShrHeader}.${encodedPayload}`;\r\n\r\n        // Sign token\r\n        const tokenBuffer = BrowserStringUtils.stringToArrayBuffer(tokenString);\r\n        const signatureBuffer = await this.browserCrypto.sign(cachedKeyPair.privateKey, tokenBuffer);\r\n        const encodedSignature = this.b64Encode.urlEncodeArr(new Uint8Array(signatureBuffer));\r\n\r\n        const signedJwt = `${tokenString}.${encodedSignature}`;\r\n\r\n        if (signJwtMeasurement) {\r\n            signJwtMeasurement.endMeasurement({\r\n                success: true\r\n            });\r\n        }\r\n\r\n        return signedJwt;\r\n    }\r\n\r\n    /**\r\n     * Returns the SHA-256 hash of an input string\r\n     * @param plainText\r\n     */\r\n    async hashString(plainText: string): Promise<string> {\r\n        const hashBuffer: ArrayBuffer = await this.browserCrypto.sha256Digest(plainText);\r\n        const hashBytes = new Uint8Array(hashBuffer);\r\n        return this.b64Encode.urlEncodeArr(hashBytes);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ApplicationTelemetry } from \"../../config/ClientConfiguration\";\r\nimport { Logger } from \"../../logger/Logger\";\r\nimport {\r\n    InProgressPerformanceEvent,\r\n    IPerformanceClient,\r\n    PerformanceCallbackFunction,\r\n    QueueMeasurement\r\n} from \"./IPerformanceClient\";\r\nimport { IPerformanceMeasurement } from \"./IPerformanceMeasurement\";\r\nimport {\r\n    Counters,\r\n    IntFields,\r\n    PerformanceEvent,\r\n    PerformanceEvents,\r\n    PerformanceEventStatus,\r\n    StaticFields\r\n} from \"./PerformanceEvent\";\r\n\r\nexport interface PreQueueEvent {\r\n    name: PerformanceEvents;\r\n    time: number;\r\n}\r\n\r\nexport abstract class PerformanceClient implements IPerformanceClient {\r\n    protected authority: string;\r\n    protected libraryName: string;\r\n    protected libraryVersion: string;\r\n    protected applicationTelemetry: ApplicationTelemetry;\r\n    protected clientId: string;\r\n    protected logger: Logger;\r\n    protected callbacks: Map<string, PerformanceCallbackFunction>;\r\n\r\n    /**\r\n     * Multiple events with the same correlation id.\r\n     * @protected\r\n     * @type {Map<string, PerformanceEvent>}\r\n     */\r\n    protected eventsByCorrelationId: Map<string, PerformanceEvent>;\r\n\r\n    /**\r\n     * Map of pre-queue times by correlation Id\r\n     *\r\n     * @protected\r\n     * @type {Map<string, PreQueueEvent>}\r\n     */\r\n    protected preQueueTimeByCorrelationId: Map<string, PreQueueEvent>;\r\n\r\n    /**\r\n     * Map of queue measurements by correlation Id\r\n     *\r\n     * @protected\r\n     * @type {Map<string, Array<QueueMeasurement>>}\r\n     */\r\n    protected queueMeasurements: Map<string, Array<QueueMeasurement>>;\r\n\r\n    /**\r\n     * Creates an instance of PerformanceClient,\r\n     * an abstract class containing core performance telemetry logic.\r\n     *\r\n     * @constructor\r\n     * @param {string} clientId Client ID of the application\r\n     * @param {string} authority Authority used by the application\r\n     * @param {Logger} logger Logger used by the application\r\n     * @param {string} libraryName Name of the library\r\n     * @param {string} libraryVersion Version of the library\r\n     */\r\n    constructor(clientId: string, authority: string, logger: Logger, libraryName: string, libraryVersion: string, applicationTelemetry: ApplicationTelemetry) {\r\n        this.authority = authority;\r\n        this.libraryName = libraryName;\r\n        this.libraryVersion = libraryVersion;\r\n        this.applicationTelemetry = applicationTelemetry;\r\n        this.clientId = clientId;\r\n        this.logger = logger;\r\n        this.callbacks = new Map();\r\n        this.eventsByCorrelationId = new Map();\r\n        this.queueMeasurements = new Map();\r\n        this.preQueueTimeByCorrelationId = new Map();\r\n    }\r\n\r\n    /**\r\n     * Generates and returns a unique id, typically a guid.\r\n     *\r\n     * @abstract\r\n     * @returns {string}\r\n     */\r\n    abstract generateId(): string;\r\n\r\n    /**\r\n     * Starts and returns an platform-specific implementation of IPerformanceMeasurement.\r\n     * Note: this function can be changed to abstract at the next major version bump.\r\n     *\r\n     * @param {string} measureName\r\n     * @param {string} correlationId\r\n     * @returns {IPerformanceMeasurement}\r\n     */\r\n    /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\r\n    startPerformanceMeasurement(measureName: string, correlationId: string): IPerformanceMeasurement {\r\n        return {} as IPerformanceMeasurement;\r\n    }\r\n\r\n    /**\r\n     * Starts and returns an platform-specific implementation of IPerformanceMeasurement.\r\n     * Note: this incorrectly-named function will be removed at the next major version bump.\r\n     *\r\n     * @param {string} measureName\r\n     * @param {string} correlationId\r\n     * @returns {IPerformanceMeasurement}\r\n     */\r\n    /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\r\n    startPerformanceMeasuremeant(measureName: string, correlationId: string): IPerformanceMeasurement {\r\n        return {} as IPerformanceMeasurement;\r\n    }\r\n\r\n    /**\r\n     * Sets pre-queue time by correlation Id\r\n     *\r\n     * @abstract\r\n     * @param {PerformanceEvents} eventName\r\n     * @param {string} correlationId\r\n     * @returns\r\n     */\r\n    abstract setPreQueueTime(eventName: PerformanceEvents, correlationId?: string): void;\r\n\r\n    /**\r\n     * Get integral fields.\r\n     * Override to change the set.\r\n     */\r\n    getIntFields(): ReadonlySet<string> {\r\n        return IntFields;\r\n    }\r\n\r\n    /**\r\n     * Gets map of pre-queue times by correlation Id\r\n     *\r\n     * @param {PerformanceEvents} eventName\r\n     * @param {string} correlationId\r\n     * @returns {number}\r\n     */\r\n    getPreQueueTime(eventName: PerformanceEvents, correlationId: string): number | void {\r\n        const preQueueEvent: PreQueueEvent | undefined = this.preQueueTimeByCorrelationId.get(correlationId);\r\n\r\n        if (!preQueueEvent) {\r\n            this.logger.trace(`PerformanceClient.getPreQueueTime: no pre-queue times found for correlationId: ${correlationId}, unable to add queue measurement`);\r\n            return;\r\n        } else if (preQueueEvent.name !== eventName) {\r\n            this.logger.trace(`PerformanceClient.getPreQueueTime: no pre-queue time found for ${eventName}, unable to add queue measurement`);\r\n            return;\r\n        }\r\n\r\n        return preQueueEvent.time;\r\n    }\r\n\r\n    /**\r\n     * Calculates the difference between current time and time when function was queued.\r\n     * Note: It is possible to have 0 as the queue time if the current time and the queued time was the same.\r\n     *\r\n     * @param {number} preQueueTime\r\n     * @param {number} currentTime\r\n     * @returns {number}\r\n     */\r\n    calculateQueuedTime(preQueueTime: number, currentTime: number): number {\r\n        if (preQueueTime < 1) {\r\n            this.logger.trace(`PerformanceClient: preQueueTime should be a positive integer and not ${preQueueTime}`);\r\n            return 0;\r\n        }\r\n\r\n        if (currentTime < 1) {\r\n            this.logger.trace(`PerformanceClient: currentTime should be a positive integer and not ${currentTime}`);\r\n            return 0;\r\n        }\r\n\r\n        if (currentTime < preQueueTime) {\r\n            this.logger.trace(\"PerformanceClient: currentTime is less than preQueueTime, check how time is being retrieved\");\r\n            return 0;\r\n        }\r\n\r\n        return currentTime-preQueueTime;\r\n    }\r\n\r\n    /**\r\n     * Adds queue measurement time to QueueMeasurements array for given correlation ID.\r\n     *\r\n     * @param {PerformanceEvents} eventName\r\n     * @param {?string} correlationId\r\n     * @param {?number} queueTime\r\n     * @param {?boolean} manuallyCompleted - indicator for manually completed queue measurements\r\n     * @returns\r\n     */\r\n    addQueueMeasurement(eventName: PerformanceEvents, correlationId?: string, queueTime?: number, manuallyCompleted?: boolean): void {\r\n        if (!correlationId) {\r\n            this.logger.trace(`PerformanceClient.addQueueMeasurement: correlationId not provided for ${eventName}, cannot add queue measurement`);\r\n            return;\r\n        }\r\n\r\n        if (queueTime === 0) {\r\n            // Possible for there to be no queue time after calculation\r\n            this.logger.trace(`PerformanceClient.addQueueMeasurement: queue time provided for ${eventName} is ${queueTime}`);\r\n        } else if (!queueTime) {\r\n            this.logger.trace(`PerformanceClient.addQueueMeasurement: no queue time provided for ${eventName}`);\r\n            return;\r\n        }\r\n\r\n        const queueMeasurement: QueueMeasurement = {eventName, queueTime, manuallyCompleted};\r\n\r\n        // Adds to existing correlation Id if present in queueMeasurements\r\n        const existingMeasurements = this.queueMeasurements.get(correlationId);\r\n        if (existingMeasurements) {\r\n            existingMeasurements.push(queueMeasurement);\r\n            this.queueMeasurements.set(correlationId, existingMeasurements);\r\n        } else {\r\n            // Sets new correlation Id if not present in queueMeasurements\r\n            this.logger.trace(`PerformanceClient.addQueueMeasurement: adding correlationId ${correlationId} to queue measurements`);\r\n            const measurementArray = [queueMeasurement];\r\n            this.queueMeasurements.set(correlationId, measurementArray);\r\n        }\r\n        // Delete processed pre-queue event.\r\n        this.preQueueTimeByCorrelationId.delete(correlationId);\r\n    }\r\n\r\n    /**\r\n     * Starts measuring performance for a given operation. Returns a function that should be used to end the measurement.\r\n     *\r\n     * @param {PerformanceEvents} measureName\r\n     * @param {?string} [correlationId]\r\n     * @returns {InProgressPerformanceEvent}\r\n     */\r\n    startMeasurement(measureName: PerformanceEvents, correlationId?: string): InProgressPerformanceEvent {\r\n        // Generate a placeholder correlation if the request does not provide one\r\n        const eventCorrelationId = correlationId || this.generateId();\r\n        if (!correlationId) {\r\n            this.logger.info(`PerformanceClient: No correlation id provided for ${measureName}, generating`, eventCorrelationId);\r\n        }\r\n\r\n        // Duplicate code to address spelling error will be removed at the next major version bump.\r\n        this.logger.trace(`PerformanceClient: Performance measurement started for ${measureName}`, eventCorrelationId);\r\n        const performanceMeasurement = this.startPerformanceMeasuremeant(measureName, eventCorrelationId);\r\n        performanceMeasurement.startMeasurement();\r\n\r\n        const inProgressEvent: PerformanceEvent = {\r\n            eventId: this.generateId(),\r\n            status: PerformanceEventStatus.InProgress,\r\n            authority: this.authority,\r\n            libraryName: this.libraryName,\r\n            libraryVersion: this.libraryVersion,\r\n            clientId: this.clientId,\r\n            name: measureName,\r\n            startTimeMs: Date.now(),\r\n            correlationId: eventCorrelationId,\r\n            appName: this.applicationTelemetry?.appName,\r\n            appVersion: this.applicationTelemetry?.appVersion,\r\n        };\r\n\r\n        // Store in progress events so they can be discarded if not ended properly\r\n        this.cacheEventByCorrelationId(inProgressEvent);\r\n\r\n        // Return the event and functions the caller can use to properly end/flush the measurement\r\n        return {\r\n            endMeasurement: (event?: Partial<PerformanceEvent>): PerformanceEvent | null => {\r\n                return this.endMeasurement({\r\n                    // Initial set of event properties\r\n                    ...inProgressEvent,\r\n                    // Properties set when event ends\r\n                    ...event\r\n                },\r\n                performanceMeasurement);\r\n            },\r\n            discardMeasurement: () => {\r\n                return this.discardMeasurements(inProgressEvent.correlationId);\r\n            },\r\n            addStaticFields: (fields: StaticFields) => {\r\n                return this.addStaticFields(fields, inProgressEvent.correlationId);\r\n            },\r\n            increment: (counters: Counters) => {\r\n                return this.increment(counters, inProgressEvent.correlationId);\r\n            },\r\n            measurement: performanceMeasurement,\r\n            event: inProgressEvent\r\n        };\r\n\r\n    }\r\n\r\n    /**\r\n     * Stops measuring the performance for an operation. Should only be called directly by PerformanceClient classes,\r\n     * as consumers should instead use the function returned by startMeasurement.\r\n     * Adds a new field named as \"[event name]DurationMs\" for sub-measurements, completes and emits an event\r\n     * otherwise.\r\n     *\r\n     * @param {PerformanceEvent} event\r\n     * @param {IPerformanceMeasurement} measurement\r\n     * @returns {(PerformanceEvent | null)}\r\n     */\r\n    endMeasurement(event: PerformanceEvent, measurement?: IPerformanceMeasurement): PerformanceEvent | null {\r\n        const rootEvent: PerformanceEvent | undefined = this.eventsByCorrelationId.get(event.correlationId);\r\n        if (!rootEvent) {\r\n            this.logger.trace(`PerformanceClient: Measurement not found for ${event.eventId}`, event.correlationId);\r\n            return null;\r\n        }\r\n\r\n        const isRoot = event.eventId === rootEvent.eventId;\r\n        let queueInfo = {\r\n            totalQueueTime: 0,\r\n            totalQueueCount: 0,\r\n            manuallyCompletedCount: 0\r\n        };\r\n        if (isRoot) {\r\n            queueInfo = this.getQueueInfo(event.correlationId);\r\n            this.discardCache(rootEvent.correlationId);\r\n        } else {\r\n            rootEvent.incompleteSubMeasurements?.delete(event.eventId);\r\n        }\r\n\r\n        measurement?.endMeasurement();\r\n        const durationMs = measurement?.flushMeasurement();\r\n        // null indicates no measurement was taken (e.g. needed performance APIs not present)\r\n        if (!durationMs) {\r\n            this.logger.trace(\"PerformanceClient: Performance measurement not taken\", rootEvent.correlationId);\r\n            return null;\r\n        }\r\n\r\n        this.logger.trace(`PerformanceClient: Performance measurement ended for ${event.name}: ${durationMs} ms`, event.correlationId);\r\n\r\n        // Add sub-measurement attribute to root event.\r\n        if (!isRoot) {\r\n            rootEvent[event.name + \"DurationMs\"] = Math.floor(durationMs);\r\n            return { ...rootEvent };\r\n        }\r\n\r\n        let finalEvent: PerformanceEvent = { ...rootEvent, ...event };\r\n        let incompleteSubsCount: number = 0;\r\n        // Incomplete sub-measurements are discarded. They are likely an instrumentation bug that should be fixed.\r\n        finalEvent.incompleteSubMeasurements?.forEach(subMeasurement => {\r\n            this.logger.trace(`PerformanceClient: Incomplete submeasurement ${subMeasurement.name} found for ${event.name}`, finalEvent.correlationId);\r\n            incompleteSubsCount++;\r\n        });\r\n        finalEvent.incompleteSubMeasurements = undefined;\r\n\r\n        finalEvent = {\r\n            ...finalEvent,\r\n            durationMs: Math.round(durationMs),\r\n            queuedTimeMs: queueInfo.totalQueueTime,\r\n            queuedCount: queueInfo.totalQueueCount,\r\n            queuedManuallyCompletedCount: queueInfo.manuallyCompletedCount,\r\n            status: PerformanceEventStatus.Completed,\r\n            incompleteSubsCount\r\n        };\r\n        this.truncateIntegralFields(finalEvent, this.getIntFields());\r\n        this.emitEvents([finalEvent], event.correlationId);\r\n\r\n        return finalEvent;\r\n    }\r\n\r\n    /**\r\n     * Saves extra information to be emitted when the measurements are flushed\r\n     * @param fields\r\n     * @param correlationId\r\n     */\r\n    addStaticFields(fields: StaticFields, correlationId: string) : void {\r\n        this.logger.trace(\"PerformanceClient: Updating static fields\");\r\n        const event = this.eventsByCorrelationId.get(correlationId);\r\n        if (event) {\r\n            this.eventsByCorrelationId.set(correlationId, {...event, ...fields});\r\n        } else {\r\n            this.logger.trace(\"PerformanceClient: Event not found for\", correlationId);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Increment counters to be emitted when the measurements are flushed\r\n     * @param counters {Counters}\r\n     * @param correlationId {string} correlation identifier\r\n     */\r\n    increment(counters: Counters, correlationId: string): void {\r\n        this.logger.trace(\"PerformanceClient: Updating counters\");\r\n        const event = this.eventsByCorrelationId.get(correlationId);\r\n        if (event) {\r\n            for (const counter in counters) {\r\n                if (!event.hasOwnProperty(counter)) {\r\n                    event[counter] = 0;\r\n                }\r\n                event[counter] += counters[counter];\r\n            }\r\n        } else {\r\n            this.logger.trace(\"PerformanceClient: Event not found for\", correlationId);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Upserts event into event cache.\r\n     * First key is the correlation id, second key is the event id.\r\n     * Allows for events to be grouped by correlation id,\r\n     * and to easily allow for properties on them to be updated.\r\n     *\r\n     * @private\r\n     * @param {PerformanceEvent} event\r\n     */\r\n    private cacheEventByCorrelationId(event: PerformanceEvent) {\r\n        const rootEvent = this.eventsByCorrelationId.get(event.correlationId);\r\n        if (rootEvent) {\r\n            this.logger.trace(`PerformanceClient: Performance measurement for ${event.name} added/updated`, event.correlationId);\r\n            rootEvent.incompleteSubMeasurements = rootEvent.incompleteSubMeasurements || new Map();\r\n            rootEvent.incompleteSubMeasurements.set(event.eventId, {name: event.name, startTimeMs: event.startTimeMs });\r\n        } else {\r\n            this.logger.trace(`PerformanceClient: Performance measurement for ${event.name} started`, event.correlationId);\r\n            this.eventsByCorrelationId.set(event.correlationId, { ...event });\r\n        }\r\n    }\r\n\r\n    private getQueueInfo(correlationId: string): { totalQueueTime: number, totalQueueCount: number, manuallyCompletedCount: number } {\r\n        const queueMeasurementForCorrelationId = this.queueMeasurements.get(correlationId);\r\n        if (!queueMeasurementForCorrelationId) {\r\n            this.logger.trace(`PerformanceClient: no queue measurements found for for correlationId: ${correlationId}`);\r\n        }\r\n\r\n        let totalQueueTime = 0;\r\n        let totalQueueCount = 0;\r\n        let manuallyCompletedCount = 0;\r\n        queueMeasurementForCorrelationId?.forEach((measurement) => {\r\n            totalQueueTime += measurement.queueTime;\r\n            totalQueueCount++;\r\n            manuallyCompletedCount += measurement.manuallyCompleted ? 1 : 0;\r\n        });\r\n\r\n        return {\r\n            totalQueueTime,\r\n            totalQueueCount,\r\n            manuallyCompletedCount\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Removes measurements for a given correlation id.\r\n     *\r\n     * @param {string} correlationId\r\n     */\r\n    discardMeasurements(correlationId: string): void {\r\n        this.logger.trace(\"PerformanceClient: Performance measurements discarded\", correlationId);\r\n        this.eventsByCorrelationId.delete(correlationId);\r\n    }\r\n\r\n    /**\r\n     * Removes cache for a given correlation id.\r\n     *\r\n     * @param {string} correlationId correlation identifier\r\n     */\r\n    private discardCache(correlationId: string): void {\r\n        this.discardMeasurements(correlationId);\r\n\r\n        this.logger.trace(\"PerformanceClient: QueueMeasurements discarded\", correlationId);\r\n        this.queueMeasurements.delete(correlationId);\r\n\r\n        this.logger.trace(\"PerformanceClient: Pre-queue times discarded\", correlationId);\r\n        this.preQueueTimeByCorrelationId.delete(correlationId);\r\n    }\r\n\r\n    /**\r\n     * Registers a callback function to receive performance events.\r\n     *\r\n     * @param {PerformanceCallbackFunction} callback\r\n     * @returns {string}\r\n     */\r\n    addPerformanceCallback(callback: PerformanceCallbackFunction): string {\r\n        const callbackId = this.generateId();\r\n        this.callbacks.set(callbackId, callback);\r\n        this.logger.verbose(`PerformanceClient: Performance callback registered with id: ${callbackId}`);\r\n\r\n        return callbackId;\r\n    }\r\n\r\n    /**\r\n     * Removes a callback registered with addPerformanceCallback.\r\n     *\r\n     * @param {string} callbackId\r\n     * @returns {boolean}\r\n     */\r\n    removePerformanceCallback(callbackId: string): boolean {\r\n        const result = this.callbacks.delete(callbackId);\r\n\r\n        if (result) {\r\n            this.logger.verbose(`PerformanceClient: Performance callback ${callbackId} removed.`);\r\n        } else {\r\n            this.logger.verbose(`PerformanceClient: Performance callback ${callbackId} not removed.`);\r\n        }\r\n\r\n        return result;\r\n    }\r\n\r\n    /**\r\n     * Emits events to all registered callbacks.\r\n     *\r\n     * @param {PerformanceEvent[]} events\r\n     * @param {?string} [correlationId]\r\n     */\r\n    emitEvents(events: PerformanceEvent[], correlationId: string): void {\r\n        this.logger.verbose(\"PerformanceClient: Emitting performance events\", correlationId);\r\n\r\n        this.callbacks.forEach((callback: PerformanceCallbackFunction, callbackId: string) => {\r\n            this.logger.trace(`PerformanceClient: Emitting event to callback ${callbackId}`, correlationId);\r\n            callback.apply(null, [events]);\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Enforce truncation of integral fields in performance event.\r\n     * @param {PerformanceEvent} event performance event to update.\r\n     * @param {Set<string>} intFields integral fields.\r\n     */\r\n    private truncateIntegralFields(event: PerformanceEvent, intFields: ReadonlySet<string>): void {\r\n        intFields.forEach((key) => {\r\n            if (key in event && typeof event[key] === \"number\") {\r\n                event[key] = Math.floor(event[key]);\r\n            }\r\n        });\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { IPerformanceMeasurement, SubMeasurement } from \"@azure/msal-common\";\r\n\r\nexport class BrowserPerformanceMeasurement implements IPerformanceMeasurement {\r\n    private readonly measureName: string;\r\n    private readonly correlationId: string;\r\n    private readonly startMark: string;\r\n    private readonly endMark: string;\r\n\r\n    constructor(name: string, correlationId: string) {\r\n        this.correlationId = correlationId;\r\n        this.measureName = BrowserPerformanceMeasurement.makeMeasureName(name, correlationId);\r\n        this.startMark = BrowserPerformanceMeasurement.makeStartMark(name, correlationId);\r\n        this.endMark = BrowserPerformanceMeasurement.makeEndMark(name, correlationId);\r\n    }\r\n\r\n    private static makeMeasureName(name: string, correlationId: string) {\r\n        return `msal.measure.${name}.${correlationId}`;\r\n    }\r\n\r\n    private static makeStartMark(name: string, correlationId: string) {\r\n        return `msal.start.${name}.${correlationId}`;\r\n    }\r\n\r\n    private static makeEndMark(name: string, correlationId: string) {\r\n        return `msal.end.${name}.${correlationId}`;\r\n    }\r\n\r\n    static supportsBrowserPerformance(): boolean {\r\n        return typeof window !== \"undefined\" &&\r\n            typeof window.performance !== \"undefined\" &&\r\n            typeof window.performance.mark === \"function\" &&\r\n            typeof window.performance.measure === \"function\" &&\r\n            typeof window.performance.clearMarks === \"function\" &&\r\n            typeof window.performance.clearMeasures === \"function\" &&\r\n            typeof window.performance.getEntriesByName === \"function\";\r\n    }\r\n\r\n    /**\r\n     * Flush browser marks and measurements.\r\n     * @param {string} correlationId\r\n     * @param {SubMeasurement} measurements\r\n     */\r\n    public static flushMeasurements(correlationId: string, measurements: SubMeasurement[]): void {\r\n        if (BrowserPerformanceMeasurement.supportsBrowserPerformance()) {\r\n            try {\r\n                measurements.forEach((measurement) => {\r\n                    const measureName = BrowserPerformanceMeasurement.makeMeasureName(measurement.name, correlationId);\r\n                    const entriesForMeasurement = window.performance.getEntriesByName(measureName, \"measure\");\r\n                    if (entriesForMeasurement.length > 0) {\r\n                        window.performance.clearMeasures(measureName);\r\n                        window.performance.clearMarks(BrowserPerformanceMeasurement.makeStartMark(measureName, correlationId));\r\n                        window.performance.clearMarks(BrowserPerformanceMeasurement.makeEndMark(measureName, correlationId));\r\n                    }\r\n                });\r\n            } catch (e) {\r\n                // Silently catch and return null\r\n            }\r\n        }\r\n    }\r\n\r\n    startMeasurement(): void {\r\n        if (BrowserPerformanceMeasurement.supportsBrowserPerformance()) {\r\n            try {\r\n                window.performance.mark(this.startMark);\r\n            } catch (e) {\r\n                // Silently catch\r\n            }\r\n        }\r\n    }\r\n\r\n    endMeasurement():void {\r\n        if (BrowserPerformanceMeasurement.supportsBrowserPerformance()) {\r\n            try {\r\n                window.performance.mark(this.endMark);\r\n                window.performance.measure(this.measureName, this.startMark, this.endMark);\r\n            } catch (e) {\r\n                // Silently catch\r\n            }\r\n        }\r\n    }\r\n\r\n    flushMeasurement(): number | null {\r\n        if (BrowserPerformanceMeasurement.supportsBrowserPerformance()) {\r\n            try {\r\n                const entriesForMeasurement = window.performance.getEntriesByName(this.measureName, \"measure\");\r\n                if (entriesForMeasurement.length > 0) {\r\n                    const durationMs = entriesForMeasurement[0].duration;\r\n                    window.performance.clearMeasures(this.measureName);\r\n                    window.performance.clearMarks(this.startMark);\r\n                    window.performance.clearMarks(this.endMark);\r\n                    return durationMs;\r\n                }\r\n            } catch (e) {\r\n                // Silently catch and return null\r\n            }\r\n        }\r\n        return null;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport {\r\n    Logger,\r\n    PerformanceEvent,\r\n    PerformanceEvents,\r\n    IPerformanceClient,\r\n    PerformanceClient,\r\n    IPerformanceMeasurement,\r\n    InProgressPerformanceEvent,\r\n    ApplicationTelemetry,\r\n    SubMeasurement,\r\n    PreQueueEvent\r\n} from \"@azure/msal-common\";\r\nimport { CryptoOptions } from \"../config/Configuration\";\r\nimport { BrowserCrypto } from \"../crypto/BrowserCrypto\";\r\nimport { GuidGenerator } from \"../crypto/GuidGenerator\";\r\nimport { BrowserPerformanceMeasurement } from \"./BrowserPerformanceMeasurement\";\r\n\r\nexport class BrowserPerformanceClient extends PerformanceClient implements IPerformanceClient {\r\n    private browserCrypto: BrowserCrypto;\r\n    private guidGenerator: GuidGenerator;\r\n\r\n    constructor(clientId: string, authority: string, logger: Logger, libraryName: string, libraryVersion: string, applicationTelemetry: ApplicationTelemetry, cryptoOptions: CryptoOptions) {\r\n        super(clientId, authority, logger, libraryName, libraryVersion, applicationTelemetry);\r\n        this.browserCrypto = new BrowserCrypto(this.logger, cryptoOptions);\r\n        this.guidGenerator = new GuidGenerator(this.browserCrypto);\r\n    }\r\n\r\n    startPerformanceMeasuremeant(measureName: string, correlationId: string): IPerformanceMeasurement {\r\n        return new BrowserPerformanceMeasurement(measureName, correlationId);\r\n    }\r\n\r\n    generateId() : string {\r\n        return this.guidGenerator.generateGuid();\r\n    }\r\n\r\n    private getPageVisibility(): string | null {\r\n        return document.visibilityState?.toString() || null;\r\n    }\r\n\r\n    private deleteIncompleteSubMeasurements(inProgressEvent: InProgressPerformanceEvent): void {\r\n        const rootEvent = this.eventsByCorrelationId.get(inProgressEvent.event.correlationId);\r\n        const isRootEvent = rootEvent && rootEvent.eventId === inProgressEvent.event.eventId;\r\n        const incompleteMeasurements: SubMeasurement[] = [];\r\n        if (isRootEvent && rootEvent?.incompleteSubMeasurements) {\r\n            rootEvent.incompleteSubMeasurements.forEach((subMeasurement) => {\r\n                incompleteMeasurements.push({...subMeasurement});\r\n            });\r\n        }\r\n        // Clean up remaining marks for incomplete sub-measurements\r\n        if (incompleteMeasurements.length > 0) {\r\n            BrowserPerformanceMeasurement.flushMeasurements(inProgressEvent.event.correlationId, incompleteMeasurements);\r\n        }\r\n    }\r\n\r\n    supportsBrowserPerformanceNow(): boolean {\r\n        return typeof window !== \"undefined\" &&\r\n            typeof window.performance !== \"undefined\" &&\r\n            typeof window.performance.now === \"function\";\r\n    }\r\n\r\n    /**\r\n     * Starts measuring performance for a given operation. Returns a function that should be used to end the measurement.\r\n     * Also captures browser page visibilityState.\r\n     *\r\n     * @param {PerformanceEvents} measureName\r\n     * @param {?string} [correlationId]\r\n     * @returns {((event?: Partial<PerformanceEvent>) => PerformanceEvent| null)}\r\n     */\r\n    startMeasurement(measureName: PerformanceEvents, correlationId?: string): InProgressPerformanceEvent {\r\n        // Capture page visibilityState and then invoke start/end measurement\r\n        const startPageVisibility = this.getPageVisibility();\r\n\r\n        const inProgressEvent = super.startMeasurement(measureName, correlationId);\r\n\r\n        return {\r\n            ...inProgressEvent,\r\n            endMeasurement: (event?: Partial<PerformanceEvent>): PerformanceEvent | null => {\r\n                const res = inProgressEvent.endMeasurement({\r\n                    startPageVisibility,\r\n                    endPageVisibility: this.getPageVisibility(),\r\n                    ...event\r\n                });\r\n                this.deleteIncompleteSubMeasurements(inProgressEvent);\r\n\r\n                return res;\r\n            },\r\n            discardMeasurement: () => {\r\n                inProgressEvent.discardMeasurement();\r\n                this.deleteIncompleteSubMeasurements(inProgressEvent);\r\n                inProgressEvent.measurement.flushMeasurement();\r\n            }\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Adds pre-queue time to preQueueTimeByCorrelationId map.\r\n     * @param {PerformanceEvents} eventName\r\n     * @param {?string} correlationId\r\n     * @returns\r\n     */\r\n    setPreQueueTime(eventName: PerformanceEvents, correlationId?: string): void {\r\n        if (!this.supportsBrowserPerformanceNow()) {\r\n            this.logger.trace(`BrowserPerformanceClient: window performance API not available, unable to set telemetry queue time for ${eventName}`);\r\n            return;\r\n        }\r\n\r\n        if (!correlationId) {\r\n            this.logger.trace(`BrowserPerformanceClient: correlationId for ${eventName} not provided, unable to set telemetry queue time`);\r\n            return;\r\n        }\r\n\r\n        const preQueueEvent: PreQueueEvent | undefined = this.preQueueTimeByCorrelationId.get(correlationId);\r\n        /**\r\n         * Manually complete queue measurement if there is an incomplete pre-queue event.\r\n         * Incomplete pre-queue events are instrumentation bugs that should be fixed.\r\n         */\r\n        if (preQueueEvent) {\r\n            this.logger.trace(`BrowserPerformanceClient: Incomplete pre-queue ${preQueueEvent.name} found`, correlationId);\r\n            this.addQueueMeasurement(preQueueEvent.name, correlationId, undefined, true);\r\n        }\r\n        this.preQueueTimeByCorrelationId.set(correlationId, { name: eventName, time: window.performance.now() });\r\n    }\r\n\r\n    /**\r\n     * Calculates and adds queue time measurement for given performance event.\r\n     *\r\n     * @param {PerformanceEvents} eventName\r\n     * @param {?string} correlationId\r\n     * @param {?number} queueTime\r\n     * @param {?boolean} manuallyCompleted - indicator for manually completed queue measurements\r\n     * @returns\r\n     */\r\n    addQueueMeasurement(eventName: PerformanceEvents, correlationId?: string, queueTime?: number, manuallyCompleted?: boolean): void {\r\n        if (!this.supportsBrowserPerformanceNow()) {\r\n            this.logger.trace(`BrowserPerformanceClient: window performance API not available, unable to add queue measurement for ${eventName}`);\r\n            return;\r\n        }\r\n\r\n        if (!correlationId) {\r\n            this.logger.trace(`BrowserPerformanceClient: correlationId for ${eventName} not provided, unable to add queue measurement`);\r\n            return;\r\n        }\r\n\r\n        const preQueueTime = super.getPreQueueTime(eventName, correlationId);\r\n        if (!preQueueTime) {\r\n            return;\r\n        }\r\n\r\n        const currentTime = window.performance.now();\r\n        const resQueueTime = queueTime || super.calculateQueuedTime(preQueueTime, currentTime);\r\n\r\n        return super.addQueueMeasurement(eventName, correlationId, resQueueTime, manuallyCompleted);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { IPerformanceClient } from \"./IPerformanceClient\";\r\nimport { IPerformanceMeasurement } from \"./IPerformanceMeasurement\";\r\nimport { PerformanceClient } from \"./PerformanceClient\";\r\nimport { PerformanceEvents } from \"./PerformanceEvent\";\r\n\r\nexport class StubPerformanceMeasurement implements IPerformanceMeasurement {\r\n    /* eslint-disable-next-line @typescript-eslint/no-empty-function */\r\n    startMeasurement(): void { }\r\n    /* eslint-disable-next-line @typescript-eslint/no-empty-function */\r\n    endMeasurement(): void { }\r\n    flushMeasurement(): number | null {\r\n        return null;\r\n    }\r\n    \r\n}\r\n\r\nexport class StubPerformanceClient extends PerformanceClient implements IPerformanceClient {\r\n    generateId(): string {\r\n        return \"callback-id\";\r\n    }\r\n    \r\n    startPerformanceMeasuremeant(): IPerformanceMeasurement {\r\n        return new StubPerformanceMeasurement();\r\n    }\r\n\r\n    startPerformanceMeasurement(): IPerformanceMeasurement {\r\n        return new StubPerformanceMeasurement();\r\n    }\r\n\r\n    /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\r\n    calculateQueuedTime(preQueueTime: number, currentTime: number): number {\r\n        return 0;\r\n    }\r\n\r\n    /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\r\n    addQueueMeasurement(eventName: PerformanceEvents, correlationId: string, queueTime: number): void {\r\n        return;\r\n    }\r\n\r\n    /* eslint-disable-next-line @typescript-eslint/no-unused-vars */\r\n    setPreQueueTime(eventName: PerformanceEvents, correlationId?: string | undefined): void {\r\n        return;\r\n    }\r\n\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AccessTokenEntity, ICrypto, IdTokenEntity, Logger, ScopeSet, Authority, AuthorityOptions, ExternalTokenResponse, AccountEntity, AuthToken, RefreshTokenEntity, CacheRecord, AuthenticationResult, Constants } from \"@azure/msal-common\";\r\nimport { BrowserConfiguration } from \"../config/Configuration\";\r\nimport { SilentRequest } from \"../request/SilentRequest\";\r\nimport { BrowserCacheManager } from \"./BrowserCacheManager\";\r\nimport { ITokenCache } from \"./ITokenCache\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\n\r\nexport type LoadTokenOptions = {\r\n    clientInfo?: string,\r\n    expiresOn?: number,\r\n    extendedExpiresOn?: number\r\n};\r\n\r\n/**\r\n * Token cache manager\r\n */\r\nexport class TokenCache implements ITokenCache {\r\n    // Flag to indicate if in browser environment\r\n    public isBrowserEnvironment: boolean;\r\n    // Input configuration by developer/user\r\n    protected config: BrowserConfiguration;\r\n    // Browser cache storage\r\n    private storage: BrowserCacheManager;\r\n    // Logger\r\n    private logger: Logger;\r\n    // Crypto class\r\n    private cryptoObj: ICrypto;\r\n\r\n    constructor(configuration: BrowserConfiguration, storage: BrowserCacheManager, logger: Logger, cryptoObj: ICrypto) {\r\n        this.isBrowserEnvironment = typeof window !== \"undefined\";\r\n        this.config = configuration;\r\n        this.storage = storage;\r\n        this.logger = logger;\r\n        this.cryptoObj = cryptoObj;\r\n    }\r\n\r\n    // Move getAllAccounts here and cache utility APIs\r\n\r\n    /**\r\n     * API to load tokens to msal-browser cache.\r\n     * @param request\r\n     * @param response\r\n     * @param options\r\n     * @returns `AuthenticationResult` for the response that was loaded.\r\n     */\r\n    loadExternalTokens(request: SilentRequest, response: ExternalTokenResponse, options: LoadTokenOptions): AuthenticationResult {\r\n        this.logger.info(\"TokenCache - loadExternalTokens called\");\r\n\r\n        if (!response.id_token) {\r\n            throw BrowserAuthError.createUnableToLoadTokenError(\"Please ensure server response includes id token.\");\r\n        }\r\n\r\n        const idToken = new AuthToken(response.id_token, this.cryptoObj);\r\n\r\n        let cacheRecord: CacheRecord;\r\n        let authority: Authority | undefined;\r\n        let cacheRecordAccount: AccountEntity;\r\n\r\n        if (request.account) {\r\n            cacheRecordAccount = AccountEntity.createFromAccountInfo(request.account);\r\n            cacheRecord = new CacheRecord(\r\n                cacheRecordAccount,\r\n                this.loadIdToken(idToken, cacheRecordAccount.homeAccountId, request.account.environment, request.account.tenantId),\r\n                this.loadAccessToken(request, response, cacheRecordAccount.homeAccountId, request.account.environment, request.account.tenantId, options),\r\n                this.loadRefreshToken(request, response, cacheRecordAccount.homeAccountId, request.account.environment)\r\n            );\r\n        } else if (request.authority) {\r\n\r\n            const authorityUrl = Authority.generateAuthority(request.authority, request.azureCloudOptions);\r\n            const authorityOptions: AuthorityOptions = {\r\n                protocolMode: this.config.auth.protocolMode,\r\n                knownAuthorities: this.config.auth.knownAuthorities,\r\n                cloudDiscoveryMetadata: this.config.auth.cloudDiscoveryMetadata,\r\n                authorityMetadata: this.config.auth.authorityMetadata,\r\n                skipAuthorityMetadataCache: this.config.auth.skipAuthorityMetadataCache,\r\n            };\r\n            authority = new Authority(authorityUrl, this.config.system.networkClient, this.storage, authorityOptions, this.logger);\r\n\r\n            // \"clientInfo\" from options takes precedence over \"clientInfo\" in response\r\n            if (options.clientInfo) {\r\n                this.logger.trace(\"TokenCache - homeAccountId from options\");\r\n                cacheRecordAccount = this.loadAccount(\r\n                    idToken,\r\n                    authority,\r\n                    options.clientInfo\r\n                );\r\n                cacheRecord = new CacheRecord(\r\n                    cacheRecordAccount,\r\n                    this.loadIdToken(idToken, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant),\r\n                    this.loadAccessToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant, options),\r\n                    this.loadRefreshToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort)\r\n                );\r\n            } else if (response.client_info) {\r\n                this.logger.trace(\"TokenCache - homeAccountId from response\");\r\n                cacheRecordAccount = this.loadAccount(idToken, authority, response.client_info);\r\n                cacheRecord = new CacheRecord(\r\n                    cacheRecordAccount,\r\n                    this.loadIdToken(idToken, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant),\r\n                    this.loadAccessToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort, authority.tenant, options),\r\n                    this.loadRefreshToken(request, response, cacheRecordAccount.homeAccountId, authority.hostnameAndPort)\r\n                );\r\n            } else {\r\n                throw BrowserAuthError.createUnableToLoadTokenError(\"Please provide clientInfo in the response or options.\");\r\n            }\r\n        } else {\r\n            throw BrowserAuthError.createUnableToLoadTokenError(\"Please provide a request with an account or a request with authority.\");\r\n        }\r\n\r\n        return this.generateAuthenticationResult(request, idToken, cacheRecord, cacheRecordAccount, authority);\r\n    }\r\n\r\n    /**\r\n     * Helper function to load account to msal-browser cache\r\n     * @param idToken\r\n     * @param environment\r\n     * @param clientInfo\r\n     * @param authorityType\r\n     * @param requestHomeAccountId\r\n     * @returns `AccountEntity`\r\n     */\r\n    private loadAccount(idToken: AuthToken, authority: Authority, clientInfo?: string, requestHomeAccountId?: string): AccountEntity {\r\n\r\n        let homeAccountId;\r\n        if (requestHomeAccountId) {\r\n            homeAccountId = requestHomeAccountId;\r\n        } else if (authority.authorityType !== undefined && clientInfo) {\r\n            homeAccountId = AccountEntity.generateHomeAccountId(clientInfo, authority.authorityType, this.logger, this.cryptoObj, idToken.claims);\r\n        }\r\n\r\n        if (!homeAccountId) {\r\n            throw BrowserAuthError.createUnableToLoadTokenError(\"Unexpected missing homeAccountId\");\r\n        }\r\n\r\n        const accountEntity = AccountEntity.createAccount({homeAccountId, idTokenClaims: idToken.claims, clientInfo, environment: authority.hostnameAndPort}, authority);\r\n\r\n        if (this.isBrowserEnvironment) {\r\n            this.logger.verbose(\"TokenCache - loading account\");\r\n\r\n            this.storage.setAccount(accountEntity);\r\n            return accountEntity;\r\n        } else {\r\n            throw BrowserAuthError.createUnableToLoadTokenError(\"loadExternalTokens is designed to work in browser environments only.\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Helper function to load id tokens to msal-browser cache\r\n     * @param idToken\r\n     * @param homeAccountId\r\n     * @param environment\r\n     * @param tenantId\r\n     * @returns `IdTokenEntity`\r\n     */\r\n    private loadIdToken(idToken: AuthToken, homeAccountId: string, environment: string, tenantId: string): IdTokenEntity {\r\n\r\n        const idTokenEntity = IdTokenEntity.createIdTokenEntity(homeAccountId, environment, idToken.rawToken, this.config.auth.clientId, tenantId);\r\n\r\n        if (this.isBrowserEnvironment) {\r\n            this.logger.verbose(\"TokenCache - loading id token\");\r\n            this.storage.setIdTokenCredential(idTokenEntity);\r\n            return idTokenEntity;\r\n        } else {\r\n            throw BrowserAuthError.createUnableToLoadTokenError(\"loadExternalTokens is designed to work in browser environments only.\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Helper function to load access tokens to msal-browser cache\r\n     * @param request\r\n     * @param response\r\n     * @param homeAccountId\r\n     * @param environment\r\n     * @param tenantId\r\n     * @returns `AccessTokenEntity`\r\n     */\r\n    private loadAccessToken(request: SilentRequest, response: ExternalTokenResponse, homeAccountId: string, environment: string, tenantId: string, options: LoadTokenOptions): AccessTokenEntity | null {\r\n\r\n        if (!response.access_token) {\r\n            this.logger.verbose(\"TokenCache - No access token provided for caching\");\r\n            return null;\r\n        }\r\n\r\n        if (!response.expires_in) {\r\n            throw BrowserAuthError.createUnableToLoadTokenError(\"Please ensure server response includes expires_in value.\");\r\n        }\r\n\r\n        if (!options.extendedExpiresOn) {\r\n            throw BrowserAuthError.createUnableToLoadTokenError(\"Please provide an extendedExpiresOn value in the options.\");\r\n        }\r\n\r\n        const scopes = new ScopeSet(request.scopes).printScopes();\r\n        const expiresOn = options.expiresOn || (response.expires_in + new Date().getTime() / 1000);\r\n        const extendedExpiresOn = options.extendedExpiresOn;\r\n\r\n        const accessTokenEntity = AccessTokenEntity.createAccessTokenEntity(homeAccountId, environment, response.access_token, this.config.auth.clientId, tenantId, scopes, expiresOn, extendedExpiresOn, this.cryptoObj);\r\n\r\n        if (this.isBrowserEnvironment) {\r\n            this.logger.verbose(\"TokenCache - loading access token\");\r\n            this.storage.setAccessTokenCredential(accessTokenEntity);\r\n            return accessTokenEntity;\r\n        } else {\r\n            throw BrowserAuthError.createUnableToLoadTokenError(\"loadExternalTokens is designed to work in browser environments only.\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Helper function to load refresh tokens to msal-browser cache\r\n     * @param request\r\n     * @param response\r\n     * @param homeAccountId\r\n     * @param environment\r\n     * @returns `RefreshTokenEntity`\r\n     */\r\n    private loadRefreshToken(request: SilentRequest, response: ExternalTokenResponse, homeAccountId: string, environment: string): RefreshTokenEntity | null {\r\n\r\n        if (!response.refresh_token) {\r\n            this.logger.verbose(\"TokenCache - No refresh token provided for caching\");\r\n            return null;\r\n        }\r\n\r\n        const refreshTokenEntity = RefreshTokenEntity.createRefreshTokenEntity(homeAccountId, environment, response.refresh_token, this.config.auth.clientId);\r\n\r\n        if (this.isBrowserEnvironment) {\r\n            this.logger.verbose(\"TokenCache - loading refresh token\");\r\n            this.storage.setRefreshTokenCredential(refreshTokenEntity);\r\n            return refreshTokenEntity;\r\n        } else {\r\n            throw BrowserAuthError.createUnableToLoadTokenError(\"loadExternalTokens is designed to work in browser environments only.\");\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Helper function to generate an `AuthenticationResult` for the result.\r\n     * @param request\r\n     * @param idTokenObj\r\n     * @param cacheRecord\r\n     * @param accountEntity\r\n     * @param authority\r\n     * @returns `AuthenticationResult`\r\n     */\r\n    private generateAuthenticationResult(\r\n        request: SilentRequest,\r\n        idTokenObj: AuthToken,\r\n        cacheRecord: CacheRecord,\r\n        accountEntity: AccountEntity,\r\n        authority?: Authority,\r\n    ): AuthenticationResult {\r\n        let accessToken: string = Constants.EMPTY_STRING;\r\n        let responseScopes: Array<string> = [];\r\n        let expiresOn: Date | null = null;\r\n        let extExpiresOn: Date | undefined;\r\n\r\n        if (cacheRecord.accessToken) {\r\n            accessToken = cacheRecord.accessToken.secret;\r\n            responseScopes = ScopeSet.fromString(cacheRecord.accessToken.target).asArray();\r\n            expiresOn = new Date(Number(cacheRecord.accessToken.expiresOn) * 1000);\r\n            extExpiresOn = new Date(Number(cacheRecord.accessToken.extendedExpiresOn) * 1000);\r\n        }\r\n\r\n        const uid = idTokenObj?.claims.oid || idTokenObj?.claims.sub || Constants.EMPTY_STRING;\r\n        const tid = idTokenObj?.claims.tid || Constants.EMPTY_STRING;\r\n\r\n        return {\r\n            authority: authority ? authority.canonicalAuthority : Constants.EMPTY_STRING,\r\n            uniqueId: uid,\r\n            tenantId: tid,\r\n            scopes: responseScopes,\r\n            account: accountEntity ? accountEntity.getAccountInfo() : null,\r\n            idToken: idTokenObj ? idTokenObj.rawToken : Constants.EMPTY_STRING,\r\n            idTokenClaims: idTokenObj ? idTokenObj.claims : {},\r\n            accessToken: accessToken,\r\n            fromCache: true,\r\n            expiresOn: expiresOn,\r\n            correlationId: request.correlationId || Constants.EMPTY_STRING,\r\n            requestId: Constants.EMPTY_STRING,\r\n            extExpiresOn: extExpiresOn,\r\n            familyId: Constants.EMPTY_STRING,\r\n            tokenType: cacheRecord?.accessToken?.tokenType || Constants.EMPTY_STRING,\r\n            state: Constants.EMPTY_STRING,\r\n            cloudGraphHostName: accountEntity.cloudGraphHostName || Constants.EMPTY_STRING,\r\n            msGraphHost: accountEntity.msGraphHost || Constants.EMPTY_STRING,\r\n            code: undefined,\r\n            fromNativeBroker: false\r\n        };\r\n    }\r\n}\r\n\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthorizationCodeClient, ClientConfiguration } from \"@azure/msal-common\";\r\n\r\nexport class HybridSpaAuthorizationCodeClient extends AuthorizationCodeClient {\r\n    constructor(config: ClientConfiguration) {\r\n        super(config);\r\n        this.includeRedirectUri = false;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthenticationResult, ICrypto, Logger, CommonAuthorizationCodeRequest, AuthError, Constants, IPerformanceClient, PerformanceEvents } from \"@azure/msal-common\";\r\nimport { StandardInteractionClient } from \"./StandardInteractionClient\";\r\nimport { AuthorizationUrlRequest } from \"../request/AuthorizationUrlRequest\";\r\nimport { BrowserConfiguration } from \"../config/Configuration\";\r\nimport { BrowserCacheManager } from \"../cache/BrowserCacheManager\";\r\nimport { EventHandler } from \"../event/EventHandler\";\r\nimport { INavigationClient } from \"../navigation/INavigationClient\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { InteractionType, ApiId } from \"../utils/BrowserConstants\";\r\nimport { SilentHandler } from \"../interaction_handler/SilentHandler\";\r\nimport { AuthorizationCodeRequest } from \"../request/AuthorizationCodeRequest\";\r\nimport { HybridSpaAuthorizationCodeClient } from \"./HybridSpaAuthorizationCodeClient\";\r\nimport { NativeMessageHandler } from \"../broker/nativeBroker/NativeMessageHandler\";\r\n\r\nexport class SilentAuthCodeClient extends StandardInteractionClient {\r\n    private apiId: ApiId;\r\n\r\n    constructor(config: BrowserConfiguration, storageImpl: BrowserCacheManager, browserCrypto: ICrypto, logger: Logger, eventHandler: EventHandler, navigationClient: INavigationClient, apiId: ApiId, performanceClient: IPerformanceClient, nativeMessageHandler?: NativeMessageHandler, correlationId?: string) {\r\n        super(config, storageImpl, browserCrypto, logger, eventHandler, navigationClient, performanceClient, nativeMessageHandler, correlationId);\r\n        this.apiId = apiId;\r\n    }\r\n\r\n    /**\r\n     * Acquires a token silently by redeeming an authorization code against the /token endpoint\r\n     * @param request\r\n     */\r\n    async acquireToken(request: AuthorizationCodeRequest): Promise<AuthenticationResult> {\r\n        this.logger.trace(\"SilentAuthCodeClient.acquireToken called\");\r\n\r\n        // Auth code payload is required\r\n        if (!request.code) {\r\n            throw BrowserAuthError.createAuthCodeRequiredError();\r\n\r\n        }\r\n\r\n        // Create silent request\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientInitializeAuthorizationRequest, request.correlationId);\r\n        const silentRequest: AuthorizationUrlRequest = await this.initializeAuthorizationRequest(request, InteractionType.Silent);\r\n        this.browserStorage.updateCacheEntries(silentRequest.state, silentRequest.nonce, silentRequest.authority, silentRequest.loginHint || Constants.EMPTY_STRING, silentRequest.account || null);\r\n\r\n        const serverTelemetryManager = this.initializeServerTelemetryManager(this.apiId);\r\n\r\n        try {\r\n\r\n            // Create auth code request (PKCE not needed)\r\n            const authCodeRequest: CommonAuthorizationCodeRequest = {\r\n                ...silentRequest,\r\n                code: request.code\r\n            };\r\n\r\n            // Initialize the client\r\n            this.performanceClient.setPreQueueTime(PerformanceEvents.StandardInteractionClientGetClientConfiguration, request.correlationId);\r\n            const clientConfig = await this.getClientConfiguration(serverTelemetryManager, silentRequest.authority);\r\n            const authClient: HybridSpaAuthorizationCodeClient = new HybridSpaAuthorizationCodeClient(clientConfig);\r\n            this.logger.verbose(\"Auth code client created\");\r\n\r\n            // Create silent handler\r\n            const silentHandler = new SilentHandler(authClient, this.browserStorage, authCodeRequest, this.logger, this.config.system, this.performanceClient);\r\n\r\n            // Handle auth code parameters from request\r\n            return silentHandler.handleCodeResponseFromServer(\r\n                {\r\n                    code: request.code,\r\n                    msgraph_host: request.msGraphHost,\r\n                    cloud_graph_host_name: request.cloudGraphHostName,\r\n                    cloud_instance_host_name: request.cloudInstanceHostName\r\n                },\r\n                silentRequest.state,\r\n                authClient.authority,\r\n                this.networkClient,\r\n                false\r\n            );\r\n        } catch (e) {\r\n            if (e instanceof AuthError) {\r\n                (e as AuthError).setCorrelationId(this.correlationId);\r\n            }\r\n            serverTelemetryManager.cacheFailedRequest(e);\r\n            this.browserStorage.cleanRequestByState(silentRequest.state);\r\n            throw e;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Currently Unsupported\r\n     */\r\n    logout(): Promise<void> {\r\n        // Synchronous so we must reject\r\n        return Promise.reject(BrowserAuthError.createSilentLogoutUnsupportedError());\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { CryptoOps } from \"../crypto/CryptoOps\";\r\nimport { InteractionRequiredAuthError, AccountInfo, Constants, INetworkModule, AuthenticationResult, Logger, CommonSilentFlowRequest, ICrypto, DEFAULT_CRYPTO_IMPLEMENTATION, AuthError, PerformanceEvents, PerformanceCallbackFunction, StubPerformanceClient, IPerformanceClient, BaseAuthRequest, PromptValue, ClientAuthError, InProgressPerformanceEvent } from \"@azure/msal-common\";\r\nimport { BrowserCacheManager, DEFAULT_BROWSER_CACHE_MANAGER } from \"../cache/BrowserCacheManager\";\r\nimport { BrowserConfiguration, buildConfiguration, CacheOptions, Configuration } from \"../config/Configuration\";\r\nimport { InteractionType, ApiId, BrowserCacheLocation, WrapperSKU, TemporaryCacheKeys, CacheLookupPolicy } from \"../utils/BrowserConstants\";\r\nimport { BrowserUtils } from \"../utils/BrowserUtils\";\r\nimport { RedirectRequest } from \"../request/RedirectRequest\";\r\nimport { PopupRequest } from \"../request/PopupRequest\";\r\nimport { SsoSilentRequest } from \"../request/SsoSilentRequest\";\r\nimport { version, name } from \"../packageMetadata\";\r\nimport { EventCallbackFunction } from \"../event/EventMessage\";\r\nimport { EventType } from \"../event/EventType\";\r\nimport { EndSessionRequest } from \"../request/EndSessionRequest\";\r\nimport { BrowserConfigurationAuthError } from \"../error/BrowserConfigurationAuthError\";\r\nimport { EndSessionPopupRequest } from \"../request/EndSessionPopupRequest\";\r\nimport { INavigationClient } from \"../navigation/INavigationClient\";\r\nimport { EventHandler } from \"../event/EventHandler\";\r\nimport { PopupClient } from \"../interaction_client/PopupClient\";\r\nimport { RedirectClient } from \"../interaction_client/RedirectClient\";\r\nimport { SilentIframeClient } from \"../interaction_client/SilentIframeClient\";\r\nimport { SilentRefreshClient } from \"../interaction_client/SilentRefreshClient\";\r\nimport { TokenCache } from \"../cache/TokenCache\";\r\nimport { ITokenCache } from \"../cache/ITokenCache\";\r\nimport { NativeInteractionClient } from \"../interaction_client/NativeInteractionClient\";\r\nimport { NativeMessageHandler } from \"../broker/nativeBroker/NativeMessageHandler\";\r\nimport { SilentRequest } from \"../request/SilentRequest\";\r\nimport { NativeAuthError } from \"../error/NativeAuthError\";\r\nimport { SilentCacheClient } from \"../interaction_client/SilentCacheClient\";\r\nimport { SilentAuthCodeClient } from \"../interaction_client/SilentAuthCodeClient\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { AuthorizationCodeRequest } from \"../request/AuthorizationCodeRequest\";\r\nimport { NativeTokenRequest } from \"../broker/nativeBroker/NativeRequest\";\r\nimport { BrowserPerformanceClient } from \"../telemetry/BrowserPerformanceClient\";\r\n\r\nexport abstract class ClientApplication {\r\n\r\n    // Crypto interface implementation\r\n    protected readonly browserCrypto: ICrypto;\r\n\r\n    // Storage interface implementation\r\n    protected readonly browserStorage: BrowserCacheManager;\r\n\r\n    // Native Cache in memory storage implementation\r\n    protected readonly nativeInternalStorage: BrowserCacheManager;\r\n\r\n    // Network interface implementation\r\n    protected readonly networkClient: INetworkModule;\r\n\r\n    // Navigation interface implementation\r\n    protected navigationClient: INavigationClient;\r\n\r\n    // Input configuration by developer/user\r\n    protected config: BrowserConfiguration;\r\n\r\n    // Token cache implementation\r\n    private tokenCache: TokenCache;\r\n\r\n    // Logger\r\n    protected logger: Logger;\r\n\r\n    // Flag to indicate if in browser environment\r\n    protected isBrowserEnvironment: boolean;\r\n\r\n    protected eventHandler: EventHandler;\r\n\r\n    // Redirect Response Object\r\n    protected redirectResponse: Map<string, Promise<AuthenticationResult | null>>;\r\n\r\n    // Native Extension Provider\r\n    protected nativeExtensionProvider: NativeMessageHandler | undefined;\r\n\r\n    // Hybrid auth code responses\r\n    private hybridAuthCodeResponses: Map<string, Promise<AuthenticationResult>>;\r\n\r\n    // Performance telemetry client\r\n    protected performanceClient: IPerformanceClient;\r\n\r\n    // Flag representing whether or not the initialize API has been called and completed\r\n    protected initialized: boolean;\r\n\r\n    private ssoSilentMeasurement?: InProgressPerformanceEvent;\r\n    private acquireTokenByCodeAsyncMeasurement?: InProgressPerformanceEvent;\r\n    /**\r\n     * @constructor\r\n     * Constructor for the PublicClientApplication used to instantiate the PublicClientApplication object\r\n     *\r\n     * Important attributes in the Configuration object for auth are:\r\n     * - clientID: the application ID of your application. You can obtain one by registering your application with our Application registration portal : https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview\r\n     * - authority: the authority URL for your application.\r\n     * - redirect_uri: the uri of your application registered in the portal.\r\n     *\r\n     * In Azure AD, authority is a URL indicating the Azure active directory that MSAL uses to obtain tokens.\r\n     * It is of the form https://login.microsoftonline.com/{Enter_the_Tenant_Info_Here}\r\n     * If your application supports Accounts in one organizational directory, replace \"Enter_the_Tenant_Info_Here\" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).\r\n     * If your application supports Accounts in any organizational directory, replace \"Enter_the_Tenant_Info_Here\" value with organizations.\r\n     * If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace \"Enter_the_Tenant_Info_Here\" value with common.\r\n     * To restrict support to Personal Microsoft accounts only, replace \"Enter_the_Tenant_Info_Here\" value with consumers.\r\n     *\r\n     * In Azure B2C, authority is of the form https://{instance}/tfp/{tenant}/{policyName}/\r\n     * Full B2C functionality will be available in this library in future versions.\r\n     *\r\n     * @param configuration Object for the MSAL PublicClientApplication instance\r\n     */\r\n    constructor(configuration: Configuration) {\r\n        /*\r\n         * If loaded in an environment where window is not available,\r\n         * set internal flag to false so that further requests fail.\r\n         * This is to support server-side rendering environments.\r\n         */\r\n        this.isBrowserEnvironment = typeof window !== \"undefined\";\r\n        // Set the configuration.\r\n        this.config = buildConfiguration(configuration, this.isBrowserEnvironment);\r\n        this.initialized = false;\r\n\r\n        // Initialize logger\r\n        this.logger = new Logger(this.config.system.loggerOptions, name, version);\r\n\r\n        // Initialize the network module class.\r\n        this.networkClient = this.config.system.networkClient;\r\n\r\n        // Initialize the navigation client class.\r\n        this.navigationClient = this.config.system.navigationClient;\r\n\r\n        // Initialize redirectResponse Map\r\n        this.redirectResponse = new Map();\r\n\r\n        // Initial hybrid spa map\r\n        this.hybridAuthCodeResponses = new Map();\r\n\r\n        // Initialize performance client\r\n        this.performanceClient = this.isBrowserEnvironment ?\r\n            new BrowserPerformanceClient(this.config.auth.clientId, this.config.auth.authority, this.logger, name, version, this.config.telemetry.application, this.config.system.cryptoOptions) :\r\n            new StubPerformanceClient(this.config.auth.clientId, this.config.auth.authority, this.logger, name, version, this.config.telemetry.application);\r\n\r\n        // Initialize the crypto class.\r\n        this.browserCrypto = this.isBrowserEnvironment ? new CryptoOps(this.logger, this.performanceClient, this.config.system.cryptoOptions) : DEFAULT_CRYPTO_IMPLEMENTATION;\r\n\r\n        this.eventHandler = new EventHandler(this.logger, this.browserCrypto);\r\n\r\n        // Initialize the browser storage class.\r\n        this.browserStorage = this.isBrowserEnvironment ?\r\n            new BrowserCacheManager(this.config.auth.clientId, this.config.cache, this.browserCrypto, this.logger) :\r\n            DEFAULT_BROWSER_CACHE_MANAGER(this.config.auth.clientId, this.logger);\r\n\r\n        // initialize in memory storage for native flows\r\n        const nativeCacheOptions: Required<CacheOptions> = {\r\n            cacheLocation: BrowserCacheLocation.MemoryStorage,\r\n            temporaryCacheLocation: BrowserCacheLocation.MemoryStorage,\r\n            storeAuthStateInCookie: false,\r\n            secureCookies: false,\r\n            cacheMigrationEnabled: false,\r\n            claimsBasedCachingEnabled: true\r\n        };\r\n        this.nativeInternalStorage = new BrowserCacheManager(this.config.auth.clientId, nativeCacheOptions, this.browserCrypto, this.logger);\r\n\r\n        // Initialize the token cache\r\n        this.tokenCache = new TokenCache(this.config, this.browserStorage, this.logger, this.browserCrypto);\r\n        // Register listener functions\r\n        this.trackPageVisibilityWithMeasurement = this.trackPageVisibilityWithMeasurement.bind(this);\r\n    }\r\n\r\n    /**\r\n     * Initializer function to perform async startup tasks such as connecting to WAM extension\r\n     */\r\n    async initialize(): Promise<void> {\r\n        this.logger.trace(\"initialize called\");\r\n        if (this.initialized) {\r\n            this.logger.info(\"initialize has already been called, exiting early.\");\r\n            return;\r\n        }\r\n\r\n        const allowNativeBroker = this.config.system.allowNativeBroker;\r\n        const initMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.InitializeClientApplication);\r\n        this.eventHandler.emitEvent(EventType.INITIALIZE_START);\r\n\r\n        if (allowNativeBroker) {\r\n            try {\r\n                this.nativeExtensionProvider = await NativeMessageHandler.createProvider(this.logger, this.config.system.nativeBrokerHandshakeTimeout, this.performanceClient);\r\n            } catch (e) {\r\n                this.logger.verbose(e);\r\n            }\r\n        }\r\n\r\n        if(!this.config.cache.claimsBasedCachingEnabled) {\r\n            this.logger.verbose(\"Claims-based caching is disabled. Clearing the previous cache with claims\");\r\n            const claimsTokensRemovalMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.ClearTokensAndKeysWithClaims);\r\n            await this.browserStorage.clearTokensAndKeysWithClaims();\r\n            claimsTokensRemovalMeasurement.endMeasurement({success: true});\r\n        }\r\n\r\n        this.initialized = true;\r\n        this.eventHandler.emitEvent(EventType.INITIALIZE_END);\r\n\r\n        initMeasurement.endMeasurement({allowNativeBroker, success: true});\r\n    }\r\n\r\n    // #region Redirect Flow\r\n\r\n    /**\r\n     * Event handler function which allows users to fire events after the PublicClientApplication object\r\n     * has loaded during redirect flows. This should be invoked on all page loads involved in redirect\r\n     * auth flows.\r\n     * @param hash Hash to process. Defaults to the current value of window.location.hash. Only needs to be provided explicitly if the response to be handled is not contained in the current value.\r\n     * @returns Token response or null. If the return value is null, then no auth redirect was detected.\r\n     */\r\n    async handleRedirectPromise(hash?: string): Promise<AuthenticationResult | null> {\r\n        this.logger.verbose(\"handleRedirectPromise called\");\r\n        // Block token acquisition before initialize has been called if native brokering is enabled\r\n        BrowserUtils.blockNativeBrokerCalledBeforeInitialized(this.config.system.allowNativeBroker, this.initialized);\r\n\r\n        const loggedInAccounts = this.getAllAccounts();\r\n        if (this.isBrowserEnvironment) {\r\n            /**\r\n             * Store the promise on the PublicClientApplication instance if this is the first invocation of handleRedirectPromise,\r\n             * otherwise return the promise from the first invocation. Prevents race conditions when handleRedirectPromise is called\r\n             * several times concurrently.\r\n             */\r\n            const redirectResponseKey = hash || Constants.EMPTY_STRING;\r\n            let response = this.redirectResponse.get(redirectResponseKey);\r\n            if (typeof response === \"undefined\") {\r\n                this.eventHandler.emitEvent(EventType.HANDLE_REDIRECT_START, InteractionType.Redirect);\r\n                this.logger.verbose(\"handleRedirectPromise has been called for the first time, storing the promise\");\r\n\r\n                const request: NativeTokenRequest | null = this.browserStorage.getCachedNativeRequest();\r\n                let redirectResponse: Promise<AuthenticationResult | null>;\r\n                if (request && NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider) && this.nativeExtensionProvider && !hash) {\r\n                    this.logger.trace(\"handleRedirectPromise - acquiring token from native platform\");\r\n                    const nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.handleRedirectPromise, this.performanceClient, this.nativeExtensionProvider, request.accountId, this.nativeInternalStorage, request.correlationId);\r\n                    redirectResponse = nativeClient.handleRedirectPromise();\r\n                } else {\r\n                    this.logger.trace(\"handleRedirectPromise - acquiring token from web flow\");\r\n                    const correlationId = this.browserStorage.getTemporaryCache(TemporaryCacheKeys.CORRELATION_ID, true) || Constants.EMPTY_STRING;\r\n                    const redirectClient = this.createRedirectClient(correlationId);\r\n                    redirectResponse = redirectClient.handleRedirectPromise(hash);\r\n                }\r\n\r\n                response = redirectResponse.then((result: AuthenticationResult | null) => {\r\n                    if (result) {\r\n                        // Emit login event if number of accounts change\r\n\r\n                        const isLoggingIn = loggedInAccounts.length < this.getAllAccounts().length;\r\n                        if (isLoggingIn) {\r\n                            this.eventHandler.emitEvent(EventType.LOGIN_SUCCESS, InteractionType.Redirect, result);\r\n                            this.logger.verbose(\"handleRedirectResponse returned result, login success\");\r\n                        } else {\r\n                            this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_SUCCESS, InteractionType.Redirect, result);\r\n                            this.logger.verbose(\"handleRedirectResponse returned result, acquire token success\");\r\n                        }\r\n                    }\r\n                    this.eventHandler.emitEvent(EventType.HANDLE_REDIRECT_END, InteractionType.Redirect);\r\n\r\n                    return result;\r\n                }).catch((e) => {\r\n                    // Emit login event if there is an account\r\n                    if (loggedInAccounts.length > 0) {\r\n                        this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Redirect, null, e);\r\n                    } else {\r\n                        this.eventHandler.emitEvent(EventType.LOGIN_FAILURE, InteractionType.Redirect, null, e);\r\n                    }\r\n                    this.eventHandler.emitEvent(EventType.HANDLE_REDIRECT_END, InteractionType.Redirect);\r\n\r\n                    throw e;\r\n                });\r\n                this.redirectResponse.set(redirectResponseKey, response);\r\n            } else {\r\n                this.logger.verbose(\"handleRedirectPromise has been called previously, returning the result from the first call\");\r\n            }\r\n\r\n            return response;\r\n        }\r\n        this.logger.verbose(\"handleRedirectPromise returns null, not browser environment\");\r\n        return null;\r\n    }\r\n\r\n    /**\r\n     * Use when you want to obtain an access_token for your API by redirecting the user's browser window to the authorization endpoint. This function redirects\r\n     * the page, so any code that follows this function will not execute.\r\n     *\r\n     * IMPORTANT: It is NOT recommended to have code that is dependent on the resolution of the Promise. This function will navigate away from the current\r\n     * browser window. It currently returns a Promise in order to reflect the asynchronous nature of the code running in this function.\r\n     *\r\n     * @param request\r\n     */\r\n    async acquireTokenRedirect(request: RedirectRequest): Promise<void> {\r\n        // Preflight request\r\n        const correlationId = this.getRequestCorrelationId(request);\r\n        this.logger.verbose(\"acquireTokenRedirect called\", correlationId);\r\n        this.preflightBrowserEnvironmentCheck(InteractionType.Redirect);\r\n\r\n        // If logged in, emit acquire token events\r\n        const isLoggedIn = this.getAllAccounts().length > 0;\r\n        if (isLoggedIn) {\r\n            this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_START, InteractionType.Redirect, request);\r\n        } else {\r\n            this.eventHandler.emitEvent(EventType.LOGIN_START, InteractionType.Redirect, request);\r\n        }\r\n\r\n        let result: Promise<void>;\r\n\r\n        if (this.nativeExtensionProvider && this.canUseNative(request)) {\r\n            const nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.acquireTokenRedirect, this.performanceClient, this.nativeExtensionProvider, this.getNativeAccountId(request), this.nativeInternalStorage, request.correlationId);\r\n            result = nativeClient.acquireTokenRedirect(request).catch((e: AuthError) => {\r\n                if (e instanceof NativeAuthError && e.isFatal()) {\r\n                    this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt\r\n                    const redirectClient = this.createRedirectClient(request.correlationId);\r\n                    return redirectClient.acquireToken(request);\r\n                } else if (e instanceof InteractionRequiredAuthError) {\r\n                    this.logger.verbose(\"acquireTokenRedirect - Resolving interaction required error thrown by native broker by falling back to web flow\");\r\n                    const redirectClient = this.createRedirectClient(request.correlationId);\r\n                    return redirectClient.acquireToken(request);\r\n                }\r\n                this.browserStorage.setInteractionInProgress(false);\r\n                throw e;\r\n            });\r\n        } else {\r\n            const redirectClient = this.createRedirectClient(request.correlationId);\r\n            result = redirectClient.acquireToken(request);\r\n        }\r\n\r\n        return result.catch((e) => {\r\n            // If logged in, emit acquire token events\r\n            if (isLoggedIn) {\r\n                this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Redirect, null, e);\r\n            } else {\r\n                this.eventHandler.emitEvent(EventType.LOGIN_FAILURE, InteractionType.Redirect, null, e);\r\n            }\r\n            throw e;\r\n        });\r\n    }\r\n\r\n    // #endregion\r\n\r\n    // #region Popup Flow\r\n\r\n    /**\r\n     * Use when you want to obtain an access_token for your API via opening a popup window in the user's browser\r\n     *\r\n     * @param request\r\n     *\r\n     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n     */\r\n    acquireTokenPopup(request: PopupRequest): Promise<AuthenticationResult> {\r\n        const correlationId = this.getRequestCorrelationId(request);\r\n        const atPopupMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenPopup, correlationId);\r\n\r\n        try {\r\n            this.logger.verbose(\"acquireTokenPopup called\", correlationId);\r\n            this.preflightBrowserEnvironmentCheck(InteractionType.Popup);\r\n        } catch (e) {\r\n            // Since this function is syncronous we need to reject\r\n            return Promise.reject(e);\r\n        }\r\n\r\n        // If logged in, emit acquire token events\r\n        const loggedInAccounts = this.getAllAccounts();\r\n        if (loggedInAccounts.length > 0) {\r\n            this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_START, InteractionType.Popup, request);\r\n        } else {\r\n            this.eventHandler.emitEvent(EventType.LOGIN_START, InteractionType.Popup, request);\r\n        }\r\n\r\n        let result: Promise<AuthenticationResult>;\r\n\r\n        if (this.canUseNative(request)) {\r\n            result = this.acquireTokenNative(request, ApiId.acquireTokenPopup).then((response) => {\r\n                this.browserStorage.setInteractionInProgress(false);\r\n                atPopupMeasurement.endMeasurement({\r\n                    success: true,\r\n                    isNativeBroker: true,\r\n                    requestId: response.requestId\r\n                });\r\n                return response;\r\n            }).catch((e: AuthError) => {\r\n                if (e instanceof NativeAuthError && e.isFatal()) {\r\n                    this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt\r\n                    const popupClient = this.createPopupClient(request.correlationId);\r\n                    return popupClient.acquireToken(request);\r\n                } else if (e instanceof InteractionRequiredAuthError) {\r\n                    this.logger.verbose(\"acquireTokenPopup - Resolving interaction required error thrown by native broker by falling back to web flow\");\r\n                    const popupClient = this.createPopupClient(request.correlationId);\r\n                    return popupClient.acquireToken(request);\r\n                }\r\n                this.browserStorage.setInteractionInProgress(false);\r\n                throw e;\r\n            });\r\n        } else {\r\n            const popupClient = this.createPopupClient(request.correlationId);\r\n            result = popupClient.acquireToken(request);\r\n        }\r\n\r\n        return result.then((result) => {\r\n\r\n            /*\r\n             *  If logged in, emit acquire token events\r\n             */\r\n            const isLoggingIn = loggedInAccounts.length < this.getAllAccounts().length;\r\n            if (isLoggingIn) {\r\n                this.eventHandler.emitEvent(EventType.LOGIN_SUCCESS, InteractionType.Popup, result);\r\n            } else {\r\n                this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_SUCCESS, InteractionType.Popup, result);\r\n            }\r\n\r\n            atPopupMeasurement.addStaticFields({\r\n                accessTokenSize: result.accessToken.length,\r\n                idTokenSize: result.idToken.length\r\n            });\r\n            atPopupMeasurement.endMeasurement({\r\n                success: true,\r\n                requestId: result.requestId\r\n            });\r\n            return result;\r\n        }).catch((e: AuthError) => {\r\n            if (loggedInAccounts.length > 0) {\r\n                this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Popup, null, e);\r\n            } else {\r\n                this.eventHandler.emitEvent(EventType.LOGIN_FAILURE, InteractionType.Popup, null, e);\r\n            }\r\n\r\n            atPopupMeasurement.endMeasurement({\r\n                errorCode: e.errorCode,\r\n                subErrorCode: e.subError,\r\n                success: false\r\n            });\r\n            // Since this function is syncronous we need to reject\r\n            return Promise.reject(e);\r\n        });\r\n    }\r\n\r\n    private trackPageVisibilityWithMeasurement():void {\r\n        const measurement = this.ssoSilentMeasurement || this.acquireTokenByCodeAsyncMeasurement;\r\n        if(!measurement) {\r\n            return;\r\n        }\r\n\r\n        this.logger.info(\"Perf: Visibility change detected in \", measurement.event.name);\r\n        measurement.increment({\r\n            visibilityChangeCount: 1,\r\n        });\r\n    }\r\n    // #endregion\r\n\r\n    // #region Silent Flow\r\n\r\n    /**\r\n     * This function uses a hidden iframe to fetch an authorization code from the eSTS. There are cases where this may not work:\r\n     * - Any browser using a form of Intelligent Tracking Prevention\r\n     * - If there is not an established session with the service\r\n     *\r\n     * In these cases, the request must be done inside a popup or full frame redirect.\r\n     *\r\n     * For the cases where interaction is required, you cannot send a request with prompt=none.\r\n     *\r\n     * If your refresh token has expired, you can use this function to fetch a new set of tokens silently as long as\r\n     * you session on the server still exists.\r\n     * @param request {@link SsoSilentRequest}\r\n     *\r\n     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n     */\r\n    async ssoSilent(request: SsoSilentRequest): Promise<AuthenticationResult> {\r\n        const correlationId = this.getRequestCorrelationId(request);\r\n        const validRequest = {\r\n            ...request,\r\n            // will be PromptValue.NONE or PromptValue.NO_SESSION\r\n            prompt: request.prompt,\r\n            correlationId: correlationId\r\n        };\r\n        this.preflightBrowserEnvironmentCheck(InteractionType.Silent);\r\n        this.ssoSilentMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.SsoSilent, correlationId);\r\n        this.ssoSilentMeasurement?.increment({\r\n            visibilityChangeCount: 0\r\n        });\r\n        document.addEventListener(\"visibilitychange\",this.trackPageVisibilityWithMeasurement);\r\n        this.logger.verbose(\"ssoSilent called\", correlationId);\r\n        this.eventHandler.emitEvent(EventType.SSO_SILENT_START, InteractionType.Silent, validRequest);\r\n\r\n        let result: Promise<AuthenticationResult>;\r\n\r\n        if (this.canUseNative(validRequest)) {\r\n            result = this.acquireTokenNative(validRequest, ApiId.ssoSilent).catch((e: AuthError) => {\r\n                // If native token acquisition fails for availability reasons fallback to standard flow\r\n                if (e instanceof NativeAuthError && e.isFatal()) {\r\n                    this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt\r\n                    const silentIframeClient = this.createSilentIframeClient(validRequest.correlationId);\r\n                    return silentIframeClient.acquireToken(validRequest);\r\n                }\r\n                throw e;\r\n            });\r\n        } else {\r\n            const silentIframeClient = this.createSilentIframeClient(validRequest.correlationId);\r\n            result = silentIframeClient.acquireToken(validRequest);\r\n        }\r\n\r\n        return result.then((response) => {\r\n            this.eventHandler.emitEvent(EventType.SSO_SILENT_SUCCESS, InteractionType.Silent, response);\r\n            this.ssoSilentMeasurement?.addStaticFields({\r\n                accessTokenSize: response.accessToken.length,\r\n                idTokenSize: response.idToken.length\r\n            });\r\n            this.ssoSilentMeasurement?.endMeasurement({\r\n                success: true,\r\n                isNativeBroker: response.fromNativeBroker,\r\n                requestId: response.requestId\r\n            });\r\n            return response;\r\n        }).catch((e: AuthError) => {\r\n            this.eventHandler.emitEvent(EventType.SSO_SILENT_FAILURE, InteractionType.Silent, null, e);\r\n            this.ssoSilentMeasurement?.endMeasurement({\r\n                errorCode: e.errorCode,\r\n                subErrorCode: e.subError,\r\n                success: false\r\n            });\r\n            throw e;\r\n        }).finally(() => {\r\n            document.removeEventListener(\"visibilitychange\",this.trackPageVisibilityWithMeasurement);\r\n        });\r\n\r\n    }\r\n\r\n    /**\r\n     * This function redeems an authorization code (passed as code) from the eSTS token endpoint.\r\n     * This authorization code should be acquired server-side using a confidential client to acquire a spa_code.\r\n     * This API is not indended for normal authorization code acquisition and redemption.\r\n     *\r\n     * Redemption of this authorization code will not require PKCE, as it was acquired by a confidential client.\r\n     *\r\n     * @param request {@link AuthorizationCodeRequest}\r\n     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n     */\r\n    async acquireTokenByCode(request: AuthorizationCodeRequest): Promise<AuthenticationResult> {\r\n        const correlationId = this.getRequestCorrelationId(request);\r\n        this.preflightBrowserEnvironmentCheck(InteractionType.Silent);\r\n        this.logger.trace(\"acquireTokenByCode called\", correlationId);\r\n        this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_BY_CODE_START, InteractionType.Silent, request);\r\n        const atbcMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenByCode, request.correlationId);\r\n\r\n        try {\r\n            if (request.code && request.nativeAccountId) {\r\n                // Throw error in case server returns both spa_code and spa_accountid in exchange for auth code.\r\n                throw BrowserAuthError.createSpaCodeAndNativeAccountIdPresentError();\r\n            }\r\n            else if (request.code) {\r\n                const hybridAuthCode = request.code;\r\n                let response = this.hybridAuthCodeResponses.get(hybridAuthCode);\r\n                if (!response) {\r\n                    this.logger.verbose(\"Initiating new acquireTokenByCode request\", correlationId);\r\n                    response = this.acquireTokenByCodeAsync({\r\n                        ...request,\r\n                        correlationId\r\n                    })\r\n                        .then((result: AuthenticationResult) => {\r\n                            this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_BY_CODE_SUCCESS, InteractionType.Silent, result);\r\n                            this.hybridAuthCodeResponses.delete(hybridAuthCode);\r\n                            atbcMeasurement.addStaticFields({\r\n                                accessTokenSize: result.accessToken.length,\r\n                                idTokenSize: result.idToken.length\r\n                            });\r\n                            atbcMeasurement.endMeasurement({\r\n                                success: true,\r\n                                isNativeBroker: result.fromNativeBroker,\r\n                                requestId: result.requestId\r\n                            });\r\n                            return result;\r\n                        })\r\n                        .catch((error: AuthError) => {\r\n                            this.hybridAuthCodeResponses.delete(hybridAuthCode);\r\n                            this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_BY_CODE_FAILURE, InteractionType.Silent, null, error);\r\n                            atbcMeasurement.endMeasurement({\r\n                                errorCode: error.errorCode,\r\n                                subErrorCode: error.subError,\r\n                                success: false\r\n                            });\r\n                            throw error;\r\n                        });\r\n                    this.hybridAuthCodeResponses.set(hybridAuthCode, response);\r\n                } else {\r\n                    this.logger.verbose(\"Existing acquireTokenByCode request found\", request.correlationId);\r\n                    atbcMeasurement.discardMeasurement();\r\n                }\r\n                return response;\r\n            } else if (request.nativeAccountId) {\r\n                if (this.canUseNative(request, request.nativeAccountId)) {\r\n                    return this.acquireTokenNative(request, ApiId.acquireTokenByCode, request.nativeAccountId).catch((e: AuthError) => {\r\n                        // If native token acquisition fails for availability reasons fallback to standard flow\r\n                        if (e instanceof NativeAuthError && e.isFatal()) {\r\n                            this.nativeExtensionProvider = undefined; // If extension gets uninstalled during session prevent future requests from continuing to attempt\r\n                        }\r\n                        throw e;\r\n                    });\r\n                } else {\r\n                    throw BrowserAuthError.createUnableToAcquireTokenFromNativePlatformError();\r\n                }\r\n            } else {\r\n                throw BrowserAuthError.createAuthCodeOrNativeAccountIdRequiredError();\r\n            }\r\n\r\n        } catch (e) {\r\n            this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_BY_CODE_FAILURE, InteractionType.Silent, null, e);\r\n            atbcMeasurement.endMeasurement({\r\n                errorCode: e instanceof AuthError && e.errorCode || undefined,\r\n                subErrorCode: e instanceof AuthError && e.subError || undefined,\r\n                success: false\r\n            });\r\n            throw e;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Creates a SilentAuthCodeClient to redeem an authorization code.\r\n     * @param request\r\n     * @returns Result of the operation to redeem the authorization code\r\n     */\r\n    private async acquireTokenByCodeAsync(request: AuthorizationCodeRequest): Promise<AuthenticationResult> {\r\n        this.logger.trace(\"acquireTokenByCodeAsync called\", request.correlationId);\r\n        this.acquireTokenByCodeAsyncMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenByCodeAsync, request.correlationId);\r\n        this.acquireTokenByCodeAsyncMeasurement?.increment({\r\n            visibilityChangeCount: 0\r\n        });\r\n        document.addEventListener(\"visibilitychange\",this.trackPageVisibilityWithMeasurement);\r\n        const silentAuthCodeClient = this.createSilentAuthCodeClient(request.correlationId);\r\n        const silentTokenResult = await silentAuthCodeClient.acquireToken(request).then((response) => {\r\n            this.acquireTokenByCodeAsyncMeasurement?.endMeasurement({\r\n                success: true,\r\n                fromCache: response.fromCache,\r\n                isNativeBroker: response.fromNativeBroker,\r\n                requestId: response.requestId\r\n            });\r\n            return response;\r\n        }).catch((tokenRenewalError: AuthError) => {\r\n            this.acquireTokenByCodeAsyncMeasurement?.endMeasurement({\r\n                errorCode: tokenRenewalError.errorCode,\r\n                subErrorCode: tokenRenewalError.subError,\r\n                success: false\r\n            });\r\n            throw tokenRenewalError;\r\n        }).finally(() => {\r\n            document.removeEventListener(\"visibilitychange\",this.trackPageVisibilityWithMeasurement);\r\n        });\r\n        return silentTokenResult;\r\n    }\r\n\r\n    /**\r\n     * Attempt to acquire an access token from the cache\r\n     * @param silentCacheClient SilentCacheClient\r\n     * @param commonRequest CommonSilentFlowRequest\r\n     * @param silentRequest SilentRequest\r\n     * @returns A promise that, when resolved, returns the access token\r\n     */\r\n    protected async acquireTokenFromCache(\r\n        silentCacheClient: SilentCacheClient,\r\n        commonRequest: CommonSilentFlowRequest,\r\n        silentRequest: SilentRequest\r\n    ): Promise<AuthenticationResult> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.AcquireTokenFromCache, commonRequest.correlationId);\r\n        switch(silentRequest.cacheLookupPolicy) {\r\n            case CacheLookupPolicy.Default:\r\n            case CacheLookupPolicy.AccessToken:\r\n            case CacheLookupPolicy.AccessTokenAndRefreshToken:\r\n                return silentCacheClient.acquireToken(commonRequest);\r\n            default:\r\n                throw ClientAuthError.createRefreshRequiredError();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Attempt to acquire an access token via a refresh token\r\n     * @param commonRequest CommonSilentFlowRequest\r\n     * @param silentRequest SilentRequest\r\n     * @returns A promise that, when resolved, returns the access token\r\n     */\r\n    protected async acquireTokenByRefreshToken(\r\n        commonRequest: CommonSilentFlowRequest,\r\n        silentRequest: SilentRequest\r\n    ): Promise<AuthenticationResult> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.AcquireTokenByRefreshToken, commonRequest.correlationId);\r\n        switch(silentRequest.cacheLookupPolicy) {\r\n            case CacheLookupPolicy.Default:\r\n            case CacheLookupPolicy.AccessTokenAndRefreshToken:\r\n            case CacheLookupPolicy.RefreshToken:\r\n            case CacheLookupPolicy.RefreshTokenAndNetwork:\r\n                const silentRefreshClient = this.createSilentRefreshClient(commonRequest.correlationId);\r\n\r\n                this.performanceClient.setPreQueueTime(PerformanceEvents.SilentRefreshClientAcquireToken, commonRequest.correlationId);\r\n                return silentRefreshClient.acquireToken(commonRequest);\r\n            default:\r\n                throw ClientAuthError.createRefreshRequiredError();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Attempt to acquire an access token via an iframe\r\n     * @param request CommonSilentFlowRequest\r\n     * @returns A promise that, when resolved, returns the access token\r\n     */\r\n    protected async acquireTokenBySilentIframe(\r\n        request: CommonSilentFlowRequest\r\n    ): Promise<AuthenticationResult> {\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.AcquireTokenBySilentIframe, request.correlationId);\r\n\r\n        const silentIframeClient = this.createSilentIframeClient(request.correlationId);\r\n\r\n        this.performanceClient.setPreQueueTime(PerformanceEvents.SilentIframeClientAcquireToken, request.correlationId);\r\n        return silentIframeClient.acquireToken(request);\r\n    }\r\n\r\n    // #endregion\r\n\r\n    // #region Logout\r\n\r\n    /**\r\n     * Deprecated logout function. Use logoutRedirect or logoutPopup instead\r\n     * @param logoutRequest\r\n     * @deprecated\r\n     */\r\n    async logout(logoutRequest?: EndSessionRequest): Promise<void> {\r\n        const correlationId = this.getRequestCorrelationId(logoutRequest);\r\n        this.logger.warning(\"logout API is deprecated and will be removed in msal-browser v3.0.0. Use logoutRedirect instead.\", correlationId);\r\n        return this.logoutRedirect({\r\n            correlationId,\r\n            ...logoutRequest\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Use to log out the current user, and redirect the user to the postLogoutRedirectUri.\r\n     * Default behaviour is to redirect the user to `window.location.href`.\r\n     * @param logoutRequest\r\n     */\r\n    async logoutRedirect(logoutRequest?: EndSessionRequest): Promise<void> {\r\n        const correlationId = this.getRequestCorrelationId(logoutRequest);\r\n        this.preflightBrowserEnvironmentCheck(InteractionType.Redirect);\r\n\r\n        const redirectClient = this.createRedirectClient(correlationId);\r\n        return redirectClient.logout(logoutRequest);\r\n    }\r\n\r\n    /**\r\n     * Clears local cache for the current user then opens a popup window prompting the user to sign-out of the server\r\n     * @param logoutRequest\r\n     */\r\n    logoutPopup(logoutRequest?: EndSessionPopupRequest): Promise<void> {\r\n        try {\r\n            const correlationId = this.getRequestCorrelationId(logoutRequest);\r\n            this.preflightBrowserEnvironmentCheck(InteractionType.Popup);\r\n            const popupClient = this.createPopupClient(correlationId);\r\n            return popupClient.logout(logoutRequest);\r\n        } catch (e) {\r\n            // Since this function is syncronous we need to reject\r\n            return Promise.reject(e);\r\n        }\r\n    }\r\n\r\n    // #endregion\r\n\r\n    // #region Account APIs\r\n\r\n    /**\r\n     * Returns all accounts that MSAL currently has data for.\r\n     * (the account object is created at the time of successful login)\r\n     * or empty array when no accounts are found\r\n     * @returns Array of account objects in cache\r\n     */\r\n    getAllAccounts(): AccountInfo[] {\r\n        this.logger.verbose(\"getAllAccounts called\");\r\n        return this.isBrowserEnvironment ? this.browserStorage.getAllAccounts() : [];\r\n    }\r\n\r\n    /**\r\n     * Returns the signed in account matching username.\r\n     * (the account object is created at the time of successful login)\r\n     * or null when no matching account is found.\r\n     * This API is provided for convenience but getAccountById should be used for best reliability\r\n     * @param username\r\n     * @returns The account object stored in MSAL\r\n     */\r\n    getAccountByUsername(username: string): AccountInfo | null {\r\n        this.logger.trace(\"getAccountByUsername called\");\r\n        if (!username) {\r\n            this.logger.warning(\"getAccountByUsername: No username provided\");\r\n            return null;\r\n        }\r\n\r\n        const account = this.browserStorage.getAccountInfoFilteredBy({username});\r\n        if (account) {\r\n            this.logger.verbose(\"getAccountByUsername: Account matching username found, returning\");\r\n            this.logger.verbosePii(`getAccountByUsername: Returning signed-in accounts matching username: ${username}`);\r\n            return account;\r\n        } else {\r\n            this.logger.verbose(\"getAccountByUsername: No matching account found, returning null\");\r\n            return null;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Returns the signed in account matching homeAccountId.\r\n     * (the account object is created at the time of successful login)\r\n     * or null when no matching account is found\r\n     * @param homeAccountId\r\n     * @returns The account object stored in MSAL\r\n     */\r\n    getAccountByHomeId(homeAccountId: string): AccountInfo | null {\r\n        this.logger.trace(\"getAccountByHomeId called\");\r\n        if (!homeAccountId) {\r\n            this.logger.warning(\"getAccountByHomeId: No homeAccountId provided\");\r\n            return null;\r\n        }\r\n\r\n        const account = this.browserStorage.getAccountInfoFilteredBy({homeAccountId});\r\n        if (account) {\r\n            this.logger.verbose(\"getAccountByHomeId: Account matching homeAccountId found, returning\");\r\n            this.logger.verbosePii(`getAccountByHomeId: Returning signed-in accounts matching homeAccountId: ${homeAccountId}`);\r\n            return account;\r\n        } else {\r\n            this.logger.verbose(\"getAccountByHomeId: No matching account found, returning null\");\r\n            return null;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Returns the signed in account matching localAccountId.\r\n     * (the account object is created at the time of successful login)\r\n     * or null when no matching account is found\r\n     * @param localAccountId\r\n     * @returns The account object stored in MSAL\r\n     */\r\n    getAccountByLocalId(localAccountId: string): AccountInfo | null {\r\n        this.logger.trace(\"getAccountByLocalId called\");\r\n        if (!localAccountId) {\r\n            this.logger.warning(\"getAccountByLocalId: No localAccountId provided\");\r\n            return null;\r\n        }\r\n\r\n        const account = this.browserStorage.getAccountInfoFilteredBy({localAccountId});\r\n        if (account) {\r\n            this.logger.verbose(\"getAccountByLocalId: Account matching localAccountId found, returning\");\r\n            this.logger.verbosePii(`getAccountByLocalId: Returning signed-in accounts matching localAccountId: ${localAccountId}`);\r\n            return account;\r\n        } else {\r\n            this.logger.verbose(\"getAccountByLocalId: No matching account found, returning null\");\r\n            return null;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Sets the account to use as the active account. If no account is passed to the acquireToken APIs, then MSAL will use this active account.\r\n     * @param account\r\n     */\r\n    setActiveAccount(account: AccountInfo | null): void {\r\n        this.browserStorage.setActiveAccount(account);\r\n    }\r\n\r\n    /**\r\n     * Gets the currently active account\r\n     */\r\n    getActiveAccount(): AccountInfo | null {\r\n        return this.browserStorage.getActiveAccount();\r\n    }\r\n\r\n    // #endregion\r\n\r\n    // #region Helpers\r\n\r\n    /**\r\n     * Helper to validate app environment before making an auth request\r\n     *\r\n     * @protected\r\n     * @param {InteractionType} interactionType What kind of interaction is being used\r\n     * @param {boolean} [setInteractionInProgress=true] Whether to set interaction in progress temp cache flag\r\n     */\r\n    protected preflightBrowserEnvironmentCheck(interactionType: InteractionType, setInteractionInProgress: boolean = true): void {\r\n        this.logger.verbose(\"preflightBrowserEnvironmentCheck started\");\r\n        // Block request if not in browser environment\r\n        BrowserUtils.blockNonBrowserEnvironment(this.isBrowserEnvironment);\r\n\r\n        // Block redirects if in an iframe\r\n        BrowserUtils.blockRedirectInIframe(interactionType, this.config.system.allowRedirectInIframe);\r\n\r\n        // Block auth requests inside a hidden iframe\r\n        BrowserUtils.blockReloadInHiddenIframes();\r\n\r\n        // Block redirectUri opened in a popup from calling MSAL APIs\r\n        BrowserUtils.blockAcquireTokenInPopups();\r\n\r\n        // Block token acquisition before initialize has been called if native brokering is enabled\r\n        BrowserUtils.blockNativeBrokerCalledBeforeInitialized(this.config.system.allowNativeBroker, this.initialized);\r\n\r\n        // Block redirects if memory storage is enabled but storeAuthStateInCookie is not\r\n        if (interactionType === InteractionType.Redirect &&\r\n            this.config.cache.cacheLocation === BrowserCacheLocation.MemoryStorage &&\r\n            !this.config.cache.storeAuthStateInCookie) {\r\n            throw BrowserConfigurationAuthError.createInMemoryRedirectUnavailableError();\r\n        }\r\n\r\n        if (interactionType === InteractionType.Redirect || interactionType === InteractionType.Popup) {\r\n            this.preflightInteractiveRequest(setInteractionInProgress);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Preflight check for interactive requests\r\n     *\r\n     * @protected\r\n     * @param {boolean} setInteractionInProgress Whether to set interaction in progress temp cache flag\r\n     */\r\n    protected preflightInteractiveRequest(setInteractionInProgress: boolean): void {\r\n        this.logger.verbose(\"preflightInteractiveRequest called, validating app environment\");\r\n        // block the reload if it occurred inside a hidden iframe\r\n        BrowserUtils.blockReloadInHiddenIframes();\r\n\r\n        // Set interaction in progress temporary cache or throw if alread set.\r\n        if (setInteractionInProgress) {\r\n            this.browserStorage.setInteractionInProgress(true);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Acquire a token from native device (e.g. WAM)\r\n     * @param request\r\n     */\r\n    protected async acquireTokenNative(request: PopupRequest | SilentRequest | SsoSilentRequest, apiId: ApiId, accountId?: string): Promise<AuthenticationResult> {\r\n        this.logger.trace(\"acquireTokenNative called\");\r\n        if (!this.nativeExtensionProvider) {\r\n            throw BrowserAuthError.createNativeConnectionNotEstablishedError();\r\n        }\r\n\r\n        const nativeClient = new NativeInteractionClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, apiId, this.performanceClient, this.nativeExtensionProvider, accountId || this.getNativeAccountId(request), this.nativeInternalStorage, request.correlationId);\r\n\r\n        return nativeClient.acquireToken(request);\r\n    }\r\n\r\n    /**\r\n     * Returns boolean indicating if this request can use the native broker\r\n     * @param request\r\n     */\r\n    protected canUseNative(request: RedirectRequest | PopupRequest | SsoSilentRequest, accountId?: string): boolean {\r\n        this.logger.trace(\"canUseNative called\");\r\n        if (!NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider, request.authenticationScheme)) {\r\n            this.logger.trace(\"canUseNative: isNativeAvailable returned false, returning false\");\r\n            return false;\r\n        }\r\n\r\n        if (request.prompt) {\r\n            switch (request.prompt) {\r\n                case PromptValue.NONE:\r\n                case PromptValue.CONSENT:\r\n                case PromptValue.LOGIN:\r\n                    this.logger.trace(\"canUseNative: prompt is compatible with native flow\");\r\n                    break;\r\n                default:\r\n                    this.logger.trace(`canUseNative: prompt = ${request.prompt} is not compatible with native flow, returning false`);\r\n                    return false;\r\n            }\r\n        }\r\n\r\n        if (!accountId && !this.getNativeAccountId(request)) {\r\n            this.logger.trace(\"canUseNative: nativeAccountId is not available, returning false\");\r\n            return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * Get the native accountId from the account\r\n     * @param request\r\n     * @returns\r\n     */\r\n    protected getNativeAccountId(request: RedirectRequest | PopupRequest | SsoSilentRequest): string {\r\n        const account = request.account || this.browserStorage.getAccountInfoByHints(request.loginHint, request.sid) || this.getActiveAccount();\r\n\r\n        return account && account.nativeAccountId || \"\";\r\n    }\r\n\r\n    /**\r\n     * Returns new instance of the Popup Interaction Client\r\n     * @param correlationId\r\n     */\r\n    protected createPopupClient(correlationId?: string): PopupClient {\r\n        return new PopupClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);\r\n    }\r\n\r\n    /**\r\n     * Returns new instance of the Redirect Interaction Client\r\n     * @param correlationId\r\n     */\r\n    protected createRedirectClient(correlationId?: string): RedirectClient {\r\n        return new RedirectClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);\r\n    }\r\n\r\n    /**\r\n     * Returns new instance of the Silent Iframe Interaction Client\r\n     * @param correlationId\r\n     */\r\n    protected createSilentIframeClient(correlationId?: string): SilentIframeClient {\r\n        return new SilentIframeClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.ssoSilent, this.performanceClient, this.nativeInternalStorage, this.nativeExtensionProvider, correlationId);\r\n    }\r\n\r\n    /**\r\n     * Returns new instance of the Silent Cache Interaction Client\r\n     */\r\n    protected createSilentCacheClient(correlationId?: string): SilentCacheClient {\r\n        return new SilentCacheClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeExtensionProvider, correlationId);\r\n    }\r\n\r\n    /**\r\n     * Returns new instance of the Silent Refresh Interaction Client\r\n     */\r\n    protected createSilentRefreshClient(correlationId?: string): SilentRefreshClient {\r\n        return new SilentRefreshClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, this.performanceClient, this.nativeExtensionProvider, correlationId);\r\n    }\r\n\r\n    /**\r\n     * Returns new instance of the Silent AuthCode Interaction Client\r\n     */\r\n    protected createSilentAuthCodeClient(correlationId?: string): SilentAuthCodeClient {\r\n        return new SilentAuthCodeClient(this.config, this.browserStorage, this.browserCrypto, this.logger, this.eventHandler, this.navigationClient, ApiId.acquireTokenByCode, this.performanceClient, this.nativeExtensionProvider, correlationId);\r\n    }\r\n\r\n    /**\r\n     * Adds event callbacks to array\r\n     * @param callback\r\n     */\r\n    addEventCallback(callback: EventCallbackFunction): string | null {\r\n        return this.eventHandler.addEventCallback(callback);\r\n    }\r\n\r\n    /**\r\n     * Removes callback with provided id from callback array\r\n     * @param callbackId\r\n     */\r\n    removeEventCallback(callbackId: string): void {\r\n        this.eventHandler.removeEventCallback(callbackId);\r\n    }\r\n\r\n    /**\r\n     * Registers a callback to receive performance events.\r\n     *\r\n     * @param {PerformanceCallbackFunction} callback\r\n     * @returns {string}\r\n     */\r\n    addPerformanceCallback(callback: PerformanceCallbackFunction): string {\r\n        return this.performanceClient.addPerformanceCallback(callback);\r\n    }\r\n\r\n    /**\r\n     * Removes a callback registered with addPerformanceCallback.\r\n     *\r\n     * @param {string} callbackId\r\n     * @returns {boolean}\r\n     */\r\n    removePerformanceCallback(callbackId: string): boolean {\r\n        return this.performanceClient.removePerformanceCallback(callbackId);\r\n    }\r\n\r\n    /**\r\n     * Adds event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window\r\n     */\r\n    enableAccountStorageEvents(): void {\r\n        this.eventHandler.enableAccountStorageEvents();\r\n    }\r\n\r\n    /**\r\n     * Removes event listener that emits an event when a user account is added or removed from localstorage in a different browser tab or window\r\n     */\r\n    disableAccountStorageEvents(): void {\r\n        this.eventHandler.disableAccountStorageEvents();\r\n    }\r\n\r\n    /**\r\n     * Gets the token cache for the application.\r\n     */\r\n    getTokenCache(): ITokenCache {\r\n        return this.tokenCache;\r\n    }\r\n\r\n    /**\r\n     * Returns the logger instance\r\n     */\r\n    getLogger(): Logger {\r\n        return this.logger;\r\n    }\r\n\r\n    /**\r\n     * Replaces the default logger set in configurations with new Logger with new configurations\r\n     * @param logger Logger instance\r\n     */\r\n    setLogger(logger: Logger): void {\r\n        this.logger = logger;\r\n    }\r\n\r\n    /**\r\n     * Called by wrapper libraries (Angular & React) to set SKU and Version passed down to telemetry, logger, etc.\r\n     * @param sku\r\n     * @param version\r\n     */\r\n    initializeWrapperLibrary(sku: WrapperSKU, version: string): void {\r\n        // Validate the SKU passed in is one we expect\r\n        this.browserStorage.setWrapperMetadata(sku, version);\r\n    }\r\n\r\n    /**\r\n     * Sets navigation client\r\n     * @param navigationClient\r\n     */\r\n    setNavigationClient(navigationClient: INavigationClient): void {\r\n        this.navigationClient = navigationClient;\r\n    }\r\n\r\n    /**\r\n     * Returns the configuration object\r\n     */\r\n    getConfiguration(): BrowserConfiguration {\r\n        return this.config;\r\n    }\r\n\r\n    /**\r\n     * Generates a correlation id for a request if none is provided.\r\n     *\r\n     * @protected\r\n     * @param {?Partial<BaseAuthRequest>} [request]\r\n     * @returns {string}\r\n     */\r\n    protected getRequestCorrelationId(request?: Partial<BaseAuthRequest>): string {\r\n        if (request?.correlationId) {\r\n            return request.correlationId;\r\n        }\r\n\r\n        if (this.isBrowserEnvironment) {\r\n            return this.browserCrypto.createNewGuid();\r\n        }\r\n\r\n        /*\r\n         * Included for fallback for non-browser environments,\r\n         * and to ensure this method always returns a string.\r\n         */\r\n        return Constants.EMPTY_STRING;\r\n    }\r\n\r\n    // #endregion\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AccountInfo, AuthenticationResult, Constants, RequestThumbprint, AuthError, PerformanceEvents, ServerError, InteractionRequiredAuthError, InProgressPerformanceEvent, InteractionRequiredAuthErrorMessage, AccountEntity } from \"@azure/msal-common\";\r\nimport { Configuration } from \"../config/Configuration\";\r\nimport { DEFAULT_REQUEST, InteractionType, ApiId, CacheLookupPolicy, BrowserConstants } from \"../utils/BrowserConstants\";\r\nimport { IPublicClientApplication } from \"./IPublicClientApplication\";\r\nimport { RedirectRequest } from \"../request/RedirectRequest\";\r\nimport { PopupRequest } from \"../request/PopupRequest\";\r\nimport { ClientApplication } from \"./ClientApplication\";\r\nimport { SilentRequest } from \"../request/SilentRequest\";\r\nimport { EventType } from \"../event/EventType\";\r\nimport { BrowserAuthError } from \"../error/BrowserAuthError\";\r\nimport { NativeAuthError } from \"../error/NativeAuthError\";\r\nimport { NativeMessageHandler } from \"../broker/nativeBroker/NativeMessageHandler\";\r\nimport { BrowserUtils } from \"../utils/BrowserUtils\";\r\nimport { SsoSilentRequest } from \"../request/SsoSilentRequest\";\r\n\r\n/**\r\n * The PublicClientApplication class is the object exposed by the library to perform authentication and authorization functions in Single Page Applications\r\n * to obtain JWT tokens as described in the OAuth 2.0 Authorization Code Flow with PKCE specification.\r\n */\r\nexport class PublicClientApplication extends ClientApplication implements IPublicClientApplication {\r\n\r\n    // Active requests\r\n    private activeSilentTokenRequests: Map<string, Promise<AuthenticationResult>>;\r\n    private astsAsyncMeasurement?: InProgressPerformanceEvent = undefined;\r\n\r\n    /**\r\n     * @constructor\r\n     * Constructor for the PublicClientApplication used to instantiate the PublicClientApplication object\r\n     *\r\n     * Important attributes in the Configuration object for auth are:\r\n     * - clientID: the application ID of your application. You can obtain one by registering your application with our Application registration portal : https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredAppsPreview\r\n     * - authority: the authority URL for your application.\r\n     * - redirect_uri: the uri of your application registered in the portal.\r\n     *\r\n     * In Azure AD, authority is a URL indicating the Azure active directory that MSAL uses to obtain tokens.\r\n     * It is of the form https://login.microsoftonline.com/{Enter_the_Tenant_Info_Here}\r\n     * If your application supports Accounts in one organizational directory, replace \"Enter_the_Tenant_Info_Here\" value with the Tenant Id or Tenant name (for example, contoso.microsoft.com).\r\n     * If your application supports Accounts in any organizational directory, replace \"Enter_the_Tenant_Info_Here\" value with organizations.\r\n     * If your application supports Accounts in any organizational directory and personal Microsoft accounts, replace \"Enter_the_Tenant_Info_Here\" value with common.\r\n     * To restrict support to Personal Microsoft accounts only, replace \"Enter_the_Tenant_Info_Here\" value with consumers.\r\n     *\r\n     * In Azure B2C, authority is of the form https://{instance}/tfp/{tenant}/{policyName}/\r\n     * Full B2C functionality will be available in this library in future versions.\r\n     *\r\n     * @param configuration object for the MSAL PublicClientApplication instance\r\n     */\r\n    constructor(configuration: Configuration) {\r\n        super(configuration);\r\n\r\n        this.activeSilentTokenRequests = new Map();\r\n        // Register listener functions\r\n        this.trackPageVisibility = this.trackPageVisibility.bind(this);\r\n    }\r\n\r\n    /**\r\n     * Use when initiating the login process by redirecting the user's browser to the authorization endpoint. This function redirects the page, so\r\n     * any code that follows this function will not execute.\r\n     *\r\n     * IMPORTANT: It is NOT recommended to have code that is dependent on the resolution of the Promise. This function will navigate away from the current\r\n     * browser window. It currently returns a Promise in order to reflect the asynchronous nature of the code running in this function.\r\n     *\r\n     * @param request\r\n     */\r\n    async loginRedirect(request?: RedirectRequest): Promise<void> {\r\n        const correlationId: string = this.getRequestCorrelationId(request);\r\n        this.logger.verbose(\"loginRedirect called\", correlationId);\r\n        return this.acquireTokenRedirect({\r\n            correlationId,\r\n            ...(request || DEFAULT_REQUEST)\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Use when initiating the login process via opening a popup window in the user's browser\r\n     *\r\n     * @param request\r\n     *\r\n     * @returns A promise that is fulfilled when this function has completed, or rejected if an error was raised.\r\n     */\r\n    loginPopup(request?: PopupRequest): Promise<AuthenticationResult> {\r\n        const correlationId: string = this.getRequestCorrelationId(request);\r\n        this.logger.verbose(\"loginPopup called\", correlationId);\r\n        return this.acquireTokenPopup({\r\n            correlationId,\r\n            ...(request || DEFAULT_REQUEST)\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Silently acquire an access token for a given set of scopes. Returns currently processing promise if parallel requests are made.\r\n     *\r\n     * @param {@link (SilentRequest:type)}\r\n     * @returns {Promise.<AuthenticationResult>} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthResponse} object\r\n     */\r\n    async acquireTokenSilent(request: SilentRequest): Promise<AuthenticationResult> {\r\n        const correlationId = this.getRequestCorrelationId(request);\r\n        const atsMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenSilent, correlationId);\r\n        atsMeasurement.addStaticFields({\r\n            cacheLookupPolicy: request.cacheLookupPolicy\r\n        });\r\n\r\n        this.preflightBrowserEnvironmentCheck(InteractionType.Silent);\r\n        this.logger.verbose(\"acquireTokenSilent called\", correlationId);\r\n\r\n        const account = request.account || this.getActiveAccount();\r\n        if (!account) {\r\n            throw BrowserAuthError.createNoAccountError();\r\n        }\r\n\r\n        const thumbprint: RequestThumbprint = {\r\n            clientId: this.config.auth.clientId,\r\n            authority: request.authority || Constants.EMPTY_STRING,\r\n            scopes: request.scopes,\r\n            homeAccountIdentifier: account.homeAccountId,\r\n            claims: request.claims,\r\n            authenticationScheme: request.authenticationScheme,\r\n            resourceRequestMethod: request.resourceRequestMethod,\r\n            resourceRequestUri: request.resourceRequestUri,\r\n            shrClaims: request.shrClaims,\r\n            sshKid: request.sshKid\r\n        };\r\n        const silentRequestKey = JSON.stringify(thumbprint);\r\n\r\n        const cachedResponse = this.activeSilentTokenRequests.get(silentRequestKey);\r\n        if (typeof cachedResponse === \"undefined\") {\r\n            this.logger.verbose(\"acquireTokenSilent called for the first time, storing active request\", correlationId);\r\n\r\n            this.performanceClient.setPreQueueTime(PerformanceEvents.AcquireTokenSilentAsync, correlationId);\r\n            const response = this.acquireTokenSilentAsync({\r\n                ...request,\r\n                correlationId\r\n            }, account)\r\n                .then((result) => {\r\n                    this.activeSilentTokenRequests.delete(silentRequestKey);\r\n                    atsMeasurement.addStaticFields({\r\n                        accessTokenSize: result.accessToken.length,\r\n                        idTokenSize: result.idToken.length\r\n                    });\r\n                    atsMeasurement.endMeasurement({\r\n                        success: true,\r\n                        fromCache: result.fromCache,\r\n                        isNativeBroker: result.fromNativeBroker,\r\n                        cacheLookupPolicy: request.cacheLookupPolicy,\r\n                        requestId: result.requestId,\r\n                    });\r\n                    return result;\r\n                })\r\n                .catch((error: AuthError) => {\r\n                    this.activeSilentTokenRequests.delete(silentRequestKey);\r\n                    atsMeasurement.endMeasurement({\r\n                        errorCode: error.errorCode,\r\n                        subErrorCode: error.subError,\r\n                        success: false\r\n                    });\r\n                    throw error;\r\n                });\r\n            this.activeSilentTokenRequests.set(silentRequestKey, response);\r\n            return response;\r\n        } else {\r\n            this.logger.verbose(\"acquireTokenSilent has been called previously, returning the result from the first call\", correlationId);\r\n            // Discard measurements for memoized calls, as they are usually only a couple of ms and will artificially deflate metrics\r\n            atsMeasurement.discardMeasurement();\r\n            return cachedResponse;\r\n        }\r\n    }\r\n\r\n    private trackPageVisibility():void {\r\n        if (!this.astsAsyncMeasurement) {\r\n            return;\r\n        }\r\n        this.logger.info(\"Perf: Visibility change detected\");\r\n        this.astsAsyncMeasurement.increment({\r\n            visibilityChangeCount: 1,\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Silently acquire an access token for a given set of scopes. Will use cached token if available, otherwise will attempt to acquire a new token from the network via refresh token.\r\n     * @param {@link (SilentRequest:type)}\r\n     * @param {@link (AccountInfo:type)}\r\n     * @returns {Promise.<AuthenticationResult>} - a promise that is fulfilled when this function has completed, or rejected if an error was raised. Returns the {@link AuthResponse}\r\n     */\r\n    protected async acquireTokenSilentAsync(request: SilentRequest, account: AccountInfo): Promise<AuthenticationResult>{\r\n        this.performanceClient.addQueueMeasurement(PerformanceEvents.AcquireTokenSilentAsync, request.correlationId);\r\n\r\n        this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_START, InteractionType.Silent, request);\r\n        this.astsAsyncMeasurement = this.performanceClient.startMeasurement(PerformanceEvents.AcquireTokenSilentAsync, request.correlationId);\r\n        this.astsAsyncMeasurement?.increment({\r\n            visibilityChangeCount: 0\r\n        });\r\n        document.addEventListener(\"visibilitychange\",this.trackPageVisibility);\r\n        let result: Promise<AuthenticationResult>;\r\n        if (NativeMessageHandler.isNativeAvailable(this.config, this.logger, this.nativeExtensionProvider, request.authenticationScheme) && account.nativeAccountId) {\r\n            this.logger.verbose(\"acquireTokenSilent - attempting to acquire token from native platform\");\r\n            const silentRequest: SilentRequest = {\r\n                ...request,\r\n                account\r\n            };\r\n            result = this.acquireTokenNative(silentRequest, ApiId.acquireTokenSilent_silentFlow).catch(async (e: AuthError) => {\r\n                // If native token acquisition fails for availability reasons fallback to web flow\r\n                if (e instanceof NativeAuthError && e.isFatal()) {\r\n                    this.logger.verbose(\"acquireTokenSilent - native platform unavailable, falling back to web flow\");\r\n                    this.nativeExtensionProvider = undefined; // Prevent future requests from continuing to attempt\r\n\r\n                    // Cache will not contain tokens, given that previous WAM requests succeeded. Skip cache and RT renewal and go straight to iframe renewal\r\n                    const silentIframeClient = this.createSilentIframeClient(request.correlationId);\r\n                    return silentIframeClient.acquireToken(request);\r\n                }\r\n                throw e;\r\n            });\r\n        } else {\r\n            this.logger.verbose(\"acquireTokenSilent - attempting to acquire token from web flow\");\r\n\r\n            const silentCacheClient = this.createSilentCacheClient(request.correlationId);\r\n\r\n            this.performanceClient.setPreQueueTime(PerformanceEvents.InitializeSilentRequest, request.correlationId);\r\n            const silentRequest = await silentCacheClient.initializeSilentRequest(request, account);\r\n\r\n            const requestWithCLP = {\r\n                ...request,\r\n                // set the request's CacheLookupPolicy to Default if it was not optionally passed in\r\n                cacheLookupPolicy: request.cacheLookupPolicy || CacheLookupPolicy.Default\r\n            };\r\n\r\n            this.performanceClient.setPreQueueTime(PerformanceEvents.AcquireTokenFromCache, silentRequest.correlationId);\r\n            result = this.acquireTokenFromCache(silentCacheClient, silentRequest, requestWithCLP).catch((cacheError: AuthError) => {\r\n                if (requestWithCLP.cacheLookupPolicy === CacheLookupPolicy.AccessToken) {\r\n                    throw cacheError;\r\n                }\r\n\r\n                // block the reload if it occurred inside a hidden iframe\r\n                BrowserUtils.blockReloadInHiddenIframes();\r\n                this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_NETWORK_START, InteractionType.Silent, silentRequest);\r\n\r\n                this.performanceClient.setPreQueueTime(PerformanceEvents.AcquireTokenByRefreshToken, silentRequest.correlationId);\r\n                return this.acquireTokenByRefreshToken(silentRequest, requestWithCLP).catch((refreshTokenError: AuthError) => {\r\n                    const isServerError = refreshTokenError instanceof ServerError;\r\n                    const isInteractionRequiredError = refreshTokenError instanceof InteractionRequiredAuthError;\r\n                    const rtNotFound = (refreshTokenError.errorCode === InteractionRequiredAuthErrorMessage.noTokensFoundError.code);\r\n                    const isInvalidGrantError = (refreshTokenError.errorCode === BrowserConstants.INVALID_GRANT_ERROR);\r\n\r\n                    if ((!isServerError ||\r\n                            !isInvalidGrantError ||\r\n                            isInteractionRequiredError ||\r\n                            requestWithCLP.cacheLookupPolicy === CacheLookupPolicy.AccessTokenAndRefreshToken ||\r\n                            requestWithCLP.cacheLookupPolicy === CacheLookupPolicy.RefreshToken)\r\n                        && (requestWithCLP.cacheLookupPolicy !== CacheLookupPolicy.Skip)\r\n                        && !rtNotFound\r\n                    ) {\r\n                        throw refreshTokenError;\r\n                    }\r\n\r\n                    this.logger.verbose(\"Refresh token expired/invalid or CacheLookupPolicy is set to Skip, attempting acquire token by iframe.\", request.correlationId);\r\n                    this.performanceClient.setPreQueueTime(PerformanceEvents.AcquireTokenBySilentIframe, silentRequest.correlationId);\r\n                    return this.acquireTokenBySilentIframe(silentRequest);\r\n                });\r\n            });\r\n        }\r\n\r\n        return result.then((response) => {\r\n            this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_SUCCESS, InteractionType.Silent, response);\r\n            this.astsAsyncMeasurement?.endMeasurement({\r\n                success: true,\r\n                fromCache: response.fromCache,\r\n                isNativeBroker: response.fromNativeBroker,\r\n                requestId: response.requestId\r\n            });\r\n            return response;\r\n        }).catch((tokenRenewalError: AuthError) => {\r\n            this.eventHandler.emitEvent(EventType.ACQUIRE_TOKEN_FAILURE, InteractionType.Silent, null, tokenRenewalError);\r\n            this.astsAsyncMeasurement?.endMeasurement({\r\n                errorCode: tokenRenewalError.errorCode,\r\n                subErrorCode: tokenRenewalError.subError,\r\n                success: false\r\n            });\r\n            throw tokenRenewalError;\r\n        }).finally(() => {\r\n            document.removeEventListener(\"visibilitychange\",this.trackPageVisibility);\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Hydrates cache with the tokens and account in the AuthenticationResult object\r\n     * @param result\r\n     * @param request - The request object that was used to obtain the AuthenticationResult\r\n     * @returns\r\n     */\r\n    async hydrateCache(\r\n        result: AuthenticationResult,\r\n        request: SilentRequest\r\n        | SsoSilentRequest\r\n        | RedirectRequest\r\n        | PopupRequest\r\n    ): Promise<void> {\r\n        this.logger.verbose(\"hydrateCache called\");\r\n\r\n        if(result.account) {\r\n            // Account gets saved to browser storage regardless of native or not\r\n            const accountEntity = AccountEntity.createFromAccountInfo(\r\n                result.account,\r\n                result.cloudGraphHostName,\r\n                result.msGraphHost\r\n            );\r\n            this.browserStorage.setAccount(accountEntity);\r\n\r\n            if (result.fromNativeBroker) {\r\n                this.logger.verbose(\r\n                    \"Response was from native broker, storing in-memory\"\r\n                );\r\n                // Tokens from native broker are stored in-memory\r\n                return this.nativeInternalStorage.hydrateCache(result, request);\r\n            } else {\r\n                return this.browserStorage.hydrateCache(result, request);\r\n            }\r\n        }\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthenticationResult, AccountInfo, Logger, PerformanceCallbackFunction } from \"@azure/msal-common\";\r\nimport { RedirectRequest } from \"../request/RedirectRequest\";\r\nimport { PopupRequest } from \"../request/PopupRequest\";\r\nimport { SilentRequest } from \"../request/SilentRequest\";\r\nimport { SsoSilentRequest } from \"../request/SsoSilentRequest\";\r\nimport { EndSessionRequest } from \"../request/EndSessionRequest\";\r\nimport { BrowserConfigurationAuthError } from \"../error/BrowserConfigurationAuthError\";\r\nimport { WrapperSKU } from \"../utils/BrowserConstants\";\r\nimport { INavigationClient } from \"../navigation/INavigationClient\";\r\nimport { EndSessionPopupRequest } from \"../request/EndSessionPopupRequest\";\r\nimport { ITokenCache } from \"../cache/ITokenCache\";\r\nimport { AuthorizationCodeRequest } from \"../request/AuthorizationCodeRequest\";\r\nimport { BrowserConfiguration } from \"../config/Configuration\";\r\n\r\nexport interface IPublicClientApplication {\r\n    initialize(): Promise<void>;\r\n    acquireTokenPopup(request: PopupRequest): Promise<AuthenticationResult>;\r\n    acquireTokenRedirect(request: RedirectRequest): Promise<void>;\r\n    acquireTokenSilent(silentRequest: SilentRequest): Promise<AuthenticationResult>;\r\n    acquireTokenByCode(request: AuthorizationCodeRequest): Promise<AuthenticationResult>;\r\n    addEventCallback(callback: Function): string | null;\r\n    removeEventCallback(callbackId: string): void;\r\n    addPerformanceCallback(callback: PerformanceCallbackFunction): string;\r\n    removePerformanceCallback(callbackId: string): boolean;\r\n    enableAccountStorageEvents(): void;\r\n    disableAccountStorageEvents(): void;\r\n    getAccountByHomeId(homeAccountId: string): AccountInfo | null;\r\n    getAccountByLocalId(localId: string): AccountInfo | null;\r\n    getAccountByUsername(userName: string): AccountInfo | null;\r\n    getAllAccounts(): AccountInfo[];\r\n    handleRedirectPromise(hash?: string): Promise<AuthenticationResult | null>;\r\n    loginPopup(request?: PopupRequest): Promise<AuthenticationResult>;\r\n    loginRedirect(request?: RedirectRequest): Promise<void>;\r\n    logout(logoutRequest?: EndSessionRequest): Promise<void>;\r\n    logoutRedirect(logoutRequest?: EndSessionRequest): Promise<void>;\r\n    logoutPopup(logoutRequest?: EndSessionPopupRequest): Promise<void>;\r\n    ssoSilent(request: SsoSilentRequest): Promise<AuthenticationResult>;\r\n    getTokenCache(): ITokenCache;\r\n    getLogger(): Logger;\r\n    setLogger(logger: Logger): void;\r\n    setActiveAccount(account: AccountInfo | null): void;\r\n    getActiveAccount(): AccountInfo | null;\r\n    initializeWrapperLibrary(sku: WrapperSKU, version: string): void;\r\n    setNavigationClient(navigationClient: INavigationClient): void;\r\n    getConfiguration(): BrowserConfiguration;\r\n    hydrateCache(\r\n        result: AuthenticationResult,\r\n        request: SilentRequest\r\n        | SsoSilentRequest\r\n        | RedirectRequest\r\n        | PopupRequest\r\n    ): Promise<void>;\r\n}\r\n\r\nexport const stubbedPublicClientApplication: IPublicClientApplication = {\r\n    initialize: () => {\r\n        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());\r\n    },\r\n    acquireTokenPopup: () => {\r\n        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());\r\n    },\r\n    acquireTokenRedirect: () => {\t\r\n        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());\t\r\n    },\t\r\n    acquireTokenSilent: () => {\t\r\n        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());\t\r\n    },\r\n    acquireTokenByCode: () => {\r\n        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());\r\n    },\r\n    getAllAccounts: () => {\r\n        return [];\t\r\n    },\t\r\n    getAccountByHomeId: () => {\r\n        return null;\r\n    },\r\n    getAccountByUsername: () => {\t\r\n        return null;\t\r\n    },\t\r\n    getAccountByLocalId: () => {\r\n        return null;\r\n    },\r\n    handleRedirectPromise: () => {\t\r\n        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());\t\r\n    },\t\r\n    loginPopup: () => {\t\r\n        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());\t\r\n    },\t\r\n    loginRedirect: () => {\t\r\n        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());\t\r\n    },\t\r\n    logout: () => {\t\r\n        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());\t\r\n    },\t\r\n    logoutRedirect: () => {\t\r\n        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());\t\r\n    },\r\n    logoutPopup: () => {\t\r\n        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());\t\r\n    },\r\n    ssoSilent: () => {\t\r\n        return Promise.reject(BrowserConfigurationAuthError.createStubPcaInstanceCalledError());\t\r\n    },\r\n    addEventCallback: () => {\r\n        return null;\r\n    },\r\n    removeEventCallback: () => {\r\n        return;\r\n    },\r\n    addPerformanceCallback: () => {\r\n        return \"\";\r\n    },\r\n    removePerformanceCallback: () => {\r\n        return false;\r\n    },\r\n    enableAccountStorageEvents: () => {\r\n        return;\r\n    },\r\n    disableAccountStorageEvents: () => {\r\n        return;\r\n    },\r\n    getTokenCache: () => {\r\n        throw BrowserConfigurationAuthError.createStubPcaInstanceCalledError();\r\n    },\r\n    getLogger: () => {\r\n        throw BrowserConfigurationAuthError.createStubPcaInstanceCalledError();\r\n    },\r\n    setLogger: () => {\r\n        return;\r\n    },\r\n    setActiveAccount: () => {\r\n        return;\r\n    },\r\n    getActiveAccount: () => {\r\n        return null;\r\n    },\r\n    initializeWrapperLibrary: () => {\r\n        return;\r\n    },\r\n    setNavigationClient: () => {\r\n        return;\r\n    },\r\n    getConfiguration: () => {\r\n        throw BrowserConfigurationAuthError.createStubPcaInstanceCalledError();\r\n    },\r\n    hydrateCache: () => {\r\n        return Promise.reject(\r\n            BrowserConfigurationAuthError.createStubPcaInstanceCalledError()\r\n        );\r\n    },\r\n};\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { AuthenticationResult, AuthError, AccountInfo } from \"@azure/msal-common\";\r\nimport { EventType } from \"./EventType\";\r\nimport { InteractionStatus, InteractionType } from \"../utils/BrowserConstants\";\r\nimport { PopupRequest, RedirectRequest, SilentRequest, SsoSilentRequest, EndSessionRequest } from \"..\";\r\n\r\nexport type EventMessage = {\r\n    eventType: EventType;\r\n    interactionType: InteractionType | null;\r\n    payload: EventPayload;\r\n    error: EventError;\r\n    timestamp: number;\r\n};\r\n\r\nexport type PopupEvent = {\r\n    popupWindow: Window;\r\n};\r\n\r\nexport type EventPayload = AccountInfo | PopupRequest | RedirectRequest | SilentRequest | SsoSilentRequest | EndSessionRequest | AuthenticationResult | PopupEvent | null;\r\n\r\nexport type EventError = AuthError | Error | null;\r\n\r\nexport type EventCallbackFunction = (message: EventMessage) => void;\r\n\r\nexport class EventMessageUtils {\r\n\r\n    /**\r\n     * Gets interaction status from event message\r\n     * @param message\r\n     * @param currentStatus\r\n     */\r\n    static getInteractionStatusFromEvent(message: EventMessage, currentStatus?: InteractionStatus): InteractionStatus|null {\r\n        switch (message.eventType) {\r\n            case EventType.LOGIN_START:\r\n                return InteractionStatus.Login;\r\n            case EventType.SSO_SILENT_START:\r\n                return InteractionStatus.SsoSilent;\r\n            case EventType.ACQUIRE_TOKEN_START:\r\n                if (message.interactionType === InteractionType.Redirect || message.interactionType === InteractionType.Popup) {\r\n                    return InteractionStatus.AcquireToken;\r\n                }\r\n                break;\r\n            case EventType.HANDLE_REDIRECT_START:\r\n                return InteractionStatus.HandleRedirect;\r\n            case EventType.LOGOUT_START:\r\n                return InteractionStatus.Logout;\r\n            case EventType.SSO_SILENT_SUCCESS:\r\n            case EventType.SSO_SILENT_FAILURE:\r\n                if (currentStatus && currentStatus !== InteractionStatus.SsoSilent) {\r\n                    // Prevent this event from clearing any status other than ssoSilent\r\n                    break;\r\n                }\r\n                return InteractionStatus.None;\r\n            case EventType.LOGOUT_END:\r\n                if (currentStatus && currentStatus !== InteractionStatus.Logout) {\r\n                    // Prevent this event from clearing any status other than logout\r\n                    break;\r\n                }\r\n                return InteractionStatus.None;\r\n            case EventType.HANDLE_REDIRECT_END:\r\n                if (currentStatus && currentStatus !== InteractionStatus.HandleRedirect) {\r\n                    // Prevent this event from clearing any status other than handleRedirect\r\n                    break;\r\n                }\r\n                return InteractionStatus.None;\r\n            case EventType.LOGIN_SUCCESS:\r\n            case EventType.LOGIN_FAILURE:\r\n            case EventType.ACQUIRE_TOKEN_SUCCESS:\r\n            case EventType.ACQUIRE_TOKEN_FAILURE:\r\n            case EventType.RESTORE_FROM_BFCACHE:\r\n                if (message.interactionType === InteractionType.Redirect || message.interactionType === InteractionType.Popup) {\r\n                    if (currentStatus && currentStatus !== InteractionStatus.Login && currentStatus !== InteractionStatus.AcquireToken) {\r\n                        // Prevent this event from clearing any status other than login or acquireToken\r\n                        break;\r\n                    }\r\n                    return InteractionStatus.None;\r\n                }\r\n                break;\r\n            default:\r\n                break;\r\n        }\r\n        return null;\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { CryptoOps } from \"./CryptoOps\";\r\nimport { Logger, LoggerOptions, PopTokenGenerator, SignedHttpRequestParameters } from \"@azure/msal-common\";\r\nimport { version, name } from \"../packageMetadata\";\r\n\r\nexport type SignedHttpRequestOptions = {\r\n    loggerOptions: LoggerOptions\r\n};\r\n\r\nexport class SignedHttpRequest {\r\n    private popTokenGenerator: PopTokenGenerator;\r\n    private cryptoOps: CryptoOps;\r\n    private shrParameters: SignedHttpRequestParameters;\r\n    private logger: Logger;\r\n\r\n    constructor(shrParameters: SignedHttpRequestParameters, shrOptions?: SignedHttpRequestOptions) {\r\n        const loggerOptions = (shrOptions && shrOptions.loggerOptions) || {};\r\n        this.logger = new Logger(loggerOptions, name, version);\r\n        this.cryptoOps = new CryptoOps(this.logger);\r\n        this.popTokenGenerator = new PopTokenGenerator(this.cryptoOps);\r\n        this.shrParameters = shrParameters;\r\n    }\r\n\r\n    /**\r\n     * Generates and caches a keypair for the given request options.\r\n     * @returns Public key digest, which should be sent to the token issuer.\r\n     */\r\n    async generatePublicKeyThumbprint(): Promise<string> {\r\n        const { kid } = await this.popTokenGenerator.generateKid(this.shrParameters);\r\n\r\n        return kid;\r\n    }\r\n\r\n    /**\r\n     * Generates a signed http request for the given payload with the given key.\r\n     * @param payload Payload to sign (e.g. access token)\r\n     * @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)\r\n     * @param claims Additional claims to include/override in the signed JWT \r\n     * @returns Pop token signed with the corresponding private key\r\n     */\r\n    async signRequest(payload: string, publicKeyThumbprint: string, claims?: object): Promise<string> {\r\n        return this.popTokenGenerator.signPayload(\r\n            payload, \r\n            publicKeyThumbprint,\r\n            this.shrParameters, \r\n            claims\r\n        );\r\n    }\r\n\r\n    /**\r\n     * Removes cached keys from browser for given public key thumbprint\r\n     * @param publicKeyThumbprint Public key digest (from generatePublicKeyThumbprint API)\r\n     * @returns If keys are properly deleted\r\n     */\r\n    async removeKeys(publicKeyThumbprint: string): Promise<boolean> {\r\n        return await this.cryptoOps.removeTokenBindingKey(publicKeyThumbprint);\r\n    }\r\n}\r\n","/*\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License.\r\n */\r\n\r\nimport { ClientConfigurationError } from \"../error/ClientConfigurationError\";\r\nimport { Constants, HeaderNames } from \"../utils/Constants\";\r\n\r\ntype WWWAuthenticateChallenges = {\r\n    nonce?: string,\r\n};\r\n\r\ntype AuthenticationInfoChallenges = {\r\n    nextnonce?: string\r\n};\r\n\r\n/**\r\n * This is a helper class that parses supported HTTP response authentication headers to extract and return\r\n * header challenge values that can be used outside the basic authorization flows.\r\n */\r\nexport class AuthenticationHeaderParser {\r\n    private headers: Record<string, string>;\r\n\r\n    constructor(headers: Record<string, string>) {\r\n        this.headers = headers;\r\n    }\r\n\r\n    /**\r\n     * This method parses the SHR nonce value out of either the Authentication-Info or WWW-Authenticate authentication headers.\r\n     * @returns \r\n     */\r\n    getShrNonce(): string {\r\n        // Attempt to parse nonce from Authentiacation-Info\r\n        const authenticationInfo = this.headers[HeaderNames.AuthenticationInfo];\r\n        if (authenticationInfo) {\r\n            const authenticationInfoChallenges = this.parseChallenges<AuthenticationInfoChallenges>(authenticationInfo);\r\n            if (authenticationInfoChallenges.nextnonce) {\r\n                return authenticationInfoChallenges.nextnonce;\r\n            }\r\n            throw ClientConfigurationError.createInvalidAuthenticationHeaderError(HeaderNames.AuthenticationInfo, \"nextnonce challenge is missing.\");\r\n        }\r\n\r\n        // Attempt to parse nonce from WWW-Authenticate\r\n        const wwwAuthenticate = this.headers[HeaderNames.WWWAuthenticate];\r\n        if (wwwAuthenticate) {\r\n            const wwwAuthenticateChallenges = this.parseChallenges<WWWAuthenticateChallenges>(wwwAuthenticate);     \r\n            if (wwwAuthenticateChallenges.nonce){\r\n                return wwwAuthenticateChallenges.nonce;\r\n            }\r\n            throw ClientConfigurationError.createInvalidAuthenticationHeaderError(HeaderNames.WWWAuthenticate, \"nonce challenge is missing.\");\r\n        }\r\n\r\n        // If neither header is present, throw missing headers error\r\n        throw ClientConfigurationError.createMissingNonceAuthenticationHeadersError();\r\n    }\r\n\r\n    /**\r\n     * Parses an HTTP header's challenge set into a key/value map.\r\n     * @param header \r\n     * @returns \r\n     */\r\n    private parseChallenges<T>(header: string): T {\r\n        const schemeSeparator = header.indexOf(\" \");\r\n        const challenges = header.substr(schemeSeparator + 1).split(\",\");\r\n        const challengeMap = {} as T;\r\n\r\n        challenges.forEach((challenge: string) => {\r\n            const [ key, value ] = challenge.split(\"=\");\r\n            // Remove escaped quotation marks (', \") from challenge string to keep only the challenge value\r\n            challengeMap[key] = unescape(value.replace(/['\"]+/g, Constants.EMPTY_STRING));\r\n        });\r\n\r\n        return challengeMap;\r\n    }\r\n}\r\n","export default function esCompat(m) {\n  return m?.__esModule ? m : { default: m, ...m };\n}\n","/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n  extendStatics = Object.setPrototypeOf ||\n      ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n      function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n  return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n  if (typeof b !== \"function\" && b !== null)\n      throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n  extendStatics(d, b);\n  function __() { this.constructor = d; }\n  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n  __assign = Object.assign || function __assign(t) {\n      for (var s, i = 1, n = arguments.length; i < n; i++) {\n          s = arguments[i];\n          for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n      }\n      return t;\n  }\n  return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n  var t = {};\n  for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n      t[p] = s[p];\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n      for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n          if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n              t[p[i]] = s[p[i]];\n      }\n  return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n  if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n  return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n  return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n  function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n  var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n  var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n  var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n  var _, done = false;\n  for (var i = decorators.length - 1; i >= 0; i--) {\n      var context = {};\n      for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n      for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n      context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n      var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n      if (kind === \"accessor\") {\n          if (result === void 0) continue;\n          if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n          if (_ = accept(result.get)) descriptor.get = _;\n          if (_ = accept(result.set)) descriptor.set = _;\n          if (_ = accept(result.init)) initializers.unshift(_);\n      }\n      else if (_ = accept(result)) {\n          if (kind === \"field\") initializers.unshift(_);\n          else descriptor[key] = _;\n      }\n  }\n  if (target) Object.defineProperty(target, contextIn.name, descriptor);\n  done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n  var useValue = arguments.length > 2;\n  for (var i = 0; i < initializers.length; i++) {\n      value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n  }\n  return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n  return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n  if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n  return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n  if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n  function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n  return new (P || (P = Promise))(function (resolve, reject) {\n      function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n      function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n      function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n      step((generator = generator.apply(thisArg, _arguments || [])).next());\n  });\n}\n\nexport function __generator(thisArg, body) {\n  var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n  return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n  function verb(n) { return function (v) { return step([n, v]); }; }\n  function step(op) {\n      if (f) throw new TypeError(\"Generator is already executing.\");\n      while (g && (g = 0, op[0] && (_ = 0)), _) try {\n          if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n          if (y = 0, t) op = [op[0] & 2, t.value];\n          switch (op[0]) {\n              case 0: case 1: t = op; break;\n              case 4: _.label++; return { value: op[1], done: false };\n              case 5: _.label++; y = op[1]; op = [0]; continue;\n              case 7: op = _.ops.pop(); _.trys.pop(); continue;\n              default:\n                  if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n                  if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n                  if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n                  if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n                  if (t[2]) _.ops.pop();\n                  _.trys.pop(); continue;\n          }\n          op = body.call(thisArg, _);\n      } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n      if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n  }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  var desc = Object.getOwnPropertyDescriptor(m, k);\n  if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n      desc = { enumerable: true, get: function() { return m[k]; } };\n  }\n  Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n  if (k2 === undefined) k2 = k;\n  o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n  for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n  var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n  if (m) return m.call(o);\n  if (o && typeof o.length === \"number\") return {\n      next: function () {\n          if (o && i >= o.length) o = void 0;\n          return { value: o && o[i++], done: !o };\n      }\n  };\n  throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n  var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n  if (!m) return o;\n  var i = m.call(o), r, ar = [], e;\n  try {\n      while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n  }\n  catch (error) { e = { error: error }; }\n  finally {\n      try {\n          if (r && !r.done && (m = i[\"return\"])) m.call(i);\n      }\n      finally { if (e) throw e.error; }\n  }\n  return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n  for (var ar = [], i = 0; i < arguments.length; i++)\n      ar = ar.concat(__read(arguments[i]));\n  return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n  for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n  for (var r = Array(s), k = 0, i = 0; i < il; i++)\n      for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n          r[k] = a[j];\n  return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n  if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n      if (ar || !(i in from)) {\n          if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n          ar[i] = from[i];\n      }\n  }\n  return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n  return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var g = generator.apply(thisArg, _arguments || []), i, q = [];\n  return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n  function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n  function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n  function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n  function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n  function fulfill(value) { resume(\"next\", value); }\n  function reject(value) { resume(\"throw\", value); }\n  function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n  var i, p;\n  return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n  function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n  if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n  var m = o[Symbol.asyncIterator], i;\n  return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n  function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n  function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n  if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n  return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n  Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n  o[\"default\"] = v;\n};\n\nvar ownKeys = function(o) {\n  ownKeys = Object.getOwnPropertyNames || function (o) {\n    var ar = [];\n    for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\n    return ar;\n  };\n  return ownKeys(o);\n};\n\nexport function __importStar(mod) {\n  if (mod && mod.__esModule) return mod;\n  var result = {};\n  if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\n  __setModuleDefault(result, mod);\n  return result;\n}\n\nexport function __importDefault(mod) {\n  return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n  return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n  if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n  if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n  if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n  return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n  if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n  return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n  if (value !== null && value !== void 0) {\n    if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n    var dispose, inner;\n    if (async) {\n      if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n      dispose = value[Symbol.asyncDispose];\n    }\n    if (dispose === void 0) {\n      if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n      dispose = value[Symbol.dispose];\n      if (async) inner = dispose;\n    }\n    if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n    if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n    env.stack.push({ value: value, dispose: dispose, async: async });\n  }\n  else if (async) {\n    env.stack.push({ async: true });\n  }\n  return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n  var e = new Error(message);\n  return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n  function fail(e) {\n    env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n    env.hasError = true;\n  }\n  var r, s = 0;\n  function next() {\n    while (r = env.stack.pop()) {\n      try {\n        if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n        if (r.dispose) {\n          var result = r.dispose.call(r.value);\n          if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n        }\n        else s |= 1;\n      }\n      catch (e) {\n        fail(e);\n      }\n    }\n    if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n    if (env.hasError) throw env.error;\n  }\n  return next();\n}\n\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\n  if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\n      return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\n          return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\n      });\n  }\n  return path;\n}\n\nexport default {\n  __extends,\n  __assign,\n  __rest,\n  __decorate,\n  __param,\n  __esDecorate,\n  __runInitializers,\n  __propKey,\n  __setFunctionName,\n  __metadata,\n  __awaiter,\n  __generator,\n  __createBinding,\n  __exportStar,\n  __values,\n  __read,\n  __spread,\n  __spreadArrays,\n  __spreadArray,\n  __await,\n  __asyncGenerator,\n  __asyncDelegator,\n  __asyncValues,\n  __makeTemplateObject,\n  __importStar,\n  __importDefault,\n  __classPrivateFieldGet,\n  __classPrivateFieldSet,\n  __classPrivateFieldIn,\n  __addDisposableResource,\n  __disposeResources,\n  __rewriteRelativeImportExtension,\n};\n","//\n// Main\n//\nexport function memoize(fn, options) {\n    var cache = options && options.cache ? options.cache : cacheDefault;\n    var serializer = options && options.serializer ? options.serializer : serializerDefault;\n    var strategy = options && options.strategy ? options.strategy : strategyDefault;\n    return strategy(fn, {\n        cache: cache,\n        serializer: serializer,\n    });\n}\n//\n// Strategy\n//\nfunction isPrimitive(value) {\n    return (value == null || typeof value === 'number' || typeof value === 'boolean'); // || typeof value === \"string\" 'unsafe' primitive for our needs\n}\nfunction monadic(fn, cache, serializer, arg) {\n    var cacheKey = isPrimitive(arg) ? arg : serializer(arg);\n    var computedValue = cache.get(cacheKey);\n    if (typeof computedValue === 'undefined') {\n        computedValue = fn.call(this, arg);\n        cache.set(cacheKey, computedValue);\n    }\n    return computedValue;\n}\nfunction variadic(fn, cache, serializer) {\n    var args = Array.prototype.slice.call(arguments, 3);\n    var cacheKey = serializer(args);\n    var computedValue = cache.get(cacheKey);\n    if (typeof computedValue === 'undefined') {\n        computedValue = fn.apply(this, args);\n        cache.set(cacheKey, computedValue);\n    }\n    return computedValue;\n}\nfunction assemble(fn, context, strategy, cache, serialize) {\n    return strategy.bind(context, fn, cache, serialize);\n}\nfunction strategyDefault(fn, options) {\n    var strategy = fn.length === 1 ? monadic : variadic;\n    return assemble(fn, this, strategy, options.cache.create(), options.serializer);\n}\nfunction strategyVariadic(fn, options) {\n    return assemble(fn, this, variadic, options.cache.create(), options.serializer);\n}\nfunction strategyMonadic(fn, options) {\n    return assemble(fn, this, monadic, options.cache.create(), options.serializer);\n}\n//\n// Serializer\n//\nvar serializerDefault = function () {\n    return JSON.stringify(arguments);\n};\n//\n// Cache\n//\nvar ObjectWithoutPrototypeCache = /** @class */ (function () {\n    function ObjectWithoutPrototypeCache() {\n        this.cache = Object.create(null);\n    }\n    ObjectWithoutPrototypeCache.prototype.get = function (key) {\n        return this.cache[key];\n    };\n    ObjectWithoutPrototypeCache.prototype.set = function (key, value) {\n        this.cache[key] = value;\n    };\n    return ObjectWithoutPrototypeCache;\n}());\nvar cacheDefault = {\n    create: function create() {\n        return new ObjectWithoutPrototypeCache();\n    },\n};\nexport var strategies = {\n    variadic: strategyVariadic,\n    monadic: strategyMonadic,\n};\n","export var ErrorKind;\n(function (ErrorKind) {\n    /** Argument is unclosed (e.g. `{0`) */\n    ErrorKind[ErrorKind[\"EXPECT_ARGUMENT_CLOSING_BRACE\"] = 1] = \"EXPECT_ARGUMENT_CLOSING_BRACE\";\n    /** Argument is empty (e.g. `{}`). */\n    ErrorKind[ErrorKind[\"EMPTY_ARGUMENT\"] = 2] = \"EMPTY_ARGUMENT\";\n    /** Argument is malformed (e.g. `{foo!}``) */\n    ErrorKind[ErrorKind[\"MALFORMED_ARGUMENT\"] = 3] = \"MALFORMED_ARGUMENT\";\n    /** Expect an argument type (e.g. `{foo,}`) */\n    ErrorKind[ErrorKind[\"EXPECT_ARGUMENT_TYPE\"] = 4] = \"EXPECT_ARGUMENT_TYPE\";\n    /** Unsupported argument type (e.g. `{foo,foo}`) */\n    ErrorKind[ErrorKind[\"INVALID_ARGUMENT_TYPE\"] = 5] = \"INVALID_ARGUMENT_TYPE\";\n    /** Expect an argument style (e.g. `{foo, number, }`) */\n    ErrorKind[ErrorKind[\"EXPECT_ARGUMENT_STYLE\"] = 6] = \"EXPECT_ARGUMENT_STYLE\";\n    /** The number skeleton is invalid. */\n    ErrorKind[ErrorKind[\"INVALID_NUMBER_SKELETON\"] = 7] = \"INVALID_NUMBER_SKELETON\";\n    /** The date time skeleton is invalid. */\n    ErrorKind[ErrorKind[\"INVALID_DATE_TIME_SKELETON\"] = 8] = \"INVALID_DATE_TIME_SKELETON\";\n    /** Exepct a number skeleton following the `::` (e.g. `{foo, number, ::}`) */\n    ErrorKind[ErrorKind[\"EXPECT_NUMBER_SKELETON\"] = 9] = \"EXPECT_NUMBER_SKELETON\";\n    /** Exepct a date time skeleton following the `::` (e.g. `{foo, date, ::}`) */\n    ErrorKind[ErrorKind[\"EXPECT_DATE_TIME_SKELETON\"] = 10] = \"EXPECT_DATE_TIME_SKELETON\";\n    /** Unmatched apostrophes in the argument style (e.g. `{foo, number, 'test`) */\n    ErrorKind[ErrorKind[\"UNCLOSED_QUOTE_IN_ARGUMENT_STYLE\"] = 11] = \"UNCLOSED_QUOTE_IN_ARGUMENT_STYLE\";\n    /** Missing select argument options (e.g. `{foo, select}`) */\n    ErrorKind[ErrorKind[\"EXPECT_SELECT_ARGUMENT_OPTIONS\"] = 12] = \"EXPECT_SELECT_ARGUMENT_OPTIONS\";\n    /** Expecting an offset value in `plural` or `selectordinal` argument (e.g `{foo, plural, offset}`) */\n    ErrorKind[ErrorKind[\"EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE\"] = 13] = \"EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE\";\n    /** Offset value in `plural` or `selectordinal` is invalid (e.g. `{foo, plural, offset: x}`) */\n    ErrorKind[ErrorKind[\"INVALID_PLURAL_ARGUMENT_OFFSET_VALUE\"] = 14] = \"INVALID_PLURAL_ARGUMENT_OFFSET_VALUE\";\n    /** Expecting a selector in `select` argument (e.g `{foo, select}`) */\n    ErrorKind[ErrorKind[\"EXPECT_SELECT_ARGUMENT_SELECTOR\"] = 15] = \"EXPECT_SELECT_ARGUMENT_SELECTOR\";\n    /** Expecting a selector in `plural` or `selectordinal` argument (e.g `{foo, plural}`) */\n    ErrorKind[ErrorKind[\"EXPECT_PLURAL_ARGUMENT_SELECTOR\"] = 16] = \"EXPECT_PLURAL_ARGUMENT_SELECTOR\";\n    /** Expecting a message fragment after the `select` selector (e.g. `{foo, select, apple}`) */\n    ErrorKind[ErrorKind[\"EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT\"] = 17] = \"EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT\";\n    /**\n     * Expecting a message fragment after the `plural` or `selectordinal` selector\n     * (e.g. `{foo, plural, one}`)\n     */\n    ErrorKind[ErrorKind[\"EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT\"] = 18] = \"EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT\";\n    /** Selector in `plural` or `selectordinal` is malformed (e.g. `{foo, plural, =x {#}}`) */\n    ErrorKind[ErrorKind[\"INVALID_PLURAL_ARGUMENT_SELECTOR\"] = 19] = \"INVALID_PLURAL_ARGUMENT_SELECTOR\";\n    /**\n     * Duplicate selectors in `plural` or `selectordinal` argument.\n     * (e.g. {foo, plural, one {#} one {#}})\n     */\n    ErrorKind[ErrorKind[\"DUPLICATE_PLURAL_ARGUMENT_SELECTOR\"] = 20] = \"DUPLICATE_PLURAL_ARGUMENT_SELECTOR\";\n    /** Duplicate selectors in `select` argument.\n     * (e.g. {foo, select, apple {apple} apple {apple}})\n     */\n    ErrorKind[ErrorKind[\"DUPLICATE_SELECT_ARGUMENT_SELECTOR\"] = 21] = \"DUPLICATE_SELECT_ARGUMENT_SELECTOR\";\n    /** Plural or select argument option must have `other` clause. */\n    ErrorKind[ErrorKind[\"MISSING_OTHER_CLAUSE\"] = 22] = \"MISSING_OTHER_CLAUSE\";\n    /** The tag is malformed. (e.g. `<bold!>foo</bold!>) */\n    ErrorKind[ErrorKind[\"INVALID_TAG\"] = 23] = \"INVALID_TAG\";\n    /** The tag name is invalid. (e.g. `<123>foo</123>`) */\n    ErrorKind[ErrorKind[\"INVALID_TAG_NAME\"] = 25] = \"INVALID_TAG_NAME\";\n    /** The closing tag does not match the opening tag. (e.g. `<bold>foo</italic>`) */\n    ErrorKind[ErrorKind[\"UNMATCHED_CLOSING_TAG\"] = 26] = \"UNMATCHED_CLOSING_TAG\";\n    /** The opening tag has unmatched closing tag. (e.g. `<bold>foo`) */\n    ErrorKind[ErrorKind[\"UNCLOSED_TAG\"] = 27] = \"UNCLOSED_TAG\";\n})(ErrorKind || (ErrorKind = {}));\n","export var TYPE;\n(function (TYPE) {\n    /**\n     * Raw text\n     */\n    TYPE[TYPE[\"literal\"] = 0] = \"literal\";\n    /**\n     * Variable w/o any format, e.g `var` in `this is a {var}`\n     */\n    TYPE[TYPE[\"argument\"] = 1] = \"argument\";\n    /**\n     * Variable w/ number format\n     */\n    TYPE[TYPE[\"number\"] = 2] = \"number\";\n    /**\n     * Variable w/ date format\n     */\n    TYPE[TYPE[\"date\"] = 3] = \"date\";\n    /**\n     * Variable w/ time format\n     */\n    TYPE[TYPE[\"time\"] = 4] = \"time\";\n    /**\n     * Variable w/ select format\n     */\n    TYPE[TYPE[\"select\"] = 5] = \"select\";\n    /**\n     * Variable w/ plural format\n     */\n    TYPE[TYPE[\"plural\"] = 6] = \"plural\";\n    /**\n     * Only possible within plural argument.\n     * This is the `#` symbol that will be substituted with the count.\n     */\n    TYPE[TYPE[\"pound\"] = 7] = \"pound\";\n    /**\n     * XML-like tag\n     */\n    TYPE[TYPE[\"tag\"] = 8] = \"tag\";\n})(TYPE || (TYPE = {}));\nexport var SKELETON_TYPE;\n(function (SKELETON_TYPE) {\n    SKELETON_TYPE[SKELETON_TYPE[\"number\"] = 0] = \"number\";\n    SKELETON_TYPE[SKELETON_TYPE[\"dateTime\"] = 1] = \"dateTime\";\n})(SKELETON_TYPE || (SKELETON_TYPE = {}));\n/**\n * Type Guards\n */\nexport function isLiteralElement(el) {\n    return el.type === TYPE.literal;\n}\nexport function isArgumentElement(el) {\n    return el.type === TYPE.argument;\n}\nexport function isNumberElement(el) {\n    return el.type === TYPE.number;\n}\nexport function isDateElement(el) {\n    return el.type === TYPE.date;\n}\nexport function isTimeElement(el) {\n    return el.type === TYPE.time;\n}\nexport function isSelectElement(el) {\n    return el.type === TYPE.select;\n}\nexport function isPluralElement(el) {\n    return el.type === TYPE.plural;\n}\nexport function isPoundElement(el) {\n    return el.type === TYPE.pound;\n}\nexport function isTagElement(el) {\n    return el.type === TYPE.tag;\n}\nexport function isNumberSkeleton(el) {\n    return !!(el && typeof el === 'object' && el.type === SKELETON_TYPE.number);\n}\nexport function isDateTimeSkeleton(el) {\n    return !!(el && typeof el === 'object' && el.type === SKELETON_TYPE.dateTime);\n}\nexport function createLiteralElement(value) {\n    return {\n        type: TYPE.literal,\n        value: value,\n    };\n}\nexport function createNumberElement(value, style) {\n    return {\n        type: TYPE.number,\n        value: value,\n        style: style,\n    };\n}\n","// @generated from regex-gen.ts\nexport var SPACE_SEPARATOR_REGEX = /[ \\xA0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/;\nexport var WHITE_SPACE_REGEX = /[\\t-\\r \\x85\\u200E\\u200F\\u2028\\u2029]/;\n","/**\n * https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * Credit: https://github.com/caridy/intl-datetimeformat-pattern/blob/master/index.js\n * with some tweaks\n */\nvar DATE_TIME_REGEX = /(?:[Eec]{1,6}|G{1,5}|[Qq]{1,5}|(?:[yYur]+|U{1,5})|[ML]{1,5}|d{1,2}|D{1,3}|F{1}|[abB]{1,5}|[hkHK]{1,2}|w{1,2}|W{1}|m{1,2}|s{1,2}|[zZOvVxX]{1,4})(?=([^']*'[^']*')*[^']*$)/g;\n/**\n * Parse Date time skeleton into Intl.DateTimeFormatOptions\n * Ref: https://unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * @public\n * @param skeleton skeleton string\n */\nexport function parseDateTimeSkeleton(skeleton) {\n    var result = {};\n    skeleton.replace(DATE_TIME_REGEX, function (match) {\n        var len = match.length;\n        switch (match[0]) {\n            // Era\n            case 'G':\n                result.era = len === 4 ? 'long' : len === 5 ? 'narrow' : 'short';\n                break;\n            // Year\n            case 'y':\n                result.year = len === 2 ? '2-digit' : 'numeric';\n                break;\n            case 'Y':\n            case 'u':\n            case 'U':\n            case 'r':\n                throw new RangeError('`Y/u/U/r` (year) patterns are not supported, use `y` instead');\n            // Quarter\n            case 'q':\n            case 'Q':\n                throw new RangeError('`q/Q` (quarter) patterns are not supported');\n            // Month\n            case 'M':\n            case 'L':\n                result.month = ['numeric', '2-digit', 'short', 'long', 'narrow'][len - 1];\n                break;\n            // Week\n            case 'w':\n            case 'W':\n                throw new RangeError('`w/W` (week) patterns are not supported');\n            case 'd':\n                result.day = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'D':\n            case 'F':\n            case 'g':\n                throw new RangeError('`D/F/g` (day) patterns are not supported, use `d` instead');\n            // Weekday\n            case 'E':\n                result.weekday = len === 4 ? 'long' : len === 5 ? 'narrow' : 'short';\n                break;\n            case 'e':\n                if (len < 4) {\n                    throw new RangeError('`e..eee` (weekday) patterns are not supported');\n                }\n                result.weekday = ['short', 'long', 'narrow', 'short'][len - 4];\n                break;\n            case 'c':\n                if (len < 4) {\n                    throw new RangeError('`c..ccc` (weekday) patterns are not supported');\n                }\n                result.weekday = ['short', 'long', 'narrow', 'short'][len - 4];\n                break;\n            // Period\n            case 'a': // AM, PM\n                result.hour12 = true;\n                break;\n            case 'b': // am, pm, noon, midnight\n            case 'B': // flexible day periods\n                throw new RangeError('`b/B` (period) patterns are not supported, use `a` instead');\n            // Hour\n            case 'h':\n                result.hourCycle = 'h12';\n                result.hour = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'H':\n                result.hourCycle = 'h23';\n                result.hour = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'K':\n                result.hourCycle = 'h11';\n                result.hour = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'k':\n                result.hourCycle = 'h24';\n                result.hour = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'j':\n            case 'J':\n            case 'C':\n                throw new RangeError('`j/J/C` (hour) patterns are not supported, use `h/H/K/k` instead');\n            // Minute\n            case 'm':\n                result.minute = ['numeric', '2-digit'][len - 1];\n                break;\n            // Second\n            case 's':\n                result.second = ['numeric', '2-digit'][len - 1];\n                break;\n            case 'S':\n            case 'A':\n                throw new RangeError('`S/A` (second) patterns are not supported, use `s` instead');\n            // Zone\n            case 'z': // 1..3, 4: specific non-location format\n                result.timeZoneName = len < 4 ? 'short' : 'long';\n                break;\n            case 'Z': // 1..3, 4, 5: The ISO8601 varios formats\n            case 'O': // 1, 4: milliseconds in day short, long\n            case 'v': // 1, 4: generic non-location format\n            case 'V': // 1, 2, 3, 4: time zone ID or city\n            case 'X': // 1, 2, 3, 4: The ISO8601 varios formats\n            case 'x': // 1, 2, 3, 4: The ISO8601 varios formats\n                throw new RangeError('`Z/O/v/V/X/x` (timeZone) patterns are not supported, use `z` instead');\n        }\n        return '';\n    });\n    return result;\n}\n","// @generated from regex-gen.ts\nexport var WHITE_SPACE_REGEX = /[\\t-\\r \\x85\\u200E\\u200F\\u2028\\u2029]/i;\n","import { __assign } from \"tslib\";\nimport { WHITE_SPACE_REGEX } from './regex.generated';\nexport function parseNumberSkeletonFromString(skeleton) {\n    if (skeleton.length === 0) {\n        throw new Error('Number skeleton cannot be empty');\n    }\n    // Parse the skeleton\n    var stringTokens = skeleton\n        .split(WHITE_SPACE_REGEX)\n        .filter(function (x) { return x.length > 0; });\n    var tokens = [];\n    for (var _i = 0, stringTokens_1 = stringTokens; _i < stringTokens_1.length; _i++) {\n        var stringToken = stringTokens_1[_i];\n        var stemAndOptions = stringToken.split('/');\n        if (stemAndOptions.length === 0) {\n            throw new Error('Invalid number skeleton');\n        }\n        var stem = stemAndOptions[0], options = stemAndOptions.slice(1);\n        for (var _a = 0, options_1 = options; _a < options_1.length; _a++) {\n            var option = options_1[_a];\n            if (option.length === 0) {\n                throw new Error('Invalid number skeleton');\n            }\n        }\n        tokens.push({ stem: stem, options: options });\n    }\n    return tokens;\n}\nfunction icuUnitToEcma(unit) {\n    return unit.replace(/^(.*?)-/, '');\n}\nvar FRACTION_PRECISION_REGEX = /^\\.(?:(0+)(\\*)?|(#+)|(0+)(#+))$/g;\nvar SIGNIFICANT_PRECISION_REGEX = /^(@+)?(\\+|#+)?[rs]?$/g;\nvar INTEGER_WIDTH_REGEX = /(\\*)(0+)|(#+)(0+)|(0+)/g;\nvar CONCISE_INTEGER_WIDTH_REGEX = /^(0+)$/;\nfunction parseSignificantPrecision(str) {\n    var result = {};\n    if (str[str.length - 1] === 'r') {\n        result.roundingPriority = 'morePrecision';\n    }\n    else if (str[str.length - 1] === 's') {\n        result.roundingPriority = 'lessPrecision';\n    }\n    str.replace(SIGNIFICANT_PRECISION_REGEX, function (_, g1, g2) {\n        // @@@ case\n        if (typeof g2 !== 'string') {\n            result.minimumSignificantDigits = g1.length;\n            result.maximumSignificantDigits = g1.length;\n        }\n        // @@@+ case\n        else if (g2 === '+') {\n            result.minimumSignificantDigits = g1.length;\n        }\n        // .### case\n        else if (g1[0] === '#') {\n            result.maximumSignificantDigits = g1.length;\n        }\n        // .@@## or .@@@ case\n        else {\n            result.minimumSignificantDigits = g1.length;\n            result.maximumSignificantDigits =\n                g1.length + (typeof g2 === 'string' ? g2.length : 0);\n        }\n        return '';\n    });\n    return result;\n}\nfunction parseSign(str) {\n    switch (str) {\n        case 'sign-auto':\n            return {\n                signDisplay: 'auto',\n            };\n        case 'sign-accounting':\n        case '()':\n            return {\n                currencySign: 'accounting',\n            };\n        case 'sign-always':\n        case '+!':\n            return {\n                signDisplay: 'always',\n            };\n        case 'sign-accounting-always':\n        case '()!':\n            return {\n                signDisplay: 'always',\n                currencySign: 'accounting',\n            };\n        case 'sign-except-zero':\n        case '+?':\n            return {\n                signDisplay: 'exceptZero',\n            };\n        case 'sign-accounting-except-zero':\n        case '()?':\n            return {\n                signDisplay: 'exceptZero',\n                currencySign: 'accounting',\n            };\n        case 'sign-never':\n        case '+_':\n            return {\n                signDisplay: 'never',\n            };\n    }\n}\nfunction parseConciseScientificAndEngineeringStem(stem) {\n    // Engineering\n    var result;\n    if (stem[0] === 'E' && stem[1] === 'E') {\n        result = {\n            notation: 'engineering',\n        };\n        stem = stem.slice(2);\n    }\n    else if (stem[0] === 'E') {\n        result = {\n            notation: 'scientific',\n        };\n        stem = stem.slice(1);\n    }\n    if (result) {\n        var signDisplay = stem.slice(0, 2);\n        if (signDisplay === '+!') {\n            result.signDisplay = 'always';\n            stem = stem.slice(2);\n        }\n        else if (signDisplay === '+?') {\n            result.signDisplay = 'exceptZero';\n            stem = stem.slice(2);\n        }\n        if (!CONCISE_INTEGER_WIDTH_REGEX.test(stem)) {\n            throw new Error('Malformed concise eng/scientific notation');\n        }\n        result.minimumIntegerDigits = stem.length;\n    }\n    return result;\n}\nfunction parseNotationOptions(opt) {\n    var result = {};\n    var signOpts = parseSign(opt);\n    if (signOpts) {\n        return signOpts;\n    }\n    return result;\n}\n/**\n * https://github.com/unicode-org/icu/blob/master/docs/userguide/format_parse/numbers/skeletons.md#skeleton-stems-and-options\n */\nexport function parseNumberSkeleton(tokens) {\n    var result = {};\n    for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {\n        var token = tokens_1[_i];\n        switch (token.stem) {\n            case 'percent':\n            case '%':\n                result.style = 'percent';\n                continue;\n            case '%x100':\n                result.style = 'percent';\n                result.scale = 100;\n                continue;\n            case 'currency':\n                result.style = 'currency';\n                result.currency = token.options[0];\n                continue;\n            case 'group-off':\n            case ',_':\n                result.useGrouping = false;\n                continue;\n            case 'precision-integer':\n            case '.':\n                result.maximumFractionDigits = 0;\n                continue;\n            case 'measure-unit':\n            case 'unit':\n                result.style = 'unit';\n                result.unit = icuUnitToEcma(token.options[0]);\n                continue;\n            case 'compact-short':\n            case 'K':\n                result.notation = 'compact';\n                result.compactDisplay = 'short';\n                continue;\n            case 'compact-long':\n            case 'KK':\n                result.notation = 'compact';\n                result.compactDisplay = 'long';\n                continue;\n            case 'scientific':\n                result = __assign(__assign(__assign({}, result), { notation: 'scientific' }), token.options.reduce(function (all, opt) { return (__assign(__assign({}, all), parseNotationOptions(opt))); }, {}));\n                continue;\n            case 'engineering':\n                result = __assign(__assign(__assign({}, result), { notation: 'engineering' }), token.options.reduce(function (all, opt) { return (__assign(__assign({}, all), parseNotationOptions(opt))); }, {}));\n                continue;\n            case 'notation-simple':\n                result.notation = 'standard';\n                continue;\n            // https://github.com/unicode-org/icu/blob/master/icu4c/source/i18n/unicode/unumberformatter.h\n            case 'unit-width-narrow':\n                result.currencyDisplay = 'narrowSymbol';\n                result.unitDisplay = 'narrow';\n                continue;\n            case 'unit-width-short':\n                result.currencyDisplay = 'code';\n                result.unitDisplay = 'short';\n                continue;\n            case 'unit-width-full-name':\n                result.currencyDisplay = 'name';\n                result.unitDisplay = 'long';\n                continue;\n            case 'unit-width-iso-code':\n                result.currencyDisplay = 'symbol';\n                continue;\n            case 'scale':\n                result.scale = parseFloat(token.options[0]);\n                continue;\n            case 'rounding-mode-floor':\n                result.roundingMode = 'floor';\n                continue;\n            case 'rounding-mode-ceiling':\n                result.roundingMode = 'ceil';\n                continue;\n            case 'rounding-mode-down':\n                result.roundingMode = 'trunc';\n                continue;\n            case 'rounding-mode-up':\n                result.roundingMode = 'expand';\n                continue;\n            case 'rounding-mode-half-even':\n                result.roundingMode = 'halfEven';\n                continue;\n            case 'rounding-mode-half-down':\n                result.roundingMode = 'halfTrunc';\n                continue;\n            case 'rounding-mode-half-up':\n                result.roundingMode = 'halfExpand';\n                continue;\n            // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#integer-width\n            case 'integer-width':\n                if (token.options.length > 1) {\n                    throw new RangeError('integer-width stems only accept a single optional option');\n                }\n                token.options[0].replace(INTEGER_WIDTH_REGEX, function (_, g1, g2, g3, g4, g5) {\n                    if (g1) {\n                        result.minimumIntegerDigits = g2.length;\n                    }\n                    else if (g3 && g4) {\n                        throw new Error('We currently do not support maximum integer digits');\n                    }\n                    else if (g5) {\n                        throw new Error('We currently do not support exact integer digits');\n                    }\n                    return '';\n                });\n                continue;\n        }\n        // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#integer-width\n        if (CONCISE_INTEGER_WIDTH_REGEX.test(token.stem)) {\n            result.minimumIntegerDigits = token.stem.length;\n            continue;\n        }\n        if (FRACTION_PRECISION_REGEX.test(token.stem)) {\n            // Precision\n            // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#fraction-precision\n            // precision-integer case\n            if (token.options.length > 1) {\n                throw new RangeError('Fraction-precision stems only accept a single optional option');\n            }\n            token.stem.replace(FRACTION_PRECISION_REGEX, function (_, g1, g2, g3, g4, g5) {\n                // .000* case (before ICU67 it was .000+)\n                if (g2 === '*') {\n                    result.minimumFractionDigits = g1.length;\n                }\n                // .### case\n                else if (g3 && g3[0] === '#') {\n                    result.maximumFractionDigits = g3.length;\n                }\n                // .00## case\n                else if (g4 && g5) {\n                    result.minimumFractionDigits = g4.length;\n                    result.maximumFractionDigits = g4.length + g5.length;\n                }\n                else {\n                    result.minimumFractionDigits = g1.length;\n                    result.maximumFractionDigits = g1.length;\n                }\n                return '';\n            });\n            var opt = token.options[0];\n            // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#trailing-zero-display\n            if (opt === 'w') {\n                result = __assign(__assign({}, result), { trailingZeroDisplay: 'stripIfInteger' });\n            }\n            else if (opt) {\n                result = __assign(__assign({}, result), parseSignificantPrecision(opt));\n            }\n            continue;\n        }\n        // https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html#significant-digits-precision\n        if (SIGNIFICANT_PRECISION_REGEX.test(token.stem)) {\n            result = __assign(__assign({}, result), parseSignificantPrecision(token.stem));\n            continue;\n        }\n        var signOpts = parseSign(token.stem);\n        if (signOpts) {\n            result = __assign(__assign({}, result), signOpts);\n        }\n        var conciseScientificAndEngineeringOpts = parseConciseScientificAndEngineeringStem(token.stem);\n        if (conciseScientificAndEngineeringOpts) {\n            result = __assign(__assign({}, result), conciseScientificAndEngineeringOpts);\n        }\n    }\n    return result;\n}\n","// @generated from time-data-gen.ts\n// prettier-ignore  \nexport var timeData = {\n    \"001\": [\n        \"H\",\n        \"h\"\n    ],\n    \"419\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"AC\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"AD\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"AE\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"AF\": [\n        \"H\",\n        \"hb\",\n        \"hB\",\n        \"h\"\n    ],\n    \"AG\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"AI\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"AL\": [\n        \"h\",\n        \"H\",\n        \"hB\"\n    ],\n    \"AM\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"AO\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"AR\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"AS\": [\n        \"h\",\n        \"H\"\n    ],\n    \"AT\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"AU\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"AW\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"AX\": [\n        \"H\"\n    ],\n    \"AZ\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"BA\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"BB\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"BD\": [\n        \"h\",\n        \"hB\",\n        \"H\"\n    ],\n    \"BE\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"BF\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"BG\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"BH\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"BI\": [\n        \"H\",\n        \"h\"\n    ],\n    \"BJ\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"BL\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"BM\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"BN\": [\n        \"hb\",\n        \"hB\",\n        \"h\",\n        \"H\"\n    ],\n    \"BO\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"BQ\": [\n        \"H\"\n    ],\n    \"BR\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"BS\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"BT\": [\n        \"h\",\n        \"H\"\n    ],\n    \"BW\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"BY\": [\n        \"H\",\n        \"h\"\n    ],\n    \"BZ\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"CA\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"CC\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"CD\": [\n        \"hB\",\n        \"H\"\n    ],\n    \"CF\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"CG\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"CH\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"CI\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"CK\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"CL\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"CM\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"CN\": [\n        \"H\",\n        \"hB\",\n        \"hb\",\n        \"h\"\n    ],\n    \"CO\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"CP\": [\n        \"H\"\n    ],\n    \"CR\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"CU\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"CV\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"CW\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"CX\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"CY\": [\n        \"h\",\n        \"H\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"CZ\": [\n        \"H\"\n    ],\n    \"DE\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"DG\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"DJ\": [\n        \"h\",\n        \"H\"\n    ],\n    \"DK\": [\n        \"H\"\n    ],\n    \"DM\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"DO\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"DZ\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"EA\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"EC\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"EE\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"EG\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"EH\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"ER\": [\n        \"h\",\n        \"H\"\n    ],\n    \"ES\": [\n        \"H\",\n        \"hB\",\n        \"h\",\n        \"hb\"\n    ],\n    \"ET\": [\n        \"hB\",\n        \"hb\",\n        \"h\",\n        \"H\"\n    ],\n    \"FI\": [\n        \"H\"\n    ],\n    \"FJ\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"FK\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"FM\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"FO\": [\n        \"H\",\n        \"h\"\n    ],\n    \"FR\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"GA\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"GB\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"GD\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"GE\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"GF\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"GG\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"GH\": [\n        \"h\",\n        \"H\"\n    ],\n    \"GI\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"GL\": [\n        \"H\",\n        \"h\"\n    ],\n    \"GM\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"GN\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"GP\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"GQ\": [\n        \"H\",\n        \"hB\",\n        \"h\",\n        \"hb\"\n    ],\n    \"GR\": [\n        \"h\",\n        \"H\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"GT\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"GU\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"GW\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"GY\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"HK\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"HN\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"HR\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"HU\": [\n        \"H\",\n        \"h\"\n    ],\n    \"IC\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"ID\": [\n        \"H\"\n    ],\n    \"IE\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"IL\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"IM\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"IN\": [\n        \"h\",\n        \"H\"\n    ],\n    \"IO\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"IQ\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"IR\": [\n        \"hB\",\n        \"H\"\n    ],\n    \"IS\": [\n        \"H\"\n    ],\n    \"IT\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"JE\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"JM\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"JO\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"JP\": [\n        \"H\",\n        \"K\",\n        \"h\"\n    ],\n    \"KE\": [\n        \"hB\",\n        \"hb\",\n        \"H\",\n        \"h\"\n    ],\n    \"KG\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"KH\": [\n        \"hB\",\n        \"h\",\n        \"H\",\n        \"hb\"\n    ],\n    \"KI\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"KM\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"KN\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"KP\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"KR\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"KW\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"KY\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"KZ\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"LA\": [\n        \"H\",\n        \"hb\",\n        \"hB\",\n        \"h\"\n    ],\n    \"LB\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"LC\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"LI\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"LK\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"LR\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"LS\": [\n        \"h\",\n        \"H\"\n    ],\n    \"LT\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"LU\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"LV\": [\n        \"H\",\n        \"hB\",\n        \"hb\",\n        \"h\"\n    ],\n    \"LY\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"MA\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"MC\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"MD\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"ME\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"MF\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"MG\": [\n        \"H\",\n        \"h\"\n    ],\n    \"MH\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"MK\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"ML\": [\n        \"H\"\n    ],\n    \"MM\": [\n        \"hB\",\n        \"hb\",\n        \"H\",\n        \"h\"\n    ],\n    \"MN\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"MO\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"MP\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"MQ\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"MR\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"MS\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"MT\": [\n        \"H\",\n        \"h\"\n    ],\n    \"MU\": [\n        \"H\",\n        \"h\"\n    ],\n    \"MV\": [\n        \"H\",\n        \"h\"\n    ],\n    \"MW\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"MX\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"MY\": [\n        \"hb\",\n        \"hB\",\n        \"h\",\n        \"H\"\n    ],\n    \"MZ\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"NA\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"NC\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"NE\": [\n        \"H\"\n    ],\n    \"NF\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"NG\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"NI\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"NL\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"NO\": [\n        \"H\",\n        \"h\"\n    ],\n    \"NP\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"NR\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"NU\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"NZ\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"OM\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"PA\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"PE\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"PF\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"PG\": [\n        \"h\",\n        \"H\"\n    ],\n    \"PH\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"PK\": [\n        \"h\",\n        \"hB\",\n        \"H\"\n    ],\n    \"PL\": [\n        \"H\",\n        \"h\"\n    ],\n    \"PM\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"PN\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"PR\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"PS\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"PT\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"PW\": [\n        \"h\",\n        \"H\"\n    ],\n    \"PY\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"QA\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"RE\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"RO\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"RS\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"RU\": [\n        \"H\"\n    ],\n    \"RW\": [\n        \"H\",\n        \"h\"\n    ],\n    \"SA\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"SB\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"SC\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"SD\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"SE\": [\n        \"H\"\n    ],\n    \"SG\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"SH\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"SI\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"SJ\": [\n        \"H\"\n    ],\n    \"SK\": [\n        \"H\"\n    ],\n    \"SL\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"SM\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"SN\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"SO\": [\n        \"h\",\n        \"H\"\n    ],\n    \"SR\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"SS\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"ST\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"SV\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"SX\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"SY\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"SZ\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"TA\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"TC\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"TD\": [\n        \"h\",\n        \"H\",\n        \"hB\"\n    ],\n    \"TF\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"TG\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"TH\": [\n        \"H\",\n        \"h\"\n    ],\n    \"TJ\": [\n        \"H\",\n        \"h\"\n    ],\n    \"TL\": [\n        \"H\",\n        \"hB\",\n        \"hb\",\n        \"h\"\n    ],\n    \"TM\": [\n        \"H\",\n        \"h\"\n    ],\n    \"TN\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"TO\": [\n        \"h\",\n        \"H\"\n    ],\n    \"TR\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"TT\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"TW\": [\n        \"hB\",\n        \"hb\",\n        \"h\",\n        \"H\"\n    ],\n    \"TZ\": [\n        \"hB\",\n        \"hb\",\n        \"H\",\n        \"h\"\n    ],\n    \"UA\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"UG\": [\n        \"hB\",\n        \"hb\",\n        \"H\",\n        \"h\"\n    ],\n    \"UM\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"US\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"UY\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"UZ\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"VA\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"VC\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"VE\": [\n        \"h\",\n        \"H\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"VG\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"VI\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"VN\": [\n        \"H\",\n        \"h\"\n    ],\n    \"VU\": [\n        \"h\",\n        \"H\"\n    ],\n    \"WF\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"WS\": [\n        \"h\",\n        \"H\"\n    ],\n    \"XK\": [\n        \"H\",\n        \"hB\",\n        \"h\"\n    ],\n    \"YE\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"YT\": [\n        \"H\",\n        \"hB\"\n    ],\n    \"ZA\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"ZM\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"ZW\": [\n        \"H\",\n        \"h\"\n    ],\n    \"af-ZA\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"ar-001\": [\n        \"h\",\n        \"hB\",\n        \"hb\",\n        \"H\"\n    ],\n    \"ca-ES\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"en-001\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"en-HK\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"en-IL\": [\n        \"H\",\n        \"h\",\n        \"hb\",\n        \"hB\"\n    ],\n    \"en-MY\": [\n        \"h\",\n        \"hb\",\n        \"H\",\n        \"hB\"\n    ],\n    \"es-BR\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"es-ES\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"es-GQ\": [\n        \"H\",\n        \"h\",\n        \"hB\",\n        \"hb\"\n    ],\n    \"fr-CA\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"gl-ES\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"gu-IN\": [\n        \"hB\",\n        \"hb\",\n        \"h\",\n        \"H\"\n    ],\n    \"hi-IN\": [\n        \"hB\",\n        \"h\",\n        \"H\"\n    ],\n    \"it-CH\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"it-IT\": [\n        \"H\",\n        \"h\",\n        \"hB\"\n    ],\n    \"kn-IN\": [\n        \"hB\",\n        \"h\",\n        \"H\"\n    ],\n    \"ml-IN\": [\n        \"hB\",\n        \"h\",\n        \"H\"\n    ],\n    \"mr-IN\": [\n        \"hB\",\n        \"hb\",\n        \"h\",\n        \"H\"\n    ],\n    \"pa-IN\": [\n        \"hB\",\n        \"hb\",\n        \"h\",\n        \"H\"\n    ],\n    \"ta-IN\": [\n        \"hB\",\n        \"h\",\n        \"hb\",\n        \"H\"\n    ],\n    \"te-IN\": [\n        \"hB\",\n        \"h\",\n        \"H\"\n    ],\n    \"zu-ZA\": [\n        \"H\",\n        \"hB\",\n        \"hb\",\n        \"h\"\n    ]\n};\n","var _a;\nimport { __assign } from \"tslib\";\nimport { ErrorKind } from './error';\nimport { SKELETON_TYPE, TYPE, } from './types';\nimport { SPACE_SEPARATOR_REGEX } from './regex.generated';\nimport { parseNumberSkeleton, parseNumberSkeletonFromString, parseDateTimeSkeleton, } from '@formatjs/icu-skeleton-parser';\nimport { getBestPattern } from './date-time-pattern-generator';\nvar SPACE_SEPARATOR_START_REGEX = new RegExp(\"^\".concat(SPACE_SEPARATOR_REGEX.source, \"*\"));\nvar SPACE_SEPARATOR_END_REGEX = new RegExp(\"\".concat(SPACE_SEPARATOR_REGEX.source, \"*$\"));\nfunction createLocation(start, end) {\n    return { start: start, end: end };\n}\n// #region Ponyfills\n// Consolidate these variables up top for easier toggling during debugging\nvar hasNativeStartsWith = !!String.prototype.startsWith && '_a'.startsWith('a', 1);\nvar hasNativeFromCodePoint = !!String.fromCodePoint;\nvar hasNativeFromEntries = !!Object.fromEntries;\nvar hasNativeCodePointAt = !!String.prototype.codePointAt;\nvar hasTrimStart = !!String.prototype.trimStart;\nvar hasTrimEnd = !!String.prototype.trimEnd;\nvar hasNativeIsSafeInteger = !!Number.isSafeInteger;\nvar isSafeInteger = hasNativeIsSafeInteger\n    ? Number.isSafeInteger\n    : function (n) {\n        return (typeof n === 'number' &&\n            isFinite(n) &&\n            Math.floor(n) === n &&\n            Math.abs(n) <= 0x1fffffffffffff);\n    };\n// IE11 does not support y and u.\nvar REGEX_SUPPORTS_U_AND_Y = true;\ntry {\n    var re = RE('([^\\\\p{White_Space}\\\\p{Pattern_Syntax}]*)', 'yu');\n    /**\n     * legacy Edge or Xbox One browser\n     * Unicode flag support: supported\n     * Pattern_Syntax support: not supported\n     * See https://github.com/formatjs/formatjs/issues/2822\n     */\n    REGEX_SUPPORTS_U_AND_Y = ((_a = re.exec('a')) === null || _a === void 0 ? void 0 : _a[0]) === 'a';\n}\ncatch (_) {\n    REGEX_SUPPORTS_U_AND_Y = false;\n}\nvar startsWith = hasNativeStartsWith\n    ? // Native\n        function startsWith(s, search, position) {\n            return s.startsWith(search, position);\n        }\n    : // For IE11\n        function startsWith(s, search, position) {\n            return s.slice(position, position + search.length) === search;\n        };\nvar fromCodePoint = hasNativeFromCodePoint\n    ? String.fromCodePoint\n    : // IE11\n        function fromCodePoint() {\n            var codePoints = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                codePoints[_i] = arguments[_i];\n            }\n            var elements = '';\n            var length = codePoints.length;\n            var i = 0;\n            var code;\n            while (length > i) {\n                code = codePoints[i++];\n                if (code > 0x10ffff)\n                    throw RangeError(code + ' is not a valid code point');\n                elements +=\n                    code < 0x10000\n                        ? String.fromCharCode(code)\n                        : String.fromCharCode(((code -= 0x10000) >> 10) + 0xd800, (code % 0x400) + 0xdc00);\n            }\n            return elements;\n        };\nvar fromEntries = \n// native\nhasNativeFromEntries\n    ? Object.fromEntries\n    : // Ponyfill\n        function fromEntries(entries) {\n            var obj = {};\n            for (var _i = 0, entries_1 = entries; _i < entries_1.length; _i++) {\n                var _a = entries_1[_i], k = _a[0], v = _a[1];\n                obj[k] = v;\n            }\n            return obj;\n        };\nvar codePointAt = hasNativeCodePointAt\n    ? // Native\n        function codePointAt(s, index) {\n            return s.codePointAt(index);\n        }\n    : // IE 11\n        function codePointAt(s, index) {\n            var size = s.length;\n            if (index < 0 || index >= size) {\n                return undefined;\n            }\n            var first = s.charCodeAt(index);\n            var second;\n            return first < 0xd800 ||\n                first > 0xdbff ||\n                index + 1 === size ||\n                (second = s.charCodeAt(index + 1)) < 0xdc00 ||\n                second > 0xdfff\n                ? first\n                : ((first - 0xd800) << 10) + (second - 0xdc00) + 0x10000;\n        };\nvar trimStart = hasTrimStart\n    ? // Native\n        function trimStart(s) {\n            return s.trimStart();\n        }\n    : // Ponyfill\n        function trimStart(s) {\n            return s.replace(SPACE_SEPARATOR_START_REGEX, '');\n        };\nvar trimEnd = hasTrimEnd\n    ? // Native\n        function trimEnd(s) {\n            return s.trimEnd();\n        }\n    : // Ponyfill\n        function trimEnd(s) {\n            return s.replace(SPACE_SEPARATOR_END_REGEX, '');\n        };\n// Prevent minifier to translate new RegExp to literal form that might cause syntax error on IE11.\nfunction RE(s, flag) {\n    return new RegExp(s, flag);\n}\n// #endregion\nvar matchIdentifierAtIndex;\nif (REGEX_SUPPORTS_U_AND_Y) {\n    // Native\n    var IDENTIFIER_PREFIX_RE_1 = RE('([^\\\\p{White_Space}\\\\p{Pattern_Syntax}]*)', 'yu');\n    matchIdentifierAtIndex = function matchIdentifierAtIndex(s, index) {\n        var _a;\n        IDENTIFIER_PREFIX_RE_1.lastIndex = index;\n        var match = IDENTIFIER_PREFIX_RE_1.exec(s);\n        return (_a = match[1]) !== null && _a !== void 0 ? _a : '';\n    };\n}\nelse {\n    // IE11\n    matchIdentifierAtIndex = function matchIdentifierAtIndex(s, index) {\n        var match = [];\n        while (true) {\n            var c = codePointAt(s, index);\n            if (c === undefined || _isWhiteSpace(c) || _isPatternSyntax(c)) {\n                break;\n            }\n            match.push(c);\n            index += c >= 0x10000 ? 2 : 1;\n        }\n        return fromCodePoint.apply(void 0, match);\n    };\n}\nvar Parser = /** @class */ (function () {\n    function Parser(message, options) {\n        if (options === void 0) { options = {}; }\n        this.message = message;\n        this.position = { offset: 0, line: 1, column: 1 };\n        this.ignoreTag = !!options.ignoreTag;\n        this.locale = options.locale;\n        this.requiresOtherClause = !!options.requiresOtherClause;\n        this.shouldParseSkeletons = !!options.shouldParseSkeletons;\n    }\n    Parser.prototype.parse = function () {\n        if (this.offset() !== 0) {\n            throw Error('parser can only be used once');\n        }\n        return this.parseMessage(0, '', false);\n    };\n    Parser.prototype.parseMessage = function (nestingLevel, parentArgType, expectingCloseTag) {\n        var elements = [];\n        while (!this.isEOF()) {\n            var char = this.char();\n            if (char === 123 /* `{` */) {\n                var result = this.parseArgument(nestingLevel, expectingCloseTag);\n                if (result.err) {\n                    return result;\n                }\n                elements.push(result.val);\n            }\n            else if (char === 125 /* `}` */ && nestingLevel > 0) {\n                break;\n            }\n            else if (char === 35 /* `#` */ &&\n                (parentArgType === 'plural' || parentArgType === 'selectordinal')) {\n                var position = this.clonePosition();\n                this.bump();\n                elements.push({\n                    type: TYPE.pound,\n                    location: createLocation(position, this.clonePosition()),\n                });\n            }\n            else if (char === 60 /* `<` */ &&\n                !this.ignoreTag &&\n                this.peek() === 47 // char code for '/'\n            ) {\n                if (expectingCloseTag) {\n                    break;\n                }\n                else {\n                    return this.error(ErrorKind.UNMATCHED_CLOSING_TAG, createLocation(this.clonePosition(), this.clonePosition()));\n                }\n            }\n            else if (char === 60 /* `<` */ &&\n                !this.ignoreTag &&\n                _isAlpha(this.peek() || 0)) {\n                var result = this.parseTag(nestingLevel, parentArgType);\n                if (result.err) {\n                    return result;\n                }\n                elements.push(result.val);\n            }\n            else {\n                var result = this.parseLiteral(nestingLevel, parentArgType);\n                if (result.err) {\n                    return result;\n                }\n                elements.push(result.val);\n            }\n        }\n        return { val: elements, err: null };\n    };\n    /**\n     * A tag name must start with an ASCII lower/upper case letter. The grammar is based on the\n     * [custom element name][] except that a dash is NOT always mandatory and uppercase letters\n     * are accepted:\n     *\n     * ```\n     * tag ::= \"<\" tagName (whitespace)* \"/>\" | \"<\" tagName (whitespace)* \">\" message \"</\" tagName (whitespace)* \">\"\n     * tagName ::= [a-z] (PENChar)*\n     * PENChar ::=\n     *     \"-\" | \".\" | [0-9] | \"_\" | [a-z] | [A-Z] | #xB7 | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x37D] |\n     *     [#x37F-#x1FFF] | [#x200C-#x200D] | [#x203F-#x2040] | [#x2070-#x218F] | [#x2C00-#x2FEF] |\n     *     [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\n     * ```\n     *\n     * [custom element name]: https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name\n     * NOTE: We're a bit more lax here since HTML technically does not allow uppercase HTML element but we do\n     * since other tag-based engines like React allow it\n     */\n    Parser.prototype.parseTag = function (nestingLevel, parentArgType) {\n        var startPosition = this.clonePosition();\n        this.bump(); // `<`\n        var tagName = this.parseTagName();\n        this.bumpSpace();\n        if (this.bumpIf('/>')) {\n            // Self closing tag\n            return {\n                val: {\n                    type: TYPE.literal,\n                    value: \"<\".concat(tagName, \"/>\"),\n                    location: createLocation(startPosition, this.clonePosition()),\n                },\n                err: null,\n            };\n        }\n        else if (this.bumpIf('>')) {\n            var childrenResult = this.parseMessage(nestingLevel + 1, parentArgType, true);\n            if (childrenResult.err) {\n                return childrenResult;\n            }\n            var children = childrenResult.val;\n            // Expecting a close tag\n            var endTagStartPosition = this.clonePosition();\n            if (this.bumpIf('</')) {\n                if (this.isEOF() || !_isAlpha(this.char())) {\n                    return this.error(ErrorKind.INVALID_TAG, createLocation(endTagStartPosition, this.clonePosition()));\n                }\n                var closingTagNameStartPosition = this.clonePosition();\n                var closingTagName = this.parseTagName();\n                if (tagName !== closingTagName) {\n                    return this.error(ErrorKind.UNMATCHED_CLOSING_TAG, createLocation(closingTagNameStartPosition, this.clonePosition()));\n                }\n                this.bumpSpace();\n                if (!this.bumpIf('>')) {\n                    return this.error(ErrorKind.INVALID_TAG, createLocation(endTagStartPosition, this.clonePosition()));\n                }\n                return {\n                    val: {\n                        type: TYPE.tag,\n                        value: tagName,\n                        children: children,\n                        location: createLocation(startPosition, this.clonePosition()),\n                    },\n                    err: null,\n                };\n            }\n            else {\n                return this.error(ErrorKind.UNCLOSED_TAG, createLocation(startPosition, this.clonePosition()));\n            }\n        }\n        else {\n            return this.error(ErrorKind.INVALID_TAG, createLocation(startPosition, this.clonePosition()));\n        }\n    };\n    /**\n     * This method assumes that the caller has peeked ahead for the first tag character.\n     */\n    Parser.prototype.parseTagName = function () {\n        var startOffset = this.offset();\n        this.bump(); // the first tag name character\n        while (!this.isEOF() && _isPotentialElementNameChar(this.char())) {\n            this.bump();\n        }\n        return this.message.slice(startOffset, this.offset());\n    };\n    Parser.prototype.parseLiteral = function (nestingLevel, parentArgType) {\n        var start = this.clonePosition();\n        var value = '';\n        while (true) {\n            var parseQuoteResult = this.tryParseQuote(parentArgType);\n            if (parseQuoteResult) {\n                value += parseQuoteResult;\n                continue;\n            }\n            var parseUnquotedResult = this.tryParseUnquoted(nestingLevel, parentArgType);\n            if (parseUnquotedResult) {\n                value += parseUnquotedResult;\n                continue;\n            }\n            var parseLeftAngleResult = this.tryParseLeftAngleBracket();\n            if (parseLeftAngleResult) {\n                value += parseLeftAngleResult;\n                continue;\n            }\n            break;\n        }\n        var location = createLocation(start, this.clonePosition());\n        return {\n            val: { type: TYPE.literal, value: value, location: location },\n            err: null,\n        };\n    };\n    Parser.prototype.tryParseLeftAngleBracket = function () {\n        if (!this.isEOF() &&\n            this.char() === 60 /* `<` */ &&\n            (this.ignoreTag ||\n                // If at the opening tag or closing tag position, bail.\n                !_isAlphaOrSlash(this.peek() || 0))) {\n            this.bump(); // `<`\n            return '<';\n        }\n        return null;\n    };\n    /**\n     * Starting with ICU 4.8, an ASCII apostrophe only starts quoted text if it immediately precedes\n     * a character that requires quoting (that is, \"only where needed\"), and works the same in\n     * nested messages as on the top level of the pattern. The new behavior is otherwise compatible.\n     */\n    Parser.prototype.tryParseQuote = function (parentArgType) {\n        if (this.isEOF() || this.char() !== 39 /* `'` */) {\n            return null;\n        }\n        // Parse escaped char following the apostrophe, or early return if there is no escaped char.\n        // Check if is valid escaped character\n        switch (this.peek()) {\n            case 39 /* `'` */:\n                // double quote, should return as a single quote.\n                this.bump();\n                this.bump();\n                return \"'\";\n            // '{', '<', '>', '}'\n            case 123:\n            case 60:\n            case 62:\n            case 125:\n                break;\n            case 35: // '#'\n                if (parentArgType === 'plural' || parentArgType === 'selectordinal') {\n                    break;\n                }\n                return null;\n            default:\n                return null;\n        }\n        this.bump(); // apostrophe\n        var codePoints = [this.char()]; // escaped char\n        this.bump();\n        // read chars until the optional closing apostrophe is found\n        while (!this.isEOF()) {\n            var ch = this.char();\n            if (ch === 39 /* `'` */) {\n                if (this.peek() === 39 /* `'` */) {\n                    codePoints.push(39);\n                    // Bump one more time because we need to skip 2 characters.\n                    this.bump();\n                }\n                else {\n                    // Optional closing apostrophe.\n                    this.bump();\n                    break;\n                }\n            }\n            else {\n                codePoints.push(ch);\n            }\n            this.bump();\n        }\n        return fromCodePoint.apply(void 0, codePoints);\n    };\n    Parser.prototype.tryParseUnquoted = function (nestingLevel, parentArgType) {\n        if (this.isEOF()) {\n            return null;\n        }\n        var ch = this.char();\n        if (ch === 60 /* `<` */ ||\n            ch === 123 /* `{` */ ||\n            (ch === 35 /* `#` */ &&\n                (parentArgType === 'plural' || parentArgType === 'selectordinal')) ||\n            (ch === 125 /* `}` */ && nestingLevel > 0)) {\n            return null;\n        }\n        else {\n            this.bump();\n            return fromCodePoint(ch);\n        }\n    };\n    Parser.prototype.parseArgument = function (nestingLevel, expectingCloseTag) {\n        var openingBracePosition = this.clonePosition();\n        this.bump(); // `{`\n        this.bumpSpace();\n        if (this.isEOF()) {\n            return this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        if (this.char() === 125 /* `}` */) {\n            this.bump();\n            return this.error(ErrorKind.EMPTY_ARGUMENT, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        // argument name\n        var value = this.parseIdentifierIfPossible().value;\n        if (!value) {\n            return this.error(ErrorKind.MALFORMED_ARGUMENT, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        this.bumpSpace();\n        if (this.isEOF()) {\n            return this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        switch (this.char()) {\n            // Simple argument: `{name}`\n            case 125 /* `}` */: {\n                this.bump(); // `}`\n                return {\n                    val: {\n                        type: TYPE.argument,\n                        // value does not include the opening and closing braces.\n                        value: value,\n                        location: createLocation(openingBracePosition, this.clonePosition()),\n                    },\n                    err: null,\n                };\n            }\n            // Argument with options: `{name, format, ...}`\n            case 44 /* `,` */: {\n                this.bump(); // `,`\n                this.bumpSpace();\n                if (this.isEOF()) {\n                    return this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));\n                }\n                return this.parseArgumentOptions(nestingLevel, expectingCloseTag, value, openingBracePosition);\n            }\n            default:\n                return this.error(ErrorKind.MALFORMED_ARGUMENT, createLocation(openingBracePosition, this.clonePosition()));\n        }\n    };\n    /**\n     * Advance the parser until the end of the identifier, if it is currently on\n     * an identifier character. Return an empty string otherwise.\n     */\n    Parser.prototype.parseIdentifierIfPossible = function () {\n        var startingPosition = this.clonePosition();\n        var startOffset = this.offset();\n        var value = matchIdentifierAtIndex(this.message, startOffset);\n        var endOffset = startOffset + value.length;\n        this.bumpTo(endOffset);\n        var endPosition = this.clonePosition();\n        var location = createLocation(startingPosition, endPosition);\n        return { value: value, location: location };\n    };\n    Parser.prototype.parseArgumentOptions = function (nestingLevel, expectingCloseTag, value, openingBracePosition) {\n        var _a;\n        // Parse this range:\n        // {name, type, style}\n        //        ^---^\n        var typeStartPosition = this.clonePosition();\n        var argType = this.parseIdentifierIfPossible().value;\n        var typeEndPosition = this.clonePosition();\n        switch (argType) {\n            case '':\n                // Expecting a style string number, date, time, plural, selectordinal, or select.\n                return this.error(ErrorKind.EXPECT_ARGUMENT_TYPE, createLocation(typeStartPosition, typeEndPosition));\n            case 'number':\n            case 'date':\n            case 'time': {\n                // Parse this range:\n                // {name, number, style}\n                //              ^-------^\n                this.bumpSpace();\n                var styleAndLocation = null;\n                if (this.bumpIf(',')) {\n                    this.bumpSpace();\n                    var styleStartPosition = this.clonePosition();\n                    var result = this.parseSimpleArgStyleIfPossible();\n                    if (result.err) {\n                        return result;\n                    }\n                    var style = trimEnd(result.val);\n                    if (style.length === 0) {\n                        return this.error(ErrorKind.EXPECT_ARGUMENT_STYLE, createLocation(this.clonePosition(), this.clonePosition()));\n                    }\n                    var styleLocation = createLocation(styleStartPosition, this.clonePosition());\n                    styleAndLocation = { style: style, styleLocation: styleLocation };\n                }\n                var argCloseResult = this.tryParseArgumentClose(openingBracePosition);\n                if (argCloseResult.err) {\n                    return argCloseResult;\n                }\n                var location_1 = createLocation(openingBracePosition, this.clonePosition());\n                // Extract style or skeleton\n                if (styleAndLocation && startsWith(styleAndLocation === null || styleAndLocation === void 0 ? void 0 : styleAndLocation.style, '::', 0)) {\n                    // Skeleton starts with `::`.\n                    var skeleton = trimStart(styleAndLocation.style.slice(2));\n                    if (argType === 'number') {\n                        var result = this.parseNumberSkeletonFromString(skeleton, styleAndLocation.styleLocation);\n                        if (result.err) {\n                            return result;\n                        }\n                        return {\n                            val: { type: TYPE.number, value: value, location: location_1, style: result.val },\n                            err: null,\n                        };\n                    }\n                    else {\n                        if (skeleton.length === 0) {\n                            return this.error(ErrorKind.EXPECT_DATE_TIME_SKELETON, location_1);\n                        }\n                        var dateTimePattern = skeleton;\n                        // Get \"best match\" pattern only if locale is passed, if not, let it\n                        // pass as-is where `parseDateTimeSkeleton()` will throw an error\n                        // for unsupported patterns.\n                        if (this.locale) {\n                            dateTimePattern = getBestPattern(skeleton, this.locale);\n                        }\n                        var style = {\n                            type: SKELETON_TYPE.dateTime,\n                            pattern: dateTimePattern,\n                            location: styleAndLocation.styleLocation,\n                            parsedOptions: this.shouldParseSkeletons\n                                ? parseDateTimeSkeleton(dateTimePattern)\n                                : {},\n                        };\n                        var type = argType === 'date' ? TYPE.date : TYPE.time;\n                        return {\n                            val: { type: type, value: value, location: location_1, style: style },\n                            err: null,\n                        };\n                    }\n                }\n                // Regular style or no style.\n                return {\n                    val: {\n                        type: argType === 'number'\n                            ? TYPE.number\n                            : argType === 'date'\n                                ? TYPE.date\n                                : TYPE.time,\n                        value: value,\n                        location: location_1,\n                        style: (_a = styleAndLocation === null || styleAndLocation === void 0 ? void 0 : styleAndLocation.style) !== null && _a !== void 0 ? _a : null,\n                    },\n                    err: null,\n                };\n            }\n            case 'plural':\n            case 'selectordinal':\n            case 'select': {\n                // Parse this range:\n                // {name, plural, options}\n                //              ^---------^\n                var typeEndPosition_1 = this.clonePosition();\n                this.bumpSpace();\n                if (!this.bumpIf(',')) {\n                    return this.error(ErrorKind.EXPECT_SELECT_ARGUMENT_OPTIONS, createLocation(typeEndPosition_1, __assign({}, typeEndPosition_1)));\n                }\n                this.bumpSpace();\n                // Parse offset:\n                // {name, plural, offset:1, options}\n                //                ^-----^\n                //\n                // or the first option:\n                //\n                // {name, plural, one {...} other {...}}\n                //                ^--^\n                var identifierAndLocation = this.parseIdentifierIfPossible();\n                var pluralOffset = 0;\n                if (argType !== 'select' && identifierAndLocation.value === 'offset') {\n                    if (!this.bumpIf(':')) {\n                        return this.error(ErrorKind.EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE, createLocation(this.clonePosition(), this.clonePosition()));\n                    }\n                    this.bumpSpace();\n                    var result = this.tryParseDecimalInteger(ErrorKind.EXPECT_PLURAL_ARGUMENT_OFFSET_VALUE, ErrorKind.INVALID_PLURAL_ARGUMENT_OFFSET_VALUE);\n                    if (result.err) {\n                        return result;\n                    }\n                    // Parse another identifier for option parsing\n                    this.bumpSpace();\n                    identifierAndLocation = this.parseIdentifierIfPossible();\n                    pluralOffset = result.val;\n                }\n                var optionsResult = this.tryParsePluralOrSelectOptions(nestingLevel, argType, expectingCloseTag, identifierAndLocation);\n                if (optionsResult.err) {\n                    return optionsResult;\n                }\n                var argCloseResult = this.tryParseArgumentClose(openingBracePosition);\n                if (argCloseResult.err) {\n                    return argCloseResult;\n                }\n                var location_2 = createLocation(openingBracePosition, this.clonePosition());\n                if (argType === 'select') {\n                    return {\n                        val: {\n                            type: TYPE.select,\n                            value: value,\n                            options: fromEntries(optionsResult.val),\n                            location: location_2,\n                        },\n                        err: null,\n                    };\n                }\n                else {\n                    return {\n                        val: {\n                            type: TYPE.plural,\n                            value: value,\n                            options: fromEntries(optionsResult.val),\n                            offset: pluralOffset,\n                            pluralType: argType === 'plural' ? 'cardinal' : 'ordinal',\n                            location: location_2,\n                        },\n                        err: null,\n                    };\n                }\n            }\n            default:\n                return this.error(ErrorKind.INVALID_ARGUMENT_TYPE, createLocation(typeStartPosition, typeEndPosition));\n        }\n    };\n    Parser.prototype.tryParseArgumentClose = function (openingBracePosition) {\n        // Parse: {value, number, ::currency/GBP }\n        //\n        if (this.isEOF() || this.char() !== 125 /* `}` */) {\n            return this.error(ErrorKind.EXPECT_ARGUMENT_CLOSING_BRACE, createLocation(openingBracePosition, this.clonePosition()));\n        }\n        this.bump(); // `}`\n        return { val: true, err: null };\n    };\n    /**\n     * See: https://github.com/unicode-org/icu/blob/af7ed1f6d2298013dc303628438ec4abe1f16479/icu4c/source/common/messagepattern.cpp#L659\n     */\n    Parser.prototype.parseSimpleArgStyleIfPossible = function () {\n        var nestedBraces = 0;\n        var startPosition = this.clonePosition();\n        while (!this.isEOF()) {\n            var ch = this.char();\n            switch (ch) {\n                case 39 /* `'` */: {\n                    // Treat apostrophe as quoting but include it in the style part.\n                    // Find the end of the quoted literal text.\n                    this.bump();\n                    var apostrophePosition = this.clonePosition();\n                    if (!this.bumpUntil(\"'\")) {\n                        return this.error(ErrorKind.UNCLOSED_QUOTE_IN_ARGUMENT_STYLE, createLocation(apostrophePosition, this.clonePosition()));\n                    }\n                    this.bump();\n                    break;\n                }\n                case 123 /* `{` */: {\n                    nestedBraces += 1;\n                    this.bump();\n                    break;\n                }\n                case 125 /* `}` */: {\n                    if (nestedBraces > 0) {\n                        nestedBraces -= 1;\n                    }\n                    else {\n                        return {\n                            val: this.message.slice(startPosition.offset, this.offset()),\n                            err: null,\n                        };\n                    }\n                    break;\n                }\n                default:\n                    this.bump();\n                    break;\n            }\n        }\n        return {\n            val: this.message.slice(startPosition.offset, this.offset()),\n            err: null,\n        };\n    };\n    Parser.prototype.parseNumberSkeletonFromString = function (skeleton, location) {\n        var tokens = [];\n        try {\n            tokens = parseNumberSkeletonFromString(skeleton);\n        }\n        catch (e) {\n            return this.error(ErrorKind.INVALID_NUMBER_SKELETON, location);\n        }\n        return {\n            val: {\n                type: SKELETON_TYPE.number,\n                tokens: tokens,\n                location: location,\n                parsedOptions: this.shouldParseSkeletons\n                    ? parseNumberSkeleton(tokens)\n                    : {},\n            },\n            err: null,\n        };\n    };\n    /**\n     * @param nesting_level The current nesting level of messages.\n     *     This can be positive when parsing message fragment in select or plural argument options.\n     * @param parent_arg_type The parent argument's type.\n     * @param parsed_first_identifier If provided, this is the first identifier-like selector of\n     *     the argument. It is a by-product of a previous parsing attempt.\n     * @param expecting_close_tag If true, this message is directly or indirectly nested inside\n     *     between a pair of opening and closing tags. The nested message will not parse beyond\n     *     the closing tag boundary.\n     */\n    Parser.prototype.tryParsePluralOrSelectOptions = function (nestingLevel, parentArgType, expectCloseTag, parsedFirstIdentifier) {\n        var _a;\n        var hasOtherClause = false;\n        var options = [];\n        var parsedSelectors = new Set();\n        var selector = parsedFirstIdentifier.value, selectorLocation = parsedFirstIdentifier.location;\n        // Parse:\n        // one {one apple}\n        // ^--^\n        while (true) {\n            if (selector.length === 0) {\n                var startPosition = this.clonePosition();\n                if (parentArgType !== 'select' && this.bumpIf('=')) {\n                    // Try parse `={number}` selector\n                    var result = this.tryParseDecimalInteger(ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR, ErrorKind.INVALID_PLURAL_ARGUMENT_SELECTOR);\n                    if (result.err) {\n                        return result;\n                    }\n                    selectorLocation = createLocation(startPosition, this.clonePosition());\n                    selector = this.message.slice(startPosition.offset, this.offset());\n                }\n                else {\n                    break;\n                }\n            }\n            // Duplicate selector clauses\n            if (parsedSelectors.has(selector)) {\n                return this.error(parentArgType === 'select'\n                    ? ErrorKind.DUPLICATE_SELECT_ARGUMENT_SELECTOR\n                    : ErrorKind.DUPLICATE_PLURAL_ARGUMENT_SELECTOR, selectorLocation);\n            }\n            if (selector === 'other') {\n                hasOtherClause = true;\n            }\n            // Parse:\n            // one {one apple}\n            //     ^----------^\n            this.bumpSpace();\n            var openingBracePosition = this.clonePosition();\n            if (!this.bumpIf('{')) {\n                return this.error(parentArgType === 'select'\n                    ? ErrorKind.EXPECT_SELECT_ARGUMENT_SELECTOR_FRAGMENT\n                    : ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR_FRAGMENT, createLocation(this.clonePosition(), this.clonePosition()));\n            }\n            var fragmentResult = this.parseMessage(nestingLevel + 1, parentArgType, expectCloseTag);\n            if (fragmentResult.err) {\n                return fragmentResult;\n            }\n            var argCloseResult = this.tryParseArgumentClose(openingBracePosition);\n            if (argCloseResult.err) {\n                return argCloseResult;\n            }\n            options.push([\n                selector,\n                {\n                    value: fragmentResult.val,\n                    location: createLocation(openingBracePosition, this.clonePosition()),\n                },\n            ]);\n            // Keep track of the existing selectors\n            parsedSelectors.add(selector);\n            // Prep next selector clause.\n            this.bumpSpace();\n            (_a = this.parseIdentifierIfPossible(), selector = _a.value, selectorLocation = _a.location);\n        }\n        if (options.length === 0) {\n            return this.error(parentArgType === 'select'\n                ? ErrorKind.EXPECT_SELECT_ARGUMENT_SELECTOR\n                : ErrorKind.EXPECT_PLURAL_ARGUMENT_SELECTOR, createLocation(this.clonePosition(), this.clonePosition()));\n        }\n        if (this.requiresOtherClause && !hasOtherClause) {\n            return this.error(ErrorKind.MISSING_OTHER_CLAUSE, createLocation(this.clonePosition(), this.clonePosition()));\n        }\n        return { val: options, err: null };\n    };\n    Parser.prototype.tryParseDecimalInteger = function (expectNumberError, invalidNumberError) {\n        var sign = 1;\n        var startingPosition = this.clonePosition();\n        if (this.bumpIf('+')) {\n        }\n        else if (this.bumpIf('-')) {\n            sign = -1;\n        }\n        var hasDigits = false;\n        var decimal = 0;\n        while (!this.isEOF()) {\n            var ch = this.char();\n            if (ch >= 48 /* `0` */ && ch <= 57 /* `9` */) {\n                hasDigits = true;\n                decimal = decimal * 10 + (ch - 48);\n                this.bump();\n            }\n            else {\n                break;\n            }\n        }\n        var location = createLocation(startingPosition, this.clonePosition());\n        if (!hasDigits) {\n            return this.error(expectNumberError, location);\n        }\n        decimal *= sign;\n        if (!isSafeInteger(decimal)) {\n            return this.error(invalidNumberError, location);\n        }\n        return { val: decimal, err: null };\n    };\n    Parser.prototype.offset = function () {\n        return this.position.offset;\n    };\n    Parser.prototype.isEOF = function () {\n        return this.offset() === this.message.length;\n    };\n    Parser.prototype.clonePosition = function () {\n        // This is much faster than `Object.assign` or spread.\n        return {\n            offset: this.position.offset,\n            line: this.position.line,\n            column: this.position.column,\n        };\n    };\n    /**\n     * Return the code point at the current position of the parser.\n     * Throws if the index is out of bound.\n     */\n    Parser.prototype.char = function () {\n        var offset = this.position.offset;\n        if (offset >= this.message.length) {\n            throw Error('out of bound');\n        }\n        var code = codePointAt(this.message, offset);\n        if (code === undefined) {\n            throw Error(\"Offset \".concat(offset, \" is at invalid UTF-16 code unit boundary\"));\n        }\n        return code;\n    };\n    Parser.prototype.error = function (kind, location) {\n        return {\n            val: null,\n            err: {\n                kind: kind,\n                message: this.message,\n                location: location,\n            },\n        };\n    };\n    /** Bump the parser to the next UTF-16 code unit. */\n    Parser.prototype.bump = function () {\n        if (this.isEOF()) {\n            return;\n        }\n        var code = this.char();\n        if (code === 10 /* '\\n' */) {\n            this.position.line += 1;\n            this.position.column = 1;\n            this.position.offset += 1;\n        }\n        else {\n            this.position.column += 1;\n            // 0 ~ 0x10000 -> unicode BMP, otherwise skip the surrogate pair.\n            this.position.offset += code < 0x10000 ? 1 : 2;\n        }\n    };\n    /**\n     * If the substring starting at the current position of the parser has\n     * the given prefix, then bump the parser to the character immediately\n     * following the prefix and return true. Otherwise, don't bump the parser\n     * and return false.\n     */\n    Parser.prototype.bumpIf = function (prefix) {\n        if (startsWith(this.message, prefix, this.offset())) {\n            for (var i = 0; i < prefix.length; i++) {\n                this.bump();\n            }\n            return true;\n        }\n        return false;\n    };\n    /**\n     * Bump the parser until the pattern character is found and return `true`.\n     * Otherwise bump to the end of the file and return `false`.\n     */\n    Parser.prototype.bumpUntil = function (pattern) {\n        var currentOffset = this.offset();\n        var index = this.message.indexOf(pattern, currentOffset);\n        if (index >= 0) {\n            this.bumpTo(index);\n            return true;\n        }\n        else {\n            this.bumpTo(this.message.length);\n            return false;\n        }\n    };\n    /**\n     * Bump the parser to the target offset.\n     * If target offset is beyond the end of the input, bump the parser to the end of the input.\n     */\n    Parser.prototype.bumpTo = function (targetOffset) {\n        if (this.offset() > targetOffset) {\n            throw Error(\"targetOffset \".concat(targetOffset, \" must be greater than or equal to the current offset \").concat(this.offset()));\n        }\n        targetOffset = Math.min(targetOffset, this.message.length);\n        while (true) {\n            var offset = this.offset();\n            if (offset === targetOffset) {\n                break;\n            }\n            if (offset > targetOffset) {\n                throw Error(\"targetOffset \".concat(targetOffset, \" is at invalid UTF-16 code unit boundary\"));\n            }\n            this.bump();\n            if (this.isEOF()) {\n                break;\n            }\n        }\n    };\n    /** advance the parser through all whitespace to the next non-whitespace code unit. */\n    Parser.prototype.bumpSpace = function () {\n        while (!this.isEOF() && _isWhiteSpace(this.char())) {\n            this.bump();\n        }\n    };\n    /**\n     * Peek at the *next* Unicode codepoint in the input without advancing the parser.\n     * If the input has been exhausted, then this returns null.\n     */\n    Parser.prototype.peek = function () {\n        if (this.isEOF()) {\n            return null;\n        }\n        var code = this.char();\n        var offset = this.offset();\n        var nextCode = this.message.charCodeAt(offset + (code >= 0x10000 ? 2 : 1));\n        return nextCode !== null && nextCode !== void 0 ? nextCode : null;\n    };\n    return Parser;\n}());\nexport { Parser };\n/**\n * This check if codepoint is alphabet (lower & uppercase)\n * @param codepoint\n * @returns\n */\nfunction _isAlpha(codepoint) {\n    return ((codepoint >= 97 && codepoint <= 122) ||\n        (codepoint >= 65 && codepoint <= 90));\n}\nfunction _isAlphaOrSlash(codepoint) {\n    return _isAlpha(codepoint) || codepoint === 47; /* '/' */\n}\n/** See `parseTag` function docs. */\nfunction _isPotentialElementNameChar(c) {\n    return (c === 45 /* '-' */ ||\n        c === 46 /* '.' */ ||\n        (c >= 48 && c <= 57) /* 0..9 */ ||\n        c === 95 /* '_' */ ||\n        (c >= 97 && c <= 122) /** a..z */ ||\n        (c >= 65 && c <= 90) /* A..Z */ ||\n        c == 0xb7 ||\n        (c >= 0xc0 && c <= 0xd6) ||\n        (c >= 0xd8 && c <= 0xf6) ||\n        (c >= 0xf8 && c <= 0x37d) ||\n        (c >= 0x37f && c <= 0x1fff) ||\n        (c >= 0x200c && c <= 0x200d) ||\n        (c >= 0x203f && c <= 0x2040) ||\n        (c >= 0x2070 && c <= 0x218f) ||\n        (c >= 0x2c00 && c <= 0x2fef) ||\n        (c >= 0x3001 && c <= 0xd7ff) ||\n        (c >= 0xf900 && c <= 0xfdcf) ||\n        (c >= 0xfdf0 && c <= 0xfffd) ||\n        (c >= 0x10000 && c <= 0xeffff));\n}\n/**\n * Code point equivalent of regex `\\p{White_Space}`.\n * From: https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt\n */\nfunction _isWhiteSpace(c) {\n    return ((c >= 0x0009 && c <= 0x000d) ||\n        c === 0x0020 ||\n        c === 0x0085 ||\n        (c >= 0x200e && c <= 0x200f) ||\n        c === 0x2028 ||\n        c === 0x2029);\n}\n/**\n * Code point equivalent of regex `\\p{Pattern_Syntax}`.\n * See https://www.unicode.org/Public/UCD/latest/ucd/PropList.txt\n */\nfunction _isPatternSyntax(c) {\n    return ((c >= 0x0021 && c <= 0x0023) ||\n        c === 0x0024 ||\n        (c >= 0x0025 && c <= 0x0027) ||\n        c === 0x0028 ||\n        c === 0x0029 ||\n        c === 0x002a ||\n        c === 0x002b ||\n        c === 0x002c ||\n        c === 0x002d ||\n        (c >= 0x002e && c <= 0x002f) ||\n        (c >= 0x003a && c <= 0x003b) ||\n        (c >= 0x003c && c <= 0x003e) ||\n        (c >= 0x003f && c <= 0x0040) ||\n        c === 0x005b ||\n        c === 0x005c ||\n        c === 0x005d ||\n        c === 0x005e ||\n        c === 0x0060 ||\n        c === 0x007b ||\n        c === 0x007c ||\n        c === 0x007d ||\n        c === 0x007e ||\n        c === 0x00a1 ||\n        (c >= 0x00a2 && c <= 0x00a5) ||\n        c === 0x00a6 ||\n        c === 0x00a7 ||\n        c === 0x00a9 ||\n        c === 0x00ab ||\n        c === 0x00ac ||\n        c === 0x00ae ||\n        c === 0x00b0 ||\n        c === 0x00b1 ||\n        c === 0x00b6 ||\n        c === 0x00bb ||\n        c === 0x00bf ||\n        c === 0x00d7 ||\n        c === 0x00f7 ||\n        (c >= 0x2010 && c <= 0x2015) ||\n        (c >= 0x2016 && c <= 0x2017) ||\n        c === 0x2018 ||\n        c === 0x2019 ||\n        c === 0x201a ||\n        (c >= 0x201b && c <= 0x201c) ||\n        c === 0x201d ||\n        c === 0x201e ||\n        c === 0x201f ||\n        (c >= 0x2020 && c <= 0x2027) ||\n        (c >= 0x2030 && c <= 0x2038) ||\n        c === 0x2039 ||\n        c === 0x203a ||\n        (c >= 0x203b && c <= 0x203e) ||\n        (c >= 0x2041 && c <= 0x2043) ||\n        c === 0x2044 ||\n        c === 0x2045 ||\n        c === 0x2046 ||\n        (c >= 0x2047 && c <= 0x2051) ||\n        c === 0x2052 ||\n        c === 0x2053 ||\n        (c >= 0x2055 && c <= 0x205e) ||\n        (c >= 0x2190 && c <= 0x2194) ||\n        (c >= 0x2195 && c <= 0x2199) ||\n        (c >= 0x219a && c <= 0x219b) ||\n        (c >= 0x219c && c <= 0x219f) ||\n        c === 0x21a0 ||\n        (c >= 0x21a1 && c <= 0x21a2) ||\n        c === 0x21a3 ||\n        (c >= 0x21a4 && c <= 0x21a5) ||\n        c === 0x21a6 ||\n        (c >= 0x21a7 && c <= 0x21ad) ||\n        c === 0x21ae ||\n        (c >= 0x21af && c <= 0x21cd) ||\n        (c >= 0x21ce && c <= 0x21cf) ||\n        (c >= 0x21d0 && c <= 0x21d1) ||\n        c === 0x21d2 ||\n        c === 0x21d3 ||\n        c === 0x21d4 ||\n        (c >= 0x21d5 && c <= 0x21f3) ||\n        (c >= 0x21f4 && c <= 0x22ff) ||\n        (c >= 0x2300 && c <= 0x2307) ||\n        c === 0x2308 ||\n        c === 0x2309 ||\n        c === 0x230a ||\n        c === 0x230b ||\n        (c >= 0x230c && c <= 0x231f) ||\n        (c >= 0x2320 && c <= 0x2321) ||\n        (c >= 0x2322 && c <= 0x2328) ||\n        c === 0x2329 ||\n        c === 0x232a ||\n        (c >= 0x232b && c <= 0x237b) ||\n        c === 0x237c ||\n        (c >= 0x237d && c <= 0x239a) ||\n        (c >= 0x239b && c <= 0x23b3) ||\n        (c >= 0x23b4 && c <= 0x23db) ||\n        (c >= 0x23dc && c <= 0x23e1) ||\n        (c >= 0x23e2 && c <= 0x2426) ||\n        (c >= 0x2427 && c <= 0x243f) ||\n        (c >= 0x2440 && c <= 0x244a) ||\n        (c >= 0x244b && c <= 0x245f) ||\n        (c >= 0x2500 && c <= 0x25b6) ||\n        c === 0x25b7 ||\n        (c >= 0x25b8 && c <= 0x25c0) ||\n        c === 0x25c1 ||\n        (c >= 0x25c2 && c <= 0x25f7) ||\n        (c >= 0x25f8 && c <= 0x25ff) ||\n        (c >= 0x2600 && c <= 0x266e) ||\n        c === 0x266f ||\n        (c >= 0x2670 && c <= 0x2767) ||\n        c === 0x2768 ||\n        c === 0x2769 ||\n        c === 0x276a ||\n        c === 0x276b ||\n        c === 0x276c ||\n        c === 0x276d ||\n        c === 0x276e ||\n        c === 0x276f ||\n        c === 0x2770 ||\n        c === 0x2771 ||\n        c === 0x2772 ||\n        c === 0x2773 ||\n        c === 0x2774 ||\n        c === 0x2775 ||\n        (c >= 0x2794 && c <= 0x27bf) ||\n        (c >= 0x27c0 && c <= 0x27c4) ||\n        c === 0x27c5 ||\n        c === 0x27c6 ||\n        (c >= 0x27c7 && c <= 0x27e5) ||\n        c === 0x27e6 ||\n        c === 0x27e7 ||\n        c === 0x27e8 ||\n        c === 0x27e9 ||\n        c === 0x27ea ||\n        c === 0x27eb ||\n        c === 0x27ec ||\n        c === 0x27ed ||\n        c === 0x27ee ||\n        c === 0x27ef ||\n        (c >= 0x27f0 && c <= 0x27ff) ||\n        (c >= 0x2800 && c <= 0x28ff) ||\n        (c >= 0x2900 && c <= 0x2982) ||\n        c === 0x2983 ||\n        c === 0x2984 ||\n        c === 0x2985 ||\n        c === 0x2986 ||\n        c === 0x2987 ||\n        c === 0x2988 ||\n        c === 0x2989 ||\n        c === 0x298a ||\n        c === 0x298b ||\n        c === 0x298c ||\n        c === 0x298d ||\n        c === 0x298e ||\n        c === 0x298f ||\n        c === 0x2990 ||\n        c === 0x2991 ||\n        c === 0x2992 ||\n        c === 0x2993 ||\n        c === 0x2994 ||\n        c === 0x2995 ||\n        c === 0x2996 ||\n        c === 0x2997 ||\n        c === 0x2998 ||\n        (c >= 0x2999 && c <= 0x29d7) ||\n        c === 0x29d8 ||\n        c === 0x29d9 ||\n        c === 0x29da ||\n        c === 0x29db ||\n        (c >= 0x29dc && c <= 0x29fb) ||\n        c === 0x29fc ||\n        c === 0x29fd ||\n        (c >= 0x29fe && c <= 0x2aff) ||\n        (c >= 0x2b00 && c <= 0x2b2f) ||\n        (c >= 0x2b30 && c <= 0x2b44) ||\n        (c >= 0x2b45 && c <= 0x2b46) ||\n        (c >= 0x2b47 && c <= 0x2b4c) ||\n        (c >= 0x2b4d && c <= 0x2b73) ||\n        (c >= 0x2b74 && c <= 0x2b75) ||\n        (c >= 0x2b76 && c <= 0x2b95) ||\n        c === 0x2b96 ||\n        (c >= 0x2b97 && c <= 0x2bff) ||\n        (c >= 0x2e00 && c <= 0x2e01) ||\n        c === 0x2e02 ||\n        c === 0x2e03 ||\n        c === 0x2e04 ||\n        c === 0x2e05 ||\n        (c >= 0x2e06 && c <= 0x2e08) ||\n        c === 0x2e09 ||\n        c === 0x2e0a ||\n        c === 0x2e0b ||\n        c === 0x2e0c ||\n        c === 0x2e0d ||\n        (c >= 0x2e0e && c <= 0x2e16) ||\n        c === 0x2e17 ||\n        (c >= 0x2e18 && c <= 0x2e19) ||\n        c === 0x2e1a ||\n        c === 0x2e1b ||\n        c === 0x2e1c ||\n        c === 0x2e1d ||\n        (c >= 0x2e1e && c <= 0x2e1f) ||\n        c === 0x2e20 ||\n        c === 0x2e21 ||\n        c === 0x2e22 ||\n        c === 0x2e23 ||\n        c === 0x2e24 ||\n        c === 0x2e25 ||\n        c === 0x2e26 ||\n        c === 0x2e27 ||\n        c === 0x2e28 ||\n        c === 0x2e29 ||\n        (c >= 0x2e2a && c <= 0x2e2e) ||\n        c === 0x2e2f ||\n        (c >= 0x2e30 && c <= 0x2e39) ||\n        (c >= 0x2e3a && c <= 0x2e3b) ||\n        (c >= 0x2e3c && c <= 0x2e3f) ||\n        c === 0x2e40 ||\n        c === 0x2e41 ||\n        c === 0x2e42 ||\n        (c >= 0x2e43 && c <= 0x2e4f) ||\n        (c >= 0x2e50 && c <= 0x2e51) ||\n        c === 0x2e52 ||\n        (c >= 0x2e53 && c <= 0x2e7f) ||\n        (c >= 0x3001 && c <= 0x3003) ||\n        c === 0x3008 ||\n        c === 0x3009 ||\n        c === 0x300a ||\n        c === 0x300b ||\n        c === 0x300c ||\n        c === 0x300d ||\n        c === 0x300e ||\n        c === 0x300f ||\n        c === 0x3010 ||\n        c === 0x3011 ||\n        (c >= 0x3012 && c <= 0x3013) ||\n        c === 0x3014 ||\n        c === 0x3015 ||\n        c === 0x3016 ||\n        c === 0x3017 ||\n        c === 0x3018 ||\n        c === 0x3019 ||\n        c === 0x301a ||\n        c === 0x301b ||\n        c === 0x301c ||\n        c === 0x301d ||\n        (c >= 0x301e && c <= 0x301f) ||\n        c === 0x3020 ||\n        c === 0x3030 ||\n        c === 0xfd3e ||\n        c === 0xfd3f ||\n        (c >= 0xfe45 && c <= 0xfe46));\n}\n","import { timeData } from './time-data.generated';\n/**\n * Returns the best matching date time pattern if a date time skeleton\n * pattern is provided with a locale. Follows the Unicode specification:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#table-mapping-requested-time-skeletons-to-patterns\n * @param skeleton date time skeleton pattern that possibly includes j, J or C\n * @param locale\n */\nexport function getBestPattern(skeleton, locale) {\n    var skeletonCopy = '';\n    for (var patternPos = 0; patternPos < skeleton.length; patternPos++) {\n        var patternChar = skeleton.charAt(patternPos);\n        if (patternChar === 'j') {\n            var extraLength = 0;\n            while (patternPos + 1 < skeleton.length &&\n                skeleton.charAt(patternPos + 1) === patternChar) {\n                extraLength++;\n                patternPos++;\n            }\n            var hourLen = 1 + (extraLength & 1);\n            var dayPeriodLen = extraLength < 2 ? 1 : 3 + (extraLength >> 1);\n            var dayPeriodChar = 'a';\n            var hourChar = getDefaultHourSymbolFromLocale(locale);\n            if (hourChar == 'H' || hourChar == 'k') {\n                dayPeriodLen = 0;\n            }\n            while (dayPeriodLen-- > 0) {\n                skeletonCopy += dayPeriodChar;\n            }\n            while (hourLen-- > 0) {\n                skeletonCopy = hourChar + skeletonCopy;\n            }\n        }\n        else if (patternChar === 'J') {\n            skeletonCopy += 'H';\n        }\n        else {\n            skeletonCopy += patternChar;\n        }\n    }\n    return skeletonCopy;\n}\n/**\n * Maps the [hour cycle type](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle)\n * of the given `locale` to the corresponding time pattern.\n * @param locale\n */\nfunction getDefaultHourSymbolFromLocale(locale) {\n    var hourCycle = locale.hourCycle;\n    if (hourCycle === undefined &&\n        // @ts-ignore hourCycle(s) is not identified yet\n        locale.hourCycles &&\n        // @ts-ignore\n        locale.hourCycles.length) {\n        // @ts-ignore\n        hourCycle = locale.hourCycles[0];\n    }\n    if (hourCycle) {\n        switch (hourCycle) {\n            case 'h24':\n                return 'k';\n            case 'h23':\n                return 'H';\n            case 'h12':\n                return 'h';\n            case 'h11':\n                return 'K';\n            default:\n                throw new Error('Invalid hourCycle');\n        }\n    }\n    // TODO: Once hourCycle is fully supported remove the following with data generation\n    var languageTag = locale.language;\n    var regionTag;\n    if (languageTag !== 'root') {\n        regionTag = locale.maximize().region;\n    }\n    var hourCycles = timeData[regionTag || ''] ||\n        timeData[languageTag || ''] ||\n        timeData[\"\".concat(languageTag, \"-001\")] ||\n        timeData['001'];\n    return hourCycles[0];\n}\n","import { __extends } from \"tslib\";\nexport var ErrorCode;\n(function (ErrorCode) {\n    // When we have a placeholder but no value to format\n    ErrorCode[\"MISSING_VALUE\"] = \"MISSING_VALUE\";\n    // When value supplied is invalid\n    ErrorCode[\"INVALID_VALUE\"] = \"INVALID_VALUE\";\n    // When we need specific Intl API but it's not available\n    ErrorCode[\"MISSING_INTL_API\"] = \"MISSING_INTL_API\";\n})(ErrorCode || (ErrorCode = {}));\nvar FormatError = /** @class */ (function (_super) {\n    __extends(FormatError, _super);\n    function FormatError(msg, code, originalMessage) {\n        var _this = _super.call(this, msg) || this;\n        _this.code = code;\n        _this.originalMessage = originalMessage;\n        return _this;\n    }\n    FormatError.prototype.toString = function () {\n        return \"[formatjs Error: \".concat(this.code, \"] \").concat(this.message);\n    };\n    return FormatError;\n}(Error));\nexport { FormatError };\nvar InvalidValueError = /** @class */ (function (_super) {\n    __extends(InvalidValueError, _super);\n    function InvalidValueError(variableId, value, options, originalMessage) {\n        return _super.call(this, \"Invalid values for \\\"\".concat(variableId, \"\\\": \\\"\").concat(value, \"\\\". Options are \\\"\").concat(Object.keys(options).join('\", \"'), \"\\\"\"), ErrorCode.INVALID_VALUE, originalMessage) || this;\n    }\n    return InvalidValueError;\n}(FormatError));\nexport { InvalidValueError };\nvar InvalidValueTypeError = /** @class */ (function (_super) {\n    __extends(InvalidValueTypeError, _super);\n    function InvalidValueTypeError(value, type, originalMessage) {\n        return _super.call(this, \"Value for \\\"\".concat(value, \"\\\" must be of type \").concat(type), ErrorCode.INVALID_VALUE, originalMessage) || this;\n    }\n    return InvalidValueTypeError;\n}(FormatError));\nexport { InvalidValueTypeError };\nvar MissingValueError = /** @class */ (function (_super) {\n    __extends(MissingValueError, _super);\n    function MissingValueError(variableId, originalMessage) {\n        return _super.call(this, \"The intl string context variable \\\"\".concat(variableId, \"\\\" was not provided to the string \\\"\").concat(originalMessage, \"\\\"\"), ErrorCode.MISSING_VALUE, originalMessage) || this;\n    }\n    return MissingValueError;\n}(FormatError));\nexport { MissingValueError };\n","import { __assign } from \"tslib\";\nimport { ErrorKind } from './error';\nimport { Parser } from './parser';\nimport { isDateElement, isDateTimeSkeleton, isNumberElement, isNumberSkeleton, isPluralElement, isSelectElement, isTagElement, isTimeElement, } from './types';\nfunction pruneLocation(els) {\n    els.forEach(function (el) {\n        delete el.location;\n        if (isSelectElement(el) || isPluralElement(el)) {\n            for (var k in el.options) {\n                delete el.options[k].location;\n                pruneLocation(el.options[k].value);\n            }\n        }\n        else if (isNumberElement(el) && isNumberSkeleton(el.style)) {\n            delete el.style.location;\n        }\n        else if ((isDateElement(el) || isTimeElement(el)) &&\n            isDateTimeSkeleton(el.style)) {\n            delete el.style.location;\n        }\n        else if (isTagElement(el)) {\n            pruneLocation(el.children);\n        }\n    });\n}\nexport function parse(message, opts) {\n    if (opts === void 0) { opts = {}; }\n    opts = __assign({ shouldParseSkeletons: true, requiresOtherClause: true }, opts);\n    var result = new Parser(message, opts).parse();\n    if (result.err) {\n        var error = SyntaxError(ErrorKind[result.err.kind]);\n        // @ts-expect-error Assign to error object\n        error.location = result.err.location;\n        // @ts-expect-error Assign to error object\n        error.originalMessage = result.err.message;\n        throw error;\n    }\n    if (!(opts === null || opts === void 0 ? void 0 : opts.captureLocation)) {\n        pruneLocation(result.val);\n    }\n    return result.val;\n}\nexport * from './types';\n// only for testing\nexport var _Parser = Parser;\n","import { isArgumentElement, isDateElement, isDateTimeSkeleton, isLiteralElement, isNumberElement, isNumberSkeleton, isPluralElement, isPoundElement, isSelectElement, isTagElement, isTimeElement, } from '@formatjs/icu-messageformat-parser';\nimport { ErrorCode, FormatError, InvalidValueError, InvalidValueTypeError, MissingValueError, } from './error';\nexport var PART_TYPE;\n(function (PART_TYPE) {\n    PART_TYPE[PART_TYPE[\"literal\"] = 0] = \"literal\";\n    PART_TYPE[PART_TYPE[\"object\"] = 1] = \"object\";\n})(PART_TYPE || (PART_TYPE = {}));\nfunction mergeLiteral(parts) {\n    if (parts.length < 2) {\n        return parts;\n    }\n    return parts.reduce(function (all, part) {\n        var lastPart = all[all.length - 1];\n        if (!lastPart ||\n            lastPart.type !== PART_TYPE.literal ||\n            part.type !== PART_TYPE.literal) {\n            all.push(part);\n        }\n        else {\n            lastPart.value += part.value;\n        }\n        return all;\n    }, []);\n}\nexport function isFormatXMLElementFn(el) {\n    return typeof el === 'function';\n}\n// TODO(skeleton): add skeleton support\nexport function formatToParts(els, locales, formatters, formats, values, currentPluralValue, \n// For debugging\noriginalMessage) {\n    // Hot path for straight simple msg translations\n    if (els.length === 1 && isLiteralElement(els[0])) {\n        return [\n            {\n                type: PART_TYPE.literal,\n                value: els[0].value,\n            },\n        ];\n    }\n    var result = [];\n    for (var _i = 0, els_1 = els; _i < els_1.length; _i++) {\n        var el = els_1[_i];\n        // Exit early for string parts.\n        if (isLiteralElement(el)) {\n            result.push({\n                type: PART_TYPE.literal,\n                value: el.value,\n            });\n            continue;\n        }\n        // TODO: should this part be literal type?\n        // Replace `#` in plural rules with the actual numeric value.\n        if (isPoundElement(el)) {\n            if (typeof currentPluralValue === 'number') {\n                result.push({\n                    type: PART_TYPE.literal,\n                    value: formatters.getNumberFormat(locales).format(currentPluralValue),\n                });\n            }\n            continue;\n        }\n        var varName = el.value;\n        // Enforce that all required values are provided by the caller.\n        if (!(values && varName in values)) {\n            throw new MissingValueError(varName, originalMessage);\n        }\n        var value = values[varName];\n        if (isArgumentElement(el)) {\n            if (!value || typeof value === 'string' || typeof value === 'number') {\n                value =\n                    typeof value === 'string' || typeof value === 'number'\n                        ? String(value)\n                        : '';\n            }\n            result.push({\n                type: typeof value === 'string' ? PART_TYPE.literal : PART_TYPE.object,\n                value: value,\n            });\n            continue;\n        }\n        // Recursively format plural and select parts' option — which can be a\n        // nested pattern structure. The choosing of the option to use is\n        // abstracted-by and delegated-to the part helper object.\n        if (isDateElement(el)) {\n            var style = typeof el.style === 'string'\n                ? formats.date[el.style]\n                : isDateTimeSkeleton(el.style)\n                    ? el.style.parsedOptions\n                    : undefined;\n            result.push({\n                type: PART_TYPE.literal,\n                value: formatters\n                    .getDateTimeFormat(locales, style)\n                    .format(value),\n            });\n            continue;\n        }\n        if (isTimeElement(el)) {\n            var style = typeof el.style === 'string'\n                ? formats.time[el.style]\n                : isDateTimeSkeleton(el.style)\n                    ? el.style.parsedOptions\n                    : formats.time.medium;\n            result.push({\n                type: PART_TYPE.literal,\n                value: formatters\n                    .getDateTimeFormat(locales, style)\n                    .format(value),\n            });\n            continue;\n        }\n        if (isNumberElement(el)) {\n            var style = typeof el.style === 'string'\n                ? formats.number[el.style]\n                : isNumberSkeleton(el.style)\n                    ? el.style.parsedOptions\n                    : undefined;\n            if (style && style.scale) {\n                value =\n                    value *\n                        (style.scale || 1);\n            }\n            result.push({\n                type: PART_TYPE.literal,\n                value: formatters\n                    .getNumberFormat(locales, style)\n                    .format(value),\n            });\n            continue;\n        }\n        if (isTagElement(el)) {\n            var children = el.children, value_1 = el.value;\n            var formatFn = values[value_1];\n            if (!isFormatXMLElementFn(formatFn)) {\n                throw new InvalidValueTypeError(value_1, 'function', originalMessage);\n            }\n            var parts = formatToParts(children, locales, formatters, formats, values, currentPluralValue);\n            var chunks = formatFn(parts.map(function (p) { return p.value; }));\n            if (!Array.isArray(chunks)) {\n                chunks = [chunks];\n            }\n            result.push.apply(result, chunks.map(function (c) {\n                return {\n                    type: typeof c === 'string' ? PART_TYPE.literal : PART_TYPE.object,\n                    value: c,\n                };\n            }));\n        }\n        if (isSelectElement(el)) {\n            var opt = el.options[value] || el.options.other;\n            if (!opt) {\n                throw new InvalidValueError(el.value, value, Object.keys(el.options), originalMessage);\n            }\n            result.push.apply(result, formatToParts(opt.value, locales, formatters, formats, values));\n            continue;\n        }\n        if (isPluralElement(el)) {\n            var opt = el.options[\"=\".concat(value)];\n            if (!opt) {\n                if (!Intl.PluralRules) {\n                    throw new FormatError(\"Intl.PluralRules is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-pluralrules\\\"\\n\", ErrorCode.MISSING_INTL_API, originalMessage);\n                }\n                var rule = formatters\n                    .getPluralRules(locales, { type: el.pluralType })\n                    .select(value - (el.offset || 0));\n                opt = el.options[rule] || el.options.other;\n            }\n            if (!opt) {\n                throw new InvalidValueError(el.value, value, Object.keys(el.options), originalMessage);\n            }\n            result.push.apply(result, formatToParts(opt.value, locales, formatters, formats, values, value - (el.offset || 0)));\n            continue;\n        }\n    }\n    return mergeLiteral(result);\n}\n","/*\nCopyright (c) 2014, Yahoo! Inc. All rights reserved.\nCopyrights licensed under the New BSD License.\nSee the accompanying LICENSE file for terms.\n*/\nimport { __assign, __rest, __spreadArray } from \"tslib\";\nimport { memoize, strategies } from '@formatjs/fast-memoize';\nimport { parse, } from '@formatjs/icu-messageformat-parser';\nimport { formatToParts, PART_TYPE, } from './formatters';\n// -- MessageFormat --------------------------------------------------------\nfunction mergeConfig(c1, c2) {\n    if (!c2) {\n        return c1;\n    }\n    return __assign(__assign(__assign({}, (c1 || {})), (c2 || {})), Object.keys(c1).reduce(function (all, k) {\n        all[k] = __assign(__assign({}, c1[k]), (c2[k] || {}));\n        return all;\n    }, {}));\n}\nfunction mergeConfigs(defaultConfig, configs) {\n    if (!configs) {\n        return defaultConfig;\n    }\n    return Object.keys(defaultConfig).reduce(function (all, k) {\n        all[k] = mergeConfig(defaultConfig[k], configs[k]);\n        return all;\n    }, __assign({}, defaultConfig));\n}\nfunction createFastMemoizeCache(store) {\n    return {\n        create: function () {\n            return {\n                get: function (key) {\n                    return store[key];\n                },\n                set: function (key, value) {\n                    store[key] = value;\n                },\n            };\n        },\n    };\n}\nfunction createDefaultFormatters(cache) {\n    if (cache === void 0) { cache = {\n        number: {},\n        dateTime: {},\n        pluralRules: {},\n    }; }\n    return {\n        getNumberFormat: memoize(function () {\n            var _a;\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new ((_a = Intl.NumberFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.number),\n            strategy: strategies.variadic,\n        }),\n        getDateTimeFormat: memoize(function () {\n            var _a;\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new ((_a = Intl.DateTimeFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.dateTime),\n            strategy: strategies.variadic,\n        }),\n        getPluralRules: memoize(function () {\n            var _a;\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new ((_a = Intl.PluralRules).bind.apply(_a, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.pluralRules),\n            strategy: strategies.variadic,\n        }),\n    };\n}\nvar IntlMessageFormat = /** @class */ (function () {\n    function IntlMessageFormat(message, locales, overrideFormats, opts) {\n        if (locales === void 0) { locales = IntlMessageFormat.defaultLocale; }\n        var _this = this;\n        this.formatterCache = {\n            number: {},\n            dateTime: {},\n            pluralRules: {},\n        };\n        this.format = function (values) {\n            var parts = _this.formatToParts(values);\n            // Hot path for straight simple msg translations\n            if (parts.length === 1) {\n                return parts[0].value;\n            }\n            var result = parts.reduce(function (all, part) {\n                if (!all.length ||\n                    part.type !== PART_TYPE.literal ||\n                    typeof all[all.length - 1] !== 'string') {\n                    all.push(part.value);\n                }\n                else {\n                    all[all.length - 1] += part.value;\n                }\n                return all;\n            }, []);\n            if (result.length <= 1) {\n                return result[0] || '';\n            }\n            return result;\n        };\n        this.formatToParts = function (values) {\n            return formatToParts(_this.ast, _this.locales, _this.formatters, _this.formats, values, undefined, _this.message);\n        };\n        this.resolvedOptions = function () {\n            var _a;\n            return ({\n                locale: ((_a = _this.resolvedLocale) === null || _a === void 0 ? void 0 : _a.toString()) ||\n                    Intl.NumberFormat.supportedLocalesOf(_this.locales)[0],\n            });\n        };\n        this.getAst = function () { return _this.ast; };\n        // Defined first because it's used to build the format pattern.\n        this.locales = locales;\n        this.resolvedLocale = IntlMessageFormat.resolveLocale(locales);\n        if (typeof message === 'string') {\n            this.message = message;\n            if (!IntlMessageFormat.__parse) {\n                throw new TypeError('IntlMessageFormat.__parse must be set to process `message` of type `string`');\n            }\n            var _a = opts || {}, formatters = _a.formatters, parseOpts = __rest(_a, [\"formatters\"]);\n            // Parse string messages into an AST.\n            this.ast = IntlMessageFormat.__parse(message, __assign(__assign({}, parseOpts), { locale: this.resolvedLocale }));\n        }\n        else {\n            this.ast = message;\n        }\n        if (!Array.isArray(this.ast)) {\n            throw new TypeError('A message must be provided as a String or AST.');\n        }\n        // Creates a new object with the specified `formats` merged with the default\n        // formats.\n        this.formats = mergeConfigs(IntlMessageFormat.formats, overrideFormats);\n        this.formatters =\n            (opts && opts.formatters) || createDefaultFormatters(this.formatterCache);\n    }\n    Object.defineProperty(IntlMessageFormat, \"defaultLocale\", {\n        get: function () {\n            if (!IntlMessageFormat.memoizedDefaultLocale) {\n                IntlMessageFormat.memoizedDefaultLocale =\n                    new Intl.NumberFormat().resolvedOptions().locale;\n            }\n            return IntlMessageFormat.memoizedDefaultLocale;\n        },\n        enumerable: false,\n        configurable: true\n    });\n    IntlMessageFormat.memoizedDefaultLocale = null;\n    IntlMessageFormat.resolveLocale = function (locales) {\n        if (typeof Intl.Locale === 'undefined') {\n            return;\n        }\n        var supportedLocales = Intl.NumberFormat.supportedLocalesOf(locales);\n        if (supportedLocales.length > 0) {\n            return new Intl.Locale(supportedLocales[0]);\n        }\n        return new Intl.Locale(typeof locales === 'string' ? locales : locales[0]);\n    };\n    IntlMessageFormat.__parse = parse;\n    // Default format options used as the prototype of the `formats` provided to the\n    // constructor. These are used when constructing the internal Intl.NumberFormat\n    // and Intl.DateTimeFormat instances.\n    IntlMessageFormat.formats = {\n        number: {\n            integer: {\n                maximumFractionDigits: 0,\n            },\n            currency: {\n                style: 'currency',\n            },\n            percent: {\n                style: 'percent',\n            },\n        },\n        date: {\n            short: {\n                month: 'numeric',\n                day: 'numeric',\n                year: '2-digit',\n            },\n            medium: {\n                month: 'short',\n                day: 'numeric',\n                year: 'numeric',\n            },\n            long: {\n                month: 'long',\n                day: 'numeric',\n                year: 'numeric',\n            },\n            full: {\n                weekday: 'long',\n                month: 'long',\n                day: 'numeric',\n                year: 'numeric',\n            },\n        },\n        time: {\n            short: {\n                hour: 'numeric',\n                minute: 'numeric',\n            },\n            medium: {\n                hour: 'numeric',\n                minute: 'numeric',\n                second: 'numeric',\n            },\n            long: {\n                hour: 'numeric',\n                minute: 'numeric',\n                second: 'numeric',\n                timeZoneName: 'short',\n            },\n            full: {\n                hour: 'numeric',\n                minute: 'numeric',\n                second: 'numeric',\n                timeZoneName: 'short',\n            },\n        },\n    };\n    return IntlMessageFormat;\n}());\nexport { IntlMessageFormat };\n","import { __extends } from \"tslib\";\nexport var IntlErrorCode;\n(function (IntlErrorCode) {\n    IntlErrorCode[\"FORMAT_ERROR\"] = \"FORMAT_ERROR\";\n    IntlErrorCode[\"UNSUPPORTED_FORMATTER\"] = \"UNSUPPORTED_FORMATTER\";\n    IntlErrorCode[\"INVALID_CONFIG\"] = \"INVALID_CONFIG\";\n    IntlErrorCode[\"MISSING_DATA\"] = \"MISSING_DATA\";\n    IntlErrorCode[\"MISSING_TRANSLATION\"] = \"MISSING_TRANSLATION\";\n})(IntlErrorCode || (IntlErrorCode = {}));\nvar IntlError = /** @class */ (function (_super) {\n    __extends(IntlError, _super);\n    function IntlError(code, message, exception) {\n        var _this = this;\n        var err = exception\n            ? exception instanceof Error\n                ? exception\n                : new Error(String(exception))\n            : undefined;\n        _this = _super.call(this, \"[@formatjs/intl Error \".concat(code, \"] \").concat(message, \"\\n\").concat(err ? \"\\n\".concat(err.message, \"\\n\").concat(err.stack) : '')) || this;\n        _this.code = code;\n        // @ts-ignore just so we don't need to declare dep on @types/node\n        if (typeof Error.captureStackTrace === 'function') {\n            // @ts-ignore just so we don't need to declare dep on @types/node\n            Error.captureStackTrace(_this, IntlError);\n        }\n        return _this;\n    }\n    return IntlError;\n}(Error));\nexport { IntlError };\nvar UnsupportedFormatterError = /** @class */ (function (_super) {\n    __extends(UnsupportedFormatterError, _super);\n    function UnsupportedFormatterError(message, exception) {\n        return _super.call(this, IntlErrorCode.UNSUPPORTED_FORMATTER, message, exception) || this;\n    }\n    return UnsupportedFormatterError;\n}(IntlError));\nexport { UnsupportedFormatterError };\nvar InvalidConfigError = /** @class */ (function (_super) {\n    __extends(InvalidConfigError, _super);\n    function InvalidConfigError(message, exception) {\n        return _super.call(this, IntlErrorCode.INVALID_CONFIG, message, exception) || this;\n    }\n    return InvalidConfigError;\n}(IntlError));\nexport { InvalidConfigError };\nvar MissingDataError = /** @class */ (function (_super) {\n    __extends(MissingDataError, _super);\n    function MissingDataError(message, exception) {\n        return _super.call(this, IntlErrorCode.MISSING_DATA, message, exception) || this;\n    }\n    return MissingDataError;\n}(IntlError));\nexport { MissingDataError };\nvar IntlFormatError = /** @class */ (function (_super) {\n    __extends(IntlFormatError, _super);\n    function IntlFormatError(message, locale, exception) {\n        var _this = _super.call(this, IntlErrorCode.FORMAT_ERROR, \"\".concat(message, \"\\nLocale: \").concat(locale, \"\\n\"), exception) || this;\n        _this.locale = locale;\n        return _this;\n    }\n    return IntlFormatError;\n}(IntlError));\nexport { IntlFormatError };\nvar MessageFormatError = /** @class */ (function (_super) {\n    __extends(MessageFormatError, _super);\n    function MessageFormatError(message, locale, descriptor, exception) {\n        var _this = _super.call(this, \"\".concat(message, \"\\nMessageID: \").concat(descriptor === null || descriptor === void 0 ? void 0 : descriptor.id, \"\\nDefault Message: \").concat(descriptor === null || descriptor === void 0 ? void 0 : descriptor.defaultMessage, \"\\nDescription: \").concat(descriptor === null || descriptor === void 0 ? void 0 : descriptor.description, \"\\n\"), locale, exception) || this;\n        _this.descriptor = descriptor;\n        _this.locale = locale;\n        return _this;\n    }\n    return MessageFormatError;\n}(IntlFormatError));\nexport { MessageFormatError };\nvar MissingTranslationError = /** @class */ (function (_super) {\n    __extends(MissingTranslationError, _super);\n    function MissingTranslationError(descriptor, locale) {\n        var _this = _super.call(this, IntlErrorCode.MISSING_TRANSLATION, \"Missing message: \\\"\".concat(descriptor.id, \"\\\" for locale \\\"\").concat(locale, \"\\\", using \").concat(descriptor.defaultMessage\n            ? \"default message (\".concat(typeof descriptor.defaultMessage === 'string'\n                ? descriptor.defaultMessage\n                : descriptor.defaultMessage\n                    .map(function (e) { var _a; return (_a = e.value) !== null && _a !== void 0 ? _a : JSON.stringify(e); })\n                    .join(), \")\")\n            : 'id', \" as fallback.\")) || this;\n        _this.descriptor = descriptor;\n        return _this;\n    }\n    return MissingTranslationError;\n}(IntlError));\nexport { MissingTranslationError };\n","import { __assign, __spreadArray } from \"tslib\";\nimport { memoize, strategies } from '@formatjs/fast-memoize';\nimport { IntlMessageFormat } from 'intl-messageformat';\nimport { UnsupportedFormatterError } from './error';\nexport function invariant(condition, message, Err) {\n    if (Err === void 0) { Err = Error; }\n    if (!condition) {\n        throw new Err(message);\n    }\n}\nexport function filterProps(props, allowlist, defaults) {\n    if (defaults === void 0) { defaults = {}; }\n    return allowlist.reduce(function (filtered, name) {\n        if (name in props) {\n            filtered[name] = props[name];\n        }\n        else if (name in defaults) {\n            filtered[name] = defaults[name];\n        }\n        return filtered;\n    }, {});\n}\nvar defaultErrorHandler = function (error) {\n    // @ts-ignore just so we don't need to declare dep on @types/node\n    if (process.env.NODE_ENV !== 'production') {\n        console.error(error);\n    }\n};\nvar defaultWarnHandler = function (warning) {\n    // @ts-ignore just so we don't need to declare dep on @types/node\n    if (process.env.NODE_ENV !== 'production') {\n        console.warn(warning);\n    }\n};\nexport var DEFAULT_INTL_CONFIG = {\n    formats: {},\n    messages: {},\n    timeZone: undefined,\n    defaultLocale: 'en',\n    defaultFormats: {},\n    fallbackOnEmptyString: true,\n    onError: defaultErrorHandler,\n    onWarn: defaultWarnHandler,\n};\nexport function createIntlCache() {\n    return {\n        dateTime: {},\n        number: {},\n        message: {},\n        relativeTime: {},\n        pluralRules: {},\n        list: {},\n        displayNames: {},\n    };\n}\nfunction createFastMemoizeCache(store) {\n    return {\n        create: function () {\n            return {\n                get: function (key) {\n                    return store[key];\n                },\n                set: function (key, value) {\n                    store[key] = value;\n                },\n            };\n        },\n    };\n}\n/**\n * Create intl formatters and populate cache\n * @param cache explicit cache to prevent leaking memory\n */\nexport function createFormatters(cache) {\n    if (cache === void 0) { cache = createIntlCache(); }\n    var RelativeTimeFormat = Intl.RelativeTimeFormat;\n    var ListFormat = Intl.ListFormat;\n    var DisplayNames = Intl.DisplayNames;\n    var getDateTimeFormat = memoize(function () {\n        var _a;\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        return new ((_a = Intl.DateTimeFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n    }, {\n        cache: createFastMemoizeCache(cache.dateTime),\n        strategy: strategies.variadic,\n    });\n    var getNumberFormat = memoize(function () {\n        var _a;\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        return new ((_a = Intl.NumberFormat).bind.apply(_a, __spreadArray([void 0], args, false)))();\n    }, {\n        cache: createFastMemoizeCache(cache.number),\n        strategy: strategies.variadic,\n    });\n    var getPluralRules = memoize(function () {\n        var _a;\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        return new ((_a = Intl.PluralRules).bind.apply(_a, __spreadArray([void 0], args, false)))();\n    }, {\n        cache: createFastMemoizeCache(cache.pluralRules),\n        strategy: strategies.variadic,\n    });\n    return {\n        getDateTimeFormat: getDateTimeFormat,\n        getNumberFormat: getNumberFormat,\n        getMessageFormat: memoize(function (message, locales, overrideFormats, opts) {\n            return new IntlMessageFormat(message, locales, overrideFormats, __assign({ formatters: {\n                    getNumberFormat: getNumberFormat,\n                    getDateTimeFormat: getDateTimeFormat,\n                    getPluralRules: getPluralRules,\n                } }, (opts || {})));\n        }, {\n            cache: createFastMemoizeCache(cache.message),\n            strategy: strategies.variadic,\n        }),\n        getRelativeTimeFormat: memoize(function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new (RelativeTimeFormat.bind.apply(RelativeTimeFormat, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.relativeTime),\n            strategy: strategies.variadic,\n        }),\n        getPluralRules: getPluralRules,\n        getListFormat: memoize(function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new (ListFormat.bind.apply(ListFormat, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.list),\n            strategy: strategies.variadic,\n        }),\n        getDisplayNames: memoize(function () {\n            var args = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                args[_i] = arguments[_i];\n            }\n            return new (DisplayNames.bind.apply(DisplayNames, __spreadArray([void 0], args, false)))();\n        }, {\n            cache: createFastMemoizeCache(cache.displayNames),\n            strategy: strategies.variadic,\n        }),\n    };\n}\nexport function getNamedFormat(formats, type, name, onError) {\n    var formatType = formats && formats[type];\n    var format;\n    if (formatType) {\n        format = formatType[name];\n    }\n    if (format) {\n        return format;\n    }\n    onError(new UnsupportedFormatterError(\"No \".concat(type, \" format named: \").concat(name)));\n}\n","import { __assign } from \"tslib\";\nimport { TYPE } from '@formatjs/icu-messageformat-parser';\nimport { IntlMessageFormat, } from 'intl-messageformat';\nimport { MessageFormatError, MissingTranslationError } from './error';\nimport { invariant } from './utils';\nfunction setTimeZoneInOptions(opts, timeZone) {\n    return Object.keys(opts).reduce(function (all, k) {\n        all[k] = __assign({ timeZone: timeZone }, opts[k]);\n        return all;\n    }, {});\n}\nfunction deepMergeOptions(opts1, opts2) {\n    var keys = Object.keys(__assign(__assign({}, opts1), opts2));\n    return keys.reduce(function (all, k) {\n        all[k] = __assign(__assign({}, (opts1[k] || {})), (opts2[k] || {}));\n        return all;\n    }, {});\n}\nfunction deepMergeFormatsAndSetTimeZone(f1, timeZone) {\n    if (!timeZone) {\n        return f1;\n    }\n    var mfFormats = IntlMessageFormat.formats;\n    return __assign(__assign(__assign({}, mfFormats), f1), { date: deepMergeOptions(setTimeZoneInOptions(mfFormats.date, timeZone), setTimeZoneInOptions(f1.date || {}, timeZone)), time: deepMergeOptions(setTimeZoneInOptions(mfFormats.time, timeZone), setTimeZoneInOptions(f1.time || {}, timeZone)) });\n}\nexport var formatMessage = function (_a, state, messageDescriptor, values, opts) {\n    var locale = _a.locale, formats = _a.formats, messages = _a.messages, defaultLocale = _a.defaultLocale, defaultFormats = _a.defaultFormats, fallbackOnEmptyString = _a.fallbackOnEmptyString, onError = _a.onError, timeZone = _a.timeZone, defaultRichTextElements = _a.defaultRichTextElements;\n    if (messageDescriptor === void 0) { messageDescriptor = { id: '' }; }\n    var msgId = messageDescriptor.id, defaultMessage = messageDescriptor.defaultMessage;\n    // `id` is a required field of a Message Descriptor.\n    invariant(!!msgId, \"[@formatjs/intl] An `id` must be provided to format a message. You can either:\\n1. Configure your build toolchain with [babel-plugin-formatjs](https://formatjs.github.io/docs/tooling/babel-plugin)\\nor [@formatjs/ts-transformer](https://formatjs.github.io/docs/tooling/ts-transformer) OR\\n2. Configure your `eslint` config to include [eslint-plugin-formatjs](https://formatjs.github.io/docs/tooling/linter#enforce-id)\\nto autofix this issue\");\n    var id = String(msgId);\n    var message = \n    // In case messages is Object.create(null)\n    // e.g import('foo.json') from webpack)\n    // See https://github.com/formatjs/formatjs/issues/1914\n    messages &&\n        Object.prototype.hasOwnProperty.call(messages, id) &&\n        messages[id];\n    // IMPORTANT: Hot path if `message` is AST with a single literal node\n    if (Array.isArray(message) &&\n        message.length === 1 &&\n        message[0].type === TYPE.literal) {\n        return message[0].value;\n    }\n    // IMPORTANT: Hot path straight lookup for performance\n    if (!values &&\n        message &&\n        typeof message === 'string' &&\n        !defaultRichTextElements) {\n        return message.replace(/'\\{(.*?)\\}'/gi, \"{$1}\");\n    }\n    values = __assign(__assign({}, defaultRichTextElements), (values || {}));\n    formats = deepMergeFormatsAndSetTimeZone(formats, timeZone);\n    defaultFormats = deepMergeFormatsAndSetTimeZone(defaultFormats, timeZone);\n    if (!message) {\n        if (fallbackOnEmptyString === false && message === '') {\n            return message;\n        }\n        if (!defaultMessage ||\n            (locale && locale.toLowerCase() !== defaultLocale.toLowerCase())) {\n            // This prevents warnings from littering the console in development\n            // when no `messages` are passed into the <IntlProvider> for the\n            // default locale.\n            onError(new MissingTranslationError(messageDescriptor, locale));\n        }\n        if (defaultMessage) {\n            try {\n                var formatter = state.getMessageFormat(defaultMessage, defaultLocale, defaultFormats, opts);\n                return formatter.format(values);\n            }\n            catch (e) {\n                onError(new MessageFormatError(\"Error formatting default message for: \\\"\".concat(id, \"\\\", rendering default message verbatim\"), locale, messageDescriptor, e));\n                return typeof defaultMessage === 'string' ? defaultMessage : id;\n            }\n        }\n        return id;\n    }\n    // We have the translated message\n    try {\n        var formatter = state.getMessageFormat(message, locale, formats, __assign({ formatters: state }, (opts || {})));\n        return formatter.format(values);\n    }\n    catch (e) {\n        onError(new MessageFormatError(\"Error formatting message: \\\"\".concat(id, \"\\\", using \").concat(defaultMessage ? 'default message' : 'id', \" as fallback.\"), locale, messageDescriptor, e));\n    }\n    if (defaultMessage) {\n        try {\n            var formatter = state.getMessageFormat(defaultMessage, defaultLocale, defaultFormats, opts);\n            return formatter.format(values);\n        }\n        catch (e) {\n            onError(new MessageFormatError(\"Error formatting the default message for: \\\"\".concat(id, \"\\\", rendering message verbatim\"), locale, messageDescriptor, e));\n        }\n    }\n    if (typeof message === 'string') {\n        return message;\n    }\n    if (typeof defaultMessage === 'string') {\n        return defaultMessage;\n    }\n    return id;\n};\n","import { __assign } from \"tslib\";\nimport { IntlFormatError } from './error';\nimport { filterProps, getNamedFormat } from './utils';\nvar DATE_TIME_FORMAT_OPTIONS = [\n    'formatMatcher',\n    'timeZone',\n    'hour12',\n    'weekday',\n    'era',\n    'year',\n    'month',\n    'day',\n    'hour',\n    'minute',\n    'second',\n    'timeZoneName',\n    'hourCycle',\n    'dateStyle',\n    'timeStyle',\n    'calendar',\n    // 'dayPeriod',\n    'numberingSystem',\n    'fractionalSecondDigits',\n];\nexport function getFormatter(_a, type, getDateTimeFormat, options) {\n    var locale = _a.locale, formats = _a.formats, onError = _a.onError, timeZone = _a.timeZone;\n    if (options === void 0) { options = {}; }\n    var format = options.format;\n    var defaults = __assign(__assign({}, (timeZone && { timeZone: timeZone })), (format && getNamedFormat(formats, type, format, onError)));\n    var filteredOptions = filterProps(options, DATE_TIME_FORMAT_OPTIONS, defaults);\n    if (type === 'time' &&\n        !filteredOptions.hour &&\n        !filteredOptions.minute &&\n        !filteredOptions.second &&\n        !filteredOptions.timeStyle &&\n        !filteredOptions.dateStyle) {\n        // Add default formatting options if hour, minute, or second isn't defined.\n        filteredOptions = __assign(__assign({}, filteredOptions), { hour: 'numeric', minute: 'numeric' });\n    }\n    return getDateTimeFormat(locale, filteredOptions);\n}\nexport function formatDate(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var value = _a[0], _b = _a[1], options = _b === void 0 ? {} : _b;\n    var date = typeof value === 'string' ? new Date(value || 0) : value;\n    try {\n        return getFormatter(config, 'date', getDateTimeFormat, options).format(date);\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting date.', config.locale, e));\n    }\n    return String(date);\n}\nexport function formatTime(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var value = _a[0], _b = _a[1], options = _b === void 0 ? {} : _b;\n    var date = typeof value === 'string' ? new Date(value || 0) : value;\n    try {\n        return getFormatter(config, 'time', getDateTimeFormat, options).format(date);\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting time.', config.locale, e));\n    }\n    return String(date);\n}\nexport function formatDateTimeRange(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var from = _a[0], to = _a[1], _b = _a[2], options = _b === void 0 ? {} : _b;\n    var fromDate = typeof from === 'string' ? new Date(from || 0) : from;\n    var toDate = typeof to === 'string' ? new Date(to || 0) : to;\n    try {\n        return getFormatter(config, 'dateTimeRange', getDateTimeFormat, options).formatRange(fromDate, toDate);\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting date time range.', config.locale, e));\n    }\n    return String(fromDate);\n}\nexport function formatDateToParts(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var value = _a[0], _b = _a[1], options = _b === void 0 ? {} : _b;\n    var date = typeof value === 'string' ? new Date(value || 0) : value;\n    try {\n        return getFormatter(config, 'date', getDateTimeFormat, options).formatToParts(date); // TODO: remove this when https://github.com/microsoft/TypeScript/pull/50402 is merged\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting date.', config.locale, e));\n    }\n    return [];\n}\nexport function formatTimeToParts(config, getDateTimeFormat) {\n    var _a = [];\n    for (var _i = 2; _i < arguments.length; _i++) {\n        _a[_i - 2] = arguments[_i];\n    }\n    var value = _a[0], _b = _a[1], options = _b === void 0 ? {} : _b;\n    var date = typeof value === 'string' ? new Date(value || 0) : value;\n    try {\n        return getFormatter(config, 'time', getDateTimeFormat, options).formatToParts(date); // TODO: remove this when https://github.com/microsoft/TypeScript/pull/50402 is merged\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting time.', config.locale, e));\n    }\n    return [];\n}\n","import { filterProps } from './utils';\nimport { ErrorCode, FormatError } from 'intl-messageformat';\nimport { IntlFormatError } from './error';\nvar DISPLAY_NAMES_OPTONS = [\n    'style',\n    'type',\n    'fallback',\n    'languageDisplay',\n];\nexport function formatDisplayName(_a, getDisplayNames, value, options) {\n    var locale = _a.locale, onError = _a.onError;\n    var DisplayNames = Intl.DisplayNames;\n    if (!DisplayNames) {\n        onError(new FormatError(\"Intl.DisplayNames is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-displaynames\\\"\\n\", ErrorCode.MISSING_INTL_API));\n    }\n    var filteredOptions = filterProps(options, DISPLAY_NAMES_OPTONS);\n    try {\n        return getDisplayNames(locale, filteredOptions).of(value);\n    }\n    catch (e) {\n        onError(new IntlFormatError('Error formatting display name.', locale, e));\n    }\n}\n","import { __assign } from \"tslib\";\nimport { ErrorCode, FormatError } from 'intl-messageformat';\nimport { IntlFormatError } from './error';\nimport { filterProps } from './utils';\nvar LIST_FORMAT_OPTIONS = [\n    'type',\n    'style',\n];\nvar now = Date.now();\nfunction generateToken(i) {\n    return \"\".concat(now, \"_\").concat(i, \"_\").concat(now);\n}\nexport function formatList(opts, getListFormat, values, options) {\n    if (options === void 0) { options = {}; }\n    var results = formatListToParts(opts, getListFormat, values, options).reduce(function (all, el) {\n        var val = el.value;\n        if (typeof val !== 'string') {\n            all.push(val);\n        }\n        else if (typeof all[all.length - 1] === 'string') {\n            all[all.length - 1] += val;\n        }\n        else {\n            all.push(val);\n        }\n        return all;\n    }, []);\n    return results.length === 1 ? results[0] : results.length === 0 ? '' : results;\n}\nexport function formatListToParts(_a, getListFormat, values, options) {\n    var locale = _a.locale, onError = _a.onError;\n    if (options === void 0) { options = {}; }\n    var ListFormat = Intl.ListFormat;\n    if (!ListFormat) {\n        onError(new FormatError(\"Intl.ListFormat is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-listformat\\\"\\n\", ErrorCode.MISSING_INTL_API));\n    }\n    var filteredOptions = filterProps(options, LIST_FORMAT_OPTIONS);\n    try {\n        var richValues_1 = {};\n        var serializedValues = values.map(function (v, i) {\n            if (typeof v === 'object') {\n                var id = generateToken(i);\n                richValues_1[id] = v;\n                return id;\n            }\n            return String(v);\n        });\n        return getListFormat(locale, filteredOptions)\n            .formatToParts(serializedValues)\n            .map(function (part) {\n            return (part.type === 'literal'\n                ? part\n                : __assign(__assign({}, part), { value: richValues_1[part.value] || part.value }));\n        });\n    }\n    catch (e) {\n        onError(new IntlFormatError('Error formatting list.', locale, e));\n    }\n    // @ts-ignore\n    return values;\n}\n","import { ErrorCode, FormatError } from 'intl-messageformat';\nimport { IntlFormatError } from './error';\nimport { filterProps } from './utils';\nvar PLURAL_FORMAT_OPTIONS = ['type'];\nexport function formatPlural(_a, getPluralRules, value, options) {\n    var locale = _a.locale, onError = _a.onError;\n    if (options === void 0) { options = {}; }\n    if (!Intl.PluralRules) {\n        onError(new FormatError(\"Intl.PluralRules is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-pluralrules\\\"\\n\", ErrorCode.MISSING_INTL_API));\n    }\n    var filteredOptions = filterProps(options, PLURAL_FORMAT_OPTIONS);\n    try {\n        return getPluralRules(locale, filteredOptions).select(value);\n    }\n    catch (e) {\n        onError(new IntlFormatError('Error formatting plural.', locale, e));\n    }\n    return 'other';\n}\n","import { getNamedFormat, filterProps } from './utils';\nimport { FormatError, ErrorCode } from 'intl-messageformat';\nimport { IntlFormatError } from './error';\nvar RELATIVE_TIME_FORMAT_OPTIONS = ['numeric', 'style'];\nfunction getFormatter(_a, getRelativeTimeFormat, options) {\n    var locale = _a.locale, formats = _a.formats, onError = _a.onError;\n    if (options === void 0) { options = {}; }\n    var format = options.format;\n    var defaults = (!!format && getNamedFormat(formats, 'relative', format, onError)) || {};\n    var filteredOptions = filterProps(options, RELATIVE_TIME_FORMAT_OPTIONS, defaults);\n    return getRelativeTimeFormat(locale, filteredOptions);\n}\nexport function formatRelativeTime(config, getRelativeTimeFormat, value, unit, options) {\n    if (options === void 0) { options = {}; }\n    if (!unit) {\n        unit = 'second';\n    }\n    var RelativeTimeFormat = Intl.RelativeTimeFormat;\n    if (!RelativeTimeFormat) {\n        config.onError(new FormatError(\"Intl.RelativeTimeFormat is not available in this environment.\\nTry polyfilling it using \\\"@formatjs/intl-relativetimeformat\\\"\\n\", ErrorCode.MISSING_INTL_API));\n    }\n    try {\n        return getFormatter(config, getRelativeTimeFormat, options).format(value, unit);\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting relative time.', config.locale, e));\n    }\n    return String(value);\n}\n","import { IntlFormatError } from './error';\nimport { filterProps, getNamedFormat } from './utils';\nvar NUMBER_FORMAT_OPTIONS = [\n    'style',\n    'currency',\n    'unit',\n    'unitDisplay',\n    'useGrouping',\n    'minimumIntegerDigits',\n    'minimumFractionDigits',\n    'maximumFractionDigits',\n    'minimumSignificantDigits',\n    'maximumSignificantDigits',\n    // ES2020 NumberFormat\n    'compactDisplay',\n    'currencyDisplay',\n    'currencySign',\n    'notation',\n    'signDisplay',\n    'unit',\n    'unitDisplay',\n    'numberingSystem',\n    // ES2023 NumberFormat\n    'trailingZeroDisplay',\n    'roundingPriority',\n    'roundingIncrement',\n    'roundingMode',\n];\nexport function getFormatter(_a, getNumberFormat, options) {\n    var locale = _a.locale, formats = _a.formats, onError = _a.onError;\n    if (options === void 0) { options = {}; }\n    var format = options.format;\n    var defaults = ((format &&\n        getNamedFormat(formats, 'number', format, onError)) ||\n        {});\n    var filteredOptions = filterProps(options, NUMBER_FORMAT_OPTIONS, defaults);\n    return getNumberFormat(locale, filteredOptions);\n}\nexport function formatNumber(config, getNumberFormat, value, options) {\n    if (options === void 0) { options = {}; }\n    try {\n        return getFormatter(config, getNumberFormat, options).format(value);\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting number.', config.locale, e));\n    }\n    return String(value);\n}\nexport function formatNumberToParts(config, getNumberFormat, value, options) {\n    if (options === void 0) { options = {}; }\n    try {\n        return getFormatter(config, getNumberFormat, options).formatToParts(value);\n    }\n    catch (e) {\n        config.onError(new IntlFormatError('Error formatting number.', config.locale, e));\n    }\n    return [];\n}\n","import { __assign } from \"tslib\";\nimport { formatDate, formatDateTimeRange, formatDateToParts, formatTime, formatTimeToParts, } from './dateTime';\nimport { formatDisplayName } from './displayName';\nimport { InvalidConfigError, MissingDataError } from './error';\nimport { formatList, formatListToParts } from './list';\nimport { formatMessage } from './message';\nimport { formatNumber, formatNumberToParts } from './number';\nimport { formatPlural } from './plural';\nimport { formatRelativeTime } from './relativeTime';\nimport { createFormatters, DEFAULT_INTL_CONFIG } from './utils';\nfunction messagesContainString(messages) {\n    var firstMessage = messages ? messages[Object.keys(messages)[0]] : undefined;\n    return typeof firstMessage === 'string';\n}\nfunction verifyConfigMessages(config) {\n    if (config.onWarn &&\n        config.defaultRichTextElements &&\n        messagesContainString(config.messages || {})) {\n        config.onWarn(\"[@formatjs/intl] \\\"defaultRichTextElements\\\" was specified but \\\"message\\\" was not pre-compiled. \\nPlease consider using \\\"@formatjs/cli\\\" to pre-compile your messages for performance.\\nFor more details see https://formatjs.github.io/docs/getting-started/message-distribution\");\n    }\n}\n/**\n * Create intl object\n * @param config intl config\n * @param cache cache for formatter instances to prevent memory leak\n */\nexport function createIntl(config, cache) {\n    var formatters = createFormatters(cache);\n    var resolvedConfig = __assign(__assign({}, DEFAULT_INTL_CONFIG), config);\n    var locale = resolvedConfig.locale, defaultLocale = resolvedConfig.defaultLocale, onError = resolvedConfig.onError;\n    if (!locale) {\n        if (onError) {\n            onError(new InvalidConfigError(\"\\\"locale\\\" was not configured, using \\\"\".concat(defaultLocale, \"\\\" as fallback. See https://formatjs.github.io/docs/react-intl/api#intlshape for more details\")));\n        }\n        // Since there's no registered locale data for `locale`, this will\n        // fallback to the `defaultLocale` to make sure things can render.\n        // The `messages` are overridden to the `defaultProps` empty object\n        // to maintain referential equality across re-renders. It's assumed\n        // each <FormattedMessage> contains a `defaultMessage` prop.\n        resolvedConfig.locale = resolvedConfig.defaultLocale || 'en';\n    }\n    else if (!Intl.NumberFormat.supportedLocalesOf(locale).length && onError) {\n        onError(new MissingDataError(\"Missing locale data for locale: \\\"\".concat(locale, \"\\\" in Intl.NumberFormat. Using default locale: \\\"\").concat(defaultLocale, \"\\\" as fallback. See https://formatjs.github.io/docs/react-intl#runtime-requirements for more details\")));\n    }\n    else if (!Intl.DateTimeFormat.supportedLocalesOf(locale).length &&\n        onError) {\n        onError(new MissingDataError(\"Missing locale data for locale: \\\"\".concat(locale, \"\\\" in Intl.DateTimeFormat. Using default locale: \\\"\").concat(defaultLocale, \"\\\" as fallback. See https://formatjs.github.io/docs/react-intl#runtime-requirements for more details\")));\n    }\n    verifyConfigMessages(resolvedConfig);\n    return __assign(__assign({}, resolvedConfig), { formatters: formatters, formatNumber: formatNumber.bind(null, resolvedConfig, formatters.getNumberFormat), formatNumberToParts: formatNumberToParts.bind(null, resolvedConfig, formatters.getNumberFormat), formatRelativeTime: formatRelativeTime.bind(null, resolvedConfig, formatters.getRelativeTimeFormat), formatDate: formatDate.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatDateToParts: formatDateToParts.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatTime: formatTime.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatDateTimeRange: formatDateTimeRange.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatTimeToParts: formatTimeToParts.bind(null, resolvedConfig, formatters.getDateTimeFormat), formatPlural: formatPlural.bind(null, resolvedConfig, formatters.getPluralRules), formatMessage: formatMessage.bind(null, resolvedConfig, formatters), $t: formatMessage.bind(null, resolvedConfig, formatters), formatList: formatList.bind(null, resolvedConfig, formatters.getListFormat), formatListToParts: formatListToParts.bind(null, resolvedConfig, formatters.getListFormat), formatDisplayName: formatDisplayName.bind(null, resolvedConfig, formatters.getDisplayNames) });\n}\n","export * from './src/types';\nexport function defineMessages(msgs) {\n    return msgs;\n}\nexport function defineMessage(msg) {\n    return msg;\n}\nexport { createIntlCache, filterProps, DEFAULT_INTL_CONFIG, createFormatters, getNamedFormat, } from './src/utils';\nexport * from './src/error';\nexport { formatMessage } from './src/message';\nexport { formatDate, formatDateToParts, formatTime, formatTimeToParts, } from './src/dateTime';\nexport { formatDisplayName } from './src/displayName';\nexport { formatList } from './src/list';\nexport { formatPlural } from './src/plural';\nexport { formatRelativeTime } from './src/relativeTime';\nexport { formatNumber, formatNumberToParts } from './src/number';\nexport { createIntl } from './src/create-intl';\n","if (typeof global !== \"undefined\" && global.__pretenderNodePolyfill) {\n  delete global.self\n  delete global.__pretenderNodePolyfill\n}\n","if (typeof global !== \"undefined\" && typeof global.self === 'undefined') {\n  global.self = {};\n  global.__pretenderNodePolyfill = true;\n}\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n  return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n  return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n  return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n  if (node == null) {\n    return window;\n  }\n\n  if (node.toString() !== '[object Window]') {\n    var ownerDocument = node.ownerDocument;\n    return ownerDocument ? ownerDocument.defaultView || window : window;\n  }\n\n  return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n  var OwnElement = getWindow(node).Element;\n  return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n  var OwnElement = getWindow(node).HTMLElement;\n  return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n  // IE 11 has no ShadowRoot\n  if (typeof ShadowRoot === 'undefined') {\n    return false;\n  }\n\n  var OwnElement = getWindow(node).ShadowRoot;\n  return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n  var state = _ref.state;\n  Object.keys(state.elements).forEach(function (name) {\n    var style = state.styles[name] || {};\n    var attributes = state.attributes[name] || {};\n    var element = state.elements[name]; // arrow is optional + virtual elements\n\n    if (!isHTMLElement(element) || !getNodeName(element)) {\n      return;\n    } // Flow doesn't support to extend this property, but it's the most\n    // effective way to apply styles to an HTMLElement\n    // $FlowFixMe[cannot-write]\n\n\n    Object.assign(element.style, style);\n    Object.keys(attributes).forEach(function (name) {\n      var value = attributes[name];\n\n      if (value === false) {\n        element.removeAttribute(name);\n      } else {\n        element.setAttribute(name, value === true ? '' : value);\n      }\n    });\n  });\n}\n\nfunction effect(_ref2) {\n  var state = _ref2.state;\n  var initialStyles = {\n    popper: {\n      position: state.options.strategy,\n      left: '0',\n      top: '0',\n      margin: '0'\n    },\n    arrow: {\n      position: 'absolute'\n    },\n    reference: {}\n  };\n  Object.assign(state.elements.popper.style, initialStyles.popper);\n  state.styles = initialStyles;\n\n  if (state.elements.arrow) {\n    Object.assign(state.elements.arrow.style, initialStyles.arrow);\n  }\n\n  return function () {\n    Object.keys(state.elements).forEach(function (name) {\n      var element = state.elements[name];\n      var attributes = state.attributes[name] || {};\n      var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n      var style = styleProperties.reduce(function (style, property) {\n        style[property] = '';\n        return style;\n      }, {}); // arrow is optional + virtual elements\n\n      if (!isHTMLElement(element) || !getNodeName(element)) {\n        return;\n      }\n\n      Object.assign(element.style, style);\n      Object.keys(attributes).forEach(function (attribute) {\n        element.removeAttribute(attribute);\n      });\n    });\n  };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'applyStyles',\n  enabled: true,\n  phase: 'write',\n  fn: applyStyles,\n  effect: effect,\n  requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n  return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n  var uaData = navigator.userAgentData;\n\n  if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n    return uaData.brands.map(function (item) {\n      return item.brand + \"/\" + item.version;\n    }).join(' ');\n  }\n\n  return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n  return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n  if (includeScale === void 0) {\n    includeScale = false;\n  }\n\n  if (isFixedStrategy === void 0) {\n    isFixedStrategy = false;\n  }\n\n  var clientRect = element.getBoundingClientRect();\n  var scaleX = 1;\n  var scaleY = 1;\n\n  if (includeScale && isHTMLElement(element)) {\n    scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n    scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n  }\n\n  var _ref = isElement(element) ? getWindow(element) : window,\n      visualViewport = _ref.visualViewport;\n\n  var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n  var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n  var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n  var width = clientRect.width / scaleX;\n  var height = clientRect.height / scaleY;\n  return {\n    width: width,\n    height: height,\n    top: y,\n    right: x + width,\n    bottom: y + height,\n    left: x,\n    x: x,\n    y: y\n  };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n  var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n  // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n  var width = element.offsetWidth;\n  var height = element.offsetHeight;\n\n  if (Math.abs(clientRect.width - width) <= 1) {\n    width = clientRect.width;\n  }\n\n  if (Math.abs(clientRect.height - height) <= 1) {\n    height = clientRect.height;\n  }\n\n  return {\n    x: element.offsetLeft,\n    y: element.offsetTop,\n    width: width,\n    height: height\n  };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n  var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n  if (parent.contains(child)) {\n    return true;\n  } // then fallback to custom implementation with Shadow DOM support\n  else if (rootNode && isShadowRoot(rootNode)) {\n      var next = child;\n\n      do {\n        if (next && parent.isSameNode(next)) {\n          return true;\n        } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n        next = next.parentNode || next.host;\n      } while (next);\n    } // Give up, the result is false\n\n\n  return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n  return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n  return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n  // $FlowFixMe[incompatible-return]: assume body is always available\n  return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n  element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n  if (getNodeName(element) === 'html') {\n    return element;\n  }\n\n  return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n    // $FlowFixMe[incompatible-return]\n    // $FlowFixMe[prop-missing]\n    element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n    element.parentNode || ( // DOM Element detected\n    isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n    // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n    getDocumentElement(element) // fallback\n\n  );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n  if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n  getComputedStyle(element).position === 'fixed') {\n    return null;\n  }\n\n  return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n  var isFirefox = /firefox/i.test(getUAString());\n  var isIE = /Trident/i.test(getUAString());\n\n  if (isIE && isHTMLElement(element)) {\n    // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n    var elementCss = getComputedStyle(element);\n\n    if (elementCss.position === 'fixed') {\n      return null;\n    }\n  }\n\n  var currentNode = getParentNode(element);\n\n  if (isShadowRoot(currentNode)) {\n    currentNode = currentNode.host;\n  }\n\n  while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n    var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n    // create a containing block.\n    // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n    if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n      return currentNode;\n    } else {\n      currentNode = currentNode.parentNode;\n    }\n  }\n\n  return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n  var window = getWindow(element);\n  var offsetParent = getTrueOffsetParent(element);\n\n  while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n    offsetParent = getTrueOffsetParent(offsetParent);\n  }\n\n  if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n    return window;\n  }\n\n  return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n  return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n  return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n  var v = within(min, value, max);\n  return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n  return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n  return {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0\n  };\n}","export default function expandToHashMap(value, keys) {\n  return keys.reduce(function (hashMap, key) {\n    hashMap[key] = value;\n    return hashMap;\n  }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n  padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n    placement: state.placement\n  })) : padding;\n  return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n  var _state$modifiersData$;\n\n  var state = _ref.state,\n      name = _ref.name,\n      options = _ref.options;\n  var arrowElement = state.elements.arrow;\n  var popperOffsets = state.modifiersData.popperOffsets;\n  var basePlacement = getBasePlacement(state.placement);\n  var axis = getMainAxisFromPlacement(basePlacement);\n  var isVertical = [left, right].indexOf(basePlacement) >= 0;\n  var len = isVertical ? 'height' : 'width';\n\n  if (!arrowElement || !popperOffsets) {\n    return;\n  }\n\n  var paddingObject = toPaddingObject(options.padding, state);\n  var arrowRect = getLayoutRect(arrowElement);\n  var minProp = axis === 'y' ? top : left;\n  var maxProp = axis === 'y' ? bottom : right;\n  var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n  var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n  var arrowOffsetParent = getOffsetParent(arrowElement);\n  var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n  var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n  // outside of the popper bounds\n\n  var min = paddingObject[minProp];\n  var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n  var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n  var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n  var axisProp = axis;\n  state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n  var state = _ref2.state,\n      options = _ref2.options;\n  var _options$element = options.element,\n      arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n  if (arrowElement == null) {\n    return;\n  } // CSS selector\n\n\n  if (typeof arrowElement === 'string') {\n    arrowElement = state.elements.popper.querySelector(arrowElement);\n\n    if (!arrowElement) {\n      return;\n    }\n  }\n\n  if (!contains(state.elements.popper, arrowElement)) {\n    return;\n  }\n\n  state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'arrow',\n  enabled: true,\n  phase: 'main',\n  fn: arrow,\n  effect: effect,\n  requires: ['popperOffsets'],\n  requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n  return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n  top: 'auto',\n  right: 'auto',\n  bottom: 'auto',\n  left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n  var x = _ref.x,\n      y = _ref.y;\n  var dpr = win.devicePixelRatio || 1;\n  return {\n    x: round(x * dpr) / dpr || 0,\n    y: round(y * dpr) / dpr || 0\n  };\n}\n\nexport function mapToStyles(_ref2) {\n  var _Object$assign2;\n\n  var popper = _ref2.popper,\n      popperRect = _ref2.popperRect,\n      placement = _ref2.placement,\n      variation = _ref2.variation,\n      offsets = _ref2.offsets,\n      position = _ref2.position,\n      gpuAcceleration = _ref2.gpuAcceleration,\n      adaptive = _ref2.adaptive,\n      roundOffsets = _ref2.roundOffsets,\n      isFixed = _ref2.isFixed;\n  var _offsets$x = offsets.x,\n      x = _offsets$x === void 0 ? 0 : _offsets$x,\n      _offsets$y = offsets.y,\n      y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n  var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n    x: x,\n    y: y\n  }) : {\n    x: x,\n    y: y\n  };\n\n  x = _ref3.x;\n  y = _ref3.y;\n  var hasX = offsets.hasOwnProperty('x');\n  var hasY = offsets.hasOwnProperty('y');\n  var sideX = left;\n  var sideY = top;\n  var win = window;\n\n  if (adaptive) {\n    var offsetParent = getOffsetParent(popper);\n    var heightProp = 'clientHeight';\n    var widthProp = 'clientWidth';\n\n    if (offsetParent === getWindow(popper)) {\n      offsetParent = getDocumentElement(popper);\n\n      if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n        heightProp = 'scrollHeight';\n        widthProp = 'scrollWidth';\n      }\n    } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n    offsetParent = offsetParent;\n\n    if (placement === top || (placement === left || placement === right) && variation === end) {\n      sideY = bottom;\n      var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n      offsetParent[heightProp];\n      y -= offsetY - popperRect.height;\n      y *= gpuAcceleration ? 1 : -1;\n    }\n\n    if (placement === left || (placement === top || placement === bottom) && variation === end) {\n      sideX = right;\n      var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n      offsetParent[widthProp];\n      x -= offsetX - popperRect.width;\n      x *= gpuAcceleration ? 1 : -1;\n    }\n  }\n\n  var commonStyles = Object.assign({\n    position: position\n  }, adaptive && unsetSides);\n\n  var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n    x: x,\n    y: y\n  }, getWindow(popper)) : {\n    x: x,\n    y: y\n  };\n\n  x = _ref4.x;\n  y = _ref4.y;\n\n  if (gpuAcceleration) {\n    var _Object$assign;\n\n    return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n  }\n\n  return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n  var state = _ref5.state,\n      options = _ref5.options;\n  var _options$gpuAccelerat = options.gpuAcceleration,\n      gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n      _options$adaptive = options.adaptive,\n      adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n      _options$roundOffsets = options.roundOffsets,\n      roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n  var commonStyles = {\n    placement: getBasePlacement(state.placement),\n    variation: getVariation(state.placement),\n    popper: state.elements.popper,\n    popperRect: state.rects.popper,\n    gpuAcceleration: gpuAcceleration,\n    isFixed: state.options.strategy === 'fixed'\n  };\n\n  if (state.modifiersData.popperOffsets != null) {\n    state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n      offsets: state.modifiersData.popperOffsets,\n      position: state.options.strategy,\n      adaptive: adaptive,\n      roundOffsets: roundOffsets\n    })));\n  }\n\n  if (state.modifiersData.arrow != null) {\n    state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n      offsets: state.modifiersData.arrow,\n      position: 'absolute',\n      adaptive: false,\n      roundOffsets: roundOffsets\n    })));\n  }\n\n  state.attributes.popper = Object.assign({}, state.attributes.popper, {\n    'data-popper-placement': state.placement\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'computeStyles',\n  enabled: true,\n  phase: 'beforeWrite',\n  fn: computeStyles,\n  data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n  passive: true\n};\n\nfunction effect(_ref) {\n  var state = _ref.state,\n      instance = _ref.instance,\n      options = _ref.options;\n  var _options$scroll = options.scroll,\n      scroll = _options$scroll === void 0 ? true : _options$scroll,\n      _options$resize = options.resize,\n      resize = _options$resize === void 0 ? true : _options$resize;\n  var window = getWindow(state.elements.popper);\n  var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n  if (scroll) {\n    scrollParents.forEach(function (scrollParent) {\n      scrollParent.addEventListener('scroll', instance.update, passive);\n    });\n  }\n\n  if (resize) {\n    window.addEventListener('resize', instance.update, passive);\n  }\n\n  return function () {\n    if (scroll) {\n      scrollParents.forEach(function (scrollParent) {\n        scrollParent.removeEventListener('scroll', instance.update, passive);\n      });\n    }\n\n    if (resize) {\n      window.removeEventListener('resize', instance.update, passive);\n    }\n  };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'eventListeners',\n  enabled: true,\n  phase: 'write',\n  fn: function fn() {},\n  effect: effect,\n  data: {}\n};","var hash = {\n  left: 'right',\n  right: 'left',\n  bottom: 'top',\n  top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n  return placement.replace(/left|right|bottom|top/g, function (matched) {\n    return hash[matched];\n  });\n}","var hash = {\n  start: 'end',\n  end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n  return placement.replace(/start|end/g, function (matched) {\n    return hash[matched];\n  });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n  var win = getWindow(node);\n  var scrollLeft = win.pageXOffset;\n  var scrollTop = win.pageYOffset;\n  return {\n    scrollLeft: scrollLeft,\n    scrollTop: scrollTop\n  };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n  // If <html> has a CSS width greater than the viewport, then this will be\n  // incorrect for RTL.\n  // Popper 1 is broken in this case and never had a bug report so let's assume\n  // it's not an issue. I don't think anyone ever specifies width on <html>\n  // anyway.\n  // Browsers where the left scrollbar doesn't cause an issue report `0` for\n  // this (e.g. Edge 2019, IE11, Safari)\n  return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n  // Firefox wants us to check `-x` and `-y` variations as well\n  var _getComputedStyle = getComputedStyle(element),\n      overflow = _getComputedStyle.overflow,\n      overflowX = _getComputedStyle.overflowX,\n      overflowY = _getComputedStyle.overflowY;\n\n  return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n  if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n    // $FlowFixMe[incompatible-return]: assume body is always available\n    return node.ownerDocument.body;\n  }\n\n  if (isHTMLElement(node) && isScrollParent(node)) {\n    return node;\n  }\n\n  return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n  var _element$ownerDocumen;\n\n  if (list === void 0) {\n    list = [];\n  }\n\n  var scrollParent = getScrollParent(element);\n  var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n  var win = getWindow(scrollParent);\n  var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n  var updatedList = list.concat(target);\n  return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n  updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n  return Object.assign({}, rect, {\n    left: rect.x,\n    top: rect.y,\n    right: rect.x + rect.width,\n    bottom: rect.y + rect.height\n  });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n  var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n  rect.top = rect.top + element.clientTop;\n  rect.left = rect.left + element.clientLeft;\n  rect.bottom = rect.top + element.clientHeight;\n  rect.right = rect.left + element.clientWidth;\n  rect.width = element.clientWidth;\n  rect.height = element.clientHeight;\n  rect.x = rect.left;\n  rect.y = rect.top;\n  return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n  return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n  var clippingParents = listScrollParents(getParentNode(element));\n  var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n  var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n  if (!isElement(clipperElement)) {\n    return [];\n  } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n  return clippingParents.filter(function (clippingParent) {\n    return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n  });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n  var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n  var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n  var firstClippingParent = clippingParents[0];\n  var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n    var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n    accRect.top = max(rect.top, accRect.top);\n    accRect.right = min(rect.right, accRect.right);\n    accRect.bottom = min(rect.bottom, accRect.bottom);\n    accRect.left = max(rect.left, accRect.left);\n    return accRect;\n  }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n  clippingRect.width = clippingRect.right - clippingRect.left;\n  clippingRect.height = clippingRect.bottom - clippingRect.top;\n  clippingRect.x = clippingRect.left;\n  clippingRect.y = clippingRect.top;\n  return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n  var win = getWindow(element);\n  var html = getDocumentElement(element);\n  var visualViewport = win.visualViewport;\n  var width = html.clientWidth;\n  var height = html.clientHeight;\n  var x = 0;\n  var y = 0;\n\n  if (visualViewport) {\n    width = visualViewport.width;\n    height = visualViewport.height;\n    var layoutViewport = isLayoutViewport();\n\n    if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n      x = visualViewport.offsetLeft;\n      y = visualViewport.offsetTop;\n    }\n  }\n\n  return {\n    width: width,\n    height: height,\n    x: x + getWindowScrollBarX(element),\n    y: y\n  };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n  var _element$ownerDocumen;\n\n  var html = getDocumentElement(element);\n  var winScroll = getWindowScroll(element);\n  var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n  var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n  var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n  var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n  var y = -winScroll.scrollTop;\n\n  if (getComputedStyle(body || html).direction === 'rtl') {\n    x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n  }\n\n  return {\n    width: width,\n    height: height,\n    x: x,\n    y: y\n  };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n  var reference = _ref.reference,\n      element = _ref.element,\n      placement = _ref.placement;\n  var basePlacement = placement ? getBasePlacement(placement) : null;\n  var variation = placement ? getVariation(placement) : null;\n  var commonX = reference.x + reference.width / 2 - element.width / 2;\n  var commonY = reference.y + reference.height / 2 - element.height / 2;\n  var offsets;\n\n  switch (basePlacement) {\n    case top:\n      offsets = {\n        x: commonX,\n        y: reference.y - element.height\n      };\n      break;\n\n    case bottom:\n      offsets = {\n        x: commonX,\n        y: reference.y + reference.height\n      };\n      break;\n\n    case right:\n      offsets = {\n        x: reference.x + reference.width,\n        y: commonY\n      };\n      break;\n\n    case left:\n      offsets = {\n        x: reference.x - element.width,\n        y: commonY\n      };\n      break;\n\n    default:\n      offsets = {\n        x: reference.x,\n        y: reference.y\n      };\n  }\n\n  var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n  if (mainAxis != null) {\n    var len = mainAxis === 'y' ? 'height' : 'width';\n\n    switch (variation) {\n      case start:\n        offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n        break;\n\n      case end:\n        offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n        break;\n\n      default:\n    }\n  }\n\n  return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var _options = options,\n      _options$placement = _options.placement,\n      placement = _options$placement === void 0 ? state.placement : _options$placement,\n      _options$strategy = _options.strategy,\n      strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n      _options$boundary = _options.boundary,\n      boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n      _options$rootBoundary = _options.rootBoundary,\n      rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n      _options$elementConte = _options.elementContext,\n      elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n      _options$altBoundary = _options.altBoundary,\n      altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n      _options$padding = _options.padding,\n      padding = _options$padding === void 0 ? 0 : _options$padding;\n  var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n  var altContext = elementContext === popper ? reference : popper;\n  var popperRect = state.rects.popper;\n  var element = state.elements[altBoundary ? altContext : elementContext];\n  var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n  var referenceClientRect = getBoundingClientRect(state.elements.reference);\n  var popperOffsets = computeOffsets({\n    reference: referenceClientRect,\n    element: popperRect,\n    strategy: 'absolute',\n    placement: placement\n  });\n  var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n  var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n  // 0 or negative = within the clipping rect\n\n  var overflowOffsets = {\n    top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n    bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n    left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n    right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n  };\n  var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n  if (elementContext === popper && offsetData) {\n    var offset = offsetData[placement];\n    Object.keys(overflowOffsets).forEach(function (key) {\n      var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n      var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n      overflowOffsets[key] += offset[axis] * multiply;\n    });\n  }\n\n  return overflowOffsets;\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n  if (getBasePlacement(placement) === auto) {\n    return [];\n  }\n\n  var oppositePlacement = getOppositePlacement(placement);\n  return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n  var state = _ref.state,\n      options = _ref.options,\n      name = _ref.name;\n\n  if (state.modifiersData[name]._skip) {\n    return;\n  }\n\n  var _options$mainAxis = options.mainAxis,\n      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n      _options$altAxis = options.altAxis,\n      checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n      specifiedFallbackPlacements = options.fallbackPlacements,\n      padding = options.padding,\n      boundary = options.boundary,\n      rootBoundary = options.rootBoundary,\n      altBoundary = options.altBoundary,\n      _options$flipVariatio = options.flipVariations,\n      flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n      allowedAutoPlacements = options.allowedAutoPlacements;\n  var preferredPlacement = state.options.placement;\n  var basePlacement = getBasePlacement(preferredPlacement);\n  var isBasePlacement = basePlacement === preferredPlacement;\n  var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n  var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n    return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding,\n      flipVariations: flipVariations,\n      allowedAutoPlacements: allowedAutoPlacements\n    }) : placement);\n  }, []);\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var checksMap = new Map();\n  var makeFallbackChecks = true;\n  var firstFittingPlacement = placements[0];\n\n  for (var i = 0; i < placements.length; i++) {\n    var placement = placements[i];\n\n    var _basePlacement = getBasePlacement(placement);\n\n    var isStartVariation = getVariation(placement) === start;\n    var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n    var len = isVertical ? 'width' : 'height';\n    var overflow = detectOverflow(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      altBoundary: altBoundary,\n      padding: padding\n    });\n    var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n    if (referenceRect[len] > popperRect[len]) {\n      mainVariationSide = getOppositePlacement(mainVariationSide);\n    }\n\n    var altVariationSide = getOppositePlacement(mainVariationSide);\n    var checks = [];\n\n    if (checkMainAxis) {\n      checks.push(overflow[_basePlacement] <= 0);\n    }\n\n    if (checkAltAxis) {\n      checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n    }\n\n    if (checks.every(function (check) {\n      return check;\n    })) {\n      firstFittingPlacement = placement;\n      makeFallbackChecks = false;\n      break;\n    }\n\n    checksMap.set(placement, checks);\n  }\n\n  if (makeFallbackChecks) {\n    // `2` may be desired in some cases – research later\n    var numberOfChecks = flipVariations ? 3 : 1;\n\n    var _loop = function _loop(_i) {\n      var fittingPlacement = placements.find(function (placement) {\n        var checks = checksMap.get(placement);\n\n        if (checks) {\n          return checks.slice(0, _i).every(function (check) {\n            return check;\n          });\n        }\n      });\n\n      if (fittingPlacement) {\n        firstFittingPlacement = fittingPlacement;\n        return \"break\";\n      }\n    };\n\n    for (var _i = numberOfChecks; _i > 0; _i--) {\n      var _ret = _loop(_i);\n\n      if (_ret === \"break\") break;\n    }\n  }\n\n  if (state.placement !== firstFittingPlacement) {\n    state.modifiersData[name]._skip = true;\n    state.placement = firstFittingPlacement;\n    state.reset = true;\n  }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'flip',\n  enabled: true,\n  phase: 'main',\n  fn: flip,\n  requiresIfExists: ['offset'],\n  data: {\n    _skip: false\n  }\n};","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n  if (options === void 0) {\n    options = {};\n  }\n\n  var _options = options,\n      placement = _options.placement,\n      boundary = _options.boundary,\n      rootBoundary = _options.rootBoundary,\n      padding = _options.padding,\n      flipVariations = _options.flipVariations,\n      _options$allowedAutoP = _options.allowedAutoPlacements,\n      allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n  var variation = getVariation(placement);\n  var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n    return getVariation(placement) === variation;\n  }) : basePlacements;\n  var allowedPlacements = placements.filter(function (placement) {\n    return allowedAutoPlacements.indexOf(placement) >= 0;\n  });\n\n  if (allowedPlacements.length === 0) {\n    allowedPlacements = placements;\n  } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n  var overflows = allowedPlacements.reduce(function (acc, placement) {\n    acc[placement] = detectOverflow(state, {\n      placement: placement,\n      boundary: boundary,\n      rootBoundary: rootBoundary,\n      padding: padding\n    })[getBasePlacement(placement)];\n    return acc;\n  }, {});\n  return Object.keys(overflows).sort(function (a, b) {\n    return overflows[a] - overflows[b];\n  });\n}","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n  if (preventedOffsets === void 0) {\n    preventedOffsets = {\n      x: 0,\n      y: 0\n    };\n  }\n\n  return {\n    top: overflow.top - rect.height - preventedOffsets.y,\n    right: overflow.right - rect.width + preventedOffsets.x,\n    bottom: overflow.bottom - rect.height + preventedOffsets.y,\n    left: overflow.left - rect.width - preventedOffsets.x\n  };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n  return [top, right, bottom, left].some(function (side) {\n    return overflow[side] >= 0;\n  });\n}\n\nfunction hide(_ref) {\n  var state = _ref.state,\n      name = _ref.name;\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var preventedOffsets = state.modifiersData.preventOverflow;\n  var referenceOverflow = detectOverflow(state, {\n    elementContext: 'reference'\n  });\n  var popperAltOverflow = detectOverflow(state, {\n    altBoundary: true\n  });\n  var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n  var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n  var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n  var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n  state.modifiersData[name] = {\n    referenceClippingOffsets: referenceClippingOffsets,\n    popperEscapeOffsets: popperEscapeOffsets,\n    isReferenceHidden: isReferenceHidden,\n    hasPopperEscaped: hasPopperEscaped\n  };\n  state.attributes.popper = Object.assign({}, state.attributes.popper, {\n    'data-popper-reference-hidden': isReferenceHidden,\n    'data-popper-escaped': hasPopperEscaped\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'hide',\n  enabled: true,\n  phase: 'main',\n  requiresIfExists: ['preventOverflow'],\n  fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n  var basePlacement = getBasePlacement(placement);\n  var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n  var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n    placement: placement\n  })) : offset,\n      skidding = _ref[0],\n      distance = _ref[1];\n\n  skidding = skidding || 0;\n  distance = (distance || 0) * invertDistance;\n  return [left, right].indexOf(basePlacement) >= 0 ? {\n    x: distance,\n    y: skidding\n  } : {\n    x: skidding,\n    y: distance\n  };\n}\n\nfunction offset(_ref2) {\n  var state = _ref2.state,\n      options = _ref2.options,\n      name = _ref2.name;\n  var _options$offset = options.offset,\n      offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n  var data = placements.reduce(function (acc, placement) {\n    acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n    return acc;\n  }, {});\n  var _data$state$placement = data[state.placement],\n      x = _data$state$placement.x,\n      y = _data$state$placement.y;\n\n  if (state.modifiersData.popperOffsets != null) {\n    state.modifiersData.popperOffsets.x += x;\n    state.modifiersData.popperOffsets.y += y;\n  }\n\n  state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'offset',\n  enabled: true,\n  phase: 'main',\n  requires: ['popperOffsets'],\n  fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n  var state = _ref.state,\n      name = _ref.name;\n  // Offsets are the actual position the popper needs to have to be\n  // properly positioned near its reference element\n  // This is the most basic placement, and will be adjusted by\n  // the modifiers in the next step\n  state.modifiersData[name] = computeOffsets({\n    reference: state.rects.reference,\n    element: state.rects.popper,\n    strategy: 'absolute',\n    placement: state.placement\n  });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'popperOffsets',\n  enabled: true,\n  phase: 'read',\n  fn: popperOffsets,\n  data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n  var state = _ref.state,\n      options = _ref.options,\n      name = _ref.name;\n  var _options$mainAxis = options.mainAxis,\n      checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n      _options$altAxis = options.altAxis,\n      checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n      boundary = options.boundary,\n      rootBoundary = options.rootBoundary,\n      altBoundary = options.altBoundary,\n      padding = options.padding,\n      _options$tether = options.tether,\n      tether = _options$tether === void 0 ? true : _options$tether,\n      _options$tetherOffset = options.tetherOffset,\n      tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n  var overflow = detectOverflow(state, {\n    boundary: boundary,\n    rootBoundary: rootBoundary,\n    padding: padding,\n    altBoundary: altBoundary\n  });\n  var basePlacement = getBasePlacement(state.placement);\n  var variation = getVariation(state.placement);\n  var isBasePlacement = !variation;\n  var mainAxis = getMainAxisFromPlacement(basePlacement);\n  var altAxis = getAltAxis(mainAxis);\n  var popperOffsets = state.modifiersData.popperOffsets;\n  var referenceRect = state.rects.reference;\n  var popperRect = state.rects.popper;\n  var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n    placement: state.placement\n  })) : tetherOffset;\n  var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n    mainAxis: tetherOffsetValue,\n    altAxis: tetherOffsetValue\n  } : Object.assign({\n    mainAxis: 0,\n    altAxis: 0\n  }, tetherOffsetValue);\n  var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n  var data = {\n    x: 0,\n    y: 0\n  };\n\n  if (!popperOffsets) {\n    return;\n  }\n\n  if (checkMainAxis) {\n    var _offsetModifierState$;\n\n    var mainSide = mainAxis === 'y' ? top : left;\n    var altSide = mainAxis === 'y' ? bottom : right;\n    var len = mainAxis === 'y' ? 'height' : 'width';\n    var offset = popperOffsets[mainAxis];\n    var min = offset + overflow[mainSide];\n    var max = offset - overflow[altSide];\n    var additive = tether ? -popperRect[len] / 2 : 0;\n    var minLen = variation === start ? referenceRect[len] : popperRect[len];\n    var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n    // outside the reference bounds\n\n    var arrowElement = state.elements.arrow;\n    var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n      width: 0,\n      height: 0\n    };\n    var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n    var arrowPaddingMin = arrowPaddingObject[mainSide];\n    var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n    // to include its full size in the calculation. If the reference is small\n    // and near the edge of a boundary, the popper can overflow even if the\n    // reference is not overflowing as well (e.g. virtual elements with no\n    // width or height)\n\n    var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n    var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n    var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n    var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n    var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n    var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n    var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n    var tetherMax = offset + maxOffset - offsetModifierValue;\n    var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n    popperOffsets[mainAxis] = preventedOffset;\n    data[mainAxis] = preventedOffset - offset;\n  }\n\n  if (checkAltAxis) {\n    var _offsetModifierState$2;\n\n    var _mainSide = mainAxis === 'x' ? top : left;\n\n    var _altSide = mainAxis === 'x' ? bottom : right;\n\n    var _offset = popperOffsets[altAxis];\n\n    var _len = altAxis === 'y' ? 'height' : 'width';\n\n    var _min = _offset + overflow[_mainSide];\n\n    var _max = _offset - overflow[_altSide];\n\n    var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n    var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n    var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n    var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n    var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n    popperOffsets[altAxis] = _preventedOffset;\n    data[altAxis] = _preventedOffset - _offset;\n  }\n\n  state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n  name: 'preventOverflow',\n  enabled: true,\n  phase: 'main',\n  fn: preventOverflow,\n  requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n  return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n  var rect = element.getBoundingClientRect();\n  var scaleX = round(rect.width) / element.offsetWidth || 1;\n  var scaleY = round(rect.height) / element.offsetHeight || 1;\n  return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n  if (isFixed === void 0) {\n    isFixed = false;\n  }\n\n  var isOffsetParentAnElement = isHTMLElement(offsetParent);\n  var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n  var documentElement = getDocumentElement(offsetParent);\n  var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n  var scroll = {\n    scrollLeft: 0,\n    scrollTop: 0\n  };\n  var offsets = {\n    x: 0,\n    y: 0\n  };\n\n  if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n    if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n    isScrollParent(documentElement)) {\n      scroll = getNodeScroll(offsetParent);\n    }\n\n    if (isHTMLElement(offsetParent)) {\n      offsets = getBoundingClientRect(offsetParent, true);\n      offsets.x += offsetParent.clientLeft;\n      offsets.y += offsetParent.clientTop;\n    } else if (documentElement) {\n      offsets.x = getWindowScrollBarX(documentElement);\n    }\n  }\n\n  return {\n    x: rect.left + scroll.scrollLeft - offsets.x,\n    y: rect.top + scroll.scrollTop - offsets.y,\n    width: rect.width,\n    height: rect.height\n  };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n  if (node === getWindow(node) || !isHTMLElement(node)) {\n    return getWindowScroll(node);\n  } else {\n    return getHTMLElementScroll(node);\n  }\n}","export default function getHTMLElementScroll(element) {\n  return {\n    scrollLeft: element.scrollLeft,\n    scrollTop: element.scrollTop\n  };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n  var map = new Map();\n  var visited = new Set();\n  var result = [];\n  modifiers.forEach(function (modifier) {\n    map.set(modifier.name, modifier);\n  }); // On visiting object, check for its dependencies and visit them recursively\n\n  function sort(modifier) {\n    visited.add(modifier.name);\n    var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n    requires.forEach(function (dep) {\n      if (!visited.has(dep)) {\n        var depModifier = map.get(dep);\n\n        if (depModifier) {\n          sort(depModifier);\n        }\n      }\n    });\n    result.push(modifier);\n  }\n\n  modifiers.forEach(function (modifier) {\n    if (!visited.has(modifier.name)) {\n      // check for visited object\n      sort(modifier);\n    }\n  });\n  return result;\n}\n\nexport default function orderModifiers(modifiers) {\n  // order based on dependencies\n  var orderedModifiers = order(modifiers); // order based on phase\n\n  return modifierPhases.reduce(function (acc, phase) {\n    return acc.concat(orderedModifiers.filter(function (modifier) {\n      return modifier.phase === phase;\n    }));\n  }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n  placement: 'bottom',\n  modifiers: [],\n  strategy: 'absolute'\n};\n\nfunction areValidElements() {\n  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n    args[_key] = arguments[_key];\n  }\n\n  return !args.some(function (element) {\n    return !(element && typeof element.getBoundingClientRect === 'function');\n  });\n}\n\nexport function popperGenerator(generatorOptions) {\n  if (generatorOptions === void 0) {\n    generatorOptions = {};\n  }\n\n  var _generatorOptions = generatorOptions,\n      _generatorOptions$def = _generatorOptions.defaultModifiers,\n      defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n      _generatorOptions$def2 = _generatorOptions.defaultOptions,\n      defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n  return function createPopper(reference, popper, options) {\n    if (options === void 0) {\n      options = defaultOptions;\n    }\n\n    var state = {\n      placement: 'bottom',\n      orderedModifiers: [],\n      options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n      modifiersData: {},\n      elements: {\n        reference: reference,\n        popper: popper\n      },\n      attributes: {},\n      styles: {}\n    };\n    var effectCleanupFns = [];\n    var isDestroyed = false;\n    var instance = {\n      state: state,\n      setOptions: function setOptions(setOptionsAction) {\n        var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n        cleanupModifierEffects();\n        state.options = Object.assign({}, defaultOptions, state.options, options);\n        state.scrollParents = {\n          reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n          popper: listScrollParents(popper)\n        }; // Orders the modifiers based on their dependencies and `phase`\n        // properties\n\n        var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n        state.orderedModifiers = orderedModifiers.filter(function (m) {\n          return m.enabled;\n        });\n        runModifierEffects();\n        return instance.update();\n      },\n      // Sync update – it will always be executed, even if not necessary. This\n      // is useful for low frequency updates where sync behavior simplifies the\n      // logic.\n      // For high frequency updates (e.g. `resize` and `scroll` events), always\n      // prefer the async Popper#update method\n      forceUpdate: function forceUpdate() {\n        if (isDestroyed) {\n          return;\n        }\n\n        var _state$elements = state.elements,\n            reference = _state$elements.reference,\n            popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n        // anymore\n\n        if (!areValidElements(reference, popper)) {\n          return;\n        } // Store the reference and popper rects to be read by modifiers\n\n\n        state.rects = {\n          reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n          popper: getLayoutRect(popper)\n        }; // Modifiers have the ability to reset the current update cycle. The\n        // most common use case for this is the `flip` modifier changing the\n        // placement, which then needs to re-run all the modifiers, because the\n        // logic was previously ran for the previous placement and is therefore\n        // stale/incorrect\n\n        state.reset = false;\n        state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n        // is filled with the initial data specified by the modifier. This means\n        // it doesn't persist and is fresh on each update.\n        // To ensure persistent data, use `${name}#persistent`\n\n        state.orderedModifiers.forEach(function (modifier) {\n          return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n        });\n\n        for (var index = 0; index < state.orderedModifiers.length; index++) {\n          if (state.reset === true) {\n            state.reset = false;\n            index = -1;\n            continue;\n          }\n\n          var _state$orderedModifie = state.orderedModifiers[index],\n              fn = _state$orderedModifie.fn,\n              _state$orderedModifie2 = _state$orderedModifie.options,\n              _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n              name = _state$orderedModifie.name;\n\n          if (typeof fn === 'function') {\n            state = fn({\n              state: state,\n              options: _options,\n              name: name,\n              instance: instance\n            }) || state;\n          }\n        }\n      },\n      // Async and optimistically optimized update – it will not be executed if\n      // not necessary (debounced to run at most once-per-tick)\n      update: debounce(function () {\n        return new Promise(function (resolve) {\n          instance.forceUpdate();\n          resolve(state);\n        });\n      }),\n      destroy: function destroy() {\n        cleanupModifierEffects();\n        isDestroyed = true;\n      }\n    };\n\n    if (!areValidElements(reference, popper)) {\n      return instance;\n    }\n\n    instance.setOptions(options).then(function (state) {\n      if (!isDestroyed && options.onFirstUpdate) {\n        options.onFirstUpdate(state);\n      }\n    }); // Modifiers have the ability to execute arbitrary code before the first\n    // update cycle runs. They will be executed in the same order as the update\n    // cycle. This is useful when a modifier adds some persistent data that\n    // other modifiers need to use, but the modifier is run after the dependent\n    // one.\n\n    function runModifierEffects() {\n      state.orderedModifiers.forEach(function (_ref) {\n        var name = _ref.name,\n            _ref$options = _ref.options,\n            options = _ref$options === void 0 ? {} : _ref$options,\n            effect = _ref.effect;\n\n        if (typeof effect === 'function') {\n          var cleanupFn = effect({\n            state: state,\n            name: name,\n            instance: instance,\n            options: options\n          });\n\n          var noopFn = function noopFn() {};\n\n          effectCleanupFns.push(cleanupFn || noopFn);\n        }\n      });\n    }\n\n    function cleanupModifierEffects() {\n      effectCleanupFns.forEach(function (fn) {\n        return fn();\n      });\n      effectCleanupFns = [];\n    }\n\n    return instance;\n  };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n  var pending;\n  return function () {\n    if (!pending) {\n      pending = new Promise(function (resolve) {\n        Promise.resolve().then(function () {\n          pending = undefined;\n          resolve(fn());\n        });\n      });\n    }\n\n    return pending;\n  };\n}","export default function mergeByName(modifiers) {\n  var merged = modifiers.reduce(function (merged, current) {\n    var existing = merged[current.name];\n    merged[current.name] = existing ? Object.assign({}, existing, current, {\n      options: Object.assign({}, existing.options, current.options),\n      data: Object.assign({}, existing.data, current.data)\n    }) : current;\n    return merged;\n  }, {}); // IE11 does not support Object.values\n\n  return Object.keys(merged).map(function (key) {\n    return merged[key];\n  });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n  defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n  defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import type {\n  BrowserClientProfilingOptions,\n  BrowserClientReplayOptions,\n  ClientOptions,\n  Event,\n  EventHint,\n  Options,\n  ParameterizedString,\n  Scope,\n  SeverityLevel,\n  UserFeedback,\n} from '@sentry/core';\nimport { BaseClient, applySdkMetadata, getSDKSource, logger } from '@sentry/core';\nimport { DEBUG_BUILD } from './debug-build';\nimport { eventFromException, eventFromMessage } from './eventbuilder';\nimport { WINDOW } from './helpers';\nimport type { BrowserTransportOptions } from './transports/types';\nimport { createUserFeedbackEnvelope } from './userfeedback';\n\n/**\n * Configuration options for the Sentry Browser SDK.\n * @see @sentry/core Options for more information.\n */\nexport type BrowserOptions = Options<BrowserTransportOptions> &\n  BrowserClientReplayOptions &\n  BrowserClientProfilingOptions & {\n    /**\n     * Important: Only set this option if you know what you are doing!\n     *\n     * By default, the SDK will check if `Sentry.init` is called in a browser extension.\n     * In case it is, it will stop initialization and log a warning\n     * because browser extensions require a different Sentry initialization process:\n     * https://docs.sentry.io/platforms/javascript/best-practices/shared-environments/\n     *\n     * Setting up the SDK in a browser extension with global error monitoring is not recommended\n     * and will likely flood you with errors from other web sites or extensions. This can heavily\n     * impact your quota and cause interference with your and other Sentry SDKs in shared environments.\n     *\n     * If this check wrongfully flags your setup as a browser extension, you can set this\n     * option to `true` to skip the check.\n     *\n     * @default false\n     */\n    skipBrowserExtensionCheck?: boolean;\n  };\n\n/**\n * Configuration options for the Sentry Browser SDK Client class\n * @see BrowserClient for more information.\n */\nexport type BrowserClientOptions = ClientOptions<BrowserTransportOptions> &\n  BrowserClientReplayOptions &\n  BrowserClientProfilingOptions & {\n    /** If configured, this URL will be used as base URL for lazy loading integration. */\n    cdnBaseUrl?: string;\n  };\n\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nexport class BrowserClient extends BaseClient<BrowserClientOptions> {\n  /**\n   * Creates a new Browser SDK instance.\n   *\n   * @param options Configuration options for this SDK.\n   */\n  public constructor(options: BrowserClientOptions) {\n    const opts = {\n      // We default this to true, as it is the safer scenario\n      parentSpanIsAlwaysRootSpan: true,\n      ...options,\n    };\n    const sdkSource = WINDOW.SENTRY_SDK_SOURCE || getSDKSource();\n    applySdkMetadata(opts, 'browser', ['browser'], sdkSource);\n\n    super(opts);\n\n    if (opts.sendClientReports && WINDOW.document) {\n      WINDOW.document.addEventListener('visibilitychange', () => {\n        if (WINDOW.document.visibilityState === 'hidden') {\n          this._flushOutcomes();\n        }\n      });\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public eventFromException(exception: unknown, hint?: EventHint): PromiseLike<Event> {\n    return eventFromException(this._options.stackParser, exception, hint, this._options.attachStacktrace);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public eventFromMessage(\n    message: ParameterizedString,\n    level: SeverityLevel = 'info',\n    hint?: EventHint,\n  ): PromiseLike<Event> {\n    return eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace);\n  }\n\n  /**\n   * Sends user feedback to Sentry.\n   *\n   * @deprecated Use `captureFeedback` instead.\n   */\n  public captureUserFeedback(feedback: UserFeedback): void {\n    if (!this._isEnabled()) {\n      DEBUG_BUILD && logger.warn('SDK not enabled, will not capture user feedback.');\n      return;\n    }\n\n    const envelope = createUserFeedbackEnvelope(feedback, {\n      metadata: this.getSdkMetadata(),\n      dsn: this.getDsn(),\n      tunnel: this.getOptions().tunnel,\n    });\n\n    // sendEnvelope should not throw\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this.sendEnvelope(envelope);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  protected _prepareEvent(event: Event, hint: EventHint, scope?: Scope): PromiseLike<Event | null> {\n    event.platform = event.platform || 'javascript';\n    return super._prepareEvent(event, hint, scope);\n  }\n}\n","declare const __DEBUG_BUILD__: boolean;\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nexport const DEBUG_BUILD = __DEBUG_BUILD__;\n","import type {\n  Event,\n  EventHint,\n  Exception,\n  ParameterizedString,\n  SeverityLevel,\n  StackFrame,\n  StackParser,\n} from '@sentry/core';\nimport {\n  addExceptionMechanism,\n  addExceptionTypeValue,\n  extractExceptionKeysForMessage,\n  getClient,\n  isDOMError,\n  isDOMException,\n  isError,\n  isErrorEvent,\n  isEvent,\n  isParameterizedString,\n  isPlainObject,\n  normalizeToSize,\n  resolvedSyncPromise,\n} from '@sentry/core';\n\ntype Prototype = { constructor: (...args: unknown[]) => unknown };\n\n/**\n * This function creates an exception from a JavaScript Error\n */\nexport function exceptionFromError(stackParser: StackParser, ex: Error): Exception {\n  // Get the frames first since Opera can lose the stack if we touch anything else first\n  const frames = parseStackFrames(stackParser, ex);\n\n  const exception: Exception = {\n    type: extractType(ex),\n    value: extractMessage(ex),\n  };\n\n  if (frames.length) {\n    exception.stacktrace = { frames };\n  }\n\n  if (exception.type === undefined && exception.value === '') {\n    exception.value = 'Unrecoverable error caught';\n  }\n\n  return exception;\n}\n\nfunction eventFromPlainObject(\n  stackParser: StackParser,\n  exception: Record<string, unknown>,\n  syntheticException?: Error,\n  isUnhandledRejection?: boolean,\n): Event {\n  const client = getClient();\n  const normalizeDepth = client && client.getOptions().normalizeDepth;\n\n  // If we can, we extract an exception from the object properties\n  const errorFromProp = getErrorPropertyFromObject(exception);\n\n  const extra = {\n    __serialized__: normalizeToSize(exception, normalizeDepth),\n  };\n\n  if (errorFromProp) {\n    return {\n      exception: {\n        values: [exceptionFromError(stackParser, errorFromProp)],\n      },\n      extra,\n    };\n  }\n\n  const event = {\n    exception: {\n      values: [\n        {\n          type: isEvent(exception) ? exception.constructor.name : isUnhandledRejection ? 'UnhandledRejection' : 'Error',\n          value: getNonErrorObjectExceptionValue(exception, { isUnhandledRejection }),\n        } as Exception,\n      ],\n    },\n    extra,\n  } satisfies Event;\n\n  if (syntheticException) {\n    const frames = parseStackFrames(stackParser, syntheticException);\n    if (frames.length) {\n      // event.exception.values[0] has been set above\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      event.exception.values[0]!.stacktrace = { frames };\n    }\n  }\n\n  return event;\n}\n\nfunction eventFromError(stackParser: StackParser, ex: Error): Event {\n  return {\n    exception: {\n      values: [exceptionFromError(stackParser, ex)],\n    },\n  };\n}\n\n/** Parses stack frames from an error */\nfunction parseStackFrames(\n  stackParser: StackParser,\n  ex: Error & { framesToPop?: number; stacktrace?: string },\n): StackFrame[] {\n  // Access and store the stacktrace property before doing ANYTHING\n  // else to it because Opera is not very good at providing it\n  // reliably in other circumstances.\n  const stacktrace = ex.stacktrace || ex.stack || '';\n\n  const skipLines = getSkipFirstStackStringLines(ex);\n  const framesToPop = getPopFirstTopFrames(ex);\n\n  try {\n    return stackParser(stacktrace, skipLines, framesToPop);\n  } catch (e) {\n    // no-empty\n  }\n\n  return [];\n}\n\n// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i;\n\n/**\n * Certain known React errors contain links that would be falsely\n * parsed as frames. This function check for these errors and\n * returns number of the stack string lines to skip.\n */\nfunction getSkipFirstStackStringLines(ex: Error): number {\n  if (ex && reactMinifiedRegexp.test(ex.message)) {\n    return 1;\n  }\n\n  return 0;\n}\n\n/**\n * If error has `framesToPop` property, it means that the\n * creator tells us the first x frames will be useless\n * and should be discarded. Typically error from wrapper function\n * which don't point to the actual location in the developer's code.\n *\n * Example: https://github.com/zertosh/invariant/blob/master/invariant.js#L46\n */\nfunction getPopFirstTopFrames(ex: Error & { framesToPop?: unknown }): number {\n  if (typeof ex.framesToPop === 'number') {\n    return ex.framesToPop;\n  }\n\n  return 0;\n}\n\n// https://developer.mozilla.org/en-US/docs/WebAssembly/JavaScript_interface/Exception\n// @ts-expect-error - WebAssembly.Exception is a valid class\nfunction isWebAssemblyException(exception: unknown): exception is WebAssembly.Exception {\n  // Check for support\n  // @ts-expect-error - WebAssembly.Exception is a valid class\n  if (typeof WebAssembly !== 'undefined' && typeof WebAssembly.Exception !== 'undefined') {\n    // @ts-expect-error - WebAssembly.Exception is a valid class\n    return exception instanceof WebAssembly.Exception;\n  } else {\n    return false;\n  }\n}\n\n/**\n * Extracts from errors what we use as the exception `type` in error events.\n *\n * Usually, this is the `name` property on Error objects but WASM errors need to be treated differently.\n */\nexport function extractType(ex: Error & { message: { error?: Error } }): string | undefined {\n  const name = ex && ex.name;\n\n  // The name for WebAssembly.Exception Errors needs to be extracted differently.\n  // Context: https://github.com/getsentry/sentry-javascript/issues/13787\n  if (!name && isWebAssemblyException(ex)) {\n    // Emscripten sets array[type, message] to the \"message\" property on the WebAssembly.Exception object\n    const hasTypeInMessage = ex.message && Array.isArray(ex.message) && ex.message.length == 2;\n    return hasTypeInMessage ? ex.message[0] : 'WebAssembly.Exception';\n  }\n\n  return name;\n}\n\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\nexport function extractMessage(ex: Error & { message: { error?: Error } }): string {\n  const message = ex && ex.message;\n\n  if (!message) {\n    return 'No error message';\n  }\n\n  if (message.error && typeof message.error.message === 'string') {\n    return message.error.message;\n  }\n\n  // Emscripten sets array[type, message] to the \"message\" property on the WebAssembly.Exception object\n  if (isWebAssemblyException(ex) && Array.isArray(ex.message) && ex.message.length == 2) {\n    return ex.message[1];\n  }\n\n  return message;\n}\n\n/**\n * Creates an {@link Event} from all inputs to `captureException` and non-primitive inputs to `captureMessage`.\n * @hidden\n */\nexport function eventFromException(\n  stackParser: StackParser,\n  exception: unknown,\n  hint?: EventHint,\n  attachStacktrace?: boolean,\n): PromiseLike<Event> {\n  const syntheticException = (hint && hint.syntheticException) || undefined;\n  const event = eventFromUnknownInput(stackParser, exception, syntheticException, attachStacktrace);\n  addExceptionMechanism(event); // defaults to { type: 'generic', handled: true }\n  event.level = 'error';\n  if (hint && hint.event_id) {\n    event.event_id = hint.event_id;\n  }\n  return resolvedSyncPromise(event);\n}\n\n/**\n * Builds and Event from a Message\n * @hidden\n */\nexport function eventFromMessage(\n  stackParser: StackParser,\n  message: ParameterizedString,\n  level: SeverityLevel = 'info',\n  hint?: EventHint,\n  attachStacktrace?: boolean,\n): PromiseLike<Event> {\n  const syntheticException = (hint && hint.syntheticException) || undefined;\n  const event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n  event.level = level;\n  if (hint && hint.event_id) {\n    event.event_id = hint.event_id;\n  }\n  return resolvedSyncPromise(event);\n}\n\n/**\n * @hidden\n */\nexport function eventFromUnknownInput(\n  stackParser: StackParser,\n  exception: unknown,\n  syntheticException?: Error,\n  attachStacktrace?: boolean,\n  isUnhandledRejection?: boolean,\n): Event {\n  let event: Event;\n\n  if (isErrorEvent(exception as ErrorEvent) && (exception as ErrorEvent).error) {\n    // If it is an ErrorEvent with `error` property, extract it to get actual Error\n    const errorEvent = exception as ErrorEvent;\n    return eventFromError(stackParser, errorEvent.error as Error);\n  }\n\n  // If it is a `DOMError` (which is a legacy API, but still supported in some browsers) then we just extract the name\n  // and message, as it doesn't provide anything else. According to the spec, all `DOMExceptions` should also be\n  // `Error`s, but that's not the case in IE11, so in that case we treat it the same as we do a `DOMError`.\n  //\n  // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n  // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n  // https://webidl.spec.whatwg.org/#es-DOMException-specialness\n  if (isDOMError(exception) || isDOMException(exception as DOMException)) {\n    const domException = exception as DOMException;\n\n    if ('stack' in (exception as Error)) {\n      event = eventFromError(stackParser, exception as Error);\n    } else {\n      const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n      const message = domException.message ? `${name}: ${domException.message}` : name;\n      event = eventFromString(stackParser, message, syntheticException, attachStacktrace);\n      addExceptionTypeValue(event, message);\n    }\n    if ('code' in domException) {\n      // eslint-disable-next-line deprecation/deprecation\n      event.tags = { ...event.tags, 'DOMException.code': `${domException.code}` };\n    }\n\n    return event;\n  }\n  if (isError(exception)) {\n    // we have a real Error object, do nothing\n    return eventFromError(stackParser, exception);\n  }\n  if (isPlainObject(exception) || isEvent(exception)) {\n    // If it's a plain object or an instance of `Event` (the built-in JS kind, not this SDK's `Event` type), serialize\n    // it manually. This will allow us to group events based on top-level keys which is much better than creating a new\n    // group on any key/value change.\n    const objectException = exception as Record<string, unknown>;\n    event = eventFromPlainObject(stackParser, objectException, syntheticException, isUnhandledRejection);\n    addExceptionMechanism(event, {\n      synthetic: true,\n    });\n    return event;\n  }\n\n  // If none of previous checks were valid, then it means that it's not:\n  // - an instance of DOMError\n  // - an instance of DOMException\n  // - an instance of Event\n  // - an instance of Error\n  // - a valid ErrorEvent (one with an error property)\n  // - a plain Object\n  //\n  // So bail out and capture it as a simple message:\n  event = eventFromString(stackParser, exception as string, syntheticException, attachStacktrace);\n  addExceptionTypeValue(event, `${exception}`, undefined);\n  addExceptionMechanism(event, {\n    synthetic: true,\n  });\n\n  return event;\n}\n\nfunction eventFromString(\n  stackParser: StackParser,\n  message: ParameterizedString,\n  syntheticException?: Error,\n  attachStacktrace?: boolean,\n): Event {\n  const event: Event = {};\n\n  if (attachStacktrace && syntheticException) {\n    const frames = parseStackFrames(stackParser, syntheticException);\n    if (frames.length) {\n      event.exception = {\n        values: [{ value: message, stacktrace: { frames } }],\n      };\n    }\n    addExceptionMechanism(event, { synthetic: true });\n  }\n\n  if (isParameterizedString(message)) {\n    const { __sentry_template_string__, __sentry_template_values__ } = message;\n\n    event.logentry = {\n      message: __sentry_template_string__,\n      params: __sentry_template_values__,\n    };\n    return event;\n  }\n\n  event.message = message;\n  return event;\n}\n\nfunction getNonErrorObjectExceptionValue(\n  exception: Record<string, unknown>,\n  { isUnhandledRejection }: { isUnhandledRejection?: boolean },\n): string {\n  const keys = extractExceptionKeysForMessage(exception);\n  const captureType = isUnhandledRejection ? 'promise rejection' : 'exception';\n\n  // Some ErrorEvent instances do not have an `error` property, which is why they are not handled before\n  // We still want to try to get a decent message for these cases\n  if (isErrorEvent(exception)) {\n    return `Event \\`ErrorEvent\\` captured as ${captureType} with message \\`${exception.message}\\``;\n  }\n\n  if (isEvent(exception)) {\n    const className = getObjectClassName(exception);\n    return `Event \\`${className}\\` (type=${exception.type}) captured as ${captureType}`;\n  }\n\n  return `Object captured as ${captureType} with keys: ${keys}`;\n}\n\nfunction getObjectClassName(obj: unknown): string | undefined | void {\n  try {\n    const prototype: Prototype | null = Object.getPrototypeOf(obj);\n    return prototype ? prototype.constructor.name : undefined;\n  } catch (e) {\n    // ignore errors here\n  }\n}\n\n/** If a plain object has a property that is an `Error`, return this error. */\nfunction getErrorPropertyFromObject(obj: Record<string, unknown>): Error | undefined {\n  for (const prop in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n      const value = obj[prop];\n      if (value instanceof Error) {\n        return value;\n      }\n    }\n  }\n\n  return undefined;\n}\n","import { buildFeedbackIntegration } from '@sentry-internal/feedback';\nimport { lazyLoadIntegration } from './utils/lazyLoadIntegration';\n\n/**\n * An integration to add user feedback to your application,\n * while loading most of the code lazily only when it's needed.\n */\nexport const feedbackAsyncIntegration = buildFeedbackIntegration({\n  lazyLoadIntegration,\n});\n","import {\n  buildFeedbackIntegration,\n  feedbackModalIntegration,\n  feedbackScreenshotIntegration,\n} from '@sentry-internal/feedback';\n\n/** Add a widget to capture user feedback to your application. */\nexport const feedbackSyncIntegration = buildFeedbackIntegration({\n  getModalIntegration: () => feedbackModalIntegration,\n  getScreenshotIntegration: () => feedbackScreenshotIntegration,\n});\n","import type { Mechanism, WrappedFunction } from '@sentry/core';\nimport {\n  GLOBAL_OBJ,\n  addExceptionMechanism,\n  addExceptionTypeValue,\n  addNonEnumerableProperty,\n  captureException,\n  getOriginalFunction,\n  markFunctionWrapped,\n  withScope,\n} from '@sentry/core';\n\nexport const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n\nlet ignoreOnError: number = 0;\n\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError(): boolean {\n  return ignoreOnError > 0;\n}\n\n/**\n * @hidden\n */\nexport function ignoreNextOnError(): void {\n  // onerror should trigger before setTimeout\n  ignoreOnError++;\n  setTimeout(() => {\n    ignoreOnError--;\n  });\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\ntype WrappableFunction = Function;\n\nexport function wrap<T extends WrappableFunction>(\n  fn: T,\n  options?: {\n    mechanism?: Mechanism;\n  },\n): WrappedFunction<T>;\nexport function wrap<NonFunction>(\n  fn: NonFunction,\n  options?: {\n    mechanism?: Mechanism;\n  },\n): NonFunction;\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap. It is generally safe to pass an unbound function, because the returned wrapper always\n * has a correct `this` context.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap<T extends WrappableFunction, NonFunction>(\n  fn: T | NonFunction,\n  options: {\n    mechanism?: Mechanism;\n  } = {},\n): NonFunction | WrappedFunction<T> {\n  // for future readers what this does is wrap a function and then create\n  // a bi-directional wrapping between them.\n  //\n  // example: wrapped = wrap(original);\n  //  original.__sentry_wrapped__ -> wrapped\n  //  wrapped.__sentry_original__ -> original\n\n  function isFunction(fn: T | NonFunction): fn is T {\n    return typeof fn === 'function';\n  }\n\n  if (!isFunction(fn)) {\n    return fn;\n  }\n\n  try {\n    // if we're dealing with a function that was previously wrapped, return\n    // the original wrapper.\n    const wrapper = (fn as WrappedFunction<T>).__sentry_wrapped__;\n    if (wrapper) {\n      if (typeof wrapper === 'function') {\n        return wrapper;\n      } else {\n        // If we find that the `__sentry_wrapped__` function is not a function at the time of accessing it, it means\n        // that something messed with it. In that case we want to return the originally passed function.\n        return fn;\n      }\n    }\n\n    // We don't wanna wrap it twice\n    if (getOriginalFunction(fn)) {\n      return fn;\n    }\n  } catch (e) {\n    // Just accessing custom props in some Selenium environments\n    // can cause a \"Permission denied\" exception (see raven-js#495).\n    // Bail on wrapping and return the function as-is (defers to window.onerror).\n    return fn;\n  }\n\n  // Wrap the function itself\n  // It is important that `sentryWrapped` is not an arrow function to preserve the context of `this`\n  const sentryWrapped = function (this: unknown, ...args: unknown[]): unknown {\n    try {\n      // Also wrap arguments that are themselves functions\n      const wrappedArguments = args.map(arg => wrap(arg, options));\n\n      // Attempt to invoke user-land function\n      // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n      //       means the sentry.javascript SDK caught an error invoking your application code. This\n      //       is expected behavior and NOT indicative of a bug with sentry.javascript.\n      return fn.apply(this, wrappedArguments);\n    } catch (ex) {\n      ignoreNextOnError();\n\n      withScope(scope => {\n        scope.addEventProcessor(event => {\n          if (options.mechanism) {\n            addExceptionTypeValue(event, undefined, undefined);\n            addExceptionMechanism(event, options.mechanism);\n          }\n\n          event.extra = {\n            ...event.extra,\n            arguments: args,\n          };\n\n          return event;\n        });\n\n        captureException(ex);\n      });\n\n      throw ex;\n    }\n  } as unknown as WrappedFunction<T>;\n\n  // Wrap the wrapped function in a proxy, to ensure any other properties of the original function remain available\n  try {\n    for (const property in fn) {\n      if (Object.prototype.hasOwnProperty.call(fn, property)) {\n        sentryWrapped[property as keyof T] = fn[property as keyof T];\n      }\n    }\n  } catch {\n    // Accessing some objects may throw\n    // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n  }\n\n  // Signal that this function has been wrapped/filled already\n  // for both debugging and to prevent it to being wrapped/filled twice\n  markFunctionWrapped(sentryWrapped, fn);\n\n  addNonEnumerableProperty(fn, '__sentry_wrapped__', sentryWrapped);\n\n  // Restore original function name (not all browsers allow that)\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name')!;\n    if (descriptor.configurable) {\n      Object.defineProperty(sentryWrapped, 'name', {\n        get(): string {\n          return fn.name;\n        },\n      });\n    }\n  } catch {\n    // This may throw if e.g. the descriptor does not exist, or a browser does not allow redefining `name`.\n    // to save some bytes we simply try-catch this\n  }\n\n  return sentryWrapped;\n}\n","/* eslint-disable max-lines */\n\nimport {\n  SENTRY_XHR_DATA_KEY,\n  addClickKeypressInstrumentationHandler,\n  addHistoryInstrumentationHandler,\n  addXhrInstrumentationHandler,\n} from '@sentry-internal/browser-utils';\nimport type {\n  Breadcrumb,\n  Client,\n  Event as SentryEvent,\n  FetchBreadcrumbData,\n  FetchBreadcrumbHint,\n  HandlerDataConsole,\n  HandlerDataDom,\n  HandlerDataFetch,\n  HandlerDataHistory,\n  HandlerDataXhr,\n  IntegrationFn,\n  XhrBreadcrumbData,\n  XhrBreadcrumbHint,\n} from '@sentry/core';\nimport {\n  addBreadcrumb,\n  addConsoleInstrumentationHandler,\n  addFetchInstrumentationHandler,\n  defineIntegration,\n  getBreadcrumbLogLevelFromHttpStatusCode,\n  getClient,\n  getComponentName,\n  getEventDescription,\n  htmlTreeAsString,\n  logger,\n  parseUrl,\n  safeJoin,\n  severityLevelFromString,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\n\ninterface BreadcrumbsOptions {\n  console: boolean;\n  dom:\n    | boolean\n    | {\n        serializeAttribute?: string | string[];\n        maxStringLength?: number;\n      };\n  fetch: boolean;\n  history: boolean;\n  sentry: boolean;\n  xhr: boolean;\n}\n\n/** maxStringLength gets capped to prevent 100 breadcrumbs exceeding 1MB event payload size */\nconst MAX_ALLOWED_STRING_LENGTH = 1024;\n\nconst INTEGRATION_NAME = 'Breadcrumbs';\n\nconst _breadcrumbsIntegration = ((options: Partial<BreadcrumbsOptions> = {}) => {\n  const _options = {\n    console: true,\n    dom: true,\n    fetch: true,\n    history: true,\n    sentry: true,\n    xhr: true,\n    ...options,\n  };\n\n  return {\n    name: INTEGRATION_NAME,\n    setup(client) {\n      if (_options.console) {\n        addConsoleInstrumentationHandler(_getConsoleBreadcrumbHandler(client));\n      }\n      if (_options.dom) {\n        addClickKeypressInstrumentationHandler(_getDomBreadcrumbHandler(client, _options.dom));\n      }\n      if (_options.xhr) {\n        addXhrInstrumentationHandler(_getXhrBreadcrumbHandler(client));\n      }\n      if (_options.fetch) {\n        addFetchInstrumentationHandler(_getFetchBreadcrumbHandler(client));\n      }\n      if (_options.history) {\n        addHistoryInstrumentationHandler(_getHistoryBreadcrumbHandler(client));\n      }\n      if (_options.sentry) {\n        client.on('beforeSendEvent', _getSentryBreadcrumbHandler(client));\n      }\n    },\n  };\n}) satisfies IntegrationFn;\n\nexport const breadcrumbsIntegration = defineIntegration(_breadcrumbsIntegration);\n\n/**\n * Adds a breadcrumb for Sentry events or transactions if this option is enabled.\n */\nfunction _getSentryBreadcrumbHandler(client: Client): (event: SentryEvent) => void {\n  return function addSentryBreadcrumb(event: SentryEvent): void {\n    if (getClient() !== client) {\n      return;\n    }\n\n    addBreadcrumb(\n      {\n        category: `sentry.${event.type === 'transaction' ? 'transaction' : 'event'}`,\n        event_id: event.event_id,\n        level: event.level,\n        message: getEventDescription(event),\n      },\n      {\n        event,\n      },\n    );\n  };\n}\n\n/**\n * A HOC that creates a function that creates breadcrumbs from DOM API calls.\n * This is a HOC so that we get access to dom options in the closure.\n */\nfunction _getDomBreadcrumbHandler(\n  client: Client,\n  dom: BreadcrumbsOptions['dom'],\n): (handlerData: HandlerDataDom) => void {\n  return function _innerDomBreadcrumb(handlerData: HandlerDataDom): void {\n    if (getClient() !== client) {\n      return;\n    }\n\n    let target;\n    let componentName;\n    let keyAttrs = typeof dom === 'object' ? dom.serializeAttribute : undefined;\n\n    let maxStringLength =\n      typeof dom === 'object' && typeof dom.maxStringLength === 'number' ? dom.maxStringLength : undefined;\n    if (maxStringLength && maxStringLength > MAX_ALLOWED_STRING_LENGTH) {\n      DEBUG_BUILD &&\n        logger.warn(\n          `\\`dom.maxStringLength\\` cannot exceed ${MAX_ALLOWED_STRING_LENGTH}, but a value of ${maxStringLength} was configured. Sentry will use ${MAX_ALLOWED_STRING_LENGTH} instead.`,\n        );\n      maxStringLength = MAX_ALLOWED_STRING_LENGTH;\n    }\n\n    if (typeof keyAttrs === 'string') {\n      keyAttrs = [keyAttrs];\n    }\n\n    // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n    try {\n      const event = handlerData.event as Event | Node;\n      const element = _isEvent(event) ? event.target : event;\n\n      target = htmlTreeAsString(element, { keyAttrs, maxStringLength });\n      componentName = getComponentName(element);\n    } catch (e) {\n      target = '<unknown>';\n    }\n\n    if (target.length === 0) {\n      return;\n    }\n\n    const breadcrumb: Breadcrumb = {\n      category: `ui.${handlerData.name}`,\n      message: target,\n    };\n\n    if (componentName) {\n      breadcrumb.data = { 'ui.component_name': componentName };\n    }\n\n    addBreadcrumb(breadcrumb, {\n      event: handlerData.event,\n      name: handlerData.name,\n      global: handlerData.global,\n    });\n  };\n}\n\n/**\n * Creates breadcrumbs from console API calls\n */\nfunction _getConsoleBreadcrumbHandler(client: Client): (handlerData: HandlerDataConsole) => void {\n  return function _consoleBreadcrumb(handlerData: HandlerDataConsole): void {\n    if (getClient() !== client) {\n      return;\n    }\n\n    const breadcrumb = {\n      category: 'console',\n      data: {\n        arguments: handlerData.args,\n        logger: 'console',\n      },\n      level: severityLevelFromString(handlerData.level),\n      message: safeJoin(handlerData.args, ' '),\n    };\n\n    if (handlerData.level === 'assert') {\n      if (handlerData.args[0] === false) {\n        breadcrumb.message = `Assertion failed: ${safeJoin(handlerData.args.slice(1), ' ') || 'console.assert'}`;\n        breadcrumb.data.arguments = handlerData.args.slice(1);\n      } else {\n        // Don't capture a breadcrumb for passed assertions\n        return;\n      }\n    }\n\n    addBreadcrumb(breadcrumb, {\n      input: handlerData.args,\n      level: handlerData.level,\n    });\n  };\n}\n\n/**\n * Creates breadcrumbs from XHR API calls\n */\nfunction _getXhrBreadcrumbHandler(client: Client): (handlerData: HandlerDataXhr) => void {\n  return function _xhrBreadcrumb(handlerData: HandlerDataXhr): void {\n    if (getClient() !== client) {\n      return;\n    }\n\n    const { startTimestamp, endTimestamp } = handlerData;\n\n    const sentryXhrData = handlerData.xhr[SENTRY_XHR_DATA_KEY];\n\n    // We only capture complete, non-sentry requests\n    if (!startTimestamp || !endTimestamp || !sentryXhrData) {\n      return;\n    }\n\n    const { method, url, status_code, body } = sentryXhrData;\n\n    const data: XhrBreadcrumbData = {\n      method,\n      url,\n      status_code,\n    };\n\n    const hint: XhrBreadcrumbHint = {\n      xhr: handlerData.xhr,\n      input: body,\n      startTimestamp,\n      endTimestamp,\n    };\n\n    const level = getBreadcrumbLogLevelFromHttpStatusCode(status_code);\n\n    addBreadcrumb(\n      {\n        category: 'xhr',\n        data,\n        type: 'http',\n        level,\n      },\n      hint,\n    );\n  };\n}\n\n/**\n * Creates breadcrumbs from fetch API calls\n */\nfunction _getFetchBreadcrumbHandler(client: Client): (handlerData: HandlerDataFetch) => void {\n  return function _fetchBreadcrumb(handlerData: HandlerDataFetch): void {\n    if (getClient() !== client) {\n      return;\n    }\n\n    const { startTimestamp, endTimestamp } = handlerData;\n\n    // We only capture complete fetch requests\n    if (!endTimestamp) {\n      return;\n    }\n\n    if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n      // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n      return;\n    }\n\n    if (handlerData.error) {\n      const data: FetchBreadcrumbData = handlerData.fetchData;\n      const hint: FetchBreadcrumbHint = {\n        data: handlerData.error,\n        input: handlerData.args,\n        startTimestamp,\n        endTimestamp,\n      };\n\n      addBreadcrumb(\n        {\n          category: 'fetch',\n          data,\n          level: 'error',\n          type: 'http',\n        },\n        hint,\n      );\n    } else {\n      const response = handlerData.response as Response | undefined;\n      const data: FetchBreadcrumbData = {\n        ...handlerData.fetchData,\n        status_code: response && response.status,\n      };\n      const hint: FetchBreadcrumbHint = {\n        input: handlerData.args,\n        response,\n        startTimestamp,\n        endTimestamp,\n      };\n      const level = getBreadcrumbLogLevelFromHttpStatusCode(data.status_code);\n\n      addBreadcrumb(\n        {\n          category: 'fetch',\n          data,\n          type: 'http',\n          level,\n        },\n        hint,\n      );\n    }\n  };\n}\n\n/**\n * Creates breadcrumbs from history API calls\n */\nfunction _getHistoryBreadcrumbHandler(client: Client): (handlerData: HandlerDataHistory) => void {\n  return function _historyBreadcrumb(handlerData: HandlerDataHistory): void {\n    if (getClient() !== client) {\n      return;\n    }\n\n    let from: string | undefined = handlerData.from;\n    let to: string | undefined = handlerData.to;\n    const parsedLoc = parseUrl(WINDOW.location.href);\n    let parsedFrom = from ? parseUrl(from) : undefined;\n    const parsedTo = parseUrl(to);\n\n    // Initial pushState doesn't provide `from` information\n    if (!parsedFrom || !parsedFrom.path) {\n      parsedFrom = parsedLoc;\n    }\n\n    // Use only the path component of the URL if the URL matches the current\n    // document (almost all the time when using pushState)\n    if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n      to = parsedTo.relative;\n    }\n    if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n      from = parsedFrom.relative;\n    }\n\n    addBreadcrumb({\n      category: 'navigation',\n      data: {\n        from,\n        to,\n      },\n    });\n  };\n}\n\nfunction _isEvent(event: unknown): event is Event {\n  return !!event && !!(event as Record<string, unknown>).target;\n}\n","import type { IntegrationFn, WrappedFunction } from '@sentry/core';\nimport { defineIntegration, fill, getFunctionName, getOriginalFunction } from '@sentry/core';\n\nimport { WINDOW, wrap } from '../helpers';\n\nconst DEFAULT_EVENT_TARGET = [\n  'EventTarget',\n  'Window',\n  'Node',\n  'ApplicationCache',\n  'AudioTrackList',\n  'BroadcastChannel',\n  'ChannelMergerNode',\n  'CryptoOperation',\n  'EventSource',\n  'FileReader',\n  'HTMLUnknownElement',\n  'IDBDatabase',\n  'IDBRequest',\n  'IDBTransaction',\n  'KeyOperation',\n  'MediaController',\n  'MessagePort',\n  'ModalWindow',\n  'Notification',\n  'SVGElementInstance',\n  'Screen',\n  'SharedWorker',\n  'TextTrack',\n  'TextTrackCue',\n  'TextTrackList',\n  'WebSocket',\n  'WebSocketWorker',\n  'Worker',\n  'XMLHttpRequest',\n  'XMLHttpRequestEventTarget',\n  'XMLHttpRequestUpload',\n];\n\nconst INTEGRATION_NAME = 'BrowserApiErrors';\n\ntype XMLHttpRequestProp = 'onload' | 'onerror' | 'onprogress' | 'onreadystatechange';\n\ninterface BrowserApiErrorsOptions {\n  setTimeout: boolean;\n  setInterval: boolean;\n  requestAnimationFrame: boolean;\n  XMLHttpRequest: boolean;\n  eventTarget: boolean | string[];\n}\n\nconst _browserApiErrorsIntegration = ((options: Partial<BrowserApiErrorsOptions> = {}) => {\n  const _options = {\n    XMLHttpRequest: true,\n    eventTarget: true,\n    requestAnimationFrame: true,\n    setInterval: true,\n    setTimeout: true,\n    ...options,\n  };\n\n  return {\n    name: INTEGRATION_NAME,\n    // TODO: This currently only works for the first client this is setup\n    // We may want to adjust this to check for client etc.\n    setupOnce() {\n      if (_options.setTimeout) {\n        fill(WINDOW, 'setTimeout', _wrapTimeFunction);\n      }\n\n      if (_options.setInterval) {\n        fill(WINDOW, 'setInterval', _wrapTimeFunction);\n      }\n\n      if (_options.requestAnimationFrame) {\n        fill(WINDOW, 'requestAnimationFrame', _wrapRAF);\n      }\n\n      if (_options.XMLHttpRequest && 'XMLHttpRequest' in WINDOW) {\n        fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n      }\n\n      const eventTargetOption = _options.eventTarget;\n      if (eventTargetOption) {\n        const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n        eventTarget.forEach(_wrapEventTarget);\n      }\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Wrap timer functions and event targets to catch errors and provide better meta data.\n */\nexport const browserApiErrorsIntegration = defineIntegration(_browserApiErrorsIntegration);\n\nfunction _wrapTimeFunction(original: () => void): () => number {\n  return function (this: unknown, ...args: unknown[]): number {\n    const originalCallback = args[0];\n    args[0] = wrap(originalCallback, {\n      mechanism: {\n        data: { function: getFunctionName(original) },\n        handled: false,\n        type: 'instrument',\n      },\n    });\n    return original.apply(this, args);\n  };\n}\n\nfunction _wrapRAF(original: () => void): (callback: () => void) => unknown {\n  return function (this: unknown, callback: () => void): () => void {\n    return original.apply(this, [\n      wrap(callback, {\n        mechanism: {\n          data: {\n            function: 'requestAnimationFrame',\n            handler: getFunctionName(original),\n          },\n          handled: false,\n          type: 'instrument',\n        },\n      }),\n    ]);\n  };\n}\n\nfunction _wrapXHR(originalSend: () => void): () => void {\n  return function (this: XMLHttpRequest, ...args: unknown[]): void {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const xhr = this;\n    const xmlHttpRequestProps: XMLHttpRequestProp[] = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n    xmlHttpRequestProps.forEach(prop => {\n      if (prop in xhr && typeof xhr[prop] === 'function') {\n        fill(xhr, prop, function (original) {\n          const wrapOptions = {\n            mechanism: {\n              data: {\n                function: prop,\n                handler: getFunctionName(original),\n              },\n              handled: false,\n              type: 'instrument',\n            },\n          };\n\n          // If Instrument integration has been called before BrowserApiErrors, get the name of original function\n          const originalFunction = getOriginalFunction(original);\n          if (originalFunction) {\n            wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n          }\n\n          // Otherwise wrap directly\n          return wrap(original, wrapOptions);\n        });\n      }\n    });\n\n    return originalSend.apply(this, args);\n  };\n}\n\nfunction _wrapEventTarget(target: string): void {\n  const globalObject = WINDOW as unknown as Record<string, { prototype?: object }>;\n  const targetObj = globalObject[target];\n  const proto = targetObj && targetObj.prototype;\n\n  // eslint-disable-next-line no-prototype-builtins\n  if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n    return;\n  }\n\n  fill(proto, 'addEventListener', function (original: VoidFunction): (\n    ...args: Parameters<typeof WINDOW.addEventListener>\n  ) => ReturnType<typeof WINDOW.addEventListener> {\n    return function (this: unknown, eventName, fn, options): VoidFunction {\n      try {\n        if (isEventListenerObject(fn)) {\n          // ESlint disable explanation:\n          //  First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would\n          //  introduce a bug here, because bind returns a new function that doesn't have our\n          //  flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping.\n          //  Without those flags, every call to addEventListener wraps the function again, causing a memory leak.\n          // eslint-disable-next-line @typescript-eslint/unbound-method\n          fn.handleEvent = wrap(fn.handleEvent, {\n            mechanism: {\n              data: {\n                function: 'handleEvent',\n                handler: getFunctionName(fn),\n                target,\n              },\n              handled: false,\n              type: 'instrument',\n            },\n          });\n        }\n      } catch {\n        // can sometimes get 'Permission denied to access property \"handle Event'\n      }\n\n      return original.apply(this, [\n        eventName,\n        wrap(fn, {\n          mechanism: {\n            data: {\n              function: 'addEventListener',\n              handler: getFunctionName(fn),\n              target,\n            },\n            handled: false,\n            type: 'instrument',\n          },\n        }),\n        options,\n      ]);\n    };\n  });\n\n  fill(proto, 'removeEventListener', function (originalRemoveEventListener: VoidFunction): (\n    this: unknown,\n    ...args: Parameters<typeof WINDOW.removeEventListener>\n  ) => ReturnType<typeof WINDOW.removeEventListener> {\n    return function (this: unknown, eventName, fn, options): VoidFunction {\n      /**\n       * There are 2 possible scenarios here:\n       *\n       * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n       * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n       * as a pass-through, and call original `removeEventListener` with it.\n       *\n       * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n       * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n       * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n       * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n       * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n       *\n       * When someone adds a handler prior to initialization, and then do it again, but after,\n       * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n       * to get rid of the initial handler and it'd stick there forever.\n       */\n      try {\n        const originalEventHandler = (fn as WrappedFunction).__sentry_wrapped__;\n        if (originalEventHandler) {\n          originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n        }\n      } catch (e) {\n        // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n      }\n      return originalRemoveEventListener.call(this, eventName, fn, options);\n    };\n  });\n}\n\nfunction isEventListenerObject(obj: unknown): obj is EventListenerObject {\n  return typeof (obj as EventListenerObject).handleEvent === 'function';\n}\n","import { addHistoryInstrumentationHandler } from '@sentry-internal/browser-utils';\nimport { captureSession, defineIntegration, logger, startSession } from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\n\n/**\n * When added, automatically creates sessions which allow you to track adoption and crashes (crash free rate) in your Releases in Sentry.\n * More information: https://docs.sentry.io/product/releases/health/\n *\n * Note: In order for session tracking to work, you need to set up Releases: https://docs.sentry.io/product/releases/\n */\nexport const browserSessionIntegration = defineIntegration(() => {\n  return {\n    name: 'BrowserSession',\n    setupOnce() {\n      if (typeof WINDOW.document === 'undefined') {\n        DEBUG_BUILD &&\n          logger.warn('Using the `browserSessionIntegration` in non-browser environments is not supported.');\n        return;\n      }\n\n      // The session duration for browser sessions does not track a meaningful\n      // concept that can be used as a metric.\n      // Automatically captured sessions are akin to page views, and thus we\n      // discard their duration.\n      startSession({ ignoreDuration: true });\n      captureSession();\n\n      // We want to create a session for every navigation as well\n      addHistoryInstrumentationHandler(({ from, to }) => {\n        // Don't create an additional session for the initial route or if the location did not change\n        if (from !== undefined && from !== to) {\n          startSession({ ignoreDuration: true });\n          captureSession();\n        }\n      });\n    },\n  };\n});\n","import type { Event, IntegrationFn, StackFrame } from '@sentry/core';\nimport { GLOBAL_OBJ, addContextToFrame, defineIntegration, stripUrlQueryAndFragment } from '@sentry/core';\n\nconst WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n\nconst DEFAULT_LINES_OF_CONTEXT = 7;\n\nconst INTEGRATION_NAME = 'ContextLines';\n\ninterface ContextLinesOptions {\n  /**\n   * Sets the number of context lines for each frame when loading a file.\n   * Defaults to 7.\n   *\n   * Set to 0 to disable loading and inclusion of source files.\n   **/\n  frameContextLines?: number;\n}\n\nconst _contextLinesIntegration = ((options: ContextLinesOptions = {}) => {\n  const contextLines = options.frameContextLines != null ? options.frameContextLines : DEFAULT_LINES_OF_CONTEXT;\n\n  return {\n    name: INTEGRATION_NAME,\n    processEvent(event) {\n      return addSourceContext(event, contextLines);\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Collects source context lines around the lines of stackframes pointing to JS embedded in\n * the current page's HTML.\n *\n * This integration DOES NOT work for stack frames pointing to JS files that are loaded by the browser.\n * For frames pointing to files, context lines are added during ingestion and symbolication\n * by attempting to download the JS files to the Sentry backend.\n *\n * Use this integration if you have inline JS code in HTML pages that can't be accessed\n * by our backend (e.g. due to a login-protected page).\n */\nexport const contextLinesIntegration = defineIntegration(_contextLinesIntegration);\n\n/**\n * Processes an event and adds context lines.\n */\nfunction addSourceContext(event: Event, contextLines: number): Event {\n  const doc = WINDOW.document;\n  const htmlFilename = WINDOW.location && stripUrlQueryAndFragment(WINDOW.location.href);\n  if (!doc || !htmlFilename) {\n    return event;\n  }\n\n  const exceptions = event.exception && event.exception.values;\n  if (!exceptions || !exceptions.length) {\n    return event;\n  }\n\n  const html = doc.documentElement.innerHTML;\n  if (!html) {\n    return event;\n  }\n\n  const htmlLines = ['<!DOCTYPE html>', '<html>', ...html.split('\\n'), '</html>'];\n\n  exceptions.forEach(exception => {\n    const stacktrace = exception.stacktrace;\n    if (stacktrace && stacktrace.frames) {\n      stacktrace.frames = stacktrace.frames.map(frame =>\n        applySourceContextToFrame(frame, htmlLines, htmlFilename, contextLines),\n      );\n    }\n  });\n\n  return event;\n}\n\n/**\n * Only exported for testing\n */\nexport function applySourceContextToFrame(\n  frame: StackFrame,\n  htmlLines: string[],\n  htmlFilename: string,\n  linesOfContext: number,\n): StackFrame {\n  if (frame.filename !== htmlFilename || !frame.lineno || !htmlLines.length) {\n    return frame;\n  }\n\n  addContextToFrame(htmlLines, frame, linesOfContext);\n\n  return frame;\n}\n","import type { Client, Event, EventHint, Integration, IntegrationFn } from '@sentry/core';\n\nimport { defineIntegration } from '@sentry/core';\nimport { copyFlagsFromScopeToEvent, insertFlagToScope } from '../../utils/featureFlags';\n\nexport interface FeatureFlagsIntegration extends Integration {\n  addFeatureFlag: (name: string, value: unknown) => void;\n}\n\n/**\n * Sentry integration for buffering feature flags manually with an API, and\n * capturing them on error events. We recommend you do this on each flag\n * evaluation. Flags are buffered per Sentry scope and limited to 100 per event.\n *\n * See the [feature flag documentation](https://develop.sentry.dev/sdk/expected-features/#feature-flags) for more information.\n *\n * @example\n * ```\n * import * as Sentry from '@sentry/browser';\n * import { type FeatureFlagsIntegration } from '@sentry/browser';\n *\n * // Setup\n * Sentry.init(..., integrations: [Sentry.featureFlagsIntegration()])\n *\n * // Verify\n * const flagsIntegration = Sentry.getClient()?.getIntegrationByName<FeatureFlagsIntegration>('FeatureFlags');\n * if (flagsIntegration) {\n *   flagsIntegration.addFeatureFlag('my-flag', true);\n * } else {\n *   // check your setup\n * }\n * Sentry.captureException(Exception('broke')); // 'my-flag' should be captured to this Sentry event.\n * ```\n */\nexport const featureFlagsIntegration = defineIntegration(() => {\n  return {\n    name: 'FeatureFlags',\n\n    processEvent(event: Event, _hint: EventHint, _client: Client): Event {\n      return copyFlagsFromScopeToEvent(event);\n    },\n\n    addFeatureFlag(name: string, value: unknown): void {\n      insertFlagToScope(name, value);\n    },\n  };\n}) as IntegrationFn<FeatureFlagsIntegration>;\n","import type { Client, Event, EventHint, IntegrationFn } from '@sentry/core';\nimport type { LDContext, LDEvaluationDetail, LDInspectionFlagUsedHandler } from './types';\n\nimport { defineIntegration } from '@sentry/core';\nimport { copyFlagsFromScopeToEvent, insertFlagToScope } from '../../../utils/featureFlags';\n\n/**\n * Sentry integration for capturing feature flags from LaunchDarkly.\n *\n * See the [feature flag documentation](https://develop.sentry.dev/sdk/expected-features/#feature-flags) for more information.\n *\n * @example\n * ```\n * import * as Sentry from '@sentry/browser';\n * import {launchDarklyIntegration, buildLaunchDarklyFlagUsedInspector} from '@sentry/browser';\n * import * as LaunchDarkly from 'launchdarkly-js-client-sdk';\n *\n * Sentry.init(..., integrations: [launchDarklyIntegration()])\n * const ldClient = LaunchDarkly.initialize(..., {inspectors: [buildLaunchDarklyFlagUsedHandler()]});\n * ```\n */\nexport const launchDarklyIntegration = defineIntegration(() => {\n  return {\n    name: 'LaunchDarkly',\n\n    processEvent(event: Event, _hint: EventHint, _client: Client): Event {\n      return copyFlagsFromScopeToEvent(event);\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * LaunchDarkly hook that listens for flag evaluations and updates the `flags`\n * context in our Sentry scope. This needs to be registered as an\n * 'inspector' in LaunchDarkly initialize() options, separately from\n * `launchDarklyIntegration`. Both are needed to collect feature flags on error.\n */\nexport function buildLaunchDarklyFlagUsedHandler(): LDInspectionFlagUsedHandler {\n  return {\n    name: 'sentry-flag-auditor',\n    type: 'flag-used',\n\n    synchronous: true,\n\n    /**\n     * Handle a flag evaluation by storing its name and value on the current scope.\n     */\n    method: (flagKey: string, flagDetail: LDEvaluationDetail, _context: LDContext) => {\n      insertFlagToScope(flagKey, flagDetail.value);\n    },\n  };\n}\n","/**\n * OpenFeature integration.\n *\n * Add the openFeatureIntegration() function call to your integration lists.\n * Add the integration hook to your OpenFeature object.\n *   - OpenFeature.getClient().addHooks(new OpenFeatureIntegrationHook());\n */\nimport type { Client, Event, EventHint, IntegrationFn } from '@sentry/core';\nimport type { EvaluationDetails, HookContext, HookHints, JsonValue, OpenFeatureHook } from './types';\n\nimport { defineIntegration } from '@sentry/core';\nimport { copyFlagsFromScopeToEvent, insertFlagToScope } from '../../../utils/featureFlags';\n\nexport const openFeatureIntegration = defineIntegration(() => {\n  return {\n    name: 'OpenFeature',\n\n    processEvent(event: Event, _hint: EventHint, _client: Client): Event {\n      return copyFlagsFromScopeToEvent(event);\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * OpenFeature Hook class implementation.\n */\nexport class OpenFeatureIntegrationHook implements OpenFeatureHook {\n  /**\n   * Successful evaluation result.\n   */\n  public after(_hookContext: Readonly<HookContext<JsonValue>>, evaluationDetails: EvaluationDetails<JsonValue>): void {\n    insertFlagToScope(evaluationDetails.flagKey, evaluationDetails.value);\n  }\n\n  /**\n   * On error evaluation result.\n   */\n  public error(hookContext: Readonly<HookContext<JsonValue>>, _error: unknown, _hookHints?: HookHints): void {\n    insertFlagToScope(hookContext.flagKey, hookContext.defaultValue);\n  }\n}\n","import type { Client, Event, IntegrationFn, Primitive, StackParser } from '@sentry/core';\nimport {\n  UNKNOWN_FUNCTION,\n  addGlobalErrorInstrumentationHandler,\n  addGlobalUnhandledRejectionInstrumentationHandler,\n  captureEvent,\n  defineIntegration,\n  getClient,\n  getLocationHref,\n  isPrimitive,\n  isString,\n  logger,\n} from '@sentry/core';\n\nimport type { BrowserClient } from '../client';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { eventFromUnknownInput } from '../eventbuilder';\nimport { shouldIgnoreOnError } from '../helpers';\n\ntype GlobalHandlersIntegrationsOptionKeys = 'onerror' | 'onunhandledrejection';\n\ntype GlobalHandlersIntegrations = Record<GlobalHandlersIntegrationsOptionKeys, boolean>;\n\nconst INTEGRATION_NAME = 'GlobalHandlers';\n\nconst _globalHandlersIntegration = ((options: Partial<GlobalHandlersIntegrations> = {}) => {\n  const _options = {\n    onerror: true,\n    onunhandledrejection: true,\n    ...options,\n  };\n\n  return {\n    name: INTEGRATION_NAME,\n    setupOnce() {\n      Error.stackTraceLimit = 50;\n    },\n    setup(client) {\n      if (_options.onerror) {\n        _installGlobalOnErrorHandler(client);\n        globalHandlerLog('onerror');\n      }\n      if (_options.onunhandledrejection) {\n        _installGlobalOnUnhandledRejectionHandler(client);\n        globalHandlerLog('onunhandledrejection');\n      }\n    },\n  };\n}) satisfies IntegrationFn;\n\nexport const globalHandlersIntegration = defineIntegration(_globalHandlersIntegration);\n\nfunction _installGlobalOnErrorHandler(client: Client): void {\n  addGlobalErrorInstrumentationHandler(data => {\n    const { stackParser, attachStacktrace } = getOptions();\n\n    if (getClient() !== client || shouldIgnoreOnError()) {\n      return;\n    }\n\n    const { msg, url, line, column, error } = data;\n\n    const event = _enhanceEventWithInitialFrame(\n      eventFromUnknownInput(stackParser, error || msg, undefined, attachStacktrace, false),\n      url,\n      line,\n      column,\n    );\n\n    event.level = 'error';\n\n    captureEvent(event, {\n      originalException: error,\n      mechanism: {\n        handled: false,\n        type: 'onerror',\n      },\n    });\n  });\n}\n\nfunction _installGlobalOnUnhandledRejectionHandler(client: Client): void {\n  addGlobalUnhandledRejectionInstrumentationHandler(e => {\n    const { stackParser, attachStacktrace } = getOptions();\n\n    if (getClient() !== client || shouldIgnoreOnError()) {\n      return;\n    }\n\n    const error = _getUnhandledRejectionError(e as unknown);\n\n    const event = isPrimitive(error)\n      ? _eventFromRejectionWithPrimitive(error)\n      : eventFromUnknownInput(stackParser, error, undefined, attachStacktrace, true);\n\n    event.level = 'error';\n\n    captureEvent(event, {\n      originalException: error,\n      mechanism: {\n        handled: false,\n        type: 'onunhandledrejection',\n      },\n    });\n  });\n}\n\nfunction _getUnhandledRejectionError(error: unknown): unknown {\n  if (isPrimitive(error)) {\n    return error;\n  }\n\n  // dig the object of the rejection out of known event types\n  try {\n    type ErrorWithReason = { reason: unknown };\n    // PromiseRejectionEvents store the object of the rejection under 'reason'\n    // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n    if ('reason' in (error as ErrorWithReason)) {\n      return (error as ErrorWithReason).reason;\n    }\n\n    type CustomEventWithDetail = { detail: { reason: unknown } };\n    // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n    // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n    // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n    // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n    // https://github.com/getsentry/sentry-javascript/issues/2380\n    if ('detail' in (error as CustomEventWithDetail) && 'reason' in (error as CustomEventWithDetail).detail) {\n      return (error as CustomEventWithDetail).detail.reason;\n    }\n  } catch {} // eslint-disable-line no-empty\n\n  return error;\n}\n\n/**\n * Create an event from a promise rejection where the `reason` is a primitive.\n *\n * @param reason: The `reason` property of the promise rejection\n * @returns An Event object with an appropriate `exception` value\n */\nfunction _eventFromRejectionWithPrimitive(reason: Primitive): Event {\n  return {\n    exception: {\n      values: [\n        {\n          type: 'UnhandledRejection',\n          // String() is needed because the Primitive type includes symbols (which can't be automatically stringified)\n          value: `Non-Error promise rejection captured with value: ${String(reason)}`,\n        },\n      ],\n    },\n  };\n}\n\nfunction _enhanceEventWithInitialFrame(\n  event: Event,\n  url: string | undefined,\n  line: number | undefined,\n  column: number | undefined,\n): Event {\n  // event.exception\n  const e = (event.exception = event.exception || {});\n  // event.exception.values\n  const ev = (e.values = e.values || []);\n  // event.exception.values[0]\n  const ev0 = (ev[0] = ev[0] || {});\n  // event.exception.values[0].stacktrace\n  const ev0s = (ev0.stacktrace = ev0.stacktrace || {});\n  // event.exception.values[0].stacktrace.frames\n  const ev0sf = (ev0s.frames = ev0s.frames || []);\n\n  const colno = column;\n  const lineno = line;\n  const filename = isString(url) && url.length > 0 ? url : getLocationHref();\n\n  // event.exception.values[0].stacktrace.frames\n  if (ev0sf.length === 0) {\n    ev0sf.push({\n      colno,\n      filename,\n      function: UNKNOWN_FUNCTION,\n      in_app: true,\n      lineno,\n    });\n  }\n\n  return event;\n}\n\nfunction globalHandlerLog(type: string): void {\n  DEBUG_BUILD && logger.log(`Global Handler attached: ${type}`);\n}\n\nfunction getOptions(): { stackParser: StackParser; attachStacktrace?: boolean } {\n  const client = getClient<BrowserClient>();\n  const options = (client && client.getOptions()) || {\n    stackParser: () => [],\n    attachStacktrace: false,\n  };\n  return options;\n}\n","import { SENTRY_XHR_DATA_KEY, addXhrInstrumentationHandler } from '@sentry-internal/browser-utils';\nimport type { Client, Event as SentryEvent, IntegrationFn, SentryWrappedXMLHttpRequest } from '@sentry/core';\nimport {\n  GLOBAL_OBJ,\n  addExceptionMechanism,\n  addFetchInstrumentationHandler,\n  captureEvent,\n  defineIntegration,\n  getClient,\n  isSentryRequestUrl,\n  logger,\n  supportsNativeFetch,\n} from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\n\nexport type HttpStatusCodeRange = [number, number] | number;\nexport type HttpRequestTarget = string | RegExp;\n\nconst INTEGRATION_NAME = 'HttpClient';\n\ninterface HttpClientOptions {\n  /**\n   * HTTP status codes that should be considered failed.\n   * This array can contain tuples of `[begin, end]` (both inclusive),\n   * single status codes, or a combinations of both\n   *\n   * Example: [[500, 505], 507]\n   * Default: [[500, 599]]\n   */\n  failedRequestStatusCodes: HttpStatusCodeRange[];\n\n  /**\n   * Targets to track for failed requests.\n   * This array can contain strings or regular expressions.\n   *\n   * Example: ['http://localhost', /api\\/.*\\/]\n   * Default: [/.*\\/]\n   */\n  failedRequestTargets: HttpRequestTarget[];\n}\n\nconst _httpClientIntegration = ((options: Partial<HttpClientOptions> = {}) => {\n  const _options: HttpClientOptions = {\n    failedRequestStatusCodes: [[500, 599]],\n    failedRequestTargets: [/.*/],\n    ...options,\n  };\n\n  return {\n    name: INTEGRATION_NAME,\n    setup(client): void {\n      _wrapFetch(client, _options);\n      _wrapXHR(client, _options);\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Create events for failed client side HTTP requests.\n */\nexport const httpClientIntegration = defineIntegration(_httpClientIntegration);\n\n/**\n * Interceptor function for fetch requests\n *\n * @param requestInfo The Fetch API request info\n * @param response The Fetch API response\n * @param requestInit The request init object\n */\nfunction _fetchResponseHandler(\n  options: HttpClientOptions,\n  requestInfo: RequestInfo,\n  response: Response,\n  requestInit?: RequestInit,\n  error?: unknown,\n): void {\n  if (_shouldCaptureResponse(options, response.status, response.url)) {\n    const request = _getRequest(requestInfo, requestInit);\n\n    let requestHeaders, responseHeaders, requestCookies, responseCookies;\n\n    if (_shouldSendDefaultPii()) {\n      [requestHeaders, requestCookies] = _parseCookieHeaders('Cookie', request);\n      [responseHeaders, responseCookies] = _parseCookieHeaders('Set-Cookie', response);\n    }\n\n    const event = _createEvent({\n      url: request.url,\n      method: request.method,\n      status: response.status,\n      requestHeaders,\n      responseHeaders,\n      requestCookies,\n      responseCookies,\n      error,\n    });\n\n    captureEvent(event);\n  }\n}\n\nfunction _parseCookieHeaders(\n  cookieHeader: string,\n  obj: Request | Response,\n): [Record<string, string>, Record<string, string> | undefined] {\n  const headers = _extractFetchHeaders(obj.headers);\n  let cookies;\n\n  try {\n    const cookieString = headers[cookieHeader] || headers[cookieHeader.toLowerCase()] || undefined;\n\n    if (cookieString) {\n      cookies = _parseCookieString(cookieString);\n    }\n  } catch {\n    // ignore it if parsing fails\n  }\n\n  return [headers, cookies];\n}\n\n/**\n * Interceptor function for XHR requests\n *\n * @param xhr The XHR request\n * @param method The HTTP method\n * @param headers The HTTP headers\n */\nfunction _xhrResponseHandler(\n  options: HttpClientOptions,\n  xhr: XMLHttpRequest,\n  method: string,\n  headers: Record<string, string>,\n  error?: unknown,\n): void {\n  if (_shouldCaptureResponse(options, xhr.status, xhr.responseURL)) {\n    let requestHeaders, responseCookies, responseHeaders;\n\n    if (_shouldSendDefaultPii()) {\n      try {\n        const cookieString = xhr.getResponseHeader('Set-Cookie') || xhr.getResponseHeader('set-cookie') || undefined;\n\n        if (cookieString) {\n          responseCookies = _parseCookieString(cookieString);\n        }\n      } catch {\n        // ignore it if parsing fails\n      }\n\n      try {\n        responseHeaders = _getXHRResponseHeaders(xhr);\n      } catch {\n        // ignore it if parsing fails\n      }\n\n      requestHeaders = headers;\n    }\n\n    const event = _createEvent({\n      url: xhr.responseURL,\n      method,\n      status: xhr.status,\n      requestHeaders,\n      // Can't access request cookies from XHR\n      responseHeaders,\n      responseCookies,\n      error,\n    });\n\n    captureEvent(event);\n  }\n}\n\n/**\n * Extracts response size from `Content-Length` header when possible\n *\n * @param headers\n * @returns The response size in bytes or undefined\n */\nfunction _getResponseSizeFromHeaders(headers?: Record<string, string>): number | undefined {\n  if (headers) {\n    const contentLength = headers['Content-Length'] || headers['content-length'];\n\n    if (contentLength) {\n      return parseInt(contentLength, 10);\n    }\n  }\n\n  return undefined;\n}\n\n/**\n * Creates an object containing cookies from the given cookie string\n *\n * @param cookieString The cookie string to parse\n * @returns The parsed cookies\n */\nfunction _parseCookieString(cookieString: string): Record<string, string> {\n  return cookieString.split('; ').reduce((acc: Record<string, string>, cookie: string) => {\n    const [key, value] = cookie.split('=');\n    if (key && value) {\n      acc[key] = value;\n    }\n    return acc;\n  }, {});\n}\n\n/**\n * Extracts the headers as an object from the given Fetch API request or response object\n *\n * @param headers The headers to extract\n * @returns The extracted headers as an object\n */\nfunction _extractFetchHeaders(headers: Headers): Record<string, string> {\n  const result: Record<string, string> = {};\n\n  headers.forEach((value, key) => {\n    result[key] = value;\n  });\n\n  return result;\n}\n\n/**\n * Extracts the response headers as an object from the given XHR object\n *\n * @param xhr The XHR object to extract the response headers from\n * @returns The response headers as an object\n */\nfunction _getXHRResponseHeaders(xhr: XMLHttpRequest): Record<string, string> {\n  const headers = xhr.getAllResponseHeaders();\n\n  if (!headers) {\n    return {};\n  }\n\n  return headers.split('\\r\\n').reduce((acc: Record<string, string>, line: string) => {\n    const [key, value] = line.split(': ');\n    if (key && value) {\n      acc[key] = value;\n    }\n    return acc;\n  }, {});\n}\n\n/**\n * Checks if the given target url is in the given list of targets\n *\n * @param target The target url to check\n * @returns true if the target url is in the given list of targets, false otherwise\n */\nfunction _isInGivenRequestTargets(\n  failedRequestTargets: HttpClientOptions['failedRequestTargets'],\n  target: string,\n): boolean {\n  return failedRequestTargets.some((givenRequestTarget: HttpRequestTarget) => {\n    if (typeof givenRequestTarget === 'string') {\n      return target.includes(givenRequestTarget);\n    }\n\n    return givenRequestTarget.test(target);\n  });\n}\n\n/**\n * Checks if the given status code is in the given range\n *\n * @param status The status code to check\n * @returns true if the status code is in the given range, false otherwise\n */\nfunction _isInGivenStatusRanges(\n  failedRequestStatusCodes: HttpClientOptions['failedRequestStatusCodes'],\n  status: number,\n): boolean {\n  return failedRequestStatusCodes.some((range: HttpStatusCodeRange) => {\n    if (typeof range === 'number') {\n      return range === status;\n    }\n\n    return status >= range[0] && status <= range[1];\n  });\n}\n\n/**\n * Wraps `fetch` function to capture request and response data\n */\nfunction _wrapFetch(client: Client, options: HttpClientOptions): void {\n  if (!supportsNativeFetch()) {\n    return;\n  }\n\n  addFetchInstrumentationHandler(handlerData => {\n    if (getClient() !== client) {\n      return;\n    }\n\n    const { response, args, error, virtualError } = handlerData;\n    const [requestInfo, requestInit] = args as [RequestInfo, RequestInit | undefined];\n\n    if (!response) {\n      return;\n    }\n\n    _fetchResponseHandler(options, requestInfo, response as Response, requestInit, error || virtualError);\n  }, false);\n}\n\n/**\n * Wraps XMLHttpRequest to capture request and response data\n */\nfunction _wrapXHR(client: Client, options: HttpClientOptions): void {\n  if (!('XMLHttpRequest' in GLOBAL_OBJ)) {\n    return;\n  }\n\n  addXhrInstrumentationHandler(handlerData => {\n    if (getClient() !== client) {\n      return;\n    }\n\n    const { error, virtualError } = handlerData;\n\n    const xhr = handlerData.xhr as SentryWrappedXMLHttpRequest & XMLHttpRequest;\n\n    const sentryXhrData = xhr[SENTRY_XHR_DATA_KEY];\n\n    if (!sentryXhrData) {\n      return;\n    }\n\n    const { method, request_headers: headers } = sentryXhrData;\n\n    try {\n      _xhrResponseHandler(options, xhr, method, headers, error || virtualError);\n    } catch (e) {\n      DEBUG_BUILD && logger.warn('Error while extracting response event form XHR response', e);\n    }\n  });\n}\n\n/**\n * Checks whether to capture given response as an event\n *\n * @param status response status code\n * @param url response url\n */\nfunction _shouldCaptureResponse(options: HttpClientOptions, status: number, url: string): boolean {\n  return (\n    _isInGivenStatusRanges(options.failedRequestStatusCodes, status) &&\n    _isInGivenRequestTargets(options.failedRequestTargets, url) &&\n    !isSentryRequestUrl(url, getClient())\n  );\n}\n\n/**\n * Creates a synthetic Sentry event from given response data\n *\n * @param data response data\n * @returns event\n */\nfunction _createEvent(data: {\n  url: string;\n  method: string;\n  status: number;\n  responseHeaders?: Record<string, string>;\n  responseCookies?: Record<string, string>;\n  requestHeaders?: Record<string, string>;\n  requestCookies?: Record<string, string>;\n  error?: unknown;\n}): SentryEvent {\n  const client = getClient();\n  const virtualStackTrace = client && data.error && data.error instanceof Error ? data.error.stack : undefined;\n  // Remove the first frame from the stack as it's the HttpClient call\n  const stack = virtualStackTrace && client ? client.getOptions().stackParser(virtualStackTrace, 0, 1) : undefined;\n  const message = `HTTP Client Error with status code: ${data.status}`;\n\n  const event: SentryEvent = {\n    message,\n    exception: {\n      values: [\n        {\n          type: 'Error',\n          value: message,\n          stacktrace: stack ? { frames: stack } : undefined,\n        },\n      ],\n    },\n    request: {\n      url: data.url,\n      method: data.method,\n      headers: data.requestHeaders,\n      cookies: data.requestCookies,\n    },\n    contexts: {\n      response: {\n        status_code: data.status,\n        headers: data.responseHeaders,\n        cookies: data.responseCookies,\n        body_size: _getResponseSizeFromHeaders(data.responseHeaders),\n      },\n    },\n  };\n\n  addExceptionMechanism(event, {\n    type: 'http.client',\n    handled: false,\n  });\n\n  return event;\n}\n\nfunction _getRequest(requestInfo: RequestInfo, requestInit?: RequestInit): Request {\n  if (!requestInit && requestInfo instanceof Request) {\n    return requestInfo;\n  }\n\n  // If both are set, we try to construct a new Request with the given arguments\n  // However, if e.g. the original request has a `body`, this will throw an error because it was already accessed\n  // In this case, as a fallback, we just use the original request - using both is rather an edge case\n  if (requestInfo instanceof Request && requestInfo.bodyUsed) {\n    return requestInfo;\n  }\n\n  return new Request(requestInfo, requestInit);\n}\n\nfunction _shouldSendDefaultPii(): boolean {\n  const client = getClient();\n  return client ? Boolean(client.getOptions().sendDefaultPii) : false;\n}\n","import { defineIntegration } from '@sentry/core';\nimport { WINDOW } from '../helpers';\n\n/**\n * Collects information about HTTP request headers and\n * attaches them to the event.\n */\nexport const httpContextIntegration = defineIntegration(() => {\n  return {\n    name: 'HttpContext',\n    preprocessEvent(event) {\n      // if none of the information we want exists, don't bother\n      if (!WINDOW.navigator && !WINDOW.location && !WINDOW.document) {\n        return;\n      }\n\n      // grab as much info as exists and add it to the event\n      const url = (event.request && event.request.url) || (WINDOW.location && WINDOW.location.href);\n      const { referrer } = WINDOW.document || {};\n      const { userAgent } = WINDOW.navigator || {};\n\n      const headers = {\n        ...(event.request && event.request.headers),\n        ...(referrer && { Referer: referrer }),\n        ...(userAgent && { 'User-Agent': userAgent }),\n      };\n      const request = { ...event.request, ...(url && { url }), headers };\n\n      event.request = request;\n    },\n  };\n});\n","import type { IntegrationFn } from '@sentry/core';\nimport { applyAggregateErrorsToEvent, defineIntegration } from '@sentry/core';\nimport { exceptionFromError } from '../eventbuilder';\n\ninterface LinkedErrorsOptions {\n  key?: string;\n  limit?: number;\n}\n\nconst DEFAULT_KEY = 'cause';\nconst DEFAULT_LIMIT = 5;\n\nconst INTEGRATION_NAME = 'LinkedErrors';\n\nconst _linkedErrorsIntegration = ((options: LinkedErrorsOptions = {}) => {\n  const limit = options.limit || DEFAULT_LIMIT;\n  const key = options.key || DEFAULT_KEY;\n\n  return {\n    name: INTEGRATION_NAME,\n    preprocessEvent(event, hint, client) {\n      const options = client.getOptions();\n\n      applyAggregateErrorsToEvent(\n        // This differs from the LinkedErrors integration in core by using a different exceptionFromError function\n        exceptionFromError,\n        options.stackParser,\n        options.maxValueLength,\n        key,\n        limit,\n        event,\n        hint,\n      );\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Aggregrate linked errors in an event.\n */\nexport const linkedErrorsIntegration = defineIntegration(_linkedErrorsIntegration);\n","import type { Client, IntegrationFn } from '@sentry/core';\nimport {\n  GLOBAL_OBJ,\n  captureMessage,\n  defineIntegration,\n  getClient,\n  supportsReportingObserver,\n  withScope,\n} from '@sentry/core';\n\nconst WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n\nconst INTEGRATION_NAME = 'ReportingObserver';\n\ninterface Report {\n  [key: string]: unknown;\n  type: ReportTypes;\n  url: string;\n  body?: ReportBody;\n}\n\ntype ReportTypes = 'crash' | 'deprecation' | 'intervention';\n\ntype ReportBody = CrashReportBody | DeprecationReportBody | InterventionReportBody;\n\ninterface CrashReportBody {\n  [key: string]: unknown;\n  crashId: string;\n  reason?: string;\n}\n\ninterface DeprecationReportBody {\n  [key: string]: unknown;\n  id: string;\n  anticipatedRemoval?: Date;\n  message: string;\n  sourceFile?: string;\n  lineNumber?: number;\n  columnNumber?: number;\n}\n\ninterface InterventionReportBody {\n  [key: string]: unknown;\n  id: string;\n  message: string;\n  sourceFile?: string;\n  lineNumber?: number;\n  columnNumber?: number;\n}\n\ninterface ReportingObserverOptions {\n  types?: ReportTypes[];\n}\n\n/** This is experimental and the types are not included with TypeScript, sadly. */\ninterface ReportingObserverClass {\n  new (\n    handler: (reports: Report[]) => void,\n    options: { buffered?: boolean; types?: ReportTypes[] },\n  ): {\n    observe: () => void;\n  };\n}\n\nconst SETUP_CLIENTS = new WeakMap<Client, boolean>();\n\nconst _reportingObserverIntegration = ((options: ReportingObserverOptions = {}) => {\n  const types = options.types || ['crash', 'deprecation', 'intervention'];\n\n  /** Handler for the reporting observer. */\n  function handler(reports: Report[]): void {\n    if (!SETUP_CLIENTS.has(getClient() as Client)) {\n      return;\n    }\n\n    for (const report of reports) {\n      withScope(scope => {\n        scope.setExtra('url', report.url);\n\n        const label = `ReportingObserver [${report.type}]`;\n        let details = 'No details available';\n\n        if (report.body) {\n          // Object.keys doesn't work on ReportBody, as all properties are inherited\n          const plainBody: {\n            [key: string]: unknown;\n          } = {};\n\n          // eslint-disable-next-line guard-for-in\n          for (const prop in report.body) {\n            plainBody[prop] = report.body[prop];\n          }\n\n          scope.setExtra('body', plainBody);\n\n          if (report.type === 'crash') {\n            const body = report.body as CrashReportBody;\n            // A fancy way to create a message out of crashId OR reason OR both OR fallback\n            details = [body.crashId || '', body.reason || ''].join(' ').trim() || details;\n          } else {\n            const body = report.body as DeprecationReportBody | InterventionReportBody;\n            details = body.message || details;\n          }\n        }\n\n        captureMessage(`${label}: ${details}`);\n      });\n    }\n  }\n\n  return {\n    name: INTEGRATION_NAME,\n    setupOnce() {\n      if (!supportsReportingObserver()) {\n        return;\n      }\n\n      const observer = new (WINDOW as typeof WINDOW & { ReportingObserver: ReportingObserverClass }).ReportingObserver(\n        handler,\n        {\n          buffered: true,\n          types,\n        },\n      );\n\n      observer.observe();\n    },\n\n    setup(client): void {\n      SETUP_CLIENTS.set(client, true);\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Reporting API integration - https://w3c.github.io/reporting/\n */\nexport const reportingObserverIntegration = defineIntegration(_reportingObserverIntegration);\n","import { getNativeImplementation } from '@sentry-internal/browser-utils';\nimport type { Client, Envelope, Event, IntegrationFn } from '@sentry/core';\nimport { defineIntegration, logger, serializeEnvelope } from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { WINDOW } from '../helpers';\n\nexport type SpotlightConnectionOptions = {\n  /**\n   * Set this if the Spotlight Sidecar is not running on localhost:8969\n   * By default, the Url is set to http://localhost:8969/stream\n   */\n  sidecarUrl?: string;\n};\n\nexport const INTEGRATION_NAME = 'SpotlightBrowser';\n\nconst _spotlightIntegration = ((options: Partial<SpotlightConnectionOptions> = {}) => {\n  const sidecarUrl = options.sidecarUrl || 'http://localhost:8969/stream';\n\n  return {\n    name: INTEGRATION_NAME,\n    setup: () => {\n      DEBUG_BUILD && logger.log('Using Sidecar URL', sidecarUrl);\n    },\n    // We don't want to send interaction transactions/root spans created from\n    // clicks within Spotlight to Sentry. Neither do we want them to be sent to\n    // spotlight.\n    processEvent: event => (isSpotlightInteraction(event) ? null : event),\n    afterAllSetup: (client: Client) => {\n      setupSidecarForwarding(client, sidecarUrl);\n    },\n  };\n}) satisfies IntegrationFn;\n\nfunction setupSidecarForwarding(client: Client, sidecarUrl: string): void {\n  const makeFetch: typeof WINDOW.fetch | undefined = getNativeImplementation('fetch');\n  let failCount = 0;\n\n  client.on('beforeEnvelope', (envelope: Envelope) => {\n    if (failCount > 3) {\n      logger.warn('[Spotlight] Disabled Sentry -> Spotlight integration due to too many failed requests:', failCount);\n      return;\n    }\n\n    makeFetch(sidecarUrl, {\n      method: 'POST',\n      body: serializeEnvelope(envelope),\n      headers: {\n        'Content-Type': 'application/x-sentry-envelope',\n      },\n      mode: 'cors',\n    }).then(\n      res => {\n        if (res.status >= 200 && res.status < 400) {\n          // Reset failed requests counter on success\n          failCount = 0;\n        }\n      },\n      err => {\n        failCount++;\n        logger.error(\n          \"Sentry SDK can't connect to Sidecar is it running? See: https://spotlightjs.com/sidecar/npx/\",\n          err,\n        );\n      },\n    );\n  });\n}\n\n/**\n * Use this integration to send errors and transactions to Spotlight.\n *\n * Learn more about spotlight at https://spotlightjs.com\n */\nexport const spotlightBrowserIntegration = defineIntegration(_spotlightIntegration);\n\n/**\n * Flags if the event is a transaction created from an interaction with the spotlight UI.\n */\nexport function isSpotlightInteraction(event: Event): boolean {\n  return Boolean(\n    event.type === 'transaction' &&\n      event.spans &&\n      event.contexts &&\n      event.contexts.trace &&\n      event.contexts.trace.op === 'ui.action.click' &&\n      event.spans.some(({ description }) => description && description.includes('#sentry-spotlight')),\n  );\n}\n","import { BrowserMetricsAggregator, metrics as metricsCore } from '@sentry/core';\nimport type { DurationUnit, MetricData, Metrics } from '@sentry/core';\n\n/**\n * Adds a value to a counter metric\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction increment(name: string, value: number = 1, data?: MetricData): void {\n  // eslint-disable-next-line deprecation/deprecation\n  metricsCore.increment(BrowserMetricsAggregator, name, value, data);\n}\n\n/**\n * Adds a value to a distribution metric\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction distribution(name: string, value: number, data?: MetricData): void {\n  // eslint-disable-next-line deprecation/deprecation\n  metricsCore.distribution(BrowserMetricsAggregator, name, value, data);\n}\n\n/**\n * Adds a value to a set metric. Value must be a string or integer.\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction set(name: string, value: number | string, data?: MetricData): void {\n  // eslint-disable-next-line deprecation/deprecation\n  metricsCore.set(BrowserMetricsAggregator, name, value, data);\n}\n\n/**\n * Adds a value to a gauge metric\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction gauge(name: string, value: number, data?: MetricData): void {\n  // eslint-disable-next-line deprecation/deprecation\n  metricsCore.gauge(BrowserMetricsAggregator, name, value, data);\n}\n\n/**\n * Adds a timing metric.\n * The metric is added as a distribution metric.\n *\n * You can either directly capture a numeric `value`, or wrap a callback function in `timing`.\n * In the latter case, the duration of the callback execution will be captured as a span & a metric.\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction timing(name: string, value: number, unit?: DurationUnit, data?: Omit<MetricData, 'unit'>): void;\nfunction timing<T>(name: string, callback: () => T, unit?: DurationUnit, data?: Omit<MetricData, 'unit'>): T;\nfunction timing<T = void>(\n  name: string,\n  value: number | (() => T),\n  unit: DurationUnit = 'second',\n  data?: Omit<MetricData, 'unit'>,\n): T | void {\n  // eslint-disable-next-line deprecation/deprecation\n  return metricsCore.timing(BrowserMetricsAggregator, name, value, unit, data);\n}\n\n/**\n * The metrics API is used to capture custom metrics in Sentry.\n *\n * @deprecated The Sentry metrics beta has ended. This export will be removed in a future release.\n */\nexport const metrics: Metrics = {\n  increment,\n  distribution,\n  set,\n  gauge,\n  timing,\n};\n","import { defineIntegration, getActiveSpan, getRootSpan } from '@sentry/core';\nimport { logger } from '@sentry/core';\nimport type { EventEnvelope, IntegrationFn, Profile, Span } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { startProfileForSpan } from './startProfileForSpan';\nimport type { ProfiledEvent } from './utils';\nimport { isAutomatedPageLoadSpan, shouldProfileSpan } from './utils';\nimport {\n  addProfilesToEnvelope,\n  createProfilingEvent,\n  findProfiledTransactionsFromEnvelope,\n  getActiveProfilesCount,\n  takeProfileFromGlobalCache,\n} from './utils';\n\nconst INTEGRATION_NAME = 'BrowserProfiling';\n\nconst _browserProfilingIntegration = (() => {\n  return {\n    name: INTEGRATION_NAME,\n    setup(client) {\n      const activeSpan = getActiveSpan();\n      const rootSpan = activeSpan && getRootSpan(activeSpan);\n\n      if (rootSpan && isAutomatedPageLoadSpan(rootSpan)) {\n        if (shouldProfileSpan(rootSpan)) {\n          startProfileForSpan(rootSpan);\n        }\n      }\n\n      client.on('spanStart', (span: Span) => {\n        if (span === getRootSpan(span) && shouldProfileSpan(span)) {\n          startProfileForSpan(span);\n        }\n      });\n\n      client.on('beforeEnvelope', (envelope): void => {\n        // if not profiles are in queue, there is nothing to add to the envelope.\n        if (!getActiveProfilesCount()) {\n          return;\n        }\n\n        const profiledTransactionEvents = findProfiledTransactionsFromEnvelope(envelope);\n        if (!profiledTransactionEvents.length) {\n          return;\n        }\n\n        const profilesToAddToEnvelope: Profile[] = [];\n\n        for (const profiledTransaction of profiledTransactionEvents) {\n          const context = profiledTransaction && profiledTransaction.contexts;\n          const profile_id = context && context['profile'] && context['profile']['profile_id'];\n          const start_timestamp = context && context['profile'] && context['profile']['start_timestamp'];\n\n          if (typeof profile_id !== 'string') {\n            DEBUG_BUILD && logger.log('[Profiling] cannot find profile for a span without a profile context');\n            continue;\n          }\n\n          if (!profile_id) {\n            DEBUG_BUILD && logger.log('[Profiling] cannot find profile for a span without a profile context');\n            continue;\n          }\n\n          // Remove the profile from the span context before sending, relay will take care of the rest.\n          if (context && context['profile']) {\n            delete context.profile;\n          }\n\n          const profile = takeProfileFromGlobalCache(profile_id);\n          if (!profile) {\n            DEBUG_BUILD && logger.log(`[Profiling] Could not retrieve profile for span: ${profile_id}`);\n            continue;\n          }\n\n          const profileEvent = createProfilingEvent(\n            profile_id,\n            start_timestamp as number | undefined,\n            profile,\n            profiledTransaction as ProfiledEvent,\n          );\n          if (profileEvent) {\n            profilesToAddToEnvelope.push(profileEvent);\n          }\n        }\n\n        addProfilesToEnvelope(envelope as EventEnvelope, profilesToAddToEnvelope);\n      });\n    },\n  };\n}) satisfies IntegrationFn;\n\nexport const browserProfilingIntegration = defineIntegration(_browserProfilingIntegration);\n","import { getCurrentScope, spanToJSON } from '@sentry/core';\nimport { logger, timestampInSeconds, uuid4 } from '@sentry/core';\nimport type { Span } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\nimport type { JSSelfProfile } from './jsSelfProfiling';\nimport { MAX_PROFILE_DURATION_MS, addProfileToGlobalCache, isAutomatedPageLoadSpan, startJSSelfProfile } from './utils';\n\n/**\n * Wraps startTransaction and stopTransaction with profiling related logic.\n * startProfileForTransaction is called after the call to startTransaction in order to avoid our own code from\n * being profiled. Because of that same reason, stopProfiling is called before the call to stopTransaction.\n */\nexport function startProfileForSpan(span: Span): void {\n  // Start the profiler and get the profiler instance.\n  let startTimestamp: number | undefined;\n  if (isAutomatedPageLoadSpan(span)) {\n    startTimestamp = timestampInSeconds() * 1000;\n  }\n\n  const profiler = startJSSelfProfile();\n\n  // We failed to construct the profiler, so we skip.\n  // No need to log anything as this has already been logged in startProfile.\n  if (!profiler) {\n    return;\n  }\n\n  if (DEBUG_BUILD) {\n    logger.log(`[Profiling] started profiling span: ${spanToJSON(span).description}`);\n  }\n\n  // We create \"unique\" span names to avoid concurrent spans with same names\n  // from being ignored by the profiler. From here on, only this span name should be used when\n  // calling the profiler methods. Note: we log the original name to the user to avoid confusion.\n  const profileId = uuid4();\n\n  // A couple of important things to note here:\n  // `CpuProfilerBindings.stopProfiling` will be scheduled to run in 30seconds in order to exceed max profile duration.\n  // Whichever of the two (span.finish/timeout) is first to run, the profiling will be stopped and the gathered profile\n  // will be processed when the original span is finished. Since onProfileHandler can be invoked multiple times in the\n  // event of an error or user mistake (calling span.finish multiple times), it is important that the behavior of onProfileHandler\n  // is idempotent as we do not want any timings or profiles to be overridden by the last call to onProfileHandler.\n  // After the original finish method is called, the event will be reported through the integration and delegated to transport.\n  const processedProfile: JSSelfProfile | null = null;\n\n  getCurrentScope().setContext('profile', {\n    profile_id: profileId,\n    start_timestamp: startTimestamp,\n  });\n\n  /**\n   * Idempotent handler for profile stop\n   */\n  async function onProfileHandler(): Promise<void> {\n    // Check if the profile exists and return it the behavior has to be idempotent as users may call span.finish multiple times.\n    if (!span) {\n      return;\n    }\n    // Satisfy the type checker, but profiler will always be defined here.\n    if (!profiler) {\n      return;\n    }\n    if (processedProfile) {\n      if (DEBUG_BUILD) {\n        logger.log('[Profiling] profile for:', spanToJSON(span).description, 'already exists, returning early');\n      }\n      return;\n    }\n\n    return profiler\n      .stop()\n      .then((profile: JSSelfProfile): void => {\n        if (maxDurationTimeoutID) {\n          WINDOW.clearTimeout(maxDurationTimeoutID);\n          maxDurationTimeoutID = undefined;\n        }\n\n        if (DEBUG_BUILD) {\n          logger.log(`[Profiling] stopped profiling of span: ${spanToJSON(span).description}`);\n        }\n\n        // In case of an overlapping span, stopProfiling may return null and silently ignore the overlapping profile.\n        if (!profile) {\n          if (DEBUG_BUILD) {\n            logger.log(\n              `[Profiling] profiler returned null profile for: ${spanToJSON(span).description}`,\n              'this may indicate an overlapping span or a call to stopProfiling with a profile title that was never started',\n            );\n          }\n          return;\n        }\n\n        addProfileToGlobalCache(profileId, profile);\n      })\n      .catch(error => {\n        if (DEBUG_BUILD) {\n          logger.log('[Profiling] error while stopping profiler:', error);\n        }\n      });\n  }\n\n  // Enqueue a timeout to prevent profiles from running over max duration.\n  let maxDurationTimeoutID: number | undefined = WINDOW.setTimeout(() => {\n    if (DEBUG_BUILD) {\n      logger.log('[Profiling] max profile duration elapsed, stopping profiling for:', spanToJSON(span).description);\n    }\n    // If the timeout exceeds, we want to stop profiling, but not finish the span\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    onProfileHandler();\n  }, MAX_PROFILE_DURATION_MS);\n\n  // We need to reference the original end call to avoid creating an infinite loop\n  const originalEnd = span.end.bind(span);\n\n  /**\n   * Wraps span `end()` with profiling related logic.\n   * startProfiling is called after the call to spanStart in order to avoid our own code from\n   * being profiled. Because of that same reason, stopProfiling is called before the call to spanEnd.\n   */\n  function profilingWrappedSpanEnd(): Span {\n    if (!span) {\n      return originalEnd();\n    }\n    // onProfileHandler should always return the same profile even if this is called multiple times.\n    // Always call onProfileHandler to ensure stopProfiling is called and the timeout is cleared.\n    void onProfileHandler().then(\n      () => {\n        originalEnd();\n      },\n      () => {\n        // If onProfileHandler fails, we still want to call the original finish method.\n        originalEnd();\n      },\n    );\n\n    return span;\n  }\n\n  span.end = profilingWrappedSpanEnd;\n}\n","/* eslint-disable max-lines */\nimport type { DebugImage, Envelope, Event, EventEnvelope, Profile, Span, ThreadCpuProfile } from '@sentry/core';\nimport {\n  DEFAULT_ENVIRONMENT,\n  browserPerformanceTimeOrigin,\n  forEachEnvelopeItem,\n  getClient,\n  getDebugImagesForResources,\n  logger,\n  spanToJSON,\n  timestampInSeconds,\n  uuid4,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\nimport type { JSSelfProfile, JSSelfProfileStack, JSSelfProfiler, JSSelfProfilerConstructor } from './jsSelfProfiling';\n\nconst MS_TO_NS = 1e6;\n// Use 0 as main thread id which is identical to threadId in node:worker_threads\n// where main logs 0 and workers seem to log in increments of 1\nconst THREAD_ID_STRING = String(0);\nconst THREAD_NAME = 'main';\n\n// Machine properties (eval only once)\nlet OS_PLATFORM = '';\nlet OS_PLATFORM_VERSION = '';\nlet OS_ARCH = '';\nlet OS_BROWSER = (WINDOW.navigator && WINDOW.navigator.userAgent) || '';\nlet OS_MODEL = '';\nconst OS_LOCALE =\n  (WINDOW.navigator && WINDOW.navigator.language) ||\n  (WINDOW.navigator && WINDOW.navigator.languages && WINDOW.navigator.languages[0]) ||\n  '';\n\ntype UAData = {\n  platform?: string;\n  architecture?: string;\n  model?: string;\n  platformVersion?: string;\n  fullVersionList?: {\n    brand: string;\n    version: string;\n  }[];\n};\n\ninterface UserAgentData {\n  getHighEntropyValues: (keys: string[]) => Promise<UAData>;\n}\n\nfunction isUserAgentData(data: unknown): data is UserAgentData {\n  return typeof data === 'object' && data !== null && 'getHighEntropyValues' in data;\n}\n\n// @ts-expect-error userAgentData is not part of the navigator interface yet\nconst userAgentData = WINDOW.navigator && WINDOW.navigator.userAgentData;\n\nif (isUserAgentData(userAgentData)) {\n  userAgentData\n    .getHighEntropyValues(['architecture', 'model', 'platform', 'platformVersion', 'fullVersionList'])\n    .then((ua: UAData) => {\n      OS_PLATFORM = ua.platform || '';\n      OS_ARCH = ua.architecture || '';\n      OS_MODEL = ua.model || '';\n      OS_PLATFORM_VERSION = ua.platformVersion || '';\n\n      if (ua.fullVersionList && ua.fullVersionList.length > 0) {\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        const firstUa = ua.fullVersionList[ua.fullVersionList.length - 1]!;\n        OS_BROWSER = `${firstUa.brand} ${firstUa.version}`;\n      }\n    })\n    .catch(e => void e);\n}\n\nfunction isProcessedJSSelfProfile(profile: ThreadCpuProfile | JSSelfProfile): profile is JSSelfProfile {\n  return !('thread_metadata' in profile);\n}\n\n// Enriches the profile with threadId of the current thread.\n// This is done in node as we seem to not be able to get the info from C native code.\n/**\n *\n */\nexport function enrichWithThreadInformation(profile: ThreadCpuProfile | JSSelfProfile): ThreadCpuProfile {\n  if (!isProcessedJSSelfProfile(profile)) {\n    return profile;\n  }\n\n  return convertJSSelfProfileToSampledFormat(profile);\n}\n\n// Profile is marked as optional because it is deleted from the metadata\n// by the integration before the event is processed by other integrations.\nexport interface ProfiledEvent extends Event {\n  sdkProcessingMetadata: {\n    profile?: JSSelfProfile;\n  };\n}\n\nfunction getTraceId(event: Event): string {\n  const traceId: unknown = event && event.contexts && event.contexts['trace'] && event.contexts['trace']['trace_id'];\n  // Log a warning if the profile has an invalid traceId (should be uuidv4).\n  // All profiles and transactions are rejected if this is the case and we want to\n  // warn users that this is happening if they enable debug flag\n  if (typeof traceId === 'string' && traceId.length !== 32) {\n    if (DEBUG_BUILD) {\n      logger.log(`[Profiling] Invalid traceId: ${traceId} on profiled event`);\n    }\n  }\n  if (typeof traceId !== 'string') {\n    return '';\n  }\n\n  return traceId;\n}\n/**\n * Creates a profiling event envelope from a Sentry event. If profile does not pass\n * validation, returns null.\n * @param event\n * @param dsn\n * @param metadata\n * @param tunnel\n * @returns {EventEnvelope | null}\n */\n\n/**\n * Creates a profiling event envelope from a Sentry event.\n */\nexport function createProfilePayload(\n  profile_id: string,\n  start_timestamp: number | undefined,\n  processed_profile: JSSelfProfile,\n  event: ProfiledEvent,\n): Profile {\n  if (event.type !== 'transaction') {\n    // createProfilingEventEnvelope should only be called for transactions,\n    // we type guard this behavior with isProfiledTransactionEvent.\n    throw new TypeError('Profiling events may only be attached to transactions, this should never occur.');\n  }\n\n  if (processed_profile === undefined || processed_profile === null) {\n    throw new TypeError(\n      `Cannot construct profiling event envelope without a valid profile. Got ${processed_profile} instead.`,\n    );\n  }\n\n  const traceId = getTraceId(event);\n  const enrichedThreadProfile = enrichWithThreadInformation(processed_profile);\n  const transactionStartMs = start_timestamp\n    ? start_timestamp\n    : typeof event.start_timestamp === 'number'\n      ? event.start_timestamp * 1000\n      : timestampInSeconds() * 1000;\n  const transactionEndMs = typeof event.timestamp === 'number' ? event.timestamp * 1000 : timestampInSeconds() * 1000;\n\n  const profile: Profile = {\n    event_id: profile_id,\n    timestamp: new Date(transactionStartMs).toISOString(),\n    platform: 'javascript',\n    version: '1',\n    release: event.release || '',\n    environment: event.environment || DEFAULT_ENVIRONMENT,\n    runtime: {\n      name: 'javascript',\n      version: WINDOW.navigator.userAgent,\n    },\n    os: {\n      name: OS_PLATFORM,\n      version: OS_PLATFORM_VERSION,\n      build_number: OS_BROWSER,\n    },\n    device: {\n      locale: OS_LOCALE,\n      model: OS_MODEL,\n      manufacturer: OS_BROWSER,\n      architecture: OS_ARCH,\n      is_emulator: false,\n    },\n    debug_meta: {\n      images: applyDebugMetadata(processed_profile.resources),\n    },\n    profile: enrichedThreadProfile,\n    transactions: [\n      {\n        name: event.transaction || '',\n        id: event.event_id || uuid4(),\n        trace_id: traceId,\n        active_thread_id: THREAD_ID_STRING,\n        relative_start_ns: '0',\n        relative_end_ns: ((transactionEndMs - transactionStartMs) * 1e6).toFixed(0),\n      },\n    ],\n  };\n\n  return profile;\n}\n\n/**\n *\n */\nexport function isProfiledTransactionEvent(event: Event): event is ProfiledEvent {\n  return !!(event.sdkProcessingMetadata && event.sdkProcessingMetadata['profile']);\n}\n\n/*\n  See packages/browser-utils/src/browser/router.ts\n*/\n/**\n *\n */\nexport function isAutomatedPageLoadSpan(span: Span): boolean {\n  return spanToJSON(span).op === 'pageload';\n}\n\n/**\n * Converts a JSSelfProfile to a our sampled format.\n * Does not currently perform stack indexing.\n */\nexport function convertJSSelfProfileToSampledFormat(input: JSSelfProfile): Profile['profile'] {\n  let EMPTY_STACK_ID: undefined | number = undefined;\n  let STACK_ID = 0;\n\n  // Initialize the profile that we will fill with data\n  const profile: Profile['profile'] = {\n    samples: [],\n    stacks: [],\n    frames: [],\n    thread_metadata: {\n      [THREAD_ID_STRING]: { name: THREAD_NAME },\n    },\n  };\n\n  const firstSample = input.samples[0];\n  if (!firstSample) {\n    return profile;\n  }\n\n  // We assert samples.length > 0 above and timestamp should always be present\n  const start = firstSample.timestamp;\n  // The JS SDK might change it's time origin based on some heuristic (see See packages/utils/src/time.ts)\n  // when that happens, we need to ensure we are correcting the profile timings so the two timelines stay in sync.\n  // Since JS self profiling time origin is always initialized to performance.timeOrigin, we need to adjust for\n  // the drift between the SDK selected value and our profile time origin.\n  const origin =\n    typeof performance.timeOrigin === 'number' ? performance.timeOrigin : browserPerformanceTimeOrigin || 0;\n  const adjustForOriginChange = origin - (browserPerformanceTimeOrigin || origin);\n\n  input.samples.forEach((jsSample, i) => {\n    // If sample has no stack, add an empty sample\n    if (jsSample.stackId === undefined) {\n      if (EMPTY_STACK_ID === undefined) {\n        EMPTY_STACK_ID = STACK_ID;\n        profile.stacks[EMPTY_STACK_ID] = [];\n        STACK_ID++;\n      }\n\n      profile['samples'][i] = {\n        // convert ms timestamp to ns\n        elapsed_since_start_ns: ((jsSample.timestamp + adjustForOriginChange - start) * MS_TO_NS).toFixed(0),\n        stack_id: EMPTY_STACK_ID,\n        thread_id: THREAD_ID_STRING,\n      };\n      return;\n    }\n\n    let stackTop: JSSelfProfileStack | undefined = input.stacks[jsSample.stackId];\n\n    // Functions in top->down order (root is last)\n    // We follow the stackTop.parentId trail and collect each visited frameId\n    const stack: number[] = [];\n\n    while (stackTop) {\n      stack.push(stackTop.frameId);\n\n      const frame = input.frames[stackTop.frameId];\n\n      // If our frame has not been indexed yet, index it\n      if (frame && profile.frames[stackTop.frameId] === undefined) {\n        profile.frames[stackTop.frameId] = {\n          function: frame.name,\n          abs_path: typeof frame.resourceId === 'number' ? input.resources[frame.resourceId] : undefined,\n          lineno: frame.line,\n          colno: frame.column,\n        };\n      }\n\n      stackTop = stackTop.parentId === undefined ? undefined : input.stacks[stackTop.parentId];\n    }\n\n    const sample: Profile['profile']['samples'][0] = {\n      // convert ms timestamp to ns\n      elapsed_since_start_ns: ((jsSample.timestamp + adjustForOriginChange - start) * MS_TO_NS).toFixed(0),\n      stack_id: STACK_ID,\n      thread_id: THREAD_ID_STRING,\n    };\n\n    profile['stacks'][STACK_ID] = stack;\n    profile['samples'][i] = sample;\n    STACK_ID++;\n  });\n\n  return profile;\n}\n\n/**\n * Adds items to envelope if they are not already present - mutates the envelope.\n * @param envelope\n */\nexport function addProfilesToEnvelope(envelope: EventEnvelope, profiles: Profile[]): Envelope {\n  if (!profiles.length) {\n    return envelope;\n  }\n\n  for (const profile of profiles) {\n    envelope[1].push([{ type: 'profile' }, profile]);\n  }\n  return envelope;\n}\n\n/**\n * Finds transactions with profile_id context in the envelope\n * @param envelope\n * @returns\n */\nexport function findProfiledTransactionsFromEnvelope(envelope: Envelope): Event[] {\n  const events: Event[] = [];\n\n  forEachEnvelopeItem(envelope, (item, type) => {\n    if (type !== 'transaction') {\n      return;\n    }\n\n    for (let j = 1; j < item.length; j++) {\n      const event = item[j] as Event;\n\n      if (event && event.contexts && event.contexts['profile'] && event.contexts['profile']['profile_id']) {\n        events.push(item[j] as Event);\n      }\n    }\n  });\n\n  return events;\n}\n\n/**\n * Applies debug meta data to an event from a list of paths to resources (sourcemaps)\n */\nexport function applyDebugMetadata(resource_paths: ReadonlyArray<string>): DebugImage[] {\n  const client = getClient();\n  const options = client && client.getOptions();\n  const stackParser = options && options.stackParser;\n\n  if (!stackParser) {\n    return [];\n  }\n\n  return getDebugImagesForResources(stackParser, resource_paths);\n}\n\n/**\n * Checks the given sample rate to make sure it is valid type and value (a boolean, or a number between 0 and 1).\n */\nexport function isValidSampleRate(rate: unknown): boolean {\n  // we need to check NaN explicitly because it's of type 'number' and therefore wouldn't get caught by this typecheck\n  if ((typeof rate !== 'number' && typeof rate !== 'boolean') || (typeof rate === 'number' && isNaN(rate))) {\n    DEBUG_BUILD &&\n      logger.warn(\n        `[Profiling] Invalid sample rate. Sample rate must be a boolean or a number between 0 and 1. Got ${JSON.stringify(\n          rate,\n        )} of type ${JSON.stringify(typeof rate)}.`,\n      );\n    return false;\n  }\n\n  // Boolean sample rates are always valid\n  if (rate === true || rate === false) {\n    return true;\n  }\n\n  // in case sampleRate is a boolean, it will get automatically cast to 1 if it's true and 0 if it's false\n  if (rate < 0 || rate > 1) {\n    DEBUG_BUILD && logger.warn(`[Profiling] Invalid sample rate. Sample rate must be between 0 and 1. Got ${rate}.`);\n    return false;\n  }\n  return true;\n}\n\nfunction isValidProfile(profile: JSSelfProfile): profile is JSSelfProfile & { profile_id: string } {\n  if (profile.samples.length < 2) {\n    if (DEBUG_BUILD) {\n      // Log a warning if the profile has less than 2 samples so users can know why\n      // they are not seeing any profiling data and we cant avoid the back and forth\n      // of asking them to provide us with a dump of the profile data.\n      logger.log('[Profiling] Discarding profile because it contains less than 2 samples');\n    }\n    return false;\n  }\n\n  if (!profile.frames.length) {\n    if (DEBUG_BUILD) {\n      logger.log('[Profiling] Discarding profile because it contains no frames');\n    }\n    return false;\n  }\n\n  return true;\n}\n\n// Keep a flag value to avoid re-initializing the profiler constructor. If it fails\n// once, it will always fail and this allows us to early return.\nlet PROFILING_CONSTRUCTOR_FAILED: boolean = false;\nexport const MAX_PROFILE_DURATION_MS = 30_000;\n\n/**\n * Check if profiler constructor is available.\n * @param maybeProfiler\n */\nfunction isJSProfilerSupported(maybeProfiler: unknown): maybeProfiler is typeof JSSelfProfilerConstructor {\n  return typeof maybeProfiler === 'function';\n}\n\n/**\n * Starts the profiler and returns the profiler instance.\n */\nexport function startJSSelfProfile(): JSSelfProfiler | undefined {\n  // Feature support check first\n  const JSProfilerConstructor = WINDOW.Profiler;\n\n  if (!isJSProfilerSupported(JSProfilerConstructor)) {\n    if (DEBUG_BUILD) {\n      logger.log(\n        '[Profiling] Profiling is not supported by this browser, Profiler interface missing on window object.',\n      );\n    }\n    return;\n  }\n\n  // From initial testing, it seems that the minimum value for sampleInterval is 10ms.\n  const samplingIntervalMS = 10;\n  // Start the profiler\n  const maxSamples = Math.floor(MAX_PROFILE_DURATION_MS / samplingIntervalMS);\n\n  // Attempt to initialize the profiler constructor, if it fails, we disable profiling for the current user session.\n  // This is likely due to a missing 'Document-Policy': 'js-profiling' header. We do not want to throw an error if this happens\n  // as we risk breaking the user's application, so just disable profiling and log an error.\n  try {\n    return new JSProfilerConstructor({ sampleInterval: samplingIntervalMS, maxBufferSize: maxSamples });\n  } catch (e) {\n    if (DEBUG_BUILD) {\n      logger.log(\n        \"[Profiling] Failed to initialize the Profiling constructor, this is likely due to a missing 'Document-Policy': 'js-profiling' header.\",\n      );\n      logger.log('[Profiling] Disabling profiling for current user session.');\n    }\n    PROFILING_CONSTRUCTOR_FAILED = true;\n  }\n\n  return;\n}\n\n/**\n * Determine if a profile should be profiled.\n */\nexport function shouldProfileSpan(span: Span): boolean {\n  // If constructor failed once, it will always fail, so we can early return.\n  if (PROFILING_CONSTRUCTOR_FAILED) {\n    if (DEBUG_BUILD) {\n      logger.log('[Profiling] Profiling has been disabled for the duration of the current user session.');\n    }\n    return false;\n  }\n\n  if (!span.isRecording()) {\n    if (DEBUG_BUILD) {\n      logger.log('[Profiling] Discarding profile because transaction was not sampled.');\n    }\n    return false;\n  }\n\n  const client = getClient();\n  const options = client && client.getOptions();\n  if (!options) {\n    DEBUG_BUILD && logger.log('[Profiling] Profiling disabled, no options found.');\n    return false;\n  }\n\n  // @ts-expect-error profilesSampleRate is not part of the browser options yet\n  const profilesSampleRate: number | boolean | undefined = options.profilesSampleRate;\n\n  // Since this is coming from the user (or from a function provided by the user), who knows what we might get. (The\n  // only valid values are booleans or numbers between 0 and 1.)\n  if (!isValidSampleRate(profilesSampleRate)) {\n    DEBUG_BUILD && logger.warn('[Profiling] Discarding profile because of invalid sample rate.');\n    return false;\n  }\n\n  // if the function returned 0 (or false), or if `profileSampleRate` is 0, it's a sign the profile should be dropped\n  if (!profilesSampleRate) {\n    DEBUG_BUILD &&\n      logger.log(\n        '[Profiling] Discarding profile because a negative sampling decision was inherited or profileSampleRate is set to 0',\n      );\n    return false;\n  }\n\n  // Now we roll the dice. Math.random is inclusive of 0, but not of 1, so strict < is safe here. In case sampleRate is\n  // a boolean, the < comparison will cause it to be automatically cast to 1 if it's true and 0 if it's false.\n  const sampled = profilesSampleRate === true ? true : Math.random() < profilesSampleRate;\n  // Check if we should sample this profile\n  if (!sampled) {\n    DEBUG_BUILD &&\n      logger.log(\n        `[Profiling] Discarding profile because it's not included in the random sample (sampling rate = ${Number(\n          profilesSampleRate,\n        )})`,\n      );\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Creates a profiling envelope item, if the profile does not pass validation, returns null.\n * @param event\n * @returns {Profile | null}\n */\nexport function createProfilingEvent(\n  profile_id: string,\n  start_timestamp: number | undefined,\n  profile: JSSelfProfile,\n  event: ProfiledEvent,\n): Profile | null {\n  if (!isValidProfile(profile)) {\n    return null;\n  }\n\n  return createProfilePayload(profile_id, start_timestamp, profile, event);\n}\n\n// TODO (v8): We need to obtain profile ids in @sentry-internal/tracing,\n// but we don't have access to this map because importing this map would\n// cause a circular dependency. We need to resolve this in v8.\nconst PROFILE_MAP: Map<string, JSSelfProfile> = new Map();\n/**\n *\n */\nexport function getActiveProfilesCount(): number {\n  return PROFILE_MAP.size;\n}\n\n/**\n * Retrieves profile from global cache and removes it.\n */\nexport function takeProfileFromGlobalCache(profile_id: string): JSSelfProfile | undefined {\n  const profile = PROFILE_MAP.get(profile_id);\n  if (profile) {\n    PROFILE_MAP.delete(profile_id);\n  }\n  return profile;\n}\n/**\n * Adds profile to global cache and evicts the oldest profile if the cache is full.\n */\nexport function addProfileToGlobalCache(profile_id: string, profile: JSSelfProfile): void {\n  PROFILE_MAP.set(profile_id, profile);\n\n  if (PROFILE_MAP.size > 30) {\n    const last: string = PROFILE_MAP.keys().next().value;\n    PROFILE_MAP.delete(last);\n  }\n}\n","import {\n  consoleSandbox,\n  dedupeIntegration,\n  functionToStringIntegration,\n  getClient,\n  getCurrentScope,\n  getIntegrationsToSetup,\n  getReportDialogEndpoint,\n  inboundFiltersIntegration,\n  initAndBind,\n  lastEventId,\n  logger,\n  stackParserFromStackParserOptions,\n  supportsFetch,\n} from '@sentry/core';\nimport type { Client, DsnLike, Integration, Options, UserFeedback } from '@sentry/core';\nimport type { BrowserClientOptions, BrowserOptions } from './client';\nimport { BrowserClient } from './client';\nimport { DEBUG_BUILD } from './debug-build';\nimport { WINDOW } from './helpers';\nimport { breadcrumbsIntegration } from './integrations/breadcrumbs';\nimport { browserApiErrorsIntegration } from './integrations/browserapierrors';\nimport { browserSessionIntegration } from './integrations/browsersession';\nimport { globalHandlersIntegration } from './integrations/globalhandlers';\nimport { httpContextIntegration } from './integrations/httpcontext';\nimport { linkedErrorsIntegration } from './integrations/linkederrors';\nimport { defaultStackParser } from './stack-parsers';\nimport { makeFetchTransport } from './transports/fetch';\n\n/** Get the default integrations for the browser SDK. */\nexport function getDefaultIntegrations(options: Options): Integration[] {\n  /**\n   * Note: Please make sure this stays in sync with Angular SDK, which re-exports\n   * `getDefaultIntegrations` but with an adjusted set of integrations.\n   */\n  const integrations = [\n    inboundFiltersIntegration(),\n    functionToStringIntegration(),\n    browserApiErrorsIntegration(),\n    breadcrumbsIntegration(),\n    globalHandlersIntegration(),\n    linkedErrorsIntegration(),\n    dedupeIntegration(),\n    httpContextIntegration(),\n  ];\n\n  // eslint-disable-next-line deprecation/deprecation\n  if (options.autoSessionTracking !== false) {\n    integrations.push(browserSessionIntegration());\n  }\n\n  return integrations;\n}\n\nfunction applyDefaultOptions(optionsArg: BrowserOptions = {}): BrowserOptions {\n  const defaultOptions: BrowserOptions = {\n    defaultIntegrations: getDefaultIntegrations(optionsArg),\n    release:\n      typeof __SENTRY_RELEASE__ === 'string' // This allows build tooling to find-and-replace __SENTRY_RELEASE__ to inject a release value\n        ? __SENTRY_RELEASE__\n        : WINDOW.SENTRY_RELEASE && WINDOW.SENTRY_RELEASE.id // This supports the variable that sentry-webpack-plugin injects\n          ? WINDOW.SENTRY_RELEASE.id\n          : undefined,\n    autoSessionTracking: true,\n    sendClientReports: true,\n  };\n\n  // TODO: Instead of dropping just `defaultIntegrations`, we should simply\n  // call `dropUndefinedKeys` on the entire `optionsArg`.\n  // However, for this to work we need to adjust the `hasTracingEnabled()` logic\n  // first as it differentiates between `undefined` and the key not being in the object.\n  if (optionsArg.defaultIntegrations == null) {\n    delete optionsArg.defaultIntegrations;\n  }\n\n  return { ...defaultOptions, ...optionsArg };\n}\n\ntype ExtensionProperties = {\n  chrome?: Runtime;\n  browser?: Runtime;\n  nw?: unknown;\n};\ntype Runtime = {\n  runtime?: {\n    id?: string;\n  };\n};\n\nfunction shouldShowBrowserExtensionError(): boolean {\n  const windowWithMaybeExtension =\n    typeof WINDOW.window !== 'undefined' && (WINDOW as typeof WINDOW & ExtensionProperties);\n  if (!windowWithMaybeExtension) {\n    // No need to show the error if we're not in a browser window environment (e.g. service workers)\n    return false;\n  }\n\n  const extensionKey = windowWithMaybeExtension.chrome ? 'chrome' : 'browser';\n  const extensionObject = windowWithMaybeExtension[extensionKey];\n\n  const runtimeId = extensionObject && extensionObject.runtime && extensionObject.runtime.id;\n  const href = (WINDOW.location && WINDOW.location.href) || '';\n\n  const extensionProtocols = ['chrome-extension:', 'moz-extension:', 'ms-browser-extension:', 'safari-web-extension:'];\n\n  // Running the SDK in a dedicated extension page and calling Sentry.init is fine; no risk of data leakage\n  const isDedicatedExtensionPage =\n    !!runtimeId && WINDOW === WINDOW.top && extensionProtocols.some(protocol => href.startsWith(`${protocol}//`));\n\n  // Running the SDK in NW.js, which appears like a browser extension but isn't, is also fine\n  // see: https://github.com/getsentry/sentry-javascript/issues/12668\n  const isNWjs = typeof windowWithMaybeExtension.nw !== 'undefined';\n\n  return !!runtimeId && !isDedicatedExtensionPage && !isNWjs;\n}\n\n/**\n * A magic string that build tooling can leverage in order to inject a release value into the SDK.\n */\ndeclare const __SENTRY_RELEASE__: string | undefined;\n\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n *   dsn: '__DSN__',\n *   // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n *   message: 'My Breadcrumb',\n *   // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n *   message: 'Manual',\n *   stacktrace: [\n *     // ...\n *   ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nexport function init(browserOptions: BrowserOptions = {}): Client | undefined {\n  const options = applyDefaultOptions(browserOptions);\n\n  if (!options.skipBrowserExtensionCheck && shouldShowBrowserExtensionError()) {\n    consoleSandbox(() => {\n      // eslint-disable-next-line no-console\n      console.error(\n        '[Sentry] You cannot run Sentry this way in a browser extension, check: https://docs.sentry.io/platforms/javascript/best-practices/browser-extensions/',\n      );\n    });\n    return;\n  }\n\n  if (DEBUG_BUILD) {\n    if (!supportsFetch()) {\n      logger.warn(\n        'No Fetch API detected. The Sentry SDK requires a Fetch API compatible environment to send events. Please add a Fetch API polyfill.',\n      );\n    }\n  }\n  const clientOptions: BrowserClientOptions = {\n    ...options,\n    stackParser: stackParserFromStackParserOptions(options.stackParser || defaultStackParser),\n    integrations: getIntegrationsToSetup(options),\n    transport: options.transport || makeFetchTransport,\n  };\n\n  return initAndBind(BrowserClient, clientOptions);\n}\n\n/**\n * All properties the report dialog supports\n */\nexport interface ReportDialogOptions {\n  // TODO(v9): Change this to  [key: string]: unknkown;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  [key: string]: any;\n  eventId?: string;\n  dsn?: DsnLike;\n  user?: {\n    email?: string;\n    name?: string;\n  };\n  lang?: string;\n  title?: string;\n  subtitle?: string;\n  subtitle2?: string;\n  labelName?: string;\n  labelEmail?: string;\n  labelComments?: string;\n  labelClose?: string;\n  labelSubmit?: string;\n  errorGeneric?: string;\n  errorFormEntry?: string;\n  successMessage?: string;\n  /** Callback after reportDialog showed up */\n  onLoad?(this: void): void;\n  /** Callback after reportDialog closed */\n  onClose?(this: void): void;\n}\n\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nexport function showReportDialog(options: ReportDialogOptions = {}): void {\n  // doesn't work without a document (React Native)\n  if (!WINDOW.document) {\n    DEBUG_BUILD && logger.error('Global document not defined in showReportDialog call');\n    return;\n  }\n\n  const scope = getCurrentScope();\n  const client = scope.getClient();\n  const dsn = client && client.getDsn();\n\n  if (!dsn) {\n    DEBUG_BUILD && logger.error('DSN not configured for showReportDialog call');\n    return;\n  }\n\n  if (scope) {\n    options.user = {\n      ...scope.getUser(),\n      ...options.user,\n    };\n  }\n\n  if (!options.eventId) {\n    const eventId = lastEventId();\n    if (eventId) {\n      options.eventId = eventId;\n    }\n  }\n\n  const script = WINDOW.document.createElement('script');\n  script.async = true;\n  script.crossOrigin = 'anonymous';\n  script.src = getReportDialogEndpoint(dsn, options);\n\n  if (options.onLoad) {\n    script.onload = options.onLoad;\n  }\n\n  const { onClose } = options;\n  if (onClose) {\n    const reportDialogClosedMessageHandler = (event: MessageEvent): void => {\n      if (event.data === '__sentry_reportdialog_closed__') {\n        try {\n          onClose();\n        } finally {\n          WINDOW.removeEventListener('message', reportDialogClosedMessageHandler);\n        }\n      }\n    };\n    WINDOW.addEventListener('message', reportDialogClosedMessageHandler);\n  }\n\n  const injectionPoint = WINDOW.document.head || WINDOW.document.body;\n  if (injectionPoint) {\n    injectionPoint.appendChild(script);\n  } else {\n    DEBUG_BUILD && logger.error('Not injecting report dialog. No injection point found in HTML');\n  }\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function forceLoad(): void {\n  // Noop\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function onLoad(callback: () => void): void {\n  callback();\n}\n\n/**\n * Captures user feedback and sends it to Sentry.\n *\n * @deprecated Use `captureFeedback` instead.\n */\nexport function captureUserFeedback(feedback: UserFeedback): void {\n  const client = getClient<BrowserClient>();\n  if (client) {\n    // eslint-disable-next-line deprecation/deprecation\n    client.captureUserFeedback(feedback);\n  }\n}\n","// This was originally forked from https://github.com/csnover/TraceKit, and was largely\n// re - written as part of raven - js.\n//\n// This code was later copied to the JavaScript mono - repo and further modified and\n// refactored over the years.\n\n// Copyright (c) 2013 Onur Can Cakmak onur.cakmak@gmail.com and all TraceKit contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this\n// software and associated documentation files(the 'Software'), to deal in the Software\n// without restriction, including without limitation the rights to use, copy, modify,\n// merge, publish, distribute, sublicense, and / or sell copies of the Software, and to\n// permit persons to whom the Software is furnished to do so, subject to the following\n// conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies\n// or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n// PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n// CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n// OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nimport { UNKNOWN_FUNCTION, createStackParser } from '@sentry/core';\nimport type { StackFrame, StackLineParser, StackLineParserFn } from '@sentry/core';\n\nconst OPERA10_PRIORITY = 10;\nconst OPERA11_PRIORITY = 20;\nconst CHROME_PRIORITY = 30;\nconst WINJS_PRIORITY = 40;\nconst GECKO_PRIORITY = 50;\n\nfunction createFrame(filename: string, func: string, lineno?: number, colno?: number): StackFrame {\n  const frame: StackFrame = {\n    filename,\n    function: func === '<anonymous>' ? UNKNOWN_FUNCTION : func,\n    in_app: true, // All browser frames are considered in_app\n  };\n\n  if (lineno !== undefined) {\n    frame.lineno = lineno;\n  }\n\n  if (colno !== undefined) {\n    frame.colno = colno;\n  }\n\n  return frame;\n}\n\n// This regex matches frames that have no function name (ie. are at the top level of a module).\n// For example \"at http://localhost:5000//script.js:1:126\"\n// Frames _with_ function names usually look as follows: \"at commitLayoutEffects (react-dom.development.js:23426:1)\"\nconst chromeRegexNoFnName = /^\\s*at (\\S+?)(?::(\\d+))(?::(\\d+))\\s*$/i;\n\n// This regex matches all the frames that have a function name.\nconst chromeRegex =\n  /^\\s*at (?:(.+?\\)(?: \\[.+\\])?|.*?) ?\\((?:address at )?)?(?:async )?((?:<anonymous>|[-a-z]+:|.*bundle|\\/)?.*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n\nconst chromeEvalRegex = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\n// We cannot call this variable `chrome` because it can conflict with global `chrome` variable in certain environments\n// See: https://github.com/getsentry/sentry-javascript/issues/6880\nconst chromeStackParserFn: StackLineParserFn = line => {\n  // If the stack line has no function name, we need to parse it differently\n  const noFnParts = chromeRegexNoFnName.exec(line) as null | [string, string, string, string];\n\n  if (noFnParts) {\n    const [, filename, line, col] = noFnParts;\n    return createFrame(filename, UNKNOWN_FUNCTION, +line, +col);\n  }\n\n  const parts = chromeRegex.exec(line) as null | [string, string, string, string, string];\n\n  if (parts) {\n    const isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n    if (isEval) {\n      const subMatch = chromeEvalRegex.exec(parts[2]) as null | [string, string, string, string];\n\n      if (subMatch) {\n        // throw out eval line/column and use top-most line/column number\n        parts[2] = subMatch[1]; // url\n        parts[3] = subMatch[2]; // line\n        parts[4] = subMatch[3]; // column\n      }\n    }\n\n    // Kamil: One more hack won't hurt us right? Understanding and adding more rules on top of these regexps right now\n    // would be way too time consuming. (TODO: Rewrite whole RegExp to be more readable)\n    const [func, filename] = extractSafariExtensionDetails(parts[1] || UNKNOWN_FUNCTION, parts[2]);\n\n    return createFrame(filename, func, parts[3] ? +parts[3] : undefined, parts[4] ? +parts[4] : undefined);\n  }\n\n  return;\n};\n\nexport const chromeStackLineParser: StackLineParser = [CHROME_PRIORITY, chromeStackParserFn];\n\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst geckoREgex =\n  /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:[-a-z]+)?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst geckoEvalRegex = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\nconst gecko: StackLineParserFn = line => {\n  const parts = geckoREgex.exec(line) as null | [string, string, string, string, string, string];\n\n  if (parts) {\n    const isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n    if (isEval) {\n      const subMatch = geckoEvalRegex.exec(parts[3]) as null | [string, string, string];\n\n      if (subMatch) {\n        // throw out eval line/column and use top-most line number\n        parts[1] = parts[1] || 'eval';\n        parts[3] = subMatch[1];\n        parts[4] = subMatch[2];\n        parts[5] = ''; // no column when eval\n      }\n    }\n\n    let filename = parts[3];\n    let func = parts[1] || UNKNOWN_FUNCTION;\n    [func, filename] = extractSafariExtensionDetails(func, filename);\n\n    return createFrame(filename, func, parts[4] ? +parts[4] : undefined, parts[5] ? +parts[5] : undefined);\n  }\n\n  return;\n};\n\nexport const geckoStackLineParser: StackLineParser = [GECKO_PRIORITY, gecko];\n\nconst winjsRegex = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:[-a-z]+):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\nconst winjs: StackLineParserFn = line => {\n  const parts = winjsRegex.exec(line) as null | [string, string, string, string, string];\n\n  return parts\n    ? createFrame(parts[2], parts[1] || UNKNOWN_FUNCTION, +parts[3], parts[4] ? +parts[4] : undefined)\n    : undefined;\n};\n\nexport const winjsStackLineParser: StackLineParser = [WINJS_PRIORITY, winjs];\n\nconst opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n\nconst opera10: StackLineParserFn = line => {\n  const parts = opera10Regex.exec(line) as null | [string, string, string, string];\n  return parts ? createFrame(parts[2], parts[3] || UNKNOWN_FUNCTION, +parts[1]) : undefined;\n};\n\nexport const opera10StackLineParser: StackLineParser = [OPERA10_PRIORITY, opera10];\n\nconst opera11Regex =\n  / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\(.*\\))? in (.*):\\s*$/i;\n\nconst opera11: StackLineParserFn = line => {\n  const parts = opera11Regex.exec(line) as null | [string, string, string, string, string, string];\n  return parts ? createFrame(parts[5], parts[3] || parts[4] || UNKNOWN_FUNCTION, +parts[1], +parts[2]) : undefined;\n};\n\nexport const opera11StackLineParser: StackLineParser = [OPERA11_PRIORITY, opera11];\n\nexport const defaultStackLineParsers = [chromeStackLineParser, geckoStackLineParser];\n\nexport const defaultStackParser = createStackParser(...defaultStackLineParsers);\n\n/**\n * Safari web extensions, starting version unknown, can produce \"frames-only\" stacktraces.\n * What it means, is that instead of format like:\n *\n * Error: wat\n *   at function@url:row:col\n *   at function@url:row:col\n *   at function@url:row:col\n *\n * it produces something like:\n *\n *   function@url:row:col\n *   function@url:row:col\n *   function@url:row:col\n *\n * Because of that, it won't be captured by `chrome` RegExp and will fall into `Gecko` branch.\n * This function is extracted so that we can use it in both places without duplicating the logic.\n * Unfortunately \"just\" changing RegExp is too complicated now and making it pass all tests\n * and fix this case seems like an impossible, or at least way too time-consuming task.\n */\nconst extractSafariExtensionDetails = (func: string, filename: string): [string, string] => {\n  const isSafariExtension = func.indexOf('safari-extension') !== -1;\n  const isSafariWebExtension = func.indexOf('safari-web-extension') !== -1;\n\n  return isSafariExtension || isSafariWebExtension\n    ? [\n        func.indexOf('@') !== -1 ? (func.split('@')[0] as string) : UNKNOWN_FUNCTION,\n        isSafariExtension ? `safari-extension:${filename}` : `safari-web-extension:${filename}`,\n      ]\n    : [func, filename];\n};\n","import { SPAN_STATUS_ERROR, getActiveSpan, getRootSpan, logger, spanToJSON } from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\n\n/**\n * Add a listener that cancels and finishes a transaction when the global\n * document is hidden.\n */\nexport function registerBackgroundTabDetection(): void {\n  if (WINDOW && WINDOW.document) {\n    WINDOW.document.addEventListener('visibilitychange', () => {\n      const activeSpan = getActiveSpan();\n      if (!activeSpan) {\n        return;\n      }\n\n      const rootSpan = getRootSpan(activeSpan);\n\n      if (WINDOW.document.hidden && rootSpan) {\n        const cancelledStatus = 'cancelled';\n\n        const { op, status } = spanToJSON(rootSpan);\n\n        if (DEBUG_BUILD) {\n          logger.log(`[Tracing] Transaction: ${cancelledStatus} -> since tab moved to the background, op: ${op}`);\n        }\n\n        // We should not set status if it is already set, this prevent important statuses like\n        // error or data loss from being overwritten on transaction.\n        if (!status) {\n          rootSpan.setStatus({ code: SPAN_STATUS_ERROR, message: cancelledStatus });\n        }\n\n        rootSpan.setAttribute('sentry.cancellation_reason', 'document.hidden');\n        rootSpan.end();\n      }\n    });\n  } else {\n    DEBUG_BUILD && logger.warn('[Tracing] Could not set up background tab detection due to lack of global document');\n  }\n}\n","/* eslint-disable max-lines */\nimport {\n  addHistoryInstrumentationHandler,\n  addPerformanceEntries,\n  registerInpInteractionListener,\n  startTrackingINP,\n  startTrackingInteractions,\n  startTrackingLongAnimationFrames,\n  startTrackingLongTasks,\n  startTrackingWebVitals,\n} from '@sentry-internal/browser-utils';\nimport type { Client, IntegrationFn, Span, StartSpanOptions, TransactionSource } from '@sentry/core';\nimport {\n  GLOBAL_OBJ,\n  SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON,\n  SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n  SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n  TRACING_DEFAULTS,\n  browserPerformanceTimeOrigin,\n  generateTraceId,\n  getActiveSpan,\n  getClient,\n  getCurrentScope,\n  getDomElement,\n  getDynamicSamplingContextFromSpan,\n  getIsolationScope,\n  getRootSpan,\n  logger,\n  propagationContextFromHeaders,\n  registerSpanErrorInstrumentation,\n  spanIsSampled,\n  spanToJSON,\n  startIdleSpan,\n} from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { WINDOW } from '../helpers';\nimport { registerBackgroundTabDetection } from './backgroundtab';\nimport { defaultRequestInstrumentationOptions, instrumentOutgoingRequests } from './request';\n\nexport const BROWSER_TRACING_INTEGRATION_ID = 'BrowserTracing';\n\ninterface RouteInfo {\n  name: string | undefined;\n  source: TransactionSource | undefined;\n}\n\n/** Options for Browser Tracing integration */\nexport interface BrowserTracingOptions {\n  /**\n   * The time that has to pass without any span being created.\n   * If this time is exceeded, the idle span will finish.\n   *\n   * Default: 1000 (ms)\n   */\n  idleTimeout: number;\n\n  /**\n   * The max. time an idle span may run.\n   * If this time is exceeded, the idle span will finish no matter what.\n   *\n   * Default: 30000 (ms)\n   */\n  finalTimeout: number;\n\n  /**\n   The max. time an idle span may run.\n   * If this time is exceeded, the idle span will finish no matter what.\n   *\n   * Default: 15000 (ms)\n   */\n  childSpanTimeout: number;\n\n  /**\n   * If a span should be created on page load.\n   * If this is set to `false`, this integration will not start the default page load span.\n   * Default: true\n   */\n  instrumentPageLoad: boolean;\n\n  /**\n   * If a span should be created on navigation (history change).\n   * If this is set to `false`, this integration will not start the default navigation spans.\n   * Default: true\n   */\n  instrumentNavigation: boolean;\n\n  /**\n   * Flag spans where tabs moved to background with \"cancelled\". Browser background tab timing is\n   * not suited towards doing precise measurements of operations. By default, we recommend that this option\n   * be enabled as background transactions can mess up your statistics in nondeterministic ways.\n   *\n   * Default: true\n   */\n  markBackgroundSpan: boolean;\n\n  /**\n   * If true, Sentry will capture long tasks and add them to the corresponding transaction.\n   *\n   * Default: true\n   */\n  enableLongTask: boolean;\n\n  /**\n   * If true, Sentry will capture long animation frames and add them to the corresponding transaction.\n   *\n   * Default: false\n   */\n  enableLongAnimationFrame: boolean;\n\n  /**\n   * If true, Sentry will capture first input delay and add it to the corresponding transaction.\n   *\n   * Default: true\n   */\n  enableInp: boolean;\n\n  /**\n   * Flag to disable patching all together for fetch requests.\n   *\n   * Default: true\n   */\n  traceFetch: boolean;\n\n  /**\n   * Flag to disable patching all together for xhr requests.\n   *\n   * Default: true\n   */\n  traceXHR: boolean;\n\n  /**\n   * Flag to disable tracking of long-lived streams, like server-sent events (SSE) via fetch.\n   * Do not enable this in case you have live streams or very long running streams.\n   *\n   * Default: false\n   */\n  trackFetchStreamPerformance: boolean;\n\n  /**\n   * If true, Sentry will capture http timings and add them to the corresponding http spans.\n   *\n   * Default: true\n   */\n  enableHTTPTimings: boolean;\n\n  /**\n   * _experiments allows the user to send options to define how this integration works.\n   *\n   * Default: undefined\n   */\n  _experiments: Partial<{\n    enableInteractions: boolean;\n    enableStandaloneClsSpans: boolean;\n  }>;\n\n  /**\n   * A callback which is called before a span for a pageload or navigation is started.\n   * It receives the options passed to `startSpan`, and expects to return an updated options object.\n   */\n  beforeStartSpan?: (options: StartSpanOptions) => StartSpanOptions;\n\n  /**\n   * This function will be called before creating a span for a request with the given url.\n   * Return false if you don't want a span for the given url.\n   *\n   * Default: (url: string) => true\n   */\n  shouldCreateSpanForRequest?(this: void, url: string): boolean;\n}\n\nconst DEFAULT_BROWSER_TRACING_OPTIONS: BrowserTracingOptions = {\n  ...TRACING_DEFAULTS,\n  instrumentNavigation: true,\n  instrumentPageLoad: true,\n  markBackgroundSpan: true,\n  enableLongTask: true,\n  enableLongAnimationFrame: true,\n  enableInp: true,\n  _experiments: {},\n  ...defaultRequestInstrumentationOptions,\n};\n\n/**\n * The Browser Tracing integration automatically instruments browser pageload/navigation\n * actions as transactions, and captures requests, metrics and errors as spans.\n *\n * The integration can be configured with a variety of options, and can be extended to use\n * any routing library.\n *\n * We explicitly export the proper type here, as this has to be extended in some cases.\n */\nexport const browserTracingIntegration = ((_options: Partial<BrowserTracingOptions> = {}) => {\n  registerSpanErrorInstrumentation();\n\n  const {\n    enableInp,\n    enableLongTask,\n    enableLongAnimationFrame,\n    _experiments: { enableInteractions, enableStandaloneClsSpans },\n    beforeStartSpan,\n    idleTimeout,\n    finalTimeout,\n    childSpanTimeout,\n    markBackgroundSpan,\n    traceFetch,\n    traceXHR,\n    trackFetchStreamPerformance,\n    shouldCreateSpanForRequest,\n    enableHTTPTimings,\n    instrumentPageLoad,\n    instrumentNavigation,\n  } = {\n    ...DEFAULT_BROWSER_TRACING_OPTIONS,\n    ..._options,\n  };\n\n  const _collectWebVitals = startTrackingWebVitals({ recordClsStandaloneSpans: enableStandaloneClsSpans || false });\n\n  if (enableInp) {\n    startTrackingINP();\n  }\n\n  if (\n    enableLongAnimationFrame &&\n    GLOBAL_OBJ.PerformanceObserver &&\n    PerformanceObserver.supportedEntryTypes &&\n    PerformanceObserver.supportedEntryTypes.includes('long-animation-frame')\n  ) {\n    startTrackingLongAnimationFrames();\n  } else if (enableLongTask) {\n    startTrackingLongTasks();\n  }\n\n  if (enableInteractions) {\n    startTrackingInteractions();\n  }\n\n  const latestRoute: RouteInfo = {\n    name: undefined,\n    source: undefined,\n  };\n\n  /** Create routing idle transaction. */\n  function _createRouteSpan(client: Client, startSpanOptions: StartSpanOptions): Span {\n    const isPageloadTransaction = startSpanOptions.op === 'pageload';\n\n    const finalStartSpanOptions: StartSpanOptions = beforeStartSpan\n      ? beforeStartSpan(startSpanOptions)\n      : startSpanOptions;\n\n    const attributes = finalStartSpanOptions.attributes || {};\n\n    // If `finalStartSpanOptions.name` is different than `startSpanOptions.name`\n    // it is because `beforeStartSpan` set a custom name. Therefore we set the source to 'custom'.\n    if (startSpanOptions.name !== finalStartSpanOptions.name) {\n      attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] = 'custom';\n      finalStartSpanOptions.attributes = attributes;\n    }\n\n    latestRoute.name = finalStartSpanOptions.name;\n    latestRoute.source = attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n\n    const idleSpan = startIdleSpan(finalStartSpanOptions, {\n      idleTimeout,\n      finalTimeout,\n      childSpanTimeout,\n      // should wait for finish signal if it's a pageload transaction\n      disableAutoFinish: isPageloadTransaction,\n      beforeSpanEnd: span => {\n        _collectWebVitals();\n        addPerformanceEntries(span, { recordClsOnPageloadSpan: !enableStandaloneClsSpans });\n      },\n    });\n\n    function emitFinish(): void {\n      if (['interactive', 'complete'].includes(WINDOW.document.readyState)) {\n        client.emit('idleSpanEnableAutoFinish', idleSpan);\n      }\n    }\n\n    if (isPageloadTransaction && WINDOW.document) {\n      WINDOW.document.addEventListener('readystatechange', () => {\n        emitFinish();\n      });\n\n      emitFinish();\n    }\n\n    return idleSpan;\n  }\n\n  return {\n    name: BROWSER_TRACING_INTEGRATION_ID,\n    afterAllSetup(client) {\n      let activeSpan: Span | undefined;\n      let startingUrl: string | undefined = WINDOW.location && WINDOW.location.href;\n\n      function maybeEndActiveSpan(): void {\n        if (activeSpan && !spanToJSON(activeSpan).timestamp) {\n          DEBUG_BUILD && logger.log(`[Tracing] Finishing current active span with op: ${spanToJSON(activeSpan).op}`);\n          // If there's an open active span, we need to finish it before creating an new one.\n          activeSpan.end();\n        }\n      }\n\n      client.on('startNavigationSpan', startSpanOptions => {\n        if (getClient() !== client) {\n          return;\n        }\n\n        maybeEndActiveSpan();\n\n        activeSpan = _createRouteSpan(client, {\n          op: 'navigation',\n          ...startSpanOptions,\n        });\n      });\n\n      client.on('startPageLoadSpan', (startSpanOptions, traceOptions = {}) => {\n        if (getClient() !== client) {\n          return;\n        }\n        maybeEndActiveSpan();\n\n        const sentryTrace = traceOptions.sentryTrace || getMetaContent('sentry-trace');\n        const baggage = traceOptions.baggage || getMetaContent('baggage');\n\n        const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n        getCurrentScope().setPropagationContext(propagationContext);\n\n        activeSpan = _createRouteSpan(client, {\n          op: 'pageload',\n          ...startSpanOptions,\n        });\n      });\n\n      // A trace should to stay the consistent over the entire time span of one route.\n      // Therefore, when the initial pageload or navigation root span ends, we update the\n      // scope's propagation context to keep span-specific attributes like the `sampled` decision and\n      // the dynamic sampling context valid, even after the root span has ended.\n      // This ensures that the trace data is consistent for the entire duration of the route.\n      client.on('spanEnd', span => {\n        const op = spanToJSON(span).op;\n        if (span !== getRootSpan(span) || (op !== 'navigation' && op !== 'pageload')) {\n          return;\n        }\n\n        const scope = getCurrentScope();\n        const oldPropagationContext = scope.getPropagationContext();\n\n        scope.setPropagationContext({\n          ...oldPropagationContext,\n          sampled: oldPropagationContext.sampled !== undefined ? oldPropagationContext.sampled : spanIsSampled(span),\n          dsc: oldPropagationContext.dsc || getDynamicSamplingContextFromSpan(span),\n        });\n      });\n\n      if (WINDOW.location) {\n        if (instrumentPageLoad) {\n          startBrowserTracingPageLoadSpan(client, {\n            name: WINDOW.location.pathname,\n            // pageload should always start at timeOrigin (and needs to be in s, not ms)\n            startTime: browserPerformanceTimeOrigin ? browserPerformanceTimeOrigin / 1000 : undefined,\n            attributes: {\n              [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n              [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.browser',\n            },\n          });\n        }\n\n        if (instrumentNavigation) {\n          addHistoryInstrumentationHandler(({ to, from }) => {\n            /**\n             * This early return is there to account for some cases where a navigation transaction starts right after\n             * long-running pageload. We make sure that if `from` is undefined and a valid `startingURL` exists, we don't\n             * create an uneccessary navigation transaction.\n             *\n             * This was hard to duplicate, but this behavior stopped as soon as this fix was applied. This issue might also\n             * only be caused in certain development environments where the usage of a hot module reloader is causing\n             * errors.\n             */\n            if (from === undefined && startingUrl && startingUrl.indexOf(to) !== -1) {\n              startingUrl = undefined;\n              return;\n            }\n\n            if (from !== to) {\n              startingUrl = undefined;\n              startBrowserTracingNavigationSpan(client, {\n                name: WINDOW.location.pathname,\n                attributes: {\n                  [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n                  [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.browser',\n                },\n              });\n            }\n          });\n        }\n      }\n\n      if (markBackgroundSpan) {\n        registerBackgroundTabDetection();\n      }\n\n      if (enableInteractions) {\n        registerInteractionListener(idleTimeout, finalTimeout, childSpanTimeout, latestRoute);\n      }\n\n      if (enableInp) {\n        registerInpInteractionListener();\n      }\n\n      instrumentOutgoingRequests(client, {\n        traceFetch,\n        traceXHR,\n        trackFetchStreamPerformance,\n        tracePropagationTargets: client.getOptions().tracePropagationTargets,\n        shouldCreateSpanForRequest,\n        enableHTTPTimings,\n      });\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Manually start a page load span.\n * This will only do something if a browser tracing integration integration has been setup.\n *\n * If you provide a custom `traceOptions` object, it will be used to continue the trace\n * instead of the default behavior, which is to look it up on the <meta> tags.\n */\nexport function startBrowserTracingPageLoadSpan(\n  client: Client,\n  spanOptions: StartSpanOptions,\n  traceOptions?: { sentryTrace?: string | undefined; baggage?: string | undefined },\n): Span | undefined {\n  client.emit('startPageLoadSpan', spanOptions, traceOptions);\n\n  getCurrentScope().setTransactionName(spanOptions.name);\n\n  const span = getActiveSpan();\n  const op = span && spanToJSON(span).op;\n  return op === 'pageload' ? span : undefined;\n}\n\n/**\n * Manually start a navigation span.\n * This will only do something if a browser tracing integration has been setup.\n */\nexport function startBrowserTracingNavigationSpan(client: Client, spanOptions: StartSpanOptions): Span | undefined {\n  getIsolationScope().setPropagationContext({ traceId: generateTraceId() });\n  getCurrentScope().setPropagationContext({ traceId: generateTraceId() });\n\n  client.emit('startNavigationSpan', spanOptions);\n\n  getCurrentScope().setTransactionName(spanOptions.name);\n\n  const span = getActiveSpan();\n  const op = span && spanToJSON(span).op;\n  return op === 'navigation' ? span : undefined;\n}\n\n/** Returns the value of a meta tag */\nexport function getMetaContent(metaName: string): string | undefined {\n  // Can't specify generic to `getDomElement` because tracing can be used\n  // in a variety of environments, have to disable `no-unsafe-member-access`\n  // as a result.\n  // eslint-disable-next-line deprecation/deprecation\n  const metaTag = getDomElement(`meta[name=${metaName}]`);\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n  return metaTag ? metaTag.getAttribute('content') : undefined;\n}\n\n/** Start listener for interaction transactions */\nfunction registerInteractionListener(\n  idleTimeout: BrowserTracingOptions['idleTimeout'],\n  finalTimeout: BrowserTracingOptions['finalTimeout'],\n  childSpanTimeout: BrowserTracingOptions['childSpanTimeout'],\n  latestRoute: RouteInfo,\n): void {\n  let inflightInteractionSpan: Span | undefined;\n  const registerInteractionTransaction = (): void => {\n    const op = 'ui.action.click';\n\n    const activeSpan = getActiveSpan();\n    const rootSpan = activeSpan && getRootSpan(activeSpan);\n    if (rootSpan) {\n      const currentRootSpanOp = spanToJSON(rootSpan).op;\n      if (['navigation', 'pageload'].includes(currentRootSpanOp as string)) {\n        DEBUG_BUILD &&\n          logger.warn(`[Tracing] Did not create ${op} span because a pageload or navigation span is in progress.`);\n        return undefined;\n      }\n    }\n\n    if (inflightInteractionSpan) {\n      inflightInteractionSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, 'interactionInterrupted');\n      inflightInteractionSpan.end();\n      inflightInteractionSpan = undefined;\n    }\n\n    if (!latestRoute.name) {\n      DEBUG_BUILD && logger.warn(`[Tracing] Did not create ${op} transaction because _latestRouteName is missing.`);\n      return undefined;\n    }\n\n    inflightInteractionSpan = startIdleSpan(\n      {\n        name: latestRoute.name,\n        op,\n        attributes: {\n          [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: latestRoute.source || 'url',\n        },\n      },\n      {\n        idleTimeout,\n        finalTimeout,\n        childSpanTimeout,\n      },\n    );\n  };\n\n  if (WINDOW.document) {\n    addEventListener('click', registerInteractionTransaction, { once: false, capture: true });\n  }\n}\n","import {\n  SENTRY_XHR_DATA_KEY,\n  addPerformanceInstrumentationHandler,\n  addXhrInstrumentationHandler,\n} from '@sentry-internal/browser-utils';\nimport type { Client, HandlerDataXhr, SentryWrappedXMLHttpRequest, Span } from '@sentry/core';\nimport {\n  SEMANTIC_ATTRIBUTE_SENTRY_OP,\n  SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n  SentryNonRecordingSpan,\n  addFetchEndInstrumentationHandler,\n  addFetchInstrumentationHandler,\n  browserPerformanceTimeOrigin,\n  getActiveSpan,\n  getTraceData,\n  hasTracingEnabled,\n  instrumentFetchRequest,\n  parseUrl,\n  setHttpStatus,\n  spanToJSON,\n  startInactiveSpan,\n  stringMatchesSomePattern,\n} from '@sentry/core';\nimport { WINDOW } from '../helpers';\n\n/** Options for Request Instrumentation */\nexport interface RequestInstrumentationOptions {\n  /**\n   * List of strings and/or Regular Expressions used to determine which outgoing requests will have `sentry-trace` and `baggage`\n   * headers attached.\n   *\n   * **Default:** If this option is not provided, tracing headers will be attached to all outgoing requests.\n   * If you are using a browser SDK, by default, tracing headers will only be attached to outgoing requests to the same origin.\n   *\n   * **Disclaimer:** Carelessly setting this option in browser environments may result into CORS errors!\n   * Only attach tracing headers to requests to the same origin, or to requests to services you can control CORS headers of.\n   * Cross-origin requests, meaning requests to a different domain, for example a request to `https://api.example.com/` while you're on `https://example.com/`, take special care.\n   * If you are attaching headers to cross-origin requests, make sure the backend handling the request returns a `\"Access-Control-Allow-Headers: sentry-trace, baggage\"` header to ensure your requests aren't blocked.\n   *\n   * If you provide a `tracePropagationTargets` array, the entries you provide will be matched against the entire URL of the outgoing request.\n   * If you are using a browser SDK, the entries will also be matched against the pathname of the outgoing requests.\n   * This is so you can have matchers for relative requests, for example, `/^\\/api/` if you want to trace requests to your `/api` routes on the same domain.\n   *\n   * If any of the two match any of the provided values, tracing headers will be attached to the outgoing request.\n   * Both, the string values, and the RegExes you provide in the array will match if they partially match the URL or pathname.\n   *\n   * Examples:\n   * - `tracePropagationTargets: [/^\\/api/]` and request to `https://same-origin.com/api/posts`:\n   *   - Tracing headers will be attached because the request is sent to the same origin and the regex matches the pathname \"/api/posts\".\n   * - `tracePropagationTargets: [/^\\/api/]` and request to `https://different-origin.com/api/posts`:\n   *   - Tracing headers will not be attached because the pathname will only be compared when the request target lives on the same origin.\n   * - `tracePropagationTargets: [/^\\/api/, 'https://external-api.com']` and request to `https://external-api.com/v1/data`:\n   *   - Tracing headers will be attached because the request URL matches the string `'https://external-api.com'`.\n   */\n  tracePropagationTargets?: Array<string | RegExp>;\n\n  /**\n   * Flag to disable patching all together for fetch requests.\n   *\n   * Default: true\n   */\n  traceFetch: boolean;\n\n  /**\n   * Flag to disable patching all together for xhr requests.\n   *\n   * Default: true\n   */\n  traceXHR: boolean;\n\n  /**\n   * Flag to disable tracking of long-lived streams, like server-sent events (SSE) via fetch.\n   * Do not enable this in case you have live streams or very long running streams.\n   *\n   * Disabled by default since it can lead to issues with streams using the `cancel()` api\n   * (https://github.com/getsentry/sentry-javascript/issues/13950)\n   *\n   * Default: false\n   */\n  trackFetchStreamPerformance: boolean;\n\n  /**\n   * If true, Sentry will capture http timings and add them to the corresponding http spans.\n   *\n   * Default: true\n   */\n  enableHTTPTimings: boolean;\n\n  /**\n   * This function will be called before creating a span for a request with the given url.\n   * Return false if you don't want a span for the given url.\n   *\n   * Default: (url: string) => true\n   */\n  shouldCreateSpanForRequest?(this: void, url: string): boolean;\n}\n\nconst responseToSpanId = new WeakMap<object, string>();\nconst spanIdToEndTimestamp = new Map<string, number>();\n\nexport const defaultRequestInstrumentationOptions: RequestInstrumentationOptions = {\n  traceFetch: true,\n  traceXHR: true,\n  enableHTTPTimings: true,\n  trackFetchStreamPerformance: false,\n};\n\n/** Registers span creators for xhr and fetch requests  */\nexport function instrumentOutgoingRequests(client: Client, _options?: Partial<RequestInstrumentationOptions>): void {\n  const {\n    traceFetch,\n    traceXHR,\n    trackFetchStreamPerformance,\n    shouldCreateSpanForRequest,\n    enableHTTPTimings,\n    tracePropagationTargets,\n  } = {\n    traceFetch: defaultRequestInstrumentationOptions.traceFetch,\n    traceXHR: defaultRequestInstrumentationOptions.traceXHR,\n    trackFetchStreamPerformance: defaultRequestInstrumentationOptions.trackFetchStreamPerformance,\n    ..._options,\n  };\n\n  const shouldCreateSpan =\n    typeof shouldCreateSpanForRequest === 'function' ? shouldCreateSpanForRequest : (_: string) => true;\n\n  const shouldAttachHeadersWithTargets = (url: string): boolean => shouldAttachHeaders(url, tracePropagationTargets);\n\n  const spans: Record<string, Span> = {};\n\n  if (traceFetch) {\n    // Keeping track of http requests, whose body payloads resolved later than the initial resolved request\n    // e.g. streaming using server sent events (SSE)\n    client.addEventProcessor(event => {\n      if (event.type === 'transaction' && event.spans) {\n        event.spans.forEach(span => {\n          if (span.op === 'http.client') {\n            const updatedTimestamp = spanIdToEndTimestamp.get(span.span_id);\n            if (updatedTimestamp) {\n              span.timestamp = updatedTimestamp / 1000;\n              spanIdToEndTimestamp.delete(span.span_id);\n            }\n          }\n        });\n      }\n      return event;\n    });\n\n    if (trackFetchStreamPerformance) {\n      addFetchEndInstrumentationHandler(handlerData => {\n        if (handlerData.response) {\n          const span = responseToSpanId.get(handlerData.response);\n          if (span && handlerData.endTimestamp) {\n            spanIdToEndTimestamp.set(span, handlerData.endTimestamp);\n          }\n        }\n      });\n    }\n\n    addFetchInstrumentationHandler(handlerData => {\n      const createdSpan = instrumentFetchRequest(handlerData, shouldCreateSpan, shouldAttachHeadersWithTargets, spans);\n\n      if (handlerData.response && handlerData.fetchData.__span) {\n        responseToSpanId.set(handlerData.response, handlerData.fetchData.__span);\n      }\n\n      // We cannot use `window.location` in the generic fetch instrumentation,\n      // but we need it for reliable `server.address` attribute.\n      // so we extend this in here\n      if (createdSpan) {\n        const fullUrl = getFullURL(handlerData.fetchData.url);\n        const host = fullUrl ? parseUrl(fullUrl).host : undefined;\n        createdSpan.setAttributes({\n          'http.url': fullUrl,\n          'server.address': host,\n        });\n      }\n\n      if (enableHTTPTimings && createdSpan) {\n        addHTTPTimings(createdSpan);\n      }\n    });\n  }\n\n  if (traceXHR) {\n    addXhrInstrumentationHandler(handlerData => {\n      const createdSpan = xhrCallback(handlerData, shouldCreateSpan, shouldAttachHeadersWithTargets, spans);\n      if (enableHTTPTimings && createdSpan) {\n        addHTTPTimings(createdSpan);\n      }\n    });\n  }\n}\n\nfunction isPerformanceResourceTiming(entry: PerformanceEntry): entry is PerformanceResourceTiming {\n  return (\n    entry.entryType === 'resource' &&\n    'initiatorType' in entry &&\n    typeof (entry as PerformanceResourceTiming).nextHopProtocol === 'string' &&\n    (entry.initiatorType === 'fetch' || entry.initiatorType === 'xmlhttprequest')\n  );\n}\n\n/**\n * Creates a temporary observer to listen to the next fetch/xhr resourcing timings,\n * so that when timings hit their per-browser limit they don't need to be removed.\n *\n * @param span A span that has yet to be finished, must contain `url` on data.\n */\nfunction addHTTPTimings(span: Span): void {\n  const { url } = spanToJSON(span).data || {};\n\n  if (!url || typeof url !== 'string') {\n    return;\n  }\n\n  const cleanup = addPerformanceInstrumentationHandler('resource', ({ entries }) => {\n    entries.forEach(entry => {\n      if (isPerformanceResourceTiming(entry) && entry.name.endsWith(url)) {\n        const spanData = resourceTimingEntryToSpanData(entry);\n        spanData.forEach(data => span.setAttribute(...data));\n        // In the next tick, clean this handler up\n        // We have to wait here because otherwise this cleans itself up before it is fully done\n        setTimeout(cleanup);\n      }\n    });\n  });\n}\n\n/**\n * Converts ALPN protocol ids to name and version.\n *\n * (https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids)\n * @param nextHopProtocol PerformanceResourceTiming.nextHopProtocol\n */\nexport function extractNetworkProtocol(nextHopProtocol: string): { name: string; version: string } {\n  let name = 'unknown';\n  let version = 'unknown';\n  let _name = '';\n  for (const char of nextHopProtocol) {\n    // http/1.1 etc.\n    if (char === '/') {\n      [name, version] = nextHopProtocol.split('/') as [string, string];\n      break;\n    }\n    // h2, h3 etc.\n    if (!isNaN(Number(char))) {\n      name = _name === 'h' ? 'http' : _name;\n      version = nextHopProtocol.split(_name)[1] as string;\n      break;\n    }\n    _name += char;\n  }\n  if (_name === nextHopProtocol) {\n    // webrtc, ftp, etc.\n    name = _name;\n  }\n  return { name, version };\n}\n\nfunction getAbsoluteTime(time: number = 0): number {\n  return ((browserPerformanceTimeOrigin || performance.timeOrigin) + time) / 1000;\n}\n\nfunction resourceTimingEntryToSpanData(resourceTiming: PerformanceResourceTiming): [string, string | number][] {\n  const { name, version } = extractNetworkProtocol(resourceTiming.nextHopProtocol);\n\n  const timingSpanData: [string, string | number][] = [];\n\n  timingSpanData.push(['network.protocol.version', version], ['network.protocol.name', name]);\n\n  if (!browserPerformanceTimeOrigin) {\n    return timingSpanData;\n  }\n  return [\n    ...timingSpanData,\n    ['http.request.redirect_start', getAbsoluteTime(resourceTiming.redirectStart)],\n    ['http.request.fetch_start', getAbsoluteTime(resourceTiming.fetchStart)],\n    ['http.request.domain_lookup_start', getAbsoluteTime(resourceTiming.domainLookupStart)],\n    ['http.request.domain_lookup_end', getAbsoluteTime(resourceTiming.domainLookupEnd)],\n    ['http.request.connect_start', getAbsoluteTime(resourceTiming.connectStart)],\n    ['http.request.secure_connection_start', getAbsoluteTime(resourceTiming.secureConnectionStart)],\n    ['http.request.connection_end', getAbsoluteTime(resourceTiming.connectEnd)],\n    ['http.request.request_start', getAbsoluteTime(resourceTiming.requestStart)],\n    ['http.request.response_start', getAbsoluteTime(resourceTiming.responseStart)],\n    ['http.request.response_end', getAbsoluteTime(resourceTiming.responseEnd)],\n  ];\n}\n\n/**\n * A function that determines whether to attach tracing headers to a request.\n * We only export this function for testing purposes.\n */\nexport function shouldAttachHeaders(\n  targetUrl: string,\n  tracePropagationTargets: (string | RegExp)[] | undefined,\n): boolean {\n  // window.location.href not being defined is an edge case in the browser but we need to handle it.\n  // Potentially dangerous situations where it may not be defined: Browser Extensions, Web Workers, patching of the location obj\n  const href: string | undefined = WINDOW.location && WINDOW.location.href;\n\n  if (!href) {\n    // If there is no window.location.origin, we default to only attaching tracing headers to relative requests, i.e. ones that start with `/`\n    // BIG DISCLAIMER: Users can call URLs with a double slash (fetch(\"//example.com/api\")), this is a shorthand for \"send to the same protocol\",\n    // so we need a to exclude those requests, because they might be cross origin.\n    const isRelativeSameOriginRequest = !!targetUrl.match(/^\\/(?!\\/)/);\n    if (!tracePropagationTargets) {\n      return isRelativeSameOriginRequest;\n    } else {\n      return stringMatchesSomePattern(targetUrl, tracePropagationTargets);\n    }\n  } else {\n    let resolvedUrl;\n    let currentOrigin;\n\n    // URL parsing may fail, we default to not attaching trace headers in that case.\n    try {\n      resolvedUrl = new URL(targetUrl, href);\n      currentOrigin = new URL(href).origin;\n    } catch (e) {\n      return false;\n    }\n\n    const isSameOriginRequest = resolvedUrl.origin === currentOrigin;\n    if (!tracePropagationTargets) {\n      return isSameOriginRequest;\n    } else {\n      return (\n        stringMatchesSomePattern(resolvedUrl.toString(), tracePropagationTargets) ||\n        (isSameOriginRequest && stringMatchesSomePattern(resolvedUrl.pathname, tracePropagationTargets))\n      );\n    }\n  }\n}\n\n/**\n * Create and track xhr request spans\n *\n * @returns Span if a span was created, otherwise void.\n */\nexport function xhrCallback(\n  handlerData: HandlerDataXhr,\n  shouldCreateSpan: (url: string) => boolean,\n  shouldAttachHeaders: (url: string) => boolean,\n  spans: Record<string, Span>,\n): Span | undefined {\n  const xhr = handlerData.xhr;\n  const sentryXhrData = xhr && xhr[SENTRY_XHR_DATA_KEY];\n\n  if (!xhr || xhr.__sentry_own_request__ || !sentryXhrData) {\n    return undefined;\n  }\n\n  const shouldCreateSpanResult = hasTracingEnabled() && shouldCreateSpan(sentryXhrData.url);\n\n  // check first if the request has finished and is tracked by an existing span which should now end\n  if (handlerData.endTimestamp && shouldCreateSpanResult) {\n    const spanId = xhr.__sentry_xhr_span_id__;\n    if (!spanId) return;\n\n    const span = spans[spanId];\n    if (span && sentryXhrData.status_code !== undefined) {\n      setHttpStatus(span, sentryXhrData.status_code);\n      span.end();\n\n      // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n      delete spans[spanId];\n    }\n    return undefined;\n  }\n\n  const fullUrl = getFullURL(sentryXhrData.url);\n  const host = fullUrl ? parseUrl(fullUrl).host : undefined;\n\n  const hasParent = !!getActiveSpan();\n\n  const span =\n    shouldCreateSpanResult && hasParent\n      ? startInactiveSpan({\n          name: `${sentryXhrData.method} ${sentryXhrData.url}`,\n          attributes: {\n            type: 'xhr',\n            'http.method': sentryXhrData.method,\n            'http.url': fullUrl,\n            url: sentryXhrData.url,\n            'server.address': host,\n            [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.browser',\n            [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.client',\n          },\n        })\n      : new SentryNonRecordingSpan();\n\n  xhr.__sentry_xhr_span_id__ = span.spanContext().spanId;\n  spans[xhr.__sentry_xhr_span_id__] = span;\n\n  if (shouldAttachHeaders(sentryXhrData.url)) {\n    addTracingHeadersToXhrRequest(\n      xhr,\n      // If performance is disabled (TWP) or there's no active root span (pageload/navigation/interaction),\n      // we do not want to use the span as base for the trace headers,\n      // which means that the headers will be generated from the scope and the sampling decision is deferred\n      hasTracingEnabled() && hasParent ? span : undefined,\n    );\n  }\n\n  return span;\n}\n\nfunction addTracingHeadersToXhrRequest(xhr: SentryWrappedXMLHttpRequest, span?: Span): void {\n  const { 'sentry-trace': sentryTrace, baggage } = getTraceData({ span });\n\n  if (sentryTrace) {\n    setHeaderOnXhr(xhr, sentryTrace, baggage);\n  }\n}\n\nfunction setHeaderOnXhr(\n  xhr: SentryWrappedXMLHttpRequest,\n  sentryTraceHeader: string,\n  sentryBaggageHeader: string | undefined,\n): void {\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    xhr.setRequestHeader!('sentry-trace', sentryTraceHeader);\n    if (sentryBaggageHeader) {\n      // From MDN: \"If this method is called several times with the same header, the values are merged into one single request header.\"\n      // We can therefore simply set a baggage header without checking what was there before\n      // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/setRequestHeader\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      xhr.setRequestHeader!('baggage', sentryBaggageHeader);\n    }\n  } catch (_) {\n    // Error: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED.\n  }\n}\n\nfunction getFullURL(url: string): string | undefined {\n  try {\n    // By adding a base URL to new URL(), this will also work for relative urls\n    // If `url` is a full URL, the base URL is ignored anyhow\n    const parsed = new URL(url, WINDOW.location.origin);\n    return parsed.href;\n  } catch {\n    return undefined;\n  }\n}\n","import { clearCachedImplementation, getNativeImplementation } from '@sentry-internal/browser-utils';\nimport type { Transport, TransportMakeRequestResponse, TransportRequest } from '@sentry/core';\nimport { createTransport, rejectedSyncPromise } from '@sentry/core';\nimport type { WINDOW } from '../helpers';\nimport type { BrowserTransportOptions } from './types';\n\n/**\n * Creates a Transport that uses the Fetch API to send events to Sentry.\n */\nexport function makeFetchTransport(\n  options: BrowserTransportOptions,\n  nativeFetch: typeof WINDOW.fetch | undefined = getNativeImplementation('fetch'),\n): Transport {\n  let pendingBodySize = 0;\n  let pendingCount = 0;\n\n  function makeRequest(request: TransportRequest): PromiseLike<TransportMakeRequestResponse> {\n    const requestSize = request.body.length;\n    pendingBodySize += requestSize;\n    pendingCount++;\n\n    const requestOptions: RequestInit = {\n      body: request.body,\n      method: 'POST',\n      referrerPolicy: 'origin',\n      headers: options.headers,\n      // Outgoing requests are usually cancelled when navigating to a different page, causing a \"TypeError: Failed to\n      // fetch\" error and sending a \"network_error\" client-outcome - in Chrome, the request status shows \"(cancelled)\".\n      // The `keepalive` flag keeps outgoing requests alive, even when switching pages. We want this since we're\n      // frequently sending events right before the user is switching pages (eg. when finishing navigation transactions).\n      // Gotchas:\n      // - `keepalive` isn't supported by Firefox\n      // - As per spec (https://fetch.spec.whatwg.org/#http-network-or-cache-fetch):\n      //   If the sum of contentLength and inflightKeepaliveBytes is greater than 64 kibibytes, then return a network error.\n      //   We will therefore only activate the flag when we're below that limit.\n      // There is also a limit of requests that can be open at the same time, so we also limit this to 15\n      // See https://github.com/getsentry/sentry-javascript/pull/7553 for details\n      keepalive: pendingBodySize <= 60_000 && pendingCount < 15,\n      ...options.fetchOptions,\n    };\n\n    if (!nativeFetch) {\n      clearCachedImplementation('fetch');\n      return rejectedSyncPromise('No fetch implementation available');\n    }\n\n    try {\n      // TODO: This may need a `suppressTracing` call in the future when we switch the browser SDK to OTEL\n      return nativeFetch(options.url, requestOptions).then(response => {\n        pendingBodySize -= requestSize;\n        pendingCount--;\n        return {\n          statusCode: response.status,\n          headers: {\n            'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n            'retry-after': response.headers.get('Retry-After'),\n          },\n        };\n      });\n    } catch (e) {\n      clearCachedImplementation('fetch');\n      pendingBodySize -= requestSize;\n      pendingCount--;\n      return rejectedSyncPromise(e);\n    }\n  }\n\n  return createTransport(options, makeRequest);\n}\n","import type { BaseTransportOptions, Envelope, OfflineStore, OfflineTransportOptions, Transport } from '@sentry/core';\nimport { makeOfflineTransport, parseEnvelope, serializeEnvelope } from '@sentry/core';\nimport { makeFetchTransport } from './fetch';\n\n// 'Store', 'promisifyRequest' and 'createStore' were originally copied from the 'idb-keyval' package before being\n// modified and simplified: https://github.com/jakearchibald/idb-keyval\n//\n// At commit: 0420a704fd6cbb4225429c536b1f61112d012fca\n// Original license:\n\n// Copyright 2016, Jake Archibald\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//   http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ntype Store = <T>(callback: (store: IDBObjectStore) => T | PromiseLike<T>) => Promise<T>;\n\nfunction promisifyRequest<T = undefined>(request: IDBRequest<T> | IDBTransaction): Promise<T> {\n  return new Promise<T>((resolve, reject) => {\n    // @ts-expect-error - file size hacks\n    request.oncomplete = request.onsuccess = () => resolve(request.result);\n    // @ts-expect-error - file size hacks\n    request.onabort = request.onerror = () => reject(request.error);\n  });\n}\n\n/** Create or open an IndexedDb store */\nexport function createStore(dbName: string, storeName: string): Store {\n  const request = indexedDB.open(dbName);\n  request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n  const dbp = promisifyRequest(request);\n\n  return callback => dbp.then(db => callback(db.transaction(storeName, 'readwrite').objectStore(storeName)));\n}\n\nfunction keys(store: IDBObjectStore): Promise<number[]> {\n  return promisifyRequest(store.getAllKeys() as IDBRequest<number[]>);\n}\n\n/** Insert into the end of the store */\nexport function push(store: Store, value: Uint8Array | string, maxQueueSize: number): Promise<void> {\n  return store(store => {\n    return keys(store).then(keys => {\n      if (keys.length >= maxQueueSize) {\n        return;\n      }\n\n      // We insert with an incremented key so that the entries are popped in order\n      store.put(value, Math.max(...keys, 0) + 1);\n      return promisifyRequest(store.transaction);\n    });\n  });\n}\n\n/** Insert into the front of the store */\nexport function unshift(store: Store, value: Uint8Array | string, maxQueueSize: number): Promise<void> {\n  return store(store => {\n    return keys(store).then(keys => {\n      if (keys.length >= maxQueueSize) {\n        return;\n      }\n\n      // We insert with an decremented key so that the entries are popped in order\n      store.put(value, Math.min(...keys, 0) - 1);\n      return promisifyRequest(store.transaction);\n    });\n  });\n}\n\n/** Pop the oldest value from the store */\nexport function shift(store: Store): Promise<Uint8Array | string | undefined> {\n  return store(store => {\n    return keys(store).then(keys => {\n      const firstKey = keys[0];\n      if (firstKey == null) {\n        return undefined;\n      }\n\n      return promisifyRequest(store.get(firstKey)).then(value => {\n        store.delete(firstKey);\n        return promisifyRequest(store.transaction).then(() => value);\n      });\n    });\n  });\n}\n\nexport interface BrowserOfflineTransportOptions extends Omit<OfflineTransportOptions, 'createStore'> {\n  /**\n   * Name of indexedDb database to store envelopes in\n   * Default: 'sentry-offline'\n   */\n  dbName?: string;\n  /**\n   * Name of indexedDb object store to store envelopes in\n   * Default: 'queue'\n   */\n  storeName?: string;\n  /**\n   * Maximum number of envelopes to store\n   * Default: 30\n   */\n  maxQueueSize?: number;\n}\n\nfunction createIndexedDbStore(options: BrowserOfflineTransportOptions): OfflineStore {\n  let store: Store | undefined;\n\n  // Lazily create the store only when it's needed\n  function getStore(): Store {\n    if (store == undefined) {\n      store = createStore(options.dbName || 'sentry-offline', options.storeName || 'queue');\n    }\n\n    return store;\n  }\n\n  return {\n    push: async (env: Envelope) => {\n      try {\n        const serialized = await serializeEnvelope(env);\n        await push(getStore(), serialized, options.maxQueueSize || 30);\n      } catch (_) {\n        //\n      }\n    },\n    unshift: async (env: Envelope) => {\n      try {\n        const serialized = await serializeEnvelope(env);\n        await unshift(getStore(), serialized, options.maxQueueSize || 30);\n      } catch (_) {\n        //\n      }\n    },\n    shift: async () => {\n      try {\n        const deserialized = await shift(getStore());\n        if (deserialized) {\n          return parseEnvelope(deserialized);\n        }\n      } catch (_) {\n        //\n      }\n\n      return undefined;\n    },\n  };\n}\n\nfunction makeIndexedDbOfflineTransport<T>(\n  createTransport: (options: T) => Transport,\n): (options: T & BrowserOfflineTransportOptions) => Transport {\n  return options => createTransport({ ...options, createStore: createIndexedDbStore });\n}\n\n/**\n * Creates a transport that uses IndexedDb to store events when offline.\n */\nexport function makeBrowserOfflineTransport<T extends BaseTransportOptions>(\n  createTransport: (options: T) => Transport = makeFetchTransport,\n): (options: T & BrowserOfflineTransportOptions) => Transport {\n  return makeIndexedDbOfflineTransport<T>(makeOfflineTransport(createTransport));\n}\n","import { createEnvelope, dsnToString } from '@sentry/core';\nimport type { DsnComponents, EventEnvelope, SdkMetadata, UserFeedback, UserFeedbackItem } from '@sentry/core';\n\n/**\n * Creates an envelope from a user feedback.\n */\nexport function createUserFeedbackEnvelope(\n  feedback: UserFeedback,\n  {\n    metadata,\n    tunnel,\n    dsn,\n  }: {\n    metadata: SdkMetadata | undefined;\n    tunnel: string | undefined;\n    dsn: DsnComponents | undefined;\n  },\n): EventEnvelope {\n  const headers: EventEnvelope[0] = {\n    event_id: feedback.event_id,\n    sent_at: new Date().toISOString(),\n    ...(metadata &&\n      metadata.sdk && {\n        sdk: {\n          name: metadata.sdk.name,\n          version: metadata.sdk.version,\n        },\n      }),\n    ...(!!tunnel && !!dsn && { dsn: dsnToString(dsn) }),\n  };\n  const item = createUserFeedbackEnvelopeItem(feedback);\n\n  return createEnvelope(headers, [item]);\n}\n\nfunction createUserFeedbackEnvelopeItem(feedback: UserFeedback): UserFeedbackItem {\n  const feedbackHeaders: UserFeedbackItem[0] = {\n    type: 'user_report',\n  };\n  return [feedbackHeaders, feedback];\n}\n","import type { Event, FeatureFlag } from '@sentry/core';\n\nimport { getCurrentScope, logger } from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\n\n/**\n * Ordered LRU cache for storing feature flags in the scope context. The name\n * of each flag in the buffer is unique, and the output of getAll() is ordered\n * from oldest to newest.\n */\n\n/**\n * Max size of the LRU flag buffer stored in Sentry scope and event contexts.\n */\nexport const FLAG_BUFFER_SIZE = 100;\n\n/**\n * Copies feature flags that are in current scope context to the event context\n */\nexport function copyFlagsFromScopeToEvent(event: Event): Event {\n  const scope = getCurrentScope();\n  const flagContext = scope.getScopeData().contexts.flags;\n  const flagBuffer = flagContext ? flagContext.values : [];\n\n  if (!flagBuffer.length) {\n    return event;\n  }\n\n  if (event.contexts === undefined) {\n    event.contexts = {};\n  }\n  event.contexts.flags = { values: [...flagBuffer] };\n  return event;\n}\n\n/**\n * Creates a feature flags values array in current context if it does not exist\n * and inserts the flag into a FeatureFlag array while maintaining ordered LRU\n * properties. Not thread-safe. After inserting:\n * - `flags` is sorted in order of recency, with the newest flag at the end.\n * - No other flags with the same name exist in `flags`.\n * - The length of `flags` does not exceed `maxSize`. The oldest flag is evicted\n *  as needed.\n *\n * @param name     Name of the feature flag to insert.\n * @param value    Value of the feature flag.\n * @param maxSize  Max number of flags the buffer should store. It's recommended\n *   to keep this consistent across insertions. Default is FLAG_BUFFER_SIZE\n */\nexport function insertFlagToScope(name: string, value: unknown, maxSize: number = FLAG_BUFFER_SIZE): void {\n  const scopeContexts = getCurrentScope().getScopeData().contexts;\n  if (!scopeContexts.flags) {\n    scopeContexts.flags = { values: [] };\n  }\n  const flags = scopeContexts.flags.values as FeatureFlag[];\n  insertToFlagBuffer(flags, name, value, maxSize);\n}\n\n/**\n * Exported for tests. Currently only accepts boolean values (otherwise no-op).\n */\nexport function insertToFlagBuffer(flags: FeatureFlag[], name: string, value: unknown, maxSize: number): void {\n  if (typeof value !== 'boolean') {\n    return;\n  }\n\n  if (flags.length > maxSize) {\n    DEBUG_BUILD && logger.error(`[Feature Flags] insertToFlagBuffer called on a buffer larger than maxSize=${maxSize}`);\n    return;\n  }\n\n  // Check if the flag is already in the buffer - O(n)\n  const index = flags.findIndex(f => f.flag === name);\n\n  if (index !== -1) {\n    // The flag was found, remove it from its current position - O(n)\n    flags.splice(index, 1);\n  }\n\n  if (flags.length === maxSize) {\n    // If at capacity, pop the earliest flag - O(n)\n    flags.shift();\n  }\n\n  // Push the flag to the end - O(1)\n  flags.push({\n    flag: name,\n    result: value,\n  });\n}\n","import { SDK_VERSION, getClient } from '@sentry/core';\nimport type { IntegrationFn } from '@sentry/core';\nimport type { BrowserClient } from '../client';\nimport { WINDOW } from '../helpers';\n\n// This is a map of integration function method to bundle file name.\nconst LazyLoadableIntegrations = {\n  replayIntegration: 'replay',\n  replayCanvasIntegration: 'replay-canvas',\n  feedbackIntegration: 'feedback',\n  feedbackModalIntegration: 'feedback-modal',\n  feedbackScreenshotIntegration: 'feedback-screenshot',\n  captureConsoleIntegration: 'captureconsole',\n  contextLinesIntegration: 'contextlines',\n  linkedErrorsIntegration: 'linkederrors',\n  debugIntegration: 'debug',\n  dedupeIntegration: 'dedupe',\n  extraErrorDataIntegration: 'extraerrordata',\n  httpClientIntegration: 'httpclient',\n  reportingObserverIntegration: 'reportingobserver',\n  rewriteFramesIntegration: 'rewriteframes',\n  sessionTimingIntegration: 'sessiontiming',\n  browserProfilingIntegration: 'browserprofiling',\n  moduleMetadataIntegration: 'modulemetadata',\n} as const;\n\nconst WindowWithMaybeIntegration = WINDOW as {\n  Sentry?: Partial<Record<keyof typeof LazyLoadableIntegrations, IntegrationFn>>;\n};\n\n/**\n * Lazy load an integration from the CDN.\n * Rejects if the integration cannot be loaded.\n */\nexport async function lazyLoadIntegration(\n  name: keyof typeof LazyLoadableIntegrations,\n  scriptNonce?: string,\n): Promise<IntegrationFn> {\n  const bundle = LazyLoadableIntegrations[name];\n\n  // `window.Sentry` is only set when using a CDN bundle, but this method can also be used via the NPM package\n  const sentryOnWindow = (WindowWithMaybeIntegration.Sentry = WindowWithMaybeIntegration.Sentry || {});\n\n  if (!bundle) {\n    throw new Error(`Cannot lazy load integration: ${name}`);\n  }\n\n  // Bail if the integration already exists\n  const existing = sentryOnWindow[name];\n  // The `feedbackIntegration` is loaded by default in the CDN bundles,\n  // so we need to differentiate between the real integration and the shim.\n  // if only the shim exists, we still want to lazy load the real integration.\n  if (typeof existing === 'function' && !('_isShim' in existing)) {\n    return existing;\n  }\n\n  const url = getScriptURL(bundle);\n  const script = WINDOW.document.createElement('script');\n  script.src = url;\n  script.crossOrigin = 'anonymous';\n  script.referrerPolicy = 'origin';\n\n  if (scriptNonce) {\n    script.setAttribute('nonce', scriptNonce);\n  }\n\n  const waitForLoad = new Promise<void>((resolve, reject) => {\n    script.addEventListener('load', () => resolve());\n    script.addEventListener('error', reject);\n  });\n\n  const currentScript = WINDOW.document.currentScript;\n  const parent = WINDOW.document.body || WINDOW.document.head || (currentScript && currentScript.parentElement);\n\n  if (parent) {\n    parent.appendChild(script);\n  } else {\n    throw new Error(`Could not find parent element to insert lazy-loaded ${name} script`);\n  }\n\n  try {\n    await waitForLoad;\n  } catch {\n    throw new Error(`Error when loading integration: ${name}`);\n  }\n\n  const integrationFn = sentryOnWindow[name];\n\n  if (typeof integrationFn !== 'function') {\n    throw new Error(`Could not load integration: ${name}`);\n  }\n\n  return integrationFn;\n}\n\nfunction getScriptURL(bundle: string): string {\n  const client = getClient<BrowserClient>();\n  const options = client && client.getOptions();\n  const baseURL = (options && options.cdnBaseUrl) || 'https://browser.sentry-cdn.com';\n\n  return new URL(`/${SDK_VERSION}/${bundle}.min.js`, baseURL).toString();\n}\n","import type { DsnComponents, DsnLike, SdkInfo } from './types-hoist';\nimport { dsnToString, makeDsn } from './utils-hoist/dsn';\n\nconst SENTRY_API_VERSION = '7';\n\n/** Returns the prefix to construct Sentry ingestion API endpoints. */\nfunction getBaseApiEndpoint(dsn: DsnComponents): string {\n  const protocol = dsn.protocol ? `${dsn.protocol}:` : '';\n  const port = dsn.port ? `:${dsn.port}` : '';\n  return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : ''}/api/`;\n}\n\n/** Returns the ingest API endpoint for target. */\nfunction _getIngestEndpoint(dsn: DsnComponents): string {\n  return `${getBaseApiEndpoint(dsn)}${dsn.projectId}/envelope/`;\n}\n\n/** Returns a URL-encoded string with auth config suitable for a query string. */\nfunction _encodedAuth(dsn: DsnComponents, sdkInfo: SdkInfo | undefined): string {\n  const params: Record<string, string> = {\n    sentry_version: SENTRY_API_VERSION,\n  };\n\n  if (dsn.publicKey) {\n    // We send only the minimum set of required information. See\n    // https://github.com/getsentry/sentry-javascript/issues/2572.\n    params.sentry_key = dsn.publicKey;\n  }\n\n  if (sdkInfo) {\n    params.sentry_client = `${sdkInfo.name}/${sdkInfo.version}`;\n  }\n\n  return new URLSearchParams(params).toString();\n}\n\n/**\n * Returns the envelope endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\nexport function getEnvelopeEndpointWithUrlEncodedAuth(dsn: DsnComponents, tunnel?: string, sdkInfo?: SdkInfo): string {\n  return tunnel ? tunnel : `${_getIngestEndpoint(dsn)}?${_encodedAuth(dsn, sdkInfo)}`;\n}\n\n/** Returns the url to the report dialog endpoint. */\nexport function getReportDialogEndpoint(\n  dsnLike: DsnLike,\n  dialogOptions: {\n    // TODO(v9): Change this to  [key: string]: unknown;\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    [key: string]: any;\n    user?: { name?: string; email?: string };\n  },\n): string {\n  const dsn = makeDsn(dsnLike);\n  if (!dsn) {\n    return '';\n  }\n\n  const endpoint = `${getBaseApiEndpoint(dsn)}embed/error-page/`;\n\n  let encodedOptions = `dsn=${dsnToString(dsn)}`;\n  for (const key in dialogOptions) {\n    if (key === 'dsn') {\n      continue;\n    }\n\n    if (key === 'onClose') {\n      continue;\n    }\n\n    if (key === 'user') {\n      const user = dialogOptions.user;\n      if (!user) {\n        continue;\n      }\n      if (user.name) {\n        encodedOptions += `&name=${encodeURIComponent(user.name)}`;\n      }\n      if (user.email) {\n        encodedOptions += `&email=${encodeURIComponent(user.email)}`;\n      }\n    } else {\n      encodedOptions += `&${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key] as string)}`;\n    }\n  }\n\n  return `${endpoint}?${encodedOptions}`;\n}\n","import type { Carrier } from './../carrier';\nimport { getMainCarrier, getSentryCarrier } from './../carrier';\nimport { getStackAsyncContextStrategy } from './stackStrategy';\nimport type { AsyncContextStrategy } from './types';\n\n/**\n * @private Private API with no semver guarantees!\n *\n * Sets the global async context strategy\n */\nexport function setAsyncContextStrategy(strategy: AsyncContextStrategy | undefined): void {\n  // Get main carrier (global for every environment)\n  const registry = getMainCarrier();\n  const sentry = getSentryCarrier(registry);\n  sentry.acs = strategy;\n}\n\n/**\n * Get the current async context strategy.\n * If none has been setup, the default will be used.\n */\nexport function getAsyncContextStrategy(carrier: Carrier): AsyncContextStrategy {\n  const sentry = getSentryCarrier(carrier);\n\n  if (sentry.acs) {\n    return sentry.acs;\n  }\n\n  // Otherwise, use the default one (stack)\n  return getStackAsyncContextStrategy();\n}\n","import { getDefaultCurrentScope, getDefaultIsolationScope } from '../defaultScopes';\nimport { Scope } from '../scope';\nimport type { Client, Scope as ScopeInterface } from '../types-hoist';\nimport { isThenable } from '../utils-hoist/is';\nimport { getMainCarrier, getSentryCarrier } from './../carrier';\nimport type { AsyncContextStrategy } from './types';\n\ninterface Layer {\n  client?: Client;\n  scope: ScopeInterface;\n}\n\n/**\n * This is an object that holds a stack of scopes.\n */\nexport class AsyncContextStack {\n  private readonly _stack: [Layer, ...Layer[]];\n  private _isolationScope: ScopeInterface;\n\n  public constructor(scope?: ScopeInterface, isolationScope?: ScopeInterface) {\n    let assignedScope;\n    if (!scope) {\n      assignedScope = new Scope();\n    } else {\n      assignedScope = scope;\n    }\n\n    let assignedIsolationScope;\n    if (!isolationScope) {\n      assignedIsolationScope = new Scope();\n    } else {\n      assignedIsolationScope = isolationScope;\n    }\n\n    // scope stack for domains or the process\n    this._stack = [{ scope: assignedScope }];\n    this._isolationScope = assignedIsolationScope;\n  }\n\n  /**\n   * Fork a scope for the stack.\n   */\n  public withScope<T>(callback: (scope: ScopeInterface) => T): T {\n    const scope = this._pushScope();\n\n    let maybePromiseResult: T;\n    try {\n      maybePromiseResult = callback(scope);\n    } catch (e) {\n      this._popScope();\n      throw e;\n    }\n\n    if (isThenable(maybePromiseResult)) {\n      // @ts-expect-error - isThenable returns the wrong type\n      return maybePromiseResult.then(\n        res => {\n          this._popScope();\n          return res;\n        },\n        e => {\n          this._popScope();\n          throw e;\n        },\n      );\n    }\n\n    this._popScope();\n    return maybePromiseResult;\n  }\n\n  /**\n   * Get the client of the stack.\n   */\n  public getClient<C extends Client>(): C | undefined {\n    return this.getStackTop().client as C;\n  }\n\n  /**\n   * Returns the scope of the top stack.\n   */\n  public getScope(): ScopeInterface {\n    return this.getStackTop().scope;\n  }\n\n  /**\n   * Get the isolation scope for the stack.\n   */\n  public getIsolationScope(): ScopeInterface {\n    return this._isolationScope;\n  }\n\n  /**\n   * Returns the topmost scope layer in the order domain > local > process.\n   */\n  public getStackTop(): Layer {\n    return this._stack[this._stack.length - 1] as Layer;\n  }\n\n  /**\n   * Push a scope to the stack.\n   */\n  private _pushScope(): ScopeInterface {\n    // We want to clone the content of prev scope\n    const scope = this.getScope().clone();\n    this._stack.push({\n      client: this.getClient(),\n      scope,\n    });\n    return scope;\n  }\n\n  /**\n   * Pop a scope from the stack.\n   */\n  private _popScope(): boolean {\n    if (this._stack.length <= 1) return false;\n    return !!this._stack.pop();\n  }\n}\n\n/**\n * Get the global async context stack.\n * This will be removed during the v8 cycle and is only here to make migration easier.\n */\nfunction getAsyncContextStack(): AsyncContextStack {\n  const registry = getMainCarrier();\n  const sentry = getSentryCarrier(registry);\n\n  return (sentry.stack = sentry.stack || new AsyncContextStack(getDefaultCurrentScope(), getDefaultIsolationScope()));\n}\n\nfunction withScope<T>(callback: (scope: ScopeInterface) => T): T {\n  return getAsyncContextStack().withScope(callback);\n}\n\nfunction withSetScope<T>(scope: ScopeInterface, callback: (scope: ScopeInterface) => T): T {\n  const stack = getAsyncContextStack() as AsyncContextStack;\n  return stack.withScope(() => {\n    stack.getStackTop().scope = scope;\n    return callback(scope);\n  });\n}\n\nfunction withIsolationScope<T>(callback: (isolationScope: ScopeInterface) => T): T {\n  return getAsyncContextStack().withScope(() => {\n    return callback(getAsyncContextStack().getIsolationScope());\n  });\n}\n\n/**\n * Get the stack-based async context strategy.\n */\nexport function getStackAsyncContextStrategy(): AsyncContextStrategy {\n  return {\n    withIsolationScope,\n    withScope,\n    withSetScope,\n    withSetIsolationScope: <T>(_isolationScope: ScopeInterface, callback: (isolationScope: ScopeInterface) => T) => {\n      return withIsolationScope(callback);\n    },\n    getCurrentScope: () => getAsyncContextStack().getScope(),\n    getIsolationScope: () => getAsyncContextStack().getIsolationScope(),\n  };\n}\n","/* eslint-disable max-lines */\nimport type {\n  Breadcrumb,\n  BreadcrumbHint,\n  Client,\n  ClientOptions,\n  DataCategory,\n  DsnComponents,\n  DynamicSamplingContext,\n  Envelope,\n  ErrorEvent,\n  Event,\n  EventDropReason,\n  EventHint,\n  EventProcessor,\n  FeedbackEvent,\n  Integration,\n  Outcome,\n  ParameterizedString,\n  SdkMetadata,\n  Session,\n  SessionAggregates,\n  SeverityLevel,\n  Span,\n  SpanAttributes,\n  SpanContextData,\n  SpanJSON,\n  StartSpanOptions,\n  TransactionEvent,\n  Transport,\n  TransportMakeRequestResponse,\n} from './types-hoist';\n\nimport { getEnvelopeEndpointWithUrlEncodedAuth } from './api';\nimport { getCurrentScope, getIsolationScope, getTraceContextFromScope } from './currentScopes';\nimport { DEBUG_BUILD } from './debug-build';\nimport { createEventEnvelope, createSessionEnvelope } from './envelope';\nimport type { IntegrationIndex } from './integration';\nimport { afterSetupIntegrations } from './integration';\nimport { setupIntegration, setupIntegrations } from './integration';\nimport type { Scope } from './scope';\nimport { updateSession } from './session';\nimport { getDynamicSamplingContextFromScope } from './tracing/dynamicSamplingContext';\nimport { createClientReportEnvelope } from './utils-hoist/clientreport';\nimport { dsnToString, makeDsn } from './utils-hoist/dsn';\nimport { addItemToEnvelope, createAttachmentEnvelopeItem } from './utils-hoist/envelope';\nimport { SentryError } from './utils-hoist/error';\nimport { isParameterizedString, isPlainObject, isPrimitive, isThenable } from './utils-hoist/is';\nimport { consoleSandbox, logger } from './utils-hoist/logger';\nimport { checkOrSetAlreadyCaught, uuid4 } from './utils-hoist/misc';\nimport { SyncPromise, rejectedSyncPromise, resolvedSyncPromise } from './utils-hoist/syncpromise';\nimport { parseSampleRate } from './utils/parseSampleRate';\nimport { prepareEvent } from './utils/prepareEvent';\nimport { showSpanDropWarning } from './utils/spanUtils';\n\nconst ALREADY_SEEN_ERROR = \"Not capturing exception because it's already been captured.\";\n\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event, it is passed through\n * {@link BaseClient._prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends BaseClient<NodeOptions> {\n *   public constructor(options: NodeOptions) {\n *     super(options);\n *   }\n *\n *   // ...\n * }\n */\nexport abstract class BaseClient<O extends ClientOptions> implements Client<O> {\n  /** Options passed to the SDK. */\n  protected readonly _options: O;\n\n  /** The client Dsn, if specified in options. Without this Dsn, the SDK will be disabled. */\n  protected readonly _dsn?: DsnComponents;\n\n  protected readonly _transport?: Transport;\n\n  /** Array of set up integrations. */\n  protected _integrations: IntegrationIndex;\n\n  /** Number of calls being processed */\n  protected _numProcessing: number;\n\n  protected _eventProcessors: EventProcessor[];\n\n  /** Holds flushable  */\n  private _outcomes: { [key: string]: number };\n\n  // eslint-disable-next-line @typescript-eslint/ban-types\n  private _hooks: Record<string, Function[]>;\n\n  /**\n   * Initializes this client instance.\n   *\n   * @param options Options for the client.\n   */\n  protected constructor(options: O) {\n    this._options = options;\n    this._integrations = {};\n    this._numProcessing = 0;\n    this._outcomes = {};\n    this._hooks = {};\n    this._eventProcessors = [];\n\n    if (options.dsn) {\n      this._dsn = makeDsn(options.dsn);\n    } else {\n      DEBUG_BUILD && logger.warn('No DSN provided, client will not send events.');\n    }\n\n    if (this._dsn) {\n      const url = getEnvelopeEndpointWithUrlEncodedAuth(\n        this._dsn,\n        options.tunnel,\n        options._metadata ? options._metadata.sdk : undefined,\n      );\n      this._transport = options.transport({\n        tunnel: this._options.tunnel,\n        recordDroppedEvent: this.recordDroppedEvent.bind(this),\n        ...options.transportOptions,\n        url,\n      });\n    }\n\n    // TODO(v9): Remove this deprecation warning\n    const tracingOptions = ['enableTracing', 'tracesSampleRate', 'tracesSampler'] as const;\n    const undefinedOption = tracingOptions.find(option => option in options && options[option] == undefined);\n    if (undefinedOption) {\n      consoleSandbox(() => {\n        // eslint-disable-next-line no-console\n        console.warn(\n          `[Sentry] Deprecation warning: \\`${undefinedOption}\\` is set to undefined, which leads to tracing being enabled. In v9, a value of \\`undefined\\` will result in tracing being disabled.`,\n        );\n      });\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureException(exception: unknown, hint?: EventHint, scope?: Scope): string {\n    const eventId = uuid4();\n\n    // ensure we haven't captured this very object before\n    if (checkOrSetAlreadyCaught(exception)) {\n      DEBUG_BUILD && logger.log(ALREADY_SEEN_ERROR);\n      return eventId;\n    }\n\n    const hintWithEventId = {\n      event_id: eventId,\n      ...hint,\n    };\n\n    this._process(\n      this.eventFromException(exception, hintWithEventId).then(event =>\n        this._captureEvent(event, hintWithEventId, scope),\n      ),\n    );\n\n    return hintWithEventId.event_id;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureMessage(\n    message: ParameterizedString,\n    level?: SeverityLevel,\n    hint?: EventHint,\n    currentScope?: Scope,\n  ): string {\n    const hintWithEventId = {\n      event_id: uuid4(),\n      ...hint,\n    };\n\n    const eventMessage = isParameterizedString(message) ? message : String(message);\n\n    const promisedEvent = isPrimitive(message)\n      ? this.eventFromMessage(eventMessage, level, hintWithEventId)\n      : this.eventFromException(message, hintWithEventId);\n\n    this._process(promisedEvent.then(event => this._captureEvent(event, hintWithEventId, currentScope)));\n\n    return hintWithEventId.event_id;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureEvent(event: Event, hint?: EventHint, currentScope?: Scope): string {\n    const eventId = uuid4();\n\n    // ensure we haven't captured this very object before\n    if (hint && hint.originalException && checkOrSetAlreadyCaught(hint.originalException)) {\n      DEBUG_BUILD && logger.log(ALREADY_SEEN_ERROR);\n      return eventId;\n    }\n\n    const hintWithEventId = {\n      event_id: eventId,\n      ...hint,\n    };\n\n    const sdkProcessingMetadata = event.sdkProcessingMetadata || {};\n    const capturedSpanScope: Scope | undefined = sdkProcessingMetadata.capturedSpanScope;\n\n    this._process(this._captureEvent(event, hintWithEventId, capturedSpanScope || currentScope));\n\n    return hintWithEventId.event_id;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureSession(session: Session): void {\n    if (!(typeof session.release === 'string')) {\n      DEBUG_BUILD && logger.warn('Discarded session because of missing or non-string release');\n    } else {\n      this.sendSession(session);\n      // After sending, we set init false to indicate it's not the first occurrence\n      updateSession(session, { init: false });\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getDsn(): DsnComponents | undefined {\n    return this._dsn;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getOptions(): O {\n    return this._options;\n  }\n\n  /**\n   * @see SdkMetadata\n   *\n   * @return The metadata of the SDK\n   */\n  public getSdkMetadata(): SdkMetadata | undefined {\n    return this._options._metadata;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getTransport(): Transport | undefined {\n    return this._transport;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public flush(timeout?: number): PromiseLike<boolean> {\n    const transport = this._transport;\n    if (transport) {\n      this.emit('flush');\n      return this._isClientDoneProcessing(timeout).then(clientFinished => {\n        return transport.flush(timeout).then(transportFlushed => clientFinished && transportFlushed);\n      });\n    } else {\n      return resolvedSyncPromise(true);\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public close(timeout?: number): PromiseLike<boolean> {\n    return this.flush(timeout).then(result => {\n      this.getOptions().enabled = false;\n      this.emit('close');\n      return result;\n    });\n  }\n\n  /** Get all installed event processors. */\n  public getEventProcessors(): EventProcessor[] {\n    return this._eventProcessors;\n  }\n\n  /** @inheritDoc */\n  public addEventProcessor(eventProcessor: EventProcessor): void {\n    this._eventProcessors.push(eventProcessor);\n  }\n\n  /** @inheritdoc */\n  public init(): void {\n    if (\n      this._isEnabled() ||\n      // Force integrations to be setup even if no DSN was set when we have\n      // Spotlight enabled. This is particularly important for browser as we\n      // don't support the `spotlight` option there and rely on the users\n      // adding the `spotlightBrowserIntegration()` to their integrations which\n      // wouldn't get initialized with the check below when there's no DSN set.\n      this._options.integrations.some(({ name }) => name.startsWith('Spotlight'))\n    ) {\n      this._setupIntegrations();\n    }\n  }\n\n  /**\n   * Gets an installed integration by its name.\n   *\n   * @returns The installed integration or `undefined` if no integration with that `name` was installed.\n   */\n  public getIntegrationByName<T extends Integration = Integration>(integrationName: string): T | undefined {\n    return this._integrations[integrationName] as T | undefined;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public addIntegration(integration: Integration): void {\n    const isAlreadyInstalled = this._integrations[integration.name];\n\n    // This hook takes care of only installing if not already installed\n    setupIntegration(this, integration, this._integrations);\n    // Here we need to check manually to make sure to not run this multiple times\n    if (!isAlreadyInstalled) {\n      afterSetupIntegrations(this, [integration]);\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public sendEvent(event: Event, hint: EventHint = {}): void {\n    this.emit('beforeSendEvent', event, hint);\n\n    let env = createEventEnvelope(event, this._dsn, this._options._metadata, this._options.tunnel);\n\n    for (const attachment of hint.attachments || []) {\n      env = addItemToEnvelope(env, createAttachmentEnvelopeItem(attachment));\n    }\n\n    const promise = this.sendEnvelope(env);\n    if (promise) {\n      promise.then(sendResponse => this.emit('afterSendEvent', event, sendResponse), null);\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public sendSession(session: Session | SessionAggregates): void {\n    const env = createSessionEnvelope(session, this._dsn, this._options._metadata, this._options.tunnel);\n\n    // sendEnvelope should not throw\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this.sendEnvelope(env);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public recordDroppedEvent(reason: EventDropReason, category: DataCategory, eventOrCount?: Event | number): void {\n    if (this._options.sendClientReports) {\n      // TODO v9: We do not need the `event` passed as third argument anymore, and can possibly remove this overload\n      // If event is passed as third argument, we assume this is a count of 1\n      const count = typeof eventOrCount === 'number' ? eventOrCount : 1;\n\n      // We want to track each category (error, transaction, session, replay_event) separately\n      // but still keep the distinction between different type of outcomes.\n      // We could use nested maps, but it's much easier to read and type this way.\n      // A correct type for map-based implementation if we want to go that route\n      // would be `Partial<Record<SentryRequestType, Partial<Record<Outcome, number>>>>`\n      // With typescript 4.1 we could even use template literal types\n      const key = `${reason}:${category}`;\n      DEBUG_BUILD && logger.log(`Recording outcome: \"${key}\"${count > 1 ? ` (${count} times)` : ''}`);\n      this._outcomes[key] = (this._outcomes[key] || 0) + count;\n    }\n  }\n\n  // Keep on() & emit() signatures in sync with types' client.ts interface\n  /* eslint-disable @typescript-eslint/unified-signatures */\n\n  /** @inheritdoc */\n  public on(hook: 'spanStart', callback: (span: Span) => void): () => void;\n\n  /** @inheritdoc */\n  public on(hook: 'spanEnd', callback: (span: Span) => void): () => void;\n\n  /** @inheritdoc */\n  public on(hook: 'idleSpanEnableAutoFinish', callback: (span: Span) => void): () => void;\n\n  /** @inheritdoc */\n  public on(hook: 'beforeEnvelope', callback: (envelope: Envelope) => void): () => void;\n\n  /** @inheritdoc */\n  public on(hook: 'beforeSendEvent', callback: (event: Event, hint?: EventHint) => void): () => void;\n\n  /** @inheritdoc */\n  public on(hook: 'preprocessEvent', callback: (event: Event, hint?: EventHint) => void): () => void;\n\n  /** @inheritdoc */\n  public on(\n    hook: 'afterSendEvent',\n    callback: (event: Event, sendResponse: TransportMakeRequestResponse) => void,\n  ): () => void;\n\n  /** @inheritdoc */\n  public on(hook: 'beforeAddBreadcrumb', callback: (breadcrumb: Breadcrumb, hint?: BreadcrumbHint) => void): () => void;\n\n  /** @inheritdoc */\n  public on(hook: 'createDsc', callback: (dsc: DynamicSamplingContext, rootSpan?: Span) => void): () => void;\n\n  /** @inheritdoc */\n  public on(\n    hook: 'beforeSendFeedback',\n    callback: (feedback: FeedbackEvent, options?: { includeReplay: boolean }) => void,\n  ): () => void;\n\n  /** @inheritdoc */\n  public on(\n    hook: 'beforeSampling',\n    callback: (\n      samplingData: {\n        spanAttributes: SpanAttributes;\n        spanName: string;\n        parentSampled?: boolean;\n        parentContext?: SpanContextData;\n      },\n      samplingDecision: { decision: boolean },\n    ) => void,\n  ): void;\n\n  /** @inheritdoc */\n  public on(\n    hook: 'startPageLoadSpan',\n    callback: (\n      options: StartSpanOptions,\n      traceOptions?: { sentryTrace?: string | undefined; baggage?: string | undefined },\n    ) => void,\n  ): () => void;\n\n  /** @inheritdoc */\n  public on(hook: 'startNavigationSpan', callback: (options: StartSpanOptions) => void): () => void;\n\n  public on(hook: 'flush', callback: () => void): () => void;\n\n  public on(hook: 'close', callback: () => void): () => void;\n\n  public on(hook: 'applyFrameMetadata', callback: (event: Event) => void): () => void;\n\n  /** @inheritdoc */\n  public on(hook: string, callback: unknown): () => void {\n    const hooks = (this._hooks[hook] = this._hooks[hook] || []);\n\n    // @ts-expect-error We assume the types are correct\n    hooks.push(callback);\n\n    // This function returns a callback execution handler that, when invoked,\n    // deregisters a callback. This is crucial for managing instances where callbacks\n    // need to be unregistered to prevent self-referencing in callback closures,\n    // ensuring proper garbage collection.\n    return () => {\n      // @ts-expect-error We assume the types are correct\n      const cbIndex = hooks.indexOf(callback);\n      if (cbIndex > -1) {\n        hooks.splice(cbIndex, 1);\n      }\n    };\n  }\n\n  /** @inheritdoc */\n  public emit(\n    hook: 'beforeSampling',\n    samplingData: {\n      spanAttributes: SpanAttributes;\n      spanName: string;\n      parentSampled?: boolean;\n      parentContext?: SpanContextData;\n    },\n    samplingDecision: { decision: boolean },\n  ): void;\n\n  /** @inheritdoc */\n  public emit(hook: 'spanStart', span: Span): void;\n\n  /** @inheritdoc */\n  public emit(hook: 'spanEnd', span: Span): void;\n\n  /** @inheritdoc */\n  public emit(hook: 'idleSpanEnableAutoFinish', span: Span): void;\n\n  /** @inheritdoc */\n  public emit(hook: 'beforeEnvelope', envelope: Envelope): void;\n\n  /** @inheritdoc */\n  public emit(hook: 'beforeSendEvent', event: Event, hint?: EventHint): void;\n\n  /** @inheritdoc */\n  public emit(hook: 'preprocessEvent', event: Event, hint?: EventHint): void;\n\n  /** @inheritdoc */\n  public emit(hook: 'afterSendEvent', event: Event, sendResponse: TransportMakeRequestResponse): void;\n\n  /** @inheritdoc */\n  public emit(hook: 'beforeAddBreadcrumb', breadcrumb: Breadcrumb, hint?: BreadcrumbHint): void;\n\n  /** @inheritdoc */\n  public emit(hook: 'createDsc', dsc: DynamicSamplingContext, rootSpan?: Span): void;\n\n  /** @inheritdoc */\n  public emit(hook: 'beforeSendFeedback', feedback: FeedbackEvent, options?: { includeReplay: boolean }): void;\n\n  /** @inheritdoc */\n  public emit(\n    hook: 'startPageLoadSpan',\n    options: StartSpanOptions,\n    traceOptions?: { sentryTrace?: string | undefined; baggage?: string | undefined },\n  ): void;\n\n  /** @inheritdoc */\n  public emit(hook: 'startNavigationSpan', options: StartSpanOptions): void;\n\n  /** @inheritdoc */\n  public emit(hook: 'flush'): void;\n\n  /** @inheritdoc */\n  public emit(hook: 'close'): void;\n\n  /** @inheritdoc */\n  public emit(hook: 'applyFrameMetadata', event: Event): void;\n\n  /** @inheritdoc */\n  public emit(hook: string, ...rest: unknown[]): void {\n    const callbacks = this._hooks[hook];\n    if (callbacks) {\n      callbacks.forEach(callback => callback(...rest));\n    }\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public sendEnvelope(envelope: Envelope): PromiseLike<TransportMakeRequestResponse> {\n    this.emit('beforeEnvelope', envelope);\n\n    if (this._isEnabled() && this._transport) {\n      return this._transport.send(envelope).then(null, reason => {\n        DEBUG_BUILD && logger.error('Error while sending envelope:', reason);\n        return reason;\n      });\n    }\n\n    DEBUG_BUILD && logger.error('Transport disabled');\n\n    return resolvedSyncPromise({});\n  }\n\n  /* eslint-enable @typescript-eslint/unified-signatures */\n\n  /** Setup integrations for this client. */\n  protected _setupIntegrations(): void {\n    const { integrations } = this._options;\n    this._integrations = setupIntegrations(this, integrations);\n    afterSetupIntegrations(this, integrations);\n  }\n\n  /** Updates existing session based on the provided event */\n  protected _updateSessionFromEvent(session: Session, event: Event): void {\n    let crashed = false;\n    let errored = false;\n    const exceptions = event.exception && event.exception.values;\n\n    if (exceptions) {\n      errored = true;\n\n      for (const ex of exceptions) {\n        const mechanism = ex.mechanism;\n        if (mechanism && mechanism.handled === false) {\n          crashed = true;\n          break;\n        }\n      }\n    }\n\n    // A session is updated and that session update is sent in only one of the two following scenarios:\n    // 1. Session with non terminal status and 0 errors + an error occurred -> Will set error count to 1 and send update\n    // 2. Session with non terminal status and 1 error + a crash occurred -> Will set status crashed and send update\n    const sessionNonTerminal = session.status === 'ok';\n    const shouldUpdateAndSend = (sessionNonTerminal && session.errors === 0) || (sessionNonTerminal && crashed);\n\n    if (shouldUpdateAndSend) {\n      updateSession(session, {\n        ...(crashed && { status: 'crashed' }),\n        errors: session.errors || Number(errored || crashed),\n      });\n      this.captureSession(session);\n    }\n  }\n\n  /**\n   * Determine if the client is finished processing. Returns a promise because it will wait `timeout` ms before saying\n   * \"no\" (resolving to `false`) in order to give the client a chance to potentially finish first.\n   *\n   * @param timeout The time, in ms, after which to resolve to `false` if the client is still busy. Passing `0` (or not\n   * passing anything) will make the promise wait as long as it takes for processing to finish before resolving to\n   * `true`.\n   * @returns A promise which will resolve to `true` if processing is already done or finishes before the timeout, and\n   * `false` otherwise\n   */\n  protected _isClientDoneProcessing(timeout?: number): PromiseLike<boolean> {\n    return new SyncPromise(resolve => {\n      let ticked: number = 0;\n      const tick: number = 1;\n\n      const interval = setInterval(() => {\n        if (this._numProcessing == 0) {\n          clearInterval(interval);\n          resolve(true);\n        } else {\n          ticked += tick;\n          if (timeout && ticked >= timeout) {\n            clearInterval(interval);\n            resolve(false);\n          }\n        }\n      }, tick);\n    });\n  }\n\n  /** Determines whether this SDK is enabled and a transport is present. */\n  protected _isEnabled(): boolean {\n    return this.getOptions().enabled !== false && this._transport !== undefined;\n  }\n\n  /**\n   * Adds common information to events.\n   *\n   * The information includes release and environment from `options`,\n   * breadcrumbs and context (extra, tags and user) from the scope.\n   *\n   * Information that is already present in the event is never overwritten. For\n   * nested objects, such as the context, keys are merged.\n   *\n   * @param event The original event.\n   * @param hint May contain additional information about the original exception.\n   * @param currentScope A scope containing event metadata.\n   * @returns A new event with more information.\n   */\n  protected _prepareEvent(\n    event: Event,\n    hint: EventHint,\n    currentScope = getCurrentScope(),\n    isolationScope = getIsolationScope(),\n  ): PromiseLike<Event | null> {\n    const options = this.getOptions();\n    const integrations = Object.keys(this._integrations);\n    if (!hint.integrations && integrations.length > 0) {\n      hint.integrations = integrations;\n    }\n\n    this.emit('preprocessEvent', event, hint);\n\n    if (!event.type) {\n      isolationScope.setLastEventId(event.event_id || hint.event_id);\n    }\n\n    return prepareEvent(options, event, hint, currentScope, this, isolationScope).then(evt => {\n      if (evt === null) {\n        return evt;\n      }\n\n      evt.contexts = {\n        trace: getTraceContextFromScope(currentScope),\n        ...evt.contexts,\n      };\n\n      const dynamicSamplingContext = getDynamicSamplingContextFromScope(this, currentScope);\n\n      evt.sdkProcessingMetadata = {\n        dynamicSamplingContext,\n        ...evt.sdkProcessingMetadata,\n      };\n\n      return evt;\n    });\n  }\n\n  /**\n   * Processes the event and logs an error in case of rejection\n   * @param event\n   * @param hint\n   * @param scope\n   */\n  protected _captureEvent(event: Event, hint: EventHint = {}, scope?: Scope): PromiseLike<string | undefined> {\n    return this._processEvent(event, hint, scope).then(\n      finalEvent => {\n        return finalEvent.event_id;\n      },\n      reason => {\n        if (DEBUG_BUILD) {\n          // If something's gone wrong, log the error as a warning. If it's just us having used a `SentryError` for\n          // control flow, log just the message (no stack) as a log-level log.\n          const sentryError = reason as SentryError;\n          if (sentryError.logLevel === 'log') {\n            logger.log(sentryError.message);\n          } else {\n            logger.warn(sentryError);\n          }\n        }\n        return undefined;\n      },\n    );\n  }\n\n  /**\n   * Processes an event (either error or message) and sends it to Sentry.\n   *\n   * This also adds breadcrumbs and context information to the event. However,\n   * platform specific meta data (such as the User's IP address) must be added\n   * by the SDK implementor.\n   *\n   *\n   * @param event The event to send to Sentry.\n   * @param hint May contain additional information about the original exception.\n   * @param currentScope A scope containing event metadata.\n   * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n   */\n  protected _processEvent(event: Event, hint: EventHint, currentScope?: Scope): PromiseLike<Event> {\n    const options = this.getOptions();\n    const { sampleRate } = options;\n\n    const isTransaction = isTransactionEvent(event);\n    const isError = isErrorEvent(event);\n    const eventType = event.type || 'error';\n    const beforeSendLabel = `before send for type \\`${eventType}\\``;\n\n    // 1.0 === 100% events are sent\n    // 0.0 === 0% events are sent\n    // Sampling for transaction happens somewhere else\n    const parsedSampleRate = typeof sampleRate === 'undefined' ? undefined : parseSampleRate(sampleRate);\n    if (isError && typeof parsedSampleRate === 'number' && Math.random() > parsedSampleRate) {\n      this.recordDroppedEvent('sample_rate', 'error', event);\n      return rejectedSyncPromise(\n        new SentryError(\n          `Discarding event because it's not included in the random sample (sampling rate = ${sampleRate})`,\n          'log',\n        ),\n      );\n    }\n\n    const dataCategory: DataCategory = eventType === 'replay_event' ? 'replay' : eventType;\n\n    const sdkProcessingMetadata = event.sdkProcessingMetadata || {};\n    const capturedSpanIsolationScope: Scope | undefined = sdkProcessingMetadata.capturedSpanIsolationScope;\n\n    return this._prepareEvent(event, hint, currentScope, capturedSpanIsolationScope)\n      .then(prepared => {\n        if (prepared === null) {\n          this.recordDroppedEvent('event_processor', dataCategory, event);\n          throw new SentryError('An event processor returned `null`, will not send event.', 'log');\n        }\n\n        const isInternalException = hint.data && (hint.data as { __sentry__: boolean }).__sentry__ === true;\n        if (isInternalException) {\n          return prepared;\n        }\n\n        const result = processBeforeSend(this, options, prepared, hint);\n        return _validateBeforeSendResult(result, beforeSendLabel);\n      })\n      .then(processedEvent => {\n        if (processedEvent === null) {\n          this.recordDroppedEvent('before_send', dataCategory, event);\n          if (isTransaction) {\n            const spans = event.spans || [];\n            // the transaction itself counts as one span, plus all the child spans that are added\n            const spanCount = 1 + spans.length;\n            this.recordDroppedEvent('before_send', 'span', spanCount);\n          }\n          throw new SentryError(`${beforeSendLabel} returned \\`null\\`, will not send event.`, 'log');\n        }\n\n        const session = currentScope && currentScope.getSession();\n        if (!isTransaction && session) {\n          this._updateSessionFromEvent(session, processedEvent);\n        }\n\n        if (isTransaction) {\n          const spanCountBefore =\n            (processedEvent.sdkProcessingMetadata && processedEvent.sdkProcessingMetadata.spanCountBeforeProcessing) ||\n            0;\n          const spanCountAfter = processedEvent.spans ? processedEvent.spans.length : 0;\n\n          const droppedSpanCount = spanCountBefore - spanCountAfter;\n          if (droppedSpanCount > 0) {\n            this.recordDroppedEvent('before_send', 'span', droppedSpanCount);\n          }\n        }\n\n        // None of the Sentry built event processor will update transaction name,\n        // so if the transaction name has been changed by an event processor, we know\n        // it has to come from custom event processor added by a user\n        const transactionInfo = processedEvent.transaction_info;\n        if (isTransaction && transactionInfo && processedEvent.transaction !== event.transaction) {\n          const source = 'custom';\n          processedEvent.transaction_info = {\n            ...transactionInfo,\n            source,\n          };\n        }\n\n        this.sendEvent(processedEvent, hint);\n        return processedEvent;\n      })\n      .then(null, reason => {\n        if (reason instanceof SentryError) {\n          throw reason;\n        }\n\n        this.captureException(reason, {\n          data: {\n            __sentry__: true,\n          },\n          originalException: reason,\n        });\n        throw new SentryError(\n          `Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: ${reason}`,\n        );\n      });\n  }\n\n  /**\n   * Occupies the client with processing and event\n   */\n  protected _process<T>(promise: PromiseLike<T>): void {\n    this._numProcessing++;\n    void promise.then(\n      value => {\n        this._numProcessing--;\n        return value;\n      },\n      reason => {\n        this._numProcessing--;\n        return reason;\n      },\n    );\n  }\n\n  /**\n   * Clears outcomes on this client and returns them.\n   */\n  protected _clearOutcomes(): Outcome[] {\n    const outcomes = this._outcomes;\n    this._outcomes = {};\n    return Object.entries(outcomes).map(([key, quantity]) => {\n      const [reason, category] = key.split(':') as [EventDropReason, DataCategory];\n      return {\n        reason,\n        category,\n        quantity,\n      };\n    });\n  }\n\n  /**\n   * Sends client reports as an envelope.\n   */\n  protected _flushOutcomes(): void {\n    DEBUG_BUILD && logger.log('Flushing outcomes...');\n\n    const outcomes = this._clearOutcomes();\n\n    if (outcomes.length === 0) {\n      DEBUG_BUILD && logger.log('No outcomes to send');\n      return;\n    }\n\n    // This is really the only place where we want to check for a DSN and only send outcomes then\n    if (!this._dsn) {\n      DEBUG_BUILD && logger.log('No dsn provided, will not send outcomes');\n      return;\n    }\n\n    DEBUG_BUILD && logger.log('Sending outcomes:', outcomes);\n\n    const envelope = createClientReportEnvelope(outcomes, this._options.tunnel && dsnToString(this._dsn));\n\n    // sendEnvelope should not throw\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this.sendEnvelope(envelope);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public abstract eventFromException(_exception: unknown, _hint?: EventHint): PromiseLike<Event>;\n\n  /**\n   * @inheritDoc\n   */\n  public abstract eventFromMessage(\n    _message: ParameterizedString,\n    _level?: SeverityLevel,\n    _hint?: EventHint,\n  ): PromiseLike<Event>;\n}\n\n/**\n * Verifies that return value of configured `beforeSend` or `beforeSendTransaction` is of expected type, and returns the value if so.\n */\nfunction _validateBeforeSendResult(\n  beforeSendResult: PromiseLike<Event | null> | Event | null,\n  beforeSendLabel: string,\n): PromiseLike<Event | null> | Event | null {\n  const invalidValueError = `${beforeSendLabel} must return \\`null\\` or a valid event.`;\n  if (isThenable(beforeSendResult)) {\n    return beforeSendResult.then(\n      event => {\n        if (!isPlainObject(event) && event !== null) {\n          throw new SentryError(invalidValueError);\n        }\n        return event;\n      },\n      e => {\n        throw new SentryError(`${beforeSendLabel} rejected with ${e}`);\n      },\n    );\n  } else if (!isPlainObject(beforeSendResult) && beforeSendResult !== null) {\n    throw new SentryError(invalidValueError);\n  }\n  return beforeSendResult;\n}\n\n/**\n * Process the matching `beforeSendXXX` callback.\n */\nfunction processBeforeSend(\n  client: Client,\n  options: ClientOptions,\n  event: Event,\n  hint: EventHint,\n): PromiseLike<Event | null> | Event | null {\n  const { beforeSend, beforeSendTransaction, beforeSendSpan } = options;\n\n  if (isErrorEvent(event) && beforeSend) {\n    return beforeSend(event, hint);\n  }\n\n  if (isTransactionEvent(event)) {\n    if (event.spans && beforeSendSpan) {\n      const processedSpans: SpanJSON[] = [];\n      for (const span of event.spans) {\n        const processedSpan = beforeSendSpan(span);\n        if (processedSpan) {\n          processedSpans.push(processedSpan);\n        } else {\n          showSpanDropWarning();\n          client.recordDroppedEvent('before_send', 'span');\n        }\n      }\n      event.spans = processedSpans;\n    }\n\n    if (beforeSendTransaction) {\n      if (event.spans) {\n        // We store the # of spans before processing in SDK metadata,\n        // so we can compare it afterwards to determine how many spans were dropped\n        const spanCountBefore = event.spans.length;\n        event.sdkProcessingMetadata = {\n          ...event.sdkProcessingMetadata,\n          spanCountBeforeProcessing: spanCountBefore,\n        };\n      }\n      return beforeSendTransaction(event, hint);\n    }\n  }\n\n  return event;\n}\n\nfunction isErrorEvent(event: Event): event is ErrorEvent {\n  return event.type === undefined;\n}\n\nfunction isTransactionEvent(event: Event): event is TransactionEvent {\n  return event.type === 'transaction';\n}\n","import { getClient, getIsolationScope } from './currentScopes';\nimport type { Breadcrumb, BreadcrumbHint } from './types-hoist';\nimport { consoleSandbox } from './utils-hoist/logger';\nimport { dateTimestampInSeconds } from './utils-hoist/time';\n\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nconst DEFAULT_BREADCRUMBS = 100;\n\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n */\nexport function addBreadcrumb(breadcrumb: Breadcrumb, hint?: BreadcrumbHint): void {\n  const client = getClient();\n  const isolationScope = getIsolationScope();\n\n  if (!client) return;\n\n  const { beforeBreadcrumb = null, maxBreadcrumbs = DEFAULT_BREADCRUMBS } = client.getOptions();\n\n  if (maxBreadcrumbs <= 0) return;\n\n  const timestamp = dateTimestampInSeconds();\n  const mergedBreadcrumb = { timestamp, ...breadcrumb };\n  const finalBreadcrumb = beforeBreadcrumb\n    ? (consoleSandbox(() => beforeBreadcrumb(mergedBreadcrumb, hint)) as Breadcrumb | null)\n    : mergedBreadcrumb;\n\n  if (finalBreadcrumb === null) return;\n\n  if (client.emit) {\n    client.emit('beforeAddBreadcrumb', finalBreadcrumb, hint);\n  }\n\n  isolationScope.addBreadcrumb(finalBreadcrumb, maxBreadcrumbs);\n}\n","import type { AsyncContextStack } from './asyncContext/stackStrategy';\nimport type { AsyncContextStrategy } from './asyncContext/types';\nimport type { Client, Integration, MetricsAggregator, Scope } from './types-hoist';\nimport { SDK_VERSION } from './utils-hoist/version';\nimport { GLOBAL_OBJ } from './utils-hoist/worldwide';\n\n/**\n * An object that contains globally accessible properties and maintains a scope stack.\n * @hidden\n */\nexport interface Carrier {\n  __SENTRY__?: VersionedCarrier;\n}\n\ntype VersionedCarrier = {\n  version?: string;\n} & Record<Exclude<string, 'version'>, SentryCarrier>;\n\ninterface SentryCarrier {\n  acs?: AsyncContextStrategy;\n  stack?: AsyncContextStack;\n\n  globalScope?: Scope;\n  defaultIsolationScope?: Scope;\n  defaultCurrentScope?: Scope;\n  globalMetricsAggregators?: WeakMap<Client, MetricsAggregator> | undefined;\n\n  // TODO(v9): Remove these properties - they are no longer used and were left over in v8\n  integrations?: Integration[];\n  extensions?: {\n    // eslint-disable-next-line @typescript-eslint/ban-types\n    [key: string]: Function;\n  };\n}\n\n/**\n * Returns the global shim registry.\n *\n * FIXME: This function is problematic, because despite always returning a valid Carrier,\n * it has an optional `__SENTRY__` property, which then in turn requires us to always perform an unnecessary check\n * at the call-site. We always access the carrier through this function, so we can guarantee that `__SENTRY__` is there.\n **/\nexport function getMainCarrier(): Carrier {\n  // This ensures a Sentry carrier exists\n  getSentryCarrier(GLOBAL_OBJ);\n  return GLOBAL_OBJ;\n}\n\n/** Will either get the existing sentry carrier, or create a new one. */\nexport function getSentryCarrier(carrier: Carrier): SentryCarrier {\n  const __SENTRY__ = (carrier.__SENTRY__ = carrier.__SENTRY__ || {});\n\n  // For now: First SDK that sets the .version property wins\n  __SENTRY__.version = __SENTRY__.version || SDK_VERSION;\n\n  // Intentionally populating and returning the version of \"this\" SDK instance\n  // rather than what's set in .version so that \"this\" SDK always gets its carrier\n  return (__SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {});\n}\n","import type {\n  CheckInEnvelope,\n  CheckInItem,\n  DsnComponents,\n  DynamicSamplingContext,\n  SdkMetadata,\n  SerializedCheckIn,\n} from './types-hoist';\nimport { dsnToString } from './utils-hoist/dsn';\nimport { createEnvelope } from './utils-hoist/envelope';\nimport { dropUndefinedKeys } from './utils-hoist/object';\n\n/**\n * Create envelope from check in item.\n */\nexport function createCheckInEnvelope(\n  checkIn: SerializedCheckIn,\n  dynamicSamplingContext?: Partial<DynamicSamplingContext>,\n  metadata?: SdkMetadata,\n  tunnel?: string,\n  dsn?: DsnComponents,\n): CheckInEnvelope {\n  const headers: CheckInEnvelope[0] = {\n    sent_at: new Date().toISOString(),\n  };\n\n  if (metadata && metadata.sdk) {\n    headers.sdk = {\n      name: metadata.sdk.name,\n      version: metadata.sdk.version,\n    };\n  }\n\n  if (!!tunnel && !!dsn) {\n    headers.dsn = dsnToString(dsn);\n  }\n\n  if (dynamicSamplingContext) {\n    headers.trace = dropUndefinedKeys(dynamicSamplingContext) as DynamicSamplingContext;\n  }\n\n  const item = createCheckInEnvelopeItem(checkIn);\n  return createEnvelope<CheckInEnvelope>(headers, [item]);\n}\n\nfunction createCheckInEnvelopeItem(checkIn: SerializedCheckIn): CheckInItem {\n  const checkInHeaders: CheckInItem[0] = {\n    type: 'check_in',\n  };\n  return [checkInHeaders, checkIn];\n}\n","export const DEFAULT_ENVIRONMENT = 'production';\n","import { getAsyncContextStrategy } from './asyncContext';\nimport { getMainCarrier } from './carrier';\nimport { Scope as ScopeClass } from './scope';\nimport type { Client, Scope, TraceContext } from './types-hoist';\nimport { dropUndefinedKeys } from './utils-hoist/object';\nimport { getGlobalSingleton } from './utils-hoist/worldwide';\n\n/**\n * Get the currently active scope.\n */\nexport function getCurrentScope(): Scope {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n  return acs.getCurrentScope();\n}\n\n/**\n * Get the currently active isolation scope.\n * The isolation scope is active for the current execution context.\n */\nexport function getIsolationScope(): Scope {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n  return acs.getIsolationScope();\n}\n\n/**\n * Get the global scope.\n * This scope is applied to _all_ events.\n */\nexport function getGlobalScope(): Scope {\n  return getGlobalSingleton('globalScope', () => new ScopeClass());\n}\n\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n */\nexport function withScope<T>(callback: (scope: Scope) => T): T;\n/**\n * Set the given scope as the active scope in the callback.\n */\nexport function withScope<T>(scope: Scope | undefined, callback: (scope: Scope) => T): T;\n/**\n * Either creates a new active scope, or sets the given scope as active scope in the given callback.\n */\nexport function withScope<T>(\n  ...rest: [callback: (scope: Scope) => T] | [scope: Scope | undefined, callback: (scope: Scope) => T]\n): T {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n\n  // If a scope is defined, we want to make this the active scope instead of the default one\n  if (rest.length === 2) {\n    const [scope, callback] = rest;\n\n    if (!scope) {\n      return acs.withScope(callback);\n    }\n\n    return acs.withSetScope(scope, callback);\n  }\n\n  return acs.withScope(rest[0]);\n}\n\n/**\n * Attempts to fork the current isolation scope and the current scope based on the current async context strategy. If no\n * async context strategy is set, the isolation scope and the current scope will not be forked (this is currently the\n * case, for example, in the browser).\n *\n * Usage of this function in environments without async context strategy is discouraged and may lead to unexpected behaviour.\n *\n * This function is intended for Sentry SDK and SDK integration development. It is not recommended to be used in \"normal\"\n * applications directly because it comes with pitfalls. Use at your own risk!\n */\nexport function withIsolationScope<T>(callback: (isolationScope: Scope) => T): T;\n/**\n * Set the provided isolation scope as active in the given callback. If no\n * async context strategy is set, the isolation scope and the current scope will not be forked (this is currently the\n * case, for example, in the browser).\n *\n * Usage of this function in environments without async context strategy is discouraged and may lead to unexpected behaviour.\n *\n * This function is intended for Sentry SDK and SDK integration development. It is not recommended to be used in \"normal\"\n * applications directly because it comes with pitfalls. Use at your own risk!\n *\n * If you pass in `undefined` as a scope, it will fork a new isolation scope, the same as if no scope is passed.\n */\nexport function withIsolationScope<T>(isolationScope: Scope | undefined, callback: (isolationScope: Scope) => T): T;\n/**\n * Either creates a new active isolation scope, or sets the given isolation scope as active scope in the given callback.\n */\nexport function withIsolationScope<T>(\n  ...rest:\n    | [callback: (isolationScope: Scope) => T]\n    | [isolationScope: Scope | undefined, callback: (isolationScope: Scope) => T]\n): T {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n\n  // If a scope is defined, we want to make this the active scope instead of the default one\n  if (rest.length === 2) {\n    const [isolationScope, callback] = rest;\n\n    if (!isolationScope) {\n      return acs.withIsolationScope(callback);\n    }\n\n    return acs.withSetIsolationScope(isolationScope, callback);\n  }\n\n  return acs.withIsolationScope(rest[0]);\n}\n\n/**\n * Get the currently active client.\n */\nexport function getClient<C extends Client>(): C | undefined {\n  return getCurrentScope().getClient<C>();\n}\n\n/**\n * Get a trace context for the given scope.\n */\nexport function getTraceContextFromScope(scope: Scope): TraceContext {\n  const propagationContext = scope.getPropagationContext();\n\n  // TODO(v9): Use generateSpanId() instead of spanId\n  // eslint-disable-next-line deprecation/deprecation\n  const { traceId, spanId, parentSpanId } = propagationContext;\n\n  const traceContext: TraceContext = dropUndefinedKeys({\n    trace_id: traceId,\n    span_id: spanId,\n    parent_span_id: parentSpanId,\n  });\n\n  return traceContext;\n}\n","import { Scope as ScopeClass } from './scope';\nimport type { Scope } from './types-hoist';\nimport { getGlobalSingleton } from './utils-hoist/worldwide';\n\n/** Get the default current scope. */\nexport function getDefaultCurrentScope(): Scope {\n  return getGlobalSingleton('defaultCurrentScope', () => new ScopeClass());\n}\n\n/** Get the default isolation scope. */\nexport function getDefaultIsolationScope(): Scope {\n  return getGlobalSingleton('defaultIsolationScope', () => new ScopeClass());\n}\n","import { getDynamicSamplingContextFromSpan } from './tracing/dynamicSamplingContext';\nimport type { SentrySpan } from './tracing/sentrySpan';\nimport type {\n  Client,\n  DsnComponents,\n  DynamicSamplingContext,\n  Event,\n  EventEnvelope,\n  EventItem,\n  LegacyCSPReport,\n  RawSecurityEnvelope,\n  RawSecurityItem,\n  SdkInfo,\n  SdkMetadata,\n  Session,\n  SessionAggregates,\n  SessionEnvelope,\n  SessionItem,\n  SpanEnvelope,\n  SpanItem,\n  SpanJSON,\n} from './types-hoist';\nimport { dsnToString } from './utils-hoist/dsn';\nimport {\n  createEnvelope,\n  createEventEnvelopeHeaders,\n  createSpanEnvelopeItem,\n  getSdkMetadataForEnvelopeHeader,\n} from './utils-hoist/envelope';\nimport { uuid4 } from './utils-hoist/misc';\nimport { showSpanDropWarning, spanToJSON } from './utils/spanUtils';\n\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n **/\nfunction enhanceEventWithSdkInfo(event: Event, sdkInfo?: SdkInfo): Event {\n  if (!sdkInfo) {\n    return event;\n  }\n  event.sdk = event.sdk || {};\n  event.sdk.name = event.sdk.name || sdkInfo.name;\n  event.sdk.version = event.sdk.version || sdkInfo.version;\n  event.sdk.integrations = [...(event.sdk.integrations || []), ...(sdkInfo.integrations || [])];\n  event.sdk.packages = [...(event.sdk.packages || []), ...(sdkInfo.packages || [])];\n  return event;\n}\n\n/** Creates an envelope from a Session */\nexport function createSessionEnvelope(\n  session: Session | SessionAggregates,\n  dsn?: DsnComponents,\n  metadata?: SdkMetadata,\n  tunnel?: string,\n): SessionEnvelope {\n  const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n  const envelopeHeaders = {\n    sent_at: new Date().toISOString(),\n    ...(sdkInfo && { sdk: sdkInfo }),\n    ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n  };\n\n  const envelopeItem: SessionItem =\n    'aggregates' in session ? [{ type: 'sessions' }, session] : [{ type: 'session' }, session.toJSON()];\n\n  return createEnvelope<SessionEnvelope>(envelopeHeaders, [envelopeItem]);\n}\n\n/**\n * Create an Envelope from an event.\n */\nexport function createEventEnvelope(\n  event: Event,\n  dsn?: DsnComponents,\n  metadata?: SdkMetadata,\n  tunnel?: string,\n): EventEnvelope {\n  const sdkInfo = getSdkMetadataForEnvelopeHeader(metadata);\n\n  /*\n    Note: Due to TS, event.type may be `replay_event`, theoretically.\n    In practice, we never call `createEventEnvelope` with `replay_event` type,\n    and we'd have to adjust a looot of types to make this work properly.\n    We want to avoid casting this around, as that could lead to bugs (e.g. when we add another type)\n    So the safe choice is to really guard against the replay_event type here.\n  */\n  const eventType = event.type && event.type !== 'replay_event' ? event.type : 'event';\n\n  enhanceEventWithSdkInfo(event, metadata && metadata.sdk);\n\n  const envelopeHeaders = createEventEnvelopeHeaders(event, sdkInfo, tunnel, dsn);\n\n  // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n  // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n  // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n  // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n  delete event.sdkProcessingMetadata;\n\n  const eventItem: EventItem = [{ type: eventType }, event];\n  return createEnvelope<EventEnvelope>(envelopeHeaders, [eventItem]);\n}\n\n/**\n * Create envelope from Span item.\n *\n * Takes an optional client and runs spans through `beforeSendSpan` if available.\n */\nexport function createSpanEnvelope(spans: [SentrySpan, ...SentrySpan[]], client?: Client): SpanEnvelope {\n  function dscHasRequiredProps(dsc: Partial<DynamicSamplingContext>): dsc is DynamicSamplingContext {\n    return !!dsc.trace_id && !!dsc.public_key;\n  }\n\n  // For the moment we'll obtain the DSC from the first span in the array\n  // This might need to be changed if we permit sending multiple spans from\n  // different segments in one envelope\n  const dsc = getDynamicSamplingContextFromSpan(spans[0]);\n\n  const dsn = client && client.getDsn();\n  const tunnel = client && client.getOptions().tunnel;\n\n  const headers: SpanEnvelope[0] = {\n    sent_at: new Date().toISOString(),\n    ...(dscHasRequiredProps(dsc) && { trace: dsc }),\n    ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n  };\n\n  const beforeSendSpan = client && client.getOptions().beforeSendSpan;\n  const convertToSpanJSON = beforeSendSpan\n    ? (span: SentrySpan) => {\n        const spanJson = beforeSendSpan(spanToJSON(span) as SpanJSON);\n        if (!spanJson) {\n          showSpanDropWarning();\n        }\n        return spanJson;\n      }\n    : (span: SentrySpan) => spanToJSON(span);\n\n  const items: SpanItem[] = [];\n  for (const span of spans) {\n    const spanJson = convertToSpanJSON(span);\n    if (spanJson) {\n      items.push(createSpanEnvelopeItem(spanJson));\n    }\n  }\n\n  return createEnvelope<SpanEnvelope>(headers, items);\n}\n\n/**\n * Create an Envelope from a CSP report.\n */\nexport function createRawSecurityEnvelope(\n  report: LegacyCSPReport,\n  dsn: DsnComponents,\n  tunnel?: string,\n  release?: string,\n  environment?: string,\n): RawSecurityEnvelope {\n  const envelopeHeaders = {\n    event_id: uuid4(),\n    ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n  };\n\n  const eventItem: RawSecurityItem = [\n    { type: 'raw_security', sentry_release: release, sentry_environment: environment },\n    report,\n  ];\n\n  return createEnvelope<RawSecurityEnvelope>(envelopeHeaders, [eventItem]);\n}\n","import { DEBUG_BUILD } from './debug-build';\nimport type { Event, EventHint, EventProcessor } from './types-hoist';\nimport { isThenable } from './utils-hoist/is';\nimport { logger } from './utils-hoist/logger';\nimport { SyncPromise } from './utils-hoist/syncpromise';\n\n/**\n * Process an array of event processors, returning the processed event (or `null` if the event was dropped).\n */\nexport function notifyEventProcessors(\n  processors: EventProcessor[],\n  event: Event | null,\n  hint: EventHint,\n  index: number = 0,\n): PromiseLike<Event | null> {\n  return new SyncPromise<Event | null>((resolve, reject) => {\n    const processor = processors[index];\n    if (event === null || typeof processor !== 'function') {\n      resolve(event);\n    } else {\n      const result = processor({ ...event }, hint) as Event | null;\n\n      DEBUG_BUILD && processor.id && result === null && logger.log(`Event processor \"${processor.id}\" dropped event`);\n\n      if (isThenable(result)) {\n        void result\n          .then(final => notifyEventProcessors(processors, final, hint, index + 1).then(resolve))\n          .then(null, reject);\n      } else {\n        void notifyEventProcessors(processors, result, hint, index + 1)\n          .then(resolve)\n          .then(null, reject);\n      }\n    }\n  });\n}\n","import type {\n  CaptureContext,\n  CheckIn,\n  Event,\n  EventHint,\n  EventProcessor,\n  Extra,\n  Extras,\n  FinishedCheckIn,\n  MonitorConfig,\n  Primitive,\n  Session,\n  SessionContext,\n  SeverityLevel,\n  User,\n} from './types-hoist';\n\nimport { DEFAULT_ENVIRONMENT } from './constants';\nimport { getClient, getCurrentScope, getIsolationScope, withIsolationScope } from './currentScopes';\nimport { DEBUG_BUILD } from './debug-build';\nimport { closeSession, makeSession, updateSession } from './session';\nimport { isThenable } from './utils-hoist/is';\nimport { logger } from './utils-hoist/logger';\nimport { uuid4 } from './utils-hoist/misc';\nimport { timestampInSeconds } from './utils-hoist/time';\nimport { GLOBAL_OBJ } from './utils-hoist/worldwide';\nimport type { ExclusiveEventHintOrCaptureContext } from './utils/prepareEvent';\nimport { parseEventHintOrCaptureContext } from './utils/prepareEvent';\n\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception The exception to capture.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured Sentry event.\n */\nexport function captureException(exception: unknown, hint?: ExclusiveEventHintOrCaptureContext): string {\n  return getCurrentScope().captureException(exception, parseEventHintOrCaptureContext(hint));\n}\n\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param captureContext Define the level of the message or pass in additional data to attach to the message.\n * @returns the id of the captured message.\n */\nexport function captureMessage(message: string, captureContext?: CaptureContext | SeverityLevel): string {\n  // This is necessary to provide explicit scopes upgrade, without changing the original\n  // arity of the `captureMessage(message, level)` method.\n  const level = typeof captureContext === 'string' ? captureContext : undefined;\n  const context = typeof captureContext !== 'string' ? { captureContext } : undefined;\n  return getCurrentScope().captureMessage(message, level, context);\n}\n\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @param hint Optional additional data to attach to the Sentry event.\n * @returns the id of the captured event.\n */\nexport function captureEvent(event: Event, hint?: EventHint): string {\n  return getCurrentScope().captureEvent(event, hint);\n}\n\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normalized.\n */\nexport function setContext(name: string, context: { [key: string]: unknown } | null): void {\n  getIsolationScope().setContext(name, context);\n}\n\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\nexport function setExtras(extras: Extras): void {\n  getIsolationScope().setExtras(extras);\n}\n\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normalized.\n */\nexport function setExtra(key: string, extra: Extra): void {\n  getIsolationScope().setExtra(key, extra);\n}\n\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\nexport function setTags(tags: { [key: string]: Primitive }): void {\n  getIsolationScope().setTags(tags);\n}\n\n/**\n * Set key:value that will be sent as tags data with the event.\n *\n * Can also be used to unset a tag, by passing `undefined`.\n *\n * @param key String key of tag\n * @param value Value of tag\n */\nexport function setTag(key: string, value: Primitive): void {\n  getIsolationScope().setTag(key, value);\n}\n\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\nexport function setUser(user: User | null): void {\n  getIsolationScope().setUser(user);\n}\n\n/**\n * The last error event id of the isolation scope.\n *\n * Warning: This function really returns the last recorded error event id on the current\n * isolation scope. If you call this function after handling a certain error and another error\n * is captured in between, the last one is returned instead of the one you might expect.\n * Also, ids of events that were never sent to Sentry (for example because\n * they were dropped in `beforeSend`) could be returned.\n *\n * @returns The last event id of the isolation scope.\n */\nexport function lastEventId(): string | undefined {\n  return getIsolationScope().lastEventId();\n}\n\n/**\n * Create a cron monitor check in and send it to Sentry.\n *\n * @param checkIn An object that describes a check in.\n * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want\n * to create a monitor automatically when sending a check in.\n */\nexport function captureCheckIn(checkIn: CheckIn, upsertMonitorConfig?: MonitorConfig): string {\n  const scope = getCurrentScope();\n  const client = getClient();\n  if (!client) {\n    DEBUG_BUILD && logger.warn('Cannot capture check-in. No client defined.');\n  } else if (!client.captureCheckIn) {\n    DEBUG_BUILD && logger.warn('Cannot capture check-in. Client does not support sending check-ins.');\n  } else {\n    return client.captureCheckIn(checkIn, upsertMonitorConfig, scope);\n  }\n\n  return uuid4();\n}\n\n/**\n * Wraps a callback with a cron monitor check in. The check in will be sent to Sentry when the callback finishes.\n *\n * @param monitorSlug The distinct slug of the monitor.\n * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want\n * to create a monitor automatically when sending a check in.\n */\nexport function withMonitor<T>(\n  monitorSlug: CheckIn['monitorSlug'],\n  callback: () => T,\n  upsertMonitorConfig?: MonitorConfig,\n): T {\n  const checkInId = captureCheckIn({ monitorSlug, status: 'in_progress' }, upsertMonitorConfig);\n  const now = timestampInSeconds();\n\n  function finishCheckIn(status: FinishedCheckIn['status']): void {\n    captureCheckIn({ monitorSlug, status, checkInId, duration: timestampInSeconds() - now });\n  }\n\n  return withIsolationScope(() => {\n    let maybePromiseResult: T;\n    try {\n      maybePromiseResult = callback();\n    } catch (e) {\n      finishCheckIn('error');\n      throw e;\n    }\n\n    if (isThenable(maybePromiseResult)) {\n      Promise.resolve(maybePromiseResult).then(\n        () => {\n          finishCheckIn('ok');\n        },\n        e => {\n          finishCheckIn('error');\n          throw e;\n        },\n      );\n    } else {\n      finishCheckIn('ok');\n    }\n\n    return maybePromiseResult;\n  });\n}\n\n/**\n * Call `flush()` on the current client, if there is one. See {@link Client.flush}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue. Omitting this parameter will cause\n * the client to wait until all events are sent before resolving the promise.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport async function flush(timeout?: number): Promise<boolean> {\n  const client = getClient();\n  if (client) {\n    return client.flush(timeout);\n  }\n  DEBUG_BUILD && logger.warn('Cannot flush events. No client defined.');\n  return Promise.resolve(false);\n}\n\n/**\n * Call `close()` on the current client, if there is one. See {@link Client.close}.\n *\n * @param timeout Maximum time in ms the client should wait to flush its event queue before shutting down. Omitting this\n * parameter will cause the client to wait until all events are sent before disabling itself.\n * @returns A promise which resolves to `true` if the queue successfully drains before the timeout, or `false` if it\n * doesn't (or if there's no client defined).\n */\nexport async function close(timeout?: number): Promise<boolean> {\n  const client = getClient();\n  if (client) {\n    return client.close(timeout);\n  }\n  DEBUG_BUILD && logger.warn('Cannot flush events and disable SDK. No client defined.');\n  return Promise.resolve(false);\n}\n\n/**\n * Returns true if Sentry has been properly initialized.\n */\nexport function isInitialized(): boolean {\n  return !!getClient();\n}\n\n/** If the SDK is initialized & enabled. */\nexport function isEnabled(): boolean {\n  const client = getClient();\n  return !!client && client.getOptions().enabled !== false && !!client.getTransport();\n}\n\n/**\n * Add an event processor.\n * This will be added to the current isolation scope, ensuring any event that is processed in the current execution\n * context will have the processor applied.\n */\nexport function addEventProcessor(callback: EventProcessor): void {\n  getIsolationScope().addEventProcessor(callback);\n}\n\n/**\n * Start a session on the current isolation scope.\n *\n * @param context (optional) additional properties to be applied to the returned session object\n *\n * @returns the new active session\n */\nexport function startSession(context?: SessionContext): Session {\n  const client = getClient();\n  const isolationScope = getIsolationScope();\n  const currentScope = getCurrentScope();\n\n  const { release, environment = DEFAULT_ENVIRONMENT } = (client && client.getOptions()) || {};\n\n  // Will fetch userAgent if called from browser sdk\n  const { userAgent } = GLOBAL_OBJ.navigator || {};\n\n  const session = makeSession({\n    release,\n    environment,\n    user: currentScope.getUser() || isolationScope.getUser(),\n    ...(userAgent && { userAgent }),\n    ...context,\n  });\n\n  // End existing session if there's one\n  const currentSession = isolationScope.getSession();\n  if (currentSession && currentSession.status === 'ok') {\n    updateSession(currentSession, { status: 'exited' });\n  }\n\n  endSession();\n\n  // Afterwards we set the new session on the scope\n  isolationScope.setSession(session);\n\n  // TODO (v8): Remove this and only use the isolation scope(?).\n  // For v7 though, we can't \"soft-break\" people using getCurrentHub().getScope().setSession()\n  currentScope.setSession(session);\n\n  return session;\n}\n\n/**\n * End the session on the current isolation scope.\n */\nexport function endSession(): void {\n  const isolationScope = getIsolationScope();\n  const currentScope = getCurrentScope();\n\n  const session = currentScope.getSession() || isolationScope.getSession();\n  if (session) {\n    closeSession(session);\n  }\n  _sendSessionUpdate();\n\n  // the session is over; take it off of the scope\n  isolationScope.setSession();\n\n  // TODO (v8): Remove this and only use the isolation scope(?).\n  // For v7 though, we can't \"soft-break\" people using getCurrentHub().getScope().setSession()\n  currentScope.setSession();\n}\n\n/**\n * Sends the current Session on the scope\n */\nfunction _sendSessionUpdate(): void {\n  const isolationScope = getIsolationScope();\n  const currentScope = getCurrentScope();\n  const client = getClient();\n  // TODO (v8): Remove currentScope and only use the isolation scope(?).\n  // For v7 though, we can't \"soft-break\" people using getCurrentHub().getScope().setSession()\n  const session = currentScope.getSession() || isolationScope.getSession();\n  if (session && client) {\n    client.captureSession(session);\n  }\n}\n\n/**\n * Sends the current session on the scope to Sentry\n *\n * @param end If set the session will be marked as exited and removed from the scope.\n *            Defaults to `false`.\n */\nexport function captureSession(end: boolean = false): void {\n  // both send the update and pull the session from the scope\n  if (end) {\n    endSession();\n    return;\n  }\n\n  // only send the update\n  _sendSessionUpdate();\n}\n","import { getClient, getCurrentScope } from './currentScopes';\nimport type { EventHint, FeedbackEvent, SendFeedbackParams } from './types-hoist';\nimport { dropUndefinedKeys } from './utils-hoist/object';\n\n/**\n * Send user feedback to Sentry.\n */\nexport function captureFeedback(\n  params: SendFeedbackParams,\n  hint: EventHint & { includeReplay?: boolean } = {},\n  scope = getCurrentScope(),\n): string {\n  const { message, name, email, url, source, associatedEventId, tags } = params;\n\n  const feedbackEvent: FeedbackEvent = {\n    contexts: {\n      feedback: dropUndefinedKeys({\n        contact_email: email,\n        name,\n        message,\n        url,\n        source,\n        associated_event_id: associatedEventId,\n      }),\n    },\n    type: 'feedback',\n    level: 'info',\n    tags,\n  };\n\n  const client = (scope && scope.getClient()) || getClient();\n\n  if (client) {\n    client.emit('beforeSendFeedback', feedbackEvent, hint);\n  }\n\n  const eventId = scope.captureEvent(feedbackEvent, hint);\n\n  return eventId;\n}\n","import { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from './semanticAttributes';\nimport { SPAN_STATUS_ERROR, setHttpStatus, startInactiveSpan } from './tracing';\nimport { SentryNonRecordingSpan } from './tracing/sentryNonRecordingSpan';\nimport type { Client, HandlerDataFetch, Scope, Span, SpanOrigin } from './types-hoist';\nimport { SENTRY_BAGGAGE_KEY_PREFIX } from './utils-hoist/baggage';\nimport { isInstanceOf } from './utils-hoist/is';\nimport { parseUrl } from './utils-hoist/url';\nimport { hasTracingEnabled } from './utils/hasTracingEnabled';\nimport { getActiveSpan } from './utils/spanUtils';\nimport { getTraceData } from './utils/traceData';\n\ntype PolymorphicRequestHeaders =\n  | Record<string, string | undefined>\n  | Array<[string, string]>\n  // the below is not precisely the Header type used in Request, but it'll pass duck-typing\n  | {\n      append: (key: string, value: string) => void;\n      get: (key: string) => string | null | undefined;\n    };\n\n/**\n * Create and track fetch request spans for usage in combination with `addFetchInstrumentationHandler`.\n *\n * @returns Span if a span was created, otherwise void.\n */\nexport function instrumentFetchRequest(\n  handlerData: HandlerDataFetch,\n  shouldCreateSpan: (url: string) => boolean,\n  shouldAttachHeaders: (url: string) => boolean,\n  spans: Record<string, Span>,\n  spanOrigin: SpanOrigin = 'auto.http.browser',\n): Span | undefined {\n  if (!handlerData.fetchData) {\n    return undefined;\n  }\n\n  const shouldCreateSpanResult = hasTracingEnabled() && shouldCreateSpan(handlerData.fetchData.url);\n\n  if (handlerData.endTimestamp && shouldCreateSpanResult) {\n    const spanId = handlerData.fetchData.__span;\n    if (!spanId) return;\n\n    const span = spans[spanId];\n    if (span) {\n      endSpan(span, handlerData);\n\n      // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n      delete spans[spanId];\n    }\n    return undefined;\n  }\n\n  const { method, url } = handlerData.fetchData;\n\n  const fullUrl = getFullURL(url);\n  const host = fullUrl ? parseUrl(fullUrl).host : undefined;\n\n  const hasParent = !!getActiveSpan();\n\n  const span =\n    shouldCreateSpanResult && hasParent\n      ? startInactiveSpan({\n          name: `${method} ${url}`,\n          attributes: {\n            url,\n            type: 'fetch',\n            'http.method': method,\n            'http.url': fullUrl,\n            'server.address': host,\n            [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: spanOrigin,\n            [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.client',\n          },\n        })\n      : new SentryNonRecordingSpan();\n\n  handlerData.fetchData.__span = span.spanContext().spanId;\n  spans[span.spanContext().spanId] = span;\n\n  if (shouldAttachHeaders(handlerData.fetchData.url)) {\n    const request: string | Request = handlerData.args[0];\n\n    const options: { [key: string]: unknown } = handlerData.args[1] || {};\n\n    const headers = _addTracingHeadersToFetchRequest(\n      request,\n      options,\n      // If performance is disabled (TWP) or there's no active root span (pageload/navigation/interaction),\n      // we do not want to use the span as base for the trace headers,\n      // which means that the headers will be generated from the scope and the sampling decision is deferred\n      hasTracingEnabled() && hasParent ? span : undefined,\n    );\n    if (headers) {\n      // Ensure this is actually set, if no options have been passed previously\n      handlerData.args[1] = options;\n      options.headers = headers;\n    }\n  }\n\n  return span;\n}\n\n/**\n * Adds sentry-trace and baggage headers to the various forms of fetch headers.\n */\nfunction _addTracingHeadersToFetchRequest(\n  request: string | Request,\n  fetchOptionsObj: {\n    headers?:\n      | {\n          [key: string]: string[] | string | undefined;\n        }\n      | PolymorphicRequestHeaders;\n  },\n  span?: Span,\n): PolymorphicRequestHeaders | undefined {\n  const traceHeaders = getTraceData({ span });\n  const sentryTrace = traceHeaders['sentry-trace'];\n  const baggage = traceHeaders.baggage;\n\n  // Nothing to do, when we return undefined here, the original headers will be used\n  if (!sentryTrace) {\n    return undefined;\n  }\n\n  const headers = fetchOptionsObj.headers || (isRequest(request) ? request.headers : undefined);\n\n  if (!headers) {\n    return { ...traceHeaders };\n  } else if (isHeaders(headers)) {\n    const newHeaders = new Headers(headers);\n    newHeaders.set('sentry-trace', sentryTrace);\n\n    if (baggage) {\n      const prevBaggageHeader = newHeaders.get('baggage');\n      if (prevBaggageHeader) {\n        const prevHeaderStrippedFromSentryBaggage = stripBaggageHeaderOfSentryBaggageValues(prevBaggageHeader);\n        newHeaders.set(\n          'baggage',\n          // If there are non-sentry entries (i.e. if the stripped string is non-empty/truthy) combine the stripped header and sentry baggage header\n          // otherwise just set the sentry baggage header\n          prevHeaderStrippedFromSentryBaggage ? `${prevHeaderStrippedFromSentryBaggage},${baggage}` : baggage,\n        );\n      } else {\n        newHeaders.set('baggage', baggage);\n      }\n    }\n\n    return newHeaders;\n  } else if (Array.isArray(headers)) {\n    const newHeaders = [\n      ...headers\n        // Remove any existing sentry-trace headers\n        .filter(header => {\n          return !(Array.isArray(header) && header[0] === 'sentry-trace');\n        })\n        // Get rid of previous sentry baggage values in baggage header\n        .map(header => {\n          if (Array.isArray(header) && header[0] === 'baggage' && typeof header[1] === 'string') {\n            const [headerName, headerValue, ...rest] = header;\n            return [headerName, stripBaggageHeaderOfSentryBaggageValues(headerValue), ...rest];\n          } else {\n            return header;\n          }\n        }),\n      // Attach the new sentry-trace header\n      ['sentry-trace', sentryTrace],\n    ];\n\n    if (baggage) {\n      // If there are multiple entries with the same key, the browser will merge the values into a single request header.\n      // Its therefore safe to simply push a \"baggage\" entry, even though there might already be another baggage header.\n      newHeaders.push(['baggage', baggage]);\n    }\n\n    return newHeaders as PolymorphicRequestHeaders;\n  } else {\n    const existingBaggageHeader = 'baggage' in headers ? headers.baggage : undefined;\n    let newBaggageHeaders: string[] = [];\n\n    if (Array.isArray(existingBaggageHeader)) {\n      newBaggageHeaders = existingBaggageHeader\n        .map(headerItem =>\n          typeof headerItem === 'string' ? stripBaggageHeaderOfSentryBaggageValues(headerItem) : headerItem,\n        )\n        .filter(headerItem => headerItem === '');\n    } else if (existingBaggageHeader) {\n      newBaggageHeaders.push(stripBaggageHeaderOfSentryBaggageValues(existingBaggageHeader));\n    }\n\n    if (baggage) {\n      newBaggageHeaders.push(baggage);\n    }\n\n    return {\n      ...(headers as Exclude<typeof headers, Headers>),\n      'sentry-trace': sentryTrace,\n      baggage: newBaggageHeaders.length > 0 ? newBaggageHeaders.join(',') : undefined,\n    };\n  }\n}\n\n/**\n * Adds sentry-trace and baggage headers to the various forms of fetch headers.\n *\n * @deprecated This function will not be exported anymore in v9.\n */\nexport function addTracingHeadersToFetchRequest(\n  request: string | unknown,\n  _client: Client | undefined,\n  _scope: Scope | undefined,\n  fetchOptionsObj: {\n    headers?:\n      | {\n          [key: string]: string[] | string | undefined;\n        }\n      | PolymorphicRequestHeaders;\n  },\n  span?: Span,\n): PolymorphicRequestHeaders | undefined {\n  return _addTracingHeadersToFetchRequest(request as Request, fetchOptionsObj, span);\n}\n\nfunction getFullURL(url: string): string | undefined {\n  try {\n    const parsed = new URL(url);\n    return parsed.href;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction endSpan(span: Span, handlerData: HandlerDataFetch): void {\n  if (handlerData.response) {\n    setHttpStatus(span, handlerData.response.status);\n\n    const contentLength =\n      handlerData.response && handlerData.response.headers && handlerData.response.headers.get('content-length');\n\n    if (contentLength) {\n      const contentLengthNum = parseInt(contentLength);\n      if (contentLengthNum > 0) {\n        span.setAttribute('http.response_content_length', contentLengthNum);\n      }\n    }\n  } else if (handlerData.error) {\n    span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n  }\n  span.end();\n}\n\nfunction stripBaggageHeaderOfSentryBaggageValues(baggageHeader: string): string {\n  return (\n    baggageHeader\n      .split(',')\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      .filter(baggageEntry => !baggageEntry.split('=')[0]!.startsWith(SENTRY_BAGGAGE_KEY_PREFIX))\n      .join(',')\n  );\n}\n\nfunction isRequest(request: unknown): request is Request {\n  return typeof Request !== 'undefined' && isInstanceOf(request, Request);\n}\n\nfunction isHeaders(headers: unknown): headers is Headers {\n  return typeof Headers !== 'undefined' && isInstanceOf(headers, Headers);\n}\n","import { addBreadcrumb } from './breadcrumbs';\nimport { getClient, getCurrentScope, getIsolationScope, withScope } from './currentScopes';\nimport {\n  captureEvent,\n  endSession,\n  setContext,\n  setExtra,\n  setExtras,\n  setTag,\n  setTags,\n  setUser,\n  startSession,\n} from './exports';\nimport type { Client, EventHint, Hub, Integration, IntegrationClass, SeverityLevel } from './types-hoist';\n\n/**\n * This is for legacy reasons, and returns a proxy object instead of a hub to be used.\n *\n * @deprecated Use the methods directly from the top level Sentry API (e.g. `Sentry.withScope`)\n * For more information see our migration guide for\n * [replacing `getCurrentHub` and `Hub`](https://github.com/getsentry/sentry-javascript/blob/develop/MIGRATION.md#deprecate-hub)\n * usage\n */\n// eslint-disable-next-line deprecation/deprecation\nexport function getCurrentHubShim(): Hub {\n  return {\n    bindClient(client: Client): void {\n      const scope = getCurrentScope();\n      scope.setClient(client);\n    },\n\n    withScope,\n    getClient: <C extends Client>() => getClient() as C | undefined,\n    getScope: getCurrentScope,\n    getIsolationScope,\n    captureException: (exception: unknown, hint?: EventHint) => {\n      return getCurrentScope().captureException(exception, hint);\n    },\n    captureMessage: (message: string, level?: SeverityLevel, hint?: EventHint) => {\n      return getCurrentScope().captureMessage(message, level, hint);\n    },\n    captureEvent,\n    addBreadcrumb,\n    setUser,\n    setTags,\n    setTag,\n    setExtra,\n    setExtras,\n    setContext,\n\n    getIntegration<T extends Integration>(integration: IntegrationClass<T>): T | null {\n      const client = getClient();\n      return (client && client.getIntegrationByName<T>(integration.id)) || null;\n    },\n\n    startSession,\n    endSession,\n    captureSession(end?: boolean): void {\n      // both send the update and pull the session from the scope\n      if (end) {\n        return endSession();\n      }\n\n      // only send the update\n      _sendSessionUpdate();\n    },\n  };\n}\n\n/**\n * Returns the default hub instance.\n *\n * If a hub is already registered in the global carrier but this module\n * contains a more recent version, it replaces the registered version.\n * Otherwise, the currently registered hub will be returned.\n *\n * @deprecated Use the respective replacement method directly instead.\n */\n// eslint-disable-next-line deprecation/deprecation\nexport const getCurrentHub = getCurrentHubShim;\n\n/**\n * Sends the current Session on the scope\n */\nfunction _sendSessionUpdate(): void {\n  const scope = getCurrentScope();\n  const client = getClient();\n\n  const session = scope.getSession();\n  if (client && session) {\n    client.captureSession(session);\n  }\n}\n","import { getClient } from './currentScopes';\nimport type { Client, Event, EventHint, Integration, IntegrationFn, Options } from './types-hoist';\n\nimport { DEBUG_BUILD } from './debug-build';\nimport { logger } from './utils-hoist/logger';\n\nexport const installedIntegrations: string[] = [];\n\n/** Map of integrations assigned to a client */\nexport type IntegrationIndex = {\n  [key: string]: Integration;\n};\n\ntype IntegrationWithDefaultInstance = Integration & { isDefaultInstance?: true };\n\n/**\n * Remove duplicates from the given array, preferring the last instance of any duplicate. Not guaranteed to\n * preserve the order of integrations in the array.\n *\n * @private\n */\nfunction filterDuplicates(integrations: Integration[]): Integration[] {\n  const integrationsByName: { [key: string]: Integration } = {};\n\n  integrations.forEach((currentInstance: IntegrationWithDefaultInstance) => {\n    const { name } = currentInstance;\n\n    const existingInstance: IntegrationWithDefaultInstance | undefined = integrationsByName[name];\n\n    // We want integrations later in the array to overwrite earlier ones of the same type, except that we never want a\n    // default instance to overwrite an existing user instance\n    if (existingInstance && !existingInstance.isDefaultInstance && currentInstance.isDefaultInstance) {\n      return;\n    }\n\n    integrationsByName[name] = currentInstance;\n  });\n\n  return Object.values(integrationsByName);\n}\n\n/** Gets integrations to install */\nexport function getIntegrationsToSetup(options: Pick<Options, 'defaultIntegrations' | 'integrations'>): Integration[] {\n  const defaultIntegrations = options.defaultIntegrations || [];\n  const userIntegrations = options.integrations;\n\n  // We flag default instances, so that later we can tell them apart from any user-created instances of the same class\n  defaultIntegrations.forEach((integration: IntegrationWithDefaultInstance) => {\n    integration.isDefaultInstance = true;\n  });\n\n  let integrations: Integration[];\n\n  if (Array.isArray(userIntegrations)) {\n    integrations = [...defaultIntegrations, ...userIntegrations];\n  } else if (typeof userIntegrations === 'function') {\n    const resolvedUserIntegrations = userIntegrations(defaultIntegrations);\n    integrations = Array.isArray(resolvedUserIntegrations) ? resolvedUserIntegrations : [resolvedUserIntegrations];\n  } else {\n    integrations = defaultIntegrations;\n  }\n\n  const finalIntegrations = filterDuplicates(integrations);\n\n  // The `Debug` integration prints copies of the `event` and `hint` which will be passed to `beforeSend` or\n  // `beforeSendTransaction`. It therefore has to run after all other integrations, so that the changes of all event\n  // processors will be reflected in the printed values. For lack of a more elegant way to guarantee that, we therefore\n  // locate it and, assuming it exists, pop it out of its current spot and shove it onto the end of the array.\n  const debugIndex = finalIntegrations.findIndex(integration => integration.name === 'Debug');\n  if (debugIndex > -1) {\n    const [debugInstance] = finalIntegrations.splice(debugIndex, 1) as [Integration];\n    finalIntegrations.push(debugInstance);\n  }\n\n  return finalIntegrations;\n}\n\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nexport function setupIntegrations(client: Client, integrations: Integration[]): IntegrationIndex {\n  const integrationIndex: IntegrationIndex = {};\n\n  integrations.forEach(integration => {\n    // guard against empty provided integrations\n    if (integration) {\n      setupIntegration(client, integration, integrationIndex);\n    }\n  });\n\n  return integrationIndex;\n}\n\n/**\n * Execute the `afterAllSetup` hooks of the given integrations.\n */\nexport function afterSetupIntegrations(client: Client, integrations: Integration[]): void {\n  for (const integration of integrations) {\n    // guard against empty provided integrations\n    if (integration && integration.afterAllSetup) {\n      integration.afterAllSetup(client);\n    }\n  }\n}\n\n/** Setup a single integration.  */\nexport function setupIntegration(client: Client, integration: Integration, integrationIndex: IntegrationIndex): void {\n  if (integrationIndex[integration.name]) {\n    DEBUG_BUILD && logger.log(`Integration skipped because it was already installed: ${integration.name}`);\n    return;\n  }\n  integrationIndex[integration.name] = integration;\n\n  // `setupOnce` is only called the first time\n  if (installedIntegrations.indexOf(integration.name) === -1 && typeof integration.setupOnce === 'function') {\n    integration.setupOnce();\n    installedIntegrations.push(integration.name);\n  }\n\n  // `setup` is run for each client\n  if (integration.setup && typeof integration.setup === 'function') {\n    integration.setup(client);\n  }\n\n  if (typeof integration.preprocessEvent === 'function') {\n    const callback = integration.preprocessEvent.bind(integration) as typeof integration.preprocessEvent;\n    client.on('preprocessEvent', (event, hint) => callback(event, hint, client));\n  }\n\n  if (typeof integration.processEvent === 'function') {\n    const callback = integration.processEvent.bind(integration) as typeof integration.processEvent;\n\n    const processor = Object.assign((event: Event, hint: EventHint) => callback(event, hint, client), {\n      id: integration.name,\n    });\n\n    client.addEventProcessor(processor);\n  }\n\n  DEBUG_BUILD && logger.log(`Integration installed: ${integration.name}`);\n}\n\n/** Add an integration to the current scope's client. */\nexport function addIntegration(integration: Integration): void {\n  const client = getClient();\n\n  if (!client) {\n    DEBUG_BUILD && logger.warn(`Cannot add integration \"${integration.name}\" because no SDK Client is available.`);\n    return;\n  }\n\n  client.addIntegration(integration);\n}\n\n/**\n * Define an integration function that can be used to create an integration instance.\n * Note that this by design hides the implementation details of the integration, as they are considered internal.\n */\nexport function defineIntegration<Fn extends IntegrationFn>(fn: Fn): (...args: Parameters<Fn>) => Integration {\n  return fn;\n}\n","import { getClient, withScope } from '../currentScopes';\nimport { captureException, captureMessage } from '../exports';\nimport { defineIntegration } from '../integration';\nimport type { CaptureContext, IntegrationFn } from '../types-hoist';\nimport { addConsoleInstrumentationHandler } from '../utils-hoist/instrument/console';\nimport { CONSOLE_LEVELS } from '../utils-hoist/logger';\nimport { addExceptionMechanism } from '../utils-hoist/misc';\nimport { severityLevelFromString } from '../utils-hoist/severity';\nimport { safeJoin } from '../utils-hoist/string';\nimport { GLOBAL_OBJ } from '../utils-hoist/worldwide';\n\ninterface CaptureConsoleOptions {\n  levels?: string[];\n\n  // TODO(v9): Flip default value to `true` and adjust JSDoc!\n  /**\n   * By default, Sentry will mark captured console messages as unhandled.\n   * Set this to `true` if you want to mark them as handled instead.\n   *\n   * Note: in v9 of the SDK, this option will default to `true`, meaning the default behavior will change to mark console messages as handled.\n   * @default false\n   */\n  handled?: boolean;\n}\n\nconst INTEGRATION_NAME = 'CaptureConsole';\n\nconst _captureConsoleIntegration = ((options: CaptureConsoleOptions = {}) => {\n  const levels = options.levels || CONSOLE_LEVELS;\n  // TODO(v9): Flip default value to `true`\n  const handled = !!options.handled;\n\n  return {\n    name: INTEGRATION_NAME,\n    setup(client) {\n      if (!('console' in GLOBAL_OBJ)) {\n        return;\n      }\n\n      addConsoleInstrumentationHandler(({ args, level }) => {\n        if (getClient() !== client || !levels.includes(level)) {\n          return;\n        }\n\n        consoleHandler(args, level, handled);\n      });\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Send Console API calls as Sentry Events.\n */\nexport const captureConsoleIntegration = defineIntegration(_captureConsoleIntegration);\n\nfunction consoleHandler(args: unknown[], level: string, handled: boolean): void {\n  const captureContext: CaptureContext = {\n    level: severityLevelFromString(level),\n    extra: {\n      arguments: args,\n    },\n  };\n\n  withScope(scope => {\n    scope.addEventProcessor(event => {\n      event.logger = 'console';\n\n      addExceptionMechanism(event, {\n        handled,\n        type: 'console',\n      });\n\n      return event;\n    });\n\n    if (level === 'assert') {\n      if (!args[0]) {\n        const message = `Assertion failed: ${safeJoin(args.slice(1), ' ') || 'console.assert'}`;\n        scope.setExtra('arguments', args.slice(1));\n        captureMessage(message, captureContext);\n      }\n      return;\n    }\n\n    const error = args.find(arg => arg instanceof Error);\n    if (error) {\n      captureException(error, captureContext);\n      return;\n    }\n\n    const message = safeJoin(args, ' ');\n    captureMessage(message, captureContext);\n  });\n}\n","import { defineIntegration } from '../integration';\nimport type { Event, EventHint, IntegrationFn } from '../types-hoist';\nimport { consoleSandbox } from '../utils-hoist/logger';\n\nconst INTEGRATION_NAME = 'Debug';\n\ninterface DebugOptions {\n  /** Controls whether console output created by this integration should be stringified. Default: `false` */\n  stringify?: boolean;\n  /** Controls whether a debugger should be launched before an event is sent. Default: `false` */\n  debugger?: boolean;\n}\n\nconst _debugIntegration = ((options: DebugOptions = {}) => {\n  const _options = {\n    debugger: false,\n    stringify: false,\n    ...options,\n  };\n\n  return {\n    name: INTEGRATION_NAME,\n    setup(client) {\n      client.on('beforeSendEvent', (event: Event, hint?: EventHint) => {\n        if (_options.debugger) {\n          // eslint-disable-next-line no-debugger\n          debugger;\n        }\n\n        /* eslint-disable no-console */\n        consoleSandbox(() => {\n          if (_options.stringify) {\n            console.log(JSON.stringify(event, null, 2));\n            if (hint && Object.keys(hint).length) {\n              console.log(JSON.stringify(hint, null, 2));\n            }\n          } else {\n            console.log(event);\n            if (hint && Object.keys(hint).length) {\n              console.log(hint);\n            }\n          }\n        });\n        /* eslint-enable no-console */\n      });\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Integration to debug sent Sentry events.\n * This integration should not be used in production.\n *\n * @deprecated This integration is deprecated and will be removed in the next major version of the SDK.\n * To log outgoing events, use [Hook Options](https://docs.sentry.io/platforms/javascript/configuration/options/#hooks) (`beforeSend`, `beforeSendTransaction`, ...).\n */\nexport const debugIntegration = defineIntegration(_debugIntegration);\n","import { defineIntegration } from '../integration';\nimport type { Event, Exception, IntegrationFn, StackFrame } from '../types-hoist';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { logger } from '../utils-hoist/logger';\nimport { getFramesFromEvent } from '../utils-hoist/stacktrace';\n\nconst INTEGRATION_NAME = 'Dedupe';\n\nconst _dedupeIntegration = (() => {\n  let previousEvent: Event | undefined;\n\n  return {\n    name: INTEGRATION_NAME,\n    processEvent(currentEvent) {\n      // We want to ignore any non-error type events, e.g. transactions or replays\n      // These should never be deduped, and also not be compared against as _previousEvent.\n      if (currentEvent.type) {\n        return currentEvent;\n      }\n\n      // Juuust in case something goes wrong\n      try {\n        if (_shouldDropEvent(currentEvent, previousEvent)) {\n          DEBUG_BUILD && logger.warn('Event dropped due to being a duplicate of previously captured event.');\n          return null;\n        }\n      } catch (_oO) {} // eslint-disable-line no-empty\n\n      return (previousEvent = currentEvent);\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Deduplication filter.\n */\nexport const dedupeIntegration = defineIntegration(_dedupeIntegration);\n\n/** only exported for tests. */\nexport function _shouldDropEvent(currentEvent: Event, previousEvent?: Event): boolean {\n  if (!previousEvent) {\n    return false;\n  }\n\n  if (_isSameMessageEvent(currentEvent, previousEvent)) {\n    return true;\n  }\n\n  if (_isSameExceptionEvent(currentEvent, previousEvent)) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction _isSameMessageEvent(currentEvent: Event, previousEvent: Event): boolean {\n  const currentMessage = currentEvent.message;\n  const previousMessage = previousEvent.message;\n\n  // If neither event has a message property, they were both exceptions, so bail out\n  if (!currentMessage && !previousMessage) {\n    return false;\n  }\n\n  // If only one event has a stacktrace, but not the other one, they are not the same\n  if ((currentMessage && !previousMessage) || (!currentMessage && previousMessage)) {\n    return false;\n  }\n\n  if (currentMessage !== previousMessage) {\n    return false;\n  }\n\n  if (!_isSameFingerprint(currentEvent, previousEvent)) {\n    return false;\n  }\n\n  if (!_isSameStacktrace(currentEvent, previousEvent)) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction _isSameExceptionEvent(currentEvent: Event, previousEvent: Event): boolean {\n  const previousException = _getExceptionFromEvent(previousEvent);\n  const currentException = _getExceptionFromEvent(currentEvent);\n\n  if (!previousException || !currentException) {\n    return false;\n  }\n\n  if (previousException.type !== currentException.type || previousException.value !== currentException.value) {\n    return false;\n  }\n\n  if (!_isSameFingerprint(currentEvent, previousEvent)) {\n    return false;\n  }\n\n  if (!_isSameStacktrace(currentEvent, previousEvent)) {\n    return false;\n  }\n\n  return true;\n}\n\nfunction _isSameStacktrace(currentEvent: Event, previousEvent: Event): boolean {\n  let currentFrames = getFramesFromEvent(currentEvent);\n  let previousFrames = getFramesFromEvent(previousEvent);\n\n  // If neither event has a stacktrace, they are assumed to be the same\n  if (!currentFrames && !previousFrames) {\n    return true;\n  }\n\n  // If only one event has a stacktrace, but not the other one, they are not the same\n  if ((currentFrames && !previousFrames) || (!currentFrames && previousFrames)) {\n    return false;\n  }\n\n  currentFrames = currentFrames as StackFrame[];\n  previousFrames = previousFrames as StackFrame[];\n\n  // If number of frames differ, they are not the same\n  if (previousFrames.length !== currentFrames.length) {\n    return false;\n  }\n\n  // Otherwise, compare the two\n  for (let i = 0; i < previousFrames.length; i++) {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const frameA = previousFrames[i]!;\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    const frameB = currentFrames[i]!;\n\n    if (\n      frameA.filename !== frameB.filename ||\n      frameA.lineno !== frameB.lineno ||\n      frameA.colno !== frameB.colno ||\n      frameA.function !== frameB.function\n    ) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction _isSameFingerprint(currentEvent: Event, previousEvent: Event): boolean {\n  let currentFingerprint = currentEvent.fingerprint;\n  let previousFingerprint = previousEvent.fingerprint;\n\n  // If neither event has a fingerprint, they are assumed to be the same\n  if (!currentFingerprint && !previousFingerprint) {\n    return true;\n  }\n\n  // If only one event has a fingerprint, but not the other one, they are not the same\n  if ((currentFingerprint && !previousFingerprint) || (!currentFingerprint && previousFingerprint)) {\n    return false;\n  }\n\n  currentFingerprint = currentFingerprint as string[];\n  previousFingerprint = previousFingerprint as string[];\n\n  // Otherwise, compare the two\n  try {\n    return !!(currentFingerprint.join('') === previousFingerprint.join(''));\n  } catch (_oO) {\n    return false;\n  }\n}\n\nfunction _getExceptionFromEvent(event: Event): Exception | undefined {\n  return event.exception && event.exception.values && event.exception.values[0];\n}\n","import { defineIntegration } from '../integration';\nimport type { Contexts, Event, EventHint, ExtendedError, IntegrationFn } from '../types-hoist';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { isError, isPlainObject } from '../utils-hoist/is';\nimport { logger } from '../utils-hoist/logger';\nimport { normalize } from '../utils-hoist/normalize';\nimport { addNonEnumerableProperty } from '../utils-hoist/object';\nimport { truncate } from '../utils-hoist/string';\n\nconst INTEGRATION_NAME = 'ExtraErrorData';\n\ninterface ExtraErrorDataOptions {\n  /**\n   * The object depth up to which to capture data on error objects.\n   */\n  depth: number;\n\n  /**\n   * Whether to capture error causes. Defaults to true.\n   *\n   * More information: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause\n   */\n  captureErrorCause: boolean;\n}\n\n/**\n * Extract additional data for from original exceptions.\n */\nconst _extraErrorDataIntegration = ((options: Partial<ExtraErrorDataOptions> = {}) => {\n  const { depth = 3, captureErrorCause = true } = options;\n  return {\n    name: INTEGRATION_NAME,\n    processEvent(event, hint, client) {\n      const { maxValueLength = 250 } = client.getOptions();\n      return _enhanceEventWithErrorData(event, hint, depth, captureErrorCause, maxValueLength);\n    },\n  };\n}) satisfies IntegrationFn;\n\nexport const extraErrorDataIntegration = defineIntegration(_extraErrorDataIntegration);\n\nfunction _enhanceEventWithErrorData(\n  event: Event,\n  hint: EventHint = {},\n  depth: number,\n  captureErrorCause: boolean,\n  maxValueLength: number,\n): Event {\n  if (!hint.originalException || !isError(hint.originalException)) {\n    return event;\n  }\n  const exceptionName = (hint.originalException as ExtendedError).name || hint.originalException.constructor.name;\n\n  const errorData = _extractErrorData(hint.originalException as ExtendedError, captureErrorCause, maxValueLength);\n\n  if (errorData) {\n    const contexts: Contexts = {\n      ...event.contexts,\n    };\n\n    const normalizedErrorData = normalize(errorData, depth);\n\n    if (isPlainObject(normalizedErrorData)) {\n      // We mark the error data as \"already normalized\" here, because we don't want other normalization procedures to\n      // potentially truncate the data we just already normalized, with a certain depth setting.\n      addNonEnumerableProperty(normalizedErrorData, '__sentry_skip_normalization__', true);\n      contexts[exceptionName] = normalizedErrorData;\n    }\n\n    return {\n      ...event,\n      contexts,\n    };\n  }\n\n  return event;\n}\n\n/**\n * Extract extra information from the Error object\n */\nfunction _extractErrorData(\n  error: ExtendedError,\n  captureErrorCause: boolean,\n  maxValueLength: number,\n): Record<string, unknown> | null {\n  // We are trying to enhance already existing event, so no harm done if it won't succeed\n  try {\n    const nativeKeys = [\n      'name',\n      'message',\n      'stack',\n      'line',\n      'column',\n      'fileName',\n      'lineNumber',\n      'columnNumber',\n      'toJSON',\n    ];\n\n    const extraErrorInfo: Record<string, unknown> = {};\n\n    // We want only enumerable properties, thus `getOwnPropertyNames` is redundant here, as we filter keys anyway.\n    for (const key of Object.keys(error)) {\n      if (nativeKeys.indexOf(key) !== -1) {\n        continue;\n      }\n      const value = error[key];\n      extraErrorInfo[key] = isError(value) || typeof value === 'string' ? truncate(`${value}`, maxValueLength) : value;\n    }\n\n    // Error.cause is a standard property that is non enumerable, we therefore need to access it separately.\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause\n    if (captureErrorCause && error.cause !== undefined) {\n      extraErrorInfo.cause = isError(error.cause) ? error.cause.toString() : error.cause;\n    }\n\n    // Check if someone attached `toJSON` method to grab even more properties (eg. axios is doing that)\n    if (typeof error.toJSON === 'function') {\n      const serializedError = error.toJSON() as Record<string, unknown>;\n\n      for (const key of Object.keys(serializedError)) {\n        const value = serializedError[key];\n        extraErrorInfo[key] = isError(value) ? value.toString() : value;\n      }\n    }\n\n    return extraErrorInfo;\n  } catch (oO) {\n    DEBUG_BUILD && logger.error('Unable to extract extra data from the Error object:', oO);\n  }\n\n  return null;\n}\n","import { getClient } from '../currentScopes';\nimport { defineIntegration } from '../integration';\nimport type { Client, IntegrationFn, WrappedFunction } from '../types-hoist';\nimport { getOriginalFunction } from '../utils-hoist/object';\n\nlet originalFunctionToString: () => void;\n\nconst INTEGRATION_NAME = 'FunctionToString';\n\nconst SETUP_CLIENTS = new WeakMap<Client, boolean>();\n\nconst _functionToStringIntegration = (() => {\n  return {\n    name: INTEGRATION_NAME,\n    setupOnce() {\n      // eslint-disable-next-line @typescript-eslint/unbound-method\n      originalFunctionToString = Function.prototype.toString;\n\n      // intrinsics (like Function.prototype) might be immutable in some environments\n      // e.g. Node with --frozen-intrinsics, XS (an embedded JavaScript engine) or SES (a JavaScript proposal)\n      try {\n        Function.prototype.toString = function (this: WrappedFunction, ...args: unknown[]): string {\n          const originalFunction = getOriginalFunction(this);\n          const context =\n            SETUP_CLIENTS.has(getClient() as Client) && originalFunction !== undefined ? originalFunction : this;\n          return originalFunctionToString.apply(context, args);\n        };\n      } catch {\n        // ignore errors here, just don't patch this\n      }\n    },\n    setup(client) {\n      SETUP_CLIENTS.set(client, true);\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Patch toString calls to return proper name for wrapped functions.\n *\n * ```js\n * Sentry.init({\n *   integrations: [\n *     functionToStringIntegration(),\n *   ],\n * });\n * ```\n */\nexport const functionToStringIntegration = defineIntegration(_functionToStringIntegration);\n","import type { Event, IntegrationFn, StackFrame } from '../types-hoist';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { defineIntegration } from '../integration';\nimport { logger } from '../utils-hoist/logger';\nimport { getEventDescription } from '../utils-hoist/misc';\nimport { stringMatchesSomePattern } from '../utils-hoist/string';\n\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nconst DEFAULT_IGNORE_ERRORS = [\n  /^Script error\\.?$/,\n  /^Javascript error: Script error\\.? on line 0$/,\n  /^ResizeObserver loop completed with undelivered notifications.$/, // The browser logs this when a ResizeObserver handler takes a bit longer. Usually this is not an actual issue though. It indicates slowness.\n  /^Cannot redefine property: googletag$/, // This is thrown when google tag manager is used in combination with an ad blocker\n  \"undefined is not an object (evaluating 'a.L')\", // Random error that happens but not actionable or noticeable to end-users.\n  'can\\'t redefine non-configurable property \"solana\"', // Probably a browser extension or custom browser (Brave) throwing this error\n  \"vv().getRestrictions is not a function. (In 'vv().getRestrictions(1,a)', 'vv().getRestrictions' is undefined)\", // Error thrown by GTM, seemingly not affecting end-users\n  \"Can't find variable: _AutofillCallbackHandler\", // Unactionable error in instagram webview https://developers.facebook.com/community/threads/320013549791141/\n  /^Non-Error promise rejection captured with value: Object Not Found Matching Id:\\d+, MethodName:simulateEvent, ParamCount:\\d+$/, // unactionable error from CEFSharp, a .NET library that embeds chromium in .NET apps\n];\n\n/** Options for the InboundFilters integration */\nexport interface InboundFiltersOptions {\n  allowUrls: Array<string | RegExp>;\n  denyUrls: Array<string | RegExp>;\n  ignoreErrors: Array<string | RegExp>;\n  ignoreTransactions: Array<string | RegExp>;\n  ignoreInternal: boolean;\n  disableErrorDefaults: boolean;\n}\n\nconst INTEGRATION_NAME = 'InboundFilters';\nconst _inboundFiltersIntegration = ((options: Partial<InboundFiltersOptions> = {}) => {\n  return {\n    name: INTEGRATION_NAME,\n    processEvent(event, _hint, client) {\n      const clientOptions = client.getOptions();\n      const mergedOptions = _mergeOptions(options, clientOptions);\n      return _shouldDropEvent(event, mergedOptions) ? null : event;\n    },\n  };\n}) satisfies IntegrationFn;\n\nexport const inboundFiltersIntegration = defineIntegration(_inboundFiltersIntegration);\n\nfunction _mergeOptions(\n  internalOptions: Partial<InboundFiltersOptions> = {},\n  clientOptions: Partial<InboundFiltersOptions> = {},\n): Partial<InboundFiltersOptions> {\n  return {\n    allowUrls: [...(internalOptions.allowUrls || []), ...(clientOptions.allowUrls || [])],\n    denyUrls: [...(internalOptions.denyUrls || []), ...(clientOptions.denyUrls || [])],\n    ignoreErrors: [\n      ...(internalOptions.ignoreErrors || []),\n      ...(clientOptions.ignoreErrors || []),\n      ...(internalOptions.disableErrorDefaults ? [] : DEFAULT_IGNORE_ERRORS),\n    ],\n    ignoreTransactions: [...(internalOptions.ignoreTransactions || []), ...(clientOptions.ignoreTransactions || [])],\n    ignoreInternal: internalOptions.ignoreInternal !== undefined ? internalOptions.ignoreInternal : true,\n  };\n}\n\nfunction _shouldDropEvent(event: Event, options: Partial<InboundFiltersOptions>): boolean {\n  if (options.ignoreInternal && _isSentryError(event)) {\n    DEBUG_BUILD &&\n      logger.warn(`Event dropped due to being internal Sentry Error.\\nEvent: ${getEventDescription(event)}`);\n    return true;\n  }\n  if (_isIgnoredError(event, options.ignoreErrors)) {\n    DEBUG_BUILD &&\n      logger.warn(\n        `Event dropped due to being matched by \\`ignoreErrors\\` option.\\nEvent: ${getEventDescription(event)}`,\n      );\n    return true;\n  }\n  if (_isUselessError(event)) {\n    DEBUG_BUILD &&\n      logger.warn(\n        `Event dropped due to not having an error message, error type or stacktrace.\\nEvent: ${getEventDescription(\n          event,\n        )}`,\n      );\n    return true;\n  }\n  if (_isIgnoredTransaction(event, options.ignoreTransactions)) {\n    DEBUG_BUILD &&\n      logger.warn(\n        `Event dropped due to being matched by \\`ignoreTransactions\\` option.\\nEvent: ${getEventDescription(event)}`,\n      );\n    return true;\n  }\n  if (_isDeniedUrl(event, options.denyUrls)) {\n    DEBUG_BUILD &&\n      logger.warn(\n        `Event dropped due to being matched by \\`denyUrls\\` option.\\nEvent: ${getEventDescription(\n          event,\n        )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n      );\n    return true;\n  }\n  if (!_isAllowedUrl(event, options.allowUrls)) {\n    DEBUG_BUILD &&\n      logger.warn(\n        `Event dropped due to not being matched by \\`allowUrls\\` option.\\nEvent: ${getEventDescription(\n          event,\n        )}.\\nUrl: ${_getEventFilterUrl(event)}`,\n      );\n    return true;\n  }\n  return false;\n}\n\nfunction _isIgnoredError(event: Event, ignoreErrors?: Array<string | RegExp>): boolean {\n  // If event.type, this is not an error\n  if (event.type || !ignoreErrors || !ignoreErrors.length) {\n    return false;\n  }\n\n  return _getPossibleEventMessages(event).some(message => stringMatchesSomePattern(message, ignoreErrors));\n}\n\nfunction _isIgnoredTransaction(event: Event, ignoreTransactions?: Array<string | RegExp>): boolean {\n  if (event.type !== 'transaction' || !ignoreTransactions || !ignoreTransactions.length) {\n    return false;\n  }\n\n  const name = event.transaction;\n  return name ? stringMatchesSomePattern(name, ignoreTransactions) : false;\n}\n\nfunction _isDeniedUrl(event: Event, denyUrls?: Array<string | RegExp>): boolean {\n  // TODO: Use Glob instead?\n  if (!denyUrls || !denyUrls.length) {\n    return false;\n  }\n  const url = _getEventFilterUrl(event);\n  return !url ? false : stringMatchesSomePattern(url, denyUrls);\n}\n\nfunction _isAllowedUrl(event: Event, allowUrls?: Array<string | RegExp>): boolean {\n  // TODO: Use Glob instead?\n  if (!allowUrls || !allowUrls.length) {\n    return true;\n  }\n  const url = _getEventFilterUrl(event);\n  return !url ? true : stringMatchesSomePattern(url, allowUrls);\n}\n\nfunction _getPossibleEventMessages(event: Event): string[] {\n  const possibleMessages: string[] = [];\n\n  if (event.message) {\n    possibleMessages.push(event.message);\n  }\n\n  let lastException;\n  try {\n    // @ts-expect-error Try catching to save bundle size\n    lastException = event.exception.values[event.exception.values.length - 1];\n  } catch (e) {\n    // try catching to save bundle size checking existence of variables\n  }\n\n  if (lastException) {\n    if (lastException.value) {\n      possibleMessages.push(lastException.value);\n      if (lastException.type) {\n        possibleMessages.push(`${lastException.type}: ${lastException.value}`);\n      }\n    }\n  }\n\n  return possibleMessages;\n}\n\nfunction _isSentryError(event: Event): boolean {\n  try {\n    // @ts-expect-error can't be a sentry error if undefined\n    return event.exception.values[0].type === 'SentryError';\n  } catch (e) {\n    // ignore\n  }\n  return false;\n}\n\nfunction _getLastValidUrl(frames: StackFrame[] = []): string | null {\n  for (let i = frames.length - 1; i >= 0; i--) {\n    const frame = frames[i];\n\n    if (frame && frame.filename !== '<anonymous>' && frame.filename !== '[native code]') {\n      return frame.filename || null;\n    }\n  }\n\n  return null;\n}\n\nfunction _getEventFilterUrl(event: Event): string | null {\n  try {\n    let frames;\n    try {\n      // @ts-expect-error we only care about frames if the whole thing here is defined\n      frames = event.exception.values[0].stacktrace.frames;\n    } catch (e) {\n      // ignore\n    }\n    return frames ? _getLastValidUrl(frames) : null;\n  } catch (oO) {\n    DEBUG_BUILD && logger.error(`Cannot extract url for event ${getEventDescription(event)}`);\n    return null;\n  }\n}\n\nfunction _isUselessError(event: Event): boolean {\n  if (event.type) {\n    // event is not an error\n    return false;\n  }\n\n  // We only want to consider events for dropping that actually have recorded exception values.\n  if (!event.exception || !event.exception.values || event.exception.values.length === 0) {\n    return false;\n  }\n\n  return (\n    // No top-level message\n    !event.message &&\n    // There are no exception values that have a stacktrace, a non-generic-Error type or value\n    !event.exception.values.some(value => value.stacktrace || (value.type && value.type !== 'Error') || value.value)\n  );\n}\n","import { defineIntegration } from '../integration';\nimport type { EventItem } from '../types-hoist';\n\nimport { addMetadataToStackFrames, stripMetadataFromStackFrames } from '../metadata';\nimport { forEachEnvelopeItem } from '../utils-hoist/envelope';\n\n/**\n * Adds module metadata to stack frames.\n *\n * Metadata can be injected by the Sentry bundler plugins using the `moduleMetadata` config option.\n *\n * When this integration is added, the metadata passed to the bundler plugin is added to the stack frames of all events\n * under the `module_metadata` property. This can be used to help in tagging or routing of events from different teams\n * our sources\n */\nexport const moduleMetadataIntegration = defineIntegration(() => {\n  return {\n    name: 'ModuleMetadata',\n    setup(client) {\n      // We need to strip metadata from stack frames before sending them to Sentry since these are client side only.\n      client.on('beforeEnvelope', envelope => {\n        forEachEnvelopeItem(envelope, (item, type) => {\n          if (type === 'event') {\n            const event = Array.isArray(item) ? (item as EventItem)[1] : undefined;\n\n            if (event) {\n              stripMetadataFromStackFrames(event);\n              item[1] = event;\n            }\n          }\n        });\n      });\n\n      client.on('applyFrameMetadata', event => {\n        // Only apply stack frame metadata to error events\n        if (event.type) {\n          return;\n        }\n\n        const stackParser = client.getOptions().stackParser;\n        addMetadataToStackFrames(stackParser, event);\n      });\n    },\n  };\n});\n","import { defineIntegration } from '../integration';\nimport type { IntegrationFn } from '../types-hoist';\nimport {\n  type AddRequestDataToEventOptions,\n  addNormalizedRequestDataToEvent,\n  addRequestDataToEvent,\n} from '../utils-hoist/requestdata';\n\nexport type RequestDataIntegrationOptions = {\n  /**\n   * Controls what data is pulled from the request and added to the event\n   */\n  include?: {\n    cookies?: boolean;\n    data?: boolean;\n    headers?: boolean;\n    ip?: boolean;\n    query_string?: boolean;\n    url?: boolean;\n    user?:\n      | boolean\n      | {\n          id?: boolean;\n          username?: boolean;\n          email?: boolean;\n        };\n  };\n\n  /**\n   * Whether to identify transactions by parameterized path, parameterized path with method, or handler name.\n   * @deprecated This option does not do anything anymore, and will be removed in v9.\n   */\n  transactionNamingScheme?: 'path' | 'methodPath' | 'handler';\n};\n\nconst DEFAULT_OPTIONS = {\n  include: {\n    cookies: true,\n    data: true,\n    headers: true,\n    ip: false,\n    query_string: true,\n    url: true,\n    user: {\n      id: true,\n      username: true,\n      email: true,\n    },\n  },\n  transactionNamingScheme: 'methodPath' as const,\n};\n\nconst INTEGRATION_NAME = 'RequestData';\n\nconst _requestDataIntegration = ((options: RequestDataIntegrationOptions = {}) => {\n  const _options: Required<RequestDataIntegrationOptions> = {\n    ...DEFAULT_OPTIONS,\n    ...options,\n    include: {\n      ...DEFAULT_OPTIONS.include,\n      ...options.include,\n      user:\n        options.include && typeof options.include.user === 'boolean'\n          ? options.include.user\n          : {\n              ...DEFAULT_OPTIONS.include.user,\n              // Unclear why TS still thinks `options.include.user` could be a boolean at this point\n              ...((options.include || {}).user as Record<string, boolean>),\n            },\n    },\n  };\n\n  return {\n    name: INTEGRATION_NAME,\n    processEvent(event) {\n      // Note: In the long run, most of the logic here should probably move into the request data utility functions. For\n      // the moment it lives here, though, until https://github.com/getsentry/sentry-javascript/issues/5718 is addressed.\n      // (TL;DR: Those functions touch many parts of the repo in many different ways, and need to be cleaned up. Once\n      // that's happened, it will be easier to add this logic in without worrying about unexpected side effects.)\n\n      const { sdkProcessingMetadata = {} } = event;\n      const { request, normalizedRequest } = sdkProcessingMetadata;\n\n      const addRequestDataOptions = convertReqDataIntegrationOptsToAddReqDataOpts(_options);\n\n      // If this is set, it takes precedence over the plain request object\n      if (normalizedRequest) {\n        // Some other data is not available in standard HTTP requests, but can sometimes be augmented by e.g. Express or Next.js\n        const ipAddress = request ? request.ip || (request.socket && request.socket.remoteAddress) : undefined;\n        const user = request ? request.user : undefined;\n\n        addNormalizedRequestDataToEvent(event, normalizedRequest, { ipAddress, user }, addRequestDataOptions);\n        return event;\n      }\n\n      // TODO(v9): Eventually we can remove this fallback branch and only rely on the normalizedRequest above\n      if (!request) {\n        return event;\n      }\n\n      // eslint-disable-next-line deprecation/deprecation\n      return addRequestDataToEvent(event, request, addRequestDataOptions);\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * Add data about a request to an event. Primarily for use in Node-based SDKs, but included in `@sentry/core`\n * so it can be used in cross-platform SDKs like `@sentry/nextjs`.\n */\nexport const requestDataIntegration = defineIntegration(_requestDataIntegration);\n\n/** Convert this integration's options to match what `addRequestDataToEvent` expects */\n/** TODO: Can possibly be deleted once https://github.com/getsentry/sentry-javascript/issues/5718 is fixed */\nfunction convertReqDataIntegrationOptsToAddReqDataOpts(\n  integrationOptions: Required<RequestDataIntegrationOptions>,\n): AddRequestDataToEventOptions {\n  const {\n    // eslint-disable-next-line deprecation/deprecation\n    transactionNamingScheme,\n    include: { ip, user, ...requestOptions },\n  } = integrationOptions;\n\n  const requestIncludeKeys: string[] = ['method'];\n  for (const [key, value] of Object.entries(requestOptions)) {\n    if (value) {\n      requestIncludeKeys.push(key);\n    }\n  }\n\n  let addReqDataUserOpt;\n  if (user === undefined) {\n    addReqDataUserOpt = true;\n  } else if (typeof user === 'boolean') {\n    addReqDataUserOpt = user;\n  } else {\n    const userIncludeKeys: string[] = [];\n    for (const [key, value] of Object.entries(user)) {\n      if (value) {\n        userIncludeKeys.push(key);\n      }\n    }\n    addReqDataUserOpt = userIncludeKeys;\n  }\n\n  return {\n    include: {\n      ip,\n      user: addReqDataUserOpt,\n      request: requestIncludeKeys.length !== 0 ? requestIncludeKeys : undefined,\n      transaction: transactionNamingScheme,\n    },\n  };\n}\n","import { defineIntegration } from '../integration';\nimport type { Event, StackFrame, Stacktrace } from '../types-hoist';\nimport { basename, relative } from '../utils-hoist/path';\nimport { GLOBAL_OBJ } from '../utils-hoist/worldwide';\n\ntype StackFrameIteratee = (frame: StackFrame) => StackFrame;\n\nconst INTEGRATION_NAME = 'RewriteFrames';\n\ninterface RewriteFramesOptions {\n  /**\n   * Root path (the beginning of the path) that will be stripped from the frames' filename.\n   *\n   * This option has slightly different behaviour in the browser and on servers:\n   * - In the browser, the value you provide in `root` will be stripped from the beginning stack frames' paths (if the path started with the value).\n   * - On the server, the root value will only replace the beginning of stack frame filepaths, when the path is absolute. If no `root` value is provided and the path is absolute, the frame will be reduced to only the filename and the provided `prefix` option.\n   *\n   * Browser example:\n   * - Original frame: `'http://example.com/my/path/static/asset.js'`\n   * - `root: 'http://example.com/my/path'`\n   * - `assetPrefix: 'app://'`\n   * - Resulting frame: `'app:///static/asset.js'`\n   *\n   * Server example:\n   * - Original frame: `'/User/local/my/path/static/asset.js'`\n   * - `root: '/User/local/my/path'`\n   * - `assetPrefix: 'app://'`\n   * - Resulting frame: `'app:///static/asset.js'`\n   */\n  root?: string;\n\n  /**\n   * A custom prefix that stack frames will be prepended with.\n   *\n   * Default: `'app://'`\n   *\n   * This option has slightly different behaviour in the browser and on servers:\n   * - In the browser, the value you provide in `prefix` will prefix the resulting filename when the value you provided in `root` was applied. Effectively replacing whatever `root` matched in the beginning of the frame with `prefix`.\n   * - On the server, the prefix is applied to all stackframes with absolute paths. On Windows, the drive identifier (e.g. \"C://\") is replaced with the prefix.\n   */\n  prefix?: string;\n\n  /**\n   * Defines an iterator that is used to iterate through all of the stack frames for modification before being sent to Sentry.\n   * Setting this option will effectively disable both the `root` and the `prefix` options.\n   */\n  iteratee?: StackFrameIteratee;\n}\n\n/**\n * Rewrite event frames paths.\n */\nexport const rewriteFramesIntegration = defineIntegration((options: RewriteFramesOptions = {}) => {\n  const root = options.root;\n  const prefix = options.prefix || 'app:///';\n\n  const isBrowser = 'window' in GLOBAL_OBJ && GLOBAL_OBJ.window !== undefined;\n\n  const iteratee: StackFrameIteratee = options.iteratee || generateIteratee({ isBrowser, root, prefix });\n\n  /** Process an exception event. */\n  function _processExceptionsEvent(event: Event): Event {\n    try {\n      return {\n        ...event,\n        exception: {\n          ...event.exception,\n          // The check for this is performed inside `process` call itself, safe to skip here\n          // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n          values: event.exception!.values!.map(value => ({\n            ...value,\n            ...(value.stacktrace && { stacktrace: _processStacktrace(value.stacktrace) }),\n          })),\n        },\n      };\n    } catch (_oO) {\n      return event;\n    }\n  }\n\n  /** Process a stack trace. */\n  function _processStacktrace(stacktrace?: Stacktrace): Stacktrace {\n    return {\n      ...stacktrace,\n      frames: stacktrace && stacktrace.frames && stacktrace.frames.map(f => iteratee(f)),\n    };\n  }\n\n  return {\n    name: INTEGRATION_NAME,\n    processEvent(originalEvent) {\n      let processedEvent = originalEvent;\n\n      if (originalEvent.exception && Array.isArray(originalEvent.exception.values)) {\n        processedEvent = _processExceptionsEvent(processedEvent);\n      }\n\n      return processedEvent;\n    },\n  };\n});\n\n/**\n * Exported only for tests.\n */\nexport function generateIteratee({\n  isBrowser,\n  root,\n  prefix,\n}: {\n  isBrowser: boolean;\n  root?: string;\n  prefix: string;\n}): StackFrameIteratee {\n  return (frame: StackFrame) => {\n    if (!frame.filename) {\n      return frame;\n    }\n\n    // Determine if this is a Windows frame by checking for a Windows-style prefix such as `C:\\`\n    const isWindowsFrame =\n      /^[a-zA-Z]:\\\\/.test(frame.filename) ||\n      // or the presence of a backslash without a forward slash (which are not allowed on Windows)\n      (frame.filename.includes('\\\\') && !frame.filename.includes('/'));\n\n    // Check if the frame filename begins with `/`\n    const startsWithSlash = /^\\//.test(frame.filename);\n\n    if (isBrowser) {\n      if (root) {\n        const oldFilename = frame.filename;\n        if (oldFilename.indexOf(root) === 0) {\n          frame.filename = oldFilename.replace(root, prefix);\n        }\n      }\n    } else {\n      if (isWindowsFrame || startsWithSlash) {\n        const filename = isWindowsFrame\n          ? frame.filename\n              .replace(/^[a-zA-Z]:/, '') // remove Windows-style prefix\n              .replace(/\\\\/g, '/') // replace all `\\\\` instances with `/`\n          : frame.filename;\n        const base = root ? relative(root, filename) : basename(filename);\n        frame.filename = `${prefix}${base}`;\n      }\n    }\n\n    return frame;\n  };\n}\n","import { defineIntegration } from '../integration';\nimport type { IntegrationFn } from '../types-hoist';\nimport { timestampInSeconds } from '../utils-hoist/time';\n\nconst INTEGRATION_NAME = 'SessionTiming';\n\nconst _sessionTimingIntegration = (() => {\n  const startTime = timestampInSeconds() * 1000;\n\n  return {\n    name: INTEGRATION_NAME,\n    processEvent(event) {\n      const now = timestampInSeconds() * 1000;\n\n      return {\n        ...event,\n        extra: {\n          ...event.extra,\n          ['session:start']: startTime,\n          ['session:duration']: now - startTime,\n          ['session:end']: now,\n        },\n      };\n    },\n  };\n}) satisfies IntegrationFn;\n\n/**\n * This function adds duration since the sessionTimingIntegration was initialized\n * till the time event was sent.\n *\n * @deprecated This integration is deprecated and will be removed in the next major version of the SDK.\n * To capture session durations alongside events, use [Context](https://docs.sentry.io/platforms/javascript/enriching-events/context/) (`Sentry.setContext()`).\n */\nexport const sessionTimingIntegration = defineIntegration(_sessionTimingIntegration);\n","import { defineIntegration } from '../integration';\nimport { addMetadataToStackFrames, stripMetadataFromStackFrames } from '../metadata';\nimport type { Event, EventItem } from '../types-hoist';\nimport { forEachEnvelopeItem } from '../utils-hoist/envelope';\nimport { getFramesFromEvent } from '../utils-hoist/stacktrace';\n\ninterface Options {\n  /**\n   * Keys that have been provided in the Sentry bundler plugin via the the `applicationKey` option, identifying your bundles.\n   *\n   * - Webpack plugin: https://www.npmjs.com/package/@sentry/webpack-plugin#applicationkey\n   * - Vite plugin: https://www.npmjs.com/package/@sentry/vite-plugin#applicationkey\n   * - Esbuild plugin: https://www.npmjs.com/package/@sentry/esbuild-plugin#applicationkey\n   * - Rollup plugin: https://www.npmjs.com/package/@sentry/rollup-plugin#applicationkey\n   */\n  filterKeys: string[];\n\n  /**\n   * Defines how the integration should behave. \"Third-Party Stack Frames\" are stack frames that did not come from files marked with a matching bundle key.\n   *\n   * You can define the behaviour with one of 4 modes:\n   * - `drop-error-if-contains-third-party-frames`: Drop error events that contain at least one third-party stack frame.\n   * - `drop-error-if-exclusively-contains-third-party-frames`: Drop error events that exclusively contain third-party stack frames.\n   * - `apply-tag-if-contains-third-party-frames`: Keep all error events, but apply a `third_party_code: true` tag in case the error contains at least one third-party stack frame.\n   * - `apply-tag-if-exclusively-contains-third-party-frames`: Keep all error events, but apply a `third_party_code: true` tag in case the error contains exclusively third-party stack frames.\n   *\n   * If you chose the mode to only apply tags, the tags can then be used in Sentry to filter your issue stream by entering `!third_party_code:True` in the search bar.\n   */\n  behaviour:\n    | 'drop-error-if-contains-third-party-frames'\n    | 'drop-error-if-exclusively-contains-third-party-frames'\n    | 'apply-tag-if-contains-third-party-frames'\n    | 'apply-tag-if-exclusively-contains-third-party-frames';\n}\n\n/**\n * This integration allows you to filter out, or tag error events that do not come from user code marked with a bundle key via the Sentry bundler plugins.\n */\nexport const thirdPartyErrorFilterIntegration = defineIntegration((options: Options) => {\n  return {\n    name: 'ThirdPartyErrorsFilter',\n    setup(client) {\n      // We need to strip metadata from stack frames before sending them to Sentry since these are client side only.\n      // TODO(lforst): Move this cleanup logic into a more central place in the SDK.\n      client.on('beforeEnvelope', envelope => {\n        forEachEnvelopeItem(envelope, (item, type) => {\n          if (type === 'event') {\n            const event = Array.isArray(item) ? (item as EventItem)[1] : undefined;\n\n            if (event) {\n              stripMetadataFromStackFrames(event);\n              item[1] = event;\n            }\n          }\n        });\n      });\n\n      client.on('applyFrameMetadata', event => {\n        // Only apply stack frame metadata to error events\n        if (event.type) {\n          return;\n        }\n\n        const stackParser = client.getOptions().stackParser;\n        addMetadataToStackFrames(stackParser, event);\n      });\n    },\n\n    processEvent(event) {\n      const frameKeys = getBundleKeysForAllFramesWithFilenames(event);\n\n      if (frameKeys) {\n        const arrayMethod =\n          options.behaviour === 'drop-error-if-contains-third-party-frames' ||\n          options.behaviour === 'apply-tag-if-contains-third-party-frames'\n            ? 'some'\n            : 'every';\n\n        const behaviourApplies = frameKeys[arrayMethod](keys => !keys.some(key => options.filterKeys.includes(key)));\n\n        if (behaviourApplies) {\n          const shouldDrop =\n            options.behaviour === 'drop-error-if-contains-third-party-frames' ||\n            options.behaviour === 'drop-error-if-exclusively-contains-third-party-frames';\n          if (shouldDrop) {\n            return null;\n          } else {\n            event.tags = {\n              ...event.tags,\n              third_party_code: true,\n            };\n          }\n        }\n      }\n\n      return event;\n    },\n  };\n});\n\nfunction getBundleKeysForAllFramesWithFilenames(event: Event): string[][] | undefined {\n  const frames = getFramesFromEvent(event);\n\n  if (!frames) {\n    return undefined;\n  }\n\n  return (\n    frames\n      // Exclude frames without a filename since these are likely native code or built-ins\n      .filter(frame => !!frame.filename)\n      .map(frame => {\n        if (frame.module_metadata) {\n          return Object.keys(frame.module_metadata)\n            .filter(key => key.startsWith(BUNDLER_PLUGIN_APP_KEY_PREFIX))\n            .map(key => key.slice(BUNDLER_PLUGIN_APP_KEY_PREFIX.length));\n        }\n        return [];\n      })\n  );\n}\n\nconst BUNDLER_PLUGIN_APP_KEY_PREFIX = '_sentryBundlerPluginAppKey:';\n","import { defineIntegration } from '../integration';\nimport type { Event, EventHint, IntegrationFn } from '../types-hoist';\nimport { isError } from '../utils-hoist/is';\nimport { truncate } from '../utils-hoist/string';\n\ninterface ZodErrorsOptions {\n  key?: string;\n  limit?: number;\n}\n\nconst DEFAULT_LIMIT = 10;\nconst INTEGRATION_NAME = 'ZodErrors';\n\n// Simplified ZodIssue type definition\ninterface ZodIssue {\n  path: (string | number)[];\n  message?: string;\n  expected?: string | number;\n  received?: string | number;\n  unionErrors?: unknown[];\n  keys?: unknown[];\n}\n\ninterface ZodError extends Error {\n  issues: ZodIssue[];\n\n  get errors(): ZodError['issues'];\n}\n\nfunction originalExceptionIsZodError(originalException: unknown): originalException is ZodError {\n  return (\n    isError(originalException) &&\n    originalException.name === 'ZodError' &&\n    Array.isArray((originalException as ZodError).errors)\n  );\n}\n\ntype SingleLevelZodIssue<T extends ZodIssue> = {\n  [P in keyof T]: T[P] extends string | number | undefined\n    ? T[P]\n    : T[P] extends unknown[]\n      ? string | undefined\n      : unknown;\n};\n\n/**\n * Formats child objects or arrays to a string\n * That is preserved when sent to Sentry\n */\nfunction formatIssueTitle(issue: ZodIssue): SingleLevelZodIssue<ZodIssue> {\n  return {\n    ...issue,\n    path: 'path' in issue && Array.isArray(issue.path) ? issue.path.join('.') : undefined,\n    keys: 'keys' in issue ? JSON.stringify(issue.keys) : undefined,\n    unionErrors: 'unionErrors' in issue ? JSON.stringify(issue.unionErrors) : undefined,\n  };\n}\n\n/**\n * Zod error message is a stringified version of ZodError.issues\n * This doesn't display well in the Sentry UI. Replace it with something shorter.\n */\nfunction formatIssueMessage(zodError: ZodError): string {\n  const errorKeyMap = new Set<string | number | symbol>();\n  for (const iss of zodError.issues) {\n    if (iss.path && iss.path[0]) {\n      errorKeyMap.add(iss.path[0]);\n    }\n  }\n  const errorKeys = Array.from(errorKeyMap);\n\n  return `Failed to validate keys: ${truncate(errorKeys.join(', '), 100)}`;\n}\n\n/**\n * Applies ZodError issues to an event extras and replaces the error message\n */\nexport function applyZodErrorsToEvent(limit: number, event: Event, hint?: EventHint): Event {\n  if (\n    !event.exception ||\n    !event.exception.values ||\n    !hint ||\n    !hint.originalException ||\n    !originalExceptionIsZodError(hint.originalException) ||\n    hint.originalException.issues.length === 0\n  ) {\n    return event;\n  }\n\n  return {\n    ...event,\n    exception: {\n      ...event.exception,\n      values: [\n        {\n          ...event.exception.values[0],\n          value: formatIssueMessage(hint.originalException),\n        },\n        ...event.exception.values.slice(1),\n      ],\n    },\n    extra: {\n      ...event.extra,\n      'zoderror.issues': hint.originalException.errors.slice(0, limit).map(formatIssueTitle),\n    },\n  };\n}\n\nconst _zodErrorsIntegration = ((options: ZodErrorsOptions = {}) => {\n  const limit = options.limit || DEFAULT_LIMIT;\n\n  return {\n    name: INTEGRATION_NAME,\n    processEvent(originalEvent, hint) {\n      const processedEvent = applyZodErrorsToEvent(limit, originalEvent, hint);\n      return processedEvent;\n    },\n  };\n}) satisfies IntegrationFn;\n\nexport const zodErrorsIntegration = defineIntegration(_zodErrorsIntegration);\n","import type { Event, StackParser } from './types-hoist';\nimport { GLOBAL_OBJ } from './utils-hoist/worldwide';\n\n/** Keys are source filename/url, values are metadata objects. */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst filenameMetadataMap = new Map<string, any>();\n/** Set of stack strings that have already been parsed. */\nconst parsedStacks = new Set<string>();\n\nfunction ensureMetadataStacksAreParsed(parser: StackParser): void {\n  if (!GLOBAL_OBJ._sentryModuleMetadata) {\n    return;\n  }\n\n  for (const stack of Object.keys(GLOBAL_OBJ._sentryModuleMetadata)) {\n    const metadata = GLOBAL_OBJ._sentryModuleMetadata[stack];\n\n    if (parsedStacks.has(stack)) {\n      continue;\n    }\n\n    // Ensure this stack doesn't get parsed again\n    parsedStacks.add(stack);\n\n    const frames = parser(stack);\n\n    // Go through the frames starting from the top of the stack and find the first one with a filename\n    for (const frame of frames.reverse()) {\n      if (frame.filename) {\n        // Save the metadata for this filename\n        filenameMetadataMap.set(frame.filename, metadata);\n        break;\n      }\n    }\n  }\n}\n\n/**\n * Retrieve metadata for a specific JavaScript file URL.\n *\n * Metadata is injected by the Sentry bundler plugins using the `_experiments.moduleMetadata` config option.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getMetadataForUrl(parser: StackParser, filename: string): any | undefined {\n  ensureMetadataStacksAreParsed(parser);\n  return filenameMetadataMap.get(filename);\n}\n\n/**\n * Adds metadata to stack frames.\n *\n * Metadata is injected by the Sentry bundler plugins using the `_experiments.moduleMetadata` config option.\n */\nexport function addMetadataToStackFrames(parser: StackParser, event: Event): void {\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    event.exception!.values!.forEach(exception => {\n      if (!exception.stacktrace) {\n        return;\n      }\n\n      for (const frame of exception.stacktrace.frames || []) {\n        if (!frame.filename || frame.module_metadata) {\n          continue;\n        }\n\n        const metadata = getMetadataForUrl(parser, frame.filename);\n\n        if (metadata) {\n          frame.module_metadata = metadata;\n        }\n      }\n    });\n  } catch (_) {\n    // To save bundle size we're just try catching here instead of checking for the existence of all the different objects.\n  }\n}\n\n/**\n * Strips metadata from stack frames.\n */\nexport function stripMetadataFromStackFrames(event: Event): void {\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    event.exception!.values!.forEach(exception => {\n      if (!exception.stacktrace) {\n        return;\n      }\n\n      for (const frame of exception.stacktrace.frames || []) {\n        delete frame.module_metadata;\n      }\n    });\n  } catch (_) {\n    // To save bundle size we're just try catching here instead of checking for the existence of all the different objects.\n  }\n}\n","import type { Client, MeasurementUnit, MetricsAggregator as MetricsAggregatorBase, Primitive } from '../types-hoist';\nimport { timestampInSeconds } from '../utils-hoist/time';\nimport { updateMetricSummaryOnActiveSpan } from '../utils/spanUtils';\nimport { DEFAULT_FLUSH_INTERVAL, MAX_WEIGHT, SET_METRIC_TYPE } from './constants';\nimport { captureAggregateMetrics } from './envelope';\nimport { METRIC_MAP } from './instance';\nimport type { MetricBucket, MetricType } from './types';\nimport { getBucketKey, sanitizeMetricKey, sanitizeTags, sanitizeUnit } from './utils';\n\n/**\n * A metrics aggregator that aggregates metrics in memory and flushes them periodically.\n */\nexport class MetricsAggregator implements MetricsAggregatorBase {\n  // TODO(@anonrig): Use FinalizationRegistry to have a proper way of flushing the buckets\n  // when the aggregator is garbage collected.\n  // Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry\n  private _buckets: MetricBucket;\n\n  // Different metrics have different weights. We use this to limit the number of metrics\n  // that we store in memory.\n  private _bucketsTotalWeight;\n\n  // We adjust the type here to add the `unref()` part, as setInterval can technically return a number or a NodeJS.Timer\n  private readonly _interval: ReturnType<typeof setInterval> & { unref?: () => void };\n\n  // SDKs are required to shift the flush interval by random() * rollup_in_seconds.\n  // That shift is determined once per startup to create jittering.\n  private readonly _flushShift: number;\n\n  // An SDK is required to perform force flushing ahead of scheduled time if the memory\n  // pressure is too high. There is no rule for this other than that SDKs should be tracking\n  // abstract aggregation complexity (eg: a counter only carries a single float, whereas a\n  // distribution is a float per emission).\n  //\n  // Force flush is used on either shutdown, flush() or when we exceed the max weight.\n  private _forceFlush: boolean;\n\n  public constructor(private readonly _client: Client) {\n    this._buckets = new Map();\n    this._bucketsTotalWeight = 0;\n\n    this._interval = setInterval(() => this._flush(), DEFAULT_FLUSH_INTERVAL);\n    if (this._interval.unref) {\n      this._interval.unref();\n    }\n\n    this._flushShift = Math.floor((Math.random() * DEFAULT_FLUSH_INTERVAL) / 1000);\n    this._forceFlush = false;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public add(\n    metricType: MetricType,\n    unsanitizedName: string,\n    value: number | string,\n    unsanitizedUnit: MeasurementUnit = 'none',\n    unsanitizedTags: Record<string, Primitive> = {},\n    maybeFloatTimestamp = timestampInSeconds(),\n  ): void {\n    const timestamp = Math.floor(maybeFloatTimestamp);\n    const name = sanitizeMetricKey(unsanitizedName);\n    const tags = sanitizeTags(unsanitizedTags);\n    const unit = sanitizeUnit(unsanitizedUnit as string);\n\n    const bucketKey = getBucketKey(metricType, name, unit, tags);\n\n    let bucketItem = this._buckets.get(bucketKey);\n    // If this is a set metric, we need to calculate the delta from the previous weight.\n    const previousWeight = bucketItem && metricType === SET_METRIC_TYPE ? bucketItem.metric.weight : 0;\n\n    if (bucketItem) {\n      bucketItem.metric.add(value);\n      // TODO(abhi): Do we need this check?\n      if (bucketItem.timestamp < timestamp) {\n        bucketItem.timestamp = timestamp;\n      }\n    } else {\n      bucketItem = {\n        // @ts-expect-error we don't need to narrow down the type of value here, saves bundle size.\n        metric: new METRIC_MAP[metricType](value),\n        timestamp,\n        metricType,\n        name,\n        unit,\n        tags,\n      };\n      this._buckets.set(bucketKey, bucketItem);\n    }\n\n    // If value is a string, it's a set metric so calculate the delta from the previous weight.\n    const val = typeof value === 'string' ? bucketItem.metric.weight - previousWeight : value;\n    updateMetricSummaryOnActiveSpan(metricType, name, val, unit, unsanitizedTags, bucketKey);\n\n    // We need to keep track of the total weight of the buckets so that we can\n    // flush them when we exceed the max weight.\n    this._bucketsTotalWeight += bucketItem.metric.weight;\n\n    if (this._bucketsTotalWeight >= MAX_WEIGHT) {\n      this.flush();\n    }\n  }\n\n  /**\n   * Flushes the current metrics to the transport via the transport.\n   */\n  public flush(): void {\n    this._forceFlush = true;\n    this._flush();\n  }\n\n  /**\n   * Shuts down metrics aggregator and clears all metrics.\n   */\n  public close(): void {\n    this._forceFlush = true;\n    clearInterval(this._interval);\n    this._flush();\n  }\n\n  /**\n   * Flushes the buckets according to the internal state of the aggregator.\n   * If it is a force flush, which happens on shutdown, it will flush all buckets.\n   * Otherwise, it will only flush buckets that are older than the flush interval,\n   * and according to the flush shift.\n   *\n   * This function mutates `_forceFlush` and `_bucketsTotalWeight` properties.\n   */\n  private _flush(): void {\n    // TODO(@anonrig): Add Atomics for locking to avoid having force flush and regular flush\n    // running at the same time.\n    // Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Atomics\n\n    // This path eliminates the need for checking for timestamps since we're forcing a flush.\n    // Remember to reset the flag, or it will always flush all metrics.\n    if (this._forceFlush) {\n      this._forceFlush = false;\n      this._bucketsTotalWeight = 0;\n      this._captureMetrics(this._buckets);\n      this._buckets.clear();\n      return;\n    }\n    const cutoffSeconds = Math.floor(timestampInSeconds()) - DEFAULT_FLUSH_INTERVAL / 1000 - this._flushShift;\n    // TODO(@anonrig): Optimization opportunity.\n    // Convert this map to an array and store key in the bucketItem.\n    const flushedBuckets: MetricBucket = new Map();\n    for (const [key, bucket] of this._buckets) {\n      if (bucket.timestamp <= cutoffSeconds) {\n        flushedBuckets.set(key, bucket);\n        this._bucketsTotalWeight -= bucket.metric.weight;\n      }\n    }\n\n    for (const [key] of flushedBuckets) {\n      this._buckets.delete(key);\n    }\n\n    this._captureMetrics(flushedBuckets);\n  }\n\n  /**\n   * Only captures a subset of the buckets passed to this function.\n   * @param flushedBuckets\n   */\n  private _captureMetrics(flushedBuckets: MetricBucket): void {\n    if (flushedBuckets.size > 0) {\n      // TODO(@anonrig): Optimization opportunity.\n      // This copy operation can be avoided if we store the key in the bucketItem.\n      const buckets = Array.from(flushedBuckets).map(([, bucketItem]) => bucketItem);\n      captureAggregateMetrics(this._client, buckets);\n    }\n  }\n}\n","import type { Client, MeasurementUnit, MetricsAggregator, Primitive } from '../types-hoist';\nimport { timestampInSeconds } from '../utils-hoist/time';\nimport { updateMetricSummaryOnActiveSpan } from '../utils/spanUtils';\nimport { DEFAULT_BROWSER_FLUSH_INTERVAL, SET_METRIC_TYPE } from './constants';\nimport { captureAggregateMetrics } from './envelope';\nimport { METRIC_MAP } from './instance';\nimport type { MetricBucket, MetricType } from './types';\nimport { getBucketKey, sanitizeMetricKey, sanitizeTags, sanitizeUnit } from './utils';\n\n/**\n * A simple metrics aggregator that aggregates metrics in memory and flushes them periodically.\n * Default flush interval is 5 seconds.\n *\n * @experimental This API is experimental and might change in the future.\n */\nexport class BrowserMetricsAggregator implements MetricsAggregator {\n  // TODO(@anonrig): Use FinalizationRegistry to have a proper way of flushing the buckets\n  // when the aggregator is garbage collected.\n  // Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/FinalizationRegistry\n  private _buckets: MetricBucket;\n  private readonly _interval: ReturnType<typeof setInterval>;\n\n  public constructor(private readonly _client: Client) {\n    this._buckets = new Map();\n    this._interval = setInterval(() => this.flush(), DEFAULT_BROWSER_FLUSH_INTERVAL);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public add(\n    metricType: MetricType,\n    unsanitizedName: string,\n    value: number | string,\n    unsanitizedUnit: MeasurementUnit | undefined = 'none',\n    unsanitizedTags: Record<string, Primitive> | undefined = {},\n    maybeFloatTimestamp: number | undefined = timestampInSeconds(),\n  ): void {\n    const timestamp = Math.floor(maybeFloatTimestamp);\n    const name = sanitizeMetricKey(unsanitizedName);\n    const tags = sanitizeTags(unsanitizedTags);\n    const unit = sanitizeUnit(unsanitizedUnit as string);\n\n    const bucketKey = getBucketKey(metricType, name, unit, tags);\n\n    let bucketItem = this._buckets.get(bucketKey);\n    // If this is a set metric, we need to calculate the delta from the previous weight.\n    const previousWeight = bucketItem && metricType === SET_METRIC_TYPE ? bucketItem.metric.weight : 0;\n\n    if (bucketItem) {\n      bucketItem.metric.add(value);\n      // TODO(abhi): Do we need this check?\n      if (bucketItem.timestamp < timestamp) {\n        bucketItem.timestamp = timestamp;\n      }\n    } else {\n      bucketItem = {\n        // @ts-expect-error we don't need to narrow down the type of value here, saves bundle size.\n        metric: new METRIC_MAP[metricType](value),\n        timestamp,\n        metricType,\n        name,\n        unit,\n        tags,\n      };\n      this._buckets.set(bucketKey, bucketItem);\n    }\n\n    // If value is a string, it's a set metric so calculate the delta from the previous weight.\n    const val = typeof value === 'string' ? bucketItem.metric.weight - previousWeight : value;\n    updateMetricSummaryOnActiveSpan(metricType, name, val, unit, unsanitizedTags, bucketKey);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public flush(): void {\n    // short circuit if buckets are empty.\n    if (this._buckets.size === 0) {\n      return;\n    }\n\n    const metricBuckets = Array.from(this._buckets.values());\n    captureAggregateMetrics(this._client, metricBuckets);\n\n    this._buckets.clear();\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public close(): void {\n    clearInterval(this._interval);\n    this.flush();\n  }\n}\n","export const COUNTER_METRIC_TYPE = 'c' as const;\nexport const GAUGE_METRIC_TYPE = 'g' as const;\nexport const SET_METRIC_TYPE = 's' as const;\nexport const DISTRIBUTION_METRIC_TYPE = 'd' as const;\n\n/**\n * This does not match spec in https://develop.sentry.dev/sdk/metrics\n * but was chosen to optimize for the most common case in browser environments.\n */\nexport const DEFAULT_BROWSER_FLUSH_INTERVAL = 5000;\n\n/**\n * SDKs are required to bucket into 10 second intervals (rollup in seconds)\n * which is the current lower bound of metric accuracy.\n */\nexport const DEFAULT_FLUSH_INTERVAL = 10000;\n\n/**\n * The maximum number of metrics that should be stored in memory.\n */\nexport const MAX_WEIGHT = 10000;\n","import type { Client, DsnComponents, MetricBucketItem, SdkMetadata, StatsdEnvelope, StatsdItem } from '../types-hoist';\nimport { dsnToString } from '../utils-hoist/dsn';\nimport { createEnvelope } from '../utils-hoist/envelope';\nimport { logger } from '../utils-hoist/logger';\nimport { serializeMetricBuckets } from './utils';\n\n/**\n * Captures aggregated metrics to the supplied client.\n */\nexport function captureAggregateMetrics(client: Client, metricBucketItems: Array<MetricBucketItem>): void {\n  logger.log(`Flushing aggregated metrics, number of metrics: ${metricBucketItems.length}`);\n  const dsn = client.getDsn();\n  const metadata = client.getSdkMetadata();\n  const tunnel = client.getOptions().tunnel;\n\n  const metricsEnvelope = createMetricEnvelope(metricBucketItems, dsn, metadata, tunnel);\n\n  // sendEnvelope should not throw\n  // eslint-disable-next-line @typescript-eslint/no-floating-promises\n  client.sendEnvelope(metricsEnvelope);\n}\n\n/**\n * Create envelope from a metric aggregate.\n */\nexport function createMetricEnvelope(\n  metricBucketItems: Array<MetricBucketItem>,\n  dsn?: DsnComponents,\n  metadata?: SdkMetadata,\n  tunnel?: string,\n): StatsdEnvelope {\n  const headers: StatsdEnvelope[0] = {\n    sent_at: new Date().toISOString(),\n  };\n\n  if (metadata && metadata.sdk) {\n    headers.sdk = {\n      name: metadata.sdk.name,\n      version: metadata.sdk.version,\n    };\n  }\n\n  if (!!tunnel && dsn) {\n    headers.dsn = dsnToString(dsn);\n  }\n\n  const item = createMetricEnvelopeItem(metricBucketItems);\n  return createEnvelope<StatsdEnvelope>(headers, [item]);\n}\n\nfunction createMetricEnvelopeItem(metricBucketItems: MetricBucketItem[]): StatsdItem {\n  const payload = serializeMetricBuckets(metricBucketItems);\n  const metricHeaders: StatsdItem[0] = {\n    type: 'statsd',\n    length: payload.length,\n  };\n  return [metricHeaders, payload];\n}\n","import type {\n  Client,\n  DurationUnit,\n  MetricData,\n  Metrics,\n  MetricsAggregator as MetricsAggregatorInterface,\n} from '../types-hoist';\nimport { MetricsAggregator } from './aggregator';\nimport { metrics as metricsCore } from './exports';\n\n/**\n * Adds a value to a counter metric\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction increment(name: string, value: number = 1, data?: MetricData): void {\n  // eslint-disable-next-line deprecation/deprecation\n  metricsCore.increment(MetricsAggregator, name, value, data);\n}\n\n/**\n * Adds a value to a distribution metric\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction distribution(name: string, value: number, data?: MetricData): void {\n  // eslint-disable-next-line deprecation/deprecation\n  metricsCore.distribution(MetricsAggregator, name, value, data);\n}\n\n/**\n * Adds a value to a set metric. Value must be a string or integer.\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction set(name: string, value: number | string, data?: MetricData): void {\n  // eslint-disable-next-line deprecation/deprecation\n  metricsCore.set(MetricsAggregator, name, value, data);\n}\n\n/**\n * Adds a value to a gauge metric\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction gauge(name: string, value: number, data?: MetricData): void {\n  // eslint-disable-next-line deprecation/deprecation\n  metricsCore.gauge(MetricsAggregator, name, value, data);\n}\n\n/**\n * Adds a timing metric.\n * The metric is added as a distribution metric.\n *\n * You can either directly capture a numeric `value`, or wrap a callback function in `timing`.\n * In the latter case, the duration of the callback execution will be captured as a span & a metric.\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction timing(name: string, value: number, unit?: DurationUnit, data?: Omit<MetricData, 'unit'>): void;\nfunction timing<T>(name: string, callback: () => T, unit?: DurationUnit, data?: Omit<MetricData, 'unit'>): T;\nfunction timing<T = void>(\n  name: string,\n  value: number | (() => T),\n  unit: DurationUnit = 'second',\n  data?: Omit<MetricData, 'unit'>,\n): T | void {\n  // eslint-disable-next-line deprecation/deprecation\n  return metricsCore.timing(MetricsAggregator, name, value, unit, data);\n}\n\n/**\n * Returns the metrics aggregator for a given client.\n */\nfunction getMetricsAggregatorForClient(client: Client): MetricsAggregatorInterface {\n  // eslint-disable-next-line deprecation/deprecation\n  return metricsCore.getMetricsAggregatorForClient(client, MetricsAggregator);\n}\n\n/**\n * The metrics API is used to capture custom metrics in Sentry.\n *\n * @deprecated The Sentry metrics beta has ended. This export will be removed in a future release.\n */\nexport const metricsDefault: Metrics & {\n  getMetricsAggregatorForClient: typeof getMetricsAggregatorForClient;\n} = {\n  increment,\n  distribution,\n  set,\n  gauge,\n  timing,\n  /**\n   * @ignore This is for internal use only.\n   */\n  getMetricsAggregatorForClient,\n};\n","import { getClient } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { startSpanManual } from '../tracing';\nimport type { Client, DurationUnit, MetricData, MetricsAggregator as MetricsAggregatorInterface } from '../types-hoist';\nimport { logger } from '../utils-hoist/logger';\nimport { timestampInSeconds } from '../utils-hoist/time';\nimport { getGlobalSingleton } from '../utils-hoist/worldwide';\nimport { handleCallbackErrors } from '../utils/handleCallbackErrors';\nimport { getActiveSpan, getRootSpan, spanToJSON } from '../utils/spanUtils';\nimport { COUNTER_METRIC_TYPE, DISTRIBUTION_METRIC_TYPE, GAUGE_METRIC_TYPE, SET_METRIC_TYPE } from './constants';\nimport type { MetricType } from './types';\n\ntype MetricsAggregatorConstructor = {\n  new (client: Client): MetricsAggregatorInterface;\n};\n\n/**\n * Gets the metrics aggregator for a given client.\n * @param client The client for which to get the metrics aggregator.\n * @param Aggregator Optional metrics aggregator class to use to create an aggregator if one does not exist.\n */\nfunction getMetricsAggregatorForClient(\n  client: Client,\n  Aggregator: MetricsAggregatorConstructor,\n): MetricsAggregatorInterface {\n  const globalMetricsAggregators = getGlobalSingleton<WeakMap<Client, MetricsAggregatorInterface>>(\n    'globalMetricsAggregators',\n    () => new WeakMap(),\n  );\n\n  const aggregator = globalMetricsAggregators.get(client);\n  if (aggregator) {\n    return aggregator;\n  }\n\n  const newAggregator = new Aggregator(client);\n  client.on('flush', () => newAggregator.flush());\n  client.on('close', () => newAggregator.close());\n  globalMetricsAggregators.set(client, newAggregator);\n\n  return newAggregator;\n}\n\nfunction addToMetricsAggregator(\n  Aggregator: MetricsAggregatorConstructor,\n  metricType: MetricType,\n  name: string,\n  value: number | string,\n  data: MetricData | undefined = {},\n): void {\n  const client = data.client || getClient<Client>();\n\n  if (!client) {\n    return;\n  }\n\n  const span = getActiveSpan();\n  const rootSpan = span ? getRootSpan(span) : undefined;\n  const transactionName = rootSpan && spanToJSON(rootSpan).description;\n\n  const { unit, tags, timestamp } = data;\n  const { release, environment } = client.getOptions();\n  const metricTags: Record<string, string> = {};\n  if (release) {\n    metricTags.release = release;\n  }\n  if (environment) {\n    metricTags.environment = environment;\n  }\n  if (transactionName) {\n    metricTags.transaction = transactionName;\n  }\n\n  DEBUG_BUILD && logger.log(`Adding value of ${value} to ${metricType} metric ${name}`);\n\n  const aggregator = getMetricsAggregatorForClient(client, Aggregator);\n  aggregator.add(metricType, name, value, unit, { ...metricTags, ...tags }, timestamp);\n}\n\n/**\n * Adds a value to a counter metric\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction increment(aggregator: MetricsAggregatorConstructor, name: string, value: number = 1, data?: MetricData): void {\n  addToMetricsAggregator(aggregator, COUNTER_METRIC_TYPE, name, ensureNumber(value), data);\n}\n\n/**\n * Adds a value to a distribution metric\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction distribution(aggregator: MetricsAggregatorConstructor, name: string, value: number, data?: MetricData): void {\n  addToMetricsAggregator(aggregator, DISTRIBUTION_METRIC_TYPE, name, ensureNumber(value), data);\n}\n\n/**\n * Adds a timing metric.\n * The metric is added as a distribution metric.\n *\n * You can either directly capture a numeric `value`, or wrap a callback function in `timing`.\n * In the latter case, the duration of the callback execution will be captured as a span & a metric.\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction timing<T = void>(\n  aggregator: MetricsAggregatorConstructor,\n  name: string,\n  value: number | (() => T),\n  unit: DurationUnit = 'second',\n  data?: Omit<MetricData, 'unit'>,\n): T | void {\n  // callback form\n  if (typeof value === 'function') {\n    const startTime = timestampInSeconds();\n\n    return startSpanManual(\n      {\n        op: 'metrics.timing',\n        name,\n        startTime,\n        onlyIfParent: true,\n      },\n      span => {\n        return handleCallbackErrors(\n          () => value(),\n          () => {\n            // no special error handling necessary\n          },\n          () => {\n            const endTime = timestampInSeconds();\n            const timeDiff = endTime - startTime;\n            // eslint-disable-next-line deprecation/deprecation\n            distribution(aggregator, name, timeDiff, { ...data, unit: 'second' });\n            span.end(endTime);\n          },\n        );\n      },\n    );\n  }\n\n  // value form\n  // eslint-disable-next-line deprecation/deprecation\n  distribution(aggregator, name, value, { ...data, unit });\n}\n\n/**\n * Adds a value to a set metric. Value must be a string or integer.\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction set(aggregator: MetricsAggregatorConstructor, name: string, value: number | string, data?: MetricData): void {\n  addToMetricsAggregator(aggregator, SET_METRIC_TYPE, name, value, data);\n}\n\n/**\n * Adds a value to a gauge metric\n *\n * @deprecated The Sentry metrics beta has ended. This method will be removed in a future release.\n */\nfunction gauge(aggregator: MetricsAggregatorConstructor, name: string, value: number, data?: MetricData): void {\n  addToMetricsAggregator(aggregator, GAUGE_METRIC_TYPE, name, ensureNumber(value), data);\n}\n\n/**\n * The metrics API is used to capture custom metrics in Sentry.\n *\n * @deprecated The Sentry metrics beta has ended. This export will be removed in a future release.\n */\nexport const metrics = {\n  increment,\n  distribution,\n  set,\n  gauge,\n  timing,\n  /**\n   * @ignore This is for internal use only.\n   */\n  getMetricsAggregatorForClient,\n};\n\n// Although this is typed to be a number, we try to handle strings as well here\nfunction ensureNumber(number: number | string): number {\n  return typeof number === 'string' ? parseInt(number) : number;\n}\n","import type { MetricInstance } from '../types-hoist';\nimport { COUNTER_METRIC_TYPE, DISTRIBUTION_METRIC_TYPE, GAUGE_METRIC_TYPE, SET_METRIC_TYPE } from './constants';\nimport { simpleHash } from './utils';\n\n/**\n * A metric instance representing a counter.\n */\nexport class CounterMetric implements MetricInstance {\n  public constructor(private _value: number) {}\n\n  /** @inheritDoc */\n  public get weight(): number {\n    return 1;\n  }\n\n  /** @inheritdoc */\n  public add(value: number): void {\n    this._value += value;\n  }\n\n  /** @inheritdoc */\n  public toString(): string {\n    return `${this._value}`;\n  }\n}\n\n/**\n * A metric instance representing a gauge.\n */\nexport class GaugeMetric implements MetricInstance {\n  private _last: number;\n  private _min: number;\n  private _max: number;\n  private _sum: number;\n  private _count: number;\n\n  public constructor(value: number) {\n    this._last = value;\n    this._min = value;\n    this._max = value;\n    this._sum = value;\n    this._count = 1;\n  }\n\n  /** @inheritDoc */\n  public get weight(): number {\n    return 5;\n  }\n\n  /** @inheritdoc */\n  public add(value: number): void {\n    this._last = value;\n    if (value < this._min) {\n      this._min = value;\n    }\n    if (value > this._max) {\n      this._max = value;\n    }\n    this._sum += value;\n    this._count++;\n  }\n\n  /** @inheritdoc */\n  public toString(): string {\n    return `${this._last}:${this._min}:${this._max}:${this._sum}:${this._count}`;\n  }\n}\n\n/**\n * A metric instance representing a distribution.\n */\nexport class DistributionMetric implements MetricInstance {\n  private _value: number[];\n\n  public constructor(first: number) {\n    this._value = [first];\n  }\n\n  /** @inheritDoc */\n  public get weight(): number {\n    return this._value.length;\n  }\n\n  /** @inheritdoc */\n  public add(value: number): void {\n    this._value.push(value);\n  }\n\n  /** @inheritdoc */\n  public toString(): string {\n    return this._value.join(':');\n  }\n}\n\n/**\n * A metric instance representing a set.\n */\nexport class SetMetric implements MetricInstance {\n  private _value: Set<number | string>;\n\n  public constructor(public first: number | string) {\n    this._value = new Set([first]);\n  }\n\n  /** @inheritDoc */\n  public get weight(): number {\n    return this._value.size;\n  }\n\n  /** @inheritdoc */\n  public add(value: number | string): void {\n    this._value.add(value);\n  }\n\n  /** @inheritdoc */\n  public toString(): string {\n    return Array.from(this._value)\n      .map(val => (typeof val === 'string' ? simpleHash(val) : val))\n      .join(':');\n  }\n}\n\nexport const METRIC_MAP = {\n  [COUNTER_METRIC_TYPE]: CounterMetric,\n  [GAUGE_METRIC_TYPE]: GaugeMetric,\n  [DISTRIBUTION_METRIC_TYPE]: DistributionMetric,\n  [SET_METRIC_TYPE]: SetMetric,\n};\n","import type { MeasurementUnit, Span } from '../types-hoist';\nimport type { MetricSummary } from '../types-hoist';\nimport type { Primitive } from '../types-hoist';\nimport { dropUndefinedKeys } from '../utils-hoist/object';\nimport type { MetricType } from './types';\n\n/**\n * key: bucketKey\n * value: [exportKey, MetricSummary]\n */\ntype MetricSummaryStorage = Map<string, [string, MetricSummary]>;\n\nconst METRICS_SPAN_FIELD = '_sentryMetrics';\n\ntype SpanWithPotentialMetrics = Span & {\n  [METRICS_SPAN_FIELD]?: MetricSummaryStorage;\n};\n\n/**\n * Fetches the metric summary if it exists for the passed span\n */\nexport function getMetricSummaryJsonForSpan(span: Span): Record<string, Array<MetricSummary>> | undefined {\n  const storage = (span as SpanWithPotentialMetrics)[METRICS_SPAN_FIELD];\n\n  if (!storage) {\n    return undefined;\n  }\n  const output: Record<string, Array<MetricSummary>> = {};\n\n  for (const [, [exportKey, summary]] of storage) {\n    const arr = output[exportKey] || (output[exportKey] = []);\n    arr.push(dropUndefinedKeys(summary));\n  }\n\n  return output;\n}\n\n/**\n * Updates the metric summary on a span.\n */\nexport function updateMetricSummaryOnSpan(\n  span: Span,\n  metricType: MetricType,\n  sanitizedName: string,\n  value: number,\n  unit: MeasurementUnit,\n  tags: Record<string, Primitive>,\n  bucketKey: string,\n): void {\n  const existingStorage = (span as SpanWithPotentialMetrics)[METRICS_SPAN_FIELD];\n  const storage =\n    existingStorage ||\n    ((span as SpanWithPotentialMetrics)[METRICS_SPAN_FIELD] = new Map<string, [string, MetricSummary]>());\n\n  const exportKey = `${metricType}:${sanitizedName}@${unit}`;\n  const bucketItem = storage.get(bucketKey);\n\n  if (bucketItem) {\n    const [, summary] = bucketItem;\n    storage.set(bucketKey, [\n      exportKey,\n      {\n        min: Math.min(summary.min, value),\n        max: Math.max(summary.max, value),\n        count: (summary.count += 1),\n        sum: (summary.sum += value),\n        tags: summary.tags,\n      },\n    ]);\n  } else {\n    storage.set(bucketKey, [\n      exportKey,\n      {\n        min: value,\n        max: value,\n        count: 1,\n        sum: value,\n        tags,\n      },\n    ]);\n  }\n}\n","import type { MeasurementUnit, MetricBucketItem, Primitive } from '../types-hoist';\nimport { dropUndefinedKeys } from '../utils-hoist/object';\nimport type { MetricType } from './types';\n\n/**\n * Generate bucket key from metric properties.\n */\nexport function getBucketKey(\n  metricType: MetricType,\n  name: string,\n  unit: MeasurementUnit,\n  tags: Record<string, string>,\n): string {\n  const stringifiedTags = Object.entries(dropUndefinedKeys(tags)).sort((a, b) => a[0].localeCompare(b[0]));\n  return `${metricType}${name}${unit}${stringifiedTags}`;\n}\n\n/* eslint-disable no-bitwise */\n/**\n * Simple hash function for strings.\n */\nexport function simpleHash(s: string): number {\n  let rv = 0;\n  for (let i = 0; i < s.length; i++) {\n    const c = s.charCodeAt(i);\n    rv = (rv << 5) - rv + c;\n    rv &= rv;\n  }\n  return rv >>> 0;\n}\n/* eslint-enable no-bitwise */\n\n/**\n * Serialize metrics buckets into a string based on statsd format.\n *\n * Example of format:\n * metric.name@second:1:1.2|d|#a:value,b:anothervalue|T12345677\n * Segments:\n * name: metric.name\n * unit: second\n * value: [1, 1.2]\n * type of metric: d (distribution)\n * tags: { a: value, b: anothervalue }\n * timestamp: 12345677\n */\nexport function serializeMetricBuckets(metricBucketItems: MetricBucketItem[]): string {\n  let out = '';\n  for (const item of metricBucketItems) {\n    const tagEntries = Object.entries(item.tags);\n    const maybeTags = tagEntries.length > 0 ? `|#${tagEntries.map(([key, value]) => `${key}:${value}`).join(',')}` : '';\n    out += `${item.name}@${item.unit}:${item.metric}|${item.metricType}${maybeTags}|T${item.timestamp}\\n`;\n  }\n  return out;\n}\n\n/**\n * Sanitizes units\n *\n * These Regex's are straight from the normalisation docs:\n * https://develop.sentry.dev/sdk/metrics/#normalization\n */\nexport function sanitizeUnit(unit: string): string {\n  return unit.replace(/[^\\w]+/gi, '_');\n}\n\n/**\n * Sanitizes metric keys\n *\n * These Regex's are straight from the normalisation docs:\n * https://develop.sentry.dev/sdk/metrics/#normalization\n */\nexport function sanitizeMetricKey(key: string): string {\n  return key.replace(/[^\\w\\-.]+/gi, '_');\n}\n\n/**\n * Sanitizes metric keys\n *\n * These Regex's are straight from the normalisation docs:\n * https://develop.sentry.dev/sdk/metrics/#normalization\n */\nfunction sanitizeTagKey(key: string): string {\n  return key.replace(/[^\\w\\-./]+/gi, '');\n}\n\n/**\n * These Regex's are straight from the normalisation docs:\n * https://develop.sentry.dev/sdk/metrics/#normalization\n */\nconst tagValueReplacements: [string, string][] = [\n  ['\\n', '\\\\n'],\n  ['\\r', '\\\\r'],\n  ['\\t', '\\\\t'],\n  ['\\\\', '\\\\\\\\'],\n  ['|', '\\\\u{7c}'],\n  [',', '\\\\u{2c}'],\n];\n\nfunction getCharOrReplacement(input: string): string {\n  for (const [search, replacement] of tagValueReplacements) {\n    if (input === search) {\n      return replacement;\n    }\n  }\n\n  return input;\n}\n\nfunction sanitizeTagValue(value: string): string {\n  return [...value].reduce((acc, char) => acc + getCharOrReplacement(char), '');\n}\n\n/**\n * Sanitizes tags.\n */\nexport function sanitizeTags(unsanitizedTags: Record<string, Primitive>): Record<string, string> {\n  const tags: Record<string, string> = {};\n  for (const key in unsanitizedTags) {\n    if (Object.prototype.hasOwnProperty.call(unsanitizedTags, key)) {\n      const sanitizedKey = sanitizeTagKey(key);\n      tags[sanitizedKey] = sanitizeTagValue(String(unsanitizedTags[key]));\n    }\n  }\n  return tags;\n}\n","import type { Profiler, ProfilingIntegration } from './types-hoist';\n\nimport { getClient } from './currentScopes';\nimport { DEBUG_BUILD } from './debug-build';\nimport { logger } from './utils-hoist/logger';\n\nfunction isProfilingIntegrationWithProfiler(\n  integration: ProfilingIntegration<any> | undefined,\n): integration is ProfilingIntegration<any> {\n  return (\n    !!integration &&\n    typeof integration['_profiler'] !== 'undefined' &&\n    typeof integration['_profiler']['start'] === 'function' &&\n    typeof integration['_profiler']['stop'] === 'function'\n  );\n}\n/**\n * Starts the Sentry continuous profiler.\n * This mode is exclusive with the transaction profiler and will only work if the profilesSampleRate is set to a falsy value.\n * In continuous profiling mode, the profiler will keep reporting profile chunks to Sentry until it is stopped, which allows for continuous profiling of the application.\n */\nfunction startProfiler(): void {\n  const client = getClient();\n  if (!client) {\n    DEBUG_BUILD && logger.warn('No Sentry client available, profiling is not started');\n    return;\n  }\n\n  const integration = client.getIntegrationByName<ProfilingIntegration<any>>('ProfilingIntegration');\n\n  if (!integration) {\n    DEBUG_BUILD && logger.warn('ProfilingIntegration is not available');\n    return;\n  }\n\n  if (!isProfilingIntegrationWithProfiler(integration)) {\n    DEBUG_BUILD && logger.warn('Profiler is not available on profiling integration.');\n    return;\n  }\n\n  integration._profiler.start();\n}\n\n/**\n * Stops the Sentry continuous profiler.\n * Calls to stop will stop the profiler and flush the currently collected profile data to Sentry.\n */\nfunction stopProfiler(): void {\n  const client = getClient();\n  if (!client) {\n    DEBUG_BUILD && logger.warn('No Sentry client available, profiling is not started');\n    return;\n  }\n\n  const integration = client.getIntegrationByName<ProfilingIntegration<any>>('ProfilingIntegration');\n  if (!integration) {\n    DEBUG_BUILD && logger.warn('ProfilingIntegration is not available');\n    return;\n  }\n\n  if (!isProfilingIntegrationWithProfiler(integration)) {\n    DEBUG_BUILD && logger.warn('Profiler is not available on profiling integration.');\n    return;\n  }\n\n  integration._profiler.stop();\n}\n\nexport const profiler: Profiler = {\n  startProfiler,\n  stopProfiler,\n};\n","/* eslint-disable max-lines */\nimport type {\n  Attachment,\n  Breadcrumb,\n  CaptureContext,\n  Client,\n  Context,\n  Contexts,\n  Event,\n  EventHint,\n  EventProcessor,\n  Extra,\n  Extras,\n  Primitive,\n  PropagationContext,\n  RequestSession,\n  Scope as ScopeInterface,\n  ScopeContext,\n  ScopeData,\n  Session,\n  SeverityLevel,\n  User,\n} from './types-hoist';\n\nimport { updateSession } from './session';\nimport { isPlainObject } from './utils-hoist/is';\nimport { logger } from './utils-hoist/logger';\nimport { uuid4 } from './utils-hoist/misc';\nimport { generateSpanId, generateTraceId } from './utils-hoist/propagationContext';\nimport { dateTimestampInSeconds } from './utils-hoist/time';\nimport { merge } from './utils/merge';\nimport { _getSpanForScope, _setSpanForScope } from './utils/spanOnScope';\n\n/**\n * Default value for maximum number of breadcrumbs added to an event.\n */\nconst DEFAULT_MAX_BREADCRUMBS = 100;\n\n/**\n * Holds additional event information.\n */\nclass ScopeClass implements ScopeInterface {\n  /** Flag if notifying is happening. */\n  protected _notifyingListeners: boolean;\n\n  /** Callback for client to receive scope changes. */\n  protected _scopeListeners: Array<(scope: Scope) => void>;\n\n  /** Callback list that will be called during event processing. */\n  protected _eventProcessors: EventProcessor[];\n\n  /** Array of breadcrumbs. */\n  protected _breadcrumbs: Breadcrumb[];\n\n  /** User */\n  protected _user: User;\n\n  /** Tags */\n  protected _tags: { [key: string]: Primitive };\n\n  /** Extra */\n  protected _extra: Extras;\n\n  /** Contexts */\n  protected _contexts: Contexts;\n\n  /** Attachments */\n  protected _attachments: Attachment[];\n\n  /** Propagation Context for distributed tracing */\n  protected _propagationContext: PropagationContext;\n\n  /**\n   * A place to stash data which is needed at some point in the SDK's event processing pipeline but which shouldn't get\n   * sent to Sentry\n   */\n  protected _sdkProcessingMetadata: { [key: string]: unknown };\n\n  /** Fingerprint */\n  protected _fingerprint?: string[];\n\n  /** Severity */\n  protected _level?: SeverityLevel;\n\n  /**\n   * Transaction Name\n   *\n   * IMPORTANT: The transaction name on the scope has nothing to do with root spans/transaction objects.\n   * It's purpose is to assign a transaction to the scope that's added to non-transaction events.\n   */\n  protected _transactionName?: string;\n\n  /** Session */\n  protected _session?: Session;\n\n  /** Request Mode Session Status */\n  // eslint-disable-next-line deprecation/deprecation\n  protected _requestSession?: RequestSession;\n\n  /** The client on this scope */\n  protected _client?: Client;\n\n  /** Contains the last event id of a captured event.  */\n  protected _lastEventId?: string;\n\n  // NOTE: Any field which gets added here should get added not only to the constructor but also to the `clone` method.\n\n  public constructor() {\n    this._notifyingListeners = false;\n    this._scopeListeners = [];\n    this._eventProcessors = [];\n    this._breadcrumbs = [];\n    this._attachments = [];\n    this._user = {};\n    this._tags = {};\n    this._extra = {};\n    this._contexts = {};\n    this._sdkProcessingMetadata = {};\n    this._propagationContext = {\n      traceId: generateTraceId(),\n      spanId: generateSpanId(),\n    };\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public clone(): ScopeClass {\n    const newScope = new ScopeClass();\n    newScope._breadcrumbs = [...this._breadcrumbs];\n    newScope._tags = { ...this._tags };\n    newScope._extra = { ...this._extra };\n    newScope._contexts = { ...this._contexts };\n    if (this._contexts.flags) {\n      // We need to copy the `values` array so insertions on a cloned scope\n      // won't affect the original array.\n      newScope._contexts.flags = {\n        values: [...this._contexts.flags.values],\n      };\n    }\n\n    newScope._user = this._user;\n    newScope._level = this._level;\n    newScope._session = this._session;\n    newScope._transactionName = this._transactionName;\n    newScope._fingerprint = this._fingerprint;\n    newScope._eventProcessors = [...this._eventProcessors];\n    newScope._requestSession = this._requestSession;\n    newScope._attachments = [...this._attachments];\n    newScope._sdkProcessingMetadata = { ...this._sdkProcessingMetadata };\n    newScope._propagationContext = { ...this._propagationContext };\n    newScope._client = this._client;\n    newScope._lastEventId = this._lastEventId;\n\n    _setSpanForScope(newScope, _getSpanForScope(this));\n\n    return newScope;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setClient(client: Client | undefined): void {\n    this._client = client;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setLastEventId(lastEventId: string | undefined): void {\n    this._lastEventId = lastEventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getClient<C extends Client>(): C | undefined {\n    return this._client as C | undefined;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public lastEventId(): string | undefined {\n    return this._lastEventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public addScopeListener(callback: (scope: Scope) => void): void {\n    this._scopeListeners.push(callback);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public addEventProcessor(callback: EventProcessor): this {\n    this._eventProcessors.push(callback);\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setUser(user: User | null): this {\n    // If null is passed we want to unset everything, but still define keys,\n    // so that later down in the pipeline any existing values are cleared.\n    this._user = user || {\n      email: undefined,\n      id: undefined,\n      ip_address: undefined,\n      username: undefined,\n    };\n\n    if (this._session) {\n      updateSession(this._session, { user });\n    }\n\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getUser(): User | undefined {\n    return this._user;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  // eslint-disable-next-line deprecation/deprecation\n  public getRequestSession(): RequestSession | undefined {\n    return this._requestSession;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  // eslint-disable-next-line deprecation/deprecation\n  public setRequestSession(requestSession?: RequestSession): this {\n    this._requestSession = requestSession;\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setTags(tags: { [key: string]: Primitive }): this {\n    this._tags = {\n      ...this._tags,\n      ...tags,\n    };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setTag(key: string, value: Primitive): this {\n    this._tags = { ...this._tags, [key]: value };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setExtras(extras: Extras): this {\n    this._extra = {\n      ...this._extra,\n      ...extras,\n    };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setExtra(key: string, extra: Extra): this {\n    this._extra = { ...this._extra, [key]: extra };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setFingerprint(fingerprint: string[]): this {\n    this._fingerprint = fingerprint;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setLevel(level: SeverityLevel): this {\n    this._level = level;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setTransactionName(name?: string): this {\n    this._transactionName = name;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setContext(key: string, context: Context | null): this {\n    if (context === null) {\n      // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n      delete this._contexts[key];\n    } else {\n      this._contexts[key] = context;\n    }\n\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setSession(session?: Session): this {\n    if (!session) {\n      delete this._session;\n    } else {\n      this._session = session;\n    }\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getSession(): Session | undefined {\n    return this._session;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public update(captureContext?: CaptureContext): this {\n    if (!captureContext) {\n      return this;\n    }\n\n    const scopeToMerge = typeof captureContext === 'function' ? captureContext(this) : captureContext;\n\n    const [scopeInstance, requestSession] =\n      scopeToMerge instanceof Scope\n        ? // eslint-disable-next-line deprecation/deprecation\n          [scopeToMerge.getScopeData(), scopeToMerge.getRequestSession()]\n        : isPlainObject(scopeToMerge)\n          ? [captureContext as ScopeContext, (captureContext as ScopeContext).requestSession]\n          : [];\n\n    const { tags, extra, user, contexts, level, fingerprint = [], propagationContext } = scopeInstance || {};\n\n    this._tags = { ...this._tags, ...tags };\n    this._extra = { ...this._extra, ...extra };\n    this._contexts = { ...this._contexts, ...contexts };\n\n    if (user && Object.keys(user).length) {\n      this._user = user;\n    }\n\n    if (level) {\n      this._level = level;\n    }\n\n    if (fingerprint.length) {\n      this._fingerprint = fingerprint;\n    }\n\n    if (propagationContext) {\n      this._propagationContext = propagationContext;\n    }\n\n    if (requestSession) {\n      this._requestSession = requestSession;\n    }\n\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public clear(): this {\n    // client is not cleared here on purpose!\n    this._breadcrumbs = [];\n    this._tags = {};\n    this._extra = {};\n    this._user = {};\n    this._contexts = {};\n    this._level = undefined;\n    this._transactionName = undefined;\n    this._fingerprint = undefined;\n    this._requestSession = undefined;\n    this._session = undefined;\n    _setSpanForScope(this, undefined);\n    this._attachments = [];\n    this.setPropagationContext({ traceId: generateTraceId() });\n\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public addBreadcrumb(breadcrumb: Breadcrumb, maxBreadcrumbs?: number): this {\n    const maxCrumbs = typeof maxBreadcrumbs === 'number' ? maxBreadcrumbs : DEFAULT_MAX_BREADCRUMBS;\n\n    // No data has been changed, so don't notify scope listeners\n    if (maxCrumbs <= 0) {\n      return this;\n    }\n\n    const mergedBreadcrumb = {\n      timestamp: dateTimestampInSeconds(),\n      ...breadcrumb,\n    };\n\n    const breadcrumbs = this._breadcrumbs;\n    breadcrumbs.push(mergedBreadcrumb);\n    this._breadcrumbs = breadcrumbs.length > maxCrumbs ? breadcrumbs.slice(-maxCrumbs) : breadcrumbs;\n\n    this._notifyScopeListeners();\n\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getLastBreadcrumb(): Breadcrumb | undefined {\n    return this._breadcrumbs[this._breadcrumbs.length - 1];\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public clearBreadcrumbs(): this {\n    this._breadcrumbs = [];\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public addAttachment(attachment: Attachment): this {\n    this._attachments.push(attachment);\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public clearAttachments(): this {\n    this._attachments = [];\n    return this;\n  }\n\n  /** @inheritDoc */\n  public getScopeData(): ScopeData {\n    return {\n      breadcrumbs: this._breadcrumbs,\n      attachments: this._attachments,\n      contexts: this._contexts,\n      tags: this._tags,\n      extra: this._extra,\n      user: this._user,\n      level: this._level,\n      fingerprint: this._fingerprint || [],\n      eventProcessors: this._eventProcessors,\n      propagationContext: this._propagationContext,\n      sdkProcessingMetadata: this._sdkProcessingMetadata,\n      transactionName: this._transactionName,\n      span: _getSpanForScope(this),\n    };\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setSDKProcessingMetadata(newData: { [key: string]: unknown }): this {\n    this._sdkProcessingMetadata = merge(this._sdkProcessingMetadata, newData, 2);\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setPropagationContext(\n    context: Omit<PropagationContext, 'spanId'> & Partial<Pick<PropagationContext, 'spanId'>>,\n  ): this {\n    this._propagationContext = {\n      // eslint-disable-next-line deprecation/deprecation\n      spanId: generateSpanId(),\n      ...context,\n    };\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getPropagationContext(): PropagationContext {\n    return this._propagationContext;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureException(exception: unknown, hint?: EventHint): string {\n    const eventId = hint && hint.event_id ? hint.event_id : uuid4();\n\n    if (!this._client) {\n      logger.warn('No client configured on scope - will not capture exception!');\n      return eventId;\n    }\n\n    const syntheticException = new Error('Sentry syntheticException');\n\n    this._client.captureException(\n      exception,\n      {\n        originalException: exception,\n        syntheticException,\n        ...hint,\n        event_id: eventId,\n      },\n      this,\n    );\n\n    return eventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureMessage(message: string, level?: SeverityLevel, hint?: EventHint): string {\n    const eventId = hint && hint.event_id ? hint.event_id : uuid4();\n\n    if (!this._client) {\n      logger.warn('No client configured on scope - will not capture message!');\n      return eventId;\n    }\n\n    const syntheticException = new Error(message);\n\n    this._client.captureMessage(\n      message,\n      level,\n      {\n        originalException: message,\n        syntheticException,\n        ...hint,\n        event_id: eventId,\n      },\n      this,\n    );\n\n    return eventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureEvent(event: Event, hint?: EventHint): string {\n    const eventId = hint && hint.event_id ? hint.event_id : uuid4();\n\n    if (!this._client) {\n      logger.warn('No client configured on scope - will not capture event!');\n      return eventId;\n    }\n\n    this._client.captureEvent(event, { ...hint, event_id: eventId }, this);\n\n    return eventId;\n  }\n\n  /**\n   * This will be called on every set call.\n   */\n  protected _notifyScopeListeners(): void {\n    // We need this check for this._notifyingListeners to be able to work on scope during updates\n    // If this check is not here we'll produce endless recursion when something is done with the scope\n    // during the callback.\n    if (!this._notifyingListeners) {\n      this._notifyingListeners = true;\n      this._scopeListeners.forEach(callback => {\n        callback(this);\n      });\n      this._notifyingListeners = false;\n    }\n  }\n}\n\n/**\n * Holds additional event information.\n */\nexport const Scope = ScopeClass;\n\n/**\n * Holds additional event information.\n */\nexport type Scope = ScopeInterface;\n","/**\n * Use this attribute to represent the source of a span.\n * Should be one of: custom, url, route, view, component, task, unknown\n *\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_SOURCE = 'sentry.source';\n\n/**\n * Use this attribute to represent the sample rate used for a span.\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE = 'sentry.sample_rate';\n\n/**\n * Use this attribute to represent the operation of a span.\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_OP = 'sentry.op';\n\n/**\n * Use this attribute to represent the origin of a span.\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN = 'sentry.origin';\n\n/** The reason why an idle span finished. */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON = 'sentry.idle_span_finish_reason';\n\n/** The unit of a measurement, which may be stored as a TimedEvent. */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT = 'sentry.measurement_unit';\n\n/** The value of a measurement, which may be stored as a TimedEvent. */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE = 'sentry.measurement_value';\n\n/**\n * A custom span name set by users guaranteed to be taken over any automatically\n * inferred name. This attribute is removed before the span is sent.\n *\n * @internal only meant for internal SDK usage\n * @hidden\n */\nexport const SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME = 'sentry.custom_span_name';\n\n/**\n * The id of the profile that this span occurred in.\n */\nexport const SEMANTIC_ATTRIBUTE_PROFILE_ID = 'sentry.profile_id';\n\nexport const SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME = 'sentry.exclusive_time';\n\nexport const SEMANTIC_ATTRIBUTE_CACHE_HIT = 'cache.hit';\n\nexport const SEMANTIC_ATTRIBUTE_CACHE_KEY = 'cache.key';\n\nexport const SEMANTIC_ATTRIBUTE_CACHE_ITEM_SIZE = 'cache.item_size';\n\n/** TODO: Remove these once we update to latest semantic conventions */\nexport const SEMANTIC_ATTRIBUTE_HTTP_REQUEST_METHOD = 'http.request.method';\nexport const SEMANTIC_ATTRIBUTE_URL_FULL = 'url.full';\n","import type {\n  BaseTransportOptions,\n  CheckIn,\n  ClientOptions,\n  DynamicSamplingContext,\n  Event,\n  EventHint,\n  MonitorConfig,\n  ParameterizedString,\n  SerializedCheckIn,\n  SeverityLevel,\n  TraceContext,\n} from './types-hoist';\n\nimport { BaseClient } from './baseclient';\nimport { createCheckInEnvelope } from './checkin';\nimport { getIsolationScope, getTraceContextFromScope } from './currentScopes';\nimport { DEBUG_BUILD } from './debug-build';\nimport type { Scope } from './scope';\nimport { SessionFlusher } from './sessionflusher';\nimport {\n  getDynamicSamplingContextFromScope,\n  getDynamicSamplingContextFromSpan,\n  registerSpanErrorInstrumentation,\n} from './tracing';\nimport { eventFromMessage, eventFromUnknownInput } from './utils-hoist/eventbuilder';\nimport { logger } from './utils-hoist/logger';\nimport { uuid4 } from './utils-hoist/misc';\nimport { resolvedSyncPromise } from './utils-hoist/syncpromise';\nimport { _getSpanForScope } from './utils/spanOnScope';\nimport { spanToTraceContext } from './utils/spanUtils';\n\nexport interface ServerRuntimeClientOptions extends ClientOptions<BaseTransportOptions> {\n  platform?: string;\n  runtime?: { name: string; version?: string };\n  serverName?: string;\n}\n\n/**\n * The Sentry Server Runtime Client SDK.\n */\nexport class ServerRuntimeClient<\n  O extends ClientOptions & ServerRuntimeClientOptions = ServerRuntimeClientOptions,\n> extends BaseClient<O> {\n  // eslint-disable-next-line deprecation/deprecation\n  protected _sessionFlusher: SessionFlusher | undefined;\n\n  /**\n   * Creates a new Edge SDK instance.\n   * @param options Configuration options for this SDK.\n   */\n  public constructor(options: O) {\n    // Server clients always support tracing\n    registerSpanErrorInstrumentation();\n\n    super(options);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public eventFromException(exception: unknown, hint?: EventHint): PromiseLike<Event> {\n    const event = eventFromUnknownInput(this, this._options.stackParser, exception, hint);\n    event.level = 'error';\n\n    return resolvedSyncPromise(event);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public eventFromMessage(\n    message: ParameterizedString,\n    level: SeverityLevel = 'info',\n    hint?: EventHint,\n  ): PromiseLike<Event> {\n    return resolvedSyncPromise(\n      eventFromMessage(this._options.stackParser, message, level, hint, this._options.attachStacktrace),\n    );\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureException(exception: unknown, hint?: EventHint, scope?: Scope): string {\n    // Check if `_sessionFlusher` exists because it is initialized (defined) only when the `autoSessionTracking` is enabled.\n    // The expectation is that session aggregates are only sent when `autoSessionTracking` is enabled.\n    // TODO(v9): Our goal in the future is to not have the `autoSessionTracking` option and instead rely on integrations doing the creation and sending of sessions. We will not have a central kill-switch for sessions.\n    // TODO(v9): This should move into the httpIntegration.\n    // eslint-disable-next-line deprecation/deprecation\n    if (this._options.autoSessionTracking && this._sessionFlusher) {\n      // eslint-disable-next-line deprecation/deprecation\n      const requestSession = getIsolationScope().getRequestSession();\n\n      // Necessary checks to ensure this is code block is executed only within a request\n      // Should override the status only if `requestSession.status` is `Ok`, which is its initial stage\n      if (requestSession && requestSession.status === 'ok') {\n        requestSession.status = 'errored';\n      }\n    }\n\n    return super.captureException(exception, hint, scope);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureEvent(event: Event, hint?: EventHint, scope?: Scope): string {\n    // Check if `_sessionFlusher` exists because it is initialized only when the `autoSessionTracking` is enabled.\n    // The expectation is that session aggregates are only sent when `autoSessionTracking` is enabled.\n    // TODO(v9): Our goal in the future is to not have the `autoSessionTracking` option and instead rely on integrations doing the creation and sending of sessions. We will not have a central kill-switch for sessions.\n    // TODO(v9): This should move into the httpIntegration.\n    // eslint-disable-next-line deprecation/deprecation\n    if (this._options.autoSessionTracking && this._sessionFlusher) {\n      const eventType = event.type || 'exception';\n      const isException =\n        eventType === 'exception' && event.exception && event.exception.values && event.exception.values.length > 0;\n\n      // If the event is of type Exception, then a request session should be captured\n      if (isException) {\n        // eslint-disable-next-line deprecation/deprecation\n        const requestSession = getIsolationScope().getRequestSession();\n\n        // Ensure that this is happening within the bounds of a request, and make sure not to override\n        // Session Status if Errored / Crashed\n        if (requestSession && requestSession.status === 'ok') {\n          requestSession.status = 'errored';\n        }\n      }\n    }\n\n    return super.captureEvent(event, hint, scope);\n  }\n\n  /**\n   *\n   * @inheritdoc\n   */\n  public close(timeout?: number): PromiseLike<boolean> {\n    if (this._sessionFlusher) {\n      this._sessionFlusher.close();\n    }\n    return super.close(timeout);\n  }\n\n  /**\n   * Initializes an instance of SessionFlusher on the client which will aggregate and periodically flush session data.\n   *\n   * NOTICE: This method will implicitly create an interval that is periodically called.\n   * To clean up this resources, call `.close()` when you no longer intend to use the client.\n   * Not doing so will result in a memory leak.\n   */\n  public initSessionFlusher(): void {\n    const { release, environment } = this._options;\n    if (!release) {\n      DEBUG_BUILD && logger.warn('Cannot initialize an instance of SessionFlusher if no release is provided!');\n    } else {\n      // eslint-disable-next-line deprecation/deprecation\n      this._sessionFlusher = new SessionFlusher(this, {\n        release,\n        environment,\n      });\n    }\n  }\n\n  /**\n   * Create a cron monitor check in and send it to Sentry.\n   *\n   * @param checkIn An object that describes a check in.\n   * @param upsertMonitorConfig An optional object that describes a monitor config. Use this if you want\n   * to create a monitor automatically when sending a check in.\n   */\n  public captureCheckIn(checkIn: CheckIn, monitorConfig?: MonitorConfig, scope?: Scope): string {\n    const id = 'checkInId' in checkIn && checkIn.checkInId ? checkIn.checkInId : uuid4();\n    if (!this._isEnabled()) {\n      DEBUG_BUILD && logger.warn('SDK not enabled, will not capture checkin.');\n      return id;\n    }\n\n    const options = this.getOptions();\n    const { release, environment, tunnel } = options;\n\n    const serializedCheckIn: SerializedCheckIn = {\n      check_in_id: id,\n      monitor_slug: checkIn.monitorSlug,\n      status: checkIn.status,\n      release,\n      environment,\n    };\n\n    if ('duration' in checkIn) {\n      serializedCheckIn.duration = checkIn.duration;\n    }\n\n    if (monitorConfig) {\n      serializedCheckIn.monitor_config = {\n        schedule: monitorConfig.schedule,\n        checkin_margin: monitorConfig.checkinMargin,\n        max_runtime: monitorConfig.maxRuntime,\n        timezone: monitorConfig.timezone,\n        failure_issue_threshold: monitorConfig.failureIssueThreshold,\n        recovery_threshold: monitorConfig.recoveryThreshold,\n      };\n    }\n\n    const [dynamicSamplingContext, traceContext] = this._getTraceInfoFromScope(scope);\n    if (traceContext) {\n      serializedCheckIn.contexts = {\n        trace: traceContext,\n      };\n    }\n\n    const envelope = createCheckInEnvelope(\n      serializedCheckIn,\n      dynamicSamplingContext,\n      this.getSdkMetadata(),\n      tunnel,\n      this.getDsn(),\n    );\n\n    DEBUG_BUILD && logger.info('Sending checkin:', checkIn.monitorSlug, checkIn.status);\n\n    // sendEnvelope should not throw\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    this.sendEnvelope(envelope);\n\n    return id;\n  }\n\n  /**\n   * Method responsible for capturing/ending a request session by calling `incrementSessionStatusCount` to increment\n   * appropriate session aggregates bucket\n   *\n   * @deprecated This method should not be used or extended. It's functionality will move into the `httpIntegration` and not be part of any public API.\n   */\n  protected _captureRequestSession(): void {\n    if (!this._sessionFlusher) {\n      DEBUG_BUILD && logger.warn('Discarded request mode session because autoSessionTracking option was disabled');\n    } else {\n      this._sessionFlusher.incrementSessionStatusCount();\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  protected _prepareEvent(\n    event: Event,\n    hint: EventHint,\n    scope?: Scope,\n    isolationScope?: Scope,\n  ): PromiseLike<Event | null> {\n    if (this._options.platform) {\n      event.platform = event.platform || this._options.platform;\n    }\n\n    if (this._options.runtime) {\n      event.contexts = {\n        ...event.contexts,\n        runtime: (event.contexts || {}).runtime || this._options.runtime,\n      };\n    }\n\n    if (this._options.serverName) {\n      event.server_name = event.server_name || this._options.serverName;\n    }\n\n    return super._prepareEvent(event, hint, scope, isolationScope);\n  }\n\n  /** Extract trace information from scope */\n  protected _getTraceInfoFromScope(\n    scope: Scope | undefined,\n  ): [dynamicSamplingContext: Partial<DynamicSamplingContext> | undefined, traceContext: TraceContext | undefined] {\n    if (!scope) {\n      return [undefined, undefined];\n    }\n\n    const span = _getSpanForScope(scope);\n\n    const traceContext = span ? spanToTraceContext(span) : getTraceContextFromScope(scope);\n    const dynamicSamplingContext = span\n      ? getDynamicSamplingContextFromSpan(span)\n      : getDynamicSamplingContextFromScope(this, scope);\n    return [dynamicSamplingContext, traceContext];\n  }\n}\n","import type { SerializedSession, Session, SessionContext, SessionStatus } from './types-hoist';\nimport { dropUndefinedKeys, timestampInSeconds, uuid4 } from './utils-hoist';\n\n/**\n * Creates a new `Session` object by setting certain default parameters. If optional @param context\n * is passed, the passed properties are applied to the session object.\n *\n * @param context (optional) additional properties to be applied to the returned session object\n *\n * @returns a new `Session` object\n */\nexport function makeSession(context?: Omit<SessionContext, 'started' | 'status'>): Session {\n  // Both timestamp and started are in seconds since the UNIX epoch.\n  const startingTime = timestampInSeconds();\n\n  const session: Session = {\n    sid: uuid4(),\n    init: true,\n    timestamp: startingTime,\n    started: startingTime,\n    duration: 0,\n    status: 'ok',\n    errors: 0,\n    ignoreDuration: false,\n    toJSON: () => sessionToJSON(session),\n  };\n\n  if (context) {\n    updateSession(session, context);\n  }\n\n  return session;\n}\n\n/**\n * Updates a session object with the properties passed in the context.\n *\n * Note that this function mutates the passed object and returns void.\n * (Had to do this instead of returning a new and updated session because closing and sending a session\n * makes an update to the session after it was passed to the sending logic.\n * @see BaseClient.captureSession )\n *\n * @param session the `Session` to update\n * @param context the `SessionContext` holding the properties that should be updated in @param session\n */\n// eslint-disable-next-line complexity\nexport function updateSession(session: Session, context: SessionContext = {}): void {\n  if (context.user) {\n    if (!session.ipAddress && context.user.ip_address) {\n      session.ipAddress = context.user.ip_address;\n    }\n\n    if (!session.did && !context.did) {\n      session.did = context.user.id || context.user.email || context.user.username;\n    }\n  }\n\n  session.timestamp = context.timestamp || timestampInSeconds();\n\n  if (context.abnormal_mechanism) {\n    session.abnormal_mechanism = context.abnormal_mechanism;\n  }\n\n  if (context.ignoreDuration) {\n    session.ignoreDuration = context.ignoreDuration;\n  }\n  if (context.sid) {\n    // Good enough uuid validation. — Kamil\n    session.sid = context.sid.length === 32 ? context.sid : uuid4();\n  }\n  if (context.init !== undefined) {\n    session.init = context.init;\n  }\n  if (!session.did && context.did) {\n    session.did = `${context.did}`;\n  }\n  if (typeof context.started === 'number') {\n    session.started = context.started;\n  }\n  if (session.ignoreDuration) {\n    session.duration = undefined;\n  } else if (typeof context.duration === 'number') {\n    session.duration = context.duration;\n  } else {\n    const duration = session.timestamp - session.started;\n    session.duration = duration >= 0 ? duration : 0;\n  }\n  if (context.release) {\n    session.release = context.release;\n  }\n  if (context.environment) {\n    session.environment = context.environment;\n  }\n  if (!session.ipAddress && context.ipAddress) {\n    session.ipAddress = context.ipAddress;\n  }\n  if (!session.userAgent && context.userAgent) {\n    session.userAgent = context.userAgent;\n  }\n  if (typeof context.errors === 'number') {\n    session.errors = context.errors;\n  }\n  if (context.status) {\n    session.status = context.status;\n  }\n}\n\n/**\n * Closes a session by setting its status and updating the session object with it.\n * Internally calls `updateSession` to update the passed session object.\n *\n * Note that this function mutates the passed session (@see updateSession for explanation).\n *\n * @param session the `Session` object to be closed\n * @param status the `SessionStatus` with which the session was closed. If you don't pass a status,\n *               this function will keep the previously set status, unless it was `'ok'` in which case\n *               it is changed to `'exited'`.\n */\nexport function closeSession(session: Session, status?: Exclude<SessionStatus, 'ok'>): void {\n  let context = {};\n  if (status) {\n    context = { status };\n  } else if (session.status === 'ok') {\n    context = { status: 'exited' };\n  }\n\n  updateSession(session, context);\n}\n\n/**\n * Serializes a passed session object to a JSON object with a slightly different structure.\n * This is necessary because the Sentry backend requires a slightly different schema of a session\n * than the one the JS SDKs use internally.\n *\n * @param session the session to be converted\n *\n * @returns a JSON object of the passed session\n */\nfunction sessionToJSON(session: Session): SerializedSession {\n  return dropUndefinedKeys({\n    sid: `${session.sid}`,\n    init: session.init,\n    // Make sure that sec is converted to ms for date constructor\n    started: new Date(session.started * 1000).toISOString(),\n    timestamp: new Date(session.timestamp * 1000).toISOString(),\n    status: session.status,\n    errors: session.errors,\n    did: typeof session.did === 'number' || typeof session.did === 'string' ? `${session.did}` : undefined,\n    duration: session.duration,\n    abnormal_mechanism: session.abnormal_mechanism,\n    attrs: {\n      release: session.release,\n      environment: session.environment,\n      ip_address: session.ipAddress,\n      user_agent: session.userAgent,\n    },\n  });\n}\n","import { getIsolationScope } from './currentScopes';\nimport type {\n  AggregationCounts,\n  Client,\n  RequestSessionStatus,\n  SessionAggregates,\n  SessionFlusherLike,\n} from './types-hoist';\nimport { dropUndefinedKeys } from './utils-hoist/object';\n\ntype ReleaseHealthAttributes = {\n  environment?: string;\n  release: string;\n};\n\n/**\n * @deprecated `SessionFlusher` is deprecated and will be removed in the next major version of the SDK.\n */\n// TODO(v9): The goal for the SessionFlusher is to become a stupidly simple mechanism to aggregate \"Sessions\" (actually \"RequestSessions\"). It should probably live directly inside the Http integration/instrumentation.\n// eslint-disable-next-line deprecation/deprecation\nexport class SessionFlusher implements SessionFlusherLike {\n  public readonly flushTimeout: number;\n  private _pendingAggregates: Map<number, AggregationCounts>;\n  private _sessionAttrs: ReleaseHealthAttributes;\n  // We adjust the type here to add the `unref()` part, as setInterval can technically return a number or a NodeJS.Timer\n  private readonly _intervalId: ReturnType<typeof setInterval> & { unref?: () => void };\n  private _isEnabled: boolean;\n  private _client: Client;\n\n  public constructor(client: Client, attrs: ReleaseHealthAttributes) {\n    this._client = client;\n    this.flushTimeout = 60;\n    this._pendingAggregates = new Map<number, AggregationCounts>();\n    this._isEnabled = true;\n\n    // Call to setInterval, so that flush is called every 60 seconds.\n    this._intervalId = setInterval(() => this.flush(), this.flushTimeout * 1000);\n    if (this._intervalId.unref) {\n      this._intervalId.unref();\n    }\n    this._sessionAttrs = attrs;\n  }\n\n  /** Checks if `pendingAggregates` has entries, and if it does flushes them by calling `sendSession` */\n  public flush(): void {\n    const sessionAggregates = this.getSessionAggregates();\n    if (sessionAggregates.aggregates.length === 0) {\n      return;\n    }\n    this._pendingAggregates = new Map<number, AggregationCounts>();\n    this._client.sendSession(sessionAggregates);\n  }\n\n  /** Massages the entries in `pendingAggregates` and returns aggregated sessions */\n  public getSessionAggregates(): SessionAggregates {\n    const aggregates: AggregationCounts[] = Array.from(this._pendingAggregates.values());\n\n    const sessionAggregates: SessionAggregates = {\n      attrs: this._sessionAttrs,\n      aggregates,\n    };\n    return dropUndefinedKeys(sessionAggregates);\n  }\n\n  /** JSDoc */\n  public close(): void {\n    clearInterval(this._intervalId);\n    this._isEnabled = false;\n    this.flush();\n  }\n\n  /**\n   * Wrapper function for _incrementSessionStatusCount that checks if the instance of SessionFlusher is enabled then\n   * fetches the session status of the request from `Scope.getRequestSession().status` on the scope and passes them to\n   * `_incrementSessionStatusCount` along with the start date\n   */\n  public incrementSessionStatusCount(): void {\n    if (!this._isEnabled) {\n      return;\n    }\n    const isolationScope = getIsolationScope();\n    // eslint-disable-next-line deprecation/deprecation\n    const requestSession = isolationScope.getRequestSession();\n\n    if (requestSession && requestSession.status) {\n      this._incrementSessionStatusCount(requestSession.status, new Date());\n      // This is not entirely necessarily but is added as a safe guard to indicate the bounds of a request and so in\n      // case captureRequestSession is called more than once to prevent double count\n      // eslint-disable-next-line deprecation/deprecation\n      isolationScope.setRequestSession(undefined);\n      /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n    }\n  }\n\n  /**\n   * Increments status bucket in pendingAggregates buffer (internal state) corresponding to status of\n   * the session received\n   */\n  // eslint-disable-next-line deprecation/deprecation\n  private _incrementSessionStatusCount(status: RequestSessionStatus, date: Date): number {\n    // Truncate minutes and seconds on Session Started attribute to have one minute bucket keys\n    const sessionStartedTrunc = new Date(date).setSeconds(0, 0);\n\n    // corresponds to aggregated sessions in one specific minute bucket\n    // for example, {\"started\":\"2021-03-16T08:00:00.000Z\",\"exited\":4, \"errored\": 1}\n    let aggregationCounts = this._pendingAggregates.get(sessionStartedTrunc);\n    if (!aggregationCounts) {\n      aggregationCounts = { started: new Date(sessionStartedTrunc).toISOString() };\n      this._pendingAggregates.set(sessionStartedTrunc, aggregationCounts);\n    }\n\n    switch (status) {\n      case 'errored':\n        aggregationCounts.errored = (aggregationCounts.errored || 0) + 1;\n        return aggregationCounts.errored;\n      case 'ok':\n        aggregationCounts.exited = (aggregationCounts.exited || 0) + 1;\n        return aggregationCounts.exited;\n      default:\n        aggregationCounts.crashed = (aggregationCounts.crashed || 0) + 1;\n        return aggregationCounts.crashed;\n    }\n  }\n}\n","import type { Client, DynamicSamplingContext, Scope, Span } from '../types-hoist';\n\nimport { DEFAULT_ENVIRONMENT } from '../constants';\nimport { getClient } from '../currentScopes';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '../semanticAttributes';\nimport {\n  baggageHeaderToDynamicSamplingContext,\n  dynamicSamplingContextToSentryBaggageHeader,\n} from '../utils-hoist/baggage';\nimport { addNonEnumerableProperty, dropUndefinedKeys } from '../utils-hoist/object';\nimport { hasTracingEnabled } from '../utils/hasTracingEnabled';\nimport { getRootSpan, spanIsSampled, spanToJSON } from '../utils/spanUtils';\n\n/**\n * If you change this value, also update the terser plugin config to\n * avoid minification of the object property!\n */\nconst FROZEN_DSC_FIELD = '_frozenDsc';\n\ntype SpanWithMaybeDsc = Span & {\n  [FROZEN_DSC_FIELD]?: Partial<DynamicSamplingContext> | undefined;\n};\n\n/**\n * Freeze the given DSC on the given span.\n */\nexport function freezeDscOnSpan(span: Span, dsc: Partial<DynamicSamplingContext>): void {\n  const spanWithMaybeDsc = span as SpanWithMaybeDsc;\n  addNonEnumerableProperty(spanWithMaybeDsc, FROZEN_DSC_FIELD, dsc);\n}\n\n/**\n * Creates a dynamic sampling context from a client.\n *\n * Dispatches the `createDsc` lifecycle hook as a side effect.\n */\nexport function getDynamicSamplingContextFromClient(trace_id: string, client: Client): DynamicSamplingContext {\n  const options = client.getOptions();\n\n  const { publicKey: public_key } = client.getDsn() || {};\n\n  const dsc = dropUndefinedKeys({\n    environment: options.environment || DEFAULT_ENVIRONMENT,\n    release: options.release,\n    public_key,\n    trace_id,\n  }) as DynamicSamplingContext;\n\n  client.emit('createDsc', dsc);\n\n  return dsc;\n}\n\n/**\n * Get the dynamic sampling context for the currently active scopes.\n */\nexport function getDynamicSamplingContextFromScope(client: Client, scope: Scope): Partial<DynamicSamplingContext> {\n  const propagationContext = scope.getPropagationContext();\n  return propagationContext.dsc || getDynamicSamplingContextFromClient(propagationContext.traceId, client);\n}\n\n/**\n * Creates a dynamic sampling context from a span (and client and scope)\n *\n * @param span the span from which a few values like the root span name and sample rate are extracted.\n *\n * @returns a dynamic sampling context\n */\nexport function getDynamicSamplingContextFromSpan(span: Span): Readonly<Partial<DynamicSamplingContext>> {\n  const client = getClient();\n  if (!client) {\n    return {};\n  }\n\n  const rootSpan = getRootSpan(span);\n\n  // For core implementation, we freeze the DSC onto the span as a non-enumerable property\n  const frozenDsc = (rootSpan as SpanWithMaybeDsc)[FROZEN_DSC_FIELD];\n  if (frozenDsc) {\n    return frozenDsc;\n  }\n\n  // For OpenTelemetry, we freeze the DSC on the trace state\n  const traceState = rootSpan.spanContext().traceState;\n  const traceStateDsc = traceState && traceState.get('sentry.dsc');\n\n  // If the span has a DSC, we want it to take precedence\n  const dscOnTraceState = traceStateDsc && baggageHeaderToDynamicSamplingContext(traceStateDsc);\n\n  if (dscOnTraceState) {\n    return dscOnTraceState;\n  }\n\n  // Else, we generate it from the span\n  const dsc = getDynamicSamplingContextFromClient(span.spanContext().traceId, client);\n  const jsonSpan = spanToJSON(rootSpan);\n  const attributes = jsonSpan.data || {};\n  const maybeSampleRate = attributes[SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE];\n\n  if (maybeSampleRate != null) {\n    dsc.sample_rate = `${maybeSampleRate}`;\n  }\n\n  // We don't want to have a transaction name in the DSC if the source is \"url\" because URLs might contain PII\n  const source = attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n\n  // after JSON conversion, txn.name becomes jsonSpan.description\n  const name = jsonSpan.description;\n  if (source !== 'url' && name) {\n    dsc.transaction = name;\n  }\n\n  // How can we even land here with hasTracingEnabled() returning false?\n  // Otel creates a Non-recording span in Tracing Without Performance mode when handling incoming requests\n  // So we end up with an active span that is not sampled (neither positively nor negatively)\n  if (hasTracingEnabled()) {\n    dsc.sampled = String(spanIsSampled(rootSpan));\n  }\n\n  client.emit('createDsc', dsc, rootSpan);\n\n  return dsc;\n}\n\n/**\n * Convert a Span to a baggage header.\n */\nexport function spanToBaggageHeader(span: Span): string | undefined {\n  const dsc = getDynamicSamplingContextFromSpan(span);\n  return dynamicSamplingContextToSentryBaggageHeader(dsc);\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport { addGlobalErrorInstrumentationHandler } from '../utils-hoist/instrument/globalError';\nimport { addGlobalUnhandledRejectionInstrumentationHandler } from '../utils-hoist/instrument/globalUnhandledRejection';\nimport { logger } from '../utils-hoist/logger';\nimport { getActiveSpan, getRootSpan } from '../utils/spanUtils';\nimport { SPAN_STATUS_ERROR } from './spanstatus';\n\nlet errorsInstrumented = false;\n\n/**  Only exposed for testing */\nexport function _resetErrorsInstrumented(): void {\n  errorsInstrumented = false;\n}\n\n/**\n * Ensure that global errors automatically set the active span status.\n */\nexport function registerSpanErrorInstrumentation(): void {\n  if (errorsInstrumented) {\n    return;\n  }\n\n  errorsInstrumented = true;\n  addGlobalErrorInstrumentationHandler(errorCallback);\n  addGlobalUnhandledRejectionInstrumentationHandler(errorCallback);\n}\n\n/**\n * If an error or unhandled promise occurs, we mark the active root span as failed\n */\nfunction errorCallback(): void {\n  const activeSpan = getActiveSpan();\n  const rootSpan = activeSpan && getRootSpan(activeSpan);\n  if (rootSpan) {\n    const message = 'internal_error';\n    DEBUG_BUILD && logger.log(`[Tracing] Root span: ${message} -> Global error occurred`);\n    rootSpan.setStatus({ code: SPAN_STATUS_ERROR, message });\n  }\n}\n\n// The function name will be lost when bundling but we need to be able to identify this listener later to maintain the\n// node.js default exit behaviour\nerrorCallback.tag = 'sentry_tracingErrorCallback';\n","import { registerSpanErrorInstrumentation } from './errors';\n\n/**\n * @deprecated Use `registerSpanErrorInstrumentation()` instead. In v9, this function will be removed. Note that you don't need to call this in Node-based SDKs or when using `browserTracingIntegration`.\n */\nexport function addTracingExtensions(): void {\n  registerSpanErrorInstrumentation();\n}\n","import { getClient, getCurrentScope } from '../currentScopes';\nimport type { Span, SpanAttributes, StartSpanOptions } from '../types-hoist';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON } from '../semanticAttributes';\nimport { logger } from '../utils-hoist/logger';\nimport { timestampInSeconds } from '../utils-hoist/time';\nimport { hasTracingEnabled } from '../utils/hasTracingEnabled';\nimport { _setSpanForScope } from '../utils/spanOnScope';\nimport {\n  getActiveSpan,\n  getSpanDescendants,\n  removeChildSpanFromSpan,\n  spanTimeInputToSeconds,\n  spanToJSON,\n} from '../utils/spanUtils';\nimport { SentryNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { SPAN_STATUS_ERROR } from './spanstatus';\nimport { startInactiveSpan } from './trace';\n\nexport const TRACING_DEFAULTS = {\n  idleTimeout: 1_000,\n  finalTimeout: 30_000,\n  childSpanTimeout: 15_000,\n};\n\nconst FINISH_REASON_HEARTBEAT_FAILED = 'heartbeatFailed';\nconst FINISH_REASON_IDLE_TIMEOUT = 'idleTimeout';\nconst FINISH_REASON_FINAL_TIMEOUT = 'finalTimeout';\nconst FINISH_REASON_EXTERNAL_FINISH = 'externalFinish';\nconst FINISH_REASON_CANCELLED = 'cancelled';\n\n// unused\nconst FINISH_REASON_DOCUMENT_HIDDEN = 'documentHidden';\n\n// unused in this file, but used in BrowserTracing\nconst FINISH_REASON_INTERRUPTED = 'interactionInterrupted';\n\ntype IdleSpanFinishReason =\n  | typeof FINISH_REASON_CANCELLED\n  | typeof FINISH_REASON_DOCUMENT_HIDDEN\n  | typeof FINISH_REASON_EXTERNAL_FINISH\n  | typeof FINISH_REASON_FINAL_TIMEOUT\n  | typeof FINISH_REASON_HEARTBEAT_FAILED\n  | typeof FINISH_REASON_IDLE_TIMEOUT\n  | typeof FINISH_REASON_INTERRUPTED;\n\ninterface IdleSpanOptions {\n  /**\n   * The time that has to pass without any span being created.\n   * If this time is exceeded, the idle span will finish.\n   */\n  idleTimeout: number;\n  /**\n   * The max. time an idle span may run.\n   * If this time is exceeded, the idle span will finish no matter what.\n   */\n  finalTimeout: number;\n  /**\n   * The max. time a child span may run.\n   * If the time since the last span was started exceeds this time, the idle span will finish.\n   */\n  childSpanTimeout?: number;\n  /**\n   * When set to `true`, will disable the idle timeout and child timeout\n   * until the `idleSpanEnableAutoFinish` hook is emitted for the idle span.\n   * The final timeout mechanism will not be affected by this option,\n   * meaning the idle span will definitely be finished when the final timeout is\n   * reached, no matter what this option is configured to.\n   *\n   * Defaults to `false`.\n   */\n  disableAutoFinish?: boolean;\n  /** Allows to configure a hook that is called when the idle span is ended, before it is processed. */\n  beforeSpanEnd?: (span: Span) => void;\n}\n\n/**\n * An idle span is a span that automatically finishes. It does this by tracking child spans as activities.\n * An idle span is always the active span.\n */\nexport function startIdleSpan(startSpanOptions: StartSpanOptions, options: Partial<IdleSpanOptions> = {}): Span {\n  // Activities store a list of active spans\n  const activities = new Map<string, boolean>();\n\n  // We should not use heartbeat if we finished a span\n  let _finished = false;\n\n  // Timer that tracks idleTimeout\n  let _idleTimeoutID: ReturnType<typeof setTimeout> | undefined;\n\n  // Timer that tracks maxSpanTime for child spans\n  let _childSpanTimeoutID: ReturnType<typeof setTimeout> | undefined;\n\n  // The reason why the span was finished\n  let _finishReason: IdleSpanFinishReason = FINISH_REASON_EXTERNAL_FINISH;\n\n  let _autoFinishAllowed: boolean = !options.disableAutoFinish;\n\n  const _cleanupHooks: (() => void)[] = [];\n\n  const {\n    idleTimeout = TRACING_DEFAULTS.idleTimeout,\n    finalTimeout = TRACING_DEFAULTS.finalTimeout,\n    childSpanTimeout = TRACING_DEFAULTS.childSpanTimeout,\n    beforeSpanEnd,\n  } = options;\n\n  const client = getClient();\n\n  if (!client || !hasTracingEnabled()) {\n    return new SentryNonRecordingSpan();\n  }\n\n  const scope = getCurrentScope();\n  const previousActiveSpan = getActiveSpan();\n  const span = _startIdleSpan(startSpanOptions);\n\n  // We patch span.end to ensure we can run some things before the span is ended\n  // eslint-disable-next-line @typescript-eslint/unbound-method\n  span.end = new Proxy(span.end, {\n    apply(target, thisArg, args: Parameters<Span['end']>) {\n      if (beforeSpanEnd) {\n        beforeSpanEnd(span);\n      }\n\n      // Just ensuring that this keeps working, even if we ever have more arguments here\n      const [definedEndTimestamp, ...rest] = args;\n      const timestamp = definedEndTimestamp || timestampInSeconds();\n      const spanEndTimestamp = spanTimeInputToSeconds(timestamp);\n\n      // Ensure we end with the last span timestamp, if possible\n      const spans = getSpanDescendants(span).filter(child => child !== span);\n\n      // If we have no spans, we just end, nothing else to do here\n      if (!spans.length) {\n        onIdleSpanEnded(spanEndTimestamp);\n        return Reflect.apply(target, thisArg, [spanEndTimestamp, ...rest]);\n      }\n\n      const childEndTimestamps = spans\n        .map(span => spanToJSON(span).timestamp)\n        .filter(timestamp => !!timestamp) as number[];\n      const latestSpanEndTimestamp = childEndTimestamps.length ? Math.max(...childEndTimestamps) : undefined;\n\n      // In reality this should always exist here, but type-wise it may be undefined...\n      const spanStartTimestamp = spanToJSON(span).start_timestamp;\n\n      // The final endTimestamp should:\n      // * Never be before the span start timestamp\n      // * Be the latestSpanEndTimestamp, if there is one, and it is smaller than the passed span end timestamp\n      // * Otherwise be the passed end timestamp\n      // Final timestamp can never be after finalTimeout\n      const endTimestamp = Math.min(\n        spanStartTimestamp ? spanStartTimestamp + finalTimeout / 1000 : Infinity,\n        Math.max(spanStartTimestamp || -Infinity, Math.min(spanEndTimestamp, latestSpanEndTimestamp || Infinity)),\n      );\n\n      onIdleSpanEnded(endTimestamp);\n      return Reflect.apply(target, thisArg, [endTimestamp, ...rest]);\n    },\n  });\n\n  /**\n   * Cancels the existing idle timeout, if there is one.\n   */\n  function _cancelIdleTimeout(): void {\n    if (_idleTimeoutID) {\n      clearTimeout(_idleTimeoutID);\n      _idleTimeoutID = undefined;\n    }\n  }\n\n  /**\n   * Cancels the existing child span timeout, if there is one.\n   */\n  function _cancelChildSpanTimeout(): void {\n    if (_childSpanTimeoutID) {\n      clearTimeout(_childSpanTimeoutID);\n      _childSpanTimeoutID = undefined;\n    }\n  }\n\n  /**\n   * Restarts idle timeout, if there is no running idle timeout it will start one.\n   */\n  function _restartIdleTimeout(endTimestamp?: number): void {\n    _cancelIdleTimeout();\n    _idleTimeoutID = setTimeout(() => {\n      if (!_finished && activities.size === 0 && _autoFinishAllowed) {\n        _finishReason = FINISH_REASON_IDLE_TIMEOUT;\n        span.end(endTimestamp);\n      }\n    }, idleTimeout);\n  }\n\n  /**\n   * Restarts child span timeout, if there is none running it will start one.\n   */\n  function _restartChildSpanTimeout(endTimestamp?: number): void {\n    _cancelChildSpanTimeout();\n    _idleTimeoutID = setTimeout(() => {\n      if (!_finished && _autoFinishAllowed) {\n        _finishReason = FINISH_REASON_HEARTBEAT_FAILED;\n        span.end(endTimestamp);\n      }\n    }, childSpanTimeout);\n  }\n\n  /**\n   * Start tracking a specific activity.\n   * @param spanId The span id that represents the activity\n   */\n  function _pushActivity(spanId: string): void {\n    _cancelIdleTimeout();\n    activities.set(spanId, true);\n\n    const endTimestamp = timestampInSeconds();\n    // We need to add the timeout here to have the real endtimestamp of the idle span\n    // Remember timestampInSeconds is in seconds, timeout is in ms\n    _restartChildSpanTimeout(endTimestamp + childSpanTimeout / 1000);\n  }\n\n  /**\n   * Remove an activity from usage\n   * @param spanId The span id that represents the activity\n   */\n  function _popActivity(spanId: string): void {\n    if (activities.has(spanId)) {\n      activities.delete(spanId);\n    }\n\n    if (activities.size === 0) {\n      const endTimestamp = timestampInSeconds();\n      // We need to add the timeout here to have the real endtimestamp of the idle span\n      // Remember timestampInSeconds is in seconds, timeout is in ms\n      _restartIdleTimeout(endTimestamp + idleTimeout / 1000);\n      _cancelChildSpanTimeout();\n    }\n  }\n\n  function onIdleSpanEnded(endTimestamp: number): void {\n    _finished = true;\n    activities.clear();\n\n    _cleanupHooks.forEach(cleanup => cleanup());\n\n    _setSpanForScope(scope, previousActiveSpan);\n\n    const spanJSON = spanToJSON(span);\n\n    const { start_timestamp: startTimestamp } = spanJSON;\n    // This should never happen, but to make TS happy...\n    if (!startTimestamp) {\n      return;\n    }\n\n    const attributes: SpanAttributes = spanJSON.data || {};\n    if (!attributes[SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON]) {\n      span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, _finishReason);\n    }\n\n    logger.log(`[Tracing] Idle span \"${spanJSON.op}\" finished`);\n\n    const childSpans = getSpanDescendants(span).filter(child => child !== span);\n\n    let discardedSpans = 0;\n    childSpans.forEach(childSpan => {\n      // We cancel all pending spans with status \"cancelled\" to indicate the idle span was finished early\n      if (childSpan.isRecording()) {\n        childSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'cancelled' });\n        childSpan.end(endTimestamp);\n        DEBUG_BUILD &&\n          logger.log('[Tracing] Cancelling span since span ended early', JSON.stringify(childSpan, undefined, 2));\n      }\n\n      const childSpanJSON = spanToJSON(childSpan);\n      const { timestamp: childEndTimestamp = 0, start_timestamp: childStartTimestamp = 0 } = childSpanJSON;\n\n      const spanStartedBeforeIdleSpanEnd = childStartTimestamp <= endTimestamp;\n\n      // Add a delta with idle timeout so that we prevent false positives\n      const timeoutWithMarginOfError = (finalTimeout + idleTimeout) / 1000;\n      const spanEndedBeforeFinalTimeout = childEndTimestamp - childStartTimestamp <= timeoutWithMarginOfError;\n\n      if (DEBUG_BUILD) {\n        const stringifiedSpan = JSON.stringify(childSpan, undefined, 2);\n        if (!spanStartedBeforeIdleSpanEnd) {\n          logger.log('[Tracing] Discarding span since it happened after idle span was finished', stringifiedSpan);\n        } else if (!spanEndedBeforeFinalTimeout) {\n          logger.log('[Tracing] Discarding span since it finished after idle span final timeout', stringifiedSpan);\n        }\n      }\n\n      if (!spanEndedBeforeFinalTimeout || !spanStartedBeforeIdleSpanEnd) {\n        removeChildSpanFromSpan(span, childSpan);\n        discardedSpans++;\n      }\n    });\n\n    if (discardedSpans > 0) {\n      span.setAttribute('sentry.idle_span_discarded_spans', discardedSpans);\n    }\n  }\n\n  _cleanupHooks.push(\n    client.on('spanStart', startedSpan => {\n      // If we already finished the idle span,\n      // or if this is the idle span itself being started,\n      // or if the started span has already been closed,\n      // we don't care about it for activity\n      if (_finished || startedSpan === span || !!spanToJSON(startedSpan).timestamp) {\n        return;\n      }\n\n      const allSpans = getSpanDescendants(span);\n\n      // If the span that was just started is a child of the idle span, we should track it\n      if (allSpans.includes(startedSpan)) {\n        _pushActivity(startedSpan.spanContext().spanId);\n      }\n    }),\n  );\n\n  _cleanupHooks.push(\n    client.on('spanEnd', endedSpan => {\n      if (_finished) {\n        return;\n      }\n\n      _popActivity(endedSpan.spanContext().spanId);\n    }),\n  );\n\n  _cleanupHooks.push(\n    client.on('idleSpanEnableAutoFinish', spanToAllowAutoFinish => {\n      if (spanToAllowAutoFinish === span) {\n        _autoFinishAllowed = true;\n        _restartIdleTimeout();\n\n        if (activities.size) {\n          _restartChildSpanTimeout();\n        }\n      }\n    }),\n  );\n\n  // We only start the initial idle timeout if we are not delaying the auto finish\n  if (!options.disableAutoFinish) {\n    _restartIdleTimeout();\n  }\n\n  setTimeout(() => {\n    if (!_finished) {\n      span.setStatus({ code: SPAN_STATUS_ERROR, message: 'deadline_exceeded' });\n      _finishReason = FINISH_REASON_FINAL_TIMEOUT;\n      span.end();\n    }\n  }, finalTimeout);\n\n  return span;\n}\n\nfunction _startIdleSpan(options: StartSpanOptions): Span {\n  const span = startInactiveSpan(options);\n\n  _setSpanForScope(getCurrentScope(), span);\n\n  DEBUG_BUILD && logger.log('[Tracing] Started span is an idle span');\n\n  return span;\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport type { Span } from '../types-hoist';\nimport { logger } from '../utils-hoist/logger';\nimport { getRootSpan, spanIsSampled, spanToJSON } from '../utils/spanUtils';\n\n/**\n * Print a log message for a started span.\n */\nexport function logSpanStart(span: Span): void {\n  if (!DEBUG_BUILD) return;\n\n  const { description = '< unknown name >', op = '< unknown op >', parent_span_id: parentSpanId } = spanToJSON(span);\n  const { spanId } = span.spanContext();\n\n  const sampled = spanIsSampled(span);\n  const rootSpan = getRootSpan(span);\n  const isRootSpan = rootSpan === span;\n\n  const header = `[Tracing] Starting ${sampled ? 'sampled' : 'unsampled'} ${isRootSpan ? 'root ' : ''}span`;\n\n  const infoParts: string[] = [`op: ${op}`, `name: ${description}`, `ID: ${spanId}`];\n\n  if (parentSpanId) {\n    infoParts.push(`parent ID: ${parentSpanId}`);\n  }\n\n  if (!isRootSpan) {\n    const { op, description } = spanToJSON(rootSpan);\n    infoParts.push(`root ID: ${rootSpan.spanContext().spanId}`);\n    if (op) {\n      infoParts.push(`root op: ${op}`);\n    }\n    if (description) {\n      infoParts.push(`root description: ${description}`);\n    }\n  }\n\n  logger.log(`${header}\n  ${infoParts.join('\\n  ')}`);\n}\n\n/**\n * Print a log message for an ended span.\n */\nexport function logSpanEnd(span: Span): void {\n  if (!DEBUG_BUILD) return;\n\n  const { description = '< unknown name >', op = '< unknown op >' } = spanToJSON(span);\n  const { spanId } = span.spanContext();\n  const rootSpan = getRootSpan(span);\n  const isRootSpan = rootSpan === span;\n\n  const msg = `[Tracing] Finishing \"${op}\" ${isRootSpan ? 'root ' : ''}span \"${description}\" with ID ${spanId}`;\n  logger.log(msg);\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport {\n  SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT,\n  SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE,\n} from '../semanticAttributes';\nimport type { MeasurementUnit, Measurements, TimedEvent } from '../types-hoist';\nimport { logger } from '../utils-hoist/logger';\nimport { getActiveSpan, getRootSpan } from '../utils/spanUtils';\n\n/**\n * Adds a measurement to the active transaction on the current global scope. You can optionally pass in a different span\n * as the 4th parameter.\n */\nexport function setMeasurement(name: string, value: number, unit: MeasurementUnit, activeSpan = getActiveSpan()): void {\n  const rootSpan = activeSpan && getRootSpan(activeSpan);\n\n  if (rootSpan) {\n    DEBUG_BUILD && logger.log(`[Measurement] Setting measurement on root span: ${name} = ${value} ${unit}`);\n    rootSpan.addEvent(name, {\n      [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE]: value,\n      [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT]: unit as string,\n    });\n  }\n}\n\n/**\n * Convert timed events to measurements.\n */\nexport function timedEventsToMeasurements(events: TimedEvent[]): Measurements | undefined {\n  if (!events || events.length === 0) {\n    return undefined;\n  }\n\n  const measurements: Measurements = {};\n  events.forEach(event => {\n    const attributes = event.attributes || {};\n    const unit = attributes[SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT] as MeasurementUnit | undefined;\n    const value = attributes[SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE] as number | undefined;\n\n    if (typeof unit === 'string' && typeof value === 'number') {\n      measurements[event.name] = { value, unit };\n    }\n  });\n\n  return measurements;\n}\n","import type { Options, RequestEventData, SamplingContext } from '../types-hoist';\n\nimport { getIsolationScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { logger } from '../utils-hoist/logger';\nimport { hasTracingEnabled } from '../utils/hasTracingEnabled';\nimport { parseSampleRate } from '../utils/parseSampleRate';\n\n/**\n * Makes a sampling decision for the given options.\n *\n * Called every time a root span is created. Only root spans which emerge with a `sampled` value of `true` will be\n * sent to Sentry.\n */\nexport function sampleSpan(\n  options: Pick<Options, 'tracesSampleRate' | 'tracesSampler' | 'enableTracing'>,\n  samplingContext: SamplingContext,\n): [sampled: boolean, sampleRate?: number] {\n  // nothing to do if tracing is not enabled\n  if (!hasTracingEnabled(options)) {\n    return [false];\n  }\n\n  // Casting this from unknown, as the type of `sdkProcessingMetadata` is only changed in v9 and `normalizedRequest` is set in SentryHttpInstrumentation\n  const normalizedRequest = getIsolationScope().getScopeData().sdkProcessingMetadata\n    .normalizedRequest as RequestEventData;\n\n  const enhancedSamplingContext = {\n    ...samplingContext,\n    normalizedRequest: samplingContext.normalizedRequest || normalizedRequest,\n  };\n\n  // we would have bailed already if neither `tracesSampler` nor `tracesSampleRate` nor `enableTracing` were defined, so one of these should\n  // work; prefer the hook if so\n  let sampleRate;\n  if (typeof options.tracesSampler === 'function') {\n    sampleRate = options.tracesSampler(enhancedSamplingContext);\n  } else if (enhancedSamplingContext.parentSampled !== undefined) {\n    sampleRate = enhancedSamplingContext.parentSampled;\n  } else if (typeof options.tracesSampleRate !== 'undefined') {\n    sampleRate = options.tracesSampleRate;\n  } else {\n    // When `enableTracing === true`, we use a sample rate of 100%\n    sampleRate = 1;\n  }\n\n  // Since this is coming from the user (or from a function provided by the user), who knows what we might get.\n  // (The only valid values are booleans or numbers between 0 and 1.)\n  const parsedSampleRate = parseSampleRate(sampleRate);\n\n  if (parsedSampleRate === undefined) {\n    DEBUG_BUILD && logger.warn('[Tracing] Discarding transaction because of invalid sample rate.');\n    return [false];\n  }\n\n  // if the function returned 0 (or false), or if `tracesSampleRate` is 0, it's a sign the transaction should be dropped\n  if (!parsedSampleRate) {\n    DEBUG_BUILD &&\n      logger.log(\n        `[Tracing] Discarding transaction because ${\n          typeof options.tracesSampler === 'function'\n            ? 'tracesSampler returned 0 or false'\n            : 'a negative sampling decision was inherited or tracesSampleRate is set to 0'\n        }`,\n      );\n    return [false, parsedSampleRate];\n  }\n\n  // Now we roll the dice. Math.random is inclusive of 0, but not of 1, so strict < is safe here. In case sampleRate is\n  // a boolean, the < comparison will cause it to be automatically cast to 1 if it's true and 0 if it's false.\n  const shouldSample = Math.random() < parsedSampleRate;\n\n  // if we're not going to keep it, we're done\n  if (!shouldSample) {\n    DEBUG_BUILD &&\n      logger.log(\n        `[Tracing] Discarding transaction because it's not included in the random sample (sampling rate = ${Number(\n          sampleRate,\n        )})`,\n      );\n    return [false, parsedSampleRate];\n  }\n\n  return [true, parsedSampleRate];\n}\n","import type {\n  SentrySpanArguments,\n  Span,\n  SpanAttributeValue,\n  SpanAttributes,\n  SpanContextData,\n  SpanStatus,\n  SpanTimeInput,\n} from '../types-hoist';\nimport { generateSpanId, generateTraceId } from '../utils-hoist/propagationContext';\nimport { TRACE_FLAG_NONE } from '../utils/spanUtils';\n\n/**\n * A Sentry Span that is non-recording, meaning it will not be sent to Sentry.\n */\nexport class SentryNonRecordingSpan implements Span {\n  private _traceId: string;\n  private _spanId: string;\n\n  public constructor(spanContext: SentrySpanArguments = {}) {\n    this._traceId = spanContext.traceId || generateTraceId();\n    this._spanId = spanContext.spanId || generateSpanId();\n  }\n\n  /** @inheritdoc */\n  public spanContext(): SpanContextData {\n    return {\n      spanId: this._spanId,\n      traceId: this._traceId,\n      traceFlags: TRACE_FLAG_NONE,\n    };\n  }\n\n  /** @inheritdoc */\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  public end(_timestamp?: SpanTimeInput): void {}\n\n  /** @inheritdoc */\n  public setAttribute(_key: string, _value: SpanAttributeValue | undefined): this {\n    return this;\n  }\n\n  /** @inheritdoc */\n  public setAttributes(_values: SpanAttributes): this {\n    return this;\n  }\n\n  /** @inheritdoc */\n  public setStatus(_status: SpanStatus): this {\n    return this;\n  }\n\n  /** @inheritdoc */\n  public updateName(_name: string): this {\n    return this;\n  }\n\n  /** @inheritdoc */\n  public isRecording(): boolean {\n    return false;\n  }\n\n  /** @inheritdoc */\n  public addEvent(\n    _name: string,\n    _attributesOrStartTime?: SpanAttributes | SpanTimeInput,\n    _startTime?: SpanTimeInput,\n  ): this {\n    return this;\n  }\n\n  /**\n   * This should generally not be used,\n   * but we need it for being compliant with the OTEL Span interface.\n   *\n   * @hidden\n   * @internal\n   */\n  public addLink(_link: unknown): this {\n    return this;\n  }\n\n  /**\n   * This should generally not be used,\n   * but we need it for being compliant with the OTEL Span interface.\n   *\n   * @hidden\n   * @internal\n   */\n  public addLinks(_links: unknown[]): this {\n    return this;\n  }\n\n  /**\n   * This should generally not be used,\n   * but we need it for being compliant with the OTEL Span interface.\n   *\n   * @hidden\n   * @internal\n   */\n  public recordException(_exception: unknown, _time?: number | undefined): void {\n    // noop\n  }\n}\n","import { getClient, getCurrentScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { createSpanEnvelope } from '../envelope';\nimport { getMetricSummaryJsonForSpan } from '../metrics/metric-summary';\nimport {\n  SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME,\n  SEMANTIC_ATTRIBUTE_PROFILE_ID,\n  SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n  SEMANTIC_ATTRIBUTE_SENTRY_OP,\n  SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n  SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type {\n  SentrySpanArguments,\n  Span,\n  SpanAttributeValue,\n  SpanAttributes,\n  SpanContextData,\n  SpanEnvelope,\n  SpanJSON,\n  SpanOrigin,\n  SpanStatus,\n  SpanTimeInput,\n  TimedEvent,\n  TransactionEvent,\n  TransactionSource,\n} from '../types-hoist';\nimport { logger } from '../utils-hoist/logger';\nimport { dropUndefinedKeys } from '../utils-hoist/object';\nimport { generateSpanId, generateTraceId } from '../utils-hoist/propagationContext';\nimport { timestampInSeconds } from '../utils-hoist/time';\nimport {\n  TRACE_FLAG_NONE,\n  TRACE_FLAG_SAMPLED,\n  getRootSpan,\n  getSpanDescendants,\n  getStatusMessage,\n  spanTimeInputToSeconds,\n  spanToJSON,\n  spanToTransactionTraceContext,\n} from '../utils/spanUtils';\nimport { getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { logSpanEnd } from './logSpans';\nimport { timedEventsToMeasurements } from './measurement';\nimport { getCapturedScopesOnSpan } from './utils';\n\nconst MAX_SPAN_COUNT = 1000;\n\n/**\n * Span contains all data about a span\n */\nexport class SentrySpan implements Span {\n  protected _traceId: string;\n  protected _spanId: string;\n  protected _parentSpanId?: string | undefined;\n  protected _sampled: boolean | undefined;\n  protected _name?: string | undefined;\n  protected _attributes: SpanAttributes;\n  /** Epoch timestamp in seconds when the span started. */\n  protected _startTime: number;\n  /** Epoch timestamp in seconds when the span ended. */\n  protected _endTime?: number | undefined;\n  /** Internal keeper of the status */\n  protected _status?: SpanStatus;\n  /** The timed events added to this span. */\n  protected _events: TimedEvent[];\n\n  /** if true, treat span as a standalone span (not part of a transaction) */\n  private _isStandaloneSpan?: boolean;\n\n  /**\n   * You should never call the constructor manually, always use `Sentry.startSpan()`\n   * or other span methods.\n   * @internal\n   * @hideconstructor\n   * @hidden\n   */\n  public constructor(spanContext: SentrySpanArguments = {}) {\n    this._traceId = spanContext.traceId || generateTraceId();\n    this._spanId = spanContext.spanId || generateSpanId();\n    this._startTime = spanContext.startTimestamp || timestampInSeconds();\n\n    this._attributes = {};\n    this.setAttributes({\n      [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'manual',\n      [SEMANTIC_ATTRIBUTE_SENTRY_OP]: spanContext.op,\n      ...spanContext.attributes,\n    });\n\n    this._name = spanContext.name;\n\n    if (spanContext.parentSpanId) {\n      this._parentSpanId = spanContext.parentSpanId;\n    }\n    // We want to include booleans as well here\n    if ('sampled' in spanContext) {\n      this._sampled = spanContext.sampled;\n    }\n    if (spanContext.endTimestamp) {\n      this._endTime = spanContext.endTimestamp;\n    }\n\n    this._events = [];\n\n    this._isStandaloneSpan = spanContext.isStandalone;\n\n    // If the span is already ended, ensure we finalize the span immediately\n    if (this._endTime) {\n      this._onSpanEnded();\n    }\n  }\n\n  /**\n   * This should generally not be used,\n   * but it is needed for being compliant with the OTEL Span interface.\n   *\n   * @hidden\n   * @internal\n   */\n  public addLink(_link: unknown): this {\n    return this;\n  }\n\n  /**\n   * This should generally not be used,\n   * but it is needed for being compliant with the OTEL Span interface.\n   *\n   * @hidden\n   * @internal\n   */\n  public addLinks(_links: unknown[]): this {\n    return this;\n  }\n\n  /**\n   * This should generally not be used,\n   * but it is needed for being compliant with the OTEL Span interface.\n   *\n   * @hidden\n   * @internal\n   */\n  public recordException(_exception: unknown, _time?: number | undefined): void {\n    // noop\n  }\n\n  /** @inheritdoc */\n  public spanContext(): SpanContextData {\n    const { _spanId: spanId, _traceId: traceId, _sampled: sampled } = this;\n    return {\n      spanId,\n      traceId,\n      traceFlags: sampled ? TRACE_FLAG_SAMPLED : TRACE_FLAG_NONE,\n    };\n  }\n\n  /** @inheritdoc */\n  public setAttribute(key: string, value: SpanAttributeValue | undefined): this {\n    if (value === undefined) {\n      // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n      delete this._attributes[key];\n    } else {\n      this._attributes[key] = value;\n    }\n\n    return this;\n  }\n\n  /** @inheritdoc */\n  public setAttributes(attributes: SpanAttributes): this {\n    Object.keys(attributes).forEach(key => this.setAttribute(key, attributes[key]));\n    return this;\n  }\n\n  /**\n   * This should generally not be used,\n   * but we need it for browser tracing where we want to adjust the start time afterwards.\n   * USE THIS WITH CAUTION!\n   *\n   * @hidden\n   * @internal\n   */\n  public updateStartTime(timeInput: SpanTimeInput): void {\n    this._startTime = spanTimeInputToSeconds(timeInput);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setStatus(value: SpanStatus): this {\n    this._status = value;\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public updateName(name: string): this {\n    this._name = name;\n    this.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, 'custom');\n    return this;\n  }\n\n  /** @inheritdoc */\n  public end(endTimestamp?: SpanTimeInput): void {\n    // If already ended, skip\n    if (this._endTime) {\n      return;\n    }\n\n    this._endTime = spanTimeInputToSeconds(endTimestamp);\n    logSpanEnd(this);\n\n    this._onSpanEnded();\n  }\n\n  /**\n   * Get JSON representation of this span.\n   *\n   * @hidden\n   * @internal This method is purely for internal purposes and should not be used outside\n   * of SDK code. If you need to get a JSON representation of a span,\n   * use `spanToJSON(span)` instead.\n   */\n  public getSpanJSON(): SpanJSON {\n    return dropUndefinedKeys({\n      data: this._attributes,\n      description: this._name,\n      op: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP],\n      parent_span_id: this._parentSpanId,\n      span_id: this._spanId,\n      start_timestamp: this._startTime,\n      status: getStatusMessage(this._status),\n      timestamp: this._endTime,\n      trace_id: this._traceId,\n      origin: this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined,\n      _metrics_summary: getMetricSummaryJsonForSpan(this),\n      profile_id: this._attributes[SEMANTIC_ATTRIBUTE_PROFILE_ID] as string | undefined,\n      exclusive_time: this._attributes[SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME] as number | undefined,\n      measurements: timedEventsToMeasurements(this._events),\n      is_segment: (this._isStandaloneSpan && getRootSpan(this) === this) || undefined,\n      segment_id: this._isStandaloneSpan ? getRootSpan(this).spanContext().spanId : undefined,\n    });\n  }\n\n  /** @inheritdoc */\n  public isRecording(): boolean {\n    return !this._endTime && !!this._sampled;\n  }\n\n  /**\n   * @inheritdoc\n   */\n  public addEvent(\n    name: string,\n    attributesOrStartTime?: SpanAttributes | SpanTimeInput,\n    startTime?: SpanTimeInput,\n  ): this {\n    DEBUG_BUILD && logger.log('[Tracing] Adding an event to span:', name);\n\n    const time = isSpanTimeInput(attributesOrStartTime) ? attributesOrStartTime : startTime || timestampInSeconds();\n    const attributes = isSpanTimeInput(attributesOrStartTime) ? {} : attributesOrStartTime || {};\n\n    const event: TimedEvent = {\n      name,\n      time: spanTimeInputToSeconds(time),\n      attributes,\n    };\n\n    this._events.push(event);\n\n    return this;\n  }\n\n  /**\n   * This method should generally not be used,\n   * but for now we need a way to publicly check if the `_isStandaloneSpan` flag is set.\n   * USE THIS WITH CAUTION!\n   * @internal\n   * @hidden\n   * @experimental\n   */\n  public isStandaloneSpan(): boolean {\n    return !!this._isStandaloneSpan;\n  }\n\n  /** Emit `spanEnd` when the span is ended. */\n  private _onSpanEnded(): void {\n    const client = getClient();\n    if (client) {\n      client.emit('spanEnd', this);\n    }\n\n    // A segment span is basically the root span of a local span tree.\n    // So for now, this is either what we previously refer to as the root span,\n    // or a standalone span.\n    const isSegmentSpan = this._isStandaloneSpan || this === getRootSpan(this);\n\n    if (!isSegmentSpan) {\n      return;\n    }\n\n    // if this is a standalone span, we send it immediately\n    if (this._isStandaloneSpan) {\n      if (this._sampled) {\n        sendSpanEnvelope(createSpanEnvelope([this], client));\n      } else {\n        DEBUG_BUILD &&\n          logger.log('[Tracing] Discarding standalone span because its trace was not chosen to be sampled.');\n        if (client) {\n          client.recordDroppedEvent('sample_rate', 'span');\n        }\n      }\n      return;\n    }\n\n    const transactionEvent = this._convertSpanToTransaction();\n    if (transactionEvent) {\n      const scope = getCapturedScopesOnSpan(this).scope || getCurrentScope();\n      scope.captureEvent(transactionEvent);\n    }\n  }\n\n  /**\n   * Finish the transaction & prepare the event to send to Sentry.\n   */\n  private _convertSpanToTransaction(): TransactionEvent | undefined {\n    // We can only convert finished spans\n    if (!isFullFinishedSpan(spanToJSON(this))) {\n      return undefined;\n    }\n\n    if (!this._name) {\n      DEBUG_BUILD && logger.warn('Transaction has no name, falling back to `<unlabeled transaction>`.');\n      this._name = '<unlabeled transaction>';\n    }\n\n    const { scope: capturedSpanScope, isolationScope: capturedSpanIsolationScope } = getCapturedScopesOnSpan(this);\n    const scope = capturedSpanScope || getCurrentScope();\n    const client = scope.getClient() || getClient();\n\n    if (this._sampled !== true) {\n      // At this point if `sampled !== true` we want to discard the transaction.\n      DEBUG_BUILD && logger.log('[Tracing] Discarding transaction because its trace was not chosen to be sampled.');\n\n      if (client) {\n        client.recordDroppedEvent('sample_rate', 'transaction');\n      }\n\n      return undefined;\n    }\n\n    // The transaction span itself as well as any potential standalone spans should be filtered out\n    const finishedSpans = getSpanDescendants(this).filter(span => span !== this && !isStandaloneSpan(span));\n\n    const spans = finishedSpans.map(span => spanToJSON(span)).filter(isFullFinishedSpan);\n\n    const source = this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] as TransactionSource | undefined;\n\n    // remove internal root span attributes we don't need to send.\n    /* eslint-disable @typescript-eslint/no-dynamic-delete */\n    delete this._attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n    spans.forEach(span => {\n      span.data && delete span.data[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n    });\n    // eslint-enabled-next-line @typescript-eslint/no-dynamic-delete\n\n    const transaction: TransactionEvent = {\n      contexts: {\n        trace: spanToTransactionTraceContext(this),\n      },\n      spans:\n        // spans.sort() mutates the array, but `spans` is already a copy so we can safely do this here\n        // we do not use spans anymore after this point\n        spans.length > MAX_SPAN_COUNT\n          ? spans.sort((a, b) => a.start_timestamp - b.start_timestamp).slice(0, MAX_SPAN_COUNT)\n          : spans,\n      start_timestamp: this._startTime,\n      timestamp: this._endTime,\n      transaction: this._name,\n      type: 'transaction',\n      sdkProcessingMetadata: {\n        capturedSpanScope,\n        capturedSpanIsolationScope,\n        ...dropUndefinedKeys({\n          dynamicSamplingContext: getDynamicSamplingContextFromSpan(this),\n        }),\n      },\n      _metrics_summary: getMetricSummaryJsonForSpan(this),\n      ...(source && {\n        transaction_info: {\n          source,\n        },\n      }),\n    };\n\n    const measurements = timedEventsToMeasurements(this._events);\n    const hasMeasurements = measurements && Object.keys(measurements).length;\n\n    if (hasMeasurements) {\n      DEBUG_BUILD &&\n        logger.log(\n          '[Measurements] Adding measurements to transaction event',\n          JSON.stringify(measurements, undefined, 2),\n        );\n      transaction.measurements = measurements;\n    }\n\n    return transaction;\n  }\n}\n\nfunction isSpanTimeInput(value: undefined | SpanAttributes | SpanTimeInput): value is SpanTimeInput {\n  return (value && typeof value === 'number') || value instanceof Date || Array.isArray(value);\n}\n\n// We want to filter out any incomplete SpanJSON objects\nfunction isFullFinishedSpan(input: Partial<SpanJSON>): input is SpanJSON {\n  return !!input.start_timestamp && !!input.timestamp && !!input.span_id && !!input.trace_id;\n}\n\n/** `SentrySpan`s can be sent as a standalone span rather than belonging to a transaction */\nfunction isStandaloneSpan(span: Span): boolean {\n  return span instanceof SentrySpan && span.isStandaloneSpan();\n}\n\n/**\n * Sends a `SpanEnvelope`.\n *\n * Note: If the envelope's spans are dropped, e.g. via `beforeSendSpan`,\n * the envelope will not be sent either.\n */\nfunction sendSpanEnvelope(envelope: SpanEnvelope): void {\n  const client = getClient();\n  if (!client) {\n    return;\n  }\n\n  const spanItems = envelope[1];\n  if (!spanItems || spanItems.length === 0) {\n    client.recordDroppedEvent('before_send', 'span');\n    return;\n  }\n\n  // sendEnvelope should not throw\n  // eslint-disable-next-line @typescript-eslint/no-floating-promises\n  client.sendEnvelope(envelope);\n}\n","import type { Span, SpanStatus } from '../types-hoist';\n\nexport const SPAN_STATUS_UNSET = 0;\nexport const SPAN_STATUS_OK = 1;\nexport const SPAN_STATUS_ERROR = 2;\n\n/**\n * Converts a HTTP status code into a sentry status with a message.\n *\n * @param httpStatus The HTTP response status code.\n * @returns The span status or unknown_error.\n */\n// https://develop.sentry.dev/sdk/event-payloads/span/\nexport function getSpanStatusFromHttpCode(httpStatus: number): SpanStatus {\n  if (httpStatus < 400 && httpStatus >= 100) {\n    return { code: SPAN_STATUS_OK };\n  }\n\n  if (httpStatus >= 400 && httpStatus < 500) {\n    switch (httpStatus) {\n      case 401:\n        return { code: SPAN_STATUS_ERROR, message: 'unauthenticated' };\n      case 403:\n        return { code: SPAN_STATUS_ERROR, message: 'permission_denied' };\n      case 404:\n        return { code: SPAN_STATUS_ERROR, message: 'not_found' };\n      case 409:\n        return { code: SPAN_STATUS_ERROR, message: 'already_exists' };\n      case 413:\n        return { code: SPAN_STATUS_ERROR, message: 'failed_precondition' };\n      case 429:\n        return { code: SPAN_STATUS_ERROR, message: 'resource_exhausted' };\n      case 499:\n        return { code: SPAN_STATUS_ERROR, message: 'cancelled' };\n      default:\n        return { code: SPAN_STATUS_ERROR, message: 'invalid_argument' };\n    }\n  }\n\n  if (httpStatus >= 500 && httpStatus < 600) {\n    switch (httpStatus) {\n      case 501:\n        return { code: SPAN_STATUS_ERROR, message: 'unimplemented' };\n      case 503:\n        return { code: SPAN_STATUS_ERROR, message: 'unavailable' };\n      case 504:\n        return { code: SPAN_STATUS_ERROR, message: 'deadline_exceeded' };\n      default:\n        return { code: SPAN_STATUS_ERROR, message: 'internal_error' };\n    }\n  }\n\n  return { code: SPAN_STATUS_ERROR, message: 'unknown_error' };\n}\n\n/**\n * Sets the Http status attributes on the current span based on the http code.\n * Additionally, the span's status is updated, depending on the http code.\n */\nexport function setHttpStatus(span: Span, httpStatus: number): void {\n  span.setAttribute('http.response.status_code', httpStatus);\n\n  const spanStatus = getSpanStatusFromHttpCode(httpStatus);\n  if (spanStatus.message !== 'unknown_error') {\n    span.setStatus(spanStatus);\n  }\n}\n","/* eslint-disable max-lines */\n\nimport type { AsyncContextStrategy } from '../asyncContext/types';\nimport { getMainCarrier } from '../carrier';\nimport type { ClientOptions, Scope, SentrySpanArguments, Span, SpanTimeInput, StartSpanOptions } from '../types-hoist';\n\nimport { getClient, getCurrentScope, getIsolationScope, withScope } from '../currentScopes';\n\nimport { getAsyncContextStrategy } from '../asyncContext';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from '../semanticAttributes';\nimport { logger } from '../utils-hoist/logger';\nimport { generateTraceId } from '../utils-hoist/propagationContext';\nimport { propagationContextFromHeaders } from '../utils-hoist/tracing';\nimport { handleCallbackErrors } from '../utils/handleCallbackErrors';\nimport { hasTracingEnabled } from '../utils/hasTracingEnabled';\nimport { _getSpanForScope, _setSpanForScope } from '../utils/spanOnScope';\nimport { addChildSpanToSpan, getRootSpan, spanIsSampled, spanTimeInputToSeconds, spanToJSON } from '../utils/spanUtils';\nimport { freezeDscOnSpan, getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { logSpanStart } from './logSpans';\nimport { sampleSpan } from './sampling';\nimport { SentryNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { SentrySpan } from './sentrySpan';\nimport { SPAN_STATUS_ERROR } from './spanstatus';\nimport { setCapturedScopesOnSpan } from './utils';\n\nconst SUPPRESS_TRACING_KEY = '__SENTRY_SUPPRESS_TRACING__';\n\n/**\n * Wraps a function with a transaction/span and finishes the span after the function is done.\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * If you want to create a span that is not set as active, use {@link startInactiveSpan}.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpan<T>(options: StartSpanOptions, callback: (span: Span) => T): T {\n  const acs = getAcs();\n  if (acs.startSpan) {\n    return acs.startSpan(options, callback);\n  }\n\n  const spanArguments = parseSentrySpanArguments(options);\n  const { forceTransaction, parentSpan: customParentSpan } = options;\n\n  return withScope(options.scope, () => {\n    // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n    const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n    return wrapper(() => {\n      const scope = getCurrentScope();\n      const parentSpan = getParentSpan(scope);\n\n      const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n      const activeSpan = shouldSkipSpan\n        ? new SentryNonRecordingSpan()\n        : createChildOrRootSpan({\n            parentSpan,\n            spanArguments,\n            forceTransaction,\n            scope,\n          });\n\n      _setSpanForScope(scope, activeSpan);\n\n      return handleCallbackErrors(\n        () => callback(activeSpan),\n        () => {\n          // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n          const { status } = spanToJSON(activeSpan);\n          if (activeSpan.isRecording() && (!status || status === 'ok')) {\n            activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n          }\n        },\n        () => activeSpan.end(),\n      );\n    });\n  });\n}\n\n/**\n * Similar to `Sentry.startSpan`. Wraps a function with a transaction/span, but does not finish the span\n * after the function is done automatically. You'll have to call `span.end()` manually.\n *\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpanManual<T>(options: StartSpanOptions, callback: (span: Span, finish: () => void) => T): T {\n  const acs = getAcs();\n  if (acs.startSpanManual) {\n    return acs.startSpanManual(options, callback);\n  }\n\n  const spanArguments = parseSentrySpanArguments(options);\n  const { forceTransaction, parentSpan: customParentSpan } = options;\n\n  return withScope(options.scope, () => {\n    // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n    const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n    return wrapper(() => {\n      const scope = getCurrentScope();\n      const parentSpan = getParentSpan(scope);\n\n      const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n      const activeSpan = shouldSkipSpan\n        ? new SentryNonRecordingSpan()\n        : createChildOrRootSpan({\n            parentSpan,\n            spanArguments,\n            forceTransaction,\n            scope,\n          });\n\n      _setSpanForScope(scope, activeSpan);\n\n      function finishAndSetSpan(): void {\n        activeSpan.end();\n      }\n\n      return handleCallbackErrors(\n        () => callback(activeSpan, finishAndSetSpan),\n        () => {\n          // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n          const { status } = spanToJSON(activeSpan);\n          if (activeSpan.isRecording() && (!status || status === 'ok')) {\n            activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n          }\n        },\n      );\n    });\n  });\n}\n\n/**\n * Creates a span. This span is not set as active, so will not get automatic instrumentation spans\n * as children or be able to be accessed via `Sentry.getActiveSpan()`.\n *\n * If you want to create a span that is set as active, use {@link startSpan}.\n *\n * This function will always return a span,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startInactiveSpan(options: StartSpanOptions): Span {\n  const acs = getAcs();\n  if (acs.startInactiveSpan) {\n    return acs.startInactiveSpan(options);\n  }\n\n  const spanArguments = parseSentrySpanArguments(options);\n  const { forceTransaction, parentSpan: customParentSpan } = options;\n\n  // If `options.scope` is defined, we use this as as a wrapper,\n  // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n  const wrapper = options.scope\n    ? (callback: () => Span) => withScope(options.scope, callback)\n    : customParentSpan !== undefined\n      ? (callback: () => Span) => withActiveSpan(customParentSpan, callback)\n      : (callback: () => Span) => callback();\n\n  return wrapper(() => {\n    const scope = getCurrentScope();\n    const parentSpan = getParentSpan(scope);\n\n    const shouldSkipSpan = options.onlyIfParent && !parentSpan;\n\n    if (shouldSkipSpan) {\n      return new SentryNonRecordingSpan();\n    }\n\n    return createChildOrRootSpan({\n      parentSpan,\n      spanArguments,\n      forceTransaction,\n      scope,\n    });\n  });\n}\n\n/**\n * Continue a trace from `sentry-trace` and `baggage` values.\n * These values can be obtained from incoming request headers, or in the browser from `<meta name=\"sentry-trace\">`\n * and `<meta name=\"baggage\">` HTML tags.\n *\n * Spans started with `startSpan`, `startSpanManual` and `startInactiveSpan`, within the callback will automatically\n * be attached to the incoming trace.\n */\nexport const continueTrace = <V>(\n  options: {\n    sentryTrace: Parameters<typeof propagationContextFromHeaders>[0];\n    baggage: Parameters<typeof propagationContextFromHeaders>[1];\n  },\n  callback: () => V,\n): V => {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n  if (acs.continueTrace) {\n    return acs.continueTrace(options, callback);\n  }\n\n  const { sentryTrace, baggage } = options;\n\n  return withScope(scope => {\n    const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n    scope.setPropagationContext(propagationContext);\n    return callback();\n  });\n};\n\n/**\n * Forks the current scope and sets the provided span as active span in the context of the provided callback. Can be\n * passed `null` to start an entirely new span tree.\n *\n * @param span Spans started in the context of the provided callback will be children of this span. If `null` is passed,\n * spans started within the callback will not be attached to a parent span.\n * @param callback Execution context in which the provided span will be active. Is passed the newly forked scope.\n * @returns the value returned from the provided callback function.\n */\nexport function withActiveSpan<T>(span: Span | null, callback: (scope: Scope) => T): T {\n  const acs = getAcs();\n  if (acs.withActiveSpan) {\n    return acs.withActiveSpan(span, callback);\n  }\n\n  return withScope(scope => {\n    _setSpanForScope(scope, span || undefined);\n    return callback(scope);\n  });\n}\n\n/** Suppress tracing in the given callback, ensuring no spans are generated inside of it. */\nexport function suppressTracing<T>(callback: () => T): T {\n  const acs = getAcs();\n\n  if (acs.suppressTracing) {\n    return acs.suppressTracing(callback);\n  }\n\n  return withScope(scope => {\n    scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: true });\n    return callback();\n  });\n}\n\n/**\n * Starts a new trace for the duration of the provided callback. Spans started within the\n * callback will be part of the new trace instead of a potentially previously started trace.\n *\n * Important: Only use this function if you want to override the default trace lifetime and\n * propagation mechanism of the SDK for the duration and scope of the provided callback.\n * The newly created trace will also be the root of a new distributed trace, for example if\n * you make http requests within the callback.\n * This function might be useful if the operation you want to instrument should not be part\n * of a potentially ongoing trace.\n *\n * Default behavior:\n * - Server-side: A new trace is started for each incoming request.\n * - Browser: A new trace is started for each page our route. Navigating to a new route\n *            or page will automatically create a new trace.\n */\nexport function startNewTrace<T>(callback: () => T): T {\n  return withScope(scope => {\n    scope.setPropagationContext({ traceId: generateTraceId() });\n    DEBUG_BUILD && logger.info(`Starting a new trace with id ${scope.getPropagationContext().traceId}`);\n    return withActiveSpan(null, callback);\n  });\n}\n\nfunction createChildOrRootSpan({\n  parentSpan,\n  spanArguments,\n  forceTransaction,\n  scope,\n}: {\n  parentSpan: SentrySpan | undefined;\n  spanArguments: SentrySpanArguments;\n  forceTransaction?: boolean;\n  scope: Scope;\n}): Span {\n  if (!hasTracingEnabled()) {\n    return new SentryNonRecordingSpan();\n  }\n\n  const isolationScope = getIsolationScope();\n\n  let span: Span;\n  if (parentSpan && !forceTransaction) {\n    span = _startChildSpan(parentSpan, scope, spanArguments);\n    addChildSpanToSpan(parentSpan, span);\n  } else if (parentSpan) {\n    // If we forced a transaction but have a parent span, make sure to continue from the parent span, not the scope\n    const dsc = getDynamicSamplingContextFromSpan(parentSpan);\n    const { traceId, spanId: parentSpanId } = parentSpan.spanContext();\n    const parentSampled = spanIsSampled(parentSpan);\n\n    span = _startRootSpan(\n      {\n        traceId,\n        parentSpanId,\n        ...spanArguments,\n      },\n      scope,\n      parentSampled,\n    );\n\n    freezeDscOnSpan(span, dsc);\n  } else {\n    const {\n      traceId,\n      dsc,\n      parentSpanId,\n      sampled: parentSampled,\n    } = {\n      ...isolationScope.getPropagationContext(),\n      ...scope.getPropagationContext(),\n    };\n\n    span = _startRootSpan(\n      {\n        traceId,\n        parentSpanId,\n        ...spanArguments,\n      },\n      scope,\n      parentSampled,\n    );\n\n    if (dsc) {\n      freezeDscOnSpan(span, dsc);\n    }\n  }\n\n  logSpanStart(span);\n\n  setCapturedScopesOnSpan(span, scope, isolationScope);\n\n  return span;\n}\n\n/**\n * This converts StartSpanOptions to SentrySpanArguments.\n * For the most part (for now) we accept the same options,\n * but some of them need to be transformed.\n */\nfunction parseSentrySpanArguments(options: StartSpanOptions): SentrySpanArguments {\n  const exp = options.experimental || {};\n  const initialCtx: SentrySpanArguments = {\n    isStandalone: exp.standalone,\n    ...options,\n  };\n\n  if (options.startTime) {\n    const ctx: SentrySpanArguments & { startTime?: SpanTimeInput } = { ...initialCtx };\n    ctx.startTimestamp = spanTimeInputToSeconds(options.startTime);\n    delete ctx.startTime;\n    return ctx;\n  }\n\n  return initialCtx;\n}\n\nfunction getAcs(): AsyncContextStrategy {\n  const carrier = getMainCarrier();\n  return getAsyncContextStrategy(carrier);\n}\n\nfunction _startRootSpan(spanArguments: SentrySpanArguments, scope: Scope, parentSampled?: boolean): SentrySpan {\n  const client = getClient();\n  const options: Partial<ClientOptions> = (client && client.getOptions()) || {};\n\n  const { name = '', attributes } = spanArguments;\n  const [sampled, sampleRate] = scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY]\n    ? [false]\n    : sampleSpan(options, {\n        name,\n        parentSampled,\n        attributes,\n        transactionContext: {\n          name,\n          parentSampled,\n        },\n      });\n\n  const rootSpan = new SentrySpan({\n    ...spanArguments,\n    attributes: {\n      [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n      ...spanArguments.attributes,\n    },\n    sampled,\n  });\n  if (sampleRate !== undefined) {\n    rootSpan.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE, sampleRate);\n  }\n\n  if (client) {\n    client.emit('spanStart', rootSpan);\n  }\n\n  return rootSpan;\n}\n\n/**\n * Creates a new `Span` while setting the current `Span.id` as `parentSpanId`.\n * This inherits the sampling decision from the parent span.\n */\nfunction _startChildSpan(parentSpan: Span, scope: Scope, spanArguments: SentrySpanArguments): Span {\n  const { spanId, traceId } = parentSpan.spanContext();\n  const sampled = scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY] ? false : spanIsSampled(parentSpan);\n\n  const childSpan = sampled\n    ? new SentrySpan({\n        ...spanArguments,\n        parentSpanId: spanId,\n        traceId,\n        sampled,\n      })\n    : new SentryNonRecordingSpan({ traceId });\n\n  addChildSpanToSpan(parentSpan, childSpan);\n\n  const client = getClient();\n  if (client) {\n    client.emit('spanStart', childSpan);\n    // If it has an endTimestamp, it's already ended\n    if (spanArguments.endTimestamp) {\n      client.emit('spanEnd', childSpan);\n    }\n  }\n\n  return childSpan;\n}\n\nfunction getParentSpan(scope: Scope): SentrySpan | undefined {\n  const span = _getSpanForScope(scope) as SentrySpan | undefined;\n\n  if (!span) {\n    return undefined;\n  }\n\n  const client = getClient();\n  const options: Partial<ClientOptions> = client ? client.getOptions() : {};\n  if (options.parentSpanIsAlwaysRootSpan) {\n    return getRootSpan(span) as SentrySpan;\n  }\n\n  return span;\n}\n\nfunction getActiveSpanWrapper<T>(parentSpan: Span | undefined | null): (callback: () => T) => T {\n  return parentSpan !== undefined\n    ? (callback: () => T) => {\n        return withActiveSpan(parentSpan, callback);\n      }\n    : (callback: () => T) => callback();\n}\n","import type { Span } from '../types-hoist';\nimport type { Scope } from '../types-hoist';\nimport { addNonEnumerableProperty } from '../utils-hoist/object';\n\nconst SCOPE_ON_START_SPAN_FIELD = '_sentryScope';\nconst ISOLATION_SCOPE_ON_START_SPAN_FIELD = '_sentryIsolationScope';\n\ntype SpanWithScopes = Span & {\n  [SCOPE_ON_START_SPAN_FIELD]?: Scope;\n  [ISOLATION_SCOPE_ON_START_SPAN_FIELD]?: Scope;\n};\n\n/** Store the scope & isolation scope for a span, which can the be used when it is finished. */\nexport function setCapturedScopesOnSpan(span: Span | undefined, scope: Scope, isolationScope: Scope): void {\n  if (span) {\n    addNonEnumerableProperty(span, ISOLATION_SCOPE_ON_START_SPAN_FIELD, isolationScope);\n    addNonEnumerableProperty(span, SCOPE_ON_START_SPAN_FIELD, scope);\n  }\n}\n\n/**\n * Grabs the scope and isolation scope off a span that were active when the span was started.\n */\nexport function getCapturedScopesOnSpan(span: Span): { scope?: Scope; isolationScope?: Scope } {\n  return {\n    scope: (span as SpanWithScopes)[SCOPE_ON_START_SPAN_FIELD],\n    isolationScope: (span as SpanWithScopes)[ISOLATION_SCOPE_ON_START_SPAN_FIELD],\n  };\n}\n","import type {\n  Envelope,\n  EnvelopeItem,\n  EnvelopeItemType,\n  Event,\n  EventDropReason,\n  EventItem,\n  InternalBaseTransportOptions,\n  Transport,\n  TransportMakeRequestResponse,\n  TransportRequestExecutor,\n} from '../types-hoist';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport {\n  createEnvelope,\n  envelopeItemTypeToDataCategory,\n  forEachEnvelopeItem,\n  serializeEnvelope,\n} from '../utils-hoist/envelope';\nimport { SentryError } from '../utils-hoist/error';\nimport { logger } from '../utils-hoist/logger';\nimport { type PromiseBuffer, makePromiseBuffer } from '../utils-hoist/promisebuffer';\nimport { type RateLimits, isRateLimited, updateRateLimits } from '../utils-hoist/ratelimit';\nimport { resolvedSyncPromise } from '../utils-hoist/syncpromise';\n\nexport const DEFAULT_TRANSPORT_BUFFER_SIZE = 64;\n\n/**\n * Creates an instance of a Sentry `Transport`\n *\n * @param options\n * @param makeRequest\n */\nexport function createTransport(\n  options: InternalBaseTransportOptions,\n  makeRequest: TransportRequestExecutor,\n  buffer: PromiseBuffer<TransportMakeRequestResponse> = makePromiseBuffer(\n    options.bufferSize || DEFAULT_TRANSPORT_BUFFER_SIZE,\n  ),\n): Transport {\n  let rateLimits: RateLimits = {};\n  const flush = (timeout?: number): PromiseLike<boolean> => buffer.drain(timeout);\n\n  function send(envelope: Envelope): PromiseLike<TransportMakeRequestResponse> {\n    const filteredEnvelopeItems: EnvelopeItem[] = [];\n\n    // Drop rate limited items from envelope\n    forEachEnvelopeItem(envelope, (item, type) => {\n      const dataCategory = envelopeItemTypeToDataCategory(type);\n      if (isRateLimited(rateLimits, dataCategory)) {\n        const event: Event | undefined = getEventForEnvelopeItem(item, type);\n        options.recordDroppedEvent('ratelimit_backoff', dataCategory, event);\n      } else {\n        filteredEnvelopeItems.push(item);\n      }\n    });\n\n    // Skip sending if envelope is empty after filtering out rate limited events\n    if (filteredEnvelopeItems.length === 0) {\n      return resolvedSyncPromise({});\n    }\n\n    const filteredEnvelope: Envelope = createEnvelope(envelope[0], filteredEnvelopeItems as (typeof envelope)[1]);\n\n    // Creates client report for each item in an envelope\n    const recordEnvelopeLoss = (reason: EventDropReason): void => {\n      forEachEnvelopeItem(filteredEnvelope, (item, type) => {\n        const event: Event | undefined = getEventForEnvelopeItem(item, type);\n        options.recordDroppedEvent(reason, envelopeItemTypeToDataCategory(type), event);\n      });\n    };\n\n    const requestTask = (): PromiseLike<TransportMakeRequestResponse> =>\n      makeRequest({ body: serializeEnvelope(filteredEnvelope) }).then(\n        response => {\n          // We don't want to throw on NOK responses, but we want to at least log them\n          if (response.statusCode !== undefined && (response.statusCode < 200 || response.statusCode >= 300)) {\n            DEBUG_BUILD && logger.warn(`Sentry responded with status code ${response.statusCode} to sent event.`);\n          }\n\n          rateLimits = updateRateLimits(rateLimits, response);\n          return response;\n        },\n        error => {\n          recordEnvelopeLoss('network_error');\n          throw error;\n        },\n      );\n\n    return buffer.add(requestTask).then(\n      result => result,\n      error => {\n        if (error instanceof SentryError) {\n          DEBUG_BUILD && logger.error('Skipped sending event because buffer is full.');\n          recordEnvelopeLoss('queue_overflow');\n          return resolvedSyncPromise({});\n        } else {\n          throw error;\n        }\n      },\n    );\n  }\n\n  return {\n    send,\n    flush,\n  };\n}\n\nfunction getEventForEnvelopeItem(item: Envelope[1][number], type: EnvelopeItemType): Event | undefined {\n  if (type !== 'event' && type !== 'transaction') {\n    return undefined;\n  }\n\n  return Array.isArray(item) ? (item as EventItem)[1] : undefined;\n}\n","import type {\n  BaseTransportOptions,\n  Envelope,\n  EnvelopeItemType,\n  Event,\n  EventItem,\n  Transport,\n  TransportMakeRequestResponse,\n} from '../types-hoist';\n\nimport { getEnvelopeEndpointWithUrlEncodedAuth } from '../api';\nimport { dsnFromString } from '../utils-hoist/dsn';\nimport { createEnvelope, forEachEnvelopeItem } from '../utils-hoist/envelope';\n\ninterface MatchParam {\n  /** The envelope to be sent */\n  envelope: Envelope;\n  /**\n   * A function that returns an event from the envelope if one exists. You can optionally pass an array of envelope item\n   * types to filter by - only envelopes matching the given types will be multiplexed.\n   * Allowed values are: 'event', 'transaction', 'profile', 'replay_event'\n   *\n   * @param types Defaults to ['event']\n   */\n  getEvent(types?: EnvelopeItemType[]): Event | undefined;\n}\n\ntype RouteTo = { dsn: string; release: string };\ntype Matcher = (param: MatchParam) => (string | RouteTo)[];\n\n/**\n * Gets an event from an envelope.\n *\n * This is only exported for use in the tests\n */\nexport function eventFromEnvelope(env: Envelope, types: EnvelopeItemType[]): Event | undefined {\n  let event: Event | undefined;\n\n  forEachEnvelopeItem(env, (item, type) => {\n    if (types.includes(type)) {\n      event = Array.isArray(item) ? (item as EventItem)[1] : undefined;\n    }\n    // bail out if we found an event\n    return !!event;\n  });\n\n  return event;\n}\n\n/**\n * Creates a transport that overrides the release on all events.\n */\nfunction makeOverrideReleaseTransport<TO extends BaseTransportOptions>(\n  createTransport: (options: TO) => Transport,\n  release: string,\n): (options: TO) => Transport {\n  return options => {\n    const transport = createTransport(options);\n\n    return {\n      ...transport,\n      send: async (envelope: Envelope): Promise<TransportMakeRequestResponse> => {\n        const event = eventFromEnvelope(envelope, ['event', 'transaction', 'profile', 'replay_event']);\n\n        if (event) {\n          event.release = release;\n        }\n        return transport.send(envelope);\n      },\n    };\n  };\n}\n\n/** Overrides the DSN in the envelope header  */\nfunction overrideDsn(envelope: Envelope, dsn: string): Envelope {\n  return createEnvelope(\n    dsn\n      ? {\n          ...envelope[0],\n          dsn,\n        }\n      : envelope[0],\n    envelope[1],\n  );\n}\n\n/**\n * Creates a transport that can send events to different DSNs depending on the envelope contents.\n */\nexport function makeMultiplexedTransport<TO extends BaseTransportOptions>(\n  createTransport: (options: TO) => Transport,\n  matcher: Matcher,\n): (options: TO) => Transport {\n  return options => {\n    const fallbackTransport = createTransport(options);\n    const otherTransports: Map<string, Transport> = new Map();\n\n    function getTransport(dsn: string, release: string | undefined): [string, Transport] | undefined {\n      // We create a transport for every unique dsn/release combination as there may be code from multiple releases in\n      // use at the same time\n      const key = release ? `${dsn}:${release}` : dsn;\n\n      let transport = otherTransports.get(key);\n\n      if (!transport) {\n        const validatedDsn = dsnFromString(dsn);\n        if (!validatedDsn) {\n          return undefined;\n        }\n        const url = getEnvelopeEndpointWithUrlEncodedAuth(validatedDsn, options.tunnel);\n\n        transport = release\n          ? makeOverrideReleaseTransport(createTransport, release)({ ...options, url })\n          : createTransport({ ...options, url });\n\n        otherTransports.set(key, transport);\n      }\n\n      return [dsn, transport];\n    }\n\n    async function send(envelope: Envelope): Promise<TransportMakeRequestResponse> {\n      function getEvent(types?: EnvelopeItemType[]): Event | undefined {\n        const eventTypes: EnvelopeItemType[] = types && types.length ? types : ['event'];\n        return eventFromEnvelope(envelope, eventTypes);\n      }\n\n      const transports = matcher({ envelope, getEvent })\n        .map(result => {\n          if (typeof result === 'string') {\n            return getTransport(result, undefined);\n          } else {\n            return getTransport(result.dsn, result.release);\n          }\n        })\n        .filter((t): t is [string, Transport] => !!t);\n\n      // If we have no transports to send to, use the fallback transport\n      // Don't override the DSN in the header for the fallback transport. '' is falsy\n      const transportsWithFallback: [string, Transport][] = transports.length ? transports : [['', fallbackTransport]];\n\n      const results = (await Promise.all(\n        transportsWithFallback.map(([dsn, transport]) => transport.send(overrideDsn(envelope, dsn))),\n      )) as [TransportMakeRequestResponse, ...TransportMakeRequestResponse[]];\n\n      return results[0];\n    }\n\n    async function flush(timeout: number | undefined): Promise<boolean> {\n      const allTransports = [...otherTransports.values(), fallbackTransport];\n      const results = await Promise.all(allTransports.map(transport => transport.flush(timeout)));\n      return results.every(r => r);\n    }\n\n    return {\n      send,\n      flush,\n    };\n  };\n}\n","import { getClient, withScope } from './currentScopes';\nimport { captureException } from './exports';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, SEMANTIC_ATTRIBUTE_SENTRY_SOURCE } from './semanticAttributes';\nimport { startSpanManual } from './tracing';\nimport { normalize } from './utils-hoist/normalize';\n\ninterface SentryTrpcMiddlewareOptions {\n  /** Whether to include procedure inputs in reported events. Defaults to `false`. */\n  attachRpcInput?: boolean;\n}\n\nexport interface SentryTrpcMiddlewareArguments<T> {\n  path?: unknown;\n  type?: unknown;\n  next: () => T;\n  rawInput?: unknown;\n  getRawInput?: () => Promise<unknown>;\n}\n\nconst trpcCaptureContext = { mechanism: { handled: false, data: { function: 'trpcMiddleware' } } };\n\nfunction captureIfError(nextResult: unknown): void {\n  // TODO: Set span status based on what TRPCError was encountered\n  if (\n    typeof nextResult === 'object' &&\n    nextResult !== null &&\n    'ok' in nextResult &&\n    !nextResult.ok &&\n    'error' in nextResult\n  ) {\n    captureException(nextResult.error, trpcCaptureContext);\n  }\n}\n\ntype SentryTrpcMiddleware<T> = T extends Promise<unknown> ? T : Promise<T>;\n\n/**\n * Sentry tRPC middleware that captures errors and creates spans for tRPC procedures.\n */\nexport function trpcMiddleware(options: SentryTrpcMiddlewareOptions = {}) {\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  return async function <T>(opts: SentryTrpcMiddlewareArguments<T>): SentryTrpcMiddleware<T> {\n    const { path, type, next, rawInput, getRawInput } = opts;\n\n    const client = getClient();\n    const clientOptions = client && client.getOptions();\n\n    const trpcContext: Record<string, unknown> = {\n      procedure_path: path,\n      procedure_type: type,\n    };\n\n    if (options.attachRpcInput !== undefined ? options.attachRpcInput : clientOptions && clientOptions.sendDefaultPii) {\n      if (rawInput !== undefined) {\n        trpcContext.input = normalize(rawInput);\n      }\n\n      if (getRawInput !== undefined && typeof getRawInput === 'function') {\n        try {\n          const rawRes = await getRawInput();\n\n          trpcContext.input = normalize(rawRes);\n        } catch (err) {\n          // noop\n        }\n      }\n    }\n\n    return withScope(scope => {\n      scope.setContext('trpc', trpcContext);\n      return startSpanManual(\n        {\n          name: `trpc/${path}`,\n          op: 'rpc.server',\n          attributes: {\n            [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route',\n            [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.rpc.trpc',\n          },\n        },\n        async span => {\n          try {\n            const nextResult = await next();\n            captureIfError(nextResult);\n            span.end();\n            return nextResult;\n          } catch (e) {\n            captureException(e, trpcCaptureContext);\n            span.end();\n            throw e;\n          }\n        },\n      ) as SentryTrpcMiddleware<T>;\n    });\n  };\n}\n","import type { Event, EventHint, Exception, ExtendedError, StackParser } from '../types-hoist';\n\nimport { isInstanceOf } from './is';\nimport { truncate } from './string';\n\n/**\n * Creates exceptions inside `event.exception.values` for errors that are nested on properties based on the `key` parameter.\n */\nexport function applyAggregateErrorsToEvent(\n  exceptionFromErrorImplementation: (stackParser: StackParser, ex: Error) => Exception,\n  parser: StackParser,\n  maxValueLimit: number = 250,\n  key: string,\n  limit: number,\n  event: Event,\n  hint?: EventHint,\n): void {\n  if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n    return;\n  }\n\n  // Generally speaking the last item in `event.exception.values` is the exception originating from the original Error\n  const originalException: Exception | undefined =\n    event.exception.values.length > 0 ? event.exception.values[event.exception.values.length - 1] : undefined;\n\n  // We only create exception grouping if there is an exception in the event.\n  if (originalException) {\n    event.exception.values = truncateAggregateExceptions(\n      aggregateExceptionsFromError(\n        exceptionFromErrorImplementation,\n        parser,\n        limit,\n        hint.originalException as ExtendedError,\n        key,\n        event.exception.values,\n        originalException,\n        0,\n      ),\n      maxValueLimit,\n    );\n  }\n}\n\nfunction aggregateExceptionsFromError(\n  exceptionFromErrorImplementation: (stackParser: StackParser, ex: Error) => Exception,\n  parser: StackParser,\n  limit: number,\n  error: ExtendedError,\n  key: string,\n  prevExceptions: Exception[],\n  exception: Exception,\n  exceptionId: number,\n): Exception[] {\n  if (prevExceptions.length >= limit + 1) {\n    return prevExceptions;\n  }\n\n  let newExceptions = [...prevExceptions];\n\n  // Recursively call this function in order to walk down a chain of errors\n  if (isInstanceOf(error[key], Error)) {\n    applyExceptionGroupFieldsForParentException(exception, exceptionId);\n    const newException = exceptionFromErrorImplementation(parser, error[key]);\n    const newExceptionId = newExceptions.length;\n    applyExceptionGroupFieldsForChildException(newException, key, newExceptionId, exceptionId);\n    newExceptions = aggregateExceptionsFromError(\n      exceptionFromErrorImplementation,\n      parser,\n      limit,\n      error[key],\n      key,\n      [newException, ...newExceptions],\n      newException,\n      newExceptionId,\n    );\n  }\n\n  // This will create exception grouping for AggregateErrors\n  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError\n  if (Array.isArray(error.errors)) {\n    error.errors.forEach((childError, i) => {\n      if (isInstanceOf(childError, Error)) {\n        applyExceptionGroupFieldsForParentException(exception, exceptionId);\n        const newException = exceptionFromErrorImplementation(parser, childError);\n        const newExceptionId = newExceptions.length;\n        applyExceptionGroupFieldsForChildException(newException, `errors[${i}]`, newExceptionId, exceptionId);\n        newExceptions = aggregateExceptionsFromError(\n          exceptionFromErrorImplementation,\n          parser,\n          limit,\n          childError,\n          key,\n          [newException, ...newExceptions],\n          newException,\n          newExceptionId,\n        );\n      }\n    });\n  }\n\n  return newExceptions;\n}\n\nfunction applyExceptionGroupFieldsForParentException(exception: Exception, exceptionId: number): void {\n  // Don't know if this default makes sense. The protocol requires us to set these values so we pick *some* default.\n  exception.mechanism = exception.mechanism || { type: 'generic', handled: true };\n\n  exception.mechanism = {\n    ...exception.mechanism,\n    ...(exception.type === 'AggregateError' && { is_exception_group: true }),\n    exception_id: exceptionId,\n  };\n}\n\nfunction applyExceptionGroupFieldsForChildException(\n  exception: Exception,\n  source: string,\n  exceptionId: number,\n  parentId: number | undefined,\n): void {\n  // Don't know if this default makes sense. The protocol requires us to set these values so we pick *some* default.\n  exception.mechanism = exception.mechanism || { type: 'generic', handled: true };\n\n  exception.mechanism = {\n    ...exception.mechanism,\n    type: 'chained',\n    source,\n    exception_id: exceptionId,\n    parent_id: parentId,\n  };\n}\n\n/**\n * Truncate the message (exception.value) of all exceptions in the event.\n * Because this event processor is ran after `applyClientOptions`,\n * we need to truncate the message of the added exceptions here.\n */\nfunction truncateAggregateExceptions(exceptions: Exception[], maxValueLength: number): Exception[] {\n  return exceptions.map(exception => {\n    if (exception.value) {\n      exception.value = truncate(exception.value, maxValueLength);\n    }\n    return exception;\n  });\n}\n","import type { StackFrame } from '../types-hoist';\nimport { filenameIsInApp } from './node-stack-trace';\nimport { dropUndefinedKeys } from './object';\nimport { UNKNOWN_FUNCTION } from './stacktrace';\n\ntype WatchdogReturn = {\n  /** Resets the watchdog timer */\n  poll: () => void;\n  /** Enables or disables the watchdog timer */\n  enabled: (state: boolean) => void;\n};\n\ntype CreateTimerImpl = () => { getTimeMs: () => number; reset: () => void };\n\n/**\n * A node.js watchdog timer\n * @param pollInterval The interval that we expect to get polled at\n * @param anrThreshold The threshold for when we consider ANR\n * @param callback The callback to call for ANR\n * @returns An object with `poll` and `enabled` functions {@link WatchdogReturn}\n */\nexport function watchdogTimer(\n  createTimer: CreateTimerImpl,\n  pollInterval: number,\n  anrThreshold: number,\n  callback: () => void,\n): WatchdogReturn {\n  const timer = createTimer();\n  let triggered = false;\n  let enabled = true;\n\n  setInterval(() => {\n    const diffMs = timer.getTimeMs();\n\n    if (triggered === false && diffMs > pollInterval + anrThreshold) {\n      triggered = true;\n      if (enabled) {\n        callback();\n      }\n    }\n\n    if (diffMs < pollInterval + anrThreshold) {\n      triggered = false;\n    }\n  }, 20);\n\n  return {\n    poll: () => {\n      timer.reset();\n    },\n    enabled: (state: boolean) => {\n      enabled = state;\n    },\n  };\n}\n\n// types copied from inspector.d.ts\ninterface Location {\n  scriptId: string;\n  lineNumber: number;\n  columnNumber?: number;\n}\n\ninterface CallFrame {\n  functionName: string;\n  location: Location;\n  url: string;\n}\n\n/**\n * Converts Debugger.CallFrame to Sentry StackFrame\n */\nexport function callFrameToStackFrame(\n  frame: CallFrame,\n  url: string | undefined,\n  getModuleFromFilename: (filename: string | undefined) => string | undefined,\n): StackFrame {\n  const filename = url ? url.replace(/^file:\\/\\//, '') : undefined;\n\n  // CallFrame row/col are 0 based, whereas StackFrame are 1 based\n  const colno = frame.location.columnNumber ? frame.location.columnNumber + 1 : undefined;\n  const lineno = frame.location.lineNumber ? frame.location.lineNumber + 1 : undefined;\n\n  return dropUndefinedKeys({\n    filename,\n    module: getModuleFromFilename(filename),\n    function: frame.functionName || UNKNOWN_FUNCTION,\n    colno,\n    lineno,\n    in_app: filename ? filenameIsInApp(filename) : undefined,\n  });\n}\n","export type NestedArray<T> = Array<NestedArray<T> | T>;\n\n/** Flattens a multi-dimensional array\n *\n * @deprecated This function is deprecated and will be removed in the next major version.\n */\nexport function flatten<T>(input: NestedArray<T>): T[] {\n  const result: T[] = [];\n\n  const flattenHelper = (input: NestedArray<T>): void => {\n    input.forEach((el: T | NestedArray<T>) => {\n      if (Array.isArray(el)) {\n        flattenHelper(el as NestedArray<T>);\n      } else {\n        result.push(el as T);\n      }\n    });\n  };\n\n  flattenHelper(input);\n  return result;\n}\n","import type { DynamicSamplingContext } from '../types-hoist';\n\nimport { DEBUG_BUILD } from './debug-build';\nimport { isString } from './is';\nimport { logger } from './logger';\n\n/**\n * @deprecated Use a `\"baggage\"` string directly\n */\nexport const BAGGAGE_HEADER_NAME = 'baggage';\n\nexport const SENTRY_BAGGAGE_KEY_PREFIX = 'sentry-';\n\nexport const SENTRY_BAGGAGE_KEY_PREFIX_REGEX = /^sentry-/;\n\n/**\n * Max length of a serialized baggage string\n *\n * https://www.w3.org/TR/baggage/#limits\n */\nexport const MAX_BAGGAGE_STRING_LENGTH = 8192;\n\n/**\n * Takes a baggage header and turns it into Dynamic Sampling Context, by extracting all the \"sentry-\" prefixed values\n * from it.\n *\n * @param baggageHeader A very bread definition of a baggage header as it might appear in various frameworks.\n * @returns The Dynamic Sampling Context that was found on `baggageHeader`, if there was any, `undefined` otherwise.\n */\nexport function baggageHeaderToDynamicSamplingContext(\n  // Very liberal definition of what any incoming header might look like\n  baggageHeader: string | string[] | number | null | undefined | boolean,\n): Partial<DynamicSamplingContext> | undefined {\n  const baggageObject = parseBaggageHeader(baggageHeader);\n\n  if (!baggageObject) {\n    return undefined;\n  }\n\n  // Read all \"sentry-\" prefixed values out of the baggage object and put it onto a dynamic sampling context object.\n  const dynamicSamplingContext = Object.entries(baggageObject).reduce<Record<string, string>>((acc, [key, value]) => {\n    if (key.match(SENTRY_BAGGAGE_KEY_PREFIX_REGEX)) {\n      const nonPrefixedKey = key.slice(SENTRY_BAGGAGE_KEY_PREFIX.length);\n      acc[nonPrefixedKey] = value;\n    }\n    return acc;\n  }, {});\n\n  // Only return a dynamic sampling context object if there are keys in it.\n  // A keyless object means there were no sentry values on the header, which means that there is no DSC.\n  if (Object.keys(dynamicSamplingContext).length > 0) {\n    return dynamicSamplingContext as Partial<DynamicSamplingContext>;\n  } else {\n    return undefined;\n  }\n}\n\n/**\n * Turns a Dynamic Sampling Object into a baggage header by prefixing all the keys on the object with \"sentry-\".\n *\n * @param dynamicSamplingContext The Dynamic Sampling Context to turn into a header. For convenience and compatibility\n * with the `getDynamicSamplingContext` method on the Transaction class ,this argument can also be `undefined`. If it is\n * `undefined` the function will return `undefined`.\n * @returns a baggage header, created from `dynamicSamplingContext`, or `undefined` either if `dynamicSamplingContext`\n * was `undefined`, or if `dynamicSamplingContext` didn't contain any values.\n */\nexport function dynamicSamplingContextToSentryBaggageHeader(\n  // this also takes undefined for convenience and bundle size in other places\n  dynamicSamplingContext?: Partial<DynamicSamplingContext>,\n): string | undefined {\n  if (!dynamicSamplingContext) {\n    return undefined;\n  }\n\n  // Prefix all DSC keys with \"sentry-\" and put them into a new object\n  const sentryPrefixedDSC = Object.entries(dynamicSamplingContext).reduce<Record<string, string>>(\n    (acc, [dscKey, dscValue]) => {\n      if (dscValue) {\n        acc[`${SENTRY_BAGGAGE_KEY_PREFIX}${dscKey}`] = dscValue;\n      }\n      return acc;\n    },\n    {},\n  );\n\n  return objectToBaggageHeader(sentryPrefixedDSC);\n}\n\n/**\n * Take a baggage header and parse it into an object.\n */\nexport function parseBaggageHeader(\n  baggageHeader: string | string[] | number | null | undefined | boolean,\n): Record<string, string> | undefined {\n  if (!baggageHeader || (!isString(baggageHeader) && !Array.isArray(baggageHeader))) {\n    return undefined;\n  }\n\n  if (Array.isArray(baggageHeader)) {\n    // Combine all baggage headers into one object containing the baggage values so we can later read the Sentry-DSC-values from it\n    return baggageHeader.reduce<Record<string, string>>((acc, curr) => {\n      const currBaggageObject = baggageHeaderToObject(curr);\n      Object.entries(currBaggageObject).forEach(([key, value]) => {\n        acc[key] = value;\n      });\n      return acc;\n    }, {});\n  }\n\n  return baggageHeaderToObject(baggageHeader);\n}\n\n/**\n * Will parse a baggage header, which is a simple key-value map, into a flat object.\n *\n * @param baggageHeader The baggage header to parse.\n * @returns a flat object containing all the key-value pairs from `baggageHeader`.\n */\nfunction baggageHeaderToObject(baggageHeader: string): Record<string, string> {\n  return baggageHeader\n    .split(',')\n    .map(baggageEntry => baggageEntry.split('=').map(keyOrValue => decodeURIComponent(keyOrValue.trim())))\n    .reduce<Record<string, string>>((acc, [key, value]) => {\n      if (key && value) {\n        acc[key] = value;\n      }\n      return acc;\n    }, {});\n}\n\n/**\n * Turns a flat object (key-value pairs) into a baggage header, which is also just key-value pairs.\n *\n * @param object The object to turn into a baggage header.\n * @returns a baggage header string, or `undefined` if the object didn't have any values, since an empty baggage header\n * is not spec compliant.\n */\nfunction objectToBaggageHeader(object: Record<string, string>): string | undefined {\n  if (Object.keys(object).length === 0) {\n    // An empty baggage header is not spec compliant: We return undefined.\n    return undefined;\n  }\n\n  return Object.entries(object).reduce((baggageHeader, [objectKey, objectValue], currentIndex) => {\n    const baggageEntry = `${encodeURIComponent(objectKey)}=${encodeURIComponent(objectValue)}`;\n    const newBaggageHeader = currentIndex === 0 ? baggageEntry : `${baggageHeader},${baggageEntry}`;\n    if (newBaggageHeader.length > MAX_BAGGAGE_STRING_LENGTH) {\n      DEBUG_BUILD &&\n        logger.warn(\n          `Not adding key: ${objectKey} with val: ${objectValue} to baggage header due to exceeding baggage size limits.`,\n        );\n      return baggageHeader;\n    } else {\n      return newBaggageHeader;\n    }\n  }, '');\n}\n","import type { SeverityLevel } from '../types-hoist';\n\n/**\n * Determine a breadcrumb's log level (only `warning` or `error`) based on an HTTP status code.\n */\nexport function getBreadcrumbLogLevelFromHttpStatusCode(statusCode: number | undefined): SeverityLevel | undefined {\n  // NOTE: undefined defaults to 'info' in Sentry\n  if (statusCode === undefined) {\n    return undefined;\n  } else if (statusCode >= 400 && statusCode < 500) {\n    return 'warning';\n  } else if (statusCode >= 500) {\n    return 'error';\n  } else {\n    return undefined;\n  }\n}\n","import { isString } from './is';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst WINDOW = GLOBAL_OBJ as unknown as Window;\n\nconst DEFAULT_MAX_STRING_LENGTH = 80;\n\ntype SimpleNode = {\n  parentNode: SimpleNode;\n} | null;\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nexport function htmlTreeAsString(\n  elem: unknown,\n  options: string[] | { keyAttrs?: string[]; maxStringLength?: number } = {},\n): string {\n  if (!elem) {\n    return '<unknown>';\n  }\n\n  // try/catch both:\n  // - accessing event.target (see getsentry/raven-js#838, #768)\n  // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n  // - can throw an exception in some circumstances.\n  try {\n    let currentElem = elem as SimpleNode;\n    const MAX_TRAVERSE_HEIGHT = 5;\n    const out = [];\n    let height = 0;\n    let len = 0;\n    const separator = ' > ';\n    const sepLength = separator.length;\n    let nextStr;\n    const keyAttrs = Array.isArray(options) ? options : options.keyAttrs;\n    const maxStringLength = (!Array.isArray(options) && options.maxStringLength) || DEFAULT_MAX_STRING_LENGTH;\n\n    while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n      nextStr = _htmlElementAsString(currentElem, keyAttrs);\n      // bail out if\n      // - nextStr is the 'html' element\n      // - the length of the string that would be created exceeds maxStringLength\n      //   (ignore this limit if we are on the first iteration)\n      if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= maxStringLength)) {\n        break;\n      }\n\n      out.push(nextStr);\n\n      len += nextStr.length;\n      currentElem = currentElem.parentNode;\n    }\n\n    return out.reverse().join(separator);\n  } catch (_oO) {\n    return '<unknown>';\n  }\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction _htmlElementAsString(el: unknown, keyAttrs?: string[]): string {\n  const elem = el as {\n    tagName?: string;\n    id?: string;\n    className?: string;\n    getAttribute(key: string): string;\n  };\n\n  const out = [];\n\n  if (!elem || !elem.tagName) {\n    return '';\n  }\n\n  // @ts-expect-error WINDOW has HTMLElement\n  if (WINDOW.HTMLElement) {\n    // If using the component name annotation plugin, this value may be available on the DOM node\n    if (elem instanceof HTMLElement && elem.dataset) {\n      if (elem.dataset['sentryComponent']) {\n        return elem.dataset['sentryComponent'];\n      }\n      if (elem.dataset['sentryElement']) {\n        return elem.dataset['sentryElement'];\n      }\n    }\n  }\n\n  out.push(elem.tagName.toLowerCase());\n\n  // Pairs of attribute keys defined in `serializeAttribute` and their values on element.\n  const keyAttrPairs =\n    keyAttrs && keyAttrs.length\n      ? keyAttrs.filter(keyAttr => elem.getAttribute(keyAttr)).map(keyAttr => [keyAttr, elem.getAttribute(keyAttr)])\n      : null;\n\n  if (keyAttrPairs && keyAttrPairs.length) {\n    keyAttrPairs.forEach(keyAttrPair => {\n      out.push(`[${keyAttrPair[0]}=\"${keyAttrPair[1]}\"]`);\n    });\n  } else {\n    if (elem.id) {\n      out.push(`#${elem.id}`);\n    }\n\n    const className = elem.className;\n    if (className && isString(className)) {\n      const classes = className.split(/\\s+/);\n      for (const c of classes) {\n        out.push(`.${c}`);\n      }\n    }\n  }\n  const allowedAttrs = ['aria-label', 'type', 'name', 'title', 'alt'];\n  for (const k of allowedAttrs) {\n    const attr = elem.getAttribute(k);\n    if (attr) {\n      out.push(`[${k}=\"${attr}\"]`);\n    }\n  }\n\n  return out.join('');\n}\n\n/**\n * A safe form of location.href\n */\nexport function getLocationHref(): string {\n  try {\n    return WINDOW.document.location.href;\n  } catch (oO) {\n    return '';\n  }\n}\n\n/**\n * Gets a DOM element by using document.querySelector.\n *\n * This wrapper will first check for the existence of the function before\n * actually calling it so that we don't have to take care of this check,\n * every time we want to access the DOM.\n *\n * Reason: DOM/querySelector is not available in all environments.\n *\n * We have to cast to any because utils can be consumed by a variety of environments,\n * and we don't want to break TS users. If you know what element will be selected by\n * `document.querySelector`, specify it as part of the generic call. For example,\n * `const element = getDomElement<Element>('selector');`\n *\n * @param selector the selector string passed on to document.querySelector\n *\n * @deprecated This method is deprecated and will be removed in the next major version.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function getDomElement<E = any>(selector: string): E | null {\n  if (WINDOW.document && WINDOW.document.querySelector) {\n    return WINDOW.document.querySelector(selector) as unknown as E;\n  }\n  return null;\n}\n\n/**\n * Given a DOM element, traverses up the tree until it finds the first ancestor node\n * that has the `data-sentry-component` or `data-sentry-element` attribute with `data-sentry-component` taking\n * precedence. This attribute is added at build-time by projects that have the component name annotation plugin installed.\n *\n * @returns a string representation of the component for the provided DOM element, or `null` if not found\n */\nexport function getComponentName(elem: unknown): string | null {\n  // @ts-expect-error WINDOW has HTMLElement\n  if (!WINDOW.HTMLElement) {\n    return null;\n  }\n\n  let currentElem = elem as SimpleNode;\n  const MAX_TRAVERSE_HEIGHT = 5;\n  for (let i = 0; i < MAX_TRAVERSE_HEIGHT; i++) {\n    if (!currentElem) {\n      return null;\n    }\n\n    if (currentElem instanceof HTMLElement) {\n      if (currentElem.dataset['sentryComponent']) {\n        return currentElem.dataset['sentryComponent'];\n      }\n      if (currentElem.dataset['sentryElement']) {\n        return currentElem.dataset['sentryElement'];\n      }\n    }\n\n    currentElem = currentElem.parentNode;\n  }\n\n  return null;\n}\n","// https://github.com/alangpierce/sucrase/tree/265887868966917f3b924ce38dfad01fbab1329f\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2012-2018 various contributors (see AUTHORS)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport { _nullishCoalesce } from './_nullishCoalesce';\n\n/**\n * Polyfill for the nullish coalescing operator (`??`), when used in situations where at least one of the values is the\n * result of an async operation.\n *\n * Note that the RHS is wrapped in a function so that if it's a computed value, that evaluation won't happen unless the\n * LHS evaluates to a nullish value, to mimic the operator's short-circuiting behavior.\n *\n * Adapted from Sucrase (https://github.com/alangpierce/sucrase)\n *\n * @param lhs The value of the expression to the left of the `??`\n * @param rhsFn A function returning the value of the expression to the right of the `??`\n * @returns The LHS value, unless it's `null` or `undefined`, in which case, the RHS value\n */\nexport async function _asyncNullishCoalesce(lhs: unknown, rhsFn: () => unknown): Promise<unknown> {\n  return _nullishCoalesce(lhs, rhsFn);\n}\n\n// Sucrase version:\n// async function _asyncNullishCoalesce(lhs, rhsFn) {\n//   if (lhs != null) {\n//     return lhs;\n//   } else {\n//     return await rhsFn();\n//   }\n// }\n","// https://github.com/alangpierce/sucrase/tree/265887868966917f3b924ce38dfad01fbab1329f\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2012-2018 various contributors (see AUTHORS)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport type { GenericFunction } from './types';\n\n/**\n * Polyfill for the optional chain operator, `?.`, given previous conversion of the expression into an array of values,\n * descriptors, and functions, for situations in which at least one part of the expression is async.\n *\n * Adapted from Sucrase (https://github.com/alangpierce/sucrase) See\n * https://github.com/alangpierce/sucrase/blob/265887868966917f3b924ce38dfad01fbab1329f/src/transformers/OptionalChainingNullishTransformer.ts#L15\n *\n * @param ops Array result of expression conversion\n * @returns The value of the expression\n */\nexport async function _asyncOptionalChain(ops: unknown[]): Promise<unknown> {\n  let lastAccessLHS: unknown = undefined;\n  let value = ops[0];\n  let i = 1;\n  while (i < ops.length) {\n    const op = ops[i] as string;\n    const fn = ops[i + 1] as (intermediateValue: unknown) => Promise<unknown>;\n    i += 2;\n    // by checking for loose equality to `null`, we catch both `null` and `undefined`\n    if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) {\n      // really we're meaning to return `undefined` as an actual value here, but it saves bytes not to write it\n      return;\n    }\n    if (op === 'access' || op === 'optionalAccess') {\n      lastAccessLHS = value;\n      value = await fn(value);\n    } else if (op === 'call' || op === 'optionalCall') {\n      value = await fn((...args: unknown[]) => (value as GenericFunction).call(lastAccessLHS, ...args));\n      lastAccessLHS = undefined;\n    }\n  }\n  return value;\n}\n\n// Sucrase version:\n// async function _asyncOptionalChain(ops) {\n//   let lastAccessLHS = undefined;\n//   let value = ops[0];\n//   let i = 1;\n//   while (i < ops.length) {\n//     const op = ops[i];\n//     const fn = ops[i + 1];\n//     i += 2;\n//     if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) {\n//       return undefined;\n//     }\n//     if (op === 'access' || op === 'optionalAccess') {\n//       lastAccessLHS = value;\n//       value = await fn(value);\n//     } else if (op === 'call' || op === 'optionalCall') {\n//       value = await fn((...args) => value.call(lastAccessLHS, ...args));\n//       lastAccessLHS = undefined;\n//     }\n//   }\n//   return value;\n// }\n","// https://github.com/alangpierce/sucrase/tree/265887868966917f3b924ce38dfad01fbab1329f\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2012-2018 various contributors (see AUTHORS)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport { _asyncOptionalChain } from './_asyncOptionalChain';\n\n/**\n * Polyfill for the optional chain operator, `?.`, given previous conversion of the expression into an array of values,\n * descriptors, and functions, in cases where the value of the expression is to be deleted.\n *\n * Adapted from Sucrase (https://github.com/alangpierce/sucrase) See\n * https://github.com/alangpierce/sucrase/blob/265887868966917f3b924ce38dfad01fbab1329f/src/transformers/OptionalChainingNullishTransformer.ts#L15\n *\n * @param ops Array result of expression conversion\n * @returns The return value of the `delete` operator: `true`, unless the deletion target is an own, non-configurable\n * property (one which can't be deleted or turned into an accessor, and whose enumerability can't be changed), in which\n * case `false`.\n */\nexport async function _asyncOptionalChainDelete(ops: unknown[]): Promise<boolean> {\n  const result = (await _asyncOptionalChain(ops)) as Promise<boolean | null>;\n  // If `result` is `null`, it means we didn't get to the end of the chain and so nothing was deleted (in which case,\n  // return `true` since that's what `delete` does when it no-ops). If it's non-null, we know the delete happened, in\n  // which case we return whatever the `delete` returned, which will be a boolean.\n  return result == null ? true : (result as Promise<boolean>);\n}\n\n// Sucrase version:\n// async function asyncOptionalChainDelete(ops) {\n//   const result = await ASYNC_OPTIONAL_CHAIN_NAME(ops);\n//   return result == null ? true : result;\n// }\n","// https://github.com/alangpierce/sucrase/tree/265887868966917f3b924ce38dfad01fbab1329f\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2012-2018 various contributors (see AUTHORS)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n/**\n * Polyfill for the nullish coalescing operator (`??`).\n *\n * Note that the RHS is wrapped in a function so that if it's a computed value, that evaluation won't happen unless the\n * LHS evaluates to a nullish value, to mimic the operator's short-circuiting behavior.\n *\n * Adapted from Sucrase (https://github.com/alangpierce/sucrase)\n *\n * @param lhs The value of the expression to the left of the `??`\n * @param rhsFn A function returning the value of the expression to the right of the `??`\n * @returns The LHS value, unless it's `null` or `undefined`, in which case, the RHS value\n */\nexport function _nullishCoalesce(lhs: unknown, rhsFn: () => unknown): unknown {\n  // by checking for loose equality to `null`, we catch both `null` and `undefined`\n  return lhs != null ? lhs : rhsFn();\n}\n\n// Sucrase version:\n// function _nullishCoalesce(lhs, rhsFn) {\n//   if (lhs != null) {\n//     return lhs;\n//   } else {\n//     return rhsFn();\n//   }\n// }\n","// https://github.com/alangpierce/sucrase/tree/265887868966917f3b924ce38dfad01fbab1329f\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2012-2018 various contributors (see AUTHORS)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport type { GenericFunction } from './types';\n\n/**\n * Polyfill for the optional chain operator, `?.`, given previous conversion of the expression into an array of values,\n * descriptors, and functions.\n *\n * Adapted from Sucrase (https://github.com/alangpierce/sucrase)\n * See https://github.com/alangpierce/sucrase/blob/265887868966917f3b924ce38dfad01fbab1329f/src/transformers/OptionalChainingNullishTransformer.ts#L15\n *\n * @param ops Array result of expression conversion\n * @returns The value of the expression\n */\nexport function _optionalChain(ops: unknown[]): unknown {\n  let lastAccessLHS: unknown = undefined;\n  let value = ops[0];\n  let i = 1;\n  while (i < ops.length) {\n    const op = ops[i] as string;\n    const fn = ops[i + 1] as (intermediateValue: unknown) => unknown;\n    i += 2;\n    // by checking for loose equality to `null`, we catch both `null` and `undefined`\n    if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) {\n      // really we're meaning to return `undefined` as an actual value here, but it saves bytes not to write it\n      return;\n    }\n    if (op === 'access' || op === 'optionalAccess') {\n      lastAccessLHS = value;\n      value = fn(value);\n    } else if (op === 'call' || op === 'optionalCall') {\n      value = fn((...args: unknown[]) => (value as GenericFunction).call(lastAccessLHS, ...args));\n      lastAccessLHS = undefined;\n    }\n  }\n  return value;\n}\n\n// Sucrase version\n// function _optionalChain(ops) {\n//   let lastAccessLHS = undefined;\n//   let value = ops[0];\n//   let i = 1;\n//   while (i < ops.length) {\n//     const op = ops[i];\n//     const fn = ops[i + 1];\n//     i += 2;\n//     if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) {\n//       return undefined;\n//     }\n//     if (op === 'access' || op === 'optionalAccess') {\n//       lastAccessLHS = value;\n//       value = fn(value);\n//     } else if (op === 'call' || op === 'optionalCall') {\n//       value = fn((...args) => value.call(lastAccessLHS, ...args));\n//       lastAccessLHS = undefined;\n//     }\n//   }\n//   return value;\n// }\n","// https://github.com/alangpierce/sucrase/tree/265887868966917f3b924ce38dfad01fbab1329f\n//\n// The MIT License (MIT)\n//\n// Copyright (c) 2012-2018 various contributors (see AUTHORS)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\nimport { _optionalChain } from './_optionalChain';\n\n/**\n * Polyfill for the optional chain operator, `?.`, given previous conversion of the expression into an array of values,\n * descriptors, and functions, in cases where the value of the expression is to be deleted.\n *\n * Adapted from Sucrase (https://github.com/alangpierce/sucrase) See\n * https://github.com/alangpierce/sucrase/blob/265887868966917f3b924ce38dfad01fbab1329f/src/transformers/OptionalChainingNullishTransformer.ts#L15\n *\n * @param ops Array result of expression conversion\n * @returns The return value of the `delete` operator: `true`, unless the deletion target is an own, non-configurable\n * property (one which can't be deleted or turned into an accessor, and whose enumerability can't be changed), in which\n * case `false`.\n */\nexport function _optionalChainDelete(ops: unknown[]): boolean {\n  const result = _optionalChain(ops) as boolean | null;\n  // If `result` is `null`, it means we didn't get to the end of the chain and so nothing was deleted (in which case,\n  // return `true` since that's what `delete` does when it no-ops). If it's non-null, we know the delete happened, in\n  // which case we return whatever the `delete` returned, which will be a boolean.\n  return result == null ? true : result;\n}\n\n// Sucrase version:\n// function _optionalChainDelete(ops) {\n//   const result = _optionalChain(ops);\n//   // by checking for loose equality to `null`, we catch both `null` and `undefined`\n//   return result == null ? true : result;\n// }\n","/**\n * Creates a cache that evicts keys in fifo order\n * @param size {Number}\n *\n * @deprecated This function is deprecated and will be removed in the next major version.\n */\nexport function makeFifoCache<Key extends string, Value>(\n  size: number,\n): {\n  get: (key: Key) => Value | undefined;\n  add: (key: Key, value: Value) => void;\n  delete: (key: Key) => boolean;\n  clear: () => void;\n  size: () => number;\n} {\n  // Maintain a fifo queue of keys, we cannot rely on Object.keys as the browser may not support it.\n  let evictionOrder: Key[] = [];\n  let cache: Record<string, Value> = {};\n\n  return {\n    add(key: Key, value: Value) {\n      while (evictionOrder.length >= size) {\n        // shift is O(n) but this is small size and only happens if we are\n        // exceeding the cache size so it should be fine.\n        const evictCandidate = evictionOrder.shift();\n\n        if (evictCandidate !== undefined) {\n          // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n          delete cache[evictCandidate];\n        }\n      }\n\n      // in case we have a collision, delete the old key.\n      if (cache[key]) {\n        this.delete(key);\n      }\n\n      evictionOrder.push(key);\n      cache[key] = value;\n    },\n    clear() {\n      cache = {};\n      evictionOrder = [];\n    },\n    get(key: Key): Value | undefined {\n      return cache[key];\n    },\n    size() {\n      return evictionOrder.length;\n    },\n    // Delete cache key and return true if it existed, false otherwise.\n    delete(key: Key): boolean {\n      if (!cache[key]) {\n        return false;\n      }\n\n      // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n      delete cache[key];\n\n      for (let i = 0; i < evictionOrder.length; i++) {\n        if (evictionOrder[i] === key) {\n          evictionOrder.splice(i, 1);\n          break;\n        }\n      }\n\n      return true;\n    },\n  };\n}\n","import type { ClientReport, ClientReportEnvelope, ClientReportItem } from '../types-hoist';\n\nimport { createEnvelope } from './envelope';\nimport { dateTimestampInSeconds } from './time';\n\n/**\n * Creates client report envelope\n * @param discarded_events An array of discard events\n * @param dsn A DSN that can be set on the header. Optional.\n */\nexport function createClientReportEnvelope(\n  discarded_events: ClientReport['discarded_events'],\n  dsn?: string,\n  timestamp?: number,\n): ClientReportEnvelope {\n  const clientReportItem: ClientReportItem = [\n    { type: 'client_report' },\n    {\n      timestamp: timestamp || dateTimestampInSeconds(),\n      discarded_events,\n    },\n  ];\n  return createEnvelope<ClientReportEnvelope>(dsn ? { dsn } : {}, [clientReportItem]);\n}\n","/**\n * This code was originally copied from the 'cookie` module at v0.5.0 and was simplified for our use case.\n * https://github.com/jshttp/cookie/blob/a0c84147aab6266bdb3996cf4062e93907c0b0fc/index.js\n * It had the following license:\n *\n * (The MIT License)\n *\n * Copyright (c) 2012-2014 Roman Shtylman <shtylman@gmail.com>\n * Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * 'Software'), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n/**\n * Parses a cookie string\n */\nexport function parseCookie(str: string): Record<string, string> {\n  const obj: Record<string, string> = {};\n  let index = 0;\n\n  while (index < str.length) {\n    const eqIdx = str.indexOf('=', index);\n\n    // no more cookie pairs\n    if (eqIdx === -1) {\n      break;\n    }\n\n    let endIdx = str.indexOf(';', index);\n\n    if (endIdx === -1) {\n      endIdx = str.length;\n    } else if (endIdx < eqIdx) {\n      // backtrack on prior semicolon\n      index = str.lastIndexOf(';', eqIdx - 1) + 1;\n      continue;\n    }\n\n    const key = str.slice(index, eqIdx).trim();\n\n    // only assign once\n    if (undefined === obj[key]) {\n      let val = str.slice(eqIdx + 1, endIdx).trim();\n\n      // quoted values\n      if (val.charCodeAt(0) === 0x22) {\n        val = val.slice(1, -1);\n      }\n\n      try {\n        obj[key] = val.indexOf('%') !== -1 ? decodeURIComponent(val) : val;\n      } catch (e) {\n        obj[key] = val;\n      }\n    }\n\n    index = endIdx + 1;\n  }\n\n  return obj;\n}\n","declare const __DEBUG_BUILD__: boolean;\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nexport const DEBUG_BUILD = __DEBUG_BUILD__;\n","import type { DebugImage, StackParser } from '../types-hoist';\nimport { GLOBAL_OBJ } from './worldwide';\n\ntype StackString = string;\ntype CachedResult = [string, string];\n\nlet parsedStackResults: Record<StackString, CachedResult> | undefined;\nlet lastKeysCount: number | undefined;\nlet cachedFilenameDebugIds: Record<string, string> | undefined;\n\n/**\n * Returns a map of filenames to debug identifiers.\n */\nexport function getFilenameToDebugIdMap(stackParser: StackParser): Record<string, string> {\n  const debugIdMap = GLOBAL_OBJ._sentryDebugIds;\n  if (!debugIdMap) {\n    return {};\n  }\n\n  const debugIdKeys = Object.keys(debugIdMap);\n\n  // If the count of registered globals hasn't changed since the last call, we\n  // can just return the cached result.\n  if (cachedFilenameDebugIds && debugIdKeys.length === lastKeysCount) {\n    return cachedFilenameDebugIds;\n  }\n\n  lastKeysCount = debugIdKeys.length;\n\n  // Build a map of filename -> debug_id.\n  cachedFilenameDebugIds = debugIdKeys.reduce<Record<string, string>>((acc, stackKey) => {\n    if (!parsedStackResults) {\n      parsedStackResults = {};\n    }\n\n    const result = parsedStackResults[stackKey];\n\n    if (result) {\n      acc[result[0]] = result[1];\n    } else {\n      const parsedStack = stackParser(stackKey);\n\n      for (let i = parsedStack.length - 1; i >= 0; i--) {\n        const stackFrame = parsedStack[i];\n        const filename = stackFrame && stackFrame.filename;\n        const debugId = debugIdMap[stackKey];\n\n        if (filename && debugId) {\n          acc[filename] = debugId;\n          parsedStackResults[stackKey] = [filename, debugId];\n          break;\n        }\n      }\n    }\n\n    return acc;\n  }, {});\n\n  return cachedFilenameDebugIds;\n}\n\n/**\n * Returns a list of debug images for the given resources.\n */\nexport function getDebugImagesForResources(\n  stackParser: StackParser,\n  resource_paths: ReadonlyArray<string>,\n): DebugImage[] {\n  const filenameDebugIdMap = getFilenameToDebugIdMap(stackParser);\n\n  if (!filenameDebugIdMap) {\n    return [];\n  }\n\n  const images: DebugImage[] = [];\n  for (const path of resource_paths) {\n    if (path && filenameDebugIdMap[path]) {\n      images.push({\n        type: 'sourcemap',\n        code_file: path,\n        debug_id: filenameDebugIdMap[path] as string,\n      });\n    }\n  }\n\n  return images;\n}\n","import type { DsnComponents, DsnLike, DsnProtocol } from '../types-hoist';\n\nimport { DEBUG_BUILD } from './debug-build';\nimport { consoleSandbox, logger } from './logger';\n\n/** Regular expression used to parse a Dsn. */\nconst DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+)?)?@)([\\w.-]+)(?::(\\d+))?\\/(.+)/;\n\nfunction isValidProtocol(protocol?: string): protocol is DsnProtocol {\n  return protocol === 'http' || protocol === 'https';\n}\n\n/**\n * Renders the string representation of this Dsn.\n *\n * By default, this will render the public representation without the password\n * component. To get the deprecated private representation, set `withPassword`\n * to true.\n *\n * @param withPassword When set to true, the password will be included.\n */\nexport function dsnToString(dsn: DsnComponents, withPassword: boolean = false): string {\n  const { host, path, pass, port, projectId, protocol, publicKey } = dsn;\n  return (\n    `${protocol}://${publicKey}${withPassword && pass ? `:${pass}` : ''}` +\n    `@${host}${port ? `:${port}` : ''}/${path ? `${path}/` : path}${projectId}`\n  );\n}\n\n/**\n * Parses a Dsn from a given string.\n *\n * @param str A Dsn as string\n * @returns Dsn as DsnComponents or undefined if @param str is not a valid DSN string\n */\nexport function dsnFromString(str: string): DsnComponents | undefined {\n  const match = DSN_REGEX.exec(str);\n\n  if (!match) {\n    // This should be logged to the console\n    consoleSandbox(() => {\n      // eslint-disable-next-line no-console\n      console.error(`Invalid Sentry Dsn: ${str}`);\n    });\n    return undefined;\n  }\n\n  const [protocol, publicKey, pass = '', host = '', port = '', lastPath = ''] = match.slice(1);\n  let path = '';\n  let projectId = lastPath;\n\n  const split = projectId.split('/');\n  if (split.length > 1) {\n    path = split.slice(0, -1).join('/');\n    projectId = split.pop() as string;\n  }\n\n  if (projectId) {\n    const projectMatch = projectId.match(/^\\d+/);\n    if (projectMatch) {\n      projectId = projectMatch[0];\n    }\n  }\n\n  return dsnFromComponents({ host, pass, path, projectId, port, protocol: protocol as DsnProtocol, publicKey });\n}\n\nfunction dsnFromComponents(components: DsnComponents): DsnComponents {\n  return {\n    protocol: components.protocol,\n    publicKey: components.publicKey || '',\n    pass: components.pass || '',\n    host: components.host,\n    port: components.port || '',\n    path: components.path || '',\n    projectId: components.projectId,\n  };\n}\n\nfunction validateDsn(dsn: DsnComponents): boolean {\n  if (!DEBUG_BUILD) {\n    return true;\n  }\n\n  const { port, projectId, protocol } = dsn;\n\n  const requiredComponents: ReadonlyArray<keyof DsnComponents> = ['protocol', 'publicKey', 'host', 'projectId'];\n  const hasMissingRequiredComponent = requiredComponents.find(component => {\n    if (!dsn[component]) {\n      logger.error(`Invalid Sentry Dsn: ${component} missing`);\n      return true;\n    }\n    return false;\n  });\n\n  if (hasMissingRequiredComponent) {\n    return false;\n  }\n\n  if (!projectId.match(/^\\d+$/)) {\n    logger.error(`Invalid Sentry Dsn: Invalid projectId ${projectId}`);\n    return false;\n  }\n\n  if (!isValidProtocol(protocol)) {\n    logger.error(`Invalid Sentry Dsn: Invalid protocol ${protocol}`);\n    return false;\n  }\n\n  if (port && isNaN(parseInt(port, 10))) {\n    logger.error(`Invalid Sentry Dsn: Invalid port ${port}`);\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Creates a valid Sentry Dsn object, identifying a Sentry instance and project.\n * @returns a valid DsnComponents object or `undefined` if @param from is an invalid DSN source\n */\nexport function makeDsn(from: DsnLike): DsnComponents | undefined {\n  const components = typeof from === 'string' ? dsnFromString(from) : dsnFromComponents(from);\n  if (!components || !validateDsn(components)) {\n    return undefined;\n  }\n  return components;\n}\n","/*\n * This module exists for optimizations in the build process through rollup and terser.  We define some global\n * constants, which can be overridden during build. By guarding certain pieces of code with functions that return these\n * constants, we can control whether or not they appear in the final bundle. (Any code guarded by a false condition will\n * never run, and will hence be dropped during treeshaking.) The two primary uses for this are stripping out calls to\n * `logger` and preventing node-related code from appearing in browser bundles.\n *\n * Attention:\n * This file should not be used to define constants/flags that are intended to be used for tree-shaking conducted by\n * users. These flags should live in their respective packages, as we identified user tooling (specifically webpack)\n * having issues tree-shaking these constants across package boundaries.\n * An example for this is the __SENTRY_DEBUG__ constant. It is declared in each package individually because we want\n * users to be able to shake away expressions that it guards.\n */\n\ndeclare const __SENTRY_BROWSER_BUNDLE__: boolean | undefined;\n\nexport type SdkSource = 'npm' | 'cdn' | 'loader';\n\n/**\n * Figures out if we're building a browser bundle.\n *\n * @returns true if this is a browser bundle build.\n */\nexport function isBrowserBundle(): boolean {\n  return typeof __SENTRY_BROWSER_BUNDLE__ !== 'undefined' && !!__SENTRY_BROWSER_BUNDLE__;\n}\n\n/**\n * Get source of SDK.\n */\nexport function getSDKSource(): SdkSource {\n  // This comment is used to identify this line in the CDN bundle build step and replace this with \"return 'cdn';\"\n  /* __SENTRY_SDK_SOURCE__ */ return 'npm';\n}\n","import type {\n  Attachment,\n  AttachmentItem,\n  BaseEnvelopeHeaders,\n  BaseEnvelopeItemHeaders,\n  DataCategory,\n  DsnComponents,\n  Envelope,\n  EnvelopeItemType,\n  Event,\n  EventEnvelopeHeaders,\n  SdkInfo,\n  SdkMetadata,\n  SpanItem,\n  SpanJSON,\n} from '../types-hoist';\n\nimport { dsnToString } from './dsn';\nimport { normalize } from './normalize';\nimport { dropUndefinedKeys } from './object';\nimport { GLOBAL_OBJ } from './worldwide';\n\n/**\n * Creates an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function createEnvelope<E extends Envelope>(headers: E[0], items: E[1] = []): E {\n  return [headers, items] as E;\n}\n\n/**\n * Add an item to an envelope.\n * Make sure to always explicitly provide the generic to this function\n * so that the envelope types resolve correctly.\n */\nexport function addItemToEnvelope<E extends Envelope>(envelope: E, newItem: E[1][number]): E {\n  const [headers, items] = envelope;\n  return [headers, [...items, newItem]] as unknown as E;\n}\n\n/**\n * Convenience function to loop through the items and item types of an envelope.\n * (This function was mostly created because working with envelope types is painful at the moment)\n *\n * If the callback returns true, the rest of the items will be skipped.\n */\nexport function forEachEnvelopeItem<E extends Envelope>(\n  envelope: Envelope,\n  callback: (envelopeItem: E[1][number], envelopeItemType: E[1][number][0]['type']) => boolean | void,\n): boolean {\n  const envelopeItems = envelope[1];\n\n  for (const envelopeItem of envelopeItems) {\n    const envelopeItemType = envelopeItem[0].type;\n    const result = callback(envelopeItem, envelopeItemType);\n\n    if (result) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n/**\n * Returns true if the envelope contains any of the given envelope item types\n */\nexport function envelopeContainsItemType(envelope: Envelope, types: EnvelopeItemType[]): boolean {\n  return forEachEnvelopeItem(envelope, (_, type) => types.includes(type));\n}\n\n/**\n * Encode a string to UTF8 array.\n */\nfunction encodeUTF8(input: string): Uint8Array {\n  return GLOBAL_OBJ.__SENTRY__ && GLOBAL_OBJ.__SENTRY__.encodePolyfill\n    ? GLOBAL_OBJ.__SENTRY__.encodePolyfill(input)\n    : new TextEncoder().encode(input);\n}\n\n/**\n * Decode a UTF8 array to string.\n */\nfunction decodeUTF8(input: Uint8Array): string {\n  return GLOBAL_OBJ.__SENTRY__ && GLOBAL_OBJ.__SENTRY__.decodePolyfill\n    ? GLOBAL_OBJ.__SENTRY__.decodePolyfill(input)\n    : new TextDecoder().decode(input);\n}\n\n/**\n * Serializes an envelope.\n */\nexport function serializeEnvelope(envelope: Envelope): string | Uint8Array {\n  const [envHeaders, items] = envelope;\n\n  // Initially we construct our envelope as a string and only convert to binary chunks if we encounter binary data\n  let parts: string | Uint8Array[] = JSON.stringify(envHeaders);\n\n  function append(next: string | Uint8Array): void {\n    if (typeof parts === 'string') {\n      parts = typeof next === 'string' ? parts + next : [encodeUTF8(parts), next];\n    } else {\n      parts.push(typeof next === 'string' ? encodeUTF8(next) : next);\n    }\n  }\n\n  for (const item of items) {\n    const [itemHeaders, payload] = item;\n\n    append(`\\n${JSON.stringify(itemHeaders)}\\n`);\n\n    if (typeof payload === 'string' || payload instanceof Uint8Array) {\n      append(payload);\n    } else {\n      let stringifiedPayload: string;\n      try {\n        stringifiedPayload = JSON.stringify(payload);\n      } catch (e) {\n        // In case, despite all our efforts to keep `payload` circular-dependency-free, `JSON.stringify()` still\n        // fails, we try again after normalizing it again with infinite normalization depth. This of course has a\n        // performance impact but in this case a performance hit is better than throwing.\n        stringifiedPayload = JSON.stringify(normalize(payload));\n      }\n      append(stringifiedPayload);\n    }\n  }\n\n  return typeof parts === 'string' ? parts : concatBuffers(parts);\n}\n\nfunction concatBuffers(buffers: Uint8Array[]): Uint8Array {\n  const totalLength = buffers.reduce((acc, buf) => acc + buf.length, 0);\n\n  const merged = new Uint8Array(totalLength);\n  let offset = 0;\n  for (const buffer of buffers) {\n    merged.set(buffer, offset);\n    offset += buffer.length;\n  }\n\n  return merged;\n}\n\n/**\n * Parses an envelope\n */\nexport function parseEnvelope(env: string | Uint8Array): Envelope {\n  let buffer = typeof env === 'string' ? encodeUTF8(env) : env;\n\n  function readBinary(length: number): Uint8Array {\n    const bin = buffer.subarray(0, length);\n    // Replace the buffer with the remaining data excluding trailing newline\n    buffer = buffer.subarray(length + 1);\n    return bin;\n  }\n\n  function readJson<T>(): T {\n    let i = buffer.indexOf(0xa);\n    // If we couldn't find a newline, we must have found the end of the buffer\n    if (i < 0) {\n      i = buffer.length;\n    }\n\n    return JSON.parse(decodeUTF8(readBinary(i))) as T;\n  }\n\n  const envelopeHeader = readJson<BaseEnvelopeHeaders>();\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const items: [any, any][] = [];\n\n  while (buffer.length) {\n    const itemHeader = readJson<BaseEnvelopeItemHeaders>();\n    const binaryLength = typeof itemHeader.length === 'number' ? itemHeader.length : undefined;\n\n    items.push([itemHeader, binaryLength ? readBinary(binaryLength) : readJson()]);\n  }\n\n  return [envelopeHeader, items];\n}\n\n/**\n * Creates envelope item for a single span\n */\nexport function createSpanEnvelopeItem(spanJson: Partial<SpanJSON>): SpanItem {\n  const spanHeaders: SpanItem[0] = {\n    type: 'span',\n  };\n\n  return [spanHeaders, spanJson];\n}\n\n/**\n * Creates attachment envelope items\n */\nexport function createAttachmentEnvelopeItem(attachment: Attachment): AttachmentItem {\n  const buffer = typeof attachment.data === 'string' ? encodeUTF8(attachment.data) : attachment.data;\n\n  return [\n    dropUndefinedKeys({\n      type: 'attachment',\n      length: buffer.length,\n      filename: attachment.filename,\n      content_type: attachment.contentType,\n      attachment_type: attachment.attachmentType,\n    }),\n    buffer,\n  ];\n}\n\nconst ITEM_TYPE_TO_DATA_CATEGORY_MAP: Record<EnvelopeItemType, DataCategory> = {\n  session: 'session',\n  sessions: 'session',\n  attachment: 'attachment',\n  transaction: 'transaction',\n  event: 'error',\n  client_report: 'internal',\n  user_report: 'default',\n  profile: 'profile',\n  profile_chunk: 'profile',\n  replay_event: 'replay',\n  replay_recording: 'replay',\n  check_in: 'monitor',\n  feedback: 'feedback',\n  span: 'span',\n  statsd: 'metric_bucket',\n  raw_security: 'security',\n};\n\n/**\n * Maps the type of an envelope item to a data category.\n */\nexport function envelopeItemTypeToDataCategory(type: EnvelopeItemType): DataCategory {\n  return ITEM_TYPE_TO_DATA_CATEGORY_MAP[type];\n}\n\n/** Extracts the minimal SDK info from the metadata or an events */\nexport function getSdkMetadataForEnvelopeHeader(metadataOrEvent?: SdkMetadata | Event): SdkInfo | undefined {\n  if (!metadataOrEvent || !metadataOrEvent.sdk) {\n    return;\n  }\n  const { name, version } = metadataOrEvent.sdk;\n  return { name, version };\n}\n\n/**\n * Creates event envelope headers, based on event, sdk info and tunnel\n * Note: This function was extracted from the core package to make it available in Replay\n */\nexport function createEventEnvelopeHeaders(\n  event: Event,\n  sdkInfo: SdkInfo | undefined,\n  tunnel: string | undefined,\n  dsn?: DsnComponents,\n): EventEnvelopeHeaders {\n  const dynamicSamplingContext = event.sdkProcessingMetadata && event.sdkProcessingMetadata.dynamicSamplingContext;\n  return {\n    event_id: event.event_id as string,\n    sent_at: new Date().toISOString(),\n    ...(sdkInfo && { sdk: sdkInfo }),\n    ...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),\n    ...(dynamicSamplingContext && {\n      trace: dropUndefinedKeys({ ...dynamicSamplingContext }),\n    }),\n  };\n}\n","import type { ConsoleLevel } from '../types-hoist';\n\n/** An error emitted by Sentry SDKs and related utilities. */\nexport class SentryError extends Error {\n  /** Display name of this error instance. */\n  public name: string;\n\n  public logLevel: ConsoleLevel;\n\n  public constructor(\n    public message: string,\n    logLevel: ConsoleLevel = 'warn',\n  ) {\n    super(message);\n\n    this.name = new.target.prototype.constructor.name;\n    // This sets the prototype to be `Error`, not `SentryError`. It's unclear why we do this, but commenting this line\n    // out causes various (seemingly totally unrelated) playwright tests consistently time out. FYI, this makes\n    // instances of `SentryError` fail `obj instanceof SentryError` checks.\n    Object.setPrototypeOf(this, new.target.prototype);\n    this.logLevel = logLevel;\n  }\n}\n","import type {\n  Client,\n  Event,\n  EventHint,\n  Exception,\n  Extras,\n  Mechanism,\n  ParameterizedString,\n  SeverityLevel,\n  StackFrame,\n  StackParser,\n} from '../types-hoist';\n\nimport { isError, isErrorEvent, isParameterizedString, isPlainObject } from './is';\nimport { addExceptionMechanism, addExceptionTypeValue } from './misc';\nimport { normalizeToSize } from './normalize';\nimport { extractExceptionKeysForMessage } from './object';\n\n/**\n * Extracts stack frames from the error.stack string\n */\nexport function parseStackFrames(stackParser: StackParser, error: Error): StackFrame[] {\n  return stackParser(error.stack || '', 1);\n}\n\n/**\n * Extracts stack frames from the error and builds a Sentry Exception\n */\nexport function exceptionFromError(stackParser: StackParser, error: Error): Exception {\n  const exception: Exception = {\n    type: error.name || error.constructor.name,\n    value: error.message,\n  };\n\n  const frames = parseStackFrames(stackParser, error);\n  if (frames.length) {\n    exception.stacktrace = { frames };\n  }\n\n  return exception;\n}\n\n/** If a plain object has a property that is an `Error`, return this error. */\nfunction getErrorPropertyFromObject(obj: Record<string, unknown>): Error | undefined {\n  for (const prop in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n      const value = obj[prop];\n      if (value instanceof Error) {\n        return value;\n      }\n    }\n  }\n\n  return undefined;\n}\n\nfunction getMessageForObject(exception: Record<string, unknown>): string {\n  if ('name' in exception && typeof exception.name === 'string') {\n    let message = `'${exception.name}' captured as exception`;\n\n    if ('message' in exception && typeof exception.message === 'string') {\n      message += ` with message '${exception.message}'`;\n    }\n\n    return message;\n  } else if ('message' in exception && typeof exception.message === 'string') {\n    return exception.message;\n  }\n\n  const keys = extractExceptionKeysForMessage(exception);\n\n  // Some ErrorEvent instances do not have an `error` property, which is why they are not handled before\n  // We still want to try to get a decent message for these cases\n  if (isErrorEvent(exception)) {\n    return `Event \\`ErrorEvent\\` captured as exception with message \\`${exception.message}\\``;\n  }\n\n  const className = getObjectClassName(exception);\n\n  return `${\n    className && className !== 'Object' ? `'${className}'` : 'Object'\n  } captured as exception with keys: ${keys}`;\n}\n\nfunction getObjectClassName(obj: unknown): string | undefined | void {\n  try {\n    const prototype: unknown | null = Object.getPrototypeOf(obj);\n    return prototype ? prototype.constructor.name : undefined;\n  } catch (e) {\n    // ignore errors here\n  }\n}\n\nfunction getException(\n  client: Client,\n  mechanism: Mechanism,\n  exception: unknown,\n  hint?: EventHint,\n): [Error, Extras | undefined] {\n  if (isError(exception)) {\n    return [exception, undefined];\n  }\n\n  // Mutate this!\n  mechanism.synthetic = true;\n\n  if (isPlainObject(exception)) {\n    const normalizeDepth = client && client.getOptions().normalizeDepth;\n    const extras = { ['__serialized__']: normalizeToSize(exception as Record<string, unknown>, normalizeDepth) };\n\n    const errorFromProp = getErrorPropertyFromObject(exception);\n    if (errorFromProp) {\n      return [errorFromProp, extras];\n    }\n\n    const message = getMessageForObject(exception);\n    const ex = (hint && hint.syntheticException) || new Error(message);\n    ex.message = message;\n\n    return [ex, extras];\n  }\n\n  // This handles when someone does: `throw \"something awesome\";`\n  // We use synthesized Error here so we can extract a (rough) stack trace.\n  const ex = (hint && hint.syntheticException) || new Error(exception as string);\n  ex.message = `${exception}`;\n\n  return [ex, undefined];\n}\n\n/**\n * Builds and Event from a Exception\n * @hidden\n */\nexport function eventFromUnknownInput(\n  client: Client,\n  stackParser: StackParser,\n  exception: unknown,\n  hint?: EventHint,\n): Event {\n  const providedMechanism: Mechanism | undefined =\n    hint && hint.data && (hint.data as { mechanism: Mechanism }).mechanism;\n  const mechanism: Mechanism = providedMechanism || {\n    handled: true,\n    type: 'generic',\n  };\n\n  const [ex, extras] = getException(client, mechanism, exception, hint);\n\n  const event: Event = {\n    exception: {\n      values: [exceptionFromError(stackParser, ex)],\n    },\n  };\n\n  if (extras) {\n    event.extra = extras;\n  }\n\n  addExceptionTypeValue(event, undefined, undefined);\n  addExceptionMechanism(event, mechanism);\n\n  return {\n    ...event,\n    event_id: hint && hint.event_id,\n  };\n}\n\n/**\n * Builds and Event from a Message\n * @hidden\n */\nexport function eventFromMessage(\n  stackParser: StackParser,\n  message: ParameterizedString,\n  level: SeverityLevel = 'info',\n  hint?: EventHint,\n  attachStacktrace?: boolean,\n): Event {\n  const event: Event = {\n    event_id: hint && hint.event_id,\n    level,\n  };\n\n  if (attachStacktrace && hint && hint.syntheticException) {\n    const frames = parseStackFrames(stackParser, hint.syntheticException);\n    if (frames.length) {\n      event.exception = {\n        values: [\n          {\n            value: message,\n            stacktrace: { frames },\n          },\n        ],\n      };\n      addExceptionMechanism(event, { synthetic: true });\n    }\n  }\n\n  if (isParameterizedString(message)) {\n    const { __sentry_template_string__, __sentry_template_values__ } = message;\n\n    event.logentry = {\n      message: __sentry_template_string__,\n      params: __sentry_template_values__,\n    };\n    return event;\n  }\n\n  event.message = message;\n  return event;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/ban-types */\nimport type { ConsoleLevel, HandlerDataConsole } from '../../types-hoist';\n\nimport { CONSOLE_LEVELS, originalConsoleMethods } from '../logger';\nimport { fill } from '../object';\nimport { GLOBAL_OBJ } from '../worldwide';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers';\n\n/**\n * Add an instrumentation handler for when a console.xxx method is called.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addConsoleInstrumentationHandler(handler: (data: HandlerDataConsole) => void): void {\n  const type = 'console';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentConsole);\n}\n\nfunction instrumentConsole(): void {\n  if (!('console' in GLOBAL_OBJ)) {\n    return;\n  }\n\n  CONSOLE_LEVELS.forEach(function (level: ConsoleLevel): void {\n    if (!(level in GLOBAL_OBJ.console)) {\n      return;\n    }\n\n    fill(GLOBAL_OBJ.console, level, function (originalConsoleMethod: () => any): Function {\n      originalConsoleMethods[level] = originalConsoleMethod;\n\n      return function (...args: any[]): void {\n        const handlerData: HandlerDataConsole = { args, level };\n        triggerHandlers('console', handlerData);\n\n        const log = originalConsoleMethods[level];\n        log && log.apply(GLOBAL_OBJ.console, args);\n      };\n    });\n  });\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { HandlerDataFetch } from '../../types-hoist';\n\nimport { isError } from '../is';\nimport { addNonEnumerableProperty, fill } from '../object';\nimport { supportsNativeFetch } from '../supports';\nimport { timestampInSeconds } from '../time';\nimport { GLOBAL_OBJ } from '../worldwide';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers';\n\ntype FetchResource = string | { toString(): string } | { url: string };\n\n/**\n * Add an instrumentation handler for when a fetch request happens.\n * The handler function is called once when the request starts and once when it ends,\n * which can be identified by checking if it has an `endTimestamp`.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addFetchInstrumentationHandler(\n  handler: (data: HandlerDataFetch) => void,\n  skipNativeFetchCheck?: boolean,\n): void {\n  const type = 'fetch';\n  addHandler(type, handler);\n  maybeInstrument(type, () => instrumentFetch(undefined, skipNativeFetchCheck));\n}\n\n/**\n * Add an instrumentation handler for long-lived fetch requests, like consuming server-sent events (SSE) via fetch.\n * The handler will resolve the request body and emit the actual `endTimestamp`, so that the\n * span can be updated accordingly.\n *\n * Only used internally\n * @hidden\n */\nexport function addFetchEndInstrumentationHandler(handler: (data: HandlerDataFetch) => void): void {\n  const type = 'fetch-body-resolved';\n  addHandler(type, handler);\n  maybeInstrument(type, () => instrumentFetch(streamHandler));\n}\n\nfunction instrumentFetch(onFetchResolved?: (response: Response) => void, skipNativeFetchCheck: boolean = false): void {\n  if (skipNativeFetchCheck && !supportsNativeFetch()) {\n    return;\n  }\n\n  fill(GLOBAL_OBJ, 'fetch', function (originalFetch: () => void): () => void {\n    return function (...args: any[]): void {\n      // We capture the error right here and not in the Promise error callback because Safari (and probably other\n      // browsers too) will wipe the stack trace up to this point, only leaving us with this file which is useless.\n\n      // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n      //       it means the error, that was caused by your fetch call did not\n      //       have a stack trace, so the SDK backfilled the stack trace so\n      //       you can see which fetch call failed.\n      const virtualError = new Error();\n\n      const { method, url } = parseFetchArgs(args);\n      const handlerData: HandlerDataFetch = {\n        args,\n        fetchData: {\n          method,\n          url,\n        },\n        startTimestamp: timestampInSeconds() * 1000,\n        // // Adding the error to be able to fingerprint the failed fetch event in HttpClient instrumentation\n        virtualError,\n      };\n\n      // if there is no callback, fetch is instrumented directly\n      if (!onFetchResolved) {\n        triggerHandlers('fetch', {\n          ...handlerData,\n        });\n      }\n\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n      return originalFetch.apply(GLOBAL_OBJ, args).then(\n        async (response: Response) => {\n          if (onFetchResolved) {\n            onFetchResolved(response);\n          } else {\n            triggerHandlers('fetch', {\n              ...handlerData,\n              endTimestamp: timestampInSeconds() * 1000,\n              response,\n            });\n          }\n\n          return response;\n        },\n        (error: Error) => {\n          triggerHandlers('fetch', {\n            ...handlerData,\n            endTimestamp: timestampInSeconds() * 1000,\n            error,\n          });\n\n          if (isError(error) && error.stack === undefined) {\n            // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n            //       it means the error, that was caused by your fetch call did not\n            //       have a stack trace, so the SDK backfilled the stack trace so\n            //       you can see which fetch call failed.\n            error.stack = virtualError.stack;\n            addNonEnumerableProperty(error, 'framesToPop', 1);\n          }\n\n          // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n          //       it means the sentry.javascript SDK caught an error invoking your application code.\n          //       This is expected behavior and NOT indicative of a bug with sentry.javascript.\n          throw error;\n        },\n      );\n    };\n  });\n}\n\nasync function resolveResponse(res: Response | undefined, onFinishedResolving: () => void): Promise<void> {\n  if (res && res.body) {\n    const body = res.body;\n    const responseReader = body.getReader();\n\n    // Define a maximum duration after which we just cancel\n    const maxFetchDurationTimeout = setTimeout(\n      () => {\n        body.cancel().then(null, () => {\n          // noop\n        });\n      },\n      90 * 1000, // 90s\n    );\n\n    let readingActive = true;\n    while (readingActive) {\n      let chunkTimeout;\n      try {\n        // abort reading if read op takes more than 5s\n        chunkTimeout = setTimeout(() => {\n          body.cancel().then(null, () => {\n            // noop on error\n          });\n        }, 5000);\n\n        // This .read() call will reject/throw when we abort due to timeouts through `body.cancel()`\n        const { done } = await responseReader.read();\n\n        clearTimeout(chunkTimeout);\n\n        if (done) {\n          onFinishedResolving();\n          readingActive = false;\n        }\n      } catch (error) {\n        readingActive = false;\n      } finally {\n        clearTimeout(chunkTimeout);\n      }\n    }\n\n    clearTimeout(maxFetchDurationTimeout);\n\n    responseReader.releaseLock();\n    body.cancel().then(null, () => {\n      // noop on error\n    });\n  }\n}\n\nfunction streamHandler(response: Response): void {\n  // clone response for awaiting stream\n  let clonedResponseForResolving: Response;\n  try {\n    clonedResponseForResolving = response.clone();\n  } catch {\n    return;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-floating-promises\n  resolveResponse(clonedResponseForResolving, () => {\n    triggerHandlers('fetch-body-resolved', {\n      endTimestamp: timestampInSeconds() * 1000,\n      response,\n    });\n  });\n}\n\nfunction hasProp<T extends string>(obj: unknown, prop: T): obj is Record<string, string> {\n  return !!obj && typeof obj === 'object' && !!(obj as Record<string, string>)[prop];\n}\n\nfunction getUrlFromResource(resource: FetchResource): string {\n  if (typeof resource === 'string') {\n    return resource;\n  }\n\n  if (!resource) {\n    return '';\n  }\n\n  if (hasProp(resource, 'url')) {\n    return resource.url;\n  }\n\n  if (resource.toString) {\n    return resource.toString();\n  }\n\n  return '';\n}\n\n/**\n * Parses the fetch arguments to find the used Http method and the url of the request.\n * Exported for tests only.\n */\nexport function parseFetchArgs(fetchArgs: unknown[]): { method: string; url: string } {\n  if (fetchArgs.length === 0) {\n    return { method: 'GET', url: '' };\n  }\n\n  if (fetchArgs.length === 2) {\n    const [url, options] = fetchArgs as [FetchResource, object];\n\n    return {\n      url: getUrlFromResource(url),\n      method: hasProp(options, 'method') ? String(options.method).toUpperCase() : 'GET',\n    };\n  }\n\n  const arg = fetchArgs[0];\n  return {\n    url: getUrlFromResource(arg as FetchResource),\n    method: hasProp(arg, 'method') ? String(arg.method).toUpperCase() : 'GET',\n  };\n}\n","import type { HandlerDataError } from '../../types-hoist';\n\nimport { GLOBAL_OBJ } from '../worldwide';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers';\n\nlet _oldOnErrorHandler: (typeof GLOBAL_OBJ)['onerror'] | null = null;\n\n/**\n * Add an instrumentation handler for when an error is captured by the global error handler.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addGlobalErrorInstrumentationHandler(handler: (data: HandlerDataError) => void): void {\n  const type = 'error';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentError);\n}\n\nfunction instrumentError(): void {\n  _oldOnErrorHandler = GLOBAL_OBJ.onerror;\n\n  // Note: The reason we are doing window.onerror instead of window.addEventListener('error')\n  // is that we are using this handler in the Loader Script, to handle buffered errors consistently\n  GLOBAL_OBJ.onerror = function (\n    msg: string | object,\n    url?: string,\n    line?: number,\n    column?: number,\n    error?: Error,\n  ): boolean {\n    const handlerData: HandlerDataError = {\n      column,\n      error,\n      line,\n      msg,\n      url,\n    };\n    triggerHandlers('error', handlerData);\n\n    if (_oldOnErrorHandler) {\n      // eslint-disable-next-line prefer-rest-params\n      return _oldOnErrorHandler.apply(this, arguments);\n    }\n\n    return false;\n  };\n\n  GLOBAL_OBJ.onerror.__SENTRY_INSTRUMENTED__ = true;\n}\n","import type { HandlerDataUnhandledRejection } from '../../types-hoist';\nimport { GLOBAL_OBJ } from '../worldwide';\nimport { addHandler, maybeInstrument, triggerHandlers } from './handlers';\n\nlet _oldOnUnhandledRejectionHandler: (typeof GLOBAL_OBJ)['onunhandledrejection'] | null = null;\n\n/**\n * Add an instrumentation handler for when an unhandled promise rejection is captured.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addGlobalUnhandledRejectionInstrumentationHandler(\n  handler: (data: HandlerDataUnhandledRejection) => void,\n): void {\n  const type = 'unhandledrejection';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentUnhandledRejection);\n}\n\nfunction instrumentUnhandledRejection(): void {\n  _oldOnUnhandledRejectionHandler = GLOBAL_OBJ.onunhandledrejection;\n\n  // Note: The reason we are doing window.onunhandledrejection instead of window.addEventListener('unhandledrejection')\n  // is that we are using this handler in the Loader Script, to handle buffered rejections consistently\n  GLOBAL_OBJ.onunhandledrejection = function (e: unknown): boolean {\n    const handlerData: HandlerDataUnhandledRejection = e;\n    triggerHandlers('unhandledrejection', handlerData);\n\n    if (_oldOnUnhandledRejectionHandler) {\n      // eslint-disable-next-line prefer-rest-params\n      return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n    }\n\n    return true;\n  };\n\n  GLOBAL_OBJ.onunhandledrejection.__SENTRY_INSTRUMENTED__ = true;\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport { logger } from '../logger';\nimport { getFunctionName } from '../stacktrace';\n\nexport type InstrumentHandlerType =\n  | 'console'\n  | 'dom'\n  | 'fetch'\n  | 'fetch-body-resolved'\n  | 'history'\n  | 'xhr'\n  | 'error'\n  | 'unhandledrejection';\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type InstrumentHandlerCallback = (data: any) => void;\n\n// We keep the handlers globally\nconst handlers: { [key in InstrumentHandlerType]?: InstrumentHandlerCallback[] } = {};\nconst instrumented: { [key in InstrumentHandlerType]?: boolean } = {};\n\n/** Add a handler function. */\nexport function addHandler(type: InstrumentHandlerType, handler: InstrumentHandlerCallback): void {\n  handlers[type] = handlers[type] || [];\n  (handlers[type] as InstrumentHandlerCallback[]).push(handler);\n}\n\n/**\n * Reset all instrumentation handlers.\n * This can be used by tests to ensure we have a clean slate of instrumentation handlers.\n */\nexport function resetInstrumentationHandlers(): void {\n  Object.keys(handlers).forEach(key => {\n    handlers[key as InstrumentHandlerType] = undefined;\n  });\n}\n\n/** Maybe run an instrumentation function, unless it was already called. */\nexport function maybeInstrument(type: InstrumentHandlerType, instrumentFn: () => void): void {\n  if (!instrumented[type]) {\n    instrumented[type] = true;\n    try {\n      instrumentFn();\n    } catch (e) {\n      DEBUG_BUILD && logger.error(`Error while instrumenting ${type}`, e);\n    }\n  }\n}\n\n/** Trigger handlers for a given instrumentation type. */\nexport function triggerHandlers(type: InstrumentHandlerType, data: unknown): void {\n  const typeHandlers = type && handlers[type];\n  if (!typeHandlers) {\n    return;\n  }\n\n  for (const handler of typeHandlers) {\n    try {\n      handler(data);\n    } catch (e) {\n      DEBUG_BUILD &&\n        logger.error(\n          `Error while triggering instrumentation handler.\\nType: ${type}\\nName: ${getFunctionName(handler)}\\nError:`,\n          e,\n        );\n    }\n  }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { ParameterizedString, PolymorphicEvent, Primitive } from '../types-hoist';\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst objectToString = Object.prototype.toString;\n\n/**\n * Checks whether given value's type is one of a few Error or Error-like\n * {@link isError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isError(wat: unknown): wat is Error {\n  switch (objectToString.call(wat)) {\n    case '[object Error]':\n    case '[object Exception]':\n    case '[object DOMException]':\n    case '[object WebAssembly.Exception]':\n      return true;\n    default:\n      return isInstanceOf(wat, Error);\n  }\n}\n/**\n * Checks whether given value is an instance of the given built-in class.\n *\n * @param wat The value to be checked\n * @param className\n * @returns A boolean representing the result.\n */\nfunction isBuiltin(wat: unknown, className: string): boolean {\n  return objectToString.call(wat) === `[object ${className}]`;\n}\n\n/**\n * Checks whether given value's type is ErrorEvent\n * {@link isErrorEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isErrorEvent(wat: unknown): boolean {\n  return isBuiltin(wat, 'ErrorEvent');\n}\n\n/**\n * Checks whether given value's type is DOMError\n * {@link isDOMError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMError(wat: unknown): boolean {\n  return isBuiltin(wat, 'DOMError');\n}\n\n/**\n * Checks whether given value's type is DOMException\n * {@link isDOMException}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMException(wat: unknown): boolean {\n  return isBuiltin(wat, 'DOMException');\n}\n\n/**\n * Checks whether given value's type is a string\n * {@link isString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isString(wat: unknown): wat is string {\n  return isBuiltin(wat, 'String');\n}\n\n/**\n * Checks whether given string is parameterized\n * {@link isParameterizedString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isParameterizedString(wat: unknown): wat is ParameterizedString {\n  return (\n    typeof wat === 'object' &&\n    wat !== null &&\n    '__sentry_template_string__' in wat &&\n    '__sentry_template_values__' in wat\n  );\n}\n\n/**\n * Checks whether given value is a primitive (undefined, null, number, boolean, string, bigint, symbol)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPrimitive(wat: unknown): wat is Primitive {\n  return wat === null || isParameterizedString(wat) || (typeof wat !== 'object' && typeof wat !== 'function');\n}\n\n/**\n * Checks whether given value's type is an object literal, or a class instance.\n * {@link isPlainObject}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPlainObject(wat: unknown): wat is Record<string, unknown> {\n  return isBuiltin(wat, 'Object');\n}\n\n/**\n * Checks whether given value's type is an Event instance\n * {@link isEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isEvent(wat: unknown): wat is PolymorphicEvent {\n  return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n}\n\n/**\n * Checks whether given value's type is an Element instance\n * {@link isElement}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isElement(wat: unknown): boolean {\n  return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n}\n\n/**\n * Checks whether given value's type is an regexp\n * {@link isRegExp}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isRegExp(wat: unknown): wat is RegExp {\n  return isBuiltin(wat, 'RegExp');\n}\n\n/**\n * Checks whether given value has a then function.\n * @param wat A value to be checked.\n */\nexport function isThenable(wat: any): wat is PromiseLike<any> {\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n  return Boolean(wat && wat.then && typeof wat.then === 'function');\n}\n\n/**\n * Checks whether given value's type is a SyntheticEvent\n * {@link isSyntheticEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isSyntheticEvent(wat: unknown): boolean {\n  return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n\n/**\n * Checks whether given value's type is an instance of provided constructor.\n * {@link isInstanceOf}.\n *\n * @param wat A value to be checked.\n * @param base A constructor to be used in a check.\n * @returns A boolean representing the result.\n */\nexport function isInstanceOf(wat: any, base: any): boolean {\n  try {\n    return wat instanceof base;\n  } catch (_e) {\n    return false;\n  }\n}\n\ninterface VueViewModel {\n  // Vue3\n  __isVue?: boolean;\n  // Vue2\n  _isVue?: boolean;\n}\n/**\n * Checks whether given value's type is a Vue ViewModel.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isVueViewModel(wat: unknown): boolean {\n  // Not using Object.prototype.toString because in Vue 3 it would read the instance's Symbol(Symbol.toStringTag) property.\n  return !!(typeof wat === 'object' && wat !== null && ((wat as VueViewModel).__isVue || (wat as VueViewModel)._isVue));\n}\n","import { isNodeEnv } from './node';\nimport { GLOBAL_OBJ } from './worldwide';\n\n/**\n * Returns true if we are in the browser.\n */\nexport function isBrowser(): boolean {\n  // eslint-disable-next-line no-restricted-globals\n  return typeof window !== 'undefined' && (!isNodeEnv() || isElectronNodeRenderer());\n}\n\ntype ElectronProcess = { type?: string };\n\n// Electron renderers with nodeIntegration enabled are detected as Node.js so we specifically test for them\nfunction isElectronNodeRenderer(): boolean {\n  const process = (GLOBAL_OBJ as typeof GLOBAL_OBJ & { process?: ElectronProcess }).process;\n  return !!process && process.type === 'renderer';\n}\n","import type { ConsoleLevel } from '../types-hoist';\n\nimport { DEBUG_BUILD } from './debug-build';\nimport { GLOBAL_OBJ, getGlobalSingleton } from './worldwide';\n\n/** Prefix for logging strings */\nconst PREFIX = 'Sentry Logger ';\n\nexport const CONSOLE_LEVELS: readonly ConsoleLevel[] = [\n  'debug',\n  'info',\n  'warn',\n  'error',\n  'log',\n  'assert',\n  'trace',\n] as const;\n\ntype LoggerMethod = (...args: unknown[]) => void;\ntype LoggerConsoleMethods = Record<ConsoleLevel, LoggerMethod>;\n\n/** This may be mutated by the console instrumentation. */\nexport const originalConsoleMethods: {\n  [key in ConsoleLevel]?: (...args: unknown[]) => void;\n} = {};\n\n/** JSDoc */\nexport interface Logger extends LoggerConsoleMethods {\n  disable(): void;\n  enable(): void;\n  isEnabled(): boolean;\n}\n\n/**\n * Temporarily disable sentry console instrumentations.\n *\n * @param callback The function to run against the original `console` messages\n * @returns The results of the callback\n */\nexport function consoleSandbox<T>(callback: () => T): T {\n  if (!('console' in GLOBAL_OBJ)) {\n    return callback();\n  }\n\n  const console = GLOBAL_OBJ.console as Console;\n  const wrappedFuncs: Partial<LoggerConsoleMethods> = {};\n\n  const wrappedLevels = Object.keys(originalConsoleMethods) as ConsoleLevel[];\n\n  // Restore all wrapped console methods\n  wrappedLevels.forEach(level => {\n    const originalConsoleMethod = originalConsoleMethods[level] as LoggerMethod;\n    wrappedFuncs[level] = console[level] as LoggerMethod | undefined;\n    console[level] = originalConsoleMethod;\n  });\n\n  try {\n    return callback();\n  } finally {\n    // Revert restoration to wrapped state\n    wrappedLevels.forEach(level => {\n      console[level] = wrappedFuncs[level] as LoggerMethod;\n    });\n  }\n}\n\nfunction makeLogger(): Logger {\n  let enabled = false;\n  const logger: Partial<Logger> = {\n    enable: () => {\n      enabled = true;\n    },\n    disable: () => {\n      enabled = false;\n    },\n    isEnabled: () => enabled,\n  };\n\n  if (DEBUG_BUILD) {\n    CONSOLE_LEVELS.forEach(name => {\n      logger[name] = (...args: Parameters<(typeof GLOBAL_OBJ.console)[typeof name]>) => {\n        if (enabled) {\n          consoleSandbox(() => {\n            GLOBAL_OBJ.console[name](`${PREFIX}[${name}]:`, ...args);\n          });\n        }\n      };\n    });\n  } else {\n    CONSOLE_LEVELS.forEach(name => {\n      logger[name] = () => undefined;\n    });\n  }\n\n  return logger as Logger;\n}\n\n/**\n * This is a logger singleton which either logs things or no-ops if logging is not enabled.\n * The logger is a singleton on the carrier, to ensure that a consistent logger is used throughout the SDK.\n */\nexport const logger = getGlobalSingleton('logger', makeLogger);\n","/** A simple Least Recently Used map */\nexport class LRUMap<K, V> {\n  private readonly _cache: Map<K, V>;\n\n  public constructor(private readonly _maxSize: number) {\n    this._cache = new Map<K, V>();\n  }\n\n  /** Get the current size of the cache */\n  public get size(): number {\n    return this._cache.size;\n  }\n\n  /** Get an entry or undefined if it was not in the cache. Re-inserts to update the recently used order */\n  public get(key: K): V | undefined {\n    const value = this._cache.get(key);\n    if (value === undefined) {\n      return undefined;\n    }\n    // Remove and re-insert to update the order\n    this._cache.delete(key);\n    this._cache.set(key, value);\n    return value;\n  }\n\n  /** Insert an entry and evict an older entry if we've reached maxSize */\n  public set(key: K, value: V): void {\n    if (this._cache.size >= this._maxSize) {\n      // keys() returns an iterator in insertion order so keys().next() gives us the oldest key\n      this._cache.delete(this._cache.keys().next().value);\n    }\n    this._cache.set(key, value);\n  }\n\n  /** Remove an entry and return the entry if it was in the cache */\n  public remove(key: K): V | undefined {\n    const value = this._cache.get(key);\n    if (value) {\n      this._cache.delete(key);\n    }\n    return value;\n  }\n\n  /** Clear all entries */\n  public clear(): void {\n    this._cache.clear();\n  }\n\n  /** Get all the keys */\n  public keys(): Array<K> {\n    return Array.from(this._cache.keys());\n  }\n\n  /** Get all the values */\n  public values(): Array<V> {\n    const values: V[] = [];\n    this._cache.forEach(value => values.push(value));\n    return values;\n  }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport type MemoFunc = [\n  // memoize\n  (obj: any) => boolean,\n  // unmemoize\n  (obj: any) => void,\n];\n\n/**\n * Helper to decycle json objects\n *\n * @deprecated This function is deprecated and will be removed in the next major version.\n */\n// TODO(v9): Move this function into normalize() directly\nexport function memoBuilder(): MemoFunc {\n  const hasWeakSet = typeof WeakSet === 'function';\n  const inner: any = hasWeakSet ? new WeakSet() : [];\n  function memoize(obj: any): boolean {\n    if (hasWeakSet) {\n      if (inner.has(obj)) {\n        return true;\n      }\n      inner.add(obj);\n      return false;\n    }\n    // eslint-disable-next-line @typescript-eslint/prefer-for-of\n    for (let i = 0; i < inner.length; i++) {\n      const value = inner[i];\n      if (value === obj) {\n        return true;\n      }\n    }\n    inner.push(obj);\n    return false;\n  }\n\n  function unmemoize(obj: any): void {\n    if (hasWeakSet) {\n      inner.delete(obj);\n    } else {\n      for (let i = 0; i < inner.length; i++) {\n        if (inner[i] === obj) {\n          inner.splice(i, 1);\n          break;\n        }\n      }\n    }\n  }\n  return [memoize, unmemoize];\n}\n","import type { Event, Exception, Mechanism, StackFrame } from '../types-hoist';\n\nimport { addNonEnumerableProperty } from './object';\nimport { snipLine } from './string';\nimport { GLOBAL_OBJ } from './worldwide';\n\ninterface CryptoInternal {\n  getRandomValues(array: Uint8Array): Uint8Array;\n  randomUUID?(): string;\n}\n\n/** An interface for common properties on global */\ninterface CryptoGlobal {\n  msCrypto?: CryptoInternal;\n  crypto?: CryptoInternal;\n}\n\n/**\n * UUID4 generator\n *\n * @returns string Generated UUID4.\n */\nexport function uuid4(): string {\n  const gbl = GLOBAL_OBJ as typeof GLOBAL_OBJ & CryptoGlobal;\n  const crypto = gbl.crypto || gbl.msCrypto;\n\n  let getRandomByte = (): number => Math.random() * 16;\n  try {\n    if (crypto && crypto.randomUUID) {\n      return crypto.randomUUID().replace(/-/g, '');\n    }\n    if (crypto && crypto.getRandomValues) {\n      getRandomByte = () => {\n        // crypto.getRandomValues might return undefined instead of the typed array\n        // in old Chromium versions (e.g. 23.0.1235.0 (151422))\n        // However, `typedArray` is still filled in-place.\n        // @see https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues#typedarray\n        const typedArray = new Uint8Array(1);\n        crypto.getRandomValues(typedArray);\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        return typedArray[0]!;\n      };\n    }\n  } catch (_) {\n    // some runtimes can crash invoking crypto\n    // https://github.com/getsentry/sentry-javascript/issues/8935\n  }\n\n  // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n  // Concatenating the following numbers as strings results in '10000000100040008000100000000000'\n  return (([1e7] as unknown as string) + 1e3 + 4e3 + 8e3 + 1e11).replace(/[018]/g, c =>\n    // eslint-disable-next-line no-bitwise\n    ((c as unknown as number) ^ ((getRandomByte() & 15) >> ((c as unknown as number) / 4))).toString(16),\n  );\n}\n\nfunction getFirstException(event: Event): Exception | undefined {\n  return event.exception && event.exception.values ? event.exception.values[0] : undefined;\n}\n\n/**\n * Extracts either message or type+value from an event that can be used for user-facing logs\n * @returns event's description\n */\nexport function getEventDescription(event: Event): string {\n  const { message, event_id: eventId } = event;\n  if (message) {\n    return message;\n  }\n\n  const firstException = getFirstException(event);\n  if (firstException) {\n    if (firstException.type && firstException.value) {\n      return `${firstException.type}: ${firstException.value}`;\n    }\n    return firstException.type || firstException.value || eventId || '<unknown>';\n  }\n  return eventId || '<unknown>';\n}\n\n/**\n * Adds exception values, type and value to an synthetic Exception.\n * @param event The event to modify.\n * @param value Value of the exception.\n * @param type Type of the exception.\n * @hidden\n */\nexport function addExceptionTypeValue(event: Event, value?: string, type?: string): void {\n  const exception = (event.exception = event.exception || {});\n  const values = (exception.values = exception.values || []);\n  const firstException = (values[0] = values[0] || {});\n  if (!firstException.value) {\n    firstException.value = value || '';\n  }\n  if (!firstException.type) {\n    firstException.type = type || 'Error';\n  }\n}\n\n/**\n * Adds exception mechanism data to a given event. Uses defaults if the second parameter is not passed.\n *\n * @param event The event to modify.\n * @param newMechanism Mechanism data to add to the event.\n * @hidden\n */\nexport function addExceptionMechanism(event: Event, newMechanism?: Partial<Mechanism>): void {\n  const firstException = getFirstException(event);\n  if (!firstException) {\n    return;\n  }\n\n  const defaultMechanism = { type: 'generic', handled: true };\n  const currentMechanism = firstException.mechanism;\n  firstException.mechanism = { ...defaultMechanism, ...currentMechanism, ...newMechanism };\n\n  if (newMechanism && 'data' in newMechanism) {\n    const mergedData = { ...(currentMechanism && currentMechanism.data), ...newMechanism.data };\n    firstException.mechanism.data = mergedData;\n  }\n}\n\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nconst SEMVER_REGEXP =\n  /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\n/**\n * Represents Semantic Versioning object\n */\ninterface SemVer {\n  major?: number;\n  minor?: number;\n  patch?: number;\n  prerelease?: string;\n  buildmetadata?: string;\n}\n\nfunction _parseInt(input: string | undefined): number {\n  return parseInt(input || '', 10);\n}\n\n/**\n * Parses input into a SemVer interface\n * @param input string representation of a semver version\n */\nexport function parseSemver(input: string): SemVer {\n  const match = input.match(SEMVER_REGEXP) || [];\n  const major = _parseInt(match[1]);\n  const minor = _parseInt(match[2]);\n  const patch = _parseInt(match[3]);\n  return {\n    buildmetadata: match[5],\n    major: isNaN(major) ? undefined : major,\n    minor: isNaN(minor) ? undefined : minor,\n    patch: isNaN(patch) ? undefined : patch,\n    prerelease: match[4],\n  };\n}\n\n/**\n * This function adds context (pre/post/line) lines to the provided frame\n *\n * @param lines string[] containing all lines\n * @param frame StackFrame that will be mutated\n * @param linesOfContext number of context lines we want to add pre/post\n */\nexport function addContextToFrame(lines: string[], frame: StackFrame, linesOfContext: number = 5): void {\n  // When there is no line number in the frame, attaching context is nonsensical and will even break grouping\n  if (frame.lineno === undefined) {\n    return;\n  }\n\n  const maxLines = lines.length;\n  const sourceLine = Math.max(Math.min(maxLines - 1, frame.lineno - 1), 0);\n\n  frame.pre_context = lines\n    .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)\n    .map((line: string) => snipLine(line, 0));\n\n  // We guard here to ensure this is not larger than the existing number of lines\n  const lineIndex = Math.min(maxLines - 1, sourceLine);\n\n  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n  frame.context_line = snipLine(lines[lineIndex]!, frame.colno || 0);\n\n  frame.post_context = lines\n    .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)\n    .map((line: string) => snipLine(line, 0));\n}\n\n/**\n * Checks whether or not we've already captured the given exception (note: not an identical exception - the very object\n * in question), and marks it captured if not.\n *\n * This is useful because it's possible for an error to get captured by more than one mechanism. After we intercept and\n * record an error, we rethrow it (assuming we've intercepted it before it's reached the top-level global handlers), so\n * that we don't interfere with whatever effects the error might have had were the SDK not there. At that point, because\n * the error has been rethrown, it's possible for it to bubble up to some other code we've instrumented. If it's not\n * caught after that, it will bubble all the way up to the global handlers (which of course we also instrument). This\n * function helps us ensure that even if we encounter the same error more than once, we only record it the first time we\n * see it.\n *\n * Note: It will ignore primitives (always return `false` and not mark them as seen), as properties can't be set on\n * them. {@link: Object.objectify} can be used on exceptions to convert any that are primitives into their equivalent\n * object wrapper forms so that this check will always work. However, because we need to flag the exact object which\n * will get rethrown, and because that rethrowing happens outside of the event processing pipeline, the objectification\n * must be done before the exception captured.\n *\n * @param A thrown exception to check or flag as having been seen\n * @returns `true` if the exception has already been captured, `false` if not (with the side effect of marking it seen)\n */\nexport function checkOrSetAlreadyCaught(exception: unknown): boolean {\n  if (isAlreadyCaptured(exception)) {\n    return true;\n  }\n\n  try {\n    // set it this way rather than by assignment so that it's not ennumerable and therefore isn't recorded by the\n    // `ExtraErrorData` integration\n    addNonEnumerableProperty(exception as { [key: string]: unknown }, '__sentry_captured__', true);\n  } catch (err) {\n    // `exception` is a primitive, so we can't mark it seen\n  }\n\n  return false;\n}\n\nfunction isAlreadyCaptured(exception: unknown): boolean | void {\n  try {\n    return (exception as { __sentry_captured__?: boolean }).__sentry_captured__;\n  } catch {} // eslint-disable-line no-empty\n}\n\n/**\n * Checks whether the given input is already an array, and if it isn't, wraps it in one.\n *\n * @param maybeArray Input to turn into an array, if necessary\n * @returns The input, if already an array, or an array with the input as the only element, if not\n *\n * @deprecated This function has been deprecated and will not be replaced.\n */\nexport function arrayify<T = unknown>(maybeArray: T | T[]): T[] {\n  return Array.isArray(maybeArray) ? maybeArray : [maybeArray];\n}\n","// This code was originally forked from https://github.com/felixge/node-stack-trace\n// Since then it has been highly modified to fit our needs.\n\n// Copyright (c) 2011 Felix Geisendörfer (felix@debuggable.com)//\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions://\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.//\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n\nimport type { StackLineParser, StackLineParserFn } from '../types-hoist';\nimport { UNKNOWN_FUNCTION } from './stacktrace';\n\nexport type GetModuleFn = (filename: string | undefined) => string | undefined;\n\n/**\n * Does this filename look like it's part of the app code?\n */\nexport function filenameIsInApp(filename: string, isNative: boolean = false): boolean {\n  const isInternal =\n    isNative ||\n    (filename &&\n      // It's not internal if it's an absolute linux path\n      !filename.startsWith('/') &&\n      // It's not internal if it's an absolute windows path\n      !filename.match(/^[A-Z]:/) &&\n      // It's not internal if the path is starting with a dot\n      !filename.startsWith('.') &&\n      // It's not internal if the frame has a protocol. In node, this is usually the case if the file got pre-processed with a bundler like webpack\n      !filename.match(/^[a-zA-Z]([a-zA-Z0-9.\\-+])*:\\/\\//)); // Schema from: https://stackoverflow.com/a/3641782\n\n  // in_app is all that's not an internal Node function or a module within node_modules\n  // note that isNative appears to return true even for node core libraries\n  // see https://github.com/getsentry/raven-node/issues/176\n\n  return !isInternal && filename !== undefined && !filename.includes('node_modules/');\n}\n\n/** Node Stack line parser */\nexport function node(getModule?: GetModuleFn): StackLineParserFn {\n  const FILENAME_MATCH = /^\\s*[-]{4,}$/;\n  const FULL_MATCH = /at (?:async )?(?:(.+?)\\s+\\()?(?:(.+):(\\d+):(\\d+)?|([^)]+))\\)?/;\n\n  // eslint-disable-next-line complexity\n  return (line: string) => {\n    const lineMatch = line.match(FULL_MATCH);\n\n    if (lineMatch) {\n      let object: string | undefined;\n      let method: string | undefined;\n      let functionName: string | undefined;\n      let typeName: string | undefined;\n      let methodName: string | undefined;\n\n      if (lineMatch[1]) {\n        functionName = lineMatch[1];\n\n        let methodStart = functionName.lastIndexOf('.');\n        if (functionName[methodStart - 1] === '.') {\n          methodStart--;\n        }\n\n        if (methodStart > 0) {\n          object = functionName.slice(0, methodStart);\n          method = functionName.slice(methodStart + 1);\n          const objectEnd = object.indexOf('.Module');\n          if (objectEnd > 0) {\n            functionName = functionName.slice(objectEnd + 1);\n            object = object.slice(0, objectEnd);\n          }\n        }\n        typeName = undefined;\n      }\n\n      if (method) {\n        typeName = object;\n        methodName = method;\n      }\n\n      if (method === '<anonymous>') {\n        methodName = undefined;\n        functionName = undefined;\n      }\n\n      if (functionName === undefined) {\n        methodName = methodName || UNKNOWN_FUNCTION;\n        functionName = typeName ? `${typeName}.${methodName}` : methodName;\n      }\n\n      let filename = lineMatch[2] && lineMatch[2].startsWith('file://') ? lineMatch[2].slice(7) : lineMatch[2];\n      const isNative = lineMatch[5] === 'native';\n\n      // If it's a Windows path, trim the leading slash so that `/C:/foo` becomes `C:/foo`\n      if (filename && filename.match(/\\/[A-Z]:/)) {\n        filename = filename.slice(1);\n      }\n\n      if (!filename && lineMatch[5] && !isNative) {\n        filename = lineMatch[5];\n      }\n\n      return {\n        filename: filename ? decodeURI(filename) : undefined,\n        module: getModule ? getModule(filename) : undefined,\n        function: functionName,\n        lineno: _parseIntOrUndefined(lineMatch[3]),\n        colno: _parseIntOrUndefined(lineMatch[4]),\n        in_app: filenameIsInApp(filename || '', isNative),\n      };\n    }\n\n    if (line.match(FILENAME_MATCH)) {\n      return {\n        filename: line,\n      };\n    }\n\n    return undefined;\n  };\n}\n\n/**\n * Node.js stack line parser\n *\n * This is in @sentry/core so it can be used from the Electron SDK in the browser for when `nodeIntegration == true`.\n * This allows it to be used without referencing or importing any node specific code which causes bundlers to complain\n */\nexport function nodeStackLineParser(getModule?: GetModuleFn): StackLineParser {\n  return [90, node(getModule)];\n}\n\nfunction _parseIntOrUndefined(input: string | undefined): number | undefined {\n  return parseInt(input || '', 10) || undefined;\n}\n","/**\n * NOTE: In order to avoid circular dependencies, if you add a function to this module and it needs to print something,\n * you must either a) use `console.log` rather than the logger, or b) put your function elsewhere.\n */\n\nimport { isBrowserBundle } from './env';\n\n/**\n * Checks whether we're in the Node.js or Browser environment\n *\n * @returns Answer to given question\n */\nexport function isNodeEnv(): boolean {\n  // explicitly check for browser bundles as those can be optimized statically\n  // by terser/rollup.\n  return (\n    !isBrowserBundle() &&\n    Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]'\n  );\n}\n\n/**\n * Requires a module which is protected against bundler minification.\n *\n * @param request The module path to resolve\n * @deprecated This function will be removed in the next major version.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function dynamicRequire(mod: any, request: string): any {\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n  return mod.require(request);\n}\n\n/**\n * Helper for dynamically loading module that should work with linked dependencies.\n * The problem is that we _should_ be using `require(require.resolve(moduleName, { paths: [cwd()] }))`\n * However it's _not possible_ to do that with Webpack, as it has to know all the dependencies during\n * build time. `require.resolve` is also not available in any other way, so we cannot create,\n * a fake helper like we do with `dynamicRequire`.\n *\n * We always prefer to use local package, thus the value is not returned early from each `try/catch` block.\n * That is to mimic the behavior of `require.resolve` exactly.\n *\n * @param moduleName module name to require\n * @returns possibly required module\n */\nexport function loadModule<T>(moduleName: string): T | undefined {\n  let mod: T | undefined;\n\n  try {\n    // eslint-disable-next-line deprecation/deprecation\n    mod = dynamicRequire(module, moduleName);\n  } catch (e) {\n    // no-empty\n  }\n\n  if (!mod) {\n    try {\n      // eslint-disable-next-line deprecation/deprecation\n      const { cwd } = dynamicRequire(module, 'process');\n      // eslint-disable-next-line deprecation/deprecation\n      mod = dynamicRequire(module, `${cwd()}/node_modules/${moduleName}`) as T;\n    } catch (e) {\n      // no-empty\n    }\n  }\n\n  return mod;\n}\n","import type { Primitive } from '../types-hoist';\n\nimport { isSyntheticEvent, isVueViewModel } from './is';\nimport type { MemoFunc } from './memo';\nimport { memoBuilder } from './memo';\nimport { convertToPlainObject } from './object';\nimport { getFunctionName } from './stacktrace';\n\ntype Prototype = { constructor: (...args: unknown[]) => unknown };\n// This is a hack to placate TS, relying on the fact that technically, arrays are objects with integer keys. Normally we\n// think of those keys as actual numbers, but `arr['0']` turns out to work just as well as `arr[0]`, and doing it this\n// way lets us use a single type in the places where behave as if we are only dealing with objects, even if some of them\n// might be arrays.\ntype ObjOrArray<T> = { [key: string]: T };\n\n/**\n * Recursively normalizes the given object.\n *\n * - Creates a copy to prevent original input mutation\n * - Skips non-enumerable properties\n * - When stringifying, calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializable values (`undefined`/`NaN`/functions) to serializable format\n * - Translates known global objects/classes to a string representations\n * - Takes care of `Error` object serialization\n * - Optionally limits depth of final output\n * - Optionally limits number of properties/elements included in any single object/array\n *\n * @param input The object to be normalized.\n * @param depth The max depth to which to normalize the object. (Anything deeper stringified whole.)\n * @param maxProperties The max number of elements or properties to be included in any single array or\n * object in the normalized output.\n * @returns A normalized version of the object, or `\"**non-serializable**\"` if any errors are thrown during normalization.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function normalize(input: unknown, depth: number = 100, maxProperties: number = +Infinity): any {\n  try {\n    // since we're at the outermost level, we don't provide a key\n    return visit('', input, depth, maxProperties);\n  } catch (err) {\n    return { ERROR: `**non-serializable** (${err})` };\n  }\n}\n\n/** JSDoc */\nexport function normalizeToSize<T>(\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  object: { [key: string]: any },\n  // Default Node.js REPL depth\n  depth: number = 3,\n  // 100kB, as 200kB is max payload size, so half sounds reasonable\n  maxSize: number = 100 * 1024,\n): T {\n  const normalized = normalize(object, depth);\n\n  if (jsonSize(normalized) > maxSize) {\n    return normalizeToSize(object, depth - 1, maxSize);\n  }\n\n  return normalized as T;\n}\n\n/**\n * Visits a node to perform normalization on it\n *\n * @param key The key corresponding to the given node\n * @param value The node to be visited\n * @param depth Optional number indicating the maximum recursion depth\n * @param maxProperties Optional maximum number of properties/elements included in any single object/array\n * @param memo Optional Memo class handling decycling\n */\nfunction visit(\n  key: string,\n  value: unknown,\n  depth: number = +Infinity,\n  maxProperties: number = +Infinity,\n  // eslint-disable-next-line deprecation/deprecation\n  memo: MemoFunc = memoBuilder(),\n): Primitive | ObjOrArray<unknown> {\n  const [memoize, unmemoize] = memo;\n\n  // Get the simple cases out of the way first\n  if (\n    value == null || // this matches null and undefined -> eqeq not eqeqeq\n    ['boolean', 'string'].includes(typeof value) ||\n    (typeof value === 'number' && Number.isFinite(value))\n  ) {\n    return value as Primitive;\n  }\n\n  const stringified = stringifyValue(key, value);\n\n  // Anything we could potentially dig into more (objects or arrays) will have come back as `\"[object XXXX]\"`.\n  // Everything else will have already been serialized, so if we don't see that pattern, we're done.\n  if (!stringified.startsWith('[object ')) {\n    return stringified;\n  }\n\n  // From here on, we can assert that `value` is either an object or an array.\n\n  // Do not normalize objects that we know have already been normalized. As a general rule, the\n  // \"__sentry_skip_normalization__\" property should only be used sparingly and only should only be set on objects that\n  // have already been normalized.\n  if ((value as ObjOrArray<unknown>)['__sentry_skip_normalization__']) {\n    return value as ObjOrArray<unknown>;\n  }\n\n  // We can set `__sentry_override_normalization_depth__` on an object to ensure that from there\n  // We keep a certain amount of depth.\n  // This should be used sparingly, e.g. we use it for the redux integration to ensure we get a certain amount of state.\n  const remainingDepth =\n    typeof (value as ObjOrArray<unknown>)['__sentry_override_normalization_depth__'] === 'number'\n      ? ((value as ObjOrArray<unknown>)['__sentry_override_normalization_depth__'] as number)\n      : depth;\n\n  // We're also done if we've reached the max depth\n  if (remainingDepth === 0) {\n    // At this point we know `serialized` is a string of the form `\"[object XXXX]\"`. Clean it up so it's just `\"[XXXX]\"`.\n    return stringified.replace('object ', '');\n  }\n\n  // If we've already visited this branch, bail out, as it's circular reference. If not, note that we're seeing it now.\n  if (memoize(value)) {\n    return '[Circular ~]';\n  }\n\n  // If the value has a `toJSON` method, we call it to extract more information\n  const valueWithToJSON = value as unknown & { toJSON?: () => unknown };\n  if (valueWithToJSON && typeof valueWithToJSON.toJSON === 'function') {\n    try {\n      const jsonValue = valueWithToJSON.toJSON();\n      // We need to normalize the return value of `.toJSON()` in case it has circular references\n      return visit('', jsonValue, remainingDepth - 1, maxProperties, memo);\n    } catch (err) {\n      // pass (The built-in `toJSON` failed, but we can still try to do it ourselves)\n    }\n  }\n\n  // At this point we know we either have an object or an array, we haven't seen it before, and we're going to recurse\n  // because we haven't yet reached the max depth. Create an accumulator to hold the results of visiting each\n  // property/entry, and keep track of the number of items we add to it.\n  const normalized = (Array.isArray(value) ? [] : {}) as ObjOrArray<unknown>;\n  let numAdded = 0;\n\n  // Before we begin, convert`Error` and`Event` instances into plain objects, since some of each of their relevant\n  // properties are non-enumerable and otherwise would get missed.\n  const visitable = convertToPlainObject(value as ObjOrArray<unknown>);\n\n  for (const visitKey in visitable) {\n    // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n    if (!Object.prototype.hasOwnProperty.call(visitable, visitKey)) {\n      continue;\n    }\n\n    if (numAdded >= maxProperties) {\n      normalized[visitKey] = '[MaxProperties ~]';\n      break;\n    }\n\n    // Recursively visit all the child nodes\n    const visitValue = visitable[visitKey];\n    normalized[visitKey] = visit(visitKey, visitValue, remainingDepth - 1, maxProperties, memo);\n\n    numAdded++;\n  }\n\n  // Once we've visited all the branches, remove the parent from memo storage\n  unmemoize(value);\n\n  // Return accumulated values\n  return normalized;\n}\n\n/* eslint-disable complexity */\n/**\n * Stringify the given value. Handles various known special values and types.\n *\n * Not meant to be used on simple primitives which already have a string representation, as it will, for example, turn\n * the number 1231 into \"[Object Number]\", nor on `null`, as it will throw.\n *\n * @param value The value to stringify\n * @returns A stringified representation of the given value\n */\nfunction stringifyValue(\n  key: unknown,\n  // this type is a tiny bit of a cheat, since this function does handle NaN (which is technically a number), but for\n  // our internal use, it'll do\n  value: Exclude<unknown, string | number | boolean | null>,\n): string {\n  try {\n    if (key === 'domain' && value && typeof value === 'object' && (value as { _events: unknown })._events) {\n      return '[Domain]';\n    }\n\n    if (key === 'domainEmitter') {\n      return '[DomainEmitter]';\n    }\n\n    // It's safe to use `global`, `window`, and `document` here in this manner, as we are asserting using `typeof` first\n    // which won't throw if they are not present.\n\n    if (typeof global !== 'undefined' && value === global) {\n      return '[Global]';\n    }\n\n    // eslint-disable-next-line no-restricted-globals\n    if (typeof window !== 'undefined' && value === window) {\n      return '[Window]';\n    }\n\n    // eslint-disable-next-line no-restricted-globals\n    if (typeof document !== 'undefined' && value === document) {\n      return '[Document]';\n    }\n\n    if (isVueViewModel(value)) {\n      return '[VueViewModel]';\n    }\n\n    // React's SyntheticEvent thingy\n    if (isSyntheticEvent(value)) {\n      return '[SyntheticEvent]';\n    }\n\n    if (typeof value === 'number' && !Number.isFinite(value)) {\n      return `[${value}]`;\n    }\n\n    if (typeof value === 'function') {\n      return `[Function: ${getFunctionName(value)}]`;\n    }\n\n    if (typeof value === 'symbol') {\n      return `[${String(value)}]`;\n    }\n\n    // stringified BigInts are indistinguishable from regular numbers, so we need to label them to avoid confusion\n    if (typeof value === 'bigint') {\n      return `[BigInt: ${String(value)}]`;\n    }\n\n    // Now that we've knocked out all the special cases and the primitives, all we have left are objects. Simply casting\n    // them to strings means that instances of classes which haven't defined their `toStringTag` will just come out as\n    // `\"[object Object]\"`. If we instead look at the constructor's name (which is the same as the name of the class),\n    // we can make sure that only plain objects come out that way.\n    const objName = getConstructorName(value);\n\n    // Handle HTML Elements\n    if (/^HTML(\\w*)Element$/.test(objName)) {\n      return `[HTMLElement: ${objName}]`;\n    }\n\n    return `[object ${objName}]`;\n  } catch (err) {\n    return `**non-serializable** (${err})`;\n  }\n}\n/* eslint-enable complexity */\n\nfunction getConstructorName(value: unknown): string {\n  const prototype: Prototype | null = Object.getPrototypeOf(value);\n\n  return prototype ? prototype.constructor.name : 'null prototype';\n}\n\n/** Calculates bytes size of input string */\nfunction utf8Length(value: string): number {\n  // eslint-disable-next-line no-bitwise\n  return ~-encodeURI(value).split(/%..|./).length;\n}\n\n/** Calculates bytes size of input object */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction jsonSize(value: any): number {\n  return utf8Length(JSON.stringify(value));\n}\n\n/**\n * Normalizes URLs in exceptions and stacktraces to a base path so Sentry can fingerprint\n * across platforms and working directory.\n *\n * @param url The URL to be normalized.\n * @param basePath The application base path.\n * @returns The normalized URL.\n */\nexport function normalizeUrlToBase(url: string, basePath: string): string {\n  const escapedBase = basePath\n    // Backslash to forward\n    .replace(/\\\\/g, '/')\n    // Escape RegExp special characters\n    .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&');\n\n  let newUrl = url;\n  try {\n    newUrl = decodeURI(url);\n  } catch (_Oo) {\n    // Sometime this breaks\n  }\n  return (\n    newUrl\n      .replace(/\\\\/g, '/')\n      .replace(/webpack:\\/?/g, '') // Remove intermediate base path\n      // eslint-disable-next-line @sentry-internal/sdk/no-regexp-constructor\n      .replace(new RegExp(`(file://)?/*${escapedBase}/*`, 'ig'), 'app:///')\n  );\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { WrappedFunction } from '../types-hoist';\n\nimport { htmlTreeAsString } from './browser';\nimport { DEBUG_BUILD } from './debug-build';\nimport { isElement, isError, isEvent, isInstanceOf, isPlainObject, isPrimitive } from './is';\nimport { logger } from './logger';\nimport { truncate } from './string';\n\n/**\n * Replace a method in an object with a wrapped version of itself.\n *\n * @param source An object that contains a method to be wrapped.\n * @param name The name of the method to be wrapped.\n * @param replacementFactory A higher-order function that takes the original version of the given method and returns a\n * wrapped version. Note: The function returned by `replacementFactory` needs to be a non-arrow function, in order to\n * preserve the correct value of `this`, and the original method must be called using `origMethod.call(this, <other\n * args>)` or `origMethod.apply(this, [<other args>])` (rather than being called directly), again to preserve `this`.\n * @returns void\n */\nexport function fill(source: { [key: string]: any }, name: string, replacementFactory: (...args: any[]) => any): void {\n  if (!(name in source)) {\n    return;\n  }\n\n  const original = source[name] as () => any;\n  const wrapped = replacementFactory(original) as WrappedFunction;\n\n  // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n  // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n  if (typeof wrapped === 'function') {\n    markFunctionWrapped(wrapped, original);\n  }\n\n  try {\n    source[name] = wrapped;\n  } catch {\n    DEBUG_BUILD && logger.log(`Failed to replace method \"${name}\" in object`, source);\n  }\n}\n\n/**\n * Defines a non-enumerable property on the given object.\n *\n * @param obj The object on which to set the property\n * @param name The name of the property to be set\n * @param value The value to which to set the property\n */\nexport function addNonEnumerableProperty(obj: object, name: string, value: unknown): void {\n  try {\n    Object.defineProperty(obj, name, {\n      // enumerable: false, // the default, so we can save on bundle size by not explicitly setting it\n      value: value,\n      writable: true,\n      configurable: true,\n    });\n  } catch (o_O) {\n    DEBUG_BUILD && logger.log(`Failed to add non-enumerable property \"${name}\" to object`, obj);\n  }\n}\n\n/**\n * Remembers the original function on the wrapped function and\n * patches up the prototype.\n *\n * @param wrapped the wrapper function\n * @param original the original function that gets wrapped\n */\nexport function markFunctionWrapped(wrapped: WrappedFunction, original: WrappedFunction): void {\n  try {\n    const proto = original.prototype || {};\n    wrapped.prototype = original.prototype = proto;\n    addNonEnumerableProperty(wrapped, '__sentry_original__', original);\n  } catch (o_O) {} // eslint-disable-line no-empty\n}\n\n/**\n * This extracts the original function if available.  See\n * `markFunctionWrapped` for more information.\n *\n * @param func the function to unwrap\n * @returns the unwrapped version of the function if available.\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function getOriginalFunction<T extends Function>(func: WrappedFunction<T>): T | undefined {\n  return func.__sentry_original__;\n}\n\n/**\n * Encodes given object into url-friendly format\n *\n * @param object An object that contains serializable values\n * @returns string Encoded\n *\n * @deprecated This function is deprecated and will be removed in the next major version of the SDK.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function urlEncode(object: { [key: string]: any }): string {\n  return Object.entries(object)\n    .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n    .join('&');\n}\n\n/**\n * Transforms any `Error` or `Event` into a plain object with all of their enumerable properties, and some of their\n * non-enumerable properties attached.\n *\n * @param value Initial source that we have to transform in order for it to be usable by the serializer\n * @returns An Event or Error turned into an object - or the value argument itself, when value is neither an Event nor\n *  an Error.\n */\nexport function convertToPlainObject<V>(value: V):\n  | {\n      [ownProps: string]: unknown;\n      type: string;\n      target: string;\n      currentTarget: string;\n      detail?: unknown;\n    }\n  | {\n      [ownProps: string]: unknown;\n      message: string;\n      name: string;\n      stack?: string;\n    }\n  | V {\n  if (isError(value)) {\n    return {\n      message: value.message,\n      name: value.name,\n      stack: value.stack,\n      ...getOwnProperties(value),\n    };\n  } else if (isEvent(value)) {\n    const newObj: {\n      [ownProps: string]: unknown;\n      type: string;\n      target: string;\n      currentTarget: string;\n      detail?: unknown;\n    } = {\n      type: value.type,\n      target: serializeEventTarget(value.target),\n      currentTarget: serializeEventTarget(value.currentTarget),\n      ...getOwnProperties(value),\n    };\n\n    if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n      newObj.detail = value.detail;\n    }\n\n    return newObj;\n  } else {\n    return value;\n  }\n}\n\n/** Creates a string representation of the target of an `Event` object */\nfunction serializeEventTarget(target: unknown): string {\n  try {\n    return isElement(target) ? htmlTreeAsString(target) : Object.prototype.toString.call(target);\n  } catch (_oO) {\n    return '<unknown>';\n  }\n}\n\n/** Filters out all but an object's own properties */\nfunction getOwnProperties(obj: unknown): { [key: string]: unknown } {\n  if (typeof obj === 'object' && obj !== null) {\n    const extractedProps: { [key: string]: unknown } = {};\n    for (const property in obj) {\n      if (Object.prototype.hasOwnProperty.call(obj, property)) {\n        extractedProps[property] = (obj as Record<string, unknown>)[property];\n      }\n    }\n    return extractedProps;\n  } else {\n    return {};\n  }\n}\n\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nexport function extractExceptionKeysForMessage(exception: Record<string, unknown>, maxLength: number = 40): string {\n  const keys = Object.keys(convertToPlainObject(exception));\n  keys.sort();\n\n  const firstKey = keys[0];\n\n  if (!firstKey) {\n    return '[object has no keys]';\n  }\n\n  if (firstKey.length >= maxLength) {\n    return truncate(firstKey, maxLength);\n  }\n\n  for (let includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n    const serialized = keys.slice(0, includedKeys).join(', ');\n    if (serialized.length > maxLength) {\n      continue;\n    }\n    if (includedKeys === keys.length) {\n      return serialized;\n    }\n    return truncate(serialized, maxLength);\n  }\n\n  return '';\n}\n\n/**\n * Given any object, return a new object having removed all fields whose value was `undefined`.\n * Works recursively on objects and arrays.\n *\n * Attention: This function keeps circular references in the returned object.\n */\nexport function dropUndefinedKeys<T>(inputValue: T): T {\n  // This map keeps track of what already visited nodes map to.\n  // Our Set - based memoBuilder doesn't work here because we want to the output object to have the same circular\n  // references as the input object.\n  const memoizationMap = new Map<unknown, unknown>();\n\n  // This function just proxies `_dropUndefinedKeys` to keep the `memoBuilder` out of this function's API\n  return _dropUndefinedKeys(inputValue, memoizationMap);\n}\n\nfunction _dropUndefinedKeys<T>(inputValue: T, memoizationMap: Map<unknown, unknown>): T {\n  if (isPojo(inputValue)) {\n    // If this node has already been visited due to a circular reference, return the object it was mapped to in the new object\n    const memoVal = memoizationMap.get(inputValue);\n    if (memoVal !== undefined) {\n      return memoVal as T;\n    }\n\n    const returnValue: { [key: string]: unknown } = {};\n    // Store the mapping of this value in case we visit it again, in case of circular data\n    memoizationMap.set(inputValue, returnValue);\n\n    for (const key of Object.getOwnPropertyNames(inputValue)) {\n      if (typeof inputValue[key] !== 'undefined') {\n        returnValue[key] = _dropUndefinedKeys(inputValue[key], memoizationMap);\n      }\n    }\n\n    return returnValue as T;\n  }\n\n  if (Array.isArray(inputValue)) {\n    // If this node has already been visited due to a circular reference, return the array it was mapped to in the new object\n    const memoVal = memoizationMap.get(inputValue);\n    if (memoVal !== undefined) {\n      return memoVal as T;\n    }\n\n    const returnValue: unknown[] = [];\n    // Store the mapping of this value in case we visit it again, in case of circular data\n    memoizationMap.set(inputValue, returnValue);\n\n    inputValue.forEach((item: unknown) => {\n      returnValue.push(_dropUndefinedKeys(item, memoizationMap));\n    });\n\n    return returnValue as unknown as T;\n  }\n\n  return inputValue;\n}\n\nfunction isPojo(input: unknown): input is Record<string, unknown> {\n  if (!isPlainObject(input)) {\n    return false;\n  }\n\n  try {\n    const name = (Object.getPrototypeOf(input) as { constructor: { name: string } }).constructor.name;\n    return !name || name === 'Object';\n  } catch {\n    return true;\n  }\n}\n\n/**\n * Ensure that something is an object.\n *\n * Turns `undefined` and `null` into `String`s and all other primitives into instances of their respective wrapper\n * classes (String, Boolean, Number, etc.). Acts as the identity function on non-primitives.\n *\n * @param wat The subject of the objectification\n * @returns A version of `wat` which can safely be used with `Object` class methods\n */\nexport function objectify(wat: unknown): typeof Object {\n  let objectified;\n  switch (true) {\n    // this will catch both undefined and null\n    case wat == undefined:\n      objectified = new String(wat);\n      break;\n\n    // Though symbols and bigints do have wrapper classes (`Symbol` and `BigInt`, respectively), for whatever reason\n    // those classes don't have constructors which can be used with the `new` keyword. We therefore need to cast each as\n    // an object in order to wrap it.\n    case typeof wat === 'symbol' || typeof wat === 'bigint':\n      objectified = Object(wat);\n      break;\n\n    // this will catch the remaining primitives: `String`, `Number`, and `Boolean`\n    case isPrimitive(wat):\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n      objectified = new (wat as any).constructor(wat);\n      break;\n\n    // by process of elimination, at this point we know that `wat` must already be an object\n    default:\n      objectified = wat;\n      break;\n  }\n  return objectified;\n}\n","// Slightly modified (no IE8 support, ES6) and transcribed to TypeScript\n// https://github.com/calvinmetcalf/rollup-plugin-node-builtins/blob/63ab8aacd013767445ca299e468d9a60a95328d7/src/es6/path.js\n//\n// Copyright Joyent, Inc.and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n/** JSDoc */\nfunction normalizeArray(parts: string[], allowAboveRoot?: boolean): string[] {\n  // if the path tries to go above the root, `up` ends up > 0\n  let up = 0;\n  for (let i = parts.length - 1; i >= 0; i--) {\n    const last = parts[i];\n    if (last === '.') {\n      parts.splice(i, 1);\n    } else if (last === '..') {\n      parts.splice(i, 1);\n      up++;\n    } else if (up) {\n      parts.splice(i, 1);\n      up--;\n    }\n  }\n\n  // if the path is allowed to go above the root, restore leading ..s\n  if (allowAboveRoot) {\n    for (; up--; up) {\n      parts.unshift('..');\n    }\n  }\n\n  return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nconst splitPathRe = /^(\\S+:\\\\|\\/?)([\\s\\S]*?)((?:\\.{1,2}|[^/\\\\]+?|)(\\.[^./\\\\]*|))(?:[/\\\\]*)$/;\n/** JSDoc */\nfunction splitPath(filename: string): string[] {\n  // Truncate files names greater than 1024 characters to avoid regex dos\n  // https://github.com/getsentry/sentry-javascript/pull/8737#discussion_r1285719172\n  const truncated = filename.length > 1024 ? `<truncated>${filename.slice(-1024)}` : filename;\n  const parts = splitPathRe.exec(truncated);\n  return parts ? parts.slice(1) : [];\n}\n\n// path.resolve([from ...], to)\n// posix version\n/** JSDoc */\nexport function resolve(...args: string[]): string {\n  let resolvedPath = '';\n  let resolvedAbsolute = false;\n\n  for (let i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n    const path = i >= 0 ? args[i] : '/';\n\n    // Skip empty entries\n    if (!path) {\n      continue;\n    }\n\n    resolvedPath = `${path}/${resolvedPath}`;\n    resolvedAbsolute = path.charAt(0) === '/';\n  }\n\n  // At this point the path should be resolved to a full absolute path, but\n  // handle relative paths to be safe (might happen when process.cwd() fails)\n\n  // Normalize the path\n  resolvedPath = normalizeArray(\n    resolvedPath.split('/').filter(p => !!p),\n    !resolvedAbsolute,\n  ).join('/');\n\n  return (resolvedAbsolute ? '/' : '') + resolvedPath || '.';\n}\n\n/** JSDoc */\nfunction trim(arr: string[]): string[] {\n  let start = 0;\n  for (; start < arr.length; start++) {\n    if (arr[start] !== '') {\n      break;\n    }\n  }\n\n  let end = arr.length - 1;\n  for (; end >= 0; end--) {\n    if (arr[end] !== '') {\n      break;\n    }\n  }\n\n  if (start > end) {\n    return [];\n  }\n  return arr.slice(start, end - start + 1);\n}\n\n// path.relative(from, to)\n// posix version\n/** JSDoc */\nexport function relative(from: string, to: string): string {\n  /* eslint-disable no-param-reassign */\n  from = resolve(from).slice(1);\n  to = resolve(to).slice(1);\n  /* eslint-enable no-param-reassign */\n\n  const fromParts = trim(from.split('/'));\n  const toParts = trim(to.split('/'));\n\n  const length = Math.min(fromParts.length, toParts.length);\n  let samePartsLength = length;\n  for (let i = 0; i < length; i++) {\n    if (fromParts[i] !== toParts[i]) {\n      samePartsLength = i;\n      break;\n    }\n  }\n\n  let outputParts = [];\n  for (let i = samePartsLength; i < fromParts.length; i++) {\n    outputParts.push('..');\n  }\n\n  outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n  return outputParts.join('/');\n}\n\n// path.normalize(path)\n// posix version\n/** JSDoc */\nexport function normalizePath(path: string): string {\n  const isPathAbsolute = isAbsolute(path);\n  const trailingSlash = path.slice(-1) === '/';\n\n  // Normalize the path\n  let normalizedPath = normalizeArray(\n    path.split('/').filter(p => !!p),\n    !isPathAbsolute,\n  ).join('/');\n\n  if (!normalizedPath && !isPathAbsolute) {\n    normalizedPath = '.';\n  }\n  if (normalizedPath && trailingSlash) {\n    normalizedPath += '/';\n  }\n\n  return (isPathAbsolute ? '/' : '') + normalizedPath;\n}\n\n// posix version\n/** JSDoc */\nexport function isAbsolute(path: string): boolean {\n  return path.charAt(0) === '/';\n}\n\n// posix version\n/** JSDoc */\nexport function join(...args: string[]): string {\n  return normalizePath(args.join('/'));\n}\n\n/** JSDoc */\nexport function dirname(path: string): string {\n  const result = splitPath(path);\n  const root = result[0] || '';\n  let dir = result[1];\n\n  if (!root && !dir) {\n    // No dirname whatsoever\n    return '.';\n  }\n\n  if (dir) {\n    // It has a dirname, strip trailing slash\n    dir = dir.slice(0, dir.length - 1);\n  }\n\n  return root + dir;\n}\n\n/** JSDoc */\nexport function basename(path: string, ext?: string): string {\n  let f = splitPath(path)[2] || '';\n  if (ext && f.slice(ext.length * -1) === ext) {\n    f = f.slice(0, f.length - ext.length);\n  }\n  return f;\n}\n","import { SentryError } from './error';\nimport { SyncPromise, rejectedSyncPromise, resolvedSyncPromise } from './syncpromise';\n\nexport interface PromiseBuffer<T> {\n  // exposes the internal array so tests can assert on the state of it.\n  // XXX: this really should not be public api.\n  $: Array<PromiseLike<T>>;\n  add(taskProducer: () => PromiseLike<T>): PromiseLike<T>;\n  drain(timeout?: number): PromiseLike<boolean>;\n}\n\n/**\n * Creates an new PromiseBuffer object with the specified limit\n * @param limit max number of promises that can be stored in the buffer\n */\nexport function makePromiseBuffer<T>(limit?: number): PromiseBuffer<T> {\n  const buffer: Array<PromiseLike<T>> = [];\n\n  function isReady(): boolean {\n    return limit === undefined || buffer.length < limit;\n  }\n\n  /**\n   * Remove a promise from the queue.\n   *\n   * @param task Can be any PromiseLike<T>\n   * @returns Removed promise.\n   */\n  function remove(task: PromiseLike<T>): PromiseLike<T | void> {\n    return buffer.splice(buffer.indexOf(task), 1)[0] || Promise.resolve(undefined);\n  }\n\n  /**\n   * Add a promise (representing an in-flight action) to the queue, and set it to remove itself on fulfillment.\n   *\n   * @param taskProducer A function producing any PromiseLike<T>; In previous versions this used to be `task:\n   *        PromiseLike<T>`, but under that model, Promises were instantly created on the call-site and their executor\n   *        functions therefore ran immediately. Thus, even if the buffer was full, the action still happened. By\n   *        requiring the promise to be wrapped in a function, we can defer promise creation until after the buffer\n   *        limit check.\n   * @returns The original promise.\n   */\n  function add(taskProducer: () => PromiseLike<T>): PromiseLike<T> {\n    if (!isReady()) {\n      return rejectedSyncPromise(new SentryError('Not adding Promise because buffer limit was reached.'));\n    }\n\n    // start the task and add its promise to the queue\n    const task = taskProducer();\n    if (buffer.indexOf(task) === -1) {\n      buffer.push(task);\n    }\n    void task\n      .then(() => remove(task))\n      // Use `then(null, rejectionHandler)` rather than `catch(rejectionHandler)` so that we can use `PromiseLike`\n      // rather than `Promise`. `PromiseLike` doesn't have a `.catch` method, making its polyfill smaller. (ES5 didn't\n      // have promises, so TS has to polyfill when down-compiling.)\n      .then(null, () =>\n        remove(task).then(null, () => {\n          // We have to add another catch here because `remove()` starts a new promise chain.\n        }),\n      );\n    return task;\n  }\n\n  /**\n   * Wait for all promises in the queue to resolve or for timeout to expire, whichever comes first.\n   *\n   * @param timeout The time, in ms, after which to resolve to `false` if the queue is still non-empty. Passing `0` (or\n   * not passing anything) will make the promise wait as long as it takes for the queue to drain before resolving to\n   * `true`.\n   * @returns A promise which will resolve to `true` if the queue is already empty or drains before the timeout, and\n   * `false` otherwise\n   */\n  function drain(timeout?: number): PromiseLike<boolean> {\n    return new SyncPromise<boolean>((resolve, reject) => {\n      let counter = buffer.length;\n\n      if (!counter) {\n        return resolve(true);\n      }\n\n      // wait for `timeout` ms and then resolve to `false` (if not cancelled first)\n      const capturedSetTimeout = setTimeout(() => {\n        if (timeout && timeout > 0) {\n          resolve(false);\n        }\n      }, timeout);\n\n      // if all promises resolve in time, cancel the timer and resolve to `true`\n      buffer.forEach(item => {\n        void resolvedSyncPromise(item).then(() => {\n          if (!--counter) {\n            clearTimeout(capturedSetTimeout);\n            resolve(true);\n          }\n        }, reject);\n      });\n    });\n  }\n\n  return {\n    $: buffer,\n    add,\n    drain,\n  };\n}\n","import type { PropagationContext } from '../types-hoist';\nimport { uuid4 } from './misc';\n\n/**\n * Returns a new minimal propagation context.\n *\n * @deprecated Use `generateTraceId` and `generateSpanId` instead.\n */\nexport function generatePropagationContext(): PropagationContext {\n  return {\n    traceId: generateTraceId(),\n    spanId: generateSpanId(),\n  };\n}\n\n/**\n * Generate a random, valid trace ID.\n */\nexport function generateTraceId(): string {\n  return uuid4();\n}\n\n/**\n * Generate a random, valid span ID.\n */\nexport function generateSpanId(): string {\n  return uuid4().substring(16);\n}\n","import type { DataCategory, TransportMakeRequestResponse } from '../types-hoist';\n\n// Intentionally keeping the key broad, as we don't know for sure what rate limit headers get returned from backend\nexport type RateLimits = Record<string, number>;\n\nexport const DEFAULT_RETRY_AFTER = 60 * 1000; // 60 seconds\n\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param header string representation of 'Retry-After' header\n * @param now current unix timestamp\n *\n */\nexport function parseRetryAfterHeader(header: string, now: number = Date.now()): number {\n  const headerDelay = parseInt(`${header}`, 10);\n  if (!isNaN(headerDelay)) {\n    return headerDelay * 1000;\n  }\n\n  const headerDate = Date.parse(`${header}`);\n  if (!isNaN(headerDate)) {\n    return headerDate - now;\n  }\n\n  return DEFAULT_RETRY_AFTER;\n}\n\n/**\n * Gets the time that the given category is disabled until for rate limiting.\n * In case no category-specific limit is set but a general rate limit across all categories is active,\n * that time is returned.\n *\n * @return the time in ms that the category is disabled until or 0 if there's no active rate limit.\n */\nexport function disabledUntil(limits: RateLimits, dataCategory: DataCategory): number {\n  return limits[dataCategory] || limits.all || 0;\n}\n\n/**\n * Checks if a category is rate limited\n */\nexport function isRateLimited(limits: RateLimits, dataCategory: DataCategory, now: number = Date.now()): boolean {\n  return disabledUntil(limits, dataCategory) > now;\n}\n\n/**\n * Update ratelimits from incoming headers.\n *\n * @return the updated RateLimits object.\n */\nexport function updateRateLimits(\n  limits: RateLimits,\n  { statusCode, headers }: TransportMakeRequestResponse,\n  now: number = Date.now(),\n): RateLimits {\n  const updatedRateLimits: RateLimits = {\n    ...limits,\n  };\n\n  // \"The name is case-insensitive.\"\n  // https://developer.mozilla.org/en-US/docs/Web/API/Headers/get\n  const rateLimitHeader = headers && headers['x-sentry-rate-limits'];\n  const retryAfterHeader = headers && headers['retry-after'];\n\n  if (rateLimitHeader) {\n    /**\n     * rate limit headers are of the form\n     *     <header>,<header>,..\n     * where each <header> is of the form\n     *     <retry_after>: <categories>: <scope>: <reason_code>: <namespaces>\n     * where\n     *     <retry_after> is a delay in seconds\n     *     <categories> is the event type(s) (error, transaction, etc) being rate limited and is of the form\n     *         <category>;<category>;...\n     *     <scope> is what's being limited (org, project, or key) - ignored by SDK\n     *     <reason_code> is an arbitrary string like \"org_quota\" - ignored by SDK\n     *     <namespaces> Semicolon-separated list of metric namespace identifiers. Defines which namespace(s) will be affected.\n     *         Only present if rate limit applies to the metric_bucket data category.\n     */\n    for (const limit of rateLimitHeader.trim().split(',')) {\n      const [retryAfter, categories, , , namespaces] = limit.split(':', 5) as [string, ...string[]];\n      const headerDelay = parseInt(retryAfter, 10);\n      const delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000; // 60sec default\n      if (!categories) {\n        updatedRateLimits.all = now + delay;\n      } else {\n        for (const category of categories.split(';')) {\n          if (category === 'metric_bucket') {\n            // namespaces will be present when category === 'metric_bucket'\n            if (!namespaces || namespaces.split(';').includes('custom')) {\n              updatedRateLimits[category] = now + delay;\n            }\n          } else {\n            updatedRateLimits[category] = now + delay;\n          }\n        }\n      }\n    }\n  } else if (retryAfterHeader) {\n    updatedRateLimits.all = now + parseRetryAfterHeader(retryAfterHeader, now);\n  } else if (statusCode === 429) {\n    updatedRateLimits.all = now + 60 * 1000;\n  }\n\n  return updatedRateLimits;\n}\n","/* eslint-disable max-lines */\nimport type {\n  Event,\n  ExtractedNodeRequestData,\n  PolymorphicRequest,\n  RequestEventData,\n  TransactionSource,\n  WebFetchHeaders,\n  WebFetchRequest,\n} from '../types-hoist';\n\nimport { parseCookie } from './cookie';\nimport { DEBUG_BUILD } from './debug-build';\nimport { isPlainObject, isString } from './is';\nimport { logger } from './logger';\nimport { normalize } from './normalize';\nimport { dropUndefinedKeys } from './object';\nimport { truncate } from './string';\nimport { stripUrlQueryAndFragment } from './url';\nimport { getClientIPAddress, ipHeaderNames } from './vendor/getIpAddress';\n\nconst DEFAULT_INCLUDES = {\n  ip: false,\n  request: true,\n  user: true,\n};\nconst DEFAULT_REQUEST_INCLUDES = ['cookies', 'data', 'headers', 'method', 'query_string', 'url'];\nexport const DEFAULT_USER_INCLUDES = ['id', 'username', 'email'];\n\n/**\n * Options deciding what parts of the request to use when enhancing an event\n */\nexport type AddRequestDataToEventOptions = {\n  /** Flags controlling whether each type of data should be added to the event */\n  include?: {\n    ip?: boolean;\n    request?: boolean | Array<(typeof DEFAULT_REQUEST_INCLUDES)[number]>;\n    /** @deprecated This option will be removed in v9. It does not do anything anymore, the `transcation` is set in other places. */\n    // eslint-disable-next-line deprecation/deprecation\n    transaction?: boolean | TransactionNamingScheme;\n    user?: boolean | Array<(typeof DEFAULT_USER_INCLUDES)[number]>;\n  };\n\n  /** Injected platform-specific dependencies */\n  deps?: {\n    cookie: {\n      parse: (cookieStr: string) => Record<string, string>;\n    };\n    url: {\n      parse: (urlStr: string) => {\n        query: string | null;\n      };\n    };\n  };\n};\n\n/**\n * @deprecated This type will be removed in v9. It is not in use anymore.\n */\nexport type TransactionNamingScheme = 'path' | 'methodPath' | 'handler';\n\n/**\n * Extracts a complete and parameterized path from the request object and uses it to construct transaction name.\n * If the parameterized transaction name cannot be extracted, we fall back to the raw URL.\n *\n * Additionally, this function determines and returns the transaction name source\n *\n * eg. GET /mountpoint/user/:id\n *\n * @param req A request object\n * @param options What to include in the transaction name (method, path, or a custom route name to be\n *                used instead of the request's route)\n *\n * @returns A tuple of the fully constructed transaction name [0] and its source [1] (can be either 'route' or 'url')\n * @deprecated This method will be removed in v9. It is not in use anymore.\n */\nexport function extractPathForTransaction(\n  req: PolymorphicRequest,\n  options: { path?: boolean; method?: boolean; customRoute?: string } = {},\n): [string, TransactionSource] {\n  const method = req.method && req.method.toUpperCase();\n\n  let path = '';\n  let source: TransactionSource = 'url';\n\n  // Check to see if there's a parameterized route we can use (as there is in Express)\n  if (options.customRoute || req.route) {\n    path = options.customRoute || `${req.baseUrl || ''}${req.route && req.route.path}`;\n    source = 'route';\n  }\n\n  // Otherwise, just take the original URL\n  else if (req.originalUrl || req.url) {\n    path = stripUrlQueryAndFragment(req.originalUrl || req.url || '');\n  }\n\n  let name = '';\n  if (options.method && method) {\n    name += method;\n  }\n  if (options.method && options.path) {\n    name += ' ';\n  }\n  if (options.path && path) {\n    name += path;\n  }\n\n  return [name, source];\n}\n\nfunction extractUserData(\n  user: {\n    [key: string]: unknown;\n  },\n  keys: boolean | string[],\n): { [key: string]: unknown } {\n  const extractedUser: { [key: string]: unknown } = {};\n  const attributes = Array.isArray(keys) ? keys : DEFAULT_USER_INCLUDES;\n\n  attributes.forEach(key => {\n    if (user && key in user) {\n      extractedUser[key] = user[key];\n    }\n  });\n\n  return extractedUser;\n}\n\n/**\n * Normalize data from the request object, accounting for framework differences.\n *\n * @param req The request object from which to extract data\n * @param options.include An optional array of keys to include in the normalized data. Defaults to\n * DEFAULT_REQUEST_INCLUDES if not provided.\n * @param options.deps Injected, platform-specific dependencies\n * @returns An object containing normalized request data\n *\n * @deprecated Instead manually normalize the request data into a format that fits `addNormalizedRequestDataToEvent`.\n */\nexport function extractRequestData(\n  req: PolymorphicRequest,\n  options: {\n    include?: string[];\n  } = {},\n): ExtractedNodeRequestData {\n  const { include = DEFAULT_REQUEST_INCLUDES } = options;\n  const requestData: { [key: string]: unknown } = {};\n\n  // headers:\n  //   node, express, koa, nextjs: req.headers\n  const headers = (req.headers || {}) as typeof req.headers & {\n    host?: string;\n    cookie?: string;\n  };\n  // method:\n  //   node, express, koa, nextjs: req.method\n  const method = req.method;\n  // host:\n  //   express: req.hostname in > 4 and req.host in < 4\n  //   koa: req.host\n  //   node, nextjs: req.headers.host\n  // Express 4 mistakenly strips off port number from req.host / req.hostname so we can't rely on them\n  // See: https://github.com/expressjs/express/issues/3047#issuecomment-236653223\n  // Also: https://github.com/getsentry/sentry-javascript/issues/1917\n  const host = headers.host || req.hostname || req.host || '<no host>';\n  // protocol:\n  //   node, nextjs: <n/a>\n  //   express, koa: req.protocol\n  const protocol = req.protocol === 'https' || (req.socket && req.socket.encrypted) ? 'https' : 'http';\n  // url (including path and query string):\n  //   node, express: req.originalUrl\n  //   koa, nextjs: req.url\n  const originalUrl = req.originalUrl || req.url || '';\n  // absolute url\n  const absoluteUrl = originalUrl.startsWith(protocol) ? originalUrl : `${protocol}://${host}${originalUrl}`;\n  include.forEach(key => {\n    switch (key) {\n      case 'headers': {\n        requestData.headers = headers;\n\n        // Remove the Cookie header in case cookie data should not be included in the event\n        if (!include.includes('cookies')) {\n          delete (requestData.headers as { cookie?: string }).cookie;\n        }\n\n        // Remove IP headers in case IP data should not be included in the event\n        if (!include.includes('ip')) {\n          ipHeaderNames.forEach(ipHeaderName => {\n            // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n            delete (requestData.headers as Record<string, unknown>)[ipHeaderName];\n          });\n        }\n\n        break;\n      }\n      case 'method': {\n        requestData.method = method;\n        break;\n      }\n      case 'url': {\n        requestData.url = absoluteUrl;\n        break;\n      }\n      case 'cookies': {\n        // cookies:\n        //   node, express, koa: req.headers.cookie\n        //   vercel, sails.js, express (w/ cookie middleware), nextjs: req.cookies\n        requestData.cookies =\n          // TODO (v8 / #5257): We're only sending the empty object for backwards compatibility, so the last bit can\n          // come off in v8\n          req.cookies || (headers.cookie && parseCookie(headers.cookie)) || {};\n        break;\n      }\n      case 'query_string': {\n        // query string:\n        //   node: req.url (raw)\n        //   express, koa, nextjs: req.query\n        requestData.query_string = extractQueryParams(req);\n        break;\n      }\n      case 'data': {\n        if (method === 'GET' || method === 'HEAD') {\n          break;\n        }\n        // NOTE: As of v8, request is (unless a user sets this manually) ALWAYS a http request\n        // Which does not have a body by default\n        // However, in our http instrumentation, we patch the request to capture the body and store it on the\n        // request as `.body` anyhow\n        // In v9, we may update requestData to only work with plain http requests\n        // body data:\n        //   express, koa, nextjs: req.body\n        //\n        //   when using node by itself, you have to read the incoming stream(see\n        //   https://nodejs.dev/learn/get-http-request-body-data-using-nodejs); if a user is doing that, we can't know\n        //   where they're going to store the final result, so they'll have to capture this data themselves\n        const body = req.body;\n        if (body !== undefined) {\n          const stringBody: string = isString(body)\n            ? body\n            : isPlainObject(body)\n              ? JSON.stringify(normalize(body))\n              : truncate(`${body}`, 1024);\n          if (stringBody) {\n            requestData.data = stringBody;\n          }\n        }\n        break;\n      }\n      default: {\n        if ({}.hasOwnProperty.call(req, key)) {\n          requestData[key] = (req as { [key: string]: unknown })[key];\n        }\n      }\n    }\n  });\n\n  return requestData;\n}\n\n/**\n * Add already normalized request data to an event.\n * This mutates the passed in event.\n */\nexport function addNormalizedRequestDataToEvent(\n  event: Event,\n  req: RequestEventData,\n  // This is non-standard data that is not part of the regular HTTP request\n  additionalData: { ipAddress?: string; user?: Record<string, unknown> },\n  options: AddRequestDataToEventOptions,\n): void {\n  const include = {\n    ...DEFAULT_INCLUDES,\n    ...(options && options.include),\n  };\n\n  if (include.request) {\n    const includeRequest = Array.isArray(include.request) ? [...include.request] : [...DEFAULT_REQUEST_INCLUDES];\n    if (include.ip) {\n      includeRequest.push('ip');\n    }\n\n    const extractedRequestData = extractNormalizedRequestData(req, { include: includeRequest });\n\n    event.request = {\n      ...event.request,\n      ...extractedRequestData,\n    };\n  }\n\n  if (include.user) {\n    const extractedUser =\n      additionalData.user && isPlainObject(additionalData.user)\n        ? extractUserData(additionalData.user, include.user)\n        : {};\n\n    if (Object.keys(extractedUser).length) {\n      event.user = {\n        ...extractedUser,\n        ...event.user,\n      };\n    }\n  }\n\n  if (include.ip) {\n    const ip = (req.headers && getClientIPAddress(req.headers)) || additionalData.ipAddress;\n    if (ip) {\n      event.user = {\n        ...event.user,\n        ip_address: ip,\n      };\n    }\n  }\n}\n\n/**\n * Add data from the given request to the given event\n *\n * @param event The event to which the request data will be added\n * @param req Request object\n * @param options.include Flags to control what data is included\n * @param options.deps Injected platform-specific dependencies\n * @returns The mutated `Event` object\n *\n * @deprecated Use `addNormalizedRequestDataToEvent` instead.\n */\nexport function addRequestDataToEvent(\n  event: Event,\n  req: PolymorphicRequest,\n  options?: AddRequestDataToEventOptions,\n): Event {\n  const include = {\n    ...DEFAULT_INCLUDES,\n    ...(options && options.include),\n  };\n\n  if (include.request) {\n    const includeRequest = Array.isArray(include.request) ? [...include.request] : [...DEFAULT_REQUEST_INCLUDES];\n    if (include.ip) {\n      includeRequest.push('ip');\n    }\n\n    // eslint-disable-next-line deprecation/deprecation\n    const extractedRequestData = extractRequestData(req, { include: includeRequest });\n\n    event.request = {\n      ...event.request,\n      ...extractedRequestData,\n    };\n  }\n\n  if (include.user) {\n    const extractedUser = req.user && isPlainObject(req.user) ? extractUserData(req.user, include.user) : {};\n\n    if (Object.keys(extractedUser).length) {\n      event.user = {\n        ...event.user,\n        ...extractedUser,\n      };\n    }\n  }\n\n  // client ip:\n  //   node, nextjs: req.socket.remoteAddress\n  //   express, koa: req.ip\n  //   It may also be sent by proxies as specified in X-Forwarded-For or similar headers\n  if (include.ip) {\n    const ip = (req.headers && getClientIPAddress(req.headers)) || req.ip || (req.socket && req.socket.remoteAddress);\n    if (ip) {\n      event.user = {\n        ...event.user,\n        ip_address: ip,\n      };\n    }\n  }\n\n  return event;\n}\n\nfunction extractQueryParams(req: PolymorphicRequest): string | Record<string, unknown> | undefined {\n  // url (including path and query string):\n  //   node, express: req.originalUrl\n  //   koa, nextjs: req.url\n  let originalUrl = req.originalUrl || req.url || '';\n\n  if (!originalUrl) {\n    return;\n  }\n\n  // The `URL` constructor can't handle internal URLs of the form `/some/path/here`, so stick a dummy protocol and\n  // hostname on the beginning. Since the point here is just to grab the query string, it doesn't matter what we use.\n  if (originalUrl.startsWith('/')) {\n    originalUrl = `http://dogs.are.great${originalUrl}`;\n  }\n\n  try {\n    const queryParams = req.query || new URL(originalUrl).search.slice(1);\n    return queryParams.length ? queryParams : undefined;\n  } catch {\n    return undefined;\n  }\n}\n\n/**\n * Transforms a `Headers` object that implements the `Web Fetch API` (https://developer.mozilla.org/en-US/docs/Web/API/Headers) into a simple key-value dict.\n * The header keys will be lower case: e.g. A \"Content-Type\" header will be stored as \"content-type\".\n */\n// TODO(v8): Make this function return undefined when the extraction fails.\nexport function winterCGHeadersToDict(winterCGHeaders: WebFetchHeaders): Record<string, string> {\n  const headers: Record<string, string> = {};\n  try {\n    winterCGHeaders.forEach((value, key) => {\n      if (typeof value === 'string') {\n        // We check that value is a string even though it might be redundant to make sure prototype pollution is not possible.\n        headers[key] = value;\n      }\n    });\n  } catch (e) {\n    DEBUG_BUILD &&\n      logger.warn('Sentry failed extracting headers from a request object. If you see this, please file an issue.');\n  }\n\n  return headers;\n}\n\n/**\n * Convert common request headers to a simple dictionary.\n */\nexport function headersToDict(reqHeaders: Record<string, string | string[] | undefined>): Record<string, string> {\n  const headers: Record<string, string> = Object.create(null);\n\n  try {\n    Object.entries(reqHeaders).forEach(([key, value]) => {\n      if (typeof value === 'string') {\n        headers[key] = value;\n      }\n    });\n  } catch (e) {\n    DEBUG_BUILD &&\n      logger.warn('Sentry failed extracting headers from a request object. If you see this, please file an issue.');\n  }\n\n  return headers;\n}\n\n/**\n * Converts a `Request` object that implements the `Web Fetch API` (https://developer.mozilla.org/en-US/docs/Web/API/Headers) into the format that the `RequestData` integration understands.\n */\nexport function winterCGRequestToRequestData(req: WebFetchRequest): RequestEventData {\n  const headers = winterCGHeadersToDict(req.headers);\n\n  return {\n    method: req.method,\n    url: req.url,\n    query_string: extractQueryParamsFromUrl(req.url),\n    headers,\n    // TODO: Can we extract body data from the request?\n  };\n}\n\n/**\n * Convert a HTTP request object to RequestEventData to be passed as normalizedRequest.\n * Instead of allowing `PolymorphicRequest` to be passed,\n * we want to be more specific and generally require a http.IncomingMessage-like object.\n */\nexport function httpRequestToRequestData(request: {\n  method?: string;\n  url?: string;\n  headers?: {\n    [key: string]: string | string[] | undefined;\n  };\n  protocol?: string;\n  socket?: unknown;\n}): RequestEventData {\n  const headers = request.headers || {};\n  const host = headers.host || '<no host>';\n  const protocol = request.socket && (request.socket as { encrypted?: boolean }).encrypted ? 'https' : 'http';\n  const originalUrl = request.url || '';\n  const absoluteUrl = originalUrl.startsWith(protocol) ? originalUrl : `${protocol}://${host}${originalUrl}`;\n\n  // This is non-standard, but may be sometimes set\n  // It may be overwritten later by our own body handling\n  const data = (request as PolymorphicRequest).body || undefined;\n\n  // This is non-standard, but may be set on e.g. Next.js or Express requests\n  const cookies = (request as PolymorphicRequest).cookies;\n\n  return dropUndefinedKeys({\n    url: absoluteUrl,\n    method: request.method,\n    query_string: extractQueryParamsFromUrl(originalUrl),\n    headers: headersToDict(headers),\n    cookies,\n    data,\n  });\n}\n\n/** Extract the query params from an URL. */\nexport function extractQueryParamsFromUrl(url: string): string | undefined {\n  // url is path and query string\n  if (!url) {\n    return;\n  }\n\n  try {\n    // The `URL` constructor can't handle internal URLs of the form `/some/path/here`, so stick a dummy protocol and\n    // hostname as the base. Since the point here is just to grab the query string, it doesn't matter what we use.\n    const queryParams = new URL(url, 'http://dogs.are.great').search.slice(1);\n    return queryParams.length ? queryParams : undefined;\n  } catch {\n    return undefined;\n  }\n}\n\nfunction extractNormalizedRequestData(\n  normalizedRequest: RequestEventData,\n  { include }: { include: string[] },\n): RequestEventData {\n  const includeKeys = include ? (Array.isArray(include) ? include : DEFAULT_REQUEST_INCLUDES) : [];\n\n  const requestData: RequestEventData = {};\n  const headers = { ...normalizedRequest.headers };\n\n  if (includeKeys.includes('headers')) {\n    requestData.headers = headers;\n\n    // Remove the Cookie header in case cookie data should not be included in the event\n    if (!include.includes('cookies')) {\n      delete (headers as { cookie?: string }).cookie;\n    }\n\n    // Remove IP headers in case IP data should not be included in the event\n    if (!include.includes('ip')) {\n      ipHeaderNames.forEach(ipHeaderName => {\n        // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n        delete (headers as Record<string, unknown>)[ipHeaderName];\n      });\n    }\n  }\n\n  if (includeKeys.includes('method')) {\n    requestData.method = normalizedRequest.method;\n  }\n\n  if (includeKeys.includes('url')) {\n    requestData.url = normalizedRequest.url;\n  }\n\n  if (includeKeys.includes('cookies')) {\n    const cookies = normalizedRequest.cookies || (headers && headers.cookie ? parseCookie(headers.cookie) : undefined);\n    requestData.cookies = cookies || {};\n  }\n\n  if (includeKeys.includes('query_string')) {\n    requestData.query_string = normalizedRequest.query_string;\n  }\n\n  if (includeKeys.includes('data')) {\n    requestData.data = normalizedRequest.data;\n  }\n\n  return requestData;\n}\n","import type { SeverityLevel } from '../types-hoist';\n\n/**\n * @deprecated This variable has been deprecated and will be removed in the next major version.\n */\nexport const validSeverityLevels = ['fatal', 'error', 'warning', 'log', 'info', 'debug'];\n\n/**\n * Converts a string-based level into a `SeverityLevel`, normalizing it along the way.\n *\n * @param level String representation of desired `SeverityLevel`.\n * @returns The `SeverityLevel` corresponding to the given string, or 'log' if the string isn't a valid level.\n */\nexport function severityLevelFromString(level: SeverityLevel | string): SeverityLevel {\n  return (\n    level === 'warn' ? 'warning' : ['fatal', 'error', 'warning', 'log', 'info', 'debug'].includes(level) ? level : 'log'\n  ) as SeverityLevel;\n}\n","import type { Event, StackFrame, StackLineParser, StackParser } from '../types-hoist';\n\nconst STACKTRACE_FRAME_LIMIT = 50;\nexport const UNKNOWN_FUNCTION = '?';\n// Used to sanitize webpack (error: *) wrapped stack errors\nconst WEBPACK_ERROR_REGEXP = /\\(error: (.*)\\)/;\nconst STRIP_FRAME_REGEXP = /captureMessage|captureException/;\n\n/**\n * Creates a stack parser with the supplied line parsers\n *\n * StackFrames are returned in the correct order for Sentry Exception\n * frames and with Sentry SDK internal frames removed from the top and bottom\n *\n */\nexport function createStackParser(...parsers: StackLineParser[]): StackParser {\n  const sortedParsers = parsers.sort((a, b) => a[0] - b[0]).map(p => p[1]);\n\n  return (stack: string, skipFirstLines: number = 0, framesToPop: number = 0): StackFrame[] => {\n    const frames: StackFrame[] = [];\n    const lines = stack.split('\\n');\n\n    for (let i = skipFirstLines; i < lines.length; i++) {\n      const line = lines[i] as string;\n      // Ignore lines over 1kb as they are unlikely to be stack frames.\n      // Many of the regular expressions use backtracking which results in run time that increases exponentially with\n      // input size. Huge strings can result in hangs/Denial of Service:\n      // https://github.com/getsentry/sentry-javascript/issues/2286\n      if (line.length > 1024) {\n        continue;\n      }\n\n      // https://github.com/getsentry/sentry-javascript/issues/5459\n      // Remove webpack (error: *) wrappers\n      const cleanedLine = WEBPACK_ERROR_REGEXP.test(line) ? line.replace(WEBPACK_ERROR_REGEXP, '$1') : line;\n\n      // https://github.com/getsentry/sentry-javascript/issues/7813\n      // Skip Error: lines\n      if (cleanedLine.match(/\\S*Error: /)) {\n        continue;\n      }\n\n      for (const parser of sortedParsers) {\n        const frame = parser(cleanedLine);\n\n        if (frame) {\n          frames.push(frame);\n          break;\n        }\n      }\n\n      if (frames.length >= STACKTRACE_FRAME_LIMIT + framesToPop) {\n        break;\n      }\n    }\n\n    return stripSentryFramesAndReverse(frames.slice(framesToPop));\n  };\n}\n\n/**\n * Gets a stack parser implementation from Options.stackParser\n * @see Options\n *\n * If options contains an array of line parsers, it is converted into a parser\n */\nexport function stackParserFromStackParserOptions(stackParser: StackParser | StackLineParser[]): StackParser {\n  if (Array.isArray(stackParser)) {\n    return createStackParser(...stackParser);\n  }\n  return stackParser;\n}\n\n/**\n * Removes Sentry frames from the top and bottom of the stack if present and enforces a limit of max number of frames.\n * Assumes stack input is ordered from top to bottom and returns the reverse representation so call site of the\n * function that caused the crash is the last frame in the array.\n * @hidden\n */\nexport function stripSentryFramesAndReverse(stack: ReadonlyArray<StackFrame>): StackFrame[] {\n  if (!stack.length) {\n    return [];\n  }\n\n  const localStack = Array.from(stack);\n\n  // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n  if (/sentryWrapped/.test(getLastStackFrame(localStack).function || '')) {\n    localStack.pop();\n  }\n\n  // Reversing in the middle of the procedure allows us to just pop the values off the stack\n  localStack.reverse();\n\n  // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n  if (STRIP_FRAME_REGEXP.test(getLastStackFrame(localStack).function || '')) {\n    localStack.pop();\n\n    // When using synthetic events, we will have a 2 levels deep stack, as `new Error('Sentry syntheticException')`\n    // is produced within the hub itself, making it:\n    //\n    //   Sentry.captureException()\n    //   getCurrentHub().captureException()\n    //\n    // instead of just the top `Sentry` call itself.\n    // This forces us to possibly strip an additional frame in the exact same was as above.\n    if (STRIP_FRAME_REGEXP.test(getLastStackFrame(localStack).function || '')) {\n      localStack.pop();\n    }\n  }\n\n  return localStack.slice(0, STACKTRACE_FRAME_LIMIT).map(frame => ({\n    ...frame,\n    filename: frame.filename || getLastStackFrame(localStack).filename,\n    function: frame.function || UNKNOWN_FUNCTION,\n  }));\n}\n\nfunction getLastStackFrame(arr: StackFrame[]): StackFrame {\n  return arr[arr.length - 1] || {};\n}\n\nconst defaultFunctionName = '<anonymous>';\n\n/**\n * Safely extract function name from itself\n */\nexport function getFunctionName(fn: unknown): string {\n  try {\n    if (!fn || typeof fn !== 'function') {\n      return defaultFunctionName;\n    }\n    return fn.name || defaultFunctionName;\n  } catch (e) {\n    // Just accessing custom props in some Selenium environments\n    // can cause a \"Permission denied\" exception (see raven-js#495).\n    return defaultFunctionName;\n  }\n}\n\n/**\n * Get's stack frames from an event without needing to check for undefined properties.\n */\nexport function getFramesFromEvent(event: Event): StackFrame[] | undefined {\n  const exception = event.exception;\n\n  if (exception) {\n    const frames: StackFrame[] = [];\n    try {\n      // @ts-expect-error Object could be undefined\n      exception.values.forEach(value => {\n        // @ts-expect-error Value could be undefined\n        if (value.stacktrace.frames) {\n          // @ts-expect-error Value could be undefined\n          frames.push(...value.stacktrace.frames);\n        }\n      });\n      return frames;\n    } catch (_oO) {\n      return undefined;\n    }\n  }\n  return undefined;\n}\n","import { isRegExp, isString, isVueViewModel } from './is';\n\nexport { escapeStringForRegex } from './vendor/escapeStringForRegex';\n\n/**\n * Truncates given string to the maximum characters count\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string (0 = unlimited)\n * @returns string Encoded\n */\nexport function truncate(str: string, max: number = 0): string {\n  if (typeof str !== 'string' || max === 0) {\n    return str;\n  }\n  return str.length <= max ? str : `${str.slice(0, max)}...`;\n}\n\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function snipLine(line: string, colno: number): string {\n  let newLine = line;\n  const lineLength = newLine.length;\n  if (lineLength <= 150) {\n    return newLine;\n  }\n  if (colno > lineLength) {\n    // eslint-disable-next-line no-param-reassign\n    colno = lineLength;\n  }\n\n  let start = Math.max(colno - 60, 0);\n  if (start < 5) {\n    start = 0;\n  }\n\n  let end = Math.min(start + 140, lineLength);\n  if (end > lineLength - 5) {\n    end = lineLength;\n  }\n  if (end === lineLength) {\n    start = Math.max(end - 140, 0);\n  }\n\n  newLine = newLine.slice(start, end);\n  if (start > 0) {\n    newLine = `'{snip} ${newLine}`;\n  }\n  if (end < lineLength) {\n    newLine += ' {snip}';\n  }\n\n  return newLine;\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns Joined values\n */\nexport function safeJoin(input: unknown[], delimiter?: string): string {\n  if (!Array.isArray(input)) {\n    return '';\n  }\n\n  const output = [];\n  // eslint-disable-next-line @typescript-eslint/prefer-for-of\n  for (let i = 0; i < input.length; i++) {\n    const value = input[i];\n    try {\n      // This is a hack to fix a Vue3-specific bug that causes an infinite loop of\n      // console warnings. This happens when a Vue template is rendered with\n      // an undeclared variable, which we try to stringify, ultimately causing\n      // Vue to issue another warning which repeats indefinitely.\n      // see: https://github.com/getsentry/sentry-javascript/pull/8981\n      if (isVueViewModel(value)) {\n        output.push('[VueViewModel]');\n      } else {\n        output.push(String(value));\n      }\n    } catch (e) {\n      output.push('[value cannot be serialized]');\n    }\n  }\n\n  return output.join(delimiter);\n}\n\n/**\n * Checks if the given value matches a regex or string\n *\n * @param value The string to test\n * @param pattern Either a regex or a string against which `value` will be matched\n * @param requireExactStringMatch If true, `value` must match `pattern` exactly. If false, `value` will match\n * `pattern` if it contains `pattern`. Only applies to string-type patterns.\n */\nexport function isMatchingPattern(\n  value: string,\n  pattern: RegExp | string,\n  requireExactStringMatch: boolean = false,\n): boolean {\n  if (!isString(value)) {\n    return false;\n  }\n\n  if (isRegExp(pattern)) {\n    return pattern.test(value);\n  }\n  if (isString(pattern)) {\n    return requireExactStringMatch ? value === pattern : value.includes(pattern);\n  }\n\n  return false;\n}\n\n/**\n * Test the given string against an array of strings and regexes. By default, string matching is done on a\n * substring-inclusion basis rather than a strict equality basis\n *\n * @param testString The string to test\n * @param patterns The patterns against which to test the string\n * @param requireExactStringMatch If true, `testString` must match one of the given string patterns exactly in order to\n * count. If false, `testString` will match a string pattern if it contains that pattern.\n * @returns\n */\nexport function stringMatchesSomePattern(\n  testString: string,\n  patterns: Array<string | RegExp> = [],\n  requireExactStringMatch: boolean = false,\n): boolean {\n  return patterns.some(pattern => isMatchingPattern(testString, pattern, requireExactStringMatch));\n}\n","import { DEBUG_BUILD } from './debug-build';\nimport { logger } from './logger';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst WINDOW = GLOBAL_OBJ as unknown as Window;\n\ndeclare const EdgeRuntime: string | undefined;\n\nexport { supportsHistory } from './vendor/supportsHistory';\n\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent(): boolean {\n  try {\n    new ErrorEvent('');\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError(): boolean {\n  try {\n    // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n    // 1 argument required, but only 0 present.\n    // @ts-expect-error It really needs 1 argument, not 0.\n    new DOMError('');\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException(): boolean {\n  try {\n    new DOMException('');\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsFetch(): boolean {\n  if (!('fetch' in WINDOW)) {\n    return false;\n  }\n\n  try {\n    new Headers();\n    new Request('http://www.example.com');\n    new Response();\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * isNative checks if the given function is a native implementation\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isNativeFunction(func: Function): boolean {\n  return func && /^function\\s+\\w+\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch(): boolean {\n  if (typeof EdgeRuntime === 'string') {\n    return true;\n  }\n\n  if (!supportsFetch()) {\n    return false;\n  }\n\n  // Fast path to avoid DOM I/O\n  // eslint-disable-next-line @typescript-eslint/unbound-method\n  if (isNativeFunction(WINDOW.fetch)) {\n    return true;\n  }\n\n  // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n  // so create a \"pure\" iframe to see if that has native fetch\n  let result = false;\n  const doc = WINDOW.document;\n  // eslint-disable-next-line deprecation/deprecation\n  if (doc && typeof (doc.createElement as unknown) === 'function') {\n    try {\n      const sandbox = doc.createElement('iframe');\n      sandbox.hidden = true;\n      doc.head.appendChild(sandbox);\n      if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        result = isNativeFunction(sandbox.contentWindow.fetch);\n      }\n      doc.head.removeChild(sandbox);\n    } catch (err) {\n      DEBUG_BUILD &&\n        logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n    }\n  }\n\n  return result;\n}\n\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver(): boolean {\n  return 'ReportingObserver' in WINDOW;\n}\n\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReferrerPolicy(): boolean {\n  // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'\n  // (see https://caniuse.com/#feat=referrer-policy),\n  // it doesn't. And it throws an exception instead of ignoring this parameter...\n  // REF: https://github.com/getsentry/raven-js/issues/1233\n\n  if (!supportsFetch()) {\n    return false;\n  }\n\n  try {\n    new Request('_', {\n      referrerPolicy: 'origin' as ReferrerPolicy,\n    });\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n","/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { isThenable } from './is';\n\n/** SyncPromise internal states */\nconst enum States {\n  /** Pending */\n  PENDING = 0,\n  /** Resolved / OK */\n  RESOLVED = 1,\n  /** Rejected / Error */\n  REJECTED = 2,\n}\n\n// Overloads so we can call resolvedSyncPromise without arguments and generic argument\nexport function resolvedSyncPromise(): PromiseLike<void>;\nexport function resolvedSyncPromise<T>(value: T | PromiseLike<T>): PromiseLike<T>;\n\n/**\n * Creates a resolved sync promise.\n *\n * @param value the value to resolve the promise with\n * @returns the resolved sync promise\n */\nexport function resolvedSyncPromise<T>(value?: T | PromiseLike<T>): PromiseLike<T> {\n  return new SyncPromise(resolve => {\n    resolve(value);\n  });\n}\n\n/**\n * Creates a rejected sync promise.\n *\n * @param value the value to reject the promise with\n * @returns the rejected sync promise\n */\nexport function rejectedSyncPromise<T = never>(reason?: any): PromiseLike<T> {\n  return new SyncPromise((_, reject) => {\n    reject(reason);\n  });\n}\n\n/**\n * Thenable class that behaves like a Promise and follows it's interface\n * but is not async internally\n */\nclass SyncPromise<T> implements PromiseLike<T> {\n  private _state: States;\n  private _handlers: Array<[boolean, (value: T) => void, (reason: any) => any]>;\n  private _value: any;\n\n  public constructor(\n    executor: (resolve: (value?: T | PromiseLike<T> | null) => void, reject: (reason?: any) => void) => void,\n  ) {\n    this._state = States.PENDING;\n    this._handlers = [];\n\n    try {\n      executor(this._resolve, this._reject);\n    } catch (e) {\n      this._reject(e);\n    }\n  }\n\n  /** JSDoc */\n  public then<TResult1 = T, TResult2 = never>(\n    onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n  ): PromiseLike<TResult1 | TResult2> {\n    return new SyncPromise((resolve, reject) => {\n      this._handlers.push([\n        false,\n        result => {\n          if (!onfulfilled) {\n            // TODO: ¯\\_(ツ)_/¯\n            // TODO: FIXME\n            resolve(result as any);\n          } else {\n            try {\n              resolve(onfulfilled(result));\n            } catch (e) {\n              reject(e);\n            }\n          }\n        },\n        reason => {\n          if (!onrejected) {\n            reject(reason);\n          } else {\n            try {\n              resolve(onrejected(reason));\n            } catch (e) {\n              reject(e);\n            }\n          }\n        },\n      ]);\n      this._executeHandlers();\n    });\n  }\n\n  /** JSDoc */\n  public catch<TResult = never>(\n    onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null,\n  ): PromiseLike<T | TResult> {\n    return this.then(val => val, onrejected);\n  }\n\n  /** JSDoc */\n  public finally<TResult>(onfinally?: (() => void) | null): PromiseLike<TResult> {\n    return new SyncPromise<TResult>((resolve, reject) => {\n      let val: TResult | any;\n      let isRejected: boolean;\n\n      return this.then(\n        value => {\n          isRejected = false;\n          val = value;\n          if (onfinally) {\n            onfinally();\n          }\n        },\n        reason => {\n          isRejected = true;\n          val = reason;\n          if (onfinally) {\n            onfinally();\n          }\n        },\n      ).then(() => {\n        if (isRejected) {\n          reject(val);\n          return;\n        }\n\n        resolve(val as unknown as any);\n      });\n    });\n  }\n\n  /** JSDoc */\n  private readonly _resolve = (value?: T | PromiseLike<T> | null) => {\n    this._setResult(States.RESOLVED, value);\n  };\n\n  /** JSDoc */\n  private readonly _reject = (reason?: any) => {\n    this._setResult(States.REJECTED, reason);\n  };\n\n  /** JSDoc */\n  private readonly _setResult = (state: States, value?: T | PromiseLike<T> | any) => {\n    if (this._state !== States.PENDING) {\n      return;\n    }\n\n    if (isThenable(value)) {\n      void (value as PromiseLike<T>).then(this._resolve, this._reject);\n      return;\n    }\n\n    this._state = state;\n    this._value = value;\n\n    this._executeHandlers();\n  };\n\n  /** JSDoc */\n  private readonly _executeHandlers = () => {\n    if (this._state === States.PENDING) {\n      return;\n    }\n\n    const cachedHandlers = this._handlers.slice();\n    this._handlers = [];\n\n    cachedHandlers.forEach(handler => {\n      if (handler[0]) {\n        return;\n      }\n\n      if (this._state === States.RESOLVED) {\n        handler[1](this._value as unknown as any);\n      }\n\n      if (this._state === States.REJECTED) {\n        handler[2](this._value);\n      }\n\n      handler[0] = true;\n    });\n  };\n}\n\nexport { SyncPromise };\n","import { GLOBAL_OBJ } from './worldwide';\n\nconst ONE_SECOND_IN_MS = 1000;\n\n/**\n * A partial definition of the [Performance Web API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Performance}\n * for accessing a high-resolution monotonic clock.\n */\ninterface Performance {\n  /**\n   * The millisecond timestamp at which measurement began, measured in Unix time.\n   */\n  timeOrigin: number;\n  /**\n   * Returns the current millisecond timestamp, where 0 represents the start of measurement.\n   */\n  now(): number;\n}\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n *\n * TODO(v8): Return type should be rounded.\n */\nexport function dateTimestampInSeconds(): number {\n  return Date.now() / ONE_SECOND_IN_MS;\n}\n\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\nfunction createUnixTimestampInSecondsFunc(): () => number {\n  const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & { performance?: Performance };\n  if (!performance || !performance.now) {\n    return dateTimestampInSeconds;\n  }\n\n  // Some browser and environments don't have a timeOrigin, so we fallback to\n  // using Date.now() to compute the starting time.\n  const approxStartingTimeOrigin = Date.now() - performance.now();\n  const timeOrigin = performance.timeOrigin == undefined ? approxStartingTimeOrigin : performance.timeOrigin;\n\n  // performance.now() is a monotonic clock, which means it starts at 0 when the process begins. To get the current\n  // wall clock time (actual UNIX timestamp), we need to add the starting time origin and the current time elapsed.\n  //\n  // TODO: This does not account for the case where the monotonic clock that powers performance.now() drifts from the\n  // wall clock time, which causes the returned timestamp to be inaccurate. We should investigate how to detect and\n  // correct for this.\n  // See: https://github.com/getsentry/sentry-javascript/issues/2590\n  // See: https://github.com/mdn/content/issues/4713\n  // See: https://dev.to/noamr/when-a-millisecond-is-not-a-millisecond-3h6\n  return () => {\n    return (timeOrigin + performance.now()) / ONE_SECOND_IN_MS;\n  };\n}\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\nexport const timestampInSeconds = createUnixTimestampInSecondsFunc();\n\n/**\n * Internal helper to store what is the source of browserPerformanceTimeOrigin below. For debugging only.\n *\n * @deprecated This variable will be removed in the next major version.\n */\nexport let _browserPerformanceTimeOriginMode: string;\n\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\nexport const browserPerformanceTimeOrigin = ((): number | undefined => {\n  // Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n  // performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n  // data as reliable if they are within a reasonable threshold of the current time.\n\n  const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n  if (!performance || !performance.now) {\n    // eslint-disable-next-line deprecation/deprecation\n    _browserPerformanceTimeOriginMode = 'none';\n    return undefined;\n  }\n\n  const threshold = 3600 * 1000;\n  const performanceNow = performance.now();\n  const dateNow = Date.now();\n\n  // if timeOrigin isn't available set delta to threshold so it isn't used\n  const timeOriginDelta = performance.timeOrigin\n    ? Math.abs(performance.timeOrigin + performanceNow - dateNow)\n    : threshold;\n  const timeOriginIsReliable = timeOriginDelta < threshold;\n\n  // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n  // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n  // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n  // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n  // Date API.\n  // eslint-disable-next-line deprecation/deprecation\n  const navigationStart = performance.timing && performance.timing.navigationStart;\n  const hasNavigationStart = typeof navigationStart === 'number';\n  // if navigationStart isn't available set delta to threshold so it isn't used\n  const navigationStartDelta = hasNavigationStart ? Math.abs(navigationStart + performanceNow - dateNow) : threshold;\n  const navigationStartIsReliable = navigationStartDelta < threshold;\n\n  if (timeOriginIsReliable || navigationStartIsReliable) {\n    // Use the more reliable time origin\n    if (timeOriginDelta <= navigationStartDelta) {\n      // eslint-disable-next-line deprecation/deprecation\n      _browserPerformanceTimeOriginMode = 'timeOrigin';\n      return performance.timeOrigin;\n    } else {\n      // eslint-disable-next-line deprecation/deprecation\n      _browserPerformanceTimeOriginMode = 'navigationStart';\n      return navigationStart;\n    }\n  }\n\n  // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to Date.\n  // eslint-disable-next-line deprecation/deprecation\n  _browserPerformanceTimeOriginMode = 'dateNow';\n  return dateNow;\n})();\n","import type { PropagationContext, TraceparentData } from '../types-hoist';\n\nimport { baggageHeaderToDynamicSamplingContext } from './baggage';\nimport { generateSpanId, generateTraceId } from './propagationContext';\n\n// eslint-disable-next-line @sentry-internal/sdk/no-regexp-constructor -- RegExp is used for readability here\nexport const TRACEPARENT_REGEXP = new RegExp(\n  '^[ \\\\t]*' + // whitespace\n    '([0-9a-f]{32})?' + // trace_id\n    '-?([0-9a-f]{16})?' + // span_id\n    '-?([01])?' + // sampled\n    '[ \\\\t]*$', // whitespace\n);\n\n/**\n * Extract transaction context data from a `sentry-trace` header.\n *\n * @param traceparent Traceparent string\n *\n * @returns Object containing data from the header, or undefined if traceparent string is malformed\n */\nexport function extractTraceparentData(traceparent?: string): TraceparentData | undefined {\n  if (!traceparent) {\n    return undefined;\n  }\n\n  const matches = traceparent.match(TRACEPARENT_REGEXP);\n  if (!matches) {\n    return undefined;\n  }\n\n  let parentSampled: boolean | undefined;\n  if (matches[3] === '1') {\n    parentSampled = true;\n  } else if (matches[3] === '0') {\n    parentSampled = false;\n  }\n\n  return {\n    traceId: matches[1],\n    parentSampled,\n    parentSpanId: matches[2],\n  };\n}\n\n/**\n * Create a propagation context from incoming headers or\n * creates a minimal new one if the headers are undefined.\n */\nexport function propagationContextFromHeaders(\n  sentryTrace: string | undefined,\n  baggage: string | number | boolean | string[] | null | undefined,\n): PropagationContext {\n  const traceparentData = extractTraceparentData(sentryTrace);\n  const dynamicSamplingContext = baggageHeaderToDynamicSamplingContext(baggage);\n\n  if (!traceparentData || !traceparentData.traceId) {\n    return { traceId: generateTraceId(), spanId: generateSpanId() };\n  }\n\n  const { traceId, parentSpanId, parentSampled } = traceparentData;\n\n  const virtualSpanId = generateSpanId();\n\n  return {\n    traceId,\n    parentSpanId,\n    spanId: virtualSpanId,\n    sampled: parentSampled,\n    dsc: dynamicSamplingContext || {}, // If we have traceparent data but no DSC it means we are not head of trace and we must freeze it\n  };\n}\n\n/**\n * Create sentry-trace header from span context values.\n */\nexport function generateSentryTraceHeader(\n  traceId: string = generateTraceId(),\n  spanId: string = generateSpanId(),\n  sampled?: boolean,\n): string {\n  let sampledString = '';\n  if (sampled !== undefined) {\n    sampledString = sampled ? '-1' : '-0';\n  }\n  return `${traceId}-${spanId}${sampledString}`;\n}\n","type PartialURL = {\n  host?: string;\n  path?: string;\n  protocol?: string;\n  relative?: string;\n  search?: string;\n  hash?: string;\n};\n\n/**\n * Parses string form of URL into an object\n * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n * // intentionally using regex and not <a/> href parsing trick because React Native and other\n * // environments where DOM might not be available\n * @returns parsed URL object\n */\nexport function parseUrl(url: string): PartialURL {\n  if (!url) {\n    return {};\n  }\n\n  const match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n  if (!match) {\n    return {};\n  }\n\n  // coerce to undefined values to empty string so we don't get 'undefined'\n  const query = match[6] || '';\n  const fragment = match[8] || '';\n  return {\n    host: match[4],\n    path: match[5],\n    protocol: match[2],\n    search: query,\n    hash: fragment,\n    relative: match[5] + query + fragment, // everything minus origin\n  };\n}\n\n/**\n * Strip the query string and fragment off of a given URL or path (if present)\n *\n * @param urlPath Full URL or path, including possible query string and/or fragment\n * @returns URL or path without query string or fragment\n */\nexport function stripUrlQueryAndFragment(urlPath: string): string {\n  return (urlPath.split(/[?#]/, 1) as [string, ...string[]])[0];\n}\n\n/**\n * Returns number of URL segments of a passed string URL.\n *\n * @deprecated This function will be removed in the next major version.\n */\n// TODO(v9): Hoist this function into the places where we use it. (as it stands only react router v6 instrumentation)\nexport function getNumberOfUrlSegments(url: string): number {\n  // split at '/' or at '\\/' to split regex urls correctly\n  return url.split(/\\\\?\\//).filter(s => s.length > 0 && s !== ',').length;\n}\n\n/**\n * Takes a URL object and returns a sanitized string which is safe to use as span name\n * see: https://develop.sentry.dev/sdk/data-handling/#structuring-data\n */\nexport function getSanitizedUrlString(url: PartialURL): string {\n  const { protocol, host, path } = url;\n\n  const filteredHost =\n    (host &&\n      host\n        // Always filter out authority\n        .replace(/^.*@/, '[filtered]:[filtered]@')\n        // Don't show standard :80 (http) and :443 (https) ports to reduce the noise\n        // TODO: Use new URL global if it exists\n        .replace(/(:80)$/, '')\n        .replace(/(:443)$/, '')) ||\n    '';\n\n  return `${protocol ? `${protocol}://` : ''}${filteredHost}${path}`;\n}\n","// Based on https://github.com/sindresorhus/escape-string-regexp but with modifications to:\n//   a) reduce the size by skipping the runtime type - checking\n//   b) ensure it gets down - compiled for old versions of Node(the published package only supports Node 14+).\n//\n// MIT License\n//\n// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and\n// to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n// the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n/**\n * Given a string, escape characters which have meaning in the regex grammar, such that the result is safe to feed to\n * `new RegExp()`.\n *\n * @param regexString The string to escape\n * @returns An version of the string with all special regex characters escaped\n */\nexport function escapeStringForRegex(regexString: string): string {\n  // escape the hyphen separately so we can also replace it with a unicode literal hyphen, to avoid the problems\n  // discussed in https://github.com/sindresorhus/escape-string-regexp/issues/20.\n  return regexString.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n}\n","// Vendored / modified from @sergiodxa/remix-utils\n\n// https://github.com/sergiodxa/remix-utils/blob/02af80e12829a53696bfa8f3c2363975cf59f55e/src/server/get-client-ip-address.ts\n// MIT License\n\n// Copyright (c) 2021 Sergio Xalambrí\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n// The headers to check, in priority order\nexport const ipHeaderNames = [\n  'X-Client-IP',\n  'X-Forwarded-For',\n  'Fly-Client-IP',\n  'CF-Connecting-IP',\n  'Fastly-Client-Ip',\n  'True-Client-Ip',\n  'X-Real-IP',\n  'X-Cluster-Client-IP',\n  'X-Forwarded',\n  'Forwarded-For',\n  'Forwarded',\n  'X-Vercel-Forwarded-For',\n];\n\n/**\n * Get the IP address of the client sending a request.\n *\n * It receives a Request headers object and use it to get the\n * IP address from one of the following headers in order.\n *\n * If the IP address is valid, it will be returned. Otherwise, null will be\n * returned.\n *\n * If the header values contains more than one IP address, the first valid one\n * will be returned.\n */\nexport function getClientIPAddress(headers: { [key: string]: string | string[] | undefined }): string | null {\n  // This will end up being Array<string | string[] | undefined | null> because of the various possible values a header\n  // can take\n  const headerValues = ipHeaderNames.map((headerName: string) => {\n    const rawValue = headers[headerName];\n    const value = Array.isArray(rawValue) ? rawValue.join(';') : rawValue;\n\n    if (headerName === 'Forwarded') {\n      return parseForwardedHeader(value);\n    }\n\n    return value && value.split(',').map((v: string) => v.trim());\n  });\n\n  // Flatten the array and filter out any falsy entries\n  const flattenedHeaderValues = headerValues.reduce((acc: string[], val) => {\n    if (!val) {\n      return acc;\n    }\n\n    return acc.concat(val);\n  }, []);\n\n  // Find the first value which is a valid IP address, if any\n  const ipAddress = flattenedHeaderValues.find(ip => ip !== null && isIP(ip));\n\n  return ipAddress || null;\n}\n\nfunction parseForwardedHeader(value: string | null | undefined): string | null {\n  if (!value) {\n    return null;\n  }\n\n  for (const part of value.split(';')) {\n    if (part.startsWith('for=')) {\n      return part.slice(4);\n    }\n  }\n\n  return null;\n}\n\n//\n/**\n * Custom method instead of importing this from `net` package, as this only exists in node\n * Accepts:\n * 127.0.0.1\n * 192.168.1.1\n * 192.168.1.255\n * 255.255.255.255\n * 10.1.1.1\n * 0.0.0.0\n * 2b01:cb19:8350:ed00:d0dd:fa5b:de31:8be5\n *\n * Rejects:\n * 1.1.1.01\n * 30.168.1.255.1\n * 127.1\n * 192.168.1.256\n * -1.2.3.4\n * 1.1.1.1.\n * 3...3\n * 192.168.1.099\n */\nfunction isIP(str: string): boolean {\n  const regex =\n    /(?:^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}$)|(?:^(?:(?:[a-fA-F\\d]{1,4}:){7}(?:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,2}|:)|(?:[a-fA-F\\d]{1,4}:){4}(?:(?::[a-fA-F\\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,3}|:)|(?:[a-fA-F\\d]{1,4}:){3}(?:(?::[a-fA-F\\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,4}|:)|(?:[a-fA-F\\d]{1,4}:){2}(?:(?::[a-fA-F\\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,5}|:)|(?:[a-fA-F\\d]{1,4}:){1}(?:(?::[a-fA-F\\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,6}|:)|(?::(?:(?::[a-fA-F\\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,7}|:)))(?:%[0-9a-zA-Z]{1,})?$)/;\n  return regex.test(str);\n}\n","// Based on https://github.com/angular/angular.js/pull/13945/files\n// The MIT License\n\n// Copyright (c) 2010-2016 Google, Inc. http://angularjs.org\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\nimport { GLOBAL_OBJ } from '../worldwide';\n\nconst WINDOW = GLOBAL_OBJ as unknown as Window;\n\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory(): boolean {\n  // NOTE: in Chrome App environment, touching history.pushState, *even inside\n  //       a try/catch block*, will cause Chrome to output an error to console.error\n  // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n  // TODO(v9): Remove this custom check, it is pretty old and likely not needed anymore\n  const chromeVar = (WINDOW as { chrome?: { app?: { runtime?: unknown } } }).chrome;\n  const isChromePackagedApp = chromeVar && chromeVar.app && chromeVar.app.runtime;\n  const hasHistoryApi = 'history' in WINDOW && !!WINDOW.history.pushState && !!WINDOW.history.replaceState;\n\n  return !isChromePackagedApp && hasHistoryApi;\n}\n","import { GLOBAL_OBJ } from './worldwide';\n\ninterface VercelRequestContextGlobal {\n  get?(): {\n    waitUntil?: (task: Promise<unknown>) => void;\n  };\n}\n\n/**\n * Function that delays closing of a Vercel lambda until the provided promise is resolved.\n *\n * Vendored from https://www.npmjs.com/package/@vercel/functions\n */\nexport function vercelWaitUntil(task: Promise<unknown>): void {\n  const vercelRequestContextGlobal: VercelRequestContextGlobal | undefined =\n    // @ts-expect-error This is not typed\n    GLOBAL_OBJ[Symbol.for('@vercel/request-context')];\n\n  const ctx =\n    vercelRequestContextGlobal && vercelRequestContextGlobal.get && vercelRequestContextGlobal.get()\n      ? vercelRequestContextGlobal.get()\n      : {};\n\n  if (ctx && ctx.waitUntil) {\n    ctx.waitUntil(task);\n  }\n}\n","// This is a magic string replaced by rollup\ndeclare const __SENTRY_SDK_VERSION__: string;\n\nexport const SDK_VERSION = typeof __SENTRY_SDK_VERSION__ === 'string' ? __SENTRY_SDK_VERSION__ : '0.0.0-unknown.0';\n","/**\n * NOTE: In order to avoid circular dependencies, if you add a function to this module and it needs to print something,\n * you must either a) use `console.log` rather than the logger, or b) put your function elsewhere.\n *\n * Note: This file was originally called `global.ts`, but was changed to unblock users which might be doing\n * string replaces with bundlers like Vite for `global` (would break imports that rely on importing from utils/src/global).\n *\n * Why worldwide?\n *\n * Why not?\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { Client, MetricsAggregator, Scope } from '../types-hoist';\n\nimport type { SdkSource } from './env';\nimport type { logger } from './logger';\nimport { SDK_VERSION } from './version';\n\ninterface SentryCarrier {\n  acs?: any;\n  stack?: any;\n\n  globalScope?: Scope;\n  defaultIsolationScope?: Scope;\n  defaultCurrentScope?: Scope;\n  globalMetricsAggregators?: WeakMap<Client, MetricsAggregator> | undefined;\n  logger?: typeof logger;\n\n  /** Overwrites TextEncoder used in `@sentry/core`, need for `react-native@0.73` and older */\n  encodePolyfill?: (input: string) => Uint8Array;\n  /** Overwrites TextDecoder used in `@sentry/core`, need for `react-native@0.73` and older */\n  decodePolyfill?: (input: Uint8Array) => string;\n}\n\n// TODO(v9): Clean up or remove this type\ntype BackwardsCompatibleSentryCarrier = SentryCarrier & {\n  // pre-v7 hub (replaced by .stack)\n  hub: any;\n  integrations?: any[];\n  logger: any;\n  extensions?: {\n    /** Extension methods for the hub, which are bound to the current Hub instance */\n    // eslint-disable-next-line @typescript-eslint/ban-types\n    [key: string]: Function;\n  };\n};\n\n/** Internal global with common properties and Sentry extensions  */\nexport type InternalGlobal = {\n  navigator?: { userAgent?: string };\n  console: Console;\n  PerformanceObserver?: any;\n  Sentry?: any;\n  onerror?: {\n    (event: object | string, source?: string, lineno?: number, colno?: number, error?: Error): any;\n    __SENTRY_INSTRUMENTED__?: true;\n  };\n  onunhandledrejection?: {\n    (event: unknown): boolean;\n    __SENTRY_INSTRUMENTED__?: true;\n  };\n  SENTRY_ENVIRONMENT?: string;\n  SENTRY_DSN?: string;\n  SENTRY_RELEASE?: {\n    id?: string;\n  };\n  SENTRY_SDK_SOURCE?: SdkSource;\n  /**\n   * Debug IDs are indirectly injected by Sentry CLI or bundler plugins to directly reference a particular source map\n   * for resolving of a source file. The injected code will place an entry into the record for each loaded bundle/JS\n   * file.\n   */\n  _sentryDebugIds?: Record<string, string>;\n  __SENTRY__: Record<Exclude<string, 'version'>, SentryCarrier> & {\n    version?: string;\n  } & BackwardsCompatibleSentryCarrier;\n  /**\n   * Raw module metadata that is injected by bundler plugins.\n   *\n   * Keys are `error.stack` strings, values are the metadata.\n   */\n  _sentryModuleMetadata?: Record<string, any>;\n  _sentryEsmLoaderHookRegistered?: boolean;\n};\n\n/** Get's the global object for the current JavaScript runtime */\nexport const GLOBAL_OBJ = globalThis as unknown as InternalGlobal;\n\n/**\n * Returns a global singleton contained in the global `__SENTRY__[]` object.\n *\n * If the singleton doesn't already exist in `__SENTRY__`, it will be created using the given factory\n * function and added to the `__SENTRY__` object.\n *\n * @param name name of the global singleton on __SENTRY__\n * @param creator creator Factory function to create the singleton if it doesn't already exist on `__SENTRY__`\n * @param obj (Optional) The global object on which to look for `__SENTRY__`, if not `GLOBAL_OBJ`'s return value\n * @returns the singleton\n */\nexport function getGlobalSingleton<T>(name: keyof SentryCarrier, creator: () => T, obj?: unknown): T {\n  const gbl = (obj || GLOBAL_OBJ) as InternalGlobal;\n  const __SENTRY__ = (gbl.__SENTRY__ = gbl.__SENTRY__ || {});\n  const versionedCarrier = (__SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {});\n  return versionedCarrier[name] || (versionedCarrier[name] = creator());\n}\n","import { getDynamicSamplingContextFromSpan } from '../tracing/dynamicSamplingContext';\nimport type { Breadcrumb, Event, ScopeData, Span } from '../types-hoist';\nimport { dropUndefinedKeys } from '../utils-hoist/object';\nimport { merge } from './merge';\nimport { getRootSpan, spanToJSON, spanToTraceContext } from './spanUtils';\n\n/**\n * Applies data from the scope to the event and runs all event processors on it.\n */\nexport function applyScopeDataToEvent(event: Event, data: ScopeData): void {\n  const { fingerprint, span, breadcrumbs, sdkProcessingMetadata } = data;\n\n  // Apply general data\n  applyDataToEvent(event, data);\n\n  // We want to set the trace context for normal events only if there isn't already\n  // a trace context on the event. There is a product feature in place where we link\n  // errors with transaction and it relies on that.\n  if (span) {\n    applySpanToEvent(event, span);\n  }\n\n  applyFingerprintToEvent(event, fingerprint);\n  applyBreadcrumbsToEvent(event, breadcrumbs);\n  applySdkMetadataToEvent(event, sdkProcessingMetadata);\n}\n\n/** Merge data of two scopes together. */\nexport function mergeScopeData(data: ScopeData, mergeData: ScopeData): void {\n  const {\n    extra,\n    tags,\n    user,\n    contexts,\n    level,\n    sdkProcessingMetadata,\n    breadcrumbs,\n    fingerprint,\n    eventProcessors,\n    attachments,\n    propagationContext,\n    transactionName,\n    span,\n  } = mergeData;\n\n  mergeAndOverwriteScopeData(data, 'extra', extra);\n  mergeAndOverwriteScopeData(data, 'tags', tags);\n  mergeAndOverwriteScopeData(data, 'user', user);\n  mergeAndOverwriteScopeData(data, 'contexts', contexts);\n\n  data.sdkProcessingMetadata = merge(data.sdkProcessingMetadata, sdkProcessingMetadata, 2);\n\n  if (level) {\n    data.level = level;\n  }\n\n  if (transactionName) {\n    data.transactionName = transactionName;\n  }\n\n  if (span) {\n    data.span = span;\n  }\n\n  if (breadcrumbs.length) {\n    data.breadcrumbs = [...data.breadcrumbs, ...breadcrumbs];\n  }\n\n  if (fingerprint.length) {\n    data.fingerprint = [...data.fingerprint, ...fingerprint];\n  }\n\n  if (eventProcessors.length) {\n    data.eventProcessors = [...data.eventProcessors, ...eventProcessors];\n  }\n\n  if (attachments.length) {\n    data.attachments = [...data.attachments, ...attachments];\n  }\n\n  data.propagationContext = { ...data.propagationContext, ...propagationContext };\n}\n\n/**\n * Merges certain scope data. Undefined values will overwrite any existing values.\n * Exported only for tests.\n */\nexport function mergeAndOverwriteScopeData<\n  Prop extends 'extra' | 'tags' | 'user' | 'contexts' | 'sdkProcessingMetadata',\n  Data extends ScopeData,\n>(data: Data, prop: Prop, mergeVal: Data[Prop]): void {\n  data[prop] = merge(data[prop], mergeVal, 1);\n}\n\n/** Exported only for tests */\nexport function mergeArray<Prop extends 'breadcrumbs' | 'fingerprint'>(\n  event: Event,\n  prop: Prop,\n  mergeVal: ScopeData[Prop],\n): void {\n  const prevVal = event[prop];\n  // If we are not merging any new values,\n  // we only need to proceed if there was an empty array before (as we want to replace it with undefined)\n  if (!mergeVal.length && (!prevVal || prevVal.length)) {\n    return;\n  }\n\n  const merged = [...(prevVal || []), ...mergeVal] as ScopeData[Prop];\n  event[prop] = merged.length ? merged : undefined;\n}\n\nfunction applyDataToEvent(event: Event, data: ScopeData): void {\n  const { extra, tags, user, contexts, level, transactionName } = data;\n\n  const cleanedExtra = dropUndefinedKeys(extra);\n  if (cleanedExtra && Object.keys(cleanedExtra).length) {\n    event.extra = { ...cleanedExtra, ...event.extra };\n  }\n\n  const cleanedTags = dropUndefinedKeys(tags);\n  if (cleanedTags && Object.keys(cleanedTags).length) {\n    event.tags = { ...cleanedTags, ...event.tags };\n  }\n\n  const cleanedUser = dropUndefinedKeys(user);\n  if (cleanedUser && Object.keys(cleanedUser).length) {\n    event.user = { ...cleanedUser, ...event.user };\n  }\n\n  const cleanedContexts = dropUndefinedKeys(contexts);\n  if (cleanedContexts && Object.keys(cleanedContexts).length) {\n    event.contexts = { ...cleanedContexts, ...event.contexts };\n  }\n\n  if (level) {\n    event.level = level;\n  }\n\n  // transaction events get their `transaction` from the root span name\n  if (transactionName && event.type !== 'transaction') {\n    event.transaction = transactionName;\n  }\n}\n\nfunction applyBreadcrumbsToEvent(event: Event, breadcrumbs: Breadcrumb[]): void {\n  const mergedBreadcrumbs = [...(event.breadcrumbs || []), ...breadcrumbs];\n  event.breadcrumbs = mergedBreadcrumbs.length ? mergedBreadcrumbs : undefined;\n}\n\nfunction applySdkMetadataToEvent(event: Event, sdkProcessingMetadata: ScopeData['sdkProcessingMetadata']): void {\n  event.sdkProcessingMetadata = {\n    ...event.sdkProcessingMetadata,\n    ...sdkProcessingMetadata,\n  };\n}\n\nfunction applySpanToEvent(event: Event, span: Span): void {\n  event.contexts = {\n    trace: spanToTraceContext(span),\n    ...event.contexts,\n  };\n\n  event.sdkProcessingMetadata = {\n    dynamicSamplingContext: getDynamicSamplingContextFromSpan(span),\n    ...event.sdkProcessingMetadata,\n  };\n\n  const rootSpan = getRootSpan(span);\n  const transactionName = spanToJSON(rootSpan).description;\n  if (transactionName && !event.transaction && event.type === 'transaction') {\n    event.transaction = transactionName;\n  }\n}\n\n/**\n * Applies fingerprint from the scope to the event if there's one,\n * uses message if there's one instead or get rid of empty fingerprint\n */\nfunction applyFingerprintToEvent(event: Event, fingerprint: ScopeData['fingerprint'] | undefined): void {\n  // Make sure it's an array first and we actually have something in place\n  event.fingerprint = event.fingerprint\n    ? Array.isArray(event.fingerprint)\n      ? event.fingerprint\n      : [event.fingerprint]\n    : [];\n\n  // If we have something on the scope, then merge it with event\n  if (fingerprint) {\n    event.fingerprint = event.fingerprint.concat(fingerprint);\n  }\n\n  // If we have no data at all, remove empty array default\n  if (event.fingerprint && !event.fingerprint.length) {\n    delete event.fingerprint;\n  }\n}\n","import { isThenable } from '../utils-hoist/is';\n\n/**\n * Wrap a callback function with error handling.\n * If an error is thrown, it will be passed to the `onError` callback and re-thrown.\n *\n * If the return value of the function is a promise, it will be handled with `maybeHandlePromiseRejection`.\n *\n * If an `onFinally` callback is provided, this will be called when the callback has finished\n * - so if it returns a promise, once the promise resolved/rejected,\n * else once the callback has finished executing.\n * The `onFinally` callback will _always_ be called, no matter if an error was thrown or not.\n */\nexport function handleCallbackErrors<\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  Fn extends () => any,\n>(\n  fn: Fn,\n  onError: (error: unknown) => void,\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  onFinally: () => void = () => {},\n): ReturnType<Fn> {\n  let maybePromiseResult: ReturnType<Fn>;\n  try {\n    maybePromiseResult = fn();\n  } catch (e) {\n    onError(e);\n    onFinally();\n    throw e;\n  }\n\n  return maybeHandlePromiseRejection(maybePromiseResult, onError, onFinally);\n}\n\n/**\n * Maybe handle a promise rejection.\n * This expects to be given a value that _may_ be a promise, or any other value.\n * If it is a promise, and it rejects, it will call the `onError` callback.\n * Other than this, it will generally return the given value as-is.\n */\nfunction maybeHandlePromiseRejection<MaybePromise>(\n  value: MaybePromise,\n  onError: (error: unknown) => void,\n  onFinally: () => void,\n): MaybePromise {\n  if (isThenable(value)) {\n    // @ts-expect-error - the isThenable check returns the \"wrong\" type here\n    return value.then(\n      res => {\n        onFinally();\n        return res;\n      },\n      e => {\n        onError(e);\n        onFinally();\n        throw e;\n      },\n    );\n  }\n\n  onFinally();\n  return value;\n}\n","import { getClient } from '../currentScopes';\nimport type { Options } from '../types-hoist';\n\n// Treeshakable guard to remove all code related to tracing\ndeclare const __SENTRY_TRACING__: boolean | undefined;\n\n/**\n * Determines if tracing is currently enabled.\n *\n * Tracing is enabled when at least one of `tracesSampleRate` and `tracesSampler` is defined in the SDK config.\n */\nexport function hasTracingEnabled(\n  maybeOptions?: Pick<Options, 'tracesSampleRate' | 'tracesSampler' | 'enableTracing'> | undefined,\n): boolean {\n  if (typeof __SENTRY_TRACING__ === 'boolean' && !__SENTRY_TRACING__) {\n    return false;\n  }\n\n  const client = getClient();\n  const options = maybeOptions || (client && client.getOptions());\n  // eslint-disable-next-line deprecation/deprecation\n  return !!options && (options.enableTracing || 'tracesSampleRate' in options || 'tracesSampler' in options);\n}\n","import type { Client, DsnComponents } from '../types-hoist';\n\n/**\n * Checks whether given url points to Sentry server\n *\n * @param url url to verify\n */\nexport function isSentryRequestUrl(url: string, client: Client | undefined): boolean {\n  const dsn = client && client.getDsn();\n  const tunnel = client && client.getOptions().tunnel;\n  return checkDsn(url, dsn) || checkTunnel(url, tunnel);\n}\n\nfunction checkTunnel(url: string, tunnel: string | undefined): boolean {\n  if (!tunnel) {\n    return false;\n  }\n\n  return removeTrailingSlash(url) === removeTrailingSlash(tunnel);\n}\n\nfunction checkDsn(url: string, dsn: DsnComponents | undefined): boolean {\n  return dsn ? url.includes(dsn.host) : false;\n}\n\nfunction removeTrailingSlash(str: string): string {\n  return str[str.length - 1] === '/' ? str.slice(0, -1) : str;\n}\n","/**\n * Shallow merge two objects.\n * Does not mutate the passed in objects.\n * Undefined/empty values in the merge object will overwrite existing values.\n *\n * By default, this merges 2 levels deep.\n */\nexport function merge<T>(initialObj: T, mergeObj: T, levels = 2): T {\n  // If the merge value is not an object, or we have no merge levels left,\n  // we just set the value to the merge value\n  if (!mergeObj || typeof mergeObj !== 'object' || levels <= 0) {\n    return mergeObj;\n  }\n\n  // If the merge object is an empty object, and the initial object is not undefined, we return the initial object\n  if (initialObj && mergeObj && Object.keys(mergeObj).length === 0) {\n    return initialObj;\n  }\n\n  // Clone object\n  const output = { ...initialObj };\n\n  // Merge values into output, resursively\n  for (const key in mergeObj) {\n    if (Object.prototype.hasOwnProperty.call(mergeObj, key)) {\n      output[key] = merge(output[key], mergeObj[key], levels - 1);\n    }\n  }\n\n  return output;\n}\n","import { getTraceData } from './traceData';\n\n/**\n * Returns a string of meta tags that represent the current trace data.\n *\n * You can use this to propagate a trace from your server-side rendered Html to the browser.\n * This function returns up to two meta tags, `sentry-trace` and `baggage`, depending on the\n * current trace data state.\n *\n * @example\n * Usage example:\n *\n * ```js\n * function renderHtml() {\n *   return `\n *     <head>\n *       ${getTraceMetaTags()}\n *     </head>\n *   `;\n * }\n * ```\n *\n */\nexport function getTraceMetaTags(): string {\n  return Object.entries(getTraceData())\n    .map(([key, value]) => `<meta name=\"${key}\" content=\"${value}\"/>`)\n    .join('\\n');\n}\n","import type { ParameterizedString } from '../types-hoist';\n\n/**\n * Tagged template function which returns parameterized representation of the message\n * For example: parameterize`This is a log statement with ${x} and ${y} params`, would return:\n * \"__sentry_template_string__\": 'This is a log statement with %s and %s params',\n * \"__sentry_template_values__\": ['first', 'second']\n * @param strings An array of string values splitted between expressions\n * @param values Expressions extracted from template string\n * @returns String with template information in __sentry_template_string__ and __sentry_template_values__ properties\n */\nexport function parameterize(strings: TemplateStringsArray, ...values: string[]): ParameterizedString {\n  const formatted = new String(String.raw(strings, ...values)) as ParameterizedString;\n  formatted.__sentry_template_string__ = strings.join('\\x00').replace(/%/g, '%%').replace(/\\0/g, '%s');\n  formatted.__sentry_template_values__ = values;\n  return formatted;\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport { logger } from '../utils-hoist/logger';\n\n/**\n * Parse a sample rate from a given value.\n * This will either return a boolean or number sample rate, if the sample rate is valid (between 0 and 1).\n * If a string is passed, we try to convert it to a number.\n *\n * Any invalid sample rate will return `undefined`.\n */\nexport function parseSampleRate(sampleRate: unknown): number | undefined {\n  if (typeof sampleRate === 'boolean') {\n    return Number(sampleRate);\n  }\n\n  const rate = typeof sampleRate === 'string' ? parseFloat(sampleRate) : sampleRate;\n  if (typeof rate !== 'number' || isNaN(rate) || rate < 0 || rate > 1) {\n    DEBUG_BUILD &&\n      logger.warn(\n        `[Tracing] Given sample rate is invalid. Sample rate must be a boolean or a number between 0 and 1. Got ${JSON.stringify(\n          sampleRate,\n        )} of type ${JSON.stringify(typeof sampleRate)}.`,\n      );\n    return undefined;\n  }\n\n  return rate;\n}\n","import type {\n  CaptureContext,\n  Client,\n  ClientOptions,\n  Event,\n  EventHint,\n  Scope as ScopeInterface,\n  ScopeContext,\n  StackParser,\n} from '../types-hoist';\n\nimport { DEFAULT_ENVIRONMENT } from '../constants';\nimport { getGlobalScope } from '../currentScopes';\nimport { notifyEventProcessors } from '../eventProcessors';\nimport { Scope } from '../scope';\nimport { getFilenameToDebugIdMap } from '../utils-hoist/debug-ids';\nimport { addExceptionMechanism, uuid4 } from '../utils-hoist/misc';\nimport { normalize } from '../utils-hoist/normalize';\nimport { truncate } from '../utils-hoist/string';\nimport { dateTimestampInSeconds } from '../utils-hoist/time';\nimport { applyScopeDataToEvent, mergeScopeData } from './applyScopeDataToEvent';\n\n/**\n * This type makes sure that we get either a CaptureContext, OR an EventHint.\n * It does not allow mixing them, which could lead to unexpected outcomes, e.g. this is disallowed:\n * { user: { id: '123' }, mechanism: { handled: false } }\n */\nexport type ExclusiveEventHintOrCaptureContext =\n  | (CaptureContext & Partial<{ [key in keyof EventHint]: never }>)\n  | (EventHint & Partial<{ [key in keyof ScopeContext]: never }>);\n\n/**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param hint May contain additional information about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n * @hidden\n */\nexport function prepareEvent(\n  options: ClientOptions,\n  event: Event,\n  hint: EventHint,\n  scope?: ScopeInterface,\n  client?: Client,\n  isolationScope?: ScopeInterface,\n): PromiseLike<Event | null> {\n  const { normalizeDepth = 3, normalizeMaxBreadth = 1_000 } = options;\n  const prepared: Event = {\n    ...event,\n    event_id: event.event_id || hint.event_id || uuid4(),\n    timestamp: event.timestamp || dateTimestampInSeconds(),\n  };\n  const integrations = hint.integrations || options.integrations.map(i => i.name);\n\n  applyClientOptions(prepared, options);\n  applyIntegrationsMetadata(prepared, integrations);\n\n  if (client) {\n    client.emit('applyFrameMetadata', event);\n  }\n\n  // Only put debug IDs onto frames for error events.\n  if (event.type === undefined) {\n    applyDebugIds(prepared, options.stackParser);\n  }\n\n  // If we have scope given to us, use it as the base for further modifications.\n  // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.\n  const finalScope = getFinalScope(scope, hint.captureContext);\n\n  if (hint.mechanism) {\n    addExceptionMechanism(prepared, hint.mechanism);\n  }\n\n  const clientEventProcessors = client ? client.getEventProcessors() : [];\n\n  // This should be the last thing called, since we want that\n  // {@link Scope.addEventProcessor} gets the finished prepared event.\n  // Merge scope data together\n  const data = getGlobalScope().getScopeData();\n\n  if (isolationScope) {\n    const isolationData = isolationScope.getScopeData();\n    mergeScopeData(data, isolationData);\n  }\n\n  if (finalScope) {\n    const finalScopeData = finalScope.getScopeData();\n    mergeScopeData(data, finalScopeData);\n  }\n\n  const attachments = [...(hint.attachments || []), ...data.attachments];\n  if (attachments.length) {\n    hint.attachments = attachments;\n  }\n\n  applyScopeDataToEvent(prepared, data);\n\n  const eventProcessors = [\n    ...clientEventProcessors,\n    // Run scope event processors _after_ all other processors\n    ...data.eventProcessors,\n  ];\n\n  const result = notifyEventProcessors(eventProcessors, prepared, hint);\n\n  return result.then(evt => {\n    if (evt) {\n      // We apply the debug_meta field only after all event processors have ran, so that if any event processors modified\n      // file names (e.g.the RewriteFrames integration) the filename -> debug ID relationship isn't destroyed.\n      // This should not cause any PII issues, since we're only moving data that is already on the event and not adding\n      // any new data\n      applyDebugMeta(evt);\n    }\n\n    if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n      return normalizeEvent(evt, normalizeDepth, normalizeMaxBreadth);\n    }\n    return evt;\n  });\n}\n\n/**\n * Enhances event using the client configuration.\n * It takes care of all \"static\" values like environment, release and `dist`,\n * as well as truncating overly long values.\n *\n * Only exported for tests.\n *\n * @param event event instance to be enhanced\n */\nexport function applyClientOptions(event: Event, options: ClientOptions): void {\n  const { environment, release, dist, maxValueLength = 250 } = options;\n\n  // empty strings do not make sense for environment, release, and dist\n  // so we handle them the same as if they were not provided\n  event.environment = event.environment || environment || DEFAULT_ENVIRONMENT;\n\n  if (!event.release && release) {\n    event.release = release;\n  }\n\n  if (!event.dist && dist) {\n    event.dist = dist;\n  }\n\n  if (event.message) {\n    event.message = truncate(event.message, maxValueLength);\n  }\n\n  const exception = event.exception && event.exception.values && event.exception.values[0];\n  if (exception && exception.value) {\n    exception.value = truncate(exception.value, maxValueLength);\n  }\n\n  const request = event.request;\n  if (request && request.url) {\n    request.url = truncate(request.url, maxValueLength);\n  }\n}\n\n/**\n * Puts debug IDs into the stack frames of an error event.\n */\nexport function applyDebugIds(event: Event, stackParser: StackParser): void {\n  // Build a map of filename -> debug_id\n  const filenameDebugIdMap = getFilenameToDebugIdMap(stackParser);\n\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    event!.exception!.values!.forEach(exception => {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      exception.stacktrace!.frames!.forEach(frame => {\n        if (filenameDebugIdMap && frame.filename) {\n          frame.debug_id = filenameDebugIdMap[frame.filename];\n        }\n      });\n    });\n  } catch (e) {\n    // To save bundle size we're just try catching here instead of checking for the existence of all the different objects.\n  }\n}\n\n/**\n * Moves debug IDs from the stack frames of an error event into the debug_meta field.\n */\nexport function applyDebugMeta(event: Event): void {\n  // Extract debug IDs and filenames from the stack frames on the event.\n  const filenameDebugIdMap: Record<string, string> = {};\n  try {\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    event.exception!.values!.forEach(exception => {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      exception.stacktrace!.frames!.forEach(frame => {\n        if (frame.debug_id) {\n          if (frame.abs_path) {\n            filenameDebugIdMap[frame.abs_path] = frame.debug_id;\n          } else if (frame.filename) {\n            filenameDebugIdMap[frame.filename] = frame.debug_id;\n          }\n          delete frame.debug_id;\n        }\n      });\n    });\n  } catch (e) {\n    // To save bundle size we're just try catching here instead of checking for the existence of all the different objects.\n  }\n\n  if (Object.keys(filenameDebugIdMap).length === 0) {\n    return;\n  }\n\n  // Fill debug_meta information\n  event.debug_meta = event.debug_meta || {};\n  event.debug_meta.images = event.debug_meta.images || [];\n  const images = event.debug_meta.images;\n  Object.entries(filenameDebugIdMap).forEach(([filename, debug_id]) => {\n    images.push({\n      type: 'sourcemap',\n      code_file: filename,\n      debug_id,\n    });\n  });\n}\n\n/**\n * This function adds all used integrations to the SDK info in the event.\n * @param event The event that will be filled with all integrations.\n */\nfunction applyIntegrationsMetadata(event: Event, integrationNames: string[]): void {\n  if (integrationNames.length > 0) {\n    event.sdk = event.sdk || {};\n    event.sdk.integrations = [...(event.sdk.integrations || []), ...integrationNames];\n  }\n}\n\n/**\n * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n * Normalized keys:\n * - `breadcrumbs.data`\n * - `user`\n * - `contexts`\n * - `extra`\n * @param event Event\n * @returns Normalized event\n */\nfunction normalizeEvent(event: Event | null, depth: number, maxBreadth: number): Event | null {\n  if (!event) {\n    return null;\n  }\n\n  const normalized: Event = {\n    ...event,\n    ...(event.breadcrumbs && {\n      breadcrumbs: event.breadcrumbs.map(b => ({\n        ...b,\n        ...(b.data && {\n          data: normalize(b.data, depth, maxBreadth),\n        }),\n      })),\n    }),\n    ...(event.user && {\n      user: normalize(event.user, depth, maxBreadth),\n    }),\n    ...(event.contexts && {\n      contexts: normalize(event.contexts, depth, maxBreadth),\n    }),\n    ...(event.extra && {\n      extra: normalize(event.extra, depth, maxBreadth),\n    }),\n  };\n\n  // event.contexts.trace stores information about a Transaction. Similarly,\n  // event.spans[] stores information about child Spans. Given that a\n  // Transaction is conceptually a Span, normalization should apply to both\n  // Transactions and Spans consistently.\n  // For now the decision is to skip normalization of Transactions and Spans,\n  // so this block overwrites the normalized event to add back the original\n  // Transaction information prior to normalization.\n  if (event.contexts && event.contexts.trace && normalized.contexts) {\n    normalized.contexts.trace = event.contexts.trace;\n\n    // event.contexts.trace.data may contain circular/dangerous data so we need to normalize it\n    if (event.contexts.trace.data) {\n      normalized.contexts.trace.data = normalize(event.contexts.trace.data, depth, maxBreadth);\n    }\n  }\n\n  // event.spans[].data may contain circular/dangerous data so we need to normalize it\n  if (event.spans) {\n    normalized.spans = event.spans.map(span => {\n      return {\n        ...span,\n        ...(span.data && {\n          data: normalize(span.data, depth, maxBreadth),\n        }),\n      };\n    });\n  }\n\n  // event.contexts.flags (FeatureFlagContext) stores context for our feature\n  // flag integrations. It has a greater nesting depth than our other typed\n  // Contexts, so we re-normalize with a fixed depth of 3 here. We do not want\n  // to skip this in case of conflicting, user-provided context.\n  if (event.contexts && event.contexts.flags && normalized.contexts) {\n    normalized.contexts.flags = normalize(event.contexts.flags, 3, maxBreadth);\n  }\n\n  return normalized;\n}\n\nfunction getFinalScope(\n  scope: ScopeInterface | undefined,\n  captureContext: CaptureContext | undefined,\n): ScopeInterface | undefined {\n  if (!captureContext) {\n    return scope;\n  }\n\n  const finalScope = scope ? scope.clone() : new Scope();\n  finalScope.update(captureContext);\n  return finalScope;\n}\n\n/**\n * Parse either an `EventHint` directly, or convert a `CaptureContext` to an `EventHint`.\n * This is used to allow to update method signatures that used to accept a `CaptureContext` but should now accept an `EventHint`.\n */\nexport function parseEventHintOrCaptureContext(\n  hint: ExclusiveEventHintOrCaptureContext | undefined,\n): EventHint | undefined {\n  if (!hint) {\n    return undefined;\n  }\n\n  // If you pass a Scope or `() => Scope` as CaptureContext, we just return this as captureContext\n  if (hintIsScopeOrFunction(hint)) {\n    return { captureContext: hint };\n  }\n\n  if (hintIsScopeContext(hint)) {\n    return {\n      captureContext: hint,\n    };\n  }\n\n  return hint;\n}\n\nfunction hintIsScopeOrFunction(\n  hint: CaptureContext | EventHint,\n): hint is ScopeInterface | ((scope: ScopeInterface) => ScopeInterface) {\n  return hint instanceof Scope || typeof hint === 'function';\n}\n\ntype ScopeContextProperty = keyof ScopeContext;\nconst captureContextKeys: readonly ScopeContextProperty[] = [\n  'user',\n  'level',\n  'extra',\n  'contexts',\n  'tags',\n  'fingerprint',\n  'requestSession',\n  'propagationContext',\n] as const;\n\nfunction hintIsScopeContext(hint: Partial<ScopeContext> | EventHint): hint is Partial<ScopeContext> {\n  return Object.keys(hint).some(key => captureContextKeys.includes(key as ScopeContextProperty));\n}\n","import type { Options } from '../types-hoist';\nimport { SDK_VERSION } from '../utils-hoist/version';\n\n/**\n * A builder for the SDK metadata in the options for the SDK initialization.\n *\n * Note: This function is identical to `buildMetadata` in Remix and NextJS and SvelteKit.\n * We don't extract it for bundle size reasons.\n * @see https://github.com/getsentry/sentry-javascript/pull/7404\n * @see https://github.com/getsentry/sentry-javascript/pull/4196\n *\n * If you make changes to this function consider updating the others as well.\n *\n * @param options SDK options object that gets mutated\n * @param names list of package names\n */\nexport function applySdkMetadata(options: Options, name: string, names = [name], source = 'npm'): void {\n  const metadata = options._metadata || {};\n\n  if (!metadata.sdk) {\n    metadata.sdk = {\n      name: `sentry.javascript.${name}`,\n      packages: names.map(name => ({\n        name: `${source}:@sentry/${name}`,\n        version: SDK_VERSION,\n      })),\n      version: SDK_VERSION,\n    };\n  }\n\n  options._metadata = metadata;\n}\n","import type { Scope, Span } from '../types-hoist';\nimport { addNonEnumerableProperty } from '../utils-hoist/object';\n\nconst SCOPE_SPAN_FIELD = '_sentrySpan';\n\ntype ScopeWithMaybeSpan = Scope & {\n  [SCOPE_SPAN_FIELD]?: Span;\n};\n\n/**\n * Set the active span for a given scope.\n * NOTE: This should NOT be used directly, but is only used internally by the trace methods.\n */\nexport function _setSpanForScope(scope: Scope, span: Span | undefined): void {\n  if (span) {\n    addNonEnumerableProperty(scope as ScopeWithMaybeSpan, SCOPE_SPAN_FIELD, span);\n  } else {\n    // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n    delete (scope as ScopeWithMaybeSpan)[SCOPE_SPAN_FIELD];\n  }\n}\n\n/**\n * Get the active span for a given scope.\n * NOTE: This should NOT be used directly, but is only used internally by the trace methods.\n */\nexport function _getSpanForScope(scope: ScopeWithMaybeSpan): Span | undefined {\n  return scope[SCOPE_SPAN_FIELD];\n}\n","import { getAsyncContextStrategy } from '../asyncContext';\nimport { getMainCarrier } from '../carrier';\nimport { getCurrentScope } from '../currentScopes';\nimport { getMetricSummaryJsonForSpan, updateMetricSummaryOnSpan } from '../metrics/metric-summary';\nimport type { MetricType } from '../metrics/types';\nimport {\n  SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n  SEMANTIC_ATTRIBUTE_SENTRY_OP,\n  SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n  SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { SentrySpan } from '../tracing/sentrySpan';\nimport { SPAN_STATUS_OK, SPAN_STATUS_UNSET } from '../tracing/spanstatus';\nimport type {\n  MeasurementUnit,\n  Primitive,\n  Span,\n  SpanAttributes,\n  SpanJSON,\n  SpanOrigin,\n  SpanStatus,\n  SpanTimeInput,\n  TraceContext,\n} from '../types-hoist';\nimport { consoleSandbox } from '../utils-hoist/logger';\nimport { addNonEnumerableProperty, dropUndefinedKeys } from '../utils-hoist/object';\nimport { generateSpanId } from '../utils-hoist/propagationContext';\nimport { timestampInSeconds } from '../utils-hoist/time';\nimport { generateSentryTraceHeader } from '../utils-hoist/tracing';\nimport { _getSpanForScope } from './spanOnScope';\n\n// These are aligned with OpenTelemetry trace flags\nexport const TRACE_FLAG_NONE = 0x0;\nexport const TRACE_FLAG_SAMPLED = 0x1;\n\n// todo(v9): Remove this once we've stopped dropping spans via `beforeSendSpan`\nlet hasShownSpanDropWarning = false;\n\n/**\n * Convert a span to a trace context, which can be sent as the `trace` context in an event.\n * By default, this will only include trace_id, span_id & parent_span_id.\n * If `includeAllData` is true, it will also include data, op, status & origin.\n */\nexport function spanToTransactionTraceContext(span: Span): TraceContext {\n  const { spanId: span_id, traceId: trace_id } = span.spanContext();\n  const { data, op, parent_span_id, status, origin } = spanToJSON(span);\n\n  return dropUndefinedKeys({\n    parent_span_id,\n    span_id,\n    trace_id,\n    data,\n    op,\n    status,\n    origin,\n  });\n}\n\n/**\n * Convert a span to a trace context, which can be sent as the `trace` context in a non-transaction event.\n */\nexport function spanToTraceContext(span: Span): TraceContext {\n  const { spanId, traceId: trace_id, isRemote } = span.spanContext();\n\n  // If the span is remote, we use a random/virtual span as span_id to the trace context,\n  // and the remote span as parent_span_id\n  const parent_span_id = isRemote ? spanId : spanToJSON(span).parent_span_id;\n  const span_id = isRemote ? generateSpanId() : spanId;\n\n  return dropUndefinedKeys({\n    parent_span_id,\n    span_id,\n    trace_id,\n  });\n}\n\n/**\n * Convert a Span to a Sentry trace header.\n */\nexport function spanToTraceHeader(span: Span): string {\n  const { traceId, spanId } = span.spanContext();\n  const sampled = spanIsSampled(span);\n  return generateSentryTraceHeader(traceId, spanId, sampled);\n}\n\n/**\n * Convert a span time input into a timestamp in seconds.\n */\nexport function spanTimeInputToSeconds(input: SpanTimeInput | undefined): number {\n  if (typeof input === 'number') {\n    return ensureTimestampInSeconds(input);\n  }\n\n  if (Array.isArray(input)) {\n    // See {@link HrTime} for the array-based time format\n    return input[0] + input[1] / 1e9;\n  }\n\n  if (input instanceof Date) {\n    return ensureTimestampInSeconds(input.getTime());\n  }\n\n  return timestampInSeconds();\n}\n\n/**\n * Converts a timestamp to second, if it was in milliseconds, or keeps it as second.\n */\nfunction ensureTimestampInSeconds(timestamp: number): number {\n  const isMs = timestamp > 9999999999;\n  return isMs ? timestamp / 1000 : timestamp;\n}\n\n/**\n * Convert a span to a JSON representation.\n */\n// Note: Because of this, we currently have a circular type dependency (which we opted out of in package.json).\n// This is not avoidable as we need `spanToJSON` in `spanUtils.ts`, which in turn is needed by `span.ts` for backwards compatibility.\n// And `spanToJSON` needs the Span class from `span.ts` to check here.\nexport function spanToJSON(span: Span): Partial<SpanJSON> {\n  if (spanIsSentrySpan(span)) {\n    return span.getSpanJSON();\n  }\n\n  try {\n    const { spanId: span_id, traceId: trace_id } = span.spanContext();\n\n    // Handle a span from @opentelemetry/sdk-base-trace's `Span` class\n    if (spanIsOpenTelemetrySdkTraceBaseSpan(span)) {\n      const { attributes, startTime, name, endTime, parentSpanId, status } = span;\n\n      return dropUndefinedKeys({\n        span_id,\n        trace_id,\n        data: attributes,\n        description: name,\n        parent_span_id: parentSpanId,\n        start_timestamp: spanTimeInputToSeconds(startTime),\n        // This is [0,0] by default in OTEL, in which case we want to interpret this as no end time\n        timestamp: spanTimeInputToSeconds(endTime) || undefined,\n        status: getStatusMessage(status),\n        op: attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP],\n        origin: attributes[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN] as SpanOrigin | undefined,\n        _metrics_summary: getMetricSummaryJsonForSpan(span),\n      });\n    }\n\n    // Finally, at least we have `spanContext()`....\n    return {\n      span_id,\n      trace_id,\n    };\n  } catch {\n    return {};\n  }\n}\n\nfunction spanIsOpenTelemetrySdkTraceBaseSpan(span: Span): span is OpenTelemetrySdkTraceBaseSpan {\n  const castSpan = span as OpenTelemetrySdkTraceBaseSpan;\n  return !!castSpan.attributes && !!castSpan.startTime && !!castSpan.name && !!castSpan.endTime && !!castSpan.status;\n}\n\n/** Exported only for tests. */\nexport interface OpenTelemetrySdkTraceBaseSpan extends Span {\n  attributes: SpanAttributes;\n  startTime: SpanTimeInput;\n  name: string;\n  status: SpanStatus;\n  endTime: SpanTimeInput;\n  parentSpanId?: string;\n}\n\n/**\n * Sadly, due to circular dependency checks we cannot actually import the Span class here and check for instanceof.\n * :( So instead we approximate this by checking if it has the `getSpanJSON` method.\n */\nfunction spanIsSentrySpan(span: Span): span is SentrySpan {\n  return typeof (span as SentrySpan).getSpanJSON === 'function';\n}\n\n/**\n * Returns true if a span is sampled.\n * In most cases, you should just use `span.isRecording()` instead.\n * However, this has a slightly different semantic, as it also returns false if the span is finished.\n * So in the case where this distinction is important, use this method.\n */\nexport function spanIsSampled(span: Span): boolean {\n  // We align our trace flags with the ones OpenTelemetry use\n  // So we also check for sampled the same way they do.\n  const { traceFlags } = span.spanContext();\n  return traceFlags === TRACE_FLAG_SAMPLED;\n}\n\n/** Get the status message to use for a JSON representation of a span. */\nexport function getStatusMessage(status: SpanStatus | undefined): string | undefined {\n  if (!status || status.code === SPAN_STATUS_UNSET) {\n    return undefined;\n  }\n\n  if (status.code === SPAN_STATUS_OK) {\n    return 'ok';\n  }\n\n  return status.message || 'unknown_error';\n}\n\nconst CHILD_SPANS_FIELD = '_sentryChildSpans';\nconst ROOT_SPAN_FIELD = '_sentryRootSpan';\n\ntype SpanWithPotentialChildren = Span & {\n  [CHILD_SPANS_FIELD]?: Set<Span>;\n  [ROOT_SPAN_FIELD]?: Span;\n};\n\n/**\n * Adds an opaque child span reference to a span.\n */\nexport function addChildSpanToSpan(span: SpanWithPotentialChildren, childSpan: Span): void {\n  // We store the root span reference on the child span\n  // We need this for `getRootSpan()` to work\n  const rootSpan = span[ROOT_SPAN_FIELD] || span;\n  addNonEnumerableProperty(childSpan as SpanWithPotentialChildren, ROOT_SPAN_FIELD, rootSpan);\n\n  // We store a list of child spans on the parent span\n  // We need this for `getSpanDescendants()` to work\n  if (span[CHILD_SPANS_FIELD]) {\n    span[CHILD_SPANS_FIELD].add(childSpan);\n  } else {\n    addNonEnumerableProperty(span, CHILD_SPANS_FIELD, new Set([childSpan]));\n  }\n}\n\n/** This is only used internally by Idle Spans. */\nexport function removeChildSpanFromSpan(span: SpanWithPotentialChildren, childSpan: Span): void {\n  if (span[CHILD_SPANS_FIELD]) {\n    span[CHILD_SPANS_FIELD].delete(childSpan);\n  }\n}\n\n/**\n * Returns an array of the given span and all of its descendants.\n */\nexport function getSpanDescendants(span: SpanWithPotentialChildren): Span[] {\n  const resultSet = new Set<Span>();\n\n  function addSpanChildren(span: SpanWithPotentialChildren): void {\n    // This exit condition is required to not infinitely loop in case of a circular dependency.\n    if (resultSet.has(span)) {\n      return;\n      // We want to ignore unsampled spans (e.g. non recording spans)\n    } else if (spanIsSampled(span)) {\n      resultSet.add(span);\n      const childSpans = span[CHILD_SPANS_FIELD] ? Array.from(span[CHILD_SPANS_FIELD]) : [];\n      for (const childSpan of childSpans) {\n        addSpanChildren(childSpan);\n      }\n    }\n  }\n\n  addSpanChildren(span);\n\n  return Array.from(resultSet);\n}\n\n/**\n * Returns the root span of a given span.\n */\nexport function getRootSpan(span: SpanWithPotentialChildren): Span {\n  return span[ROOT_SPAN_FIELD] || span;\n}\n\n/**\n * Returns the currently active span.\n */\nexport function getActiveSpan(): Span | undefined {\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n  if (acs.getActiveSpan) {\n    return acs.getActiveSpan();\n  }\n\n  return _getSpanForScope(getCurrentScope());\n}\n\n/**\n * Updates the metric summary on the currently active span\n */\nexport function updateMetricSummaryOnActiveSpan(\n  metricType: MetricType,\n  sanitizedName: string,\n  value: number,\n  unit: MeasurementUnit,\n  tags: Record<string, Primitive>,\n  bucketKey: string,\n): void {\n  const span = getActiveSpan();\n  if (span) {\n    updateMetricSummaryOnSpan(span, metricType, sanitizedName, value, unit, tags, bucketKey);\n  }\n}\n\n/**\n * Logs a warning once if `beforeSendSpan` is used to drop spans.\n *\n * todo(v9): Remove this once we've stopped dropping spans via `beforeSendSpan`.\n */\nexport function showSpanDropWarning(): void {\n  if (!hasShownSpanDropWarning) {\n    consoleSandbox(() => {\n      // eslint-disable-next-line no-console\n      console.warn(\n        '[Sentry] Deprecation warning: Returning null from `beforeSendSpan` will be disallowed from SDK version 9.0.0 onwards. The callback will only support mutating spans. To drop certain spans, configure the respective integrations directly.',\n      );\n    });\n    hasShownSpanDropWarning = true;\n  }\n}\n\n/**\n * Updates the name of the given span and ensures that the span name is not\n * overwritten by the Sentry SDK.\n *\n * Use this function instead of `span.updateName()` if you want to make sure that\n * your name is kept. For some spans, for example root `http.server` spans the\n * Sentry SDK would otherwise overwrite the span name with a high-quality name\n * it infers when the span ends.\n *\n * Use this function in server code or when your span is started on the server\n * and on the client (browser). If you only update a span name on the client,\n * you can also use `span.updateName()` the SDK does not overwrite the name.\n *\n * @param span - The span to update the name of.\n * @param name - The name to set on the span.\n */\nexport function updateSpanName(span: Span, name: string): void {\n  span.updateName(name);\n  span.setAttributes({\n    [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n    [SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME]: name,\n  });\n}\n","import { getAsyncContextStrategy } from '../asyncContext';\nimport { getMainCarrier } from '../carrier';\nimport { getClient, getCurrentScope } from '../currentScopes';\nimport { isEnabled } from '../exports';\nimport { getDynamicSamplingContextFromScope, getDynamicSamplingContextFromSpan } from '../tracing';\nimport type { Scope, SerializedTraceData, Span } from '../types-hoist';\nimport { dynamicSamplingContextToSentryBaggageHeader } from '../utils-hoist/baggage';\nimport { logger } from '../utils-hoist/logger';\nimport { TRACEPARENT_REGEXP, generateSentryTraceHeader } from '../utils-hoist/tracing';\nimport { getActiveSpan, spanToTraceHeader } from './spanUtils';\n\n/**\n * Extracts trace propagation data from the current span or from the client's scope (via transaction or propagation\n * context) and serializes it to `sentry-trace` and `baggage` values to strings. These values can be used to propagate\n * a trace via our tracing Http headers or Html `<meta>` tags.\n *\n * This function also applies some validation to the generated sentry-trace and baggage values to ensure that\n * only valid strings are returned.\n *\n * @returns an object with the tracing data values. The object keys are the name of the tracing key to be used as header\n * or meta tag name.\n */\nexport function getTraceData(options: { span?: Span } = {}): SerializedTraceData {\n  const client = getClient();\n  if (!isEnabled() || !client) {\n    return {};\n  }\n\n  const carrier = getMainCarrier();\n  const acs = getAsyncContextStrategy(carrier);\n  if (acs.getTraceData) {\n    return acs.getTraceData(options);\n  }\n\n  const scope = getCurrentScope();\n  const span = options.span || getActiveSpan();\n  const sentryTrace = span ? spanToTraceHeader(span) : scopeToTraceHeader(scope);\n  const dsc = span ? getDynamicSamplingContextFromSpan(span) : getDynamicSamplingContextFromScope(client, scope);\n  const baggage = dynamicSamplingContextToSentryBaggageHeader(dsc);\n\n  const isValidSentryTraceHeader = TRACEPARENT_REGEXP.test(sentryTrace);\n  if (!isValidSentryTraceHeader) {\n    logger.warn('Invalid sentry-trace data. Cannot generate trace data');\n    return {};\n  }\n\n  return {\n    'sentry-trace': sentryTrace,\n    baggage,\n  };\n}\n\n/**\n * Get a sentry-trace header value for the given scope.\n */\nfunction scopeToTraceHeader(scope: Scope): string {\n  // TODO(v9): Use generateSpanId() instead of spanId\n  // eslint-disable-next-line deprecation/deprecation\n  const { traceId, sampled, spanId } = scope.getPropagationContext();\n  return generateSentryTraceHeader(traceId, spanId, sampled);\n}\n","import { isNativeFunction, logger } from '@sentry/core';\nimport { DEBUG_BUILD } from './debug-build';\nimport { WINDOW } from './types';\n\n/**\n * We generally want to use window.fetch / window.setTimeout.\n * However, in some cases this may be wrapped (e.g. by Zone.js for Angular),\n * so we try to get an unpatched version of this from a sandboxed iframe.\n */\n\ninterface CacheableImplementations {\n  setTimeout: typeof WINDOW.setTimeout;\n  fetch: typeof WINDOW.fetch;\n}\n\nconst cachedImplementations: Partial<CacheableImplementations> = {};\n\n/**\n * Get the native implementation of a browser function.\n *\n * This can be used to ensure we get an unwrapped version of a function, in cases where a wrapped function can lead to problems.\n *\n * The following methods can be retrieved:\n * - `setTimeout`: This can be wrapped by e.g. Angular, causing change detection to be triggered.\n * - `fetch`: This can be wrapped by e.g. ad-blockers, causing an infinite loop when a request is blocked.\n */\nexport function getNativeImplementation<T extends keyof CacheableImplementations>(\n  name: T,\n): CacheableImplementations[T] {\n  const cached = cachedImplementations[name];\n  if (cached) {\n    return cached;\n  }\n\n  let impl = WINDOW[name] as CacheableImplementations[T];\n\n  // Fast path to avoid DOM I/O\n  if (isNativeFunction(impl)) {\n    return (cachedImplementations[name] = impl.bind(WINDOW) as CacheableImplementations[T]);\n  }\n\n  const document = WINDOW.document;\n  // eslint-disable-next-line deprecation/deprecation\n  if (document && typeof document.createElement === 'function') {\n    try {\n      const sandbox = document.createElement('iframe');\n      sandbox.hidden = true;\n      document.head.appendChild(sandbox);\n      const contentWindow = sandbox.contentWindow;\n      if (contentWindow && contentWindow[name]) {\n        impl = contentWindow[name] as CacheableImplementations[T];\n      }\n      document.head.removeChild(sandbox);\n    } catch (e) {\n      // Could not create sandbox iframe, just use window.xxx\n      DEBUG_BUILD && logger.warn(`Could not create sandbox iframe for ${name} check, bailing to window.${name}: `, e);\n    }\n  }\n\n  // Sanity check: This _should_ not happen, but if it does, we just skip caching...\n  // This can happen e.g. in tests where fetch may not be available in the env, or similar.\n  if (!impl) {\n    return impl;\n  }\n\n  return (cachedImplementations[name] = impl.bind(WINDOW) as CacheableImplementations[T]);\n}\n\n/** Clear a cached implementation. */\nexport function clearCachedImplementation(name: keyof CacheableImplementations): void {\n  cachedImplementations[name] = undefined;\n}\n\n/**\n * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.\n * Whenever someone wraps the Fetch API and returns the wrong promise chain,\n * this chain becomes orphaned and there is no possible way to capture it's rejections\n * other than allowing it bubble up to this very handler. eg.\n *\n * const f = window.fetch;\n * window.fetch = function () {\n *   const p = f.apply(this, arguments);\n *\n *   p.then(function() {\n *     console.log('hi.');\n *   });\n *\n *   return p;\n * }\n *\n * `p.then(function () { ... })` is producing a completely separate promise chain,\n * however, what's returned is `p` - the result of original `fetch` call.\n *\n * This mean, that whenever we use the Fetch API to send our own requests, _and_\n * some ad-blocker blocks it, this orphaned chain will _always_ reject,\n * effectively causing another event to be captured.\n * This makes a whole process become an infinite loop, which we need to somehow\n * deal with, and break it in one way or another.\n *\n * To deal with this issue, we are making sure that we _always_ use the real\n * browser Fetch API, instead of relying on what `window.fetch` exposes.\n * The only downside to this would be missing our own requests as breadcrumbs,\n * but because we are already not doing this, it should be just fine.\n *\n * Possible failed fetch error messages per-browser:\n *\n * Chrome:  Failed to fetch\n * Edge:    Failed to Fetch\n * Firefox: NetworkError when attempting to fetch resource\n * Safari:  resource blocked by content blocker\n */\nexport function fetch(...rest: Parameters<typeof WINDOW.fetch>): ReturnType<typeof WINDOW.fetch> {\n  return getNativeImplementation('fetch')(...rest);\n}\n\n/**\n * Get an unwrapped `setTimeout` method.\n * This ensures that even if e.g. Angular wraps `setTimeout`, we get the native implementation,\n * avoiding triggering change detection.\n */\nexport function setTimeout(...rest: Parameters<typeof WINDOW.setTimeout>): ReturnType<typeof WINDOW.setTimeout> {\n  return getNativeImplementation('setTimeout')(...rest);\n}\n","import type { HandlerDataDom } from '@sentry/core';\nimport { addHandler, addNonEnumerableProperty, fill, maybeInstrument, triggerHandlers, uuid4 } from '@sentry/core';\nimport { WINDOW } from '../types';\n\ntype SentryWrappedTarget = HTMLElement & { _sentryId?: string };\n\ntype AddEventListener = (\n  type: string,\n  listener: EventListenerOrEventListenerObject,\n  options?: boolean | AddEventListenerOptions,\n) => void;\ntype RemoveEventListener = (\n  type: string,\n  listener: EventListenerOrEventListenerObject,\n  options?: boolean | EventListenerOptions,\n) => void;\n\ntype InstrumentedElement = Element & {\n  __sentry_instrumentation_handlers__?: {\n    [key in 'click' | 'keypress']?: {\n      handler?: unknown;\n      /** The number of custom listeners attached to this element */\n      refCount: number;\n    };\n  };\n};\n\nconst DEBOUNCE_DURATION = 1000;\n\nlet debounceTimerID: number | undefined;\nlet lastCapturedEventType: string | undefined;\nlet lastCapturedEventTargetId: string | undefined;\n\n/**\n * Add an instrumentation handler for when a click or a keypress happens.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addClickKeypressInstrumentationHandler(handler: (data: HandlerDataDom) => void): void {\n  const type = 'dom';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentDOM);\n}\n\n/** Exported for tests only. */\nexport function instrumentDOM(): void {\n  if (!WINDOW.document) {\n    return;\n  }\n\n  // Make it so that any click or keypress that is unhandled / bubbled up all the way to the document triggers our dom\n  // handlers. (Normally we have only one, which captures a breadcrumb for each click or keypress.) Do this before\n  // we instrument `addEventListener` so that we don't end up attaching this handler twice.\n  const triggerDOMHandler = triggerHandlers.bind(null, 'dom');\n  const globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true);\n  WINDOW.document.addEventListener('click', globalDOMEventHandler, false);\n  WINDOW.document.addEventListener('keypress', globalDOMEventHandler, false);\n\n  // After hooking into click and keypress events bubbled up to `document`, we also hook into user-handled\n  // clicks & keypresses, by adding an event listener of our own to any element to which they add a listener. That\n  // way, whenever one of their handlers is triggered, ours will be, too. (This is needed because their handler\n  // could potentially prevent the event from bubbling up to our global listeners. This way, our handler are still\n  // guaranteed to fire at least once.)\n  ['EventTarget', 'Node'].forEach((target: string) => {\n    const globalObject = WINDOW as unknown as Record<string, { prototype?: object }>;\n    const targetObj = globalObject[target];\n    const proto = targetObj && targetObj.prototype;\n\n    // eslint-disable-next-line no-prototype-builtins\n    if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n      return;\n    }\n\n    fill(proto, 'addEventListener', function (originalAddEventListener: AddEventListener): AddEventListener {\n      return function (this: InstrumentedElement, type, listener, options): AddEventListener {\n        if (type === 'click' || type == 'keypress') {\n          try {\n            const handlers = (this.__sentry_instrumentation_handlers__ =\n              this.__sentry_instrumentation_handlers__ || {});\n            const handlerForType = (handlers[type] = handlers[type] || { refCount: 0 });\n\n            if (!handlerForType.handler) {\n              const handler = makeDOMEventHandler(triggerDOMHandler);\n              handlerForType.handler = handler;\n              originalAddEventListener.call(this, type, handler, options);\n            }\n\n            handlerForType.refCount++;\n          } catch (e) {\n            // Accessing dom properties is always fragile.\n            // Also allows us to skip `addEventListeners` calls with no proper `this` context.\n          }\n        }\n\n        return originalAddEventListener.call(this, type, listener, options);\n      };\n    });\n\n    fill(\n      proto,\n      'removeEventListener',\n      function (originalRemoveEventListener: RemoveEventListener): RemoveEventListener {\n        return function (this: InstrumentedElement, type, listener, options): () => void {\n          if (type === 'click' || type == 'keypress') {\n            try {\n              const handlers = this.__sentry_instrumentation_handlers__ || {};\n              const handlerForType = handlers[type];\n\n              if (handlerForType) {\n                handlerForType.refCount--;\n                // If there are no longer any custom handlers of the current type on this element, we can remove ours, too.\n                if (handlerForType.refCount <= 0) {\n                  originalRemoveEventListener.call(this, type, handlerForType.handler, options);\n                  handlerForType.handler = undefined;\n                  delete handlers[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n                }\n\n                // If there are no longer any custom handlers of any type on this element, cleanup everything.\n                if (Object.keys(handlers).length === 0) {\n                  delete this.__sentry_instrumentation_handlers__;\n                }\n              }\n            } catch (e) {\n              // Accessing dom properties is always fragile.\n              // Also allows us to skip `addEventListeners` calls with no proper `this` context.\n            }\n          }\n\n          return originalRemoveEventListener.call(this, type, listener, options);\n        };\n      },\n    );\n  });\n}\n\n/**\n * Check whether the event is similar to the last captured one. For example, two click events on the same button.\n */\nfunction isSimilarToLastCapturedEvent(event: Event): boolean {\n  // If both events have different type, then user definitely performed two separate actions. e.g. click + keypress.\n  if (event.type !== lastCapturedEventType) {\n    return false;\n  }\n\n  try {\n    // If both events have the same type, it's still possible that actions were performed on different targets.\n    // e.g. 2 clicks on different buttons.\n    if (!event.target || (event.target as SentryWrappedTarget)._sentryId !== lastCapturedEventTargetId) {\n      return false;\n    }\n  } catch (e) {\n    // just accessing `target` property can throw an exception in some rare circumstances\n    // see: https://github.com/getsentry/sentry-javascript/issues/838\n  }\n\n  // If both events have the same type _and_ same `target` (an element which triggered an event, _not necessarily_\n  // to which an event listener was attached), we treat them as the same action, as we want to capture\n  // only one breadcrumb. e.g. multiple clicks on the same button, or typing inside a user input box.\n  return true;\n}\n\n/**\n * Decide whether an event should be captured.\n * @param event event to be captured\n */\nfunction shouldSkipDOMEvent(eventType: string, target: SentryWrappedTarget | null): boolean {\n  // We are only interested in filtering `keypress` events for now.\n  if (eventType !== 'keypress') {\n    return false;\n  }\n\n  if (!target || !target.tagName) {\n    return true;\n  }\n\n  // Only consider keypress events on actual input elements. This will disregard keypresses targeting body\n  // e.g.tabbing through elements, hotkeys, etc.\n  if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n    return false;\n  }\n\n  return true;\n}\n\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n */\nfunction makeDOMEventHandler(\n  handler: (data: HandlerDataDom) => void,\n  globalListener: boolean = false,\n): (event: Event) => void {\n  return (event: Event & { _sentryCaptured?: true }): void => {\n    // It's possible this handler might trigger multiple times for the same\n    // event (e.g. event propagation through node ancestors).\n    // Ignore if we've already captured that event.\n    if (!event || event['_sentryCaptured']) {\n      return;\n    }\n\n    const target = getEventTarget(event);\n\n    // We always want to skip _some_ events.\n    if (shouldSkipDOMEvent(event.type, target)) {\n      return;\n    }\n\n    // Mark event as \"seen\"\n    addNonEnumerableProperty(event, '_sentryCaptured', true);\n\n    if (target && !target._sentryId) {\n      // Add UUID to event target so we can identify if\n      addNonEnumerableProperty(target, '_sentryId', uuid4());\n    }\n\n    const name = event.type === 'keypress' ? 'input' : event.type;\n\n    // If there is no last captured event, it means that we can safely capture the new event and store it for future comparisons.\n    // If there is a last captured event, see if the new event is different enough to treat it as a unique one.\n    // If that's the case, emit the previous event and store locally the newly-captured DOM event.\n    if (!isSimilarToLastCapturedEvent(event)) {\n      const handlerData: HandlerDataDom = { event, name, global: globalListener };\n      handler(handlerData);\n      lastCapturedEventType = event.type;\n      lastCapturedEventTargetId = target ? target._sentryId : undefined;\n    }\n\n    // Start a new debounce timer that will prevent us from capturing multiple events that should be grouped together.\n    clearTimeout(debounceTimerID);\n    debounceTimerID = WINDOW.setTimeout(() => {\n      lastCapturedEventTargetId = undefined;\n      lastCapturedEventType = undefined;\n    }, DEBOUNCE_DURATION);\n  };\n}\n\nfunction getEventTarget(event: Event): SentryWrappedTarget | null {\n  try {\n    return event.target as SentryWrappedTarget | null;\n  } catch (e) {\n    // just accessing `target` property can throw an exception in some rare circumstances\n    // see: https://github.com/getsentry/sentry-javascript/issues/838\n    return null;\n  }\n}\n","import { addHandler, fill, maybeInstrument, supportsHistory, triggerHandlers } from '@sentry/core';\nimport type { HandlerDataHistory } from '@sentry/core';\nimport { WINDOW } from '../types';\n\nlet lastHref: string | undefined;\n\n/**\n * Add an instrumentation handler for when a fetch request happens.\n * The handler function is called once when the request starts and once when it ends,\n * which can be identified by checking if it has an `endTimestamp`.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addHistoryInstrumentationHandler(handler: (data: HandlerDataHistory) => void): void {\n  const type = 'history';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentHistory);\n}\n\nfunction instrumentHistory(): void {\n  if (!supportsHistory()) {\n    return;\n  }\n\n  const oldOnPopState = WINDOW.onpopstate;\n  WINDOW.onpopstate = function (this: WindowEventHandlers, ...args: unknown[]) {\n    const to = WINDOW.location.href;\n    // keep track of the current URL state, as we always receive only the updated state\n    const from = lastHref;\n    lastHref = to;\n    const handlerData: HandlerDataHistory = { from, to };\n    triggerHandlers('history', handlerData);\n    if (oldOnPopState) {\n      // Apparently this can throw in Firefox when incorrectly implemented plugin is installed.\n      // https://github.com/getsentry/sentry-javascript/issues/3344\n      // https://github.com/bugsnag/bugsnag-js/issues/469\n      try {\n        return oldOnPopState.apply(this, args);\n      } catch (_oO) {\n        // no-empty\n      }\n    }\n  };\n\n  function historyReplacementFunction(originalHistoryFunction: () => void): () => void {\n    return function (this: History, ...args: unknown[]): void {\n      const url = args.length > 2 ? args[2] : undefined;\n      if (url) {\n        // coerce to string (this is what pushState does)\n        const from = lastHref;\n        const to = String(url);\n        // keep track of the current URL state, as we always receive only the updated state\n        lastHref = to;\n        const handlerData: HandlerDataHistory = { from, to };\n        triggerHandlers('history', handlerData);\n      }\n      return originalHistoryFunction.apply(this, args);\n    };\n  }\n\n  fill(WINDOW.history, 'pushState', historyReplacementFunction);\n  fill(WINDOW.history, 'replaceState', historyReplacementFunction);\n}\n","import type { HandlerDataXhr, SentryWrappedXMLHttpRequest } from '@sentry/core';\nimport { addHandler, isString, maybeInstrument, timestampInSeconds, triggerHandlers } from '@sentry/core';\nimport { WINDOW } from '../types';\n\nexport const SENTRY_XHR_DATA_KEY = '__sentry_xhr_v3__';\n\ntype WindowWithXhr = Window & { XMLHttpRequest?: typeof XMLHttpRequest };\n\n/**\n * Add an instrumentation handler for when an XHR request happens.\n * The handler function is called once when the request starts and once when it ends,\n * which can be identified by checking if it has an `endTimestamp`.\n *\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addXhrInstrumentationHandler(handler: (data: HandlerDataXhr) => void): void {\n  const type = 'xhr';\n  addHandler(type, handler);\n  maybeInstrument(type, instrumentXHR);\n}\n\n/** Exported only for tests. */\nexport function instrumentXHR(): void {\n  if (!(WINDOW as WindowWithXhr).XMLHttpRequest) {\n    return;\n  }\n\n  const xhrproto = XMLHttpRequest.prototype;\n\n  // eslint-disable-next-line @typescript-eslint/unbound-method\n  xhrproto.open = new Proxy(xhrproto.open, {\n    apply(originalOpen, xhrOpenThisArg: XMLHttpRequest & SentryWrappedXMLHttpRequest, xhrOpenArgArray) {\n      // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n      //       it means the error, that was caused by your XHR call did not\n      //       have a stack trace. If you are using HttpClient integration,\n      //       this is the expected behavior, as we are using this virtual error to capture\n      //       the location of your XHR call, and group your HttpClient events accordingly.\n      const virtualError = new Error();\n\n      const startTimestamp = timestampInSeconds() * 1000;\n\n      // open() should always be called with two or more arguments\n      // But to be on the safe side, we actually validate this and bail out if we don't have a method & url\n      const method = isString(xhrOpenArgArray[0]) ? xhrOpenArgArray[0].toUpperCase() : undefined;\n      const url = parseUrl(xhrOpenArgArray[1]);\n\n      if (!method || !url) {\n        return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray);\n      }\n\n      xhrOpenThisArg[SENTRY_XHR_DATA_KEY] = {\n        method,\n        url,\n        request_headers: {},\n      };\n\n      // if Sentry key appears in URL, don't capture it as a request\n      if (method === 'POST' && url.match(/sentry_key/)) {\n        xhrOpenThisArg.__sentry_own_request__ = true;\n      }\n\n      const onreadystatechangeHandler: () => void = () => {\n        // For whatever reason, this is not the same instance here as from the outer method\n        const xhrInfo = xhrOpenThisArg[SENTRY_XHR_DATA_KEY];\n\n        if (!xhrInfo) {\n          return;\n        }\n\n        if (xhrOpenThisArg.readyState === 4) {\n          try {\n            // touching statusCode in some platforms throws\n            // an exception\n            xhrInfo.status_code = xhrOpenThisArg.status;\n          } catch (e) {\n            /* do nothing */\n          }\n\n          const handlerData: HandlerDataXhr = {\n            endTimestamp: timestampInSeconds() * 1000,\n            startTimestamp,\n            xhr: xhrOpenThisArg,\n            virtualError,\n          };\n          triggerHandlers('xhr', handlerData);\n        }\n      };\n\n      if ('onreadystatechange' in xhrOpenThisArg && typeof xhrOpenThisArg.onreadystatechange === 'function') {\n        xhrOpenThisArg.onreadystatechange = new Proxy(xhrOpenThisArg.onreadystatechange, {\n          apply(originalOnreadystatechange, onreadystatechangeThisArg, onreadystatechangeArgArray: unknown[]) {\n            onreadystatechangeHandler();\n            return originalOnreadystatechange.apply(onreadystatechangeThisArg, onreadystatechangeArgArray);\n          },\n        });\n      } else {\n        xhrOpenThisArg.addEventListener('readystatechange', onreadystatechangeHandler);\n      }\n\n      // Intercepting `setRequestHeader` to access the request headers of XHR instance.\n      // This will only work for user/library defined headers, not for the default/browser-assigned headers.\n      // Request cookies are also unavailable for XHR, as `Cookie` header can't be defined by `setRequestHeader`.\n      xhrOpenThisArg.setRequestHeader = new Proxy(xhrOpenThisArg.setRequestHeader, {\n        apply(\n          originalSetRequestHeader,\n          setRequestHeaderThisArg: SentryWrappedXMLHttpRequest,\n          setRequestHeaderArgArray: unknown[],\n        ) {\n          const [header, value] = setRequestHeaderArgArray;\n\n          const xhrInfo = setRequestHeaderThisArg[SENTRY_XHR_DATA_KEY];\n\n          if (xhrInfo && isString(header) && isString(value)) {\n            xhrInfo.request_headers[header.toLowerCase()] = value;\n          }\n\n          return originalSetRequestHeader.apply(setRequestHeaderThisArg, setRequestHeaderArgArray);\n        },\n      });\n\n      return originalOpen.apply(xhrOpenThisArg, xhrOpenArgArray);\n    },\n  });\n\n  // eslint-disable-next-line @typescript-eslint/unbound-method\n  xhrproto.send = new Proxy(xhrproto.send, {\n    apply(originalSend, sendThisArg: XMLHttpRequest & SentryWrappedXMLHttpRequest, sendArgArray: unknown[]) {\n      const sentryXhrData = sendThisArg[SENTRY_XHR_DATA_KEY];\n\n      if (!sentryXhrData) {\n        return originalSend.apply(sendThisArg, sendArgArray);\n      }\n\n      if (sendArgArray[0] !== undefined) {\n        sentryXhrData.body = sendArgArray[0];\n      }\n\n      const handlerData: HandlerDataXhr = {\n        startTimestamp: timestampInSeconds() * 1000,\n        xhr: sendThisArg,\n      };\n      triggerHandlers('xhr', handlerData);\n\n      return originalSend.apply(sendThisArg, sendArgArray);\n    },\n  });\n}\n\nfunction parseUrl(url: string | unknown): string | undefined {\n  if (isString(url)) {\n    return url;\n  }\n\n  try {\n    // url can be a string or URL\n    // but since URL is not available in IE11, we do not check for it,\n    // but simply assume it is an URL and return `toString()` from it (which returns the full URL)\n    // If that fails, we just return undefined\n    return (url as URL).toString();\n  } catch {} // eslint-disable-line no-empty\n\n  return undefined;\n}\n","/* eslint-disable max-lines */\nimport type { Measurements, Span, SpanAttributes, StartSpanOptions } from '@sentry/core';\nimport {\n  SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n  browserPerformanceTimeOrigin,\n  getActiveSpan,\n  getComponentName,\n  htmlTreeAsString,\n  parseUrl,\n  setMeasurement,\n  spanToJSON,\n} from '@sentry/core';\nimport { WINDOW } from '../types';\nimport { trackClsAsStandaloneSpan } from './cls';\nimport {\n  type PerformanceLongAnimationFrameTiming,\n  addClsInstrumentationHandler,\n  addFidInstrumentationHandler,\n  addLcpInstrumentationHandler,\n  addPerformanceInstrumentationHandler,\n  addTtfbInstrumentationHandler,\n} from './instrument';\nimport { getBrowserPerformanceAPI, isMeasurementValue, msToSec, startAndEndSpan } from './utils';\nimport { getActivationStart } from './web-vitals/lib/getActivationStart';\nimport { getNavigationEntry } from './web-vitals/lib/getNavigationEntry';\nimport { getVisibilityWatcher } from './web-vitals/lib/getVisibilityWatcher';\n\ninterface NavigatorNetworkInformation {\n  readonly connection?: NetworkInformation;\n}\n\n// http://wicg.github.io/netinfo/#connection-types\ntype ConnectionType = 'bluetooth' | 'cellular' | 'ethernet' | 'mixed' | 'none' | 'other' | 'unknown' | 'wifi' | 'wimax';\n\n// http://wicg.github.io/netinfo/#effectiveconnectiontype-enum\ntype EffectiveConnectionType = '2g' | '3g' | '4g' | 'slow-2g';\n\n// http://wicg.github.io/netinfo/#dom-megabit\ntype Megabit = number;\n// http://wicg.github.io/netinfo/#dom-millisecond\ntype Millisecond = number;\n\n// http://wicg.github.io/netinfo/#networkinformation-interface\ninterface NetworkInformation extends EventTarget {\n  // http://wicg.github.io/netinfo/#type-attribute\n  readonly type?: ConnectionType;\n  // http://wicg.github.io/netinfo/#effectivetype-attribute\n  readonly effectiveType?: EffectiveConnectionType;\n  // http://wicg.github.io/netinfo/#downlinkmax-attribute\n  readonly downlinkMax?: Megabit;\n  // http://wicg.github.io/netinfo/#downlink-attribute\n  readonly downlink?: Megabit;\n  // http://wicg.github.io/netinfo/#rtt-attribute\n  readonly rtt?: Millisecond;\n  // http://wicg.github.io/netinfo/#savedata-attribute\n  readonly saveData?: boolean;\n  // http://wicg.github.io/netinfo/#handling-changes-to-the-underlying-connection\n  onchange?: EventListener;\n}\n\n// https://w3c.github.io/device-memory/#sec-device-memory-js-api\ninterface NavigatorDeviceMemory {\n  readonly deviceMemory?: number;\n}\n\nconst MAX_INT_AS_BYTES = 2147483647;\n\nlet _performanceCursor: number = 0;\n\nlet _measurements: Measurements = {};\nlet _lcpEntry: LargestContentfulPaint | undefined;\nlet _clsEntry: LayoutShift | undefined;\n\ninterface StartTrackingWebVitalsOptions {\n  recordClsStandaloneSpans: boolean;\n}\n\n/**\n * Start tracking web vitals.\n * The callback returned by this function can be used to stop tracking & ensure all measurements are final & captured.\n *\n * @returns A function that forces web vitals collection\n */\nexport function startTrackingWebVitals({ recordClsStandaloneSpans }: StartTrackingWebVitalsOptions): () => void {\n  const performance = getBrowserPerformanceAPI();\n  if (performance && browserPerformanceTimeOrigin) {\n    // @ts-expect-error we want to make sure all of these are available, even if TS is sure they are\n    if (performance.mark) {\n      WINDOW.performance.mark('sentry-tracing-init');\n    }\n    const fidCleanupCallback = _trackFID();\n    const lcpCleanupCallback = _trackLCP();\n    const ttfbCleanupCallback = _trackTtfb();\n    const clsCleanupCallback = recordClsStandaloneSpans ? trackClsAsStandaloneSpan() : _trackCLS();\n\n    return (): void => {\n      fidCleanupCallback();\n      lcpCleanupCallback();\n      ttfbCleanupCallback();\n      clsCleanupCallback && clsCleanupCallback();\n    };\n  }\n\n  return () => undefined;\n}\n\n/**\n * Start tracking long tasks.\n */\nexport function startTrackingLongTasks(): void {\n  addPerformanceInstrumentationHandler('longtask', ({ entries }) => {\n    const parent = getActiveSpan();\n    if (!parent) {\n      return;\n    }\n\n    const { op: parentOp, start_timestamp: parentStartTimestamp } = spanToJSON(parent);\n\n    for (const entry of entries) {\n      const startTime = msToSec((browserPerformanceTimeOrigin as number) + entry.startTime);\n      const duration = msToSec(entry.duration);\n\n      if (parentOp === 'navigation' && parentStartTimestamp && startTime < parentStartTimestamp) {\n        // Skip adding a span if the long task started before the navigation started.\n        // `startAndEndSpan` will otherwise adjust the parent's start time to the span's start\n        // time, potentially skewing the duration of the actual navigation as reported via our\n        // routing instrumentations\n        continue;\n      }\n\n      startAndEndSpan(parent, startTime, startTime + duration, {\n        name: 'Main UI thread blocked',\n        op: 'ui.long-task',\n        attributes: {\n          [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n        },\n      });\n    }\n  });\n}\n\n/**\n * Start tracking long animation frames.\n */\nexport function startTrackingLongAnimationFrames(): void {\n  // NOTE: the current web-vitals version (3.5.2) does not support long-animation-frame, so\n  // we directly observe `long-animation-frame` events instead of through the web-vitals\n  // `observe` helper function.\n  const observer = new PerformanceObserver(list => {\n    const parent = getActiveSpan();\n    if (!parent) {\n      return;\n    }\n    for (const entry of list.getEntries() as PerformanceLongAnimationFrameTiming[]) {\n      if (!entry.scripts[0]) {\n        continue;\n      }\n\n      const startTime = msToSec((browserPerformanceTimeOrigin as number) + entry.startTime);\n\n      const { start_timestamp: parentStartTimestamp, op: parentOp } = spanToJSON(parent);\n\n      if (parentOp === 'navigation' && parentStartTimestamp && startTime < parentStartTimestamp) {\n        // Skip adding the span if the long animation frame started before the navigation started.\n        // `startAndEndSpan` will otherwise adjust the parent's start time to the span's start\n        // time, potentially skewing the duration of the actual navigation as reported via our\n        // routing instrumentations\n        continue;\n      }\n\n      const duration = msToSec(entry.duration);\n\n      const attributes: SpanAttributes = {\n        [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n      };\n\n      const initialScript = entry.scripts[0];\n      const { invoker, invokerType, sourceURL, sourceFunctionName, sourceCharPosition } = initialScript;\n      attributes['browser.script.invoker'] = invoker;\n      attributes['browser.script.invoker_type'] = invokerType;\n      if (sourceURL) {\n        attributes['code.filepath'] = sourceURL;\n      }\n      if (sourceFunctionName) {\n        attributes['code.function'] = sourceFunctionName;\n      }\n      if (sourceCharPosition !== -1) {\n        attributes['browser.script.source_char_position'] = sourceCharPosition;\n      }\n\n      startAndEndSpan(parent, startTime, startTime + duration, {\n        name: 'Main UI thread blocked',\n        op: 'ui.long-animation-frame',\n        attributes,\n      });\n    }\n  });\n\n  observer.observe({ type: 'long-animation-frame', buffered: true });\n}\n\n/**\n * Start tracking interaction events.\n */\nexport function startTrackingInteractions(): void {\n  addPerformanceInstrumentationHandler('event', ({ entries }) => {\n    const parent = getActiveSpan();\n    if (!parent) {\n      return;\n    }\n    for (const entry of entries) {\n      if (entry.name === 'click') {\n        const startTime = msToSec((browserPerformanceTimeOrigin as number) + entry.startTime);\n        const duration = msToSec(entry.duration);\n\n        const spanOptions: StartSpanOptions & Required<Pick<StartSpanOptions, 'attributes'>> = {\n          name: htmlTreeAsString(entry.target),\n          op: `ui.interaction.${entry.name}`,\n          startTime: startTime,\n          attributes: {\n            [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n          },\n        };\n\n        const componentName = getComponentName(entry.target);\n        if (componentName) {\n          spanOptions.attributes['ui.component_name'] = componentName;\n        }\n\n        startAndEndSpan(parent, startTime, startTime + duration, spanOptions);\n      }\n    }\n  });\n}\n\nexport { registerInpInteractionListener, startTrackingINP } from './inp';\n\n/**\n * Starts tracking the Cumulative Layout Shift on the current page and collects the value and last entry\n * to the `_measurements` object which ultimately is applied to the pageload span's measurements.\n */\nfunction _trackCLS(): () => void {\n  return addClsInstrumentationHandler(({ metric }) => {\n    const entry = metric.entries[metric.entries.length - 1] as LayoutShift | undefined;\n    if (!entry) {\n      return;\n    }\n    _measurements['cls'] = { value: metric.value, unit: '' };\n    _clsEntry = entry;\n  }, true);\n}\n\n/** Starts tracking the Largest Contentful Paint on the current page. */\nfunction _trackLCP(): () => void {\n  return addLcpInstrumentationHandler(({ metric }) => {\n    const entry = metric.entries[metric.entries.length - 1];\n    if (!entry) {\n      return;\n    }\n\n    _measurements['lcp'] = { value: metric.value, unit: 'millisecond' };\n    _lcpEntry = entry as LargestContentfulPaint;\n  }, true);\n}\n\n/** Starts tracking the First Input Delay on the current page. */\nfunction _trackFID(): () => void {\n  return addFidInstrumentationHandler(({ metric }) => {\n    const entry = metric.entries[metric.entries.length - 1];\n    if (!entry) {\n      return;\n    }\n\n    const timeOrigin = msToSec(browserPerformanceTimeOrigin as number);\n    const startTime = msToSec(entry.startTime);\n    _measurements['fid'] = { value: metric.value, unit: 'millisecond' };\n    _measurements['mark.fid'] = { value: timeOrigin + startTime, unit: 'second' };\n  });\n}\n\nfunction _trackTtfb(): () => void {\n  return addTtfbInstrumentationHandler(({ metric }) => {\n    const entry = metric.entries[metric.entries.length - 1];\n    if (!entry) {\n      return;\n    }\n\n    _measurements['ttfb'] = { value: metric.value, unit: 'millisecond' };\n  });\n}\n\ninterface AddPerformanceEntriesOptions {\n  /**\n   * Flag to determine if CLS should be recorded as a measurement on the span or\n   * sent as a standalone span instead.\n   */\n  recordClsOnPageloadSpan: boolean;\n}\n\n/** Add performance related spans to a transaction */\nexport function addPerformanceEntries(span: Span, options: AddPerformanceEntriesOptions): void {\n  const performance = getBrowserPerformanceAPI();\n  if (!performance || !performance.getEntries || !browserPerformanceTimeOrigin) {\n    // Gatekeeper if performance API not available\n    return;\n  }\n\n  const timeOrigin = msToSec(browserPerformanceTimeOrigin);\n\n  const performanceEntries = performance.getEntries();\n\n  const { op, start_timestamp: transactionStartTime } = spanToJSON(span);\n\n  performanceEntries.slice(_performanceCursor).forEach(entry => {\n    const startTime = msToSec(entry.startTime);\n    const duration = msToSec(\n      // Inexplicably, Chrome sometimes emits a negative duration. We need to work around this.\n      // There is a SO post attempting to explain this, but it leaves one with open questions: https://stackoverflow.com/questions/23191918/peformance-getentries-and-negative-duration-display\n      // The way we clamp the value is probably not accurate, since we have observed this happen for things that may take a while to load, like for example the replay worker.\n      // TODO: Investigate why this happens and how to properly mitigate. For now, this is a workaround to prevent transactions being dropped due to negative duration spans.\n      Math.max(0, entry.duration),\n    );\n\n    if (op === 'navigation' && transactionStartTime && timeOrigin + startTime < transactionStartTime) {\n      return;\n    }\n\n    switch (entry.entryType) {\n      case 'navigation': {\n        _addNavigationSpans(span, entry as PerformanceNavigationTiming, timeOrigin);\n        break;\n      }\n      case 'mark':\n      case 'paint':\n      case 'measure': {\n        _addMeasureSpans(span, entry, startTime, duration, timeOrigin);\n\n        // capture web vitals\n        const firstHidden = getVisibilityWatcher();\n        // Only report if the page wasn't hidden prior to the web vital.\n        const shouldRecord = entry.startTime < firstHidden.firstHiddenTime;\n\n        if (entry.name === 'first-paint' && shouldRecord) {\n          _measurements['fp'] = { value: entry.startTime, unit: 'millisecond' };\n        }\n        if (entry.name === 'first-contentful-paint' && shouldRecord) {\n          _measurements['fcp'] = { value: entry.startTime, unit: 'millisecond' };\n        }\n        break;\n      }\n      case 'resource': {\n        _addResourceSpans(span, entry as PerformanceResourceTiming, entry.name, startTime, duration, timeOrigin);\n        break;\n      }\n      // Ignore other entry types.\n    }\n  });\n\n  _performanceCursor = Math.max(performanceEntries.length - 1, 0);\n\n  _trackNavigator(span);\n\n  // Measurements are only available for pageload transactions\n  if (op === 'pageload') {\n    _addTtfbRequestTimeToMeasurements(_measurements);\n\n    const fidMark = _measurements['mark.fid'];\n    if (fidMark && _measurements['fid']) {\n      // create span for FID\n      startAndEndSpan(span, fidMark.value, fidMark.value + msToSec(_measurements['fid'].value), {\n        name: 'first input delay',\n        op: 'ui.action',\n        attributes: {\n          [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n        },\n      });\n\n      // Delete mark.fid as we don't want it to be part of final payload\n      delete _measurements['mark.fid'];\n    }\n\n    // If FCP is not recorded we should not record the cls value\n    // according to the new definition of CLS.\n    // TODO: Check if the first condition is still necessary: `onCLS` already only fires once `onFCP` was called.\n    if (!('fcp' in _measurements) || !options.recordClsOnPageloadSpan) {\n      delete _measurements.cls;\n    }\n\n    Object.entries(_measurements).forEach(([measurementName, measurement]) => {\n      setMeasurement(measurementName, measurement.value, measurement.unit);\n    });\n\n    // Set timeOrigin which denotes the timestamp which to base the LCP/FCP/FP/TTFB measurements on\n    span.setAttribute('performance.timeOrigin', timeOrigin);\n\n    // In prerendering scenarios, where a page might be prefetched and pre-rendered before the user clicks the link,\n    // the navigation starts earlier than when the user clicks it. Web Vitals should always be based on the\n    // user-perceived time, so they are not reported from the actual start of the navigation, but rather from the\n    // time where the user actively started the navigation, for example by clicking a link.\n    // This is user action is called \"activation\" and the time between navigation and activation is stored in\n    // the `activationStart` attribute of the \"navigation\" PerformanceEntry.\n    span.setAttribute('performance.activationStart', getActivationStart());\n\n    _setWebVitalAttributes(span);\n  }\n\n  _lcpEntry = undefined;\n  _clsEntry = undefined;\n  _measurements = {};\n}\n\n/**\n * Create measure related spans.\n * Exported only for tests.\n */\nexport function _addMeasureSpans(\n  span: Span,\n  entry: PerformanceEntry,\n  startTime: number,\n  duration: number,\n  timeOrigin: number,\n): number {\n  const navEntry = getNavigationEntry(false);\n  const requestTime = msToSec(navEntry ? navEntry.requestStart : 0);\n  // Because performance.measure accepts arbitrary timestamps it can produce\n  // spans that happen before the browser even makes a request for the page.\n  //\n  // An example of this is the automatically generated Next.js-before-hydration\n  // spans created by the Next.js framework.\n  //\n  // To prevent this we will pin the start timestamp to the request start time\n  // This does make duration inaccurate, so if this does happen, we will add\n  // an attribute to the span\n  const measureStartTimestamp = timeOrigin + Math.max(startTime, requestTime);\n  const startTimeStamp = timeOrigin + startTime;\n  const measureEndTimestamp = startTimeStamp + duration;\n\n  const attributes: SpanAttributes = {\n    [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.resource.browser.metrics',\n  };\n\n  if (measureStartTimestamp !== startTimeStamp) {\n    attributes['sentry.browser.measure_happened_before_request'] = true;\n    attributes['sentry.browser.measure_start_time'] = measureStartTimestamp;\n  }\n\n  startAndEndSpan(span, measureStartTimestamp, measureEndTimestamp, {\n    name: entry.name as string,\n    op: entry.entryType as string,\n    attributes,\n  });\n\n  return measureStartTimestamp;\n}\n\n/** Instrument navigation entries */\nfunction _addNavigationSpans(span: Span, entry: PerformanceNavigationTiming, timeOrigin: number): void {\n  (['unloadEvent', 'redirect', 'domContentLoadedEvent', 'loadEvent', 'connect'] as const).forEach(event => {\n    _addPerformanceNavigationTiming(span, entry, event, timeOrigin);\n  });\n  _addPerformanceNavigationTiming(span, entry, 'secureConnection', timeOrigin, 'TLS/SSL');\n  _addPerformanceNavigationTiming(span, entry, 'fetch', timeOrigin, 'cache');\n  _addPerformanceNavigationTiming(span, entry, 'domainLookup', timeOrigin, 'DNS');\n\n  _addRequest(span, entry, timeOrigin);\n}\n\ntype StartEventName =\n  | 'secureConnection'\n  | 'fetch'\n  | 'domainLookup'\n  | 'unloadEvent'\n  | 'redirect'\n  | 'connect'\n  | 'domContentLoadedEvent'\n  | 'loadEvent';\n\ntype EndEventName =\n  | 'connectEnd'\n  | 'domainLookupStart'\n  | 'domainLookupEnd'\n  | 'unloadEventEnd'\n  | 'redirectEnd'\n  | 'connectEnd'\n  | 'domContentLoadedEventEnd'\n  | 'loadEventEnd';\n\n/** Create performance navigation related spans */\nfunction _addPerformanceNavigationTiming(\n  span: Span,\n  entry: PerformanceNavigationTiming,\n  event: StartEventName,\n  timeOrigin: number,\n  name: string = event,\n): void {\n  const eventEnd = _getEndPropertyNameForNavigationTiming(event) satisfies keyof PerformanceNavigationTiming;\n  const end = entry[eventEnd];\n  const start = entry[`${event}Start`];\n  if (!start || !end) {\n    return;\n  }\n  startAndEndSpan(span, timeOrigin + msToSec(start), timeOrigin + msToSec(end), {\n    op: `browser.${name}`,\n    name: entry.name,\n    attributes: {\n      [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n    },\n  });\n}\n\nfunction _getEndPropertyNameForNavigationTiming(event: StartEventName): EndEventName {\n  if (event === 'secureConnection') {\n    return 'connectEnd';\n  }\n  if (event === 'fetch') {\n    return 'domainLookupStart';\n  }\n  return `${event}End`;\n}\n\n/** Create request and response related spans */\nfunction _addRequest(span: Span, entry: PerformanceNavigationTiming, timeOrigin: number): void {\n  const requestStartTimestamp = timeOrigin + msToSec(entry.requestStart as number);\n  const responseEndTimestamp = timeOrigin + msToSec(entry.responseEnd as number);\n  const responseStartTimestamp = timeOrigin + msToSec(entry.responseStart as number);\n  if (entry.responseEnd) {\n    // It is possible that we are collecting these metrics when the page hasn't finished loading yet, for example when the HTML slowly streams in.\n    // In this case, ie. when the document request hasn't finished yet, `entry.responseEnd` will be 0.\n    // In order not to produce faulty spans, where the end timestamp is before the start timestamp, we will only collect\n    // these spans when the responseEnd value is available. The backend (Relay) would drop the entire span if it contained faulty spans.\n    startAndEndSpan(span, requestStartTimestamp, responseEndTimestamp, {\n      op: 'browser.request',\n      name: entry.name,\n      attributes: {\n        [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n      },\n    });\n\n    startAndEndSpan(span, responseStartTimestamp, responseEndTimestamp, {\n      op: 'browser.response',\n      name: entry.name,\n      attributes: {\n        [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.ui.browser.metrics',\n      },\n    });\n  }\n}\n\n/**\n * Create resource-related spans.\n * Exported only for tests.\n */\nexport function _addResourceSpans(\n  span: Span,\n  entry: PerformanceResourceTiming,\n  resourceUrl: string,\n  startTime: number,\n  duration: number,\n  timeOrigin: number,\n): void {\n  // we already instrument based on fetch and xhr, so we don't need to\n  // duplicate spans here.\n  if (entry.initiatorType === 'xmlhttprequest' || entry.initiatorType === 'fetch') {\n    return;\n  }\n\n  const parsedUrl = parseUrl(resourceUrl);\n\n  const attributes: SpanAttributes = {\n    [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.resource.browser.metrics',\n  };\n  setResourceEntrySizeData(attributes, entry, 'transferSize', 'http.response_transfer_size');\n  setResourceEntrySizeData(attributes, entry, 'encodedBodySize', 'http.response_content_length');\n  setResourceEntrySizeData(attributes, entry, 'decodedBodySize', 'http.decoded_response_content_length');\n\n  // `deliveryType` is experimental and does not exist everywhere\n  const deliveryType = (entry as { deliveryType?: 'cache' | 'navigational-prefetch' | '' }).deliveryType;\n  if (deliveryType != null) {\n    attributes['http.response_delivery_type'] = deliveryType;\n  }\n\n  // Types do not reflect this property yet\n  const renderBlockingStatus = (entry as { renderBlockingStatus?: 'render-blocking' | 'non-render-blocking' })\n    .renderBlockingStatus;\n  if (renderBlockingStatus) {\n    attributes['resource.render_blocking_status'] = renderBlockingStatus;\n  }\n\n  if (parsedUrl.protocol) {\n    attributes['url.scheme'] = parsedUrl.protocol.split(':').pop(); // the protocol returned by parseUrl includes a :, but OTEL spec does not, so we remove it.\n  }\n\n  if (parsedUrl.host) {\n    attributes['server.address'] = parsedUrl.host;\n  }\n\n  attributes['url.same_origin'] = resourceUrl.includes(WINDOW.location.origin);\n\n  const startTimestamp = timeOrigin + startTime;\n  const endTimestamp = startTimestamp + duration;\n\n  startAndEndSpan(span, startTimestamp, endTimestamp, {\n    name: resourceUrl.replace(WINDOW.location.origin, ''),\n    op: entry.initiatorType ? `resource.${entry.initiatorType}` : 'resource.other',\n    attributes,\n  });\n}\n\n/**\n * Capture the information of the user agent.\n */\nfunction _trackNavigator(span: Span): void {\n  const navigator = WINDOW.navigator as null | (Navigator & NavigatorNetworkInformation & NavigatorDeviceMemory);\n  if (!navigator) {\n    return;\n  }\n\n  // track network connectivity\n  const connection = navigator.connection;\n  if (connection) {\n    if (connection.effectiveType) {\n      span.setAttribute('effectiveConnectionType', connection.effectiveType);\n    }\n\n    if (connection.type) {\n      span.setAttribute('connectionType', connection.type);\n    }\n\n    if (isMeasurementValue(connection.rtt)) {\n      _measurements['connection.rtt'] = { value: connection.rtt, unit: 'millisecond' };\n    }\n  }\n\n  if (isMeasurementValue(navigator.deviceMemory)) {\n    span.setAttribute('deviceMemory', `${navigator.deviceMemory} GB`);\n  }\n\n  if (isMeasurementValue(navigator.hardwareConcurrency)) {\n    span.setAttribute('hardwareConcurrency', String(navigator.hardwareConcurrency));\n  }\n}\n\n/** Add LCP / CLS data to span to allow debugging */\nfunction _setWebVitalAttributes(span: Span): void {\n  if (_lcpEntry) {\n    // Capture Properties of the LCP element that contributes to the LCP.\n\n    if (_lcpEntry.element) {\n      span.setAttribute('lcp.element', htmlTreeAsString(_lcpEntry.element));\n    }\n\n    if (_lcpEntry.id) {\n      span.setAttribute('lcp.id', _lcpEntry.id);\n    }\n\n    if (_lcpEntry.url) {\n      // Trim URL to the first 200 characters.\n      span.setAttribute('lcp.url', _lcpEntry.url.trim().slice(0, 200));\n    }\n\n    if (_lcpEntry.loadTime != null) {\n      // loadTime is the time of LCP that's related to receiving the LCP element response..\n      span.setAttribute('lcp.loadTime', _lcpEntry.loadTime);\n    }\n\n    if (_lcpEntry.renderTime != null) {\n      // renderTime is loadTime + rendering time\n      // it's 0 if the LCP element is loaded from a 3rd party origin that doesn't send the\n      // `Timing-Allow-Origin` header.\n      span.setAttribute('lcp.renderTime', _lcpEntry.renderTime);\n    }\n\n    span.setAttribute('lcp.size', _lcpEntry.size);\n  }\n\n  // See: https://developer.mozilla.org/en-US/docs/Web/API/LayoutShift\n  if (_clsEntry && _clsEntry.sources) {\n    _clsEntry.sources.forEach((source, index) =>\n      span.setAttribute(`cls.source.${index + 1}`, htmlTreeAsString(source.node)),\n    );\n  }\n}\n\nfunction setResourceEntrySizeData(\n  attributes: SpanAttributes,\n  entry: PerformanceResourceTiming,\n  key: keyof Pick<PerformanceResourceTiming, 'transferSize' | 'encodedBodySize' | 'decodedBodySize'>,\n  dataKey: 'http.response_transfer_size' | 'http.response_content_length' | 'http.decoded_response_content_length',\n): void {\n  const entryVal = entry[key];\n  if (entryVal != null && entryVal < MAX_INT_AS_BYTES) {\n    attributes[dataKey] = entryVal;\n  }\n}\n\n/**\n * Add ttfb request time information to measurements.\n *\n * ttfb information is added via vendored web vitals library.\n */\nfunction _addTtfbRequestTimeToMeasurements(_measurements: Measurements): void {\n  const navEntry = getNavigationEntry(false);\n  if (!navEntry) {\n    return;\n  }\n\n  const { responseStart, requestStart } = navEntry;\n\n  if (requestStart <= responseStart) {\n    _measurements['ttfb.requestTime'] = {\n      value: responseStart - requestStart,\n      unit: 'millisecond',\n    };\n  }\n}\n","import {\n  SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME,\n  SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT,\n  SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE,\n  SEMANTIC_ATTRIBUTE_SENTRY_OP,\n  SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n  getActiveSpan,\n  getClient,\n  getCurrentScope,\n  getRootSpan,\n  spanToJSON,\n} from '@sentry/core';\nimport { browserPerformanceTimeOrigin, dropUndefinedKeys, htmlTreeAsString, logger } from '@sentry/core';\nimport type { SpanAttributes } from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { addClsInstrumentationHandler } from './instrument';\nimport { msToSec, startStandaloneWebVitalSpan } from './utils';\nimport { onHidden } from './web-vitals/lib/onHidden';\n\n/**\n * Starts tracking the Cumulative Layout Shift on the current page and collects the value once\n *\n * - the page visibility is hidden\n * - a navigation span is started (to stop CLS measurement for SPA soft navigations)\n *\n * Once either of these events triggers, the CLS value is sent as a standalone span and we stop\n * measuring CLS.\n */\nexport function trackClsAsStandaloneSpan(): void {\n  let standaloneCLsValue = 0;\n  let standaloneClsEntry: LayoutShift | undefined;\n  let pageloadSpanId: string | undefined;\n\n  if (!supportsLayoutShift()) {\n    return;\n  }\n\n  let sentSpan = false;\n  function _collectClsOnce() {\n    if (sentSpan) {\n      return;\n    }\n    sentSpan = true;\n    if (pageloadSpanId) {\n      sendStandaloneClsSpan(standaloneCLsValue, standaloneClsEntry, pageloadSpanId);\n    }\n    cleanupClsHandler();\n  }\n\n  const cleanupClsHandler = addClsInstrumentationHandler(({ metric }) => {\n    const entry = metric.entries[metric.entries.length - 1] as LayoutShift | undefined;\n    if (!entry) {\n      return;\n    }\n    standaloneCLsValue = metric.value;\n    standaloneClsEntry = entry;\n  }, true);\n\n  // use pagehide event from web-vitals\n  onHidden(() => {\n    _collectClsOnce();\n  });\n\n  // Since the call chain of this function is synchronous and evaluates before the SDK client is created,\n  // we need to wait with subscribing to a client hook until the client is created. Therefore, we defer\n  // to the next tick after the SDK setup.\n  setTimeout(() => {\n    const client = getClient();\n\n    if (!client) {\n      return;\n    }\n\n    const unsubscribeStartNavigation = client.on('startNavigationSpan', () => {\n      _collectClsOnce();\n      unsubscribeStartNavigation && unsubscribeStartNavigation();\n    });\n\n    const activeSpan = getActiveSpan();\n    const rootSpan = activeSpan && getRootSpan(activeSpan);\n    const spanJSON = rootSpan && spanToJSON(rootSpan);\n    if (spanJSON && spanJSON.op === 'pageload') {\n      pageloadSpanId = rootSpan.spanContext().spanId;\n    }\n  }, 0);\n}\n\nfunction sendStandaloneClsSpan(clsValue: number, entry: LayoutShift | undefined, pageloadSpanId: string) {\n  DEBUG_BUILD && logger.log(`Sending CLS span (${clsValue})`);\n\n  const startTime = msToSec((browserPerformanceTimeOrigin || 0) + ((entry && entry.startTime) || 0));\n  const routeName = getCurrentScope().getScopeData().transactionName;\n\n  const name = entry ? htmlTreeAsString(entry.sources[0] && entry.sources[0].node) : 'Layout shift';\n\n  const attributes: SpanAttributes = dropUndefinedKeys({\n    [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.browser.cls',\n    [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'ui.webvital.cls',\n    [SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME]: (entry && entry.duration) || 0,\n    // attach the pageload span id to the CLS span so that we can link them in the UI\n    'sentry.pageload.span_id': pageloadSpanId,\n  });\n\n  const span = startStandaloneWebVitalSpan({\n    name,\n    transaction: routeName,\n    attributes,\n    startTime,\n  });\n\n  if (span) {\n    span.addEvent('cls', {\n      [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT]: '',\n      [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE]: clsValue,\n    });\n\n    // LayoutShift performance entries always have a duration of 0, so we don't need to add `entry.duration` here\n    // see: https://developer.mozilla.org/en-US/docs/Web/API/PerformanceEntry/duration\n    span.end(startTime);\n  }\n}\n\nfunction supportsLayoutShift(): boolean {\n  try {\n    return PerformanceObserver.supportedEntryTypes.includes('layout-shift');\n  } catch {\n    return false;\n  }\n}\n","import type { Span, SpanAttributes } from '@sentry/core';\nimport {\n  SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME,\n  SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT,\n  SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE,\n  SEMANTIC_ATTRIBUTE_SENTRY_OP,\n  SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n  browserPerformanceTimeOrigin,\n  dropUndefinedKeys,\n  getActiveSpan,\n  getCurrentScope,\n  getRootSpan,\n  htmlTreeAsString,\n  spanToJSON,\n} from '@sentry/core';\nimport {\n  addInpInstrumentationHandler,\n  addPerformanceInstrumentationHandler,\n  isPerformanceEventTiming,\n} from './instrument';\nimport { getBrowserPerformanceAPI, msToSec, startStandaloneWebVitalSpan } from './utils';\n\nconst LAST_INTERACTIONS: number[] = [];\nconst INTERACTIONS_SPAN_MAP = new Map<number, Span>();\n\n/**\n * Start tracking INP webvital events.\n */\nexport function startTrackingINP(): () => void {\n  const performance = getBrowserPerformanceAPI();\n  if (performance && browserPerformanceTimeOrigin) {\n    const inpCallback = _trackINP();\n\n    return (): void => {\n      inpCallback();\n    };\n  }\n\n  return () => undefined;\n}\n\nconst INP_ENTRY_MAP: Record<string, 'click' | 'hover' | 'drag' | 'press'> = {\n  click: 'click',\n  pointerdown: 'click',\n  pointerup: 'click',\n  mousedown: 'click',\n  mouseup: 'click',\n  touchstart: 'click',\n  touchend: 'click',\n  mouseover: 'hover',\n  mouseout: 'hover',\n  mouseenter: 'hover',\n  mouseleave: 'hover',\n  pointerover: 'hover',\n  pointerout: 'hover',\n  pointerenter: 'hover',\n  pointerleave: 'hover',\n  dragstart: 'drag',\n  dragend: 'drag',\n  drag: 'drag',\n  dragenter: 'drag',\n  dragleave: 'drag',\n  dragover: 'drag',\n  drop: 'drag',\n  keydown: 'press',\n  keyup: 'press',\n  keypress: 'press',\n  input: 'press',\n};\n\n/** Starts tracking the Interaction to Next Paint on the current page. */\nfunction _trackINP(): () => void {\n  return addInpInstrumentationHandler(({ metric }) => {\n    if (metric.value == undefined) {\n      return;\n    }\n\n    const entry = metric.entries.find(entry => entry.duration === metric.value && INP_ENTRY_MAP[entry.name]);\n\n    if (!entry) {\n      return;\n    }\n\n    const { interactionId } = entry;\n    const interactionType = INP_ENTRY_MAP[entry.name];\n\n    /** Build the INP span, create an envelope from the span, and then send the envelope */\n    const startTime = msToSec((browserPerformanceTimeOrigin as number) + entry.startTime);\n    const duration = msToSec(metric.value);\n    const activeSpan = getActiveSpan();\n    const rootSpan = activeSpan ? getRootSpan(activeSpan) : undefined;\n\n    // We first try to lookup the span from our INTERACTIONS_SPAN_MAP,\n    // where we cache the route per interactionId\n    const cachedSpan = interactionId != null ? INTERACTIONS_SPAN_MAP.get(interactionId) : undefined;\n\n    const spanToUse = cachedSpan || rootSpan;\n\n    // Else, we try to use the active span.\n    // Finally, we fall back to look at the transactionName on the scope\n    const routeName = spanToUse ? spanToJSON(spanToUse).description : getCurrentScope().getScopeData().transactionName;\n\n    const name = htmlTreeAsString(entry.target);\n    const attributes: SpanAttributes = dropUndefinedKeys({\n      [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.browser.inp',\n      [SEMANTIC_ATTRIBUTE_SENTRY_OP]: `ui.interaction.${interactionType}`,\n      [SEMANTIC_ATTRIBUTE_EXCLUSIVE_TIME]: entry.duration,\n    });\n\n    const span = startStandaloneWebVitalSpan({\n      name,\n      transaction: routeName,\n      attributes,\n      startTime,\n    });\n\n    if (span) {\n      span.addEvent('inp', {\n        [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_UNIT]: 'millisecond',\n        [SEMANTIC_ATTRIBUTE_SENTRY_MEASUREMENT_VALUE]: metric.value,\n      });\n\n      span.end(startTime + duration);\n    }\n  });\n}\n\n/**\n * Register a listener to cache route information for INP interactions.\n * TODO(v9): `latestRoute` no longer needs to be passed in and will be removed in v9.\n */\nexport function registerInpInteractionListener(_latestRoute?: unknown): void {\n  const handleEntries = ({ entries }: { entries: PerformanceEntry[] }): void => {\n    const activeSpan = getActiveSpan();\n    const activeRootSpan = activeSpan && getRootSpan(activeSpan);\n\n    entries.forEach(entry => {\n      if (!isPerformanceEventTiming(entry) || !activeRootSpan) {\n        return;\n      }\n\n      const interactionId = entry.interactionId;\n      if (interactionId == null) {\n        return;\n      }\n\n      // If the interaction was already recorded before, nothing more to do\n      if (INTERACTIONS_SPAN_MAP.has(interactionId)) {\n        return;\n      }\n\n      // We keep max. 10 interactions in the list, then remove the oldest one & clean up\n      if (LAST_INTERACTIONS.length > 10) {\n        const last = LAST_INTERACTIONS.shift() as number;\n        INTERACTIONS_SPAN_MAP.delete(last);\n      }\n\n      // We add the interaction to the list of recorded interactions\n      // and store the span for this interaction\n      LAST_INTERACTIONS.push(interactionId);\n      INTERACTIONS_SPAN_MAP.set(interactionId, activeRootSpan);\n    });\n  };\n\n  addPerformanceInstrumentationHandler('event', handleEntries);\n  addPerformanceInstrumentationHandler('first-input', handleEntries);\n}\n","import { getFunctionName, logger } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { onCLS } from './web-vitals/getCLS';\nimport { onFID } from './web-vitals/getFID';\nimport { onINP } from './web-vitals/getINP';\nimport { onLCP } from './web-vitals/getLCP';\nimport { observe } from './web-vitals/lib/observe';\nimport { onTTFB } from './web-vitals/onTTFB';\n\ntype InstrumentHandlerTypePerformanceObserver =\n  | 'longtask'\n  | 'event'\n  | 'navigation'\n  | 'paint'\n  | 'resource'\n  | 'first-input';\n\ntype InstrumentHandlerTypeMetric = 'cls' | 'lcp' | 'fid' | 'ttfb' | 'inp';\n\n// We provide this here manually instead of relying on a global, as this is not available in non-browser environements\n// And we do not want to expose such types\ninterface PerformanceEntry {\n  readonly duration: number;\n  readonly entryType: string;\n  readonly name: string;\n  readonly startTime: number;\n  toJSON(): Record<string, unknown>;\n}\ninterface PerformanceEventTiming extends PerformanceEntry {\n  processingStart: number;\n  processingEnd: number;\n  duration: number;\n  cancelable?: boolean;\n  target?: unknown | null;\n  interactionId?: number;\n}\n\ninterface PerformanceScriptTiming extends PerformanceEntry {\n  sourceURL: string;\n  sourceFunctionName: string;\n  sourceCharPosition: number;\n  invoker: string;\n  invokerType: string;\n}\nexport interface PerformanceLongAnimationFrameTiming extends PerformanceEntry {\n  scripts: PerformanceScriptTiming[];\n}\n\ninterface Metric {\n  /**\n   * The name of the metric (in acronym form).\n   */\n  name: 'CLS' | 'FCP' | 'FID' | 'INP' | 'LCP' | 'TTFB';\n\n  /**\n   * The current value of the metric.\n   */\n  value: number;\n\n  /**\n   * The rating as to whether the metric value is within the \"good\",\n   * \"needs improvement\", or \"poor\" thresholds of the metric.\n   */\n  rating: 'good' | 'needs-improvement' | 'poor';\n\n  /**\n   * The delta between the current value and the last-reported value.\n   * On the first report, `delta` and `value` will always be the same.\n   */\n  delta: number;\n\n  /**\n   * A unique ID representing this particular metric instance. This ID can\n   * be used by an analytics tool to dedupe multiple values sent for the same\n   * metric instance, or to group multiple deltas together and calculate a\n   * total. It can also be used to differentiate multiple different metric\n   * instances sent from the same page, which can happen if the page is\n   * restored from the back/forward cache (in that case new metrics object\n   * get created).\n   */\n  id: string;\n\n  /**\n   * Any performance entries relevant to the metric value calculation.\n   * The array may also be empty if the metric value was not based on any\n   * entries (e.g. a CLS value of 0 given no layout shifts).\n   */\n  entries: PerformanceEntry[];\n\n  /**\n   * The type of navigation\n   *\n   * Navigation Timing API (or `undefined` if the browser doesn't\n   * support that API). For pages that are restored from the bfcache, this\n   * value will be 'back-forward-cache'.\n   */\n  navigationType: 'navigate' | 'reload' | 'back-forward' | 'back-forward-cache' | 'prerender' | 'restore';\n}\n\ntype InstrumentHandlerType = InstrumentHandlerTypeMetric | InstrumentHandlerTypePerformanceObserver;\n\ntype StopListening = undefined | void | (() => void);\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype InstrumentHandlerCallback = (data: any) => void;\n\ntype CleanupHandlerCallback = () => void;\n\nconst handlers: { [key in InstrumentHandlerType]?: InstrumentHandlerCallback[] } = {};\nconst instrumented: { [key in InstrumentHandlerType]?: boolean } = {};\n\nlet _previousCls: Metric | undefined;\nlet _previousFid: Metric | undefined;\nlet _previousLcp: Metric | undefined;\nlet _previousTtfb: Metric | undefined;\nlet _previousInp: Metric | undefined;\n\n/**\n * Add a callback that will be triggered when a CLS metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n *\n * Pass `stopOnCallback = true` to stop listening for CLS when the cleanup callback is called.\n * This will lead to the CLS being finalized and frozen.\n */\nexport function addClsInstrumentationHandler(\n  callback: (data: { metric: Metric }) => void,\n  stopOnCallback = false,\n): CleanupHandlerCallback {\n  return addMetricObserver('cls', callback, instrumentCls, _previousCls, stopOnCallback);\n}\n\n/**\n * Add a callback that will be triggered when a LCP metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n *\n * Pass `stopOnCallback = true` to stop listening for LCP when the cleanup callback is called.\n * This will lead to the LCP being finalized and frozen.\n */\nexport function addLcpInstrumentationHandler(\n  callback: (data: { metric: Metric }) => void,\n  stopOnCallback = false,\n): CleanupHandlerCallback {\n  return addMetricObserver('lcp', callback, instrumentLcp, _previousLcp, stopOnCallback);\n}\n\n/**\n * Add a callback that will be triggered when a FID metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n */\nexport function addFidInstrumentationHandler(callback: (data: { metric: Metric }) => void): CleanupHandlerCallback {\n  return addMetricObserver('fid', callback, instrumentFid, _previousFid);\n}\n\n/**\n * Add a callback that will be triggered when a FID metric is available.\n */\nexport function addTtfbInstrumentationHandler(callback: (data: { metric: Metric }) => void): CleanupHandlerCallback {\n  return addMetricObserver('ttfb', callback, instrumentTtfb, _previousTtfb);\n}\n\n/**\n * Add a callback that will be triggered when a INP metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n */\nexport function addInpInstrumentationHandler(\n  callback: (data: { metric: Omit<Metric, 'entries'> & { entries: PerformanceEventTiming[] } }) => void,\n): CleanupHandlerCallback {\n  return addMetricObserver('inp', callback, instrumentInp, _previousInp);\n}\n\nexport function addPerformanceInstrumentationHandler(\n  type: 'event',\n  callback: (data: { entries: ((PerformanceEntry & { target?: unknown | null }) | PerformanceEventTiming)[] }) => void,\n): CleanupHandlerCallback;\nexport function addPerformanceInstrumentationHandler(\n  type: InstrumentHandlerTypePerformanceObserver,\n  callback: (data: { entries: PerformanceEntry[] }) => void,\n): CleanupHandlerCallback;\n\n/**\n * Add a callback that will be triggered when a performance observer is triggered,\n * and receives the entries of the observer.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n */\nexport function addPerformanceInstrumentationHandler(\n  type: InstrumentHandlerTypePerformanceObserver,\n  callback: (data: { entries: PerformanceEntry[] }) => void,\n): CleanupHandlerCallback {\n  addHandler(type, callback);\n\n  if (!instrumented[type]) {\n    instrumentPerformanceObserver(type);\n    instrumented[type] = true;\n  }\n\n  return getCleanupCallback(type, callback);\n}\n\n/** Trigger all handlers of a given type. */\nfunction triggerHandlers(type: InstrumentHandlerType, data: unknown): void {\n  const typeHandlers = handlers[type];\n\n  if (!typeHandlers || !typeHandlers.length) {\n    return;\n  }\n\n  for (const handler of typeHandlers) {\n    try {\n      handler(data);\n    } catch (e) {\n      DEBUG_BUILD &&\n        logger.error(\n          `Error while triggering instrumentation handler.\\nType: ${type}\\nName: ${getFunctionName(handler)}\\nError:`,\n          e,\n        );\n    }\n  }\n}\n\nfunction instrumentCls(): StopListening {\n  return onCLS(\n    metric => {\n      triggerHandlers('cls', {\n        metric,\n      });\n      _previousCls = metric;\n    },\n    // We want the callback to be called whenever the CLS value updates.\n    // By default, the callback is only called when the tab goes to the background.\n    { reportAllChanges: true },\n  );\n}\n\nfunction instrumentFid(): void {\n  return onFID(metric => {\n    triggerHandlers('fid', {\n      metric,\n    });\n    _previousFid = metric;\n  });\n}\n\nfunction instrumentLcp(): StopListening {\n  return onLCP(\n    metric => {\n      triggerHandlers('lcp', {\n        metric,\n      });\n      _previousLcp = metric;\n    },\n    // We want the callback to be called whenever the LCP value updates.\n    // By default, the callback is only called when the tab goes to the background.\n    { reportAllChanges: true },\n  );\n}\n\nfunction instrumentTtfb(): StopListening {\n  return onTTFB(metric => {\n    triggerHandlers('ttfb', {\n      metric,\n    });\n    _previousTtfb = metric;\n  });\n}\n\nfunction instrumentInp(): void {\n  return onINP(metric => {\n    triggerHandlers('inp', {\n      metric,\n    });\n    _previousInp = metric;\n  });\n}\n\nfunction addMetricObserver(\n  type: InstrumentHandlerTypeMetric,\n  callback: InstrumentHandlerCallback,\n  instrumentFn: () => StopListening,\n  previousValue: Metric | undefined,\n  stopOnCallback = false,\n): CleanupHandlerCallback {\n  addHandler(type, callback);\n\n  let stopListening: StopListening | undefined;\n\n  if (!instrumented[type]) {\n    stopListening = instrumentFn();\n    instrumented[type] = true;\n  }\n\n  if (previousValue) {\n    callback({ metric: previousValue });\n  }\n\n  return getCleanupCallback(type, callback, stopOnCallback ? stopListening : undefined);\n}\n\nfunction instrumentPerformanceObserver(type: InstrumentHandlerTypePerformanceObserver): void {\n  const options: PerformanceObserverInit = {};\n\n  // Special per-type options we want to use\n  if (type === 'event') {\n    options.durationThreshold = 0;\n  }\n\n  observe(\n    type,\n    entries => {\n      triggerHandlers(type, { entries });\n    },\n    options,\n  );\n}\n\nfunction addHandler(type: InstrumentHandlerType, handler: InstrumentHandlerCallback): void {\n  handlers[type] = handlers[type] || [];\n  (handlers[type] as InstrumentHandlerCallback[]).push(handler);\n}\n\n// Get a callback which can be called to remove the instrumentation handler\nfunction getCleanupCallback(\n  type: InstrumentHandlerType,\n  callback: InstrumentHandlerCallback,\n  stopListening: StopListening,\n): CleanupHandlerCallback {\n  return () => {\n    if (stopListening) {\n      stopListening();\n    }\n\n    const typeHandlers = handlers[type];\n\n    if (!typeHandlers) {\n      return;\n    }\n\n    const index = typeHandlers.indexOf(callback);\n    if (index !== -1) {\n      typeHandlers.splice(index, 1);\n    }\n  };\n}\n\n/**\n * Check if a PerformanceEntry is a PerformanceEventTiming by checking for the `duration` property.\n */\nexport function isPerformanceEventTiming(entry: PerformanceEntry): entry is PerformanceEventTiming {\n  return 'duration' in entry;\n}\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { bindReporter } from './lib/bindReporter';\nimport { initMetric } from './lib/initMetric';\nimport { observe } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nimport { runOnce } from './lib/runOnce';\nimport { onFCP } from './onFCP';\nimport type { CLSMetric, MetricRatingThresholds, ReportOpts } from './types';\n\n/** Thresholds for CLS. See https://web.dev/articles/cls#what_is_a_good_cls_score */\nexport const CLSThresholds: MetricRatingThresholds = [0.1, 0.25];\n\n/**\n * Calculates the [CLS](https://web.dev/articles/cls) value for the current page and\n * calls the `callback` function once the value is ready to be reported, along\n * with all `layout-shift` performance entries that were used in the metric\n * value calculation. The reported value is a `double` (corresponding to a\n * [layout shift score](https://web.dev/articles/cls#layout_shift_score)).\n *\n * If the `reportAllChanges` configuration option is set to `true`, the\n * `callback` function will be called as soon as the value is initially\n * determined as well as any time the value changes throughout the page\n * lifespan.\n *\n * _**Important:** CLS should be continually monitored for changes throughout\n * the entire lifespan of a page—including if the user returns to the page after\n * it's been hidden/backgrounded. However, since browsers often [will not fire\n * additional callbacks once the user has backgrounded a\n * page](https://developer.chrome.com/blog/page-lifecycle-api/#advice-hidden),\n * `callback` is always called when the page's visibility state changes to\n * hidden. As a result, the `callback` function might be called multiple times\n * during the same page load._\n */\nexport const onCLS = (onReport: (metric: CLSMetric) => void, opts: ReportOpts = {}) => {\n  // Start monitoring FCP so we can only report CLS if FCP is also reported.\n  // Note: this is done to match the current behavior of CrUX.\n  onFCP(\n    runOnce(() => {\n      const metric = initMetric('CLS', 0);\n      let report: ReturnType<typeof bindReporter>;\n\n      let sessionValue = 0;\n      let sessionEntries: LayoutShift[] = [];\n\n      const handleEntries = (entries: LayoutShift[]) => {\n        entries.forEach(entry => {\n          // Only count layout shifts without recent user input.\n          if (!entry.hadRecentInput) {\n            const firstSessionEntry = sessionEntries[0];\n            const lastSessionEntry = sessionEntries[sessionEntries.length - 1];\n\n            // If the entry occurred less than 1 second after the previous entry\n            // and less than 5 seconds after the first entry in the session,\n            // include the entry in the current session. Otherwise, start a new\n            // session.\n            if (\n              sessionValue &&\n              firstSessionEntry &&\n              lastSessionEntry &&\n              entry.startTime - lastSessionEntry.startTime < 1000 &&\n              entry.startTime - firstSessionEntry.startTime < 5000\n            ) {\n              sessionValue += entry.value;\n              sessionEntries.push(entry);\n            } else {\n              sessionValue = entry.value;\n              sessionEntries = [entry];\n            }\n          }\n        });\n\n        // If the current session value is larger than the current CLS value,\n        // update CLS and the entries contributing to it.\n        if (sessionValue > metric.value) {\n          metric.value = sessionValue;\n          metric.entries = sessionEntries;\n          report();\n        }\n      };\n\n      const po = observe('layout-shift', handleEntries);\n      if (po) {\n        report = bindReporter(onReport, metric, CLSThresholds, opts.reportAllChanges);\n\n        onHidden(() => {\n          handleEntries(po.takeRecords() as CLSMetric['entries']);\n          report(true);\n        });\n\n        // Queue a task to report (if nothing else triggers a report first).\n        // This allows CLS to be reported as soon as FCP fires when\n        // `reportAllChanges` is true.\n        setTimeout(report, 0);\n      }\n    }),\n  );\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { bindReporter } from './lib/bindReporter';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher';\nimport { initMetric } from './lib/initMetric';\nimport { observe } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nimport { runOnce } from './lib/runOnce';\nimport { whenActivated } from './lib/whenActivated';\nimport type { FIDMetric, MetricRatingThresholds, ReportOpts } from './types';\n\n/** Thresholds for FID. See https://web.dev/articles/fid#what_is_a_good_fid_score */\nexport const FIDThresholds: MetricRatingThresholds = [100, 300];\n\n/**\n * Calculates the [FID](https://web.dev/articles/fid) value for the current page and\n * calls the `callback` function once the value is ready, along with the\n * relevant `first-input` performance entry used to determine the value. The\n * reported value is a `DOMHighResTimeStamp`.\n *\n * _**Important:** since FID is only reported after the user interacts with the\n * page, it's possible that it will not be reported for some page loads._\n */\nexport const onFID = (onReport: (metric: FIDMetric) => void, opts: ReportOpts = {}) => {\n  whenActivated(() => {\n    const visibilityWatcher = getVisibilityWatcher();\n    const metric = initMetric('FID');\n    // eslint-disable-next-line prefer-const\n    let report: ReturnType<typeof bindReporter>;\n\n    const handleEntry = (entry: PerformanceEventTiming): void => {\n      // Only report if the page wasn't hidden prior to the first input.\n      if (entry.startTime < visibilityWatcher.firstHiddenTime) {\n        metric.value = entry.processingStart - entry.startTime;\n        metric.entries.push(entry);\n        report(true);\n      }\n    };\n\n    const handleEntries = (entries: FIDMetric['entries']) => {\n      (entries as PerformanceEventTiming[]).forEach(handleEntry);\n    };\n\n    const po = observe('first-input', handleEntries);\n\n    report = bindReporter(onReport, metric, FIDThresholds, opts.reportAllChanges);\n\n    if (po) {\n      onHidden(\n        runOnce(() => {\n          handleEntries(po.takeRecords() as FIDMetric['entries']);\n          po.disconnect();\n        }),\n      );\n    }\n  });\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../types';\nimport { bindReporter } from './lib/bindReporter';\nimport { initMetric } from './lib/initMetric';\nimport { DEFAULT_DURATION_THRESHOLD, estimateP98LongestInteraction, processInteractionEntry } from './lib/interactions';\nimport { observe } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nimport { initInteractionCountPolyfill } from './lib/polyfills/interactionCountPolyfill';\nimport { whenActivated } from './lib/whenActivated';\nimport { whenIdle } from './lib/whenIdle';\n\nimport type { INPMetric, MetricRatingThresholds, ReportOpts } from './types';\n\n/** Thresholds for INP. See https://web.dev/articles/inp#what_is_a_good_inp_score */\nexport const INPThresholds: MetricRatingThresholds = [200, 500];\n\n/**\n * Calculates the [INP](https://web.dev/articles/inp) value for the current\n * page and calls the `callback` function once the value is ready, along with\n * the `event` performance entries reported for that interaction. The reported\n * value is a `DOMHighResTimeStamp`.\n *\n * A custom `durationThreshold` configuration option can optionally be passed to\n * control what `event-timing` entries are considered for INP reporting. The\n * default threshold is `40`, which means INP scores of less than 40 are\n * reported as 0. Note that this will not affect your 75th percentile INP value\n * unless that value is also less than 40 (well below the recommended\n * [good](https://web.dev/articles/inp#what_is_a_good_inp_score) threshold).\n *\n * If the `reportAllChanges` configuration option is set to `true`, the\n * `callback` function will be called as soon as the value is initially\n * determined as well as any time the value changes throughout the page\n * lifespan.\n *\n * _**Important:** INP should be continually monitored for changes throughout\n * the entire lifespan of a page—including if the user returns to the page after\n * it's been hidden/backgrounded. However, since browsers often [will not fire\n * additional callbacks once the user has backgrounded a\n * page](https://developer.chrome.com/blog/page-lifecycle-api/#advice-hidden),\n * `callback` is always called when the page's visibility state changes to\n * hidden. As a result, the `callback` function might be called multiple times\n * during the same page load._\n */\nexport const onINP = (onReport: (metric: INPMetric) => void, opts: ReportOpts = {}) => {\n  // Return if the browser doesn't support all APIs needed to measure INP.\n  if (!('PerformanceEventTiming' in WINDOW && 'interactionId' in PerformanceEventTiming.prototype)) {\n    return;\n  }\n\n  whenActivated(() => {\n    // TODO(philipwalton): remove once the polyfill is no longer needed.\n    initInteractionCountPolyfill();\n\n    const metric = initMetric('INP');\n    // eslint-disable-next-line prefer-const\n    let report: ReturnType<typeof bindReporter>;\n\n    const handleEntries = (entries: INPMetric['entries']) => {\n      // Queue the `handleEntries()` callback in the next idle task.\n      // This is needed to increase the chances that all event entries that\n      // occurred between the user interaction and the next paint\n      // have been dispatched. Note: there is currently an experiment\n      // running in Chrome (EventTimingKeypressAndCompositionInteractionId)\n      // 123+ that if rolled out fully may make this no longer necessary.\n      whenIdle(() => {\n        entries.forEach(processInteractionEntry);\n\n        const inp = estimateP98LongestInteraction();\n\n        if (inp && inp.latency !== metric.value) {\n          metric.value = inp.latency;\n          metric.entries = inp.entries;\n          report();\n        }\n      });\n    };\n\n    const po = observe('event', handleEntries, {\n      // Event Timing entries have their durations rounded to the nearest 8ms,\n      // so a duration of 40ms would be any event that spans 2.5 or more frames\n      // at 60Hz. This threshold is chosen to strike a balance between usefulness\n      // and performance. Running this callback for any interaction that spans\n      // just one or two frames is likely not worth the insight that could be\n      // gained.\n      durationThreshold: opts.durationThreshold != null ? opts.durationThreshold : DEFAULT_DURATION_THRESHOLD,\n    });\n\n    report = bindReporter(onReport, metric, INPThresholds, opts.reportAllChanges);\n\n    if (po) {\n      // Also observe entries of type `first-input`. This is useful in cases\n      // where the first interaction is less than the `durationThreshold`.\n      po.observe({ type: 'first-input', buffered: true });\n\n      onHidden(() => {\n        handleEntries(po.takeRecords() as INPMetric['entries']);\n        report(true);\n      });\n    }\n  });\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../types';\nimport { bindReporter } from './lib/bindReporter';\nimport { getActivationStart } from './lib/getActivationStart';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher';\nimport { initMetric } from './lib/initMetric';\nimport { observe } from './lib/observe';\nimport { onHidden } from './lib/onHidden';\nimport { runOnce } from './lib/runOnce';\nimport { whenActivated } from './lib/whenActivated';\nimport { whenIdle } from './lib/whenIdle';\nimport type { LCPMetric, MetricRatingThresholds, ReportOpts } from './types';\n\n/** Thresholds for LCP. See https://web.dev/articles/lcp#what_is_a_good_lcp_score */\nexport const LCPThresholds: MetricRatingThresholds = [2500, 4000];\n\nconst reportedMetricIDs: Record<string, boolean> = {};\n\n/**\n * Calculates the [LCP](https://web.dev/articles/lcp) value for the current page and\n * calls the `callback` function once the value is ready (along with the\n * relevant `largest-contentful-paint` performance entry used to determine the\n * value). The reported value is a `DOMHighResTimeStamp`.\n *\n * If the `reportAllChanges` configuration option is set to `true`, the\n * `callback` function will be called any time a new `largest-contentful-paint`\n * performance entry is dispatched, or once the final value of the metric has\n * been determined.\n */\nexport const onLCP = (onReport: (metric: LCPMetric) => void, opts: ReportOpts = {}) => {\n  whenActivated(() => {\n    const visibilityWatcher = getVisibilityWatcher();\n    const metric = initMetric('LCP');\n    let report: ReturnType<typeof bindReporter>;\n\n    const handleEntries = (entries: LCPMetric['entries']) => {\n      // If reportAllChanges is set then call this function for each entry,\n      // otherwise only consider the last one.\n      if (!opts.reportAllChanges) {\n        // eslint-disable-next-line no-param-reassign\n        entries = entries.slice(-1);\n      }\n\n      entries.forEach(entry => {\n        // Only report if the page wasn't hidden prior to LCP.\n        if (entry.startTime < visibilityWatcher.firstHiddenTime) {\n          // The startTime attribute returns the value of the renderTime if it is\n          // not 0, and the value of the loadTime otherwise. The activationStart\n          // reference is used because LCP should be relative to page activation\n          // rather than navigation start if the page was pre-rendered. But in cases\n          // where `activationStart` occurs after the LCP, this time should be\n          // clamped at 0.\n          metric.value = Math.max(entry.startTime - getActivationStart(), 0);\n          metric.entries = [entry];\n          report();\n        }\n      });\n    };\n\n    const po = observe('largest-contentful-paint', handleEntries);\n\n    if (po) {\n      report = bindReporter(onReport, metric, LCPThresholds, opts.reportAllChanges);\n\n      const stopListening = runOnce(() => {\n        if (!reportedMetricIDs[metric.id]) {\n          handleEntries(po.takeRecords() as LCPMetric['entries']);\n          po.disconnect();\n          reportedMetricIDs[metric.id] = true;\n          report(true);\n        }\n      });\n\n      // Stop listening after input. Note: while scrolling is an input that\n      // stops LCP observation, it's unreliable since it can be programmatically\n      // generated. See: https://github.com/GoogleChrome/web-vitals/issues/75\n      ['keydown', 'click'].forEach(type => {\n        // Wrap in a setTimeout so the callback is run in a separate task\n        // to avoid extending the keyboard/click handler to reduce INP impact\n        // https://github.com/GoogleChrome/web-vitals/issues/383\n        if (WINDOW.document) {\n          addEventListener(type, () => whenIdle(stopListening as () => void), {\n            once: true,\n            capture: true,\n          });\n        }\n      });\n\n      onHidden(stopListening);\n    }\n  });\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { MetricRatingThresholds, MetricType } from '../types';\n\nconst getRating = (value: number, thresholds: MetricRatingThresholds): MetricType['rating'] => {\n  if (value > thresholds[1]) {\n    return 'poor';\n  }\n  if (value > thresholds[0]) {\n    return 'needs-improvement';\n  }\n  return 'good';\n};\n\nexport const bindReporter = <MetricName extends MetricType['name']>(\n  callback: (metric: Extract<MetricType, { name: MetricName }>) => void,\n  metric: Extract<MetricType, { name: MetricName }>,\n  thresholds: MetricRatingThresholds,\n  reportAllChanges?: boolean,\n) => {\n  let prevValue: number;\n  let delta: number;\n  return (forceReport?: boolean) => {\n    if (metric.value >= 0) {\n      if (forceReport || reportAllChanges) {\n        delta = metric.value - (prevValue || 0);\n\n        // Report the metric if there's a non-zero delta or if no previous\n        // value exists (which can happen in the case of the document becoming\n        // hidden when the metric value is 0).\n        // See: https://github.com/GoogleChrome/web-vitals/issues/14\n        if (delta || prevValue === undefined) {\n          prevValue = metric.value;\n          metric.delta = delta;\n          metric.rating = getRating(metric.value, thresholds);\n          callback(metric);\n        }\n      }\n    }\n  };\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Performantly generate a unique, 30-char string by combining a version\n * number, the current timestamp with a 13-digit number integer.\n * @return {string}\n */\nexport const generateUniqueID = () => {\n  return `v4-${Date.now()}-${Math.floor(Math.random() * (9e12 - 1)) + 1e12}`;\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getNavigationEntry } from './getNavigationEntry';\n\nexport const getActivationStart = (): number => {\n  const navEntry = getNavigationEntry();\n  return (navEntry && navEntry.activationStart) || 0;\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../../types';\n\n// sentry-specific change:\n// add optional param to not check for responseStart (see comment below)\nexport const getNavigationEntry = (checkResponseStart = true): PerformanceNavigationTiming | void => {\n  const navigationEntry =\n    WINDOW.performance && WINDOW.performance.getEntriesByType && WINDOW.performance.getEntriesByType('navigation')[0];\n  // Check to ensure the `responseStart` property is present and valid.\n  // In some cases no value is reported by the browser (for\n  // privacy/security reasons), and in other cases (bugs) the value is\n  // negative or is larger than the current page time. Ignore these cases:\n  // https://github.com/GoogleChrome/web-vitals/issues/137\n  // https://github.com/GoogleChrome/web-vitals/issues/162\n  // https://github.com/GoogleChrome/web-vitals/issues/275\n  if (\n    // sentry-specific change:\n    // We don't want to check for responseStart for our own use of `getNavigationEntry`\n    !checkResponseStart ||\n    (navigationEntry && navigationEntry.responseStart > 0 && navigationEntry.responseStart < performance.now())\n  ) {\n    return navigationEntry;\n  }\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../../types';\n\nlet firstHiddenTime = -1;\n\nconst initHiddenTime = () => {\n  // If the document is hidden when this code runs, assume it was always\n  // hidden and the page was loaded in the background, with the one exception\n  // that visibility state is always 'hidden' during prerendering, so we have\n  // to ignore that case until prerendering finishes (see: `prerenderingchange`\n  // event logic below).\n  return WINDOW.document!.visibilityState === 'hidden' && !WINDOW.document!.prerendering ? 0 : Infinity;\n};\n\nconst onVisibilityUpdate = (event: Event) => {\n  // If the document is 'hidden' and no previous hidden timestamp has been\n  // set, update it based on the current event data.\n  if (WINDOW.document!.visibilityState === 'hidden' && firstHiddenTime > -1) {\n    // If the event is a 'visibilitychange' event, it means the page was\n    // visible prior to this change, so the event timestamp is the first\n    // hidden time.\n    // However, if the event is not a 'visibilitychange' event, then it must\n    // be a 'prerenderingchange' event, and the fact that the document is\n    // still 'hidden' from the above check means the tab was activated\n    // in a background state and so has always been hidden.\n    firstHiddenTime = event.type === 'visibilitychange' ? event.timeStamp : 0;\n\n    // Remove all listeners now that a `firstHiddenTime` value has been set.\n    removeChangeListeners();\n  }\n};\n\nconst addChangeListeners = () => {\n  addEventListener('visibilitychange', onVisibilityUpdate, true);\n  // IMPORTANT: when a page is prerendering, its `visibilityState` is\n  // 'hidden', so in order to account for cases where this module checks for\n  // visibility during prerendering, an additional check after prerendering\n  // completes is also required.\n  addEventListener('prerenderingchange', onVisibilityUpdate, true);\n};\n\nconst removeChangeListeners = () => {\n  removeEventListener('visibilitychange', onVisibilityUpdate, true);\n  removeEventListener('prerenderingchange', onVisibilityUpdate, true);\n};\n\nexport const getVisibilityWatcher = () => {\n  if (WINDOW.document && firstHiddenTime < 0) {\n    // If the document is hidden when this code runs, assume it was hidden\n    // since navigation start. This isn't a perfect heuristic, but it's the\n    // best we can do until an API is available to support querying past\n    // visibilityState.\n    firstHiddenTime = initHiddenTime();\n    addChangeListeners();\n  }\n  return {\n    get firstHiddenTime() {\n      return firstHiddenTime;\n    },\n  };\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../../types';\nimport type { MetricType } from '../types';\nimport { generateUniqueID } from './generateUniqueID';\nimport { getActivationStart } from './getActivationStart';\nimport { getNavigationEntry } from './getNavigationEntry';\n\nexport const initMetric = <MetricName extends MetricType['name']>(name: MetricName, value?: number) => {\n  const navEntry = getNavigationEntry();\n  let navigationType: MetricType['navigationType'] = 'navigate';\n\n  if (navEntry) {\n    if ((WINDOW.document && WINDOW.document.prerendering) || getActivationStart() > 0) {\n      navigationType = 'prerender';\n    } else if (WINDOW.document && WINDOW.document.wasDiscarded) {\n      navigationType = 'restore';\n    } else if (navEntry.type) {\n      navigationType = navEntry.type.replace(/_/g, '-') as MetricType['navigationType'];\n    }\n  }\n\n  // Use `entries` type specific for the metric.\n  const entries: Extract<MetricType, { name: MetricName }>['entries'] = [];\n\n  return {\n    name,\n    value: typeof value === 'undefined' ? -1 : value,\n    rating: 'good' as const, // If needed, will be updated when reported. `const` to keep the type from widening to `string`.\n    delta: 0,\n    entries,\n    id: generateUniqueID(),\n    navigationType,\n  };\n};\n","/*\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getInteractionCount } from './polyfills/interactionCountPolyfill';\n\ninterface Interaction {\n  id: number;\n  latency: number;\n  entries: PerformanceEventTiming[];\n}\n\ninterface EntryPreProcessingHook {\n  (entry: PerformanceEventTiming): void;\n}\n\n// A list of longest interactions on the page (by latency) sorted so the\n// longest one is first. The list is at most MAX_INTERACTIONS_TO_CONSIDER long.\nexport const longestInteractionList: Interaction[] = [];\n\n// A mapping of longest interactions by their interaction ID.\n// This is used for faster lookup.\nexport const longestInteractionMap: Map<number, Interaction> = new Map();\n\n// The default `durationThreshold` used across this library for observing\n// `event` entries via PerformanceObserver.\nexport const DEFAULT_DURATION_THRESHOLD = 40;\n\n// Used to store the interaction count after a bfcache restore, since p98\n// interaction latencies should only consider the current navigation.\nlet prevInteractionCount = 0;\n\n/**\n * Returns the interaction count since the last bfcache restore (or for the\n * full page lifecycle if there were no bfcache restores).\n */\nconst getInteractionCountForNavigation = () => {\n  return getInteractionCount() - prevInteractionCount;\n};\n\nexport const resetInteractions = () => {\n  prevInteractionCount = getInteractionCount();\n  longestInteractionList.length = 0;\n  longestInteractionMap.clear();\n};\n\n/**\n * Returns the estimated p98 longest interaction based on the stored\n * interaction candidates and the interaction count for the current page.\n */\nexport const estimateP98LongestInteraction = () => {\n  const candidateInteractionIndex = Math.min(\n    longestInteractionList.length - 1,\n    Math.floor(getInteractionCountForNavigation() / 50),\n  );\n\n  return longestInteractionList[candidateInteractionIndex];\n};\n\n// To prevent unnecessary memory usage on pages with lots of interactions,\n// store at most 10 of the longest interactions to consider as INP candidates.\nconst MAX_INTERACTIONS_TO_CONSIDER = 10;\n\n/**\n * A list of callback functions to run before each entry is processed.\n * Exposing this list allows the attribution build to hook into the\n * entry processing pipeline.\n */\nexport const entryPreProcessingCallbacks: EntryPreProcessingHook[] = [];\n\n/**\n * Takes a performance entry and adds it to the list of worst interactions\n * if its duration is long enough to make it among the worst. If the\n * entry is part of an existing interaction, it is merged and the latency\n * and entries list is updated as needed.\n */\nexport const processInteractionEntry = (entry: PerformanceEventTiming) => {\n  entryPreProcessingCallbacks.forEach(cb => cb(entry));\n\n  // Skip further processing for entries that cannot be INP candidates.\n  if (!(entry.interactionId || entry.entryType === 'first-input')) return;\n\n  // The least-long of the 10 longest interactions.\n  const minLongestInteraction = longestInteractionList[longestInteractionList.length - 1];\n\n  const existingInteraction = longestInteractionMap.get(entry.interactionId!);\n\n  // Only process the entry if it's possibly one of the ten longest,\n  // or if it's part of an existing interaction.\n  if (\n    existingInteraction ||\n    longestInteractionList.length < MAX_INTERACTIONS_TO_CONSIDER ||\n    (minLongestInteraction && entry.duration > minLongestInteraction.latency)\n  ) {\n    // If the interaction already exists, update it. Otherwise create one.\n    if (existingInteraction) {\n      // If the new entry has a longer duration, replace the old entries,\n      // otherwise add to the array.\n      if (entry.duration > existingInteraction.latency) {\n        existingInteraction.entries = [entry];\n        existingInteraction.latency = entry.duration;\n      } else if (\n        entry.duration === existingInteraction.latency &&\n        entry.startTime === (existingInteraction.entries[0] && existingInteraction.entries[0].startTime)\n      ) {\n        existingInteraction.entries.push(entry);\n      }\n    } else {\n      const interaction = {\n        id: entry.interactionId!,\n        latency: entry.duration,\n        entries: [entry],\n      };\n      longestInteractionMap.set(interaction.id, interaction);\n      longestInteractionList.push(interaction);\n    }\n\n    // Sort the entries by latency (descending) and keep only the top ten.\n    longestInteractionList.sort((a, b) => b.latency - a.latency);\n    if (longestInteractionList.length > MAX_INTERACTIONS_TO_CONSIDER) {\n      longestInteractionList.splice(MAX_INTERACTIONS_TO_CONSIDER).forEach(i => longestInteractionMap.delete(i.id));\n    }\n  }\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\ninterface PerformanceEntryMap {\n  event: PerformanceEventTiming[];\n  'first-input': PerformanceEventTiming[];\n  'layout-shift': LayoutShift[];\n  'largest-contentful-paint': LargestContentfulPaint[];\n  'long-animation-frame': PerformanceLongAnimationFrameTiming[];\n  paint: PerformancePaintTiming[];\n  navigation: PerformanceNavigationTiming[];\n  resource: PerformanceResourceTiming[];\n  // Sentry-specific change:\n  // We add longtask as a supported entry type as we use this in\n  // our `instrumentPerformanceObserver` function also observes 'longtask'\n  // entries.\n  longtask: PerformanceEntry[];\n}\n\n/**\n * Takes a performance entry type and a callback function, and creates a\n * `PerformanceObserver` instance that will observe the specified entry type\n * with buffering enabled and call the callback _for each entry_.\n *\n * This function also feature-detects entry support and wraps the logic in a\n * try/catch to avoid errors in unsupporting browsers.\n */\nexport const observe = <K extends keyof PerformanceEntryMap>(\n  type: K,\n  callback: (entries: PerformanceEntryMap[K]) => void,\n  opts?: PerformanceObserverInit,\n): PerformanceObserver | undefined => {\n  try {\n    if (PerformanceObserver.supportedEntryTypes.includes(type)) {\n      const po = new PerformanceObserver(list => {\n        // Delay by a microtask to workaround a bug in Safari where the\n        // callback is invoked immediately, rather than in a separate task.\n        // See: https://github.com/GoogleChrome/web-vitals/issues/277\n        // eslint-disable-next-line @typescript-eslint/no-floating-promises\n        Promise.resolve().then(() => {\n          callback(list.getEntries() as PerformanceEntryMap[K]);\n        });\n      });\n      po.observe(\n        Object.assign(\n          {\n            type,\n            buffered: true,\n          },\n          opts || {},\n        ) as PerformanceObserverInit,\n      );\n      return po;\n    }\n  } catch (e) {\n    // Do nothing.\n  }\n  return;\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../../types';\n\nexport interface OnHiddenCallback {\n  (event: Event): void;\n}\n\n// Sentry-specific change:\n// This function's logic was NOT updated to web-vitals 4.2.4 but we continue\n// to use the web-vitals 3.5.2 due to us having stricter browser support.\n// PR with context that made the changes: https://github.com/GoogleChrome/web-vitals/pull/442/files#r1530492402\n// The PR removed listening to the `pagehide` event, in favour of only listening to `visibilitychange` event.\n// This is \"more correct\" but some browsers we still support (Safari 12.1-14.0) don't fully support `visibilitychange`\n// or have known bugs w.r.t the `visibilitychange` event.\n// TODO (v9): If we decide to drop support for Safari 12.1-14.0, we can use the logic from web-vitals 4.2.4\n// In this case, we also need to update the integration tests that currently trigger the `pagehide` event to\n// simulate the page being hidden.\nexport const onHidden = (cb: OnHiddenCallback) => {\n  const onHiddenOrPageHide = (event: Event) => {\n    if (event.type === 'pagehide' || (WINDOW.document && WINDOW.document.visibilityState === 'hidden')) {\n      cb(event);\n    }\n  };\n\n  if (WINDOW.document) {\n    addEventListener('visibilitychange', onHiddenOrPageHide, true);\n    // Some browsers have buggy implementations of visibilitychange,\n    // so we use pagehide in addition, just to be safe.\n    addEventListener('pagehide', onHiddenOrPageHide, true);\n  }\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { observe } from '../observe';\n\ndeclare global {\n  interface Performance {\n    interactionCount: number;\n  }\n}\n\nlet interactionCountEstimate = 0;\nlet minKnownInteractionId = Infinity;\nlet maxKnownInteractionId = 0;\n\nconst updateEstimate = (entries: PerformanceEventTiming[]) => {\n  entries.forEach(e => {\n    if (e.interactionId) {\n      minKnownInteractionId = Math.min(minKnownInteractionId, e.interactionId);\n      maxKnownInteractionId = Math.max(maxKnownInteractionId, e.interactionId);\n\n      interactionCountEstimate = maxKnownInteractionId ? (maxKnownInteractionId - minKnownInteractionId) / 7 + 1 : 0;\n    }\n  });\n};\n\nlet po: PerformanceObserver | undefined;\n\n/**\n * Returns the `interactionCount` value using the native API (if available)\n * or the polyfill estimate in this module.\n */\nexport const getInteractionCount = (): number => {\n  return po ? interactionCountEstimate : performance.interactionCount || 0;\n};\n\n/**\n * Feature detects native support or initializes the polyfill if needed.\n */\nexport const initInteractionCountPolyfill = (): void => {\n  if ('interactionCount' in performance || po) return;\n\n  po = observe('event', updateEstimate, {\n    type: 'event',\n    buffered: true,\n    durationThreshold: 0,\n  } as PerformanceObserverInit);\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport const runOnce = (cb: () => void) => {\n  let called = false;\n  return () => {\n    if (!called) {\n      cb();\n      called = true;\n    }\n  };\n};\n","/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../../types';\n\nexport const whenActivated = (callback: () => void) => {\n  if (WINDOW.document && WINDOW.document.prerendering) {\n    addEventListener('prerenderingchange', () => callback(), true);\n  } else {\n    callback();\n  }\n};\n","/*\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../../types';\nimport { onHidden } from './onHidden';\nimport { runOnce } from './runOnce';\n\n/**\n * Runs the passed callback during the next idle period, or immediately\n * if the browser's visibility state is (or becomes) hidden.\n */\nexport const whenIdle = (cb: () => void): number => {\n  const rIC = WINDOW.requestIdleCallback || WINDOW.setTimeout;\n\n  let handle = -1;\n  // eslint-disable-next-line no-param-reassign\n  cb = runOnce(cb) as () => void;\n  // If the document is hidden, run the callback immediately, otherwise\n  // race an idle callback with the next `visibilitychange` event.\n  if (WINDOW.document && WINDOW.document.visibilityState === 'hidden') {\n    cb();\n  } else {\n    handle = rIC(cb);\n    onHidden(cb);\n  }\n  return handle;\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { bindReporter } from './lib/bindReporter';\nimport { getActivationStart } from './lib/getActivationStart';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher';\nimport { initMetric } from './lib/initMetric';\nimport { observe } from './lib/observe';\nimport { whenActivated } from './lib/whenActivated';\nimport type { FCPMetric, MetricRatingThresholds, ReportOpts } from './types';\n\n/** Thresholds for FCP. See https://web.dev/articles/fcp#what_is_a_good_fcp_score */\nexport const FCPThresholds: MetricRatingThresholds = [1800, 3000];\n\n/**\n * Calculates the [FCP](https://web.dev/articles/fcp) value for the current page and\n * calls the `callback` function once the value is ready, along with the\n * relevant `paint` performance entry used to determine the value. The reported\n * value is a `DOMHighResTimeStamp`.\n */\nexport const onFCP = (onReport: (metric: FCPMetric) => void, opts: ReportOpts = {}) => {\n  whenActivated(() => {\n    const visibilityWatcher = getVisibilityWatcher();\n    const metric = initMetric('FCP');\n    let report: ReturnType<typeof bindReporter>;\n\n    const handleEntries = (entries: FCPMetric['entries']) => {\n      entries.forEach(entry => {\n        if (entry.name === 'first-contentful-paint') {\n          po!.disconnect();\n\n          // Only report if the page wasn't hidden prior to the first paint.\n          if (entry.startTime < visibilityWatcher.firstHiddenTime) {\n            // The activationStart reference is used because FCP should be\n            // relative to page activation rather than navigation start if the\n            // page was prerendered. But in cases where `activationStart` occurs\n            // after the FCP, this time should be clamped at 0.\n            metric.value = Math.max(entry.startTime - getActivationStart(), 0);\n            metric.entries.push(entry);\n            report(true);\n          }\n        }\n      });\n    };\n\n    const po = observe('paint', handleEntries);\n\n    if (po) {\n      report = bindReporter(onReport, metric, FCPThresholds, opts.reportAllChanges);\n    }\n  });\n};\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { WINDOW } from '../../types';\nimport { bindReporter } from './lib/bindReporter';\nimport { getActivationStart } from './lib/getActivationStart';\nimport { getNavigationEntry } from './lib/getNavigationEntry';\nimport { initMetric } from './lib/initMetric';\nimport { whenActivated } from './lib/whenActivated';\nimport type { MetricRatingThresholds, ReportOpts, TTFBMetric } from './types';\n\n/** Thresholds for TTFB. See https://web.dev/articles/ttfb#what_is_a_good_ttfb_score */\nexport const TTFBThresholds: MetricRatingThresholds = [800, 1800];\n\n/**\n * Runs in the next task after the page is done loading and/or prerendering.\n * @param callback\n */\nconst whenReady = (callback: () => void) => {\n  if (WINDOW.document && WINDOW.document.prerendering) {\n    whenActivated(() => whenReady(callback));\n  } else if (WINDOW.document && WINDOW.document.readyState !== 'complete') {\n    addEventListener('load', () => whenReady(callback), true);\n  } else {\n    // Queue a task so the callback runs after `loadEventEnd`.\n    setTimeout(callback, 0);\n  }\n};\n\n/**\n * Calculates the [TTFB](https://web.dev/articles/ttfb) value for the\n * current page and calls the `callback` function once the page has loaded,\n * along with the relevant `navigation` performance entry used to determine the\n * value. The reported value is a `DOMHighResTimeStamp`.\n *\n * Note, this function waits until after the page is loaded to call `callback`\n * in order to ensure all properties of the `navigation` entry are populated.\n * This is useful if you want to report on other metrics exposed by the\n * [Navigation Timing API](https://w3c.github.io/navigation-timing/). For\n * example, the TTFB metric starts from the page's [time\n * origin](https://www.w3.org/TR/hr-time-2/#sec-time-origin), which means it\n * includes time spent on DNS lookup, connection negotiation, network latency,\n * and server processing time.\n */\nexport const onTTFB = (onReport: (metric: TTFBMetric) => void, opts: ReportOpts = {}) => {\n  const metric = initMetric('TTFB');\n  const report = bindReporter(onReport, metric, TTFBThresholds, opts.reportAllChanges);\n\n  whenReady(() => {\n    const navigationEntry = getNavigationEntry();\n\n    if (navigationEntry) {\n      // The activationStart reference is used because TTFB should be\n      // relative to page activation rather than navigation start if the\n      // page was prerendered. But in cases where `activationStart` occurs\n      // after the first byte is received, this time should be clamped at 0.\n      metric.value = Math.max(navigationEntry.responseStart - getActivationStart(), 0);\n\n      metric.entries = [navigationEntry];\n      report(true);\n    }\n  });\n};\n","import { GLOBAL_OBJ } from '@sentry/core';\n\nexport const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ &\n  // document is not available in all browser environments (webworkers). We make it optional so you have to explicitly check for it\n  Omit<Window, 'document'> &\n  Partial<Pick<Window, 'document'>>;\n","import { GLOBAL_OBJ } from '@sentry/core';\n\n// exporting a separate copy of `WINDOW` rather than exporting the one from `@sentry/browser`\n// prevents the browser package from being bundled in the CDN bundle, and avoids a\n// circular dependency between the browser and feedback packages\nexport const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\nexport const DOCUMENT = WINDOW.document;\nexport const NAVIGATOR = WINDOW.navigator;\n\nexport const TRIGGER_LABEL = 'Report a Bug';\nexport const CANCEL_BUTTON_LABEL = 'Cancel';\nexport const SUBMIT_BUTTON_LABEL = 'Send Bug Report';\nexport const CONFIRM_BUTTON_LABEL = 'Confirm';\nexport const FORM_TITLE = 'Report a Bug';\nexport const EMAIL_PLACEHOLDER = 'your.email@example.org';\nexport const EMAIL_LABEL = 'Email';\nexport const MESSAGE_PLACEHOLDER = \"What's the bug? What did you expect?\";\nexport const MESSAGE_LABEL = 'Description';\nexport const NAME_PLACEHOLDER = 'Your Name';\nexport const NAME_LABEL = 'Name';\nexport const SUCCESS_MESSAGE_TEXT = 'Thank you for your report!';\nexport const IS_REQUIRED_LABEL = '(required)';\nexport const ADD_SCREENSHOT_LABEL = 'Add a screenshot';\nexport const REMOVE_SCREENSHOT_LABEL = 'Remove screenshot';\n\nexport const FEEDBACK_WIDGET_SOURCE = 'widget';\nexport const FEEDBACK_API_SOURCE = 'api';\n\nexport const SUCCESS_MESSAGE_TIMEOUT = 5000;\n","import type { Event, EventHint, SendFeedback, SendFeedbackParams, TransportMakeRequestResponse } from '@sentry/core';\nimport { captureFeedback, getClient, getCurrentScope, getLocationHref } from '@sentry/core';\nimport { FEEDBACK_API_SOURCE } from '../constants';\n\n/**\n * Public API to send a Feedback item to Sentry\n */\nexport const sendFeedback: SendFeedback = (\n  params: SendFeedbackParams,\n  hint: EventHint & { includeReplay?: boolean } = { includeReplay: true },\n): Promise<string> => {\n  if (!params.message) {\n    throw new Error('Unable to submit feedback with empty message');\n  }\n\n  // We want to wait for the feedback to be sent (or not)\n  const client = getClient();\n\n  if (!client) {\n    throw new Error('No client setup, cannot send feedback.');\n  }\n\n  if (params.tags && Object.keys(params.tags).length) {\n    getCurrentScope().setTags(params.tags);\n  }\n  const eventId = captureFeedback(\n    {\n      source: FEEDBACK_API_SOURCE,\n      url: getLocationHref(),\n      ...params,\n    },\n    hint,\n  );\n\n  // We want to wait for the feedback to be sent (or not)\n  return new Promise<string>((resolve, reject) => {\n    // After 5s, we want to clear anyhow\n    const timeout = setTimeout(() => reject('Unable to determine if Feedback was correctly sent.'), 5_000);\n\n    const cleanup = client.on('afterSendEvent', (event: Event, response: TransportMakeRequestResponse) => {\n      if (event.event_id !== eventId) {\n        return;\n      }\n\n      clearTimeout(timeout);\n      cleanup();\n\n      // Require valid status codes, otherwise can assume feedback was not sent successfully\n      if (\n        response &&\n        typeof response.statusCode === 'number' &&\n        response.statusCode >= 200 &&\n        response.statusCode < 300\n      ) {\n        return resolve(eventId);\n      }\n\n      if (response && typeof response.statusCode === 'number' && response.statusCode === 0) {\n        return reject(\n          'Unable to send Feedback. This is because of network issues, or because you are using an ad-blocker.',\n        );\n      }\n\n      if (response && typeof response.statusCode === 'number' && response.statusCode === 403) {\n        return reject(\n          'Unable to send Feedback. This could be because this domain is not in your list of allowed domains.',\n        );\n      }\n\n      return reject(\n        'Unable to send Feedback. This could be because of network issues, or because you are using an ad-blocker',\n      );\n    });\n  });\n};\n\n/*\n * For reference, the fully built event looks something like this:\n * {\n *     \"type\": \"feedback\",\n *     \"event_id\": \"d2132d31b39445f1938d7e21b6bf0ec4\",\n *     \"timestamp\": 1597977777.6189718,\n *     \"dist\": \"1.12\",\n *     \"platform\": \"javascript\",\n *     \"environment\": \"production\",\n *     \"release\": 42,\n *     \"tags\": {\"transaction\": \"/organizations/:orgId/performance/:eventSlug/\"},\n *     \"sdk\": {\"name\": \"name\", \"version\": \"version\"},\n *     \"user\": {\n *         \"id\": \"123\",\n *         \"username\": \"user\",\n *         \"email\": \"user@site.com\",\n *         \"ip_address\": \"192.168.11.12\",\n *     },\n *     \"request\": {\n *         \"url\": None,\n *         \"headers\": {\n *             \"user-Agent\": \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.5 Safari/605.1.15\"\n *         },\n *     },\n *     \"contexts\": {\n *         \"feedback\": {\n *             \"message\": \"test message\",\n *             \"contact_email\": \"test@example.com\",\n *             \"type\": \"feedback\",\n *         },\n *         \"trace\": {\n *             \"trace_id\": \"4C79F60C11214EB38604F4AE0781BFB2\",\n *             \"span_id\": \"FA90FDEAD5F74052\",\n *             \"type\": \"trace\",\n *         },\n *         \"replay\": {\n *             \"replay_id\": \"e2d42047b1c5431c8cba85ee2a8ab25d\",\n *         },\n *     },\n *   }\n */\n","declare const __DEBUG_BUILD__: boolean;\n\n/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nexport const DEBUG_BUILD = __DEBUG_BUILD__;\n","import type { FeedbackFormData, FeedbackInternalOptions } from '@sentry/core';\nimport type { OptionalFeedbackConfiguration } from '../core/types';\n\n/**\n * Quick and dirty deep merge for the Feedback integration options\n */\nexport function mergeOptions(\n  defaultOptions: FeedbackInternalOptions,\n  optionOverrides: OptionalFeedbackConfiguration,\n): FeedbackInternalOptions {\n  return {\n    ...defaultOptions,\n    ...optionOverrides,\n    tags: {\n      ...defaultOptions.tags,\n      ...optionOverrides.tags,\n    },\n    onFormOpen: () => {\n      optionOverrides.onFormOpen && optionOverrides.onFormOpen();\n      defaultOptions.onFormOpen && defaultOptions.onFormOpen();\n    },\n    onFormClose: () => {\n      optionOverrides.onFormClose && optionOverrides.onFormClose();\n      defaultOptions.onFormClose && defaultOptions.onFormClose();\n    },\n    onSubmitSuccess: (data: FeedbackFormData) => {\n      optionOverrides.onSubmitSuccess && optionOverrides.onSubmitSuccess(data);\n      defaultOptions.onSubmitSuccess && defaultOptions.onSubmitSuccess(data);\n    },\n    onSubmitError: (error: Error) => {\n      optionOverrides.onSubmitError && optionOverrides.onSubmitError(error);\n      defaultOptions.onSubmitError && defaultOptions.onSubmitError(error);\n    },\n    onFormSubmitted: () => {\n      optionOverrides.onFormSubmitted && optionOverrides.onFormSubmitted();\n      defaultOptions.onFormSubmitted && defaultOptions.onFormSubmitted();\n    },\n    themeDark: {\n      ...defaultOptions.themeDark,\n      ...optionOverrides.themeDark,\n    },\n    themeLight: {\n      ...defaultOptions.themeLight,\n      ...optionOverrides.themeLight,\n    },\n  };\n}\n","/**\n * Helper function to set a dict of attributes on element (w/ specified namespace)\n */\nexport function setAttributesNS<T extends SVGElement>(el: T, attributes: Record<string, string>): T {\n  Object.entries(attributes).forEach(([key, val]) => {\n    el.setAttributeNS(null, key, val);\n  });\n  return el;\n}\n","import type { FeedbackInternalOptions } from '@sentry/core';\nimport { DOCUMENT } from '../constants';\n\nconst PURPLE = 'rgba(88, 74, 192, 1)';\n\ninterface InternalTheme extends NonNullable<FeedbackInternalOptions['themeLight']> {\n  border: string;\n  interactiveFilter: string;\n}\n\nconst DEFAULT_LIGHT: InternalTheme = {\n  foreground: '#2b2233',\n  background: '#ffffff',\n  accentForeground: 'white',\n  accentBackground: PURPLE,\n  successColor: '#268d75',\n  errorColor: '#df3338',\n  border: '1.5px solid rgba(41, 35, 47, 0.13)',\n  boxShadow: '0px 4px 24px 0px rgba(43, 34, 51, 0.12)',\n  outline: '1px auto var(--accent-background)',\n  interactiveFilter: 'brightness(95%)',\n};\nconst DEFAULT_DARK: InternalTheme = {\n  foreground: '#ebe6ef',\n  background: '#29232f',\n  accentForeground: 'white',\n  accentBackground: PURPLE,\n  successColor: '#2da98c',\n  errorColor: '#f55459',\n  border: '1.5px solid rgba(235, 230, 239, 0.15)',\n  boxShadow: '0px 4px 24px 0px rgba(43, 34, 51, 0.12)',\n  outline: '1px auto var(--accent-background)',\n  interactiveFilter: 'brightness(150%)',\n};\n\nfunction getThemedCssVariables(theme: InternalTheme): string {\n  return `\n  --foreground: ${theme.foreground};\n  --background: ${theme.background};\n  --accent-foreground: ${theme.accentForeground};\n  --accent-background: ${theme.accentBackground};\n  --success-color: ${theme.successColor};\n  --error-color: ${theme.errorColor};\n  --border: ${theme.border};\n  --box-shadow: ${theme.boxShadow};\n  --outline: ${theme.outline};\n  --interactive-filter: ${theme.interactiveFilter};\n  `;\n}\n\n/**\n * Creates <style> element for widget actor (button that opens the dialog)\n */\nexport function createMainStyles({\n  colorScheme,\n  themeDark,\n  themeLight,\n  styleNonce,\n}: FeedbackInternalOptions): HTMLStyleElement {\n  const style = DOCUMENT.createElement('style');\n  style.textContent = `\n:host {\n  --font-family: system-ui, 'Helvetica Neue', Arial, sans-serif;\n  --font-size: 14px;\n  --z-index: 100000;\n\n  --page-margin: 16px;\n  --inset: auto 0 0 auto;\n  --actor-inset: var(--inset);\n\n  font-family: var(--font-family);\n  font-size: var(--font-size);\n\n  ${colorScheme !== 'system' ? 'color-scheme: only light;' : ''}\n\n  ${getThemedCssVariables(\n    colorScheme === 'dark' ? { ...DEFAULT_DARK, ...themeDark } : { ...DEFAULT_LIGHT, ...themeLight },\n  )}\n}\n\n${\n  colorScheme === 'system'\n    ? `\n@media (prefers-color-scheme: dark) {\n  :host {\n    ${getThemedCssVariables({ ...DEFAULT_DARK, ...themeDark })}\n  }\n}`\n    : ''\n}\n}\n`;\n\n  if (styleNonce) {\n    style.setAttribute('nonce', styleNonce);\n  }\n\n  return style;\n}\n","var n,l,u,t,i,o,r,f,e,c={},s=[],a=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,h=Array.isArray;function v(n,l){for(var u in l)n[u]=l[u];return n}function p(n){var l=n.parentNode;l&&l.removeChild(n)}function y(l,u,t){var i,o,r,f={};for(r in u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:f[r]=u[r];if(arguments.length>2&&(f.children=arguments.length>3?n.call(arguments,2):t),\"function\"==typeof l&&null!=l.defaultProps)for(r in l.defaultProps)void 0===f[r]&&(f[r]=l.defaultProps[r]);return d(l,f,i,o,null)}function d(n,t,i,o,r){var f={type:n,props:t,key:i,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:null==r?++u:r,__i:-1,__u:0};return null==r&&null!=l.vnode&&l.vnode(f),f}function _(){return{current:null}}function g(n){return n.children}function b(n,l){this.props=n,this.context=l}function m(n,l){if(null==l)return n.__?m(n.__,n.__i+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return\"function\"==typeof n.type?m(n):null}function w(n,u,t){var i,o=n.__v,r=o.__e,f=n.__P;if(f)return(i=v({},o)).__v=o.__v+1,l.vnode&&l.vnode(i),M(f,i,o,n.__n,void 0!==f.ownerSVGElement,32&o.__u?[r]:null,u,null==r?m(o):r,!!(32&o.__u),t),i.__.__k[i.__i]=i,i.__d=void 0,i.__e!=r&&k(i),i}function k(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return k(n)}}function x(n){(!n.__d&&(n.__d=!0)&&i.push(n)&&!C.__r++||o!==l.debounceRendering)&&((o=l.debounceRendering)||r)(C)}function C(){var n,u,t,o=[],r=[];for(i.sort(f);n=i.shift();)n.__d&&(t=i.length,u=w(n,o,r)||u,0===t||i.length>t?(j(o,u,r),r.length=o.length=0,u=void 0,i.sort(f)):u&&l.__c&&l.__c(u,s));u&&j(o,u,r),C.__r=0}function P(n,l,u,t,i,o,r,f,e,a,h){var v,p,y,d,_,g=t&&t.__k||s,b=l.length;for(u.__d=e,S(u,l,g),e=u.__d,v=0;v<b;v++)null!=(y=u.__k[v])&&\"boolean\"!=typeof y&&\"function\"!=typeof y&&(p=-1===y.__i?c:g[y.__i]||c,y.__i=v,M(n,y,p,i,o,r,f,e,a,h),d=y.__e,y.ref&&p.ref!=y.ref&&(p.ref&&N(p.ref,null,y),h.push(y.ref,y.__c||d,y)),null==_&&null!=d&&(_=d),65536&y.__u||p.__k===y.__k?e=$(y,e,n):\"function\"==typeof y.type&&void 0!==y.__d?e=y.__d:d&&(e=d.nextSibling),y.__d=void 0,y.__u&=-196609);u.__d=e,u.__e=_}function S(n,l,u){var t,i,o,r,f,e=l.length,c=u.length,s=c,a=0;for(n.__k=[],t=0;t<e;t++)null!=(i=n.__k[t]=null==(i=l[t])||\"boolean\"==typeof i||\"function\"==typeof i?null:\"string\"==typeof i||\"number\"==typeof i||\"bigint\"==typeof i||i.constructor==String?d(null,i,null,null,i):h(i)?d(g,{children:i},null,null,null):void 0===i.constructor&&i.__b>0?d(i.type,i.props,i.key,i.ref?i.ref:null,i.__v):i)?(i.__=n,i.__b=n.__b+1,f=I(i,u,r=t+a,s),i.__i=f,o=null,-1!==f&&(s--,(o=u[f])&&(o.__u|=131072)),null==o||null===o.__v?(-1==f&&a--,\"function\"!=typeof i.type&&(i.__u|=65536)):f!==r&&(f===r+1?a++:f>r?s>e-r?a+=f-r:a--:a=f<r&&f==r-1?f-r:0,f!==t+a&&(i.__u|=65536))):(o=u[t])&&null==o.key&&o.__e&&(o.__e==n.__d&&(n.__d=m(o)),O(o,o,!1),u[t]=null,s--);if(s)for(t=0;t<c;t++)null!=(o=u[t])&&0==(131072&o.__u)&&(o.__e==n.__d&&(n.__d=m(o)),O(o,o))}function $(n,l,u){var t,i;if(\"function\"==typeof n.type){for(t=n.__k,i=0;t&&i<t.length;i++)t[i]&&(t[i].__=n,l=$(t[i],l,u));return l}n.__e!=l&&(u.insertBefore(n.__e,l||null),l=n.__e);do{l=l&&l.nextSibling}while(null!=l&&8===l.nodeType);return l}function H(n,l){return l=l||[],null==n||\"boolean\"==typeof n||(h(n)?n.some(function(n){H(n,l)}):l.push(n)),l}function I(n,l,u,t){var i=n.key,o=n.type,r=u-1,f=u+1,e=l[u];if(null===e||e&&i==e.key&&o===e.type)return u;if(t>(null!=e&&0==(131072&e.__u)?1:0))for(;r>=0||f<l.length;){if(r>=0){if((e=l[r])&&0==(131072&e.__u)&&i==e.key&&o===e.type)return r;r--}if(f<l.length){if((e=l[f])&&0==(131072&e.__u)&&i==e.key&&o===e.type)return f;f++}}return-1}function T(n,l,u){\"-\"===l[0]?n.setProperty(l,null==u?\"\":u):n[l]=null==u?\"\":\"number\"!=typeof u||a.test(l)?u:u+\"px\"}function A(n,l,u,t,i){var o;n:if(\"style\"===l)if(\"string\"==typeof u)n.style.cssText=u;else{if(\"string\"==typeof t&&(n.style.cssText=t=\"\"),t)for(l in t)u&&l in u||T(n.style,l,\"\");if(u)for(l in u)t&&u[l]===t[l]||T(n.style,l,u[l])}else if(\"o\"===l[0]&&\"n\"===l[1])o=l!==(l=l.replace(/(PointerCapture)$|Capture$/i,\"$1\")),l=l.toLowerCase()in n?l.toLowerCase().slice(2):l.slice(2),n.l||(n.l={}),n.l[l+o]=u,u?t?u.u=t.u:(u.u=Date.now(),n.addEventListener(l,o?L:D,o)):n.removeEventListener(l,o?L:D,o);else{if(i)l=l.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!==l&&\"height\"!==l&&\"href\"!==l&&\"list\"!==l&&\"form\"!==l&&\"tabIndex\"!==l&&\"download\"!==l&&\"rowSpan\"!==l&&\"colSpan\"!==l&&\"role\"!==l&&l in n)try{n[l]=null==u?\"\":u;break n}catch(n){}\"function\"==typeof u||(null==u||!1===u&&\"-\"!==l[4]?n.removeAttribute(l):n.setAttribute(l,u))}}function D(n){if(this.l){var u=this.l[n.type+!1];if(n.t){if(n.t<=u.u)return}else n.t=Date.now();return u(l.event?l.event(n):n)}}function L(n){if(this.l)return this.l[n.type+!0](l.event?l.event(n):n)}function M(n,u,t,i,o,r,f,e,c,s){var a,p,y,d,_,m,w,k,x,C,S,$,H,I,T,A=u.type;if(void 0!==u.constructor)return null;128&t.__u&&(c=!!(32&t.__u),r=[e=u.__e=t.__e]),(a=l.__b)&&a(u);n:if(\"function\"==typeof A)try{if(k=u.props,x=(a=A.contextType)&&i[a.__c],C=a?x?x.props.value:a.__:i,t.__c?w=(p=u.__c=t.__c).__=p.__E:(\"prototype\"in A&&A.prototype.render?u.__c=p=new A(k,C):(u.__c=p=new b(k,C),p.constructor=A,p.render=q),x&&x.sub(p),p.props=k,p.state||(p.state={}),p.context=C,p.__n=i,y=p.__d=!0,p.__h=[],p._sb=[]),null==p.__s&&(p.__s=p.state),null!=A.getDerivedStateFromProps&&(p.__s==p.state&&(p.__s=v({},p.__s)),v(p.__s,A.getDerivedStateFromProps(k,p.__s))),d=p.props,_=p.state,p.__v=u,y)null==A.getDerivedStateFromProps&&null!=p.componentWillMount&&p.componentWillMount(),null!=p.componentDidMount&&p.__h.push(p.componentDidMount);else{if(null==A.getDerivedStateFromProps&&k!==d&&null!=p.componentWillReceiveProps&&p.componentWillReceiveProps(k,C),!p.__e&&(null!=p.shouldComponentUpdate&&!1===p.shouldComponentUpdate(k,p.__s,C)||u.__v===t.__v)){for(u.__v!==t.__v&&(p.props=k,p.state=p.__s,p.__d=!1),u.__e=t.__e,u.__k=t.__k,u.__k.forEach(function(n){n&&(n.__=u)}),S=0;S<p._sb.length;S++)p.__h.push(p._sb[S]);p._sb=[],p.__h.length&&f.push(p);break n}null!=p.componentWillUpdate&&p.componentWillUpdate(k,p.__s,C),null!=p.componentDidUpdate&&p.__h.push(function(){p.componentDidUpdate(d,_,m)})}if(p.context=C,p.props=k,p.__P=n,p.__e=!1,$=l.__r,H=0,\"prototype\"in A&&A.prototype.render){for(p.state=p.__s,p.__d=!1,$&&$(u),a=p.render(p.props,p.state,p.context),I=0;I<p._sb.length;I++)p.__h.push(p._sb[I]);p._sb=[]}else do{p.__d=!1,$&&$(u),a=p.render(p.props,p.state,p.context),p.state=p.__s}while(p.__d&&++H<25);p.state=p.__s,null!=p.getChildContext&&(i=v(v({},i),p.getChildContext())),y||null==p.getSnapshotBeforeUpdate||(m=p.getSnapshotBeforeUpdate(d,_)),P(n,h(T=null!=a&&a.type===g&&null==a.key?a.props.children:a)?T:[T],u,t,i,o,r,f,e,c,s),p.base=u.__e,u.__u&=-161,p.__h.length&&f.push(p),w&&(p.__E=p.__=null)}catch(n){u.__v=null,c||null!=r?(u.__e=e,u.__u|=c?160:32,r[r.indexOf(e)]=null):(u.__e=t.__e,u.__k=t.__k),l.__e(n,u,t)}else null==r&&u.__v===t.__v?(u.__k=t.__k,u.__e=t.__e):u.__e=z(t.__e,u,t,i,o,r,f,c,s);(a=l.diffed)&&a(u)}function j(n,u,t){for(var i=0;i<t.length;i++)N(t[i],t[++i],t[++i]);l.__c&&l.__c(u,n),n.some(function(u){try{n=u.__h,u.__h=[],n.some(function(n){n.call(u)})}catch(n){l.__e(n,u.__v)}})}function z(l,u,t,i,o,r,f,e,s){var a,v,y,d,_,g,b,w=t.props,k=u.props,x=u.type;if(\"svg\"===x&&(o=!0),null!=r)for(a=0;a<r.length;a++)if((_=r[a])&&\"setAttribute\"in _==!!x&&(x?_.localName===x:3===_.nodeType)){l=_,r[a]=null;break}if(null==l){if(null===x)return document.createTextNode(k);l=o?document.createElementNS(\"http://www.w3.org/2000/svg\",x):document.createElement(x,k.is&&k),r=null,e=!1}if(null===x)w===k||e&&l.data===k||(l.data=k);else{if(r=r&&n.call(l.childNodes),w=t.props||c,!e&&null!=r)for(w={},a=0;a<l.attributes.length;a++)w[(_=l.attributes[a]).name]=_.value;for(a in w)_=w[a],\"children\"==a||(\"dangerouslySetInnerHTML\"==a?y=_:\"key\"===a||a in k||A(l,a,null,_,o));for(a in k)_=k[a],\"children\"==a?d=_:\"dangerouslySetInnerHTML\"==a?v=_:\"value\"==a?g=_:\"checked\"==a?b=_:\"key\"===a||e&&\"function\"!=typeof _||w[a]===_||A(l,a,_,w[a],o);if(v)e||y&&(v.__html===y.__html||v.__html===l.innerHTML)||(l.innerHTML=v.__html),u.__k=[];else if(y&&(l.innerHTML=\"\"),P(l,h(d)?d:[d],u,t,i,o&&\"foreignObject\"!==x,r,f,r?r[0]:t.__k&&m(t,0),e,s),null!=r)for(a=r.length;a--;)null!=r[a]&&p(r[a]);e||(a=\"value\",void 0!==g&&(g!==l[a]||\"progress\"===x&&!g||\"option\"===x&&g!==w[a])&&A(l,a,g,w[a],!1),a=\"checked\",void 0!==b&&b!==l[a]&&A(l,a,b,w[a],!1))}return l}function N(n,u,t){try{\"function\"==typeof n?n(u):n.current=u}catch(n){l.__e(n,t)}}function O(n,u,t){var i,o;if(l.unmount&&l.unmount(n),(i=n.ref)&&(i.current&&i.current!==n.__e||N(i,null,u)),null!=(i=n.__c)){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(n){l.__e(n,u)}i.base=i.__P=null,n.__c=void 0}if(i=n.__k)for(o=0;o<i.length;o++)i[o]&&O(i[o],u,t||\"function\"!=typeof n.type);t||null==n.__e||p(n.__e),n.__=n.__e=n.__d=void 0}function q(n,l,u){return this.constructor(n,u)}function B(u,t,i){var o,r,f,e;l.__&&l.__(u,t),r=(o=\"function\"==typeof i)?null:i&&i.__k||t.__k,f=[],e=[],M(t,u=(!o&&i||t).__k=y(g,null,[u]),r||c,c,void 0!==t.ownerSVGElement,!o&&i?[i]:r?null:t.firstChild?n.call(t.childNodes):null,f,!o&&i?i:r?r.__e:t.firstChild,o,e),u.__d=void 0,j(f,u,e)}function E(n,l){B(n,l,E)}function F(l,u,t){var i,o,r,f,e=v({},l.props);for(r in l.type&&l.type.defaultProps&&(f=l.type.defaultProps),u)\"key\"==r?i=u[r]:\"ref\"==r?o=u[r]:e[r]=void 0===u[r]&&void 0!==f?f[r]:u[r];return arguments.length>2&&(e.children=arguments.length>3?n.call(arguments,2):t),d(l.type,e,i||l.key,o||l.ref,null)}function G(n,l){var u={__c:l=\"__cC\"+e++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var u,t;return this.getChildContext||(u=[],(t={})[l]=this,this.getChildContext=function(){return t},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&u.some(function(n){n.__e=!0,x(n)})},this.sub=function(n){u.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){u.splice(u.indexOf(n),1),l&&l.call(n)}}),n.children}};return u.Provider.__=u.Consumer.contextType=u}n=s.slice,l={__e:function(n,l,u,t){for(var i,o,r;l=l.__;)if((i=l.__c)&&!i.__)try{if((o=i.constructor)&&null!=o.getDerivedStateFromError&&(i.setState(o.getDerivedStateFromError(n)),r=i.__d),null!=i.componentDidCatch&&(i.componentDidCatch(n,t||{}),r=i.__d),r)return i.__E=i}catch(l){n=l}throw n}},u=0,t=function(n){return null!=n&&null==n.constructor},b.prototype.setState=function(n,l){var u;u=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=v({},this.state),\"function\"==typeof n&&(n=n(v({},u),this.props)),n&&v(u,n),null!=n&&this.__v&&(l&&this._sb.push(l),x(this))},b.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),x(this))},b.prototype.render=g,i=[],r=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,f=function(n,l){return n.__v.__b-l.__v.__b},C.__r=0,e=0;export{b as Component,g as Fragment,F as cloneElement,G as createContext,y as createElement,_ as createRef,y as h,E as hydrate,t as isValidElement,l as options,B as render,H as toChildArray};\n//# sourceMappingURL=preact.module.js.map\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=[],e=n,a=e.__b,v=e.__r,l=e.diffed,m=e.__c,s=e.unmount,d=e.__;function h(n,t){e.__h&&e.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({__V:c}),u.__[n]}function p(n){return o=1,y(D,n)}function y(n,u,i){var o=h(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),!(!i&&o.__c.props===n)&&(!c||c.call(this,n,t,r))};r.u=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function _(n,u){var i=h(t++,3);!e.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__H.__h.push(i))}function A(n,u){var i=h(t++,4);!e.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__h.push(i))}function F(n){return o=5,q(function(){return{current:n}},[])}function T(n,t,r){o=6,A(function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function q(n,r){var u=h(t++,7);return C(u.__H,r)?(u.__V=n(),u.i=r,u.__h=n,u.__V):u.__}function x(n,t){return o=8,q(function(){return n},t)}function P(n){var u=r.context[n.__c],i=h(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function V(n,t){e.useDebugValue&&e.useDebugValue(t?t(n):n)}function b(n){var u=h(t++,10),i=p();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=h(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],e.__e(t,n.__v)}}e.__b=function(n){r=null,a&&a(n)},e.__=function(n,t){t.__k&&t.__k.__m&&(n.__m=t.__k.__m),d&&d(n,t)},e.__r=function(n){v&&v(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.__V=c,n.__N=n.i=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},e.diffed=function(n){l&&l(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===e.requestAnimationFrame||((i=e.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.__V!==c&&(n.__=n.__V),n.i=void 0,n.__V=c})),u=r=null},e.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],e.__e(r,n.__v)}}),m&&m(n,t)},e.unmount=function(n){s&&s(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&e.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{x as useCallback,P as useContext,V as useDebugValue,_ as useEffect,b as useErrorBoundary,g as useId,T as useImperativeHandle,A as useLayoutEffect,q as useMemo,y as useReducer,F as useRef,p as useState};\n//# sourceMappingURL=hooks.module.js.map\n","import { DOCUMENT } from '../../constants';\nimport { setAttributesNS } from '../../util/setAttributesNS';\n\nconst XMLNS = 'http://www.w3.org/2000/svg';\n\n/**\n * Sentry Logo\n */\nexport function SentryLogo(): SVGElement {\n  const createElementNS = <K extends keyof SVGElementTagNameMap>(tagName: K): SVGElementTagNameMap[K] =>\n    DOCUMENT.createElementNS(XMLNS, tagName);\n  const svg = setAttributesNS(createElementNS('svg'), {\n    width: '32',\n    height: '30',\n    viewBox: '0 0 72 66',\n    fill: 'inherit',\n  });\n\n  const path = setAttributesNS(createElementNS('path'), {\n    transform: 'translate(11, 11)',\n    d: 'M29,2.26a4.67,4.67,0,0,0-8,0L14.42,13.53A32.21,32.21,0,0,1,32.17,40.19H27.55A27.68,27.68,0,0,0,12.09,17.47L6,28a15.92,15.92,0,0,1,9.23,12.17H4.62A.76.76,0,0,1,4,39.06l2.94-5a10.74,10.74,0,0,0-3.36-1.9l-2.91,5a4.54,4.54,0,0,0,1.69,6.24A4.66,4.66,0,0,0,4.62,44H19.15a19.4,19.4,0,0,0-8-17.31l2.31-4A23.87,23.87,0,0,1,23.76,44H36.07a35.88,35.88,0,0,0-16.41-31.8l4.67-8a.77.77,0,0,1,1.05-.27c.53.29,20.29,34.77,20.66,35.17a.76.76,0,0,1-.68,1.13H40.6q.09,1.91,0,3.81h4.78A4.59,4.59,0,0,0,50,39.43a4.49,4.49,0,0,0-.62-2.28Z',\n  });\n  svg.appendChild(path);\n\n  return svg;\n}\n","import type { FeedbackInternalOptions } from '@sentry/core';\n// biome-ignore lint/nursery/noUnusedImports: reason\nimport { h } from 'preact'; // eslint-disable-line @typescript-eslint/no-unused-vars\nimport type { VNode } from 'preact';\nimport { useMemo } from 'preact/hooks';\nimport { SentryLogo } from './SentryLogo';\n\nexport interface Props {\n  options: FeedbackInternalOptions;\n}\n\nexport function DialogHeader({ options }: Props): VNode {\n  const logoHtml = useMemo(() => ({ __html: SentryLogo().outerHTML }), []);\n\n  return (\n    <h2 class=\"dialog__header\">\n      <span class=\"dialog__title\">{options.formTitle}</span>\n      {options.showBranding ? (\n        <a\n          class=\"brand-link\"\n          target=\"_blank\"\n          href=\"https://sentry.io/welcome/\"\n          title=\"Powered by Sentry\"\n          rel=\"noopener noreferrer\"\n          dangerouslySetInnerHTML={logoHtml}\n        />\n      ) : null}\n    </h2>\n  );\n}\n","import { logger } from '@sentry/core';\nimport type {\n  FeedbackFormData,\n  FeedbackInternalOptions,\n  FeedbackScreenshotIntegration,\n  SendFeedback,\n} from '@sentry/core';\n// biome-ignore lint/nursery/noUnusedImports: reason\nimport { h } from 'preact'; // eslint-disable-line @typescript-eslint/no-unused-vars\nimport type { JSX, VNode } from 'preact';\nimport { useCallback, useState } from 'preact/hooks';\nimport { FEEDBACK_WIDGET_SOURCE } from '../../constants';\nimport { DEBUG_BUILD } from '../../util/debug-build';\nimport { getMissingFields } from '../../util/validate';\n\nexport interface Props extends Pick<FeedbackInternalOptions, 'showEmail' | 'showName'> {\n  options: FeedbackInternalOptions;\n  defaultEmail: string;\n  defaultName: string;\n  onFormClose: () => void;\n  onSubmit: SendFeedback;\n  onSubmitSuccess: (data: FeedbackFormData) => void;\n  onSubmitError: (error: Error) => void;\n  screenshotInput: ReturnType<FeedbackScreenshotIntegration['createInput']> | undefined;\n}\n\nfunction retrieveStringValue(formData: FormData, key: string): string {\n  const value = formData.get(key);\n  if (typeof value === 'string') {\n    return value.trim();\n  }\n  return '';\n}\n\nexport function Form({\n  options,\n  defaultEmail,\n  defaultName,\n\n  onFormClose,\n  onSubmit,\n  onSubmitSuccess,\n  onSubmitError,\n  showEmail,\n  showName,\n  screenshotInput,\n}: Props): VNode {\n  const {\n    tags,\n    addScreenshotButtonLabel,\n    removeScreenshotButtonLabel,\n    cancelButtonLabel,\n    emailLabel,\n    emailPlaceholder,\n    isEmailRequired,\n    isNameRequired,\n    messageLabel,\n    messagePlaceholder,\n    nameLabel,\n    namePlaceholder,\n    submitButtonLabel,\n    isRequiredLabel,\n  } = options;\n  // TODO: set a ref on the form, and whenever an input changes call processForm() and setError()\n  const [error, setError] = useState<null | string>(null);\n\n  const [showScreenshotInput, setShowScreenshotInput] = useState(false);\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const ScreenshotInputComponent: any = screenshotInput && screenshotInput.input;\n\n  const [screenshotError, setScreenshotError] = useState<null | Error>(null);\n  const onScreenshotError = useCallback((error: Error) => {\n    setScreenshotError(error);\n    setShowScreenshotInput(false);\n  }, []);\n\n  const hasAllRequiredFields = useCallback(\n    (data: FeedbackFormData) => {\n      const missingFields = getMissingFields(data, {\n        emailLabel,\n        isEmailRequired,\n        isNameRequired,\n        messageLabel,\n        nameLabel,\n      });\n\n      if (missingFields.length > 0) {\n        setError(`Please enter in the following required fields: ${missingFields.join(', ')}`);\n      } else {\n        setError(null);\n      }\n\n      return missingFields.length === 0;\n    },\n    [emailLabel, isEmailRequired, isNameRequired, messageLabel, nameLabel],\n  );\n\n  const handleSubmit = useCallback(\n    async (e: JSX.TargetedSubmitEvent<HTMLFormElement>) => {\n      try {\n        e.preventDefault();\n        if (!(e.target instanceof HTMLFormElement)) {\n          return;\n        }\n        const formData = new FormData(e.target);\n        const attachment = await (screenshotInput && showScreenshotInput ? screenshotInput.value() : undefined);\n\n        const data: FeedbackFormData = {\n          name: retrieveStringValue(formData, 'name'),\n          email: retrieveStringValue(formData, 'email'),\n          message: retrieveStringValue(formData, 'message'),\n          attachments: attachment ? [attachment] : undefined,\n        };\n\n        if (!hasAllRequiredFields(data)) {\n          return;\n        }\n\n        try {\n          await onSubmit(\n            {\n              name: data.name,\n              email: data.email,\n              message: data.message,\n              source: FEEDBACK_WIDGET_SOURCE,\n              tags,\n            },\n            { attachments: data.attachments },\n          );\n          onSubmitSuccess(data);\n        } catch (error) {\n          DEBUG_BUILD && logger.error(error);\n          setError(error as string);\n          onSubmitError(error as Error);\n        }\n      } catch {\n        // pass\n      }\n    },\n    [screenshotInput && showScreenshotInput, onSubmitSuccess, onSubmitError],\n  );\n\n  return (\n    <form class=\"form\" onSubmit={handleSubmit}>\n      {ScreenshotInputComponent && showScreenshotInput ? (\n        <ScreenshotInputComponent onError={onScreenshotError} />\n      ) : null}\n\n      <div class=\"form__right\" data-sentry-feedback={true}>\n        <div class=\"form__top\">\n          {error ? <div class=\"form__error-container\">{error}</div> : null}\n\n          {showName ? (\n            <label for=\"name\" class=\"form__label\">\n              <LabelText label={nameLabel} isRequiredLabel={isRequiredLabel} isRequired={isNameRequired} />\n              <input\n                class=\"form__input\"\n                defaultValue={defaultName}\n                id=\"name\"\n                name=\"name\"\n                placeholder={namePlaceholder}\n                required={isNameRequired}\n                type=\"text\"\n              />\n            </label>\n          ) : (\n            <input aria-hidden value={defaultName} name=\"name\" type=\"hidden\" />\n          )}\n\n          {showEmail ? (\n            <label for=\"email\" class=\"form__label\">\n              <LabelText label={emailLabel} isRequiredLabel={isRequiredLabel} isRequired={isEmailRequired} />\n              <input\n                class=\"form__input\"\n                defaultValue={defaultEmail}\n                id=\"email\"\n                name=\"email\"\n                placeholder={emailPlaceholder}\n                required={isEmailRequired}\n                type=\"email\"\n              ></input>\n            </label>\n          ) : (\n            <input aria-hidden value={defaultEmail} name=\"email\" type=\"hidden\" />\n          )}\n\n          <label for=\"message\" class=\"form__label\">\n            <LabelText label={messageLabel} isRequiredLabel={isRequiredLabel} isRequired />\n            <textarea\n              autoFocus\n              class=\"form__input form__input--textarea\"\n              id=\"message\"\n              name=\"message\"\n              placeholder={messagePlaceholder}\n              required={true}\n              rows={5}\n            />\n          </label>\n\n          {ScreenshotInputComponent ? (\n            <label for=\"screenshot\" class=\"form__label\">\n              <button\n                class=\"btn btn--default\"\n                type=\"button\"\n                onClick={() => {\n                  setScreenshotError(null);\n                  setShowScreenshotInput(prev => !prev);\n                }}\n              >\n                {showScreenshotInput ? removeScreenshotButtonLabel : addScreenshotButtonLabel}\n              </button>\n              {screenshotError ? <div class=\"form__error-container\">{screenshotError.message}</div> : null}\n            </label>\n          ) : null}\n        </div>\n        <div class=\"btn-group\">\n          <button class=\"btn btn--primary\" type=\"submit\">\n            {submitButtonLabel}\n          </button>\n          <button class=\"btn btn--default\" type=\"button\" onClick={onFormClose}>\n            {cancelButtonLabel}\n          </button>\n        </div>\n      </div>\n    </form>\n  );\n}\n\nfunction LabelText({\n  label,\n  isRequired,\n  isRequiredLabel,\n}: {\n  label: string;\n  isRequired: boolean;\n  isRequiredLabel: string;\n}): VNode {\n  return (\n    <span class=\"form__label__text\">\n      {label}\n      {isRequired && <span class=\"form__label__text--required\">{isRequiredLabel}</span>}\n    </span>\n  );\n}\n","import type { FeedbackFormData, FeedbackInternalOptions } from '@sentry/core';\n\nexport type Props = Pick<\n  FeedbackInternalOptions,\n  'emailLabel' | 'isEmailRequired' | 'isNameRequired' | 'messageLabel' | 'nameLabel'\n>;\n\n/**\n * Validate that a given feedback submission has the required fields\n */\nexport function getMissingFields(feedback: FeedbackFormData, props: Props): string[] {\n  const emptyFields = [];\n  if (props.isNameRequired && !feedback.name) {\n    emptyFields.push(props.nameLabel);\n  }\n  if (props.isEmailRequired && !feedback.email) {\n    emptyFields.push(props.emailLabel);\n  }\n  if (!feedback.message) {\n    emptyFields.push(props.messageLabel);\n  }\n\n  return emptyFields;\n}\n","import { WINDOW } from '../../constants';\nimport { setAttributesNS } from '../../util/setAttributesNS';\n\nconst WIDTH = 16;\nconst HEIGHT = 17;\nconst XMLNS = 'http://www.w3.org/2000/svg';\n\n/**\n * Success Icon (checkmark)\n */\nexport function SuccessIcon(): SVGElement {\n  const createElementNS = <K extends keyof SVGElementTagNameMap>(tagName: K): SVGElementTagNameMap[K] =>\n    WINDOW.document.createElementNS(XMLNS, tagName);\n  const svg = setAttributesNS(createElementNS('svg'), {\n    width: `${WIDTH}`,\n    height: `${HEIGHT}`,\n    viewBox: `0 0 ${WIDTH} ${HEIGHT}`,\n    fill: 'inherit',\n  });\n\n  const g = setAttributesNS(createElementNS('g'), {\n    clipPath: 'url(#clip0_57_156)',\n  });\n\n  const path2 = setAttributesNS(createElementNS('path'), {\n    ['fill-rule']: 'evenodd',\n    ['clip-rule']: 'evenodd',\n    d: 'M3.55544 15.1518C4.87103 16.0308 6.41775 16.5 8 16.5C10.1217 16.5 12.1566 15.6571 13.6569 14.1569C15.1571 12.6566 16 10.6217 16 8.5C16 6.91775 15.5308 5.37103 14.6518 4.05544C13.7727 2.73985 12.5233 1.71447 11.0615 1.10897C9.59966 0.503466 7.99113 0.34504 6.43928 0.653721C4.88743 0.962403 3.46197 1.72433 2.34315 2.84315C1.22433 3.96197 0.462403 5.38743 0.153721 6.93928C-0.15496 8.49113 0.00346625 10.0997 0.608967 11.5615C1.21447 13.0233 2.23985 14.2727 3.55544 15.1518ZM4.40546 3.1204C5.46945 2.40946 6.72036 2.03 8 2.03C9.71595 2.03 11.3616 2.71166 12.575 3.92502C13.7883 5.13838 14.47 6.78405 14.47 8.5C14.47 9.77965 14.0905 11.0306 13.3796 12.0945C12.6687 13.1585 11.6582 13.9878 10.476 14.4775C9.29373 14.9672 7.99283 15.0953 6.73777 14.8457C5.48271 14.596 4.32987 13.9798 3.42502 13.075C2.52018 12.1701 1.90397 11.0173 1.65432 9.76224C1.40468 8.50718 1.5328 7.20628 2.0225 6.02404C2.5122 4.8418 3.34148 3.83133 4.40546 3.1204Z',\n  });\n  const path = setAttributesNS(createElementNS('path'), {\n    d: 'M6.68775 12.4297C6.78586 12.4745 6.89218 12.4984 7 12.5C7.11275 12.4955 7.22315 12.4664 7.32337 12.4145C7.4236 12.3627 7.51121 12.2894 7.58 12.2L12 5.63999C12.0848 5.47724 12.1071 5.28902 12.0625 5.11098C12.0178 4.93294 11.9095 4.77744 11.7579 4.67392C11.6064 4.57041 11.4221 4.52608 11.24 4.54931C11.0579 4.57254 10.8907 4.66173 10.77 4.79999L6.88 10.57L5.13 8.56999C5.06508 8.49566 4.98613 8.43488 4.89768 8.39111C4.80922 8.34735 4.713 8.32148 4.61453 8.31498C4.51605 8.30847 4.41727 8.32147 4.32382 8.35322C4.23038 8.38497 4.14413 8.43484 4.07 8.49999C3.92511 8.63217 3.83692 8.81523 3.82387 9.01092C3.81083 9.2066 3.87393 9.39976 4 9.54999L6.43 12.24C6.50187 12.3204 6.58964 12.385 6.68775 12.4297Z',\n  });\n\n  svg.appendChild(g).append(path, path2);\n\n  const speakerDefs = createElementNS('defs');\n  const speakerClipPathDef = setAttributesNS(createElementNS('clipPath'), {\n    id: 'clip0_57_156',\n  });\n\n  const speakerRect = setAttributesNS(createElementNS('rect'), {\n    width: `${WIDTH}`,\n    height: `${WIDTH}`,\n    fill: 'white',\n    transform: 'translate(0 0.5)',\n  });\n\n  speakerClipPathDef.appendChild(speakerRect);\n  speakerDefs.appendChild(speakerClipPathDef);\n\n  svg.appendChild(speakerDefs).appendChild(speakerClipPathDef).appendChild(speakerRect);\n\n  return svg;\n}\n","import type { FeedbackFormData, FeedbackInternalOptions } from '@sentry/core';\n// biome-ignore lint/nursery/noUnusedImports: reason\nimport { Fragment, h } from 'preact'; // eslint-disable-line @typescript-eslint/no-unused-vars\nimport type { VNode } from 'preact';\nimport { useCallback, useMemo, useState } from 'preact/hooks';\n\nimport { SUCCESS_MESSAGE_TIMEOUT } from '../../constants';\nimport { DialogHeader } from './DialogHeader';\nimport type { Props as HeaderProps } from './DialogHeader';\nimport type { Props as FormProps } from './Form';\nimport { Form } from './Form';\nimport { SuccessIcon } from './SuccessIcon';\n\ninterface Props extends HeaderProps, FormProps {\n  onFormSubmitted: () => void;\n  open: boolean;\n  options: FeedbackInternalOptions;\n}\n\nexport function Dialog({ open, onFormSubmitted, ...props }: Props): VNode {\n  const options = props.options;\n  const successIconHtml = useMemo(() => ({ __html: SuccessIcon().outerHTML }), []);\n\n  const [timeoutId, setTimeoutId] = useState<NodeJS.Timeout | null>(null);\n\n  const handleOnSuccessClick = useCallback(() => {\n    if (timeoutId) {\n      clearTimeout(timeoutId);\n      setTimeoutId(null);\n    }\n    onFormSubmitted();\n  }, [timeoutId]);\n\n  const onSubmitSuccess = useCallback(\n    (data: FeedbackFormData) => {\n      props.onSubmitSuccess(data);\n      setTimeoutId(\n        setTimeout(() => {\n          onFormSubmitted();\n          setTimeoutId(null);\n        }, SUCCESS_MESSAGE_TIMEOUT),\n      );\n    },\n    [onFormSubmitted],\n  );\n\n  return (\n    <Fragment>\n      {timeoutId ? (\n        <div class=\"success__position\" onClick={handleOnSuccessClick}>\n          <div class=\"success__content\">\n            {options.successMessageText}\n            <span class=\"success__icon\" dangerouslySetInnerHTML={successIconHtml} />\n          </div>\n        </div>\n      ) : (\n        <dialog class=\"dialog\" onClick={options.onFormClose} open={open}>\n          <div class=\"dialog__position\">\n            <div\n              class=\"dialog__content\"\n              onClick={e => {\n                // Stop event propagation so clicks on content modal do not propagate to dialog (which will close dialog)\n                e.stopPropagation();\n              }}\n            >\n              <DialogHeader options={options} />\n              <Form {...props} onSubmitSuccess={onSubmitSuccess} />\n            </div>\n          </div>\n        </dialog>\n      )}\n    </Fragment>\n  );\n}\n","import { DOCUMENT } from '../../constants';\n\n/**\n * Creates <style> element for widget dialog\n */\nexport function createScreenshotInputStyles(styleNonce?: string): HTMLStyleElement {\n  const style = DOCUMENT.createElement('style');\n\n  const surface200 = '#1A141F';\n  const gray100 = '#302735';\n\n  style.textContent = `\n.editor {\n  padding: 10px;\n  padding-top: 65px;\n  padding-bottom: 65px;\n  flex-grow: 1;\n\n  background-color: ${surface200};\n  background-image: repeating-linear-gradient(\n      -145deg,\n      transparent,\n      transparent 8px,\n      ${surface200} 8px,\n      ${surface200} 11px\n    ),\n    repeating-linear-gradient(\n      -45deg,\n      transparent,\n      transparent 15px,\n      ${gray100} 15px,\n      ${gray100} 16px\n    );\n}\n\n.editor__canvas-container {\n  width: 100%;\n  height: 100%;\n  position: relative;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.editor__canvas-container canvas {\n  object-fit: contain;\n  position: relative;\n}\n\n.editor__crop-btn-group {\n  padding: 8px;\n  gap: 8px;\n  border-radius: var(--menu-border-radius, 6px);\n  background: var(--button-primary-background, var(--background));\n  width: 175px;\n  position: absolute;\n}\n\n.editor__crop-corner {\n  width: 30px;\n  height: 30px;\n  position: absolute;\n  background: none;\n  border: 3px solid #ffffff;\n}\n\n.editor__crop-corner--top-left {\n  cursor: nwse-resize;\n  border-right: none;\n  border-bottom: none;\n}\n.editor__crop-corner--top-right {\n  cursor: nesw-resize;\n  border-left: none;\n  border-bottom: none;\n}\n.editor__crop-corner--bottom-left {\n  cursor: nesw-resize;\n  border-right: none;\n  border-top: none;\n}\n.editor__crop-corner--bottom-right {\n  cursor: nwse-resize;\n  border-left: none;\n  border-top: none;\n}\n`;\n\n  if (styleNonce) {\n    style.setAttribute('nonce', styleNonce);\n  }\n\n  return style;\n}\n","/* eslint-disable max-lines */\nimport type { FeedbackInternalOptions, FeedbackModalIntegration } from '@sentry/core';\nimport type { ComponentType, VNode, h as hType } from 'preact';\n// biome-ignore lint/nursery/noUnusedImports: reason\nimport { h } from 'preact'; // eslint-disable-line @typescript-eslint/no-unused-vars\nimport type * as Hooks from 'preact/hooks';\nimport { DOCUMENT, WINDOW } from '../../constants';\nimport CropCornerFactory from './CropCorner';\nimport { createScreenshotInputStyles } from './ScreenshotInput.css';\nimport { useTakeScreenshotFactory } from './useTakeScreenshot';\n\nconst CROP_BUTTON_SIZE = 30;\nconst CROP_BUTTON_BORDER = 3;\nconst CROP_BUTTON_OFFSET = CROP_BUTTON_SIZE + CROP_BUTTON_BORDER;\nconst DPI = WINDOW.devicePixelRatio;\n\ninterface FactoryParams {\n  h: typeof hType;\n  hooks: typeof Hooks;\n  imageBuffer: HTMLCanvasElement;\n  dialog: ReturnType<FeedbackModalIntegration['createDialog']>;\n  options: FeedbackInternalOptions;\n}\n\ninterface Props {\n  onError: (error: Error) => void;\n}\n\ninterface Box {\n  startX: number;\n  startY: number;\n  endX: number;\n  endY: number;\n}\n\ninterface Rect {\n  x: number;\n  y: number;\n  height: number;\n  width: number;\n}\n\nconst constructRect = (box: Box): Rect => {\n  return {\n    x: Math.min(box.startX, box.endX),\n    y: Math.min(box.startY, box.endY),\n    width: Math.abs(box.startX - box.endX),\n    height: Math.abs(box.startY - box.endY),\n  };\n};\n\nconst getContainedSize = (img: HTMLCanvasElement): Box => {\n  const imgClientHeight = img.clientHeight;\n  const imgClientWidth = img.clientWidth;\n  const ratio = img.width / img.height;\n  let width = imgClientHeight * ratio;\n  let height = imgClientHeight;\n  if (width > imgClientWidth) {\n    width = imgClientWidth;\n    height = imgClientWidth / ratio;\n  }\n  const x = (imgClientWidth - width) / 2;\n  const y = (imgClientHeight - height) / 2;\n  return { startX: x, startY: y, endX: width + x, endY: height + y };\n};\n\nexport function ScreenshotEditorFactory({\n  h,\n  hooks,\n  imageBuffer,\n  dialog,\n  options,\n}: FactoryParams): ComponentType<Props> {\n  const useTakeScreenshot = useTakeScreenshotFactory({ hooks });\n\n  return function ScreenshotEditor({ onError }: Props): VNode {\n    const styles = hooks.useMemo(() => ({ __html: createScreenshotInputStyles(options.styleNonce).innerText }), []);\n    const CropCorner = CropCornerFactory({ h });\n\n    const canvasContainerRef = hooks.useRef<HTMLDivElement>(null);\n    const cropContainerRef = hooks.useRef<HTMLDivElement>(null);\n    const croppingRef = hooks.useRef<HTMLCanvasElement>(null);\n    const [croppingRect, setCroppingRect] = hooks.useState<Box>({ startX: 0, startY: 0, endX: 0, endY: 0 });\n    const [confirmCrop, setConfirmCrop] = hooks.useState(false);\n    const [isResizing, setIsResizing] = hooks.useState(false);\n\n    hooks.useEffect(() => {\n      WINDOW.addEventListener('resize', resizeCropper, false);\n    }, []);\n\n    function resizeCropper(): void {\n      const cropper = croppingRef.current;\n      const imageDimensions = constructRect(getContainedSize(imageBuffer));\n      if (cropper) {\n        cropper.width = imageDimensions.width * DPI;\n        cropper.height = imageDimensions.height * DPI;\n        cropper.style.width = `${imageDimensions.width}px`;\n        cropper.style.height = `${imageDimensions.height}px`;\n        const ctx = cropper.getContext('2d');\n        if (ctx) {\n          ctx.scale(DPI, DPI);\n        }\n      }\n\n      const cropButton = cropContainerRef.current;\n      if (cropButton) {\n        cropButton.style.width = `${imageDimensions.width}px`;\n        cropButton.style.height = `${imageDimensions.height}px`;\n      }\n\n      setCroppingRect({ startX: 0, startY: 0, endX: imageDimensions.width, endY: imageDimensions.height });\n    }\n\n    hooks.useEffect(() => {\n      const cropper = croppingRef.current;\n      if (!cropper) {\n        return;\n      }\n\n      const ctx = cropper.getContext('2d');\n      if (!ctx) {\n        return;\n      }\n\n      const imageDimensions = constructRect(getContainedSize(imageBuffer));\n      const croppingBox = constructRect(croppingRect);\n      ctx.clearRect(0, 0, imageDimensions.width, imageDimensions.height);\n\n      // draw gray overlay around the selection\n      ctx.fillStyle = 'rgba(0, 0, 0, 0.5)';\n      ctx.fillRect(0, 0, imageDimensions.width, imageDimensions.height);\n      ctx.clearRect(croppingBox.x, croppingBox.y, croppingBox.width, croppingBox.height);\n\n      // draw selection border\n      ctx.strokeStyle = '#ffffff';\n      ctx.lineWidth = 3;\n      ctx.strokeRect(croppingBox.x + 1, croppingBox.y + 1, croppingBox.width - 2, croppingBox.height - 2);\n      ctx.strokeStyle = '#000000';\n      ctx.lineWidth = 1;\n      ctx.strokeRect(croppingBox.x + 3, croppingBox.y + 3, croppingBox.width - 6, croppingBox.height - 6);\n    }, [croppingRect]);\n\n    function onGrabButton(e: Event, corner: string): void {\n      setConfirmCrop(false);\n      setIsResizing(true);\n      const handleMouseMove = makeHandleMouseMove(corner);\n      const handleMouseUp = (): void => {\n        DOCUMENT.removeEventListener('mousemove', handleMouseMove);\n        DOCUMENT.removeEventListener('mouseup', handleMouseUp);\n        setConfirmCrop(true);\n        setIsResizing(false);\n      };\n\n      DOCUMENT.addEventListener('mouseup', handleMouseUp);\n      DOCUMENT.addEventListener('mousemove', handleMouseMove);\n    }\n\n    const makeHandleMouseMove = hooks.useCallback((corner: string) => {\n      return function (e: MouseEvent) {\n        if (!croppingRef.current) {\n          return;\n        }\n        const cropCanvas = croppingRef.current;\n        const cropBoundingRect = cropCanvas.getBoundingClientRect();\n        const mouseX = e.clientX - cropBoundingRect.x;\n        const mouseY = e.clientY - cropBoundingRect.y;\n        switch (corner) {\n          case 'top-left':\n            setCroppingRect(prev => ({\n              ...prev,\n              startX: Math.min(Math.max(0, mouseX), prev.endX - CROP_BUTTON_OFFSET),\n              startY: Math.min(Math.max(0, mouseY), prev.endY - CROP_BUTTON_OFFSET),\n            }));\n            break;\n          case 'top-right':\n            setCroppingRect(prev => ({\n              ...prev,\n              endX: Math.max(Math.min(mouseX, cropCanvas.width / DPI), prev.startX + CROP_BUTTON_OFFSET),\n              startY: Math.min(Math.max(0, mouseY), prev.endY - CROP_BUTTON_OFFSET),\n            }));\n            break;\n          case 'bottom-left':\n            setCroppingRect(prev => ({\n              ...prev,\n              startX: Math.min(Math.max(0, mouseX), prev.endX - CROP_BUTTON_OFFSET),\n              endY: Math.max(Math.min(mouseY, cropCanvas.height / DPI), prev.startY + CROP_BUTTON_OFFSET),\n            }));\n            break;\n          case 'bottom-right':\n            setCroppingRect(prev => ({\n              ...prev,\n              endX: Math.max(Math.min(mouseX, cropCanvas.width / DPI), prev.startX + CROP_BUTTON_OFFSET),\n              endY: Math.max(Math.min(mouseY, cropCanvas.height / DPI), prev.startY + CROP_BUTTON_OFFSET),\n            }));\n            break;\n        }\n      };\n    }, []);\n\n    // DRAGGING FUNCTIONALITY.\n    const initialPositionRef = hooks.useRef({ initialX: 0, initialY: 0 });\n\n    function onDragStart(e: MouseEvent): void {\n      if (isResizing) return;\n\n      initialPositionRef.current = { initialX: e.clientX, initialY: e.clientY };\n\n      const handleMouseMove = (moveEvent: MouseEvent): void => {\n        const cropCanvas = croppingRef.current;\n        if (!cropCanvas) return;\n\n        const deltaX = moveEvent.clientX - initialPositionRef.current.initialX;\n        const deltaY = moveEvent.clientY - initialPositionRef.current.initialY;\n\n        setCroppingRect(prev => {\n          // Math.max stops it from going outside of the borders\n          const newStartX = Math.max(\n            0,\n            Math.min(prev.startX + deltaX, cropCanvas.width / DPI - (prev.endX - prev.startX)),\n          );\n          const newStartY = Math.max(\n            0,\n            Math.min(prev.startY + deltaY, cropCanvas.height / DPI - (prev.endY - prev.startY)),\n          );\n          // Don't want to change size, just position\n          const newEndX = newStartX + (prev.endX - prev.startX);\n          const newEndY = newStartY + (prev.endY - prev.startY);\n\n          initialPositionRef.current.initialX = moveEvent.clientX;\n          initialPositionRef.current.initialY = moveEvent.clientY;\n\n          return {\n            startX: newStartX,\n            startY: newStartY,\n            endX: newEndX,\n            endY: newEndY,\n          };\n        });\n      };\n\n      const handleMouseUp = (): void => {\n        DOCUMENT.removeEventListener('mousemove', handleMouseMove);\n        DOCUMENT.removeEventListener('mouseup', handleMouseUp);\n      };\n\n      DOCUMENT.addEventListener('mousemove', handleMouseMove);\n      DOCUMENT.addEventListener('mouseup', handleMouseUp);\n    }\n\n    function submit(): void {\n      const cutoutCanvas = DOCUMENT.createElement('canvas');\n      const imageBox = constructRect(getContainedSize(imageBuffer));\n      const croppingBox = constructRect(croppingRect);\n      cutoutCanvas.width = croppingBox.width * DPI;\n      cutoutCanvas.height = croppingBox.height * DPI;\n\n      const cutoutCtx = cutoutCanvas.getContext('2d');\n      if (cutoutCtx && imageBuffer) {\n        cutoutCtx.drawImage(\n          imageBuffer,\n          (croppingBox.x / imageBox.width) * imageBuffer.width,\n          (croppingBox.y / imageBox.height) * imageBuffer.height,\n          (croppingBox.width / imageBox.width) * imageBuffer.width,\n          (croppingBox.height / imageBox.height) * imageBuffer.height,\n          0,\n          0,\n          cutoutCanvas.width,\n          cutoutCanvas.height,\n        );\n      }\n\n      const ctx = imageBuffer.getContext('2d');\n      if (ctx) {\n        ctx.clearRect(0, 0, imageBuffer.width, imageBuffer.height);\n        imageBuffer.width = cutoutCanvas.width;\n        imageBuffer.height = cutoutCanvas.height;\n        imageBuffer.style.width = `${croppingBox.width}px`;\n        imageBuffer.style.height = `${croppingBox.height}px`;\n        ctx.drawImage(cutoutCanvas, 0, 0);\n        resizeCropper();\n      }\n    }\n\n    useTakeScreenshot({\n      onBeforeScreenshot: hooks.useCallback(() => {\n        (dialog.el as HTMLElement).style.display = 'none';\n      }, []),\n      onScreenshot: hooks.useCallback(\n        (imageSource: HTMLVideoElement) => {\n          const context = imageBuffer.getContext('2d');\n          if (!context) {\n            throw new Error('Could not get canvas context');\n          }\n          imageBuffer.width = imageSource.videoWidth;\n          imageBuffer.height = imageSource.videoHeight;\n          imageBuffer.style.width = '100%';\n          imageBuffer.style.height = '100%';\n          context.drawImage(imageSource, 0, 0);\n        },\n        [imageBuffer],\n      ),\n      onAfterScreenshot: hooks.useCallback(() => {\n        (dialog.el as HTMLElement).style.display = 'block';\n        const container = canvasContainerRef.current;\n        container && container.appendChild(imageBuffer);\n        resizeCropper();\n      }, []),\n      onError: hooks.useCallback(error => {\n        (dialog.el as HTMLElement).style.display = 'block';\n        onError(error);\n      }, []),\n    });\n\n    return (\n      <div class=\"editor\">\n        <style nonce={options.styleNonce} dangerouslySetInnerHTML={styles} />\n        <div class=\"editor__canvas-container\" ref={canvasContainerRef}>\n          <div class=\"editor__crop-container\" style={{ position: 'absolute', zIndex: 1 }} ref={cropContainerRef}>\n            <canvas\n              onMouseDown={onDragStart}\n              style={{ position: 'absolute', cursor: confirmCrop ? 'move' : 'auto' }}\n              ref={croppingRef}\n            ></canvas>\n            <CropCorner\n              left={croppingRect.startX - CROP_BUTTON_BORDER}\n              top={croppingRect.startY - CROP_BUTTON_BORDER}\n              onGrabButton={onGrabButton}\n              corner=\"top-left\"\n            ></CropCorner>\n            <CropCorner\n              left={croppingRect.endX - CROP_BUTTON_SIZE + CROP_BUTTON_BORDER}\n              top={croppingRect.startY - CROP_BUTTON_BORDER}\n              onGrabButton={onGrabButton}\n              corner=\"top-right\"\n            ></CropCorner>\n            <CropCorner\n              left={croppingRect.startX - CROP_BUTTON_BORDER}\n              top={croppingRect.endY - CROP_BUTTON_SIZE + CROP_BUTTON_BORDER}\n              onGrabButton={onGrabButton}\n              corner=\"bottom-left\"\n            ></CropCorner>\n            <CropCorner\n              left={croppingRect.endX - CROP_BUTTON_SIZE + CROP_BUTTON_BORDER}\n              top={croppingRect.endY - CROP_BUTTON_SIZE + CROP_BUTTON_BORDER}\n              onGrabButton={onGrabButton}\n              corner=\"bottom-right\"\n            ></CropCorner>\n            <div\n              style={{\n                left: Math.max(0, croppingRect.endX - 191),\n                top: Math.max(0, croppingRect.endY + 8),\n                display: confirmCrop ? 'flex' : 'none',\n              }}\n              class=\"editor__crop-btn-group\"\n            >\n              <button\n                onClick={e => {\n                  e.preventDefault();\n                  if (croppingRef.current) {\n                    setCroppingRect({\n                      startX: 0,\n                      startY: 0,\n                      endX: croppingRef.current.width / DPI,\n                      endY: croppingRef.current.height / DPI,\n                    });\n                  }\n                  setConfirmCrop(false);\n                }}\n                class=\"btn btn--default\"\n              >\n                {options.cancelButtonLabel}\n              </button>\n              <button\n                onClick={e => {\n                  e.preventDefault();\n                  submit();\n                  setConfirmCrop(false);\n                }}\n                class=\"btn btn--primary\"\n              >\n                {options.confirmButtonLabel}\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  };\n}\n","import type * as Hooks from 'preact/hooks';\nimport { DOCUMENT, NAVIGATOR, WINDOW } from '../../constants';\n\ninterface FactoryParams {\n  hooks: typeof Hooks;\n}\n\ninterface Props {\n  onBeforeScreenshot: () => void;\n  onScreenshot: (imageSource: HTMLVideoElement) => void;\n  onAfterScreenshot: () => void;\n  onError: (error: Error) => void;\n}\n\ntype UseTakeScreenshot = ({ onBeforeScreenshot, onScreenshot, onAfterScreenshot, onError }: Props) => void;\n\nexport function useTakeScreenshotFactory({ hooks }: FactoryParams): UseTakeScreenshot {\n  return function useTakeScreenshot({ onBeforeScreenshot, onScreenshot, onAfterScreenshot, onError }: Props) {\n    hooks.useEffect(() => {\n      const takeScreenshot = async (): Promise<void> => {\n        onBeforeScreenshot();\n        const stream = await NAVIGATOR.mediaDevices.getDisplayMedia({\n          video: {\n            width: WINDOW.innerWidth * WINDOW.devicePixelRatio,\n            height: WINDOW.innerHeight * WINDOW.devicePixelRatio,\n          },\n          audio: false,\n          // @ts-expect-error experimental flags: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia#prefercurrenttab\n          monitorTypeSurfaces: 'exclude',\n          preferCurrentTab: true,\n          selfBrowserSurface: 'include',\n          surfaceSwitching: 'exclude',\n        });\n\n        const video = DOCUMENT.createElement('video');\n        await new Promise<void>((resolve, reject) => {\n          video.srcObject = stream;\n          video.onloadedmetadata = () => {\n            onScreenshot(video);\n            stream.getTracks().forEach(track => track.stop());\n            resolve();\n          };\n          video.play().catch(reject);\n        });\n        onAfterScreenshot();\n      };\n\n      takeScreenshot().catch(onError);\n    }, []);\n  };\n}\n","import type { VNode, h as hType } from 'preact';\n\ninterface FactoryParams {\n  h: typeof hType;\n}\n\nexport default function CropCornerFactory({\n  h, // eslint-disable-line @typescript-eslint/no-unused-vars\n}: FactoryParams) {\n  return function CropCorner({\n    top,\n    left,\n    corner,\n    onGrabButton,\n  }: {\n    top: number;\n    left: number;\n    corner: string;\n    onGrabButton: (e: Event, corner: string) => void;\n  }): VNode {\n    return (\n      <button\n        class={`editor__crop-corner editor__crop-corner--${corner} `}\n        style={{\n          top: top,\n          left: left,\n        }}\n        onMouseDown={e => {\n          e.preventDefault();\n          onGrabButton(e, corner);\n        }}\n        onClick={e => {\n          e.preventDefault();\n        }}\n      ></button>\n    );\n  };\n}\n","import type {\n  FeedbackInternalOptions,\n  FeedbackModalIntegration,\n  FeedbackScreenshotIntegration,\n  Integration,\n  IntegrationFn,\n} from '@sentry/core';\nimport { addIntegration, isBrowser, logger } from '@sentry/core';\nimport {\n  ADD_SCREENSHOT_LABEL,\n  CANCEL_BUTTON_LABEL,\n  CONFIRM_BUTTON_LABEL,\n  DOCUMENT,\n  EMAIL_LABEL,\n  EMAIL_PLACEHOLDER,\n  FORM_TITLE,\n  IS_REQUIRED_LABEL,\n  MESSAGE_LABEL,\n  MESSAGE_PLACEHOLDER,\n  NAME_LABEL,\n  NAME_PLACEHOLDER,\n  REMOVE_SCREENSHOT_LABEL,\n  SUBMIT_BUTTON_LABEL,\n  SUCCESS_MESSAGE_TEXT,\n  TRIGGER_LABEL,\n} from '../constants';\nimport { DEBUG_BUILD } from '../util/debug-build';\nimport { isScreenshotSupported } from '../util/isScreenshotSupported';\nimport { mergeOptions } from '../util/mergeOptions';\nimport type { ActorComponent } from './components/Actor';\nimport { Actor } from './components/Actor';\nimport { createMainStyles } from './createMainStyles';\nimport { sendFeedback } from './sendFeedback';\nimport type { OptionalFeedbackConfiguration, OverrideFeedbackConfiguration } from './types';\n\ntype Unsubscribe = () => void;\n\n/**\n * Allow users to capture user feedback and send it to Sentry.\n */\n\ntype BuilderOptions =\n  | {\n      lazyLoadIntegration?: never;\n      getModalIntegration: () => IntegrationFn;\n      getScreenshotIntegration: () => IntegrationFn;\n    }\n  | {\n      // The type here should be `keyof typeof LazyLoadableIntegrations`, but that'll cause a cicrular\n      // dependency with @sentry/core\n      lazyLoadIntegration: (\n        name: 'feedbackModalIntegration' | 'feedbackScreenshotIntegration',\n        scriptNonce?: string,\n      ) => Promise<IntegrationFn>;\n      getModalIntegration?: never;\n      getScreenshotIntegration?: never;\n    };\n\nexport const buildFeedbackIntegration = ({\n  lazyLoadIntegration,\n  getModalIntegration,\n  getScreenshotIntegration,\n}: BuilderOptions): IntegrationFn<\n  Integration & {\n    attachTo(el: Element | string, optionOverrides?: OverrideFeedbackConfiguration): Unsubscribe;\n    createForm(\n      optionOverrides?: OverrideFeedbackConfiguration,\n    ): Promise<ReturnType<FeedbackModalIntegration['createDialog']>>;\n    createWidget(optionOverrides?: OverrideFeedbackConfiguration): ActorComponent;\n    remove(): void;\n  }\n> => {\n  const feedbackIntegration = (({\n    // FeedbackGeneralConfiguration\n    id = 'sentry-feedback',\n    autoInject = true,\n    showBranding = true,\n    isEmailRequired = false,\n    isNameRequired = false,\n    showEmail = true,\n    showName = true,\n    enableScreenshot = true,\n    useSentryUser = {\n      email: 'email',\n      name: 'username',\n    },\n    tags,\n    styleNonce,\n    scriptNonce,\n\n    // FeedbackThemeConfiguration\n    colorScheme = 'system',\n    themeLight = {},\n    themeDark = {},\n\n    // FeedbackTextConfiguration\n    addScreenshotButtonLabel = ADD_SCREENSHOT_LABEL,\n    cancelButtonLabel = CANCEL_BUTTON_LABEL,\n    confirmButtonLabel = CONFIRM_BUTTON_LABEL,\n    emailLabel = EMAIL_LABEL,\n    emailPlaceholder = EMAIL_PLACEHOLDER,\n    formTitle = FORM_TITLE,\n    isRequiredLabel = IS_REQUIRED_LABEL,\n    messageLabel = MESSAGE_LABEL,\n    messagePlaceholder = MESSAGE_PLACEHOLDER,\n    nameLabel = NAME_LABEL,\n    namePlaceholder = NAME_PLACEHOLDER,\n    removeScreenshotButtonLabel = REMOVE_SCREENSHOT_LABEL,\n    submitButtonLabel = SUBMIT_BUTTON_LABEL,\n    successMessageText = SUCCESS_MESSAGE_TEXT,\n    triggerLabel = TRIGGER_LABEL,\n    triggerAriaLabel = '',\n\n    // FeedbackCallbacks\n    onFormOpen,\n    onFormClose,\n    onSubmitSuccess,\n    onSubmitError,\n    onFormSubmitted,\n  }: OptionalFeedbackConfiguration = {}) => {\n    const _options = {\n      id,\n      autoInject,\n      showBranding,\n      isEmailRequired,\n      isNameRequired,\n      showEmail,\n      showName,\n      enableScreenshot,\n      useSentryUser,\n      tags,\n      styleNonce,\n      scriptNonce,\n\n      colorScheme,\n      themeDark,\n      themeLight,\n\n      triggerLabel,\n      triggerAriaLabel,\n      cancelButtonLabel,\n      submitButtonLabel,\n      confirmButtonLabel,\n      formTitle,\n      emailLabel,\n      emailPlaceholder,\n      messageLabel,\n      messagePlaceholder,\n      nameLabel,\n      namePlaceholder,\n      successMessageText,\n      isRequiredLabel,\n      addScreenshotButtonLabel,\n      removeScreenshotButtonLabel,\n\n      onFormClose,\n      onFormOpen,\n      onSubmitError,\n      onSubmitSuccess,\n      onFormSubmitted,\n    };\n\n    let _shadow: ShadowRoot | null = null;\n    let _subscriptions: Unsubscribe[] = [];\n\n    /**\n     * Get the shadow root where we will append css\n     */\n    const _createShadow = (options: FeedbackInternalOptions): ShadowRoot => {\n      if (!_shadow) {\n        const host = DOCUMENT.createElement('div');\n        host.id = String(options.id);\n        DOCUMENT.body.appendChild(host);\n\n        _shadow = host.attachShadow({ mode: 'open' });\n        _shadow.appendChild(createMainStyles(options));\n      }\n      return _shadow as ShadowRoot;\n    };\n\n    const _loadAndRenderDialog = async (\n      options: FeedbackInternalOptions,\n    ): Promise<ReturnType<FeedbackModalIntegration['createDialog']>> => {\n      const screenshotRequired = options.enableScreenshot && isScreenshotSupported();\n\n      let modalIntegration: FeedbackModalIntegration;\n      let screenshotIntegration: FeedbackScreenshotIntegration | undefined;\n\n      try {\n        const modalIntegrationFn = getModalIntegration\n          ? getModalIntegration()\n          : await lazyLoadIntegration('feedbackModalIntegration', scriptNonce);\n        modalIntegration = modalIntegrationFn() as FeedbackModalIntegration;\n        addIntegration(modalIntegration);\n      } catch {\n        DEBUG_BUILD &&\n          logger.error(\n            '[Feedback] Error when trying to load feedback integrations. Try using `feedbackSyncIntegration` in your `Sentry.init`.',\n          );\n        throw new Error('[Feedback] Missing feedback modal integration!');\n      }\n\n      try {\n        const screenshotIntegrationFn = screenshotRequired\n          ? getScreenshotIntegration\n            ? getScreenshotIntegration()\n            : await lazyLoadIntegration('feedbackScreenshotIntegration', scriptNonce)\n          : undefined;\n\n        if (screenshotIntegrationFn) {\n          screenshotIntegration = screenshotIntegrationFn() as FeedbackScreenshotIntegration;\n          addIntegration(screenshotIntegration);\n        }\n      } catch {\n        DEBUG_BUILD &&\n          logger.error('[Feedback] Missing feedback screenshot integration. Proceeding without screenshots.');\n      }\n\n      const dialog = modalIntegration.createDialog({\n        options: {\n          ...options,\n          onFormClose: () => {\n            dialog && dialog.close();\n            options.onFormClose && options.onFormClose();\n          },\n          onFormSubmitted: () => {\n            dialog && dialog.close();\n            options.onFormSubmitted && options.onFormSubmitted();\n          },\n        },\n        screenshotIntegration,\n        sendFeedback,\n        shadow: _createShadow(options),\n      });\n\n      return dialog;\n    };\n\n    const _attachTo = (el: Element | string, optionOverrides: OverrideFeedbackConfiguration = {}): Unsubscribe => {\n      const mergedOptions = mergeOptions(_options, optionOverrides);\n\n      const targetEl =\n        typeof el === 'string' ? DOCUMENT.querySelector(el) : typeof el.addEventListener === 'function' ? el : null;\n\n      if (!targetEl) {\n        DEBUG_BUILD && logger.error('[Feedback] Unable to attach to target element');\n        throw new Error('Unable to attach to target element');\n      }\n\n      let dialog: ReturnType<FeedbackModalIntegration['createDialog']> | null = null;\n      const handleClick = async (): Promise<void> => {\n        if (!dialog) {\n          dialog = await _loadAndRenderDialog({\n            ...mergedOptions,\n            onFormSubmitted: () => {\n              dialog && dialog.removeFromDom();\n              mergedOptions.onFormSubmitted && mergedOptions.onFormSubmitted();\n            },\n          });\n        }\n        dialog.appendToDom();\n        dialog.open();\n      };\n      targetEl.addEventListener('click', handleClick);\n      const unsubscribe = (): void => {\n        _subscriptions = _subscriptions.filter(sub => sub !== unsubscribe);\n        dialog && dialog.removeFromDom();\n        dialog = null;\n        targetEl.removeEventListener('click', handleClick);\n      };\n      _subscriptions.push(unsubscribe);\n      return unsubscribe;\n    };\n\n    const _createActor = (optionOverrides: OverrideFeedbackConfiguration = {}): ActorComponent => {\n      const mergedOptions = mergeOptions(_options, optionOverrides);\n      const shadow = _createShadow(mergedOptions);\n      const actor = Actor({\n        triggerLabel: mergedOptions.triggerLabel,\n        triggerAriaLabel: mergedOptions.triggerAriaLabel,\n        shadow,\n        styleNonce,\n      });\n      _attachTo(actor.el, {\n        ...mergedOptions,\n        onFormOpen() {\n          actor.hide();\n        },\n        onFormClose() {\n          actor.show();\n        },\n        onFormSubmitted() {\n          actor.show();\n        },\n      });\n      return actor;\n    };\n\n    return {\n      name: 'Feedback',\n      setupOnce() {\n        if (!isBrowser() || !_options.autoInject) {\n          return;\n        }\n\n        if (DOCUMENT.readyState === 'loading') {\n          DOCUMENT.addEventListener('DOMContentLoaded', () => _createActor().appendToDom());\n        } else {\n          _createActor().appendToDom();\n        }\n      },\n\n      /**\n       * Adds click listener to the element to open a feedback dialog\n       *\n       * The returned function can be used to remove the click listener\n       */\n      attachTo: _attachTo,\n\n      /**\n       * Creates a new widget which is composed of a Button which triggers a Dialog.\n       * Accepts partial options to override any options passed to constructor.\n       */\n      createWidget(optionOverrides: OverrideFeedbackConfiguration = {}): ActorComponent {\n        const actor = _createActor(mergeOptions(_options, optionOverrides));\n        actor.appendToDom();\n        return actor;\n      },\n\n      /**\n       * Creates a new Form which you can\n       * Accepts partial options to override any options passed to constructor.\n       */\n      async createForm(\n        optionOverrides: OverrideFeedbackConfiguration = {},\n      ): Promise<ReturnType<FeedbackModalIntegration['createDialog']>> {\n        return _loadAndRenderDialog(mergeOptions(_options, optionOverrides));\n      },\n\n      /**\n       * Removes the Feedback integration (including host, shadow DOM, and all widgets)\n       */\n      remove(): void {\n        if (_shadow) {\n          _shadow.parentElement && _shadow.parentElement.remove();\n          _shadow = null;\n        }\n        // Remove any lingering subscriptions\n        _subscriptions.forEach(sub => sub());\n        _subscriptions = [];\n      },\n    };\n  }) satisfies IntegrationFn;\n\n  return feedbackIntegration;\n};\n","import { NAVIGATOR } from '../constants';\n\n/**\n * Mobile browsers do not support `mediaDevices.getDisplayMedia` even though they have the api implemented\n * Instead they return things like `NotAllowedError` when called.\n *\n * It's simpler for us to browser sniff first, and avoid loading the integration if we can.\n *\n * https://stackoverflow.com/a/58879212\n * https://stackoverflow.com/a/3540295\n *\n * `mediaDevices.getDisplayMedia` is also only supported in secure contexts, and return a `mediaDevices is not supported` error, so we should also avoid loading the integration if we can.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia\n */\nexport function isScreenshotSupported(): boolean {\n  if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(NAVIGATOR.userAgent)) {\n    return false;\n  }\n  /**\n   * User agent on iPads show as Macintosh, so we need extra checks\n   *\n   * https://forums.developer.apple.com/forums/thread/119186\n   * https://stackoverflow.com/questions/60482650/how-to-detect-ipad-useragent-on-safari-browser\n   */\n  if (/Macintosh/i.test(NAVIGATOR.userAgent) && NAVIGATOR.maxTouchPoints && NAVIGATOR.maxTouchPoints > 1) {\n    return false;\n  }\n  if (!isSecureContext) {\n    return false;\n  }\n  return true;\n}\n","import { DOCUMENT, TRIGGER_LABEL } from '../../constants';\nimport { createActorStyles } from './Actor.css';\nimport { FeedbackIcon } from './FeedbackIcon';\n\nexport interface ActorProps {\n  triggerLabel: string;\n  triggerAriaLabel: string;\n  shadow: ShadowRoot;\n  styleNonce?: string;\n}\n\nexport interface ActorComponent {\n  el: HTMLElement;\n\n  appendToDom: () => void;\n\n  removeFromDom: () => void;\n\n  show: () => void;\n\n  hide: () => void;\n}\n\n/**\n * The sentry-provided button to open the feedback modal\n */\nexport function Actor({ triggerLabel, triggerAriaLabel, shadow, styleNonce }: ActorProps): ActorComponent {\n  const el = DOCUMENT.createElement('button');\n  el.type = 'button';\n  el.className = 'widget__actor';\n  el.ariaHidden = 'false';\n  el.ariaLabel = triggerAriaLabel || triggerLabel || TRIGGER_LABEL;\n  el.appendChild(FeedbackIcon());\n  if (triggerLabel) {\n    const label = DOCUMENT.createElement('span');\n    label.appendChild(DOCUMENT.createTextNode(triggerLabel));\n    el.appendChild(label);\n  }\n\n  const style = createActorStyles(styleNonce);\n\n  return {\n    el,\n    appendToDom(): void {\n      shadow.appendChild(style);\n      shadow.appendChild(el);\n    },\n    removeFromDom(): void {\n      shadow.removeChild(el);\n      shadow.removeChild(style);\n    },\n    show(): void {\n      el.ariaHidden = 'false';\n    },\n    hide(): void {\n      el.ariaHidden = 'true';\n    },\n  };\n}\n","import { WINDOW } from '../../constants';\nimport { setAttributesNS } from '../../util/setAttributesNS';\n\nconst SIZE = 20;\nconst XMLNS = 'http://www.w3.org/2000/svg';\n\n/**\n * Feedback Icon\n */\nexport function FeedbackIcon(): SVGElement {\n  const createElementNS = <K extends keyof SVGElementTagNameMap>(tagName: K): SVGElementTagNameMap[K] =>\n    WINDOW.document.createElementNS(XMLNS, tagName);\n  const svg = setAttributesNS(createElementNS('svg'), {\n    width: `${SIZE}`,\n    height: `${SIZE}`,\n    viewBox: `0 0 ${SIZE} ${SIZE}`,\n    fill: 'var(--actor-color, var(--foreground))',\n  });\n\n  const g = setAttributesNS(createElementNS('g'), {\n    clipPath: 'url(#clip0_57_80)',\n  });\n\n  const path = setAttributesNS(createElementNS('path'), {\n    ['fill-rule']: 'evenodd',\n    ['clip-rule']: 'evenodd',\n    d: 'M15.6622 15H12.3997C12.2129 14.9959 12.031 14.9396 11.8747 14.8375L8.04965 12.2H7.49956V19.1C7.4875 19.3348 7.3888 19.5568 7.22256 19.723C7.05632 19.8892 6.83435 19.9879 6.59956 20H2.04956C1.80193 19.9968 1.56535 19.8969 1.39023 19.7218C1.21511 19.5467 1.1153 19.3101 1.11206 19.0625V12.2H0.949652C0.824431 12.2017 0.700142 12.1783 0.584123 12.1311C0.468104 12.084 0.362708 12.014 0.274155 11.9255C0.185602 11.8369 0.115689 11.7315 0.0685419 11.6155C0.0213952 11.4995 -0.00202913 11.3752 -0.00034808 11.25V3.75C-0.00900498 3.62067 0.0092504 3.49095 0.0532651 3.36904C0.0972798 3.24712 0.166097 3.13566 0.255372 3.04168C0.344646 2.94771 0.452437 2.87327 0.571937 2.82307C0.691437 2.77286 0.82005 2.74798 0.949652 2.75H8.04965L11.8747 0.1625C12.031 0.0603649 12.2129 0.00407221 12.3997 0H15.6622C15.9098 0.00323746 16.1464 0.103049 16.3215 0.278167C16.4966 0.453286 16.5964 0.689866 16.5997 0.9375V3.25269C17.3969 3.42959 18.1345 3.83026 18.7211 4.41679C19.5322 5.22788 19.9878 6.32796 19.9878 7.47502C19.9878 8.62209 19.5322 9.72217 18.7211 10.5333C18.1345 11.1198 17.3969 11.5205 16.5997 11.6974V14.0125C16.6047 14.1393 16.5842 14.2659 16.5395 14.3847C16.4948 14.5035 16.4268 14.6121 16.3394 14.7042C16.252 14.7962 16.147 14.8698 16.0307 14.9206C15.9144 14.9714 15.7891 14.9984 15.6622 15ZM1.89695 10.325H1.88715V4.625H8.33715C8.52423 4.62301 8.70666 4.56654 8.86215 4.4625L12.6872 1.875H14.7247V13.125H12.6872L8.86215 10.4875C8.70666 10.3835 8.52423 10.327 8.33715 10.325H2.20217C2.15205 10.3167 2.10102 10.3125 2.04956 10.3125C1.9981 10.3125 1.94708 10.3167 1.89695 10.325ZM2.98706 12.2V18.1625H5.66206V12.2H2.98706ZM16.5997 9.93612V5.01393C16.6536 5.02355 16.7072 5.03495 16.7605 5.04814C17.1202 5.13709 17.4556 5.30487 17.7425 5.53934C18.0293 5.77381 18.2605 6.06912 18.4192 6.40389C18.578 6.73866 18.6603 7.10452 18.6603 7.47502C18.6603 7.84552 18.578 8.21139 18.4192 8.54616C18.2605 8.88093 18.0293 9.17624 17.7425 9.41071C17.4556 9.64518 17.1202 9.81296 16.7605 9.90191C16.7072 9.91509 16.6536 9.9265 16.5997 9.93612Z',\n  });\n  svg.appendChild(g).appendChild(path);\n\n  const speakerDefs = createElementNS('defs');\n  const speakerClipPathDef = setAttributesNS(createElementNS('clipPath'), {\n    id: 'clip0_57_80',\n  });\n\n  const speakerRect = setAttributesNS(createElementNS('rect'), {\n    width: `${SIZE}`,\n    height: `${SIZE}`,\n    fill: 'white',\n  });\n\n  speakerClipPathDef.appendChild(speakerRect);\n  speakerDefs.appendChild(speakerClipPathDef);\n\n  svg.appendChild(speakerDefs).appendChild(speakerClipPathDef).appendChild(speakerRect);\n\n  return svg;\n}\n","import { DOCUMENT } from '../../constants';\n\n/**\n * Creates <style> element for widget actor (button that opens the dialog)\n */\nexport function createActorStyles(styleNonce?: string): HTMLStyleElement {\n  const style = DOCUMENT.createElement('style');\n  style.textContent = `\n.widget__actor {\n  position: fixed;\n  z-index: var(--z-index);\n  margin: var(--page-margin);\n  inset: var(--actor-inset);\n\n  display: flex;\n  align-items: center;\n  gap: 8px;\n  padding: 16px;\n\n  font-family: inherit;\n  font-size: var(--font-size);\n  font-weight: 600;\n  line-height: 1.14em;\n  text-decoration: none;\n\n  background: var(--actor-background, var(--background));\n  border-radius: var(--actor-border-radius, 1.7em/50%);\n  border: var(--actor-border, var(--border));\n  box-shadow: var(--actor-box-shadow, var(--box-shadow));\n  color: var(--actor-color, var(--foreground));\n  fill: var(--actor-color, var(--foreground));\n  cursor: pointer;\n  opacity: 1;\n  transition: transform 0.2s ease-in-out;\n  transform: translate(0, 0) scale(1);\n}\n.widget__actor[aria-hidden=\"true\"] {\n  opacity: 0;\n  pointer-events: none;\n  visibility: hidden;\n  transform: translate(0, 16px) scale(0.98);\n}\n\n.widget__actor:hover {\n  background: var(--actor-hover-background, var(--background));\n  filter: var(--interactive-filter);\n}\n\n.widget__actor svg {\n  width: 1.14em;\n  height: 1.14em;\n}\n\n@media (max-width: 600px) {\n  .widget__actor span {\n    display: none;\n  }\n}\n`;\n\n  if (styleNonce) {\n    style.setAttribute('nonce', styleNonce);\n  }\n\n  return style;\n}\n","import { getCurrentScope, getGlobalScope, getIsolationScope } from '@sentry/core';\nimport type { FeedbackFormData, FeedbackModalIntegration, IntegrationFn, User } from '@sentry/core';\nimport { h, render } from 'preact';\nimport * as hooks from 'preact/hooks';\nimport { DOCUMENT } from '../constants';\nimport { Dialog } from './components/Dialog';\nimport { createDialogStyles } from './components/Dialog.css';\n\nfunction getUser(): User | undefined {\n  const currentUser = getCurrentScope().getUser();\n  const isolationUser = getIsolationScope().getUser();\n  const globalUser = getGlobalScope().getUser();\n  if (currentUser && Object.keys(currentUser).length) {\n    return currentUser;\n  }\n  if (isolationUser && Object.keys(isolationUser).length) {\n    return isolationUser;\n  }\n  return globalUser;\n}\n\nexport const feedbackModalIntegration = ((): FeedbackModalIntegration => {\n  return {\n    name: 'FeedbackModal',\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    setupOnce() {},\n    createDialog: ({ options, screenshotIntegration, sendFeedback, shadow }) => {\n      const shadowRoot = shadow as unknown as ShadowRoot;\n      const userKey = options.useSentryUser;\n      const user = getUser();\n\n      const el = DOCUMENT.createElement('div');\n      const style = createDialogStyles(options.styleNonce);\n\n      let originalOverflow = '';\n      const dialog: ReturnType<FeedbackModalIntegration['createDialog']> = {\n        get el() {\n          return el;\n        },\n        appendToDom(): void {\n          if (!shadowRoot.contains(style) && !shadowRoot.contains(el)) {\n            shadowRoot.appendChild(style);\n            shadowRoot.appendChild(el);\n          }\n        },\n        removeFromDom(): void {\n          shadowRoot.removeChild(el);\n          shadowRoot.removeChild(style);\n          DOCUMENT.body.style.overflow = originalOverflow;\n        },\n        open() {\n          renderContent(true);\n          options.onFormOpen && options.onFormOpen();\n          originalOverflow = DOCUMENT.body.style.overflow;\n          DOCUMENT.body.style.overflow = 'hidden';\n        },\n        close() {\n          renderContent(false);\n          DOCUMENT.body.style.overflow = originalOverflow;\n        },\n      };\n\n      const screenshotInput = screenshotIntegration && screenshotIntegration.createInput({ h, hooks, dialog, options });\n\n      const renderContent = (open: boolean): void => {\n        render(\n          <Dialog\n            options={options}\n            screenshotInput={screenshotInput}\n            showName={options.showName || options.isNameRequired}\n            showEmail={options.showEmail || options.isEmailRequired}\n            defaultName={(userKey && user && user[userKey.name]) || ''}\n            defaultEmail={(userKey && user && user[userKey.email]) || ''}\n            onFormClose={() => {\n              renderContent(false);\n              options.onFormClose && options.onFormClose();\n            }}\n            onSubmit={sendFeedback}\n            onSubmitSuccess={(data: FeedbackFormData) => {\n              renderContent(false);\n              options.onSubmitSuccess && options.onSubmitSuccess(data);\n            }}\n            onSubmitError={(error: Error) => {\n              options.onSubmitError && options.onSubmitError(error);\n            }}\n            onFormSubmitted={() => {\n              options.onFormSubmitted && options.onFormSubmitted();\n            }}\n            open={open}\n          />,\n          el,\n        );\n      };\n\n      return dialog;\n    },\n  };\n}) satisfies IntegrationFn;\n","import { DOCUMENT } from '../../constants';\n\nconst DIALOG = `\n.dialog {\n  position: fixed;\n  z-index: var(--z-index);\n  margin: 0;\n  inset: 0;\n\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 0;\n  height: 100vh;\n  width: 100vw;\n\n  color: var(--dialog-color, var(--foreground));\n  fill: var(--dialog-color, var(--foreground));\n  line-height: 1.75em;\n\n  background-color: rgba(0, 0, 0, 0.05);\n  border: none;\n  inset: 0;\n  opacity: 1;\n  transition: opacity 0.2s ease-in-out;\n}\n\n.dialog__position {\n  position: fixed;\n  z-index: var(--z-index);\n  inset: var(--dialog-inset);\n  padding: var(--page-margin);\n  display: flex;\n  max-height: calc(100vh - (2 * var(--page-margin)));\n}\n@media (max-width: 600px) {\n  .dialog__position {\n    inset: var(--page-margin);\n    padding: 0;\n  }\n}\n\n.dialog__position:has(.editor) {\n  inset: var(--page-margin);\n  padding: 0;\n}\n\n.dialog:not([open]) {\n  opacity: 0;\n  pointer-events: none;\n  visibility: hidden;\n}\n.dialog:not([open]) .dialog__content {\n  transform: translate(0, -16px) scale(0.98);\n}\n\n.dialog__content {\n  display: flex;\n  flex-direction: column;\n  gap: 16px;\n  padding: var(--dialog-padding, 24px);\n  max-width: 100%;\n  width: 100%;\n  max-height: 100%;\n  overflow: auto;\n\n  background: var(--dialog-background, var(--background));\n  border-radius: var(--dialog-border-radius, 20px);\n  border: var(--dialog-border, var(--border));\n  box-shadow: var(--dialog-box-shadow, var(--box-shadow));\n  transform: translate(0, 0) scale(1);\n  transition: transform 0.2s ease-in-out;\n}\n\n`;\n\nconst DIALOG_HEADER = `\n.dialog__header {\n  display: flex;\n  gap: 4px;\n  justify-content: space-between;\n  font-weight: var(--dialog-header-weight, 600);\n  margin: 0;\n}\n.dialog__title {\n  align-self: center;\n  width: var(--form-width, 272px);\n}\n\n@media (max-width: 600px) {\n  .dialog__title {\n    width: auto;\n  }\n}\n\n.dialog__position:has(.editor) .dialog__title {\n  width: auto;\n}\n\n\n.brand-link {\n  display: inline-flex;\n}\n.brand-link:focus-visible {\n  outline: var(--outline);\n}\n`;\n\nconst FORM = `\n.form {\n  display: flex;\n  overflow: auto;\n  flex-direction: row;\n  gap: 16px;\n  flex: 1 0;\n}\n\n.form__right {\n  flex: 0 0 auto;\n  display: flex;\n  overflow: auto;\n  flex-direction: column;\n  justify-content: space-between;\n  gap: 20px;\n  width: var(--form-width, 100%);\n}\n\n.dialog__position:has(.editor) .form__right {\n  width: var(--form-width, 272px);\n}\n\n.form__top {\n  display: flex;\n  flex-direction: column;\n  gap: 8px;\n}\n\n.form__error-container {\n  color: var(--error-color);\n  fill: var(--error-color);\n}\n\n.form__label {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  margin: 0px;\n}\n\n.form__label__text {\n  display: flex;\n  gap: 4px;\n  align-items: center;\n}\n\n.form__label__text--required {\n  font-size: 0.85em;\n}\n\n.form__input {\n  font-family: inherit;\n  line-height: inherit;\n  background: transparent;\n  box-sizing: border-box;\n  border: var(--input-border, var(--border));\n  border-radius: var(--input-border-radius, 6px);\n  color: var(--input-color, inherit);\n  fill: var(--input-color, inherit);\n  font-size: var(--input-font-size, inherit);\n  font-weight: var(--input-font-weight, 500);\n  padding: 6px 12px;\n}\n\n.form__input::placeholder {\n  opacity: 0.65;\n  color: var(--input-placeholder-color, inherit);\n  filter: var(--interactive-filter);\n}\n\n.form__input:focus-visible {\n  outline: var(--input-focus-outline, var(--outline));\n}\n\n.form__input--textarea {\n  font-family: inherit;\n  resize: vertical;\n}\n\n.error {\n  color: var(--error-color);\n  fill: var(--error-color);\n}\n`;\n\nconst BUTTON = `\n.btn-group {\n  display: grid;\n  gap: 8px;\n}\n\n.btn {\n  line-height: inherit;\n  border: var(--button-border, var(--border));\n  border-radius: var(--button-border-radius, 6px);\n  cursor: pointer;\n  font-family: inherit;\n  font-size: var(--button-font-size, inherit);\n  font-weight: var(--button-font-weight, 600);\n  padding: var(--button-padding, 6px 16px);\n}\n.btn[disabled] {\n  opacity: 0.6;\n  pointer-events: none;\n}\n\n.btn--primary {\n  color: var(--button-primary-color, var(--accent-foreground));\n  fill: var(--button-primary-color, var(--accent-foreground));\n  background: var(--button-primary-background, var(--accent-background));\n  border: var(--button-primary-border, var(--border));\n  border-radius: var(--button-primary-border-radius, 6px);\n  font-weight: var(--button-primary-font-weight, 500);\n}\n.btn--primary:hover {\n  color: var(--button-primary-hover-color, var(--accent-foreground));\n  fill: var(--button-primary-hover-color, var(--accent-foreground));\n  background: var(--button-primary-hover-background, var(--accent-background));\n  filter: var(--interactive-filter);\n}\n.btn--primary:focus-visible {\n  background: var(--button-primary-hover-background, var(--accent-background));\n  filter: var(--interactive-filter);\n  outline: var(--button-primary-focus-outline, var(--outline));\n}\n\n.btn--default {\n  color: var(--button-color, var(--foreground));\n  fill: var(--button-color, var(--foreground));\n  background: var(--button-background, var(--background));\n  border: var(--button-border, var(--border));\n  border-radius: var(--button-border-radius, 6px);\n  font-weight: var(--button-font-weight, 500);\n}\n.btn--default:hover {\n  color: var(--button-color, var(--foreground));\n  fill: var(--button-color, var(--foreground));\n  background: var(--button-hover-background, var(--background));\n  filter: var(--interactive-filter);\n}\n.btn--default:focus-visible {\n  background: var(--button-hover-background, var(--background));\n  filter: var(--interactive-filter);\n  outline: var(--button-focus-outline, var(--outline));\n}\n`;\n\nconst SUCCESS = `\n.success__position {\n  position: fixed;\n  inset: var(--dialog-inset);\n  padding: var(--page-margin);\n  z-index: var(--z-index);\n}\n.success__content {\n  background: var(--success-background, var(--background));\n  border: var(--success-border, var(--border));\n  border-radius: var(--success-border-radius, 1.7em/50%);\n  box-shadow: var(--success-box-shadow, var(--box-shadow));\n  font-weight: var(--success-font-weight, 600);\n  color: var(--success-color);\n  fill: var(--success-color);\n  padding: 12px 24px;\n  line-height: 1.75em;\n\n  display: grid;\n  align-items: center;\n  grid-auto-flow: column;\n  gap: 6px;\n  cursor: default;\n}\n\n.success__icon {\n  display: flex;\n}\n`;\n\n/**\n * Creates <style> element for widget dialog\n */\nexport function createDialogStyles(styleNonce?: string): HTMLStyleElement {\n  const style = DOCUMENT.createElement('style');\n\n  style.textContent = `\n:host {\n  --dialog-inset: var(--inset);\n}\n\n${DIALOG}\n${DIALOG_HEADER}\n${FORM}\n${BUTTON}\n${SUCCESS}\n`;\n\n  if (styleNonce) {\n    style.setAttribute('nonce', styleNonce);\n  }\n\n  return style;\n}\n","import type { FeedbackScreenshotIntegration, IntegrationFn } from '@sentry/core';\nimport type { Attachment } from '@sentry/core';\nimport type { h as hType } from 'preact';\nimport type * as Hooks from 'preact/hooks';\nimport { DOCUMENT } from '../constants';\nimport { ScreenshotEditorFactory } from './components/ScreenshotEditor';\n\nexport const feedbackScreenshotIntegration = ((): FeedbackScreenshotIntegration => {\n  return {\n    name: 'FeedbackScreenshot',\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    setupOnce() {},\n    createInput: ({ h, hooks, dialog, options }) => {\n      const imageBuffer = DOCUMENT.createElement('canvas');\n\n      return {\n        input: ScreenshotEditorFactory({\n          h: h as typeof hType,\n          hooks: hooks as typeof Hooks,\n          imageBuffer,\n          dialog,\n          options,\n        }) as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n\n        value: async () => {\n          const blob = await new Promise<Parameters<BlobCallback>[0]>(resolve => {\n            imageBuffer.toBlob(resolve, 'image/png');\n          });\n          if (blob) {\n            const data = new Uint8Array(await blob.arrayBuffer());\n            const attachment: Attachment = {\n              data,\n              filename: 'screenshot.png',\n              contentType: 'application/png',\n              // attachmentType?: string;\n            };\n            return attachment;\n          }\n          return undefined;\n        },\n      };\n    },\n  };\n}) satisfies IntegrationFn;\n","import { getClient } from '@sentry/core';\nimport type { buildFeedbackIntegration } from './integration';\n\ntype FeedbackIntegration = ReturnType<typeof buildFeedbackIntegration>;\n\n/**\n * This is a small utility to get a type-safe instance of the Feedback integration.\n */\nexport function getFeedback(): ReturnType<FeedbackIntegration> | undefined {\n  const client = getClient();\n  return client && client.getIntegrationByName<ReturnType<FeedbackIntegration>>('Feedback');\n}\n","var NodeType;\r\n(function (NodeType) {\r\n    NodeType[NodeType[\"Document\"] = 0] = \"Document\";\r\n    NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\r\n    NodeType[NodeType[\"Element\"] = 2] = \"Element\";\r\n    NodeType[NodeType[\"Text\"] = 3] = \"Text\";\r\n    NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\r\n    NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\r\n})(NodeType || (NodeType = {}));\n\nfunction isElement(n) {\r\n    return n.nodeType === n.ELEMENT_NODE;\r\n}\r\nfunction isShadowRoot(n) {\r\n    const host = n?.host;\r\n    return Boolean(host?.shadowRoot === n);\r\n}\r\nfunction isNativeShadowDom(shadowRoot) {\r\n    return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]';\r\n}\r\nfunction fixBrowserCompatibilityIssuesInCSS(cssText) {\r\n    if (cssText.includes(' background-clip: text;') &&\r\n        !cssText.includes(' -webkit-background-clip: text;')) {\r\n        cssText = cssText.replace(/\\sbackground-clip:\\s*text;/g, ' -webkit-background-clip: text; background-clip: text;');\r\n    }\r\n    return cssText;\r\n}\r\nfunction escapeImportStatement(rule) {\r\n    const { cssText } = rule;\r\n    if (cssText.split('\"').length < 3)\r\n        return cssText;\r\n    const statement = ['@import', `url(${JSON.stringify(rule.href)})`];\r\n    if (rule.layerName === '') {\r\n        statement.push(`layer`);\r\n    }\r\n    else if (rule.layerName) {\r\n        statement.push(`layer(${rule.layerName})`);\r\n    }\r\n    if (rule.supportsText) {\r\n        statement.push(`supports(${rule.supportsText})`);\r\n    }\r\n    if (rule.media.length) {\r\n        statement.push(rule.media.mediaText);\r\n    }\r\n    return statement.join(' ') + ';';\r\n}\r\nfunction stringifyStylesheet(s) {\r\n    try {\r\n        const rules = s.rules || s.cssRules;\r\n        return rules\r\n            ? fixBrowserCompatibilityIssuesInCSS(Array.from(rules, stringifyRule).join(''))\r\n            : null;\r\n    }\r\n    catch (error) {\r\n        return null;\r\n    }\r\n}\r\nfunction fixAllCssProperty(rule) {\r\n    let styles = '';\r\n    for (let i = 0; i < rule.style.length; i++) {\r\n        const styleDeclaration = rule.style;\r\n        const attribute = styleDeclaration[i];\r\n        const isImportant = styleDeclaration.getPropertyPriority(attribute);\r\n        styles += `${attribute}:${styleDeclaration.getPropertyValue(attribute)}${isImportant ? ` !important` : ''};`;\r\n    }\r\n    return `${rule.selectorText} { ${styles} }`;\r\n}\r\nfunction stringifyRule(rule) {\r\n    let importStringified;\r\n    if (isCSSImportRule(rule)) {\r\n        try {\r\n            importStringified =\r\n                stringifyStylesheet(rule.styleSheet) ||\r\n                    escapeImportStatement(rule);\r\n        }\r\n        catch (error) {\r\n        }\r\n    }\r\n    else if (isCSSStyleRule(rule)) {\r\n        let cssText = rule.cssText;\r\n        const needsSafariColonFix = rule.selectorText.includes(':');\r\n        const needsAllFix = typeof rule.style['all'] === 'string' && rule.style['all'];\r\n        if (needsAllFix) {\r\n            cssText = fixAllCssProperty(rule);\r\n        }\r\n        if (needsSafariColonFix) {\r\n            cssText = fixSafariColons(cssText);\r\n        }\r\n        if (needsSafariColonFix || needsAllFix) {\r\n            return cssText;\r\n        }\r\n    }\r\n    return importStringified || rule.cssText;\r\n}\r\nfunction fixSafariColons(cssStringified) {\r\n    const regex = /(\\[(?:[\\w-]+)[^\\\\])(:(?:[\\w-]+)\\])/gm;\r\n    return cssStringified.replace(regex, '$1\\\\$2');\r\n}\r\nfunction isCSSImportRule(rule) {\r\n    return 'styleSheet' in rule;\r\n}\r\nfunction isCSSStyleRule(rule) {\r\n    return 'selectorText' in rule;\r\n}\r\nclass Mirror {\r\n    constructor() {\r\n        this.idNodeMap = new Map();\r\n        this.nodeMetaMap = new WeakMap();\r\n    }\r\n    getId(n) {\r\n        if (!n)\r\n            return -1;\r\n        const id = this.getMeta(n)?.id;\r\n        return id ?? -1;\r\n    }\r\n    getNode(id) {\r\n        return this.idNodeMap.get(id) || null;\r\n    }\r\n    getIds() {\r\n        return Array.from(this.idNodeMap.keys());\r\n    }\r\n    getMeta(n) {\r\n        return this.nodeMetaMap.get(n) || null;\r\n    }\r\n    removeNodeFromMap(n) {\r\n        const id = this.getId(n);\r\n        this.idNodeMap.delete(id);\r\n        if (n.childNodes) {\r\n            n.childNodes.forEach((childNode) => this.removeNodeFromMap(childNode));\r\n        }\r\n    }\r\n    has(id) {\r\n        return this.idNodeMap.has(id);\r\n    }\r\n    hasNode(node) {\r\n        return this.nodeMetaMap.has(node);\r\n    }\r\n    add(n, meta) {\r\n        const id = meta.id;\r\n        this.idNodeMap.set(id, n);\r\n        this.nodeMetaMap.set(n, meta);\r\n    }\r\n    replace(id, n) {\r\n        const oldNode = this.getNode(id);\r\n        if (oldNode) {\r\n            const meta = this.nodeMetaMap.get(oldNode);\r\n            if (meta)\r\n                this.nodeMetaMap.set(n, meta);\r\n        }\r\n        this.idNodeMap.set(id, n);\r\n    }\r\n    reset() {\r\n        this.idNodeMap = new Map();\r\n        this.nodeMetaMap = new WeakMap();\r\n    }\r\n}\r\nfunction createMirror() {\r\n    return new Mirror();\r\n}\r\nfunction shouldMaskInput({ maskInputOptions, tagName, type, }) {\r\n    if (tagName === 'OPTION') {\r\n        tagName = 'SELECT';\r\n    }\r\n    return Boolean(maskInputOptions[tagName.toLowerCase()] ||\r\n        (type && maskInputOptions[type]) ||\r\n        type === 'password' ||\r\n        (tagName === 'INPUT' && !type && maskInputOptions['text']));\r\n}\r\nfunction maskInputValue({ isMasked, element, value, maskInputFn, }) {\r\n    let text = value || '';\r\n    if (!isMasked) {\r\n        return text;\r\n    }\r\n    if (maskInputFn) {\r\n        text = maskInputFn(text, element);\r\n    }\r\n    return '*'.repeat(text.length);\r\n}\r\nfunction toLowerCase(str) {\r\n    return str.toLowerCase();\r\n}\r\nfunction toUpperCase(str) {\r\n    return str.toUpperCase();\r\n}\r\nconst ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\r\nfunction is2DCanvasBlank(canvas) {\r\n    const ctx = canvas.getContext('2d');\r\n    if (!ctx)\r\n        return true;\r\n    const chunkSize = 50;\r\n    for (let x = 0; x < canvas.width; x += chunkSize) {\r\n        for (let y = 0; y < canvas.height; y += chunkSize) {\r\n            const getImageData = ctx.getImageData;\r\n            const originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData\r\n                ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\r\n                : getImageData;\r\n            const pixelBuffer = new Uint32Array(originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer);\r\n            if (pixelBuffer.some((pixel) => pixel !== 0))\r\n                return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\nfunction isNodeMetaEqual(a, b) {\r\n    if (!a || !b || a.type !== b.type)\r\n        return false;\r\n    if (a.type === NodeType.Document)\r\n        return a.compatMode === b.compatMode;\r\n    else if (a.type === NodeType.DocumentType)\r\n        return (a.name === b.name &&\r\n            a.publicId === b.publicId &&\r\n            a.systemId === b.systemId);\r\n    else if (a.type === NodeType.Comment ||\r\n        a.type === NodeType.Text ||\r\n        a.type === NodeType.CDATA)\r\n        return a.textContent === b.textContent;\r\n    else if (a.type === NodeType.Element)\r\n        return (a.tagName === b.tagName &&\r\n            JSON.stringify(a.attributes) ===\r\n                JSON.stringify(b.attributes) &&\r\n            a.isSVG === b.isSVG &&\r\n            a.needBlock === b.needBlock);\r\n    return false;\r\n}\r\nfunction getInputType(element) {\r\n    const type = element.type;\r\n    return element.hasAttribute('data-rr-is-password')\r\n        ? 'password'\r\n        : type\r\n            ?\r\n                toLowerCase(type)\r\n            : null;\r\n}\r\nfunction getInputValue(el, tagName, type) {\r\n    if (tagName === 'INPUT' && (type === 'radio' || type === 'checkbox')) {\r\n        return el.getAttribute('value') || '';\r\n    }\r\n    return el.value;\r\n}\r\nfunction extractFileExtension(path, baseURL) {\r\n    let url;\r\n    try {\r\n        url = new URL(path, baseURL ?? window.location.href);\r\n    }\r\n    catch (err) {\r\n        return null;\r\n    }\r\n    const regex = /\\.([0-9a-z]+)(?:$)/i;\r\n    const match = url.pathname.match(regex);\r\n    return match?.[1] ?? null;\r\n}\r\nconst cachedImplementations = {};\r\nfunction getImplementation(name) {\r\n    const cached = cachedImplementations[name];\r\n    if (cached) {\r\n        return cached;\r\n    }\r\n    const document = window.document;\r\n    let impl = window[name];\r\n    if (document && typeof document.createElement === 'function') {\r\n        try {\r\n            const sandbox = document.createElement('iframe');\r\n            sandbox.hidden = true;\r\n            document.head.appendChild(sandbox);\r\n            const contentWindow = sandbox.contentWindow;\r\n            if (contentWindow && contentWindow[name]) {\r\n                impl =\r\n                    contentWindow[name];\r\n            }\r\n            document.head.removeChild(sandbox);\r\n        }\r\n        catch (e) {\r\n        }\r\n    }\r\n    return (cachedImplementations[name] = impl.bind(window));\r\n}\r\nfunction setTimeout(...rest) {\r\n    return getImplementation('setTimeout')(...rest);\r\n}\r\nfunction clearTimeout(...rest) {\r\n    return getImplementation('clearTimeout')(...rest);\r\n}\r\nfunction getIframeContentDocument(iframe) {\r\n    try {\r\n        return iframe.contentDocument;\r\n    }\r\n    catch (e) {\r\n    }\r\n}\n\nlet _id = 1;\r\nconst tagNameRegex = new RegExp('[^a-z0-9-_:]');\r\nconst IGNORED_NODE = -2;\r\nfunction genId() {\r\n    return _id++;\r\n}\r\nfunction getValidTagName(element) {\r\n    if (element instanceof HTMLFormElement) {\r\n        return 'form';\r\n    }\r\n    const processedTagName = toLowerCase(element.tagName);\r\n    if (tagNameRegex.test(processedTagName)) {\r\n        return 'div';\r\n    }\r\n    return processedTagName;\r\n}\r\nfunction extractOrigin(url) {\r\n    let origin = '';\r\n    if (url.indexOf('//') > -1) {\r\n        origin = url.split('/').slice(0, 3).join('/');\r\n    }\r\n    else {\r\n        origin = url.split('/')[0];\r\n    }\r\n    origin = origin.split('?')[0];\r\n    return origin;\r\n}\r\nlet canvasService;\r\nlet canvasCtx;\r\nconst URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\r\nconst URL_PROTOCOL_MATCH = /^(?:[a-z+]+:)?\\/\\//i;\r\nconst URL_WWW_MATCH = /^www\\..*/i;\r\nconst DATA_URI = /^(data:)([^,]*),(.*)/i;\r\nfunction absoluteToStylesheet(cssText, href) {\r\n    return (cssText || '').replace(URL_IN_CSS_REF, (origin, quote1, path1, quote2, path2, path3) => {\r\n        const filePath = path1 || path2 || path3;\r\n        const maybeQuote = quote1 || quote2 || '';\r\n        if (!filePath) {\r\n            return origin;\r\n        }\r\n        if (URL_PROTOCOL_MATCH.test(filePath) || URL_WWW_MATCH.test(filePath)) {\r\n            return `url(${maybeQuote}${filePath}${maybeQuote})`;\r\n        }\r\n        if (DATA_URI.test(filePath)) {\r\n            return `url(${maybeQuote}${filePath}${maybeQuote})`;\r\n        }\r\n        if (filePath[0] === '/') {\r\n            return `url(${maybeQuote}${extractOrigin(href) + filePath}${maybeQuote})`;\r\n        }\r\n        const stack = href.split('/');\r\n        const parts = filePath.split('/');\r\n        stack.pop();\r\n        for (const part of parts) {\r\n            if (part === '.') {\r\n                continue;\r\n            }\r\n            else if (part === '..') {\r\n                stack.pop();\r\n            }\r\n            else {\r\n                stack.push(part);\r\n            }\r\n        }\r\n        return `url(${maybeQuote}${stack.join('/')}${maybeQuote})`;\r\n    });\r\n}\r\nconst SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/;\r\nconst SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\r\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\r\n    if (attributeValue.trim() === '') {\r\n        return attributeValue;\r\n    }\r\n    let pos = 0;\r\n    function collectCharacters(regEx) {\r\n        let chars;\r\n        const match = regEx.exec(attributeValue.substring(pos));\r\n        if (match) {\r\n            chars = match[0];\r\n            pos += chars.length;\r\n            return chars;\r\n        }\r\n        return '';\r\n    }\r\n    const output = [];\r\n    while (true) {\r\n        collectCharacters(SRCSET_COMMAS_OR_SPACES);\r\n        if (pos >= attributeValue.length) {\r\n            break;\r\n        }\r\n        let url = collectCharacters(SRCSET_NOT_SPACES);\r\n        if (url.slice(-1) === ',') {\r\n            url = absoluteToDoc(doc, url.substring(0, url.length - 1));\r\n            output.push(url);\r\n        }\r\n        else {\r\n            let descriptorsStr = '';\r\n            url = absoluteToDoc(doc, url);\r\n            let inParens = false;\r\n            while (true) {\r\n                const c = attributeValue.charAt(pos);\r\n                if (c === '') {\r\n                    output.push((url + descriptorsStr).trim());\r\n                    break;\r\n                }\r\n                else if (!inParens) {\r\n                    if (c === ',') {\r\n                        pos += 1;\r\n                        output.push((url + descriptorsStr).trim());\r\n                        break;\r\n                    }\r\n                    else if (c === '(') {\r\n                        inParens = true;\r\n                    }\r\n                }\r\n                else {\r\n                    if (c === ')') {\r\n                        inParens = false;\r\n                    }\r\n                }\r\n                descriptorsStr += c;\r\n                pos += 1;\r\n            }\r\n        }\r\n    }\r\n    return output.join(', ');\r\n}\r\nconst cachedDocument = new WeakMap();\r\nfunction absoluteToDoc(doc, attributeValue) {\r\n    if (!attributeValue || attributeValue.trim() === '') {\r\n        return attributeValue;\r\n    }\r\n    return getHref(doc, attributeValue);\r\n}\r\nfunction isSVGElement(el) {\r\n    return Boolean(el.tagName === 'svg' || el.ownerSVGElement);\r\n}\r\nfunction getHref(doc, customHref) {\r\n    let a = cachedDocument.get(doc);\r\n    if (!a) {\r\n        a = doc.createElement('a');\r\n        cachedDocument.set(doc, a);\r\n    }\r\n    if (!customHref) {\r\n        customHref = '';\r\n    }\r\n    else if (customHref.startsWith('blob:') || customHref.startsWith('data:')) {\r\n        return customHref;\r\n    }\r\n    a.setAttribute('href', customHref);\r\n    return a.href;\r\n}\r\nfunction transformAttribute(doc, tagName, name, value, element, maskAttributeFn) {\r\n    if (!value) {\r\n        return value;\r\n    }\r\n    if (name === 'src' ||\r\n        (name === 'href' && !(tagName === 'use' && value[0] === '#'))) {\r\n        return absoluteToDoc(doc, value);\r\n    }\r\n    else if (name === 'xlink:href' && value[0] !== '#') {\r\n        return absoluteToDoc(doc, value);\r\n    }\r\n    else if (name === 'background' &&\r\n        (tagName === 'table' || tagName === 'td' || tagName === 'th')) {\r\n        return absoluteToDoc(doc, value);\r\n    }\r\n    else if (name === 'srcset') {\r\n        return getAbsoluteSrcsetString(doc, value);\r\n    }\r\n    else if (name === 'style') {\r\n        return absoluteToStylesheet(value, getHref(doc));\r\n    }\r\n    else if (tagName === 'object' && name === 'data') {\r\n        return absoluteToDoc(doc, value);\r\n    }\r\n    if (typeof maskAttributeFn === 'function') {\r\n        return maskAttributeFn(name, value, element);\r\n    }\r\n    return value;\r\n}\r\nfunction ignoreAttribute(tagName, name, _value) {\r\n    return (tagName === 'video' || tagName === 'audio') && name === 'autoplay';\r\n}\r\nfunction _isBlockedElement(element, blockClass, blockSelector, unblockSelector) {\r\n    try {\r\n        if (unblockSelector && element.matches(unblockSelector)) {\r\n            return false;\r\n        }\r\n        if (typeof blockClass === 'string') {\r\n            if (element.classList.contains(blockClass)) {\r\n                return true;\r\n            }\r\n        }\r\n        else {\r\n            for (let eIndex = element.classList.length; eIndex--;) {\r\n                const className = element.classList[eIndex];\r\n                if (blockClass.test(className)) {\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n        if (blockSelector) {\r\n            return element.matches(blockSelector);\r\n        }\r\n    }\r\n    catch (e) {\r\n    }\r\n    return false;\r\n}\r\nfunction elementClassMatchesRegex(el, regex) {\r\n    for (let eIndex = el.classList.length; eIndex--;) {\r\n        const className = el.classList[eIndex];\r\n        if (regex.test(className)) {\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\nfunction distanceToMatch(node, matchPredicate, limit = Infinity, distance = 0) {\r\n    if (!node)\r\n        return -1;\r\n    if (node.nodeType !== node.ELEMENT_NODE)\r\n        return -1;\r\n    if (distance > limit)\r\n        return -1;\r\n    if (matchPredicate(node))\r\n        return distance;\r\n    return distanceToMatch(node.parentNode, matchPredicate, limit, distance + 1);\r\n}\r\nfunction createMatchPredicate(className, selector) {\r\n    return (node) => {\r\n        const el = node;\r\n        if (el === null)\r\n            return false;\r\n        try {\r\n            if (className) {\r\n                if (typeof className === 'string') {\r\n                    if (el.matches(`.${className}`))\r\n                        return true;\r\n                }\r\n                else if (elementClassMatchesRegex(el, className)) {\r\n                    return true;\r\n                }\r\n            }\r\n            if (selector && el.matches(selector))\r\n                return true;\r\n            return false;\r\n        }\r\n        catch {\r\n            return false;\r\n        }\r\n    };\r\n}\r\nfunction needMaskingText(node, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, maskAllText) {\r\n    try {\r\n        const el = node.nodeType === node.ELEMENT_NODE\r\n            ? node\r\n            : node.parentElement;\r\n        if (el === null)\r\n            return false;\r\n        if (el.tagName === 'INPUT') {\r\n            const autocomplete = el.getAttribute('autocomplete');\r\n            const disallowedAutocompleteValues = [\r\n                'current-password',\r\n                'new-password',\r\n                'cc-number',\r\n                'cc-exp',\r\n                'cc-exp-month',\r\n                'cc-exp-year',\r\n                'cc-csc',\r\n            ];\r\n            if (disallowedAutocompleteValues.includes(autocomplete)) {\r\n                return true;\r\n            }\r\n        }\r\n        let maskDistance = -1;\r\n        let unmaskDistance = -1;\r\n        if (maskAllText) {\r\n            unmaskDistance = distanceToMatch(el, createMatchPredicate(unmaskTextClass, unmaskTextSelector));\r\n            if (unmaskDistance < 0) {\r\n                return true;\r\n            }\r\n            maskDistance = distanceToMatch(el, createMatchPredicate(maskTextClass, maskTextSelector), unmaskDistance >= 0 ? unmaskDistance : Infinity);\r\n        }\r\n        else {\r\n            maskDistance = distanceToMatch(el, createMatchPredicate(maskTextClass, maskTextSelector));\r\n            if (maskDistance < 0) {\r\n                return false;\r\n            }\r\n            unmaskDistance = distanceToMatch(el, createMatchPredicate(unmaskTextClass, unmaskTextSelector), maskDistance >= 0 ? maskDistance : Infinity);\r\n        }\r\n        return maskDistance >= 0\r\n            ? unmaskDistance >= 0\r\n                ? maskDistance <= unmaskDistance\r\n                : true\r\n            : unmaskDistance >= 0\r\n                ? false\r\n                : !!maskAllText;\r\n    }\r\n    catch (e) {\r\n    }\r\n    return !!maskAllText;\r\n}\r\nfunction onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) {\r\n    const win = iframeEl.contentWindow;\r\n    if (!win) {\r\n        return;\r\n    }\r\n    let fired = false;\r\n    let readyState;\r\n    try {\r\n        readyState = win.document.readyState;\r\n    }\r\n    catch (error) {\r\n        return;\r\n    }\r\n    if (readyState !== 'complete') {\r\n        const timer = setTimeout(() => {\r\n            if (!fired) {\r\n                listener();\r\n                fired = true;\r\n            }\r\n        }, iframeLoadTimeout);\r\n        iframeEl.addEventListener('load', () => {\r\n            clearTimeout(timer);\r\n            fired = true;\r\n            listener();\r\n        });\r\n        return;\r\n    }\r\n    const blankUrl = 'about:blank';\r\n    if (win.location.href !== blankUrl ||\r\n        iframeEl.src === blankUrl ||\r\n        iframeEl.src === '') {\r\n        setTimeout(listener, 0);\r\n        return iframeEl.addEventListener('load', listener);\r\n    }\r\n    iframeEl.addEventListener('load', listener);\r\n}\r\nfunction onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) {\r\n    let fired = false;\r\n    let styleSheetLoaded;\r\n    try {\r\n        styleSheetLoaded = link.sheet;\r\n    }\r\n    catch (error) {\r\n        return;\r\n    }\r\n    if (styleSheetLoaded)\r\n        return;\r\n    const timer = setTimeout(() => {\r\n        if (!fired) {\r\n            listener();\r\n            fired = true;\r\n        }\r\n    }, styleSheetLoadTimeout);\r\n    link.addEventListener('load', () => {\r\n        clearTimeout(timer);\r\n        fired = true;\r\n        listener();\r\n    });\r\n}\r\nfunction serializeNode(n, options) {\r\n    const { doc, mirror, blockClass, blockSelector, unblockSelector, maskAllText, maskAttributeFn, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, inlineStylesheet, maskInputOptions = {}, maskTextFn, maskInputFn, dataURLOptions = {}, inlineImages, recordCanvas, keepIframeSrcFn, newlyAddedElement = false, } = options;\r\n    const rootId = getRootId(doc, mirror);\r\n    switch (n.nodeType) {\r\n        case n.DOCUMENT_NODE:\r\n            if (n.compatMode !== 'CSS1Compat') {\r\n                return {\r\n                    type: NodeType.Document,\r\n                    childNodes: [],\r\n                    compatMode: n.compatMode,\r\n                };\r\n            }\r\n            else {\r\n                return {\r\n                    type: NodeType.Document,\r\n                    childNodes: [],\r\n                };\r\n            }\r\n        case n.DOCUMENT_TYPE_NODE:\r\n            return {\r\n                type: NodeType.DocumentType,\r\n                name: n.name,\r\n                publicId: n.publicId,\r\n                systemId: n.systemId,\r\n                rootId,\r\n            };\r\n        case n.ELEMENT_NODE:\r\n            return serializeElementNode(n, {\r\n                doc,\r\n                blockClass,\r\n                blockSelector,\r\n                unblockSelector,\r\n                inlineStylesheet,\r\n                maskAttributeFn,\r\n                maskInputOptions,\r\n                maskInputFn,\r\n                dataURLOptions,\r\n                inlineImages,\r\n                recordCanvas,\r\n                keepIframeSrcFn,\r\n                newlyAddedElement,\r\n                rootId,\r\n                maskAllText,\r\n                maskTextClass,\r\n                unmaskTextClass,\r\n                maskTextSelector,\r\n                unmaskTextSelector,\r\n            });\r\n        case n.TEXT_NODE:\r\n            return serializeTextNode(n, {\r\n                doc,\r\n                maskAllText,\r\n                maskTextClass,\r\n                unmaskTextClass,\r\n                maskTextSelector,\r\n                unmaskTextSelector,\r\n                maskTextFn,\r\n                maskInputOptions,\r\n                maskInputFn,\r\n                rootId,\r\n            });\r\n        case n.CDATA_SECTION_NODE:\r\n            return {\r\n                type: NodeType.CDATA,\r\n                textContent: '',\r\n                rootId,\r\n            };\r\n        case n.COMMENT_NODE:\r\n            return {\r\n                type: NodeType.Comment,\r\n                textContent: n.textContent || '',\r\n                rootId,\r\n            };\r\n        default:\r\n            return false;\r\n    }\r\n}\r\nfunction getRootId(doc, mirror) {\r\n    if (!mirror.hasNode(doc))\r\n        return undefined;\r\n    const docId = mirror.getId(doc);\r\n    return docId === 1 ? undefined : docId;\r\n}\r\nfunction serializeTextNode(n, options) {\r\n    const { maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, maskTextFn, maskInputOptions, maskInputFn, rootId, } = options;\r\n    const parentTagName = n.parentNode && n.parentNode.tagName;\r\n    let textContent = n.textContent;\r\n    const isStyle = parentTagName === 'STYLE' ? true : undefined;\r\n    const isScript = parentTagName === 'SCRIPT' ? true : undefined;\r\n    const isTextarea = parentTagName === 'TEXTAREA' ? true : undefined;\r\n    if (isStyle && textContent) {\r\n        try {\r\n            if (n.nextSibling || n.previousSibling) {\r\n            }\r\n            else if (n.parentNode.sheet?.cssRules) {\r\n                textContent = stringifyStylesheet(n.parentNode.sheet);\r\n            }\r\n        }\r\n        catch (err) {\r\n            console.warn(`Cannot get CSS styles from text's parentNode. Error: ${err}`, n);\r\n        }\r\n        textContent = absoluteToStylesheet(textContent, getHref(options.doc));\r\n    }\r\n    if (isScript) {\r\n        textContent = 'SCRIPT_PLACEHOLDER';\r\n    }\r\n    const forceMask = needMaskingText(n, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, maskAllText);\r\n    if (!isStyle && !isScript && !isTextarea && textContent && forceMask) {\r\n        textContent = maskTextFn\r\n            ? maskTextFn(textContent, n.parentElement)\r\n            : textContent.replace(/[\\S]/g, '*');\r\n    }\r\n    if (isTextarea && textContent && (maskInputOptions.textarea || forceMask)) {\r\n        textContent = maskInputFn\r\n            ? maskInputFn(textContent, n.parentNode)\r\n            : textContent.replace(/[\\S]/g, '*');\r\n    }\r\n    if (parentTagName === 'OPTION' && textContent) {\r\n        const isInputMasked = shouldMaskInput({\r\n            type: null,\r\n            tagName: parentTagName,\r\n            maskInputOptions,\r\n        });\r\n        textContent = maskInputValue({\r\n            isMasked: needMaskingText(n, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, isInputMasked),\r\n            element: n,\r\n            value: textContent,\r\n            maskInputFn,\r\n        });\r\n    }\r\n    return {\r\n        type: NodeType.Text,\r\n        textContent: textContent || '',\r\n        isStyle,\r\n        rootId,\r\n    };\r\n}\r\nfunction serializeElementNode(n, options) {\r\n    const { doc, blockClass, blockSelector, unblockSelector, inlineStylesheet, maskInputOptions = {}, maskAttributeFn, maskInputFn, dataURLOptions = {}, inlineImages, recordCanvas, keepIframeSrcFn, newlyAddedElement = false, rootId, maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, } = options;\r\n    const needBlock = _isBlockedElement(n, blockClass, blockSelector, unblockSelector);\r\n    const tagName = getValidTagName(n);\r\n    let attributes = {};\r\n    const len = n.attributes.length;\r\n    for (let i = 0; i < len; i++) {\r\n        const attr = n.attributes[i];\r\n        if (attr.name && !ignoreAttribute(tagName, attr.name, attr.value)) {\r\n            attributes[attr.name] = transformAttribute(doc, tagName, toLowerCase(attr.name), attr.value, n, maskAttributeFn);\r\n        }\r\n    }\r\n    if (tagName === 'link' && inlineStylesheet) {\r\n        const stylesheet = Array.from(doc.styleSheets).find((s) => {\r\n            return s.href === n.href;\r\n        });\r\n        let cssText = null;\r\n        if (stylesheet) {\r\n            cssText = stringifyStylesheet(stylesheet);\r\n        }\r\n        if (cssText) {\r\n            attributes.rel = null;\r\n            attributes.href = null;\r\n            attributes.crossorigin = null;\r\n            attributes._cssText = absoluteToStylesheet(cssText, stylesheet.href);\r\n        }\r\n    }\r\n    if (tagName === 'style' &&\r\n        n.sheet &&\r\n        !(n.innerText || n.textContent || '').trim().length) {\r\n        const cssText = stringifyStylesheet(n.sheet);\r\n        if (cssText) {\r\n            attributes._cssText = absoluteToStylesheet(cssText, getHref(doc));\r\n        }\r\n    }\r\n    if (tagName === 'input' ||\r\n        tagName === 'textarea' ||\r\n        tagName === 'select' ||\r\n        tagName === 'option') {\r\n        const el = n;\r\n        const type = getInputType(el);\r\n        const value = getInputValue(el, toUpperCase(tagName), type);\r\n        const checked = el.checked;\r\n        if (type !== 'submit' && type !== 'button' && value) {\r\n            const forceMask = needMaskingText(el, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, shouldMaskInput({\r\n                type,\r\n                tagName: toUpperCase(tagName),\r\n                maskInputOptions,\r\n            }));\r\n            attributes.value = maskInputValue({\r\n                isMasked: forceMask,\r\n                element: el,\r\n                value,\r\n                maskInputFn,\r\n            });\r\n        }\r\n        if (checked) {\r\n            attributes.checked = checked;\r\n        }\r\n    }\r\n    if (tagName === 'option') {\r\n        if (n.selected && !maskInputOptions['select']) {\r\n            attributes.selected = true;\r\n        }\r\n        else {\r\n            delete attributes.selected;\r\n        }\r\n    }\r\n    if (tagName === 'canvas' && recordCanvas) {\r\n        if (n.__context === '2d') {\r\n            if (!is2DCanvasBlank(n)) {\r\n                attributes.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n            }\r\n        }\r\n        else if (!('__context' in n)) {\r\n            const canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n            const blankCanvas = doc.createElement('canvas');\r\n            blankCanvas.width = n.width;\r\n            blankCanvas.height = n.height;\r\n            const blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n            if (canvasDataURL !== blankCanvasDataURL) {\r\n                attributes.rr_dataURL = canvasDataURL;\r\n            }\r\n        }\r\n    }\r\n    if (tagName === 'img' && inlineImages) {\r\n        if (!canvasService) {\r\n            canvasService = doc.createElement('canvas');\r\n            canvasCtx = canvasService.getContext('2d');\r\n        }\r\n        const image = n;\r\n        const imageSrc = image.currentSrc || image.getAttribute('src') || '<unknown-src>';\r\n        const priorCrossOrigin = image.crossOrigin;\r\n        const recordInlineImage = () => {\r\n            image.removeEventListener('load', recordInlineImage);\r\n            try {\r\n                canvasService.width = image.naturalWidth;\r\n                canvasService.height = image.naturalHeight;\r\n                canvasCtx.drawImage(image, 0, 0);\r\n                attributes.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n            }\r\n            catch (err) {\r\n                if (image.crossOrigin !== 'anonymous') {\r\n                    image.crossOrigin = 'anonymous';\r\n                    if (image.complete && image.naturalWidth !== 0)\r\n                        recordInlineImage();\r\n                    else\r\n                        image.addEventListener('load', recordInlineImage);\r\n                    return;\r\n                }\r\n                else {\r\n                    console.warn(`Cannot inline img src=${imageSrc}! Error: ${err}`);\r\n                }\r\n            }\r\n            if (image.crossOrigin === 'anonymous') {\r\n                priorCrossOrigin\r\n                    ? (attributes.crossOrigin = priorCrossOrigin)\r\n                    : image.removeAttribute('crossorigin');\r\n            }\r\n        };\r\n        if (image.complete && image.naturalWidth !== 0)\r\n            recordInlineImage();\r\n        else\r\n            image.addEventListener('load', recordInlineImage);\r\n    }\r\n    if (tagName === 'audio' || tagName === 'video') {\r\n        attributes.rr_mediaState = n.paused\r\n            ? 'paused'\r\n            : 'played';\r\n        attributes.rr_mediaCurrentTime = n.currentTime;\r\n    }\r\n    if (!newlyAddedElement) {\r\n        if (n.scrollLeft) {\r\n            attributes.rr_scrollLeft = n.scrollLeft;\r\n        }\r\n        if (n.scrollTop) {\r\n            attributes.rr_scrollTop = n.scrollTop;\r\n        }\r\n    }\r\n    if (needBlock) {\r\n        const { width, height } = n.getBoundingClientRect();\r\n        attributes = {\r\n            class: attributes.class,\r\n            rr_width: `${width}px`,\r\n            rr_height: `${height}px`,\r\n        };\r\n    }\r\n    if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src)) {\r\n        if (!needBlock && !getIframeContentDocument(n)) {\r\n            attributes.rr_src = attributes.src;\r\n        }\r\n        delete attributes.src;\r\n    }\r\n    let isCustomElement;\r\n    try {\r\n        if (customElements.get(tagName))\r\n            isCustomElement = true;\r\n    }\r\n    catch (e) {\r\n    }\r\n    return {\r\n        type: NodeType.Element,\r\n        tagName,\r\n        attributes,\r\n        childNodes: [],\r\n        isSVG: isSVGElement(n) || undefined,\r\n        needBlock,\r\n        rootId,\r\n        isCustom: isCustomElement,\r\n    };\r\n}\r\nfunction lowerIfExists(maybeAttr) {\r\n    if (maybeAttr === undefined || maybeAttr === null) {\r\n        return '';\r\n    }\r\n    else {\r\n        return maybeAttr.toLowerCase();\r\n    }\r\n}\r\nfunction slimDOMExcluded(sn, slimDOMOptions) {\r\n    if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\r\n        return true;\r\n    }\r\n    else if (sn.type === NodeType.Element) {\r\n        if (slimDOMOptions.script &&\r\n            (sn.tagName === 'script' ||\r\n                (sn.tagName === 'link' &&\r\n                    (sn.attributes.rel === 'preload' ||\r\n                        sn.attributes.rel === 'modulepreload')) ||\r\n                (sn.tagName === 'link' &&\r\n                    sn.attributes.rel === 'prefetch' &&\r\n                    typeof sn.attributes.href === 'string' &&\r\n                    extractFileExtension(sn.attributes.href) === 'js'))) {\r\n            return true;\r\n        }\r\n        else if (slimDOMOptions.headFavicon &&\r\n            ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\r\n                (sn.tagName === 'meta' &&\r\n                    (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) ||\r\n                        lowerIfExists(sn.attributes.name) === 'application-name' ||\r\n                        lowerIfExists(sn.attributes.rel) === 'icon' ||\r\n                        lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' ||\r\n                        lowerIfExists(sn.attributes.rel) === 'shortcut icon')))) {\r\n            return true;\r\n        }\r\n        else if (sn.tagName === 'meta') {\r\n            if (slimDOMOptions.headMetaDescKeywords &&\r\n                lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\r\n                return true;\r\n            }\r\n            else if (slimDOMOptions.headMetaSocial &&\r\n                (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) ||\r\n                    lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\r\n                    lowerIfExists(sn.attributes.name) === 'pinterest')) {\r\n                return true;\r\n            }\r\n            else if (slimDOMOptions.headMetaRobots &&\r\n                (lowerIfExists(sn.attributes.name) === 'robots' ||\r\n                    lowerIfExists(sn.attributes.name) === 'googlebot' ||\r\n                    lowerIfExists(sn.attributes.name) === 'bingbot')) {\r\n                return true;\r\n            }\r\n            else if (slimDOMOptions.headMetaHttpEquiv &&\r\n                sn.attributes['http-equiv'] !== undefined) {\r\n                return true;\r\n            }\r\n            else if (slimDOMOptions.headMetaAuthorship &&\r\n                (lowerIfExists(sn.attributes.name) === 'author' ||\r\n                    lowerIfExists(sn.attributes.name) === 'generator' ||\r\n                    lowerIfExists(sn.attributes.name) === 'framework' ||\r\n                    lowerIfExists(sn.attributes.name) === 'publisher' ||\r\n                    lowerIfExists(sn.attributes.name) === 'progid' ||\r\n                    lowerIfExists(sn.attributes.property).match(/^article:/) ||\r\n                    lowerIfExists(sn.attributes.property).match(/^product:/))) {\r\n                return true;\r\n            }\r\n            else if (slimDOMOptions.headMetaVerification &&\r\n                (lowerIfExists(sn.attributes.name) === 'google-site-verification' ||\r\n                    lowerIfExists(sn.attributes.name) === 'yandex-verification' ||\r\n                    lowerIfExists(sn.attributes.name) === 'csrf-token' ||\r\n                    lowerIfExists(sn.attributes.name) === 'p:domain_verify' ||\r\n                    lowerIfExists(sn.attributes.name) === 'verify-v1' ||\r\n                    lowerIfExists(sn.attributes.name) === 'verification' ||\r\n                    lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')) {\r\n                return true;\r\n            }\r\n        }\r\n    }\r\n    return false;\r\n}\r\nfunction serializeNodeWithId(n, options) {\r\n    const { doc, mirror, blockClass, blockSelector, unblockSelector, maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, skipChild = false, inlineStylesheet = true, maskInputOptions = {}, maskAttributeFn, maskTextFn, maskInputFn, slimDOMOptions, dataURLOptions = {}, inlineImages = false, recordCanvas = false, onSerialize, onIframeLoad, iframeLoadTimeout = 5000, onStylesheetLoad, stylesheetLoadTimeout = 5000, keepIframeSrcFn = () => false, newlyAddedElement = false, } = options;\r\n    let { preserveWhiteSpace = true } = options;\r\n    const _serializedNode = serializeNode(n, {\r\n        doc,\r\n        mirror,\r\n        blockClass,\r\n        blockSelector,\r\n        maskAllText,\r\n        unblockSelector,\r\n        maskTextClass,\r\n        unmaskTextClass,\r\n        maskTextSelector,\r\n        unmaskTextSelector,\r\n        inlineStylesheet,\r\n        maskInputOptions,\r\n        maskAttributeFn,\r\n        maskTextFn,\r\n        maskInputFn,\r\n        dataURLOptions,\r\n        inlineImages,\r\n        recordCanvas,\r\n        keepIframeSrcFn,\r\n        newlyAddedElement,\r\n    });\r\n    if (!_serializedNode) {\r\n        console.warn(n, 'not serialized');\r\n        return null;\r\n    }\r\n    let id;\r\n    if (mirror.hasNode(n)) {\r\n        id = mirror.getId(n);\r\n    }\r\n    else if (slimDOMExcluded(_serializedNode, slimDOMOptions) ||\r\n        (!preserveWhiteSpace &&\r\n            _serializedNode.type === NodeType.Text &&\r\n            !_serializedNode.isStyle &&\r\n            !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)) {\r\n        id = IGNORED_NODE;\r\n    }\r\n    else {\r\n        id = genId();\r\n    }\r\n    const serializedNode = Object.assign(_serializedNode, { id });\r\n    mirror.add(n, serializedNode);\r\n    if (id === IGNORED_NODE) {\r\n        return null;\r\n    }\r\n    if (onSerialize) {\r\n        onSerialize(n);\r\n    }\r\n    let recordChild = !skipChild;\r\n    if (serializedNode.type === NodeType.Element) {\r\n        recordChild = recordChild && !serializedNode.needBlock;\r\n        delete serializedNode.needBlock;\r\n        const shadowRoot = n.shadowRoot;\r\n        if (shadowRoot && isNativeShadowDom(shadowRoot))\r\n            serializedNode.isShadowHost = true;\r\n    }\r\n    if ((serializedNode.type === NodeType.Document ||\r\n        serializedNode.type === NodeType.Element) &&\r\n        recordChild) {\r\n        if (slimDOMOptions.headWhitespace &&\r\n            serializedNode.type === NodeType.Element &&\r\n            serializedNode.tagName === 'head') {\r\n            preserveWhiteSpace = false;\r\n        }\r\n        const bypassOptions = {\r\n            doc,\r\n            mirror,\r\n            blockClass,\r\n            blockSelector,\r\n            maskAllText,\r\n            unblockSelector,\r\n            maskTextClass,\r\n            unmaskTextClass,\r\n            maskTextSelector,\r\n            unmaskTextSelector,\r\n            skipChild,\r\n            inlineStylesheet,\r\n            maskInputOptions,\r\n            maskAttributeFn,\r\n            maskTextFn,\r\n            maskInputFn,\r\n            slimDOMOptions,\r\n            dataURLOptions,\r\n            inlineImages,\r\n            recordCanvas,\r\n            preserveWhiteSpace,\r\n            onSerialize,\r\n            onIframeLoad,\r\n            iframeLoadTimeout,\r\n            onStylesheetLoad,\r\n            stylesheetLoadTimeout,\r\n            keepIframeSrcFn,\r\n        };\r\n        for (const childN of Array.from(n.childNodes)) {\r\n            const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n            if (serializedChildNode) {\r\n                serializedNode.childNodes.push(serializedChildNode);\r\n            }\r\n        }\r\n        if (isElement(n) && n.shadowRoot) {\r\n            for (const childN of Array.from(n.shadowRoot.childNodes)) {\r\n                const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n                if (serializedChildNode) {\r\n                    isNativeShadowDom(n.shadowRoot) &&\r\n                        (serializedChildNode.isShadow = true);\r\n                    serializedNode.childNodes.push(serializedChildNode);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    if (n.parentNode &&\r\n        isShadowRoot(n.parentNode) &&\r\n        isNativeShadowDom(n.parentNode)) {\r\n        serializedNode.isShadow = true;\r\n    }\r\n    if (serializedNode.type === NodeType.Element &&\r\n        serializedNode.tagName === 'iframe') {\r\n        onceIframeLoaded(n, () => {\r\n            const iframeDoc = getIframeContentDocument(n);\r\n            if (iframeDoc && onIframeLoad) {\r\n                const serializedIframeNode = serializeNodeWithId(iframeDoc, {\r\n                    doc: iframeDoc,\r\n                    mirror,\r\n                    blockClass,\r\n                    blockSelector,\r\n                    unblockSelector,\r\n                    maskAllText,\r\n                    maskTextClass,\r\n                    unmaskTextClass,\r\n                    maskTextSelector,\r\n                    unmaskTextSelector,\r\n                    skipChild: false,\r\n                    inlineStylesheet,\r\n                    maskInputOptions,\r\n                    maskAttributeFn,\r\n                    maskTextFn,\r\n                    maskInputFn,\r\n                    slimDOMOptions,\r\n                    dataURLOptions,\r\n                    inlineImages,\r\n                    recordCanvas,\r\n                    preserveWhiteSpace,\r\n                    onSerialize,\r\n                    onIframeLoad,\r\n                    iframeLoadTimeout,\r\n                    onStylesheetLoad,\r\n                    stylesheetLoadTimeout,\r\n                    keepIframeSrcFn,\r\n                });\r\n                if (serializedIframeNode) {\r\n                    onIframeLoad(n, serializedIframeNode);\r\n                }\r\n            }\r\n        }, iframeLoadTimeout);\r\n    }\r\n    if (serializedNode.type === NodeType.Element &&\r\n        serializedNode.tagName === 'link' &&\r\n        typeof serializedNode.attributes.rel === 'string' &&\r\n        (serializedNode.attributes.rel === 'stylesheet' ||\r\n            (serializedNode.attributes.rel === 'preload' &&\r\n                typeof serializedNode.attributes.href === 'string' &&\r\n                extractFileExtension(serializedNode.attributes.href) === 'css'))) {\r\n        onceStylesheetLoaded(n, () => {\r\n            if (onStylesheetLoad) {\r\n                const serializedLinkNode = serializeNodeWithId(n, {\r\n                    doc,\r\n                    mirror,\r\n                    blockClass,\r\n                    blockSelector,\r\n                    unblockSelector,\r\n                    maskAllText,\r\n                    maskTextClass,\r\n                    unmaskTextClass,\r\n                    maskTextSelector,\r\n                    unmaskTextSelector,\r\n                    skipChild: false,\r\n                    inlineStylesheet,\r\n                    maskInputOptions,\r\n                    maskAttributeFn,\r\n                    maskTextFn,\r\n                    maskInputFn,\r\n                    slimDOMOptions,\r\n                    dataURLOptions,\r\n                    inlineImages,\r\n                    recordCanvas,\r\n                    preserveWhiteSpace,\r\n                    onSerialize,\r\n                    onIframeLoad,\r\n                    iframeLoadTimeout,\r\n                    onStylesheetLoad,\r\n                    stylesheetLoadTimeout,\r\n                    keepIframeSrcFn,\r\n                });\r\n                if (serializedLinkNode) {\r\n                    onStylesheetLoad(n, serializedLinkNode);\r\n                }\r\n            }\r\n        }, stylesheetLoadTimeout);\r\n    }\r\n    return serializedNode;\r\n}\r\nfunction snapshot(n, options) {\r\n    const { mirror = new Mirror(), blockClass = 'rr-block', blockSelector = null, unblockSelector = null, maskAllText = false, maskTextClass = 'rr-mask', unmaskTextClass = null, maskTextSelector = null, unmaskTextSelector = null, inlineStylesheet = true, inlineImages = false, recordCanvas = false, maskAllInputs = false, maskAttributeFn, maskTextFn, maskInputFn, slimDOM = false, dataURLOptions, preserveWhiteSpace, onSerialize, onIframeLoad, iframeLoadTimeout, onStylesheetLoad, stylesheetLoadTimeout, keepIframeSrcFn = () => false, } = options || {};\r\n    const maskInputOptions = maskAllInputs === true\r\n        ? {\r\n            color: true,\r\n            date: true,\r\n            'datetime-local': true,\r\n            email: true,\r\n            month: true,\r\n            number: true,\r\n            range: true,\r\n            search: true,\r\n            tel: true,\r\n            text: true,\r\n            time: true,\r\n            url: true,\r\n            week: true,\r\n            textarea: true,\r\n            select: true,\r\n        }\r\n        : maskAllInputs === false\r\n            ? {}\r\n            : maskAllInputs;\r\n    const slimDOMOptions = slimDOM === true || slimDOM === 'all'\r\n        ?\r\n            {\r\n                script: true,\r\n                comment: true,\r\n                headFavicon: true,\r\n                headWhitespace: true,\r\n                headMetaDescKeywords: slimDOM === 'all',\r\n                headMetaSocial: true,\r\n                headMetaRobots: true,\r\n                headMetaHttpEquiv: true,\r\n                headMetaAuthorship: true,\r\n                headMetaVerification: true,\r\n            }\r\n        : slimDOM === false\r\n            ? {}\r\n            : slimDOM;\r\n    return serializeNodeWithId(n, {\r\n        doc: n,\r\n        mirror,\r\n        blockClass,\r\n        blockSelector,\r\n        unblockSelector,\r\n        maskAllText,\r\n        maskTextClass,\r\n        unmaskTextClass,\r\n        maskTextSelector,\r\n        unmaskTextSelector,\r\n        skipChild: false,\r\n        inlineStylesheet,\r\n        maskInputOptions,\r\n        maskAttributeFn,\r\n        maskTextFn,\r\n        maskInputFn,\r\n        slimDOMOptions,\r\n        dataURLOptions,\r\n        inlineImages,\r\n        recordCanvas,\r\n        preserveWhiteSpace,\r\n        onSerialize,\r\n        onIframeLoad,\r\n        iframeLoadTimeout,\r\n        onStylesheetLoad,\r\n        stylesheetLoadTimeout,\r\n        keepIframeSrcFn,\r\n        newlyAddedElement: false,\r\n    });\r\n}\r\n\nconst commentre = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\r\nfunction parse(css, options = {}) {\r\n    let lineno = 1;\r\n    let column = 1;\r\n    function updatePosition(str) {\r\n        const lines = str.match(/\\n/g);\r\n        if (lines) {\r\n            lineno += lines.length;\r\n        }\r\n        const i = str.lastIndexOf('\\n');\r\n        column = i === -1 ? column + str.length : str.length - i;\r\n    }\r\n    function position() {\r\n        const start = { line: lineno, column };\r\n        return (node) => {\r\n            node.position = new Position(start);\r\n            whitespace();\r\n            return node;\r\n        };\r\n    }\r\n    class Position {\r\n        constructor(start) {\r\n            this.start = start;\r\n            this.end = { line: lineno, column };\r\n            this.source = options.source;\r\n        }\r\n    }\r\n    Position.prototype.content = css;\r\n    const errorsList = [];\r\n    function error(msg) {\r\n        const err = new Error(`${options.source || ''}:${lineno}:${column}: ${msg}`);\r\n        err.reason = msg;\r\n        err.filename = options.source;\r\n        err.line = lineno;\r\n        err.column = column;\r\n        err.source = css;\r\n        if (options.silent) {\r\n            errorsList.push(err);\r\n        }\r\n        else {\r\n            throw err;\r\n        }\r\n    }\r\n    function stylesheet() {\r\n        const rulesList = rules();\r\n        return {\r\n            type: 'stylesheet',\r\n            stylesheet: {\r\n                source: options.source,\r\n                rules: rulesList,\r\n                parsingErrors: errorsList,\r\n            },\r\n        };\r\n    }\r\n    function open() {\r\n        return match(/^{\\s*/);\r\n    }\r\n    function close() {\r\n        return match(/^}/);\r\n    }\r\n    function rules() {\r\n        let node;\r\n        const rules = [];\r\n        whitespace();\r\n        comments(rules);\r\n        while (css.length && css.charAt(0) !== '}' && (node = atrule() || rule())) {\r\n            if (node) {\r\n                rules.push(node);\r\n                comments(rules);\r\n            }\r\n        }\r\n        return rules;\r\n    }\r\n    function match(re) {\r\n        const m = re.exec(css);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        const str = m[0];\r\n        updatePosition(str);\r\n        css = css.slice(str.length);\r\n        return m;\r\n    }\r\n    function whitespace() {\r\n        match(/^\\s*/);\r\n    }\r\n    function comments(rules = []) {\r\n        let c;\r\n        while ((c = comment())) {\r\n            if (c) {\r\n                rules.push(c);\r\n            }\r\n            c = comment();\r\n        }\r\n        return rules;\r\n    }\r\n    function comment() {\r\n        const pos = position();\r\n        if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) {\r\n            return;\r\n        }\r\n        let i = 2;\r\n        while ('' !== css.charAt(i) &&\r\n            ('*' !== css.charAt(i) || '/' !== css.charAt(i + 1))) {\r\n            ++i;\r\n        }\r\n        i += 2;\r\n        if ('' === css.charAt(i - 1)) {\r\n            return error('End of comment missing');\r\n        }\r\n        const str = css.slice(2, i - 2);\r\n        column += 2;\r\n        updatePosition(str);\r\n        css = css.slice(i);\r\n        column += 2;\r\n        return pos({\r\n            type: 'comment',\r\n            comment: str,\r\n        });\r\n    }\r\n    function selector() {\r\n        const m = match(/^([^{]+)/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        const splitSelectors = trim(m[0])\r\n            .replace(/\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*\\/+/g, '')\r\n            .replace(/\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'/g, (m) => {\r\n            return m.replace(/,/g, '\\u200C');\r\n        })\r\n            .split(/\\s*(?![^(]*\\)),\\s*/);\r\n        if (splitSelectors.length <= 1) {\r\n            return splitSelectors.map((s) => {\r\n                return s.replace(/\\u200C/g, ',');\r\n            });\r\n        }\r\n        let i = 0;\r\n        let j = 0;\r\n        const len = splitSelectors.length;\r\n        const finalSelectors = [];\r\n        while (i < len) {\r\n            const openingParensCount = (splitSelectors[i].match(/\\(/g) || []).length;\r\n            const closingParensCount = (splitSelectors[i].match(/\\)/g) || []).length;\r\n            let unbalancedParens = openingParensCount - closingParensCount;\r\n            if (unbalancedParens >= 1) {\r\n                let foundClosingSelector = false;\r\n                j = i + 1;\r\n                while (j < len) {\r\n                    const nextOpeningParensCount = (splitSelectors[j].match(/\\(/g) || [])\r\n                        .length;\r\n                    const nextClosingParensCount = (splitSelectors[j].match(/\\)/g) || [])\r\n                        .length;\r\n                    const nextUnbalancedParens = nextClosingParensCount - nextOpeningParensCount;\r\n                    if (nextUnbalancedParens === unbalancedParens) {\r\n                        finalSelectors.push(splitSelectors.slice(i, j + 1).join(','));\r\n                        i = j + 1;\r\n                        foundClosingSelector = true;\r\n                        break;\r\n                    }\r\n                    j++;\r\n                    unbalancedParens -= nextUnbalancedParens;\r\n                }\r\n                if (foundClosingSelector) {\r\n                    continue;\r\n                }\r\n                splitSelectors\r\n                    .slice(i, len)\r\n                    .forEach((selector) => selector && finalSelectors.push(selector));\r\n                break;\r\n            }\r\n            splitSelectors[i] && finalSelectors.push(splitSelectors[i]);\r\n            i++;\r\n        }\r\n        return finalSelectors.map((s) => {\r\n            return s.replace(/\\u200C/g, ',');\r\n        });\r\n    }\r\n    function declaration() {\r\n        const pos = position();\r\n        const propMatch = match(/^(\\*?[-#\\/\\*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);\r\n        if (!propMatch) {\r\n            return;\r\n        }\r\n        const prop = trim(propMatch[0]);\r\n        if (!match(/^:\\s*/)) {\r\n            return error(`property missing ':'`);\r\n        }\r\n        const val = match(/^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^\\)]*?\\)|[^};])+)/);\r\n        const ret = pos({\r\n            type: 'declaration',\r\n            property: prop.replace(commentre, ''),\r\n            value: val ? trim(val[0]).replace(commentre, '') : '',\r\n        });\r\n        match(/^[;\\s]*/);\r\n        return ret;\r\n    }\r\n    function declarations() {\r\n        const decls = [];\r\n        if (!open()) {\r\n            return error(`missing '{'`);\r\n        }\r\n        comments(decls);\r\n        let decl;\r\n        while ((decl = declaration())) {\r\n            if (decl !== false) {\r\n                decls.push(decl);\r\n                comments(decls);\r\n            }\r\n            decl = declaration();\r\n        }\r\n        if (!close()) {\r\n            return error(`missing '}'`);\r\n        }\r\n        return decls;\r\n    }\r\n    function keyframe() {\r\n        let m;\r\n        const vals = [];\r\n        const pos = position();\r\n        while ((m = match(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/))) {\r\n            vals.push(m[1]);\r\n            match(/^,\\s*/);\r\n        }\r\n        if (!vals.length) {\r\n            return;\r\n        }\r\n        return pos({\r\n            type: 'keyframe',\r\n            values: vals,\r\n            declarations: declarations(),\r\n        });\r\n    }\r\n    function atkeyframes() {\r\n        const pos = position();\r\n        let m = match(/^@([-\\w]+)?keyframes\\s*/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        const vendor = m[1];\r\n        m = match(/^([-\\w]+)\\s*/);\r\n        if (!m) {\r\n            return error('@keyframes missing name');\r\n        }\r\n        const name = m[1];\r\n        if (!open()) {\r\n            return error(`@keyframes missing '{'`);\r\n        }\r\n        let frame;\r\n        let frames = comments();\r\n        while ((frame = keyframe())) {\r\n            frames.push(frame);\r\n            frames = frames.concat(comments());\r\n        }\r\n        if (!close()) {\r\n            return error(`@keyframes missing '}'`);\r\n        }\r\n        return pos({\r\n            type: 'keyframes',\r\n            name,\r\n            vendor,\r\n            keyframes: frames,\r\n        });\r\n    }\r\n    function atsupports() {\r\n        const pos = position();\r\n        const m = match(/^@supports *([^{]+)/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        const supports = trim(m[1]);\r\n        if (!open()) {\r\n            return error(`@supports missing '{'`);\r\n        }\r\n        const style = comments().concat(rules());\r\n        if (!close()) {\r\n            return error(`@supports missing '}'`);\r\n        }\r\n        return pos({\r\n            type: 'supports',\r\n            supports,\r\n            rules: style,\r\n        });\r\n    }\r\n    function athost() {\r\n        const pos = position();\r\n        const m = match(/^@host\\s*/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        if (!open()) {\r\n            return error(`@host missing '{'`);\r\n        }\r\n        const style = comments().concat(rules());\r\n        if (!close()) {\r\n            return error(`@host missing '}'`);\r\n        }\r\n        return pos({\r\n            type: 'host',\r\n            rules: style,\r\n        });\r\n    }\r\n    function atmedia() {\r\n        const pos = position();\r\n        const m = match(/^@media *([^{]+)/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        const media = trim(m[1]);\r\n        if (!open()) {\r\n            return error(`@media missing '{'`);\r\n        }\r\n        const style = comments().concat(rules());\r\n        if (!close()) {\r\n            return error(`@media missing '}'`);\r\n        }\r\n        return pos({\r\n            type: 'media',\r\n            media,\r\n            rules: style,\r\n        });\r\n    }\r\n    function atcustommedia() {\r\n        const pos = position();\r\n        const m = match(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        return pos({\r\n            type: 'custom-media',\r\n            name: trim(m[1]),\r\n            media: trim(m[2]),\r\n        });\r\n    }\r\n    function atpage() {\r\n        const pos = position();\r\n        const m = match(/^@page */);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        const sel = selector() || [];\r\n        if (!open()) {\r\n            return error(`@page missing '{'`);\r\n        }\r\n        let decls = comments();\r\n        let decl;\r\n        while ((decl = declaration())) {\r\n            decls.push(decl);\r\n            decls = decls.concat(comments());\r\n        }\r\n        if (!close()) {\r\n            return error(`@page missing '}'`);\r\n        }\r\n        return pos({\r\n            type: 'page',\r\n            selectors: sel,\r\n            declarations: decls,\r\n        });\r\n    }\r\n    function atdocument() {\r\n        const pos = position();\r\n        const m = match(/^@([-\\w]+)?document *([^{]+)/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        const vendor = trim(m[1]);\r\n        const doc = trim(m[2]);\r\n        if (!open()) {\r\n            return error(`@document missing '{'`);\r\n        }\r\n        const style = comments().concat(rules());\r\n        if (!close()) {\r\n            return error(`@document missing '}'`);\r\n        }\r\n        return pos({\r\n            type: 'document',\r\n            document: doc,\r\n            vendor,\r\n            rules: style,\r\n        });\r\n    }\r\n    function atfontface() {\r\n        const pos = position();\r\n        const m = match(/^@font-face\\s*/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        if (!open()) {\r\n            return error(`@font-face missing '{'`);\r\n        }\r\n        let decls = comments();\r\n        let decl;\r\n        while ((decl = declaration())) {\r\n            decls.push(decl);\r\n            decls = decls.concat(comments());\r\n        }\r\n        if (!close()) {\r\n            return error(`@font-face missing '}'`);\r\n        }\r\n        return pos({\r\n            type: 'font-face',\r\n            declarations: decls,\r\n        });\r\n    }\r\n    const atimport = _compileAtrule('import');\r\n    const atcharset = _compileAtrule('charset');\r\n    const atnamespace = _compileAtrule('namespace');\r\n    function _compileAtrule(name) {\r\n        const re = new RegExp('^@' +\r\n            name +\r\n            '\\\\s*((?:' +\r\n            [\r\n                /[^\\\\]\"(?:\\\\\"|[^\"])*\"/.source,\r\n                /[^\\\\]'(?:\\\\'|[^'])*'/.source,\r\n                '[^;]',\r\n            ].join('|') +\r\n            ')+);');\r\n        return () => {\r\n            const pos = position();\r\n            const m = match(re);\r\n            if (!m) {\r\n                return;\r\n            }\r\n            const ret = { type: name };\r\n            ret[name] = m[1].trim();\r\n            return pos(ret);\r\n        };\r\n    }\r\n    function atrule() {\r\n        if (css[0] !== '@') {\r\n            return;\r\n        }\r\n        return (atkeyframes() ||\r\n            atmedia() ||\r\n            atcustommedia() ||\r\n            atsupports() ||\r\n            atimport() ||\r\n            atcharset() ||\r\n            atnamespace() ||\r\n            atdocument() ||\r\n            atpage() ||\r\n            athost() ||\r\n            atfontface());\r\n    }\r\n    function rule() {\r\n        const pos = position();\r\n        const sel = selector();\r\n        if (!sel) {\r\n            return error('selector missing');\r\n        }\r\n        comments();\r\n        return pos({\r\n            type: 'rule',\r\n            selectors: sel,\r\n            declarations: declarations(),\r\n        });\r\n    }\r\n    return addParent(stylesheet());\r\n}\r\nfunction trim(str) {\r\n    return str ? str.replace(/^\\s+|\\s+$/g, '') : '';\r\n}\r\nfunction addParent(obj, parent) {\r\n    const isNode = obj && typeof obj.type === 'string';\r\n    const childParent = isNode ? obj : parent;\r\n    for (const k of Object.keys(obj)) {\r\n        const value = obj[k];\r\n        if (Array.isArray(value)) {\r\n            value.forEach((v) => {\r\n                addParent(v, childParent);\r\n            });\r\n        }\r\n        else if (value && typeof value === 'object') {\r\n            addParent(value, childParent);\r\n        }\r\n    }\r\n    if (isNode) {\r\n        Object.defineProperty(obj, 'parent', {\r\n            configurable: true,\r\n            writable: true,\r\n            enumerable: false,\r\n            value: parent || null,\r\n        });\r\n    }\r\n    return obj;\r\n}\n\nconst tagMap = {\r\n    script: 'noscript',\r\n    altglyph: 'altGlyph',\r\n    altglyphdef: 'altGlyphDef',\r\n    altglyphitem: 'altGlyphItem',\r\n    animatecolor: 'animateColor',\r\n    animatemotion: 'animateMotion',\r\n    animatetransform: 'animateTransform',\r\n    clippath: 'clipPath',\r\n    feblend: 'feBlend',\r\n    fecolormatrix: 'feColorMatrix',\r\n    fecomponenttransfer: 'feComponentTransfer',\r\n    fecomposite: 'feComposite',\r\n    feconvolvematrix: 'feConvolveMatrix',\r\n    fediffuselighting: 'feDiffuseLighting',\r\n    fedisplacementmap: 'feDisplacementMap',\r\n    fedistantlight: 'feDistantLight',\r\n    fedropshadow: 'feDropShadow',\r\n    feflood: 'feFlood',\r\n    fefunca: 'feFuncA',\r\n    fefuncb: 'feFuncB',\r\n    fefuncg: 'feFuncG',\r\n    fefuncr: 'feFuncR',\r\n    fegaussianblur: 'feGaussianBlur',\r\n    feimage: 'feImage',\r\n    femerge: 'feMerge',\r\n    femergenode: 'feMergeNode',\r\n    femorphology: 'feMorphology',\r\n    feoffset: 'feOffset',\r\n    fepointlight: 'fePointLight',\r\n    fespecularlighting: 'feSpecularLighting',\r\n    fespotlight: 'feSpotLight',\r\n    fetile: 'feTile',\r\n    feturbulence: 'feTurbulence',\r\n    foreignobject: 'foreignObject',\r\n    glyphref: 'glyphRef',\r\n    lineargradient: 'linearGradient',\r\n    radialgradient: 'radialGradient',\r\n};\r\nfunction getTagName(n) {\r\n    let tagName = tagMap[n.tagName] ? tagMap[n.tagName] : n.tagName;\r\n    if (tagName === 'link' && n.attributes._cssText) {\r\n        tagName = 'style';\r\n    }\r\n    return tagName;\r\n}\r\nfunction escapeRegExp(str) {\r\n    return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\nconst HOVER_SELECTOR = /([^\\\\]):hover/;\r\nconst HOVER_SELECTOR_GLOBAL = new RegExp(HOVER_SELECTOR.source, 'g');\r\nfunction addHoverClass(cssText, cache) {\r\n    const cachedStyle = cache?.stylesWithHoverClass.get(cssText);\r\n    if (cachedStyle)\r\n        return cachedStyle;\r\n    if (cssText.length >= 1000000) {\r\n        return cssText;\r\n    }\r\n    const ast = parse(cssText, {\r\n        silent: true,\r\n    });\r\n    if (!ast.stylesheet) {\r\n        return cssText;\r\n    }\r\n    const selectors = [];\r\n    ast.stylesheet.rules.forEach((rule) => {\r\n        if ('selectors' in rule) {\r\n            (rule.selectors || []).forEach((selector) => {\r\n                if (HOVER_SELECTOR.test(selector)) {\r\n                    selectors.push(selector);\r\n                }\r\n            });\r\n        }\r\n    });\r\n    if (selectors.length === 0) {\r\n        return cssText;\r\n    }\r\n    const selectorMatcher = new RegExp(selectors\r\n        .filter((selector, index) => selectors.indexOf(selector) === index)\r\n        .sort((a, b) => b.length - a.length)\r\n        .map((selector) => {\r\n        return escapeRegExp(selector);\r\n    })\r\n        .join('|'), 'g');\r\n    const result = cssText.replace(selectorMatcher, (selector) => {\r\n        const newSelector = selector.replace(HOVER_SELECTOR_GLOBAL, '$1.\\\\:hover');\r\n        return `${selector}, ${newSelector}`;\r\n    });\r\n    cache?.stylesWithHoverClass.set(cssText, result);\r\n    return result;\r\n}\r\nfunction createCache() {\r\n    const stylesWithHoverClass = new Map();\r\n    return {\r\n        stylesWithHoverClass,\r\n    };\r\n}\r\nfunction buildNode(n, options) {\r\n    const { doc, hackCss, cache } = options;\r\n    switch (n.type) {\r\n        case NodeType.Document:\r\n            return doc.implementation.createDocument(null, '', null);\r\n        case NodeType.DocumentType:\r\n            return doc.implementation.createDocumentType(n.name || 'html', n.publicId, n.systemId);\r\n        case NodeType.Element: {\r\n            const tagName = getTagName(n);\r\n            let node;\r\n            if (n.isSVG) {\r\n                node = doc.createElementNS('http://www.w3.org/2000/svg', tagName);\r\n            }\r\n            else {\r\n                if (n.isCustom &&\r\n                    doc.defaultView?.customElements &&\r\n                    !doc.defaultView.customElements.get(n.tagName))\r\n                    doc.defaultView.customElements.define(n.tagName, class extends doc.defaultView.HTMLElement {\r\n                    });\r\n                node = doc.createElement(tagName);\r\n            }\r\n            const specialAttributes = {};\r\n            for (const name in n.attributes) {\r\n                if (!Object.prototype.hasOwnProperty.call(n.attributes, name)) {\r\n                    continue;\r\n                }\r\n                let value = n.attributes[name];\r\n                if (tagName === 'option' &&\r\n                    name === 'selected' &&\r\n                    value === false) {\r\n                    continue;\r\n                }\r\n                if (value === null) {\r\n                    continue;\r\n                }\r\n                if (value === true)\r\n                    value = '';\r\n                if (name.startsWith('rr_')) {\r\n                    specialAttributes[name] = value;\r\n                    continue;\r\n                }\r\n                const isTextarea = tagName === 'textarea' && name === 'value';\r\n                const isRemoteOrDynamicCss = tagName === 'style' && name === '_cssText';\r\n                if (isRemoteOrDynamicCss && hackCss && typeof value === 'string') {\r\n                    value = addHoverClass(value, cache);\r\n                }\r\n                if ((isTextarea || isRemoteOrDynamicCss) && typeof value === 'string') {\r\n                    const child = doc.createTextNode(value);\r\n                    for (const c of Array.from(node.childNodes)) {\r\n                        if (c.nodeType === node.TEXT_NODE) {\r\n                            node.removeChild(c);\r\n                        }\r\n                    }\r\n                    node.appendChild(child);\r\n                    continue;\r\n                }\r\n                try {\r\n                    if (n.isSVG && name === 'xlink:href') {\r\n                        node.setAttributeNS('http://www.w3.org/1999/xlink', name, value.toString());\r\n                    }\r\n                    else if (name === 'onload' ||\r\n                        name === 'onclick' ||\r\n                        name.substring(0, 7) === 'onmouse') {\r\n                        node.setAttribute('_' + name, value.toString());\r\n                    }\r\n                    else if (tagName === 'meta' &&\r\n                        n.attributes['http-equiv'] === 'Content-Security-Policy' &&\r\n                        name === 'content') {\r\n                        node.setAttribute('csp-content', value.toString());\r\n                        continue;\r\n                    }\r\n                    else if (tagName === 'link' &&\r\n                        (n.attributes.rel === 'preload' ||\r\n                            n.attributes.rel === 'modulepreload')) {\r\n                    }\r\n                    else if (tagName === 'link' &&\r\n                        n.attributes.rel === 'prefetch' &&\r\n                        typeof n.attributes.href === 'string' &&\r\n                        extractFileExtension(n.attributes.href) === 'js') {\r\n                    }\r\n                    else if (tagName === 'img' &&\r\n                        n.attributes.srcset &&\r\n                        n.attributes.rr_dataURL) {\r\n                        node.setAttribute('rrweb-original-srcset', n.attributes.srcset);\r\n                    }\r\n                    else {\r\n                        node.setAttribute(name, value.toString());\r\n                    }\r\n                }\r\n                catch (error) {\r\n                }\r\n            }\r\n            for (const name in specialAttributes) {\r\n                const value = specialAttributes[name];\r\n                if (tagName === 'canvas' && name === 'rr_dataURL') {\r\n                    const image = doc.createElement('img');\r\n                    image.onload = () => {\r\n                        const ctx = node.getContext('2d');\r\n                        if (ctx) {\r\n                            ctx.drawImage(image, 0, 0, image.width, image.height);\r\n                        }\r\n                    };\r\n                    image.src = value.toString();\r\n                    if (node.RRNodeType)\r\n                        node.rr_dataURL = value.toString();\r\n                }\r\n                else if (tagName === 'img' && name === 'rr_dataURL') {\r\n                    const image = node;\r\n                    if (!image.currentSrc.startsWith('data:')) {\r\n                        image.setAttribute('rrweb-original-src', n.attributes.src);\r\n                        image.src = value.toString();\r\n                    }\r\n                }\r\n                if (name === 'rr_width') {\r\n                    node.style.setProperty('width', value.toString());\r\n                }\r\n                else if (name === 'rr_height') {\r\n                    node.style.setProperty('height', value.toString());\r\n                }\r\n                else if (name === 'rr_mediaCurrentTime' &&\r\n                    typeof value === 'number') {\r\n                    node.currentTime = value;\r\n                }\r\n                else if (name === 'rr_mediaState') {\r\n                    switch (value) {\r\n                        case 'played':\r\n                            node\r\n                                .play()\r\n                                .catch((e) => console.warn('media playback error', e));\r\n                            break;\r\n                        case 'paused':\r\n                            node.pause();\r\n                            break;\r\n                    }\r\n                }\r\n            }\r\n            if (n.isShadowHost) {\r\n                if (!node.shadowRoot) {\r\n                    node.attachShadow({ mode: 'open' });\r\n                }\r\n                else {\r\n                    while (node.shadowRoot.firstChild) {\r\n                        node.shadowRoot.removeChild(node.shadowRoot.firstChild);\r\n                    }\r\n                }\r\n            }\r\n            return node;\r\n        }\r\n        case NodeType.Text:\r\n            return doc.createTextNode(n.isStyle && hackCss\r\n                ? addHoverClass(n.textContent, cache)\r\n                : n.textContent);\r\n        case NodeType.CDATA:\r\n            return doc.createCDATASection(n.textContent);\r\n        case NodeType.Comment:\r\n            return doc.createComment(n.textContent);\r\n        default:\r\n            return null;\r\n    }\r\n}\r\nfunction buildNodeWithSN(n, options) {\r\n    const { doc, mirror, skipChild = false, hackCss = true, afterAppend, cache, } = options;\r\n    if (mirror.has(n.id)) {\r\n        const nodeInMirror = mirror.getNode(n.id);\r\n        const meta = mirror.getMeta(nodeInMirror);\r\n        if (isNodeMetaEqual(meta, n))\r\n            return mirror.getNode(n.id);\r\n    }\r\n    let node = buildNode(n, { doc, hackCss, cache });\r\n    if (!node) {\r\n        return null;\r\n    }\r\n    if (n.rootId && mirror.getNode(n.rootId) !== doc) {\r\n        mirror.replace(n.rootId, doc);\r\n    }\r\n    if (n.type === NodeType.Document) {\r\n        doc.close();\r\n        doc.open();\r\n        if (n.compatMode === 'BackCompat' &&\r\n            n.childNodes &&\r\n            n.childNodes[0].type !== NodeType.DocumentType) {\r\n            if (n.childNodes[0].type === NodeType.Element &&\r\n                'xmlns' in n.childNodes[0].attributes &&\r\n                n.childNodes[0].attributes.xmlns === 'http://www.w3.org/1999/xhtml') {\r\n                doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"\">');\r\n            }\r\n            else {\r\n                doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"\">');\r\n            }\r\n        }\r\n        node = doc;\r\n    }\r\n    mirror.add(node, n);\r\n    if ((n.type === NodeType.Document || n.type === NodeType.Element) &&\r\n        !skipChild) {\r\n        for (const childN of n.childNodes) {\r\n            const childNode = buildNodeWithSN(childN, {\r\n                doc,\r\n                mirror,\r\n                skipChild: false,\r\n                hackCss,\r\n                afterAppend,\r\n                cache,\r\n            });\r\n            if (!childNode) {\r\n                console.warn('Failed to rebuild', childN);\r\n                continue;\r\n            }\r\n            if (childN.isShadow && isElement(node) && node.shadowRoot) {\r\n                node.shadowRoot.appendChild(childNode);\r\n            }\r\n            else if (n.type === NodeType.Document &&\r\n                childN.type == NodeType.Element) {\r\n                const htmlElement = childNode;\r\n                let body = null;\r\n                htmlElement.childNodes.forEach((child) => {\r\n                    if (child.nodeName === 'BODY')\r\n                        body = child;\r\n                });\r\n                if (body) {\r\n                    htmlElement.removeChild(body);\r\n                    node.appendChild(childNode);\r\n                    htmlElement.appendChild(body);\r\n                }\r\n                else {\r\n                    node.appendChild(childNode);\r\n                }\r\n            }\r\n            else {\r\n                node.appendChild(childNode);\r\n            }\r\n            if (afterAppend) {\r\n                afterAppend(childNode, childN.id);\r\n            }\r\n        }\r\n    }\r\n    return node;\r\n}\r\nfunction visit(mirror, onVisit) {\r\n    function walk(node) {\r\n        onVisit(node);\r\n    }\r\n    for (const id of mirror.getIds()) {\r\n        if (mirror.has(id)) {\r\n            walk(mirror.getNode(id));\r\n        }\r\n    }\r\n}\r\nfunction handleScroll(node, mirror) {\r\n    const n = mirror.getMeta(node);\r\n    if (n?.type !== NodeType.Element) {\r\n        return;\r\n    }\r\n    const el = node;\r\n    for (const name in n.attributes) {\r\n        if (!(Object.prototype.hasOwnProperty.call(n.attributes, name) &&\r\n            name.startsWith('rr_'))) {\r\n            continue;\r\n        }\r\n        const value = n.attributes[name];\r\n        if (name === 'rr_scrollLeft') {\r\n            el.scrollLeft = value;\r\n        }\r\n        if (name === 'rr_scrollTop') {\r\n            el.scrollTop = value;\r\n        }\r\n    }\r\n}\r\nfunction rebuild(n, options) {\r\n    const { doc, onVisit, hackCss = true, afterAppend, cache, mirror = new Mirror(), } = options;\r\n    const node = buildNodeWithSN(n, {\r\n        doc,\r\n        mirror,\r\n        skipChild: false,\r\n        hackCss,\r\n        afterAppend,\r\n        cache,\r\n    });\r\n    visit(mirror, (visitedNode) => {\r\n        if (onVisit) {\r\n            onVisit(visitedNode);\r\n        }\r\n        handleScroll(visitedNode, mirror);\r\n    });\r\n    return node;\r\n}\n\nexport { IGNORED_NODE, Mirror, NodeType, addHoverClass, buildNodeWithSN, clearTimeout, createCache, createMatchPredicate, createMirror, distanceToMatch, escapeImportStatement, extractFileExtension, fixAllCssProperty, fixSafariColons, genId, getIframeContentDocument, getInputType, getInputValue, ignoreAttribute, is2DCanvasBlank, isCSSImportRule, isCSSStyleRule, isElement, isNativeShadowDom, isNodeMetaEqual, isShadowRoot, maskInputValue, needMaskingText, rebuild, serializeNodeWithId, setTimeout, shouldMaskInput, snapshot, stringifyRule, stringifyStylesheet, toLowerCase, toUpperCase, transformAttribute };\n","import { distanceToMatch, IGNORED_NODE, isShadowRoot, createMatchPredicate } from '../../rrweb-snapshot/es/rrweb-snapshot.js';\n\nfunction on(type, fn, target = document) {\r\n    const options = { capture: true, passive: true };\r\n    target.addEventListener(type, fn, options);\r\n    return () => target.removeEventListener(type, fn, options);\r\n}\r\nconst DEPARTED_MIRROR_ACCESS_WARNING = 'Please stop import mirror directly. Instead of that,' +\r\n    '\\r\\n' +\r\n    'now you can use replayer.getMirror() to access the mirror instance of a replayer,' +\r\n    '\\r\\n' +\r\n    'or you can use record.mirror to access the mirror instance during recording.';\r\nlet _mirror = {\r\n    map: {},\r\n    getId() {\r\n        console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n        return -1;\r\n    },\r\n    getNode() {\r\n        console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n        return null;\r\n    },\r\n    removeNodeFromMap() {\r\n        console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n    },\r\n    has() {\r\n        console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n        return false;\r\n    },\r\n    reset() {\r\n        console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n    },\r\n};\r\nif (typeof window !== 'undefined' && window.Proxy && window.Reflect) {\r\n    _mirror = new Proxy(_mirror, {\r\n        get(target, prop, receiver) {\r\n            if (prop === 'map') {\r\n                console.error(DEPARTED_MIRROR_ACCESS_WARNING);\r\n            }\r\n            return Reflect.get(target, prop, receiver);\r\n        },\r\n    });\r\n}\r\nfunction throttle(func, wait, options = {}) {\r\n    let timeout = null;\r\n    let previous = 0;\r\n    return function (...args) {\r\n        const now = Date.now();\r\n        if (!previous && options.leading === false) {\r\n            previous = now;\r\n        }\r\n        const remaining = wait - (now - previous);\r\n        const context = this;\r\n        if (remaining <= 0 || remaining > wait) {\r\n            if (timeout) {\r\n                clearTimeout(timeout);\r\n                timeout = null;\r\n            }\r\n            previous = now;\r\n            func.apply(context, args);\r\n        }\r\n        else if (!timeout && options.trailing !== false) {\r\n            timeout = setTimeout(() => {\r\n                previous = options.leading === false ? 0 : Date.now();\r\n                timeout = null;\r\n                func.apply(context, args);\r\n            }, remaining);\r\n        }\r\n    };\r\n}\r\nfunction hookSetter(target, key, d, isRevoked, win = window) {\r\n    const original = win.Object.getOwnPropertyDescriptor(target, key);\r\n    win.Object.defineProperty(target, key, isRevoked\r\n        ? d\r\n        : {\r\n            set(value) {\r\n                setTimeout(() => {\r\n                    d.set.call(this, value);\r\n                }, 0);\r\n                if (original && original.set) {\r\n                    original.set.call(this, value);\r\n                }\r\n            },\r\n        });\r\n    return () => hookSetter(target, key, original || {}, true);\r\n}\r\nfunction patch(source, name, replacement) {\r\n    try {\r\n        if (!(name in source)) {\r\n            return () => {\r\n            };\r\n        }\r\n        const original = source[name];\r\n        const wrapped = replacement(original);\r\n        if (typeof wrapped === 'function') {\r\n            wrapped.prototype = wrapped.prototype || {};\r\n            Object.defineProperties(wrapped, {\r\n                __rrweb_original__: {\r\n                    enumerable: false,\r\n                    value: original,\r\n                },\r\n            });\r\n        }\r\n        source[name] = wrapped;\r\n        return () => {\r\n            source[name] = original;\r\n        };\r\n    }\r\n    catch {\r\n        return () => {\r\n        };\r\n    }\r\n}\r\nlet nowTimestamp = Date.now;\r\nif (!(/[1-9][0-9]{12}/.test(Date.now().toString()))) {\r\n    nowTimestamp = () => new Date().getTime();\r\n}\r\nfunction getWindowScroll(win) {\r\n    const doc = win.document;\r\n    return {\r\n        left: doc.scrollingElement\r\n            ? doc.scrollingElement.scrollLeft\r\n            : win.pageXOffset !== undefined\r\n                ? win.pageXOffset\r\n                : doc?.documentElement.scrollLeft ||\r\n                    doc?.body?.parentElement?.scrollLeft ||\r\n                    doc?.body?.scrollLeft ||\r\n                    0,\r\n        top: doc.scrollingElement\r\n            ? doc.scrollingElement.scrollTop\r\n            : win.pageYOffset !== undefined\r\n                ? win.pageYOffset\r\n                : doc?.documentElement.scrollTop ||\r\n                    doc?.body?.parentElement?.scrollTop ||\r\n                    doc?.body?.scrollTop ||\r\n                    0,\r\n    };\r\n}\r\nfunction getWindowHeight() {\r\n    return (window.innerHeight ||\r\n        (document.documentElement && document.documentElement.clientHeight) ||\r\n        (document.body && document.body.clientHeight));\r\n}\r\nfunction getWindowWidth() {\r\n    return (window.innerWidth ||\r\n        (document.documentElement && document.documentElement.clientWidth) ||\r\n        (document.body && document.body.clientWidth));\r\n}\r\nfunction closestElementOfNode(node) {\r\n    if (!node) {\r\n        return null;\r\n    }\r\n    const el = node.nodeType === node.ELEMENT_NODE\r\n        ? node\r\n        : node.parentElement;\r\n    return el;\r\n}\r\nfunction isBlocked(node, blockClass, blockSelector, unblockSelector, checkAncestors) {\r\n    if (!node) {\r\n        return false;\r\n    }\r\n    const el = closestElementOfNode(node);\r\n    if (!el) {\r\n        return false;\r\n    }\r\n    const blockedPredicate = createMatchPredicate(blockClass, blockSelector);\r\n    if (!checkAncestors) {\r\n        const isUnblocked = unblockSelector && el.matches(unblockSelector);\r\n        return blockedPredicate(el) && !isUnblocked;\r\n    }\r\n    const blockDistance = distanceToMatch(el, blockedPredicate);\r\n    let unblockDistance = -1;\r\n    if (blockDistance < 0) {\r\n        return false;\r\n    }\r\n    if (unblockSelector) {\r\n        unblockDistance = distanceToMatch(el, createMatchPredicate(null, unblockSelector));\r\n    }\r\n    if (blockDistance > -1 && unblockDistance < 0) {\r\n        return true;\r\n    }\r\n    return blockDistance < unblockDistance;\r\n}\r\nfunction isSerialized(n, mirror) {\r\n    return mirror.getId(n) !== -1;\r\n}\r\nfunction isIgnored(n, mirror) {\r\n    return mirror.getId(n) === IGNORED_NODE;\r\n}\r\nfunction isAncestorRemoved(target, mirror) {\r\n    if (isShadowRoot(target)) {\r\n        return false;\r\n    }\r\n    const id = mirror.getId(target);\r\n    if (!mirror.has(id)) {\r\n        return true;\r\n    }\r\n    if (target.parentNode &&\r\n        target.parentNode.nodeType === target.DOCUMENT_NODE) {\r\n        return false;\r\n    }\r\n    if (!target.parentNode) {\r\n        return true;\r\n    }\r\n    return isAncestorRemoved(target.parentNode, mirror);\r\n}\r\nfunction legacy_isTouchEvent(event) {\r\n    return Boolean(event.changedTouches);\r\n}\r\nfunction polyfill(win = window) {\r\n    if ('NodeList' in win && !win.NodeList.prototype.forEach) {\r\n        win.NodeList.prototype.forEach = Array.prototype\r\n            .forEach;\r\n    }\r\n    if ('DOMTokenList' in win && !win.DOMTokenList.prototype.forEach) {\r\n        win.DOMTokenList.prototype.forEach = Array.prototype\r\n            .forEach;\r\n    }\r\n    if (!Node.prototype.contains) {\r\n        Node.prototype.contains = (...args) => {\r\n            let node = args[0];\r\n            if (!(0 in args)) {\r\n                throw new TypeError('1 argument is required');\r\n            }\r\n            do {\r\n                if (this === node) {\r\n                    return true;\r\n                }\r\n            } while ((node = node && node.parentNode));\r\n            return false;\r\n        };\r\n    }\r\n}\r\nfunction queueToResolveTrees(queue) {\r\n    const queueNodeMap = {};\r\n    const putIntoMap = (m, parent) => {\r\n        const nodeInTree = {\r\n            value: m,\r\n            parent,\r\n            children: [],\r\n        };\r\n        queueNodeMap[m.node.id] = nodeInTree;\r\n        return nodeInTree;\r\n    };\r\n    const queueNodeTrees = [];\r\n    for (const mutation of queue) {\r\n        const { nextId, parentId } = mutation;\r\n        if (nextId && nextId in queueNodeMap) {\r\n            const nextInTree = queueNodeMap[nextId];\r\n            if (nextInTree.parent) {\r\n                const idx = nextInTree.parent.children.indexOf(nextInTree);\r\n                nextInTree.parent.children.splice(idx, 0, putIntoMap(mutation, nextInTree.parent));\r\n            }\r\n            else {\r\n                const idx = queueNodeTrees.indexOf(nextInTree);\r\n                queueNodeTrees.splice(idx, 0, putIntoMap(mutation, null));\r\n            }\r\n            continue;\r\n        }\r\n        if (parentId in queueNodeMap) {\r\n            const parentInTree = queueNodeMap[parentId];\r\n            parentInTree.children.push(putIntoMap(mutation, parentInTree));\r\n            continue;\r\n        }\r\n        queueNodeTrees.push(putIntoMap(mutation, null));\r\n    }\r\n    return queueNodeTrees;\r\n}\r\nfunction iterateResolveTree(tree, cb) {\r\n    cb(tree.value);\r\n    for (let i = tree.children.length - 1; i >= 0; i--) {\r\n        iterateResolveTree(tree.children[i], cb);\r\n    }\r\n}\r\nfunction isSerializedIframe(n, mirror) {\r\n    return Boolean(n.nodeName === 'IFRAME' && mirror.getMeta(n));\r\n}\r\nfunction isSerializedStylesheet(n, mirror) {\r\n    return Boolean(n.nodeName === 'LINK' &&\r\n        n.nodeType === n.ELEMENT_NODE &&\r\n        n.getAttribute &&\r\n        n.getAttribute('rel') === 'stylesheet' &&\r\n        mirror.getMeta(n));\r\n}\r\nfunction getBaseDimension(node, rootIframe) {\r\n    const frameElement = node.ownerDocument?.defaultView?.frameElement;\r\n    if (!frameElement || frameElement === rootIframe) {\r\n        return {\r\n            x: 0,\r\n            y: 0,\r\n            relativeScale: 1,\r\n            absoluteScale: 1,\r\n        };\r\n    }\r\n    const frameDimension = frameElement.getBoundingClientRect();\r\n    const frameBaseDimension = getBaseDimension(frameElement, rootIframe);\r\n    const relativeScale = frameDimension.height / frameElement.clientHeight;\r\n    return {\r\n        x: frameDimension.x * frameBaseDimension.relativeScale +\r\n            frameBaseDimension.x,\r\n        y: frameDimension.y * frameBaseDimension.relativeScale +\r\n            frameBaseDimension.y,\r\n        relativeScale,\r\n        absoluteScale: frameBaseDimension.absoluteScale * relativeScale,\r\n    };\r\n}\r\nfunction hasShadowRoot(n) {\r\n    return Boolean(n?.shadowRoot);\r\n}\r\nfunction getNestedRule(rules, position) {\r\n    const rule = rules[position[0]];\r\n    if (position.length === 1) {\r\n        return rule;\r\n    }\r\n    else {\r\n        return getNestedRule(rule.cssRules[position[1]].cssRules, position.slice(2));\r\n    }\r\n}\r\nfunction getPositionsAndIndex(nestedIndex) {\r\n    const positions = [...nestedIndex];\r\n    const index = positions.pop();\r\n    return { positions, index };\r\n}\r\nfunction uniqueTextMutations(mutations) {\r\n    const idSet = new Set();\r\n    const uniqueMutations = [];\r\n    for (let i = mutations.length; i--;) {\r\n        const mutation = mutations[i];\r\n        if (!idSet.has(mutation.id)) {\r\n            uniqueMutations.push(mutation);\r\n            idSet.add(mutation.id);\r\n        }\r\n    }\r\n    return uniqueMutations;\r\n}\r\nclass StyleSheetMirror {\r\n    constructor() {\r\n        this.id = 1;\r\n        this.styleIDMap = new WeakMap();\r\n        this.idStyleMap = new Map();\r\n    }\r\n    getId(stylesheet) {\r\n        return this.styleIDMap.get(stylesheet) ?? -1;\r\n    }\r\n    has(stylesheet) {\r\n        return this.styleIDMap.has(stylesheet);\r\n    }\r\n    add(stylesheet, id) {\r\n        if (this.has(stylesheet))\r\n            return this.getId(stylesheet);\r\n        let newId;\r\n        if (id === undefined) {\r\n            newId = this.id++;\r\n        }\r\n        else\r\n            newId = id;\r\n        this.styleIDMap.set(stylesheet, newId);\r\n        this.idStyleMap.set(newId, stylesheet);\r\n        return newId;\r\n    }\r\n    getStyle(id) {\r\n        return this.idStyleMap.get(id) || null;\r\n    }\r\n    reset() {\r\n        this.styleIDMap = new WeakMap();\r\n        this.idStyleMap = new Map();\r\n        this.id = 1;\r\n    }\r\n    generateId() {\r\n        return this.id++;\r\n    }\r\n}\r\nfunction getShadowHost(n) {\r\n    let shadowHost = null;\r\n    if (n.getRootNode?.()?.nodeType === Node.DOCUMENT_FRAGMENT_NODE &&\r\n        n.getRootNode().host)\r\n        shadowHost = n.getRootNode().host;\r\n    return shadowHost;\r\n}\r\nfunction getRootShadowHost(n) {\r\n    let rootShadowHost = n;\r\n    let shadowHost;\r\n    while ((shadowHost = getShadowHost(rootShadowHost)))\r\n        rootShadowHost = shadowHost;\r\n    return rootShadowHost;\r\n}\r\nfunction shadowHostInDom(n) {\r\n    const doc = n.ownerDocument;\r\n    if (!doc)\r\n        return false;\r\n    const shadowHost = getRootShadowHost(n);\r\n    return doc.contains(shadowHost);\r\n}\r\nfunction inDom(n) {\r\n    const doc = n.ownerDocument;\r\n    if (!doc)\r\n        return false;\r\n    return doc.contains(n) || shadowHostInDom(n);\r\n}\r\nconst cachedImplementations = {};\r\nfunction getImplementation(name) {\r\n    const cached = cachedImplementations[name];\r\n    if (cached) {\r\n        return cached;\r\n    }\r\n    const document = window.document;\r\n    let impl = window[name];\r\n    if (document && typeof document.createElement === 'function') {\r\n        try {\r\n            const sandbox = document.createElement('iframe');\r\n            sandbox.hidden = true;\r\n            document.head.appendChild(sandbox);\r\n            const contentWindow = sandbox.contentWindow;\r\n            if (contentWindow && contentWindow[name]) {\r\n                impl =\r\n                    contentWindow[name];\r\n            }\r\n            document.head.removeChild(sandbox);\r\n        }\r\n        catch (e) {\r\n        }\r\n    }\r\n    return (cachedImplementations[name] = impl.bind(window));\r\n}\r\nfunction onRequestAnimationFrame(...rest) {\r\n    return getImplementation('requestAnimationFrame')(...rest);\r\n}\r\nfunction setTimeout(...rest) {\r\n    return getImplementation('setTimeout')(...rest);\r\n}\r\nfunction clearTimeout(...rest) {\r\n    return getImplementation('clearTimeout')(...rest);\r\n}\n\nexport { StyleSheetMirror, _mirror, clearTimeout, closestElementOfNode, getBaseDimension, getNestedRule, getPositionsAndIndex, getRootShadowHost, getShadowHost, getWindowHeight, getWindowScroll, getWindowWidth, hasShadowRoot, hookSetter, inDom, isAncestorRemoved, isBlocked, isIgnored, isSerialized, isSerializedIframe, isSerializedStylesheet, iterateResolveTree, legacy_isTouchEvent, nowTimestamp, on, onRequestAnimationFrame, patch, polyfill, queueToResolveTrees, setTimeout, shadowHostInDom, throttle, uniqueTextMutations };\n","var EventType = /* @__PURE__ */ ((EventType2) => {\n  EventType2[EventType2[\"DomContentLoaded\"] = 0] = \"DomContentLoaded\";\n  EventType2[EventType2[\"Load\"] = 1] = \"Load\";\n  EventType2[EventType2[\"FullSnapshot\"] = 2] = \"FullSnapshot\";\n  EventType2[EventType2[\"IncrementalSnapshot\"] = 3] = \"IncrementalSnapshot\";\n  EventType2[EventType2[\"Meta\"] = 4] = \"Meta\";\n  EventType2[EventType2[\"Custom\"] = 5] = \"Custom\";\n  EventType2[EventType2[\"Plugin\"] = 6] = \"Plugin\";\n  return EventType2;\n})(EventType || {});\nvar IncrementalSource = /* @__PURE__ */ ((IncrementalSource2) => {\n  IncrementalSource2[IncrementalSource2[\"Mutation\"] = 0] = \"Mutation\";\n  IncrementalSource2[IncrementalSource2[\"MouseMove\"] = 1] = \"MouseMove\";\n  IncrementalSource2[IncrementalSource2[\"MouseInteraction\"] = 2] = \"MouseInteraction\";\n  IncrementalSource2[IncrementalSource2[\"Scroll\"] = 3] = \"Scroll\";\n  IncrementalSource2[IncrementalSource2[\"ViewportResize\"] = 4] = \"ViewportResize\";\n  IncrementalSource2[IncrementalSource2[\"Input\"] = 5] = \"Input\";\n  IncrementalSource2[IncrementalSource2[\"TouchMove\"] = 6] = \"TouchMove\";\n  IncrementalSource2[IncrementalSource2[\"MediaInteraction\"] = 7] = \"MediaInteraction\";\n  IncrementalSource2[IncrementalSource2[\"StyleSheetRule\"] = 8] = \"StyleSheetRule\";\n  IncrementalSource2[IncrementalSource2[\"CanvasMutation\"] = 9] = \"CanvasMutation\";\n  IncrementalSource2[IncrementalSource2[\"Font\"] = 10] = \"Font\";\n  IncrementalSource2[IncrementalSource2[\"Log\"] = 11] = \"Log\";\n  IncrementalSource2[IncrementalSource2[\"Drag\"] = 12] = \"Drag\";\n  IncrementalSource2[IncrementalSource2[\"StyleDeclaration\"] = 13] = \"StyleDeclaration\";\n  IncrementalSource2[IncrementalSource2[\"Selection\"] = 14] = \"Selection\";\n  IncrementalSource2[IncrementalSource2[\"AdoptedStyleSheet\"] = 15] = \"AdoptedStyleSheet\";\n  IncrementalSource2[IncrementalSource2[\"CustomElement\"] = 16] = \"CustomElement\";\n  return IncrementalSource2;\n})(IncrementalSource || {});\nvar MouseInteractions = /* @__PURE__ */ ((MouseInteractions2) => {\n  MouseInteractions2[MouseInteractions2[\"MouseUp\"] = 0] = \"MouseUp\";\n  MouseInteractions2[MouseInteractions2[\"MouseDown\"] = 1] = \"MouseDown\";\n  MouseInteractions2[MouseInteractions2[\"Click\"] = 2] = \"Click\";\n  MouseInteractions2[MouseInteractions2[\"ContextMenu\"] = 3] = \"ContextMenu\";\n  MouseInteractions2[MouseInteractions2[\"DblClick\"] = 4] = \"DblClick\";\n  MouseInteractions2[MouseInteractions2[\"Focus\"] = 5] = \"Focus\";\n  MouseInteractions2[MouseInteractions2[\"Blur\"] = 6] = \"Blur\";\n  MouseInteractions2[MouseInteractions2[\"TouchStart\"] = 7] = \"TouchStart\";\n  MouseInteractions2[MouseInteractions2[\"TouchMove_Departed\"] = 8] = \"TouchMove_Departed\";\n  MouseInteractions2[MouseInteractions2[\"TouchEnd\"] = 9] = \"TouchEnd\";\n  MouseInteractions2[MouseInteractions2[\"TouchCancel\"] = 10] = \"TouchCancel\";\n  return MouseInteractions2;\n})(MouseInteractions || {});\nvar PointerTypes = /* @__PURE__ */ ((PointerTypes2) => {\n  PointerTypes2[PointerTypes2[\"Mouse\"] = 0] = \"Mouse\";\n  PointerTypes2[PointerTypes2[\"Pen\"] = 1] = \"Pen\";\n  PointerTypes2[PointerTypes2[\"Touch\"] = 2] = \"Touch\";\n  return PointerTypes2;\n})(PointerTypes || {});\nvar CanvasContext = /* @__PURE__ */ ((CanvasContext2) => {\n  CanvasContext2[CanvasContext2[\"2D\"] = 0] = \"2D\";\n  CanvasContext2[CanvasContext2[\"WebGL\"] = 1] = \"WebGL\";\n  CanvasContext2[CanvasContext2[\"WebGL2\"] = 2] = \"WebGL2\";\n  return CanvasContext2;\n})(CanvasContext || {});\nvar ReplayerEvents = /* @__PURE__ */ ((ReplayerEvents2) => {\n  ReplayerEvents2[\"Start\"] = \"start\";\n  ReplayerEvents2[\"Pause\"] = \"pause\";\n  ReplayerEvents2[\"Resume\"] = \"resume\";\n  ReplayerEvents2[\"Resize\"] = \"resize\";\n  ReplayerEvents2[\"Finish\"] = \"finish\";\n  ReplayerEvents2[\"FullsnapshotRebuilded\"] = \"fullsnapshot-rebuilded\";\n  ReplayerEvents2[\"LoadStylesheetStart\"] = \"load-stylesheet-start\";\n  ReplayerEvents2[\"LoadStylesheetEnd\"] = \"load-stylesheet-end\";\n  ReplayerEvents2[\"SkipStart\"] = \"skip-start\";\n  ReplayerEvents2[\"SkipEnd\"] = \"skip-end\";\n  ReplayerEvents2[\"MouseInteraction\"] = \"mouse-interaction\";\n  ReplayerEvents2[\"EventCast\"] = \"event-cast\";\n  ReplayerEvents2[\"CustomEvent\"] = \"custom-event\";\n  ReplayerEvents2[\"Flush\"] = \"flush\";\n  ReplayerEvents2[\"StateChange\"] = \"state-change\";\n  ReplayerEvents2[\"PlayBack\"] = \"play-back\";\n  ReplayerEvents2[\"Destroy\"] = \"destroy\";\n  return ReplayerEvents2;\n})(ReplayerEvents || {});\n\nexport { CanvasContext, EventType, IncrementalSource, MouseInteractions, PointerTypes, ReplayerEvents };\n","let errorHandler;\r\nfunction registerErrorHandler(handler) {\r\n    errorHandler = handler;\r\n}\r\nfunction unregisterErrorHandler() {\r\n    errorHandler = undefined;\r\n}\r\nconst callbackWrapper = (cb) => {\r\n    if (!errorHandler) {\r\n        return cb;\r\n    }\r\n    const rrwebWrapped = ((...rest) => {\r\n        try {\r\n            return cb(...rest);\r\n        }\r\n        catch (error) {\r\n            if (errorHandler && errorHandler(error) === true) {\r\n                return () => {\r\n                };\r\n            }\r\n            throw error;\r\n        }\r\n    });\r\n    return rrwebWrapped;\r\n};\n\nexport { callbackWrapper, registerErrorHandler, unregisterErrorHandler };\n","/*\n * base64-arraybuffer 1.0.1 <https://github.com/niklasvh/base64-arraybuffer>\n * Copyright (c) 2021 Niklas von Hertzen <https://hertzen.com>\n * Released under MIT License\n */\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i = 0; i < chars.length; i++) {\n    lookup[chars.charCodeAt(i)] = i;\n}\nvar encode = function (arraybuffer) {\n    var bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n    for (i = 0; i < len; i += 3) {\n        base64 += chars[bytes[i] >> 2];\n        base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n        base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n        base64 += chars[bytes[i + 2] & 63];\n    }\n    if (len % 3 === 2) {\n        base64 = base64.substring(0, base64.length - 1) + '=';\n    }\n    else if (len % 3 === 1) {\n        base64 = base64.substring(0, base64.length - 2) + '==';\n    }\n    return base64;\n};\nvar decode = function (base64) {\n    var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n    if (base64[base64.length - 1] === '=') {\n        bufferLength--;\n        if (base64[base64.length - 2] === '=') {\n            bufferLength--;\n        }\n    }\n    var arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n    for (i = 0; i < len; i += 4) {\n        encoded1 = lookup[base64.charCodeAt(i)];\n        encoded2 = lookup[base64.charCodeAt(i + 1)];\n        encoded3 = lookup[base64.charCodeAt(i + 2)];\n        encoded4 = lookup[base64.charCodeAt(i + 3)];\n        bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n        bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n        bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n    }\n    return arraybuffer;\n};\n\nexport { decode, encode };\n","import { encode } from './../../../../../../ext/base64-arraybuffer/dist/base64-arraybuffer.es5.js';\n\nconst canvasVarMap = new Map();\r\nfunction variableListFor(ctx, ctor) {\r\n    let contextMap = canvasVarMap.get(ctx);\r\n    if (!contextMap) {\r\n        contextMap = new Map();\r\n        canvasVarMap.set(ctx, contextMap);\r\n    }\r\n    if (!contextMap.has(ctor)) {\r\n        contextMap.set(ctor, []);\r\n    }\r\n    return contextMap.get(ctor);\r\n}\r\nconst saveWebGLVar = (value, win, ctx) => {\r\n    if (!value ||\r\n        !(isInstanceOfWebGLObject(value, win) || typeof value === 'object'))\r\n        return;\r\n    const name = value.constructor.name;\r\n    const list = variableListFor(ctx, name);\r\n    let index = list.indexOf(value);\r\n    if (index === -1) {\r\n        index = list.length;\r\n        list.push(value);\r\n    }\r\n    return index;\r\n};\r\nfunction serializeArg(value, win, ctx) {\r\n    if (value instanceof Array) {\r\n        return value.map((arg) => serializeArg(arg, win, ctx));\r\n    }\r\n    else if (value === null) {\r\n        return value;\r\n    }\r\n    else if (value instanceof Float32Array ||\r\n        value instanceof Float64Array ||\r\n        value instanceof Int32Array ||\r\n        value instanceof Uint32Array ||\r\n        value instanceof Uint8Array ||\r\n        value instanceof Uint16Array ||\r\n        value instanceof Int16Array ||\r\n        value instanceof Int8Array ||\r\n        value instanceof Uint8ClampedArray) {\r\n        const name = value.constructor.name;\r\n        return {\r\n            rr_type: name,\r\n            args: [Object.values(value)],\r\n        };\r\n    }\r\n    else if (value instanceof ArrayBuffer) {\r\n        const name = value.constructor.name;\r\n        const base64 = encode(value);\r\n        return {\r\n            rr_type: name,\r\n            base64,\r\n        };\r\n    }\r\n    else if (value instanceof DataView) {\r\n        const name = value.constructor.name;\r\n        return {\r\n            rr_type: name,\r\n            args: [\r\n                serializeArg(value.buffer, win, ctx),\r\n                value.byteOffset,\r\n                value.byteLength,\r\n            ],\r\n        };\r\n    }\r\n    else if (value instanceof HTMLImageElement) {\r\n        const name = value.constructor.name;\r\n        const { src } = value;\r\n        return {\r\n            rr_type: name,\r\n            src,\r\n        };\r\n    }\r\n    else if (value instanceof HTMLCanvasElement) {\r\n        const name = 'HTMLImageElement';\r\n        const src = value.toDataURL();\r\n        return {\r\n            rr_type: name,\r\n            src,\r\n        };\r\n    }\r\n    else if (value instanceof ImageData) {\r\n        const name = value.constructor.name;\r\n        return {\r\n            rr_type: name,\r\n            args: [serializeArg(value.data, win, ctx), value.width, value.height],\r\n        };\r\n    }\r\n    else if (isInstanceOfWebGLObject(value, win) || typeof value === 'object') {\r\n        const name = value.constructor.name;\r\n        const index = saveWebGLVar(value, win, ctx);\r\n        return {\r\n            rr_type: name,\r\n            index: index,\r\n        };\r\n    }\r\n    return value;\r\n}\r\nconst serializeArgs = (args, win, ctx) => {\r\n    return args.map((arg) => serializeArg(arg, win, ctx));\r\n};\r\nconst isInstanceOfWebGLObject = (value, win) => {\r\n    const webGLConstructorNames = [\r\n        'WebGLActiveInfo',\r\n        'WebGLBuffer',\r\n        'WebGLFramebuffer',\r\n        'WebGLProgram',\r\n        'WebGLRenderbuffer',\r\n        'WebGLShader',\r\n        'WebGLShaderPrecisionFormat',\r\n        'WebGLTexture',\r\n        'WebGLUniformLocation',\r\n        'WebGLVertexArrayObject',\r\n        'WebGLVertexArrayObjectOES',\r\n    ];\r\n    const supportedWebGLConstructorNames = webGLConstructorNames.filter((name) => typeof win[name] === 'function');\r\n    return Boolean(supportedWebGLConstructorNames.find((name) => value instanceof win[name]));\r\n};\n\nexport { isInstanceOfWebGLObject, saveWebGLVar, serializeArg, serializeArgs, variableListFor };\n","import { patch, isBlocked } from '../../../utils.js';\n\nfunction getNormalizedContextName(contextType) {\r\n    return contextType === 'experimental-webgl' ? 'webgl' : contextType;\r\n}\r\nfunction initCanvasContextObserver(win, blockClass, blockSelector, unblockSelector, setPreserveDrawingBufferToTrue) {\r\n    const handlers = [];\r\n    try {\r\n        const restoreHandler = patch(win.HTMLCanvasElement.prototype, 'getContext', function (original) {\r\n            return function (contextType, ...args) {\r\n                if (!isBlocked(this, blockClass, blockSelector, unblockSelector, true)) {\r\n                    const ctxName = getNormalizedContextName(contextType);\r\n                    if (!('__context' in this))\r\n                        this.__context = ctxName;\r\n                    if (setPreserveDrawingBufferToTrue &&\r\n                        ['webgl', 'webgl2'].includes(ctxName)) {\r\n                        if (args[0] && typeof args[0] === 'object') {\r\n                            const contextAttributes = args[0];\r\n                            if (!contextAttributes.preserveDrawingBuffer) {\r\n                                contextAttributes.preserveDrawingBuffer = true;\r\n                            }\r\n                        }\r\n                        else {\r\n                            args.splice(0, 1, {\r\n                                preserveDrawingBuffer: true,\r\n                            });\r\n                        }\r\n                    }\r\n                }\r\n                return original.apply(this, [contextType, ...args]);\r\n            };\r\n        });\r\n        handlers.push(restoreHandler);\r\n    }\r\n    catch {\r\n        console.error('failed to patch HTMLCanvasElement.prototype.getContext');\r\n    }\r\n    return () => {\r\n        handlers.forEach((h) => h());\r\n    };\r\n}\n\nexport { initCanvasContextObserver as default };\n","import { CanvasContext } from '../../../../../types/dist/rrweb-types.js';\nimport { patch, isBlocked, hookSetter } from '../../../utils.js';\nimport { saveWebGLVar, serializeArgs } from './serialize-args.js';\n\nfunction patchGLPrototype(prototype, type, cb, blockClass, blockSelector, unblockSelector, mirror, win) {\r\n    const handlers = [];\r\n    const props = Object.getOwnPropertyNames(prototype);\r\n    for (const prop of props) {\r\n        if ([\r\n            'isContextLost',\r\n            'canvas',\r\n            'drawingBufferWidth',\r\n            'drawingBufferHeight',\r\n        ].includes(prop)) {\r\n            continue;\r\n        }\r\n        try {\r\n            if (typeof prototype[prop] !== 'function') {\r\n                continue;\r\n            }\r\n            const restoreHandler = patch(prototype, prop, function (original) {\r\n                return function (...args) {\r\n                    const result = original.apply(this, args);\r\n                    saveWebGLVar(result, win, this);\r\n                    if ('tagName' in this.canvas &&\r\n                        !isBlocked(this.canvas, blockClass, blockSelector, unblockSelector, true)) {\r\n                        const recordArgs = serializeArgs(args, win, this);\r\n                        const mutation = {\r\n                            type,\r\n                            property: prop,\r\n                            args: recordArgs,\r\n                        };\r\n                        cb(this.canvas, mutation);\r\n                    }\r\n                    return result;\r\n                };\r\n            });\r\n            handlers.push(restoreHandler);\r\n        }\r\n        catch {\r\n            const hookHandler = hookSetter(prototype, prop, {\r\n                set(v) {\r\n                    cb(this.canvas, {\r\n                        type,\r\n                        property: prop,\r\n                        args: [v],\r\n                        setter: true,\r\n                    });\r\n                },\r\n            });\r\n            handlers.push(hookHandler);\r\n        }\r\n    }\r\n    return handlers;\r\n}\r\nfunction initCanvasWebGLMutationObserver(cb, win, blockClass, blockSelector, unblockSelector, mirror) {\r\n    const handlers = [];\r\n    handlers.push(...patchGLPrototype(win.WebGLRenderingContext.prototype, CanvasContext.WebGL, cb, blockClass, blockSelector, unblockSelector, mirror, win));\r\n    if (typeof win.WebGL2RenderingContext !== 'undefined') {\r\n        handlers.push(...patchGLPrototype(win.WebGL2RenderingContext.prototype, CanvasContext.WebGL2, cb, blockClass, blockSelector, unblockSelector, mirror, win));\r\n    }\r\n    return () => {\r\n        handlers.forEach((h) => h());\r\n    };\r\n}\n\nexport { initCanvasWebGLMutationObserver as default };\n","import { onRequestAnimationFrame, isBlocked } from '../../../utils.js';\nimport { CanvasContext } from '../../../../../types/dist/rrweb-types.js';\nimport initCanvas2DMutationObserver from './2d.js';\nimport initCanvasContextObserver from './canvas.js';\nimport initCanvasWebGLMutationObserver from './webgl.js';\nimport { getImageBitmapDataUrlWorkerURL as t } from '../../../../../rrweb-worker/es/rrweb-worker/index.js';\nimport { callbackWrapper, registerErrorHandler } from '../../error-handler.js';\n\nclass CanvasManagerNoop {\r\n    reset() {\r\n    }\r\n    freeze() {\r\n    }\r\n    unfreeze() {\r\n    }\r\n    lock() {\r\n    }\r\n    unlock() {\r\n    }\r\n    snapshot() {\r\n    }\r\n    addWindow() {\r\n    }\r\n    addShadowRoot() {\r\n    }\r\n    resetShadowRoots() {\r\n    }\r\n}\r\nclass CanvasManager {\r\n    reset() {\r\n        this.pendingCanvasMutations.clear();\r\n        this.restoreHandlers.forEach((handler) => {\r\n            try {\r\n                handler();\r\n            }\r\n            catch (e) {\r\n            }\r\n        });\r\n        this.restoreHandlers = [];\r\n        this.windowsSet = new WeakSet();\r\n        this.windows = [];\r\n        this.shadowDoms = new Set();\r\n        this.worker?.terminate();\r\n        this.worker = null;\r\n        this.snapshotInProgressMap = new Map();\r\n    }\r\n    freeze() {\r\n        this.frozen = true;\r\n    }\r\n    unfreeze() {\r\n        this.frozen = false;\r\n    }\r\n    lock() {\r\n        this.locked = true;\r\n    }\r\n    unlock() {\r\n        this.locked = false;\r\n    }\r\n    constructor(options) {\r\n        this.pendingCanvasMutations = new Map();\r\n        this.rafStamps = { latestId: 0, invokeId: null };\r\n        this.shadowDoms = new Set();\r\n        this.windowsSet = new WeakSet();\r\n        this.windows = [];\r\n        this.restoreHandlers = [];\r\n        this.frozen = false;\r\n        this.locked = false;\r\n        this.snapshotInProgressMap = new Map();\r\n        this.worker = null;\r\n        this.processMutation = (target, mutation) => {\r\n            const newFrame = this.rafStamps.invokeId &&\r\n                this.rafStamps.latestId !== this.rafStamps.invokeId;\r\n            if (newFrame || !this.rafStamps.invokeId)\r\n                this.rafStamps.invokeId = this.rafStamps.latestId;\r\n            if (!this.pendingCanvasMutations.has(target)) {\r\n                this.pendingCanvasMutations.set(target, []);\r\n            }\r\n            this.pendingCanvasMutations.get(target).push(mutation);\r\n        };\r\n        const { sampling = 'all', win, blockClass, blockSelector, unblockSelector, maxCanvasSize, recordCanvas, dataURLOptions, errorHandler, } = options;\r\n        this.mutationCb = options.mutationCb;\r\n        this.mirror = options.mirror;\r\n        this.options = options;\r\n        if (errorHandler) {\r\n            registerErrorHandler(errorHandler);\r\n        }\r\n        if ((recordCanvas && typeof sampling === 'number') ||\r\n            options.enableManualSnapshot) {\r\n            this.worker = this.initFPSWorker();\r\n        }\r\n        this.addWindow(win);\r\n        if (options.enableManualSnapshot) {\r\n            return;\r\n        }\r\n        callbackWrapper(() => {\r\n            if (recordCanvas && sampling === 'all') {\r\n                this.startRAFTimestamping();\r\n                this.startPendingCanvasMutationFlusher();\r\n            }\r\n            if (recordCanvas && typeof sampling === 'number') {\r\n                this.initCanvasFPSObserver(sampling, blockClass, blockSelector, unblockSelector, maxCanvasSize, {\r\n                    dataURLOptions,\r\n                });\r\n            }\r\n        })();\r\n    }\r\n    addWindow(win) {\r\n        const { sampling = 'all', blockClass, blockSelector, unblockSelector, recordCanvas, enableManualSnapshot, } = this.options;\r\n        if (this.windowsSet.has(win))\r\n            return;\r\n        if (enableManualSnapshot) {\r\n            this.windowsSet.add(win);\r\n            this.windows.push(new WeakRef(win));\r\n            return;\r\n        }\r\n        callbackWrapper(() => {\r\n            if (recordCanvas && sampling === 'all') {\r\n                this.initCanvasMutationObserver(win, blockClass, blockSelector, unblockSelector);\r\n            }\r\n            if (recordCanvas && typeof sampling === 'number') {\r\n                const canvasContextReset = initCanvasContextObserver(win, blockClass, blockSelector, unblockSelector, true);\r\n                this.restoreHandlers.push(() => {\r\n                    canvasContextReset();\r\n                });\r\n            }\r\n        })();\r\n        this.windowsSet.add(win);\r\n        this.windows.push(new WeakRef(win));\r\n    }\r\n    addShadowRoot(shadowRoot) {\r\n        this.shadowDoms.add(new WeakRef(shadowRoot));\r\n    }\r\n    resetShadowRoots() {\r\n        this.shadowDoms = new Set();\r\n    }\r\n    initFPSWorker() {\r\n        const worker = new Worker(t());\r\n        worker.onmessage = (e) => {\r\n            const data = e.data;\r\n            const { id } = data;\r\n            this.snapshotInProgressMap.set(id, false);\r\n            if (!('base64' in data))\r\n                return;\r\n            const { base64, type, width, height } = data;\r\n            this.mutationCb({\r\n                id,\r\n                type: CanvasContext['2D'],\r\n                commands: [\r\n                    {\r\n                        property: 'clearRect',\r\n                        args: [0, 0, width, height],\r\n                    },\r\n                    {\r\n                        property: 'drawImage',\r\n                        args: [\r\n                            {\r\n                                rr_type: 'ImageBitmap',\r\n                                args: [\r\n                                    {\r\n                                        rr_type: 'Blob',\r\n                                        data: [{ rr_type: 'ArrayBuffer', base64 }],\r\n                                        type,\r\n                                    },\r\n                                ],\r\n                            },\r\n                            0,\r\n                            0,\r\n                            width,\r\n                            height,\r\n                        ],\r\n                    },\r\n                ],\r\n            });\r\n        };\r\n        return worker;\r\n    }\r\n    initCanvasFPSObserver(fps, blockClass, blockSelector, unblockSelector, maxCanvasSize, options) {\r\n        const rafId = this.takeSnapshot(false, fps, blockClass, blockSelector, unblockSelector, maxCanvasSize, options.dataURLOptions);\r\n        this.restoreHandlers.push(() => {\r\n            cancelAnimationFrame(rafId);\r\n        });\r\n    }\r\n    initCanvasMutationObserver(win, blockClass, blockSelector, unblockSelector) {\r\n        const canvasContextReset = initCanvasContextObserver(win, blockClass, blockSelector, unblockSelector, false);\r\n        const canvas2DReset = initCanvas2DMutationObserver(this.processMutation.bind(this), win, blockClass, blockSelector, unblockSelector);\r\n        const canvasWebGL1and2Reset = initCanvasWebGLMutationObserver(this.processMutation.bind(this), win, blockClass, blockSelector, unblockSelector, this.mirror);\r\n        this.restoreHandlers.push(() => {\r\n            canvasContextReset();\r\n            canvas2DReset();\r\n            canvasWebGL1and2Reset();\r\n        });\r\n    }\r\n    snapshot(canvasElement) {\r\n        const { options } = this;\r\n        const rafId = this.takeSnapshot(true, options.sampling === 'all' ? 2 : options.sampling || 2, options.blockClass, options.blockSelector, options.unblockSelector, options.maxCanvasSize, options.dataURLOptions, canvasElement);\r\n        this.restoreHandlers.push(() => {\r\n            cancelAnimationFrame(rafId);\r\n        });\r\n    }\r\n    takeSnapshot(isManualSnapshot, fps, blockClass, blockSelector, unblockSelector, maxCanvasSize, dataURLOptions, canvasElement) {\r\n        const timeBetweenSnapshots = 1000 / fps;\r\n        let lastSnapshotTime = 0;\r\n        let rafId;\r\n        const getCanvas = (canvasElement) => {\r\n            if (canvasElement) {\r\n                return [canvasElement];\r\n            }\r\n            const matchedCanvas = [];\r\n            const searchCanvas = (root) => {\r\n                root.querySelectorAll('canvas').forEach((canvas) => {\r\n                    if (!isBlocked(canvas, blockClass, blockSelector, unblockSelector, true)) {\r\n                        matchedCanvas.push(canvas);\r\n                    }\r\n                });\r\n            };\r\n            for (const item of this.windows) {\r\n                const window = item.deref();\r\n                if (window) {\r\n                    searchCanvas(window.document);\r\n                }\r\n            }\r\n            for (const item of this.shadowDoms) {\r\n                const shadowRoot = item.deref();\r\n                if (shadowRoot) {\r\n                    searchCanvas(shadowRoot);\r\n                }\r\n            }\r\n            return matchedCanvas;\r\n        };\r\n        const takeCanvasSnapshots = (timestamp) => {\r\n            if (!this.windows.length) {\r\n                return;\r\n            }\r\n            if (lastSnapshotTime &&\r\n                timestamp - lastSnapshotTime < timeBetweenSnapshots) {\r\n                rafId = onRequestAnimationFrame(takeCanvasSnapshots);\r\n                return;\r\n            }\r\n            lastSnapshotTime = timestamp;\r\n            getCanvas(canvasElement).forEach((canvas) => {\r\n                if (!this.mirror.hasNode(canvas)) {\r\n                    return;\r\n                }\r\n                const id = this.mirror.getId(canvas);\r\n                if (this.snapshotInProgressMap.get(id))\r\n                    return;\r\n                if (!canvas.width || !canvas.height)\r\n                    return;\r\n                this.snapshotInProgressMap.set(id, true);\r\n                if (!isManualSnapshot &&\r\n                    ['webgl', 'webgl2'].includes(canvas.__context)) {\r\n                    const context = canvas.getContext(canvas.__context);\r\n                    if (context?.getContextAttributes()?.preserveDrawingBuffer === false) {\r\n                        context.clear(context.COLOR_BUFFER_BIT);\r\n                    }\r\n                }\r\n                createImageBitmap(canvas)\r\n                    .then((bitmap) => {\r\n                    this.worker?.postMessage({\r\n                        id,\r\n                        bitmap,\r\n                        width: canvas.width,\r\n                        height: canvas.height,\r\n                        dataURLOptions,\r\n                        maxCanvasSize,\r\n                    }, [bitmap]);\r\n                })\r\n                    .catch((error) => {\r\n                    callbackWrapper(() => {\r\n                        throw error;\r\n                    })();\r\n                });\r\n            });\r\n            if (!isManualSnapshot) {\r\n                rafId = onRequestAnimationFrame(takeCanvasSnapshots);\r\n            }\r\n        };\r\n        rafId = onRequestAnimationFrame(takeCanvasSnapshots);\r\n        return rafId;\r\n    }\r\n    startPendingCanvasMutationFlusher() {\r\n        onRequestAnimationFrame(() => this.flushPendingCanvasMutations());\r\n    }\r\n    startRAFTimestamping() {\r\n        const setLatestRAFTimestamp = (timestamp) => {\r\n            this.rafStamps.latestId = timestamp;\r\n            onRequestAnimationFrame(setLatestRAFTimestamp);\r\n        };\r\n        onRequestAnimationFrame(setLatestRAFTimestamp);\r\n    }\r\n    flushPendingCanvasMutations() {\r\n        this.pendingCanvasMutations.forEach((values, canvas) => {\r\n            const id = this.mirror.getId(canvas);\r\n            this.flushPendingCanvasMutationFor(canvas, id);\r\n        });\r\n        onRequestAnimationFrame(() => this.flushPendingCanvasMutations());\r\n    }\r\n    flushPendingCanvasMutationFor(canvas, id) {\r\n        if (this.frozen || this.locked) {\r\n            return;\r\n        }\r\n        const valuesWithType = this.pendingCanvasMutations.get(canvas);\r\n        if (!valuesWithType || id === -1)\r\n            return;\r\n        const values = valuesWithType.map((value) => {\r\n            const { type, ...rest } = value;\r\n            return rest;\r\n        });\r\n        const { type } = valuesWithType[0];\r\n        this.mutationCb({ id, type, commands: values });\r\n        this.pendingCanvasMutations.delete(canvas);\r\n    }\r\n}\n\nexport { CanvasManager, CanvasManagerNoop };\n","import r from './image-bitmap-data-url-worker.js';\n\nfunction t(){const t=new Blob([r]);return URL.createObjectURL(t)}\n\nexport { t as getImageBitmapDataUrlWorkerURL };\n","var r = `for(var e=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",t=\"undefined\"==typeof Uint8Array?[]:new Uint8Array(256),a=0;a<64;a++)t[e.charCodeAt(a)]=a;var n=function(t){var a,n=new Uint8Array(t),r=n.length,s=\"\";for(a=0;a<r;a+=3)s+=e[n[a]>>2],s+=e[(3&n[a])<<4|n[a+1]>>4],s+=e[(15&n[a+1])<<2|n[a+2]>>6],s+=e[63&n[a+2]];return r%3==2?s=s.substring(0,s.length-1)+\"=\":r%3==1&&(s=s.substring(0,s.length-2)+\"==\"),s};const r=new Map,s=new Map;const i=self;i.onmessage=async function(e){if(!(\"OffscreenCanvas\"in globalThis))return i.postMessage({id:e.data.id});{const{id:t,bitmap:a,width:o,height:f,maxCanvasSize:c,dataURLOptions:g}=e.data,u=async function(e,t,a){const r=e+\"-\"+t;if(\"OffscreenCanvas\"in globalThis){if(s.has(r))return s.get(r);const i=new OffscreenCanvas(e,t);i.getContext(\"2d\");const o=await i.convertToBlob(a),f=await o.arrayBuffer(),c=n(f);return s.set(r,c),c}return\"\"}(o,f,g),[h,d]=function(e,t,a){if(!a)return[e,t];const[n,r]=a;if(e<=n&&t<=r)return[e,t];let s=e,i=t;return s>n&&(i=Math.floor(n*t/e),s=n),i>r&&(s=Math.floor(r*e/t),i=r),[s,i]}(o,f,c),l=new OffscreenCanvas(h,d),w=l.getContext(\"bitmaprenderer\"),p=h===o&&d===f?a:await createImageBitmap(a,{resizeWidth:h,resizeHeight:d,resizeQuality:\"low\"});w.transferFromImageBitmap(p),a.close();const y=await l.convertToBlob(g),v=y.type,b=await y.arrayBuffer(),m=n(b);if(p.close(),!r.has(t)&&await u===m)return r.set(t,m),i.postMessage({id:t});if(r.get(t)===m)return i.postMessage({id:t});i.postMessage({id:t,type:v,base64:m,width:o,height:f}),r.set(t,m)}};`;\n\nexport { r as default };\n","import { CanvasContext } from '../../../../../types/dist/rrweb-types.js';\nimport { patch, isBlocked, setTimeout, hookSetter } from '../../../utils.js';\nimport { serializeArgs } from './serialize-args.js';\n\nfunction initCanvas2DMutationObserver(cb, win, blockClass, blockSelector, unblockSelector) {\r\n    const handlers = [];\r\n    const props2D = Object.getOwnPropertyNames(win.CanvasRenderingContext2D.prototype);\r\n    for (const prop of props2D) {\r\n        try {\r\n            if (typeof win.CanvasRenderingContext2D.prototype[prop] !== 'function') {\r\n                continue;\r\n            }\r\n            const restoreHandler = patch(win.CanvasRenderingContext2D.prototype, prop, function (original) {\r\n                return function (...args) {\r\n                    if (!isBlocked(this.canvas, blockClass, blockSelector, unblockSelector, true)) {\r\n                        setTimeout(() => {\r\n                            const recordArgs = serializeArgs(args, win, this);\r\n                            cb(this.canvas, {\r\n                                type: CanvasContext['2D'],\r\n                                property: prop,\r\n                                args: recordArgs,\r\n                            });\r\n                        }, 0);\r\n                    }\r\n                    return original.apply(this, args);\r\n                };\r\n            });\r\n            handlers.push(restoreHandler);\r\n        }\r\n        catch {\r\n            const hookHandler = hookSetter(win.CanvasRenderingContext2D.prototype, prop, {\r\n                set(v) {\r\n                    cb(this.canvas, {\r\n                        type: CanvasContext['2D'],\r\n                        property: prop,\r\n                        args: [v],\r\n                        setter: true,\r\n                    });\r\n                },\r\n            });\r\n            handlers.push(hookHandler);\r\n        }\r\n    }\r\n    return () => {\r\n        handlers.forEach((h) => h());\r\n    };\r\n}\n\nexport { initCanvas2DMutationObserver as default };\n","import type { CanvasManagerInterface, CanvasManagerOptions } from '@sentry-internal/replay';\nimport { CanvasManager } from '@sentry-internal/rrweb';\nimport { defineIntegration } from '@sentry/core';\nimport type { Integration, IntegrationFn } from '@sentry/core';\n\ninterface ReplayCanvasIntegration extends Integration {\n  snapshot: (canvasElement?: HTMLCanvasElement) => Promise<void>;\n}\n\ninterface ReplayCanvasOptions {\n  enableManualSnapshot?: boolean;\n  maxCanvasSize?: [width: number, height: number];\n  quality: 'low' | 'medium' | 'high';\n}\n\ntype GetCanvasManager = (options: CanvasManagerOptions) => CanvasManagerInterface;\nexport interface ReplayCanvasIntegrationOptions {\n  enableManualSnapshot?: boolean;\n  maxCanvasSize?: number;\n  recordCanvas: true;\n  getCanvasManager: GetCanvasManager;\n  sampling: {\n    canvas: number;\n  };\n  dataURLOptions: {\n    type: string;\n    quality: number;\n  };\n}\n\nconst CANVAS_QUALITY = {\n  low: {\n    sampling: {\n      canvas: 1,\n    },\n    dataURLOptions: {\n      type: 'image/webp',\n      quality: 0.25,\n    },\n  },\n  medium: {\n    sampling: {\n      canvas: 2,\n    },\n    dataURLOptions: {\n      type: 'image/webp',\n      quality: 0.4,\n    },\n  },\n  high: {\n    sampling: {\n      canvas: 4,\n    },\n    dataURLOptions: {\n      type: 'image/webp',\n      quality: 0.5,\n    },\n  },\n};\n\nconst INTEGRATION_NAME = 'ReplayCanvas';\nconst DEFAULT_MAX_CANVAS_SIZE = 1280;\n\n/** Exported only for type safe tests. */\nexport const _replayCanvasIntegration = ((options: Partial<ReplayCanvasOptions> = {}) => {\n  const [maxCanvasWidth, maxCanvasHeight] = options.maxCanvasSize || [];\n  const _canvasOptions = {\n    quality: options.quality || 'medium',\n    enableManualSnapshot: options.enableManualSnapshot,\n    maxCanvasSize: [\n      maxCanvasWidth ? Math.min(maxCanvasWidth, DEFAULT_MAX_CANVAS_SIZE) : DEFAULT_MAX_CANVAS_SIZE,\n      maxCanvasHeight ? Math.min(maxCanvasHeight, DEFAULT_MAX_CANVAS_SIZE) : DEFAULT_MAX_CANVAS_SIZE,\n    ] as [number, number],\n  };\n\n  let canvasManagerResolve: (value: CanvasManager) => void;\n  const _canvasManager: Promise<CanvasManager> = new Promise(resolve => (canvasManagerResolve = resolve));\n\n  return {\n    name: INTEGRATION_NAME,\n    getOptions(): ReplayCanvasIntegrationOptions {\n      const { quality, enableManualSnapshot, maxCanvasSize } = _canvasOptions;\n\n      return {\n        enableManualSnapshot,\n        recordCanvas: true,\n        getCanvasManager: (getCanvasManagerOptions: CanvasManagerOptions) => {\n          const manager = new CanvasManager({\n            ...getCanvasManagerOptions,\n            enableManualSnapshot,\n            maxCanvasSize,\n            errorHandler: (err: unknown) => {\n              try {\n                if (typeof err === 'object') {\n                  (err as Error & { __rrweb__?: boolean }).__rrweb__ = true;\n                }\n              } catch (error) {\n                // ignore errors here\n                // this can happen if the error is frozen or does not allow mutation for other reasons\n              }\n            },\n          });\n          canvasManagerResolve(manager);\n          return manager;\n        },\n        ...(CANVAS_QUALITY[quality || 'medium'] || CANVAS_QUALITY.medium),\n      };\n    },\n    async snapshot(canvasElement?: HTMLCanvasElement) {\n      const canvasManager = await _canvasManager;\n      canvasManager.snapshot(canvasElement);\n    },\n  };\n}) satisfies IntegrationFn<ReplayCanvasIntegration>;\n\n/**\n * Add this in addition to `replayIntegration()` to enable canvas recording.\n */\nexport const replayCanvasIntegration = defineIntegration(\n  _replayCanvasIntegration,\n) as IntegrationFn<ReplayCanvasIntegration>;\n","var NodeType$1;\r\n(function (NodeType) {\r\n    NodeType[NodeType[\"Document\"] = 0] = \"Document\";\r\n    NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\r\n    NodeType[NodeType[\"Element\"] = 2] = \"Element\";\r\n    NodeType[NodeType[\"Text\"] = 3] = \"Text\";\r\n    NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\r\n    NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\r\n})(NodeType$1 || (NodeType$1 = {}));\nclass Mirror$1 {\r\n    constructor() {\r\n        this.idNodeMap = new Map();\r\n        this.nodeMetaMap = new WeakMap();\r\n    }\r\n    getId(n) {\r\n        if (!n)\r\n            return -1;\r\n        const id = this.getMeta(n)?.id;\r\n        return id ?? -1;\r\n    }\r\n    getNode(id) {\r\n        return this.idNodeMap.get(id) || null;\r\n    }\r\n    getIds() {\r\n        return Array.from(this.idNodeMap.keys());\r\n    }\r\n    getMeta(n) {\r\n        return this.nodeMetaMap.get(n) || null;\r\n    }\r\n    removeNodeFromMap(n) {\r\n        const id = this.getId(n);\r\n        this.idNodeMap.delete(id);\r\n        if (n.childNodes) {\r\n            n.childNodes.forEach((childNode) => this.removeNodeFromMap(childNode));\r\n        }\r\n    }\r\n    has(id) {\r\n        return this.idNodeMap.has(id);\r\n    }\r\n    hasNode(node) {\r\n        return this.nodeMetaMap.has(node);\r\n    }\r\n    add(n, meta) {\r\n        const id = meta.id;\r\n        this.idNodeMap.set(id, n);\r\n        this.nodeMetaMap.set(n, meta);\r\n    }\r\n    replace(id, n) {\r\n        const oldNode = this.getNode(id);\r\n        if (oldNode) {\r\n            const meta = this.nodeMetaMap.get(oldNode);\r\n            if (meta)\r\n                this.nodeMetaMap.set(n, meta);\r\n        }\r\n        this.idNodeMap.set(id, n);\r\n    }\r\n    reset() {\r\n        this.idNodeMap = new Map();\r\n        this.nodeMetaMap = new WeakMap();\r\n    }\r\n}\r\nfunction createMirror$1() {\r\n    return new Mirror$1();\r\n}\n\nfunction parseCSSText(cssText) {\r\n    const res = {};\r\n    const listDelimiter = /;(?![^(]*\\))/g;\r\n    const propertyDelimiter = /:(.+)/;\r\n    const comment = /\\/\\*.*?\\*\\//g;\r\n    cssText\r\n        .replace(comment, '')\r\n        .split(listDelimiter)\r\n        .forEach(function (item) {\r\n        if (item) {\r\n            const tmp = item.split(propertyDelimiter);\r\n            tmp.length > 1 && (res[camelize(tmp[0].trim())] = tmp[1].trim());\r\n        }\r\n    });\r\n    return res;\r\n}\r\nfunction toCSSText(style) {\r\n    const properties = [];\r\n    for (const name in style) {\r\n        const value = style[name];\r\n        if (typeof value !== 'string')\r\n            continue;\r\n        const normalizedName = hyphenate(name);\r\n        properties.push(`${normalizedName}: ${value};`);\r\n    }\r\n    return properties.join(' ');\r\n}\r\nconst camelizeRE = /-([a-z])/g;\r\nconst CUSTOM_PROPERTY_REGEX = /^--[a-zA-Z0-9-]+$/;\r\nconst camelize = (str) => {\r\n    if (CUSTOM_PROPERTY_REGEX.test(str))\r\n        return str;\r\n    return str.replace(camelizeRE, (_, c) => (c ? c.toUpperCase() : ''));\r\n};\r\nconst hyphenateRE = /\\B([A-Z])/g;\r\nconst hyphenate = (str) => {\r\n    return str.replace(hyphenateRE, '-$1').toLowerCase();\r\n};\n\nclass BaseRRNode {\r\n    constructor(..._args) {\r\n        this.parentElement = null;\r\n        this.parentNode = null;\r\n        this.firstChild = null;\r\n        this.lastChild = null;\r\n        this.previousSibling = null;\r\n        this.nextSibling = null;\r\n        this.ELEMENT_NODE = NodeType.ELEMENT_NODE;\r\n        this.TEXT_NODE = NodeType.TEXT_NODE;\r\n    }\r\n    get childNodes() {\r\n        const childNodes = [];\r\n        let childIterator = this.firstChild;\r\n        while (childIterator) {\r\n            childNodes.push(childIterator);\r\n            childIterator = childIterator.nextSibling;\r\n        }\r\n        return childNodes;\r\n    }\r\n    contains(node) {\r\n        if (!(node instanceof BaseRRNode))\r\n            return false;\r\n        else if (node.ownerDocument !== this.ownerDocument)\r\n            return false;\r\n        else if (node === this)\r\n            return true;\r\n        while (node.parentNode) {\r\n            if (node.parentNode === this)\r\n                return true;\r\n            node = node.parentNode;\r\n        }\r\n        return false;\r\n    }\r\n    appendChild(_newChild) {\r\n        throw new Error(`RRDomException: Failed to execute 'appendChild' on 'RRNode': This RRNode type does not support this method.`);\r\n    }\r\n    insertBefore(_newChild, _refChild) {\r\n        throw new Error(`RRDomException: Failed to execute 'insertBefore' on 'RRNode': This RRNode type does not support this method.`);\r\n    }\r\n    removeChild(_node) {\r\n        throw new Error(`RRDomException: Failed to execute 'removeChild' on 'RRNode': This RRNode type does not support this method.`);\r\n    }\r\n    toString() {\r\n        return 'RRNode';\r\n    }\r\n}\r\nfunction BaseRRDocumentImpl(RRNodeClass) {\r\n    return class BaseRRDocument extends RRNodeClass {\r\n        constructor(...args) {\r\n            super(args);\r\n            this.nodeType = NodeType.DOCUMENT_NODE;\r\n            this.nodeName = '#document';\r\n            this.compatMode = 'CSS1Compat';\r\n            this.RRNodeType = NodeType$1.Document;\r\n            this.textContent = null;\r\n            this.ownerDocument = this;\r\n        }\r\n        get documentElement() {\r\n            return (this.childNodes.find((node) => node.RRNodeType === NodeType$1.Element &&\r\n                node.tagName === 'HTML') || null);\r\n        }\r\n        get body() {\r\n            return (this.documentElement?.childNodes.find((node) => node.RRNodeType === NodeType$1.Element &&\r\n                node.tagName === 'BODY') || null);\r\n        }\r\n        get head() {\r\n            return (this.documentElement?.childNodes.find((node) => node.RRNodeType === NodeType$1.Element &&\r\n                node.tagName === 'HEAD') || null);\r\n        }\r\n        get implementation() {\r\n            return this;\r\n        }\r\n        get firstElementChild() {\r\n            return this.documentElement;\r\n        }\r\n        appendChild(newChild) {\r\n            const nodeType = newChild.RRNodeType;\r\n            if (nodeType === NodeType$1.Element ||\r\n                nodeType === NodeType$1.DocumentType) {\r\n                if (this.childNodes.some((s) => s.RRNodeType === nodeType)) {\r\n                    throw new Error(`RRDomException: Failed to execute 'appendChild' on 'RRNode': Only one ${nodeType === NodeType$1.Element ? 'RRElement' : 'RRDoctype'} on RRDocument allowed.`);\r\n                }\r\n            }\r\n            const child = appendChild(this, newChild);\r\n            child.parentElement = null;\r\n            return child;\r\n        }\r\n        insertBefore(newChild, refChild) {\r\n            const nodeType = newChild.RRNodeType;\r\n            if (nodeType === NodeType$1.Element ||\r\n                nodeType === NodeType$1.DocumentType) {\r\n                if (this.childNodes.some((s) => s.RRNodeType === nodeType)) {\r\n                    throw new Error(`RRDomException: Failed to execute 'insertBefore' on 'RRNode': Only one ${nodeType === NodeType$1.Element ? 'RRElement' : 'RRDoctype'} on RRDocument allowed.`);\r\n                }\r\n            }\r\n            const child = insertBefore(this, newChild, refChild);\r\n            child.parentElement = null;\r\n            return child;\r\n        }\r\n        removeChild(node) {\r\n            return removeChild(this, node);\r\n        }\r\n        open() {\r\n            this.firstChild = null;\r\n            this.lastChild = null;\r\n        }\r\n        close() {\r\n        }\r\n        write(content) {\r\n            let publicId;\r\n            if (content ===\r\n                '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"\">')\r\n                publicId = '-//W3C//DTD XHTML 1.0 Transitional//EN';\r\n            else if (content ===\r\n                '<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"\">')\r\n                publicId = '-//W3C//DTD HTML 4.0 Transitional//EN';\r\n            if (publicId) {\r\n                const doctype = this.createDocumentType('html', publicId, '');\r\n                this.open();\r\n                this.appendChild(doctype);\r\n            }\r\n        }\r\n        createDocument(_namespace, _qualifiedName, _doctype) {\r\n            return new BaseRRDocument();\r\n        }\r\n        createDocumentType(qualifiedName, publicId, systemId) {\r\n            const doctype = new (BaseRRDocumentTypeImpl(BaseRRNode))(qualifiedName, publicId, systemId);\r\n            doctype.ownerDocument = this;\r\n            return doctype;\r\n        }\r\n        createElement(tagName) {\r\n            const element = new (BaseRRElementImpl(BaseRRNode))(tagName);\r\n            element.ownerDocument = this;\r\n            return element;\r\n        }\r\n        createElementNS(_namespaceURI, qualifiedName) {\r\n            return this.createElement(qualifiedName);\r\n        }\r\n        createTextNode(data) {\r\n            const text = new (BaseRRTextImpl(BaseRRNode))(data);\r\n            text.ownerDocument = this;\r\n            return text;\r\n        }\r\n        createComment(data) {\r\n            const comment = new (BaseRRCommentImpl(BaseRRNode))(data);\r\n            comment.ownerDocument = this;\r\n            return comment;\r\n        }\r\n        createCDATASection(data) {\r\n            const CDATASection = new (BaseRRCDATASectionImpl(BaseRRNode))(data);\r\n            CDATASection.ownerDocument = this;\r\n            return CDATASection;\r\n        }\r\n        toString() {\r\n            return 'RRDocument';\r\n        }\r\n    };\r\n}\r\nfunction BaseRRDocumentTypeImpl(RRNodeClass) {\r\n    return class BaseRRDocumentType extends RRNodeClass {\r\n        constructor(qualifiedName, publicId, systemId) {\r\n            super();\r\n            this.nodeType = NodeType.DOCUMENT_TYPE_NODE;\r\n            this.RRNodeType = NodeType$1.DocumentType;\r\n            this.name = qualifiedName;\r\n            this.publicId = publicId;\r\n            this.systemId = systemId;\r\n            this.nodeName = qualifiedName;\r\n            this.textContent = null;\r\n        }\r\n        toString() {\r\n            return 'RRDocumentType';\r\n        }\r\n    };\r\n}\r\nfunction BaseRRElementImpl(RRNodeClass) {\r\n    return class BaseRRElement extends RRNodeClass {\r\n        constructor(tagName) {\r\n            super();\r\n            this.nodeType = NodeType.ELEMENT_NODE;\r\n            this.RRNodeType = NodeType$1.Element;\r\n            this.attributes = {};\r\n            this.shadowRoot = null;\r\n            this.tagName = tagName.toUpperCase();\r\n            this.nodeName = tagName.toUpperCase();\r\n        }\r\n        get textContent() {\r\n            let result = '';\r\n            this.childNodes.forEach((node) => (result += node.textContent));\r\n            return result;\r\n        }\r\n        set textContent(textContent) {\r\n            this.firstChild = null;\r\n            this.lastChild = null;\r\n            this.appendChild(this.ownerDocument.createTextNode(textContent));\r\n        }\r\n        get classList() {\r\n            return new ClassList(this.attributes.class, (newClassName) => {\r\n                this.attributes.class = newClassName;\r\n            });\r\n        }\r\n        get id() {\r\n            return this.attributes.id || '';\r\n        }\r\n        get className() {\r\n            return this.attributes.class || '';\r\n        }\r\n        get style() {\r\n            const style = (this.attributes.style ? parseCSSText(this.attributes.style) : {});\r\n            const hyphenateRE = /\\B([A-Z])/g;\r\n            style.setProperty = (name, value, priority) => {\r\n                if (hyphenateRE.test(name))\r\n                    return;\r\n                const normalizedName = camelize(name);\r\n                if (!value)\r\n                    delete style[normalizedName];\r\n                else\r\n                    style[normalizedName] = value;\r\n                if (priority === 'important')\r\n                    style[normalizedName] += ' !important';\r\n                this.attributes.style = toCSSText(style);\r\n            };\r\n            style.removeProperty = (name) => {\r\n                if (hyphenateRE.test(name))\r\n                    return '';\r\n                const normalizedName = camelize(name);\r\n                const value = style[normalizedName] || '';\r\n                delete style[normalizedName];\r\n                this.attributes.style = toCSSText(style);\r\n                return value;\r\n            };\r\n            return style;\r\n        }\r\n        getAttribute(name) {\r\n            return this.attributes[name] || null;\r\n        }\r\n        setAttribute(name, attribute) {\r\n            this.attributes[name] = attribute;\r\n        }\r\n        setAttributeNS(_namespace, qualifiedName, value) {\r\n            this.setAttribute(qualifiedName, value);\r\n        }\r\n        removeAttribute(name) {\r\n            delete this.attributes[name];\r\n        }\r\n        appendChild(newChild) {\r\n            return appendChild(this, newChild);\r\n        }\r\n        insertBefore(newChild, refChild) {\r\n            return insertBefore(this, newChild, refChild);\r\n        }\r\n        removeChild(node) {\r\n            return removeChild(this, node);\r\n        }\r\n        attachShadow(_init) {\r\n            const shadowRoot = this.ownerDocument.createElement('SHADOWROOT');\r\n            this.shadowRoot = shadowRoot;\r\n            return shadowRoot;\r\n        }\r\n        dispatchEvent(_event) {\r\n            return true;\r\n        }\r\n        toString() {\r\n            let attributeString = '';\r\n            for (const attribute in this.attributes) {\r\n                attributeString += `${attribute}=\"${this.attributes[attribute]}\" `;\r\n            }\r\n            return `${this.tagName} ${attributeString}`;\r\n        }\r\n    };\r\n}\r\nfunction BaseRRMediaElementImpl(RRElementClass) {\r\n    return class BaseRRMediaElement extends RRElementClass {\r\n        attachShadow(_init) {\r\n            throw new Error(`RRDomException: Failed to execute 'attachShadow' on 'RRElement': This RRElement does not support attachShadow`);\r\n        }\r\n        play() {\r\n            this.paused = false;\r\n        }\r\n        pause() {\r\n            this.paused = true;\r\n        }\r\n    };\r\n}\r\nfunction BaseRRTextImpl(RRNodeClass) {\r\n    return class BaseRRText extends RRNodeClass {\r\n        constructor(data) {\r\n            super();\r\n            this.nodeType = NodeType.TEXT_NODE;\r\n            this.nodeName = '#text';\r\n            this.RRNodeType = NodeType$1.Text;\r\n            this.data = data;\r\n        }\r\n        get textContent() {\r\n            return this.data;\r\n        }\r\n        set textContent(textContent) {\r\n            this.data = textContent;\r\n        }\r\n        toString() {\r\n            return `RRText text=${JSON.stringify(this.data)}`;\r\n        }\r\n    };\r\n}\r\nfunction BaseRRCommentImpl(RRNodeClass) {\r\n    return class BaseRRComment extends RRNodeClass {\r\n        constructor(data) {\r\n            super();\r\n            this.nodeType = NodeType.COMMENT_NODE;\r\n            this.nodeName = '#comment';\r\n            this.RRNodeType = NodeType$1.Comment;\r\n            this.data = data;\r\n        }\r\n        get textContent() {\r\n            return this.data;\r\n        }\r\n        set textContent(textContent) {\r\n            this.data = textContent;\r\n        }\r\n        toString() {\r\n            return `RRComment text=${JSON.stringify(this.data)}`;\r\n        }\r\n    };\r\n}\r\nfunction BaseRRCDATASectionImpl(RRNodeClass) {\r\n    return class BaseRRCDATASection extends RRNodeClass {\r\n        constructor(data) {\r\n            super();\r\n            this.nodeName = '#cdata-section';\r\n            this.nodeType = NodeType.CDATA_SECTION_NODE;\r\n            this.RRNodeType = NodeType$1.CDATA;\r\n            this.data = data;\r\n        }\r\n        get textContent() {\r\n            return this.data;\r\n        }\r\n        set textContent(textContent) {\r\n            this.data = textContent;\r\n        }\r\n        toString() {\r\n            return `RRCDATASection data=${JSON.stringify(this.data)}`;\r\n        }\r\n    };\r\n}\r\nclass ClassList {\r\n    constructor(classText, onChange) {\r\n        this.classes = [];\r\n        this.add = (...classNames) => {\r\n            for (const item of classNames) {\r\n                const className = String(item);\r\n                if (this.classes.indexOf(className) >= 0)\r\n                    continue;\r\n                this.classes.push(className);\r\n            }\r\n            this.onChange && this.onChange(this.classes.join(' '));\r\n        };\r\n        this.remove = (...classNames) => {\r\n            this.classes = this.classes.filter((item) => classNames.indexOf(item) === -1);\r\n            this.onChange && this.onChange(this.classes.join(' '));\r\n        };\r\n        if (classText) {\r\n            const classes = classText.trim().split(/\\s+/);\r\n            this.classes.push(...classes);\r\n        }\r\n        this.onChange = onChange;\r\n    }\r\n}\r\nfunction appendChild(parent, newChild) {\r\n    if (newChild.parentNode)\r\n        newChild.parentNode.removeChild(newChild);\r\n    if (parent.lastChild) {\r\n        parent.lastChild.nextSibling = newChild;\r\n        newChild.previousSibling = parent.lastChild;\r\n    }\r\n    else {\r\n        parent.firstChild = newChild;\r\n        newChild.previousSibling = null;\r\n    }\r\n    parent.lastChild = newChild;\r\n    newChild.nextSibling = null;\r\n    newChild.parentNode = parent;\r\n    newChild.parentElement = parent;\r\n    newChild.ownerDocument = parent.ownerDocument;\r\n    return newChild;\r\n}\r\nfunction insertBefore(parent, newChild, refChild) {\r\n    if (!refChild)\r\n        return appendChild(parent, newChild);\r\n    if (refChild.parentNode !== parent)\r\n        throw new Error(\"Failed to execute 'insertBefore' on 'RRNode': The RRNode before which the new node is to be inserted is not a child of this RRNode.\");\r\n    if (newChild === refChild)\r\n        return newChild;\r\n    if (newChild.parentNode)\r\n        newChild.parentNode.removeChild(newChild);\r\n    newChild.previousSibling = refChild.previousSibling;\r\n    refChild.previousSibling = newChild;\r\n    newChild.nextSibling = refChild;\r\n    if (newChild.previousSibling)\r\n        newChild.previousSibling.nextSibling = newChild;\r\n    else\r\n        parent.firstChild = newChild;\r\n    newChild.parentElement = parent;\r\n    newChild.parentNode = parent;\r\n    newChild.ownerDocument = parent.ownerDocument;\r\n    return newChild;\r\n}\r\nfunction removeChild(parent, child) {\r\n    if (child.parentNode !== parent)\r\n        throw new Error(\"Failed to execute 'removeChild' on 'RRNode': The RRNode to be removed is not a child of this RRNode.\");\r\n    if (child.previousSibling)\r\n        child.previousSibling.nextSibling = child.nextSibling;\r\n    else\r\n        parent.firstChild = child.nextSibling;\r\n    if (child.nextSibling)\r\n        child.nextSibling.previousSibling = child.previousSibling;\r\n    else\r\n        parent.lastChild = child.previousSibling;\r\n    child.previousSibling = null;\r\n    child.nextSibling = null;\r\n    child.parentElement = null;\r\n    child.parentNode = null;\r\n    return child;\r\n}\r\nvar NodeType;\r\n(function (NodeType) {\r\n    NodeType[NodeType[\"PLACEHOLDER\"] = 0] = \"PLACEHOLDER\";\r\n    NodeType[NodeType[\"ELEMENT_NODE\"] = 1] = \"ELEMENT_NODE\";\r\n    NodeType[NodeType[\"ATTRIBUTE_NODE\"] = 2] = \"ATTRIBUTE_NODE\";\r\n    NodeType[NodeType[\"TEXT_NODE\"] = 3] = \"TEXT_NODE\";\r\n    NodeType[NodeType[\"CDATA_SECTION_NODE\"] = 4] = \"CDATA_SECTION_NODE\";\r\n    NodeType[NodeType[\"ENTITY_REFERENCE_NODE\"] = 5] = \"ENTITY_REFERENCE_NODE\";\r\n    NodeType[NodeType[\"ENTITY_NODE\"] = 6] = \"ENTITY_NODE\";\r\n    NodeType[NodeType[\"PROCESSING_INSTRUCTION_NODE\"] = 7] = \"PROCESSING_INSTRUCTION_NODE\";\r\n    NodeType[NodeType[\"COMMENT_NODE\"] = 8] = \"COMMENT_NODE\";\r\n    NodeType[NodeType[\"DOCUMENT_NODE\"] = 9] = \"DOCUMENT_NODE\";\r\n    NodeType[NodeType[\"DOCUMENT_TYPE_NODE\"] = 10] = \"DOCUMENT_TYPE_NODE\";\r\n    NodeType[NodeType[\"DOCUMENT_FRAGMENT_NODE\"] = 11] = \"DOCUMENT_FRAGMENT_NODE\";\r\n})(NodeType || (NodeType = {}));\n\nfunction getIFrameContentDocument(iframe) {\r\n    try {\r\n        return iframe.contentDocument;\r\n    }\r\n    catch (e) {\r\n    }\r\n}\r\nfunction getIFrameContentWindow(iframe) {\r\n    try {\r\n        return iframe.contentWindow;\r\n    }\r\n    catch (e) {\r\n    }\r\n}\n\nconst NAMESPACES = {\r\n    svg: 'http://www.w3.org/2000/svg',\r\n    'xlink:href': 'http://www.w3.org/1999/xlink',\r\n    xmlns: 'http://www.w3.org/2000/xmlns/',\r\n};\r\nconst SVGTagMap = {\r\n    altglyph: 'altGlyph',\r\n    altglyphdef: 'altGlyphDef',\r\n    altglyphitem: 'altGlyphItem',\r\n    animatecolor: 'animateColor',\r\n    animatemotion: 'animateMotion',\r\n    animatetransform: 'animateTransform',\r\n    clippath: 'clipPath',\r\n    feblend: 'feBlend',\r\n    fecolormatrix: 'feColorMatrix',\r\n    fecomponenttransfer: 'feComponentTransfer',\r\n    fecomposite: 'feComposite',\r\n    feconvolvematrix: 'feConvolveMatrix',\r\n    fediffuselighting: 'feDiffuseLighting',\r\n    fedisplacementmap: 'feDisplacementMap',\r\n    fedistantlight: 'feDistantLight',\r\n    fedropshadow: 'feDropShadow',\r\n    feflood: 'feFlood',\r\n    fefunca: 'feFuncA',\r\n    fefuncb: 'feFuncB',\r\n    fefuncg: 'feFuncG',\r\n    fefuncr: 'feFuncR',\r\n    fegaussianblur: 'feGaussianBlur',\r\n    feimage: 'feImage',\r\n    femerge: 'feMerge',\r\n    femergenode: 'feMergeNode',\r\n    femorphology: 'feMorphology',\r\n    feoffset: 'feOffset',\r\n    fepointlight: 'fePointLight',\r\n    fespecularlighting: 'feSpecularLighting',\r\n    fespotlight: 'feSpotLight',\r\n    fetile: 'feTile',\r\n    feturbulence: 'feTurbulence',\r\n    foreignobject: 'foreignObject',\r\n    glyphref: 'glyphRef',\r\n    lineargradient: 'linearGradient',\r\n    radialgradient: 'radialGradient',\r\n};\r\nlet createdNodeSet = null;\r\nfunction diff(oldTree, newTree, replayer, rrnodeMirror = newTree.mirror ||\r\n    newTree.ownerDocument.mirror) {\r\n    oldTree = diffBeforeUpdatingChildren(oldTree, newTree, replayer, rrnodeMirror);\r\n    diffChildren(oldTree, newTree, replayer, rrnodeMirror);\r\n    diffAfterUpdatingChildren(oldTree, newTree, replayer);\r\n}\r\nfunction diffBeforeUpdatingChildren(oldTree, newTree, replayer, rrnodeMirror) {\r\n    if (replayer.afterAppend && !createdNodeSet) {\r\n        createdNodeSet = new WeakSet();\r\n        setTimeout(() => {\r\n            createdNodeSet = null;\r\n        }, 0);\r\n    }\r\n    if (!sameNodeType(oldTree, newTree)) {\r\n        const calibratedOldTree = createOrGetNode(newTree, replayer.mirror, rrnodeMirror);\r\n        oldTree.parentNode?.replaceChild(calibratedOldTree, oldTree);\r\n        oldTree = calibratedOldTree;\r\n    }\r\n    switch (newTree.RRNodeType) {\r\n        case NodeType$1.Document: {\r\n            if (!nodeMatching(oldTree, newTree, replayer.mirror, rrnodeMirror)) {\r\n                const newMeta = rrnodeMirror.getMeta(newTree);\r\n                if (newMeta) {\r\n                    replayer.mirror.removeNodeFromMap(oldTree);\r\n                    oldTree.close();\r\n                    oldTree.open();\r\n                    replayer.mirror.add(oldTree, newMeta);\r\n                    createdNodeSet?.add(oldTree);\r\n                }\r\n            }\r\n            break;\r\n        }\r\n        case NodeType$1.Element: {\r\n            const oldElement = oldTree;\r\n            const newRRElement = newTree;\r\n            switch (newRRElement.tagName) {\r\n                case 'IFRAME': {\r\n                    const oldContentDocument = getIFrameContentDocument(oldTree);\r\n                    if (!oldContentDocument)\r\n                        break;\r\n                    diff(oldContentDocument, newTree.contentDocument, replayer, rrnodeMirror);\r\n                    break;\r\n                }\r\n            }\r\n            if (newRRElement.shadowRoot) {\r\n                if (!oldElement.shadowRoot)\r\n                    oldElement.attachShadow({ mode: 'open' });\r\n                diffChildren(oldElement.shadowRoot, newRRElement.shadowRoot, replayer, rrnodeMirror);\r\n            }\r\n            diffProps(oldElement, newRRElement, rrnodeMirror);\r\n            break;\r\n        }\r\n    }\r\n    return oldTree;\r\n}\r\nfunction diffAfterUpdatingChildren(oldTree, newTree, replayer) {\r\n    switch (newTree.RRNodeType) {\r\n        case NodeType$1.Document: {\r\n            const scrollData = newTree.scrollData;\r\n            scrollData && replayer.applyScroll(scrollData, true);\r\n            break;\r\n        }\r\n        case NodeType$1.Element: {\r\n            const oldElement = oldTree;\r\n            const newRRElement = newTree;\r\n            newRRElement.scrollData &&\r\n                replayer.applyScroll(newRRElement.scrollData, true);\r\n            newRRElement.inputData && replayer.applyInput(newRRElement.inputData);\r\n            switch (newRRElement.tagName) {\r\n                case 'AUDIO':\r\n                case 'VIDEO': {\r\n                    const oldMediaElement = oldTree;\r\n                    const newMediaRRElement = newRRElement;\r\n                    if (newMediaRRElement.paused !== undefined)\r\n                        newMediaRRElement.paused\r\n                            ? void oldMediaElement.pause()\r\n                            : void oldMediaElement.play();\r\n                    if (newMediaRRElement.muted !== undefined)\r\n                        oldMediaElement.muted = newMediaRRElement.muted;\r\n                    if (newMediaRRElement.volume !== undefined)\r\n                        oldMediaElement.volume = newMediaRRElement.volume;\r\n                    if (newMediaRRElement.currentTime !== undefined)\r\n                        oldMediaElement.currentTime = newMediaRRElement.currentTime;\r\n                    if (newMediaRRElement.playbackRate !== undefined)\r\n                        oldMediaElement.playbackRate = newMediaRRElement.playbackRate;\r\n                    break;\r\n                }\r\n                case 'CANVAS': {\r\n                    const rrCanvasElement = newTree;\r\n                    if (rrCanvasElement.rr_dataURL !== null) {\r\n                        const image = document.createElement('img');\r\n                        image.onload = () => {\r\n                            const ctx = oldElement.getContext('2d');\r\n                            if (ctx) {\r\n                                ctx.drawImage(image, 0, 0, image.width, image.height);\r\n                            }\r\n                        };\r\n                        image.src = rrCanvasElement.rr_dataURL;\r\n                    }\r\n                    rrCanvasElement.canvasMutations.forEach((canvasMutation) => replayer.applyCanvas(canvasMutation.event, canvasMutation.mutation, oldTree));\r\n                    break;\r\n                }\r\n                case 'STYLE': {\r\n                    const styleSheet = oldElement.sheet;\r\n                    styleSheet &&\r\n                        newTree.rules.forEach((data) => replayer.applyStyleSheetMutation(data, styleSheet));\r\n                    break;\r\n                }\r\n            }\r\n            break;\r\n        }\r\n        case NodeType$1.Text:\r\n        case NodeType$1.Comment:\r\n        case NodeType$1.CDATA: {\r\n            if (oldTree.textContent !==\r\n                newTree.data)\r\n                oldTree.textContent = newTree.data;\r\n            break;\r\n        }\r\n    }\r\n    if (createdNodeSet?.has(oldTree)) {\r\n        createdNodeSet.delete(oldTree);\r\n        replayer.afterAppend?.(oldTree, replayer.mirror.getId(oldTree));\r\n    }\r\n}\r\nfunction diffProps(oldTree, newTree, rrnodeMirror) {\r\n    const oldAttributes = oldTree.attributes;\r\n    const newAttributes = newTree.attributes;\r\n    for (const name in newAttributes) {\r\n        const newValue = newAttributes[name];\r\n        const sn = rrnodeMirror.getMeta(newTree);\r\n        if (sn?.isSVG && NAMESPACES[name])\r\n            oldTree.setAttributeNS(NAMESPACES[name], name, newValue);\r\n        else if (newTree.tagName === 'CANVAS' && name === 'rr_dataURL') {\r\n            const image = document.createElement('img');\r\n            image.src = newValue;\r\n            image.onload = () => {\r\n                const ctx = oldTree.getContext('2d');\r\n                if (ctx) {\r\n                    ctx.drawImage(image, 0, 0, image.width, image.height);\r\n                }\r\n            };\r\n        }\r\n        else if (newTree.tagName === 'IFRAME' && name === 'srcdoc')\r\n            continue;\r\n        else {\r\n            try {\r\n                oldTree.setAttribute(name, newValue);\r\n            }\r\n            catch (err) {\r\n                console.warn(err);\r\n            }\r\n        }\r\n    }\r\n    for (const { name } of Array.from(oldAttributes))\r\n        if (!(name in newAttributes))\r\n            oldTree.removeAttribute(name);\r\n    newTree.scrollLeft && (oldTree.scrollLeft = newTree.scrollLeft);\r\n    newTree.scrollTop && (oldTree.scrollTop = newTree.scrollTop);\r\n}\r\nfunction diffChildren(oldTree, newTree, replayer, rrnodeMirror) {\r\n    const oldChildren = Array.from(oldTree.childNodes);\r\n    const newChildren = newTree.childNodes;\r\n    if (oldChildren.length === 0 && newChildren.length === 0)\r\n        return;\r\n    let oldStartIndex = 0, oldEndIndex = oldChildren.length - 1, newStartIndex = 0, newEndIndex = newChildren.length - 1;\r\n    let oldStartNode = oldChildren[oldStartIndex], oldEndNode = oldChildren[oldEndIndex], newStartNode = newChildren[newStartIndex], newEndNode = newChildren[newEndIndex];\r\n    let oldIdToIndex = undefined, indexInOld = undefined;\r\n    while (oldStartIndex <= oldEndIndex && newStartIndex <= newEndIndex) {\r\n        if (oldStartNode === undefined) {\r\n            oldStartNode = oldChildren[++oldStartIndex];\r\n        }\r\n        else if (oldEndNode === undefined) {\r\n            oldEndNode = oldChildren[--oldEndIndex];\r\n        }\r\n        else if (nodeMatching(oldStartNode, newStartNode, replayer.mirror, rrnodeMirror)) {\r\n            oldStartNode = oldChildren[++oldStartIndex];\r\n            newStartNode = newChildren[++newStartIndex];\r\n        }\r\n        else if (nodeMatching(oldEndNode, newEndNode, replayer.mirror, rrnodeMirror)) {\r\n            oldEndNode = oldChildren[--oldEndIndex];\r\n            newEndNode = newChildren[--newEndIndex];\r\n        }\r\n        else if (nodeMatching(oldStartNode, newEndNode, replayer.mirror, rrnodeMirror)) {\r\n            try {\r\n                oldTree.insertBefore(oldStartNode, oldEndNode.nextSibling);\r\n            }\r\n            catch (e) {\r\n                console.warn(e);\r\n            }\r\n            oldStartNode = oldChildren[++oldStartIndex];\r\n            newEndNode = newChildren[--newEndIndex];\r\n        }\r\n        else if (nodeMatching(oldEndNode, newStartNode, replayer.mirror, rrnodeMirror)) {\r\n            try {\r\n                oldTree.insertBefore(oldEndNode, oldStartNode);\r\n            }\r\n            catch (e) {\r\n                console.warn(e);\r\n            }\r\n            oldEndNode = oldChildren[--oldEndIndex];\r\n            newStartNode = newChildren[++newStartIndex];\r\n        }\r\n        else {\r\n            if (!oldIdToIndex) {\r\n                oldIdToIndex = {};\r\n                for (let i = oldStartIndex; i <= oldEndIndex; i++) {\r\n                    const oldChild = oldChildren[i];\r\n                    if (oldChild && replayer.mirror.hasNode(oldChild))\r\n                        oldIdToIndex[replayer.mirror.getId(oldChild)] = i;\r\n                }\r\n            }\r\n            indexInOld = oldIdToIndex[rrnodeMirror.getId(newStartNode)];\r\n            const nodeToMove = oldChildren[indexInOld];\r\n            if (indexInOld !== undefined &&\r\n                nodeToMove &&\r\n                nodeMatching(nodeToMove, newStartNode, replayer.mirror, rrnodeMirror)) {\r\n                try {\r\n                    oldTree.insertBefore(nodeToMove, oldStartNode);\r\n                }\r\n                catch (e) {\r\n                    console.warn(e);\r\n                }\r\n                oldChildren[indexInOld] = undefined;\r\n            }\r\n            else {\r\n                const newNode = createOrGetNode(newStartNode, replayer.mirror, rrnodeMirror);\r\n                if (oldTree.nodeName === '#document' &&\r\n                    oldStartNode &&\r\n                    ((newNode.nodeType === newNode.DOCUMENT_TYPE_NODE &&\r\n                        oldStartNode.nodeType === oldStartNode.DOCUMENT_TYPE_NODE) ||\r\n                        (newNode.nodeType === newNode.ELEMENT_NODE &&\r\n                            oldStartNode.nodeType === oldStartNode.ELEMENT_NODE))) {\r\n                    oldTree.removeChild(oldStartNode);\r\n                    replayer.mirror.removeNodeFromMap(oldStartNode);\r\n                    oldStartNode = oldChildren[++oldStartIndex];\r\n                }\r\n                try {\r\n                    oldTree.insertBefore(newNode, oldStartNode || null);\r\n                }\r\n                catch (e) {\r\n                    console.warn(e);\r\n                }\r\n            }\r\n            newStartNode = newChildren[++newStartIndex];\r\n        }\r\n    }\r\n    if (oldStartIndex > oldEndIndex) {\r\n        const referenceRRNode = newChildren[newEndIndex + 1];\r\n        let referenceNode = null;\r\n        if (referenceRRNode)\r\n            referenceNode = replayer.mirror.getNode(rrnodeMirror.getId(referenceRRNode));\r\n        for (; newStartIndex <= newEndIndex; ++newStartIndex) {\r\n            const newNode = createOrGetNode(newChildren[newStartIndex], replayer.mirror, rrnodeMirror);\r\n            try {\r\n                oldTree.insertBefore(newNode, referenceNode);\r\n            }\r\n            catch (e) {\r\n                console.warn(e);\r\n            }\r\n        }\r\n    }\r\n    else if (newStartIndex > newEndIndex) {\r\n        for (; oldStartIndex <= oldEndIndex; oldStartIndex++) {\r\n            const node = oldChildren[oldStartIndex];\r\n            if (!node || node.parentNode !== oldTree)\r\n                continue;\r\n            try {\r\n                oldTree.removeChild(node);\r\n                replayer.mirror.removeNodeFromMap(node);\r\n            }\r\n            catch (e) {\r\n                console.warn(e);\r\n            }\r\n        }\r\n    }\r\n    let oldChild = oldTree.firstChild;\r\n    let newChild = newTree.firstChild;\r\n    while (oldChild !== null && newChild !== null) {\r\n        diff(oldChild, newChild, replayer, rrnodeMirror);\r\n        oldChild = oldChild.nextSibling;\r\n        newChild = newChild.nextSibling;\r\n    }\r\n}\r\nfunction createOrGetNode(rrNode, domMirror, rrnodeMirror) {\r\n    const nodeId = rrnodeMirror.getId(rrNode);\r\n    const sn = rrnodeMirror.getMeta(rrNode);\r\n    let node = null;\r\n    if (nodeId > -1)\r\n        node = domMirror.getNode(nodeId);\r\n    if (node !== null && sameNodeType(node, rrNode))\r\n        return node;\r\n    switch (rrNode.RRNodeType) {\r\n        case NodeType$1.Document:\r\n            node = new Document();\r\n            break;\r\n        case NodeType$1.DocumentType:\r\n            node = document.implementation.createDocumentType(rrNode.name, rrNode.publicId, rrNode.systemId);\r\n            break;\r\n        case NodeType$1.Element: {\r\n            let tagName = rrNode.tagName.toLowerCase();\r\n            tagName = SVGTagMap[tagName] || tagName;\r\n            if (sn && 'isSVG' in sn && sn?.isSVG) {\r\n                node = document.createElementNS(NAMESPACES['svg'], tagName);\r\n            }\r\n            else\r\n                node = document.createElement(rrNode.tagName);\r\n            break;\r\n        }\r\n        case NodeType$1.Text:\r\n            node = document.createTextNode(rrNode.data);\r\n            break;\r\n        case NodeType$1.Comment:\r\n            node = document.createComment(rrNode.data);\r\n            break;\r\n        case NodeType$1.CDATA:\r\n            node = document.createCDATASection(rrNode.data);\r\n            break;\r\n    }\r\n    if (sn)\r\n        domMirror.add(node, { ...sn });\r\n    try {\r\n        createdNodeSet?.add(node);\r\n    }\r\n    catch (e) {\r\n    }\r\n    return node;\r\n}\r\nfunction sameNodeType(node1, node2) {\r\n    if (node1.nodeType !== node2.nodeType)\r\n        return false;\r\n    return (node1.nodeType !== node1.ELEMENT_NODE ||\r\n        node1.tagName.toUpperCase() ===\r\n            node2.tagName);\r\n}\r\nfunction nodeMatching(node1, node2, domMirror, rrdomMirror) {\r\n    const node1Id = domMirror.getId(node1);\r\n    const node2Id = rrdomMirror.getId(node2);\r\n    if (node1Id === -1 || node1Id !== node2Id)\r\n        return false;\r\n    return sameNodeType(node1, node2);\r\n}\n\nclass RRDocument extends BaseRRDocumentImpl(BaseRRNode) {\r\n    get unserializedId() {\r\n        return this._unserializedId--;\r\n    }\r\n    constructor(mirror) {\r\n        super();\r\n        this.UNSERIALIZED_STARTING_ID = -2;\r\n        this._unserializedId = this.UNSERIALIZED_STARTING_ID;\r\n        this.mirror = createMirror();\r\n        this.scrollData = null;\r\n        if (mirror) {\r\n            this.mirror = mirror;\r\n        }\r\n    }\r\n    createDocument(_namespace, _qualifiedName, _doctype) {\r\n        return new RRDocument();\r\n    }\r\n    createDocumentType(qualifiedName, publicId, systemId) {\r\n        const documentTypeNode = new RRDocumentType(qualifiedName, publicId, systemId);\r\n        documentTypeNode.ownerDocument = this;\r\n        return documentTypeNode;\r\n    }\r\n    createElement(tagName) {\r\n        const upperTagName = tagName.toUpperCase();\r\n        let element;\r\n        switch (upperTagName) {\r\n            case 'AUDIO':\r\n            case 'VIDEO':\r\n                element = new RRMediaElement(upperTagName);\r\n                break;\r\n            case 'IFRAME':\r\n                element = new RRIFrameElement(upperTagName, this.mirror);\r\n                break;\r\n            case 'CANVAS':\r\n                element = new RRCanvasElement(upperTagName);\r\n                break;\r\n            case 'STYLE':\r\n                element = new RRStyleElement(upperTagName);\r\n                break;\r\n            default:\r\n                element = new RRElement(upperTagName);\r\n                break;\r\n        }\r\n        element.ownerDocument = this;\r\n        return element;\r\n    }\r\n    createComment(data) {\r\n        const commentNode = new RRComment(data);\r\n        commentNode.ownerDocument = this;\r\n        return commentNode;\r\n    }\r\n    createCDATASection(data) {\r\n        const sectionNode = new RRCDATASection(data);\r\n        sectionNode.ownerDocument = this;\r\n        return sectionNode;\r\n    }\r\n    createTextNode(data) {\r\n        const textNode = new RRText(data);\r\n        textNode.ownerDocument = this;\r\n        return textNode;\r\n    }\r\n    destroyTree() {\r\n        this.firstChild = null;\r\n        this.lastChild = null;\r\n        this.mirror.reset();\r\n    }\r\n    open() {\r\n        super.open();\r\n        this._unserializedId = this.UNSERIALIZED_STARTING_ID;\r\n    }\r\n}\r\nconst RRDocumentType = BaseRRDocumentTypeImpl(BaseRRNode);\r\nclass RRElement extends BaseRRElementImpl(BaseRRNode) {\r\n    constructor() {\r\n        super(...arguments);\r\n        this.inputData = null;\r\n        this.scrollData = null;\r\n    }\r\n}\r\nclass RRMediaElement extends BaseRRMediaElementImpl(RRElement) {\r\n}\r\nclass RRCanvasElement extends RRElement {\r\n    constructor() {\r\n        super(...arguments);\r\n        this.rr_dataURL = null;\r\n        this.canvasMutations = [];\r\n    }\r\n    getContext() {\r\n        return null;\r\n    }\r\n}\r\nclass RRStyleElement extends RRElement {\r\n    constructor() {\r\n        super(...arguments);\r\n        this.rules = [];\r\n    }\r\n}\r\nclass RRIFrameElement extends RRElement {\r\n    constructor(upperTagName, mirror) {\r\n        super(upperTagName);\r\n        this.contentDocument = new RRDocument();\r\n        this.contentDocument.mirror = mirror;\r\n    }\r\n}\r\nconst RRText = BaseRRTextImpl(BaseRRNode);\r\nconst RRComment = BaseRRCommentImpl(BaseRRNode);\r\nconst RRCDATASection = BaseRRCDATASectionImpl(BaseRRNode);\r\nfunction getValidTagName(element) {\r\n    if (element instanceof HTMLFormElement) {\r\n        return 'FORM';\r\n    }\r\n    return element.tagName.toUpperCase();\r\n}\r\nfunction buildFromNode(node, rrdom, domMirror, parentRRNode) {\r\n    let rrNode;\r\n    switch (node.nodeType) {\r\n        case NodeType.DOCUMENT_NODE:\r\n            if (parentRRNode && parentRRNode.nodeName === 'IFRAME')\r\n                rrNode = parentRRNode.contentDocument;\r\n            else {\r\n                rrNode = rrdom;\r\n                rrNode.compatMode = node.compatMode;\r\n            }\r\n            break;\r\n        case NodeType.DOCUMENT_TYPE_NODE: {\r\n            const documentType = node;\r\n            rrNode = rrdom.createDocumentType(documentType.name, documentType.publicId, documentType.systemId);\r\n            break;\r\n        }\r\n        case NodeType.ELEMENT_NODE: {\r\n            const elementNode = node;\r\n            const tagName = getValidTagName(elementNode);\r\n            rrNode = rrdom.createElement(tagName);\r\n            const rrElement = rrNode;\r\n            for (const { name, value } of Array.from(elementNode.attributes)) {\r\n                rrElement.attributes[name] = value;\r\n            }\r\n            elementNode.scrollLeft && (rrElement.scrollLeft = elementNode.scrollLeft);\r\n            elementNode.scrollTop && (rrElement.scrollTop = elementNode.scrollTop);\r\n            break;\r\n        }\r\n        case NodeType.TEXT_NODE:\r\n            rrNode = rrdom.createTextNode(node.textContent || '');\r\n            break;\r\n        case NodeType.CDATA_SECTION_NODE:\r\n            rrNode = rrdom.createCDATASection(node.data);\r\n            break;\r\n        case NodeType.COMMENT_NODE:\r\n            rrNode = rrdom.createComment(node.textContent || '');\r\n            break;\r\n        case NodeType.DOCUMENT_FRAGMENT_NODE:\r\n            rrNode = parentRRNode.attachShadow({ mode: 'open' });\r\n            break;\r\n        default:\r\n            return null;\r\n    }\r\n    let sn = domMirror.getMeta(node);\r\n    if (rrdom instanceof RRDocument) {\r\n        if (!sn) {\r\n            sn = getDefaultSN(rrNode, rrdom.unserializedId);\r\n            domMirror.add(node, sn);\r\n        }\r\n        rrdom.mirror.add(rrNode, { ...sn });\r\n    }\r\n    return rrNode;\r\n}\r\nfunction buildFromDom(dom, domMirror = createMirror$1(), rrdom = new RRDocument()) {\r\n    function walk(node, parentRRNode) {\r\n        const rrNode = buildFromNode(node, rrdom, domMirror, parentRRNode);\r\n        if (rrNode === null)\r\n            return;\r\n        if (parentRRNode?.nodeName !== 'IFRAME' &&\r\n            node.nodeType !== NodeType.DOCUMENT_FRAGMENT_NODE) {\r\n            parentRRNode?.appendChild(rrNode);\r\n            rrNode.parentNode = parentRRNode;\r\n            rrNode.parentElement = parentRRNode;\r\n        }\r\n        if (node.nodeName === 'IFRAME') {\r\n            const iframeDoc = getIFrameContentDocument(node);\r\n            iframeDoc && walk(iframeDoc, rrNode);\r\n        }\r\n        else if (node.nodeType === NodeType.DOCUMENT_NODE ||\r\n            node.nodeType === NodeType.ELEMENT_NODE ||\r\n            node.nodeType === NodeType.DOCUMENT_FRAGMENT_NODE) {\r\n            if (node.nodeType === NodeType.ELEMENT_NODE &&\r\n                node.shadowRoot)\r\n                walk(node.shadowRoot, rrNode);\r\n            node.childNodes.forEach((childNode) => walk(childNode, rrNode));\r\n        }\r\n    }\r\n    walk(dom, null);\r\n    return rrdom;\r\n}\r\nfunction createMirror() {\r\n    return new Mirror();\r\n}\r\nclass Mirror {\r\n    constructor() {\r\n        this.idNodeMap = new Map();\r\n        this.nodeMetaMap = new WeakMap();\r\n    }\r\n    getId(n) {\r\n        if (!n)\r\n            return -1;\r\n        const id = this.getMeta(n)?.id;\r\n        return id ?? -1;\r\n    }\r\n    getNode(id) {\r\n        return this.idNodeMap.get(id) || null;\r\n    }\r\n    getIds() {\r\n        return Array.from(this.idNodeMap.keys());\r\n    }\r\n    getMeta(n) {\r\n        return this.nodeMetaMap.get(n) || null;\r\n    }\r\n    removeNodeFromMap(n) {\r\n        const id = this.getId(n);\r\n        this.idNodeMap.delete(id);\r\n        if (n.childNodes) {\r\n            n.childNodes.forEach((childNode) => this.removeNodeFromMap(childNode));\r\n        }\r\n    }\r\n    has(id) {\r\n        return this.idNodeMap.has(id);\r\n    }\r\n    hasNode(node) {\r\n        return this.nodeMetaMap.has(node);\r\n    }\r\n    add(n, meta) {\r\n        const id = meta.id;\r\n        this.idNodeMap.set(id, n);\r\n        this.nodeMetaMap.set(n, meta);\r\n    }\r\n    replace(id, n) {\r\n        const oldNode = this.getNode(id);\r\n        if (oldNode) {\r\n            const meta = this.nodeMetaMap.get(oldNode);\r\n            if (meta)\r\n                this.nodeMetaMap.set(n, meta);\r\n        }\r\n        this.idNodeMap.set(id, n);\r\n    }\r\n    reset() {\r\n        this.idNodeMap = new Map();\r\n        this.nodeMetaMap = new WeakMap();\r\n    }\r\n}\r\nfunction getDefaultSN(node, id) {\r\n    switch (node.RRNodeType) {\r\n        case NodeType$1.Document:\r\n            return {\r\n                id,\r\n                type: node.RRNodeType,\r\n                childNodes: [],\r\n            };\r\n        case NodeType$1.DocumentType: {\r\n            const doctype = node;\r\n            return {\r\n                id,\r\n                type: node.RRNodeType,\r\n                name: doctype.name,\r\n                publicId: doctype.publicId,\r\n                systemId: doctype.systemId,\r\n            };\r\n        }\r\n        case NodeType$1.Element:\r\n            return {\r\n                id,\r\n                type: node.RRNodeType,\r\n                tagName: node.tagName.toLowerCase(),\r\n                attributes: {},\r\n                childNodes: [],\r\n            };\r\n        case NodeType$1.Text:\r\n            return {\r\n                id,\r\n                type: node.RRNodeType,\r\n                textContent: node.textContent || '',\r\n            };\r\n        case NodeType$1.Comment:\r\n            return {\r\n                id,\r\n                type: node.RRNodeType,\r\n                textContent: node.textContent || '',\r\n            };\r\n        case NodeType$1.CDATA:\r\n            return {\r\n                id,\r\n                type: node.RRNodeType,\r\n                textContent: '',\r\n            };\r\n    }\r\n}\n\nexport { BaseRRCDATASectionImpl, BaseRRCommentImpl, BaseRRDocumentImpl, BaseRRDocumentTypeImpl, BaseRRElementImpl, BaseRRMediaElementImpl, BaseRRNode, BaseRRTextImpl, ClassList, Mirror, NodeType, RRCDATASection, RRCanvasElement, RRComment, RRDocument, RRDocumentType, RRElement, RRIFrameElement, RRMediaElement, BaseRRNode as RRNode, RRStyleElement, RRText, buildFromDom, buildFromNode, createMirror, createOrGetNode, diff, getDefaultSN, getIFrameContentDocument, getIFrameContentWindow };\n","import { isShadowRoot, isNativeShadowDom, getInputType, getInputValue, shouldMaskInput, needMaskingText, maskInputValue, ignoreAttribute, transformAttribute, toLowerCase, IGNORED_NODE, serializeNodeWithId } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { isIgnored, isBlocked, isSerialized, isAncestorRemoved, closestElementOfNode, hasShadowRoot, inDom, getShadowHost, isSerializedIframe, isSerializedStylesheet } from '../utils.js';\nimport { getIFrameContentDocument } from '../../../rrdom/es/rrdom.js';\n\nfunction isNodeInLinkedList(n) {\r\n    return '__ln' in n;\r\n}\r\nclass DoubleLinkedList {\r\n    constructor() {\r\n        this.length = 0;\r\n        this.head = null;\r\n        this.tail = null;\r\n    }\r\n    get(position) {\r\n        if (position >= this.length) {\r\n            throw new Error('Position outside of list range');\r\n        }\r\n        let current = this.head;\r\n        for (let index = 0; index < position; index++) {\r\n            current = current?.next || null;\r\n        }\r\n        return current;\r\n    }\r\n    addNode(n) {\r\n        const node = {\r\n            value: n,\r\n            previous: null,\r\n            next: null,\r\n        };\r\n        n.__ln = node;\r\n        if (n.previousSibling && isNodeInLinkedList(n.previousSibling)) {\r\n            const current = n.previousSibling.__ln.next;\r\n            node.next = current;\r\n            node.previous = n.previousSibling.__ln;\r\n            n.previousSibling.__ln.next = node;\r\n            if (current) {\r\n                current.previous = node;\r\n            }\r\n        }\r\n        else if (n.nextSibling &&\r\n            isNodeInLinkedList(n.nextSibling) &&\r\n            n.nextSibling.__ln.previous) {\r\n            const current = n.nextSibling.__ln.previous;\r\n            node.previous = current;\r\n            node.next = n.nextSibling.__ln;\r\n            n.nextSibling.__ln.previous = node;\r\n            if (current) {\r\n                current.next = node;\r\n            }\r\n        }\r\n        else {\r\n            if (this.head) {\r\n                this.head.previous = node;\r\n            }\r\n            node.next = this.head;\r\n            this.head = node;\r\n        }\r\n        if (node.next === null) {\r\n            this.tail = node;\r\n        }\r\n        this.length++;\r\n    }\r\n    removeNode(n) {\r\n        const current = n.__ln;\r\n        if (!this.head) {\r\n            return;\r\n        }\r\n        if (!current.previous) {\r\n            this.head = current.next;\r\n            if (this.head) {\r\n                this.head.previous = null;\r\n            }\r\n            else {\r\n                this.tail = null;\r\n            }\r\n        }\r\n        else {\r\n            current.previous.next = current.next;\r\n            if (current.next) {\r\n                current.next.previous = current.previous;\r\n            }\r\n            else {\r\n                this.tail = current.previous;\r\n            }\r\n        }\r\n        if (n.__ln) {\r\n            delete n.__ln;\r\n        }\r\n        this.length--;\r\n    }\r\n}\r\nconst moveKey = (id, parentId) => `${id}@${parentId}`;\r\nclass MutationBuffer {\r\n    constructor() {\r\n        this.frozen = false;\r\n        this.locked = false;\r\n        this.texts = [];\r\n        this.attributes = [];\r\n        this.attributeMap = new WeakMap();\r\n        this.removes = [];\r\n        this.mapRemoves = [];\r\n        this.movedMap = {};\r\n        this.addedSet = new Set();\r\n        this.movedSet = new Set();\r\n        this.droppedSet = new Set();\r\n        this.processMutations = (mutations) => {\r\n            mutations.forEach(this.processMutation);\r\n            this.emit();\r\n        };\r\n        this.emit = () => {\r\n            if (this.frozen || this.locked) {\r\n                return;\r\n            }\r\n            const adds = [];\r\n            const addedIds = new Set();\r\n            const addList = new DoubleLinkedList();\r\n            const getNextId = (n) => {\r\n                let ns = n;\r\n                let nextId = IGNORED_NODE;\r\n                while (nextId === IGNORED_NODE) {\r\n                    ns = ns && ns.nextSibling;\r\n                    nextId = ns && this.mirror.getId(ns);\r\n                }\r\n                return nextId;\r\n            };\r\n            const pushAdd = (n) => {\r\n                if (!n.parentNode || !inDom(n)) {\r\n                    return;\r\n                }\r\n                const parentId = isShadowRoot(n.parentNode)\r\n                    ? this.mirror.getId(getShadowHost(n))\r\n                    : this.mirror.getId(n.parentNode);\r\n                const nextId = getNextId(n);\r\n                if (parentId === -1 || nextId === -1) {\r\n                    return addList.addNode(n);\r\n                }\r\n                const sn = serializeNodeWithId(n, {\r\n                    doc: this.doc,\r\n                    mirror: this.mirror,\r\n                    blockClass: this.blockClass,\r\n                    blockSelector: this.blockSelector,\r\n                    maskAllText: this.maskAllText,\r\n                    unblockSelector: this.unblockSelector,\r\n                    maskTextClass: this.maskTextClass,\r\n                    unmaskTextClass: this.unmaskTextClass,\r\n                    maskTextSelector: this.maskTextSelector,\r\n                    unmaskTextSelector: this.unmaskTextSelector,\r\n                    skipChild: true,\r\n                    newlyAddedElement: true,\r\n                    inlineStylesheet: this.inlineStylesheet,\r\n                    maskInputOptions: this.maskInputOptions,\r\n                    maskAttributeFn: this.maskAttributeFn,\r\n                    maskTextFn: this.maskTextFn,\r\n                    maskInputFn: this.maskInputFn,\r\n                    slimDOMOptions: this.slimDOMOptions,\r\n                    dataURLOptions: this.dataURLOptions,\r\n                    recordCanvas: this.recordCanvas,\r\n                    inlineImages: this.inlineImages,\r\n                    onSerialize: (currentN) => {\r\n                        if (isSerializedIframe(currentN, this.mirror) &&\r\n                            !isBlocked(currentN, this.blockClass, this.blockSelector, this.unblockSelector, false)) {\r\n                            this.iframeManager.addIframe(currentN);\r\n                        }\r\n                        if (isSerializedStylesheet(currentN, this.mirror)) {\r\n                            this.stylesheetManager.trackLinkElement(currentN);\r\n                        }\r\n                        if (hasShadowRoot(n)) {\r\n                            this.shadowDomManager.addShadowRoot(n.shadowRoot, this.doc);\r\n                        }\r\n                    },\r\n                    onIframeLoad: (iframe, childSn) => {\r\n                        if (isBlocked(iframe, this.blockClass, this.blockSelector, this.unblockSelector, false)) {\r\n                            return;\r\n                        }\r\n                        this.iframeManager.attachIframe(iframe, childSn);\r\n                        if (iframe.contentWindow) {\r\n                            this.canvasManager.addWindow(iframe.contentWindow);\r\n                        }\r\n                        this.shadowDomManager.observeAttachShadow(iframe);\r\n                    },\r\n                    onStylesheetLoad: (link, childSn) => {\r\n                        this.stylesheetManager.attachLinkElement(link, childSn);\r\n                    },\r\n                });\r\n                if (sn) {\r\n                    adds.push({\r\n                        parentId,\r\n                        nextId,\r\n                        node: sn,\r\n                    });\r\n                    addedIds.add(sn.id);\r\n                }\r\n            };\r\n            while (this.mapRemoves.length) {\r\n                this.mirror.removeNodeFromMap(this.mapRemoves.shift());\r\n            }\r\n            for (const n of this.movedSet) {\r\n                if (isParentRemoved(this.removes, n, this.mirror) &&\r\n                    !this.movedSet.has(n.parentNode)) {\r\n                    continue;\r\n                }\r\n                pushAdd(n);\r\n            }\r\n            for (const n of this.addedSet) {\r\n                if (!isAncestorInSet(this.droppedSet, n) &&\r\n                    !isParentRemoved(this.removes, n, this.mirror)) {\r\n                    pushAdd(n);\r\n                }\r\n                else if (isAncestorInSet(this.movedSet, n)) {\r\n                    pushAdd(n);\r\n                }\r\n                else {\r\n                    this.droppedSet.add(n);\r\n                }\r\n            }\r\n            let candidate = null;\r\n            while (addList.length) {\r\n                let node = null;\r\n                if (candidate) {\r\n                    const parentId = this.mirror.getId(candidate.value.parentNode);\r\n                    const nextId = getNextId(candidate.value);\r\n                    if (parentId !== -1 && nextId !== -1) {\r\n                        node = candidate;\r\n                    }\r\n                }\r\n                if (!node) {\r\n                    let tailNode = addList.tail;\r\n                    while (tailNode) {\r\n                        const _node = tailNode;\r\n                        tailNode = tailNode.previous;\r\n                        if (_node) {\r\n                            const parentId = this.mirror.getId(_node.value.parentNode);\r\n                            const nextId = getNextId(_node.value);\r\n                            if (nextId === -1)\r\n                                continue;\r\n                            else if (parentId !== -1) {\r\n                                node = _node;\r\n                                break;\r\n                            }\r\n                            else {\r\n                                const unhandledNode = _node.value;\r\n                                if (unhandledNode.parentNode &&\r\n                                    unhandledNode.parentNode.nodeType ===\r\n                                        Node.DOCUMENT_FRAGMENT_NODE) {\r\n                                    const shadowHost = unhandledNode.parentNode\r\n                                        .host;\r\n                                    const parentId = this.mirror.getId(shadowHost);\r\n                                    if (parentId !== -1) {\r\n                                        node = _node;\r\n                                        break;\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n                if (!node) {\r\n                    while (addList.head) {\r\n                        addList.removeNode(addList.head.value);\r\n                    }\r\n                    break;\r\n                }\r\n                candidate = node.previous;\r\n                addList.removeNode(node.value);\r\n                pushAdd(node.value);\r\n            }\r\n            const payload = {\r\n                texts: this.texts\r\n                    .map((text) => ({\r\n                    id: this.mirror.getId(text.node),\r\n                    value: text.value,\r\n                }))\r\n                    .filter((text) => !addedIds.has(text.id))\r\n                    .filter((text) => this.mirror.has(text.id)),\r\n                attributes: this.attributes\r\n                    .map((attribute) => {\r\n                    const { attributes } = attribute;\r\n                    if (typeof attributes.style === 'string') {\r\n                        const diffAsStr = JSON.stringify(attribute.styleDiff);\r\n                        const unchangedAsStr = JSON.stringify(attribute._unchangedStyles);\r\n                        if (diffAsStr.length < attributes.style.length) {\r\n                            if ((diffAsStr + unchangedAsStr).split('var(').length ===\r\n                                attributes.style.split('var(').length) {\r\n                                attributes.style = attribute.styleDiff;\r\n                            }\r\n                        }\r\n                    }\r\n                    return {\r\n                        id: this.mirror.getId(attribute.node),\r\n                        attributes: attributes,\r\n                    };\r\n                })\r\n                    .filter((attribute) => !addedIds.has(attribute.id))\r\n                    .filter((attribute) => this.mirror.has(attribute.id)),\r\n                removes: this.removes,\r\n                adds,\r\n            };\r\n            if (!payload.texts.length &&\r\n                !payload.attributes.length &&\r\n                !payload.removes.length &&\r\n                !payload.adds.length) {\r\n                return;\r\n            }\r\n            this.texts = [];\r\n            this.attributes = [];\r\n            this.attributeMap = new WeakMap();\r\n            this.removes = [];\r\n            this.addedSet = new Set();\r\n            this.movedSet = new Set();\r\n            this.droppedSet = new Set();\r\n            this.movedMap = {};\r\n            this.mutationCb(payload);\r\n        };\r\n        this.processMutation = (m) => {\r\n            if (isIgnored(m.target, this.mirror)) {\r\n                return;\r\n            }\r\n            switch (m.type) {\r\n                case 'characterData': {\r\n                    const value = m.target.textContent;\r\n                    if (!isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) &&\r\n                        value !== m.oldValue) {\r\n                        this.texts.push({\r\n                            value: needMaskingText(m.target, this.maskTextClass, this.maskTextSelector, this.unmaskTextClass, this.unmaskTextSelector, this.maskAllText) && value\r\n                                ? this.maskTextFn\r\n                                    ? this.maskTextFn(value, closestElementOfNode(m.target))\r\n                                    : value.replace(/[\\S]/g, '*')\r\n                                : value,\r\n                            node: m.target,\r\n                        });\r\n                    }\r\n                    break;\r\n                }\r\n                case 'attributes': {\r\n                    const target = m.target;\r\n                    let attributeName = m.attributeName;\r\n                    let value = m.target.getAttribute(attributeName);\r\n                    if (attributeName === 'value') {\r\n                        const type = getInputType(target);\r\n                        const tagName = target.tagName;\r\n                        value = getInputValue(target, tagName, type);\r\n                        const isInputMasked = shouldMaskInput({\r\n                            maskInputOptions: this.maskInputOptions,\r\n                            tagName,\r\n                            type,\r\n                        });\r\n                        const forceMask = needMaskingText(m.target, this.maskTextClass, this.maskTextSelector, this.unmaskTextClass, this.unmaskTextSelector, isInputMasked);\r\n                        value = maskInputValue({\r\n                            isMasked: forceMask,\r\n                            element: target,\r\n                            value,\r\n                            maskInputFn: this.maskInputFn,\r\n                        });\r\n                    }\r\n                    if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) ||\r\n                        value === m.oldValue) {\r\n                        return;\r\n                    }\r\n                    let item = this.attributeMap.get(m.target);\r\n                    if (target.tagName === 'IFRAME' &&\r\n                        attributeName === 'src' &&\r\n                        !this.keepIframeSrcFn(value)) {\r\n                        const iframeDoc = getIFrameContentDocument(target);\r\n                        if (!iframeDoc) {\r\n                            attributeName = 'rr_src';\r\n                        }\r\n                        else {\r\n                            return;\r\n                        }\r\n                    }\r\n                    if (!item) {\r\n                        item = {\r\n                            node: m.target,\r\n                            attributes: {},\r\n                            styleDiff: {},\r\n                            _unchangedStyles: {},\r\n                        };\r\n                        this.attributes.push(item);\r\n                        this.attributeMap.set(m.target, item);\r\n                    }\r\n                    if (attributeName === 'type' &&\r\n                        target.tagName === 'INPUT' &&\r\n                        (m.oldValue || '').toLowerCase() === 'password') {\r\n                        target.setAttribute('data-rr-is-password', 'true');\r\n                    }\r\n                    if (!ignoreAttribute(target.tagName, attributeName)) {\r\n                        item.attributes[attributeName] = transformAttribute(this.doc, toLowerCase(target.tagName), toLowerCase(attributeName), value, target, this.maskAttributeFn);\r\n                        if (attributeName === 'style') {\r\n                            if (!this.unattachedDoc) {\r\n                                try {\r\n                                    this.unattachedDoc =\r\n                                        document.implementation.createHTMLDocument();\r\n                                }\r\n                                catch (e) {\r\n                                    this.unattachedDoc = this.doc;\r\n                                }\r\n                            }\r\n                            const old = this.unattachedDoc.createElement('span');\r\n                            if (m.oldValue) {\r\n                                old.setAttribute('style', m.oldValue);\r\n                            }\r\n                            for (const pname of Array.from(target.style)) {\r\n                                const newValue = target.style.getPropertyValue(pname);\r\n                                const newPriority = target.style.getPropertyPriority(pname);\r\n                                if (newValue !== old.style.getPropertyValue(pname) ||\r\n                                    newPriority !== old.style.getPropertyPriority(pname)) {\r\n                                    if (newPriority === '') {\r\n                                        item.styleDiff[pname] = newValue;\r\n                                    }\r\n                                    else {\r\n                                        item.styleDiff[pname] = [newValue, newPriority];\r\n                                    }\r\n                                }\r\n                                else {\r\n                                    item._unchangedStyles[pname] = [newValue, newPriority];\r\n                                }\r\n                            }\r\n                            for (const pname of Array.from(old.style)) {\r\n                                if (target.style.getPropertyValue(pname) === '') {\r\n                                    item.styleDiff[pname] = false;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                    break;\r\n                }\r\n                case 'childList': {\r\n                    if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, true)) {\r\n                        return;\r\n                    }\r\n                    m.addedNodes.forEach((n) => this.genAdds(n, m.target));\r\n                    m.removedNodes.forEach((n) => {\r\n                        const nodeId = this.mirror.getId(n);\r\n                        const parentId = isShadowRoot(m.target)\r\n                            ? this.mirror.getId(m.target.host)\r\n                            : this.mirror.getId(m.target);\r\n                        if (isBlocked(m.target, this.blockClass, this.blockSelector, this.unblockSelector, false) ||\r\n                            isIgnored(n, this.mirror) ||\r\n                            !isSerialized(n, this.mirror)) {\r\n                            return;\r\n                        }\r\n                        if (this.addedSet.has(n)) {\r\n                            deepDelete(this.addedSet, n);\r\n                            this.droppedSet.add(n);\r\n                        }\r\n                        else if (this.addedSet.has(m.target) && nodeId === -1) ;\r\n                        else if (isAncestorRemoved(m.target, this.mirror)) ;\r\n                        else if (this.movedSet.has(n) &&\r\n                            this.movedMap[moveKey(nodeId, parentId)]) {\r\n                            deepDelete(this.movedSet, n);\r\n                        }\r\n                        else {\r\n                            this.removes.push({\r\n                                parentId,\r\n                                id: nodeId,\r\n                                isShadow: isShadowRoot(m.target) && isNativeShadowDom(m.target)\r\n                                    ? true\r\n                                    : undefined,\r\n                            });\r\n                        }\r\n                        this.mapRemoves.push(n);\r\n                    });\r\n                    break;\r\n                }\r\n            }\r\n        };\r\n        this.genAdds = (n, target) => {\r\n            if (this.processedNodeManager.inOtherBuffer(n, this))\r\n                return;\r\n            if (this.addedSet.has(n) || this.movedSet.has(n))\r\n                return;\r\n            if (this.mirror.hasNode(n)) {\r\n                if (isIgnored(n, this.mirror)) {\r\n                    return;\r\n                }\r\n                this.movedSet.add(n);\r\n                let targetId = null;\r\n                if (target && this.mirror.hasNode(target)) {\r\n                    targetId = this.mirror.getId(target);\r\n                }\r\n                if (targetId && targetId !== -1) {\r\n                    this.movedMap[moveKey(this.mirror.getId(n), targetId)] = true;\r\n                }\r\n            }\r\n            else {\r\n                this.addedSet.add(n);\r\n                this.droppedSet.delete(n);\r\n            }\r\n            if (!isBlocked(n, this.blockClass, this.blockSelector, this.unblockSelector, false)) {\r\n                n.childNodes.forEach((childN) => this.genAdds(childN));\r\n                if (hasShadowRoot(n)) {\r\n                    n.shadowRoot.childNodes.forEach((childN) => {\r\n                        this.processedNodeManager.add(childN, this);\r\n                        this.genAdds(childN, n);\r\n                    });\r\n                }\r\n            }\r\n        };\r\n    }\r\n    init(options) {\r\n        [\r\n            'mutationCb',\r\n            'blockClass',\r\n            'blockSelector',\r\n            'unblockSelector',\r\n            'maskAllText',\r\n            'maskTextClass',\r\n            'unmaskTextClass',\r\n            'maskTextSelector',\r\n            'unmaskTextSelector',\r\n            'inlineStylesheet',\r\n            'maskInputOptions',\r\n            'maskAttributeFn',\r\n            'maskTextFn',\r\n            'maskInputFn',\r\n            'keepIframeSrcFn',\r\n            'recordCanvas',\r\n            'inlineImages',\r\n            'slimDOMOptions',\r\n            'dataURLOptions',\r\n            'doc',\r\n            'mirror',\r\n            'iframeManager',\r\n            'stylesheetManager',\r\n            'shadowDomManager',\r\n            'canvasManager',\r\n            'processedNodeManager',\r\n        ].forEach((key) => {\r\n            this[key] = options[key];\r\n        });\r\n    }\r\n    freeze() {\r\n        this.frozen = true;\r\n        this.canvasManager.freeze();\r\n    }\r\n    unfreeze() {\r\n        this.frozen = false;\r\n        this.canvasManager.unfreeze();\r\n        this.emit();\r\n    }\r\n    isFrozen() {\r\n        return this.frozen;\r\n    }\r\n    lock() {\r\n        this.locked = true;\r\n        this.canvasManager.lock();\r\n    }\r\n    unlock() {\r\n        this.locked = false;\r\n        this.canvasManager.unlock();\r\n        this.emit();\r\n    }\r\n    reset() {\r\n        this.shadowDomManager.reset();\r\n        this.canvasManager.reset();\r\n    }\r\n}\r\nfunction deepDelete(addsSet, n) {\r\n    addsSet.delete(n);\r\n    n.childNodes.forEach((childN) => deepDelete(addsSet, childN));\r\n}\r\nfunction isParentRemoved(removes, n, mirror) {\r\n    if (removes.length === 0)\r\n        return false;\r\n    return _isParentRemoved(removes, n, mirror);\r\n}\r\nfunction _isParentRemoved(removes, n, mirror) {\r\n    let node = n.parentNode;\r\n    while (node) {\r\n        const parentId = mirror.getId(node);\r\n        if (removes.some((r) => r.id === parentId)) {\r\n            return true;\r\n        }\r\n        node = node.parentNode;\r\n    }\r\n    return false;\r\n}\r\nfunction isAncestorInSet(set, n) {\r\n    if (set.size === 0)\r\n        return false;\r\n    return _isAncestorInSet(set, n);\r\n}\r\nfunction _isAncestorInSet(set, n) {\r\n    const { parentNode } = n;\r\n    if (!parentNode) {\r\n        return false;\r\n    }\r\n    if (set.has(parentNode)) {\r\n        return true;\r\n    }\r\n    return _isAncestorInSet(set, parentNode);\r\n}\n\nexport { MutationBuffer as default };\n","import { toLowerCase, toUpperCase, getInputType, getInputValue, shouldMaskInput, needMaskingText, maskInputValue } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { on, throttle, isBlocked, getWindowScroll, hookSetter, patch, setTimeout, legacy_isTouchEvent, nowTimestamp, getWindowHeight, getWindowWidth } from '../utils.js';\nimport { MouseInteractions, IncrementalSource, PointerTypes } from '../../../types/dist/rrweb-types.js';\nimport MutationBuffer from './mutation.js';\nimport { callbackWrapper } from './error-handler.js';\n\nconst mutationBuffers = [];\r\nfunction getEventTarget(event) {\r\n    try {\r\n        if ('composedPath' in event) {\r\n            const path = event.composedPath();\r\n            if (path.length) {\r\n                return path[0];\r\n            }\r\n        }\r\n        else if ('path' in event && event.path.length) {\r\n            return event.path[0];\r\n        }\r\n    }\r\n    catch {\r\n    }\r\n    return event && event.target;\r\n}\r\nfunction initMutationObserver(options, rootEl) {\r\n    const mutationBuffer = new MutationBuffer();\r\n    mutationBuffers.push(mutationBuffer);\r\n    mutationBuffer.init(options);\r\n    let mutationObserverCtor = window.MutationObserver ||\r\n        window.__rrMutationObserver;\r\n    const angularZoneSymbol = window?.Zone?.__symbol__?.('MutationObserver');\r\n    if (angularZoneSymbol &&\r\n        window[angularZoneSymbol]) {\r\n        mutationObserverCtor = window[angularZoneSymbol];\r\n    }\r\n    const observer = new mutationObserverCtor(callbackWrapper((mutations) => {\r\n        if (options.onMutation && options.onMutation(mutations) === false) {\r\n            return;\r\n        }\r\n        mutationBuffer.processMutations.bind(mutationBuffer)(mutations);\r\n    }));\r\n    observer.observe(rootEl, {\r\n        attributes: true,\r\n        attributeOldValue: true,\r\n        characterData: true,\r\n        characterDataOldValue: true,\r\n        childList: true,\r\n        subtree: true,\r\n    });\r\n    return observer;\r\n}\r\nfunction initMoveObserver({ mousemoveCb, sampling, doc, mirror, }) {\r\n    if (sampling.mousemove === false) {\r\n        return () => {\r\n        };\r\n    }\r\n    const threshold = typeof sampling.mousemove === 'number' ? sampling.mousemove : 50;\r\n    const callbackThreshold = typeof sampling.mousemoveCallback === 'number'\r\n        ? sampling.mousemoveCallback\r\n        : 500;\r\n    let positions = [];\r\n    let timeBaseline;\r\n    const wrappedCb = throttle(callbackWrapper((source) => {\r\n        const totalOffset = Date.now() - timeBaseline;\r\n        mousemoveCb(positions.map((p) => {\r\n            p.timeOffset -= totalOffset;\r\n            return p;\r\n        }), source);\r\n        positions = [];\r\n        timeBaseline = null;\r\n    }), callbackThreshold);\r\n    const updatePosition = callbackWrapper(throttle(callbackWrapper((evt) => {\r\n        const target = getEventTarget(evt);\r\n        const { clientX, clientY } = legacy_isTouchEvent(evt)\r\n            ? evt.changedTouches[0]\r\n            : evt;\r\n        if (!timeBaseline) {\r\n            timeBaseline = nowTimestamp();\r\n        }\r\n        positions.push({\r\n            x: clientX,\r\n            y: clientY,\r\n            id: mirror.getId(target),\r\n            timeOffset: nowTimestamp() - timeBaseline,\r\n        });\r\n        wrappedCb(typeof DragEvent !== 'undefined' && evt instanceof DragEvent\r\n            ? IncrementalSource.Drag\r\n            : evt instanceof MouseEvent\r\n                ? IncrementalSource.MouseMove\r\n                : IncrementalSource.TouchMove);\r\n    }), threshold, {\r\n        trailing: false,\r\n    }));\r\n    const handlers = [\r\n        on('mousemove', updatePosition, doc),\r\n        on('touchmove', updatePosition, doc),\r\n        on('drag', updatePosition, doc),\r\n    ];\r\n    return callbackWrapper(() => {\r\n        handlers.forEach((h) => h());\r\n    });\r\n}\r\nfunction initMouseInteractionObserver({ mouseInteractionCb, doc, mirror, blockClass, blockSelector, unblockSelector, sampling, }) {\r\n    if (sampling.mouseInteraction === false) {\r\n        return () => {\r\n        };\r\n    }\r\n    const disableMap = sampling.mouseInteraction === true ||\r\n        sampling.mouseInteraction === undefined\r\n        ? {}\r\n        : sampling.mouseInteraction;\r\n    const handlers = [];\r\n    let currentPointerType = null;\r\n    const getHandler = (eventKey) => {\r\n        return (event) => {\r\n            const target = getEventTarget(event);\r\n            if (isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\r\n                return;\r\n            }\r\n            let pointerType = null;\r\n            let thisEventKey = eventKey;\r\n            if ('pointerType' in event) {\r\n                switch (event.pointerType) {\r\n                    case 'mouse':\r\n                        pointerType = PointerTypes.Mouse;\r\n                        break;\r\n                    case 'touch':\r\n                        pointerType = PointerTypes.Touch;\r\n                        break;\r\n                    case 'pen':\r\n                        pointerType = PointerTypes.Pen;\r\n                        break;\r\n                }\r\n                if (pointerType === PointerTypes.Touch) {\r\n                    if (MouseInteractions[eventKey] === MouseInteractions.MouseDown) {\r\n                        thisEventKey = 'TouchStart';\r\n                    }\r\n                    else if (MouseInteractions[eventKey] === MouseInteractions.MouseUp) {\r\n                        thisEventKey = 'TouchEnd';\r\n                    }\r\n                }\r\n                else if (pointerType === PointerTypes.Pen) ;\r\n            }\r\n            else if (legacy_isTouchEvent(event)) {\r\n                pointerType = PointerTypes.Touch;\r\n            }\r\n            if (pointerType !== null) {\r\n                currentPointerType = pointerType;\r\n                if ((thisEventKey.startsWith('Touch') &&\r\n                    pointerType === PointerTypes.Touch) ||\r\n                    (thisEventKey.startsWith('Mouse') &&\r\n                        pointerType === PointerTypes.Mouse)) {\r\n                    pointerType = null;\r\n                }\r\n            }\r\n            else if (MouseInteractions[eventKey] === MouseInteractions.Click) {\r\n                pointerType = currentPointerType;\r\n                currentPointerType = null;\r\n            }\r\n            const e = legacy_isTouchEvent(event) ? event.changedTouches[0] : event;\r\n            if (!e) {\r\n                return;\r\n            }\r\n            const id = mirror.getId(target);\r\n            const { clientX, clientY } = e;\r\n            callbackWrapper(mouseInteractionCb)({\r\n                type: MouseInteractions[thisEventKey],\r\n                id,\r\n                x: clientX,\r\n                y: clientY,\r\n                ...(pointerType !== null && { pointerType }),\r\n            });\r\n        };\r\n    };\r\n    Object.keys(MouseInteractions)\r\n        .filter((key) => Number.isNaN(Number(key)) &&\r\n        !key.endsWith('_Departed') &&\r\n        disableMap[key] !== false)\r\n        .forEach((eventKey) => {\r\n        let eventName = toLowerCase(eventKey);\r\n        const handler = getHandler(eventKey);\r\n        if (window.PointerEvent) {\r\n            switch (MouseInteractions[eventKey]) {\r\n                case MouseInteractions.MouseDown:\r\n                case MouseInteractions.MouseUp:\r\n                    eventName = eventName.replace('mouse', 'pointer');\r\n                    break;\r\n                case MouseInteractions.TouchStart:\r\n                case MouseInteractions.TouchEnd:\r\n                    return;\r\n            }\r\n        }\r\n        handlers.push(on(eventName, handler, doc));\r\n    });\r\n    return callbackWrapper(() => {\r\n        handlers.forEach((h) => h());\r\n    });\r\n}\r\nfunction initScrollObserver({ scrollCb, doc, mirror, blockClass, blockSelector, unblockSelector, sampling, }) {\r\n    const updatePosition = callbackWrapper(throttle(callbackWrapper((evt) => {\r\n        const target = getEventTarget(evt);\r\n        if (!target ||\r\n            isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\r\n            return;\r\n        }\r\n        const id = mirror.getId(target);\r\n        if (target === doc && doc.defaultView) {\r\n            const scrollLeftTop = getWindowScroll(doc.defaultView);\r\n            scrollCb({\r\n                id,\r\n                x: scrollLeftTop.left,\r\n                y: scrollLeftTop.top,\r\n            });\r\n        }\r\n        else {\r\n            scrollCb({\r\n                id,\r\n                x: target.scrollLeft,\r\n                y: target.scrollTop,\r\n            });\r\n        }\r\n    }), sampling.scroll || 100));\r\n    return on('scroll', updatePosition, doc);\r\n}\r\nfunction initViewportResizeObserver({ viewportResizeCb }, { win }) {\r\n    let lastH = -1;\r\n    let lastW = -1;\r\n    const updateDimension = callbackWrapper(throttle(callbackWrapper(() => {\r\n        const height = getWindowHeight();\r\n        const width = getWindowWidth();\r\n        if (lastH !== height || lastW !== width) {\r\n            viewportResizeCb({\r\n                width: Number(width),\r\n                height: Number(height),\r\n            });\r\n            lastH = height;\r\n            lastW = width;\r\n        }\r\n    }), 200));\r\n    return on('resize', updateDimension, win);\r\n}\r\nconst INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];\r\nconst lastInputValueMap = new WeakMap();\r\nfunction initInputObserver({ inputCb, doc, mirror, blockClass, blockSelector, unblockSelector, ignoreClass, ignoreSelector, maskInputOptions, maskInputFn, sampling, userTriggeredOnInput, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, }) {\r\n    function eventHandler(event) {\r\n        let target = getEventTarget(event);\r\n        const userTriggered = event.isTrusted;\r\n        const tagName = target && toUpperCase(target.tagName);\r\n        if (tagName === 'OPTION')\r\n            target = target.parentElement;\r\n        if (!target ||\r\n            !tagName ||\r\n            INPUT_TAGS.indexOf(tagName) < 0 ||\r\n            isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\r\n            return;\r\n        }\r\n        const el = target;\r\n        if (el.classList.contains(ignoreClass) ||\r\n            (ignoreSelector && el.matches(ignoreSelector))) {\r\n            return;\r\n        }\r\n        const type = getInputType(target);\r\n        let text = getInputValue(el, tagName, type);\r\n        let isChecked = false;\r\n        const isInputMasked = shouldMaskInput({\r\n            maskInputOptions,\r\n            tagName,\r\n            type,\r\n        });\r\n        const forceMask = needMaskingText(target, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, isInputMasked);\r\n        if (type === 'radio' || type === 'checkbox') {\r\n            isChecked = target.checked;\r\n        }\r\n        text = maskInputValue({\r\n            isMasked: forceMask,\r\n            element: target,\r\n            value: text,\r\n            maskInputFn,\r\n        });\r\n        cbWithDedup(target, userTriggeredOnInput\r\n            ? { text, isChecked, userTriggered }\r\n            : { text, isChecked });\r\n        const name = target.name;\r\n        if (type === 'radio' && name && isChecked) {\r\n            doc\r\n                .querySelectorAll(`input[type=\"radio\"][name=\"${name}\"]`)\r\n                .forEach((el) => {\r\n                if (el !== target) {\r\n                    const text = maskInputValue({\r\n                        isMasked: forceMask,\r\n                        element: el,\r\n                        value: getInputValue(el, tagName, type),\r\n                        maskInputFn,\r\n                    });\r\n                    cbWithDedup(el, userTriggeredOnInput\r\n                        ? { text, isChecked: !isChecked, userTriggered: false }\r\n                        : { text, isChecked: !isChecked });\r\n                }\r\n            });\r\n        }\r\n    }\r\n    function cbWithDedup(target, v) {\r\n        const lastInputValue = lastInputValueMap.get(target);\r\n        if (!lastInputValue ||\r\n            lastInputValue.text !== v.text ||\r\n            lastInputValue.isChecked !== v.isChecked) {\r\n            lastInputValueMap.set(target, v);\r\n            const id = mirror.getId(target);\r\n            callbackWrapper(inputCb)({\r\n                ...v,\r\n                id,\r\n            });\r\n        }\r\n    }\r\n    const events = sampling.input === 'last' ? ['change'] : ['input', 'change'];\r\n    const handlers = events.map((eventName) => on(eventName, callbackWrapper(eventHandler), doc));\r\n    const currentWindow = doc.defaultView;\r\n    if (!currentWindow) {\r\n        return () => {\r\n            handlers.forEach((h) => h());\r\n        };\r\n    }\r\n    const propertyDescriptor = currentWindow.Object.getOwnPropertyDescriptor(currentWindow.HTMLInputElement.prototype, 'value');\r\n    const hookProperties = [\r\n        [currentWindow.HTMLInputElement.prototype, 'value'],\r\n        [currentWindow.HTMLInputElement.prototype, 'checked'],\r\n        [currentWindow.HTMLSelectElement.prototype, 'value'],\r\n        [currentWindow.HTMLTextAreaElement.prototype, 'value'],\r\n        [currentWindow.HTMLSelectElement.prototype, 'selectedIndex'],\r\n        [currentWindow.HTMLOptionElement.prototype, 'selected'],\r\n    ];\r\n    if (propertyDescriptor && propertyDescriptor.set) {\r\n        handlers.push(...hookProperties.map((p) => hookSetter(p[0], p[1], {\r\n            set() {\r\n                callbackWrapper(eventHandler)({\r\n                    target: this,\r\n                    isTrusted: false,\r\n                });\r\n            },\r\n        }, false, currentWindow)));\r\n    }\r\n    return callbackWrapper(() => {\r\n        handlers.forEach((h) => h());\r\n    });\r\n}\r\nfunction getNestedCSSRulePositions(rule) {\r\n    const positions = [];\r\n    function recurse(childRule, pos) {\r\n        if ((hasNestedCSSRule('CSSGroupingRule') &&\r\n            childRule.parentRule instanceof CSSGroupingRule) ||\r\n            (hasNestedCSSRule('CSSMediaRule') &&\r\n                childRule.parentRule instanceof CSSMediaRule) ||\r\n            (hasNestedCSSRule('CSSSupportsRule') &&\r\n                childRule.parentRule instanceof CSSSupportsRule) ||\r\n            (hasNestedCSSRule('CSSConditionRule') &&\r\n                childRule.parentRule instanceof CSSConditionRule)) {\r\n            const rules = Array.from(childRule.parentRule.cssRules);\r\n            const index = rules.indexOf(childRule);\r\n            pos.unshift(index);\r\n        }\r\n        else if (childRule.parentStyleSheet) {\r\n            const rules = Array.from(childRule.parentStyleSheet.cssRules);\r\n            const index = rules.indexOf(childRule);\r\n            pos.unshift(index);\r\n        }\r\n        return pos;\r\n    }\r\n    return recurse(rule, positions);\r\n}\r\nfunction getIdAndStyleId(sheet, mirror, styleMirror) {\r\n    let id, styleId;\r\n    if (!sheet)\r\n        return {};\r\n    if (sheet.ownerNode)\r\n        id = mirror.getId(sheet.ownerNode);\r\n    else\r\n        styleId = styleMirror.getId(sheet);\r\n    return {\r\n        styleId,\r\n        id,\r\n    };\r\n}\r\nfunction initStyleSheetObserver({ styleSheetRuleCb, mirror, stylesheetManager }, { win }) {\r\n    if (!win.CSSStyleSheet || !win.CSSStyleSheet.prototype) {\r\n        return () => {\r\n        };\r\n    }\r\n    const insertRule = win.CSSStyleSheet.prototype.insertRule;\r\n    win.CSSStyleSheet.prototype.insertRule = new Proxy(insertRule, {\r\n        apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n            const [rule, index] = argumentsList;\r\n            const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\r\n            if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n                styleSheetRuleCb({\r\n                    id,\r\n                    styleId,\r\n                    adds: [{ rule, index }],\r\n                });\r\n            }\r\n            return target.apply(thisArg, argumentsList);\r\n        }),\r\n    });\r\n    const deleteRule = win.CSSStyleSheet.prototype.deleteRule;\r\n    win.CSSStyleSheet.prototype.deleteRule = new Proxy(deleteRule, {\r\n        apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n            const [index] = argumentsList;\r\n            const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\r\n            if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n                styleSheetRuleCb({\r\n                    id,\r\n                    styleId,\r\n                    removes: [{ index }],\r\n                });\r\n            }\r\n            return target.apply(thisArg, argumentsList);\r\n        }),\r\n    });\r\n    let replace;\r\n    if (win.CSSStyleSheet.prototype.replace) {\r\n        replace = win.CSSStyleSheet.prototype.replace;\r\n        win.CSSStyleSheet.prototype.replace = new Proxy(replace, {\r\n            apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n                const [text] = argumentsList;\r\n                const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\r\n                if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n                    styleSheetRuleCb({\r\n                        id,\r\n                        styleId,\r\n                        replace: text,\r\n                    });\r\n                }\r\n                return target.apply(thisArg, argumentsList);\r\n            }),\r\n        });\r\n    }\r\n    let replaceSync;\r\n    if (win.CSSStyleSheet.prototype.replaceSync) {\r\n        replaceSync = win.CSSStyleSheet.prototype.replaceSync;\r\n        win.CSSStyleSheet.prototype.replaceSync = new Proxy(replaceSync, {\r\n            apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n                const [text] = argumentsList;\r\n                const { id, styleId } = getIdAndStyleId(thisArg, mirror, stylesheetManager.styleMirror);\r\n                if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n                    styleSheetRuleCb({\r\n                        id,\r\n                        styleId,\r\n                        replaceSync: text,\r\n                    });\r\n                }\r\n                return target.apply(thisArg, argumentsList);\r\n            }),\r\n        });\r\n    }\r\n    const supportedNestedCSSRuleTypes = {};\r\n    if (canMonkeyPatchNestedCSSRule('CSSGroupingRule')) {\r\n        supportedNestedCSSRuleTypes.CSSGroupingRule = win.CSSGroupingRule;\r\n    }\r\n    else {\r\n        if (canMonkeyPatchNestedCSSRule('CSSMediaRule')) {\r\n            supportedNestedCSSRuleTypes.CSSMediaRule = win.CSSMediaRule;\r\n        }\r\n        if (canMonkeyPatchNestedCSSRule('CSSConditionRule')) {\r\n            supportedNestedCSSRuleTypes.CSSConditionRule = win.CSSConditionRule;\r\n        }\r\n        if (canMonkeyPatchNestedCSSRule('CSSSupportsRule')) {\r\n            supportedNestedCSSRuleTypes.CSSSupportsRule = win.CSSSupportsRule;\r\n        }\r\n    }\r\n    const unmodifiedFunctions = {};\r\n    Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\r\n        unmodifiedFunctions[typeKey] = {\r\n            insertRule: type.prototype.insertRule,\r\n            deleteRule: type.prototype.deleteRule,\r\n        };\r\n        type.prototype.insertRule = new Proxy(unmodifiedFunctions[typeKey].insertRule, {\r\n            apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n                const [rule, index] = argumentsList;\r\n                const { id, styleId } = getIdAndStyleId(thisArg.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n                if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n                    styleSheetRuleCb({\r\n                        id,\r\n                        styleId,\r\n                        adds: [\r\n                            {\r\n                                rule,\r\n                                index: [\r\n                                    ...getNestedCSSRulePositions(thisArg),\r\n                                    index || 0,\r\n                                ],\r\n                            },\r\n                        ],\r\n                    });\r\n                }\r\n                return target.apply(thisArg, argumentsList);\r\n            }),\r\n        });\r\n        type.prototype.deleteRule = new Proxy(unmodifiedFunctions[typeKey].deleteRule, {\r\n            apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n                const [index] = argumentsList;\r\n                const { id, styleId } = getIdAndStyleId(thisArg.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n                if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n                    styleSheetRuleCb({\r\n                        id,\r\n                        styleId,\r\n                        removes: [\r\n                            { index: [...getNestedCSSRulePositions(thisArg), index] },\r\n                        ],\r\n                    });\r\n                }\r\n                return target.apply(thisArg, argumentsList);\r\n            }),\r\n        });\r\n    });\r\n    return callbackWrapper(() => {\r\n        win.CSSStyleSheet.prototype.insertRule = insertRule;\r\n        win.CSSStyleSheet.prototype.deleteRule = deleteRule;\r\n        replace && (win.CSSStyleSheet.prototype.replace = replace);\r\n        replaceSync && (win.CSSStyleSheet.prototype.replaceSync = replaceSync);\r\n        Object.entries(supportedNestedCSSRuleTypes).forEach(([typeKey, type]) => {\r\n            type.prototype.insertRule = unmodifiedFunctions[typeKey].insertRule;\r\n            type.prototype.deleteRule = unmodifiedFunctions[typeKey].deleteRule;\r\n        });\r\n    });\r\n}\r\nfunction initAdoptedStyleSheetObserver({ mirror, stylesheetManager, }, host) {\r\n    let hostId = null;\r\n    if (host.nodeName === '#document')\r\n        hostId = mirror.getId(host);\r\n    else\r\n        hostId = mirror.getId(host.host);\r\n    const patchTarget = host.nodeName === '#document'\r\n        ? host.defaultView?.Document\r\n        : host.ownerDocument?.defaultView?.ShadowRoot;\r\n    const originalPropertyDescriptor = patchTarget?.prototype\r\n        ? Object.getOwnPropertyDescriptor(patchTarget?.prototype, 'adoptedStyleSheets')\r\n        : undefined;\r\n    if (hostId === null ||\r\n        hostId === -1 ||\r\n        !patchTarget ||\r\n        !originalPropertyDescriptor)\r\n        return () => {\r\n        };\r\n    Object.defineProperty(host, 'adoptedStyleSheets', {\r\n        configurable: originalPropertyDescriptor.configurable,\r\n        enumerable: originalPropertyDescriptor.enumerable,\r\n        get() {\r\n            return originalPropertyDescriptor.get?.call(this);\r\n        },\r\n        set(sheets) {\r\n            const result = originalPropertyDescriptor.set?.call(this, sheets);\r\n            if (hostId !== null && hostId !== -1) {\r\n                try {\r\n                    stylesheetManager.adoptStyleSheets(sheets, hostId);\r\n                }\r\n                catch (e) {\r\n                }\r\n            }\r\n            return result;\r\n        },\r\n    });\r\n    return callbackWrapper(() => {\r\n        Object.defineProperty(host, 'adoptedStyleSheets', {\r\n            configurable: originalPropertyDescriptor.configurable,\r\n            enumerable: originalPropertyDescriptor.enumerable,\r\n            get: originalPropertyDescriptor.get,\r\n            set: originalPropertyDescriptor.set,\r\n        });\r\n    });\r\n}\r\nfunction initStyleDeclarationObserver({ styleDeclarationCb, mirror, ignoreCSSAttributes, stylesheetManager, }, { win }) {\r\n    const setProperty = win.CSSStyleDeclaration.prototype.setProperty;\r\n    win.CSSStyleDeclaration.prototype.setProperty = new Proxy(setProperty, {\r\n        apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n            const [property, value, priority] = argumentsList;\r\n            if (ignoreCSSAttributes.has(property)) {\r\n                return setProperty.apply(thisArg, [property, value, priority]);\r\n            }\r\n            const { id, styleId } = getIdAndStyleId(thisArg.parentRule?.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n            if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n                styleDeclarationCb({\r\n                    id,\r\n                    styleId,\r\n                    set: {\r\n                        property,\r\n                        value,\r\n                        priority,\r\n                    },\r\n                    index: getNestedCSSRulePositions(thisArg.parentRule),\r\n                });\r\n            }\r\n            return target.apply(thisArg, argumentsList);\r\n        }),\r\n    });\r\n    const removeProperty = win.CSSStyleDeclaration.prototype.removeProperty;\r\n    win.CSSStyleDeclaration.prototype.removeProperty = new Proxy(removeProperty, {\r\n        apply: callbackWrapper((target, thisArg, argumentsList) => {\r\n            const [property] = argumentsList;\r\n            if (ignoreCSSAttributes.has(property)) {\r\n                return removeProperty.apply(thisArg, [property]);\r\n            }\r\n            const { id, styleId } = getIdAndStyleId(thisArg.parentRule?.parentStyleSheet, mirror, stylesheetManager.styleMirror);\r\n            if ((id && id !== -1) || (styleId && styleId !== -1)) {\r\n                styleDeclarationCb({\r\n                    id,\r\n                    styleId,\r\n                    remove: {\r\n                        property,\r\n                    },\r\n                    index: getNestedCSSRulePositions(thisArg.parentRule),\r\n                });\r\n            }\r\n            return target.apply(thisArg, argumentsList);\r\n        }),\r\n    });\r\n    return callbackWrapper(() => {\r\n        win.CSSStyleDeclaration.prototype.setProperty = setProperty;\r\n        win.CSSStyleDeclaration.prototype.removeProperty = removeProperty;\r\n    });\r\n}\r\nfunction initMediaInteractionObserver({ mediaInteractionCb, blockClass, blockSelector, unblockSelector, mirror, sampling, doc, }) {\r\n    const handler = callbackWrapper((type) => throttle(callbackWrapper((event) => {\r\n        const target = getEventTarget(event);\r\n        if (!target ||\r\n            isBlocked(target, blockClass, blockSelector, unblockSelector, true)) {\r\n            return;\r\n        }\r\n        const { currentTime, volume, muted, playbackRate } = target;\r\n        mediaInteractionCb({\r\n            type,\r\n            id: mirror.getId(target),\r\n            currentTime,\r\n            volume,\r\n            muted,\r\n            playbackRate,\r\n        });\r\n    }), sampling.media || 500));\r\n    const handlers = [\r\n        on('play', handler(0), doc),\r\n        on('pause', handler(1), doc),\r\n        on('seeked', handler(2), doc),\r\n        on('volumechange', handler(3), doc),\r\n        on('ratechange', handler(4), doc),\r\n    ];\r\n    return callbackWrapper(() => {\r\n        handlers.forEach((h) => h());\r\n    });\r\n}\r\nfunction initFontObserver({ fontCb, doc }) {\r\n    const win = doc.defaultView;\r\n    if (!win) {\r\n        return () => {\r\n        };\r\n    }\r\n    const handlers = [];\r\n    const fontMap = new WeakMap();\r\n    const originalFontFace = win.FontFace;\r\n    win.FontFace = function FontFace(family, source, descriptors) {\r\n        const fontFace = new originalFontFace(family, source, descriptors);\r\n        fontMap.set(fontFace, {\r\n            family,\r\n            buffer: typeof source !== 'string',\r\n            descriptors,\r\n            fontSource: typeof source === 'string'\r\n                ? source\r\n                : JSON.stringify(Array.from(new Uint8Array(source))),\r\n        });\r\n        return fontFace;\r\n    };\r\n    const restoreHandler = patch(doc.fonts, 'add', function (original) {\r\n        return function (fontFace) {\r\n            setTimeout(callbackWrapper(() => {\r\n                const p = fontMap.get(fontFace);\r\n                if (p) {\r\n                    fontCb(p);\r\n                    fontMap.delete(fontFace);\r\n                }\r\n            }), 0);\r\n            return original.apply(this, [fontFace]);\r\n        };\r\n    });\r\n    handlers.push(() => {\r\n        win.FontFace = originalFontFace;\r\n    });\r\n    handlers.push(restoreHandler);\r\n    return callbackWrapper(() => {\r\n        handlers.forEach((h) => h());\r\n    });\r\n}\r\nfunction initSelectionObserver(param) {\r\n    const { doc, mirror, blockClass, blockSelector, unblockSelector, selectionCb, } = param;\r\n    let collapsed = true;\r\n    const updateSelection = callbackWrapper(() => {\r\n        const selection = doc.getSelection();\r\n        if (!selection || (collapsed && selection?.isCollapsed))\r\n            return;\r\n        collapsed = selection.isCollapsed || false;\r\n        const ranges = [];\r\n        const count = selection.rangeCount || 0;\r\n        for (let i = 0; i < count; i++) {\r\n            const range = selection.getRangeAt(i);\r\n            const { startContainer, startOffset, endContainer, endOffset } = range;\r\n            const blocked = isBlocked(startContainer, blockClass, blockSelector, unblockSelector, true) ||\r\n                isBlocked(endContainer, blockClass, blockSelector, unblockSelector, true);\r\n            if (blocked)\r\n                continue;\r\n            ranges.push({\r\n                start: mirror.getId(startContainer),\r\n                startOffset,\r\n                end: mirror.getId(endContainer),\r\n                endOffset,\r\n            });\r\n        }\r\n        selectionCb({ ranges });\r\n    });\r\n    updateSelection();\r\n    return on('selectionchange', updateSelection);\r\n}\r\nfunction initCustomElementObserver({ doc, customElementCb, }) {\r\n    const win = doc.defaultView;\r\n    if (!win || !win.customElements)\r\n        return () => { };\r\n    const restoreHandler = patch(win.customElements, 'define', function (original) {\r\n        return function (name, constructor, options) {\r\n            try {\r\n                customElementCb({\r\n                    define: {\r\n                        name,\r\n                    },\r\n                });\r\n            }\r\n            catch (e) {\r\n            }\r\n            return original.apply(this, [name, constructor, options]);\r\n        };\r\n    });\r\n    return restoreHandler;\r\n}\r\nfunction initObservers(o, _hooks = {}) {\r\n    const currentWindow = o.doc.defaultView;\r\n    if (!currentWindow) {\r\n        return () => {\r\n        };\r\n    }\r\n    let mutationObserver;\r\n    if (o.recordDOM) {\r\n        mutationObserver = initMutationObserver(o, o.doc);\r\n    }\r\n    const mousemoveHandler = initMoveObserver(o);\r\n    const mouseInteractionHandler = initMouseInteractionObserver(o);\r\n    const scrollHandler = initScrollObserver(o);\r\n    const viewportResizeHandler = initViewportResizeObserver(o, {\r\n        win: currentWindow,\r\n    });\r\n    const inputHandler = initInputObserver(o);\r\n    const mediaInteractionHandler = initMediaInteractionObserver(o);\r\n    let styleSheetObserver = () => { };\r\n    let adoptedStyleSheetObserver = () => { };\r\n    let styleDeclarationObserver = () => { };\r\n    let fontObserver = () => { };\r\n    if (o.recordDOM) {\r\n        styleSheetObserver = initStyleSheetObserver(o, { win: currentWindow });\r\n        adoptedStyleSheetObserver = initAdoptedStyleSheetObserver(o, o.doc);\r\n        styleDeclarationObserver = initStyleDeclarationObserver(o, {\r\n            win: currentWindow,\r\n        });\r\n        if (o.collectFonts) {\r\n            fontObserver = initFontObserver(o);\r\n        }\r\n    }\r\n    const selectionObserver = initSelectionObserver(o);\r\n    const customElementObserver = initCustomElementObserver(o);\r\n    const pluginHandlers = [];\r\n    for (const plugin of o.plugins) {\r\n        pluginHandlers.push(plugin.observer(plugin.callback, currentWindow, plugin.options));\r\n    }\r\n    return callbackWrapper(() => {\r\n        mutationBuffers.forEach((b) => b.reset());\r\n        mutationObserver?.disconnect();\r\n        mousemoveHandler();\r\n        mouseInteractionHandler();\r\n        scrollHandler();\r\n        viewportResizeHandler();\r\n        inputHandler();\r\n        mediaInteractionHandler();\r\n        styleSheetObserver();\r\n        adoptedStyleSheetObserver();\r\n        styleDeclarationObserver();\r\n        fontObserver();\r\n        selectionObserver();\r\n        customElementObserver();\r\n        pluginHandlers.forEach((h) => h());\r\n    });\r\n}\r\nfunction hasNestedCSSRule(prop) {\r\n    return typeof window[prop] !== 'undefined';\r\n}\r\nfunction canMonkeyPatchNestedCSSRule(prop) {\r\n    return Boolean(typeof window[prop] !== 'undefined' &&\r\n        window[prop].prototype &&\r\n        'insertRule' in window[prop].prototype &&\r\n        'deleteRule' in window[prop].prototype);\r\n}\n\nexport { INPUT_TAGS, initAdoptedStyleSheetObserver, initMutationObserver, initObservers, initScrollObserver, mutationBuffers };\n","class CrossOriginIframeMirror {\r\n    constructor(generateIdFn) {\r\n        this.generateIdFn = generateIdFn;\r\n        this.iframeIdToRemoteIdMap = new WeakMap();\r\n        this.iframeRemoteIdToIdMap = new WeakMap();\r\n    }\r\n    getId(iframe, remoteId, idToRemoteMap, remoteToIdMap) {\r\n        const idToRemoteIdMap = idToRemoteMap || this.getIdToRemoteIdMap(iframe);\r\n        const remoteIdToIdMap = remoteToIdMap || this.getRemoteIdToIdMap(iframe);\r\n        let id = idToRemoteIdMap.get(remoteId);\r\n        if (!id) {\r\n            id = this.generateIdFn();\r\n            idToRemoteIdMap.set(remoteId, id);\r\n            remoteIdToIdMap.set(id, remoteId);\r\n        }\r\n        return id;\r\n    }\r\n    getIds(iframe, remoteId) {\r\n        const idToRemoteIdMap = this.getIdToRemoteIdMap(iframe);\r\n        const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\r\n        return remoteId.map((id) => this.getId(iframe, id, idToRemoteIdMap, remoteIdToIdMap));\r\n    }\r\n    getRemoteId(iframe, id, map) {\r\n        const remoteIdToIdMap = map || this.getRemoteIdToIdMap(iframe);\r\n        if (typeof id !== 'number')\r\n            return id;\r\n        const remoteId = remoteIdToIdMap.get(id);\r\n        if (!remoteId)\r\n            return -1;\r\n        return remoteId;\r\n    }\r\n    getRemoteIds(iframe, ids) {\r\n        const remoteIdToIdMap = this.getRemoteIdToIdMap(iframe);\r\n        return ids.map((id) => this.getRemoteId(iframe, id, remoteIdToIdMap));\r\n    }\r\n    reset(iframe) {\r\n        if (!iframe) {\r\n            this.iframeIdToRemoteIdMap = new WeakMap();\r\n            this.iframeRemoteIdToIdMap = new WeakMap();\r\n            return;\r\n        }\r\n        this.iframeIdToRemoteIdMap.delete(iframe);\r\n        this.iframeRemoteIdToIdMap.delete(iframe);\r\n    }\r\n    getIdToRemoteIdMap(iframe) {\r\n        let idToRemoteIdMap = this.iframeIdToRemoteIdMap.get(iframe);\r\n        if (!idToRemoteIdMap) {\r\n            idToRemoteIdMap = new Map();\r\n            this.iframeIdToRemoteIdMap.set(iframe, idToRemoteIdMap);\r\n        }\r\n        return idToRemoteIdMap;\r\n    }\r\n    getRemoteIdToIdMap(iframe) {\r\n        let remoteIdToIdMap = this.iframeRemoteIdToIdMap.get(iframe);\r\n        if (!remoteIdToIdMap) {\r\n            remoteIdToIdMap = new Map();\r\n            this.iframeRemoteIdToIdMap.set(iframe, remoteIdToIdMap);\r\n        }\r\n        return remoteIdToIdMap;\r\n    }\r\n}\n\nexport { CrossOriginIframeMirror as default };\n","import { genId, NodeType } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport CrossOriginIframeMirror from './cross-origin-iframe-mirror.js';\nimport { EventType, IncrementalSource } from '../../../types/dist/rrweb-types.js';\nimport { getIFrameContentDocument } from '../../../rrdom/es/rrdom.js';\n\nclass IframeManagerNoop {\r\n    constructor() {\r\n        this.crossOriginIframeMirror = new CrossOriginIframeMirror(genId);\r\n        this.crossOriginIframeRootIdMap = new WeakMap();\r\n    }\r\n    addIframe() {\r\n    }\r\n    addLoadListener() {\r\n    }\r\n    attachIframe() {\r\n    }\r\n}\r\nclass IframeManager {\r\n    constructor(options) {\r\n        this.iframes = new WeakMap();\r\n        this.crossOriginIframeMap = new WeakMap();\r\n        this.crossOriginIframeMirror = new CrossOriginIframeMirror(genId);\r\n        this.crossOriginIframeRootIdMap = new WeakMap();\r\n        this.mutationCb = options.mutationCb;\r\n        this.wrappedEmit = options.wrappedEmit;\r\n        this.stylesheetManager = options.stylesheetManager;\r\n        this.recordCrossOriginIframes = options.recordCrossOriginIframes;\r\n        this.crossOriginIframeStyleMirror = new CrossOriginIframeMirror(this.stylesheetManager.styleMirror.generateId.bind(this.stylesheetManager.styleMirror));\r\n        this.mirror = options.mirror;\r\n        if (this.recordCrossOriginIframes) {\r\n            window.addEventListener('message', this.handleMessage.bind(this));\r\n        }\r\n    }\r\n    addIframe(iframeEl) {\r\n        this.iframes.set(iframeEl, true);\r\n        if (iframeEl.contentWindow)\r\n            this.crossOriginIframeMap.set(iframeEl.contentWindow, iframeEl);\r\n    }\r\n    addLoadListener(cb) {\r\n        this.loadListener = cb;\r\n    }\r\n    attachIframe(iframeEl, childSn) {\r\n        this.mutationCb({\r\n            adds: [\r\n                {\r\n                    parentId: this.mirror.getId(iframeEl),\r\n                    nextId: null,\r\n                    node: childSn,\r\n                },\r\n            ],\r\n            removes: [],\r\n            texts: [],\r\n            attributes: [],\r\n            isAttachIframe: true,\r\n        });\r\n        this.loadListener?.(iframeEl);\r\n        const iframeDoc = getIFrameContentDocument(iframeEl);\r\n        if (iframeDoc &&\r\n            iframeDoc.adoptedStyleSheets &&\r\n            iframeDoc.adoptedStyleSheets.length > 0)\r\n            this.stylesheetManager.adoptStyleSheets(iframeDoc.adoptedStyleSheets, this.mirror.getId(iframeDoc));\r\n    }\r\n    handleMessage(message) {\r\n        const crossOriginMessageEvent = message;\r\n        if (crossOriginMessageEvent.data.type !== 'rrweb' ||\r\n            crossOriginMessageEvent.origin !== crossOriginMessageEvent.data.origin)\r\n            return;\r\n        const iframeSourceWindow = message.source;\r\n        if (!iframeSourceWindow)\r\n            return;\r\n        const iframeEl = this.crossOriginIframeMap.get(message.source);\r\n        if (!iframeEl)\r\n            return;\r\n        const transformedEvent = this.transformCrossOriginEvent(iframeEl, crossOriginMessageEvent.data.event);\r\n        if (transformedEvent)\r\n            this.wrappedEmit(transformedEvent, crossOriginMessageEvent.data.isCheckout);\r\n    }\r\n    transformCrossOriginEvent(iframeEl, e) {\r\n        switch (e.type) {\r\n            case EventType.FullSnapshot: {\r\n                this.crossOriginIframeMirror.reset(iframeEl);\r\n                this.crossOriginIframeStyleMirror.reset(iframeEl);\r\n                this.replaceIdOnNode(e.data.node, iframeEl);\r\n                const rootId = e.data.node.id;\r\n                this.crossOriginIframeRootIdMap.set(iframeEl, rootId);\r\n                this.patchRootIdOnNode(e.data.node, rootId);\r\n                return {\r\n                    timestamp: e.timestamp,\r\n                    type: EventType.IncrementalSnapshot,\r\n                    data: {\r\n                        source: IncrementalSource.Mutation,\r\n                        adds: [\r\n                            {\r\n                                parentId: this.mirror.getId(iframeEl),\r\n                                nextId: null,\r\n                                node: e.data.node,\r\n                            },\r\n                        ],\r\n                        removes: [],\r\n                        texts: [],\r\n                        attributes: [],\r\n                        isAttachIframe: true,\r\n                    },\r\n                };\r\n            }\r\n            case EventType.Meta:\r\n            case EventType.Load:\r\n            case EventType.DomContentLoaded: {\r\n                return false;\r\n            }\r\n            case EventType.Plugin: {\r\n                return e;\r\n            }\r\n            case EventType.Custom: {\r\n                this.replaceIds(e.data.payload, iframeEl, ['id', 'parentId', 'previousId', 'nextId']);\r\n                return e;\r\n            }\r\n            case EventType.IncrementalSnapshot: {\r\n                switch (e.data.source) {\r\n                    case IncrementalSource.Mutation: {\r\n                        e.data.adds.forEach((n) => {\r\n                            this.replaceIds(n, iframeEl, [\r\n                                'parentId',\r\n                                'nextId',\r\n                                'previousId',\r\n                            ]);\r\n                            this.replaceIdOnNode(n.node, iframeEl);\r\n                            const rootId = this.crossOriginIframeRootIdMap.get(iframeEl);\r\n                            rootId && this.patchRootIdOnNode(n.node, rootId);\r\n                        });\r\n                        e.data.removes.forEach((n) => {\r\n                            this.replaceIds(n, iframeEl, ['parentId', 'id']);\r\n                        });\r\n                        e.data.attributes.forEach((n) => {\r\n                            this.replaceIds(n, iframeEl, ['id']);\r\n                        });\r\n                        e.data.texts.forEach((n) => {\r\n                            this.replaceIds(n, iframeEl, ['id']);\r\n                        });\r\n                        return e;\r\n                    }\r\n                    case IncrementalSource.Drag:\r\n                    case IncrementalSource.TouchMove:\r\n                    case IncrementalSource.MouseMove: {\r\n                        e.data.positions.forEach((p) => {\r\n                            this.replaceIds(p, iframeEl, ['id']);\r\n                        });\r\n                        return e;\r\n                    }\r\n                    case IncrementalSource.ViewportResize: {\r\n                        return false;\r\n                    }\r\n                    case IncrementalSource.MediaInteraction:\r\n                    case IncrementalSource.MouseInteraction:\r\n                    case IncrementalSource.Scroll:\r\n                    case IncrementalSource.CanvasMutation:\r\n                    case IncrementalSource.Input: {\r\n                        this.replaceIds(e.data, iframeEl, ['id']);\r\n                        return e;\r\n                    }\r\n                    case IncrementalSource.StyleSheetRule:\r\n                    case IncrementalSource.StyleDeclaration: {\r\n                        this.replaceIds(e.data, iframeEl, ['id']);\r\n                        this.replaceStyleIds(e.data, iframeEl, ['styleId']);\r\n                        return e;\r\n                    }\r\n                    case IncrementalSource.Font: {\r\n                        return e;\r\n                    }\r\n                    case IncrementalSource.Selection: {\r\n                        e.data.ranges.forEach((range) => {\r\n                            this.replaceIds(range, iframeEl, ['start', 'end']);\r\n                        });\r\n                        return e;\r\n                    }\r\n                    case IncrementalSource.AdoptedStyleSheet: {\r\n                        this.replaceIds(e.data, iframeEl, ['id']);\r\n                        this.replaceStyleIds(e.data, iframeEl, ['styleIds']);\r\n                        e.data.styles?.forEach((style) => {\r\n                            this.replaceStyleIds(style, iframeEl, ['styleId']);\r\n                        });\r\n                        return e;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        return false;\r\n    }\r\n    replace(iframeMirror, obj, iframeEl, keys) {\r\n        for (const key of keys) {\r\n            if (!Array.isArray(obj[key]) && typeof obj[key] !== 'number')\r\n                continue;\r\n            if (Array.isArray(obj[key])) {\r\n                obj[key] = iframeMirror.getIds(iframeEl, obj[key]);\r\n            }\r\n            else {\r\n                obj[key] = iframeMirror.getId(iframeEl, obj[key]);\r\n            }\r\n        }\r\n        return obj;\r\n    }\r\n    replaceIds(obj, iframeEl, keys) {\r\n        return this.replace(this.crossOriginIframeMirror, obj, iframeEl, keys);\r\n    }\r\n    replaceStyleIds(obj, iframeEl, keys) {\r\n        return this.replace(this.crossOriginIframeStyleMirror, obj, iframeEl, keys);\r\n    }\r\n    replaceIdOnNode(node, iframeEl) {\r\n        this.replaceIds(node, iframeEl, ['id', 'rootId']);\r\n        if ('childNodes' in node) {\r\n            node.childNodes.forEach((child) => {\r\n                this.replaceIdOnNode(child, iframeEl);\r\n            });\r\n        }\r\n    }\r\n    patchRootIdOnNode(node, rootId) {\r\n        if (node.type !== NodeType.Document && !node.rootId)\r\n            node.rootId = rootId;\r\n        if ('childNodes' in node) {\r\n            node.childNodes.forEach((child) => {\r\n                this.patchRootIdOnNode(child, rootId);\r\n            });\r\n        }\r\n    }\r\n}\n\nexport { IframeManager, IframeManagerNoop };\n","import { initMutationObserver, initScrollObserver, initAdoptedStyleSheetObserver } from './observer.js';\nimport { setTimeout, patch, inDom } from '../utils.js';\nimport { isNativeShadowDom } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { getIFrameContentDocument, getIFrameContentWindow } from '../../../rrdom/es/rrdom.js';\n\nclass ShadowDomManagerNoop {\r\n    init() {\r\n    }\r\n    addShadowRoot() {\r\n    }\r\n    observeAttachShadow() {\r\n    }\r\n    reset() {\r\n    }\r\n}\r\nclass ShadowDomManager {\r\n    constructor(options) {\r\n        this.shadowDoms = new WeakSet();\r\n        this.restoreHandlers = [];\r\n        this.mutationCb = options.mutationCb;\r\n        this.scrollCb = options.scrollCb;\r\n        this.bypassOptions = options.bypassOptions;\r\n        this.mirror = options.mirror;\r\n        this.init();\r\n    }\r\n    init() {\r\n        this.reset();\r\n        this.patchAttachShadow(Element, document);\r\n    }\r\n    addShadowRoot(shadowRoot, doc) {\r\n        if (!isNativeShadowDom(shadowRoot))\r\n            return;\r\n        if (this.shadowDoms.has(shadowRoot))\r\n            return;\r\n        this.shadowDoms.add(shadowRoot);\r\n        this.bypassOptions.canvasManager.addShadowRoot(shadowRoot);\r\n        const observer = initMutationObserver({\r\n            ...this.bypassOptions,\r\n            doc,\r\n            mutationCb: this.mutationCb,\r\n            mirror: this.mirror,\r\n            shadowDomManager: this,\r\n        }, shadowRoot);\r\n        this.restoreHandlers.push(() => observer.disconnect());\r\n        this.restoreHandlers.push(initScrollObserver({\r\n            ...this.bypassOptions,\r\n            scrollCb: this.scrollCb,\r\n            doc: shadowRoot,\r\n            mirror: this.mirror,\r\n        }));\r\n        setTimeout(() => {\r\n            if (shadowRoot.adoptedStyleSheets &&\r\n                shadowRoot.adoptedStyleSheets.length > 0)\r\n                this.bypassOptions.stylesheetManager.adoptStyleSheets(shadowRoot.adoptedStyleSheets, this.mirror.getId(shadowRoot.host));\r\n            this.restoreHandlers.push(initAdoptedStyleSheetObserver({\r\n                mirror: this.mirror,\r\n                stylesheetManager: this.bypassOptions.stylesheetManager,\r\n            }, shadowRoot));\r\n        }, 0);\r\n    }\r\n    observeAttachShadow(iframeElement) {\r\n        const iframeDoc = getIFrameContentDocument(iframeElement);\r\n        const iframeWindow = getIFrameContentWindow(iframeElement);\r\n        if (!iframeDoc || !iframeWindow)\r\n            return;\r\n        this.patchAttachShadow(iframeWindow.Element, iframeDoc);\r\n    }\r\n    patchAttachShadow(element, doc) {\r\n        const manager = this;\r\n        this.restoreHandlers.push(patch(element.prototype, 'attachShadow', function (original) {\r\n            return function (option) {\r\n                const shadowRoot = original.call(this, option);\r\n                if (this.shadowRoot && inDom(this))\r\n                    manager.addShadowRoot(this.shadowRoot, doc);\r\n                return shadowRoot;\r\n            };\r\n        }));\r\n    }\r\n    reset() {\r\n        this.restoreHandlers.forEach((handler) => {\r\n            try {\r\n                handler();\r\n            }\r\n            catch (e) {\r\n            }\r\n        });\r\n        this.restoreHandlers = [];\r\n        this.shadowDoms = new WeakSet();\r\n        this.bypassOptions.canvasManager.resetShadowRoots();\r\n    }\r\n}\n\nexport { ShadowDomManager, ShadowDomManagerNoop };\n","import { stringifyRule } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { StyleSheetMirror } from '../utils.js';\n\nclass StylesheetManager {\r\n    constructor(options) {\r\n        this.trackedLinkElements = new WeakSet();\r\n        this.styleMirror = new StyleSheetMirror();\r\n        this.mutationCb = options.mutationCb;\r\n        this.adoptedStyleSheetCb = options.adoptedStyleSheetCb;\r\n    }\r\n    attachLinkElement(linkEl, childSn) {\r\n        if ('_cssText' in childSn.attributes)\r\n            this.mutationCb({\r\n                adds: [],\r\n                removes: [],\r\n                texts: [],\r\n                attributes: [\r\n                    {\r\n                        id: childSn.id,\r\n                        attributes: childSn\r\n                            .attributes,\r\n                    },\r\n                ],\r\n            });\r\n        this.trackLinkElement(linkEl);\r\n    }\r\n    trackLinkElement(linkEl) {\r\n        if (this.trackedLinkElements.has(linkEl))\r\n            return;\r\n        this.trackedLinkElements.add(linkEl);\r\n        this.trackStylesheetInLinkElement(linkEl);\r\n    }\r\n    adoptStyleSheets(sheets, hostId) {\r\n        if (sheets.length === 0)\r\n            return;\r\n        const adoptedStyleSheetData = {\r\n            id: hostId,\r\n            styleIds: [],\r\n        };\r\n        const styles = [];\r\n        for (const sheet of sheets) {\r\n            let styleId;\r\n            if (!this.styleMirror.has(sheet)) {\r\n                styleId = this.styleMirror.add(sheet);\r\n                styles.push({\r\n                    styleId,\r\n                    rules: Array.from(sheet.rules || CSSRule, (r, index) => ({\r\n                        rule: stringifyRule(r),\r\n                        index,\r\n                    })),\r\n                });\r\n            }\r\n            else\r\n                styleId = this.styleMirror.getId(sheet);\r\n            adoptedStyleSheetData.styleIds.push(styleId);\r\n        }\r\n        if (styles.length > 0)\r\n            adoptedStyleSheetData.styles = styles;\r\n        this.adoptedStyleSheetCb(adoptedStyleSheetData);\r\n    }\r\n    reset() {\r\n        this.styleMirror.reset();\r\n        this.trackedLinkElements = new WeakSet();\r\n    }\r\n    trackStylesheetInLinkElement(linkEl) {\r\n    }\r\n}\n\nexport { StylesheetManager };\n","import { onRequestAnimationFrame } from '../utils.js';\n\nclass ProcessedNodeManager {\r\n    constructor() {\r\n        this.nodeMap = new WeakMap();\r\n        this.active = false;\r\n    }\r\n    inOtherBuffer(node, thisBuffer) {\r\n        const buffers = this.nodeMap.get(node);\r\n        return (buffers && Array.from(buffers).some((buffer) => buffer !== thisBuffer));\r\n    }\r\n    add(node, buffer) {\r\n        if (!this.active) {\r\n            this.active = true;\r\n            onRequestAnimationFrame(() => {\r\n                this.nodeMap = new WeakMap();\r\n                this.active = false;\r\n            });\r\n        }\r\n        this.nodeMap.set(node, (this.nodeMap.get(node) || new Set()).add(buffer));\r\n    }\r\n    destroy() {\r\n    }\r\n}\n\nexport { ProcessedNodeManager as default };\n","import { createMirror, snapshot } from '../../../rrweb-snapshot/es/rrweb-snapshot.js';\nimport { initObservers, mutationBuffers } from './observer.js';\nimport { polyfill, on, nowTimestamp, getWindowWidth, getWindowHeight, getWindowScroll, isSerializedIframe, isSerializedStylesheet, hasShadowRoot } from '../utils.js';\nimport { EventType, IncrementalSource } from '../../../types/dist/rrweb-types.js';\nimport { IframeManagerNoop, IframeManager } from './iframe-manager.js';\nimport { ShadowDomManagerNoop, ShadowDomManager } from './shadow-dom-manager.js';\nimport { CanvasManagerNoop } from './observers/canvas/canvas-manager.js';\nexport { CanvasManager } from './observers/canvas/canvas-manager.js';\nimport { StylesheetManager } from './stylesheet-manager.js';\nimport ProcessedNodeManager from './processed-node-manager.js';\nimport { callbackWrapper, unregisterErrorHandler, registerErrorHandler } from './error-handler.js';\n\nlet wrappedEmit;\r\nlet _wrappedEmit;\r\nlet _takeFullSnapshot;\r\ntry {\r\n    if (Array.from([1], (x) => x * 2)[0] !== 2) {\r\n        const cleanFrame = document.createElement('iframe');\r\n        document.body.appendChild(cleanFrame);\r\n        Array.from = cleanFrame.contentWindow?.Array.from || Array.from;\r\n        document.body.removeChild(cleanFrame);\r\n    }\r\n}\r\ncatch (err) {\r\n    console.debug('Unable to override Array.from', err);\r\n}\r\nconst mirror = createMirror();\r\nfunction record(options = {}) {\r\n    const { emit, checkoutEveryNms, checkoutEveryNth, blockClass = 'rr-block', blockSelector = null, unblockSelector = null, ignoreClass = 'rr-ignore', ignoreSelector = null, maskAllText = false, maskTextClass = 'rr-mask', unmaskTextClass = null, maskTextSelector = null, unmaskTextSelector = null, inlineStylesheet = true, maskAllInputs, maskInputOptions: _maskInputOptions, slimDOMOptions: _slimDOMOptions, maskAttributeFn, maskInputFn, maskTextFn, maxCanvasSize = null, packFn, sampling = {}, dataURLOptions = {}, mousemoveWait, recordDOM = true, recordCanvas = false, recordCrossOriginIframes = false, recordAfter = options.recordAfter === 'DOMContentLoaded'\r\n        ? options.recordAfter\r\n        : 'load', userTriggeredOnInput = false, collectFonts = false, inlineImages = false, plugins, keepIframeSrcFn = () => false, ignoreCSSAttributes = new Set([]), errorHandler, onMutation, getCanvasManager, } = options;\r\n    registerErrorHandler(errorHandler);\r\n    const inEmittingFrame = recordCrossOriginIframes\r\n        ? window.parent === window\r\n        : true;\r\n    let passEmitsToParent = false;\r\n    if (!inEmittingFrame) {\r\n        try {\r\n            if (window.parent.document) {\r\n                passEmitsToParent = false;\r\n            }\r\n        }\r\n        catch (e) {\r\n            passEmitsToParent = true;\r\n        }\r\n    }\r\n    if (inEmittingFrame && !emit) {\r\n        throw new Error('emit function is required');\r\n    }\r\n    if (!inEmittingFrame && !passEmitsToParent) {\r\n        return () => {\r\n        };\r\n    }\r\n    if (mousemoveWait !== undefined && sampling.mousemove === undefined) {\r\n        sampling.mousemove = mousemoveWait;\r\n    }\r\n    mirror.reset();\r\n    const maskInputOptions = maskAllInputs === true\r\n        ? {\r\n            color: true,\r\n            date: true,\r\n            'datetime-local': true,\r\n            email: true,\r\n            month: true,\r\n            number: true,\r\n            range: true,\r\n            search: true,\r\n            tel: true,\r\n            text: true,\r\n            time: true,\r\n            url: true,\r\n            week: true,\r\n            textarea: true,\r\n            select: true,\r\n            radio: true,\r\n            checkbox: true,\r\n        }\r\n        : _maskInputOptions !== undefined\r\n            ? _maskInputOptions\r\n            : {};\r\n    const slimDOMOptions = _slimDOMOptions === true || _slimDOMOptions === 'all'\r\n        ? {\r\n            script: true,\r\n            comment: true,\r\n            headFavicon: true,\r\n            headWhitespace: true,\r\n            headMetaSocial: true,\r\n            headMetaRobots: true,\r\n            headMetaHttpEquiv: true,\r\n            headMetaVerification: true,\r\n            headMetaAuthorship: _slimDOMOptions === 'all',\r\n            headMetaDescKeywords: _slimDOMOptions === 'all',\r\n        }\r\n        : _slimDOMOptions\r\n            ? _slimDOMOptions\r\n            : {};\r\n    polyfill();\r\n    let lastFullSnapshotEvent;\r\n    let incrementalSnapshotCount = 0;\r\n    const eventProcessor = (e) => {\r\n        for (const plugin of plugins || []) {\r\n            if (plugin.eventProcessor) {\r\n                e = plugin.eventProcessor(e);\r\n            }\r\n        }\r\n        if (packFn &&\r\n            !passEmitsToParent) {\r\n            e = packFn(e);\r\n        }\r\n        return e;\r\n    };\r\n    wrappedEmit = (r, isCheckout) => {\r\n        const e = r;\r\n        e.timestamp = nowTimestamp();\r\n        if (mutationBuffers[0]?.isFrozen() &&\r\n            e.type !== EventType.FullSnapshot &&\r\n            !(e.type === EventType.IncrementalSnapshot &&\r\n                e.data.source === IncrementalSource.Mutation)) {\r\n            mutationBuffers.forEach((buf) => buf.unfreeze());\r\n        }\r\n        if (inEmittingFrame) {\r\n            emit?.(eventProcessor(e), isCheckout);\r\n        }\r\n        else if (passEmitsToParent) {\r\n            const message = {\r\n                type: 'rrweb',\r\n                event: eventProcessor(e),\r\n                origin: window.location.origin,\r\n                isCheckout,\r\n            };\r\n            window.parent.postMessage(message, '*');\r\n        }\r\n        if (e.type === EventType.FullSnapshot) {\r\n            lastFullSnapshotEvent = e;\r\n            incrementalSnapshotCount = 0;\r\n        }\r\n        else if (e.type === EventType.IncrementalSnapshot) {\r\n            if (e.data.source === IncrementalSource.Mutation &&\r\n                e.data.isAttachIframe) {\r\n                return;\r\n            }\r\n            incrementalSnapshotCount++;\r\n            const exceedCount = checkoutEveryNth && incrementalSnapshotCount >= checkoutEveryNth;\r\n            const exceedTime = checkoutEveryNms &&\r\n                lastFullSnapshotEvent &&\r\n                e.timestamp - lastFullSnapshotEvent.timestamp > checkoutEveryNms;\r\n            if (exceedCount || exceedTime) {\r\n                takeFullSnapshot(true);\r\n            }\r\n        }\r\n    };\r\n    _wrappedEmit = wrappedEmit;\r\n    const wrappedMutationEmit = (m) => {\r\n        wrappedEmit({\r\n            type: EventType.IncrementalSnapshot,\r\n            data: {\r\n                source: IncrementalSource.Mutation,\r\n                ...m,\r\n            },\r\n        });\r\n    };\r\n    const wrappedScrollEmit = (p) => wrappedEmit({\r\n        type: EventType.IncrementalSnapshot,\r\n        data: {\r\n            source: IncrementalSource.Scroll,\r\n            ...p,\r\n        },\r\n    });\r\n    const wrappedCanvasMutationEmit = (p) => wrappedEmit({\r\n        type: EventType.IncrementalSnapshot,\r\n        data: {\r\n            source: IncrementalSource.CanvasMutation,\r\n            ...p,\r\n        },\r\n    });\r\n    const wrappedAdoptedStyleSheetEmit = (a) => wrappedEmit({\r\n        type: EventType.IncrementalSnapshot,\r\n        data: {\r\n            source: IncrementalSource.AdoptedStyleSheet,\r\n            ...a,\r\n        },\r\n    });\r\n    const stylesheetManager = new StylesheetManager({\r\n        mutationCb: wrappedMutationEmit,\r\n        adoptedStyleSheetCb: wrappedAdoptedStyleSheetEmit,\r\n    });\r\n    const iframeManager = typeof __RRWEB_EXCLUDE_IFRAME__ === 'boolean' && __RRWEB_EXCLUDE_IFRAME__\r\n        ? new IframeManagerNoop()\r\n        : new IframeManager({\r\n            mirror,\r\n            mutationCb: wrappedMutationEmit,\r\n            stylesheetManager: stylesheetManager,\r\n            recordCrossOriginIframes,\r\n            wrappedEmit,\r\n        });\r\n    for (const plugin of plugins || []) {\r\n        if (plugin.getMirror)\r\n            plugin.getMirror({\r\n                nodeMirror: mirror,\r\n                crossOriginIframeMirror: iframeManager.crossOriginIframeMirror,\r\n                crossOriginIframeStyleMirror: iframeManager.crossOriginIframeStyleMirror,\r\n            });\r\n    }\r\n    const processedNodeManager = new ProcessedNodeManager();\r\n    const canvasManager = _getCanvasManager(getCanvasManager, {\r\n        mirror,\r\n        win: window,\r\n        mutationCb: (p) => wrappedEmit({\r\n            type: EventType.IncrementalSnapshot,\r\n            data: {\r\n                source: IncrementalSource.CanvasMutation,\r\n                ...p,\r\n            },\r\n        }),\r\n        recordCanvas,\r\n        blockClass,\r\n        blockSelector,\r\n        unblockSelector,\r\n        maxCanvasSize,\r\n        sampling: sampling['canvas'],\r\n        dataURLOptions,\r\n        errorHandler,\r\n    });\r\n    const shadowDomManager = typeof __RRWEB_EXCLUDE_SHADOW_DOM__ === 'boolean' &&\r\n        __RRWEB_EXCLUDE_SHADOW_DOM__\r\n        ? new ShadowDomManagerNoop()\r\n        : new ShadowDomManager({\r\n            mutationCb: wrappedMutationEmit,\r\n            scrollCb: wrappedScrollEmit,\r\n            bypassOptions: {\r\n                onMutation,\r\n                blockClass,\r\n                blockSelector,\r\n                unblockSelector,\r\n                maskAllText,\r\n                maskTextClass,\r\n                unmaskTextClass,\r\n                maskTextSelector,\r\n                unmaskTextSelector,\r\n                inlineStylesheet,\r\n                maskInputOptions,\r\n                dataURLOptions,\r\n                maskAttributeFn,\r\n                maskTextFn,\r\n                maskInputFn,\r\n                recordCanvas,\r\n                inlineImages,\r\n                sampling,\r\n                slimDOMOptions,\r\n                iframeManager,\r\n                stylesheetManager,\r\n                canvasManager,\r\n                keepIframeSrcFn,\r\n                processedNodeManager,\r\n            },\r\n            mirror,\r\n        });\r\n    const takeFullSnapshot = (isCheckout = false) => {\r\n        if (!recordDOM) {\r\n            return;\r\n        }\r\n        wrappedEmit({\r\n            type: EventType.Meta,\r\n            data: {\r\n                href: window.location.href,\r\n                width: getWindowWidth(),\r\n                height: getWindowHeight(),\r\n            },\r\n        }, isCheckout);\r\n        stylesheetManager.reset();\r\n        shadowDomManager.init();\r\n        mutationBuffers.forEach((buf) => buf.lock());\r\n        const node = snapshot(document, {\r\n            mirror,\r\n            blockClass,\r\n            blockSelector,\r\n            unblockSelector,\r\n            maskAllText,\r\n            maskTextClass,\r\n            unmaskTextClass,\r\n            maskTextSelector,\r\n            unmaskTextSelector,\r\n            inlineStylesheet,\r\n            maskAllInputs: maskInputOptions,\r\n            maskAttributeFn,\r\n            maskInputFn,\r\n            maskTextFn,\r\n            slimDOM: slimDOMOptions,\r\n            dataURLOptions,\r\n            recordCanvas,\r\n            inlineImages,\r\n            onSerialize: (n) => {\r\n                if (isSerializedIframe(n, mirror)) {\r\n                    iframeManager.addIframe(n);\r\n                }\r\n                if (isSerializedStylesheet(n, mirror)) {\r\n                    stylesheetManager.trackLinkElement(n);\r\n                }\r\n                if (hasShadowRoot(n)) {\r\n                    shadowDomManager.addShadowRoot(n.shadowRoot, document);\r\n                }\r\n            },\r\n            onIframeLoad: (iframe, childSn) => {\r\n                iframeManager.attachIframe(iframe, childSn);\r\n                if (iframe.contentWindow) {\r\n                    canvasManager.addWindow(iframe.contentWindow);\r\n                }\r\n                shadowDomManager.observeAttachShadow(iframe);\r\n            },\r\n            onStylesheetLoad: (linkEl, childSn) => {\r\n                stylesheetManager.attachLinkElement(linkEl, childSn);\r\n            },\r\n            keepIframeSrcFn,\r\n        });\r\n        if (!node) {\r\n            return console.warn('Failed to snapshot the document');\r\n        }\r\n        wrappedEmit({\r\n            type: EventType.FullSnapshot,\r\n            data: {\r\n                node,\r\n                initialOffset: getWindowScroll(window),\r\n            },\r\n        });\r\n        mutationBuffers.forEach((buf) => buf.unlock());\r\n        if (document.adoptedStyleSheets && document.adoptedStyleSheets.length > 0)\r\n            stylesheetManager.adoptStyleSheets(document.adoptedStyleSheets, mirror.getId(document));\r\n    };\r\n    _takeFullSnapshot = takeFullSnapshot;\r\n    try {\r\n        const handlers = [];\r\n        const observe = (doc) => {\r\n            return callbackWrapper(initObservers)({\r\n                onMutation,\r\n                mutationCb: wrappedMutationEmit,\r\n                mousemoveCb: (positions, source) => wrappedEmit({\r\n                    type: EventType.IncrementalSnapshot,\r\n                    data: {\r\n                        source,\r\n                        positions,\r\n                    },\r\n                }),\r\n                mouseInteractionCb: (d) => wrappedEmit({\r\n                    type: EventType.IncrementalSnapshot,\r\n                    data: {\r\n                        source: IncrementalSource.MouseInteraction,\r\n                        ...d,\r\n                    },\r\n                }),\r\n                scrollCb: wrappedScrollEmit,\r\n                viewportResizeCb: (d) => wrappedEmit({\r\n                    type: EventType.IncrementalSnapshot,\r\n                    data: {\r\n                        source: IncrementalSource.ViewportResize,\r\n                        ...d,\r\n                    },\r\n                }),\r\n                inputCb: (v) => wrappedEmit({\r\n                    type: EventType.IncrementalSnapshot,\r\n                    data: {\r\n                        source: IncrementalSource.Input,\r\n                        ...v,\r\n                    },\r\n                }),\r\n                mediaInteractionCb: (p) => wrappedEmit({\r\n                    type: EventType.IncrementalSnapshot,\r\n                    data: {\r\n                        source: IncrementalSource.MediaInteraction,\r\n                        ...p,\r\n                    },\r\n                }),\r\n                styleSheetRuleCb: (r) => wrappedEmit({\r\n                    type: EventType.IncrementalSnapshot,\r\n                    data: {\r\n                        source: IncrementalSource.StyleSheetRule,\r\n                        ...r,\r\n                    },\r\n                }),\r\n                styleDeclarationCb: (r) => wrappedEmit({\r\n                    type: EventType.IncrementalSnapshot,\r\n                    data: {\r\n                        source: IncrementalSource.StyleDeclaration,\r\n                        ...r,\r\n                    },\r\n                }),\r\n                canvasMutationCb: wrappedCanvasMutationEmit,\r\n                fontCb: (p) => wrappedEmit({\r\n                    type: EventType.IncrementalSnapshot,\r\n                    data: {\r\n                        source: IncrementalSource.Font,\r\n                        ...p,\r\n                    },\r\n                }),\r\n                selectionCb: (p) => {\r\n                    wrappedEmit({\r\n                        type: EventType.IncrementalSnapshot,\r\n                        data: {\r\n                            source: IncrementalSource.Selection,\r\n                            ...p,\r\n                        },\r\n                    });\r\n                },\r\n                customElementCb: (c) => {\r\n                    wrappedEmit({\r\n                        type: EventType.IncrementalSnapshot,\r\n                        data: {\r\n                            source: IncrementalSource.CustomElement,\r\n                            ...c,\r\n                        },\r\n                    });\r\n                },\r\n                blockClass,\r\n                ignoreClass,\r\n                ignoreSelector,\r\n                maskAllText,\r\n                maskTextClass,\r\n                unmaskTextClass,\r\n                maskTextSelector,\r\n                unmaskTextSelector,\r\n                maskInputOptions,\r\n                inlineStylesheet,\r\n                sampling,\r\n                recordDOM,\r\n                recordCanvas,\r\n                inlineImages,\r\n                userTriggeredOnInput,\r\n                collectFonts,\r\n                doc,\r\n                maskAttributeFn,\r\n                maskInputFn,\r\n                maskTextFn,\r\n                keepIframeSrcFn,\r\n                blockSelector,\r\n                unblockSelector,\r\n                slimDOMOptions,\r\n                dataURLOptions,\r\n                mirror,\r\n                iframeManager,\r\n                stylesheetManager,\r\n                shadowDomManager,\r\n                processedNodeManager,\r\n                canvasManager,\r\n                ignoreCSSAttributes,\r\n                plugins: plugins\r\n                    ?.filter((p) => p.observer)\r\n                    ?.map((p) => ({\r\n                    observer: p.observer,\r\n                    options: p.options,\r\n                    callback: (payload) => wrappedEmit({\r\n                        type: EventType.Plugin,\r\n                        data: {\r\n                            plugin: p.name,\r\n                            payload,\r\n                        },\r\n                    }),\r\n                })) || [],\r\n            }, {});\r\n        };\r\n        iframeManager.addLoadListener((iframeEl) => {\r\n            try {\r\n                handlers.push(observe(iframeEl.contentDocument));\r\n            }\r\n            catch (error) {\r\n                console.warn(error);\r\n            }\r\n        });\r\n        const init = () => {\r\n            takeFullSnapshot();\r\n            handlers.push(observe(document));\r\n        };\r\n        if (document.readyState === 'interactive' ||\r\n            document.readyState === 'complete') {\r\n            init();\r\n        }\r\n        else {\r\n            handlers.push(on('DOMContentLoaded', () => {\r\n                wrappedEmit({\r\n                    type: EventType.DomContentLoaded,\r\n                    data: {},\r\n                });\r\n                if (recordAfter === 'DOMContentLoaded')\r\n                    init();\r\n            }));\r\n            handlers.push(on('load', () => {\r\n                wrappedEmit({\r\n                    type: EventType.Load,\r\n                    data: {},\r\n                });\r\n                if (recordAfter === 'load')\r\n                    init();\r\n            }, window));\r\n        }\r\n        return () => {\r\n            handlers.forEach((h) => h());\r\n            processedNodeManager.destroy();\r\n            _takeFullSnapshot = undefined;\r\n            unregisterErrorHandler();\r\n        };\r\n    }\r\n    catch (error) {\r\n        console.warn(error);\r\n    }\r\n}\r\nfunction addCustomEvent(tag, payload) {\r\n    if (!_wrappedEmit) {\r\n        throw new Error('please add custom event after start recording');\r\n    }\r\n    wrappedEmit({\r\n        type: EventType.Custom,\r\n        data: {\r\n            tag,\r\n            payload,\r\n        },\r\n    });\r\n}\r\nfunction freezePage() {\r\n    mutationBuffers.forEach((buf) => buf.freeze());\r\n}\r\nfunction takeFullSnapshot(isCheckout) {\r\n    if (!_takeFullSnapshot) {\r\n        throw new Error('please take full snapshot after start recording');\r\n    }\r\n    _takeFullSnapshot(isCheckout);\r\n}\r\nrecord.mirror = mirror;\r\nrecord.takeFullSnapshot = takeFullSnapshot;\r\nfunction _getCanvasManager(getCanvasManagerFn, options) {\r\n    try {\r\n        return getCanvasManagerFn\r\n            ? getCanvasManagerFn(options)\r\n            : new CanvasManagerNoop();\r\n    }\r\n    catch {\r\n        console.warn('Unable to initialize CanvasManager');\r\n        return new CanvasManagerNoop();\r\n    }\r\n}\n\nexport { addCustomEvent, record as default, freezePage, takeFullSnapshot };\n","/**\n * Converts a timestamp to ms, if it was in s, or keeps it as ms.\n */\nexport function timestampToMs(timestamp: number): number {\n  const isMs = timestamp > 9999999999;\n  return isMs ? timestamp : timestamp * 1000;\n}\n\n/**\n * Converts a timestamp to s, if it was in ms, or keeps it as s.\n */\nexport function timestampToS(timestamp: number): number {\n  const isMs = timestamp > 9999999999;\n  return isMs ? timestamp / 1000 : timestamp;\n}\n","import { EventType } from '@sentry-internal/rrweb';\nimport { normalize } from '@sentry/core';\nimport type { Breadcrumb } from '@sentry/core';\n\nimport type { ReplayContainer } from '../../types';\n\n/**\n * Add a breadcrumb event to replay.\n */\nexport function addBreadcrumbEvent(replay: ReplayContainer, breadcrumb: Breadcrumb): void {\n  if (breadcrumb.category === 'sentry.transaction') {\n    return;\n  }\n\n  if (['ui.click', 'ui.input'].includes(breadcrumb.category as string)) {\n    replay.triggerUserActivity();\n  } else {\n    replay.checkAndHandleExpiredSession();\n  }\n\n  replay.addUpdate(() => {\n    // This should never reject\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    replay.throttledAddEvent({\n      type: EventType.Custom,\n      // TODO: We were converting from ms to seconds for breadcrumbs, spans,\n      // but maybe we should just keep them as milliseconds\n      timestamp: (breadcrumb.timestamp || 0) * 1000,\n      data: {\n        tag: 'breadcrumb',\n        // normalize to max. 10 depth and 1_000 properties per object\n        payload: normalize(breadcrumb, 10, 1_000),\n      },\n    });\n\n    // Do not flush after console log messages\n    return breadcrumb.category === 'console';\n  });\n}\n","import type { INode } from '@sentry-internal/rrweb-snapshot';\n\nconst INTERACTIVE_SELECTOR = 'button,a';\n\n/** Get the closest interactive parent element, or else return the given element. */\nexport function getClosestInteractive(element: Element): Element {\n  const closestInteractive = element.closest(INTERACTIVE_SELECTOR);\n  return closestInteractive || element;\n}\n\n/**\n * For clicks, we check if the target is inside of a button or link\n * If so, we use this as the target instead\n * This is useful because if you click on the image in <button><img></button>,\n * The target will be the image, not the button, which we don't want here\n */\nexport function getClickTargetNode(event: Event | MouseEvent | Node): Node | INode | null {\n  const target = getTargetNode(event);\n\n  if (!target || !(target instanceof Element)) {\n    return target;\n  }\n\n  return getClosestInteractive(target);\n}\n\n/** Get the event target node. */\nexport function getTargetNode(event: Node | { target: EventTarget | null }): Node | INode | null {\n  if (isEventWithTarget(event)) {\n    return event.target as Node | null;\n  }\n\n  return event;\n}\n\nfunction isEventWithTarget(event: unknown): event is { target: EventTarget | null } {\n  return typeof event === 'object' && !!event && 'target' in event;\n}\n","import { fill } from '@sentry/core';\n\nimport { WINDOW } from '../../constants';\n\ntype WindowOpenHandler = () => void;\n\nlet handlers: undefined | WindowOpenHandler[];\n\n/**\n * Register a handler to be called when `window.open()` is called.\n * Returns a cleanup function.\n */\nexport function onWindowOpen(cb: WindowOpenHandler): () => void {\n  // Ensure to only register this once\n  if (!handlers) {\n    handlers = [];\n    monkeyPatchWindowOpen();\n  }\n\n  handlers.push(cb);\n\n  return () => {\n    const pos = handlers ? handlers.indexOf(cb) : -1;\n    if (pos > -1) {\n      (handlers as WindowOpenHandler[]).splice(pos, 1);\n    }\n  };\n}\n\nfunction monkeyPatchWindowOpen(): void {\n  fill(WINDOW, 'open', function (originalWindowOpen: () => void): () => void {\n    return function (...args: unknown[]): void {\n      if (handlers) {\n        try {\n          handlers.forEach(handler => handler());\n        } catch (e) {\n          // ignore errors in here\n        }\n      }\n\n      return originalWindowOpen.apply(WINDOW, args);\n    };\n  });\n}\n","import { setTimeout } from '@sentry-internal/browser-utils';\nimport { IncrementalSource, MouseInteractions, record } from '@sentry-internal/rrweb';\nimport type { Breadcrumb } from '@sentry/core';\n\nimport { WINDOW } from '../constants';\nimport type {\n  RecordingEvent,\n  ReplayClickDetector,\n  ReplayContainer,\n  ReplayMultiClickFrame,\n  ReplaySlowClickFrame,\n  SlowClickConfig,\n} from '../types';\nimport { ReplayEventTypeIncrementalSnapshot } from '../types';\nimport { timestampToS } from '../util/timestamp';\nimport { addBreadcrumbEvent } from './util/addBreadcrumbEvent';\nimport { getClosestInteractive } from './util/domUtils';\nimport { onWindowOpen } from './util/onWindowOpen';\n\ntype ClickBreadcrumb = Breadcrumb & {\n  timestamp: number;\n};\n\ninterface Click {\n  timestamp: number;\n  mutationAfter?: number;\n  scrollAfter?: number;\n  clickBreadcrumb: ClickBreadcrumb;\n  clickCount: number;\n  node: HTMLElement;\n}\n\ntype IncrementalRecordingEvent = RecordingEvent & {\n  type: typeof ReplayEventTypeIncrementalSnapshot;\n  data: { source: IncrementalSource };\n};\n\ntype IncrementalMouseInteractionRecordingEvent = IncrementalRecordingEvent & {\n  type: typeof ReplayEventTypeIncrementalSnapshot;\n  data: { type: MouseInteractions; id: number };\n};\n\n/** Any IncrementalSource for rrweb that we interpret as a kind of mutation. */\nconst IncrementalMutationSources = new Set([\n  IncrementalSource.Mutation,\n  IncrementalSource.StyleSheetRule,\n  IncrementalSource.StyleDeclaration,\n  IncrementalSource.AdoptedStyleSheet,\n  IncrementalSource.CanvasMutation,\n  IncrementalSource.Selection,\n  IncrementalSource.MediaInteraction,\n]);\n\n/** Handle a click. */\nexport function handleClick(clickDetector: ReplayClickDetector, clickBreadcrumb: Breadcrumb, node: HTMLElement): void {\n  clickDetector.handleClick(clickBreadcrumb, node);\n}\n\n/** A click detector class that can be used to detect slow or rage clicks on elements. */\nexport class ClickDetector implements ReplayClickDetector {\n  // protected for testing\n  protected _lastMutation: number;\n  protected _lastScroll: number;\n\n  private _clicks: Click[];\n  private _teardown: undefined | (() => void);\n\n  private _threshold: number;\n  private _scrollTimeout: number;\n  private _timeout: number;\n  private _ignoreSelector: string;\n\n  private _replay: ReplayContainer;\n  private _checkClickTimeout?: ReturnType<typeof setTimeout>;\n  private _addBreadcrumbEvent: typeof addBreadcrumbEvent;\n\n  public constructor(\n    replay: ReplayContainer,\n    slowClickConfig: SlowClickConfig,\n    // Just for easier testing\n    _addBreadcrumbEvent = addBreadcrumbEvent,\n  ) {\n    this._lastMutation = 0;\n    this._lastScroll = 0;\n    this._clicks = [];\n\n    // We want everything in s, but options are in ms\n    this._timeout = slowClickConfig.timeout / 1000;\n    this._threshold = slowClickConfig.threshold / 1000;\n    this._scrollTimeout = slowClickConfig.scrollTimeout / 1000;\n    this._replay = replay;\n    this._ignoreSelector = slowClickConfig.ignoreSelector;\n    this._addBreadcrumbEvent = _addBreadcrumbEvent;\n  }\n\n  /** Register click detection handlers on mutation or scroll. */\n  public addListeners(): void {\n    const cleanupWindowOpen = onWindowOpen(() => {\n      // Treat window.open as mutation\n      this._lastMutation = nowInSeconds();\n    });\n\n    this._teardown = () => {\n      cleanupWindowOpen();\n\n      this._clicks = [];\n      this._lastMutation = 0;\n      this._lastScroll = 0;\n    };\n  }\n\n  /** Clean up listeners. */\n  public removeListeners(): void {\n    if (this._teardown) {\n      this._teardown();\n    }\n\n    if (this._checkClickTimeout) {\n      clearTimeout(this._checkClickTimeout);\n    }\n  }\n\n  /** @inheritDoc */\n  public handleClick(breadcrumb: Breadcrumb, node: HTMLElement): void {\n    if (ignoreElement(node, this._ignoreSelector) || !isClickBreadcrumb(breadcrumb)) {\n      return;\n    }\n\n    const newClick: Click = {\n      timestamp: timestampToS(breadcrumb.timestamp),\n      clickBreadcrumb: breadcrumb,\n      // Set this to 0 so we know it originates from the click breadcrumb\n      clickCount: 0,\n      node,\n    };\n\n    // If there was a click in the last 1s on the same element, ignore it - only keep a single reference per second\n    if (\n      this._clicks.some(click => click.node === newClick.node && Math.abs(click.timestamp - newClick.timestamp) < 1)\n    ) {\n      return;\n    }\n\n    this._clicks.push(newClick);\n\n    // If this is the first new click, set a timeout to check for multi clicks\n    if (this._clicks.length === 1) {\n      this._scheduleCheckClicks();\n    }\n  }\n\n  /** @inheritDoc */\n  public registerMutation(timestamp = Date.now()): void {\n    this._lastMutation = timestampToS(timestamp);\n  }\n\n  /** @inheritDoc */\n  public registerScroll(timestamp = Date.now()): void {\n    this._lastScroll = timestampToS(timestamp);\n  }\n\n  /** @inheritDoc */\n  public registerClick(element: HTMLElement): void {\n    const node = getClosestInteractive(element);\n    this._handleMultiClick(node as HTMLElement);\n  }\n\n  /** Count multiple clicks on elements. */\n  private _handleMultiClick(node: HTMLElement): void {\n    this._getClicks(node).forEach(click => {\n      click.clickCount++;\n    });\n  }\n\n  /** Get all pending clicks for a given node. */\n  private _getClicks(node: HTMLElement): Click[] {\n    return this._clicks.filter(click => click.node === node);\n  }\n\n  /** Check the clicks that happened. */\n  private _checkClicks(): void {\n    const timedOutClicks: Click[] = [];\n\n    const now = nowInSeconds();\n\n    this._clicks.forEach(click => {\n      if (!click.mutationAfter && this._lastMutation) {\n        click.mutationAfter = click.timestamp <= this._lastMutation ? this._lastMutation - click.timestamp : undefined;\n      }\n      if (!click.scrollAfter && this._lastScroll) {\n        click.scrollAfter = click.timestamp <= this._lastScroll ? this._lastScroll - click.timestamp : undefined;\n      }\n\n      // All of these are in seconds!\n      if (click.timestamp + this._timeout <= now) {\n        timedOutClicks.push(click);\n      }\n    });\n\n    // Remove \"old\" clicks\n    for (const click of timedOutClicks) {\n      const pos = this._clicks.indexOf(click);\n\n      if (pos > -1) {\n        this._generateBreadcrumbs(click);\n        this._clicks.splice(pos, 1);\n      }\n    }\n\n    // Trigger new check, unless no clicks left\n    if (this._clicks.length) {\n      this._scheduleCheckClicks();\n    }\n  }\n\n  /** Generate matching breadcrumb(s) for the click. */\n  private _generateBreadcrumbs(click: Click): void {\n    const replay = this._replay;\n    const hadScroll = click.scrollAfter && click.scrollAfter <= this._scrollTimeout;\n    const hadMutation = click.mutationAfter && click.mutationAfter <= this._threshold;\n\n    const isSlowClick = !hadScroll && !hadMutation;\n    const { clickCount, clickBreadcrumb } = click;\n\n    // Slow click\n    if (isSlowClick) {\n      // If `mutationAfter` is set, it means a mutation happened after the threshold, but before the timeout\n      // If not, it means we just timed out without scroll & mutation\n      const timeAfterClickMs = Math.min(click.mutationAfter || this._timeout, this._timeout) * 1000;\n      const endReason = timeAfterClickMs < this._timeout * 1000 ? 'mutation' : 'timeout';\n\n      const breadcrumb: ReplaySlowClickFrame = {\n        type: 'default',\n        message: clickBreadcrumb.message,\n        timestamp: clickBreadcrumb.timestamp,\n        category: 'ui.slowClickDetected',\n        data: {\n          ...clickBreadcrumb.data,\n          url: WINDOW.location.href,\n          route: replay.getCurrentRoute(),\n          timeAfterClickMs,\n          endReason,\n          // If clickCount === 0, it means multiClick was not correctly captured here\n          // - we still want to send 1 in this case\n          clickCount: clickCount || 1,\n        },\n      };\n\n      this._addBreadcrumbEvent(replay, breadcrumb);\n      return;\n    }\n\n    // Multi click\n    if (clickCount > 1) {\n      const breadcrumb: ReplayMultiClickFrame = {\n        type: 'default',\n        message: clickBreadcrumb.message,\n        timestamp: clickBreadcrumb.timestamp,\n        category: 'ui.multiClick',\n        data: {\n          ...clickBreadcrumb.data,\n          url: WINDOW.location.href,\n          route: replay.getCurrentRoute(),\n          clickCount,\n          metric: true,\n        },\n      };\n\n      this._addBreadcrumbEvent(replay, breadcrumb);\n    }\n  }\n\n  /** Schedule to check current clicks. */\n  private _scheduleCheckClicks(): void {\n    if (this._checkClickTimeout) {\n      clearTimeout(this._checkClickTimeout);\n    }\n\n    this._checkClickTimeout = setTimeout(() => this._checkClicks(), 1000);\n  }\n}\n\nconst SLOW_CLICK_TAGS = ['A', 'BUTTON', 'INPUT'];\n\n/** exported for tests only */\nexport function ignoreElement(node: HTMLElement, ignoreSelector: string): boolean {\n  if (!SLOW_CLICK_TAGS.includes(node.tagName)) {\n    return true;\n  }\n\n  // If <input> tag, we only want to consider input[type='submit'] & input[type='button']\n  if (node.tagName === 'INPUT' && !['submit', 'button'].includes(node.getAttribute('type') || '')) {\n    return true;\n  }\n\n  // If <a> tag, detect special variants that may not lead to an action\n  // If target !== _self, we may open the link somewhere else, which would lead to no action\n  // Also, when downloading a file, we may not leave the page, but still not trigger an action\n  if (\n    node.tagName === 'A' &&\n    (node.hasAttribute('download') || (node.hasAttribute('target') && node.getAttribute('target') !== '_self'))\n  ) {\n    return true;\n  }\n\n  if (ignoreSelector && node.matches(ignoreSelector)) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction isClickBreadcrumb(breadcrumb: Breadcrumb): breadcrumb is ClickBreadcrumb {\n  return !!(breadcrumb.data && typeof breadcrumb.data.nodeId === 'number' && breadcrumb.timestamp);\n}\n\n// This is good enough for us, and is easier to test/mock than `timestampInSeconds`\nfunction nowInSeconds(): number {\n  return Date.now() / 1000;\n}\n\n/** Update the click detector based on a recording event of rrweb. */\nexport function updateClickDetectorForRecordingEvent(clickDetector: ReplayClickDetector, event: RecordingEvent): void {\n  try {\n    // note: We only consider incremental snapshots here\n    // This means that any full snapshot is ignored for mutation detection - the reason is that we simply cannot know if a mutation happened here.\n    // E.g. think that we are buffering, an error happens and we take a full snapshot because we switched to session mode -\n    // in this scenario, we would not know if a dead click happened because of the error, which is a key dead click scenario.\n    // Instead, by ignoring full snapshots, we have the risk that we generate a false positive\n    // (if a mutation _did_ happen but was \"swallowed\" by the full snapshot)\n    // But this should be more unlikely as we'd generally capture the incremental snapshot right away\n\n    if (!isIncrementalEvent(event)) {\n      return;\n    }\n\n    const { source } = event.data;\n    if (IncrementalMutationSources.has(source)) {\n      clickDetector.registerMutation(event.timestamp);\n    }\n\n    if (source === IncrementalSource.Scroll) {\n      clickDetector.registerScroll(event.timestamp);\n    }\n\n    if (isIncrementalMouseInteraction(event)) {\n      const { type, id } = event.data;\n      const node = record.mirror.getNode(id);\n\n      if (node instanceof HTMLElement && type === MouseInteractions.Click) {\n        clickDetector.registerClick(node);\n      }\n    }\n  } catch {\n    // ignore errors here, e.g. if accessing something that does not exist\n  }\n}\n\nfunction isIncrementalEvent(event: RecordingEvent): event is IncrementalRecordingEvent {\n  return event.type === ReplayEventTypeIncrementalSnapshot;\n}\n\nfunction isIncrementalMouseInteraction(\n  event: IncrementalRecordingEvent,\n): event is IncrementalMouseInteractionRecordingEvent {\n  return event.data.source === IncrementalSource.MouseInteraction;\n}\n","import type { ReplayBreadcrumbFrame } from '../types/replayFrame';\n\n/**\n * Create a breadcrumb for a replay.\n */\nexport function createBreadcrumb(\n  breadcrumb: Omit<ReplayBreadcrumbFrame, 'timestamp' | 'type'> & Partial<Pick<ReplayBreadcrumbFrame, 'timestamp'>>,\n): ReplayBreadcrumbFrame {\n  return {\n    timestamp: Date.now() / 1000,\n    type: 'default',\n    ...breadcrumb,\n  };\n}\n","var NodeType;\r\n(function (NodeType) {\r\n    NodeType[NodeType[\"Document\"] = 0] = \"Document\";\r\n    NodeType[NodeType[\"DocumentType\"] = 1] = \"DocumentType\";\r\n    NodeType[NodeType[\"Element\"] = 2] = \"Element\";\r\n    NodeType[NodeType[\"Text\"] = 3] = \"Text\";\r\n    NodeType[NodeType[\"CDATA\"] = 4] = \"CDATA\";\r\n    NodeType[NodeType[\"Comment\"] = 5] = \"Comment\";\r\n})(NodeType || (NodeType = {}));\n\nfunction isElement(n) {\r\n    return n.nodeType === n.ELEMENT_NODE;\r\n}\r\nfunction isShadowRoot(n) {\r\n    const host = n?.host;\r\n    return Boolean(host?.shadowRoot === n);\r\n}\r\nfunction isNativeShadowDom(shadowRoot) {\r\n    return Object.prototype.toString.call(shadowRoot) === '[object ShadowRoot]';\r\n}\r\nfunction fixBrowserCompatibilityIssuesInCSS(cssText) {\r\n    if (cssText.includes(' background-clip: text;') &&\r\n        !cssText.includes(' -webkit-background-clip: text;')) {\r\n        cssText = cssText.replace(/\\sbackground-clip:\\s*text;/g, ' -webkit-background-clip: text; background-clip: text;');\r\n    }\r\n    return cssText;\r\n}\r\nfunction escapeImportStatement(rule) {\r\n    const { cssText } = rule;\r\n    if (cssText.split('\"').length < 3)\r\n        return cssText;\r\n    const statement = ['@import', `url(${JSON.stringify(rule.href)})`];\r\n    if (rule.layerName === '') {\r\n        statement.push(`layer`);\r\n    }\r\n    else if (rule.layerName) {\r\n        statement.push(`layer(${rule.layerName})`);\r\n    }\r\n    if (rule.supportsText) {\r\n        statement.push(`supports(${rule.supportsText})`);\r\n    }\r\n    if (rule.media.length) {\r\n        statement.push(rule.media.mediaText);\r\n    }\r\n    return statement.join(' ') + ';';\r\n}\r\nfunction stringifyStylesheet(s) {\r\n    try {\r\n        const rules = s.rules || s.cssRules;\r\n        return rules\r\n            ? fixBrowserCompatibilityIssuesInCSS(Array.from(rules, stringifyRule).join(''))\r\n            : null;\r\n    }\r\n    catch (error) {\r\n        return null;\r\n    }\r\n}\r\nfunction fixAllCssProperty(rule) {\r\n    let styles = '';\r\n    for (let i = 0; i < rule.style.length; i++) {\r\n        const styleDeclaration = rule.style;\r\n        const attribute = styleDeclaration[i];\r\n        const isImportant = styleDeclaration.getPropertyPriority(attribute);\r\n        styles += `${attribute}:${styleDeclaration.getPropertyValue(attribute)}${isImportant ? ` !important` : ''};`;\r\n    }\r\n    return `${rule.selectorText} { ${styles} }`;\r\n}\r\nfunction stringifyRule(rule) {\r\n    let importStringified;\r\n    if (isCSSImportRule(rule)) {\r\n        try {\r\n            importStringified =\r\n                stringifyStylesheet(rule.styleSheet) ||\r\n                    escapeImportStatement(rule);\r\n        }\r\n        catch (error) {\r\n        }\r\n    }\r\n    else if (isCSSStyleRule(rule)) {\r\n        let cssText = rule.cssText;\r\n        const needsSafariColonFix = rule.selectorText.includes(':');\r\n        const needsAllFix = typeof rule.style['all'] === 'string' && rule.style['all'];\r\n        if (needsAllFix) {\r\n            cssText = fixAllCssProperty(rule);\r\n        }\r\n        if (needsSafariColonFix) {\r\n            cssText = fixSafariColons(cssText);\r\n        }\r\n        if (needsSafariColonFix || needsAllFix) {\r\n            return cssText;\r\n        }\r\n    }\r\n    return importStringified || rule.cssText;\r\n}\r\nfunction fixSafariColons(cssStringified) {\r\n    const regex = /(\\[(?:[\\w-]+)[^\\\\])(:(?:[\\w-]+)\\])/gm;\r\n    return cssStringified.replace(regex, '$1\\\\$2');\r\n}\r\nfunction isCSSImportRule(rule) {\r\n    return 'styleSheet' in rule;\r\n}\r\nfunction isCSSStyleRule(rule) {\r\n    return 'selectorText' in rule;\r\n}\r\nclass Mirror {\r\n    constructor() {\r\n        this.idNodeMap = new Map();\r\n        this.nodeMetaMap = new WeakMap();\r\n    }\r\n    getId(n) {\r\n        if (!n)\r\n            return -1;\r\n        const id = this.getMeta(n)?.id;\r\n        return id ?? -1;\r\n    }\r\n    getNode(id) {\r\n        return this.idNodeMap.get(id) || null;\r\n    }\r\n    getIds() {\r\n        return Array.from(this.idNodeMap.keys());\r\n    }\r\n    getMeta(n) {\r\n        return this.nodeMetaMap.get(n) || null;\r\n    }\r\n    removeNodeFromMap(n) {\r\n        const id = this.getId(n);\r\n        this.idNodeMap.delete(id);\r\n        if (n.childNodes) {\r\n            n.childNodes.forEach((childNode) => this.removeNodeFromMap(childNode));\r\n        }\r\n    }\r\n    has(id) {\r\n        return this.idNodeMap.has(id);\r\n    }\r\n    hasNode(node) {\r\n        return this.nodeMetaMap.has(node);\r\n    }\r\n    add(n, meta) {\r\n        const id = meta.id;\r\n        this.idNodeMap.set(id, n);\r\n        this.nodeMetaMap.set(n, meta);\r\n    }\r\n    replace(id, n) {\r\n        const oldNode = this.getNode(id);\r\n        if (oldNode) {\r\n            const meta = this.nodeMetaMap.get(oldNode);\r\n            if (meta)\r\n                this.nodeMetaMap.set(n, meta);\r\n        }\r\n        this.idNodeMap.set(id, n);\r\n    }\r\n    reset() {\r\n        this.idNodeMap = new Map();\r\n        this.nodeMetaMap = new WeakMap();\r\n    }\r\n}\r\nfunction createMirror() {\r\n    return new Mirror();\r\n}\r\nfunction shouldMaskInput({ maskInputOptions, tagName, type, }) {\r\n    if (tagName === 'OPTION') {\r\n        tagName = 'SELECT';\r\n    }\r\n    return Boolean(maskInputOptions[tagName.toLowerCase()] ||\r\n        (type && maskInputOptions[type]) ||\r\n        type === 'password' ||\r\n        (tagName === 'INPUT' && !type && maskInputOptions['text']));\r\n}\r\nfunction maskInputValue({ isMasked, element, value, maskInputFn, }) {\r\n    let text = value || '';\r\n    if (!isMasked) {\r\n        return text;\r\n    }\r\n    if (maskInputFn) {\r\n        text = maskInputFn(text, element);\r\n    }\r\n    return '*'.repeat(text.length);\r\n}\r\nfunction toLowerCase(str) {\r\n    return str.toLowerCase();\r\n}\r\nfunction toUpperCase(str) {\r\n    return str.toUpperCase();\r\n}\r\nconst ORIGINAL_ATTRIBUTE_NAME = '__rrweb_original__';\r\nfunction is2DCanvasBlank(canvas) {\r\n    const ctx = canvas.getContext('2d');\r\n    if (!ctx)\r\n        return true;\r\n    const chunkSize = 50;\r\n    for (let x = 0; x < canvas.width; x += chunkSize) {\r\n        for (let y = 0; y < canvas.height; y += chunkSize) {\r\n            const getImageData = ctx.getImageData;\r\n            const originalGetImageData = ORIGINAL_ATTRIBUTE_NAME in getImageData\r\n                ? getImageData[ORIGINAL_ATTRIBUTE_NAME]\r\n                : getImageData;\r\n            const pixelBuffer = new Uint32Array(originalGetImageData.call(ctx, x, y, Math.min(chunkSize, canvas.width - x), Math.min(chunkSize, canvas.height - y)).data.buffer);\r\n            if (pixelBuffer.some((pixel) => pixel !== 0))\r\n                return false;\r\n        }\r\n    }\r\n    return true;\r\n}\r\nfunction isNodeMetaEqual(a, b) {\r\n    if (!a || !b || a.type !== b.type)\r\n        return false;\r\n    if (a.type === NodeType.Document)\r\n        return a.compatMode === b.compatMode;\r\n    else if (a.type === NodeType.DocumentType)\r\n        return (a.name === b.name &&\r\n            a.publicId === b.publicId &&\r\n            a.systemId === b.systemId);\r\n    else if (a.type === NodeType.Comment ||\r\n        a.type === NodeType.Text ||\r\n        a.type === NodeType.CDATA)\r\n        return a.textContent === b.textContent;\r\n    else if (a.type === NodeType.Element)\r\n        return (a.tagName === b.tagName &&\r\n            JSON.stringify(a.attributes) ===\r\n                JSON.stringify(b.attributes) &&\r\n            a.isSVG === b.isSVG &&\r\n            a.needBlock === b.needBlock);\r\n    return false;\r\n}\r\nfunction getInputType(element) {\r\n    const type = element.type;\r\n    return element.hasAttribute('data-rr-is-password')\r\n        ? 'password'\r\n        : type\r\n            ?\r\n                toLowerCase(type)\r\n            : null;\r\n}\r\nfunction getInputValue(el, tagName, type) {\r\n    if (tagName === 'INPUT' && (type === 'radio' || type === 'checkbox')) {\r\n        return el.getAttribute('value') || '';\r\n    }\r\n    return el.value;\r\n}\r\nfunction extractFileExtension(path, baseURL) {\r\n    let url;\r\n    try {\r\n        url = new URL(path, baseURL ?? window.location.href);\r\n    }\r\n    catch (err) {\r\n        return null;\r\n    }\r\n    const regex = /\\.([0-9a-z]+)(?:$)/i;\r\n    const match = url.pathname.match(regex);\r\n    return match?.[1] ?? null;\r\n}\r\nconst cachedImplementations = {};\r\nfunction getImplementation(name) {\r\n    const cached = cachedImplementations[name];\r\n    if (cached) {\r\n        return cached;\r\n    }\r\n    const document = window.document;\r\n    let impl = window[name];\r\n    if (document && typeof document.createElement === 'function') {\r\n        try {\r\n            const sandbox = document.createElement('iframe');\r\n            sandbox.hidden = true;\r\n            document.head.appendChild(sandbox);\r\n            const contentWindow = sandbox.contentWindow;\r\n            if (contentWindow && contentWindow[name]) {\r\n                impl =\r\n                    contentWindow[name];\r\n            }\r\n            document.head.removeChild(sandbox);\r\n        }\r\n        catch (e) {\r\n        }\r\n    }\r\n    return (cachedImplementations[name] = impl.bind(window));\r\n}\r\nfunction onRequestAnimationFrame(...rest) {\r\n    return getImplementation('requestAnimationFrame')(...rest);\r\n}\r\nfunction setTimeout(...rest) {\r\n    return getImplementation('setTimeout')(...rest);\r\n}\r\nfunction clearTimeout(...rest) {\r\n    return getImplementation('clearTimeout')(...rest);\r\n}\r\nfunction getIframeContentDocument(iframe) {\r\n    try {\r\n        return iframe.contentDocument;\r\n    }\r\n    catch (e) {\r\n    }\r\n}\n\nlet _id = 1;\r\nconst tagNameRegex = new RegExp('[^a-z0-9-_:]');\r\nconst IGNORED_NODE = -2;\r\nfunction genId() {\r\n    return _id++;\r\n}\r\nfunction getValidTagName(element) {\r\n    if (element instanceof HTMLFormElement) {\r\n        return 'form';\r\n    }\r\n    const processedTagName = toLowerCase(element.tagName);\r\n    if (tagNameRegex.test(processedTagName)) {\r\n        return 'div';\r\n    }\r\n    return processedTagName;\r\n}\r\nfunction extractOrigin(url) {\r\n    let origin = '';\r\n    if (url.indexOf('//') > -1) {\r\n        origin = url.split('/').slice(0, 3).join('/');\r\n    }\r\n    else {\r\n        origin = url.split('/')[0];\r\n    }\r\n    origin = origin.split('?')[0];\r\n    return origin;\r\n}\r\nlet canvasService;\r\nlet canvasCtx;\r\nconst URL_IN_CSS_REF = /url\\((?:(')([^']*)'|(\")(.*?)\"|([^)]*))\\)/gm;\r\nconst URL_PROTOCOL_MATCH = /^(?:[a-z+]+:)?\\/\\//i;\r\nconst URL_WWW_MATCH = /^www\\..*/i;\r\nconst DATA_URI = /^(data:)([^,]*),(.*)/i;\r\nfunction absoluteToStylesheet(cssText, href) {\r\n    return (cssText || '').replace(URL_IN_CSS_REF, (origin, quote1, path1, quote2, path2, path3) => {\r\n        const filePath = path1 || path2 || path3;\r\n        const maybeQuote = quote1 || quote2 || '';\r\n        if (!filePath) {\r\n            return origin;\r\n        }\r\n        if (URL_PROTOCOL_MATCH.test(filePath) || URL_WWW_MATCH.test(filePath)) {\r\n            return `url(${maybeQuote}${filePath}${maybeQuote})`;\r\n        }\r\n        if (DATA_URI.test(filePath)) {\r\n            return `url(${maybeQuote}${filePath}${maybeQuote})`;\r\n        }\r\n        if (filePath[0] === '/') {\r\n            return `url(${maybeQuote}${extractOrigin(href) + filePath}${maybeQuote})`;\r\n        }\r\n        const stack = href.split('/');\r\n        const parts = filePath.split('/');\r\n        stack.pop();\r\n        for (const part of parts) {\r\n            if (part === '.') {\r\n                continue;\r\n            }\r\n            else if (part === '..') {\r\n                stack.pop();\r\n            }\r\n            else {\r\n                stack.push(part);\r\n            }\r\n        }\r\n        return `url(${maybeQuote}${stack.join('/')}${maybeQuote})`;\r\n    });\r\n}\r\nconst SRCSET_NOT_SPACES = /^[^ \\t\\n\\r\\u000c]+/;\r\nconst SRCSET_COMMAS_OR_SPACES = /^[, \\t\\n\\r\\u000c]+/;\r\nfunction getAbsoluteSrcsetString(doc, attributeValue) {\r\n    if (attributeValue.trim() === '') {\r\n        return attributeValue;\r\n    }\r\n    let pos = 0;\r\n    function collectCharacters(regEx) {\r\n        let chars;\r\n        const match = regEx.exec(attributeValue.substring(pos));\r\n        if (match) {\r\n            chars = match[0];\r\n            pos += chars.length;\r\n            return chars;\r\n        }\r\n        return '';\r\n    }\r\n    const output = [];\r\n    while (true) {\r\n        collectCharacters(SRCSET_COMMAS_OR_SPACES);\r\n        if (pos >= attributeValue.length) {\r\n            break;\r\n        }\r\n        let url = collectCharacters(SRCSET_NOT_SPACES);\r\n        if (url.slice(-1) === ',') {\r\n            url = absoluteToDoc(doc, url.substring(0, url.length - 1));\r\n            output.push(url);\r\n        }\r\n        else {\r\n            let descriptorsStr = '';\r\n            url = absoluteToDoc(doc, url);\r\n            let inParens = false;\r\n            while (true) {\r\n                const c = attributeValue.charAt(pos);\r\n                if (c === '') {\r\n                    output.push((url + descriptorsStr).trim());\r\n                    break;\r\n                }\r\n                else if (!inParens) {\r\n                    if (c === ',') {\r\n                        pos += 1;\r\n                        output.push((url + descriptorsStr).trim());\r\n                        break;\r\n                    }\r\n                    else if (c === '(') {\r\n                        inParens = true;\r\n                    }\r\n                }\r\n                else {\r\n                    if (c === ')') {\r\n                        inParens = false;\r\n                    }\r\n                }\r\n                descriptorsStr += c;\r\n                pos += 1;\r\n            }\r\n        }\r\n    }\r\n    return output.join(', ');\r\n}\r\nconst cachedDocument = new WeakMap();\r\nfunction absoluteToDoc(doc, attributeValue) {\r\n    if (!attributeValue || attributeValue.trim() === '') {\r\n        return attributeValue;\r\n    }\r\n    return getHref(doc, attributeValue);\r\n}\r\nfunction isSVGElement(el) {\r\n    return Boolean(el.tagName === 'svg' || el.ownerSVGElement);\r\n}\r\nfunction getHref(doc, customHref) {\r\n    let a = cachedDocument.get(doc);\r\n    if (!a) {\r\n        a = doc.createElement('a');\r\n        cachedDocument.set(doc, a);\r\n    }\r\n    if (!customHref) {\r\n        customHref = '';\r\n    }\r\n    else if (customHref.startsWith('blob:') || customHref.startsWith('data:')) {\r\n        return customHref;\r\n    }\r\n    a.setAttribute('href', customHref);\r\n    return a.href;\r\n}\r\nfunction transformAttribute(doc, tagName, name, value, element, maskAttributeFn) {\r\n    if (!value) {\r\n        return value;\r\n    }\r\n    if (name === 'src' ||\r\n        (name === 'href' && !(tagName === 'use' && value[0] === '#'))) {\r\n        return absoluteToDoc(doc, value);\r\n    }\r\n    else if (name === 'xlink:href' && value[0] !== '#') {\r\n        return absoluteToDoc(doc, value);\r\n    }\r\n    else if (name === 'background' &&\r\n        (tagName === 'table' || tagName === 'td' || tagName === 'th')) {\r\n        return absoluteToDoc(doc, value);\r\n    }\r\n    else if (name === 'srcset') {\r\n        return getAbsoluteSrcsetString(doc, value);\r\n    }\r\n    else if (name === 'style') {\r\n        return absoluteToStylesheet(value, getHref(doc));\r\n    }\r\n    else if (tagName === 'object' && name === 'data') {\r\n        return absoluteToDoc(doc, value);\r\n    }\r\n    if (typeof maskAttributeFn === 'function') {\r\n        return maskAttributeFn(name, value, element);\r\n    }\r\n    return value;\r\n}\r\nfunction ignoreAttribute(tagName, name, _value) {\r\n    return (tagName === 'video' || tagName === 'audio') && name === 'autoplay';\r\n}\r\nfunction _isBlockedElement(element, blockClass, blockSelector, unblockSelector) {\r\n    try {\r\n        if (unblockSelector && element.matches(unblockSelector)) {\r\n            return false;\r\n        }\r\n        if (typeof blockClass === 'string') {\r\n            if (element.classList.contains(blockClass)) {\r\n                return true;\r\n            }\r\n        }\r\n        else {\r\n            for (let eIndex = element.classList.length; eIndex--;) {\r\n                const className = element.classList[eIndex];\r\n                if (blockClass.test(className)) {\r\n                    return true;\r\n                }\r\n            }\r\n        }\r\n        if (blockSelector) {\r\n            return element.matches(blockSelector);\r\n        }\r\n    }\r\n    catch (e) {\r\n    }\r\n    return false;\r\n}\r\nfunction elementClassMatchesRegex(el, regex) {\r\n    for (let eIndex = el.classList.length; eIndex--;) {\r\n        const className = el.classList[eIndex];\r\n        if (regex.test(className)) {\r\n            return true;\r\n        }\r\n    }\r\n    return false;\r\n}\r\nfunction classMatchesRegex(node, regex, checkAncestors) {\r\n    if (!node)\r\n        return false;\r\n    if (checkAncestors) {\r\n        return (distanceToMatch(node, (node) => elementClassMatchesRegex(node, regex)) >= 0);\r\n    }\r\n    else if (node.nodeType === node.ELEMENT_NODE) {\r\n        return elementClassMatchesRegex(node, regex);\r\n    }\r\n    return false;\r\n}\r\nfunction distanceToMatch(node, matchPredicate, limit = Infinity, distance = 0) {\r\n    if (!node)\r\n        return -1;\r\n    if (node.nodeType !== node.ELEMENT_NODE)\r\n        return -1;\r\n    if (distance > limit)\r\n        return -1;\r\n    if (matchPredicate(node))\r\n        return distance;\r\n    return distanceToMatch(node.parentNode, matchPredicate, limit, distance + 1);\r\n}\r\nfunction createMatchPredicate(className, selector) {\r\n    return (node) => {\r\n        const el = node;\r\n        if (el === null)\r\n            return false;\r\n        try {\r\n            if (className) {\r\n                if (typeof className === 'string') {\r\n                    if (el.matches(`.${className}`))\r\n                        return true;\r\n                }\r\n                else if (elementClassMatchesRegex(el, className)) {\r\n                    return true;\r\n                }\r\n            }\r\n            if (selector && el.matches(selector))\r\n                return true;\r\n            return false;\r\n        }\r\n        catch {\r\n            return false;\r\n        }\r\n    };\r\n}\r\nfunction needMaskingText(node, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, maskAllText) {\r\n    try {\r\n        const el = node.nodeType === node.ELEMENT_NODE\r\n            ? node\r\n            : node.parentElement;\r\n        if (el === null)\r\n            return false;\r\n        if (el.tagName === 'INPUT') {\r\n            const autocomplete = el.getAttribute('autocomplete');\r\n            const disallowedAutocompleteValues = [\r\n                'current-password',\r\n                'new-password',\r\n                'cc-number',\r\n                'cc-exp',\r\n                'cc-exp-month',\r\n                'cc-exp-year',\r\n                'cc-csc',\r\n            ];\r\n            if (disallowedAutocompleteValues.includes(autocomplete)) {\r\n                return true;\r\n            }\r\n        }\r\n        let maskDistance = -1;\r\n        let unmaskDistance = -1;\r\n        if (maskAllText) {\r\n            unmaskDistance = distanceToMatch(el, createMatchPredicate(unmaskTextClass, unmaskTextSelector));\r\n            if (unmaskDistance < 0) {\r\n                return true;\r\n            }\r\n            maskDistance = distanceToMatch(el, createMatchPredicate(maskTextClass, maskTextSelector), unmaskDistance >= 0 ? unmaskDistance : Infinity);\r\n        }\r\n        else {\r\n            maskDistance = distanceToMatch(el, createMatchPredicate(maskTextClass, maskTextSelector));\r\n            if (maskDistance < 0) {\r\n                return false;\r\n            }\r\n            unmaskDistance = distanceToMatch(el, createMatchPredicate(unmaskTextClass, unmaskTextSelector), maskDistance >= 0 ? maskDistance : Infinity);\r\n        }\r\n        return maskDistance >= 0\r\n            ? unmaskDistance >= 0\r\n                ? maskDistance <= unmaskDistance\r\n                : true\r\n            : unmaskDistance >= 0\r\n                ? false\r\n                : !!maskAllText;\r\n    }\r\n    catch (e) {\r\n    }\r\n    return !!maskAllText;\r\n}\r\nfunction onceIframeLoaded(iframeEl, listener, iframeLoadTimeout) {\r\n    const win = iframeEl.contentWindow;\r\n    if (!win) {\r\n        return;\r\n    }\r\n    let fired = false;\r\n    let readyState;\r\n    try {\r\n        readyState = win.document.readyState;\r\n    }\r\n    catch (error) {\r\n        return;\r\n    }\r\n    if (readyState !== 'complete') {\r\n        const timer = setTimeout(() => {\r\n            if (!fired) {\r\n                listener();\r\n                fired = true;\r\n            }\r\n        }, iframeLoadTimeout);\r\n        iframeEl.addEventListener('load', () => {\r\n            clearTimeout(timer);\r\n            fired = true;\r\n            listener();\r\n        });\r\n        return;\r\n    }\r\n    const blankUrl = 'about:blank';\r\n    if (win.location.href !== blankUrl ||\r\n        iframeEl.src === blankUrl ||\r\n        iframeEl.src === '') {\r\n        setTimeout(listener, 0);\r\n        return iframeEl.addEventListener('load', listener);\r\n    }\r\n    iframeEl.addEventListener('load', listener);\r\n}\r\nfunction onceStylesheetLoaded(link, listener, styleSheetLoadTimeout) {\r\n    let fired = false;\r\n    let styleSheetLoaded;\r\n    try {\r\n        styleSheetLoaded = link.sheet;\r\n    }\r\n    catch (error) {\r\n        return;\r\n    }\r\n    if (styleSheetLoaded)\r\n        return;\r\n    const timer = setTimeout(() => {\r\n        if (!fired) {\r\n            listener();\r\n            fired = true;\r\n        }\r\n    }, styleSheetLoadTimeout);\r\n    link.addEventListener('load', () => {\r\n        clearTimeout(timer);\r\n        fired = true;\r\n        listener();\r\n    });\r\n}\r\nfunction serializeNode(n, options) {\r\n    const { doc, mirror, blockClass, blockSelector, unblockSelector, maskAllText, maskAttributeFn, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, inlineStylesheet, maskInputOptions = {}, maskTextFn, maskInputFn, dataURLOptions = {}, inlineImages, recordCanvas, keepIframeSrcFn, newlyAddedElement = false, } = options;\r\n    const rootId = getRootId(doc, mirror);\r\n    switch (n.nodeType) {\r\n        case n.DOCUMENT_NODE:\r\n            if (n.compatMode !== 'CSS1Compat') {\r\n                return {\r\n                    type: NodeType.Document,\r\n                    childNodes: [],\r\n                    compatMode: n.compatMode,\r\n                };\r\n            }\r\n            else {\r\n                return {\r\n                    type: NodeType.Document,\r\n                    childNodes: [],\r\n                };\r\n            }\r\n        case n.DOCUMENT_TYPE_NODE:\r\n            return {\r\n                type: NodeType.DocumentType,\r\n                name: n.name,\r\n                publicId: n.publicId,\r\n                systemId: n.systemId,\r\n                rootId,\r\n            };\r\n        case n.ELEMENT_NODE:\r\n            return serializeElementNode(n, {\r\n                doc,\r\n                blockClass,\r\n                blockSelector,\r\n                unblockSelector,\r\n                inlineStylesheet,\r\n                maskAttributeFn,\r\n                maskInputOptions,\r\n                maskInputFn,\r\n                dataURLOptions,\r\n                inlineImages,\r\n                recordCanvas,\r\n                keepIframeSrcFn,\r\n                newlyAddedElement,\r\n                rootId,\r\n                maskAllText,\r\n                maskTextClass,\r\n                unmaskTextClass,\r\n                maskTextSelector,\r\n                unmaskTextSelector,\r\n            });\r\n        case n.TEXT_NODE:\r\n            return serializeTextNode(n, {\r\n                doc,\r\n                maskAllText,\r\n                maskTextClass,\r\n                unmaskTextClass,\r\n                maskTextSelector,\r\n                unmaskTextSelector,\r\n                maskTextFn,\r\n                maskInputOptions,\r\n                maskInputFn,\r\n                rootId,\r\n            });\r\n        case n.CDATA_SECTION_NODE:\r\n            return {\r\n                type: NodeType.CDATA,\r\n                textContent: '',\r\n                rootId,\r\n            };\r\n        case n.COMMENT_NODE:\r\n            return {\r\n                type: NodeType.Comment,\r\n                textContent: n.textContent || '',\r\n                rootId,\r\n            };\r\n        default:\r\n            return false;\r\n    }\r\n}\r\nfunction getRootId(doc, mirror) {\r\n    if (!mirror.hasNode(doc))\r\n        return undefined;\r\n    const docId = mirror.getId(doc);\r\n    return docId === 1 ? undefined : docId;\r\n}\r\nfunction serializeTextNode(n, options) {\r\n    const { maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, maskTextFn, maskInputOptions, maskInputFn, rootId, } = options;\r\n    const parentTagName = n.parentNode && n.parentNode.tagName;\r\n    let textContent = n.textContent;\r\n    const isStyle = parentTagName === 'STYLE' ? true : undefined;\r\n    const isScript = parentTagName === 'SCRIPT' ? true : undefined;\r\n    const isTextarea = parentTagName === 'TEXTAREA' ? true : undefined;\r\n    if (isStyle && textContent) {\r\n        try {\r\n            if (n.nextSibling || n.previousSibling) {\r\n            }\r\n            else if (n.parentNode.sheet?.cssRules) {\r\n                textContent = stringifyStylesheet(n.parentNode.sheet);\r\n            }\r\n        }\r\n        catch (err) {\r\n            console.warn(`Cannot get CSS styles from text's parentNode. Error: ${err}`, n);\r\n        }\r\n        textContent = absoluteToStylesheet(textContent, getHref(options.doc));\r\n    }\r\n    if (isScript) {\r\n        textContent = 'SCRIPT_PLACEHOLDER';\r\n    }\r\n    const forceMask = needMaskingText(n, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, maskAllText);\r\n    if (!isStyle && !isScript && !isTextarea && textContent && forceMask) {\r\n        textContent = maskTextFn\r\n            ? maskTextFn(textContent, n.parentElement)\r\n            : textContent.replace(/[\\S]/g, '*');\r\n    }\r\n    if (isTextarea && textContent && (maskInputOptions.textarea || forceMask)) {\r\n        textContent = maskInputFn\r\n            ? maskInputFn(textContent, n.parentNode)\r\n            : textContent.replace(/[\\S]/g, '*');\r\n    }\r\n    if (parentTagName === 'OPTION' && textContent) {\r\n        const isInputMasked = shouldMaskInput({\r\n            type: null,\r\n            tagName: parentTagName,\r\n            maskInputOptions,\r\n        });\r\n        textContent = maskInputValue({\r\n            isMasked: needMaskingText(n, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, isInputMasked),\r\n            element: n,\r\n            value: textContent,\r\n            maskInputFn,\r\n        });\r\n    }\r\n    return {\r\n        type: NodeType.Text,\r\n        textContent: textContent || '',\r\n        isStyle,\r\n        rootId,\r\n    };\r\n}\r\nfunction serializeElementNode(n, options) {\r\n    const { doc, blockClass, blockSelector, unblockSelector, inlineStylesheet, maskInputOptions = {}, maskAttributeFn, maskInputFn, dataURLOptions = {}, inlineImages, recordCanvas, keepIframeSrcFn, newlyAddedElement = false, rootId, maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, } = options;\r\n    const needBlock = _isBlockedElement(n, blockClass, blockSelector, unblockSelector);\r\n    const tagName = getValidTagName(n);\r\n    let attributes = {};\r\n    const len = n.attributes.length;\r\n    for (let i = 0; i < len; i++) {\r\n        const attr = n.attributes[i];\r\n        if (attr.name && !ignoreAttribute(tagName, attr.name, attr.value)) {\r\n            attributes[attr.name] = transformAttribute(doc, tagName, toLowerCase(attr.name), attr.value, n, maskAttributeFn);\r\n        }\r\n    }\r\n    if (tagName === 'link' && inlineStylesheet) {\r\n        const stylesheet = Array.from(doc.styleSheets).find((s) => {\r\n            return s.href === n.href;\r\n        });\r\n        let cssText = null;\r\n        if (stylesheet) {\r\n            cssText = stringifyStylesheet(stylesheet);\r\n        }\r\n        if (cssText) {\r\n            attributes.rel = null;\r\n            attributes.href = null;\r\n            attributes.crossorigin = null;\r\n            attributes._cssText = absoluteToStylesheet(cssText, stylesheet.href);\r\n        }\r\n    }\r\n    if (tagName === 'style' &&\r\n        n.sheet &&\r\n        !(n.innerText || n.textContent || '').trim().length) {\r\n        const cssText = stringifyStylesheet(n.sheet);\r\n        if (cssText) {\r\n            attributes._cssText = absoluteToStylesheet(cssText, getHref(doc));\r\n        }\r\n    }\r\n    if (tagName === 'input' ||\r\n        tagName === 'textarea' ||\r\n        tagName === 'select' ||\r\n        tagName === 'option') {\r\n        const el = n;\r\n        const type = getInputType(el);\r\n        const value = getInputValue(el, toUpperCase(tagName), type);\r\n        const checked = el.checked;\r\n        if (type !== 'submit' && type !== 'button' && value) {\r\n            const forceMask = needMaskingText(el, maskTextClass, maskTextSelector, unmaskTextClass, unmaskTextSelector, shouldMaskInput({\r\n                type,\r\n                tagName: toUpperCase(tagName),\r\n                maskInputOptions,\r\n            }));\r\n            attributes.value = maskInputValue({\r\n                isMasked: forceMask,\r\n                element: el,\r\n                value,\r\n                maskInputFn,\r\n            });\r\n        }\r\n        if (checked) {\r\n            attributes.checked = checked;\r\n        }\r\n    }\r\n    if (tagName === 'option') {\r\n        if (n.selected && !maskInputOptions['select']) {\r\n            attributes.selected = true;\r\n        }\r\n        else {\r\n            delete attributes.selected;\r\n        }\r\n    }\r\n    if (tagName === 'canvas' && recordCanvas) {\r\n        if (n.__context === '2d') {\r\n            if (!is2DCanvasBlank(n)) {\r\n                attributes.rr_dataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n            }\r\n        }\r\n        else if (!('__context' in n)) {\r\n            const canvasDataURL = n.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n            const blankCanvas = doc.createElement('canvas');\r\n            blankCanvas.width = n.width;\r\n            blankCanvas.height = n.height;\r\n            const blankCanvasDataURL = blankCanvas.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n            if (canvasDataURL !== blankCanvasDataURL) {\r\n                attributes.rr_dataURL = canvasDataURL;\r\n            }\r\n        }\r\n    }\r\n    if (tagName === 'img' && inlineImages) {\r\n        if (!canvasService) {\r\n            canvasService = doc.createElement('canvas');\r\n            canvasCtx = canvasService.getContext('2d');\r\n        }\r\n        const image = n;\r\n        const imageSrc = image.currentSrc || image.getAttribute('src') || '<unknown-src>';\r\n        const priorCrossOrigin = image.crossOrigin;\r\n        const recordInlineImage = () => {\r\n            image.removeEventListener('load', recordInlineImage);\r\n            try {\r\n                canvasService.width = image.naturalWidth;\r\n                canvasService.height = image.naturalHeight;\r\n                canvasCtx.drawImage(image, 0, 0);\r\n                attributes.rr_dataURL = canvasService.toDataURL(dataURLOptions.type, dataURLOptions.quality);\r\n            }\r\n            catch (err) {\r\n                if (image.crossOrigin !== 'anonymous') {\r\n                    image.crossOrigin = 'anonymous';\r\n                    if (image.complete && image.naturalWidth !== 0)\r\n                        recordInlineImage();\r\n                    else\r\n                        image.addEventListener('load', recordInlineImage);\r\n                    return;\r\n                }\r\n                else {\r\n                    console.warn(`Cannot inline img src=${imageSrc}! Error: ${err}`);\r\n                }\r\n            }\r\n            if (image.crossOrigin === 'anonymous') {\r\n                priorCrossOrigin\r\n                    ? (attributes.crossOrigin = priorCrossOrigin)\r\n                    : image.removeAttribute('crossorigin');\r\n            }\r\n        };\r\n        if (image.complete && image.naturalWidth !== 0)\r\n            recordInlineImage();\r\n        else\r\n            image.addEventListener('load', recordInlineImage);\r\n    }\r\n    if (tagName === 'audio' || tagName === 'video') {\r\n        attributes.rr_mediaState = n.paused\r\n            ? 'paused'\r\n            : 'played';\r\n        attributes.rr_mediaCurrentTime = n.currentTime;\r\n    }\r\n    if (!newlyAddedElement) {\r\n        if (n.scrollLeft) {\r\n            attributes.rr_scrollLeft = n.scrollLeft;\r\n        }\r\n        if (n.scrollTop) {\r\n            attributes.rr_scrollTop = n.scrollTop;\r\n        }\r\n    }\r\n    if (needBlock) {\r\n        const { width, height } = n.getBoundingClientRect();\r\n        attributes = {\r\n            class: attributes.class,\r\n            rr_width: `${width}px`,\r\n            rr_height: `${height}px`,\r\n        };\r\n    }\r\n    if (tagName === 'iframe' && !keepIframeSrcFn(attributes.src)) {\r\n        if (!needBlock && !getIframeContentDocument(n)) {\r\n            attributes.rr_src = attributes.src;\r\n        }\r\n        delete attributes.src;\r\n    }\r\n    let isCustomElement;\r\n    try {\r\n        if (customElements.get(tagName))\r\n            isCustomElement = true;\r\n    }\r\n    catch (e) {\r\n    }\r\n    return {\r\n        type: NodeType.Element,\r\n        tagName,\r\n        attributes,\r\n        childNodes: [],\r\n        isSVG: isSVGElement(n) || undefined,\r\n        needBlock,\r\n        rootId,\r\n        isCustom: isCustomElement,\r\n    };\r\n}\r\nfunction lowerIfExists(maybeAttr) {\r\n    if (maybeAttr === undefined || maybeAttr === null) {\r\n        return '';\r\n    }\r\n    else {\r\n        return maybeAttr.toLowerCase();\r\n    }\r\n}\r\nfunction slimDOMExcluded(sn, slimDOMOptions) {\r\n    if (slimDOMOptions.comment && sn.type === NodeType.Comment) {\r\n        return true;\r\n    }\r\n    else if (sn.type === NodeType.Element) {\r\n        if (slimDOMOptions.script &&\r\n            (sn.tagName === 'script' ||\r\n                (sn.tagName === 'link' &&\r\n                    (sn.attributes.rel === 'preload' ||\r\n                        sn.attributes.rel === 'modulepreload')) ||\r\n                (sn.tagName === 'link' &&\r\n                    sn.attributes.rel === 'prefetch' &&\r\n                    typeof sn.attributes.href === 'string' &&\r\n                    extractFileExtension(sn.attributes.href) === 'js'))) {\r\n            return true;\r\n        }\r\n        else if (slimDOMOptions.headFavicon &&\r\n            ((sn.tagName === 'link' && sn.attributes.rel === 'shortcut icon') ||\r\n                (sn.tagName === 'meta' &&\r\n                    (lowerIfExists(sn.attributes.name).match(/^msapplication-tile(image|color)$/) ||\r\n                        lowerIfExists(sn.attributes.name) === 'application-name' ||\r\n                        lowerIfExists(sn.attributes.rel) === 'icon' ||\r\n                        lowerIfExists(sn.attributes.rel) === 'apple-touch-icon' ||\r\n                        lowerIfExists(sn.attributes.rel) === 'shortcut icon')))) {\r\n            return true;\r\n        }\r\n        else if (sn.tagName === 'meta') {\r\n            if (slimDOMOptions.headMetaDescKeywords &&\r\n                lowerIfExists(sn.attributes.name).match(/^description|keywords$/)) {\r\n                return true;\r\n            }\r\n            else if (slimDOMOptions.headMetaSocial &&\r\n                (lowerIfExists(sn.attributes.property).match(/^(og|twitter|fb):/) ||\r\n                    lowerIfExists(sn.attributes.name).match(/^(og|twitter):/) ||\r\n                    lowerIfExists(sn.attributes.name) === 'pinterest')) {\r\n                return true;\r\n            }\r\n            else if (slimDOMOptions.headMetaRobots &&\r\n                (lowerIfExists(sn.attributes.name) === 'robots' ||\r\n                    lowerIfExists(sn.attributes.name) === 'googlebot' ||\r\n                    lowerIfExists(sn.attributes.name) === 'bingbot')) {\r\n                return true;\r\n            }\r\n            else if (slimDOMOptions.headMetaHttpEquiv &&\r\n                sn.attributes['http-equiv'] !== undefined) {\r\n                return true;\r\n            }\r\n            else if (slimDOMOptions.headMetaAuthorship &&\r\n                (lowerIfExists(sn.attributes.name) === 'author' ||\r\n                    lowerIfExists(sn.attributes.name) === 'generator' ||\r\n                    lowerIfExists(sn.attributes.name) === 'framework' ||\r\n                    lowerIfExists(sn.attributes.name) === 'publisher' ||\r\n                    lowerIfExists(sn.attributes.name) === 'progid' ||\r\n                    lowerIfExists(sn.attributes.property).match(/^article:/) ||\r\n                    lowerIfExists(sn.attributes.property).match(/^product:/))) {\r\n                return true;\r\n            }\r\n            else if (slimDOMOptions.headMetaVerification &&\r\n                (lowerIfExists(sn.attributes.name) === 'google-site-verification' ||\r\n                    lowerIfExists(sn.attributes.name) === 'yandex-verification' ||\r\n                    lowerIfExists(sn.attributes.name) === 'csrf-token' ||\r\n                    lowerIfExists(sn.attributes.name) === 'p:domain_verify' ||\r\n                    lowerIfExists(sn.attributes.name) === 'verify-v1' ||\r\n                    lowerIfExists(sn.attributes.name) === 'verification' ||\r\n                    lowerIfExists(sn.attributes.name) === 'shopify-checkout-api-token')) {\r\n                return true;\r\n            }\r\n        }\r\n    }\r\n    return false;\r\n}\r\nfunction serializeNodeWithId(n, options) {\r\n    const { doc, mirror, blockClass, blockSelector, unblockSelector, maskAllText, maskTextClass, unmaskTextClass, maskTextSelector, unmaskTextSelector, skipChild = false, inlineStylesheet = true, maskInputOptions = {}, maskAttributeFn, maskTextFn, maskInputFn, slimDOMOptions, dataURLOptions = {}, inlineImages = false, recordCanvas = false, onSerialize, onIframeLoad, iframeLoadTimeout = 5000, onStylesheetLoad, stylesheetLoadTimeout = 5000, keepIframeSrcFn = () => false, newlyAddedElement = false, } = options;\r\n    let { preserveWhiteSpace = true } = options;\r\n    const _serializedNode = serializeNode(n, {\r\n        doc,\r\n        mirror,\r\n        blockClass,\r\n        blockSelector,\r\n        maskAllText,\r\n        unblockSelector,\r\n        maskTextClass,\r\n        unmaskTextClass,\r\n        maskTextSelector,\r\n        unmaskTextSelector,\r\n        inlineStylesheet,\r\n        maskInputOptions,\r\n        maskAttributeFn,\r\n        maskTextFn,\r\n        maskInputFn,\r\n        dataURLOptions,\r\n        inlineImages,\r\n        recordCanvas,\r\n        keepIframeSrcFn,\r\n        newlyAddedElement,\r\n    });\r\n    if (!_serializedNode) {\r\n        console.warn(n, 'not serialized');\r\n        return null;\r\n    }\r\n    let id;\r\n    if (mirror.hasNode(n)) {\r\n        id = mirror.getId(n);\r\n    }\r\n    else if (slimDOMExcluded(_serializedNode, slimDOMOptions) ||\r\n        (!preserveWhiteSpace &&\r\n            _serializedNode.type === NodeType.Text &&\r\n            !_serializedNode.isStyle &&\r\n            !_serializedNode.textContent.replace(/^\\s+|\\s+$/gm, '').length)) {\r\n        id = IGNORED_NODE;\r\n    }\r\n    else {\r\n        id = genId();\r\n    }\r\n    const serializedNode = Object.assign(_serializedNode, { id });\r\n    mirror.add(n, serializedNode);\r\n    if (id === IGNORED_NODE) {\r\n        return null;\r\n    }\r\n    if (onSerialize) {\r\n        onSerialize(n);\r\n    }\r\n    let recordChild = !skipChild;\r\n    if (serializedNode.type === NodeType.Element) {\r\n        recordChild = recordChild && !serializedNode.needBlock;\r\n        delete serializedNode.needBlock;\r\n        const shadowRoot = n.shadowRoot;\r\n        if (shadowRoot && isNativeShadowDom(shadowRoot))\r\n            serializedNode.isShadowHost = true;\r\n    }\r\n    if ((serializedNode.type === NodeType.Document ||\r\n        serializedNode.type === NodeType.Element) &&\r\n        recordChild) {\r\n        if (slimDOMOptions.headWhitespace &&\r\n            serializedNode.type === NodeType.Element &&\r\n            serializedNode.tagName === 'head') {\r\n            preserveWhiteSpace = false;\r\n        }\r\n        const bypassOptions = {\r\n            doc,\r\n            mirror,\r\n            blockClass,\r\n            blockSelector,\r\n            maskAllText,\r\n            unblockSelector,\r\n            maskTextClass,\r\n            unmaskTextClass,\r\n            maskTextSelector,\r\n            unmaskTextSelector,\r\n            skipChild,\r\n            inlineStylesheet,\r\n            maskInputOptions,\r\n            maskAttributeFn,\r\n            maskTextFn,\r\n            maskInputFn,\r\n            slimDOMOptions,\r\n            dataURLOptions,\r\n            inlineImages,\r\n            recordCanvas,\r\n            preserveWhiteSpace,\r\n            onSerialize,\r\n            onIframeLoad,\r\n            iframeLoadTimeout,\r\n            onStylesheetLoad,\r\n            stylesheetLoadTimeout,\r\n            keepIframeSrcFn,\r\n        };\r\n        for (const childN of Array.from(n.childNodes)) {\r\n            const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n            if (serializedChildNode) {\r\n                serializedNode.childNodes.push(serializedChildNode);\r\n            }\r\n        }\r\n        if (isElement(n) && n.shadowRoot) {\r\n            for (const childN of Array.from(n.shadowRoot.childNodes)) {\r\n                const serializedChildNode = serializeNodeWithId(childN, bypassOptions);\r\n                if (serializedChildNode) {\r\n                    isNativeShadowDom(n.shadowRoot) &&\r\n                        (serializedChildNode.isShadow = true);\r\n                    serializedNode.childNodes.push(serializedChildNode);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    if (n.parentNode &&\r\n        isShadowRoot(n.parentNode) &&\r\n        isNativeShadowDom(n.parentNode)) {\r\n        serializedNode.isShadow = true;\r\n    }\r\n    if (serializedNode.type === NodeType.Element &&\r\n        serializedNode.tagName === 'iframe') {\r\n        onceIframeLoaded(n, () => {\r\n            const iframeDoc = getIframeContentDocument(n);\r\n            if (iframeDoc && onIframeLoad) {\r\n                const serializedIframeNode = serializeNodeWithId(iframeDoc, {\r\n                    doc: iframeDoc,\r\n                    mirror,\r\n                    blockClass,\r\n                    blockSelector,\r\n                    unblockSelector,\r\n                    maskAllText,\r\n                    maskTextClass,\r\n                    unmaskTextClass,\r\n                    maskTextSelector,\r\n                    unmaskTextSelector,\r\n                    skipChild: false,\r\n                    inlineStylesheet,\r\n                    maskInputOptions,\r\n                    maskAttributeFn,\r\n                    maskTextFn,\r\n                    maskInputFn,\r\n                    slimDOMOptions,\r\n                    dataURLOptions,\r\n                    inlineImages,\r\n                    recordCanvas,\r\n                    preserveWhiteSpace,\r\n                    onSerialize,\r\n                    onIframeLoad,\r\n                    iframeLoadTimeout,\r\n                    onStylesheetLoad,\r\n                    stylesheetLoadTimeout,\r\n                    keepIframeSrcFn,\r\n                });\r\n                if (serializedIframeNode) {\r\n                    onIframeLoad(n, serializedIframeNode);\r\n                }\r\n            }\r\n        }, iframeLoadTimeout);\r\n    }\r\n    if (serializedNode.type === NodeType.Element &&\r\n        serializedNode.tagName === 'link' &&\r\n        typeof serializedNode.attributes.rel === 'string' &&\r\n        (serializedNode.attributes.rel === 'stylesheet' ||\r\n            (serializedNode.attributes.rel === 'preload' &&\r\n                typeof serializedNode.attributes.href === 'string' &&\r\n                extractFileExtension(serializedNode.attributes.href) === 'css'))) {\r\n        onceStylesheetLoaded(n, () => {\r\n            if (onStylesheetLoad) {\r\n                const serializedLinkNode = serializeNodeWithId(n, {\r\n                    doc,\r\n                    mirror,\r\n                    blockClass,\r\n                    blockSelector,\r\n                    unblockSelector,\r\n                    maskAllText,\r\n                    maskTextClass,\r\n                    unmaskTextClass,\r\n                    maskTextSelector,\r\n                    unmaskTextSelector,\r\n                    skipChild: false,\r\n                    inlineStylesheet,\r\n                    maskInputOptions,\r\n                    maskAttributeFn,\r\n                    maskTextFn,\r\n                    maskInputFn,\r\n                    slimDOMOptions,\r\n                    dataURLOptions,\r\n                    inlineImages,\r\n                    recordCanvas,\r\n                    preserveWhiteSpace,\r\n                    onSerialize,\r\n                    onIframeLoad,\r\n                    iframeLoadTimeout,\r\n                    onStylesheetLoad,\r\n                    stylesheetLoadTimeout,\r\n                    keepIframeSrcFn,\r\n                });\r\n                if (serializedLinkNode) {\r\n                    onStylesheetLoad(n, serializedLinkNode);\r\n                }\r\n            }\r\n        }, stylesheetLoadTimeout);\r\n    }\r\n    return serializedNode;\r\n}\r\nfunction snapshot(n, options) {\r\n    const { mirror = new Mirror(), blockClass = 'rr-block', blockSelector = null, unblockSelector = null, maskAllText = false, maskTextClass = 'rr-mask', unmaskTextClass = null, maskTextSelector = null, unmaskTextSelector = null, inlineStylesheet = true, inlineImages = false, recordCanvas = false, maskAllInputs = false, maskAttributeFn, maskTextFn, maskInputFn, slimDOM = false, dataURLOptions, preserveWhiteSpace, onSerialize, onIframeLoad, iframeLoadTimeout, onStylesheetLoad, stylesheetLoadTimeout, keepIframeSrcFn = () => false, } = options || {};\r\n    const maskInputOptions = maskAllInputs === true\r\n        ? {\r\n            color: true,\r\n            date: true,\r\n            'datetime-local': true,\r\n            email: true,\r\n            month: true,\r\n            number: true,\r\n            range: true,\r\n            search: true,\r\n            tel: true,\r\n            text: true,\r\n            time: true,\r\n            url: true,\r\n            week: true,\r\n            textarea: true,\r\n            select: true,\r\n        }\r\n        : maskAllInputs === false\r\n            ? {}\r\n            : maskAllInputs;\r\n    const slimDOMOptions = slimDOM === true || slimDOM === 'all'\r\n        ?\r\n            {\r\n                script: true,\r\n                comment: true,\r\n                headFavicon: true,\r\n                headWhitespace: true,\r\n                headMetaDescKeywords: slimDOM === 'all',\r\n                headMetaSocial: true,\r\n                headMetaRobots: true,\r\n                headMetaHttpEquiv: true,\r\n                headMetaAuthorship: true,\r\n                headMetaVerification: true,\r\n            }\r\n        : slimDOM === false\r\n            ? {}\r\n            : slimDOM;\r\n    return serializeNodeWithId(n, {\r\n        doc: n,\r\n        mirror,\r\n        blockClass,\r\n        blockSelector,\r\n        unblockSelector,\r\n        maskAllText,\r\n        maskTextClass,\r\n        unmaskTextClass,\r\n        maskTextSelector,\r\n        unmaskTextSelector,\r\n        skipChild: false,\r\n        inlineStylesheet,\r\n        maskInputOptions,\r\n        maskAttributeFn,\r\n        maskTextFn,\r\n        maskInputFn,\r\n        slimDOMOptions,\r\n        dataURLOptions,\r\n        inlineImages,\r\n        recordCanvas,\r\n        preserveWhiteSpace,\r\n        onSerialize,\r\n        onIframeLoad,\r\n        iframeLoadTimeout,\r\n        onStylesheetLoad,\r\n        stylesheetLoadTimeout,\r\n        keepIframeSrcFn,\r\n        newlyAddedElement: false,\r\n    });\r\n}\r\nfunction visitSnapshot(node, onVisit) {\r\n    function walk(current) {\r\n        onVisit(current);\r\n        if (current.type === NodeType.Document ||\r\n            current.type === NodeType.Element) {\r\n            current.childNodes.forEach(walk);\r\n        }\r\n    }\r\n    walk(node);\r\n}\r\nfunction cleanupSnapshot() {\r\n    _id = 1;\r\n}\n\nconst commentre = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//g;\r\nfunction parse(css, options = {}) {\r\n    let lineno = 1;\r\n    let column = 1;\r\n    function updatePosition(str) {\r\n        const lines = str.match(/\\n/g);\r\n        if (lines) {\r\n            lineno += lines.length;\r\n        }\r\n        const i = str.lastIndexOf('\\n');\r\n        column = i === -1 ? column + str.length : str.length - i;\r\n    }\r\n    function position() {\r\n        const start = { line: lineno, column };\r\n        return (node) => {\r\n            node.position = new Position(start);\r\n            whitespace();\r\n            return node;\r\n        };\r\n    }\r\n    class Position {\r\n        constructor(start) {\r\n            this.start = start;\r\n            this.end = { line: lineno, column };\r\n            this.source = options.source;\r\n        }\r\n    }\r\n    Position.prototype.content = css;\r\n    const errorsList = [];\r\n    function error(msg) {\r\n        const err = new Error(`${options.source || ''}:${lineno}:${column}: ${msg}`);\r\n        err.reason = msg;\r\n        err.filename = options.source;\r\n        err.line = lineno;\r\n        err.column = column;\r\n        err.source = css;\r\n        if (options.silent) {\r\n            errorsList.push(err);\r\n        }\r\n        else {\r\n            throw err;\r\n        }\r\n    }\r\n    function stylesheet() {\r\n        const rulesList = rules();\r\n        return {\r\n            type: 'stylesheet',\r\n            stylesheet: {\r\n                source: options.source,\r\n                rules: rulesList,\r\n                parsingErrors: errorsList,\r\n            },\r\n        };\r\n    }\r\n    function open() {\r\n        return match(/^{\\s*/);\r\n    }\r\n    function close() {\r\n        return match(/^}/);\r\n    }\r\n    function rules() {\r\n        let node;\r\n        const rules = [];\r\n        whitespace();\r\n        comments(rules);\r\n        while (css.length && css.charAt(0) !== '}' && (node = atrule() || rule())) {\r\n            if (node) {\r\n                rules.push(node);\r\n                comments(rules);\r\n            }\r\n        }\r\n        return rules;\r\n    }\r\n    function match(re) {\r\n        const m = re.exec(css);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        const str = m[0];\r\n        updatePosition(str);\r\n        css = css.slice(str.length);\r\n        return m;\r\n    }\r\n    function whitespace() {\r\n        match(/^\\s*/);\r\n    }\r\n    function comments(rules = []) {\r\n        let c;\r\n        while ((c = comment())) {\r\n            if (c) {\r\n                rules.push(c);\r\n            }\r\n            c = comment();\r\n        }\r\n        return rules;\r\n    }\r\n    function comment() {\r\n        const pos = position();\r\n        if ('/' !== css.charAt(0) || '*' !== css.charAt(1)) {\r\n            return;\r\n        }\r\n        let i = 2;\r\n        while ('' !== css.charAt(i) &&\r\n            ('*' !== css.charAt(i) || '/' !== css.charAt(i + 1))) {\r\n            ++i;\r\n        }\r\n        i += 2;\r\n        if ('' === css.charAt(i - 1)) {\r\n            return error('End of comment missing');\r\n        }\r\n        const str = css.slice(2, i - 2);\r\n        column += 2;\r\n        updatePosition(str);\r\n        css = css.slice(i);\r\n        column += 2;\r\n        return pos({\r\n            type: 'comment',\r\n            comment: str,\r\n        });\r\n    }\r\n    function selector() {\r\n        const m = match(/^([^{]+)/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        const splitSelectors = trim(m[0])\r\n            .replace(/\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*\\/+/g, '')\r\n            .replace(/\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'/g, (m) => {\r\n            return m.replace(/,/g, '\\u200C');\r\n        })\r\n            .split(/\\s*(?![^(]*\\)),\\s*/);\r\n        if (splitSelectors.length <= 1) {\r\n            return splitSelectors.map((s) => {\r\n                return s.replace(/\\u200C/g, ',');\r\n            });\r\n        }\r\n        let i = 0;\r\n        let j = 0;\r\n        const len = splitSelectors.length;\r\n        const finalSelectors = [];\r\n        while (i < len) {\r\n            const openingParensCount = (splitSelectors[i].match(/\\(/g) || []).length;\r\n            const closingParensCount = (splitSelectors[i].match(/\\)/g) || []).length;\r\n            let unbalancedParens = openingParensCount - closingParensCount;\r\n            if (unbalancedParens >= 1) {\r\n                let foundClosingSelector = false;\r\n                j = i + 1;\r\n                while (j < len) {\r\n                    const nextOpeningParensCount = (splitSelectors[j].match(/\\(/g) || [])\r\n                        .length;\r\n                    const nextClosingParensCount = (splitSelectors[j].match(/\\)/g) || [])\r\n                        .length;\r\n                    const nextUnbalancedParens = nextClosingParensCount - nextOpeningParensCount;\r\n                    if (nextUnbalancedParens === unbalancedParens) {\r\n                        finalSelectors.push(splitSelectors.slice(i, j + 1).join(','));\r\n                        i = j + 1;\r\n                        foundClosingSelector = true;\r\n                        break;\r\n                    }\r\n                    j++;\r\n                    unbalancedParens -= nextUnbalancedParens;\r\n                }\r\n                if (foundClosingSelector) {\r\n                    continue;\r\n                }\r\n                splitSelectors\r\n                    .slice(i, len)\r\n                    .forEach((selector) => selector && finalSelectors.push(selector));\r\n                break;\r\n            }\r\n            splitSelectors[i] && finalSelectors.push(splitSelectors[i]);\r\n            i++;\r\n        }\r\n        return finalSelectors.map((s) => {\r\n            return s.replace(/\\u200C/g, ',');\r\n        });\r\n    }\r\n    function declaration() {\r\n        const pos = position();\r\n        const propMatch = match(/^(\\*?[-#\\/\\*\\\\\\w]+(\\[[0-9a-z_-]+\\])?)\\s*/);\r\n        if (!propMatch) {\r\n            return;\r\n        }\r\n        const prop = trim(propMatch[0]);\r\n        if (!match(/^:\\s*/)) {\r\n            return error(`property missing ':'`);\r\n        }\r\n        const val = match(/^((?:'(?:\\\\'|.)*?'|\"(?:\\\\\"|.)*?\"|\\([^\\)]*?\\)|[^};])+)/);\r\n        const ret = pos({\r\n            type: 'declaration',\r\n            property: prop.replace(commentre, ''),\r\n            value: val ? trim(val[0]).replace(commentre, '') : '',\r\n        });\r\n        match(/^[;\\s]*/);\r\n        return ret;\r\n    }\r\n    function declarations() {\r\n        const decls = [];\r\n        if (!open()) {\r\n            return error(`missing '{'`);\r\n        }\r\n        comments(decls);\r\n        let decl;\r\n        while ((decl = declaration())) {\r\n            if (decl !== false) {\r\n                decls.push(decl);\r\n                comments(decls);\r\n            }\r\n            decl = declaration();\r\n        }\r\n        if (!close()) {\r\n            return error(`missing '}'`);\r\n        }\r\n        return decls;\r\n    }\r\n    function keyframe() {\r\n        let m;\r\n        const vals = [];\r\n        const pos = position();\r\n        while ((m = match(/^((\\d+\\.\\d+|\\.\\d+|\\d+)%?|[a-z]+)\\s*/))) {\r\n            vals.push(m[1]);\r\n            match(/^,\\s*/);\r\n        }\r\n        if (!vals.length) {\r\n            return;\r\n        }\r\n        return pos({\r\n            type: 'keyframe',\r\n            values: vals,\r\n            declarations: declarations(),\r\n        });\r\n    }\r\n    function atkeyframes() {\r\n        const pos = position();\r\n        let m = match(/^@([-\\w]+)?keyframes\\s*/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        const vendor = m[1];\r\n        m = match(/^([-\\w]+)\\s*/);\r\n        if (!m) {\r\n            return error('@keyframes missing name');\r\n        }\r\n        const name = m[1];\r\n        if (!open()) {\r\n            return error(`@keyframes missing '{'`);\r\n        }\r\n        let frame;\r\n        let frames = comments();\r\n        while ((frame = keyframe())) {\r\n            frames.push(frame);\r\n            frames = frames.concat(comments());\r\n        }\r\n        if (!close()) {\r\n            return error(`@keyframes missing '}'`);\r\n        }\r\n        return pos({\r\n            type: 'keyframes',\r\n            name,\r\n            vendor,\r\n            keyframes: frames,\r\n        });\r\n    }\r\n    function atsupports() {\r\n        const pos = position();\r\n        const m = match(/^@supports *([^{]+)/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        const supports = trim(m[1]);\r\n        if (!open()) {\r\n            return error(`@supports missing '{'`);\r\n        }\r\n        const style = comments().concat(rules());\r\n        if (!close()) {\r\n            return error(`@supports missing '}'`);\r\n        }\r\n        return pos({\r\n            type: 'supports',\r\n            supports,\r\n            rules: style,\r\n        });\r\n    }\r\n    function athost() {\r\n        const pos = position();\r\n        const m = match(/^@host\\s*/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        if (!open()) {\r\n            return error(`@host missing '{'`);\r\n        }\r\n        const style = comments().concat(rules());\r\n        if (!close()) {\r\n            return error(`@host missing '}'`);\r\n        }\r\n        return pos({\r\n            type: 'host',\r\n            rules: style,\r\n        });\r\n    }\r\n    function atmedia() {\r\n        const pos = position();\r\n        const m = match(/^@media *([^{]+)/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        const media = trim(m[1]);\r\n        if (!open()) {\r\n            return error(`@media missing '{'`);\r\n        }\r\n        const style = comments().concat(rules());\r\n        if (!close()) {\r\n            return error(`@media missing '}'`);\r\n        }\r\n        return pos({\r\n            type: 'media',\r\n            media,\r\n            rules: style,\r\n        });\r\n    }\r\n    function atcustommedia() {\r\n        const pos = position();\r\n        const m = match(/^@custom-media\\s+(--[^\\s]+)\\s*([^{;]+);/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        return pos({\r\n            type: 'custom-media',\r\n            name: trim(m[1]),\r\n            media: trim(m[2]),\r\n        });\r\n    }\r\n    function atpage() {\r\n        const pos = position();\r\n        const m = match(/^@page */);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        const sel = selector() || [];\r\n        if (!open()) {\r\n            return error(`@page missing '{'`);\r\n        }\r\n        let decls = comments();\r\n        let decl;\r\n        while ((decl = declaration())) {\r\n            decls.push(decl);\r\n            decls = decls.concat(comments());\r\n        }\r\n        if (!close()) {\r\n            return error(`@page missing '}'`);\r\n        }\r\n        return pos({\r\n            type: 'page',\r\n            selectors: sel,\r\n            declarations: decls,\r\n        });\r\n    }\r\n    function atdocument() {\r\n        const pos = position();\r\n        const m = match(/^@([-\\w]+)?document *([^{]+)/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        const vendor = trim(m[1]);\r\n        const doc = trim(m[2]);\r\n        if (!open()) {\r\n            return error(`@document missing '{'`);\r\n        }\r\n        const style = comments().concat(rules());\r\n        if (!close()) {\r\n            return error(`@document missing '}'`);\r\n        }\r\n        return pos({\r\n            type: 'document',\r\n            document: doc,\r\n            vendor,\r\n            rules: style,\r\n        });\r\n    }\r\n    function atfontface() {\r\n        const pos = position();\r\n        const m = match(/^@font-face\\s*/);\r\n        if (!m) {\r\n            return;\r\n        }\r\n        if (!open()) {\r\n            return error(`@font-face missing '{'`);\r\n        }\r\n        let decls = comments();\r\n        let decl;\r\n        while ((decl = declaration())) {\r\n            decls.push(decl);\r\n            decls = decls.concat(comments());\r\n        }\r\n        if (!close()) {\r\n            return error(`@font-face missing '}'`);\r\n        }\r\n        return pos({\r\n            type: 'font-face',\r\n            declarations: decls,\r\n        });\r\n    }\r\n    const atimport = _compileAtrule('import');\r\n    const atcharset = _compileAtrule('charset');\r\n    const atnamespace = _compileAtrule('namespace');\r\n    function _compileAtrule(name) {\r\n        const re = new RegExp('^@' +\r\n            name +\r\n            '\\\\s*((?:' +\r\n            [\r\n                /[^\\\\]\"(?:\\\\\"|[^\"])*\"/.source,\r\n                /[^\\\\]'(?:\\\\'|[^'])*'/.source,\r\n                '[^;]',\r\n            ].join('|') +\r\n            ')+);');\r\n        return () => {\r\n            const pos = position();\r\n            const m = match(re);\r\n            if (!m) {\r\n                return;\r\n            }\r\n            const ret = { type: name };\r\n            ret[name] = m[1].trim();\r\n            return pos(ret);\r\n        };\r\n    }\r\n    function atrule() {\r\n        if (css[0] !== '@') {\r\n            return;\r\n        }\r\n        return (atkeyframes() ||\r\n            atmedia() ||\r\n            atcustommedia() ||\r\n            atsupports() ||\r\n            atimport() ||\r\n            atcharset() ||\r\n            atnamespace() ||\r\n            atdocument() ||\r\n            atpage() ||\r\n            athost() ||\r\n            atfontface());\r\n    }\r\n    function rule() {\r\n        const pos = position();\r\n        const sel = selector();\r\n        if (!sel) {\r\n            return error('selector missing');\r\n        }\r\n        comments();\r\n        return pos({\r\n            type: 'rule',\r\n            selectors: sel,\r\n            declarations: declarations(),\r\n        });\r\n    }\r\n    return addParent(stylesheet());\r\n}\r\nfunction trim(str) {\r\n    return str ? str.replace(/^\\s+|\\s+$/g, '') : '';\r\n}\r\nfunction addParent(obj, parent) {\r\n    const isNode = obj && typeof obj.type === 'string';\r\n    const childParent = isNode ? obj : parent;\r\n    for (const k of Object.keys(obj)) {\r\n        const value = obj[k];\r\n        if (Array.isArray(value)) {\r\n            value.forEach((v) => {\r\n                addParent(v, childParent);\r\n            });\r\n        }\r\n        else if (value && typeof value === 'object') {\r\n            addParent(value, childParent);\r\n        }\r\n    }\r\n    if (isNode) {\r\n        Object.defineProperty(obj, 'parent', {\r\n            configurable: true,\r\n            writable: true,\r\n            enumerable: false,\r\n            value: parent || null,\r\n        });\r\n    }\r\n    return obj;\r\n}\n\nconst tagMap = {\r\n    script: 'noscript',\r\n    altglyph: 'altGlyph',\r\n    altglyphdef: 'altGlyphDef',\r\n    altglyphitem: 'altGlyphItem',\r\n    animatecolor: 'animateColor',\r\n    animatemotion: 'animateMotion',\r\n    animatetransform: 'animateTransform',\r\n    clippath: 'clipPath',\r\n    feblend: 'feBlend',\r\n    fecolormatrix: 'feColorMatrix',\r\n    fecomponenttransfer: 'feComponentTransfer',\r\n    fecomposite: 'feComposite',\r\n    feconvolvematrix: 'feConvolveMatrix',\r\n    fediffuselighting: 'feDiffuseLighting',\r\n    fedisplacementmap: 'feDisplacementMap',\r\n    fedistantlight: 'feDistantLight',\r\n    fedropshadow: 'feDropShadow',\r\n    feflood: 'feFlood',\r\n    fefunca: 'feFuncA',\r\n    fefuncb: 'feFuncB',\r\n    fefuncg: 'feFuncG',\r\n    fefuncr: 'feFuncR',\r\n    fegaussianblur: 'feGaussianBlur',\r\n    feimage: 'feImage',\r\n    femerge: 'feMerge',\r\n    femergenode: 'feMergeNode',\r\n    femorphology: 'feMorphology',\r\n    feoffset: 'feOffset',\r\n    fepointlight: 'fePointLight',\r\n    fespecularlighting: 'feSpecularLighting',\r\n    fespotlight: 'feSpotLight',\r\n    fetile: 'feTile',\r\n    feturbulence: 'feTurbulence',\r\n    foreignobject: 'foreignObject',\r\n    glyphref: 'glyphRef',\r\n    lineargradient: 'linearGradient',\r\n    radialgradient: 'radialGradient',\r\n};\r\nfunction getTagName(n) {\r\n    let tagName = tagMap[n.tagName] ? tagMap[n.tagName] : n.tagName;\r\n    if (tagName === 'link' && n.attributes._cssText) {\r\n        tagName = 'style';\r\n    }\r\n    return tagName;\r\n}\r\nfunction escapeRegExp(str) {\r\n    return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\nconst HOVER_SELECTOR = /([^\\\\]):hover/;\r\nconst HOVER_SELECTOR_GLOBAL = new RegExp(HOVER_SELECTOR.source, 'g');\r\nfunction addHoverClass(cssText, cache) {\r\n    const cachedStyle = cache?.stylesWithHoverClass.get(cssText);\r\n    if (cachedStyle)\r\n        return cachedStyle;\r\n    if (cssText.length >= 1000000) {\r\n        return cssText;\r\n    }\r\n    const ast = parse(cssText, {\r\n        silent: true,\r\n    });\r\n    if (!ast.stylesheet) {\r\n        return cssText;\r\n    }\r\n    const selectors = [];\r\n    ast.stylesheet.rules.forEach((rule) => {\r\n        if ('selectors' in rule) {\r\n            (rule.selectors || []).forEach((selector) => {\r\n                if (HOVER_SELECTOR.test(selector)) {\r\n                    selectors.push(selector);\r\n                }\r\n            });\r\n        }\r\n    });\r\n    if (selectors.length === 0) {\r\n        return cssText;\r\n    }\r\n    const selectorMatcher = new RegExp(selectors\r\n        .filter((selector, index) => selectors.indexOf(selector) === index)\r\n        .sort((a, b) => b.length - a.length)\r\n        .map((selector) => {\r\n        return escapeRegExp(selector);\r\n    })\r\n        .join('|'), 'g');\r\n    const result = cssText.replace(selectorMatcher, (selector) => {\r\n        const newSelector = selector.replace(HOVER_SELECTOR_GLOBAL, '$1.\\\\:hover');\r\n        return `${selector}, ${newSelector}`;\r\n    });\r\n    cache?.stylesWithHoverClass.set(cssText, result);\r\n    return result;\r\n}\r\nfunction createCache() {\r\n    const stylesWithHoverClass = new Map();\r\n    return {\r\n        stylesWithHoverClass,\r\n    };\r\n}\r\nfunction buildNode(n, options) {\r\n    const { doc, hackCss, cache } = options;\r\n    switch (n.type) {\r\n        case NodeType.Document:\r\n            return doc.implementation.createDocument(null, '', null);\r\n        case NodeType.DocumentType:\r\n            return doc.implementation.createDocumentType(n.name || 'html', n.publicId, n.systemId);\r\n        case NodeType.Element: {\r\n            const tagName = getTagName(n);\r\n            let node;\r\n            if (n.isSVG) {\r\n                node = doc.createElementNS('http://www.w3.org/2000/svg', tagName);\r\n            }\r\n            else {\r\n                if (n.isCustom &&\r\n                    doc.defaultView?.customElements &&\r\n                    !doc.defaultView.customElements.get(n.tagName))\r\n                    doc.defaultView.customElements.define(n.tagName, class extends doc.defaultView.HTMLElement {\r\n                    });\r\n                node = doc.createElement(tagName);\r\n            }\r\n            const specialAttributes = {};\r\n            for (const name in n.attributes) {\r\n                if (!Object.prototype.hasOwnProperty.call(n.attributes, name)) {\r\n                    continue;\r\n                }\r\n                let value = n.attributes[name];\r\n                if (tagName === 'option' &&\r\n                    name === 'selected' &&\r\n                    value === false) {\r\n                    continue;\r\n                }\r\n                if (value === null) {\r\n                    continue;\r\n                }\r\n                if (value === true)\r\n                    value = '';\r\n                if (name.startsWith('rr_')) {\r\n                    specialAttributes[name] = value;\r\n                    continue;\r\n                }\r\n                const isTextarea = tagName === 'textarea' && name === 'value';\r\n                const isRemoteOrDynamicCss = tagName === 'style' && name === '_cssText';\r\n                if (isRemoteOrDynamicCss && hackCss && typeof value === 'string') {\r\n                    value = addHoverClass(value, cache);\r\n                }\r\n                if ((isTextarea || isRemoteOrDynamicCss) && typeof value === 'string') {\r\n                    const child = doc.createTextNode(value);\r\n                    for (const c of Array.from(node.childNodes)) {\r\n                        if (c.nodeType === node.TEXT_NODE) {\r\n                            node.removeChild(c);\r\n                        }\r\n                    }\r\n                    node.appendChild(child);\r\n                    continue;\r\n                }\r\n                try {\r\n                    if (n.isSVG && name === 'xlink:href') {\r\n                        node.setAttributeNS('http://www.w3.org/1999/xlink', name, value.toString());\r\n                    }\r\n                    else if (name === 'onload' ||\r\n                        name === 'onclick' ||\r\n                        name.substring(0, 7) === 'onmouse') {\r\n                        node.setAttribute('_' + name, value.toString());\r\n                    }\r\n                    else if (tagName === 'meta' &&\r\n                        n.attributes['http-equiv'] === 'Content-Security-Policy' &&\r\n                        name === 'content') {\r\n                        node.setAttribute('csp-content', value.toString());\r\n                        continue;\r\n                    }\r\n                    else if (tagName === 'link' &&\r\n                        (n.attributes.rel === 'preload' ||\r\n                            n.attributes.rel === 'modulepreload')) {\r\n                    }\r\n                    else if (tagName === 'link' &&\r\n                        n.attributes.rel === 'prefetch' &&\r\n                        typeof n.attributes.href === 'string' &&\r\n                        extractFileExtension(n.attributes.href) === 'js') {\r\n                    }\r\n                    else if (tagName === 'img' &&\r\n                        n.attributes.srcset &&\r\n                        n.attributes.rr_dataURL) {\r\n                        node.setAttribute('rrweb-original-srcset', n.attributes.srcset);\r\n                    }\r\n                    else {\r\n                        node.setAttribute(name, value.toString());\r\n                    }\r\n                }\r\n                catch (error) {\r\n                }\r\n            }\r\n            for (const name in specialAttributes) {\r\n                const value = specialAttributes[name];\r\n                if (tagName === 'canvas' && name === 'rr_dataURL') {\r\n                    const image = doc.createElement('img');\r\n                    image.onload = () => {\r\n                        const ctx = node.getContext('2d');\r\n                        if (ctx) {\r\n                            ctx.drawImage(image, 0, 0, image.width, image.height);\r\n                        }\r\n                    };\r\n                    image.src = value.toString();\r\n                    if (node.RRNodeType)\r\n                        node.rr_dataURL = value.toString();\r\n                }\r\n                else if (tagName === 'img' && name === 'rr_dataURL') {\r\n                    const image = node;\r\n                    if (!image.currentSrc.startsWith('data:')) {\r\n                        image.setAttribute('rrweb-original-src', n.attributes.src);\r\n                        image.src = value.toString();\r\n                    }\r\n                }\r\n                if (name === 'rr_width') {\r\n                    node.style.setProperty('width', value.toString());\r\n                }\r\n                else if (name === 'rr_height') {\r\n                    node.style.setProperty('height', value.toString());\r\n                }\r\n                else if (name === 'rr_mediaCurrentTime' &&\r\n                    typeof value === 'number') {\r\n                    node.currentTime = value;\r\n                }\r\n                else if (name === 'rr_mediaState') {\r\n                    switch (value) {\r\n                        case 'played':\r\n                            node\r\n                                .play()\r\n                                .catch((e) => console.warn('media playback error', e));\r\n                            break;\r\n                        case 'paused':\r\n                            node.pause();\r\n                            break;\r\n                    }\r\n                }\r\n            }\r\n            if (n.isShadowHost) {\r\n                if (!node.shadowRoot) {\r\n                    node.attachShadow({ mode: 'open' });\r\n                }\r\n                else {\r\n                    while (node.shadowRoot.firstChild) {\r\n                        node.shadowRoot.removeChild(node.shadowRoot.firstChild);\r\n                    }\r\n                }\r\n            }\r\n            return node;\r\n        }\r\n        case NodeType.Text:\r\n            return doc.createTextNode(n.isStyle && hackCss\r\n                ? addHoverClass(n.textContent, cache)\r\n                : n.textContent);\r\n        case NodeType.CDATA:\r\n            return doc.createCDATASection(n.textContent);\r\n        case NodeType.Comment:\r\n            return doc.createComment(n.textContent);\r\n        default:\r\n            return null;\r\n    }\r\n}\r\nfunction buildNodeWithSN(n, options) {\r\n    const { doc, mirror, skipChild = false, hackCss = true, afterAppend, cache, } = options;\r\n    if (mirror.has(n.id)) {\r\n        const nodeInMirror = mirror.getNode(n.id);\r\n        const meta = mirror.getMeta(nodeInMirror);\r\n        if (isNodeMetaEqual(meta, n))\r\n            return mirror.getNode(n.id);\r\n    }\r\n    let node = buildNode(n, { doc, hackCss, cache });\r\n    if (!node) {\r\n        return null;\r\n    }\r\n    if (n.rootId && mirror.getNode(n.rootId) !== doc) {\r\n        mirror.replace(n.rootId, doc);\r\n    }\r\n    if (n.type === NodeType.Document) {\r\n        doc.close();\r\n        doc.open();\r\n        if (n.compatMode === 'BackCompat' &&\r\n            n.childNodes &&\r\n            n.childNodes[0].type !== NodeType.DocumentType) {\r\n            if (n.childNodes[0].type === NodeType.Element &&\r\n                'xmlns' in n.childNodes[0].attributes &&\r\n                n.childNodes[0].attributes.xmlns === 'http://www.w3.org/1999/xhtml') {\r\n                doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"\">');\r\n            }\r\n            else {\r\n                doc.write('<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"\">');\r\n            }\r\n        }\r\n        node = doc;\r\n    }\r\n    mirror.add(node, n);\r\n    if ((n.type === NodeType.Document || n.type === NodeType.Element) &&\r\n        !skipChild) {\r\n        for (const childN of n.childNodes) {\r\n            const childNode = buildNodeWithSN(childN, {\r\n                doc,\r\n                mirror,\r\n                skipChild: false,\r\n                hackCss,\r\n                afterAppend,\r\n                cache,\r\n            });\r\n            if (!childNode) {\r\n                console.warn('Failed to rebuild', childN);\r\n                continue;\r\n            }\r\n            if (childN.isShadow && isElement(node) && node.shadowRoot) {\r\n                node.shadowRoot.appendChild(childNode);\r\n            }\r\n            else if (n.type === NodeType.Document &&\r\n                childN.type == NodeType.Element) {\r\n                const htmlElement = childNode;\r\n                let body = null;\r\n                htmlElement.childNodes.forEach((child) => {\r\n                    if (child.nodeName === 'BODY')\r\n                        body = child;\r\n                });\r\n                if (body) {\r\n                    htmlElement.removeChild(body);\r\n                    node.appendChild(childNode);\r\n                    htmlElement.appendChild(body);\r\n                }\r\n                else {\r\n                    node.appendChild(childNode);\r\n                }\r\n            }\r\n            else {\r\n                node.appendChild(childNode);\r\n            }\r\n            if (afterAppend) {\r\n                afterAppend(childNode, childN.id);\r\n            }\r\n        }\r\n    }\r\n    return node;\r\n}\r\nfunction visit(mirror, onVisit) {\r\n    function walk(node) {\r\n        onVisit(node);\r\n    }\r\n    for (const id of mirror.getIds()) {\r\n        if (mirror.has(id)) {\r\n            walk(mirror.getNode(id));\r\n        }\r\n    }\r\n}\r\nfunction handleScroll(node, mirror) {\r\n    const n = mirror.getMeta(node);\r\n    if (n?.type !== NodeType.Element) {\r\n        return;\r\n    }\r\n    const el = node;\r\n    for (const name in n.attributes) {\r\n        if (!(Object.prototype.hasOwnProperty.call(n.attributes, name) &&\r\n            name.startsWith('rr_'))) {\r\n            continue;\r\n        }\r\n        const value = n.attributes[name];\r\n        if (name === 'rr_scrollLeft') {\r\n            el.scrollLeft = value;\r\n        }\r\n        if (name === 'rr_scrollTop') {\r\n            el.scrollTop = value;\r\n        }\r\n    }\r\n}\r\nfunction rebuild(n, options) {\r\n    const { doc, onVisit, hackCss = true, afterAppend, cache, mirror = new Mirror(), } = options;\r\n    const node = buildNodeWithSN(n, {\r\n        doc,\r\n        mirror,\r\n        skipChild: false,\r\n        hackCss,\r\n        afterAppend,\r\n        cache,\r\n    });\r\n    visit(mirror, (visitedNode) => {\r\n        if (onVisit) {\r\n            onVisit(visitedNode);\r\n        }\r\n        handleScroll(visitedNode, mirror);\r\n    });\r\n    return node;\r\n}\n\nexport { IGNORED_NODE, Mirror, NodeType, addHoverClass, buildNodeWithSN, classMatchesRegex, cleanupSnapshot, clearTimeout, createCache, createMatchPredicate, createMirror, distanceToMatch, escapeImportStatement, extractFileExtension, fixAllCssProperty, fixSafariColons, genId, getIframeContentDocument, getInputType, getInputValue, ignoreAttribute, is2DCanvasBlank, isCSSImportRule, isCSSStyleRule, isElement, isNativeShadowDom, isNodeMetaEqual, isShadowRoot, maskInputValue, needMaskingText, onRequestAnimationFrame, rebuild, serializeNodeWithId, setTimeout, shouldMaskInput, snapshot, stringifyRule, stringifyStylesheet, toLowerCase, toUpperCase, transformAttribute, visitSnapshot };\n","// Note that these are the serialized attributes and not attributes directly on\n// the DOM Node. Attributes we are interested in:\nconst ATTRIBUTES_TO_RECORD = new Set([\n  'id',\n  'class',\n  'aria-label',\n  'role',\n  'name',\n  'alt',\n  'title',\n  'data-test-id',\n  'data-testid',\n  'disabled',\n  'aria-disabled',\n  'data-sentry-component',\n]);\n\n/**\n * Inclusion list of attributes that we want to record from the DOM element\n */\nexport function getAttributesToRecord(attributes: Record<string, unknown>): Record<string, unknown> {\n  const obj: Record<string, unknown> = {};\n  if (!attributes['data-sentry-component'] && attributes['data-sentry-element']) {\n    attributes['data-sentry-component'] = attributes['data-sentry-element'];\n  }\n  for (const key in attributes) {\n    if (ATTRIBUTES_TO_RECORD.has(key)) {\n      let normalizedKey = key;\n\n      if (key === 'data-testid' || key === 'data-test-id') {\n        normalizedKey = 'testId';\n      }\n\n      obj[normalizedKey] = attributes[key];\n    }\n  }\n\n  return obj;\n}\n","import { record } from '@sentry-internal/rrweb';\nimport type { serializedElementNodeWithId, serializedNodeWithId } from '@sentry-internal/rrweb-snapshot';\nimport { NodeType } from '@sentry-internal/rrweb-snapshot';\nimport { htmlTreeAsString } from '@sentry/core';\nimport type { Breadcrumb, HandlerDataDom } from '@sentry/core';\n\nimport type { ReplayContainer } from '../types';\nimport { createBreadcrumb } from '../util/createBreadcrumb';\nimport { handleClick } from './handleClick';\nimport { addBreadcrumbEvent } from './util/addBreadcrumbEvent';\nimport { getClickTargetNode, getTargetNode } from './util/domUtils';\nimport { getAttributesToRecord } from './util/getAttributesToRecord';\n\nexport const handleDomListener: (replay: ReplayContainer) => (handlerData: HandlerDataDom) => void = (\n  replay: ReplayContainer,\n) => {\n  return (handlerData: HandlerDataDom): void => {\n    if (!replay.isEnabled()) {\n      return;\n    }\n\n    const result = handleDom(handlerData);\n\n    if (!result) {\n      return;\n    }\n\n    const isClick = handlerData.name === 'click';\n    const event = isClick ? (handlerData.event as PointerEvent) : undefined;\n    // Ignore clicks if ctrl/alt/meta/shift keys are held down as they alter behavior of clicks (e.g. open in new tab)\n    if (\n      isClick &&\n      replay.clickDetector &&\n      event &&\n      event.target &&\n      !event.altKey &&\n      !event.metaKey &&\n      !event.ctrlKey &&\n      !event.shiftKey\n    ) {\n      handleClick(\n        replay.clickDetector,\n        result as Breadcrumb & { timestamp: number; data: { nodeId: number } },\n        getClickTargetNode(handlerData.event as Event) as HTMLElement,\n      );\n    }\n\n    addBreadcrumbEvent(replay, result);\n  };\n};\n\n/** Get the base DOM breadcrumb. */\nexport function getBaseDomBreadcrumb(target: Node | null, message: string): Breadcrumb {\n  const nodeId = record.mirror.getId(target);\n  const node = nodeId && record.mirror.getNode(nodeId);\n  const meta = node && record.mirror.getMeta(node);\n  const element = meta && isElement(meta) ? meta : null;\n\n  return {\n    message,\n    data: element\n      ? {\n          nodeId,\n          node: {\n            id: nodeId,\n            tagName: element.tagName,\n            textContent: Array.from(element.childNodes)\n              .map((node: serializedNodeWithId) => node.type === NodeType.Text && node.textContent)\n              .filter(Boolean) // filter out empty values\n              .map(text => (text as string).trim())\n              .join(''),\n            attributes: getAttributesToRecord(element.attributes),\n          },\n        }\n      : {},\n  };\n}\n\n/**\n * An event handler to react to DOM events.\n * Exported for tests.\n */\nexport function handleDom(handlerData: HandlerDataDom): Breadcrumb | null {\n  const { target, message } = getDomTarget(handlerData);\n\n  return createBreadcrumb({\n    category: `ui.${handlerData.name}`,\n    ...getBaseDomBreadcrumb(target, message),\n  });\n}\n\nfunction getDomTarget(handlerData: HandlerDataDom): { target: Node | null; message: string } {\n  const isClick = handlerData.name === 'click';\n\n  let message: string | undefined;\n  let target: Node | null = null;\n\n  // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n  try {\n    target = isClick ? getClickTargetNode(handlerData.event as Event) : getTargetNode(handlerData.event as Event);\n    message = htmlTreeAsString(target, { maxStringLength: 200 }) || '<unknown>';\n  } catch (e) {\n    message = '<unknown>';\n  }\n\n  return { target, message };\n}\n\nfunction isElement(node: serializedNodeWithId): node is serializedElementNodeWithId {\n  return node.type === NodeType.Element;\n}\n","import { record } from '@sentry-internal/rrweb';\nimport { browserPerformanceTimeOrigin } from '@sentry/core';\n\nimport { WINDOW } from '../constants';\nimport type {\n  AllPerformanceEntry,\n  AllPerformanceEntryData,\n  ExperimentalPerformanceResourceTiming,\n  NavigationData,\n  PaintData,\n  ReplayContainer,\n  ReplayPerformanceEntry,\n  ResourceData,\n  WebVitalData,\n} from '../types';\n\n// Map entryType -> function to normalize data for event\nconst ENTRY_TYPES: Record<\n  string,\n  (entry: AllPerformanceEntry) => null | ReplayPerformanceEntry<AllPerformanceEntryData>\n> = {\n  // @ts-expect-error TODO: entry type does not fit the create* functions entry type\n  resource: createResourceEntry,\n  paint: createPaintEntry,\n  // @ts-expect-error TODO: entry type does not fit the create* functions entry type\n  navigation: createNavigationEntry,\n};\n\nexport interface Metric {\n  /**\n   * The current value of the metric.\n   */\n  value: number;\n\n  /**\n   * The rating as to whether the metric value is within the \"good\",\n   * \"needs improvement\", or \"poor\" thresholds of the metric.\n   */\n  rating: 'good' | 'needs-improvement' | 'poor';\n\n  /**\n   * Any performance entries relevant to the metric value calculation.\n   * The array may also be empty if the metric value was not based on any\n   * entries (e.g. a CLS value of 0 given no layout shifts).\n   */\n  entries: PerformanceEntry[] | LayoutShift[];\n}\n\ninterface LayoutShift extends PerformanceEntry {\n  value: number;\n  sources: LayoutShiftAttribution[];\n  hadRecentInput: boolean;\n}\n\ninterface LayoutShiftAttribution {\n  node?: Node;\n  previousRect: DOMRectReadOnly;\n  currentRect: DOMRectReadOnly;\n}\n\n/**\n * Handler creater for web vitals\n */\nexport function webVitalHandler(\n  getter: (metric: Metric) => ReplayPerformanceEntry<AllPerformanceEntryData>,\n  replay: ReplayContainer,\n): (data: { metric: Metric }) => void {\n  return ({ metric }) => void replay.replayPerformanceEntries.push(getter(metric));\n}\n\n/**\n * Create replay performance entries from the browser performance entries.\n */\nexport function createPerformanceEntries(\n  entries: AllPerformanceEntry[],\n): ReplayPerformanceEntry<AllPerformanceEntryData>[] {\n  return entries.map(createPerformanceEntry).filter(Boolean) as ReplayPerformanceEntry<AllPerformanceEntryData>[];\n}\n\nfunction createPerformanceEntry(entry: AllPerformanceEntry): ReplayPerformanceEntry<AllPerformanceEntryData> | null {\n  const entryType = ENTRY_TYPES[entry.entryType];\n  if (!entryType) {\n    return null;\n  }\n\n  return entryType(entry);\n}\n\nfunction getAbsoluteTime(time: number): number {\n  // browserPerformanceTimeOrigin can be undefined if `performance` or\n  // `performance.now` doesn't exist, but this is already checked by this integration\n  return ((browserPerformanceTimeOrigin || WINDOW.performance.timeOrigin) + time) / 1000;\n}\n\nfunction createPaintEntry(entry: PerformancePaintTiming): ReplayPerformanceEntry<PaintData> {\n  const { duration, entryType, name, startTime } = entry;\n\n  const start = getAbsoluteTime(startTime);\n  return {\n    type: entryType,\n    name,\n    start,\n    end: start + duration,\n    data: undefined,\n  };\n}\n\nfunction createNavigationEntry(entry: PerformanceNavigationTiming): ReplayPerformanceEntry<NavigationData> | null {\n  const {\n    entryType,\n    name,\n    decodedBodySize,\n    duration,\n    domComplete,\n    encodedBodySize,\n    domContentLoadedEventStart,\n    domContentLoadedEventEnd,\n    domInteractive,\n    loadEventStart,\n    loadEventEnd,\n    redirectCount,\n    startTime,\n    transferSize,\n    type,\n  } = entry;\n\n  // Ignore entries with no duration, they do not seem to be useful and cause dupes\n  if (duration === 0) {\n    return null;\n  }\n\n  return {\n    type: `${entryType}.${type}`,\n    start: getAbsoluteTime(startTime),\n    end: getAbsoluteTime(domComplete),\n    name,\n    data: {\n      size: transferSize,\n      decodedBodySize,\n      encodedBodySize,\n      duration,\n      domInteractive,\n      domContentLoadedEventStart,\n      domContentLoadedEventEnd,\n      loadEventStart,\n      loadEventEnd,\n      domComplete,\n      redirectCount,\n    },\n  };\n}\n\nfunction createResourceEntry(\n  entry: ExperimentalPerformanceResourceTiming,\n): ReplayPerformanceEntry<ResourceData> | null {\n  const {\n    entryType,\n    initiatorType,\n    name,\n    responseEnd,\n    startTime,\n    decodedBodySize,\n    encodedBodySize,\n    responseStatus,\n    transferSize,\n  } = entry;\n\n  // Core SDK handles these\n  if (['fetch', 'xmlhttprequest'].includes(initiatorType)) {\n    return null;\n  }\n\n  return {\n    type: `${entryType}.${initiatorType}`,\n    start: getAbsoluteTime(startTime),\n    end: getAbsoluteTime(responseEnd),\n    name,\n    data: {\n      size: transferSize,\n      statusCode: responseStatus,\n      decodedBodySize,\n      encodedBodySize,\n    },\n  };\n}\n\n/**\n * Add a LCP event to the replay based on a LCP metric.\n */\nexport function getLargestContentfulPaint(metric: Metric): ReplayPerformanceEntry<WebVitalData> {\n  const lastEntry = metric.entries[metric.entries.length - 1] as (PerformanceEntry & { element?: Node }) | undefined;\n  const node = lastEntry && lastEntry.element ? [lastEntry.element] : undefined;\n  return getWebVital(metric, 'largest-contentful-paint', node);\n}\n\nfunction isLayoutShift(entry: PerformanceEntry): entry is LayoutShift {\n  return (entry as LayoutShift).sources !== undefined;\n}\n\n/**\n * Add a CLS event to the replay based on a CLS metric.\n */\nexport function getCumulativeLayoutShift(metric: Metric): ReplayPerformanceEntry<WebVitalData> {\n  const layoutShifts: WebVitalData['attributions'] = [];\n  const nodes: Node[] = [];\n  for (const entry of metric.entries) {\n    if (isLayoutShift(entry)) {\n      const nodeIds = [];\n      for (const source of entry.sources) {\n        if (source.node) {\n          nodes.push(source.node);\n          const nodeId = record.mirror.getId(source.node);\n          if (nodeId) {\n            nodeIds.push(nodeId);\n          }\n        }\n      }\n      layoutShifts.push({ value: entry.value, nodeIds: nodeIds.length ? nodeIds : undefined });\n    }\n  }\n\n  return getWebVital(metric, 'cumulative-layout-shift', nodes, layoutShifts);\n}\n\n/**\n * Add a FID event to the replay based on a FID metric.\n */\nexport function getFirstInputDelay(metric: Metric): ReplayPerformanceEntry<WebVitalData> {\n  const lastEntry = metric.entries[metric.entries.length - 1] as (PerformanceEntry & { target?: Node }) | undefined;\n  const node = lastEntry && lastEntry.target ? [lastEntry.target] : undefined;\n  return getWebVital(metric, 'first-input-delay', node);\n}\n\n/**\n * Add an INP event to the replay based on an INP metric.\n */\nexport function getInteractionToNextPaint(metric: Metric): ReplayPerformanceEntry<WebVitalData> {\n  const lastEntry = metric.entries[metric.entries.length - 1] as (PerformanceEntry & { target?: Node }) | undefined;\n  const node = lastEntry && lastEntry.target ? [lastEntry.target] : undefined;\n  return getWebVital(metric, 'interaction-to-next-paint', node);\n}\n\n/**\n * Add an web vital event to the replay based on the web vital metric.\n */\nfunction getWebVital(\n  metric: Metric,\n  name: string,\n  nodes: Node[] | undefined,\n  attributions?: WebVitalData['attributions'],\n): ReplayPerformanceEntry<WebVitalData> {\n  const value = metric.value;\n  const rating = metric.rating;\n\n  const end = getAbsoluteTime(value);\n\n  return {\n    type: 'web-vital',\n    name,\n    start: end,\n    end,\n    data: {\n      value,\n      size: value,\n      rating,\n      nodeIds: nodes ? nodes.map(node => record.mirror.getId(node)) : undefined,\n      attributions,\n    },\n  };\n}\n","import type { ConsoleLevel, SeverityLevel } from '@sentry/core';\nimport { addBreadcrumb, captureException, logger as coreLogger, severityLevelFromString } from '@sentry/core';\nimport { DEBUG_BUILD } from '../debug-build';\n\ntype ReplayConsoleLevels = Extract<ConsoleLevel, 'info' | 'warn' | 'error' | 'log'>;\nconst CONSOLE_LEVELS: readonly ReplayConsoleLevels[] = ['info', 'warn', 'error', 'log'] as const;\nconst PREFIX = '[Replay] ';\n\ntype LoggerMethod = (...args: unknown[]) => void;\ntype LoggerConsoleMethods = Record<ReplayConsoleLevels, LoggerMethod>;\n\ninterface LoggerConfig {\n  captureExceptions: boolean;\n  traceInternals: boolean;\n}\n\ninterface ReplayLogger extends LoggerConsoleMethods {\n  /**\n   * Calls `logger.info` but saves breadcrumb in the next tick due to race\n   * conditions before replay is initialized.\n   */\n  infoTick: LoggerMethod;\n  /**\n   * Captures exceptions (`Error`) if \"capture internal exceptions\" is enabled\n   */\n  exception: LoggerMethod;\n  /**\n   * Configures the logger with additional debugging behavior\n   */\n  setConfig(config: LoggerConfig): void;\n}\n\nfunction _addBreadcrumb(message: unknown, level: SeverityLevel = 'info'): void {\n  addBreadcrumb(\n    {\n      category: 'console',\n      data: {\n        logger: 'replay',\n      },\n      level,\n      message: `${PREFIX}${message}`,\n    },\n    { level },\n  );\n}\n\nfunction makeReplayLogger(): ReplayLogger {\n  let _capture = false;\n  let _trace = false;\n\n  const _logger: Partial<ReplayLogger> = {\n    exception: () => undefined,\n    infoTick: () => undefined,\n    setConfig: (opts: LoggerConfig) => {\n      _capture = opts.captureExceptions;\n      _trace = opts.traceInternals;\n    },\n  };\n\n  if (DEBUG_BUILD) {\n    CONSOLE_LEVELS.forEach(name => {\n      _logger[name] = (...args: unknown[]) => {\n        coreLogger[name](PREFIX, ...args);\n        if (_trace) {\n          _addBreadcrumb(args.join(''), severityLevelFromString(name));\n        }\n      };\n    });\n\n    _logger.exception = (error: unknown, ...message: unknown[]) => {\n      if (message.length && _logger.error) {\n        _logger.error(...message);\n      }\n\n      coreLogger.error(PREFIX, error);\n\n      if (_capture) {\n        captureException(error);\n      } else if (_trace) {\n        // No need for a breadcrumb if `_capture` is enabled since it should be\n        // captured as an exception\n        _addBreadcrumb(error, 'error');\n      }\n    };\n\n    _logger.infoTick = (...args: unknown[]) => {\n      coreLogger.info(PREFIX, ...args);\n      if (_trace) {\n        // Wait a tick here to avoid race conditions for some initial logs\n        // which may be added before replay is initialized\n        setTimeout(() => _addBreadcrumb(args[0]), 0);\n      }\n    };\n  } else {\n    CONSOLE_LEVELS.forEach(name => {\n      _logger[name] = () => undefined;\n    });\n  }\n\n  return _logger as ReplayLogger;\n}\n\nexport const logger = makeReplayLogger();\n","import { REPLAY_MAX_EVENT_BUFFER_SIZE } from '../constants';\n\n/** This error indicates that the event buffer size exceeded the limit.. */\nexport class EventBufferSizeExceededError extends Error {\n  public constructor() {\n    super(`Event buffer exceeded maximum size of ${REPLAY_MAX_EVENT_BUFFER_SIZE}.`);\n  }\n}\n","import { REPLAY_MAX_EVENT_BUFFER_SIZE } from '../constants';\nimport type { AddEventResult, EventBuffer, EventBufferType, RecordingEvent } from '../types';\nimport { timestampToMs } from '../util/timestamp';\nimport { EventBufferSizeExceededError } from './error';\n\n/**\n * A basic event buffer that does not do any compression.\n * Used as fallback if the compression worker cannot be loaded or is disabled.\n */\nexport class EventBufferArray implements EventBuffer {\n  /** All the events that are buffered to be sent. */\n  public events: RecordingEvent[];\n\n  /** @inheritdoc */\n  public hasCheckout: boolean;\n\n  /** @inheritdoc */\n  public waitForCheckout: boolean;\n\n  private _totalSize: number;\n\n  public constructor() {\n    this.events = [];\n    this._totalSize = 0;\n    this.hasCheckout = false;\n    this.waitForCheckout = false;\n  }\n\n  /** @inheritdoc */\n  public get hasEvents(): boolean {\n    return this.events.length > 0;\n  }\n\n  /** @inheritdoc */\n  public get type(): EventBufferType {\n    return 'sync';\n  }\n\n  /** @inheritdoc */\n  public destroy(): void {\n    this.events = [];\n  }\n\n  /** @inheritdoc */\n  public async addEvent(event: RecordingEvent): Promise<AddEventResult> {\n    const eventSize = JSON.stringify(event).length;\n    this._totalSize += eventSize;\n    if (this._totalSize > REPLAY_MAX_EVENT_BUFFER_SIZE) {\n      throw new EventBufferSizeExceededError();\n    }\n\n    this.events.push(event);\n  }\n\n  /** @inheritdoc */\n  public finish(): Promise<string> {\n    return new Promise<string>(resolve => {\n      // Make a copy of the events array reference and immediately clear the\n      // events member so that we do not lose new events while uploading\n      // attachment.\n      const eventsRet = this.events;\n      this.clear();\n      resolve(JSON.stringify(eventsRet));\n    });\n  }\n\n  /** @inheritdoc */\n  public clear(): void {\n    this.events = [];\n    this._totalSize = 0;\n    this.hasCheckout = false;\n  }\n\n  /** @inheritdoc */\n  public getEarliestTimestamp(): number | null {\n    const timestamp = this.events.map(event => event.timestamp).sort()[0];\n\n    if (!timestamp) {\n      return null;\n    }\n\n    return timestampToMs(timestamp);\n  }\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport type { WorkerRequest, WorkerResponse } from '../types';\nimport { logger } from '../util/logger';\n\n/**\n * Event buffer that uses a web worker to compress events.\n * Exported only for testing.\n */\nexport class WorkerHandler {\n  private _worker: Worker;\n  private _id: number;\n  private _ensureReadyPromise?: Promise<void>;\n\n  public constructor(worker: Worker) {\n    this._worker = worker;\n    this._id = 0;\n  }\n\n  /**\n   * Ensure the worker is ready (or not).\n   * This will either resolve when the worker is ready, or reject if an error occurred.\n   */\n  public ensureReady(): Promise<void> {\n    // Ensure we only check once\n    if (this._ensureReadyPromise) {\n      return this._ensureReadyPromise;\n    }\n\n    this._ensureReadyPromise = new Promise((resolve, reject) => {\n      this._worker.addEventListener(\n        'message',\n        ({ data }: MessageEvent) => {\n          if ((data as WorkerResponse).success) {\n            resolve();\n          } else {\n            reject();\n          }\n        },\n        { once: true },\n      );\n\n      this._worker.addEventListener(\n        'error',\n        error => {\n          reject(error);\n        },\n        { once: true },\n      );\n    });\n\n    return this._ensureReadyPromise;\n  }\n\n  /**\n   * Destroy the worker.\n   */\n  public destroy(): void {\n    DEBUG_BUILD && logger.info('Destroying compression worker');\n    this._worker.terminate();\n  }\n\n  /**\n   * Post message to worker and wait for response before resolving promise.\n   */\n  public postMessage<T>(method: WorkerRequest['method'], arg?: WorkerRequest['arg']): Promise<T> {\n    const id = this._getAndIncrementId();\n\n    return new Promise((resolve, reject) => {\n      const listener = ({ data }: MessageEvent): void => {\n        const response = data as WorkerResponse;\n        if (response.method !== method) {\n          return;\n        }\n\n        // There can be multiple listeners for a single method, the id ensures\n        // that the response matches the caller.\n        if (response.id !== id) {\n          return;\n        }\n\n        // At this point, we'll always want to remove listener regardless of result status\n        this._worker.removeEventListener('message', listener);\n\n        if (!response.success) {\n          // TODO: Do some error handling, not sure what\n          DEBUG_BUILD && logger.error('Error in compression worker: ', response.response);\n\n          reject(new Error('Error in compression worker'));\n          return;\n        }\n\n        resolve(response.response as T);\n      };\n\n      // Note: we can't use `once` option because it's possible it needs to\n      // listen to multiple messages\n      this._worker.addEventListener('message', listener);\n      this._worker.postMessage({ id, method, arg });\n    });\n  }\n\n  /** Get the current ID and increment it for the next call. */\n  private _getAndIncrementId(): number {\n    return this._id++;\n  }\n}\n","import type { ReplayRecordingData } from '@sentry/core';\n\nimport { REPLAY_MAX_EVENT_BUFFER_SIZE } from '../constants';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { AddEventResult, EventBuffer, EventBufferType, RecordingEvent } from '../types';\nimport { logger } from '../util/logger';\nimport { timestampToMs } from '../util/timestamp';\nimport { WorkerHandler } from './WorkerHandler';\nimport { EventBufferSizeExceededError } from './error';\n\n/**\n * Event buffer that uses a web worker to compress events.\n * Exported only for testing.\n */\nexport class EventBufferCompressionWorker implements EventBuffer {\n  /** @inheritdoc */\n  public hasCheckout: boolean;\n\n  /** @inheritdoc */\n  public waitForCheckout: boolean;\n\n  private _worker: WorkerHandler;\n  private _earliestTimestamp: number | null;\n  private _totalSize;\n\n  public constructor(worker: Worker) {\n    this._worker = new WorkerHandler(worker);\n    this._earliestTimestamp = null;\n    this._totalSize = 0;\n    this.hasCheckout = false;\n    this.waitForCheckout = false;\n  }\n\n  /** @inheritdoc */\n  public get hasEvents(): boolean {\n    return !!this._earliestTimestamp;\n  }\n\n  /** @inheritdoc */\n  public get type(): EventBufferType {\n    return 'worker';\n  }\n\n  /**\n   * Ensure the worker is ready (or not).\n   * This will either resolve when the worker is ready, or reject if an error occurred.\n   */\n  public ensureReady(): Promise<void> {\n    return this._worker.ensureReady();\n  }\n\n  /**\n   * Destroy the event buffer.\n   */\n  public destroy(): void {\n    this._worker.destroy();\n  }\n\n  /**\n   * Add an event to the event buffer.\n   *\n   * Returns true if event was successfully received and processed by worker.\n   */\n  public addEvent(event: RecordingEvent): Promise<AddEventResult> {\n    const timestamp = timestampToMs(event.timestamp);\n    if (!this._earliestTimestamp || timestamp < this._earliestTimestamp) {\n      this._earliestTimestamp = timestamp;\n    }\n\n    const data = JSON.stringify(event);\n    this._totalSize += data.length;\n\n    if (this._totalSize > REPLAY_MAX_EVENT_BUFFER_SIZE) {\n      return Promise.reject(new EventBufferSizeExceededError());\n    }\n\n    return this._sendEventToWorker(data);\n  }\n\n  /**\n   * Finish the event buffer and return the compressed data.\n   */\n  public finish(): Promise<ReplayRecordingData> {\n    return this._finishRequest();\n  }\n\n  /** @inheritdoc */\n  public clear(): void {\n    this._earliestTimestamp = null;\n    this._totalSize = 0;\n    this.hasCheckout = false;\n\n    // We do not wait on this, as we assume the order of messages is consistent for the worker\n    this._worker.postMessage('clear').then(null, e => {\n      DEBUG_BUILD && logger.exception(e, 'Sending \"clear\" message to worker failed', e);\n    });\n  }\n\n  /** @inheritdoc */\n  public getEarliestTimestamp(): number | null {\n    return this._earliestTimestamp;\n  }\n\n  /**\n   * Send the event to the worker.\n   */\n  private _sendEventToWorker(data: string): Promise<AddEventResult> {\n    return this._worker.postMessage<void>('addEvent', data);\n  }\n\n  /**\n   * Finish the request and return the compressed data from the worker.\n   */\n  private async _finishRequest(): Promise<Uint8Array> {\n    const response = await this._worker.postMessage<Uint8Array>('finish');\n\n    this._earliestTimestamp = null;\n    this._totalSize = 0;\n\n    return response;\n  }\n}\n","import type { ReplayRecordingData } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { AddEventResult, EventBuffer, EventBufferType, RecordingEvent } from '../types';\nimport { logger } from '../util/logger';\nimport { EventBufferArray } from './EventBufferArray';\nimport { EventBufferCompressionWorker } from './EventBufferCompressionWorker';\n\n/**\n * This proxy will try to use the compression worker, and fall back to use the simple buffer if an error occurs there.\n * This can happen e.g. if the worker cannot be loaded.\n * Exported only for testing.\n */\nexport class EventBufferProxy implements EventBuffer {\n  private _fallback: EventBufferArray;\n  private _compression: EventBufferCompressionWorker;\n  private _used: EventBuffer;\n  private _ensureWorkerIsLoadedPromise: Promise<void>;\n\n  public constructor(worker: Worker) {\n    this._fallback = new EventBufferArray();\n    this._compression = new EventBufferCompressionWorker(worker);\n    this._used = this._fallback;\n\n    this._ensureWorkerIsLoadedPromise = this._ensureWorkerIsLoaded();\n  }\n\n  /** @inheritdoc */\n  public get waitForCheckout(): boolean {\n    return this._used.waitForCheckout;\n  }\n\n  /** @inheritdoc */\n  public get type(): EventBufferType {\n    return this._used.type;\n  }\n\n  /** @inheritDoc */\n  public get hasEvents(): boolean {\n    return this._used.hasEvents;\n  }\n\n  /** @inheritdoc */\n  public get hasCheckout(): boolean {\n    return this._used.hasCheckout;\n  }\n  /** @inheritdoc */\n  public set hasCheckout(value: boolean) {\n    this._used.hasCheckout = value;\n  }\n\n  /** @inheritdoc */\n  // eslint-disable-next-line @typescript-eslint/adjacent-overload-signatures\n  public set waitForCheckout(value: boolean) {\n    this._used.waitForCheckout = value;\n  }\n\n  /** @inheritDoc */\n  public destroy(): void {\n    this._fallback.destroy();\n    this._compression.destroy();\n  }\n\n  /** @inheritdoc */\n  public clear(): void {\n    return this._used.clear();\n  }\n\n  /** @inheritdoc */\n  public getEarliestTimestamp(): number | null {\n    return this._used.getEarliestTimestamp();\n  }\n\n  /**\n   * Add an event to the event buffer.\n   *\n   * Returns true if event was successfully added.\n   */\n  public addEvent(event: RecordingEvent): Promise<AddEventResult> {\n    return this._used.addEvent(event);\n  }\n\n  /** @inheritDoc */\n  public async finish(): Promise<ReplayRecordingData> {\n    // Ensure the worker is loaded, so the sent event is compressed\n    await this.ensureWorkerIsLoaded();\n\n    return this._used.finish();\n  }\n\n  /** Ensure the worker has loaded. */\n  public ensureWorkerIsLoaded(): Promise<void> {\n    return this._ensureWorkerIsLoadedPromise;\n  }\n\n  /** Actually check if the worker has been loaded. */\n  private async _ensureWorkerIsLoaded(): Promise<void> {\n    try {\n      await this._compression.ensureReady();\n    } catch (error) {\n      // If the worker fails to load, we fall back to the simple buffer.\n      // Nothing more to do from our side here\n      DEBUG_BUILD && logger.exception(error, 'Failed to load the compression worker, falling back to simple buffer');\n      return;\n    }\n\n    // Now we need to switch over the array buffer to the compression worker\n    await this._switchToCompressionWorker();\n  }\n\n  /** Switch the used buffer to the compression worker. */\n  private async _switchToCompressionWorker(): Promise<void> {\n    const { events, hasCheckout, waitForCheckout } = this._fallback;\n\n    const addEventPromises: Promise<void>[] = [];\n    for (const event of events) {\n      addEventPromises.push(this._compression.addEvent(event));\n    }\n\n    this._compression.hasCheckout = hasCheckout;\n    this._compression.waitForCheckout = waitForCheckout;\n\n    // We switch over to the new buffer immediately - any further events will be added\n    // after the previously buffered ones\n    this._used = this._compression;\n\n    // Wait for original events to be re-added before resolving\n    try {\n      await Promise.all(addEventPromises);\n\n      // Can now clear fallback buffer as it's no longer necessary\n      this._fallback.clear();\n    } catch (error) {\n      DEBUG_BUILD && logger.exception(error, 'Failed to add events when switching buffers.');\n    }\n  }\n}\n","import { WINDOW } from '../constants';\n\n/** If sessionStorage is available. */\nexport function hasSessionStorage(): boolean {\n  try {\n    // This can throw, e.g. when being accessed in a sandboxed iframe\n    return 'sessionStorage' in WINDOW && !!WINDOW.sessionStorage;\n  } catch {\n    return false;\n  }\n}\n","/**\n * Given a sample rate, returns true if replay should be sampled.\n *\n * 1.0 = 100% sampling\n * 0.0 = 0% sampling\n */\nexport function isSampled(sampleRate?: number): boolean {\n  if (sampleRate === undefined) {\n    return false;\n  }\n\n  // Math.random() returns a number in range of 0 to 1 (inclusive of 0, but not 1)\n  return Math.random() < sampleRate;\n}\n","import { uuid4 } from '@sentry/core';\n\nimport type { Sampled, Session } from '../types';\n\n/**\n * Get a session with defaults & applied sampling.\n */\nexport function makeSession(session: Partial<Session> & { sampled: Sampled }): Session {\n  const now = Date.now();\n  const id = session.id || uuid4();\n  // Note that this means we cannot set a started/lastActivity of `0`, but this should not be relevant outside of tests.\n  const started = session.started || now;\n  const lastActivity = session.lastActivity || now;\n  const segmentId = session.segmentId || 0;\n  const sampled = session.sampled;\n  const previousSessionId = session.previousSessionId;\n\n  return {\n    id,\n    started,\n    lastActivity,\n    segmentId,\n    sampled,\n    previousSessionId,\n  };\n}\n","import { REPLAY_SESSION_KEY, WINDOW } from '../constants';\nimport type { Session } from '../types';\nimport { hasSessionStorage } from '../util/hasSessionStorage';\n\n/**\n * Save a session to session storage.\n */\nexport function saveSession(session: Session): void {\n  if (!hasSessionStorage()) {\n    return;\n  }\n\n  try {\n    WINDOW.sessionStorage.setItem(REPLAY_SESSION_KEY, JSON.stringify(session));\n  } catch {\n    // Ignore potential SecurityError exceptions\n  }\n}\n","import type { Sampled, Session, SessionOptions } from '../types';\nimport { isSampled } from '../util/isSampled';\nimport { makeSession } from './Session';\nimport { saveSession } from './saveSession';\n\n/**\n * Get the sampled status for a session based on sample rates & current sampled status.\n */\nexport function getSessionSampleType(sessionSampleRate: number, allowBuffering: boolean): Sampled {\n  return isSampled(sessionSampleRate) ? 'session' : allowBuffering ? 'buffer' : false;\n}\n\n/**\n * Create a new session, which in its current implementation is a Sentry event\n * that all replays will be saved to as attachments. Currently, we only expect\n * one of these Sentry events per \"replay session\".\n */\nexport function createSession(\n  { sessionSampleRate, allowBuffering, stickySession = false }: SessionOptions,\n  { previousSessionId }: { previousSessionId?: string } = {},\n): Session {\n  const sampled = getSessionSampleType(sessionSampleRate, allowBuffering);\n  const session = makeSession({\n    sampled,\n    previousSessionId,\n  });\n\n  if (stickySession) {\n    saveSession(session);\n  }\n\n  return session;\n}\n","/**\n * Given an initial timestamp and an expiry duration, checks to see if current\n * time should be considered as expired.\n */\nexport function isExpired(\n  initialTime: null | number,\n  expiry: undefined | number,\n  targetTime: number = +new Date(),\n): boolean {\n  // Always expired if < 0\n  if (initialTime === null || expiry === undefined || expiry < 0) {\n    return true;\n  }\n\n  // Never expires if == 0\n  if (expiry === 0) {\n    return false;\n  }\n\n  return initialTime + expiry <= targetTime;\n}\n","import type { Session } from '../types';\nimport { isExpired } from './isExpired';\n\n/**\n * Checks to see if session is expired\n */\nexport function isSessionExpired(\n  session: Session,\n  {\n    maxReplayDuration,\n    sessionIdleExpire,\n    targetTime = Date.now(),\n  }: { maxReplayDuration: number; sessionIdleExpire: number; targetTime?: number },\n): boolean {\n  return (\n    // First, check that maximum session length has not been exceeded\n    isExpired(session.started, maxReplayDuration, targetTime) ||\n    // check that the idle timeout has not been exceeded (i.e. user has\n    // performed an action within the last `sessionIdleExpire` ms)\n    isExpired(session.lastActivity, sessionIdleExpire, targetTime)\n  );\n}\n","import type { Session } from '../types';\nimport { isSessionExpired } from '../util/isSessionExpired';\n\n/** If the session should be refreshed or not. */\nexport function shouldRefreshSession(\n  session: Session,\n  { sessionIdleExpire, maxReplayDuration }: { sessionIdleExpire: number; maxReplayDuration: number },\n): boolean {\n  // If not expired, all good, just keep the session\n  if (!isSessionExpired(session, { sessionIdleExpire, maxReplayDuration })) {\n    return false;\n  }\n\n  // If we are buffering & haven't ever flushed yet, always continue\n  if (session.sampled === 'buffer' && session.segmentId === 0) {\n    return false;\n  }\n\n  return true;\n}\n","import { DEBUG_BUILD } from '../debug-build';\nimport type { Session, SessionOptions } from '../types';\nimport { logger } from '../util/logger';\nimport { createSession } from './createSession';\nimport { fetchSession } from './fetchSession';\nimport { shouldRefreshSession } from './shouldRefreshSession';\n\n/**\n * Get or create a session, when initializing the replay.\n * Returns a session that may be unsampled.\n */\nexport function loadOrCreateSession(\n  {\n    sessionIdleExpire,\n    maxReplayDuration,\n    previousSessionId,\n  }: {\n    sessionIdleExpire: number;\n    maxReplayDuration: number;\n    previousSessionId?: string;\n  },\n  sessionOptions: SessionOptions,\n): Session {\n  const existingSession = sessionOptions.stickySession && fetchSession();\n\n  // No session exists yet, just create a new one\n  if (!existingSession) {\n    DEBUG_BUILD && logger.infoTick('Creating new session');\n    return createSession(sessionOptions, { previousSessionId });\n  }\n\n  if (!shouldRefreshSession(existingSession, { sessionIdleExpire, maxReplayDuration })) {\n    return existingSession;\n  }\n\n  DEBUG_BUILD && logger.infoTick('Session in sessionStorage is expired, creating new one...');\n  return createSession(sessionOptions, { previousSessionId: existingSession.id });\n}\n","import { REPLAY_SESSION_KEY, WINDOW } from '../constants';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Session } from '../types';\nimport { hasSessionStorage } from '../util/hasSessionStorage';\nimport { logger } from '../util/logger';\nimport { makeSession } from './Session';\n\n/**\n * Fetches a session from storage\n */\nexport function fetchSession(): Session | null {\n  if (!hasSessionStorage()) {\n    return null;\n  }\n\n  try {\n    // This can throw if cookies are disabled\n    const sessionStringFromStorage = WINDOW.sessionStorage.getItem(REPLAY_SESSION_KEY);\n\n    if (!sessionStringFromStorage) {\n      return null;\n    }\n\n    const sessionObj = JSON.parse(sessionStringFromStorage) as Session;\n\n    DEBUG_BUILD && logger.infoTick('Loading existing session');\n\n    return makeSession(sessionObj);\n  } catch {\n    return null;\n  }\n}\n","import { EventType } from '@sentry-internal/rrweb';\nimport { getClient } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport { EventBufferSizeExceededError } from '../eventBuffer/error';\nimport type { AddEventResult, RecordingEvent, ReplayContainer, ReplayFrameEvent, ReplayPluginOptions } from '../types';\nimport { logger } from './logger';\nimport { timestampToMs } from './timestamp';\n\nfunction isCustomEvent(event: RecordingEvent): event is ReplayFrameEvent {\n  return event.type === EventType.Custom;\n}\n\n/**\n * Add an event to the event buffer.\n * In contrast to `addEvent`, this does not return a promise & does not wait for the adding of the event to succeed/fail.\n * Instead this returns `true` if we tried to add the event, else false.\n * It returns `false` e.g. if we are paused, disabled, or out of the max replay duration.\n *\n * `isCheckout` is true if this is either the very first event, or an event triggered by `checkoutEveryNms`.\n */\nexport function addEventSync(replay: ReplayContainer, event: RecordingEvent, isCheckout?: boolean): boolean {\n  if (!shouldAddEvent(replay, event)) {\n    return false;\n  }\n\n  // This should never reject\n  // eslint-disable-next-line @typescript-eslint/no-floating-promises\n  _addEvent(replay, event, isCheckout);\n\n  return true;\n}\n\n/**\n * Add an event to the event buffer.\n * Resolves to `null` if no event was added, else to `void`.\n *\n * `isCheckout` is true if this is either the very first event, or an event triggered by `checkoutEveryNms`.\n */\nexport function addEvent(\n  replay: ReplayContainer,\n  event: RecordingEvent,\n  isCheckout?: boolean,\n): Promise<AddEventResult | null> {\n  if (!shouldAddEvent(replay, event)) {\n    return Promise.resolve(null);\n  }\n\n  return _addEvent(replay, event, isCheckout);\n}\n\nasync function _addEvent(\n  replay: ReplayContainer,\n  event: RecordingEvent,\n  isCheckout?: boolean,\n): Promise<AddEventResult | null> {\n  const { eventBuffer } = replay;\n\n  if (!eventBuffer || (eventBuffer.waitForCheckout && !isCheckout)) {\n    return null;\n  }\n\n  const isBufferMode = replay.recordingMode === 'buffer';\n\n  try {\n    if (isCheckout && isBufferMode) {\n      eventBuffer.clear();\n    }\n\n    if (isCheckout) {\n      eventBuffer.hasCheckout = true;\n      eventBuffer.waitForCheckout = false;\n    }\n\n    const replayOptions = replay.getOptions();\n\n    const eventAfterPossibleCallback = maybeApplyCallback(event, replayOptions.beforeAddRecordingEvent);\n\n    if (!eventAfterPossibleCallback) {\n      return;\n    }\n\n    return await eventBuffer.addEvent(eventAfterPossibleCallback);\n  } catch (error) {\n    const isExceeded = error && error instanceof EventBufferSizeExceededError;\n    const reason = isExceeded ? 'addEventSizeExceeded' : 'addEvent';\n\n    if (isExceeded && isBufferMode) {\n      // Clear buffer and wait for next checkout\n      eventBuffer.clear();\n      eventBuffer.waitForCheckout = true;\n\n      return null;\n    }\n\n    replay.handleException(error);\n\n    await replay.stop({ reason });\n\n    const client = getClient();\n\n    if (client) {\n      client.recordDroppedEvent('internal_sdk_error', 'replay');\n    }\n  }\n}\n\n/** Exported only for tests. */\nexport function shouldAddEvent(replay: ReplayContainer, event: RecordingEvent): boolean {\n  if (!replay.eventBuffer || replay.isPaused() || !replay.isEnabled()) {\n    return false;\n  }\n\n  const timestampInMs = timestampToMs(event.timestamp);\n\n  // Throw out events that happen more than 5 minutes ago. This can happen if\n  // page has been left open and idle for a long period of time and user\n  // comes back to trigger a new session. The performance entries rely on\n  // `performance.timeOrigin`, which is when the page first opened.\n  if (timestampInMs + replay.timeouts.sessionIdlePause < Date.now()) {\n    return false;\n  }\n\n  // Throw out events that are +60min from the initial timestamp\n  if (timestampInMs > replay.getContext().initialTimestamp + replay.getOptions().maxReplayDuration) {\n    DEBUG_BUILD &&\n      logger.infoTick(`Skipping event with timestamp ${timestampInMs} because it is after maxReplayDuration`);\n    return false;\n  }\n\n  return true;\n}\n\nfunction maybeApplyCallback(\n  event: RecordingEvent,\n  callback: ReplayPluginOptions['beforeAddRecordingEvent'],\n): RecordingEvent | null | undefined {\n  try {\n    if (typeof callback === 'function' && isCustomEvent(event)) {\n      return callback(event);\n    }\n  } catch (error) {\n    DEBUG_BUILD &&\n      logger.exception(error, 'An error occurred in the `beforeAddRecordingEvent` callback, skipping the event...');\n    return null;\n  }\n\n  return event;\n}\n","import type { ErrorEvent, Event, FeedbackEvent, ReplayEvent, TransactionEvent } from '@sentry/core';\n\n/** If the event is an error event */\nexport function isErrorEvent(event: Event): event is ErrorEvent {\n  return !event.type;\n}\n\n/** If the event is a transaction event */\nexport function isTransactionEvent(event: Event): event is TransactionEvent {\n  return event.type === 'transaction';\n}\n\n/** If the event is an replay event */\nexport function isReplayEvent(event: Event): event is ReplayEvent {\n  return event.type === 'replay_event';\n}\n\n/** If the event is a feedback event */\nexport function isFeedbackEvent(event: Event): event is FeedbackEvent {\n  return event.type === 'feedback';\n}\n","import type { Breadcrumb } from '@sentry/core';\nimport { getClient, normalize } from '@sentry/core';\nimport { CONSOLE_ARG_MAX_SIZE } from '../constants';\nimport type { ReplayContainer } from '../types';\nimport type { ReplayFrame } from '../types/replayFrame';\nimport { createBreadcrumb } from '../util/createBreadcrumb';\nimport { addBreadcrumbEvent } from './util/addBreadcrumbEvent';\n\ntype BreadcrumbWithCategory = Required<Pick<Breadcrumb, 'category'>>;\n\n/**\n * Handle breadcrumbs that Sentry captures, and make sure to capture relevant breadcrumbs to Replay as well.\n */\nexport function handleBreadcrumbs(replay: ReplayContainer): void {\n  const client = getClient();\n\n  if (!client) {\n    return;\n  }\n\n  client.on('beforeAddBreadcrumb', breadcrumb => beforeAddBreadcrumb(replay, breadcrumb));\n}\n\nfunction beforeAddBreadcrumb(replay: ReplayContainer, breadcrumb: Breadcrumb): void {\n  if (!replay.isEnabled() || !isBreadcrumbWithCategory(breadcrumb)) {\n    return;\n  }\n\n  const result = normalizeBreadcrumb(breadcrumb);\n  if (result) {\n    addBreadcrumbEvent(replay, result);\n  }\n}\n\n/** Exported only for tests. */\nexport function normalizeBreadcrumb(breadcrumb: Breadcrumb): Breadcrumb | null {\n  if (\n    !isBreadcrumbWithCategory(breadcrumb) ||\n    [\n      // fetch & xhr are handled separately,in handleNetworkBreadcrumbs\n      'fetch',\n      'xhr',\n      // These two are breadcrumbs for emitted sentry events, we don't care about them\n      'sentry.event',\n      'sentry.transaction',\n    ].includes(breadcrumb.category) ||\n    // We capture UI breadcrumbs separately\n    breadcrumb.category.startsWith('ui.')\n  ) {\n    return null;\n  }\n\n  if (breadcrumb.category === 'console') {\n    return normalizeConsoleBreadcrumb(breadcrumb);\n  }\n\n  return createBreadcrumb(breadcrumb);\n}\n\n/** exported for tests only */\nexport function normalizeConsoleBreadcrumb(\n  breadcrumb: Omit<Breadcrumb, 'category'> & BreadcrumbWithCategory,\n): ReplayFrame {\n  const args = breadcrumb.data && breadcrumb.data.arguments;\n\n  if (!Array.isArray(args) || args.length === 0) {\n    return createBreadcrumb(breadcrumb);\n  }\n\n  let isTruncated = false;\n\n  // Avoid giant args captures\n  const normalizedArgs = args.map(arg => {\n    if (!arg) {\n      return arg;\n    }\n    if (typeof arg === 'string') {\n      if (arg.length > CONSOLE_ARG_MAX_SIZE) {\n        isTruncated = true;\n        return `${arg.slice(0, CONSOLE_ARG_MAX_SIZE)}…`;\n      }\n\n      return arg;\n    }\n    if (typeof arg === 'object') {\n      try {\n        const normalizedArg = normalize(arg, 7);\n        const stringified = JSON.stringify(normalizedArg);\n        if (stringified.length > CONSOLE_ARG_MAX_SIZE) {\n          isTruncated = true;\n          // We use the pretty printed JSON string here as a base\n          return `${JSON.stringify(normalizedArg, null, 2).slice(0, CONSOLE_ARG_MAX_SIZE)}…`;\n        }\n        return normalizedArg;\n      } catch {\n        // fall back to default\n      }\n    }\n\n    return arg;\n  });\n\n  return createBreadcrumb({\n    ...breadcrumb,\n    data: {\n      ...breadcrumb.data,\n      arguments: normalizedArgs,\n      ...(isTruncated ? { _meta: { warnings: ['CONSOLE_ARG_TRUNCATED'] } } : {}),\n    },\n  });\n}\n\nfunction isBreadcrumbWithCategory(breadcrumb: Breadcrumb): breadcrumb is BreadcrumbWithCategory {\n  return !!breadcrumb.category;\n}\n","import { getActiveSpan, getCurrentScope, getDynamicSamplingContextFromSpan } from '@sentry/core';\nimport type { DynamicSamplingContext } from '@sentry/core';\n\n/**\n * Reset the `replay_id` field on the DSC.\n */\nexport function resetReplayIdOnDynamicSamplingContext(): void {\n  // Reset DSC on the current scope, if there is one\n  const dsc = getCurrentScope().getPropagationContext().dsc;\n  if (dsc) {\n    delete dsc.replay_id;\n  }\n\n  // Clear it from frozen DSC on the active span\n  const activeSpan = getActiveSpan();\n  if (activeSpan) {\n    const dsc = getDynamicSamplingContextFromSpan(activeSpan);\n    delete (dsc as Partial<DynamicSamplingContext>).replay_id;\n  }\n}\n","import { EventType } from '@sentry-internal/rrweb';\n\nimport type { AddEventResult, AllEntryData, ReplayContainer, ReplayPerformanceEntry } from '../types';\n\n/**\n * Create a \"span\" for each performance entry.\n */\nexport function createPerformanceSpans(\n  replay: ReplayContainer,\n  entries: ReplayPerformanceEntry<AllEntryData>[],\n): Promise<AddEventResult | null>[] {\n  return entries.map(({ type, start, end, name, data }) => {\n    const response = replay.throttledAddEvent({\n      type: EventType.Custom,\n      timestamp: start,\n      data: {\n        tag: 'performanceSpan',\n        payload: {\n          op: type,\n          description: name,\n          startTimestamp: start,\n          endTimestamp: end,\n          data,\n        },\n      },\n    });\n\n    // If response is a string, it means its either THROTTLED or SKIPPED\n    return typeof response === 'string' ? Promise.resolve(null) : response;\n  });\n}\n","import type { NetworkRequestData, ReplayContainer, ReplayPerformanceEntry } from '../../types';\nimport { createPerformanceSpans } from '../../util/createPerformanceSpans';\nimport { shouldFilterRequest } from '../../util/shouldFilterRequest';\n\n/** Add a performance entry breadcrumb */\nexport function addNetworkBreadcrumb(\n  replay: ReplayContainer,\n  result: ReplayPerformanceEntry<NetworkRequestData> | null,\n): void {\n  if (!replay.isEnabled()) {\n    return;\n  }\n\n  if (result === null) {\n    return;\n  }\n\n  if (shouldFilterRequest(replay, result.name)) {\n    return;\n  }\n\n  replay.addUpdate(() => {\n    createPerformanceSpans(replay, [result]);\n    // Returning true will cause `addUpdate` to not flush\n    // We do not want network requests to cause a flush. This will prevent\n    // recurring/polling requests from keeping the replay session alive.\n    return true;\n  });\n}\n","import { getClient, isSentryRequestUrl } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { ReplayContainer } from '../types';\n\n/**\n * Check whether a given request URL should be filtered out. This is so we\n * don't log Sentry ingest requests.\n */\nexport function shouldFilterRequest(replay: ReplayContainer, url: string): boolean {\n  // If we enabled the `traceInternals` experiment, we want to trace everything\n  if (DEBUG_BUILD && replay.getOptions()._experiments.traceInternals) {\n    return false;\n  }\n\n  return isSentryRequestUrl(url, getClient());\n}\n","import { dropUndefinedKeys, stringMatchesSomePattern } from '@sentry/core';\n\nimport { NETWORK_BODY_MAX_SIZE, WINDOW } from '../../constants';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type {\n  NetworkBody,\n  NetworkMetaWarning,\n  NetworkRequestData,\n  ReplayNetworkRequestData,\n  ReplayNetworkRequestOrResponse,\n  ReplayPerformanceEntry,\n} from '../../types';\nimport { logger } from '../../util/logger';\n\n/** Get the size of a body. */\nexport function getBodySize(body: RequestInit['body']): number | undefined {\n  if (!body) {\n    return undefined;\n  }\n\n  const textEncoder = new TextEncoder();\n\n  try {\n    if (typeof body === 'string') {\n      return textEncoder.encode(body).length;\n    }\n\n    if (body instanceof URLSearchParams) {\n      return textEncoder.encode(body.toString()).length;\n    }\n\n    if (body instanceof FormData) {\n      const formDataStr = _serializeFormData(body);\n      return textEncoder.encode(formDataStr).length;\n    }\n\n    if (body instanceof Blob) {\n      return body.size;\n    }\n\n    if (body instanceof ArrayBuffer) {\n      return body.byteLength;\n    }\n\n    // Currently unhandled types: ArrayBufferView, ReadableStream\n  } catch {\n    // just return undefined\n  }\n\n  return undefined;\n}\n\n/** Convert a Content-Length header to number/undefined.  */\nexport function parseContentLengthHeader(header: string | null | undefined): number | undefined {\n  if (!header) {\n    return undefined;\n  }\n\n  const size = parseInt(header, 10);\n  return isNaN(size) ? undefined : size;\n}\n\n/** Get the string representation of a body. */\nexport function getBodyString(body: unknown): [string | undefined, NetworkMetaWarning?] {\n  try {\n    if (typeof body === 'string') {\n      return [body];\n    }\n\n    if (body instanceof URLSearchParams) {\n      return [body.toString()];\n    }\n\n    if (body instanceof FormData) {\n      return [_serializeFormData(body)];\n    }\n\n    if (!body) {\n      return [undefined];\n    }\n  } catch (error) {\n    DEBUG_BUILD && logger.exception(error, 'Failed to serialize body', body);\n    return [undefined, 'BODY_PARSE_ERROR'];\n  }\n\n  DEBUG_BUILD && logger.info('Skipping network body because of body type', body);\n\n  return [undefined, 'UNPARSEABLE_BODY_TYPE'];\n}\n\n/** Merge a warning into an existing network request/response. */\nexport function mergeWarning(\n  info: ReplayNetworkRequestOrResponse | undefined,\n  warning: NetworkMetaWarning,\n): ReplayNetworkRequestOrResponse {\n  if (!info) {\n    return {\n      headers: {},\n      size: undefined,\n      _meta: {\n        warnings: [warning],\n      },\n    };\n  }\n\n  const newMeta = { ...info._meta };\n  const existingWarnings = newMeta.warnings || [];\n  newMeta.warnings = [...existingWarnings, warning];\n\n  info._meta = newMeta;\n  return info;\n}\n\n/** Convert ReplayNetworkRequestData to a PerformanceEntry. */\nexport function makeNetworkReplayBreadcrumb(\n  type: string,\n  data: ReplayNetworkRequestData | null,\n): ReplayPerformanceEntry<NetworkRequestData> | null {\n  if (!data) {\n    return null;\n  }\n\n  const { startTimestamp, endTimestamp, url, method, statusCode, request, response } = data;\n\n  const result: ReplayPerformanceEntry<NetworkRequestData> = {\n    type,\n    start: startTimestamp / 1000,\n    end: endTimestamp / 1000,\n    name: url,\n    data: dropUndefinedKeys({\n      method,\n      statusCode,\n      request,\n      response,\n    }),\n  };\n\n  return result;\n}\n\n/** Build the request or response part of a replay network breadcrumb that was skipped. */\nexport function buildSkippedNetworkRequestOrResponse(bodySize: number | undefined): ReplayNetworkRequestOrResponse {\n  return {\n    headers: {},\n    size: bodySize,\n    _meta: {\n      warnings: ['URL_SKIPPED'],\n    },\n  };\n}\n\n/** Build the request or response part of a replay network breadcrumb. */\nexport function buildNetworkRequestOrResponse(\n  headers: Record<string, string>,\n  bodySize: number | undefined,\n  body: string | undefined,\n): ReplayNetworkRequestOrResponse | undefined {\n  if (!bodySize && Object.keys(headers).length === 0) {\n    return undefined;\n  }\n\n  if (!bodySize) {\n    return {\n      headers,\n    };\n  }\n\n  if (!body) {\n    return {\n      headers,\n      size: bodySize,\n    };\n  }\n\n  const info: ReplayNetworkRequestOrResponse = {\n    headers,\n    size: bodySize,\n  };\n\n  const { body: normalizedBody, warnings } = normalizeNetworkBody(body);\n  info.body = normalizedBody;\n  if (warnings && warnings.length > 0) {\n    info._meta = {\n      warnings,\n    };\n  }\n\n  return info;\n}\n\n/** Filter a set of headers */\nexport function getAllowedHeaders(headers: Record<string, string>, allowedHeaders: string[]): Record<string, string> {\n  return Object.entries(headers).reduce((filteredHeaders: Record<string, string>, [key, value]) => {\n    const normalizedKey = key.toLowerCase();\n    // Avoid putting empty strings into the headers\n    if (allowedHeaders.includes(normalizedKey) && headers[key]) {\n      filteredHeaders[normalizedKey] = value;\n    }\n    return filteredHeaders;\n  }, {});\n}\n\nfunction _serializeFormData(formData: FormData): string {\n  // This is a bit simplified, but gives us a decent estimate\n  // This converts e.g. { name: 'Anne Smith', age: 13 } to 'name=Anne+Smith&age=13'\n  // @ts-expect-error passing FormData to URLSearchParams actually works\n  return new URLSearchParams(formData).toString();\n}\n\nfunction normalizeNetworkBody(body: string | undefined): {\n  body: NetworkBody | undefined;\n  warnings?: NetworkMetaWarning[];\n} {\n  if (!body || typeof body !== 'string') {\n    return {\n      body,\n    };\n  }\n\n  const exceedsSizeLimit = body.length > NETWORK_BODY_MAX_SIZE;\n  const isProbablyJson = _strIsProbablyJson(body);\n\n  if (exceedsSizeLimit) {\n    const truncatedBody = body.slice(0, NETWORK_BODY_MAX_SIZE);\n\n    if (isProbablyJson) {\n      return {\n        body: truncatedBody,\n        warnings: ['MAYBE_JSON_TRUNCATED'],\n      };\n    }\n\n    return {\n      body: `${truncatedBody}…`,\n      warnings: ['TEXT_TRUNCATED'],\n    };\n  }\n\n  if (isProbablyJson) {\n    try {\n      const jsonBody = JSON.parse(body);\n      return {\n        body: jsonBody,\n      };\n    } catch {\n      // fall back to just send the body as string\n    }\n  }\n\n  return {\n    body,\n  };\n}\n\nfunction _strIsProbablyJson(str: string): boolean {\n  const first = str[0];\n  const last = str[str.length - 1];\n\n  // Simple check: If this does not start & end with {} or [], it's not JSON\n  return (first === '[' && last === ']') || (first === '{' && last === '}');\n}\n\n/** Match an URL against a list of strings/Regex. */\nexport function urlMatches(url: string, urls: (string | RegExp)[]): boolean {\n  const fullUrl = getFullUrl(url);\n\n  return stringMatchesSomePattern(fullUrl, urls);\n}\n\n/** exported for tests */\nexport function getFullUrl(url: string, baseURI = WINDOW.document.baseURI): string {\n  // Short circuit for common cases:\n  if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith(WINDOW.location.origin)) {\n    return url;\n  }\n  const fixedUrl = new URL(url, baseURI);\n\n  // If these do not match, we are not dealing with a relative URL, so just return it\n  if (fixedUrl.origin !== new URL(baseURI).origin) {\n    return url;\n  }\n\n  const fullUrl = fixedUrl.href;\n\n  // Remove trailing slashes, if they don't match the original URL\n  if (!url.endsWith('/') && fullUrl.endsWith('/')) {\n    return fullUrl.slice(0, -1);\n  }\n\n  return fullUrl;\n}\n","import { setTimeout } from '@sentry-internal/browser-utils';\nimport type { Breadcrumb, FetchBreadcrumbData } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type {\n  FetchHint,\n  NetworkMetaWarning,\n  ReplayContainer,\n  ReplayNetworkOptions,\n  ReplayNetworkRequestData,\n  ReplayNetworkRequestOrResponse,\n} from '../../types';\nimport { logger } from '../../util/logger';\nimport { addNetworkBreadcrumb } from './addNetworkBreadcrumb';\nimport {\n  buildNetworkRequestOrResponse,\n  buildSkippedNetworkRequestOrResponse,\n  getAllowedHeaders,\n  getBodySize,\n  getBodyString,\n  makeNetworkReplayBreadcrumb,\n  mergeWarning,\n  parseContentLengthHeader,\n  urlMatches,\n} from './networkUtils';\n\n/**\n * Capture a fetch breadcrumb to a replay.\n * This adds additional data (where appropriate).\n */\nexport async function captureFetchBreadcrumbToReplay(\n  breadcrumb: Breadcrumb & { data: FetchBreadcrumbData },\n  hint: Partial<FetchHint>,\n  options: ReplayNetworkOptions & {\n    replay: ReplayContainer;\n  },\n): Promise<void> {\n  try {\n    const data = await _prepareFetchData(breadcrumb, hint, options);\n\n    // Create a replay performance entry from this breadcrumb\n    const result = makeNetworkReplayBreadcrumb('resource.fetch', data);\n    addNetworkBreadcrumb(options.replay, result);\n  } catch (error) {\n    DEBUG_BUILD && logger.exception(error, 'Failed to capture fetch breadcrumb');\n  }\n}\n\n/**\n * Enrich a breadcrumb with additional data.\n * This has to be sync & mutate the given breadcrumb,\n * as the breadcrumb is afterwards consumed by other handlers.\n */\nexport function enrichFetchBreadcrumb(\n  breadcrumb: Breadcrumb & { data: FetchBreadcrumbData },\n  hint: Partial<FetchHint>,\n): void {\n  const { input, response } = hint;\n\n  const body = input ? _getFetchRequestArgBody(input) : undefined;\n  const reqSize = getBodySize(body);\n\n  const resSize = response ? parseContentLengthHeader(response.headers.get('content-length')) : undefined;\n\n  if (reqSize !== undefined) {\n    breadcrumb.data.request_body_size = reqSize;\n  }\n  if (resSize !== undefined) {\n    breadcrumb.data.response_body_size = resSize;\n  }\n}\n\nasync function _prepareFetchData(\n  breadcrumb: Breadcrumb & { data: FetchBreadcrumbData },\n  hint: Partial<FetchHint>,\n  options: ReplayNetworkOptions,\n): Promise<ReplayNetworkRequestData> {\n  const now = Date.now();\n  const { startTimestamp = now, endTimestamp = now } = hint;\n\n  const {\n    url,\n    method,\n    status_code: statusCode = 0,\n    request_body_size: requestBodySize,\n    response_body_size: responseBodySize,\n  } = breadcrumb.data;\n\n  const captureDetails =\n    urlMatches(url, options.networkDetailAllowUrls) && !urlMatches(url, options.networkDetailDenyUrls);\n\n  const request = captureDetails\n    ? _getRequestInfo(options, hint.input, requestBodySize)\n    : buildSkippedNetworkRequestOrResponse(requestBodySize);\n  const response = await _getResponseInfo(captureDetails, options, hint.response, responseBodySize);\n\n  return {\n    startTimestamp,\n    endTimestamp,\n    url,\n    method,\n    statusCode,\n    request,\n    response,\n  };\n}\n\nfunction _getRequestInfo(\n  { networkCaptureBodies, networkRequestHeaders }: ReplayNetworkOptions,\n  input: FetchHint['input'] | undefined,\n  requestBodySize?: number,\n): ReplayNetworkRequestOrResponse | undefined {\n  const headers = input ? getRequestHeaders(input, networkRequestHeaders) : {};\n\n  if (!networkCaptureBodies) {\n    return buildNetworkRequestOrResponse(headers, requestBodySize, undefined);\n  }\n\n  // We only want to transmit string or string-like bodies\n  const requestBody = _getFetchRequestArgBody(input);\n  const [bodyStr, warning] = getBodyString(requestBody);\n  const data = buildNetworkRequestOrResponse(headers, requestBodySize, bodyStr);\n\n  if (warning) {\n    return mergeWarning(data, warning);\n  }\n\n  return data;\n}\n\n/** Exported only for tests. */\nexport async function _getResponseInfo(\n  captureDetails: boolean,\n  {\n    networkCaptureBodies,\n    networkResponseHeaders,\n  }: Pick<ReplayNetworkOptions, 'networkCaptureBodies' | 'networkResponseHeaders'>,\n  response: Response | undefined,\n  responseBodySize?: number,\n): Promise<ReplayNetworkRequestOrResponse | undefined> {\n  if (!captureDetails && responseBodySize !== undefined) {\n    return buildSkippedNetworkRequestOrResponse(responseBodySize);\n  }\n\n  const headers = response ? getAllHeaders(response.headers, networkResponseHeaders) : {};\n\n  if (!response || (!networkCaptureBodies && responseBodySize !== undefined)) {\n    return buildNetworkRequestOrResponse(headers, responseBodySize, undefined);\n  }\n\n  const [bodyText, warning] = await _parseFetchResponseBody(response);\n  const result = getResponseData(bodyText, {\n    networkCaptureBodies,\n\n    responseBodySize,\n    captureDetails,\n    headers,\n  });\n\n  if (warning) {\n    return mergeWarning(result, warning);\n  }\n\n  return result;\n}\n\nfunction getResponseData(\n  bodyText: string | undefined,\n  {\n    networkCaptureBodies,\n    responseBodySize,\n    captureDetails,\n    headers,\n  }: {\n    captureDetails: boolean;\n    networkCaptureBodies: boolean;\n    responseBodySize: number | undefined;\n    headers: Record<string, string>;\n  },\n): ReplayNetworkRequestOrResponse | undefined {\n  try {\n    const size =\n      bodyText && bodyText.length && responseBodySize === undefined ? getBodySize(bodyText) : responseBodySize;\n\n    if (!captureDetails) {\n      return buildSkippedNetworkRequestOrResponse(size);\n    }\n\n    if (networkCaptureBodies) {\n      return buildNetworkRequestOrResponse(headers, size, bodyText);\n    }\n\n    return buildNetworkRequestOrResponse(headers, size, undefined);\n  } catch (error) {\n    DEBUG_BUILD && logger.exception(error, 'Failed to serialize response body');\n    // fallback\n    return buildNetworkRequestOrResponse(headers, responseBodySize, undefined);\n  }\n}\n\nasync function _parseFetchResponseBody(response: Response): Promise<[string | undefined, NetworkMetaWarning?]> {\n  const res = _tryCloneResponse(response);\n\n  if (!res) {\n    return [undefined, 'BODY_PARSE_ERROR'];\n  }\n\n  try {\n    const text = await _tryGetResponseText(res);\n    return [text];\n  } catch (error) {\n    if (error instanceof Error && error.message.indexOf('Timeout') > -1) {\n      DEBUG_BUILD && logger.warn('Parsing text body from response timed out');\n      return [undefined, 'BODY_PARSE_TIMEOUT'];\n    }\n\n    DEBUG_BUILD && logger.exception(error, 'Failed to get text body from response');\n    return [undefined, 'BODY_PARSE_ERROR'];\n  }\n}\n\nfunction _getFetchRequestArgBody(fetchArgs: unknown[] = []): RequestInit['body'] | undefined {\n  // We only support getting the body from the fetch options\n  if (fetchArgs.length !== 2 || typeof fetchArgs[1] !== 'object') {\n    return undefined;\n  }\n\n  return (fetchArgs[1] as RequestInit).body;\n}\n\nfunction getAllHeaders(headers: Headers, allowedHeaders: string[]): Record<string, string> {\n  const allHeaders: Record<string, string> = {};\n\n  allowedHeaders.forEach(header => {\n    if (headers.get(header)) {\n      allHeaders[header] = headers.get(header) as string;\n    }\n  });\n\n  return allHeaders;\n}\n\nfunction getRequestHeaders(fetchArgs: unknown[], allowedHeaders: string[]): Record<string, string> {\n  if (fetchArgs.length === 1 && typeof fetchArgs[0] !== 'string') {\n    return getHeadersFromOptions(fetchArgs[0] as Request | RequestInit, allowedHeaders);\n  }\n\n  if (fetchArgs.length === 2) {\n    return getHeadersFromOptions(fetchArgs[1] as Request | RequestInit, allowedHeaders);\n  }\n\n  return {};\n}\n\nfunction getHeadersFromOptions(\n  input: Request | RequestInit | undefined,\n  allowedHeaders: string[],\n): Record<string, string> {\n  if (!input) {\n    return {};\n  }\n\n  const headers = input.headers;\n\n  if (!headers) {\n    return {};\n  }\n\n  if (headers instanceof Headers) {\n    return getAllHeaders(headers, allowedHeaders);\n  }\n\n  // We do not support this, as it is not really documented (anymore?)\n  if (Array.isArray(headers)) {\n    return {};\n  }\n\n  return getAllowedHeaders(headers, allowedHeaders);\n}\n\nfunction _tryCloneResponse(response: Response): Response | void {\n  try {\n    // We have to clone this, as the body can only be read once\n    return response.clone();\n  } catch (error) {\n    // this can throw if the response was already consumed before\n    DEBUG_BUILD && logger.exception(error, 'Failed to clone response body');\n  }\n}\n\n/**\n * Get the response body of a fetch request, or timeout after 500ms.\n * Fetch can return a streaming body, that may not resolve (or not for a long time).\n * If that happens, we rather abort after a short time than keep waiting for this.\n */\nfunction _tryGetResponseText(response: Response): Promise<string | undefined> {\n  return new Promise((resolve, reject) => {\n    const timeout = setTimeout(() => reject(new Error('Timeout while trying to read response body')), 500);\n\n    _getResponseText(response)\n      .then(\n        txt => resolve(txt),\n        reason => reject(reason),\n      )\n      .finally(() => clearTimeout(timeout));\n  });\n}\n\nasync function _getResponseText(response: Response): Promise<string> {\n  // Force this to be a promise, just to be safe\n  // eslint-disable-next-line no-return-await\n  return await response.text();\n}\n","import { WINDOW } from '../constants';\nimport type { AddEventResult, MemoryData, ReplayContainer, ReplayPerformanceEntry } from '../types';\nimport { createPerformanceSpans } from './createPerformanceSpans';\n\ntype ReplayMemoryEntry = ReplayPerformanceEntry<MemoryData> & { data: { memory: MemoryInfo } };\n\ninterface MemoryInfo {\n  jsHeapSizeLimit: number;\n  totalJSHeapSize: number;\n  usedJSHeapSize: number;\n}\n\n/**\n * Create a \"span\" for the total amount of memory being used by JS objects\n * (including v8 internal objects).\n */\nexport async function addMemoryEntry(replay: ReplayContainer): Promise<Array<AddEventResult | null>> {\n  // window.performance.memory is a non-standard API and doesn't work on all browsers, so we try-catch this\n  try {\n    return Promise.all(\n      createPerformanceSpans(replay, [\n        // @ts-expect-error memory doesn't exist on type Performance as the API is non-standard (we check that it exists above)\n        createMemoryEntry(WINDOW.performance.memory),\n      ]),\n    );\n  } catch (error) {\n    // Do nothing\n    return [];\n  }\n}\n\nfunction createMemoryEntry(memoryEntry: MemoryInfo): ReplayMemoryEntry {\n  const { jsHeapSizeLimit, totalJSHeapSize, usedJSHeapSize } = memoryEntry;\n  // we don't want to use `getAbsoluteTime` because it adds the event time to the\n  // time origin, so we get the current timestamp instead\n  const time = Date.now() / 1000;\n  return {\n    type: 'memory',\n    name: 'memory',\n    start: time,\n    end: time,\n    data: {\n      memory: {\n        jsHeapSizeLimit,\n        totalJSHeapSize,\n        usedJSHeapSize,\n      },\n    },\n  };\n}\n","import { EventType } from '@sentry-internal/rrweb';\n\nimport { updateClickDetectorForRecordingEvent } from '../coreHandlers/handleClick';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { saveSession } from '../session/saveSession';\nimport type { RecordingEvent, ReplayContainer, ReplayOptionFrameEvent } from '../types';\nimport { addEventSync } from './addEvent';\nimport { logger } from './logger';\n\ntype RecordingEmitCallback = (event: RecordingEvent, isCheckout?: boolean) => void;\n\n/**\n * Handler for recording events.\n *\n * Adds to event buffer, and has varying flushing behaviors if the event was a checkout.\n */\nexport function getHandleRecordingEmit(replay: ReplayContainer): RecordingEmitCallback {\n  let hadFirstEvent = false;\n\n  return (event: RecordingEvent, _isCheckout?: boolean) => {\n    // If this is false, it means session is expired, create and a new session and wait for checkout\n    if (!replay.checkAndHandleExpiredSession()) {\n      DEBUG_BUILD && logger.warn('Received replay event after session expired.');\n\n      return;\n    }\n\n    // `_isCheckout` is only set when the checkout is due to `checkoutEveryNms`\n    // We also want to treat the first event as a checkout, so we handle this specifically here\n    const isCheckout = _isCheckout || !hadFirstEvent;\n    hadFirstEvent = true;\n\n    if (replay.clickDetector) {\n      updateClickDetectorForRecordingEvent(replay.clickDetector, event);\n    }\n\n    // The handler returns `true` if we do not want to trigger debounced flush, `false` if we want to debounce flush.\n    replay.addUpdate(() => {\n      // The session is always started immediately on pageload/init, but for\n      // error-only replays, it should reflect the most recent checkout\n      // when an error occurs. Clear any state that happens before this current\n      // checkout. This needs to happen before `addEvent()` which updates state\n      // dependent on this reset.\n      if (replay.recordingMode === 'buffer' && isCheckout) {\n        replay.setInitialState();\n      }\n\n      // If the event is not added (e.g. due to being paused, disabled, or out of the max replay duration),\n      // Skip all further steps\n      if (!addEventSync(replay, event, isCheckout)) {\n        // Return true to skip scheduling a debounced flush\n        return true;\n      }\n\n      // Different behavior for full snapshots (type=2), ignore other event types\n      // See https://github.com/rrweb-io/rrweb/blob/d8f9290ca496712aa1e7d472549480c4e7876594/packages/rrweb/src/types.ts#L16\n      if (!isCheckout) {\n        return false;\n      }\n\n      const session = replay.session;\n\n      // Additionally, create a meta event that will capture certain SDK settings.\n      // In order to handle buffer mode, this needs to either be done when we\n      // receive checkout events or at flush time. We have an experimental mode\n      // to perform multiple checkouts a session (the idea is to improve\n      // seeking during playback), so also only include if segmentId is 0\n      // (handled in `addSettingsEvent`).\n      //\n      // `isCheckout` is always true, but want to be explicit that it should\n      // only be added for checkouts\n      addSettingsEvent(replay, isCheckout);\n\n      // When in buffer mode, make sure we adjust the session started date to the current earliest event of the buffer\n      // this should usually be the timestamp of the checkout event, but to be safe...\n      if (replay.recordingMode === 'buffer' && session && replay.eventBuffer) {\n        const earliestEvent = replay.eventBuffer.getEarliestTimestamp();\n        if (earliestEvent) {\n          DEBUG_BUILD &&\n            logger.info(`Updating session start time to earliest event in buffer to ${new Date(earliestEvent)}`);\n\n          session.started = earliestEvent;\n\n          if (replay.getOptions().stickySession) {\n            saveSession(session);\n          }\n        }\n      }\n\n      // If there is a previousSessionId after a full snapshot occurs, then\n      // the replay session was started due to session expiration. The new session\n      // is started before triggering a new checkout and contains the id\n      // of the previous session. Do not immediately flush in this case\n      // to avoid capturing only the checkout and instead the replay will\n      // be captured if they perform any follow-up actions.\n      if (session && session.previousSessionId) {\n        return true;\n      }\n\n      if (replay.recordingMode === 'session') {\n        // If the full snapshot is due to an initial load, we will not have\n        // a previous session ID. In this case, we want to buffer events\n        // for a set amount of time before flushing. This can help avoid\n        // capturing replays of users that immediately close the window.\n\n        // This should never reject\n        // eslint-disable-next-line @typescript-eslint/no-floating-promises\n        void replay.flush();\n      }\n\n      return true;\n    });\n  };\n}\n\n/**\n * Exported for tests\n */\nexport function createOptionsEvent(replay: ReplayContainer): ReplayOptionFrameEvent {\n  const options = replay.getOptions();\n  return {\n    type: EventType.Custom,\n    timestamp: Date.now(),\n    data: {\n      tag: 'options',\n      payload: {\n        shouldRecordCanvas: replay.isRecordingCanvas(),\n        sessionSampleRate: options.sessionSampleRate,\n        errorSampleRate: options.errorSampleRate,\n        useCompressionOption: options.useCompression,\n        blockAllMedia: options.blockAllMedia,\n        maskAllText: options.maskAllText,\n        maskAllInputs: options.maskAllInputs,\n        useCompression: replay.eventBuffer ? replay.eventBuffer.type === 'worker' : false,\n        networkDetailHasUrls: options.networkDetailAllowUrls.length > 0,\n        networkCaptureBodies: options.networkCaptureBodies,\n        networkRequestHasHeaders: options.networkRequestHeaders.length > 0,\n        networkResponseHasHeaders: options.networkResponseHeaders.length > 0,\n      },\n    },\n  };\n}\n\n/**\n * Add a \"meta\" event that contains a simplified view on current configuration\n * options. This should only be included on the first segment of a recording.\n */\nfunction addSettingsEvent(replay: ReplayContainer, isCheckout?: boolean): void {\n  // Only need to add this event when sending the first segment\n  if (!isCheckout || !replay.session || replay.session.segmentId !== 0) {\n    return;\n  }\n\n  addEventSync(replay, createOptionsEvent(replay), false);\n}\n","type ClassOption = string | RegExp;\n\n/** Duplicate this from @sentry-internal/rrweb so we can export this as well. */\nexport const ReplayEventTypeDomContentLoaded = 0;\nexport const ReplayEventTypeLoad = 1;\nexport const ReplayEventTypeFullSnapshot = 2;\nexport const ReplayEventTypeIncrementalSnapshot = 3;\nexport const ReplayEventTypeMeta = 4;\nexport const ReplayEventTypeCustom = 5;\nexport const ReplayEventTypePlugin = 6;\n\nexport type ReplayEventType =\n  | typeof ReplayEventTypeDomContentLoaded\n  | typeof ReplayEventTypeLoad\n  | typeof ReplayEventTypeFullSnapshot\n  | typeof ReplayEventTypeIncrementalSnapshot\n  | typeof ReplayEventTypeMeta\n  | typeof ReplayEventTypeCustom\n  | typeof ReplayEventTypePlugin;\n\n/**\n * This is a partial copy of rrweb's eventWithTime type which only contains the properties\n * we specifically need in the SDK.\n */\nexport type ReplayEventWithTime = {\n  type: ReplayEventType;\n  data: unknown;\n  timestamp: number;\n  delay?: number;\n};\n\n/**\n * This is a partial copy of rrweb's recording options which only contains the properties\n * we specifically use in the SDK. Users can specify additional properties, hence we add the\n * Record<string, unknown> union type.\n */\nexport type RrwebRecordOptions = {\n  maskAllText?: boolean;\n  maskAllInputs?: boolean;\n  blockClass?: ClassOption;\n  ignoreClass?: string;\n  maskTextClass?: ClassOption;\n  maskTextSelector?: string;\n  blockSelector?: string;\n  maskInputOptions?: Record<string, boolean>;\n} & Record<string, unknown>;\n\nexport interface CanvasManagerInterface {\n  reset(): void;\n  freeze(): void;\n  unfreeze(): void;\n  lock(): void;\n  unlock(): void;\n  snapshot(): void;\n  addWindow(win: typeof globalThis & Window): void;\n  addShadowRoot(shadowRoot: ShadowRoot): void;\n  resetShadowRoots(): void;\n}\n\nexport interface CanvasManagerOptions {\n  recordCanvas: boolean;\n  enableManualSnapshot?: boolean;\n  blockClass: string | RegExp;\n  blockSelector: string | null;\n  unblockSelector: string | null;\n  sampling?: 'all' | number;\n  dataURLOptions: Partial<{\n    type: string;\n    quality: number;\n  }>;\n  mutationCb: (p: any) => void;\n  win: typeof globalThis & Window;\n  mirror: any;\n}\n","import type { RateLimits, ReplayEvent, TransportMakeRequestResponse } from '@sentry/core';\nimport { getClient, getCurrentScope, isRateLimited, resolvedSyncPromise, updateRateLimits } from '@sentry/core';\nimport { REPLAY_EVENT_NAME, UNABLE_TO_SEND_REPLAY } from '../constants';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { SendReplayData } from '../types';\nimport { createReplayEnvelope } from './createReplayEnvelope';\nimport { logger } from './logger';\nimport { prepareRecordingData } from './prepareRecordingData';\nimport { prepareReplayEvent } from './prepareReplayEvent';\n\n/**\n * Send replay attachment using `fetch()`\n */\nexport async function sendReplayRequest({\n  recordingData,\n  replayId,\n  segmentId: segment_id,\n  eventContext,\n  timestamp,\n  session,\n}: SendReplayData): Promise<TransportMakeRequestResponse> {\n  const preparedRecordingData = prepareRecordingData({\n    recordingData,\n    headers: {\n      segment_id,\n    },\n  });\n\n  const { urls, errorIds, traceIds, initialTimestamp } = eventContext;\n\n  const client = getClient();\n  const scope = getCurrentScope();\n  const transport = client && client.getTransport();\n  const dsn = client && client.getDsn();\n\n  if (!client || !transport || !dsn || !session.sampled) {\n    return resolvedSyncPromise({});\n  }\n\n  const baseEvent: ReplayEvent = {\n    type: REPLAY_EVENT_NAME,\n    replay_start_timestamp: initialTimestamp / 1000,\n    timestamp: timestamp / 1000,\n    error_ids: errorIds,\n    trace_ids: traceIds,\n    urls,\n    replay_id: replayId,\n    segment_id,\n    replay_type: session.sampled,\n  };\n\n  const replayEvent = await prepareReplayEvent({ scope, client, replayId, event: baseEvent });\n\n  if (!replayEvent) {\n    // Taken from baseclient's `_processEvent` method, where this is handled for errors/transactions\n    client.recordDroppedEvent('event_processor', 'replay', baseEvent);\n    DEBUG_BUILD && logger.info('An event processor returned `null`, will not send event.');\n    return resolvedSyncPromise({});\n  }\n\n  /*\n  For reference, the fully built event looks something like this:\n  {\n      \"type\": \"replay_event\",\n      \"timestamp\": 1670837008.634,\n      \"error_ids\": [\n          \"errorId\"\n      ],\n      \"trace_ids\": [\n          \"traceId\"\n      ],\n      \"urls\": [\n          \"https://example.com\"\n      ],\n      \"replay_id\": \"eventId\",\n      \"segment_id\": 3,\n      \"replay_type\": \"error\",\n      \"platform\": \"javascript\",\n      \"event_id\": \"eventId\",\n      \"environment\": \"production\",\n      \"sdk\": {\n          \"integrations\": [\n              \"BrowserTracing\",\n              \"Replay\"\n          ],\n          \"name\": \"sentry.javascript.browser\",\n          \"version\": \"7.25.0\"\n      },\n      \"sdkProcessingMetadata\": {},\n      \"contexts\": {\n      },\n  }\n  */\n\n  // Prevent this data (which, if it exists, was used in earlier steps in the processing pipeline) from being sent to\n  // sentry. (Note: Our use of this property comes and goes with whatever we might be debugging, whatever hacks we may\n  // have temporarily added, etc. Even if we don't happen to be using it at some point in the future, let's not get rid\n  // of this `delete`, lest we miss putting it back in the next time the property is in use.)\n  delete replayEvent.sdkProcessingMetadata;\n\n  const envelope = createReplayEnvelope(replayEvent, preparedRecordingData, dsn, client.getOptions().tunnel);\n\n  let response: TransportMakeRequestResponse;\n\n  try {\n    response = await transport.send(envelope);\n  } catch (err) {\n    const error = new Error(UNABLE_TO_SEND_REPLAY);\n\n    try {\n      // In case browsers don't allow this property to be writable\n      // @ts-expect-error This needs lib es2022 and newer\n      error.cause = err;\n    } catch {\n      // nothing to do\n    }\n    throw error;\n  }\n\n  // If the status code is invalid, we want to immediately stop & not retry\n  if (typeof response.statusCode === 'number' && (response.statusCode < 200 || response.statusCode >= 300)) {\n    throw new TransportStatusCodeError(response.statusCode);\n  }\n\n  const rateLimits = updateRateLimits({}, response);\n  if (isRateLimited(rateLimits, 'replay')) {\n    throw new RateLimitError(rateLimits);\n  }\n\n  return response;\n}\n\n/**\n * This error indicates that the transport returned an invalid status code.\n */\nexport class TransportStatusCodeError extends Error {\n  public constructor(statusCode: number) {\n    super(`Transport returned status code ${statusCode}`);\n  }\n}\n\n/**\n * This error indicates that we hit a rate limit API error.\n */\nexport class RateLimitError extends Error {\n  public rateLimits: RateLimits;\n\n  public constructor(rateLimits: RateLimits) {\n    super('Rate limit hit');\n    this.rateLimits = rateLimits;\n  }\n}\n","import { setTimeout } from '@sentry-internal/browser-utils';\nimport { setContext } from '@sentry/core';\n\nimport { RETRY_BASE_INTERVAL, RETRY_MAX_COUNT, UNABLE_TO_SEND_REPLAY } from '../constants';\nimport type { SendReplayData } from '../types';\nimport { RateLimitError, TransportStatusCodeError, sendReplayRequest } from './sendReplayRequest';\n\n/**\n * Finalize and send the current replay event to Sentry\n */\nexport async function sendReplay(\n  replayData: SendReplayData,\n  retryConfig = {\n    count: 0,\n    interval: RETRY_BASE_INTERVAL,\n  },\n): Promise<unknown> {\n  const { recordingData, onError } = replayData;\n\n  // short circuit if there's no events to upload (this shouldn't happen as _runFlush makes this check)\n  if (!recordingData.length) {\n    return;\n  }\n\n  try {\n    await sendReplayRequest(replayData);\n    return true;\n  } catch (err) {\n    if (err instanceof TransportStatusCodeError || err instanceof RateLimitError) {\n      throw err;\n    }\n\n    // Capture error for every failed replay\n    setContext('Replays', {\n      _retryCount: retryConfig.count,\n    });\n\n    if (onError) {\n      onError(err);\n    }\n\n    // If an error happened here, it's likely that uploading the attachment\n    // failed, we'll can retry with the same events payload\n    if (retryConfig.count >= RETRY_MAX_COUNT) {\n      const error = new Error(`${UNABLE_TO_SEND_REPLAY} - max retries exceeded`);\n\n      try {\n        // In case browsers don't allow this property to be writable\n        // @ts-expect-error This needs lib es2022 and newer\n        error.cause = err;\n      } catch {\n        // nothing to do\n      }\n\n      throw error;\n    }\n\n    // will retry in intervals of 5, 10, 30\n    retryConfig.interval *= ++retryConfig.count;\n\n    return new Promise((resolve, reject) => {\n      setTimeout(async () => {\n        try {\n          await sendReplay(replayData, retryConfig);\n          resolve(true);\n        } catch (err) {\n          reject(err);\n        }\n      }, retryConfig.interval);\n    });\n  }\n}\n","import type { ReplayRecordingData } from '@sentry/core';\n\n/**\n * Prepare the recording data ready to be sent.\n */\nexport function prepareRecordingData({\n  recordingData,\n  headers,\n}: {\n  recordingData: ReplayRecordingData;\n  headers: Record<string, unknown>;\n}): ReplayRecordingData {\n  let payloadWithSequence;\n\n  // XXX: newline is needed to separate sequence id from events\n  const replayHeaders = `${JSON.stringify(headers)}\n`;\n\n  if (typeof recordingData === 'string') {\n    payloadWithSequence = `${replayHeaders}${recordingData}`;\n  } else {\n    const enc = new TextEncoder();\n    // XXX: newline is needed to separate sequence id from events\n    const sequence = enc.encode(replayHeaders);\n    // Merge the two Uint8Arrays\n    payloadWithSequence = new Uint8Array(sequence.length + recordingData.length);\n    payloadWithSequence.set(sequence);\n    payloadWithSequence.set(recordingData, sequence.length);\n  }\n\n  return payloadWithSequence;\n}\n","import type { IntegrationIndex } from '@sentry/core';\nimport { getIsolationScope, prepareEvent } from '@sentry/core';\nimport type { Client, EventHint, ReplayEvent, Scope } from '@sentry/core';\n\n/**\n * Prepare a replay event & enrich it with the SDK metadata.\n */\nexport async function prepareReplayEvent({\n  client,\n  scope,\n  replayId: event_id,\n  event,\n}: {\n  client: Client & { _integrations?: IntegrationIndex };\n  scope: Scope;\n  replayId: string;\n  event: ReplayEvent;\n}): Promise<ReplayEvent | null> {\n  const integrations =\n    typeof client._integrations === 'object' && client._integrations !== null && !Array.isArray(client._integrations)\n      ? Object.keys(client._integrations)\n      : undefined;\n\n  const eventHint: EventHint = { event_id, integrations };\n\n  client.emit('preprocessEvent', event, eventHint);\n\n  const preparedEvent = (await prepareEvent(\n    client.getOptions(),\n    event,\n    eventHint,\n    scope,\n    client,\n    getIsolationScope(),\n  )) as ReplayEvent | null;\n\n  // If e.g. a global event processor returned null\n  if (!preparedEvent) {\n    return null;\n  }\n\n  // This normally happens in browser client \"_prepareEvent\"\n  // but since we do not use this private method from the client, but rather the plain import\n  // we need to do this manually.\n  preparedEvent.platform = preparedEvent.platform || 'javascript';\n\n  // extract the SDK name because `client._prepareEvent` doesn't add it to the event\n  const metadata = client.getSdkMetadata();\n  const { name, version } = (metadata && metadata.sdk) || {};\n\n  preparedEvent.sdk = {\n    ...preparedEvent.sdk,\n    name: name || 'sentry.javascript.unknown',\n    version: version || '0.0.0',\n  };\n\n  return preparedEvent;\n}\n","import { createEnvelope, createEventEnvelopeHeaders, getSdkMetadataForEnvelopeHeader } from '@sentry/core';\nimport type { DsnComponents, ReplayEnvelope, ReplayEvent, ReplayRecordingData } from '@sentry/core';\n\n/**\n * Create a replay envelope ready to be sent.\n * This includes both the replay event, as well as the recording data.\n */\nexport function createReplayEnvelope(\n  replayEvent: ReplayEvent,\n  recordingData: ReplayRecordingData,\n  dsn: DsnComponents,\n  tunnel?: string,\n): ReplayEnvelope {\n  return createEnvelope<ReplayEnvelope>(\n    createEventEnvelopeHeaders(replayEvent, getSdkMetadataForEnvelopeHeader(replayEvent), tunnel, dsn),\n    [\n      [{ type: 'replay_event' }, replayEvent],\n      [\n        {\n          type: 'replay_recording',\n          // If string then we need to encode to UTF8, otherwise will have\n          // wrong size. TextEncoder has similar browser support to\n          // MutationObserver, although it does not accept IE11.\n          length:\n            typeof recordingData === 'string' ? new TextEncoder().encode(recordingData).length : recordingData.length,\n        },\n        recordingData,\n      ],\n    ],\n  );\n}\n","export const THROTTLED = '__THROTTLED';\nexport const SKIPPED = '__SKIPPED';\n\n/**\n * Create a throttled function off a given function.\n * When calling the throttled function, it will call the original function only\n * if it hasn't been called more than `maxCount` times in the last `durationSeconds`.\n *\n * Returns `THROTTLED` if throttled for the first time, after that `SKIPPED`,\n * or else the return value of the original function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function throttle<T extends (...rest: any[]) => any>(\n  fn: T,\n  maxCount: number,\n  durationSeconds: number,\n): (...rest: Parameters<T>) => ReturnType<T> | typeof THROTTLED | typeof SKIPPED {\n  const counter = new Map<number, number>();\n\n  const _cleanup = (now: number): void => {\n    const threshold = now - durationSeconds;\n    counter.forEach((_value, key) => {\n      if (key < threshold) {\n        counter.delete(key);\n      }\n    });\n  };\n\n  const _getTotalCount = (): number => {\n    return [...counter.values()].reduce((a, b) => a + b, 0);\n  };\n\n  let isThrottled = false;\n\n  return (...rest: Parameters<T>): ReturnType<T> | typeof THROTTLED | typeof SKIPPED => {\n    // Date in second-precision, which we use as basis for the throttling\n    const now = Math.floor(Date.now() / 1000);\n\n    // First, make sure to delete any old entries\n    _cleanup(now);\n\n    // If already over limit, do nothing\n    if (_getTotalCount() >= maxCount) {\n      const wasThrottled = isThrottled;\n      isThrottled = true;\n      return wasThrottled ? SKIPPED : THROTTLED;\n    }\n\n    isThrottled = false;\n    const count = counter.get(now) || 0;\n    counter.set(now, count + 1);\n\n    return fn(...rest);\n  };\n}\n","/* eslint-disable max-lines */ // TODO: We might want to split this file up\nimport { EventType, record } from '@sentry-internal/rrweb';\nimport type { ReplayRecordingMode, Span } from '@sentry/core';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, getActiveSpan, getClient, getRootSpan, spanToJSON } from '@sentry/core';\nimport {\n  BUFFER_CHECKOUT_TIME,\n  SESSION_IDLE_EXPIRE_DURATION,\n  SESSION_IDLE_PAUSE_DURATION,\n  SLOW_CLICK_SCROLL_TIMEOUT,\n  SLOW_CLICK_THRESHOLD,\n  WINDOW,\n} from './constants';\nimport { ClickDetector } from './coreHandlers/handleClick';\nimport { handleKeyboardEvent } from './coreHandlers/handleKeyboardEvent';\nimport { setupPerformanceObserver } from './coreHandlers/performanceObserver';\nimport { DEBUG_BUILD } from './debug-build';\nimport { createEventBuffer } from './eventBuffer';\nimport { clearSession } from './session/clearSession';\nimport { loadOrCreateSession } from './session/loadOrCreateSession';\nimport { saveSession } from './session/saveSession';\nimport { shouldRefreshSession } from './session/shouldRefreshSession';\nimport type {\n  AddEventResult,\n  AddUpdateCallback,\n  AllPerformanceEntry,\n  AllPerformanceEntryData,\n  EventBuffer,\n  InternalEventContext,\n  PopEventContext,\n  RecordingEvent,\n  RecordingOptions,\n  ReplayBreadcrumbFrame,\n  ReplayCanvasIntegrationOptions,\n  ReplayContainer as ReplayContainerInterface,\n  ReplayPerformanceEntry,\n  ReplayPluginOptions,\n  SendBufferedReplayOptions,\n  Session,\n  SlowClickConfig,\n  Timeouts,\n} from './types';\nimport { ReplayEventTypeCustom } from './types';\nimport { addEvent, addEventSync } from './util/addEvent';\nimport { addGlobalListeners } from './util/addGlobalListeners';\nimport { addMemoryEntry } from './util/addMemoryEntry';\nimport { createBreadcrumb } from './util/createBreadcrumb';\nimport { createPerformanceEntries } from './util/createPerformanceEntries';\nimport { createPerformanceSpans } from './util/createPerformanceSpans';\nimport { debounce } from './util/debounce';\nimport { getHandleRecordingEmit } from './util/handleRecordingEmit';\nimport { isExpired } from './util/isExpired';\nimport { isSessionExpired } from './util/isSessionExpired';\nimport { logger } from './util/logger';\nimport { resetReplayIdOnDynamicSamplingContext } from './util/resetReplayIdOnDynamicSamplingContext';\nimport { sendReplay } from './util/sendReplay';\nimport { RateLimitError } from './util/sendReplayRequest';\nimport type { SKIPPED } from './util/throttle';\nimport { THROTTLED, throttle } from './util/throttle';\n\n/**\n * The main replay container class, which holds all the state and methods for recording and sending replays.\n */\nexport class ReplayContainer implements ReplayContainerInterface {\n  public eventBuffer: EventBuffer | null;\n\n  public performanceEntries: AllPerformanceEntry[];\n\n  public replayPerformanceEntries: ReplayPerformanceEntry<AllPerformanceEntryData>[];\n\n  public session: Session | undefined;\n\n  public clickDetector: ClickDetector | undefined;\n\n  /**\n   * Recording can happen in one of two modes:\n   *   - session: Record the whole session, sending it continuously\n   *   - buffer: Always keep the last 60s of recording, requires:\n   *     - having replaysOnErrorSampleRate > 0 to capture replay when an error occurs\n   *     - or calling `flush()` to send the replay\n   */\n  public recordingMode: ReplayRecordingMode;\n\n  /**\n   * The current or last active span.\n   * This is only available when performance is enabled.\n   */\n  public lastActiveSpan?: Span;\n\n  /**\n   * These are here so we can overwrite them in tests etc.\n   * @hidden\n   */\n  public readonly timeouts: Timeouts;\n\n  /** The replay has to be manually started, because no sample rate (neither session or error) was provided. */\n  private _requiresManualStart: boolean;\n\n  private _throttledAddEvent: (\n    event: RecordingEvent,\n    isCheckout?: boolean,\n  ) => typeof THROTTLED | typeof SKIPPED | Promise<AddEventResult | null>;\n\n  /**\n   * Options to pass to `rrweb.record()`\n   */\n  private readonly _recordingOptions: RecordingOptions;\n\n  private readonly _options: ReplayPluginOptions;\n\n  private _performanceCleanupCallback?: () => void;\n\n  private _debouncedFlush: ReturnType<typeof debounce>;\n  private _flushLock: Promise<unknown> | undefined;\n\n  /**\n   * Timestamp of the last user activity. This lives across sessions.\n   */\n  private _lastActivity: number;\n\n  /**\n   * Is the integration currently active?\n   */\n  private _isEnabled: boolean;\n\n  /**\n   * Paused is a state where:\n   * - DOM Recording is not listening at all\n   * - Nothing will be added to event buffer (e.g. core SDK events)\n   */\n  private _isPaused: boolean;\n\n  /**\n   * Have we attached listeners to the core SDK?\n   * Note we have to track this as there is no way to remove instrumentation handlers.\n   */\n  private _hasInitializedCoreListeners: boolean;\n\n  /**\n   * Function to stop recording\n   */\n  private _stopRecording: ReturnType<typeof record> | undefined;\n\n  private _context: InternalEventContext;\n\n  /**\n   * Internal use for canvas recording options\n   */\n  private _canvas: ReplayCanvasIntegrationOptions | undefined;\n\n  public constructor({\n    options,\n    recordingOptions,\n  }: {\n    options: ReplayPluginOptions;\n    recordingOptions: RecordingOptions;\n  }) {\n    this.eventBuffer = null;\n    this.performanceEntries = [];\n    this.replayPerformanceEntries = [];\n    this.recordingMode = 'session';\n    this.timeouts = {\n      sessionIdlePause: SESSION_IDLE_PAUSE_DURATION,\n      sessionIdleExpire: SESSION_IDLE_EXPIRE_DURATION,\n    } as const;\n    this._lastActivity = Date.now();\n    this._isEnabled = false;\n    this._isPaused = false;\n    this._requiresManualStart = false;\n    this._hasInitializedCoreListeners = false;\n    this._context = {\n      errorIds: new Set(),\n      traceIds: new Set(),\n      urls: [],\n      initialTimestamp: Date.now(),\n      initialUrl: '',\n    };\n\n    this._recordingOptions = recordingOptions;\n    this._options = options;\n\n    this._debouncedFlush = debounce(() => this._flush(), this._options.flushMinDelay, {\n      maxWait: this._options.flushMaxDelay,\n    });\n\n    this._throttledAddEvent = throttle(\n      (event: RecordingEvent, isCheckout?: boolean) => addEvent(this, event, isCheckout),\n      // Max 300 events...\n      300,\n      // ... per 5s\n      5,\n    );\n\n    const { slowClickTimeout, slowClickIgnoreSelectors } = this.getOptions();\n\n    const slowClickConfig: SlowClickConfig | undefined = slowClickTimeout\n      ? {\n          threshold: Math.min(SLOW_CLICK_THRESHOLD, slowClickTimeout),\n          timeout: slowClickTimeout,\n          scrollTimeout: SLOW_CLICK_SCROLL_TIMEOUT,\n          ignoreSelector: slowClickIgnoreSelectors ? slowClickIgnoreSelectors.join(',') : '',\n        }\n      : undefined;\n\n    if (slowClickConfig) {\n      this.clickDetector = new ClickDetector(this, slowClickConfig);\n    }\n\n    // Configure replay logger w/ experimental options\n    if (DEBUG_BUILD) {\n      const experiments = options._experiments;\n      logger.setConfig({\n        captureExceptions: !!experiments.captureExceptions,\n        traceInternals: !!experiments.traceInternals,\n      });\n    }\n  }\n\n  /** Get the event context. */\n  public getContext(): InternalEventContext {\n    return this._context;\n  }\n\n  /** If recording is currently enabled. */\n  public isEnabled(): boolean {\n    return this._isEnabled;\n  }\n\n  /** If recording is currently paused. */\n  public isPaused(): boolean {\n    return this._isPaused;\n  }\n\n  /**\n   * Determine if canvas recording is enabled\n   */\n  public isRecordingCanvas(): boolean {\n    return Boolean(this._canvas);\n  }\n\n  /** Get the replay integration options. */\n  public getOptions(): ReplayPluginOptions {\n    return this._options;\n  }\n\n  /** A wrapper to conditionally capture exceptions. */\n  public handleException(error: unknown): void {\n    DEBUG_BUILD && logger.exception(error);\n    if (this._options.onError) {\n      this._options.onError(error);\n    }\n  }\n\n  /**\n   * Initializes the plugin based on sampling configuration. Should not be\n   * called outside of constructor.\n   */\n  public initializeSampling(previousSessionId?: string): void {\n    const { errorSampleRate, sessionSampleRate } = this._options;\n\n    // If neither sample rate is > 0, then do nothing - user will need to call one of\n    // `start()` or `startBuffering` themselves.\n    const requiresManualStart = errorSampleRate <= 0 && sessionSampleRate <= 0;\n\n    this._requiresManualStart = requiresManualStart;\n\n    if (requiresManualStart) {\n      return;\n    }\n\n    // Otherwise if there is _any_ sample rate set, try to load an existing\n    // session, or create a new one.\n    this._initializeSessionForSampling(previousSessionId);\n\n    if (!this.session) {\n      // This should not happen, something wrong has occurred\n      DEBUG_BUILD && logger.exception(new Error('Unable to initialize and create session'));\n      return;\n    }\n\n    if (this.session.sampled === false) {\n      // This should only occur if `errorSampleRate` is 0 and was unsampled for\n      // session-based replay. In this case there is nothing to do.\n      return;\n    }\n\n    // If segmentId > 0, it means we've previously already captured this session\n    // In this case, we still want to continue in `session` recording mode\n    this.recordingMode = this.session.sampled === 'buffer' && this.session.segmentId === 0 ? 'buffer' : 'session';\n\n    DEBUG_BUILD && logger.infoTick(`Starting replay in ${this.recordingMode} mode`);\n\n    this._initializeRecording();\n  }\n\n  /**\n   * Start a replay regardless of sampling rate. Calling this will always\n   * create a new session. Will log a message if replay is already in progress.\n   *\n   * Creates or loads a session, attaches listeners to varying events (DOM,\n   * _performanceObserver, Recording, Sentry SDK, etc)\n   */\n  public start(): void {\n    if (this._isEnabled && this.recordingMode === 'session') {\n      DEBUG_BUILD && logger.info('Recording is already in progress');\n      return;\n    }\n\n    if (this._isEnabled && this.recordingMode === 'buffer') {\n      DEBUG_BUILD && logger.info('Buffering is in progress, call `flush()` to save the replay');\n      return;\n    }\n\n    DEBUG_BUILD && logger.infoTick('Starting replay in session mode');\n\n    // Required as user activity is initially set in\n    // constructor, so if `start()` is called after\n    // session idle expiration, a replay will not be\n    // created due to an idle timeout.\n    this._updateUserActivity();\n\n    const session = loadOrCreateSession(\n      {\n        maxReplayDuration: this._options.maxReplayDuration,\n        sessionIdleExpire: this.timeouts.sessionIdleExpire,\n      },\n      {\n        stickySession: this._options.stickySession,\n        // This is intentional: create a new session-based replay when calling `start()`\n        sessionSampleRate: 1,\n        allowBuffering: false,\n      },\n    );\n\n    this.session = session;\n\n    this._initializeRecording();\n  }\n\n  /**\n   * Start replay buffering. Buffers until `flush()` is called or, if\n   * `replaysOnErrorSampleRate` > 0, an error occurs.\n   */\n  public startBuffering(): void {\n    if (this._isEnabled) {\n      DEBUG_BUILD && logger.info('Buffering is in progress, call `flush()` to save the replay');\n      return;\n    }\n\n    DEBUG_BUILD && logger.infoTick('Starting replay in buffer mode');\n\n    const session = loadOrCreateSession(\n      {\n        sessionIdleExpire: this.timeouts.sessionIdleExpire,\n        maxReplayDuration: this._options.maxReplayDuration,\n      },\n      {\n        stickySession: this._options.stickySession,\n        sessionSampleRate: 0,\n        allowBuffering: true,\n      },\n    );\n\n    this.session = session;\n\n    this.recordingMode = 'buffer';\n    this._initializeRecording();\n  }\n\n  /**\n   * Start recording.\n   *\n   * Note that this will cause a new DOM checkout\n   */\n  public startRecording(): void {\n    try {\n      const canvasOptions = this._canvas;\n\n      this._stopRecording = record({\n        ...this._recordingOptions,\n        // When running in error sampling mode, we need to overwrite `checkoutEveryNms`\n        // Without this, it would record forever, until an error happens, which we don't want\n        // instead, we'll always keep the last 60 seconds of replay before an error happened\n        ...(this.recordingMode === 'buffer'\n          ? { checkoutEveryNms: BUFFER_CHECKOUT_TIME }\n          : // Otherwise, use experimental option w/ min checkout time of 6 minutes\n            // This is to improve playback seeking as there could potentially be\n            // less mutations to process in the worse cases.\n            //\n            // checkout by \"N\" events is probably ideal, but means we have less\n            // control about the number of checkouts we make (which generally\n            // increases replay size)\n            this._options._experiments.continuousCheckout && {\n              // Minimum checkout time is 6 minutes\n              checkoutEveryNms: Math.max(360_000, this._options._experiments.continuousCheckout),\n            }),\n        emit: getHandleRecordingEmit(this),\n        onMutation: this._onMutationHandler,\n        ...(canvasOptions\n          ? {\n              recordCanvas: canvasOptions.recordCanvas,\n              getCanvasManager: canvasOptions.getCanvasManager,\n              sampling: canvasOptions.sampling,\n              dataURLOptions: canvasOptions.dataURLOptions,\n            }\n          : {}),\n      });\n    } catch (err) {\n      this.handleException(err);\n    }\n  }\n\n  /**\n   * Stops the recording, if it was running.\n   *\n   * Returns true if it was previously stopped, or is now stopped,\n   * otherwise false.\n   */\n  public stopRecording(): boolean {\n    try {\n      if (this._stopRecording) {\n        this._stopRecording();\n        this._stopRecording = undefined;\n      }\n\n      return true;\n    } catch (err) {\n      this.handleException(err);\n      return false;\n    }\n  }\n\n  /**\n   * Currently, this needs to be manually called (e.g. for tests). Sentry SDK\n   * does not support a teardown\n   */\n  public async stop({ forceFlush = false, reason }: { forceFlush?: boolean; reason?: string } = {}): Promise<void> {\n    if (!this._isEnabled) {\n      return;\n    }\n\n    // We can't move `_isEnabled` after awaiting a flush, otherwise we can\n    // enter into an infinite loop when `stop()` is called while flushing.\n    this._isEnabled = false;\n\n    try {\n      DEBUG_BUILD && logger.info(`Stopping Replay${reason ? ` triggered by ${reason}` : ''}`);\n\n      resetReplayIdOnDynamicSamplingContext();\n\n      this._removeListeners();\n      this.stopRecording();\n\n      this._debouncedFlush.cancel();\n      // See comment above re: `_isEnabled`, we \"force\" a flush, ignoring the\n      // `_isEnabled` state of the plugin since it was disabled above.\n      if (forceFlush) {\n        await this._flush({ force: true });\n      }\n\n      // After flush, destroy event buffer\n      this.eventBuffer && this.eventBuffer.destroy();\n      this.eventBuffer = null;\n\n      // Clear session from session storage, note this means if a new session\n      // is started after, it will not have `previousSessionId`\n      clearSession(this);\n    } catch (err) {\n      this.handleException(err);\n    }\n  }\n\n  /**\n   * Pause some replay functionality. See comments for `_isPaused`.\n   * This differs from stop as this only stops DOM recording, it is\n   * not as thorough of a shutdown as `stop()`.\n   */\n  public pause(): void {\n    if (this._isPaused) {\n      return;\n    }\n\n    this._isPaused = true;\n    this.stopRecording();\n\n    DEBUG_BUILD && logger.info('Pausing replay');\n  }\n\n  /**\n   * Resumes recording, see notes for `pause().\n   *\n   * Note that calling `startRecording()` here will cause a\n   * new DOM checkout.`\n   */\n  public resume(): void {\n    if (!this._isPaused || !this._checkSession()) {\n      return;\n    }\n\n    this._isPaused = false;\n    this.startRecording();\n\n    DEBUG_BUILD && logger.info('Resuming replay');\n  }\n\n  /**\n   * If not in \"session\" recording mode, flush event buffer which will create a new replay.\n   * Unless `continueRecording` is false, the replay will continue to record and\n   * behave as a \"session\"-based replay.\n   *\n   * Otherwise, queue up a flush.\n   */\n  public async sendBufferedReplayOrFlush({ continueRecording = true }: SendBufferedReplayOptions = {}): Promise<void> {\n    if (this.recordingMode === 'session') {\n      return this.flushImmediate();\n    }\n\n    const activityTime = Date.now();\n\n    DEBUG_BUILD && logger.info('Converting buffer to session');\n\n    // Allow flush to complete before resuming as a session recording, otherwise\n    // the checkout from `startRecording` may be included in the payload.\n    // Prefer to keep the error replay as a separate (and smaller) segment\n    // than the session replay.\n    await this.flushImmediate();\n\n    const hasStoppedRecording = this.stopRecording();\n\n    if (!continueRecording || !hasStoppedRecording) {\n      return;\n    }\n\n    // To avoid race conditions where this is called multiple times, we check here again that we are still buffering\n    if ((this.recordingMode as ReplayRecordingMode) === 'session') {\n      return;\n    }\n\n    // Re-start recording in session-mode\n    this.recordingMode = 'session';\n\n    // Once this session ends, we do not want to refresh it\n    if (this.session) {\n      this._updateUserActivity(activityTime);\n      this._updateSessionActivity(activityTime);\n      this._maybeSaveSession();\n    }\n\n    this.startRecording();\n  }\n\n  /**\n   * We want to batch uploads of replay events. Save events only if\n   * `<flushMinDelay>` milliseconds have elapsed since the last event\n   * *OR* if `<flushMaxDelay>` milliseconds have elapsed.\n   *\n   * Accepts a callback to perform side-effects and returns true to stop batch\n   * processing and hand back control to caller.\n   */\n  public addUpdate(cb: AddUpdateCallback): void {\n    // We need to always run `cb` (e.g. in the case of `this.recordingMode == 'buffer'`)\n    const cbResult = cb();\n\n    // If this option is turned on then we will only want to call `flush`\n    // explicitly\n    if (this.recordingMode === 'buffer') {\n      return;\n    }\n\n    // If callback is true, we do not want to continue with flushing -- the\n    // caller will need to handle it.\n    if (cbResult === true) {\n      return;\n    }\n\n    // addUpdate is called quite frequently - use _debouncedFlush so that it\n    // respects the flush delays and does not flush immediately\n    this._debouncedFlush();\n  }\n\n  /**\n   * Updates the user activity timestamp and resumes recording. This should be\n   * called in an event handler for a user action that we consider as the user\n   * being \"active\" (e.g. a mouse click).\n   */\n  public triggerUserActivity(): void {\n    this._updateUserActivity();\n\n    // This case means that recording was once stopped due to inactivity.\n    // Ensure that recording is resumed.\n    if (!this._stopRecording) {\n      // Create a new session, otherwise when the user action is flushed, it\n      // will get rejected due to an expired session.\n      if (!this._checkSession()) {\n        return;\n      }\n\n      // Note: This will cause a new DOM checkout\n      this.resume();\n      return;\n    }\n\n    // Otherwise... recording was never suspended, continue as normalish\n    this.checkAndHandleExpiredSession();\n\n    this._updateSessionActivity();\n  }\n\n  /**\n   * Updates the user activity timestamp *without* resuming\n   * recording. Some user events (e.g. keydown) can be create\n   * low-value replays that only contain the keypress as a\n   * breadcrumb. Instead this would require other events to\n   * create a new replay after a session has expired.\n   */\n  public updateUserActivity(): void {\n    this._updateUserActivity();\n    this._updateSessionActivity();\n  }\n\n  /**\n   * Only flush if `this.recordingMode === 'session'`\n   */\n  public conditionalFlush(): Promise<void> {\n    if (this.recordingMode === 'buffer') {\n      return Promise.resolve();\n    }\n\n    return this.flushImmediate();\n  }\n\n  /**\n   * Flush using debounce flush\n   */\n  public flush(): Promise<void> {\n    return this._debouncedFlush() as Promise<void>;\n  }\n\n  /**\n   * Always flush via `_debouncedFlush` so that we do not have flushes triggered\n   * from calling both `flush` and `_debouncedFlush`. Otherwise, there could be\n   * cases of multiple flushes happening closely together.\n   */\n  public flushImmediate(): Promise<void> {\n    this._debouncedFlush();\n    // `.flush` is provided by the debounced function, analogously to lodash.debounce\n    return this._debouncedFlush.flush() as Promise<void>;\n  }\n\n  /**\n   * Cancels queued up flushes.\n   */\n  public cancelFlush(): void {\n    this._debouncedFlush.cancel();\n  }\n\n  /** Get the current session (=replay) ID */\n  public getSessionId(): string | undefined {\n    return this.session && this.session.id;\n  }\n\n  /**\n   * Checks if recording should be stopped due to user inactivity. Otherwise\n   * check if session is expired and create a new session if so. Triggers a new\n   * full snapshot on new session.\n   *\n   * Returns true if session is not expired, false otherwise.\n   * @hidden\n   */\n  public checkAndHandleExpiredSession(): boolean | void {\n    // Prevent starting a new session if the last user activity is older than\n    // SESSION_IDLE_PAUSE_DURATION. Otherwise non-user activity can trigger a new\n    // session+recording. This creates noisy replays that do not have much\n    // content in them.\n    if (\n      this._lastActivity &&\n      isExpired(this._lastActivity, this.timeouts.sessionIdlePause) &&\n      this.session &&\n      this.session.sampled === 'session'\n    ) {\n      // Pause recording only for session-based replays. Otherwise, resuming\n      // will create a new replay and will conflict with users who only choose\n      // to record error-based replays only. (e.g. the resumed replay will not\n      // contain a reference to an error)\n      this.pause();\n      return;\n    }\n\n    // --- There is recent user activity --- //\n    // This will create a new session if expired, based on expiry length\n    if (!this._checkSession()) {\n      // Check session handles the refreshing itself\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Capture some initial state that can change throughout the lifespan of the\n   * replay. This is required because otherwise they would be captured at the\n   * first flush.\n   */\n  public setInitialState(): void {\n    const urlPath = `${WINDOW.location.pathname}${WINDOW.location.hash}${WINDOW.location.search}`;\n    const url = `${WINDOW.location.origin}${urlPath}`;\n\n    this.performanceEntries = [];\n    this.replayPerformanceEntries = [];\n\n    // Reset _context as well\n    this._clearContext();\n\n    this._context.initialUrl = url;\n    this._context.initialTimestamp = Date.now();\n    this._context.urls.push(url);\n  }\n\n  /**\n   * Add a breadcrumb event, that may be throttled.\n   * If it was throttled, we add a custom breadcrumb to indicate that.\n   */\n  public throttledAddEvent(\n    event: RecordingEvent,\n    isCheckout?: boolean,\n  ): typeof THROTTLED | typeof SKIPPED | Promise<AddEventResult | null> {\n    const res = this._throttledAddEvent(event, isCheckout);\n\n    // If this is THROTTLED, it means we have throttled the event for the first time\n    // In this case, we want to add a breadcrumb indicating that something was skipped\n    if (res === THROTTLED) {\n      const breadcrumb = createBreadcrumb({\n        category: 'replay.throttled',\n      });\n\n      this.addUpdate(() => {\n        // Return `false` if the event _was_ added, as that means we schedule a flush\n        return !addEventSync(this, {\n          type: ReplayEventTypeCustom,\n          timestamp: breadcrumb.timestamp || 0,\n          data: {\n            tag: 'breadcrumb',\n            payload: breadcrumb,\n            metric: true,\n          },\n        });\n      });\n    }\n\n    return res;\n  }\n\n  /**\n   * This will get the parametrized route name of the current page.\n   * This is only available if performance is enabled, and if an instrumented router is used.\n   */\n  public getCurrentRoute(): string | undefined {\n    const lastActiveSpan = this.lastActiveSpan || getActiveSpan();\n    const lastRootSpan = lastActiveSpan && getRootSpan(lastActiveSpan);\n\n    const attributes = (lastRootSpan && spanToJSON(lastRootSpan).data) || {};\n    const source = attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n    if (!lastRootSpan || !source || !['route', 'custom'].includes(source)) {\n      return undefined;\n    }\n\n    return spanToJSON(lastRootSpan).description;\n  }\n\n  /**\n   * Initialize and start all listeners to varying events (DOM,\n   * Performance Observer, Recording, Sentry SDK, etc)\n   */\n  private _initializeRecording(): void {\n    this.setInitialState();\n\n    // this method is generally called on page load or manually - in both cases\n    // we should treat it as an activity\n    this._updateSessionActivity();\n\n    this.eventBuffer = createEventBuffer({\n      useCompression: this._options.useCompression,\n      workerUrl: this._options.workerUrl,\n    });\n\n    this._removeListeners();\n    this._addListeners();\n\n    // Need to set as enabled before we start recording, as `record()` can trigger a flush with a new checkout\n    this._isEnabled = true;\n    this._isPaused = false;\n\n    this.startRecording();\n  }\n\n  /**\n   * Loads (or refreshes) the current session.\n   */\n  private _initializeSessionForSampling(previousSessionId?: string): void {\n    // Whenever there is _any_ error sample rate, we always allow buffering\n    // Because we decide on sampling when an error occurs, we need to buffer at all times if sampling for errors\n    const allowBuffering = this._options.errorSampleRate > 0;\n\n    const session = loadOrCreateSession(\n      {\n        sessionIdleExpire: this.timeouts.sessionIdleExpire,\n        maxReplayDuration: this._options.maxReplayDuration,\n        previousSessionId,\n      },\n      {\n        stickySession: this._options.stickySession,\n        sessionSampleRate: this._options.sessionSampleRate,\n        allowBuffering,\n      },\n    );\n\n    this.session = session;\n  }\n\n  /**\n   * Checks and potentially refreshes the current session.\n   * Returns false if session is not recorded.\n   */\n  private _checkSession(): boolean {\n    // If there is no session yet, we do not want to refresh anything\n    // This should generally not happen, but to be safe....\n    if (!this.session) {\n      return false;\n    }\n\n    const currentSession = this.session;\n\n    if (\n      shouldRefreshSession(currentSession, {\n        sessionIdleExpire: this.timeouts.sessionIdleExpire,\n        maxReplayDuration: this._options.maxReplayDuration,\n      })\n    ) {\n      // This should never reject\n      // eslint-disable-next-line @typescript-eslint/no-floating-promises\n      this._refreshSession(currentSession);\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Refresh a session with a new one.\n   * This stops the current session (without forcing a flush, as that would never work since we are expired),\n   * and then does a new sampling based on the refreshed session.\n   */\n  private async _refreshSession(session: Session): Promise<void> {\n    if (!this._isEnabled) {\n      return;\n    }\n    await this.stop({ reason: 'refresh session' });\n    this.initializeSampling(session.id);\n  }\n\n  /**\n   * Adds listeners to record events for the replay\n   */\n  private _addListeners(): void {\n    try {\n      WINDOW.document.addEventListener('visibilitychange', this._handleVisibilityChange);\n      WINDOW.addEventListener('blur', this._handleWindowBlur);\n      WINDOW.addEventListener('focus', this._handleWindowFocus);\n      WINDOW.addEventListener('keydown', this._handleKeyboardEvent);\n\n      if (this.clickDetector) {\n        this.clickDetector.addListeners();\n      }\n\n      // There is no way to remove these listeners, so ensure they are only added once\n      if (!this._hasInitializedCoreListeners) {\n        addGlobalListeners(this);\n\n        this._hasInitializedCoreListeners = true;\n      }\n    } catch (err) {\n      this.handleException(err);\n    }\n\n    this._performanceCleanupCallback = setupPerformanceObserver(this);\n  }\n\n  /**\n   * Cleans up listeners that were created in `_addListeners`\n   */\n  private _removeListeners(): void {\n    try {\n      WINDOW.document.removeEventListener('visibilitychange', this._handleVisibilityChange);\n\n      WINDOW.removeEventListener('blur', this._handleWindowBlur);\n      WINDOW.removeEventListener('focus', this._handleWindowFocus);\n      WINDOW.removeEventListener('keydown', this._handleKeyboardEvent);\n\n      if (this.clickDetector) {\n        this.clickDetector.removeListeners();\n      }\n\n      if (this._performanceCleanupCallback) {\n        this._performanceCleanupCallback();\n      }\n    } catch (err) {\n      this.handleException(err);\n    }\n  }\n\n  /**\n   * Handle when visibility of the page content changes. Opening a new tab will\n   * cause the state to change to hidden because of content of current page will\n   * be hidden. Likewise, moving a different window to cover the contents of the\n   * page will also trigger a change to a hidden state.\n   */\n  private _handleVisibilityChange: () => void = () => {\n    if (WINDOW.document.visibilityState === 'visible') {\n      this._doChangeToForegroundTasks();\n    } else {\n      this._doChangeToBackgroundTasks();\n    }\n  };\n\n  /**\n   * Handle when page is blurred\n   */\n  private _handleWindowBlur: () => void = () => {\n    const breadcrumb = createBreadcrumb({\n      category: 'ui.blur',\n    });\n\n    // Do not count blur as a user action -- it's part of the process of them\n    // leaving the page\n    this._doChangeToBackgroundTasks(breadcrumb);\n  };\n\n  /**\n   * Handle when page is focused\n   */\n  private _handleWindowFocus: () => void = () => {\n    const breadcrumb = createBreadcrumb({\n      category: 'ui.focus',\n    });\n\n    // Do not count focus as a user action -- instead wait until they focus and\n    // interactive with page\n    this._doChangeToForegroundTasks(breadcrumb);\n  };\n\n  /** Ensure page remains active when a key is pressed. */\n  private _handleKeyboardEvent: (event: KeyboardEvent) => void = (event: KeyboardEvent) => {\n    handleKeyboardEvent(this, event);\n  };\n\n  /**\n   * Tasks to run when we consider a page to be hidden (via blurring and/or visibility)\n   */\n  private _doChangeToBackgroundTasks(breadcrumb?: ReplayBreadcrumbFrame): void {\n    if (!this.session) {\n      return;\n    }\n\n    const expired = isSessionExpired(this.session, {\n      maxReplayDuration: this._options.maxReplayDuration,\n      sessionIdleExpire: this.timeouts.sessionIdleExpire,\n    });\n\n    if (expired) {\n      return;\n    }\n\n    if (breadcrumb) {\n      this._createCustomBreadcrumb(breadcrumb);\n    }\n\n    // Send replay when the page/tab becomes hidden. There is no reason to send\n    // replay if it becomes visible, since no actions we care about were done\n    // while it was hidden\n    // This should never reject\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    void this.conditionalFlush();\n  }\n\n  /**\n   * Tasks to run when we consider a page to be visible (via focus and/or visibility)\n   */\n  private _doChangeToForegroundTasks(breadcrumb?: ReplayBreadcrumbFrame): void {\n    if (!this.session) {\n      return;\n    }\n\n    const isSessionActive = this.checkAndHandleExpiredSession();\n\n    if (!isSessionActive) {\n      // If the user has come back to the page within SESSION_IDLE_PAUSE_DURATION\n      // ms, we will re-use the existing session, otherwise create a new\n      // session\n      DEBUG_BUILD && logger.info('Document has become active, but session has expired');\n      return;\n    }\n\n    if (breadcrumb) {\n      this._createCustomBreadcrumb(breadcrumb);\n    }\n  }\n\n  /**\n   * Update user activity (across session lifespans)\n   */\n  private _updateUserActivity(_lastActivity: number = Date.now()): void {\n    this._lastActivity = _lastActivity;\n  }\n\n  /**\n   * Updates the session's last activity timestamp\n   */\n  private _updateSessionActivity(_lastActivity: number = Date.now()): void {\n    if (this.session) {\n      this.session.lastActivity = _lastActivity;\n      this._maybeSaveSession();\n    }\n  }\n\n  /**\n   * Helper to create (and buffer) a replay breadcrumb from a core SDK breadcrumb\n   */\n  private _createCustomBreadcrumb(breadcrumb: ReplayBreadcrumbFrame): void {\n    this.addUpdate(() => {\n      // This should never reject\n      // eslint-disable-next-line @typescript-eslint/no-floating-promises\n      this.throttledAddEvent({\n        type: EventType.Custom,\n        timestamp: breadcrumb.timestamp || 0,\n        data: {\n          tag: 'breadcrumb',\n          payload: breadcrumb,\n        },\n      });\n    });\n  }\n\n  /**\n   * Observed performance events are added to `this.performanceEntries`. These\n   * are included in the replay event before it is finished and sent to Sentry.\n   */\n  private _addPerformanceEntries(): Promise<Array<AddEventResult | null>> {\n    let performanceEntries = createPerformanceEntries(this.performanceEntries).concat(this.replayPerformanceEntries);\n\n    this.performanceEntries = [];\n    this.replayPerformanceEntries = [];\n\n    // If we are manually starting, we want to ensure we only include performance entries\n    // that are after the initial timestamp\n    // The reason for this is that we may have performance entries from the page load, but may decide to start\n    // the replay later on, in which case we do not want to include these entries.\n    // without this, manually started replays can have events long before the actual replay recording starts,\n    // which messes with the timeline etc.\n    if (this._requiresManualStart) {\n      const initialTimestampInSeconds = this._context.initialTimestamp / 1000;\n      performanceEntries = performanceEntries.filter(entry => entry.start >= initialTimestampInSeconds);\n    }\n\n    return Promise.all(createPerformanceSpans(this, performanceEntries));\n  }\n\n  /**\n   * Clear _context\n   */\n  private _clearContext(): void {\n    // XXX: `initialTimestamp` and `initialUrl` do not get cleared\n    this._context.errorIds.clear();\n    this._context.traceIds.clear();\n    this._context.urls = [];\n  }\n\n  /** Update the initial timestamp based on the buffer content. */\n  private _updateInitialTimestampFromEventBuffer(): void {\n    const { session, eventBuffer } = this;\n    // If replay was started manually (=no sample rate was given),\n    // We do not want to back-port the initial timestamp\n    if (!session || !eventBuffer || this._requiresManualStart) {\n      return;\n    }\n\n    // we only ever update this on the initial segment\n    if (session.segmentId) {\n      return;\n    }\n\n    const earliestEvent = eventBuffer.getEarliestTimestamp();\n    if (earliestEvent && earliestEvent < this._context.initialTimestamp) {\n      this._context.initialTimestamp = earliestEvent;\n    }\n  }\n\n  /**\n   * Return and clear _context\n   */\n  private _popEventContext(): PopEventContext {\n    const _context = {\n      initialTimestamp: this._context.initialTimestamp,\n      initialUrl: this._context.initialUrl,\n      errorIds: Array.from(this._context.errorIds),\n      traceIds: Array.from(this._context.traceIds),\n      urls: this._context.urls,\n    };\n\n    this._clearContext();\n\n    return _context;\n  }\n\n  /**\n   * Flushes replay event buffer to Sentry.\n   *\n   * Performance events are only added right before flushing - this is\n   * due to the buffered performance observer events.\n   *\n   * Should never be called directly, only by `flush`\n   */\n  private async _runFlush(): Promise<void> {\n    const replayId = this.getSessionId();\n\n    if (!this.session || !this.eventBuffer || !replayId) {\n      DEBUG_BUILD && logger.error('No session or eventBuffer found to flush.');\n      return;\n    }\n\n    await this._addPerformanceEntries();\n\n    // Check eventBuffer again, as it could have been stopped in the meanwhile\n    if (!this.eventBuffer || !this.eventBuffer.hasEvents) {\n      return;\n    }\n\n    // Only attach memory event if eventBuffer is not empty\n    await addMemoryEntry(this);\n\n    // Check eventBuffer again, as it could have been stopped in the meanwhile\n    if (!this.eventBuffer) {\n      return;\n    }\n\n    // if this changed in the meanwhile, e.g. because the session was refreshed or similar, we abort here\n    if (replayId !== this.getSessionId()) {\n      return;\n    }\n\n    try {\n      // This uses the data from the eventBuffer, so we need to call this before `finish()\n      this._updateInitialTimestampFromEventBuffer();\n\n      const timestamp = Date.now();\n\n      // Check total duration again, to avoid sending outdated stuff\n      // We leave 30s wiggle room to accommodate late flushing etc.\n      // This _could_ happen when the browser is suspended during flushing, in which case we just want to stop\n      if (timestamp - this._context.initialTimestamp > this._options.maxReplayDuration + 30_000) {\n        throw new Error('Session is too long, not sending replay');\n      }\n\n      const eventContext = this._popEventContext();\n      // Always increment segmentId regardless of outcome of sending replay\n      const segmentId = this.session.segmentId++;\n      this._maybeSaveSession();\n\n      // Note this empties the event buffer regardless of outcome of sending replay\n      const recordingData = await this.eventBuffer.finish();\n\n      await sendReplay({\n        replayId,\n        recordingData,\n        segmentId,\n        eventContext,\n        session: this.session,\n        timestamp,\n        onError: err => this.handleException(err),\n      });\n    } catch (err) {\n      this.handleException(err);\n\n      // This means we retried 3 times and all of them failed,\n      // or we ran into a problem we don't want to retry, like rate limiting.\n      // In this case, we want to completely stop the replay - otherwise, we may get inconsistent segments\n      // This should never reject\n      // eslint-disable-next-line @typescript-eslint/no-floating-promises\n      this.stop({ reason: 'sendReplay' });\n\n      const client = getClient();\n\n      if (client) {\n        const dropReason = err instanceof RateLimitError ? 'ratelimit_backoff' : 'send_error';\n        client.recordDroppedEvent(dropReason, 'replay');\n      }\n    }\n  }\n\n  /**\n   * Flush recording data to Sentry. Creates a lock so that only a single flush\n   * can be active at a time. Do not call this directly.\n   */\n  private _flush = async ({\n    force = false,\n  }: {\n    /**\n     * If true, flush while ignoring the `_isEnabled` state of\n     * Replay integration. (By default, flush is noop if integration\n     * is stopped).\n     */\n    force?: boolean;\n  } = {}): Promise<void> => {\n    if (!this._isEnabled && !force) {\n      // This can happen if e.g. the replay was stopped because of exceeding the retry limit\n      return;\n    }\n\n    if (!this.checkAndHandleExpiredSession()) {\n      DEBUG_BUILD && logger.error('Attempting to finish replay event after session expired.');\n      return;\n    }\n\n    if (!this.session) {\n      // should never happen, as we would have bailed out before\n      return;\n    }\n\n    const start = this.session.started;\n    const now = Date.now();\n    const duration = now - start;\n\n    // A flush is about to happen, cancel any queued flushes\n    this._debouncedFlush.cancel();\n\n    // If session is too short, or too long (allow some wiggle room over maxReplayDuration), do not send it\n    // This _should_ not happen, but it may happen if flush is triggered due to a page activity change or similar\n    const tooShort = duration < this._options.minReplayDuration;\n    const tooLong = duration > this._options.maxReplayDuration + 5_000;\n    if (tooShort || tooLong) {\n      DEBUG_BUILD &&\n        logger.info(\n          `Session duration (${Math.floor(duration / 1000)}s) is too ${\n            tooShort ? 'short' : 'long'\n          }, not sending replay.`,\n        );\n\n      if (tooShort) {\n        this._debouncedFlush();\n      }\n      return;\n    }\n\n    const eventBuffer = this.eventBuffer;\n    if (eventBuffer && this.session.segmentId === 0 && !eventBuffer.hasCheckout) {\n      DEBUG_BUILD && logger.info('Flushing initial segment without checkout.');\n      // TODO FN: Evaluate if we want to stop here, or remove this again?\n    }\n\n    const _flushInProgress = !!this._flushLock;\n\n    // this._flushLock acts as a lock so that future calls to `_flush()` will\n    // be blocked until current flush is finished (i.e. this promise resolves)\n    if (!this._flushLock) {\n      this._flushLock = this._runFlush();\n    }\n\n    try {\n      await this._flushLock;\n    } catch (err) {\n      this.handleException(err);\n    } finally {\n      this._flushLock = undefined;\n\n      if (_flushInProgress) {\n        // Wait for previous flush to finish, then call the debounced\n        // `_flush()`. It's possible there are other flush requests queued and\n        // waiting for it to resolve. We want to reduce all outstanding\n        // requests (as well as any new flush requests that occur within a\n        // second of the locked flush completing) into a single flush.\n        this._debouncedFlush();\n      }\n    }\n  };\n\n  /** Save the session, if it is sticky */\n  private _maybeSaveSession(): void {\n    if (this.session && this._options.stickySession) {\n      saveSession(this.session);\n    }\n  }\n\n  /** Handler for rrweb.record.onMutation */\n  private _onMutationHandler = (mutations: unknown[]): boolean => {\n    const count = mutations.length;\n\n    const mutationLimit = this._options.mutationLimit;\n    const mutationBreadcrumbLimit = this._options.mutationBreadcrumbLimit;\n    const overMutationLimit = mutationLimit && count > mutationLimit;\n\n    // Create a breadcrumb if a lot of mutations happen at the same time\n    // We can show this in the UI as an information with potential performance improvements\n    if (count > mutationBreadcrumbLimit || overMutationLimit) {\n      const breadcrumb = createBreadcrumb({\n        category: 'replay.mutations',\n        data: {\n          count,\n          limit: overMutationLimit,\n        },\n      });\n      this._createCustomBreadcrumb(breadcrumb);\n    }\n\n    // Stop replay if over the mutation limit\n    if (overMutationLimit) {\n      // This should never reject\n      // eslint-disable-next-line @typescript-eslint/no-floating-promises\n      this.stop({ reason: 'mutationLimit', forceFlush: this.recordingMode === 'session' });\n      return false;\n    }\n\n    // `true` means we use the regular mutation handling by rrweb\n    return true;\n  };\n}\n","import { setTimeout } from '@sentry-internal/browser-utils';\n\ntype DebouncedCallback = {\n  (): void | unknown;\n  flush: () => void | unknown;\n  cancel: () => void;\n};\ntype CallbackFunction = () => unknown;\ntype DebounceOptions = { maxWait?: number };\n\n/**\n * Heavily simplified debounce function based on lodash.debounce.\n *\n * This function takes a callback function (@param fun) and delays its invocation\n * by @param wait milliseconds. Optionally, a maxWait can be specified in @param options,\n * which ensures that the callback is invoked at least once after the specified max. wait time.\n *\n * @param func the function whose invocation is to be debounced\n * @param wait the minimum time until the function is invoked after it was called once\n * @param options the options object, which can contain the `maxWait` property\n *\n * @returns the debounced version of the function, which needs to be called at least once to start the\n *          debouncing process. Subsequent calls will reset the debouncing timer and, in case @paramfunc\n *          was already invoked in the meantime, return @param func's return value.\n *          The debounced function has two additional properties:\n *          - `flush`: Invokes the debounced function immediately and returns its return value\n *          - `cancel`: Cancels the debouncing process and resets the debouncing timer\n */\nexport function debounce(func: CallbackFunction, wait: number, options?: DebounceOptions): DebouncedCallback {\n  let callbackReturnValue: unknown;\n\n  let timerId: ReturnType<typeof setTimeout> | undefined;\n  let maxTimerId: ReturnType<typeof setTimeout> | undefined;\n\n  const maxWait = options && options.maxWait ? Math.max(options.maxWait, wait) : 0;\n\n  function invokeFunc(): unknown {\n    cancelTimers();\n    callbackReturnValue = func();\n    return callbackReturnValue;\n  }\n\n  function cancelTimers(): void {\n    timerId !== undefined && clearTimeout(timerId);\n    maxTimerId !== undefined && clearTimeout(maxTimerId);\n    timerId = maxTimerId = undefined;\n  }\n\n  function flush(): unknown {\n    if (timerId !== undefined || maxTimerId !== undefined) {\n      return invokeFunc();\n    }\n    return callbackReturnValue;\n  }\n\n  function debounced(): unknown {\n    if (timerId) {\n      clearTimeout(timerId);\n    }\n    timerId = setTimeout(invokeFunc, wait);\n\n    if (maxWait && maxTimerId === undefined) {\n      maxTimerId = setTimeout(invokeFunc, maxWait);\n    }\n\n    return callbackReturnValue;\n  }\n\n  debounced.cancel = cancelTimers;\n  debounced.flush = flush;\n  return debounced;\n}\n","import { REPLAY_SESSION_KEY, WINDOW } from '../../src/constants';\nimport type { ReplayContainer } from '../../src/types';\nimport { hasSessionStorage } from '../util/hasSessionStorage';\n\n/**\n * Removes the session from Session Storage and unsets session in replay instance\n */\nexport function clearSession(replay: ReplayContainer): void {\n  deleteSession();\n  replay.session = undefined;\n}\n\n/**\n * Deletes a session from storage\n */\nfunction deleteSession(): void {\n  if (!hasSessionStorage()) {\n    return;\n  }\n\n  try {\n    WINDOW.sessionStorage.removeItem(REPLAY_SESSION_KEY);\n  } catch {\n    // Ignore potential SecurityError exceptions\n  }\n}\n","import { getWorkerURL } from '@sentry-internal/replay-worker';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { EventBuffer } from '../types';\nimport { logger } from '../util/logger';\nimport { EventBufferArray } from './EventBufferArray';\nimport { EventBufferProxy } from './EventBufferProxy';\n\ninterface CreateEventBufferParams {\n  useCompression: boolean;\n  workerUrl?: string;\n}\n\n// Treeshakable guard to remove the code of the included compression worker\ndeclare const __SENTRY_EXCLUDE_REPLAY_WORKER__: boolean;\n\n/**\n * Create an event buffer for replays.\n */\nexport function createEventBuffer({\n  useCompression,\n  workerUrl: customWorkerUrl,\n}: CreateEventBufferParams): EventBuffer {\n  if (\n    useCompression &&\n    // eslint-disable-next-line no-restricted-globals\n    window.Worker\n  ) {\n    const worker = _loadWorker(customWorkerUrl);\n\n    if (worker) {\n      return worker;\n    }\n  }\n\n  DEBUG_BUILD && logger.info('Using simple buffer');\n  return new EventBufferArray();\n}\n\nfunction _loadWorker(customWorkerUrl?: string): EventBufferProxy | void {\n  try {\n    const workerUrl = customWorkerUrl || _getWorkerUrl();\n\n    if (!workerUrl) {\n      return;\n    }\n\n    DEBUG_BUILD && logger.info(`Using compression worker${customWorkerUrl ? ` from ${customWorkerUrl}` : ''}`);\n    const worker = new Worker(workerUrl);\n    return new EventBufferProxy(worker);\n  } catch (error) {\n    DEBUG_BUILD && logger.exception(error, 'Failed to create compression worker');\n    // Fall back to use simple event buffer array\n  }\n}\n\nfunction _getWorkerUrl(): string {\n  if (typeof __SENTRY_EXCLUDE_REPLAY_WORKER__ === 'undefined' || !__SENTRY_EXCLUDE_REPLAY_WORKER__) {\n    return getWorkerURL();\n  }\n\n  return '';\n}\n","import r from\"./worker\";function e(){const e=new Blob([r]);return URL.createObjectURL(e)}export{e as getWorkerURL};\n","export default `var t=Uint8Array,n=Uint16Array,r=Int32Array,e=new t([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),i=new t([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),a=new t([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),s=function(t,e){for(var i=new n(31),a=0;a<31;++a)i[a]=e+=1<<t[a-1];var s=new r(i[30]);for(a=1;a<30;++a)for(var o=i[a];o<i[a+1];++o)s[o]=o-i[a]<<5|a;return{b:i,r:s}},o=s(e,2),f=o.b,h=o.r;f[28]=258,h[258]=28;for(var l=s(i,0).r,u=new n(32768),c=0;c<32768;++c){var v=(43690&c)>>1|(21845&c)<<1;v=(61680&(v=(52428&v)>>2|(13107&v)<<2))>>4|(3855&v)<<4,u[c]=((65280&v)>>8|(255&v)<<8)>>1}var d=function(t,r,e){for(var i=t.length,a=0,s=new n(r);a<i;++a)t[a]&&++s[t[a]-1];var o,f=new n(r);for(a=1;a<r;++a)f[a]=f[a-1]+s[a-1]<<1;if(e){o=new n(1<<r);var h=15-r;for(a=0;a<i;++a)if(t[a])for(var l=a<<4|t[a],c=r-t[a],v=f[t[a]-1]++<<c,d=v|(1<<c)-1;v<=d;++v)o[u[v]>>h]=l}else for(o=new n(i),a=0;a<i;++a)t[a]&&(o[a]=u[f[t[a]-1]++]>>15-t[a]);return o},g=new t(288);for(c=0;c<144;++c)g[c]=8;for(c=144;c<256;++c)g[c]=9;for(c=256;c<280;++c)g[c]=7;for(c=280;c<288;++c)g[c]=8;var w=new t(32);for(c=0;c<32;++c)w[c]=5;var p=d(g,9,0),y=d(w,5,0),m=function(t){return(t+7)/8|0},b=function(n,r,e){return(null==e||e>n.length)&&(e=n.length),new t(n.subarray(r,e))},M=[\"unexpected EOF\",\"invalid block type\",\"invalid length/literal\",\"invalid distance\",\"stream finished\",\"no stream handler\",,\"no callback\",\"invalid UTF-8 data\",\"extra field too long\",\"date not in range 1980-2099\",\"filename too long\",\"stream finishing\",\"invalid zip data\"],E=function(t,n,r){var e=new Error(n||M[t]);if(e.code=t,Error.captureStackTrace&&Error.captureStackTrace(e,E),!r)throw e;return e},z=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8},_=function(t,n,r){r<<=7&n;var e=n/8|0;t[e]|=r,t[e+1]|=r>>8,t[e+2]|=r>>16},x=function(r,e){for(var i=[],a=0;a<r.length;++a)r[a]&&i.push({s:a,f:r[a]});var s=i.length,o=i.slice();if(!s)return{t:F,l:0};if(1==s){var f=new t(i[0].s+1);return f[i[0].s]=1,{t:f,l:1}}i.sort((function(t,n){return t.f-n.f})),i.push({s:-1,f:25001});var h=i[0],l=i[1],u=0,c=1,v=2;for(i[0]={s:-1,f:h.f+l.f,l:h,r:l};c!=s-1;)h=i[i[u].f<i[v].f?u++:v++],l=i[u!=c&&i[u].f<i[v].f?u++:v++],i[c++]={s:-1,f:h.f+l.f,l:h,r:l};var d=o[0].s;for(a=1;a<s;++a)o[a].s>d&&(d=o[a].s);var g=new n(d+1),w=A(i[c-1],g,0);if(w>e){a=0;var p=0,y=w-e,m=1<<y;for(o.sort((function(t,n){return g[n.s]-g[t.s]||t.f-n.f}));a<s;++a){var b=o[a].s;if(!(g[b]>e))break;p+=m-(1<<w-g[b]),g[b]=e}for(p>>=y;p>0;){var M=o[a].s;g[M]<e?p-=1<<e-g[M]++-1:++a}for(;a>=0&&p;--a){var E=o[a].s;g[E]==e&&(--g[E],++p)}w=e}return{t:new t(g),l:w}},A=function(t,n,r){return-1==t.s?Math.max(A(t.l,n,r+1),A(t.r,n,r+1)):n[t.s]=r},D=function(t){for(var r=t.length;r&&!t[--r];);for(var e=new n(++r),i=0,a=t[0],s=1,o=function(t){e[i++]=t},f=1;f<=r;++f)if(t[f]==a&&f!=r)++s;else{if(!a&&s>2){for(;s>138;s-=138)o(32754);s>2&&(o(s>10?s-11<<5|28690:s-3<<5|12305),s=0)}else if(s>3){for(o(a),--s;s>6;s-=6)o(8304);s>2&&(o(s-3<<5|8208),s=0)}for(;s--;)o(a);s=1,a=t[f]}return{c:e.subarray(0,i),n:r}},T=function(t,n){for(var r=0,e=0;e<n.length;++e)r+=t[e]*n[e];return r},k=function(t,n,r){var e=r.length,i=m(n+2);t[i]=255&e,t[i+1]=e>>8,t[i+2]=255^t[i],t[i+3]=255^t[i+1];for(var a=0;a<e;++a)t[i+a+4]=r[a];return 8*(i+4+e)},U=function(t,r,s,o,f,h,l,u,c,v,m){z(r,m++,s),++f[256];for(var b=x(f,15),M=b.t,E=b.l,A=x(h,15),U=A.t,C=A.l,F=D(M),I=F.c,S=F.n,L=D(U),O=L.c,j=L.n,q=new n(19),B=0;B<I.length;++B)++q[31&I[B]];for(B=0;B<O.length;++B)++q[31&O[B]];for(var G=x(q,7),H=G.t,J=G.l,K=19;K>4&&!H[a[K-1]];--K);var N,P,Q,R,V=v+5<<3,W=T(f,g)+T(h,w)+l,X=T(f,M)+T(h,U)+l+14+3*K+T(q,H)+2*q[16]+3*q[17]+7*q[18];if(c>=0&&V<=W&&V<=X)return k(r,m,t.subarray(c,c+v));if(z(r,m,1+(X<W)),m+=2,X<W){N=d(M,E,0),P=M,Q=d(U,C,0),R=U;var Y=d(H,J,0);z(r,m,S-257),z(r,m+5,j-1),z(r,m+10,K-4),m+=14;for(B=0;B<K;++B)z(r,m+3*B,H[a[B]]);m+=3*K;for(var Z=[I,O],$=0;$<2;++$){var tt=Z[$];for(B=0;B<tt.length;++B){var nt=31&tt[B];z(r,m,Y[nt]),m+=H[nt],nt>15&&(z(r,m,tt[B]>>5&127),m+=tt[B]>>12)}}}else N=p,P=g,Q=y,R=w;for(B=0;B<u;++B){var rt=o[B];if(rt>255){_(r,m,N[(nt=rt>>18&31)+257]),m+=P[nt+257],nt>7&&(z(r,m,rt>>23&31),m+=e[nt]);var et=31&rt;_(r,m,Q[et]),m+=R[et],et>3&&(_(r,m,rt>>5&8191),m+=i[et])}else _(r,m,N[rt]),m+=P[rt]}return _(r,m,N[256]),m+P[256]},C=new r([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),F=new t(0),I=function(){for(var t=new Int32Array(256),n=0;n<256;++n){for(var r=n,e=9;--e;)r=(1&r&&-306674912)^r>>>1;t[n]=r}return t}(),S=function(){var t=-1;return{p:function(n){for(var r=t,e=0;e<n.length;++e)r=I[255&r^n[e]]^r>>>8;t=r},d:function(){return~t}}},L=function(){var t=1,n=0;return{p:function(r){for(var e=t,i=n,a=0|r.length,s=0;s!=a;){for(var o=Math.min(s+2655,a);s<o;++s)i+=e+=r[s];e=(65535&e)+15*(e>>16),i=(65535&i)+15*(i>>16)}t=e,n=i},d:function(){return(255&(t%=65521))<<24|(65280&t)<<8|(255&(n%=65521))<<8|n>>8}}},O=function(a,s,o,f,u){if(!u&&(u={l:1},s.dictionary)){var c=s.dictionary.subarray(-32768),v=new t(c.length+a.length);v.set(c),v.set(a,c.length),a=v,u.w=c.length}return function(a,s,o,f,u,c){var v=c.z||a.length,d=new t(f+v+5*(1+Math.ceil(v/7e3))+u),g=d.subarray(f,d.length-u),w=c.l,p=7&(c.r||0);if(s){p&&(g[0]=c.r>>3);for(var y=C[s-1],M=y>>13,E=8191&y,z=(1<<o)-1,_=c.p||new n(32768),x=c.h||new n(z+1),A=Math.ceil(o/3),D=2*A,T=function(t){return(a[t]^a[t+1]<<A^a[t+2]<<D)&z},F=new r(25e3),I=new n(288),S=new n(32),L=0,O=0,j=c.i||0,q=0,B=c.w||0,G=0;j+2<v;++j){var H=T(j),J=32767&j,K=x[H];if(_[J]=K,x[H]=J,B<=j){var N=v-j;if((L>7e3||q>24576)&&(N>423||!w)){p=U(a,g,0,F,I,S,O,q,G,j-G,p),q=L=O=0,G=j;for(var P=0;P<286;++P)I[P]=0;for(P=0;P<30;++P)S[P]=0}var Q=2,R=0,V=E,W=J-K&32767;if(N>2&&H==T(j-W))for(var X=Math.min(M,N)-1,Y=Math.min(32767,j),Z=Math.min(258,N);W<=Y&&--V&&J!=K;){if(a[j+Q]==a[j+Q-W]){for(var $=0;$<Z&&a[j+$]==a[j+$-W];++$);if($>Q){if(Q=$,R=W,$>X)break;var tt=Math.min(W,$-2),nt=0;for(P=0;P<tt;++P){var rt=j-W+P&32767,et=rt-_[rt]&32767;et>nt&&(nt=et,K=rt)}}}W+=(J=K)-(K=_[J])&32767}if(R){F[q++]=268435456|h[Q]<<18|l[R];var it=31&h[Q],at=31&l[R];O+=e[it]+i[at],++I[257+it],++S[at],B=j+Q,++L}else F[q++]=a[j],++I[a[j]]}}for(j=Math.max(j,B);j<v;++j)F[q++]=a[j],++I[a[j]];p=U(a,g,w,F,I,S,O,q,G,j-G,p),w||(c.r=7&p|g[p/8|0]<<3,p-=7,c.h=x,c.p=_,c.i=j,c.w=B)}else{for(j=c.w||0;j<v+w;j+=65535){var st=j+65535;st>=v&&(g[p/8|0]=w,st=v),p=k(g,p+1,a.subarray(j,st))}c.i=v}return b(d,0,f+m(p)+u)}(a,null==s.level?6:s.level,null==s.mem?Math.ceil(1.5*Math.max(8,Math.min(13,Math.log(a.length)))):12+s.mem,o,f,u)},j=function(t,n,r){for(;r;++n)t[n]=r,r>>>=8},q=function(t,n){var r=n.filename;if(t[0]=31,t[1]=139,t[2]=8,t[8]=n.level<2?4:9==n.level?2:0,t[9]=3,0!=n.mtime&&j(t,4,Math.floor(new Date(n.mtime||Date.now())/1e3)),r){t[3]=8;for(var e=0;e<=r.length;++e)t[e+10]=r.charCodeAt(e)}},B=function(t){return 10+(t.filename?t.filename.length+1:0)},G=function(){function n(n,r){if(\"function\"==typeof n&&(r=n,n={}),this.ondata=r,this.o=n||{},this.s={l:0,i:32768,w:32768,z:32768},this.b=new t(98304),this.o.dictionary){var e=this.o.dictionary.subarray(-32768);this.b.set(e,32768-e.length),this.s.i=32768-e.length}}return n.prototype.p=function(t,n){this.ondata(O(t,this.o,0,0,this.s),n)},n.prototype.push=function(n,r){this.ondata||E(5),this.s.l&&E(4);var e=n.length+this.s.z;if(e>this.b.length){if(e>2*this.b.length-32768){var i=new t(-32768&e);i.set(this.b.subarray(0,this.s.z)),this.b=i}var a=this.b.length-this.s.z;a&&(this.b.set(n.subarray(0,a),this.s.z),this.s.z=this.b.length,this.p(this.b,!1)),this.b.set(this.b.subarray(-32768)),this.b.set(n.subarray(a),32768),this.s.z=n.length-a+32768,this.s.i=32766,this.s.w=32768}else this.b.set(n,this.s.z),this.s.z+=n.length;this.s.l=1&r,(this.s.z>this.s.w+8191||r)&&(this.p(this.b,r||!1),this.s.w=this.s.i,this.s.i-=2)},n}();var H=function(){function t(t,n){this.c=L(),this.v=1,G.call(this,t,n)}return t.prototype.push=function(t,n){this.c.p(t),G.prototype.push.call(this,t,n)},t.prototype.p=function(t,n){var r=O(t,this.o,this.v&&(this.o.dictionary?6:2),n&&4,this.s);this.v&&(function(t,n){var r=n.level,e=0==r?0:r<6?1:9==r?3:2;if(t[0]=120,t[1]=e<<6|(n.dictionary&&32),t[1]|=31-(t[0]<<8|t[1])%31,n.dictionary){var i=L();i.p(n.dictionary),j(t,2,i.d())}}(r,this.o),this.v=0),n&&j(r,r.length-4,this.c.d()),this.ondata(r,n)},t}(),J=\"undefined\"!=typeof TextEncoder&&new TextEncoder,K=\"undefined\"!=typeof TextDecoder&&new TextDecoder;try{K.decode(F,{stream:!0})}catch(t){}var N=function(){function t(t){this.ondata=t}return t.prototype.push=function(t,n){this.ondata||E(5),this.d&&E(4),this.ondata(P(t),this.d=n||!1)},t}();function P(n,r){if(J)return J.encode(n);for(var e=n.length,i=new t(n.length+(n.length>>1)),a=0,s=function(t){i[a++]=t},o=0;o<e;++o){if(a+5>i.length){var f=new t(a+8+(e-o<<1));f.set(i),i=f}var h=n.charCodeAt(o);h<128||r?s(h):h<2048?(s(192|h>>6),s(128|63&h)):h>55295&&h<57344?(s(240|(h=65536+(1047552&h)|1023&n.charCodeAt(++o))>>18),s(128|h>>12&63),s(128|h>>6&63),s(128|63&h)):(s(224|h>>12),s(128|h>>6&63),s(128|63&h))}return b(i,0,a)}function Q(t){return function(t,n){n||(n={});var r=S(),e=t.length;r.p(t);var i=O(t,n,B(n),8),a=i.length;return q(i,n),j(i,a-8,r.d()),j(i,a-4,e),i}(P(t))}const R=new class{constructor(){this._init()}clear(){this._init()}addEvent(t){if(!t)throw new Error(\"Adding invalid event\");const n=this._hasEvents?\",\":\"\";this.stream.push(n+t),this._hasEvents=!0}finish(){this.stream.push(\"]\",!0);const t=function(t){let n=0;for(const r of t)n+=r.length;const r=new Uint8Array(n);for(let n=0,e=0,i=t.length;n<i;n++){const i=t[n];r.set(i,e),e+=i.length}return r}(this._deflatedData);return this._init(),t}_init(){this._hasEvents=!1,this._deflatedData=[],this.deflate=new H,this.deflate.ondata=(t,n)=>{this._deflatedData.push(t)},this.stream=new N(((t,n)=>{this.deflate.push(t,n)})),this.stream.push(\"[\")}},V={clear:()=>{R.clear()},addEvent:t=>R.addEvent(t),finish:()=>R.finish(),compress:t=>Q(t)};addEventListener(\"message\",(function(t){const n=t.data.method,r=t.data.id,e=t.data.arg;if(n in V&&\"function\"==typeof V[n])try{const t=V[n](e);postMessage({id:r,method:n,success:!0,response:t})}catch(t){postMessage({id:r,method:n,success:!1,response:t.message}),console.error(t)}})),postMessage({id:void 0,method:\"init\",success:!0,response:void 0});`;\n","import {\n  addClickKeypressInstrumentationHandler,\n  addHistoryInstrumentationHandler,\n} from '@sentry-internal/browser-utils';\nimport { addEventProcessor, getClient } from '@sentry/core';\nimport type { DynamicSamplingContext } from '@sentry/core';\n\nimport { handleAfterSendEvent } from '../coreHandlers/handleAfterSendEvent';\nimport { handleBeforeSendEvent } from '../coreHandlers/handleBeforeSendEvent';\nimport { handleBreadcrumbs } from '../coreHandlers/handleBreadcrumbs';\nimport { handleDomListener } from '../coreHandlers/handleDom';\nimport { handleGlobalEventListener } from '../coreHandlers/handleGlobalEvent';\nimport { handleHistorySpanListener } from '../coreHandlers/handleHistory';\nimport { handleNetworkBreadcrumbs } from '../coreHandlers/handleNetworkBreadcrumbs';\nimport type { ReplayContainer } from '../types';\n\n/**\n * Add global listeners that cannot be removed.\n */\nexport function addGlobalListeners(replay: ReplayContainer): void {\n  // Listeners from core SDK //\n  const client = getClient();\n\n  addClickKeypressInstrumentationHandler(handleDomListener(replay));\n  addHistoryInstrumentationHandler(handleHistorySpanListener(replay));\n  handleBreadcrumbs(replay);\n  handleNetworkBreadcrumbs(replay);\n\n  // Tag all (non replay) events that get sent to Sentry with the current\n  // replay ID so that we can reference them later in the UI\n  const eventProcessor = handleGlobalEventListener(replay);\n  addEventProcessor(eventProcessor);\n\n  // If a custom client has no hooks yet, we continue to use the \"old\" implementation\n  if (client) {\n    client.on('beforeSendEvent', handleBeforeSendEvent(replay));\n    client.on('afterSendEvent', handleAfterSendEvent(replay));\n    client.on('createDsc', (dsc: DynamicSamplingContext) => {\n      const replayId = replay.getSessionId();\n      // We do not want to set the DSC when in buffer mode, as that means the replay has not been sent (yet)\n      if (replayId && replay.isEnabled() && replay.recordingMode === 'session') {\n        // Ensure to check that the session is still active - it could have expired in the meanwhile\n        const isSessionActive = replay.checkAndHandleExpiredSession();\n        if (isSessionActive) {\n          dsc.replay_id = replayId;\n        }\n      }\n    });\n\n    client.on('spanStart', span => {\n      replay.lastActiveSpan = span;\n    });\n\n    // We may be missing the initial spanStart due to timing issues,\n    // so we capture it on finish again.\n    client.on('spanEnd', span => {\n      replay.lastActiveSpan = span;\n    });\n\n    // We want to flush replay\n    client.on('beforeSendFeedback', (feedbackEvent, options) => {\n      const replayId = replay.getSessionId();\n      if (options && options.includeReplay && replay.isEnabled() && replayId) {\n        // This should never reject\n        if (feedbackEvent.contexts && feedbackEvent.contexts.feedback) {\n          feedbackEvent.contexts.feedback.replay_id = replayId;\n        }\n      }\n    });\n  }\n}\n","import type { HandlerDataHistory } from '@sentry/core';\n\nimport type { HistoryData, ReplayContainer, ReplayPerformanceEntry } from '../types';\nimport { createPerformanceSpans } from '../util/createPerformanceSpans';\n\nfunction handleHistory(handlerData: HandlerDataHistory): ReplayPerformanceEntry<HistoryData> {\n  const { from, to } = handlerData;\n\n  const now = Date.now() / 1000;\n\n  return {\n    type: 'navigation.push',\n    start: now,\n    end: now,\n    name: to,\n    data: {\n      previous: from,\n    },\n  };\n}\n\n/**\n * Returns a listener to be added to `addHistoryInstrumentationHandler(listener)`.\n */\nexport function handleHistorySpanListener(replay: ReplayContainer): (handlerData: HandlerDataHistory) => void {\n  return (handlerData: HandlerDataHistory) => {\n    if (!replay.isEnabled()) {\n      return;\n    }\n\n    const result = handleHistory(handlerData);\n\n    if (result === null) {\n      return;\n    }\n\n    // Need to collect visited URLs\n    replay.getContext().urls.push(result.name);\n    replay.triggerUserActivity();\n\n    replay.addUpdate(() => {\n      createPerformanceSpans(replay, [result]);\n      // Returning false to flush\n      return false;\n    });\n  };\n}\n","import { getClient } from '@sentry/core';\nimport type { Breadcrumb, BreadcrumbHint, FetchBreadcrumbData, XhrBreadcrumbData } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { FetchHint, ReplayContainer, ReplayNetworkOptions, XhrHint } from '../types';\nimport { logger } from '../util/logger';\nimport { captureFetchBreadcrumbToReplay, enrichFetchBreadcrumb } from './util/fetchUtils';\nimport { captureXhrBreadcrumbToReplay, enrichXhrBreadcrumb } from './util/xhrUtils';\n\ninterface ExtendedNetworkBreadcrumbsOptions extends ReplayNetworkOptions {\n  replay: ReplayContainer;\n}\n\n/**\n * This method does two things:\n * - It enriches the regular XHR/fetch breadcrumbs with request/response size data\n * - It captures the XHR/fetch breadcrumbs to the replay\n *   (enriching it with further data that is _not_ added to the regular breadcrumbs)\n */\nexport function handleNetworkBreadcrumbs(replay: ReplayContainer): void {\n  const client = getClient();\n\n  try {\n    const {\n      networkDetailAllowUrls,\n      networkDetailDenyUrls,\n      networkCaptureBodies,\n      networkRequestHeaders,\n      networkResponseHeaders,\n    } = replay.getOptions();\n\n    const options: ExtendedNetworkBreadcrumbsOptions = {\n      replay,\n      networkDetailAllowUrls,\n      networkDetailDenyUrls,\n      networkCaptureBodies,\n      networkRequestHeaders,\n      networkResponseHeaders,\n    };\n\n    if (client) {\n      client.on('beforeAddBreadcrumb', (breadcrumb, hint) => beforeAddNetworkBreadcrumb(options, breadcrumb, hint));\n    }\n  } catch {\n    // Do nothing\n  }\n}\n\n/** just exported for tests */\nexport function beforeAddNetworkBreadcrumb(\n  options: ExtendedNetworkBreadcrumbsOptions,\n  breadcrumb: Breadcrumb,\n  hint?: BreadcrumbHint,\n): void {\n  if (!breadcrumb.data) {\n    return;\n  }\n\n  try {\n    if (_isXhrBreadcrumb(breadcrumb) && _isXhrHint(hint)) {\n      // This has to be sync, as we need to ensure the breadcrumb is enriched in the same tick\n      // Because the hook runs synchronously, and the breadcrumb is afterwards passed on\n      // So any async mutations to it will not be reflected in the final breadcrumb\n      enrichXhrBreadcrumb(breadcrumb, hint);\n\n      // This call should not reject\n      // eslint-disable-next-line @typescript-eslint/no-floating-promises\n      captureXhrBreadcrumbToReplay(breadcrumb, hint, options);\n    }\n\n    if (_isFetchBreadcrumb(breadcrumb) && _isFetchHint(hint)) {\n      // This has to be sync, as we need to ensure the breadcrumb is enriched in the same tick\n      // Because the hook runs synchronously, and the breadcrumb is afterwards passed on\n      // So any async mutations to it will not be reflected in the final breadcrumb\n      enrichFetchBreadcrumb(breadcrumb, hint);\n\n      // This call should not reject\n      // eslint-disable-next-line @typescript-eslint/no-floating-promises\n      captureFetchBreadcrumbToReplay(breadcrumb, hint, options);\n    }\n  } catch (e) {\n    DEBUG_BUILD && logger.exception(e, 'Error when enriching network breadcrumb');\n  }\n}\n\nfunction _isXhrBreadcrumb(breadcrumb: Breadcrumb): breadcrumb is Breadcrumb & { data: XhrBreadcrumbData } {\n  return breadcrumb.category === 'xhr';\n}\n\nfunction _isFetchBreadcrumb(breadcrumb: Breadcrumb): breadcrumb is Breadcrumb & { data: FetchBreadcrumbData } {\n  return breadcrumb.category === 'fetch';\n}\n\nfunction _isXhrHint(hint?: BreadcrumbHint): hint is XhrHint {\n  return hint && hint.xhr;\n}\n\nfunction _isFetchHint(hint?: BreadcrumbHint): hint is FetchHint {\n  return hint && hint.response;\n}\n","import { SENTRY_XHR_DATA_KEY } from '@sentry-internal/browser-utils';\nimport type { Breadcrumb, XhrBreadcrumbData } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type {\n  NetworkMetaWarning,\n  ReplayContainer,\n  ReplayNetworkOptions,\n  ReplayNetworkRequestData,\n  XhrHint,\n} from '../../types';\nimport { logger } from '../../util/logger';\nimport { addNetworkBreadcrumb } from './addNetworkBreadcrumb';\nimport {\n  buildNetworkRequestOrResponse,\n  buildSkippedNetworkRequestOrResponse,\n  getAllowedHeaders,\n  getBodySize,\n  getBodyString,\n  makeNetworkReplayBreadcrumb,\n  mergeWarning,\n  parseContentLengthHeader,\n  urlMatches,\n} from './networkUtils';\n\n/**\n * Capture an XHR breadcrumb to a replay.\n * This adds additional data (where appropriate).\n */\nexport async function captureXhrBreadcrumbToReplay(\n  breadcrumb: Breadcrumb & { data: XhrBreadcrumbData },\n  hint: Partial<XhrHint>,\n  options: ReplayNetworkOptions & { replay: ReplayContainer },\n): Promise<void> {\n  try {\n    const data = _prepareXhrData(breadcrumb, hint, options);\n\n    // Create a replay performance entry from this breadcrumb\n    const result = makeNetworkReplayBreadcrumb('resource.xhr', data);\n    addNetworkBreadcrumb(options.replay, result);\n  } catch (error) {\n    DEBUG_BUILD && logger.exception(error, 'Failed to capture xhr breadcrumb');\n  }\n}\n\n/**\n * Enrich a breadcrumb with additional data.\n * This has to be sync & mutate the given breadcrumb,\n * as the breadcrumb is afterwards consumed by other handlers.\n */\nexport function enrichXhrBreadcrumb(\n  breadcrumb: Breadcrumb & { data: XhrBreadcrumbData },\n  hint: Partial<XhrHint>,\n): void {\n  const { xhr, input } = hint;\n\n  if (!xhr) {\n    return;\n  }\n\n  const reqSize = getBodySize(input);\n  const resSize = xhr.getResponseHeader('content-length')\n    ? parseContentLengthHeader(xhr.getResponseHeader('content-length'))\n    : _getBodySize(xhr.response, xhr.responseType);\n\n  if (reqSize !== undefined) {\n    breadcrumb.data.request_body_size = reqSize;\n  }\n  if (resSize !== undefined) {\n    breadcrumb.data.response_body_size = resSize;\n  }\n}\n\nfunction _prepareXhrData(\n  breadcrumb: Breadcrumb & { data: XhrBreadcrumbData },\n  hint: Partial<XhrHint>,\n  options: ReplayNetworkOptions,\n): ReplayNetworkRequestData | null {\n  const now = Date.now();\n  const { startTimestamp = now, endTimestamp = now, input, xhr } = hint;\n\n  const {\n    url,\n    method,\n    status_code: statusCode = 0,\n    request_body_size: requestBodySize,\n    response_body_size: responseBodySize,\n  } = breadcrumb.data;\n\n  if (!url) {\n    return null;\n  }\n\n  if (!xhr || !urlMatches(url, options.networkDetailAllowUrls) || urlMatches(url, options.networkDetailDenyUrls)) {\n    const request = buildSkippedNetworkRequestOrResponse(requestBodySize);\n    const response = buildSkippedNetworkRequestOrResponse(responseBodySize);\n    return {\n      startTimestamp,\n      endTimestamp,\n      url,\n      method,\n      statusCode,\n      request,\n      response,\n    };\n  }\n\n  const xhrInfo = xhr[SENTRY_XHR_DATA_KEY];\n  const networkRequestHeaders = xhrInfo\n    ? getAllowedHeaders(xhrInfo.request_headers, options.networkRequestHeaders)\n    : {};\n  const networkResponseHeaders = getAllowedHeaders(getResponseHeaders(xhr), options.networkResponseHeaders);\n\n  const [requestBody, requestWarning] = options.networkCaptureBodies ? getBodyString(input) : [undefined];\n  const [responseBody, responseWarning] = options.networkCaptureBodies ? _getXhrResponseBody(xhr) : [undefined];\n\n  const request = buildNetworkRequestOrResponse(networkRequestHeaders, requestBodySize, requestBody);\n  const response = buildNetworkRequestOrResponse(networkResponseHeaders, responseBodySize, responseBody);\n\n  return {\n    startTimestamp,\n    endTimestamp,\n    url,\n    method,\n    statusCode,\n    request: requestWarning ? mergeWarning(request, requestWarning) : request,\n    response: responseWarning ? mergeWarning(response, responseWarning) : response,\n  };\n}\n\nfunction getResponseHeaders(xhr: XMLHttpRequest): Record<string, string> {\n  const headers = xhr.getAllResponseHeaders();\n\n  if (!headers) {\n    return {};\n  }\n\n  return headers.split('\\r\\n').reduce((acc: Record<string, string>, line: string) => {\n    const [key, value] = line.split(': ') as [string, string | undefined];\n    if (value) {\n      acc[key.toLowerCase()] = value;\n    }\n    return acc;\n  }, {});\n}\n\nfunction _getXhrResponseBody(xhr: XMLHttpRequest): [string | undefined, NetworkMetaWarning?] {\n  // We collect errors that happen, but only log them if we can't get any response body\n  const errors: unknown[] = [];\n\n  try {\n    return [xhr.responseText];\n  } catch (e) {\n    errors.push(e);\n  }\n\n  // Try to manually parse the response body, if responseText fails\n  try {\n    return _parseXhrResponse(xhr.response, xhr.responseType);\n  } catch (e) {\n    errors.push(e);\n  }\n\n  DEBUG_BUILD && logger.warn('Failed to get xhr response body', ...errors);\n\n  return [undefined];\n}\n\n/**\n * Get the string representation of the XHR response.\n * Based on MDN, these are the possible types of the response:\n * string\n * ArrayBuffer\n * Blob\n * Document\n * POJO\n *\n * Exported only for tests.\n */\nexport function _parseXhrResponse(\n  body: XMLHttpRequest['response'],\n  responseType: XMLHttpRequest['responseType'],\n): [string | undefined, NetworkMetaWarning?] {\n  try {\n    if (typeof body === 'string') {\n      return [body];\n    }\n\n    if (body instanceof Document) {\n      return [body.body.outerHTML];\n    }\n\n    if (responseType === 'json' && body && typeof body === 'object') {\n      return [JSON.stringify(body)];\n    }\n\n    if (!body) {\n      return [undefined];\n    }\n  } catch (error) {\n    DEBUG_BUILD && logger.exception(error, 'Failed to serialize body', body);\n    return [undefined, 'BODY_PARSE_ERROR'];\n  }\n\n  DEBUG_BUILD && logger.info('Skipping network body because of body type', body);\n\n  return [undefined, 'UNPARSEABLE_BODY_TYPE'];\n}\n\nfunction _getBodySize(\n  body: XMLHttpRequest['response'],\n  responseType: XMLHttpRequest['responseType'],\n): number | undefined {\n  try {\n    const bodyStr = responseType === 'json' && body && typeof body === 'object' ? JSON.stringify(body) : body;\n    return getBodySize(bodyStr);\n  } catch {\n    return undefined;\n  }\n}\n","import type { Event, EventHint } from '@sentry/core';\n\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { ReplayContainer } from '../types';\nimport { isErrorEvent, isFeedbackEvent, isReplayEvent, isTransactionEvent } from '../util/eventUtils';\nimport { isRrwebError } from '../util/isRrwebError';\nimport { logger } from '../util/logger';\nimport { resetReplayIdOnDynamicSamplingContext } from '../util/resetReplayIdOnDynamicSamplingContext';\nimport { addFeedbackBreadcrumb } from './util/addFeedbackBreadcrumb';\nimport { shouldSampleForBufferEvent } from './util/shouldSampleForBufferEvent';\n\n/**\n * Returns a listener to be added to `addEventProcessor(listener)`.\n */\nexport function handleGlobalEventListener(replay: ReplayContainer): (event: Event, hint: EventHint) => Event | null {\n  return Object.assign(\n    (event: Event, hint: EventHint) => {\n      // Do nothing if replay has been disabled or paused\n      if (!replay.isEnabled() || replay.isPaused()) {\n        return event;\n      }\n\n      if (isReplayEvent(event)) {\n        // Replays have separate set of breadcrumbs, do not include breadcrumbs\n        // from core SDK\n        delete event.breadcrumbs;\n        return event;\n      }\n\n      // We only want to handle errors, transactions, and feedbacks, nothing else\n      if (!isErrorEvent(event) && !isTransactionEvent(event) && !isFeedbackEvent(event)) {\n        return event;\n      }\n\n      // Ensure we do not add replay_id if the session is expired\n      const isSessionActive = replay.checkAndHandleExpiredSession();\n      if (!isSessionActive) {\n        // prevent exceeding replay durations by removing the expired replayId from the DSC\n        resetReplayIdOnDynamicSamplingContext();\n        return event;\n      }\n\n      if (isFeedbackEvent(event)) {\n        // This should never reject\n        // eslint-disable-next-line @typescript-eslint/no-floating-promises\n        replay.flush();\n        event.contexts.feedback.replay_id = replay.getSessionId();\n        // Add a replay breadcrumb for this piece of feedback\n        addFeedbackBreadcrumb(replay, event);\n        return event;\n      }\n\n      // Unless `captureExceptions` is enabled, we want to ignore errors coming from rrweb\n      // As there can be a bunch of stuff going wrong in internals there, that we don't want to bubble up to users\n      if (isRrwebError(event, hint) && !replay.getOptions()._experiments.captureExceptions) {\n        DEBUG_BUILD && logger.log('Ignoring error from rrweb internals', event);\n        return null;\n      }\n\n      // When in buffer mode, we decide to sample here.\n      // Later, in `handleAfterSendEvent`, if the replayId is set, we know that we sampled\n      // And convert the buffer session to a full session\n      const isErrorEventSampled = shouldSampleForBufferEvent(replay, event);\n\n      // Tag errors if it has been sampled in buffer mode, or if it is session mode\n      // Only tag transactions if in session mode\n      const shouldTagReplayId = isErrorEventSampled || replay.recordingMode === 'session';\n\n      if (shouldTagReplayId) {\n        event.tags = { ...event.tags, replayId: replay.getSessionId() };\n      }\n\n      return event;\n    },\n    { id: 'Replay' },\n  );\n}\n","import { EventType } from '@sentry-internal/rrweb';\nimport type { FeedbackEvent } from '@sentry/core';\n\nimport type { ReplayBreadcrumbFrameEvent, ReplayContainer } from '../../types';\n\n/**\n * Add a feedback breadcrumb event to replay.\n */\nexport function addFeedbackBreadcrumb(replay: ReplayContainer, event: FeedbackEvent): void {\n  replay.triggerUserActivity();\n  replay.addUpdate(() => {\n    if (!event.timestamp) {\n      // Ignore events that don't have timestamps (this shouldn't happen, more of a typing issue)\n      // Return true here so that we don't flush\n      return true;\n    }\n\n    // This should never reject\n    // eslint-disable-next-line @typescript-eslint/no-floating-promises\n    replay.throttledAddEvent({\n      type: EventType.Custom,\n      timestamp: event.timestamp * 1000,\n      data: {\n        tag: 'breadcrumb',\n        payload: {\n          timestamp: event.timestamp,\n          type: 'default',\n          category: 'sentry.feedback',\n          data: {\n            feedbackId: event.event_id,\n          },\n        },\n      },\n    } as ReplayBreadcrumbFrameEvent);\n\n    return false;\n  });\n}\n","import type { Event, EventHint } from '@sentry/core';\n\n/**\n * Returns true if we think the given event is an error originating inside of rrweb.\n */\nexport function isRrwebError(event: Event, hint: EventHint): boolean {\n  if (event.type || !event.exception || !event.exception.values || !event.exception.values.length) {\n    return false;\n  }\n\n  // @ts-expect-error this may be set by rrweb when it finds errors\n  if (hint.originalException && hint.originalException.__rrweb__) {\n    return true;\n  }\n\n  return false;\n}\n","import type { Event } from '@sentry/core';\n\nimport { UNABLE_TO_SEND_REPLAY } from '../../constants';\nimport type { ReplayContainer } from '../../types';\nimport { isSampled } from '../../util/isSampled';\n\n/**\n * Determine if event should be sampled (only applies in buffer mode).\n * When an event is captured by `handleGlobalEvent`, when in buffer mode\n * we determine if we want to sample the error or not.\n */\nexport function shouldSampleForBufferEvent(replay: ReplayContainer, event: Event): boolean {\n  if (replay.recordingMode !== 'buffer') {\n    return false;\n  }\n\n  // ignore this error because otherwise we could loop indefinitely with\n  // trying to capture replay and failing\n  if (event.message === UNABLE_TO_SEND_REPLAY) {\n    return false;\n  }\n\n  // Require the event to be an error event & to have an exception\n  if (!event.exception || event.type) {\n    return false;\n  }\n\n  return isSampled(replay.getOptions().errorSampleRate);\n}\n","import { getLocationHref } from '@sentry/core';\nimport type { ErrorEvent, Event } from '@sentry/core';\n\nimport type { ReplayContainer } from '../types';\nimport { createBreadcrumb } from '../util/createBreadcrumb';\nimport { isErrorEvent } from '../util/eventUtils';\nimport { addBreadcrumbEvent } from './util/addBreadcrumbEvent';\n\ntype BeforeSendEventCallback = (event: Event) => void;\n\n/**\n * Returns a listener to be added to `client.on('afterSendErrorEvent, listener)`.\n */\nexport function handleBeforeSendEvent(replay: ReplayContainer): BeforeSendEventCallback {\n  return (event: Event) => {\n    if (!replay.isEnabled() || !isErrorEvent(event)) {\n      return;\n    }\n\n    handleHydrationError(replay, event);\n  };\n}\n\nfunction handleHydrationError(replay: ReplayContainer, event: ErrorEvent): void {\n  const exceptionValue =\n    event.exception && event.exception.values && event.exception.values[0] && event.exception.values[0].value;\n  if (typeof exceptionValue !== 'string') {\n    return;\n  }\n\n  if (\n    // Only matches errors in production builds of react-dom\n    // Example https://reactjs.org/docs/error-decoder.html?invariant=423\n    // With newer React versions, the messages changed to a different website https://react.dev/errors/418\n    exceptionValue.match(\n      /(reactjs\\.org\\/docs\\/error-decoder\\.html\\?invariant=|react\\.dev\\/errors\\/)(418|419|422|423|425)/,\n    ) ||\n    // Development builds of react-dom\n    // Error 1: Hydration failed because the initial UI does not match what was rendered on the server.\n    // Error 2: Text content does not match server-rendered HTML. Warning: Text content did not match.\n    exceptionValue.match(/(does not match server-rendered HTML|Hydration failed because)/i)\n  ) {\n    const breadcrumb = createBreadcrumb({\n      category: 'replay.hydrate-error',\n      data: {\n        url: getLocationHref(),\n      },\n    });\n    addBreadcrumbEvent(replay, breadcrumb);\n  }\n}\n","import { setTimeout } from '@sentry-internal/browser-utils';\nimport type { ErrorEvent, Event, TransactionEvent, TransportMakeRequestResponse } from '@sentry/core';\n\nimport type { ReplayContainer } from '../types';\nimport { isErrorEvent, isTransactionEvent } from '../util/eventUtils';\n\ntype AfterSendEventCallback = (event: Event, sendResponse: TransportMakeRequestResponse) => void;\n\n/**\n * Returns a listener to be added to `client.on('afterSendErrorEvent, listener)`.\n */\nexport function handleAfterSendEvent(replay: ReplayContainer): AfterSendEventCallback {\n  return (event: Event, sendResponse: TransportMakeRequestResponse) => {\n    if (!replay.isEnabled() || (!isErrorEvent(event) && !isTransactionEvent(event))) {\n      return;\n    }\n\n    const statusCode = sendResponse && sendResponse.statusCode;\n\n    // We only want to do stuff on successful error sending, otherwise you get error replays without errors attached\n    // If not using the base transport, we allow `undefined` response (as a custom transport may not implement this correctly yet)\n    // If we do use the base transport, we skip if we encountered an non-OK status code\n    if (!statusCode || statusCode < 200 || statusCode >= 300) {\n      return;\n    }\n\n    if (isTransactionEvent(event)) {\n      handleTransactionEvent(replay, event);\n      return;\n    }\n\n    handleErrorEvent(replay, event);\n  };\n}\n\nfunction handleTransactionEvent(replay: ReplayContainer, event: TransactionEvent): void {\n  const replayContext = replay.getContext();\n\n  // Collect traceIds in _context regardless of `recordingMode`\n  // In error mode, _context gets cleared on every checkout\n  // We limit to max. 100 transactions linked\n  if (event.contexts && event.contexts.trace && event.contexts.trace.trace_id && replayContext.traceIds.size < 100) {\n    replayContext.traceIds.add(event.contexts.trace.trace_id as string);\n  }\n}\n\nfunction handleErrorEvent(replay: ReplayContainer, event: ErrorEvent): void {\n  const replayContext = replay.getContext();\n\n  // Add error to list of errorIds of replay. This is ok to do even if not\n  // sampled because context will get reset at next checkout.\n  // XXX: There is also a race condition where it's possible to capture an\n  // error to Sentry before Replay SDK has loaded, but response returns after\n  // it was loaded, and this gets called.\n  // We limit to max. 100 errors linked\n  if (event.event_id && replayContext.errorIds.size < 100) {\n    replayContext.errorIds.add(event.event_id);\n  }\n\n  // If error event is tagged with replay id it means it was sampled (when in buffer mode)\n  // Need to be very careful that this does not cause an infinite loop\n  if (replay.recordingMode !== 'buffer' || !event.tags || !event.tags.replayId) {\n    return;\n  }\n\n  const { beforeErrorSampling } = replay.getOptions();\n  if (typeof beforeErrorSampling === 'function' && !beforeErrorSampling(event)) {\n    return;\n  }\n\n  setTimeout(async () => {\n    try {\n      // Capture current event buffer as new replay\n      await replay.sendBufferedReplayOrFlush();\n    } catch (err) {\n      replay.handleException(err);\n    }\n  });\n}\n","import {\n  addClsInstrumentationHandler,\n  addFidInstrumentationHandler,\n  addInpInstrumentationHandler,\n  addLcpInstrumentationHandler,\n  addPerformanceInstrumentationHandler,\n} from '@sentry-internal/browser-utils';\nimport type { ReplayContainer } from '../types';\nimport {\n  getCumulativeLayoutShift,\n  getFirstInputDelay,\n  getInteractionToNextPaint,\n  getLargestContentfulPaint,\n  webVitalHandler,\n} from '../util/createPerformanceEntries';\n\n/**\n * Sets up a PerformanceObserver to listen to all performance entry types.\n * Returns a callback to stop observing.\n */\nexport function setupPerformanceObserver(replay: ReplayContainer): () => void {\n  function addPerformanceEntry(entry: PerformanceEntry): void {\n    // It is possible for entries to come up multiple times\n    if (!replay.performanceEntries.includes(entry)) {\n      replay.performanceEntries.push(entry);\n    }\n  }\n\n  function onEntries({ entries }: { entries: PerformanceEntry[] }): void {\n    entries.forEach(addPerformanceEntry);\n  }\n\n  const clearCallbacks: (() => void)[] = [];\n\n  (['navigation', 'paint', 'resource'] as const).forEach(type => {\n    clearCallbacks.push(addPerformanceInstrumentationHandler(type, onEntries));\n  });\n\n  clearCallbacks.push(\n    addLcpInstrumentationHandler(webVitalHandler(getLargestContentfulPaint, replay)),\n    addClsInstrumentationHandler(webVitalHandler(getCumulativeLayoutShift, replay)),\n    addFidInstrumentationHandler(webVitalHandler(getFirstInputDelay, replay)),\n    addInpInstrumentationHandler(webVitalHandler(getInteractionToNextPaint, replay)),\n  );\n\n  // A callback to cleanup all handlers\n  return () => {\n    clearCallbacks.forEach(clearCallback => clearCallback());\n  };\n}\n","import { htmlTreeAsString } from '@sentry/core';\nimport type { Breadcrumb } from '@sentry/core';\n\nimport type { ReplayContainer } from '../types';\nimport { createBreadcrumb } from '../util/createBreadcrumb';\nimport { getBaseDomBreadcrumb } from './handleDom';\nimport { addBreadcrumbEvent } from './util/addBreadcrumbEvent';\n\n/** Handle keyboard events & create breadcrumbs. */\nexport function handleKeyboardEvent(replay: ReplayContainer, event: KeyboardEvent): void {\n  if (!replay.isEnabled()) {\n    return;\n  }\n\n  // Update user activity, but do not restart recording as it can create\n  // noisy/low-value replays (e.g. user comes back from idle, hits alt-tab, new\n  // session with a single \"keydown\" breadcrumb is created)\n  replay.updateUserActivity();\n\n  const breadcrumb = getKeyboardBreadcrumb(event);\n\n  if (!breadcrumb) {\n    return;\n  }\n\n  addBreadcrumbEvent(replay, breadcrumb);\n}\n\n/** exported only for tests */\nexport function getKeyboardBreadcrumb(event: KeyboardEvent): Breadcrumb | null {\n  const { metaKey, shiftKey, ctrlKey, altKey, key, target } = event;\n\n  // never capture for input fields\n  if (!target || isInputElement(target as HTMLElement) || !key) {\n    return null;\n  }\n\n  // Note: We do not consider shift here, as that means \"uppercase\"\n  const hasModifierKey = metaKey || ctrlKey || altKey;\n  const isCharacterKey = key.length === 1; // other keys like Escape, Tab, etc have a longer length\n\n  // Do not capture breadcrumb if only a word key is pressed\n  // This could leak e.g. user input\n  if (!hasModifierKey && isCharacterKey) {\n    return null;\n  }\n\n  const message = htmlTreeAsString(target, { maxStringLength: 200 }) || '<unknown>';\n  const baseBreadcrumb = getBaseDomBreadcrumb(target as Node, message);\n\n  return createBreadcrumb({\n    category: 'ui.keyDown',\n    message,\n    data: {\n      ...baseBreadcrumb.data,\n      metaKey,\n      shiftKey,\n      ctrlKey,\n      altKey,\n      key,\n    },\n  });\n}\n\nfunction isInputElement(target: HTMLElement): boolean {\n  return target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable;\n}\n","import type { ReplayIntegrationPrivacyOptions } from '../types';\n\ntype GetPrivacyOptions = Required<Omit<ReplayIntegrationPrivacyOptions, 'maskFn'>>;\n\ninterface GetPrivacyReturn {\n  maskTextSelector: string;\n  unmaskTextSelector: string;\n  blockSelector: string;\n  unblockSelector: string;\n  ignoreSelector: string;\n\n  blockClass?: RegExp;\n  maskTextClass?: RegExp;\n}\n\nfunction getOption(selectors: string[], defaultSelectors: string[]): string {\n  return [\n    ...selectors,\n    // sentry defaults\n    ...defaultSelectors,\n  ].join(',');\n}\n\n/**\n * Returns privacy related configuration for use in rrweb\n */\nexport function getPrivacyOptions({ mask, unmask, block, unblock, ignore }: GetPrivacyOptions): GetPrivacyReturn {\n  const defaultBlockedElements = ['base', 'iframe[srcdoc]:not([src])'];\n\n  const maskSelector = getOption(mask, ['.sentry-mask', '[data-sentry-mask]']);\n  const unmaskSelector = getOption(unmask, []);\n\n  const options: GetPrivacyReturn = {\n    // We are making the decision to make text and input selectors the same\n    maskTextSelector: maskSelector,\n    unmaskTextSelector: unmaskSelector,\n\n    blockSelector: getOption(block, ['.sentry-block', '[data-sentry-block]', ...defaultBlockedElements]),\n    unblockSelector: getOption(unblock, []),\n    ignoreSelector: getOption(ignore, ['.sentry-ignore', '[data-sentry-ignore]', 'input[type=\"file\"]']),\n  };\n\n  return options;\n}\n","import type { getPrivacyOptions } from './getPrivacyOptions';\n\ninterface MaskAttributeParams {\n  maskAttributes: string[];\n  maskAllText: boolean;\n  privacyOptions: ReturnType<typeof getPrivacyOptions>;\n  key: string;\n  value: string;\n  el: HTMLElement;\n}\n\n/**\n * Masks an attribute if necessary, otherwise return attribute value as-is.\n */\nexport function maskAttribute({\n  el,\n  key,\n  maskAttributes,\n  maskAllText,\n  privacyOptions,\n  value,\n}: MaskAttributeParams): string {\n  // We only mask attributes if `maskAllText` is true\n  if (!maskAllText) {\n    return value;\n  }\n\n  // unmaskTextSelector takes precedence\n  if (privacyOptions.unmaskTextSelector && el.matches(privacyOptions.unmaskTextSelector)) {\n    return value;\n  }\n\n  if (\n    maskAttributes.includes(key) ||\n    // Need to mask `value` attribute for `<input>` if it's a button-like\n    // type\n    (key === 'value' && el.tagName === 'INPUT' && ['submit', 'button'].includes(el.getAttribute('type') || ''))\n  ) {\n    return value.replace(/[\\S]/g, '*');\n  }\n\n  return value;\n}\n","import { getClient } from '@sentry/core';\nimport type { replayIntegration } from '../integration';\n\n/**\n * This is a small utility to get a type-safe instance of the Replay integration.\n */\nexport function getReplay(): ReturnType<typeof replayIntegration> | undefined {\n  const client = getClient();\n  return client && client.getIntegrationByName<ReturnType<typeof replayIntegration>>('Replay');\n}\n","import { get } from '@ember/object';\nimport { assert } from '@ember/debug';\n\nexport function taskHelperClosure(helperName, taskMethod, _args, hash) {\n  let task = _args[0];\n  let outerArgs = _args.slice(1);\n\n  return function (...innerArgs) {\n    if (!task || typeof task[taskMethod] !== 'function') {\n      assert(\n        `The first argument passed to the \\`${helperName}\\` helper should be a Task object (without quotes); you passed ${task}`,\n        false,\n      );\n      return;\n    }\n\n    if (hash && hash.value) {\n      let event = innerArgs.pop();\n      innerArgs.push(get(event, hash.value));\n    }\n\n    return task[taskMethod](...outerArgs, ...innerArgs);\n  };\n}\n","import { helper } from '@ember/component/helper';\nimport { assert } from '@ember/debug';\nimport { taskHelperClosure } from '../-private/helpers';\nimport type { Task } from '../index';\n\nconst CANCEL_REASON = \"the 'cancel-all' template helper was invoked\";\n\ntype CancelAllParams = [task: Task<any, any[]>];\n\nexport function cancelHelper(args: CancelAllParams) {\n  let cancelable = args[0];\n  if (!cancelable || typeof cancelable.cancelAll !== 'function') {\n    assert(\n      `The first argument passed to the \\`cancel-all\\` helper should be a Task or TaskGroup (without quotes); you passed ${cancelable}`,\n      false,\n    );\n  }\n\n  return taskHelperClosure('cancel-all', 'cancelAll', [\n    cancelable,\n    { reason: CANCEL_REASON },\n  ]);\n}\n\nexport default helper(cancelHelper);\n","import { helper } from '@ember/component/helper';\nimport { assert } from '@ember/debug';\nimport { taskHelperClosure } from '../-private/helpers';\nimport type { Task } from '../index';\n\nfunction maybeReportError(\n  onError: (error: unknown) => void | null | undefined,\n) {\n  return function (e: unknown) {\n    if (typeof onError === 'function') {\n      onError(e);\n    } else if (onError === null) {\n      // Do nothing\n    } else {\n      assert(\n        `The onError argument passed to the \\`perform\\` helper should be a function or null; you passed ${onError}`,\n        false,\n      );\n    }\n  };\n}\n\ntype PerformParams = [task: Task<any, any[]>, ...args: any[]];\n\nexport function performHelper(args: PerformParams, hash: any) {\n  let perform = taskHelperClosure('perform', 'perform', args, hash);\n\n  if (hash && typeof hash.onError !== 'undefined') {\n    return function (...innerArgs: any[]) {\n      try {\n        let taskInstance = perform(...innerArgs);\n        return taskInstance.catch(maybeReportError(hash.onError));\n        // eslint-disable-next-line no-empty\n      } catch {\n        maybeReportError(hash.onError);\n      }\n    };\n  } else {\n    return perform;\n  }\n}\n\nexport default helper(performHelper);\n","import { helper } from '@ember/component/helper';\nimport type { Task } from '../index';\n\ntype TaskParams = [task: Task<any, any[]>, ...args: any[]];\n\nfunction taskHelper(positional: TaskParams) {\n  let [task, ...args] = positional;\n\n  // @ts-expect-errors _curry isn't typed yet\n  return task._curry(...args);\n}\n\nexport default helper(taskHelper);\n","export class Environment {\n  assert() {}\n\n  async(callback) {\n    Promise.resolve().then(callback);\n  }\n\n  reportUncaughtRejection() {\n    this.async((error) => {\n      throw error;\n    });\n  }\n\n  defer() {\n    let deferable = {\n      promise: null,\n      resolve: null,\n      reject: null,\n    };\n\n    let promise = new Promise((resolve, reject) => {\n      deferable.resolve = resolve;\n      deferable.reject = reject;\n    });\n\n    deferable.promise = promise;\n\n    return deferable;\n  }\n\n  globalDebuggingEnabled() {\n    return false;\n  }\n}\n\nexport const DEFAULT_ENVIRONMENT = new Environment();\n","import Ember from 'ember';\nimport { defer } from 'rsvp';\nimport { Environment } from './external/environment';\nimport { assert } from '@ember/debug';\nimport { join, next, schedule } from '@ember/runloop';\n\nexport class EmberEnvironment extends Environment {\n  assert(...args) {\n    assert(...args);\n  }\n\n  async(callback) {\n    join(() => schedule('actions', callback));\n  }\n\n  reportUncaughtRejection(error) {\n    next(null, function () {\n      if (Ember.onerror) {\n        Ember.onerror(error);\n      } else {\n        throw error;\n      }\n    });\n  }\n\n  defer() {\n    return defer();\n  }\n\n  globalDebuggingEnabled() {\n    return Ember.ENV.DEBUG_TASKS;\n  }\n}\n\nexport const EMBER_ENVIRONMENT = new EmberEnvironment();\n","export const cancelableSymbol = '__ec_cancel__';\nexport const yieldableSymbol = '__ec_yieldable__';\nexport const YIELDABLE_CONTINUE = 'next';\nexport const YIELDABLE_THROW = 'throw';\nexport const YIELDABLE_RETURN = 'return';\nexport const YIELDABLE_CANCEL = 'cancel';\n\n/**\n * @class YieldableState\n * @hideconstructor\n */\nclass YieldableState {\n  constructor(taskInstance, resumeIndex) {\n    this._taskInstance = taskInstance;\n    this._resumeIndex = resumeIndex;\n  }\n\n  /**\n   * Return yielded TaskInstance. Useful for introspection on instance state.\n   * @method getTaskInstance\n   * @memberof YieldableState\n   * @public\n   * @instance\n   */\n  getTaskInstance() {\n    return this._taskInstance;\n  }\n\n  /**\n   * Cancel the yielded TaskInstance.\n   * @method cancel\n   * @memberof YieldableState\n   * @public\n   * @instance\n   */\n  cancel() {\n    let taskInstance = this._taskInstance;\n    taskInstance.proceed.call(\n      taskInstance,\n      this._resumeIndex,\n      YIELDABLE_CANCEL,\n    );\n  }\n\n  /**\n   * Cause the TaskInstance to return from its yield with an optional value,\n   * and continue executing.\n   * @method next\n   * @memberof YieldableState\n   * @param value\n   * @public\n   * @instance\n   */\n  next(value) {\n    let taskInstance = this._taskInstance;\n    taskInstance.proceed.call(\n      taskInstance,\n      this._resumeIndex,\n      YIELDABLE_CONTINUE,\n      value,\n    );\n  }\n\n  /**\n   * Short-circuit TaskInstance execution and have it return with an optional\n   * value.\n   * @method return\n   * @memberof YieldableState\n   * @param value\n   * @public\n   * @instance\n   */\n  return(value) {\n    let taskInstance = this._taskInstance;\n    taskInstance.proceed.call(\n      taskInstance,\n      this._resumeIndex,\n      YIELDABLE_RETURN,\n      value,\n    );\n  }\n\n  /**\n   * Raise a given error within the given task instance and halt execution\n   * @method throw\n   * @memberof YieldableState\n   * @param error\n   * @public\n   * @instance\n   */\n  throw(error) {\n    let taskInstance = this._taskInstance;\n    taskInstance.proceed.call(\n      taskInstance,\n      this._resumeIndex,\n      YIELDABLE_THROW,\n      error,\n    );\n  }\n}\n\n/**\n * Yieldables are a primitive for building safe, cancelation-aware ways to\n * instrument and introspect the runtime of a task. Many Yieldables are built-in\n * to ember-concurrency today, such as `timeout`, `animationFrame`, and\n * `rawTimeout`.\n *\n * For example, if I wanted to implement a yieldable for `requestIdleCallback`,\n * I could do the following:\n *\n * ```javascript\n * import Component from '@glimmer/component';\n * import { task, Yieldable } from 'ember-concurrency';\n *\n * class IdleCallbackYieldable extends Yieldable {\n *   onYield(state) {\n *     let callbackId = requestIdleCallback(() => state.next());\n *\n *     return () => cancelIdleCallback(callbackId);\n *   }\n * }\n *\n * const idleCallback = () => new IdleCallbackYieldable();\n *\n * class MyComponent extends Component {\n *   &#64;task *backgroundTask() {\n *     while (1) {\n *       yield idleCallback();\n *\n *       const data = this.complicatedNumberCrunching();\n *       yield this.sendData(data);\n *     }\n *   }\n * }\n * ```\n *\n * In general, `Yieldable` instances **should** be reusable across calls, and thus\n * care should be taken to ensure that teardown is provided and state not\n * intended to be shared across calls stay inside `onYield`.\n *\n * `Yieldable` also provides automatic Promise-casting.\n *\n * <style>\n *   .ignore-this--this-is-here-to-hide-constructor,\n *   #Yieldable { display: none }\n * </style>\n *\n * @class Yieldable\n */\nexport class Yieldable {\n  constructor() {\n    this[yieldableSymbol] = this[yieldableSymbol].bind(this);\n  }\n\n  /**\n   * Defines what happens when the task encounters `yield myYieldable` and returns\n   * a disposer function that handles any cleanup.\n   *\n   * The state parameter is provided by the runtime, and provides operations for\n   * interacting with the yielding task instance and advancing, returning,\n   * throwing, or canceling its execution.\n   *\n   * @method onYield\n   * @memberof Yieldable\n   * @param {YieldableState} state\n   * @instance\n   * @public\n   */\n  onYield() {}\n\n  _deferable() {\n    let def = { resolve: undefined, reject: undefined };\n\n    def.promise = new Promise((resolve, reject) => {\n      def.resolve = resolve;\n      def.reject = reject;\n    });\n\n    return def;\n  }\n\n  _toPromise() {\n    let def = this._deferable();\n\n    let thinInstance = {\n      proceed(_index, resumeType, value) {\n        if (\n          resumeType == YIELDABLE_CONTINUE ||\n          resumeType == YIELDABLE_RETURN\n        ) {\n          def.resolve(value);\n        } else {\n          def.reject(value);\n        }\n      },\n    };\n\n    let maybeDisposer = this[yieldableSymbol](thinInstance, 0);\n    def.promise[cancelableSymbol] = maybeDisposer;\n\n    return def.promise;\n  }\n\n  /**\n   * Returns a promise that resolves with the value yielded back to or returned\n   * to the yielded task, or rejects with either the exception thrown from the\n   * Yieldable, or an error with a `.name` property with value `\"TaskCancelation\"`.\n   *\n   * @method then\n   * @memberof Yieldable\n   * @instance\n   * @return {Promise}\n   */\n  then(...args) {\n    return this._toPromise().then(...args);\n  }\n\n  /**\n   * @method catch\n   * @memberof Yieldable\n   * @instance\n   * @return {Promise}\n   */\n  catch(...args) {\n    return this._toPromise().catch(...args);\n  }\n\n  /**\n   * @method finally\n   * @memberof Yieldable\n   * @instance\n   * @return {Promise}\n   */\n  finally(...args) {\n    return this._toPromise().finally(...args);\n  }\n\n  [yieldableSymbol](taskInstance, resumeIndex) {\n    let state = new YieldableState(taskInstance, resumeIndex);\n\n    return this.onYield(state);\n  }\n}\n\nclass AnimationFrameYieldable extends Yieldable {\n  onYield(state) {\n    let timerId = requestAnimationFrame(() => state.next());\n\n    return () => cancelAnimationFrame(timerId);\n  }\n}\n\nclass ForeverYieldable extends Yieldable {\n  onYield() {}\n}\n\nclass RawTimeoutYieldable extends Yieldable {\n  constructor(ms) {\n    super();\n    this.ms = ms;\n  }\n\n  onYield(state) {\n    let timerId = setTimeout(() => state.next(), this.ms);\n\n    return () => clearTimeout(timerId);\n  }\n}\n\n/**\n * Yielding `animationFrame()` will pause a task until after the next animation\n * frame using the native `requestAnimationFrame()` browser API.\n *\n * The task below, when performed, will print the time since the last loop run\n * for every animation frame.\n *\n * ```js\n * export default class MyComponent extends Component {\n *   &#64;task *myTask() {\n *     let lastNow = performance.now();\n *     while (true) {\n *       yield animationFrame();\n *\n *       let now = performance.now();\n *       let dt = now - lastNow;\n *       lastNow = now;\n *\n *       console.log(dt);\n *     }\n *   }\n * }\n * ```\n */\nexport function animationFrame() {\n  return new AnimationFrameYieldable();\n}\n\n/**\n *\n * Yielding `forever` will pause a task indefinitely until\n * it is cancelled (i.e. via host object destruction, the restartable modifier,\n * or manual cancellation).\n *\n * This is often useful in cases involving animation: if you're\n * using Liquid Fire, or some other animation scheme, sometimes you'll\n * notice buttons visibly reverting to their inactive states during\n * a route transition. By yielding `forever` in a Component task that drives a\n * button's active state, you can keep a task indefinitely running\n * until the animation runs to completion.\n *\n * NOTE: Liquid Fire also includes a useful `waitUntilIdle()` method\n * on the `liquid-fire-transitions` service that you can use in a lot\n * of these cases, but it won't cover cases of asynchrony that are\n * unrelated to animation, in which case `forever` might be better suited\n * to your needs.\n *\n * ```js\n * import { task, forever } from 'ember-concurrency';\n * export default class MyComponent extends Component {\n *   &#64;service myService;\n *   &#64;task *myTask() {\n *     yield this.myService.doSomethingThatCausesATransition();\n *     yield forever;\n *   }\n * }\n * ```\n */\nexport const forever = new ForeverYieldable();\n\n/**\n *\n * Yielding `rawTimeout(ms)` will pause a task for the duration\n * of time passed in, in milliseconds.\n *\n * The timeout will use the native `setTimeout()` browser API,\n * instead of the Ember runloop, which means that test helpers\n * will *not* wait for it to complete.\n *\n * The task below, when performed, will print a message to the\n * console every second.\n *\n * ```js\n * export default class MyComponent extends Component {\n *   &#64;task *myTask() {\n *     while (true) {\n *       console.log(\"Hello!\");\n *       yield rawTimeout(1000);\n *     }\n *   }\n * }\n * ```\n *\n * @param {number} ms - the amount of time to sleep before resuming\n *   the task, in milliseconds\n */\nexport function rawTimeout(ms) {\n  return new RawTimeoutYieldable(ms);\n}\n","import { later, cancel } from '@ember/runloop';\nimport { EMBER_ENVIRONMENT } from './ember-environment';\nimport { Yieldable } from './external/yieldables';\n\nexport function isEventedObject(c) {\n  return (\n    c &&\n    ((typeof c.one === 'function' && typeof c.off === 'function') ||\n      (typeof c.on === 'function' && typeof c.off === 'function') ||\n      (typeof c.addEventListener === 'function' &&\n        typeof c.removeEventListener === 'function'))\n  );\n}\n\nexport class EmberYieldable extends Yieldable {\n  _deferable() {\n    return EMBER_ENVIRONMENT.defer();\n  }\n}\n\nclass TimeoutYieldable extends EmberYieldable {\n  constructor(ms) {\n    super();\n    this.ms = ms;\n  }\n\n  onYield(state) {\n    let timerId = later(() => state.next(), this.ms);\n\n    return () => cancel(timerId);\n  }\n}\n\n/**\n *\n * Yielding `timeout(ms)` will pause a task for the duration\n * of time passed in, in milliseconds.\n *\n * This timeout will be scheduled on the Ember runloop, which\n * means that test helpers will wait for it to complete before\n * continuing with the test. See `rawTimeout()` if you need\n * different behavior.\n *\n * The task below, when performed, will print a message to the\n * console every second.\n *\n * ```js\n * export default class MyComponent extends Component {\n *   &#64;task *myTask() {\n *     while (true) {\n *       console.log(\"Hello!\");\n *       yield timeout(1000);\n *     }\n *   }\n * }\n * ```\n *\n * @param {number} ms - the amount of time to sleep before resuming\n *   the task, in milliseconds\n */\nexport function timeout(ms) {\n  return new TimeoutYieldable(ms);\n}\n\nexport function deprecatePrivateModule(moduleName) {\n  // eslint-disable-next-line no-console\n  console.warn(\n    `an Ember addon is importing a private ember-concurrency module '${moduleName}' that has moved`,\n  );\n}\n","class BoundedPolicy {\n  constructor(maxConcurrency) {\n    this.maxConcurrency = maxConcurrency || 1;\n  }\n}\n\nexport default BoundedPolicy;\n","export const TYPE_CANCELLED = 'CANCELLED';\nexport const TYPE_STARTED = 'STARTED';\nexport const TYPE_QUEUED = 'QUEUED';\n\nexport const STARTED = { type: TYPE_STARTED };\nexport const QUEUED = { type: TYPE_QUEUED };\n\nexport const makeCancelState = (reason) => ({ type: TYPE_CANCELLED, reason });\n","import BoundedPolicy from './bounded-policy';\nimport { STARTED, QUEUED } from './execution-states';\n\nclass EnqueuedReducer {\n  constructor(remainingSlots) {\n    this.remainingSlots = remainingSlots;\n  }\n\n  step() {\n    if (this.remainingSlots > 0) {\n      this.remainingSlots--;\n      return STARTED;\n    } else {\n      return QUEUED;\n    }\n  }\n}\n\nclass EnqueuedPolicy extends BoundedPolicy {\n  makeReducer() {\n    return new EnqueuedReducer(this.maxConcurrency);\n  }\n}\n\nexport default EnqueuedPolicy;\n","import BoundedPolicy from './bounded-policy';\nimport { makeCancelState, STARTED } from './execution-states';\n\nconst CANCELLED = makeCancelState(\n  `it belongs to a 'drop' Task that was already running`,\n);\n\nclass DropReducer {\n  constructor(remainingSlots) {\n    this.remainingSlots = remainingSlots;\n  }\n\n  step() {\n    if (this.remainingSlots > 0) {\n      this.remainingSlots--;\n      return STARTED;\n    }\n\n    return CANCELLED;\n  }\n}\n\nclass DropPolicy extends BoundedPolicy {\n  makeReducer() {\n    return new DropReducer(this.maxConcurrency);\n  }\n}\n\nexport default DropPolicy;\n","import BoundedPolicy from './bounded-policy';\nimport { STARTED, QUEUED, makeCancelState } from './execution-states';\n\nconst CANCELLED = makeCancelState(\n  `it belongs to a 'keepLatest' Task that was already running`,\n);\n\n// Given:\n// - started tasks: [a,b,_]\n// - queued tasks:  [c,d,e,f]\n// KeepLatest will cancel all but the last queued task instance, producing:\n// - started tasks: [a,b,c]\n// - queued tasks: [f]\n\n// TODO: perhaps we should expose another config for the number to keep enqueued.\n//       this would also make sense for enqueued, e.g. perform a max of maxConcurrency\n//       concurrent task instances, but after a number of queued instances has been\n//       reached, they should be cancelled.\n\nclass KeepLatestReducer {\n  constructor(remainingSlots, numToCancel) {\n    this.remainingSlots = remainingSlots;\n    this.numToCancel = numToCancel;\n  }\n\n  step() {\n    if (this.remainingSlots > 0) {\n      this.remainingSlots--;\n      return STARTED;\n    } else {\n      if (this.numToCancel > 0) {\n        this.numToCancel--;\n        return CANCELLED;\n      } else {\n        return QUEUED;\n      }\n    }\n  }\n}\n\nclass KeepLatestPolicy extends BoundedPolicy {\n  makeReducer(numRunning, numQueued) {\n    let maxEnqueued = 1;\n    let totalRunning = numRunning + numQueued;\n    return new KeepLatestReducer(\n      this.maxConcurrency,\n      totalRunning - this.maxConcurrency - maxEnqueued,\n    );\n  }\n}\n\nexport default KeepLatestPolicy;\n","import BoundedPolicy from './bounded-policy';\nimport { STARTED, makeCancelState } from './execution-states';\n\nconst CANCELLED = makeCancelState(\n  `it belongs to a 'restartable' Task that was .perform()ed again`,\n);\n\nclass RestartableReducer {\n  constructor(numToCancel) {\n    this.numToCancel = numToCancel;\n  }\n\n  step() {\n    if (this.numToCancel > 0) {\n      this.numToCancel--;\n      return CANCELLED;\n    } else {\n      return STARTED;\n    }\n  }\n}\n\nclass RestartablePolicy extends BoundedPolicy {\n  makeReducer(numRunning, numQueued) {\n    return new RestartableReducer(numRunning + numQueued - this.maxConcurrency);\n  }\n}\n\nexport default RestartablePolicy;\n","import Ember from 'ember';\n\nimport { computed } from '@ember/object';\n\nimport EnqueueSchedulerPolicy from './external/scheduler/policies/enqueued-policy';\nimport DropSchedulerPolicy from './external/scheduler/policies/drop-policy';\nimport KeepLatestSchedulerPolicy from './external/scheduler/policies/keep-latest-policy';\nimport RestartableSchedulerPolicy from './external/scheduler/policies/restartable-policy';\n\nexport let taskFactorySymbol = '__ec_task_factory';\n\nexport const propertyModifiers = {\n  /**\n   * Configures the task to cancel old currently task instances\n   * to make room for a new one to perform. Sets default\n   * maxConcurrency to 1.\n   *\n   * [See the Live Example](/docs/examples/route-tasks/1)\n   *\n   * @method restartable\n   * @memberof TaskProperty\n   * @instance\n   */\n  restartable() {\n    this[taskFactorySymbol].setBufferPolicy(RestartableSchedulerPolicy);\n    return this;\n  },\n\n  /**\n   * Configures the task to run task instances one-at-a-time in\n   * the order they were `.perform()`ed. Sets default\n   * maxConcurrency to 1.\n   *\n   * @method enqueue\n   * @memberof TaskProperty\n   * @instance\n   */\n  enqueue() {\n    this[taskFactorySymbol].setBufferPolicy(EnqueueSchedulerPolicy);\n    return this;\n  },\n\n  /**\n   * Configures the task to immediately cancel (i.e. drop) any\n   * task instances performed when the task is already running\n   * at maxConcurrency. Sets default maxConcurrency to 1.\n   *\n   * @method drop\n   * @memberof TaskProperty\n   * @instance\n   */\n  drop() {\n    this[taskFactorySymbol].setBufferPolicy(DropSchedulerPolicy);\n    return this;\n  },\n\n  /**\n   * Configures the task to drop all but the most recently\n   * performed {@linkcode TaskInstance }.\n   *\n   * @method keepLatest\n   * @memberof TaskProperty\n   * @instance\n   */\n  keepLatest() {\n    this[taskFactorySymbol].setBufferPolicy(KeepLatestSchedulerPolicy);\n    return this;\n  },\n\n  /**\n   * Sets the maximum number of task instances that are allowed\n   * to run at the same time. By default, with no task modifiers\n   * applied, this number is Infinity (there is no limit\n   * to the number of tasks that can run at the same time).\n   * {@linkcode TaskProperty#restartable .restartable},\n   * {@linkcode TaskProperty#enqueue .enqueue}, and\n   * {@linkcode TaskProperty#drop .drop} set the default\n   * maxConcurrency to 1, but you can override this value\n   * to set the maximum number of concurrently running tasks\n   * to a number greater than 1.\n   *\n   * [See the AJAX Throttling example](/docs/examples/ajax-throttling)\n   *\n   * The example below uses a task with `maxConcurrency(3)` to limit\n   * the number of concurrent AJAX requests (for anyone using this task)\n   * to 3.\n   *\n   * ```js\n   * doSomeAjax: task(function * (url) {\n   *   return fetch(url);\n   * }).maxConcurrency(3),\n   *\n   * elsewhere() {\n   *   this.doSomeAjax.perform(\"http://www.example.com/json\");\n   * },\n   * ```\n   *\n   * @method maxConcurrency\n   * @memberof TaskProperty\n   * @param {Number} n The maximum number of concurrently running tasks\n   * @instance\n   */\n  maxConcurrency(n) {\n    this[taskFactorySymbol].setMaxConcurrency(n);\n    return this;\n  },\n\n  /**\n   * Adds this task to a TaskGroup so that concurrency constraints\n   * can be shared between multiple tasks.\n   *\n   * [See the Task Group docs for more information](/docs/task-groups)\n   *\n   * @method group\n   * @memberof TaskProperty\n   * @param {String} groupPath A path to the TaskGroup property\n   * @instance\n   */\n  group(taskGroupPath) {\n    this[taskFactorySymbol].setGroup(taskGroupPath);\n    return this;\n  },\n\n  /**\n   * Activates lifecycle events, allowing Evented host objects to react to task state\n   * changes.\n   *\n   * ```js\n   *\n   * export default Component.extend({\n   *   uploadTask: task(function* (file) {\n   *     // ... file upload stuff\n   *   }).evented(),\n   *\n   *   uploadedStarted: on('uploadTask:started', function(taskInstance) {\n   *     this.analytics.track(\"User Photo: upload started\");\n   *   }),\n   * });\n   * ```\n   *\n   * @method evented\n   * @memberof TaskProperty\n   * @instance\n   */\n  evented() {\n    this[taskFactorySymbol].setEvented(true);\n    return this;\n  },\n\n  /**\n   * Logs lifecycle events to aid in debugging unexpected Task behavior.\n   * Presently only logs cancelation events and the reason for the cancelation,\n   * e.g. \"TaskInstance 'doStuff' was canceled because the object it lives on was destroyed or unrendered\"\n   *\n   * @method debug\n   * @memberof TaskProperty\n   * @instance\n   */\n  debug() {\n    this[taskFactorySymbol].setDebug(true);\n    return this;\n  },\n\n  /**\n   * Configures the task to call the passed in callback for derived state updates,\n   * overriding the default derived state tracking. You may call with `null` to\n   * completely opt-out of derived state tracking.\n   *\n   * @method onState\n   * @memberof TaskProperty\n   * @param {function?} callback Callback to be called. Receives an object argument with the new state.\n   * @instance\n   */\n  onState(callback) {\n    this[taskFactorySymbol].setOnState(callback);\n    return this;\n  },\n};\n\n/**\n  A {@link TaskProperty} is the Computed Property-like object returned\n  from the {@linkcode task} function. You can call Task Modifier methods\n  on this object to configure the behavior of the {@link Task}.\n\n  See [Managing Task Concurrency](/docs/task-concurrency) for an\n  overview of all the different task modifiers you can use and how\n  they impact automatic cancelation / enqueueing of task instances.\n\n  {@link TaskProperty} is only used for supporting \"classic\" Ember objects.\n  When using Native JavaScript or TypeScript classes, you will use [task decorators](/docs/task-decorators)\n  on methods instead.\n\n  @class TaskProperty\n*/\nexport class TaskProperty {}\nexport class TaskGroupProperty {}\n\nObject.assign(TaskGroupProperty.prototype, propertyModifiers);\nObject.assign(TaskProperty.prototype, propertyModifiers, {\n  setup(proto, key) {\n    if (this.callSuperSetup) {\n      this.callSuperSetup(...arguments);\n    }\n\n    this[taskFactorySymbol].setName(key);\n    this[taskFactorySymbol]._setupEmberKVO(proto);\n  },\n\n  /**\n   * Calling `task(...).on(eventName)` configures the task to be\n   * automatically performed when the specified events fire. In\n   * this way, it behaves like\n   * [Ember.on](http://emberjs.com/api/classes/Ember.html#method_on).\n   *\n   * You can use `task(...).on('init')` to perform the task\n   * when the host object is initialized.\n   *\n   * ```js\n   * export default Component.extend({\n   *   pollForUpdates: task(function * () {\n   *     // ... this runs when the Component is first created\n   *     // because we specified .on('init')\n   *   }).on('init'),\n   *\n   *   handleFoo: task(function * (a, b, c) {\n   *     // this gets performed automatically if the 'foo'\n   *     // event fires on this Component,\n   *     // e.g., if someone called component.trigger('foo')\n   *   }).on('foo'),\n   * });\n   * ```\n   *\n   * @method on\n   * @memberof TaskProperty\n   * @param {String} eventNames*\n   * @instance\n   */\n  on() {\n    this[taskFactorySymbol].addPerformEvents(...arguments);\n    return this;\n  },\n\n  /**\n   * This behaves like the {@linkcode TaskProperty#on task(...).on() modifier},\n   * but instead will cause the task to be canceled if any of the\n   * specified events fire on the parent object.\n   *\n   * [See the Live Example](/docs/examples/route-tasks/1)\n   *\n   * @method cancelOn\n   * @memberof TaskProperty\n   * @param {String} eventNames*\n   * @instance\n   */\n  cancelOn() {\n    this[taskFactorySymbol].addCancelEvents(...arguments);\n    return this;\n  },\n\n  /**\n   * This behaves like the {@linkcode TaskProperty#on task(...).on() modifier},\n   * but instead will cause the task to be performed if any of the\n   * specified properties on the parent object change.\n   *\n   * @method observes\n   * @memberof TaskProperty\n   * @param {String} keys*\n   * @instance\n   */\n  observes() {\n    this[taskFactorySymbol].addObserverKeys(...arguments);\n    return this;\n  },\n});\n\nconst setDecorator = Ember._setClassicDecorator || Ember._setComputedDecorator;\nexport function taskComputed(fn) {\n  let cp = function (proto, key) {\n    if (cp.setup !== undefined) {\n      cp.setup(proto, key);\n    }\n\n    return computed(fn)(...arguments);\n  };\n\n  setDecorator(cp);\n\n  return cp;\n}\n","import {\n  TYPE_STARTED,\n  TYPE_QUEUED,\n  TYPE_CANCELLED,\n} from './policies/execution-states';\n\nconst LAST_APPLIED_TAGS = new Map();\n\nclass Refresh {\n  constructor(schedulerPolicy, stateTracker, taskInstances) {\n    this.stateTracker = stateTracker;\n    this.schedulerPolicy = schedulerPolicy;\n    this.initialTaskInstances = taskInstances;\n    this.startingInstances = [];\n  }\n\n  process() {\n    let [taskInstances, numRunning, numQueued] =\n      this.filterFinishedTaskInstances();\n    let reducer = this.schedulerPolicy.makeReducer(numRunning, numQueued);\n\n    let finalTaskInstances = taskInstances.filter((taskInstance) => {\n      return this.setTaskInstanceExecutionState(taskInstance, reducer.step());\n    });\n\n    this.stateTracker.computeFinalStates((state) => this.applyState(state));\n    this.startingInstances.forEach((taskInstance) => taskInstance.start());\n\n    return finalTaskInstances;\n  }\n\n  filterFinishedTaskInstances() {\n    let numRunning = 0,\n      numQueued = 0;\n    let taskInstances = this.initialTaskInstances.filter((taskInstance) => {\n      let taskState = this.stateTracker.stateFor(taskInstance.task);\n      let executorState = taskInstance.executor.state;\n\n      if (executorState.isFinished) {\n        taskState.onCompletion(taskInstance);\n        return false;\n      }\n\n      if (executorState.hasStarted) {\n        numRunning += 1;\n      } else {\n        numQueued += 1;\n      }\n\n      return true;\n    });\n    return [taskInstances, numRunning, numQueued];\n  }\n\n  setTaskInstanceExecutionState(taskInstance, desiredState) {\n    let taskState = this.stateTracker.stateFor(taskInstance.task);\n\n    if (!taskInstance.executor.counted) {\n      taskInstance.executor.counted = true;\n      taskState.onPerformed(taskInstance);\n    }\n\n    switch (desiredState.type) {\n      case TYPE_CANCELLED:\n        // this will cause a follow up flush which will detect and recompute cancellation state\n        taskInstance.cancel(desiredState.reason);\n        return false;\n      case TYPE_STARTED:\n        if (!taskInstance.executor.state.hasStarted) {\n          this.startingInstances.push(taskInstance);\n          taskState.onStart(taskInstance);\n        }\n        taskState.onRunning(taskInstance);\n        return true;\n      case TYPE_QUEUED:\n        taskState.onQueued(taskInstance);\n        // TODO: assert taskInstance hasn't started?\n        // Or perhaps this can be a way to pause a task?\n        return true;\n    }\n  }\n\n  applyState(state) {\n    let { taskable } = state;\n\n    if (!taskable.onState) {\n      return;\n    }\n\n    const { guid } = taskable;\n\n    if (\n      LAST_APPLIED_TAGS.has(guid) &&\n      state.tag < LAST_APPLIED_TAGS.get(guid)\n    ) {\n      return;\n    }\n\n    let props = Object.assign(\n      {\n        numRunning: state.numRunning,\n        numQueued: state.numQueued,\n        numPerformedInc: state.numPerformedInc,\n      },\n      state.attrs,\n    );\n\n    taskable.onState(props, taskable);\n\n    LAST_APPLIED_TAGS.set(guid, state.tag);\n  }\n}\n\nexport default Refresh;\n","import {\n  COMPLETION_SUCCESS,\n  COMPLETION_ERROR,\n  COMPLETION_CANCEL,\n} from '../../task-instance/completion-states';\n\nclass RefreshState {\n  constructor(taskable, tag) {\n    this.taskable = taskable;\n    this.group = taskable.group;\n    this.numRunning = 0;\n    this.numQueued = 0;\n    this.numPerformedInc = 0;\n    this.attrs = {};\n    this.tag = tag;\n  }\n\n  onCompletion(taskInstance) {\n    let state = taskInstance.completionState;\n    this.attrs.lastRunning = null;\n    this.attrs.lastComplete = taskInstance;\n    if (state === COMPLETION_SUCCESS) {\n      this.attrs.lastSuccessful = taskInstance;\n    } else {\n      if (state === COMPLETION_ERROR) {\n        this.attrs.lastErrored = taskInstance;\n      } else if (state === COMPLETION_CANCEL) {\n        this.attrs.lastCanceled = taskInstance;\n      }\n      this.attrs.lastIncomplete = taskInstance;\n    }\n  }\n\n  onPerformed(taskInstance) {\n    this.numPerformedInc += 1;\n    this.attrs.lastPerformed = taskInstance;\n  }\n\n  onStart(taskInstance) {\n    this.attrs.last = taskInstance;\n  }\n\n  onRunning(taskInstance) {\n    this.attrs.lastRunning = taskInstance;\n    this.numRunning += 1;\n  }\n\n  onQueued() {\n    this.numQueued += 1;\n  }\n\n  recurseTaskGroups(callback) {\n    let group = this.group;\n    while (group) {\n      callback(group);\n      group = group.group;\n    }\n  }\n\n  applyStateFrom(other) {\n    Object.assign(this.attrs, other.attrs);\n    this.numRunning += other.numRunning;\n    this.numQueued += other.numQueued;\n    this.numPerformedInc += other.numPerformedInc;\n  }\n}\n\nexport default RefreshState;\n","import RefreshState from './state';\n\nconst CURRENT_REFRESH_TAGS = new Map();\n\nclass StateTracker {\n  constructor() {\n    this.states = new Map();\n  }\n\n  stateFor(taskable) {\n    let guid = taskable.guid;\n    let taskState = this.states.get(guid);\n    if (!taskState) {\n      let currentTag = CURRENT_REFRESH_TAGS.has(guid)\n        ? CURRENT_REFRESH_TAGS.get(guid)\n        : 0;\n      taskState = new RefreshState(taskable, ++currentTag);\n      this.states.set(guid, taskState);\n      CURRENT_REFRESH_TAGS.set(guid, currentTag);\n    }\n    return taskState;\n  }\n\n  // After cancelling/queueing task instances, we have to recompute the derived state\n  // of all the tasks that had/have task instances in this scheduler. We do this by\n  // looping through all the Tasks that we've accumulated state for, and then recursively\n  // applying/adding to the state of any TaskGroups they belong to.\n  computeFinalStates(callback) {\n    this.computeRecursiveState();\n    this.forEachState((state) => callback(state));\n  }\n\n  computeRecursiveState() {\n    this.forEachState((taskState) => {\n      let lastState = taskState;\n      taskState.recurseTaskGroups((taskGroup) => {\n        let state = this.stateFor(taskGroup);\n        state.applyStateFrom(lastState);\n        lastState = state;\n      });\n    });\n  }\n\n  forEachState(callback) {\n    this.states.forEach((state) => callback(state));\n  }\n}\n\nexport default StateTracker;\n","import NullState from './null-state';\n\nconst NULL_STATE = new NullState();\n\nclass NullStateTracker {\n  stateFor() {\n    return NULL_STATE;\n  }\n\n  computeFinalStates() {}\n}\n\nexport default NullStateTracker;\n","class NullState {\n  onCompletion() {}\n  onPerformed() {}\n  onStart() {}\n  onRunning() {}\n  onQueued() {}\n}\n\nexport default NullState;\n","import SchedulerRefresh from './refresh';\nimport StateTracker from './state-tracker/state-tracker';\nimport NullStateTracker from './state-tracker/null-state-tracker';\n\n// Scheduler base class\n\n// When a Task is performed, it creates an unstarted TaskInstance and\n// passes it to the Scheduler to determine when it should run. The\n// scheduler consults the schedulerPolicy (e.g. DropPolicy, RestartablePolicy, etc)\n// to determine whether the task instance should start executing, be enqueued\n// for later execution, or be immediately cancelled. As TaskInstances start\n// and run to completion, the Scheduler's `refresh()` method is called to\n// give it an opportunity to start (or cancel) previously enqueued task instances,\n// as well as update the derived state on Tasks and TaskGroups.\n\n// Every Task has its own Scheduler instance, unless it is part of a group,\n// in which case all the Tasks in a group share a single Scheduler.\n\nclass Scheduler {\n  constructor(schedulerPolicy, stateTrackingEnabled) {\n    this.schedulerPolicy = schedulerPolicy;\n    this.stateTrackingEnabled = stateTrackingEnabled;\n    this.taskInstances = [];\n  }\n\n  cancelAll(guid, cancelRequest) {\n    let cancelations = this.taskInstances\n      .map((taskInstance) => {\n        if (taskInstance.task.guids[guid]) {\n          taskInstance.executor.cancel(cancelRequest);\n        }\n      })\n      .filter((cancelation) => !!cancelation);\n\n    return Promise.all(cancelations);\n  }\n\n  perform(taskInstance) {\n    taskInstance.onFinalize(() => this.scheduleRefresh());\n    this.taskInstances.push(taskInstance);\n    this.refresh();\n  }\n\n  scheduleRefresh() {\n    Promise.resolve().then(() => this.refresh());\n  }\n\n  refresh() {\n    let stateTracker = this.stateTrackingEnabled\n      ? new StateTracker()\n      : new NullStateTracker();\n    let refresh = new SchedulerRefresh(\n      this.schedulerPolicy,\n      stateTracker,\n      this.taskInstances,\n    );\n    this.taskInstances = refresh.process();\n  }\n}\n\nexport default Scheduler;\n","import { STARTED } from './execution-states';\n\nclass UnboundedReducer {\n  step() {\n    return STARTED;\n  }\n}\n\nconst SINGLETON_REDUCER = new UnboundedReducer();\n\nclass UnboundedPolicy {\n  makeReducer() {\n    return SINGLETON_REDUCER;\n  }\n}\n\nexport default UnboundedPolicy;\n","export const DEFAULT_STATE = {\n  last: null,\n  lastRunning: null,\n  lastPerformed: null,\n  lastSuccessful: null,\n  lastComplete: null,\n  lastErrored: null,\n  lastCanceled: null,\n  lastIncomplete: null,\n  performCount: 0,\n};\n\nObject.freeze(DEFAULT_STATE);\n","export const TASK_CANCELATION_NAME = 'TaskCancelation';\n\n/**\n * Returns true if the object passed to it is a TaskCancelation error.\n * If you call `someTask.perform().catch(...)` or otherwise treat\n * a {@linkcode TaskInstance} like a promise, you may need to\n * handle the cancelation of a TaskInstance differently from\n * other kinds of errors it might throw, and you can use this\n * convenience function to distinguish cancelation from errors.\n *\n * ```js\n * click() {\n *   this.myTask.perform().catch(e => {\n *     if (!didCancel(e)) { throw e; }\n *   });\n * }\n * ```\n *\n * @param {object} error the caught error, which might be a TaskCancelation\n * @returns {boolean}\n */\nexport function didCancel(e) {\n  return e && e.name === TASK_CANCELATION_NAME;\n}\n\nexport const CANCEL_KIND_EXPLICIT = 'explicit';\nexport const CANCEL_KIND_YIELDABLE_CANCEL = 'yielded';\nexport const CANCEL_KIND_LIFESPAN_END = 'lifespan_end';\nexport const CANCEL_KIND_PARENT_CANCEL = 'parent_cancel';\n\nexport class CancelRequest {\n  constructor(kind, reason) {\n    this.kind = kind;\n    this.reason = reason;\n    this.promise = new Promise((resolve) => {\n      this.finalize = resolve;\n    });\n  }\n}\n","import { DEFAULT_STATE } from './default-state';\nimport {\n  CancelRequest,\n  CANCEL_KIND_EXPLICIT,\n} from '../task-instance/cancelation';\n\nlet guidId = 0;\nfunction makeGuid() {\n  return `ec_${guidId++}`;\n}\n\nexport class Taskable {\n  constructor(options) {\n    this.context = options.context;\n    this.debug = options.debug || false;\n    this.enabledModifiers = options.enabledModifiers;\n    this.env = options.env;\n    this.group = options.group;\n    this.hasEnabledEvents = options.hasEnabledEvents;\n    this.modifierOptions = options.modifierOptions;\n    this.name = options.name;\n    this.onStateCallback = options.onStateCallback;\n    this.scheduler = options.scheduler;\n\n    this.guid = makeGuid();\n    this.guids = {};\n    this.guids[this.guid] = true;\n    if (this.group) {\n      Object.assign(this.guids, this.group.guids);\n    }\n  }\n\n  cancelAll(options) {\n    let { reason, cancelRequestKind, resetState } = options || {};\n    reason = reason || '.cancelAll() was explicitly called on the Task';\n\n    let cancelRequest = new CancelRequest(\n      cancelRequestKind || CANCEL_KIND_EXPLICIT,\n      reason,\n    );\n    return this.scheduler.cancelAll(this.guid, cancelRequest).then(() => {\n      if (resetState) {\n        this._resetState();\n      }\n    });\n  }\n\n  get _isAlive() {\n    return true;\n  }\n\n  _resetState() {\n    this.setState(DEFAULT_STATE);\n  }\n\n  // override\n  setState() {}\n}\n\nObject.assign(Taskable.prototype, DEFAULT_STATE);\nObject.assign(Taskable.prototype, {\n  numRunning: 0,\n  numQueued: 0,\n  isRunning: false,\n  isQueued: false,\n  isIdle: true,\n  state: 'idle',\n});\n","export class GeneratorStepResult {\n  constructor(value, done, errored) {\n    this.value = value;\n    this.done = done;\n    this.errored = errored;\n  }\n}\n\nexport class GeneratorState {\n  constructor(generatorFactory) {\n    this.done = false;\n    this.generatorFactory = generatorFactory;\n    this.iterator = null;\n  }\n\n  step(resolvedValue, iteratorMethod) {\n    try {\n      let iterator = this.getIterator();\n      let { value, done } = iterator[iteratorMethod](resolvedValue);\n\n      if (done) {\n        return this.finalize(value, false);\n      } else {\n        return new GeneratorStepResult(value, false, false);\n      }\n    } catch (e) {\n      return this.finalize(e, true);\n    }\n  }\n\n  getIterator() {\n    if (!this.iterator && !this.done) {\n      this.iterator = this.generatorFactory();\n    }\n    return this.iterator;\n  }\n\n  finalize(value, errored) {\n    this.done = true;\n    this.iterator = null;\n    return new GeneratorStepResult(value, true, errored);\n  }\n}\n","import { COMPLETION_PENDING } from './completion-states';\n\nexport const INITIAL_STATE = {\n  completionState: COMPLETION_PENDING,\n\n  /**\n   * If this TaskInstance runs to completion by returning a property\n   * other than a rejecting promise, this property will be set\n   * with that value.\n   *\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n  value: null,\n\n  /**\n   * If this TaskInstance is canceled or throws an error (or yields\n   * a promise that rejects), this property will be set with that error.\n   * Otherwise, it is null.\n   *\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n  error: null,\n\n  /**\n   * True if the task instance is fulfilled.\n   *\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n  isSuccessful: false,\n\n  /**\n   * True if the task instance resolves to a rejection.\n   *\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n  isError: false,\n\n  /**\n   * True if the task instance is canceled\n   *\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n  isCanceled: false,\n\n  /**\n   * True if the task instance has started, else false.\n   *\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n  hasStarted: false,\n\n  /**\n   * True if the task has run to completion.\n   *\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n  isFinished: false,\n};\n","import { GeneratorState } from '../generator-state';\nimport { INITIAL_STATE } from './initial-state';\nimport {\n  yieldableSymbol,\n  YIELDABLE_CONTINUE,\n  YIELDABLE_THROW,\n  YIELDABLE_RETURN,\n  YIELDABLE_CANCEL,\n  cancelableSymbol,\n} from '../yieldables';\n\nimport {\n  COMPLETION_SUCCESS,\n  COMPLETION_ERROR,\n  COMPLETION_CANCEL,\n} from './completion-states';\nimport {\n  CancelRequest,\n  CANCEL_KIND_YIELDABLE_CANCEL,\n  CANCEL_KIND_LIFESPAN_END,\n  CANCEL_KIND_PARENT_CANCEL,\n  didCancel,\n  TASK_CANCELATION_NAME,\n} from './cancelation';\n\nexport const PERFORM_TYPE_DEFAULT = 'PERFORM_TYPE_DEFAULT';\nexport const PERFORM_TYPE_UNLINKED = 'PERFORM_TYPE_UNLINKED';\nexport const PERFORM_TYPE_LINKED = 'PERFORM_TYPE_LINKED';\n\nconst CANCEL_RETURN_VALUE_SENTINEL = {};\nlet TASK_INSTANCE_STACK = [];\n\nexport function getRunningInstance() {\n  return TASK_INSTANCE_STACK[TASK_INSTANCE_STACK.length - 1];\n}\n\nexport class TaskInstanceExecutor {\n  constructor({ generatorFactory, env, debug }) {\n    this.generatorState = new GeneratorState(generatorFactory);\n    this.state = Object.assign({}, INITIAL_STATE);\n    this.index = 1;\n    this.disposers = [];\n    this.finalizeCallbacks = [];\n    this.env = env;\n    this.debug = debug;\n    this.cancelRequest = null;\n  }\n\n  start() {\n    if (this.state.hasStarted || this.cancelRequest) {\n      return;\n    }\n    this.setState({ hasStarted: true });\n    this.proceedSync(YIELDABLE_CONTINUE, undefined);\n    this.taskInstance.onStarted();\n  }\n\n  cancel(cancelRequest) {\n    if (!this.requestCancel(cancelRequest)) {\n      cancelRequest.finalize();\n      return cancelRequest.promise;\n    }\n\n    if (this.state.hasStarted) {\n      this.proceedWithCancelAsync();\n    } else {\n      this.finalizeWithCancel();\n    }\n\n    return this.cancelRequest.promise;\n  }\n\n  setState(state) {\n    Object.assign(this.state, state);\n    this.taskInstance.setState(this.state);\n  }\n\n  proceedChecked(index, yieldResumeType, value) {\n    if (this.state.isFinished) {\n      return;\n    }\n    if (!this.advanceIndex(index)) {\n      return;\n    }\n\n    if (yieldResumeType === YIELDABLE_CANCEL) {\n      this.requestCancel(\n        new CancelRequest(CANCEL_KIND_YIELDABLE_CANCEL),\n        value,\n      );\n      this.proceedWithCancelAsync();\n    } else {\n      this.proceedAsync(yieldResumeType, value);\n    }\n  }\n\n  proceedWithCancelAsync() {\n    this.proceedAsync(YIELDABLE_RETURN, CANCEL_RETURN_VALUE_SENTINEL);\n  }\n\n  proceedAsync(yieldResumeType, value) {\n    this.advanceIndex(this.index);\n    this.env.async(() => this.proceedSync(yieldResumeType, value));\n  }\n\n  proceedSync(yieldResumeType, value) {\n    if (this.state.isFinished) {\n      return;\n    }\n\n    this.dispose();\n\n    if (this.generatorState.done) {\n      this.handleResolvedReturnedValue(yieldResumeType, value);\n    } else {\n      this.handleResolvedContinueValue(yieldResumeType, value);\n    }\n  }\n\n  /**\n   * This method is called when a previously yielded value from\n   * the generator has been resolved, and now it's time to pass\n   * it back into the generator. There are 3 ways to \"resume\" a\n   * generator:\n   *\n   * - call `.next(value)` on it, which is used to pass in a resolved\n   *   value (the fulfilled value of a promise), e.g. if a task generator fn\n   *   does `yield Promise.resolve(5)`, then we take that promise yielded\n   *   by the generator, detect that it's a promise, resolve it, and then\n   *   pass its fulfilled value `5` back into the generator function so\n   *   that it can continue executing.\n   * - call `.throw(error)` on it, which throw an exception from where the\n   *   the generator previously yielded. We do this when the previously\n   *   yielded value resolves to an error value (e.g. a rejected promise\n   *   or a TaskInstance that finished with an error). Note that when you\n   *   resume a generator with a `.throw()`, it can still recover from that\n   *   thrown error and continue executing normally so long as the `yield`\n   *   was inside a `try/catch` statement.\n   * - call `.return(value)` on it, causes the generator function to return\n   *   from where it previously `yield`ed. We use `.return()` when cancelling\n   *   a TaskInstance; by `.return`ing, rather than `.throw`ing, it allows\n   *   the generator function to skip `catch(e) {}` blocks, which is usually\n   *   reserved for actual errors/exceptions; if we `.throw`'d cancellations,\n   *   it would require all tasks that used try/catch to conditionally ignore\n   *   cancellations, which is annoying. So we `.return()` from generator functions\n   *   in the case of errors as a matter of convenience.\n   *\n   * @private\n   */\n  handleResolvedContinueValue(iteratorMethod, resumeValue) {\n    let beforeIndex = this.index;\n    let stepResult = this.generatorStep(resumeValue, iteratorMethod);\n\n    // TODO: what is this doing? write breaking test.\n    if (!this.advanceIndex(beforeIndex)) {\n      return;\n    }\n\n    if (stepResult.errored) {\n      this.finalize(stepResult.value, COMPLETION_ERROR);\n      return;\n    }\n\n    this.handleYieldedValue(stepResult);\n  }\n\n  /**\n   * This method is called when the generator function is all\n   * out of values, and the last value returned from the function\n   * (possible a thenable/yieldable/promise/etc) has been resolved.\n   *\n   * Possible cases:\n   * - `return \"simple value\";` // resolved value is \"simple value\"\n   * - `return undefined;` // (or omitted return) resolved value is undefined\n   * - `return someTask.perform()` // resolved value is the value returned/resolved from someTask\n   *\n   * @private\n   */\n  handleResolvedReturnedValue(yieldResumeType, value) {\n    switch (yieldResumeType) {\n      case YIELDABLE_CONTINUE:\n      case YIELDABLE_RETURN:\n        this.finalize(value, COMPLETION_SUCCESS);\n        break;\n      case YIELDABLE_THROW:\n        this.finalize(value, COMPLETION_ERROR);\n        break;\n    }\n  }\n\n  handleYieldedUnknownThenable(thenable) {\n    let resumeIndex = this.index;\n    thenable.then(\n      (value) => {\n        this.proceedChecked(resumeIndex, YIELDABLE_CONTINUE, value);\n      },\n      (error) => {\n        this.proceedChecked(resumeIndex, YIELDABLE_THROW, error);\n      },\n    );\n  }\n\n  /**\n   * The TaskInstance internally tracks an index/sequence number\n   * (the `index` property) which gets incremented every time the\n   * task generator function iterator takes a step. When a task\n   * function is paused at a `yield`, there are two events that\n   * cause the TaskInstance to take a step: 1) the yielded value\n   * \"resolves\", thus resuming the TaskInstance's execution, or\n   * 2) the TaskInstance is canceled. We need some mechanism to prevent\n   * stale yielded value resolutions from resuming the TaskFunction\n   * after the TaskInstance has already moved on (either because\n   * the TaskInstance has since been canceled or because an\n   * implementation of the Yieldable API tried to resume the\n   * TaskInstance more than once). The `index` serves as\n   * that simple mechanism: anyone resuming a TaskInstance\n   * needs to pass in the `index` they were provided that acts\n   * as a ticket to resume the TaskInstance that expires once\n   * the TaskInstance has moved on.\n   *\n   * @private\n   */\n  advanceIndex(index) {\n    if (this.index === index) {\n      return ++this.index;\n    }\n  }\n\n  handleYieldedValue(stepResult) {\n    let yieldedValue = stepResult.value;\n    if (!yieldedValue) {\n      this.proceedWithSimpleValue(yieldedValue);\n      return;\n    }\n\n    this.addDisposer(yieldedValue[cancelableSymbol]);\n\n    if (yieldedValue[yieldableSymbol]) {\n      this.invokeYieldable(yieldedValue);\n    } else if (typeof yieldedValue.then === 'function') {\n      this.handleYieldedUnknownThenable(yieldedValue);\n    } else {\n      this.proceedWithSimpleValue(yieldedValue);\n    }\n  }\n\n  proceedWithSimpleValue(yieldedValue) {\n    this.proceedAsync(YIELDABLE_CONTINUE, yieldedValue);\n  }\n\n  addDisposer(maybeDisposer) {\n    if (typeof maybeDisposer !== 'function') {\n      return;\n    }\n\n    this.disposers.push(maybeDisposer);\n  }\n\n  /**\n   * Runs any disposers attached to the task's most recent `yield`.\n   * For instance, when a task yields a TaskInstance, it registers that\n   * child TaskInstance's disposer, so that if the parent task is canceled,\n   * dispose() will run that disposer and cancel the child TaskInstance.\n   *\n   * @private\n   */\n  dispose() {\n    let disposers = this.disposers;\n    if (disposers.length === 0) {\n      return;\n    }\n    this.disposers = [];\n    disposers.forEach((disposer) => disposer());\n  }\n\n  /**\n   * Calls .next()/.throw()/.return() on the task's generator function iterator,\n   * essentially taking a single step of execution on the task function.\n   *\n   * @private\n   */\n  generatorStep(nextValue, iteratorMethod) {\n    TASK_INSTANCE_STACK.push(this);\n    let stepResult = this.generatorState.step(nextValue, iteratorMethod);\n    TASK_INSTANCE_STACK.pop();\n\n    // TODO: fix this!\n    if (this._expectsLinkedYield) {\n      let value = stepResult.value;\n      if (!value || value.performType !== PERFORM_TYPE_LINKED) {\n        // eslint-disable-next-line no-console\n        console.warn(\n          'You performed a .linked() task without immediately yielding/returning it. This is currently unsupported (but might be supported in future version of ember-concurrency).',\n        );\n      }\n      this._expectsLinkedYield = false;\n    }\n\n    return stepResult;\n  }\n\n  maybeResolveDefer() {\n    if (!this.defer || !this.state.isFinished) {\n      return;\n    }\n\n    if (this.state.completionState === COMPLETION_SUCCESS) {\n      this.defer.resolve(this.state.value);\n    } else {\n      this.defer.reject(this.state.error);\n    }\n  }\n\n  onFinalize(callback) {\n    this.finalizeCallbacks.push(callback);\n\n    if (this.state.isFinished) {\n      this.runFinalizeCallbacks();\n    }\n  }\n\n  runFinalizeCallbacks() {\n    this.finalizeCallbacks.forEach((cb) => cb());\n    this.finalizeCallbacks = [];\n    this.maybeResolveDefer();\n    this.maybeThrowUnhandledTaskErrorLater();\n  }\n\n  promise() {\n    if (!this.defer) {\n      this.defer = this.env.defer();\n      this.asyncErrorsHandled = true;\n      this.maybeResolveDefer();\n    }\n    return this.defer.promise;\n  }\n\n  maybeThrowUnhandledTaskErrorLater() {\n    if (\n      !this.asyncErrorsHandled &&\n      this.state.completionState === COMPLETION_ERROR &&\n      !didCancel(this.state.error)\n    ) {\n      this.env.async(() => {\n        if (!this.asyncErrorsHandled) {\n          this.env.reportUncaughtRejection(this.state.error);\n        }\n      });\n    }\n  }\n\n  requestCancel(request) {\n    if (this.cancelRequest || this.state.isFinished) {\n      return false;\n    }\n    this.cancelRequest = request;\n    return true;\n  }\n\n  finalize(value, completionState) {\n    if (this.cancelRequest) {\n      return this.finalizeWithCancel();\n    }\n\n    let state = { completionState };\n\n    if (completionState === COMPLETION_SUCCESS) {\n      state.isSuccessful = true;\n      state.value = value;\n    } else if (completionState === COMPLETION_ERROR) {\n      state.isError = true;\n      state.error = value;\n    } else if (completionState === COMPLETION_CANCEL) {\n      state.error = value;\n    }\n\n    this.finalizeShared(state);\n  }\n\n  finalizeWithCancel() {\n    let cancelReason = this.taskInstance.formatCancelReason(\n      this.cancelRequest.reason,\n    );\n    let error = new Error(cancelReason);\n\n    if (this.debugEnabled()) {\n      // eslint-disable-next-line no-console\n      console.log(cancelReason);\n    }\n\n    error.name = TASK_CANCELATION_NAME;\n\n    this.finalizeShared({\n      isCanceled: true,\n      completionState: COMPLETION_CANCEL,\n      error,\n      cancelReason,\n    });\n\n    this.cancelRequest.finalize();\n  }\n\n  debugEnabled() {\n    return this.debug || this.env.globalDebuggingEnabled();\n  }\n\n  finalizeShared(state) {\n    this.index++;\n    state.isFinished = true;\n    this.setState(state);\n    this.runFinalizeCallbacks();\n    this.dispatchFinalizeEvents(state.completionState);\n  }\n\n  dispatchFinalizeEvents(completionState) {\n    switch (completionState) {\n      case COMPLETION_SUCCESS:\n        this.taskInstance.onSuccess();\n        break;\n      case COMPLETION_ERROR:\n        this.taskInstance.onError(this.state.error);\n        break;\n      case COMPLETION_CANCEL:\n        this.taskInstance.onCancel(this.state.cancelReason);\n        break;\n    }\n  }\n\n  invokeYieldable(yieldedValue) {\n    try {\n      let maybeDisposer = yieldedValue[yieldableSymbol](\n        this.taskInstance,\n        this.index,\n      );\n      this.addDisposer(maybeDisposer);\n    } catch (e) {\n      this.env.reportUncaughtRejection(e);\n    }\n  }\n\n  /**\n   * `onYielded` is called when this task instance has been\n   * yielded in another task instance's execution. We take\n   * this opportunity to conditionally link up the tasks\n   * so that when the parent or child cancels, the other\n   * is cancelled.\n   *\n   * Given the following case:\n   *\n   * ```js\n   * parentTask: task(function * () {\n   *   yield otherTask.perform();\n   * })\n   * ```\n   *\n   * Then the `parent` param is the task instance that is executing, `this`\n   * is the `otherTask` task instance that was yielded.\n   *\n   * @private\n   */\n  onYielded(parent, resumeIndex) {\n    this.asyncErrorsHandled = true;\n\n    this.onFinalize(() => {\n      let completionState = this.state.completionState;\n      if (completionState === COMPLETION_SUCCESS) {\n        parent.proceed(resumeIndex, YIELDABLE_CONTINUE, this.state.value);\n      } else if (completionState === COMPLETION_ERROR) {\n        parent.proceed(resumeIndex, YIELDABLE_THROW, this.state.error);\n      } else if (completionState === COMPLETION_CANCEL) {\n        parent.proceed(resumeIndex, YIELDABLE_CANCEL, null);\n      }\n    });\n\n    let performType = this.getPerformType();\n    if (performType === PERFORM_TYPE_UNLINKED) {\n      return;\n    }\n\n    return () => {\n      this.detectSelfCancelLoop(performType, parent);\n      this.cancel(new CancelRequest(CANCEL_KIND_PARENT_CANCEL));\n    };\n  }\n\n  getPerformType() {\n    return this.taskInstance.performType || PERFORM_TYPE_DEFAULT;\n  }\n\n  detectSelfCancelLoop(performType, parent) {\n    if (performType !== PERFORM_TYPE_DEFAULT) {\n      return;\n    }\n\n    let parentCancelRequest = parent.executor && parent.executor.cancelRequest;\n\n    // Detect that the parent was cancelled by a lifespan ending and\n    // that the child is still running and not cancelled.\n    if (\n      parentCancelRequest &&\n      parentCancelRequest.kind === CANCEL_KIND_LIFESPAN_END &&\n      !this.cancelRequest &&\n      !this.state.isFinished\n    ) {\n      this.taskInstance.selfCancelLoopWarning(parent);\n    }\n  }\n}\n","import { Taskable } from './taskable';\nimport {\n  PERFORM_TYPE_DEFAULT,\n  PERFORM_TYPE_LINKED,\n  PERFORM_TYPE_UNLINKED,\n  getRunningInstance,\n  TaskInstanceExecutor,\n} from '../task-instance/executor';\n\nclass TaskLinkProxy {\n  constructor(task, performType, linkedObject) {\n    this.task = task;\n    this.performType = performType;\n    this.linkedObject = linkedObject;\n  }\n\n  perform(...args) {\n    return this.task._performShared(args, this.performType, this.linkedObject);\n  }\n}\n\nexport class Task extends Taskable {\n  constructor(options) {\n    super(options);\n    this.generatorFactory = options.generatorFactory;\n    this.perform = this._perform.bind(this);\n  }\n\n  linked() {\n    let linkedObject = getRunningInstance();\n    if (!linkedObject) {\n      throw new Error(`You can only call .linked() from within a task.`);\n    }\n\n    return new TaskLinkProxy(this, PERFORM_TYPE_LINKED, linkedObject);\n  }\n\n  unlinked() {\n    return new TaskLinkProxy(this, PERFORM_TYPE_UNLINKED, null);\n  }\n\n  toString() {\n    return `<Task:${this.name}>`;\n  }\n\n  _clone() {\n    return new Task({\n      context: this.context,\n      debug: this.debug,\n      env: this.env,\n      generatorFactory: this.generatorFactory,\n      group: this.group,\n      hasEnabledEvents: this.hasEnabledEvents,\n      name: this.name,\n      onStateCallback: this.onStateCallback,\n      scheduler: this.scheduler,\n    });\n  }\n\n  _curry(...args) {\n    let task = this._clone();\n    task._curryArgs = [...(this._curryArgs || []), ...args];\n    return task;\n  }\n\n  _perform(...args) {\n    return this._performShared(args, PERFORM_TYPE_DEFAULT, null);\n  }\n\n  _performShared(args, performType, linkedObject) {\n    let fullArgs = this._curryArgs ? [...this._curryArgs, ...args] : args;\n    let taskInstance = this._taskInstanceFactory(\n      fullArgs,\n      performType,\n      linkedObject,\n    );\n\n    if (performType === PERFORM_TYPE_LINKED) {\n      linkedObject._expectsLinkedYield = true;\n    }\n\n    if (!this._isAlive) {\n      // a task linked to a dead lifetime should immediately cancel.\n      taskInstance.cancel();\n    }\n\n    this.scheduler.perform(taskInstance);\n    return taskInstance;\n  }\n\n  // eslint-disable-next-line no-unused-vars\n  _taskInstanceOptions(args, performType, _linkedObject) {\n    let generatorFactory = () => this.generatorFactory(args);\n    let taskInstanceOptions = {\n      task: this,\n      args,\n      executor: new TaskInstanceExecutor({\n        generatorFactory,\n        env: this.env,\n        debug: this.debug,\n      }),\n      performType,\n      hasEnabledEvents: this.hasEnabledEvents,\n    };\n\n    return taskInstanceOptions;\n  }\n}\n","import { Taskable } from './taskable';\n\nexport class TaskGroup extends Taskable {}\n","import Scheduler from './scheduler/scheduler';\nimport UnboundedSchedulerPolicy from './scheduler/policies/unbounded-policy';\nimport EnqueueSchedulerPolicy from './scheduler/policies/enqueued-policy';\nimport DropSchedulerPolicy from './scheduler/policies/drop-policy';\nimport KeepLatestSchedulerPolicy from './scheduler/policies/keep-latest-policy';\nimport RestartableSchedulerPolicy from './scheduler/policies/restartable-policy';\nimport { Task } from './task/task';\nimport { TaskGroup } from './task/task-group';\nimport { DEFAULT_ENVIRONMENT } from './environment';\n\nfunction assertModifiersNotMixedWithGroup(obj) {\n  if (obj._hasSetConcurrencyConstraint && obj._taskGroupPath) {\n    throw new Error(\n      `Cannot use both 'group' and other concurrency-constraining task modifiers (e.g. 'drop', 'enqueue', 'restartable')`,\n    );\n  }\n}\n\nfunction assertUnsetBufferPolicy(obj) {\n  if (obj._hasSetBufferPolicy) {\n    throw new Error(\n      `Cannot set multiple buffer policies on a task or task group. ${obj._schedulerPolicyClass} has already been set for task or task group '${obj.name}'`,\n    );\n  }\n}\n\nconst MODIFIER_REGISTRY = {\n  enqueue: (factory, value) =>\n    value && factory.setBufferPolicy(EnqueueSchedulerPolicy),\n  evented: (factory, value) => value && factory.setEvented(value),\n  debug: (factory, value) => value && factory.setDebug(value),\n  drop: (factory, value) =>\n    value && factory.setBufferPolicy(DropSchedulerPolicy),\n  group: (factory, groupName) => factory.setGroup(groupName),\n  keepLatest: (factory, value) =>\n    value && factory.setBufferPolicy(KeepLatestSchedulerPolicy),\n  maxConcurrency: (factory, maxConcurrency) =>\n    factory.setMaxConcurrency(maxConcurrency),\n  onState: (factory, onStateCallback) => factory.setOnState(onStateCallback),\n  restartable: (factory, value) =>\n    value && factory.setBufferPolicy(RestartableSchedulerPolicy),\n};\n\n/**\n * Callback type defining a task modifier\n *\n * @callback TaskFactory~TaskModifier\n * @param {TaskFactory} factory\n * @param {*} taskModifierOption\n */\n\n/**\n * Registers a new modifier with the modifier registry\n *\n * @param {string} name Name of the modifier\n * @param {TaskFactory~TaskModifier} callback\n */\nexport function registerModifier(name, callback) {\n  if (MODIFIER_REGISTRY[name]) {\n    throw new Error(\n      `A modifier with the name '${name}' has already been defined.`,\n    );\n  }\n\n  MODIFIER_REGISTRY[name] = callback;\n}\n\n/**\n * Returns a specified modifier, if it exists in the registry\n *\n * @param {string} name Name of the modifier\n * @returns {TaskFactory~TaskModifier?}\n */\nexport function getModifier(name) {\n  return MODIFIER_REGISTRY[name];\n}\n\n/**\n * Returns whether a specified modifier exists in the registry\n *\n * @param {string} name Name of the modifier\n * @returns {boolean}\n */\nexport function hasModifier(name) {\n  return name in MODIFIER_REGISTRY;\n}\n\n/**\n * Factory used for instantiating Tasks and Task Groups. Mostly for internal\n * use, but some public APIs exposed via the Task Modifier APIs.\n *\n * <style>\n *  .ignore-this--this-is-here-to-hide-constructor,\n *  #TaskFactory { display: none }\n * </style>\n *\n * @class TaskFactory\n */\nexport class TaskFactory {\n  env = DEFAULT_ENVIRONMENT;\n\n  _debug = null;\n  _enabledModifiers = [];\n  _hasSetConcurrencyConstraint = false;\n  _hasSetBufferPolicy = false;\n  _hasEnabledEvents = false;\n  _maxConcurrency = null;\n  _onStateCallback = (state, taskable) => taskable.setState(state);\n  _schedulerPolicyClass = UnboundedSchedulerPolicy;\n  _taskGroupPath = null;\n\n  constructor(name = '<unknown>', taskDefinition = null, options = {}) {\n    this.name = name;\n    this.taskDefinition = taskDefinition;\n    this.options = options;\n    this._processModifierOptions(options);\n  }\n\n  /**\n   * Returns a new Task bound to the given context\n   *\n   * @protected\n   * @param {*} context\n   * @returns {Task}\n   */\n  createTask(context) {\n    let options = this.getTaskOptions(context);\n\n    return new Task(\n      Object.assign(\n        {\n          generatorFactory: (args) => this.taskDefinition.apply(context, args),\n        },\n        options,\n      ),\n    );\n  }\n\n  /**\n   * Returns a new TaskGroup bound to the given context\n   *\n   * @protected\n   * @param {*} context\n   * @returns {Task}\n   */\n  createTaskGroup(context) {\n    let options = this.getTaskOptions(context);\n\n    return new TaskGroup(options);\n  }\n\n  /**\n   * Returns a modifier callback with the given name bound to this TaskFactory,\n   * if registered.\n   *\n   * @protected\n   * @param {string} name\n   * @returns {TaskFactory~TaskModifier?}\n   */\n  getModifier(name) {\n    if (hasModifier(name)) {\n      return MODIFIER_REGISTRY[name].bind(null, this);\n    }\n  }\n\n  /**\n   * Returns the options provided to TaskFactory\n   *\n   * @public\n   * @returns {object}\n   */\n  getOptions() {\n    return this.options;\n  }\n\n  /**\n   * Returns a new Scheduler instance\n   *\n   * @protected\n   * @param {*} schedulerPolicy\n   * @param {boolean} stateTrackingEnabled\n   * @returns {Scheduler}\n   */\n  getScheduler(schedulerPolicy, stateTrackingEnabled) {\n    return new Scheduler(schedulerPolicy, stateTrackingEnabled);\n  }\n\n  /**\n   * Returns the options to pass to a Task or TaskGroup constructor\n   *\n   * @protected\n   * @param {*} context\n   * @returns {object}\n   */\n  getTaskOptions(context) {\n    let group, scheduler;\n    let onStateCallback = this._onStateCallback;\n\n    if (this._taskGroupPath) {\n      group = context[this._taskGroupPath];\n      if (!(group instanceof TaskGroup)) {\n        throw new Error(\n          `Expected group '${this._taskGroupPath}' to be defined but was not found.`,\n        );\n      }\n\n      scheduler = group.scheduler;\n    } else {\n      let schedulerPolicy = new this._schedulerPolicyClass(\n        this._maxConcurrency,\n      );\n      scheduler = this.getScheduler(\n        schedulerPolicy,\n        onStateCallback && typeof onStateCallback === 'function',\n      );\n    }\n\n    return {\n      context,\n      debug: this._debug,\n      env: this.env,\n      name: this.name,\n      group,\n      scheduler,\n      hasEnabledEvents: this._hasEnabledEvents,\n      onStateCallback,\n      enabledModifiers: this._enabledModifiers,\n      modifierOptions: this.getOptions(),\n    };\n  }\n\n  /**\n   * Sets the Scheduler buffer policy class to the specified value.\n   *\n   * Will raise an assertion if a buffer policy has already been specified\n   *\n   * @param {*} policy\n   * @returns {TaskFactory}\n   */\n  setBufferPolicy(policy) {\n    assertUnsetBufferPolicy(this);\n    this._hasSetBufferPolicy = true;\n    this._hasSetConcurrencyConstraint = true;\n    this._schedulerPolicyClass = policy;\n    assertModifiersNotMixedWithGroup(this);\n\n    return this;\n  }\n\n  /**\n   * Sets debug mode\n   *\n   * @param {boolean} enabled\n   * @returns {TaskFactory}\n   */\n  setDebug(enabled) {\n    this._debug = enabled;\n    return this;\n  }\n\n  /**\n   * Sets whether Task will dispatch Task events or not\n   *\n   * @param {boolean} enabled\n   * @returns {TaskFactory}\n   */\n  setEvented(enabled) {\n    this._hasEnabledEvents = enabled;\n    return this;\n  }\n\n  /**\n   * Sets Scheduling policy's `maxConcurrency`\n   *\n   * @param {number} maxConcurrency\n   * @returns {TaskFactory}\n   */\n  setMaxConcurrency(maxConcurrency) {\n    this._hasSetConcurrencyConstraint = true;\n    this._maxConcurrency = maxConcurrency;\n    return this;\n  }\n\n  /**\n   * Assigns Task created from this factory to the specified group name\n   *\n   * @param {string} group\n   * @returns {TaskFactory}\n   */\n  setGroup(group) {\n    this._taskGroupPath = group;\n    return this;\n  }\n\n  /**\n   * Sets the name of tasks created from this factory\n   *\n   * @param {string} name\n   * @returns {TaskFactory}\n   */\n  setName(name) {\n    this.name = name;\n    return this;\n  }\n\n  /**\n   * Sets the callback used on state updates. Can be set to null to disable\n   * state tracking on tasks.\n   *\n   * @param {function} onStateCallback\n   * @returns {TaskFactory}\n   */\n  setOnState(onStateCallback) {\n    this._onStateCallback = onStateCallback;\n    return this;\n  }\n\n  /**\n   * Sets the definition for tasks created from this factory\n   *\n   * @param {*} taskDefinition\n   * @returns {TaskFactory}\n   */\n  setTaskDefinition(taskDefinition) {\n    this.taskDefinition = taskDefinition;\n    return this;\n  }\n\n  _processModifierOptions(options) {\n    if (!options) {\n      return;\n    }\n\n    for (let key of Object.keys(options)) {\n      let value = options[key];\n      let modifier = this.getModifier(key);\n\n      if (typeof modifier === 'function' && modifier(value)) {\n        this._enabledModifiers.push(key);\n      }\n    }\n  }\n}\n","import { INITIAL_STATE } from './initial-state';\nimport { yieldableSymbol } from '../yieldables';\nimport { CancelRequest, CANCEL_KIND_EXPLICIT } from './cancelation';\nconst EXPLICIT_CANCEL_REASON = '.cancel() was explicitly called';\n\nexport class BaseTaskInstance {\n  constructor({ task, args, executor, performType, hasEnabledEvents }) {\n    this.task = task;\n    this.args = args;\n    this.performType = performType;\n    this.executor = executor;\n    this.executor.taskInstance = this;\n    this.hasEnabledEvents = hasEnabledEvents;\n  }\n\n  setState() {}\n  onStarted() {}\n  onSuccess() {}\n  onError() {}\n  onCancel() {}\n  formatCancelReason() {}\n  selfCancelLoopWarning() {}\n\n  onFinalize(callback) {\n    this.executor.onFinalize(callback);\n  }\n\n  proceed(index, yieldResumeType, value) {\n    this.executor.proceedChecked(index, yieldResumeType, value);\n  }\n\n  [yieldableSymbol](parentTaskInstance, resumeIndex) {\n    return this.executor.onYielded(parentTaskInstance, resumeIndex);\n  }\n\n  cancel(cancelReason = EXPLICIT_CANCEL_REASON) {\n    this.executor.cancel(new CancelRequest(CANCEL_KIND_EXPLICIT, cancelReason));\n  }\n\n  then(...args) {\n    return this.executor.promise().then(...args);\n  }\n\n  catch(...args) {\n    return this.executor.promise().catch(...args);\n  }\n\n  finally(...args) {\n    return this.executor.promise().finally(...args);\n  }\n\n  toString() {\n    return `${this.task} TaskInstance`;\n  }\n\n  start() {\n    this.executor.start();\n    return this;\n  }\n}\n\nObject.assign(BaseTaskInstance.prototype, INITIAL_STATE);\nObject.assign(BaseTaskInstance.prototype, {\n  state: 'waiting',\n  isDropped: false,\n  isRunning: true,\n});\n","import { tracked } from '@glimmer/tracking';\nimport { DEFAULT_STATE as INITIAL_TASK_STATE } from './external/task/default-state';\nimport { INITIAL_STATE as INITIAL_INSTANCE_STATE } from './external/task-instance/initial-state';\n\nfunction trackMixin(proto, obj, key) {\n  const propDesc = Object.getOwnPropertyDescriptor(proto, key);\n  propDesc.initializer = propDesc.initializer || (() => proto[key]);\n  delete propDesc.value;\n  const desc = tracked(obj, key, propDesc);\n  obj[key] = desc;\n  return obj;\n}\n\nfunction applyTracked(proto, initial) {\n  return Object.keys(proto).reduce((acc, key) => {\n    return trackMixin(proto, acc, key);\n  }, initial);\n}\n\nexport let TRACKED_INITIAL_TASK_STATE;\nexport let TRACKED_INITIAL_INSTANCE_STATE;\n\nTRACKED_INITIAL_TASK_STATE = applyTracked(INITIAL_TASK_STATE, {});\nTRACKED_INITIAL_TASK_STATE = applyTracked(\n  {\n    numRunning: 0,\n    numQueued: 0,\n    isRunning: false,\n    isQueued: false,\n    isIdle: true,\n    state: 'idle',\n  },\n  TRACKED_INITIAL_TASK_STATE,\n);\n\nTRACKED_INITIAL_INSTANCE_STATE = applyTracked(INITIAL_INSTANCE_STATE, {});\nTRACKED_INITIAL_INSTANCE_STATE = applyTracked(\n  {\n    state: 'waiting',\n    isDropped: false,\n    isRunning: false,\n  },\n  TRACKED_INITIAL_INSTANCE_STATE,\n);\n\nObject.freeze(TRACKED_INITIAL_TASK_STATE);\nObject.freeze(TRACKED_INITIAL_INSTANCE_STATE);\n","import { BaseTaskInstance } from './external/task-instance/base';\nimport { TRACKED_INITIAL_INSTANCE_STATE } from './tracked-state';\n\n/**\n  A `TaskInstance` represent a single execution of a\n  {@linkcode Task}. Every call to {@linkcode Task#perform} returns\n  a `TaskInstance`.\n\n  `TaskInstance`s are cancelable, either explicitly\n  via {@linkcode TaskInstance#cancel} or {@linkcode Task#cancelAll},\n  or automatically due to the host object being destroyed, or\n  because concurrency policy enforced by a\n  {@linkcode TaskProperty Task Modifier} canceled the task instance.\n\n  <style>\n    .ignore-this--this-is-here-to-hide-constructor,\n    #TaskInstance { display: none }\n  </style>\n\n  @class TaskInstance\n*/\n\nexport class TaskInstance extends BaseTaskInstance {\n  setState(props) {\n    let state = this._recomputeState(props);\n    Object.assign(this, {\n      ...props,\n      isRunning: !props.isFinished,\n      isDropped: state === 'dropped',\n      state,\n    });\n  }\n\n  _recomputeState(props) {\n    if (props.isDropped) {\n      return 'dropped';\n    } else if (props.isCanceled) {\n      if (props.hasStarted) {\n        return 'canceled';\n      } else {\n        return 'dropped';\n      }\n    } else if (props.isFinished) {\n      return 'finished';\n    } else if (props.hasStarted) {\n      return 'running';\n    } else {\n      return 'waiting';\n    }\n  }\n\n  onStarted() {\n    this.triggerEvent('started', this);\n  }\n\n  onSuccess() {\n    this.triggerEvent('succeeded', this);\n  }\n\n  onError(error) {\n    this.triggerEvent('errored', this, error);\n  }\n\n  onCancel(cancelReason) {\n    this.triggerEvent('canceled', this, cancelReason);\n  }\n\n  formatCancelReason(reason) {\n    return `TaskInstance '${this.getName()}' was canceled because ${reason}. For more information, see: http://ember-concurrency.com/docs/task-cancelation-help`;\n  }\n\n  getName() {\n    if (!this.name) {\n      this.name = (this.task && this.task.name) || '<unknown>';\n    }\n    return this.name;\n  }\n\n  selfCancelLoopWarning(parent) {\n    let parentName = `\\`${parent.getName()}\\``;\n    let childName = `\\`${this.getName()}\\``;\n    // eslint-disable-next-line no-console\n    console.warn(\n      `ember-concurrency detected a potentially hazardous \"self-cancel loop\" between parent task ${parentName} and child task ${childName}. If you want child task ${childName} to be canceled when parent task ${parentName} is canceled, please change \\`.perform()\\` to \\`.linked().perform()\\`. If you want child task ${childName} to keep running after parent task ${parentName} is canceled, change it to \\`.unlinked().perform()\\``,\n    );\n  }\n\n  triggerEvent(...allArgs) {\n    if (!this.hasEnabledEvents) {\n      return;\n    }\n\n    let taskInstance = this;\n    let task = taskInstance.task;\n    let host = task.context;\n    let eventNamespace = task && task.name;\n\n    if (host && host.trigger && eventNamespace) {\n      let [eventType, ...args] = allArgs;\n      host.trigger(`${eventNamespace}:${eventType}`, ...args);\n    }\n  }\n\n  /**\n   * Describes the state that the task instance is in. Can be used for debugging,\n   * or potentially driving some UI state. Possible values are:\n   *\n   * - `\"dropped\"`: task instance was canceled before it started\n   * - `\"canceled\"`: task instance was canceled before it could finish\n   * - `\"finished\"`: task instance ran to completion (even if an exception was thrown)\n   * - `\"running\"`: task instance is currently running (returns true even if\n   *     is paused on a yielded promise)\n   * - `\"waiting\"`: task instance hasn't begun running yet (usually\n   *     because the task is using the {@linkcode TaskProperty#enqueue enqueue}\n   *     task modifier)\n   *\n   * The animated timeline examples on the [Task Concurrency](/docs/task-concurrency)\n   * docs page make use of this property.\n   *\n   * @name state\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n\n  /**\n   * True if the TaskInstance was canceled before it could\n   * ever start running. For example, calling\n   * {@linkcode Task#perform .perform()} twice on a\n   * task with the {@linkcode TaskProperty#drop drop} modifier applied\n   * will result in the second task instance being dropped.\n   *\n   * @name isDropped\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n\n  /**\n   * True if the task is still running.\n   *\n   * @name isRunning\n   * @memberof TaskInstance\n   * @instance\n   * @readOnly\n   */\n\n  /**\n   * Event emitted when a new {@linkcode TaskInstance} starts executing.\n   *\n   * `on` from `@ember/object/evented` may be used to create a binding on the host object to the event.\n   *\n   * ```js\n   * export default Component.extend({\n   *   doSomething: task(function * () {\n   *     // ... does something\n   *   }),\n   *\n   *   onDoSomethingStarted: on('doSomething:started', function (taskInstance) {\n   *     // ...\n   *   })\n   * });\n   * ```\n   *\n   * @event TaskInstance#TASK_NAME:started\n   * @param {TaskInstance} taskInstance - Task instance that was started\n   */\n\n  /**\n   * Event emitted when a {@linkcode TaskInstance} succeeds.\n   *\n   * `on` from `@ember/object/evented` may be used to create a binding on the host object to the event.\n   *\n   * ```js\n   * export default Component.extend({\n   *   doSomething: task(function * () {\n   *     // ... does something\n   *   }),\n   *\n   *   onDoSomethingSucceeded: on('doSomething:succeeded', function (taskInstance) {\n   *     // ...\n   *   })\n   * });\n   * ```\n   *\n   * @event TaskInstance#TASK_NAME:succeeded\n   * @param {TaskInstance} taskInstance - Task instance that was succeeded\n   */\n\n  /**\n   * Event emitted when a {@linkcode TaskInstance} throws an an error that is\n   * not handled within the task itself.\n   *\n   * `on` from `@ember/object/evented` may be used to create a binding on the host object to the event.\n   *\n   * ```js\n   * export default Component.extend({\n   *   doSomething: task(function * () {\n   *     // ... does something\n   *   }),\n   *\n   *   onDoSomethingErrored: on('doSomething:errored', function (taskInstance, error) {\n   *     // ...\n   *   })\n   * });\n   * ```\n   *\n   * @event TaskInstance#TASK_NAME:errored\n   * @param {TaskInstance} taskInstance - Task instance that was started\n   * @param {Error} error - Error that was thrown by the task instance\n   */\n\n  /**\n   * Event emitted when a {@linkcode TaskInstance} is canceled.\n   *\n   * `on` from `@ember/object/evented` may be used to create a binding on the host object to the event.\n   *\n   * ```js\n   * export default Component.extend({\n   *   doSomething: task(function * () {\n   *     // ... does something\n   *   }),\n   *\n   *   onDoSomethingCanceled: on('doSomething:canceled', function (taskInstance, cancelationReason) {\n   *     // ...\n   *   })\n   * });\n   * ```\n   *\n   * @event TaskInstance#TASK_NAME:canceled\n   * @param {TaskInstance} taskInstance - Task instance that was started\n   * @param {string} cancelationReason - Cancelation reason that was was provided to {@linkcode TaskInstance#cancel}\n   */\n\n  /**\n   * Cancels the task instance. Has no effect if the task instance has\n   * already been canceled or has already finished running.\n   *\n   * @method cancel\n   * @memberof TaskInstance\n   * @instance\n   * @async\n   */\n\n  /**\n   * Returns a promise that resolves with the value returned\n   * from the task's (generator) function, or rejects with\n   * either the exception thrown from the task function, or\n   * an error with a `.name` property with value `\"TaskCancelation\"`.\n   *\n   * @method then\n   * @memberof TaskInstance\n   * @instance\n   * @return {Promise}\n   */\n\n  /**\n   * @method catch\n   * @memberof TaskInstance\n   * @instance\n   * @return {Promise}\n   */\n\n  /**\n   * @method finally\n   * @memberof TaskInstance\n   * @instance\n   * @return {Promise}\n   */\n}\n\nif (TRACKED_INITIAL_INSTANCE_STATE) {\n  Object.defineProperties(\n    TaskInstance.prototype,\n    TRACKED_INITIAL_INSTANCE_STATE,\n  );\n}\n","export const TASKABLE_MIXIN = {\n  _performCount: 0,\n\n  setState(state) {\n    this._performCount = this._performCount + (state.numPerformedInc || 0);\n\n    let isRunning = state.numRunning > 0;\n    let isQueued = state.numQueued > 0;\n    let derivedState = Object.assign({}, state, {\n      performCount: this._performCount,\n      isRunning,\n      isQueued,\n      isIdle: !isRunning && !isQueued,\n      state: isRunning ? 'running' : 'idle',\n    });\n    Object.assign(this, derivedState);\n  },\n\n  onState(state, task) {\n    if (task.onStateCallback) {\n      task.onStateCallback(state, task);\n    }\n  },\n};\n","import { setOwner, getOwner } from '@ember/application';\nimport EmberObject, { get, set } from '@ember/object';\nimport { isDestroying, registerDestructor } from '@ember/destroyable';\nimport { Task as BaseTask } from './external/task/task';\nimport { TaskInstance } from './task-instance';\nimport { TaskInstanceExecutor } from './external/task-instance/executor';\nimport { TASKABLE_MIXIN } from './taskable-mixin';\nimport { TRACKED_INITIAL_TASK_STATE } from './tracked-state';\nimport { CANCEL_KIND_LIFESPAN_END } from './external/task-instance/cancelation';\n\n/**\n  The `Task` object lives on a host Ember object (e.g.\n  a Component, Route, or Controller). You call the\n  {@linkcode Task#perform .perform()} method on this object\n  to create run individual {@linkcode TaskInstance}s,\n  and at any point, you can call the {@linkcode Task#cancelAll .cancelAll()}\n  method on this object to cancel all running or enqueued\n  {@linkcode TaskInstance}s.\n\n  <style>\n    .ignore-this--this-is-here-to-hide-constructor,\n    #Task { display: none }\n  </style>\n\n  @class Task\n*/\nexport class Task extends BaseTask {\n  /**\n   * `true` if any current task instances are running.\n   *\n   * @memberof Task\n   * @member {boolean} isRunning\n   * @instance\n   * @readOnly\n   */\n  /**\n   * `true` if any future task instances are queued.\n   *\n   * @memberof Task\n   * @member {boolean} isQueued\n   * @instance\n   * @readOnly\n   */\n  /**\n   * `true` if the task is not in the running or queued state.\n   *\n   * @memberof Task\n   * @member {boolean} isIdle\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The current state of the task: `\"running\"`, `\"queued\"` or `\"idle\"`.\n   *\n   * @memberof Task\n   * @member {string} state\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently started task instance.\n   *\n   * @memberof Task\n   * @member {TaskInstance} last\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that is currently running.\n   *\n   * @memberof Task\n   * @member {TaskInstance} lastRunning\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently performed task instance.\n   *\n   * @memberof Task\n   * @member {TaskInstance} lastPerformed\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that succeeded.\n   *\n   * @memberof Task\n   * @member {TaskInstance} lastSuccessful\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently completed task instance.\n   *\n   * @memberof Task\n   * @member {TaskInstance} lastComplete\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that errored.\n   *\n   * @memberof Task\n   * @member {TaskInstance} lastErrored\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently canceled task instance.\n   *\n   * @memberof Task\n   * @member {TaskInstance} lastCanceled\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that is incomplete.\n   *\n   * @memberof Task\n   * @member {TaskInstance} lastIncomplete\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The number of times this task has been performed.\n   *\n   * @memberof Task\n   * @member {number} performCount\n   * @instance\n   * @readOnly\n   */\n\n  constructor(options) {\n    super(options);\n\n    if (!isDestroying(this.context)) {\n      registerDestructor(this.context, () => {\n        this.cancelAll({\n          reason: 'the object it lives on was destroyed or unrendered',\n          cancelRequestKind: CANCEL_KIND_LIFESPAN_END,\n        });\n      });\n    }\n  }\n\n  /**\n   * Flags the task as linked to the parent task's lifetime. Must be called\n   * within another task's perform function. The task will be cancelled if the\n   * parent task is canceled as well.\n   *\n   * ember-concurrency will indicate when this may be needed.\n   *\n   * @method linked\n   * @memberof Task\n   * @instance\n   *\n   */\n\n  /**\n   * Flags the task as not linked to the parent task's lifetime. Must be called\n   * within another task's perform function. The task will NOT be cancelled if the\n   * parent task is canceled.\n   *\n   * This is useful for avoiding the so-called \"self-cancel loop\" for tasks.\n   * ember-concurrency will indicate when this may be needed.\n   *\n   * @method unlinked\n   * @memberof Task\n   * @instance\n   *\n   */\n\n  /**\n   * Creates a new {@linkcode TaskInstance} and attempts to run it right away.\n   * If running this task instance would increase the task's concurrency\n   * to a number greater than the task's maxConcurrency, this task\n   * instance might be immediately canceled (dropped), or enqueued\n   * to run at later time, after the currently running task(s) have finished.\n   *\n   * @method perform\n   * @memberof Task\n   * @param {*} arg* - args to pass to the task function\n   * @instance\n   *\n   * @fires TaskInstance#TASK_NAME:started\n   * @fires TaskInstance#TASK_NAME:succeeded\n   * @fires TaskInstance#TASK_NAME:errored\n   * @fires TaskInstance#TASK_NAME:canceled\n   *\n   */\n\n  /**\n   * Cancels all running or queued `TaskInstance`s for this Task.\n   * If you're trying to cancel a specific TaskInstance (rather\n   * than all of the instances running under this task) call\n   * `.cancel()` on the specific TaskInstance.\n   *\n   * @method cancelAll\n   * @memberof Task\n   * @param options.reason A descriptive reason the task was\n   *   cancelled. Defaults to `\".cancelAll() was explicitly called\n   *   on the Task\"`.\n   * @param options.resetState If true, will clear the task state\n   *   (`last*` and `performCount` properties will be set to initial\n   *   values). Defaults to false.\n   * @instance\n   * @async\n   *\n   */\n\n  get _isAlive() {\n    return !isDestroying(this.context);\n  }\n\n  _taskInstanceFactory(args, performType, linkedObject) {\n    let options = this._taskInstanceOptions(args, performType, linkedObject);\n    let taskInstance = new TaskInstance(options);\n    return taskInstance;\n  }\n\n  _clone() {\n    return new Task({\n      context: this.context,\n      debug: this.debug,\n      env: this.env,\n      generatorFactory: this.generatorFactory,\n      group: this.group,\n      hasEnabledEvents: this.hasEnabledEvents,\n      name: this.name,\n      onStateCallback: this.onStateCallback,\n      scheduler: this.scheduler,\n    });\n  }\n}\n\nif (TRACKED_INITIAL_TASK_STATE) {\n  Object.defineProperties(Task.prototype, TRACKED_INITIAL_TASK_STATE);\n}\n\nObject.assign(Task.prototype, TASKABLE_MIXIN);\n\nconst currentTaskInstanceSymbol = '__ec__encap_current_ti';\nexport class EncapsulatedTask extends Task {\n  constructor(options) {\n    super(options);\n    this.taskObj = options.taskObj;\n    this._encapsulatedTaskStates = new WeakMap();\n    this._encapsulatedTaskInstanceProxies = new WeakMap();\n  }\n\n  _getEncapsulatedTaskClass() {\n    let encapsulatedTaskImplClass = this._encapsulatedTaskImplClass;\n\n    if (!encapsulatedTaskImplClass) {\n      // eslint-disable-next-line ember/no-classic-classes\n      encapsulatedTaskImplClass = EmberObject.extend(this.taskObj, {\n        unknownProperty(key) {\n          let currentInstance = this[currentTaskInstanceSymbol];\n          return currentInstance ? currentInstance[key] : undefined;\n        },\n      });\n    }\n\n    return encapsulatedTaskImplClass;\n  }\n\n  _taskInstanceFactory(args, performType) {\n    let owner = getOwner(this.context);\n    let taskInstanceProxy;\n    let encapsulatedTaskImpl = this._getEncapsulatedTaskClass().create({\n      context: this.context,\n    });\n    setOwner(encapsulatedTaskImpl, owner);\n\n    let generatorFactory = () =>\n      encapsulatedTaskImpl.perform.apply(taskInstanceProxy, args);\n    let taskInstance = new TaskInstance({\n      task: this,\n      args,\n      executor: new TaskInstanceExecutor({\n        generatorFactory,\n        env: this.env,\n        debug: this.debug,\n      }),\n      performType,\n      hasEnabledEvents: this.hasEnabledEvents,\n    });\n    encapsulatedTaskImpl[currentTaskInstanceSymbol] = taskInstance;\n\n    this._encapsulatedTaskStates.set(taskInstance, encapsulatedTaskImpl);\n\n    taskInstanceProxy = this._wrappedEncapsulatedTaskInstance(taskInstance);\n\n    return taskInstanceProxy;\n  }\n\n  _wrappedEncapsulatedTaskInstance(taskInstance) {\n    if (!taskInstance) {\n      return null;\n    }\n\n    let _encapsulatedTaskInstanceProxies =\n      this._encapsulatedTaskInstanceProxies;\n    let proxy = _encapsulatedTaskInstanceProxies.get(taskInstance);\n\n    if (!proxy) {\n      let encapsulatedTaskImpl = this._encapsulatedTaskStates.get(taskInstance);\n\n      proxy = new Proxy(taskInstance, {\n        get(obj, prop) {\n          return prop in obj\n            ? obj[prop]\n            : get(encapsulatedTaskImpl, prop.toString());\n        },\n        set(obj, prop, value) {\n          if (prop in obj) {\n            obj[prop] = value;\n          } else {\n            set(encapsulatedTaskImpl, prop.toString(), value);\n          }\n          return true;\n        },\n        has(obj, prop) {\n          return prop in obj || prop in encapsulatedTaskImpl;\n        },\n        ownKeys(obj) {\n          return Reflect.ownKeys(obj).concat(\n            Reflect.ownKeys(encapsulatedTaskImpl),\n          );\n        },\n        defineProperty(obj, prop, descriptor) {\n          // Ember < 3.16 uses a WeakMap for value storage, keyed to the proxy.\n          // We need to ensure that when we use setProperties to update it, and\n          // it creates Meta, that it uses the proxy to key, otherwise we'll\n          // have two different values stores in Meta, one which won't render.\n          let proxy = _encapsulatedTaskInstanceProxies.get(taskInstance);\n          if (proxy) {\n            if (descriptor.get) {\n              descriptor.get = descriptor.get.bind(proxy);\n            } else if (proxy && descriptor.set) {\n              descriptor.set = descriptor.set.bind(proxy);\n            }\n          }\n\n          return Reflect.defineProperty(encapsulatedTaskImpl, prop, descriptor);\n        },\n        getOwnPropertyDescriptor(obj, prop) {\n          return prop in obj\n            ? Reflect.getOwnPropertyDescriptor(obj, prop)\n            : Reflect.getOwnPropertyDescriptor(encapsulatedTaskImpl, prop);\n        },\n      });\n\n      _encapsulatedTaskInstanceProxies.set(taskInstance, proxy);\n    }\n\n    return proxy;\n  }\n}\n","import { TaskGroup as TaskGroupBase } from './external/task/task-group';\nimport { TASKABLE_MIXIN } from './taskable-mixin';\nimport { TRACKED_INITIAL_TASK_STATE } from './tracked-state';\n\n/**\n * \"Task Groups\" provide a means for applying\n * task modifiers to groups of tasks. Once a {@linkcode Task} is declared\n * as part of a group task, modifiers like `drop` or `restartable`\n * will no longer affect the individual `Task`. Instead those\n * modifiers can be applied to the entire group.\n *\n * Turns the decorated property into a task group.\n *\n * Optionally takes a hash of options that will be applied as modifiers to the\n * task group. For instance `maxConcurrency` or `keepLatest`.\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { task, taskGroup } from 'ember-concurrency';\n *\n * class MyComponent extends Component {\n *   &#64;taskGroup({ maxConcurrency: 5 }) chores;\n *\n *   &#64;task({ group: 'chores' })\n *   *mowLawn() {}\n *\n *   &#64;task({ group: 'chores' })\n *   *doDishes() {}\n * }\n * ```\n *\n * <style>\n *  .ignore-this--this-is-here-to-hide-constructor,\n *  #TaskGroup { display: none }\n * </style>\n *\n * @class TaskGroup\n */\nexport class TaskGroup extends TaskGroupBase {\n  /**\n   * Cancels all running or queued `TaskInstance`s for this task group.\n   * If you're trying to cancel a specific TaskInstance (rather\n   * than all of the instances running under this task group) call\n   * `.cancel()` on the specific TaskInstance.\n   *\n   * @method cancelAll\n   * @memberof TaskGroup\n   * @param options.reason A descriptive reason the task group was\n   *   cancelled. Defaults to `\".cancelAll() was explicitly called\n   *   on the Task\"`.\n   * @param options.resetState If true, will clear the task group state\n   *   (`last*` and `performCount` properties will be set to initial\n   *   values). Defaults to false.\n   * @instance\n   * @async\n   *\n   */\n  /**\n   * `true` if any current task instances are running.\n   *\n   * @memberof TaskGroup\n   * @member {boolean} isRunning\n   * @instance\n   * @readOnly\n   */\n  /**\n   * `true` if any future task instances are queued.\n   *\n   * @memberof TaskGroup\n   * @member {boolean} isQueued\n   * @instance\n   * @readOnly\n   */\n  /**\n   * `true` if the task is not in the running or queued state.\n   *\n   * @memberof TaskGroup\n   * @member {boolean} isIdle\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The current state of the task: `\"running\"`, `\"queued\"` or `\"idle\"`.\n   *\n   * @memberof TaskGroup\n   * @member {string} state\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently started task instance.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} last\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that is currently running.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} lastRunning\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently performed task instance.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} lastPerformed\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that succeeded.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} lastSuccessful\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently completed task instance.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} lastComplete\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that errored.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} lastErrored\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recently canceled task instance.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} lastCanceled\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The most recent task instance that is incomplete.\n   *\n   * @memberof TaskGroup\n   * @member {TaskInstance} lastIncomplete\n   * @instance\n   * @readOnly\n   */\n  /**\n   * The number of times this task has been performed.\n   *\n   * @memberof TaskGroup\n   * @member {number} performCount\n   * @instance\n   * @readOnly\n   */\n}\n\nif (TRACKED_INITIAL_TASK_STATE) {\n  Object.defineProperties(TaskGroup.prototype, TRACKED_INITIAL_TASK_STATE);\n}\n\nObject.assign(TaskGroup.prototype, TASKABLE_MIXIN);\n","import Scheduler from '../external/scheduler/scheduler';\nimport { once } from '@ember/runloop';\n\nclass EmberScheduler extends Scheduler {\n  scheduleRefresh() {\n    once(this, this.refresh);\n  }\n}\n\nexport default EmberScheduler;\n","import { assert } from '@ember/debug';\nimport { get } from '@ember/object';\nimport { addListener } from '@ember/object/events';\nimport { addObserver } from '@ember/object/observers';\nimport { scheduleOnce } from '@ember/runloop';\nimport {\n  registerModifier,\n  TaskFactory as BaseTaskFactory,\n} from './external/task-factory';\n\nimport { Task, EncapsulatedTask } from './task';\nimport { TaskProperty } from './task-properties';\nimport { TaskGroup } from './task-group';\nimport EmberScheduler from './scheduler/ember-scheduler';\nimport { EMBER_ENVIRONMENT } from './ember-environment';\n\nlet handlerCounter = 0;\n\nfunction registerOnPrototype(\n  addListenerOrObserver,\n  proto,\n  names,\n  taskName,\n  taskMethod,\n  once,\n) {\n  if (names && names.length > 0) {\n    for (let i = 0; i < names.length; ++i) {\n      let name = names[i];\n\n      let handlerName = `__ember_concurrency_handler_${handlerCounter++}`;\n      proto[handlerName] = makeTaskCallback(taskName, taskMethod, once);\n      addListenerOrObserver(proto, name, null, handlerName);\n    }\n  }\n}\n\nfunction makeTaskCallback(taskName, method, once) {\n  return function () {\n    let task = get(this, taskName);\n\n    if (once) {\n      scheduleOnce('actions', task, method, ...arguments);\n    } else {\n      task[method].apply(task, arguments);\n    }\n  };\n}\n\nconst ensureArray = (possibleArr) =>\n  Array.isArray(possibleArr) ? possibleArr : [possibleArr];\n\nregisterModifier('cancelOn', (factory, eventNames) =>\n  factory.addCancelEvents(...ensureArray(eventNames)),\n);\nregisterModifier('observes', (factory, propertyPaths) =>\n  factory.addObserverKeys(...ensureArray(propertyPaths)),\n);\nregisterModifier('on', (factory, eventNames) =>\n  factory.addPerformEvents(...ensureArray(eventNames)),\n);\n\nexport class TaskFactory extends BaseTaskFactory {\n  env = EMBER_ENVIRONMENT;\n\n  createTask(context) {\n    assert(\n      `Cannot create task if a task definition is not provided as generator function or encapsulated task.`,\n      this.taskDefinition,\n    );\n\n    let options = this.getTaskOptions(context);\n\n    if (typeof this.taskDefinition === 'object') {\n      return new EncapsulatedTask(\n        Object.assign({ taskObj: this.taskDefinition }, options),\n      );\n    } else {\n      return new Task(\n        Object.assign(\n          {\n            generatorFactory: (args) =>\n              this.taskDefinition.apply(context, args),\n          },\n          options,\n        ),\n      );\n    }\n  }\n\n  createTaskGroup(context) {\n    assert(\n      `A task definition is not expected for a task group.`,\n      !this.taskDefinition,\n    );\n    let options = this.getTaskOptions(context);\n\n    return new TaskGroup(options);\n  }\n\n  addCancelEvents(...cancelEventNames) {\n    this._cancelEventNames = this._cancelEventNames || [];\n    this._cancelEventNames.push(...cancelEventNames);\n    return this;\n  }\n\n  addObserverKeys(...keys) {\n    this._observes = this._observes || [];\n    this._observes.push(...keys);\n    return this;\n  }\n\n  addPerformEvents(...eventNames) {\n    this._eventNames = this._eventNames || [];\n    this._eventNames.push(...eventNames);\n    return this;\n  }\n\n  getModifier(name) {\n    let modifier = super.getModifier(name);\n    if (!modifier && typeof TaskProperty.prototype[name] === 'function') {\n      // Shim for compatibility with user-defined TaskProperty prototype\n      // extensions. To be removed when replaced with proper public API.\n      modifier = TaskProperty.prototype[name].bind(this);\n    }\n\n    assert(\n      `Task option '${name}' is not recognized as a supported option.`,\n      modifier,\n    );\n\n    return modifier;\n  }\n\n  getScheduler(schedulerPolicy, stateTrackingEnabled) {\n    return new EmberScheduler(schedulerPolicy, stateTrackingEnabled);\n  }\n\n  _setupEmberKVO(proto) {\n    // TODO: Does this make sense in a post-Ember object world?\n\n    registerOnPrototype(\n      addListener,\n      proto,\n      this._eventNames,\n      this.name,\n      'perform',\n      false,\n    );\n    registerOnPrototype(\n      addListener,\n      proto,\n      this._cancelEventNames,\n      this.name,\n      'cancelAll',\n      false,\n    );\n    registerOnPrototype(\n      addObserver,\n      proto,\n      this._observes,\n      this.name,\n      'perform',\n      true,\n    );\n  }\n\n  // Provided for compatibility with ember-concurrency TaskProperty extension\n  // methods\n  get taskFn() {\n    return this.taskDefinition;\n  }\n\n  set taskFn(fn) {\n    this.setTaskDefinition(fn);\n  }\n}\n","import { TaskFactory } from './task-factory';\n\nfunction taskFromPropertyDescriptor(\n  target,\n  key,\n  descriptor,\n  params = [],\n  factoryClass = TaskFactory,\n) {\n  let { initializer, get, value } = descriptor;\n  let taskFn;\n\n  if (initializer) {\n    taskFn = initializer.call(undefined);\n  } else if (get) {\n    taskFn = get.call(undefined);\n  } else if (value) {\n    taskFn = value;\n  }\n\n  taskFn.displayName = `${key} (task)`;\n\n  let tasks = new WeakMap();\n  let options = params[0] || {};\n  let factory = new factoryClass(key, taskFn, options);\n  factory._setupEmberKVO(target);\n\n  return {\n    get() {\n      let task = tasks.get(this);\n\n      if (!task) {\n        task = factory.createTask(this);\n        tasks.set(this, task);\n      }\n\n      return task;\n    },\n  };\n}\n\nfunction taskGroupPropertyDescriptor(\n  _target,\n  key,\n  _descriptor,\n  params = [],\n  factoryClass = TaskFactory,\n) {\n  let taskGroups = new WeakMap();\n  let options = params[0] || {};\n  let factory = new factoryClass(key, null, options);\n\n  return {\n    get() {\n      let task = taskGroups.get(this);\n\n      if (!task) {\n        task = factory.createTaskGroup(this);\n        taskGroups.set(this, task);\n      }\n\n      return task;\n    },\n  };\n}\n\n// Cribbed from @ember-decorators/utils\nfunction isFieldDescriptor(possibleDesc) {\n  let [target, key, desc] = possibleDesc;\n\n  return (\n    possibleDesc.length === 3 &&\n    typeof target === 'object' &&\n    target !== null &&\n    typeof key === 'string' &&\n    ((typeof desc === 'object' &&\n      desc !== null &&\n      'enumerable' in desc &&\n      'configurable' in desc) ||\n      desc === undefined) // TS compatibility ???\n  );\n}\n\nexport function decoratorWithParams(descriptorFn) {\n  return function (...params) {\n    if (isFieldDescriptor(params)) {\n      return descriptorFn(...params);\n    } else {\n      return (...desc) => descriptorFn(...desc, params);\n    }\n  };\n}\n\nfunction createDecorator(fn, baseOptions = {}, factoryClass = TaskFactory) {\n  return decoratorWithParams((target, key, descriptor, [userOptions] = []) => {\n    let mergedOptions = Object.assign({}, { ...baseOptions, ...userOptions });\n\n    return fn(target, key, descriptor, [mergedOptions], factoryClass);\n  });\n}\n\nexport function createTaskDecorator(\n  baseOptions = {},\n  factoryClass = TaskFactory,\n) {\n  return createDecorator(taskFromPropertyDescriptor, baseOptions, factoryClass);\n}\n\nexport function createTaskGroupDecorator(\n  baseOptions = {},\n  factoryClass = TaskFactory,\n) {\n  return createDecorator(\n    taskGroupPropertyDescriptor,\n    baseOptions,\n    factoryClass,\n  );\n}\n\nexport const lastValue = decoratorWithParams(\n  (_target, _key, descriptor, [taskName] = []) => {\n    const { initializer } = descriptor;\n    delete descriptor.initializer;\n\n    return {\n      get() {\n        let lastInstance = this[taskName].lastSuccessful;\n\n        if (lastInstance) {\n          return lastInstance.value;\n        }\n\n        if (initializer) {\n          return initializer.call(this);\n        }\n\n        return undefined;\n      },\n    };\n  },\n);\n","import {\n  createTaskDecorator,\n  createTaskGroupDecorator,\n  lastValue as nativeLastValue,\n} from './external/task-decorators';\nimport { TaskFactory as EmberTaskFactory } from './task-factory';\n\nexport const lastValue = nativeLastValue;\n\n/**\n * A Task is a cancelable, restartable, asynchronous operation that\n * is driven by a generator function. Tasks are automatically canceled\n * when the object they live on is destroyed (e.g. a Component\n * is unrendered).\n *\n * Turns the decorated generator function into a task.\n *\n * Optionally takes a hash of options that will be applied as modifiers to the\n * task. For instance `maxConcurrency`, `on`, `group` or `keepLatest`.\n *\n * By default, tasks have no concurrency constraints\n * (multiple instances of a task can be running at the same time)\n * but much of a power of tasks lies in proper usage of Task Modifiers\n * that you can apply to a task.\n *\n * You can also define an\n * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n * by decorating an object that defines a `perform` generator\n * method.\n *\n * ```js\n * import Component from '@ember/component';\n * import { task } from 'ember-concurrency';\n *\n * class MyComponent extends Component {\n *   &#64;task\n *   *plainTask() {}\n *\n *   &#64;task({ maxConcurrency: 5, keepLatest: true, cancelOn: 'click' })\n *   *taskWithModifiers() {}\n * }\n * ```\n *\n * @function\n * @param {object?} [options={}] Task modifier options\n * @param {string|string[]} [options.cancelOn] Events to cancel task on. Applies only to `&#64;ember/component`\n * @param {boolean} [options.enqueue] Sets `enqueue` modifier on task if `true`\n * @param {boolean} [options.evented] Enables [task lifecycle events](/docs/advanced/lifecycle-events) for this Task, if `true`\n * @param {boolean} [options.debug] Enables task debugging if `true`\n * @param {boolean} [options.drop] Sets `drop` modifier on task if `true`\n * @param {string} [options.group] Associates task with the group specified\n * @param {boolean} [options.keepLatest] Sets `keepLatest` modifier on task if `true`\n * @param {number} [options.maxConcurrency] Sets the maximum number of running task instances for the task\n * @param {string|string[]} [options.observes] Properties to watch and cause task to be performed when they change\n * @param {string|string[]} [options.on] Events to perform task on. Applies only to `&#64;ember/component`\n * @param {function?} [options.onState] Callback to use for state tracking. May be set to `null` to disable state tracking.\n * @param {boolean} [options.restartable] Sets `restartable` modifier on task if `true`\n * @return {Task}\n */\nexport const task = createTaskDecorator({}, EmberTaskFactory);\n\n/**\n * Turns the decorated generator function into a task and applies the\n * `drop` modifier.\n *\n * Optionally takes a hash of options that will be applied as modifiers to the\n * task. For instance `maxConcurrency`, `on`, or `group`.\n *\n * You can also define an\n * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n * by decorating an object that defines a `perform` generator\n * method.\n *\n * ```js\n * import Component from '@ember/component';\n * import { task, dropTask } from 'ember-concurrency';\n *\n * class MyComponent extends Component {\n *   &#64;task\n *   *plainTask() {}\n *\n *   &#64;dropTask({ cancelOn: 'click' })\n *   *myDropTask() {}\n * }\n * ```\n *\n * @function\n * @param {object?} [options={}] Task modifier options. See {@link task} for list.\n * @return {Task}\n */\nexport const dropTask = createTaskDecorator({ drop: true }, EmberTaskFactory);\n\n/**\n * Turns the decorated generator function into a task and applies the\n * `enqueue` modifier.\n *\n * Optionally takes a hash of options that will be applied as modifiers to the\n * task. For instance `maxConcurrency`, `on`, or `group`.\n *\n * You can also define an\n * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n * by decorating an object that defines a `perform` generator\n * method.\n *\n * ```js\n * import Component from '@ember/component';\n * import { task, enqueueTask } from 'ember-concurrency';\n *\n * class MyComponent extends Component {\n *   &#64;task\n *   *plainTask() {}\n *\n *   &#64;enqueueTask({ cancelOn: 'click' })\n *   *myEnqueueTask() {}\n * }\n * ```\n *\n * @function\n * @param {object?} [options={}] Task modifier options. See {@link task} for list.\n * @return {Task}\n */\nexport const enqueueTask = createTaskDecorator(\n  {\n    enqueue: true,\n  },\n  EmberTaskFactory,\n);\n\n/**\n * Turns the decorated generator function into a task and applies the\n * `keepLatest` modifier.\n *\n * Optionally takes a hash of options that will be applied as modifiers to the\n * task. For instance `maxConcurrency`, `on`, or `group`.\n *\n * You can also define an\n * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n * by decorating an object that defines a `perform` generator\n * method.\n *\n * ```js\n * import Component from '@ember/component';\n * import { task, keepLatestTask } from 'ember-concurrency';\n *\n * class MyComponent extends Component {\n *   &#64;task\n *   *plainTask() {}\n *\n *   &#64;keepLatestTask({ cancelOn: 'click' })\n *   *myKeepLatestTask() {}\n * }\n * ```\n *\n * @function\n * @param {object?} [options={}] Task modifier options. See {@link task} for list.\n * @return {Task}\n */\nexport const keepLatestTask = createTaskDecorator(\n  {\n    keepLatest: true,\n  },\n  EmberTaskFactory,\n);\n\n/**\n * Turns the decorated generator function into a task and applies the\n * `restartable` modifier.\n *\n * Optionally takes a hash of options that will be applied as modifiers to the\n * task. For instance `maxConcurrency`, `on`, or `group`.\n *\n * You can also define an\n * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n * by decorating an object that defines a `perform` generator\n * method.\n *\n * ```js\n * import Component from '@ember/component';\n * import { task, restartableTask } from 'ember-concurrency';\n *\n * class MyComponent extends Component {\n *   &#64;task\n *   *plainTask() {}\n *\n *   &#64;restartableTask({ cancelOn: 'click' })\n *   *myRestartableTask() {}\n * }\n * ```\n *\n * @function\n * @param {object?} [options={}] Task modifier options. See {@link task} for list.\n * @return {Task}\n */\nexport const restartableTask = createTaskDecorator(\n  {\n    restartable: true,\n  },\n  EmberTaskFactory,\n);\n\n/**\n * \"Task Groups\" provide a means for applying\n * task modifiers to groups of tasks. Once a {@linkcode Task} is declared\n * as part of a group task, modifiers like `drop` or `restartable`\n * will no longer affect the individual `Task`. Instead those\n * modifiers can be applied to the entire group.\n *\n * Turns the decorated property into a task group.\n *\n * Optionally takes a hash of options that will be applied as modifiers to the\n * task group. For instance `maxConcurrency` or `keepLatest`.\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { task, taskGroup } from 'ember-concurrency';\n *\n * class MyComponent extends Component {\n *   &#64;taskGroup({ maxConcurrency: 5 }) chores;\n *\n *   &#64;task({ group: 'chores' })\n *   *mowLawn() {}\n *\n *   &#64;task({ group: 'chores' })\n *   *doDishes() {}\n * }\n * ```\n *\n * @function\n * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n * @return {TaskGroup}\n */\nexport const taskGroup = createTaskGroupDecorator({}, EmberTaskFactory);\n\n/**\n * Turns the decorated property into a task group and applies the\n * `drop` modifier.\n *\n * Optionally takes a hash of further options that will be applied as modifiers\n * to the task group.\n *\n * @function\n * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n * @return {TaskGroup}\n */\nexport const dropTaskGroup = createTaskGroupDecorator(\n  {\n    drop: true,\n  },\n  EmberTaskFactory,\n);\n\n/**\n * Turns the decorated property into a task group and applies the\n * `enqueue` modifier.\n *\n * Optionally takes a hash of further options that will be applied as modifiers\n * to the task group.\n *\n * @function\n * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n * @return {TaskGroup}\n */\nexport const enqueueTaskGroup = createTaskGroupDecorator(\n  {\n    enqueue: true,\n  },\n  EmberTaskFactory,\n);\n\n/**\n * Turns the decorated property into a task group and applies the\n * `keepLatest` modifier.\n *\n * Optionally takes a hash of further options that will be applied as modifiers\n * to the task group.\n *\n * @function\n * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n * @return {TaskGroup}\n */\nexport const keepLatestTaskGroup = createTaskGroupDecorator(\n  { keepLatest: true },\n  EmberTaskFactory,\n);\n\n/**\n * Turns the decorated property into a task group and applies the\n * `restartable` modifier.\n *\n * Optionally takes a hash of further options that will be applied as modifiers\n * to the task group.\n *\n * @function\n * @param {object?} [options={}] Task group modifier options. See {@link task} for list.\n * @return {TaskGroup}\n */\nexport const restartableTaskGroup = createTaskGroupDecorator(\n  { restartable: true },\n  EmberTaskFactory,\n);\n","import { TaskFactory } from './task-factory';\nimport {\n  TaskProperty,\n  TaskGroupProperty,\n  taskComputed,\n  taskFactorySymbol,\n} from './task-properties';\nimport {\n  task as taskDecorator,\n  taskGroup as taskGroupDecorator,\n} from './task-decorators';\nimport { assert } from '@ember/debug';\n\n// eslint-disable-next-line no-unused-vars\nimport { TaskGroup } from './task-group';\n\n/**\n * TODO: update docs to reflect both old and new ES6 styles\n *\n * A Task is a cancelable, restartable, asynchronous operation that\n * is driven by a generator function. Tasks are automatically canceled\n * when the object they live on is destroyed (e.g. a Component\n * is unrendered).\n *\n * To define a task, use the `task(...)` function, and pass in\n * a generator function, which will be invoked when the task\n * is performed. The reason generator functions are used is\n * that they (like the proposed ES7 async-await syntax) can\n * be used to elegantly express asynchronous, cancelable\n * operations.\n *\n * You can also define an\n * <a href=\"/docs/advanced/encapsulated-task\">Encapsulated Task</a>\n * by passing in an object that defined a `perform` generator\n * function property.\n *\n * The following Component defines a task called `myTask` that,\n * when performed, prints a message to the console, sleeps for 1 second,\n * prints a final message to the console, and then completes.\n *\n * ```js\n * import { task, timeout } from 'ember-concurrency';\n * export default Component.extend({\n *   myTask: task(function * () {\n *     console.log(\"Pausing for a second...\");\n *     yield timeout(1000);\n *     console.log(\"Done!\");\n *   })\n * });\n * ```\n *\n * ```hbs\n * <button {{action myTask.perform}}>Perform Task</button>\n * ```\n *\n * By default, tasks have no concurrency constraints\n * (multiple instances of a task can be running at the same time)\n * but much of a power of tasks lies in proper usage of Task Modifiers\n * that you can apply to a task.\n *\n * @param {function} generatorFunction the generator function backing the task.\n * @returns {TaskProperty}\n */\nexport function task(taskFnOrProtoOrDecoratorOptions, key, descriptor) {\n  assert(\n    `It appears you're attempting to use the new task(async () => { ... }) syntax, but the async arrow task function you've provided is not being properly compiled by Babel.\\n\\nPossible causes / remedies:\\n\\n1. You must pass the async function expression directly to the task() function (it is not currently supported to pass in a variable containing the async arrow fn, or any other kind of indirection)\\n2. The new task syntax is only supported by native classes. Ensure that this is one.\\n3. If this code is in an addon, please ensure the addon specifies ember-concurrency \"2.3.0\" or higher in \"dependencies\" (not \"devDependencies\")\\n4. Ensure that there is only one version of ember-concurrency v2.3.0+ being used in your project (including nested dependencies) and consider using npm/yarn/pnpm resolutions to enforce a single version is used\\n5. Ensure that you have registered the Babel transform that Ember Concurrency uses to transform tasks in the \"async-arrow\" notation, see https://ember-concurrency.com/docs/v4-upgrade`,\n    !isUntranspiledAsyncFn(arguments[arguments.length - 1]),\n  );\n\n  if (\n    isDecoratorOptions(taskFnOrProtoOrDecoratorOptions) ||\n    (key && descriptor)\n  ) {\n    return taskDecorator(...arguments);\n  } else {\n    return buildClassicTaskProperty(taskFnOrProtoOrDecoratorOptions);\n  }\n}\n\nfunction isUntranspiledAsyncFn(obj) {\n  return obj && obj.constructor && obj.constructor.name === 'AsyncFunction';\n}\n\n/**\n * Build and return a \"classic\" TaskProperty, which is essentially a subclass of a Computed Property\n * descriptor that can be used to define Tasks on classic Ember.Objects.\n *\n * @private\n */\nfunction buildClassicTaskProperty(taskFn) {\n  const taskProperty = taskComputed(function () {\n    taskProperty[taskFactorySymbol].setTaskDefinition(taskProperty.taskFn);\n    return taskProperty[taskFactorySymbol].createTask(this);\n  });\n\n  taskProperty.taskFn = taskFn;\n\n  taskProperty[taskFactorySymbol] = new TaskFactory();\n\n  Object.setPrototypeOf(taskProperty, TaskProperty.prototype);\n\n  return taskProperty;\n}\n\n/**\n * \"Task Groups\" provide a means for applying\n * task modifiers to groups of tasks. Once a {@linkcode Task} is declared\n * as part of a group task, modifiers like `drop` or `restartable`\n * will no longer affect the individual `Task`. Instead those\n * modifiers can be applied to the entire group.\n *\n * ```js\n * import { task, taskGroup } from 'ember-concurrency';\n *\n * export default class MyController extends Controller {\n *   &#64;taskGroup({ drop: true }) chores;\n *\n *   &#64;task({ group: 'chores' }) mowLawn = taskFn;\n *   &#64;task({ group: 'chores' }) doDishes = taskFn;\n *   &#64;task({ group: 'chores' }) changeDiapers = taskFn;\n * }\n * ```\n *\n * @returns {TaskGroup}\n */\nexport function taskGroup(possibleDecoratorOptions, key, descriptor) {\n  if (isDecoratorOptions(possibleDecoratorOptions) || (key && descriptor)) {\n    return taskGroupDecorator(...arguments);\n  } else {\n    let tp = taskComputed(function (key) {\n      tp[taskFactorySymbol].setName(key);\n      return tp[taskFactorySymbol].createTaskGroup(this);\n    });\n\n    tp[taskFactorySymbol] = new TaskFactory();\n\n    Object.setPrototypeOf(tp, TaskGroupProperty.prototype);\n\n    return tp;\n  }\n}\n\nfunction isDecoratorOptions(possibleOptions) {\n  if (!possibleOptions) {\n    return false;\n  }\n  if (typeof possibleOptions === 'function') {\n    return false;\n  }\n\n  if (\n    typeof possibleOptions === 'object' &&\n    'perform' in possibleOptions &&\n    typeof possibleOptions.perform === 'function'\n  ) {\n    return false;\n  }\n\n  return Object.getPrototypeOf(possibleOptions) === Object.prototype;\n}\n","import { assert } from '@ember/debug';\nimport RSVP, { Promise } from 'rsvp';\nimport { TaskInstance } from './task-instance';\nimport { cancelableSymbol, Yieldable } from './external/yieldables';\n\n/**\n * A cancelation-aware variant of [Promise.all](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all).\n * The normal version of a `Promise.all` just returns a regular, uncancelable\n * Promise. The `ember-concurrency` variant of `all()` has the following\n * additional behavior:\n *\n * - if the task that `yield`ed `all()` is canceled, any of the\n *   {@linkcode TaskInstance}s passed in to `all` will be canceled\n * - if any of the {@linkcode TaskInstance}s (or regular promises) passed in reject (or\n *   are canceled), all of the other unfinished `TaskInstance`s will\n *   be automatically canceled.\n *\n * [Check out the \"Awaiting Multiple Child Tasks example\"](/docs/examples/joining-tasks)\n */\nexport const all = taskAwareVariantOf(RSVP.Promise, 'all', identity);\n\n/**\n * A cancelation-aware variant of [RSVP.allSettled](https://api.emberjs.com/ember/release/functions/rsvp/allSettled).\n * The normal version of a `RSVP.allSettled` just returns a regular, uncancelable\n * Promise. The `ember-concurrency` variant of `allSettled()` has the following\n * additional behavior:\n *\n * - if the task that `yield`ed `allSettled()` is canceled, any of the\n *   {@linkcode TaskInstance}s passed in to `allSettled` will be canceled\n */\nexport const allSettled = taskAwareVariantOf(RSVP, 'allSettled', identity);\n\n/**\n * A cancelation-aware variant of [Promise.race](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race).\n * The normal version of a `Promise.race` just returns a regular, uncancelable\n * Promise. The `ember-concurrency` variant of `race()` has the following\n * additional behavior:\n *\n * - if the task that `yield`ed `race()` is canceled, any of the\n *   {@linkcode TaskInstance}s passed in to `race` will be canceled\n * - once any of the tasks/promises passed in complete (either success, failure,\n *   or cancelation), any of the {@linkcode TaskInstance}s passed in will be canceled\n *\n * [Check out the \"Awaiting Multiple Child Tasks example\"](/docs/examples/joining-tasks)\n */\nexport const race = taskAwareVariantOf(Promise, 'race', identity);\n\n/**\n * A cancelation-aware variant of [RSVP.hash](https://api.emberjs.com/ember/release/functions/rsvp/hash).\n * The normal version of a `RSVP.hash` just returns a regular, uncancelable\n * Promise. The `ember-concurrency` variant of `hash()` has the following\n * additional behavior:\n *\n * - if the task that `yield`ed `hash()` is canceled, any of the\n *   {@linkcode TaskInstance}s passed in to `hash` will be canceled\n * - if any of the items rejects/cancels, all other cancelable items\n *   (e.g. {@linkcode TaskInstance}s) will be canceled\n */\nexport const hash = taskAwareVariantOf(RSVP, 'hash', getValues);\n\n/**\n * A cancelation-aware variant of [RSVP.hashSettled](https://api.emberjs.com/ember/release/functions/rsvp/hashSettled).\n * The normal version of a `RSVP.hashSettled` just returns a regular, uncancelable\n * Promise. The `ember-concurrency` variant of `hashSettled()` has the following\n * additional behavior:\n *\n * - if the task that `yield`ed `hashSettled()` is canceled, any of the\n *   {@linkcode TaskInstance}s passed in to `hashSettled` will be canceled\n */\nexport const hashSettled = taskAwareVariantOf(RSVP, 'hashSettled', getValues);\n\nfunction identity(obj) {\n  return obj;\n}\n\nfunction getValues(obj) {\n  return Object.keys(obj).map((k) => obj[k]);\n}\n\nfunction castForPromiseHelper(castable) {\n  if (castable) {\n    if (castable instanceof TaskInstance) {\n      // Mark TaskInstances, including those that performed synchronously and\n      // have finished already, as having their errors handled, as if they had\n      // been then'd, which this is emulating.\n      castable.executor.asyncErrorsHandled = true;\n    } else if (castable instanceof Yieldable) {\n      // Cast to promise\n      return castable._toPromise();\n    }\n  }\n\n  return castable;\n}\n\nfunction castAwaitables(arrOrHash, callback) {\n  if (Array.isArray(arrOrHash)) {\n    return arrOrHash.map(callback);\n  } else if (typeof arrOrHash === 'object' && arrOrHash !== null) {\n    let obj = {};\n    Object.keys(arrOrHash).forEach((key) => {\n      obj[key] = callback(arrOrHash[key]);\n    });\n    return obj;\n  } else {\n    // :shruggie:\n    return arrOrHash;\n  }\n}\n\nfunction taskAwareVariantOf(obj, method, getItems) {\n  return function (awaitable) {\n    let awaitables = castAwaitables(awaitable, castForPromiseHelper);\n\n    let items = getItems(awaitables);\n    assert(`'${method}' expects an array.`, Array.isArray(items));\n\n    let defer = RSVP.defer();\n\n    obj[method](awaitables).then(defer.resolve, defer.reject);\n\n    let hasCancelled = false;\n    let cancelAll = () => {\n      if (hasCancelled) {\n        return;\n      }\n      hasCancelled = true;\n      items.forEach((it) => {\n        if (it) {\n          if (it instanceof TaskInstance) {\n            it.cancel();\n          } else if (typeof it[cancelableSymbol] === 'function') {\n            it[cancelableSymbol]();\n          }\n        }\n      });\n    };\n\n    let promise = defer.promise.finally(cancelAll);\n    promise[cancelableSymbol] = cancelAll;\n    return promise;\n  };\n}\n","import { assert } from '@ember/debug';\nimport { schedule, cancel } from '@ember/runloop';\nimport { get } from '@ember/object';\nimport { addObserver, removeObserver } from '@ember/object/observers';\nimport { EmberYieldable, isEventedObject } from './utils';\n\nclass WaitForQueueYieldable extends EmberYieldable {\n  constructor(queueName) {\n    super();\n    this.queueName = queueName;\n  }\n\n  onYield(state) {\n    let timerId;\n\n    try {\n      timerId = schedule(this.queueName, () => state.next());\n    } catch (error) {\n      state.throw(error);\n    }\n\n    return () => cancel(timerId);\n  }\n}\n\nclass WaitForEventYieldable extends EmberYieldable {\n  constructor(object, eventName) {\n    super();\n    this.object = object;\n    this.eventName = eventName;\n    this.usesDOMEvents = false;\n  }\n\n  on(callback) {\n    if (typeof this.object.addEventListener === 'function') {\n      // assume that we're dealing with a DOM `EventTarget`.\n      this.usesDOMEvents = true;\n      this.object.addEventListener(this.eventName, callback);\n    } else {\n      this.object.on(this.eventName, callback);\n    }\n  }\n\n  off(callback) {\n    if (this.usesDOMEvents) {\n      this.object.removeEventListener(this.eventName, callback);\n    } else {\n      this.object.off(this.eventName, callback);\n    }\n  }\n\n  onYield(state) {\n    let fn = null;\n    let disposer = () => {\n      fn && this.off(fn);\n      fn = null;\n    };\n\n    fn = (event) => {\n      disposer();\n      state.next(event);\n    };\n\n    this.on(fn);\n\n    return disposer;\n  }\n}\n\nclass WaitForPropertyYieldable extends EmberYieldable {\n  constructor(object, key, predicateCallback = Boolean) {\n    super();\n    this.object = object;\n    this.key = key;\n\n    if (typeof predicateCallback === 'function') {\n      this.predicateCallback = predicateCallback;\n    } else {\n      this.predicateCallback = (v) => v === predicateCallback;\n    }\n  }\n\n  onYield(state) {\n    let observerBound = false;\n    let observerFn = () => {\n      let value = get(this.object, this.key);\n      let predicateValue = this.predicateCallback(value);\n      if (predicateValue) {\n        state.next(value);\n        return true;\n      }\n    };\n\n    if (!observerFn()) {\n      // eslint-disable-next-line ember/no-observers\n      addObserver(this.object, this.key, null, observerFn);\n      observerBound = true;\n    }\n\n    return () => {\n      if (observerBound && observerFn) {\n        removeObserver(this.object, this.key, null, observerFn);\n      }\n    };\n  }\n}\n\n/**\n * Use `waitForQueue` to pause the task until a certain run loop queue is reached.\n *\n * ```js\n * import { task, waitForQueue } from 'ember-concurrency';\n * export default class MyComponent extends Component {\n *   &#64;task *myTask() {\n *     yield waitForQueue('afterRender');\n *     console.log(\"now we're in the afterRender queue\");\n *   }\n * }\n * ```\n *\n * @param {string} queueName the name of the Ember run loop queue\n */\nexport function waitForQueue(queueName) {\n  return new WaitForQueueYieldable(queueName);\n}\n\n/**\n * Use `waitForEvent` to pause the task until an event is fired. The event\n * can either be a jQuery event or an Ember.Evented event (or any event system\n * where the object supports `.on()` `.one()` and `.off()`).\n *\n * ```js\n * import { task, waitForEvent } from 'ember-concurrency';\n * export default class MyComponent extends Component {\n *   &#64;task *myTask() {\n *     console.log(\"Please click anywhere..\");\n *     let clickEvent = yield waitForEvent($('body'), 'click');\n *     console.log(\"Got event\", clickEvent);\n *\n *     let emberEvent = yield waitForEvent(this, 'foo');\n *     console.log(\"Got foo event\", emberEvent);\n *\n *     // somewhere else: component.trigger('foo', { value: 123 });\n *   }\n * }\n * ```\n *\n * @param {object} object the Ember Object, jQuery element, or other object with .on() and .off() APIs\n *                 that the event fires from\n * @param {function} eventName the name of the event to wait for\n */\nexport function waitForEvent(object, eventName) {\n  assert(\n    `${object} must include Ember.Evented (or support \\`.on()\\` and \\`.off()\\`) or DOM EventTarget (or support \\`addEventListener\\` and  \\`removeEventListener\\`) to be able to use \\`waitForEvent\\``,\n    isEventedObject(object),\n  );\n  return new WaitForEventYieldable(object, eventName);\n}\n\n/**\n * Use `waitForProperty` to pause the task until a property on an object\n * changes to some expected value. This can be used for a variety of use\n * cases, including synchronizing with another task by waiting for it\n * to become idle, or change state in some other way. If you omit the\n * callback, `waitForProperty` will resume execution when the observed\n * property becomes truthy. If you provide a callback, it'll be called\n * immediately with the observed property's current value, and multiple\n * times thereafter whenever the property changes, until you return\n * a truthy value from the callback, or the current task is canceled.\n * You can also pass in a non-Function value in place of the callback,\n * in which case the task will continue executing when the property's\n * value becomes the value that you passed in.\n *\n * ```js\n * import { task, waitForProperty } from 'ember-concurrency';\n * export default class MyComponent extends Component {\n *   &#64;tracked foo = 0;\n *\n *   &#64;task *myTask() {\n *     console.log(\"Waiting for `foo` to become 5\");\n *\n *     yield waitForProperty(this, 'foo', v => v === 5);\n *     // alternatively: yield waitForProperty(this, 'foo', 5);\n *\n *     // somewhere else: this.foo = 5;\n *\n *     console.log(\"`foo` is 5!\");\n *\n *     // wait for another task to be idle before running:\n *     yield waitForProperty(this, 'otherTask.isIdle');\n *     console.log(\"otherTask is idle!\");\n *   }\n * }\n * ```\n *\n * @param {object} object an object (most likely an Ember Object)\n * @param {string} key the property name that is observed for changes\n * @param {function} callbackOrValue a Function that should return a truthy value\n *                                   when the task should continue executing, or\n *                                   a non-Function value that the watched property\n *                                   needs to equal before the task will continue running\n */\nexport function waitForProperty(object, key, predicateCallback) {\n  return new WaitForPropertyYieldable(object, key, predicateCallback);\n}\n","import { isNone, isPresent, isEmpty } from '@ember/utils';\nimport { assert } from '@ember/debug';\nimport { getOwner } from '@ember/application';\nimport Service from '@ember/service';\nimport { serializeCookie } from '../utils/serialize-cookie.ts';\n\nconst DEFAULTS = { raw: false };\nconst MAX_COOKIE_BYTE_LENGTH = 4096;\n\ntype ReadOptions = {\n  raw?: boolean;\n  domain?: never;\n  expires?: never;\n  maxAge?: never;\n  path?: never;\n};\n\nexport type WriteOptions = {\n  domain?: string;\n  path?: string;\n  secure?: boolean;\n  raw?: boolean;\n  sameSite?: 'Strict' | 'Lax' | 'None';\n  signed?: never;\n  httpOnly?: boolean;\n  partitioned?: boolean;\n} & ({ expires?: Date; maxAge?: never } | { maxAge?: number; expires?: never });\n\ntype ClearOptions = {\n  domain?: string;\n  path?: string;\n  secure?: boolean;\n\n  expires?: never;\n  maxAge?: never;\n  raw?: never;\n};\n\ntype CookiePair = [string, string];\n\ntype FastbootCookies = Record<string, { value?: string; options?: any }>;\n\nexport default class CookiesService extends Service {\n  _fastBoot:\n    | any\n    | {\n        request?: {\n          cookies?: Record<string, string>;\n        };\n      };\n  _fastBootCookiesCache?: FastbootCookies;\n\n  protected _document: Document = window.document;\n\n  constructor() {\n    super(...arguments);\n\n    let owner = getOwner(this);\n    if (typeof this._fastBoot === 'undefined' && owner) {\n      this._fastBoot = owner.lookup('service:fastboot');\n    }\n  }\n\n  _getDocumentCookies() {\n    let all = this._document.cookie.split(';');\n    let filtered = this._filterDocumentCookies(all);\n\n    return filtered.reduce(\n      (acc, cookie) => {\n        if (!isEmpty(cookie)) {\n          let [key, value] = cookie;\n          acc[key.trim()] = (value || '').trim();\n        }\n        return acc;\n      },\n      {} as Record<string, string>\n    );\n  }\n\n  _getFastBootCookies() {\n    const cookies = this._fastBoot.request.cookies;\n    const fastBootCookies = Object.keys(cookies).reduce((acc, name) => {\n      const value = cookies[name];\n\n      if (typeof value === 'object') {\n        acc[name] = value;\n      } else {\n        acc[name] = { value };\n      }\n\n      return acc;\n    }, {} as FastbootCookies);\n    const fastBootCookiesCache = this._fastBootCookiesCache || {};\n\n    const mergedFastBootCookies = Object.assign({}, fastBootCookies, fastBootCookiesCache);\n    this._fastBootCookiesCache = mergedFastBootCookies;\n    return this._filterCachedFastBootCookies(mergedFastBootCookies);\n  }\n\n  read(): Record<string, string | undefined>;\n  read(_name: string): string | undefined;\n  read(\n    name?: string,\n    options: ReadOptions = {}\n  ): string | undefined | Record<string, string | undefined> {\n    options = Object.assign({}, DEFAULTS, options || {});\n    assert(\n      'Domain, Expires, Max-Age, and Path options cannot be set when reading cookies',\n      isEmpty(options.domain) &&\n        isEmpty(options.expires) &&\n        isEmpty(options.maxAge) &&\n        isEmpty(options.path)\n    );\n\n    let all: Record<string, string | undefined> = {};\n    if (this._isFastBoot()) {\n      all = this._getFastBootCookies();\n    } else {\n      all = this._getDocumentCookies();\n    }\n\n    if (name) {\n      return this._decodeValue(all[name], options.raw);\n    } else {\n      Object.keys(all).forEach(name => (all[name] = this._decodeValue(all[name], options.raw)));\n      return all;\n    }\n  }\n\n  write(name: string, value: unknown, options?: WriteOptions) {\n    options = Object.assign({}, DEFAULTS, options || {});\n    assert(\n      \"Cookies cannot be set as signed as signed cookies would not be modifyable in the browser as it has no knowledge of the express server's signing key!\",\n      !options.signed\n    );\n    assert(\n      'Cookies cannot be set with both maxAge and an explicit expiration time!',\n      isEmpty(options.expires) || isEmpty(options.maxAge)\n    );\n\n    value = this._encodeValue(value as string, options.raw);\n\n    assert(\n      `Cookies larger than ${MAX_COOKIE_BYTE_LENGTH} bytes are not supported by most browsers!`,\n      typeof value === 'string' && this._isCookieSizeAcceptable(value)\n    );\n\n    if (this._isFastBoot()) {\n      this._writeFastBootCookie(name, value, options);\n    } else {\n      assert('Cookies cannot be set to be HTTP-only from a browser!', !options.httpOnly);\n\n      options.path = options.path || this._normalizedDefaultPath();\n      this._writeDocumentCookie(name, value, options);\n    }\n  }\n\n  clear(name: string, options?: ClearOptions) {\n    options = Object.assign({}, options || {});\n    assert(\n      'Expires, Max-Age, and raw options cannot be set when clearing cookies',\n      isEmpty(options.expires) && isEmpty(options.maxAge) && isEmpty(options.raw)\n    );\n\n    options.expires = new Date('1970-01-01') as never;\n    options.path = options.path || this._normalizedDefaultPath();\n    this.write(name, null, options);\n  }\n\n  exists(name: string) {\n    let all;\n    if (this._isFastBoot()) {\n      all = this._getFastBootCookies();\n    } else {\n      all = this._getDocumentCookies();\n    }\n\n    return Object.prototype.hasOwnProperty.call(all, name);\n  }\n\n  _writeDocumentCookie(name: string, value: unknown, options: WriteOptions = {}) {\n    let serializedCookie = this._serializeCookie(name, value, options);\n    this._document.cookie = serializedCookie;\n  }\n\n  _writeFastBootCookie(name: string, value: unknown, options: WriteOptions = {}) {\n    let responseHeaders = this._fastBoot.response.headers;\n    let serializedCookie = this._serializeCookie(name, value, options);\n\n    if (options.maxAge) {\n      options.maxAge *= 1000;\n    }\n\n    this._cacheFastBootCookie(name, value, options);\n\n    let replaced = false;\n    let existing = responseHeaders.getAll('set-cookie');\n\n    for (let i = 0; i < existing.length; i++) {\n      if (existing[i].startsWith(`${name}=`)) {\n        existing[i] = serializedCookie;\n        replaced = true;\n        break;\n      }\n    }\n\n    if (!replaced) {\n      responseHeaders.append('set-cookie', serializedCookie);\n    }\n  }\n\n  _cacheFastBootCookie(name: string, value: unknown, options: WriteOptions = {}) {\n    let fastBootCache = this._fastBootCookiesCache || {};\n    let cachedOptions: WriteOptions = Object.assign({}, options);\n\n    if (cachedOptions.maxAge && options.maxAge) {\n      let expires = new Date();\n      expires.setSeconds(expires.getSeconds() + options.maxAge);\n\n      delete cachedOptions.maxAge;\n      (cachedOptions as WriteOptions & { expires?: Date; maxAge?: never }).expires = expires;\n    }\n\n    fastBootCache[name] = { value: value as string, options: cachedOptions };\n    this._fastBootCookiesCache = fastBootCache;\n  }\n\n  _filterCachedFastBootCookies(fastBootCookies: FastbootCookies) {\n    let { path: requestPath } = this._fastBoot.request;\n\n    let host = this._fastBoot?.request?.host;\n\n    return Object.keys(fastBootCookies).reduce(\n      (acc, name) => {\n        let { value, options } = fastBootCookies[name] as { value: string; options: ReadOptions };\n        options = options || {};\n\n        let { path: optionsPath, domain, expires } = options;\n\n        if (optionsPath && requestPath.indexOf(optionsPath) !== 0) {\n          return acc;\n        }\n\n        if (domain && host.indexOf(domain) + (domain as string).length !== host.length) {\n          return acc;\n        }\n\n        if (expires && (expires as Date) < new Date()) {\n          return acc;\n        }\n\n        acc[name] = value;\n        return acc;\n      },\n      {} as Record<string, string>\n    );\n  }\n\n  _encodeValue(value: string | undefined, raw?: boolean) {\n    if (isNone(value)) {\n      return '';\n    } else if (raw) {\n      return value;\n    } else {\n      return encodeURIComponent(value);\n    }\n  }\n\n  _decodeValue(value: string | undefined, raw?: boolean) {\n    if (isNone(value) || raw) {\n      return value;\n    } else {\n      return decodeURIComponent(value);\n    }\n  }\n\n  _filterDocumentCookies(unfilteredCookies: string[]): CookiePair[] {\n    return unfilteredCookies\n      .map<CookiePair>(c => {\n        let separatorIndex = c.indexOf('=');\n        return [c.substring(0, separatorIndex), c.substring(separatorIndex + 1)];\n      })\n      .filter(c => c.length === 2 && isPresent(c[0]));\n  }\n\n  _serializeCookie(name: string, value: unknown, options: WriteOptions = {}) {\n    return serializeCookie(name, value, options);\n  }\n\n  _isCookieSizeAcceptable(value: string) {\n    // Counting bytes varies Pre-ES6 and in ES6\n    // This snippet counts the bytes in the value\n    // about to be stored as the cookie:\n    // See https://stackoverflow.com/a/25994411/6657064\n    let _byteCount = 0;\n    let i = 0;\n    let c;\n    while ((c = value.charCodeAt(i++))) {\n      _byteCount += c >> 11 ? 3 : c >> 7 ? 2 : 1;\n    }\n\n    return _byteCount < MAX_COOKIE_BYTE_LENGTH;\n  }\n\n  _normalizedDefaultPath() {\n    if (!this._isFastBoot()) {\n      let pathname = window.location.pathname;\n      return pathname.substring(0, pathname.lastIndexOf('/'));\n    }\n  }\n\n  _isFastBoot() {\n    return this._fastBoot && this._fastBoot.isFastBoot;\n  }\n}\n","import { typeOf, isEmpty } from '@ember/utils';\n\ninterface Options {\n  maxAge?: number | string;\n  domain?: string;\n  expires?: Date;\n  secure?: boolean;\n  httpOnly?: boolean;\n  path?: string;\n  sameSite?: string;\n  partitioned?: boolean;\n}\n\nexport const serializeCookie = (name: string, value: string | unknown, options: Options = {}) => {\n  let cookie = `${name}=${value}`;\n\n  if (!isEmpty(options.domain)) {\n    cookie = `${cookie}; domain=${options.domain}`;\n  }\n  if (options.expires && typeOf(options.expires) === 'date') {\n    cookie = `${cookie}; expires=${options.expires.toUTCString()}`;\n  }\n  if (!isEmpty(options.maxAge)) {\n    cookie = `${cookie}; max-age=${options.maxAge}`;\n  }\n  if (options.secure) {\n    cookie = `${cookie}; secure`;\n  }\n  if (options.httpOnly) {\n    cookie = `${cookie}; httpOnly`;\n  }\n  if (!isEmpty(options.path)) {\n    cookie = `${cookie}; path=${options.path}`;\n  }\n  if (!isEmpty(options.sameSite)) {\n    cookie = `${cookie}; SameSite=${options.sameSite}`;\n  }\n  if (options.partitioned) {\n    cookie = `${cookie}; Partitioned`;\n  }\n\n  return cookie;\n};\n","// eslint-disable-next-line ember/no-classic-components\nimport EmberComponent from '@ember/component';\nimport Helper from '@ember/component/helper';\nimport { assert, runInDebug } from '@ember/debug';\nimport { ensureSafeComponent } from '@embroider/util';\n\nimport type { ComponentLike } from '@glint/template';\n\n// eslint-disable-next-line @typescript-eslint/no-empty-function\nfunction UNINITIALIZED() {}\n\nexport type ElementFromTagName<T extends string> = T extends keyof HTMLElementTagNameMap\n  ? HTMLElementTagNameMap[T]\n  : Element;\n\ntype Positional<T extends string> = [name: T];\ntype Return<T extends string> = ComponentLike<{\n  Element: ElementFromTagName<T>;\n  Blocks: { default: [] };\n}>;\n\nexport interface ElementSignature<T extends string> {\n  Args: {\n    Positional: Positional<T>;\n  };\n  Return: Return<T> | undefined;\n}\n\nexport default class ElementHelper<T extends string> extends Helper<ElementSignature<T>> {\n  tagName: string | (() => void) = UNINITIALIZED;\n  componentClass?: Return<T>;\n\n  compute(params: Positional<T>, hash: object) {\n    assert('The `element` helper takes a single positional argument', params.length === 1);\n    assert(\n      'The `element` helper does not take any named arguments',\n      Object.keys(hash).length === 0\n    );\n\n    let tagName = params[0];\n\n    if (tagName !== this.tagName) {\n      this.tagName = tagName;\n\n      if (typeof tagName === 'string') {\n        this.componentClass = ensureSafeComponent(\n          // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n          // @ts-ignore\n          class DynamicElement extends EmberComponent {\n            tagName = tagName; // eslint-disable-line ember/require-tagless-components\n          },\n          this\n        ) as unknown as Return<T>;\n      } else {\n        this.componentClass = undefined;\n\n        runInDebug(() => {\n          let message = 'The argument passed to the `element` helper must be a string';\n\n          try {\n            message += ` (you passed \\`${tagName}\\`)`;\n          } catch (e) {\n            // ignore\n          }\n\n          assert(message, tagName === undefined || tagName === null);\n        });\n      }\n    }\n\n    return this.componentClass;\n  }\n}\n","import type { FileUploadDragEvent } from '../interfaces.ts';\n\nconst getDataSupport = {};\n\nexport default class DataTransferWrapper {\n  dataTransfer?: DataTransfer;\n  itemDetails?: FileUploadDragEvent['itemDetails'];\n  source?: FileUploadDragEvent['source'];\n\n  constructor(event: FileUploadDragEvent) {\n    this.source = event.source;\n    this.dataTransfer = event.dataTransfer;\n    this.itemDetails = event.itemDetails;\n  }\n\n  getData(type: string) {\n    const dataTransfer = this.dataTransfer;\n    if (!dataTransfer) return;\n\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    if (getDataSupport[type] == null) {\n      try {\n        const data = dataTransfer.getData(type);\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        getDataSupport[type] = true;\n        return data;\n      } catch (e) {\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        getDataSupport[type] = false;\n      }\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n    } else if (getDataSupport[type]) {\n      return dataTransfer.getData(type);\n    }\n    return '';\n  }\n\n  get filesOrItems() {\n    return this.files.length ? this.files : this.items;\n  }\n\n  get files() {\n    return Array.from(this.dataTransfer?.files ?? []);\n  }\n\n  get items() {\n    return this.itemDetails ?? Array.from(this.dataTransfer?.items ?? []);\n  }\n}\n","import { assert } from '@ember/debug';\nimport { type Timer, cancel, next } from '@ember/runloop';\nimport type {\n  DragEventListener,\n  QueuedDragEvent,\n  DragListenerHandlers,\n  FileUploadDragEvent,\n} from '../interfaces.ts';\nimport { action } from '@ember/object';\n\nexport default class DragListener {\n  _dropzone?: Element;\n\n  _listeners: DragEventListener[] = [];\n  _stack: DragEventListener[] = [];\n  _listener: DragEventListener | null = null;\n\n  // Keep a stack of deferred actions to take\n  // on listeners to provide sane events.\n  // `dragleave` / `dragenter` are called on the\n  // same element back to back, which isn't what\n  // we want to provide as an API.\n  _events: QueuedDragEvent[] = [];\n\n  _handlers: DragListenerHandlers = {};\n  _handlersAttached = false;\n  _scheduled: Timer | null = null;\n\n  constructor(dropzone: Element) {\n    this._dropzone = dropzone;\n  }\n\n  beginListening() {\n    if (!this._dropzone) return;\n\n    this._dropzone.addEventListener('dragenter', this.dragenter, {\n      passive: true,\n    });\n    this._dropzone.addEventListener('dragleave', this.dragleave, {\n      passive: true,\n    });\n    this._dropzone.addEventListener('dragover', this.dragover, {\n      passive: false,\n    });\n    this._dropzone.addEventListener('drop', this.drop, {\n      passive: false,\n    });\n\n    this._handlersAttached = true;\n  }\n\n  endListening() {\n    if (!this._dropzone) return;\n    if (!this._handlersAttached) return;\n\n    this._dropzone.removeEventListener('dragenter', this.dragenter);\n    this._dropzone.removeEventListener('dragleave', this.dragleave);\n    this._dropzone.removeEventListener('dragover', this.dragover);\n    this._dropzone.removeEventListener('drop', this.drop);\n  }\n\n  addEventListeners(handlers: DragListenerHandlers) {\n    if (!this._dropzone) return;\n\n    if (this._listeners.length === 0) {\n      this.beginListening();\n    }\n\n    // Listeners are ordered by most specific to least specific\n    let insertAt = this._listeners.length;\n\n    for (let i = 0, len = this._listeners.length; i < len; i++) {\n      const listener = this._listeners[i];\n\n      if (listener) {\n        assert(\n          `Cannot add multiple listeners for the same element ${this._dropzone}, ${listener.element}`,\n          this._dropzone !== listener.element,\n        );\n\n        if (listener.element.contains(this._dropzone)) {\n          insertAt = i;\n        }\n      }\n    }\n\n    this._listeners.splice(insertAt, 0, { element: this._dropzone, handlers });\n  }\n\n  removeEventListeners() {\n    this._listeners = this._listeners.filter(\n      (listener) => listener.element !== this._dropzone,\n    );\n    if (this._listeners.length === 0) {\n      this.endListening();\n    }\n  }\n\n  findListener(evt: FileUploadDragEvent) {\n    return this._listeners.find(({ element }) => {\n      return element === evt.target || element.contains(evt.target as Element);\n    });\n  }\n\n  getEventSource(evt: FileUploadDragEvent) {\n    const types = evt.dataTransfer?.types ?? [];\n    let areSomeTypesFiles = false;\n    for (let i = 0, len = types.length; i < len; i++) {\n      if (types[i] === 'Files' || types[i] === 'application/x-moz-file') {\n        areSomeTypesFiles = true;\n        break;\n      }\n    }\n    return areSomeTypesFiles ? 'os' : 'web';\n  }\n\n  getDataTransferItemDetails(evt: FileUploadDragEvent) {\n    const itemDetails = [];\n\n    if (evt.dataTransfer?.items) {\n      for (let i = 0; i < evt.dataTransfer.items.length; i++) {\n        const item = evt.dataTransfer.items[i];\n\n        if (item) {\n          itemDetails.push({\n            kind: item.kind,\n            type: item.type,\n          });\n        }\n      }\n    }\n\n    return itemDetails;\n  }\n\n  @action\n  dragenter(evt: Event) {\n    const event = evt as FileUploadDragEvent;\n    const listener = this.findListener(event);\n    const lastListener = this._stack[this._stack.length - 1];\n\n    // Trigger dragleave on the previous listener\n    if (lastListener) {\n      this.scheduleEvent('dragleave', lastListener, event);\n    }\n\n    if (listener) {\n      this.scheduleEvent('dragenter', listener, {\n        ...event,\n        source: this.getEventSource(event),\n        dataTransfer: event.dataTransfer,\n        itemDetails: this.getDataTransferItemDetails(event),\n      });\n    }\n    this._listener = listener ?? null;\n  }\n\n  @action\n  dragleave(evt: Event) {\n    const event = evt as FileUploadDragEvent;\n    // Trigger a dragleave if the file leaves the browser\n    if (this._stack[0]) {\n      this.scheduleEvent('dragleave', this._stack[0], event);\n      this._listener = null;\n    }\n  }\n\n  @action\n  dragover(evt: Event) {\n    const event = evt as FileUploadDragEvent;\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    const listener = this.findListener(event);\n    if (listener) {\n      if (this._listener) {\n        this.scheduleEvent('dragleave', this._listener, event);\n      }\n      this.scheduleEvent('dragenter', listener, {\n        ...event,\n        source: this.getEventSource(event),\n        dataTransfer: event.dataTransfer,\n        itemDetails: this.getDataTransferItemDetails(event),\n      });\n      if (this._stack.includes(listener)) {\n        listener.handlers?.dragover?.(event);\n      }\n    }\n    this._listener = listener ?? null;\n  }\n\n  scheduleEvent(\n    eventName: QueuedDragEvent['eventName'],\n    listener: QueuedDragEvent['listener'],\n    event: QueuedDragEvent['event'],\n  ) {\n    const isDuplicate = this._events.find((queuedEvent) => {\n      return (\n        queuedEvent.eventName === eventName && queuedEvent.listener === listener\n      );\n    });\n\n    const cancelledEvent = this._events.find((queuedEvent) => {\n      return (\n        (queuedEvent.listener === listener &&\n          queuedEvent.eventName === 'dragleave' &&\n          eventName === 'dragenter') ||\n        (queuedEvent.eventName === 'dragenter' && eventName === 'dragleave')\n      );\n    });\n\n    if (cancelledEvent) {\n      // Remove cancelled event\n      this._events = this._events.filter((queuedEvent) => {\n        return (\n          queuedEvent.listener !== cancelledEvent.listener &&\n          queuedEvent.eventName !== cancelledEvent.eventName &&\n          queuedEvent.event !== cancelledEvent.event\n        );\n      });\n      if (this._events.length === 0) {\n        if (this._scheduled) {\n          cancel(this._scheduled);\n        }\n        this._scheduled = null;\n      }\n    } else if (!isDuplicate) {\n      this._events.push({ eventName, listener, event });\n      if (!this._scheduled) {\n        this._scheduled = next(this, this.sendEvents);\n      }\n    }\n  }\n\n  sendEvents() {\n    this._events.forEach(({ eventName, listener, event }) => {\n      if (eventName === 'dragenter') {\n        this._stack.push(listener);\n      } else if (eventName === 'dragleave') {\n        this._stack.pop();\n      }\n      listener.handlers[eventName]?.(event);\n    });\n\n    this._events = [];\n    this._scheduled = null;\n  }\n\n  @action\n  drop(evt: Event) {\n    const event = evt as FileUploadDragEvent;\n\n    this._stack = [];\n    this._events = [];\n    this._scheduled = null;\n    this._listener = null;\n\n    evt.preventDefault();\n    evt.stopPropagation();\n    const listener = this.findListener(event);\n    listener?.handlers?.drop?.(event);\n  }\n}\n","import Modifier, { type ArgsFor, type NamedArgs } from 'ember-modifier';\nimport type { DragListenerModifierSignature } from '../interfaces.ts';\nimport DragListener from './drag-listener.ts';\nimport { registerDestructor } from '@ember/destroyable';\nimport type Owner from '@ember/owner';\n\nfunction cleanup(instance: DragListenerModifier) {\n  if (!instance.listener) return;\n\n  instance.listener.removeEventListeners();\n}\n\nexport default class DragListenerModifier extends Modifier<DragListenerModifierSignature> {\n  listener?: DragListener;\n\n  constructor(owner: Owner, args: ArgsFor<DragListenerModifierSignature>) {\n    super(owner, args);\n    registerDestructor(this, cleanup);\n  }\n\n  modify(\n    dropzone: Element,\n    _: [],\n    {\n      dragenter,\n      dragleave,\n      dragover,\n      drop,\n    }: NamedArgs<DragListenerModifierSignature>,\n  ) {\n    this.listener = new DragListener(dropzone);\n\n    this.listener.removeEventListeners();\n    this.listener.addEventListeners({\n      dragenter,\n      dragleave,\n      dragover,\n      drop,\n    });\n  }\n}\n","import { precompileTemplate } from \"@ember/template-compilation\";\nexport default precompileTemplate(\"<div\\n  ...attributes\\n  {{this.dragListener\\n    dragenter=this.didEnterDropzone\\n    dragleave=this.didLeaveDropzone\\n    dragover=this.didDragOver\\n    drop=this.didDrop\\n  }}\\n>\\n  {{yield\\n    (hash supported=this.supported active=this.active)\\n    this.queue\\n  }}\\n</div>\\n\")","import Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\nimport { getOwner } from '@ember/application';\nimport DataTransferWrapper from '../system/data-transfer-wrapper.ts';\nimport { action } from '@ember/object';\nimport { tracked } from '@glimmer/tracking';\nimport { UploadFile } from '../upload-file.ts';\nimport type FileQueueService from '../services/file-queue.ts';\nimport { DEFAULT_QUEUE } from '../services/file-queue.ts';\nimport {\n  type FileUploadDragEvent,\n  type FileDropzoneSignature,\n  FileSource,\n} from '../interfaces.ts';\nimport DragListenerModifier from '../system/drag-listener-modifier.ts';\n\n/**\n  `FileDropzone` is a component that will allow users to upload files by\n   drag and drop.\n\n  ```hbs\n  <FileDropzone @queue={{queue}} as |dropzone|>\n    {{#if dropzone.active}}\n      Drop to upload\n    {{else if queue.files.length}}\n      Uploading {{queue.files.length}} files. ({{queue.progress}}%)\n    {{else}}\n      <h4>Upload Images</h4>\n      <p>\n        {{#if dropzone.supported}}\n          Drag and drop images onto this area to upload them or\n        {{/if}}\n      </p>\n    {{/if}}\n  </FileDropzone>\n  ```\n\n  @class FileDropzoneComponent\n  @type Ember.Component\n  @yield {Hash} dropzone\n  @yield {boolean} dropzone.supported\n  @yield {boolean} dropzone.active\n  @yield {Queue} queue\n */\nexport default class FileDropzoneComponent extends Component<FileDropzoneSignature> {\n  @service declare fileQueue: FileQueueService;\n\n  @tracked active = false;\n  @tracked dataTransferWrapper?: DataTransferWrapper;\n\n  supported = (() =>\n    typeof window !== 'undefined' &&\n    window.document &&\n    'draggable' in document.createElement('span'))();\n\n  get queue() {\n    if (this.args.queue) {\n      return this.args.queue;\n    }\n\n    return this.fileQueue.findOrCreate(DEFAULT_QUEUE);\n  }\n\n  get multiple() {\n    return this.args.multiple ?? true;\n  }\n\n  get files(): File[] {\n    const files = this.dataTransferWrapper?.files ?? [];\n    if (this.multiple) return files;\n\n    return files.slice(0, 1);\n  }\n\n  get isAllowed() {\n    const { environment } =\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      getOwner(this).resolveRegistration('config:environment') as {\n        environment: string;\n      };\n\n    return (\n      environment === 'test' ||\n      (this.dataTransferWrapper && this.dataTransferWrapper.source === 'os') ||\n      this.args.allowUploadsFromWebsites\n    );\n  }\n\n  get cursor() {\n    return this.args.cursor ?? 'copy';\n  }\n\n  @action\n  didEnterDropzone(event: FileUploadDragEvent) {\n    this.dataTransferWrapper = new DataTransferWrapper(event);\n\n    if (this.isAllowed) {\n      event.dataTransfer.dropEffect = this.cursor;\n      this.active = true;\n\n      this.args.onDragEnter?.(this.files, this.dataTransferWrapper);\n    }\n  }\n\n  @action\n  didLeaveDropzone(event: FileUploadDragEvent) {\n    if (this.dataTransferWrapper) {\n      this.dataTransferWrapper.dataTransfer = event.dataTransfer;\n    }\n    if (this.dataTransferWrapper && this.isAllowed) {\n      if (event.dataTransfer) {\n        event.dataTransfer.dropEffect = this.cursor;\n      }\n      this.args.onDragLeave?.(this.files, this.dataTransferWrapper);\n\n      this.dataTransferWrapper = undefined;\n\n      if (this.isDestroyed) {\n        return;\n      }\n      this.active = false;\n    }\n  }\n\n  @action\n  didDragOver(event: FileUploadDragEvent) {\n    if (this.dataTransferWrapper) {\n      this.dataTransferWrapper.dataTransfer = event.dataTransfer;\n    }\n    if (this.isAllowed) {\n      event.dataTransfer.dropEffect = this.cursor;\n    }\n  }\n\n  @action\n  didDrop(event: FileUploadDragEvent) {\n    if (this.dataTransferWrapper) {\n      this.dataTransferWrapper.dataTransfer = event.dataTransfer;\n    }\n\n    if (!this.isAllowed) {\n      event.dataTransfer.dropEffect = this.cursor;\n      this.dataTransferWrapper = undefined;\n      return;\n    }\n\n    // @TODO - add tests for these or remove them\n    // // Testing support for dragging and dropping images\n    // // from other browser windows\n    // let url;\n\n    // // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // // @ts-ignore\n    // const html = this.dataTransferWrapper.getData('text/html');\n    // if (html) {\n    //   const parsedHtml = parseHTML(html);\n    //   // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    //   // @ts-ignore\n    //   const img = parsedHtml.getElementsByTagName('img')[0];\n    //   if (img) {\n    //     url = img.src;\n    //   }\n    // }\n\n    // if (url == null) {\n    //   // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    //   // @ts-ignore\n    //   url = this.dataTransferWrapper.getData('text/uri-list');\n    // }\n\n    // if (url) {\n    //   const image = new Image();\n    //   const [filename] = url.split('/').slice(-1);\n    //   image.crossOrigin = 'anonymous';\n    //   image.onload = () => {\n    //     const canvas = document.createElement('canvas');\n    //     canvas.width = image.width;\n    //     canvas.height = image.height;\n\n    //     const ctx = canvas.getContext('2d');\n    //     ctx?.drawImage(image, 0, 0);\n\n    //     if (canvas.toBlob) {\n    //       canvas.toBlob((blob) => {\n    //         // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    //         // @ts-ignore\n    //         const [file] = this.addFiles([blob], FileSource.web);\n    //         // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    //         // @ts-ignore\n    //         file.name = filename;\n    //       });\n    //     } else {\n    //       const binStr = atob(canvas.toDataURL().split(',')[1]);\n    //       const len = binStr.length;\n    //       const arr = new Uint8Array(len);\n\n    //       for (let i = 0; i < len; i++) {\n    //         arr[i] = binStr.charCodeAt(i);\n    //       }\n    //       const blob = new Blob([arr], { type: 'image/png' });\n    //       // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    //       // @ts-ignore\n    //       blob.name = filename;\n    //       // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    //       // @ts-ignore\n    //       const [file] = this.addFiles([blob], FileSource.web);\n    //       // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    //       // @ts-ignore\n    //       file.name = filename;\n    //     }\n    //   };\n    //   /* eslint-disable no-console */\n    //   image.onerror = function (e) {\n    //     console.log(e);\n    //   };\n    //   /* eslint-enable no-console */\n    //   image.src = url;\n    // }\n\n    if (this.dataTransferWrapper) {\n      const addedFiles = this.addFiles(this.files);\n      this.args.onDrop?.(addedFiles, this.dataTransferWrapper);\n\n      this.active = false;\n      this.dataTransferWrapper = undefined;\n    }\n  }\n\n  addFiles(files: File[]) {\n    const addedFiles = [];\n    for (const file of files) {\n      if (file instanceof File) {\n        const uploadFile = new UploadFile(file, FileSource.DragAndDrop);\n        if (\n          this.args.filter &&\n          !this.args.filter(file, files, files.indexOf(file))\n        ) {\n          continue;\n        }\n        this.queue.add(uploadFile);\n        addedFiles.push(uploadFile);\n      }\n    }\n    return addedFiles;\n  }\n\n  dragListener = DragListenerModifier;\n}\n","import { tracked } from '@glimmer/tracking';\n\nimport { upload } from './system/upload.ts';\nimport HTTPRequest from './system/http-request.ts';\nimport UploadFileReader from './system/upload-file-reader.ts';\n\nimport type { Queue } from './queue.ts';\nimport { guidFor } from '@ember/object/internals';\nimport RSVP from 'rsvp';\nimport { FileSource, FileState, type UploadOptions } from './interfaces.ts';\nimport { estimatedRate } from './system/rate.ts';\n\n/**\n * Files provide a uniform interface for interacting\n * with data that can be uploaded or read.\n */\nexport class UploadFile {\n  file: File;\n  #source: FileSource;\n\n  queue?: Queue;\n\n  constructor(file: File, source: FileSource) {\n    this.file = file;\n    this.#source = source;\n  }\n\n  /**\n   * The source of the file. This is useful\n   * for applications that want to gather\n   * analytics about how users upload their\n   * content.\n   */\n  get source(): FileSource {\n    return this.#source;\n  }\n\n  #id = `file-${guidFor(this)}`;\n\n  /** A unique id generated for this file. */\n  get id(): string {\n    return this.#id;\n  }\n\n  #name?: string;\n\n  /** The file name */\n  get name(): string {\n    return this.#name ?? this.file?.name;\n  }\n  set name(value: string) {\n    this.#name = value;\n  }\n\n  /** The current speed in ms that it takes to upload one byte */\n  get rate() {\n    return estimatedRate(this.rates);\n  }\n\n  #size = 0;\n\n  /** The size of the file in bytes. */\n  get size() {\n    return this.#size || this.file.size;\n  }\n\n  set size(value) {\n    this.#size = value;\n  }\n\n  /**\n   * The MIME type of the file.\n   *\n   * For a image file this may be `image/png`.\n   */\n  get type(): string {\n    return this.file.type;\n  }\n\n  /**\n   * Returns the appropriate file extension of\n   * the file according to the type\n   */\n  get extension(): string {\n    return this.type.split('/').slice(-1)[0] ?? '';\n  }\n\n  /**\n   * Tracks the number of bytes that had been uploaded when progress values last changed.\n   */\n  bytesWhenProgressLastUpdated = 0;\n\n  /** The number of bytes that have been uploaded to the server */\n  @tracked loaded = 0;\n\n  /**\n   * The current progress of the upload, as a percentage in the\n   * range of 0 to 100.\n   */\n  @tracked progress = 0;\n\n  /**\n   * When upload has finished this property will be set to true\n   */\n  @tracked isUploadComplete = false;\n\n  /**\n   * The current state that the file is in.\n   */\n  @tracked state: FileState = FileState.Queued;\n\n  // /**\n  //   The source of the file. This is useful\n  //   for applications that want to gather\n  //   analytics about how users upload their\n  //   content.\n\n  //   This property can be one of the following:\n\n  //   - `browse`\n  //   - `drag-and-drop`\n  //   - `web`\n  //   - `data-url`\n  //   - `blob`\n\n  //   `browse` is the source when the file is created\n  //   using the native file picker.\n\n  //   `drag-and-drop` is the source when the file was\n  //   created using drag and drop from their desktop.\n\n  //   `web` is the source when the file was created\n  //   by dragging the file from another webpage.\n\n  //   `data-url` is the source when the file is created\n  //   from a data URL using the `fromDataURL` method for\n  //   files. This usually means that the file was created\n  //   manually by the developer on behalf of the user.\n\n  //   `blob` is the source when the file is created\n  //   from a blob using the `fromBlob` method for\n  //   files. This usually means that the file was created\n  //   manually by the developer.\n\n  //   @accessor source\n  //   @type {String}\n  //   @default ''\n  //   @readonly\n  //  */\n  // source?: FileSource;\n\n  /**\n   * The timestamp of when the progress last updated in milliseconds. Used to calculate the time\n   * that has elapsed.\n   */\n  timestampWhenProgressLastUpdated = 0;\n\n  @tracked rates: number[] = [];\n\n  /**\n   * Upload file with `application/octet-stream` content type.\n   *\n   * @param url Your server endpoint where to upload the file\n   * @param options additional request options\n   */\n  uploadBinary(url: string, options: UploadOptions) {\n    options.contentType = 'application/octet-stream';\n    return upload(this, url, options, (request) => {\n      this.queue?.uploadStarted(this);\n      return request.send(this.file);\n    });\n  }\n\n  /**\n   * Upload file to your server\n   *\n   * @param url Your server endpoint where to upload the file\n   * @param options additional options, eg. `{ fileKey: string, data: { key: string } }`\n   */\n  upload(url: string, options?: UploadOptions) {\n    return upload(\n      this,\n      url,\n      options,\n      (request: HTTPRequest, opts: UploadOptions): RSVP.Promise<Response> => {\n        // Build the form\n        const form = new FormData();\n        // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n        // @ts-ignore\n        for (const key of Object.keys(opts.data)) {\n          if (key === opts.fileKey) {\n            // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n            // @ts-ignore\n            form.append(key, opts.data[key], this.name);\n          } else {\n            // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n            // @ts-ignore\n            form.append(key, opts.data[key]);\n          }\n        }\n\n        this.queue?.uploadStarted(this);\n        return request.send(form);\n      },\n    );\n  }\n\n  /**\n   * Resolves with Blob as ArrayBuffer\n   */\n  readAsArrayBuffer() {\n    const reader = new UploadFileReader({\n      label: `Read ${this.name} as an ArrayBuffer`,\n    });\n    return reader.readAsArrayBuffer(this.file);\n  }\n\n  /**\n   * Resolves with Blob as DataURL\n   */\n  readAsDataURL() {\n    const reader = new UploadFileReader({\n      label: `Read ${this.name} as a Data URI`,\n    });\n    return reader.readAsDataURL(this.file);\n  }\n\n  /**\n   * Resolves with Blob as binary string\n   */\n  readAsBinaryString() {\n    const reader = new UploadFileReader({\n      label: `Read ${this.name} as a binary string`,\n    });\n    return reader.readAsBinaryString(this.file);\n  }\n\n  /**\n   * Resolves with Blob as plain text\n   */\n  readAsText() {\n    const reader = new UploadFileReader({ label: `Read ${this.name} as text` });\n    return reader.readAsText(this.file);\n  }\n\n  /**\n   * Creates a file object that can be read or uploaded to a\n   * server from a Blob object.\n   *\n   * @param blob the blob to create the file from.\n   * @param source the source that created the blob.\n   * @returns the file\n   */\n  static fromBlob(blob: Blob, source = FileSource.Blob) {\n    const file = new File([blob], 'blob', { type: blob.type });\n    return new this(file, source);\n  }\n\n  /**\n   * Creates a file object that can be read or uploaded to a\n   * server from a data URL.\n   *\n   * @param dataURL the data URL to create the file from.\n   * @param source the source of the data URL.\n   * @returns the file\n   */\n  static fromDataURL(dataURL: string, source = FileSource.DataUrl) {\n    const [typeInfo, base64String] = dataURL.split(',');\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    const mimeType = typeInfo.match(/:(.*?);/)[1];\n\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    const binaryString = atob(base64String);\n    const binaryData = new Uint8Array(binaryString.length);\n\n    for (let i = 0, len = binaryString.length; i < len; i++) {\n      binaryData[i] = binaryString.charCodeAt(i);\n    }\n\n    const blob = new Blob([binaryData], { type: mimeType });\n\n    return this.fromBlob(blob, source);\n  }\n}\n","import { action } from '@ember/object';\nimport { modifier } from 'ember-modifier';\nimport { TrackedSet } from 'tracked-built-ins';\nimport { UploadFile } from './upload-file.ts';\nimport type FileQueueService from './services/file-queue.ts';\nimport {\n  FileSource,\n  FileState,\n  type QueueListener,\n  type QueueName,\n  type SelectFileSignature,\n} from './interfaces.ts';\n\n/**\n * The Queue is a collection of files that\n * are being manipulated by the user.\n *\n * Queues are designed to persist the state\n * of uploads when a user navigates around your\n * application.\n */\nexport class Queue {\n  #listeners: Set<QueueListener> = new Set();\n\n  #name: QueueName;\n\n  /**\n   * The unique identifier of the queue.\n   *\n   * @remarks\n   * Queue names should be deterministic so they\n   * can be retrieved. It's recommended to provide\n   * a helpful name.\n   *\n   * If the queue belongs to a top level collection,\n   * photos, the good name for this queue may be `\"photos\"`.\n   *\n   * If you're uploading images to an artwork, the\n   * best name would incoporate both `\"artworks\"` and\n   * the identifier of the artwork. A good name for this\n   * queue may be `\"artworks/{{id}}/photos\"`, where `{{id}}`\n   * is a dynamic segment that is generated from the artwork id.\n   */\n  get name(): QueueName {\n    return this.#name;\n  }\n\n  /** The FileQueue service. */\n  fileQueue: FileQueueService;\n\n  #distinctFiles: Set<UploadFile> = new TrackedSet();\n\n  /**\n   * The list of files in the queue. This automatically gets\n   * flushed when all the files in the queue have settled.\n   *\n   * @remarks\n   * Note that files that have failed need to be manually\n   * removed from the queue. This is so they can be retried\n   * without resetting the state of the queue, orphaning the\n   * file from its queue. Upload failures can happen due to a\n   * timeout or a server response. If you choose to use the\n   * `abort` method, the file will fail to upload, but will\n   * be removed from the requeuing proccess, and will be\n   * considered to be in a settled state.\n   *\n   * @defaultValue []\n   */\n  get files(): UploadFile[] {\n    return [...this.#distinctFiles.values()];\n  }\n\n  /**\n   * The current time in ms it is taking to upload 1 byte.\n   *\n   * @defaultValue 0\n   */\n  get rate(): number {\n    return this.files\n      .filter((file) => file.state === FileState.Uploading)\n      .reduce((acc, { rate }) => {\n        return acc + rate;\n      }, 0);\n  }\n\n  /**\n   * The total size of all files currently being uploaded in bytes.\n   *\n   * @defaultValue 0\n   */\n  get size(): number {\n    return this.files.reduce((acc, { size }) => {\n      return acc + size;\n    }, 0);\n  }\n\n  /**\n   * The number of bytes that have been uploaded to the server.\n   *\n   * @defaultValue 0\n   */\n  get loaded(): number {\n    return this.files.reduce((acc, { loaded }) => {\n      return acc + loaded;\n    }, 0);\n  }\n\n  /**\n   * The current progress of all uploads, as a percentage in the\n   * range of 0 to 100.\n   *\n   * @defaultValue 0\n   */\n  get progress() {\n    const percent = this.loaded / this.size || 0;\n    return Math.floor(percent * 100);\n  }\n\n  constructor({\n    name,\n    fileQueue,\n  }: {\n    name: QueueName;\n    fileQueue: FileQueueService;\n  }) {\n    this.#name = name;\n    this.fileQueue = fileQueue;\n  }\n\n  addListener(listener: QueueListener) {\n    this.#listeners.add(listener);\n  }\n\n  removeListener(listener: QueueListener) {\n    this.#listeners.delete(listener);\n  }\n\n  /**\n   * Add a file to the queue\n   * @param file the file to be added\n   */\n  @action\n  add(file: UploadFile) {\n    if (this.#distinctFiles.has(file)) {\n      return;\n    }\n\n    file.queue = this;\n    this.#distinctFiles.add(file);\n\n    for (const listener of this.#listeners) {\n      listener.onFileAdded?.(file);\n    }\n  }\n\n  /**\n   * Remove a file from the queue\n   * @param file the file to be removed\n   */\n  @action\n  remove(file: UploadFile) {\n    if (!this.#distinctFiles.has(file)) {\n      return;\n    }\n\n    file.queue = undefined;\n    this.#distinctFiles.delete(file);\n\n    for (const listener of this.#listeners) {\n      listener.onFileRemoved?.(file);\n    }\n  }\n\n  uploadStarted(file: UploadFile) {\n    for (const listener of this.#listeners) {\n      listener.onUploadStarted?.(file);\n    }\n  }\n\n  uploadSucceeded(file: UploadFile, response: Response) {\n    for (const listener of this.#listeners) {\n      listener.onUploadSucceeded?.(file, response);\n    }\n  }\n\n  uploadFailed(file: UploadFile, response: Response) {\n    for (const listener of this.#listeners) {\n      listener.onUploadFailed?.(file, response);\n    }\n  }\n\n  /**\n   * Flushes the `files` property if they have settled. This\n   * will only flush files when all files have arrived at a terminus\n   * of their state chart (`uploaded` and `aborted`).\n   *\n   * Files *may* be requeued by the user in the `failed` or `timed_out`\n   * states.\n   */\n  flush() {\n    if (this.files.length === 0) {\n      return;\n    }\n\n    const allFilesHaveSettled = this.files.every((file) => {\n      return [FileState.Uploaded, FileState.Aborted].includes(file.state);\n    });\n\n    if (allFilesHaveSettled) {\n      this.files.forEach((file) => (file.queue = undefined));\n      this.#distinctFiles.clear();\n    }\n  }\n\n  selectFile = modifier<SelectFileSignature>(\n    (element, _positional, { filter, onFilesSelected }) => {\n      const changeHandler = (event: Event) => {\n        const { files: fileList } = event.target as HTMLInputElement;\n        if (!fileList) {\n          return;\n        }\n\n        const files = Array.from(fileList);\n        const selectedFiles: UploadFile[] = [];\n\n        for (const file of files) {\n          if (filter && !filter?.(file, files, files.indexOf(file))) {\n            continue;\n          }\n\n          let uploadFile;\n          if (file instanceof File) {\n            uploadFile = new UploadFile(file, FileSource.Browse);\n          }\n          // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n          // @ts-ignore\n          else if (file instanceof Blob) {\n            uploadFile = UploadFile.fromBlob(file, FileSource.Browse);\n          }\n\n          if (uploadFile) {\n            selectedFiles.push(uploadFile);\n            this.add(uploadFile);\n          }\n        }\n\n        onFilesSelected?.(selectedFiles);\n\n        // this will reset the input, so the _same_ file can be picked again\n        // Without, the `change` event wouldn't be fired, as it is still the same\n        // value\n        element.value = '';\n      };\n      element.addEventListener('change', changeHandler);\n\n      return () => {\n        element.removeEventListener('change', changeHandler);\n      };\n    },\n    // used to opt-in to lazy argument handling, which is the default for ember-modifier@^4\n    { eager: false },\n  );\n}\n","import { assert } from '@ember/debug';\nimport Service from '@ember/service';\nimport { registerDestructor } from '@ember/destroyable';\nimport { Queue } from '../queue.ts';\nimport type { UploadFile } from '../upload-file.ts';\nimport { FileState, type QueueName } from '../interfaces.ts';\nimport { TrackedMap } from 'tracked-built-ins';\n\nexport const DEFAULT_QUEUE = Symbol('DEFAULT_QUEUE');\n\n/**\n * The file queue service is a global file\n * queue that manages all files being uploaded.\n *\n * This service can be used to query the current\n * upload state when a user leaves the app,\n * asking them whether they want to cancel\n * the remaining uploads.\n */\nexport default class FileQueueService extends Service {\n  queues: TrackedMap<QueueName, Queue> = new TrackedMap();\n\n  /**\n   * Identical untracked map to avoid mutating tracked state during rendering\n   * when checking for existing queues.\n   */\n  #queues: Map<QueueName, Queue> = new Map();\n\n  /**\n   * Returns a queue with the given name\n   *\n   * @param name The name of the queue to find\n   * @returns The queue if it exists\n   */\n  find(name: QueueName): Queue | undefined {\n    return this.#queues.get(name);\n  }\n\n  /**\n   * Create a new queue with the given name.\n   *\n   * @param name The name of the queue to create\n   * @returns The new queue.\n   */\n  create(name: QueueName): Queue {\n    assert(\n      `Queue names are required to be unique. \"${String(\n        name,\n      )}\" has already been reserved.`,\n      !this.#queues.has(name),\n    );\n\n    const queue = new Queue({ name, fileQueue: this });\n\n    registerDestructor(queue, () => {\n      this.#queues.delete(name);\n      this.queues.delete(name);\n    });\n\n    this.#queues.set(name, queue);\n    this.queues.set(name, queue);\n    return queue;\n  }\n\n  findOrCreate(name: QueueName): Queue {\n    return this.find(name) ?? this.create(name);\n  }\n\n  /**\n   * The list of all files in queues. This automatically gets\n   * flushed when all the files in the queue have settled.\n   *\n   * @remarks\n   * Note that files that have failed need to be manually\n   * removed from the queue. This is so they can be retried\n   * without resetting the state of the queue, orphaning the\n   * file from its queue. Upload failures can happen due to a\n   * timeout or a server response. If you choose to use the\n   * `abort` method, the file will fail to upload, but will\n   * be removed from the requeuing proccess, and will be\n   * considered to be in a settled state.\n   *\n   * @defaultValue []\n   */\n  get files(): UploadFile[] {\n    return [...this.queues.values()].reduce((acc: UploadFile[], queue) => {\n      return [...acc, ...queue.files];\n    }, []);\n  }\n\n  /**\n   * The current time in ms it is taking to upload 1 byte.\n   *\n   * @defaultValue 0\n   */\n  get rate(): number {\n    return this.files\n      .filter((file) => file.state === FileState.Uploading)\n      .reduce((acc, { rate }) => {\n        return acc + rate;\n      }, 0);\n  }\n\n  /**\n   * The total size of all files currently being uploaded in bytes.\n   *\n   * @defaultValue 0\n   */\n  get size(): number {\n    return this.files.reduce((acc, { size }) => {\n      return acc + size;\n    }, 0);\n  }\n\n  /**\n   * The number of bytes that have been uploaded to the server.\n   *\n   * @defaultValue 0\n   */\n  get loaded(): number {\n    return this.files.reduce((acc, { loaded }) => {\n      return acc + loaded;\n    }, 0);\n  }\n\n  /**\n   * The current progress of all uploads, as a percentage in the\n   * range of 0 to 100.\n   *\n   * @defaultValue 0\n   */\n  get progress(): number {\n    const percent = this.loaded / this.size || 0;\n    return Math.floor(percent * 100);\n  }\n}\n","import Helper from '@ember/component/helper';\nimport { registerDestructor } from '@ember/destroyable';\nimport { inject as service } from '@ember/service';\nimport type { UploadFile } from '../upload-file.ts';\nimport type FileQueueService from '../services/file-queue.ts';\nimport { DEFAULT_QUEUE } from '../services/file-queue.ts';\nimport type { FileQueueSignature, QueueListener } from '../interfaces.ts';\n\n/**\n * `file-queue` helper is one of the core primitives of ember-file-upload.\n *\n * @example\n *\n * using the default queue (no `name` property)\n *\n * ```hbs\n * {{#let (file-queue) as |queue|}}\n *   {{queue.progress}}%\n * {{/let}}\n * ```\n *\n * @example\n *\n * named queue:\n *\n * ```hbs\n * {{#let (file-queue name=\"photos\") as |queue|}}\n *   {{queue.progress}}%\n * {{/let}}\n * ```\n */\nexport default class FileQueueHelper\n  extends Helper<FileQueueSignature>\n  implements QueueListener\n{\n  @service declare fileQueue: FileQueueService;\n\n  declare named: FileQueueSignature['Args']['Named'];\n\n  compute(\n    _positional: FileQueueSignature['Args']['Positional'],\n    named: FileQueueSignature['Args']['Named'],\n  ) {\n    this.named = named;\n    const queue = this.fileQueue.findOrCreate(named.name ?? DEFAULT_QUEUE);\n\n    queue.addListener(this);\n\n    registerDestructor(this, () => {\n      queue.removeListener(this);\n    });\n\n    return queue;\n  }\n\n  onFileAdded(file: UploadFile) {\n    this.named.onFileAdded?.(file);\n  }\n\n  onFileRemoved(file: UploadFile) {\n    this.named.onFileRemoved?.(file);\n  }\n\n  onUploadStarted(file: UploadFile) {\n    this.named.onUploadStarted?.(file);\n  }\n\n  onUploadSucceeded(file: UploadFile, response: Response) {\n    this.named.onUploadSucceeded?.(file, response);\n  }\n\n  onUploadFailed(file: UploadFile, response: Response) {\n    this.named.onUploadFailed?.(file, response);\n  }\n}\n","/**\n * Minimal Event interface implementation\n *\n * Original implementation by Sven Fuchs: https://gist.github.com/995028\n * Modifications and tests by Christian Johansen.\n *\n * @author Sven Fuchs (svenfuchs@artweb-design.de)\n * @author Christian Johansen (christian@cjohansen.no)\n * @license BSD\n *\n * Copyright (c) 2011 Sven Fuchs, Christian Johansen\n */\n\nvar _Event = function Event(type, bubbles, cancelable, target) {\n  this.type = type;\n  this.bubbles = bubbles;\n  this.cancelable = cancelable;\n  this.target = target;\n};\n\n_Event.prototype = {\n  stopPropagation: function () {},\n  preventDefault: function () {\n    this.defaultPrevented = true;\n  }\n};\n\n/*\n  Used to set the statusText property of an xhr object\n*/\nvar httpStatusCodes = {\n  100: \"Continue\",\n  101: \"Switching Protocols\",\n  200: \"OK\",\n  201: \"Created\",\n  202: \"Accepted\",\n  203: \"Non-Authoritative Information\",\n  204: \"No Content\",\n  205: \"Reset Content\",\n  206: \"Partial Content\",\n  300: \"Multiple Choice\",\n  301: \"Moved Permanently\",\n  302: \"Found\",\n  303: \"See Other\",\n  304: \"Not Modified\",\n  305: \"Use Proxy\",\n  307: \"Temporary Redirect\",\n  400: \"Bad Request\",\n  401: \"Unauthorized\",\n  402: \"Payment Required\",\n  403: \"Forbidden\",\n  404: \"Not Found\",\n  405: \"Method Not Allowed\",\n  406: \"Not Acceptable\",\n  407: \"Proxy Authentication Required\",\n  408: \"Request Timeout\",\n  409: \"Conflict\",\n  410: \"Gone\",\n  411: \"Length Required\",\n  412: \"Precondition Failed\",\n  413: \"Request Entity Too Large\",\n  414: \"Request-URI Too Long\",\n  415: \"Unsupported Media Type\",\n  416: \"Requested Range Not Satisfiable\",\n  417: \"Expectation Failed\",\n  422: \"Unprocessable Entity\",\n  500: \"Internal Server Error\",\n  501: \"Not Implemented\",\n  502: \"Bad Gateway\",\n  503: \"Service Unavailable\",\n  504: \"Gateway Timeout\",\n  505: \"HTTP Version Not Supported\"\n};\n\n\n/*\n  Cross-browser XML parsing. Used to turn\n  XML responses into Document objects\n  Borrowed from JSpec\n*/\nfunction parseXML(text) {\n  var xmlDoc;\n\n  if (typeof DOMParser != \"undefined\") {\n    var parser = new DOMParser();\n    xmlDoc = parser.parseFromString(text, \"text/xml\");\n  } else {\n    xmlDoc = new ActiveXObject(\"Microsoft.XMLDOM\");\n    xmlDoc.async = \"false\";\n    xmlDoc.loadXML(text);\n  }\n\n  return xmlDoc;\n}\n\n/*\n  Without mocking, the native XMLHttpRequest object will throw\n  an error when attempting to set these headers. We match this behavior.\n*/\nvar unsafeHeaders = {\n  \"Accept-Charset\": true,\n  \"Accept-Encoding\": true,\n  \"Connection\": true,\n  \"Content-Length\": true,\n  \"Cookie\": true,\n  \"Cookie2\": true,\n  \"Content-Transfer-Encoding\": true,\n  \"Date\": true,\n  \"Expect\": true,\n  \"Host\": true,\n  \"Keep-Alive\": true,\n  \"Referer\": true,\n  \"TE\": true,\n  \"Trailer\": true,\n  \"Transfer-Encoding\": true,\n  \"Upgrade\": true,\n  \"User-Agent\": true,\n  \"Via\": true\n};\n\n/*\n  Adds an \"event\" onto the fake xhr object\n  that just calls the same-named method. This is\n  in case a library adds callbacks for these events.\n*/\nfunction _addEventListener(eventName, xhr){\n  xhr.addEventListener(eventName, function (event) {\n    var listener = xhr[\"on\" + eventName];\n\n    if (listener && typeof listener == \"function\") {\n      listener.call(event.target, event);\n    }\n  });\n}\n\nfunction EventedObject() {\n  this._eventListeners = {};\n  var events = [\"loadstart\", \"progress\", \"load\", \"abort\", \"loadend\"];\n  for (var i = events.length - 1; i >= 0; i--) {\n    _addEventListener(events[i], this);\n  }\n};\n\nEventedObject.prototype = {\n  /*\n    Duplicates the behavior of native XMLHttpRequest's addEventListener function\n  */\n  addEventListener: function addEventListener(event, listener) {\n    this._eventListeners[event] = this._eventListeners[event] || [];\n    this._eventListeners[event].push(listener);\n  },\n\n  /*\n    Duplicates the behavior of native XMLHttpRequest's removeEventListener function\n  */\n  removeEventListener: function removeEventListener(event, listener) {\n    var listeners = this._eventListeners[event] || [];\n\n    for (var i = 0, l = listeners.length; i < l; ++i) {\n      if (listeners[i] == listener) {\n        return listeners.splice(i, 1);\n      }\n    }\n  },\n\n  /*\n    Duplicates the behavior of native XMLHttpRequest's dispatchEvent function\n  */\n  dispatchEvent: function dispatchEvent(event) {\n    var type = event.type;\n    var listeners = this._eventListeners[type] || [];\n\n    for (var i = 0; i < listeners.length; i++) {\n      if (typeof listeners[i] == \"function\") {\n        listeners[i].call(this, event);\n      } else {\n        listeners[i].handleEvent(event);\n      }\n    }\n\n    return !!event.defaultPrevented;\n  },\n\n  /*\n    Triggers an `onprogress` event with the given parameters.\n  */\n  _progress: function _progress(lengthComputable, loaded, total) {\n    var event = new _Event('progress');\n    event.target = this;\n    event.lengthComputable = lengthComputable;\n    event.loaded = loaded;\n    event.total = total;\n    this.dispatchEvent(event);\n  }\n}\n\n/*\n  Constructor for a fake window.XMLHttpRequest\n*/\nfunction FakeXMLHttpRequest() {\n  EventedObject.call(this);\n  this.readyState = FakeXMLHttpRequest.UNSENT;\n  this.requestHeaders = {};\n  this.requestBody = null;\n  this.status = 0;\n  this.statusText = \"\";\n  this.upload = new EventedObject();\n  this.onabort= null;\n  this.onerror= null;\n  this.onload= null;\n  this.onloadend= null;\n  this.onloadstart= null;\n  this.onprogress= null;\n  this.onreadystatechange= null;\n  this.ontimeout= null;\n}\n\nFakeXMLHttpRequest.prototype = new EventedObject();\n\n// These status codes are available on the native XMLHttpRequest\n// object, so we match that here in case a library is relying on them.\nFakeXMLHttpRequest.UNSENT = 0;\nFakeXMLHttpRequest.OPENED = 1;\nFakeXMLHttpRequest.HEADERS_RECEIVED = 2;\nFakeXMLHttpRequest.LOADING = 3;\nFakeXMLHttpRequest.DONE = 4;\n\nvar FakeXMLHttpRequestProto = {\n  UNSENT: 0,\n  OPENED: 1,\n  HEADERS_RECEIVED: 2,\n  LOADING: 3,\n  DONE: 4,\n  async: true,\n  withCredentials: false,\n\n  /*\n    Duplicates the behavior of native XMLHttpRequest's open function\n  */\n  open: function open(method, url, async, username, password) {\n    this.method = method;\n    this.url = url;\n    this.async = typeof async == \"boolean\" ? async : true;\n    this.username = username;\n    this.password = password;\n    this.responseText = null;\n    this.response = this.responseText;\n    this.responseXML = null;\n    this.responseURL = url;\n    this.requestHeaders = {};\n    this.sendFlag = false;\n    this._readyStateChange(FakeXMLHttpRequest.OPENED);\n  },\n\n  /*\n    Duplicates the behavior of native XMLHttpRequest's setRequestHeader function\n  */\n  setRequestHeader: function setRequestHeader(header, value) {\n    verifyState(this);\n\n    if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) {\n      throw new Error(\"Refused to set unsafe header \\\"\" + header + \"\\\"\");\n    }\n\n    if (this.requestHeaders[header]) {\n      this.requestHeaders[header] += \",\" + value;\n    } else {\n      this.requestHeaders[header] = value;\n    }\n  },\n\n  /*\n    Duplicates the behavior of native XMLHttpRequest's send function\n  */\n  send: function send(data) {\n    verifyState(this);\n\n    if (!/^(get|head)$/i.test(this.method)) {\n      var hasContentTypeHeader = false\n\n      Object.keys(this.requestHeaders).forEach(function (key) {\n        if (key.toLowerCase() === 'content-type') {\n          hasContentTypeHeader = true;\n        }\n      });\n\n      if (!hasContentTypeHeader && !(data || '').toString().match('FormData')) {\n        this.requestHeaders[\"Content-Type\"] = \"text/plain;charset=UTF-8\";\n      }\n\n      this.requestBody = data;\n    }\n\n    this.errorFlag = false;\n    this.sendFlag = this.async;\n    this._readyStateChange(FakeXMLHttpRequest.OPENED);\n\n    if (typeof this.onSend == \"function\") {\n      this.onSend(this);\n    }\n\n    this.dispatchEvent(new _Event(\"loadstart\", false, false, this));\n  },\n\n  /*\n    Duplicates the behavior of native XMLHttpRequest's abort function\n  */\n  abort: function abort() {\n    this.aborted = true;\n    this.responseText = null;\n    this.response = this.responseText;\n    this.errorFlag = true;\n    this.requestHeaders = {};\n\n    this.dispatchEvent(new _Event(\"abort\", false, false, this));\n\n    if (this.readyState > FakeXMLHttpRequest.UNSENT && this.sendFlag) {\n      this._readyStateChange(FakeXMLHttpRequest.UNSENT);\n      this.sendFlag = false;\n    }\n\n    if (typeof this.onerror === \"function\") {\n      this.onerror();\n    }\n  },\n\n  /*\n    Duplicates the behavior of native XMLHttpRequest's getResponseHeader function\n  */\n  getResponseHeader: function getResponseHeader(header) {\n    if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n      return null;\n    }\n\n    if (/^Set-Cookie2?$/i.test(header)) {\n      return null;\n    }\n\n    header = header.toLowerCase();\n\n    for (var h in this.responseHeaders) {\n      if (h.toLowerCase() == header) {\n        return this.responseHeaders[h];\n      }\n    }\n\n    return null;\n  },\n\n  /*\n    Duplicates the behavior of native XMLHttpRequest's getAllResponseHeaders function\n  */\n  getAllResponseHeaders: function getAllResponseHeaders() {\n    if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) {\n      return \"\";\n    }\n\n    var headers = \"\";\n\n    for (var header in this.responseHeaders) {\n      if (this.responseHeaders.hasOwnProperty(header) && !/^Set-Cookie2?$/i.test(header)) {\n        headers += header + \": \" + this.responseHeaders[header] + \"\\r\\n\";\n      }\n    }\n\n    return headers;\n  },\n\n  /*\n   Duplicates the behavior of native XMLHttpRequest's overrideMimeType function\n   */\n  overrideMimeType: function overrideMimeType(mimeType) {\n    if (typeof mimeType === \"string\") {\n      this.forceMimeType = mimeType.toLowerCase();\n    }\n  },\n\n\n  /*\n    Places a FakeXMLHttpRequest object into the passed\n    state.\n  */\n  _readyStateChange: function _readyStateChange(state) {\n    this.readyState = state;\n\n    if (typeof this.onreadystatechange == \"function\") {\n      this.onreadystatechange(new _Event(\"readystatechange\"));\n    }\n\n    this.dispatchEvent(new _Event(\"readystatechange\"));\n\n    if (this.readyState == FakeXMLHttpRequest.DONE) {\n      this.dispatchEvent(new _Event(\"load\", false, false, this));\n    }\n    if (this.readyState == FakeXMLHttpRequest.UNSENT || this.readyState == FakeXMLHttpRequest.DONE) {\n      this.dispatchEvent(new _Event(\"loadend\", false, false, this));\n    }\n  },\n\n\n  /*\n    Sets the FakeXMLHttpRequest object's response headers and\n    places the object into readyState 2\n  */\n  _setResponseHeaders: function _setResponseHeaders(headers) {\n    this.responseHeaders = {};\n\n    for (var header in headers) {\n      if (headers.hasOwnProperty(header)) {\n          this.responseHeaders[header] = headers[header];\n      }\n    }\n\n    if (this.forceMimeType) {\n      this.responseHeaders['Content-Type'] = this.forceMimeType;\n    }\n\n    if (this.async) {\n      this._readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);\n    } else {\n      this.readyState = FakeXMLHttpRequest.HEADERS_RECEIVED;\n    }\n  },\n\n  /*\n    Sets the FakeXMLHttpRequest object's response body and\n    if body text is XML, sets responseXML to parsed document\n    object\n  */\n  _setResponseBody: function _setResponseBody(body) {\n    verifyRequestSent(this);\n    verifyHeadersReceived(this);\n    verifyResponseBodyType(body);\n\n    var chunkSize = this.chunkSize || 10;\n    var index = 0;\n    this.responseText = \"\";\n    this.response = this.responseText;\n\n    do {\n      if (this.async) {\n        this._readyStateChange(FakeXMLHttpRequest.LOADING);\n      }\n\n      this.responseText += body.substring(index, index + chunkSize);\n      this.response = this.responseText;\n      index += chunkSize;\n    } while (index < body.length);\n\n    var type = this.getResponseHeader(\"Content-Type\");\n\n    if (this.responseText && (!type || /(text\\/xml)|(application\\/xml)|(\\+xml)/.test(type))) {\n      try {\n        this.responseXML = parseXML(this.responseText);\n      } catch (e) {\n        // Unable to parse XML - no biggie\n      }\n    }\n\n    if (this.async) {\n      this._readyStateChange(FakeXMLHttpRequest.DONE);\n    } else {\n      this.readyState = FakeXMLHttpRequest.DONE;\n    }\n  },\n\n  /*\n    Forces a response on to the FakeXMLHttpRequest object.\n\n    This is the public API for faking responses. This function\n    takes a number status, headers object, and string body:\n\n    ```\n    xhr.respond(404, {Content-Type: 'text/plain'}, \"Sorry. This object was not found.\")\n\n    ```\n  */\n  respond: function respond(status, headers, body) {\n    this._setResponseHeaders(headers || {});\n    this.status = typeof status == \"number\" ? status : 200;\n    this.statusText = httpStatusCodes[this.status];\n    this._setResponseBody(body || \"\");\n  }\n};\n\nfor (var property in FakeXMLHttpRequestProto) {\n  FakeXMLHttpRequest.prototype[property] = FakeXMLHttpRequestProto[property];\n}\n\nfunction verifyState(xhr) {\n  if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {\n    throw new Error(\"INVALID_STATE_ERR\");\n  }\n\n  if (xhr.sendFlag) {\n    throw new Error(\"INVALID_STATE_ERR\");\n  }\n}\n\n\nfunction verifyRequestSent(xhr) {\n    if (xhr.readyState == FakeXMLHttpRequest.DONE) {\n        throw new Error(\"Request done\");\n    }\n}\n\nfunction verifyHeadersReceived(xhr) {\n    if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) {\n        throw new Error(\"No headers received\");\n    }\n}\n\nfunction verifyResponseBodyType(body) {\n    if (typeof body != \"string\") {\n        var error = new Error(\"Attempted to respond to fake XMLHttpRequest with \" +\n                             body + \", which is not a string.\");\n        error.name = \"InvalidBodyException\";\n        throw error;\n    }\n}\nexport default FakeXMLHttpRequest;\n","var toString = Object.prototype.toString;\n\nfunction isFunc(obj) {\n  return toString.call(obj) === \"[object Function]\";\n}\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\nfunction icPart(str) {\n  return str.split(\"\").map(function (c) {\n    return \"(?:\" + c.toUpperCase() + \"|\" + c.toLowerCase() + \")\";\n  }).join(\"\");\n}\n\nfunction remove(arr, elem) {\n  for (var i = arr.length - 1; i >= 0; i--) {\n    if (arr[i] === elem) {\n      Array.prototype.splice.call(arr, i, 1);\n    }\n  }\n}\n\nfunction hasProp(obj, key) {\n  return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nvar instances = {};\n\nvar Inflector = function () {\n  createClass(Inflector, null, [{\n    key: \"getInstance\",\n    value: function getInstance(locale) {\n      instances[locale] = instances[locale] || new Inflector();\n      return instances[locale];\n    }\n  }]);\n\n  function Inflector() {\n    classCallCheck(this, Inflector);\n\n    this.plurals = [];\n    this.singulars = [];\n    this.uncountables = [];\n    this.humans = [];\n    this.acronyms = {};\n    this.acronymRegex = /(?=a)b/;\n  }\n\n  createClass(Inflector, [{\n    key: \"acronym\",\n    value: function acronym(word) {\n      this.acronyms[word.toLowerCase()] = word;\n\n      var values = [];\n\n      for (var key in this.acronyms) {\n        if (hasProp(this.acronyms, key)) {\n          values.push(this.acronyms[key]);\n        }\n      }\n\n      this.acronymRegex = new RegExp(values.join(\"|\"));\n    }\n  }, {\n    key: \"plural\",\n    value: function plural(rule, replacement) {\n      if (typeof rule === \"string\") {\n        remove(this.uncountables, rule);\n      }\n\n      remove(this.uncountables, replacement);\n      this.plurals.unshift([rule, replacement]);\n    }\n  }, {\n    key: \"singular\",\n    value: function singular(rule, replacement) {\n      if (typeof rule === \"string\") {\n        remove(this.uncountables, rule);\n      }\n\n      remove(this.uncountables, replacement);\n      this.singulars.unshift([rule, replacement]);\n    }\n  }, {\n    key: \"irregular\",\n    value: function irregular(singular, plural) {\n      remove(this.uncountables, singular);\n      remove(this.uncountables, plural);\n\n      var s0 = singular[0];\n      var sRest = singular.substr(1);\n\n      var p0 = plural[0];\n      var pRest = plural.substr(1);\n\n      if (s0.toUpperCase() === p0.toUpperCase()) {\n        this.plural(new RegExp(\"(\" + s0 + \")\" + sRest + \"$\", \"i\"), \"$1\" + pRest);\n        this.plural(new RegExp(\"(\" + p0 + \")\" + pRest + \"$\", \"i\"), \"$1\" + pRest);\n\n        this.singular(new RegExp(\"(\" + s0 + \")\" + sRest + \"$\", \"i\"), \"$1\" + sRest);\n        this.singular(new RegExp(\"(\" + p0 + \")\" + pRest + \"$\", \"i\"), \"$1\" + sRest);\n      } else {\n        var sRestIC = icPart(sRest);\n        var pRestIC = icPart(pRest);\n\n        this.plural(new RegExp(s0.toUpperCase() + sRestIC + \"$\"), p0.toUpperCase() + pRest);\n        this.plural(new RegExp(s0.toLowerCase() + sRestIC + \"$\"), p0.toLowerCase() + pRest);\n        this.plural(new RegExp(p0.toUpperCase() + pRestIC + \"$\"), p0.toUpperCase() + pRest);\n        this.plural(new RegExp(p0.toLowerCase() + pRestIC + \"$\"), p0.toLowerCase() + pRest);\n\n        this.singular(new RegExp(s0.toUpperCase() + sRestIC + \"$\"), s0.toUpperCase() + sRest);\n        this.singular(new RegExp(s0.toLowerCase() + sRestIC + \"$\"), s0.toLowerCase() + sRest);\n        this.singular(new RegExp(p0.toUpperCase() + pRestIC + \"$\"), s0.toUpperCase() + sRest);\n        this.singular(new RegExp(p0.toLowerCase() + pRestIC + \"$\"), s0.toLowerCase() + sRest);\n      }\n    }\n  }, {\n    key: \"uncountable\",\n    value: function uncountable() {\n      for (var _len = arguments.length, words = Array(_len), _key = 0; _key < _len; _key++) {\n        words[_key] = arguments[_key];\n      }\n\n      this.uncountables = this.uncountables.concat(words);\n    }\n  }, {\n    key: \"human\",\n    value: function human(rule, replacement) {\n      this.humans.unshift([rule, replacement]);\n    }\n  }, {\n    key: \"clear\",\n    value: function clear() {\n      var scope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"all\";\n\n      if (scope === \"all\") {\n        this.plurals = [];\n        this.singulars = [];\n        this.uncountables = [];\n        this.humans = [];\n      } else {\n        this[scope] = [];\n      }\n    }\n  }]);\n  return Inflector;\n}();\n\nfunction en(inflector) {\n  inflector.plural(/$/, \"s\");\n  inflector.plural(/s$/i, \"s\");\n  inflector.plural(/^(ax|test)is$/i, \"$1es\");\n  inflector.plural(/(octop|vir)us$/i, \"$1i\");\n  inflector.plural(/(octop|vir)i$/i, \"$1i\");\n  inflector.plural(/(alias|status)$/i, \"$1es\");\n  inflector.plural(/(bu)s$/i, \"$1ses\");\n  inflector.plural(/(buffal|tomat)o$/i, \"$1oes\");\n  inflector.plural(/([ti])um$/i, \"$1a\");\n  inflector.plural(/([ti])a$/i, \"$1a\");\n  inflector.plural(/sis$/i, \"ses\");\n  inflector.plural(/(?:([^f])fe|([lr])f)$/i, \"$1$2ves\");\n  inflector.plural(/(hive)$/i, \"$1s\");\n  inflector.plural(/([^aeiouy]|qu)y$/i, \"$1ies\");\n  inflector.plural(/(x|ch|ss|sh)$/i, \"$1es\");\n  inflector.plural(/(matr|vert|ind)(?:ix|ex)$/i, \"$1ices\");\n  inflector.plural(/^(m|l)ouse$/i, \"$1ice\");\n  inflector.plural(/^(m|l)ice$/i, \"$1ice\");\n  inflector.plural(/^(ox)$/i, \"$1en\");\n  inflector.plural(/^(oxen)$/i, \"$1\");\n  inflector.plural(/(quiz)$/i, \"$1zes\");\n\n  inflector.singular(/s$/i, \"\");\n  inflector.singular(/(ss)$/i, \"$1\");\n  inflector.singular(/(n)ews$/i, \"$1ews\");\n  inflector.singular(/([ti])a$/i, \"$1um\");\n  inflector.singular(/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i, \"$1sis\");\n  inflector.singular(/(^analy)(sis|ses)$/i, \"$1sis\");\n  inflector.singular(/([^f])ves$/i, \"$1fe\");\n  inflector.singular(/(hive)s$/i, \"$1\");\n  inflector.singular(/(tive)s$/i, \"$1\");\n  inflector.singular(/([lr])ves$/i, \"$1f\");\n  inflector.singular(/([^aeiouy]|qu)ies$/i, \"$1y\");\n  inflector.singular(/(s)eries$/i, \"$1eries\");\n  inflector.singular(/(m)ovies$/i, \"$1ovie\");\n  inflector.singular(/(x|ch|ss|sh)es$/i, \"$1\");\n  inflector.singular(/^(m|l)ice$/i, \"$1ouse\");\n  inflector.singular(/(bus)(es)?$/i, \"$1\");\n  inflector.singular(/(o)es$/i, \"$1\");\n  inflector.singular(/(shoe)s$/i, \"$1\");\n  inflector.singular(/(cris|test)(is|es)$/i, \"$1is\");\n  inflector.singular(/^(a)x[ie]s$/i, \"$1xis\");\n  inflector.singular(/(octop|vir)(us|i)$/i, \"$1us\");\n  inflector.singular(/(alias|status)(es)?$/i, \"$1\");\n  inflector.singular(/^(ox)en/i, \"$1\");\n  inflector.singular(/(vert|ind)ices$/i, \"$1ex\");\n  inflector.singular(/(matr)ices$/i, \"$1ix\");\n  inflector.singular(/(quiz)zes$/i, \"$1\");\n  inflector.singular(/(database)s$/i, \"$1\");\n\n  inflector.irregular(\"person\", \"people\");\n  inflector.irregular(\"man\", \"men\");\n  inflector.irregular(\"child\", \"children\");\n  inflector.irregular(\"sex\", \"sexes\");\n  inflector.irregular(\"move\", \"moves\");\n  inflector.irregular(\"zombie\", \"zombies\");\n\n  inflector.uncountable(\"equipment\", \"information\", \"rice\", \"money\", \"species\", \"series\", \"fish\", \"sheep\", \"jeans\", \"police\");\n}\n\nvar defaults$1 = {\n  en: en\n};\n\nfunction inflections(locale, fn) {\n  if (isFunc(locale)) {\n    fn = locale;\n    locale = null;\n  }\n\n  locale = locale || \"en\";\n\n  if (fn) {\n    fn(Inflector.getInstance(locale));\n  } else {\n    return Inflector.getInstance(locale);\n  }\n}\n\nfor (var locale in defaults$1) {\n  inflections(locale, defaults$1[locale]);\n}\n\nfunction applyInflections(word, rules) {\n  var result = \"\" + word,\n      rule,\n      regex,\n      replacement;\n\n  if (result.length === 0) {\n    return result;\n  } else {\n    var match = result.toLowerCase().match(/\\b\\w+$/);\n\n    if (match && inflections().uncountables.indexOf(match[0]) > -1) {\n      return result;\n    } else {\n      for (var i = 0, ii = rules.length; i < ii; i++) {\n        rule = rules[i];\n\n        regex = rule[0];\n        replacement = rule[1];\n\n        if (result.match(regex)) {\n          result = result.replace(regex, replacement);\n          break;\n        }\n      }\n\n      return result;\n    }\n  }\n}\n\nfunction pluralize(word) {\n  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"en\";\n\n  return applyInflections(word, inflections(locale).plurals);\n}\n\nfunction singularize(word) {\n  var locale = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : \"en\";\n\n  return applyInflections(word, inflections(locale).singulars);\n}\n\nfunction capitalize(str) {\n  var result = str === null || str === undefined ? \"\" : String(str);\n  return result.charAt(0).toUpperCase() + result.slice(1);\n}\n\nfunction camelize(term, uppercaseFirstLetter) {\n  if (uppercaseFirstLetter === null || uppercaseFirstLetter === undefined) {\n    uppercaseFirstLetter = true;\n  }\n\n  var result = \"\" + term;\n\n  if (uppercaseFirstLetter) {\n    result = result.replace(/^[a-z\\d]*/, function (a) {\n      return inflections().acronyms[a] || capitalize(a);\n    });\n  } else {\n    result = result.replace(new RegExp(\"^(?:\" + inflections().acronymRegex.source + \"(?=\\\\b|[A-Z_])|\\\\w)\"), function (a) {\n      return a.toLowerCase();\n    });\n  }\n\n  result = result.replace(/(?:_|(\\/))([a-z\\d]*)/gi, function (match, a, b, idx, string) {\n    a || (a = \"\");\n    return \"\" + a + (inflections().acronyms[b] || capitalize(b));\n  });\n\n  return result;\n}\n\nfunction underscore(camelCasedWord) {\n  var result = \"\" + camelCasedWord;\n\n  result = result.replace(new RegExp(\"(?:([A-Za-z\\\\d])|^)(\" + inflections().acronymRegex.source + \")(?=\\\\b|[^a-z])\", \"g\"), function (match, $1, $2) {\n    return \"\" + ($1 || \"\") + ($1 ? \"_\" : \"\") + $2.toLowerCase();\n  });\n\n  result = result.replace(/([A-Z\\d]+)([A-Z][a-z])/g, \"$1_$2\");\n  result = result.replace(/([a-z\\d])([A-Z])/g, \"$1_$2\");\n  result = result.replace(/-/g, \"_\");\n\n  return result.toLowerCase();\n}\n\nfunction humanize(lowerCaseAndUnderscoredWord, options) {\n  var result = \"\" + lowerCaseAndUnderscoredWord;\n  var humans = inflections().humans;\n  var human = void 0,\n      rule = void 0,\n      replacement = void 0;\n\n  options = options || {};\n\n  if (options.capitalize === null || options.capitalize === undefined) {\n    options.capitalize = true;\n  }\n\n  for (var i = 0, ii = humans.length; i < ii; i++) {\n    human = humans[i];\n    rule = human[0];\n    replacement = human[1];\n\n    if (rule.test && rule.test(result) || result.indexOf(rule) > -1) {\n      result = result.replace(rule, replacement);\n      break;\n    }\n  }\n\n  result = result.replace(/_id$/, \"\");\n  result = result.replace(/_/g, \" \");\n\n  result = result.replace(/([a-z\\d]*)/gi, function (match) {\n    return inflections().acronyms[match] || match.toLowerCase();\n  });\n\n  if (options.capitalize) {\n    result = result.replace(/^\\w/, function (match) {\n      return match.toUpperCase();\n    });\n  }\n\n  return result;\n}\n\nfunction titleize(word) {\n  return humanize(underscore(word)).replace(/(^|[\\s¿/]+)([a-z])/g, function (match, boundary, letter, idx, string) {\n    return match.replace(letter, letter.toUpperCase());\n  });\n}\n\nfunction tableize(className) {\n  return pluralize(underscore(className));\n}\n\nfunction classify(tableName) {\n  return camelize(singularize(tableName.replace(/.*\\./g, \"\")));\n}\n\nfunction dasherize(underscoredWord) {\n  return underscoredWord.replace(/_/g, \"-\");\n}\n\nfunction foreignKey(className) {\n  var separateWithUnderscore = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n  return \"\" + underscore(className) + (separateWithUnderscore ? \"_id\" : \"id\");\n}\n\nfunction ordinal(number) {\n  var absNumber = Math.abs(Number(number));\n  var mod100 = absNumber % 100;\n\n  if (mod100 === 11 || mod100 === 12 || mod100 === 13) {\n    return \"th\";\n  } else {\n    switch (absNumber % 10) {\n      case 1:\n        return \"st\";\n      case 2:\n        return \"nd\";\n      case 3:\n        return \"rd\";\n      default:\n        return \"th\";\n    }\n  }\n}\n\nfunction ordinalize(number) {\n  return \"\" + number + ordinal(number);\n}\n\n// prettier-ignore\nvar DEFAULT_APPROXIMATIONS = {\n  'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE',\n  'Ç': 'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I',\n  'Î': 'I', 'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O',\n  'Õ': 'O', 'Ö': 'O', '×': 'x', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U',\n  'Ü': 'U', 'Ý': 'Y', 'Þ': 'Th', 'ß': 'ss', 'à': 'a', 'á': 'a', 'â': 'a',\n  'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', 'è': 'e', 'é': 'e',\n  'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i', 'ð': 'd',\n  'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'ø': 'o',\n  'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y',\n  'Ā': 'A', 'ā': 'a', 'Ă': 'A', 'ă': 'a', 'Ą': 'A', 'ą': 'a', 'Ć': 'C',\n  'ć': 'c', 'Ĉ': 'C', 'ĉ': 'c', 'Ċ': 'C', 'ċ': 'c', 'Č': 'C', 'č': 'c',\n  'Ď': 'D', 'ď': 'd', 'Đ': 'D', 'đ': 'd', 'Ē': 'E', 'ē': 'e', 'Ĕ': 'E',\n  'ĕ': 'e', 'Ė': 'E', 'ė': 'e', 'Ę': 'E', 'ę': 'e', 'Ě': 'E', 'ě': 'e',\n  'Ĝ': 'G', 'ĝ': 'g', 'Ğ': 'G', 'ğ': 'g', 'Ġ': 'G', 'ġ': 'g', 'Ģ': 'G',\n  'ģ': 'g', 'Ĥ': 'H', 'ĥ': 'h', 'Ħ': 'H', 'ħ': 'h', 'Ĩ': 'I', 'ĩ': 'i',\n  'Ī': 'I', 'ī': 'i', 'Ĭ': 'I', 'ĭ': 'i', 'Į': 'I', 'į': 'i', 'İ': 'I',\n  'ı': 'i', 'Ĳ': 'IJ', 'ĳ': 'ij', 'Ĵ': 'J', 'ĵ': 'j', 'Ķ': 'K', 'ķ': 'k',\n  'ĸ': 'k', 'Ĺ': 'L', 'ĺ': 'l', 'Ļ': 'L', 'ļ': 'l', 'Ľ': 'L', 'ľ': 'l',\n  'Ŀ': 'L', 'ŀ': 'l', 'Ł': 'L', 'ł': 'l', 'Ń': 'N', 'ń': 'n', 'Ņ': 'N',\n  'ņ': 'n', 'Ň': 'N', 'ň': 'n', 'ŉ': '\\'n', 'Ŋ': 'NG', 'ŋ': 'ng',\n  'Ō': 'O', 'ō': 'o', 'Ŏ': 'O', 'ŏ': 'o', 'Ő': 'O', 'ő': 'o', 'Œ': 'OE',\n  'œ': 'oe', 'Ŕ': 'R', 'ŕ': 'r', 'Ŗ': 'R', 'ŗ': 'r', 'Ř': 'R', 'ř': 'r',\n  'Ś': 'S', 'ś': 's', 'Ŝ': 'S', 'ŝ': 's', 'Ş': 'S', 'ş': 's', 'Š': 'S',\n  'š': 's', 'Ţ': 'T', 'ţ': 't', 'Ť': 'T', 'ť': 't', 'Ŧ': 'T', 'ŧ': 't',\n  'Ũ': 'U', 'ũ': 'u', 'Ū': 'U', 'ū': 'u', 'Ŭ': 'U', 'ŭ': 'u', 'Ů': 'U',\n  'ů': 'u', 'Ű': 'U', 'ű': 'u', 'Ų': 'U', 'ų': 'u', 'Ŵ': 'W', 'ŵ': 'w',\n  'Ŷ': 'Y', 'ŷ': 'y', 'Ÿ': 'Y', 'Ź': 'Z', 'ź': 'z', 'Ż': 'Z', 'ż': 'z',\n  'Ž': 'Z', 'ž': 'z',\n  'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', 'Е': 'E', 'Ё': 'E',\n  'Ж': 'ZH', 'З': 'Z', 'И': 'I', 'Й': 'J', 'К': 'K', 'Л': 'L', 'М': 'M',\n  'Н': 'N', 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U',\n  'Ф': 'F', 'Х': 'KH', 'Ц': 'C', 'Ч': 'CH', 'Ш': 'SH', 'Щ': 'SHCH',\n  'Ъ': '', 'Ы': 'Y', 'Ь': '', 'Э': 'E', 'Ю': 'YU', 'Я': 'YA',\n  'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'e',\n  'ж': 'zh', 'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm',\n  'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u',\n  'ф': 'f', 'х': 'kh', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'shch',\n  'ъ': '', 'ы': 'y', 'ь': '', 'э': 'e', 'ю': 'yu', 'я': 'ya'\n};\n\nvar DEFAULT_REPLACEMENT_CHAR = \"?\";\n\nvar instances$1 = {};\n\nvar Transliterator = function () {\n  createClass(Transliterator, null, [{\n    key: 'getInstance',\n    value: function getInstance(locale) {\n      instances$1[locale] = instances$1[locale] || new Transliterator();\n      return instances$1[locale];\n    }\n  }]);\n\n  function Transliterator() {\n    classCallCheck(this, Transliterator);\n\n    this.approximations = {};\n\n    for (var char in DEFAULT_APPROXIMATIONS) {\n      this.approximate(char, DEFAULT_APPROXIMATIONS[char]);\n    }\n  }\n\n  createClass(Transliterator, [{\n    key: 'approximate',\n    value: function approximate(char, replacement) {\n      this.approximations[char] = replacement;\n    }\n  }, {\n    key: 'transliterate',\n    value: function transliterate(string, replacement) {\n      var _this = this;\n\n      return string.replace(/[^\\u0000-\\u007f]/g, function (c) {\n        return _this.approximations[c] || replacement || DEFAULT_REPLACEMENT_CHAR;\n      });\n    }\n  }]);\n  return Transliterator;\n}();\n\nfunction transliterations(locale, fn) {\n  if (isFunc(locale)) {\n    fn = locale;\n    locale = null;\n  }\n\n  locale = locale || \"en\";\n\n  if (fn) {\n    fn(Transliterator.getInstance(locale));\n  } else {\n    return Transliterator.getInstance(locale);\n  }\n}\n\nfunction transliterate(string) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  var locale = options.locale || \"en\";\n  var replacement = options.replacement || \"?\";\n\n  return transliterations(locale).transliterate(string, replacement);\n}\n\nfunction parameterize(string) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  if (options.separator === undefined) {\n    options.separator = \"-\";\n  }\n\n  if (options.separator === null) {\n    options.separator = \"\";\n  }\n\n  // replace accented chars with their ascii equivalents\n  var result = transliterate(string, options);\n\n  result = result.replace(/[^a-z0-9\\-_]+/ig, options.separator);\n\n  if (options.separator.length) {\n    var separatorRegex = new RegExp(options.separator);\n\n    // no more than one of the separator in a row\n    result = result.replace(new RegExp(separatorRegex.source + \"{2,}\"), options.separator);\n\n    // remove leading/trailing separator\n    result = result.replace(new RegExp(\"^\" + separatorRegex.source + \"|\" + separatorRegex.source + \"$\", \"i\"), \"\");\n  }\n\n  if (options.preserveCase) {\n    return result;\n  }\n\n  return result.toLowerCase();\n}\n\nfunction constantify(word) {\n  return underscore(word).toUpperCase().replace(/\\s+/g, \"_\");\n}\n\nexport { pluralize, singularize, camelize, underscore, humanize, titleize, tableize, classify, dasherize, foreignKey, ordinal, ordinalize, transliterate, parameterize, capitalize, inflections, transliterations, constantify };\n","// jscs:disable disallowVar, requireArrayDestructuring\nimport uniq from \"lodash/uniq\";\nimport flatten from \"lodash/flatten\";\n/**\n  @hide\n*/\nexport default function (edges) {\n  let nodes = uniq(flatten(edges));\n  let cursor = nodes.length;\n  let sorted = new Array(cursor);\n  let visited = {};\n  let i = cursor;\n\n  let visit = function (node, i, predecessors) {\n    if (predecessors.indexOf(node) >= 0) {\n      throw new Error(\n        `Cyclic dependency in properties ${JSON.stringify(predecessors)}`\n      );\n    }\n\n    if (visited[i]) {\n      return;\n    } else {\n      visited[i] = true;\n    }\n\n    let outgoing = edges.filter(function (edge) {\n      return edge && edge[0] === node;\n    });\n    i = outgoing.length;\n    if (i) {\n      let preds = predecessors.concat(node);\n      do {\n        let pair = outgoing[--i];\n        let child = pair[1];\n        if (child) {\n          visit(child, nodes.indexOf(child), preds);\n        }\n      } while (i);\n    }\n\n    sorted[--cursor] = node;\n  };\n\n  while (i--) {\n    if (!visited[i]) {\n      visit(nodes[i], i, []);\n    }\n  }\n\n  return sorted.reverse();\n}\n","import isPlainObject from \"lodash/isPlainObject\";\nimport isFunction from \"lodash/isFunction\";\nimport mapValues from \"lodash/mapValues\";\nimport referenceSort from \"./utils/reference-sort\";\n\nlet Factory = function () {\n  this.build = function (sequence) {\n    let object = {};\n    let topLevelAttrs = Object.assign({}, this.attrs);\n    delete topLevelAttrs.afterCreate;\n    Object.keys(topLevelAttrs).forEach((attr) => {\n      if (Factory.isTrait.call(this, attr)) {\n        delete topLevelAttrs[attr];\n      }\n    });\n    let keys = sortAttrs(topLevelAttrs, sequence);\n\n    keys.forEach(function (key) {\n      let buildAttrs, buildSingleValue;\n\n      buildAttrs = function (attrs) {\n        return mapValues(attrs, buildSingleValue);\n      };\n\n      buildSingleValue = (value) => {\n        if (Array.isArray(value)) {\n          return value.map(buildSingleValue);\n        } else if (isPlainObject(value)) {\n          return buildAttrs(value);\n        } else if (isFunction(value)) {\n          return value.call(topLevelAttrs, sequence);\n        } else {\n          return value;\n        }\n      };\n\n      let value = topLevelAttrs[key];\n      if (isFunction(value)) {\n        object[key] = value.call(object, sequence);\n      } else {\n        object[key] = buildSingleValue(value);\n      }\n    });\n\n    return object;\n  };\n};\n\nFactory.extend = function (attrs) {\n  // Merge the new attributes with existing ones. If conflict, new ones win.\n  let newAttrs = Object.assign({}, this.attrs, attrs);\n\n  let Subclass = function () {\n    this.attrs = newAttrs;\n    Factory.call(this);\n  };\n\n  // Copy extend\n  Subclass.extend = Factory.extend;\n  Subclass.extractAfterCreateCallbacks = Factory.extractAfterCreateCallbacks;\n  Subclass.isTrait = Factory.isTrait;\n\n  // Store a reference on the class for future subclasses\n  Subclass.attrs = newAttrs;\n\n  return Subclass;\n};\n\nFactory.extractAfterCreateCallbacks = function ({ traits } = {}) {\n  let afterCreateCallbacks = [];\n  let attrs = this.attrs || {};\n  let traitCandidates;\n\n  if (attrs.afterCreate) {\n    afterCreateCallbacks.push(attrs.afterCreate);\n  }\n\n  if (Array.isArray(traits)) {\n    traitCandidates = traits;\n  } else {\n    traitCandidates = Object.keys(attrs);\n  }\n\n  traitCandidates\n    .filter((attr) => {\n      return this.isTrait(attr) && attrs[attr].extension.afterCreate;\n    })\n    .forEach((attr) => {\n      afterCreateCallbacks.push(attrs[attr].extension.afterCreate);\n    });\n\n  return afterCreateCallbacks;\n};\n\nFactory.isTrait = function (attrName) {\n  let { attrs } = this;\n  return isPlainObject(attrs[attrName]) && attrs[attrName].__isTrait__ === true;\n};\n\nfunction sortAttrs(attrs, sequence) {\n  let Temp = function () {};\n  let obj = new Temp();\n  let refs = [];\n  let property;\n\n  Object.keys(attrs).forEach(function (key) {\n    let value;\n    Object.defineProperty(obj.constructor.prototype, key, {\n      get() {\n        refs.push([property, key]);\n        return value;\n      },\n      set(newValue) {\n        value = newValue;\n      },\n      enumerable: false,\n      configurable: true,\n    });\n  });\n\n  Object.keys(attrs).forEach(function (key) {\n    let value = attrs[key];\n    if (typeof value !== \"function\") {\n      obj[key] = value;\n    }\n  });\n\n  Object.keys(attrs).forEach(function (key) {\n    let value = attrs[key];\n    property = key;\n\n    if (typeof value === \"function\") {\n      obj[key] = value.call(obj, sequence);\n    }\n\n    refs.push([key]);\n  });\n\n  return referenceSort(refs);\n}\n\n/**\n * @hide\n */\nexport default Factory;\n","function isNumber(n) {\n  return (+n).toString() === n.toString();\n}\n\n/**\n  By default Mirage uses autoincrementing numbers starting with `1` as IDs for records. This can be customized by implementing one or more IdentityManagers for your application.\n\n  An IdentityManager is a class that's responsible for generating unique identifiers. You can define a custom identity manager for your entire application, as well as on a per-model basis.\n\n  A custom IdentityManager must implement these methods:\n\n  - `fetch`, which must return an identifier not yet used\n  - `set`, which is called with an `id` of a record being insert into Mirage's database\n  - `reset`, which should reset database to initial state\n\n  Check out the advanced guide on Mocking UUIDs to see a complete example of a custom IdentityManager.\n\n  @class IdentityManager\n  @constructor\n  @public\n*/\nclass IdentityManager {\n  constructor() {\n    this._nextId = 1;\n    this._ids = {};\n  }\n\n  /**\n    @method get\n    @hide\n    @private\n  */\n  get() {\n    return this._nextId;\n  }\n\n  /**\n    Registers `uniqueIdentifier` as used.\n\n    This method should throw is `uniqueIdentifier` has already been taken.\n\n    @method set\n    @param {String|Number} uniqueIdentifier\n    @public\n  */\n  set(uniqueIdentifier) {\n    if (this._ids[uniqueIdentifier]) {\n      throw new Error(\n        `Attempting to use the ID ${uniqueIdentifier}, but it's already been used`\n      );\n    }\n\n    if (isNumber(uniqueIdentifier) && +uniqueIdentifier >= this._nextId) {\n      this._nextId = +uniqueIdentifier + 1;\n    }\n\n    this._ids[uniqueIdentifier] = true;\n  }\n\n  /**\n    @method inc\n    @hide\n    @private\n  */\n  inc() {\n    let nextValue = this.get() + 1;\n\n    this._nextId = nextValue;\n\n    return nextValue;\n  }\n\n  /**\n    Returns the next unique identifier.\n\n    @method fetch\n    @return {String} Unique identifier\n    @public\n  */\n  fetch() {\n    let id = this.get();\n\n    this._ids[id] = true;\n\n    this.inc();\n\n    return id.toString();\n  }\n\n  /**\n    Resets the identity manager, marking all unique identifiers as available.\n\n    @method reset\n    @public\n  */\n  reset() {\n    this._nextId = 1;\n    this._ids = {};\n  }\n}\n\nexport default IdentityManager;\n","/**\n  @hide\n*/\nlet association = function (...traitsAndOverrides) {\n  let __isAssociation__ = true;\n\n  return {\n    __isAssociation__,\n    traitsAndOverrides,\n  };\n};\n\nexport default association;\n","let trait = function (extension) {\n  let __isTrait__ = true;\n  return {\n    extension,\n    __isTrait__,\n  };\n};\n\n/**\n  @hide\n*/\nexport default trait;\n","const warn = console.warn; // eslint-disable-line no-console\n\n/**\n  You can use this class when you want more control over your route handlers response.\n\n  Pass the `code`, `headers` and `data` into the constructor and return an instance from any route handler.\n\n  ```js\n  import { Response } from 'miragejs';\n\n  this.get('/users', () => {\n    return new Response(400, { some: 'header' }, { errors: [ 'name cannot be blank'] });\n  });\n  ```\n*/\nexport default class Response {\n  constructor(code, headers = {}, data) {\n    this.code = code;\n    this.headers = headers;\n\n    // Default data for \"undefined 204\" responses to empty string (no content)\n    if (code === 204) {\n      if (data !== undefined && data !== \"\") {\n        warn(\n          `Mirage: One of your route handlers is returning a custom\n          204 Response that has data, but this is a violation of the HTTP spec\n          and could lead to unexpected behavior. 204 responses should have no\n          content (an empty string) as their body.`\n        );\n      } else {\n        this.data = \"\";\n      }\n\n      // Default data for \"empty untyped\" responses to empty JSON object\n    } else if (\n      (data === undefined || data === \"\") &&\n      !Object.prototype.hasOwnProperty.call(this.headers, \"Content-Type\")\n    ) {\n      this.data = {};\n    } else {\n      this.data = data;\n    }\n\n    // Default \"untyped\" responses to application/json\n    if (\n      code !== 204 &&\n      !Object.prototype.hasOwnProperty.call(this.headers, \"Content-Type\")\n    ) {\n      this.headers[\"Content-Type\"] = \"application/json\";\n    }\n  }\n\n  toRackResponse() {\n    return [this.code, this.headers, this.data];\n  }\n}\n","import {\n  underscore as _underscore,\n  capitalize as _capitalize,\n  camelize as _camelize,\n  dasherize as _dasherize,\n} from \"inflected\";\nimport lowerFirst from \"lodash/lowerFirst\";\n\nconst camelizeCache = {};\nconst dasherizeCache = {};\nconst underscoreCache = {};\nconst capitalizeCache = {};\n\n/**\n * @param {String} word\n * @hide\n */\nexport function camelize(word) {\n  if (typeof camelizeCache[word] !== \"string\") {\n    let camelizedWord = _camelize(underscore(word), false);\n\n    /*\n     The `ember-inflector` package's version of camelize lower-cases the first\n     word after a slash, e.g.\n\n         camelize('my-things/nice-watch'); // 'myThings/niceWatch'\n\n     The `inflected` package doesn't, so we make that change here to not break\n     existing functionality. (This affects the name of the schema collections.)\n    */\n    const camelized = camelizedWord.split(\"/\").map(lowerFirst).join(\"/\");\n\n    camelizeCache[word] = camelized;\n  }\n\n  return camelizeCache[word];\n}\n\n/**\n * @param {String} word\n * @hide\n */\nexport function dasherize(word) {\n  if (typeof dasherizeCache[word] !== \"string\") {\n    const dasherized = _dasherize(underscore(word));\n\n    dasherizeCache[word] = dasherized;\n  }\n\n  return dasherizeCache[word];\n}\n\nexport function underscore(word) {\n  if (typeof underscoreCache[word] !== \"string\") {\n    const underscored = _underscore(word);\n\n    underscoreCache[word] = underscored;\n  }\n\n  return underscoreCache[word];\n}\n\nexport function capitalize(word) {\n  if (typeof capitalizeCache[word] !== \"string\") {\n    const capitalized = _capitalize(word);\n\n    capitalizeCache[word] = capitalized;\n  }\n\n  return capitalizeCache[word];\n}\n","import isPlainObject from \"lodash/isPlainObject\";\n\n/**\n  @hide\n*/\nexport default function (object) {\n  return isPlainObject(object) && object.__isAssociation__ === true;\n}\n","/* eslint no-console: 0 */\nlet errorProps = [\n  \"description\",\n  \"fileName\",\n  \"lineNumber\",\n  \"message\",\n  \"name\",\n  \"number\",\n  \"stack\",\n];\n/**\n  @hide\n*/\nexport default function assert(bool, text) {\n  if (typeof bool === \"string\" && !text) {\n    // console.error(`Mirage: ${bool}`);\n    throw new MirageError(bool);\n  }\n\n  if (!bool) {\n    // console.error(`Mirage: ${text}`);\n    throw new MirageError(text.replace(/^ +/gm, \"\") || \"Assertion failed\");\n  }\n}\n\n/**\n  @public\n  @hide\n  Copied from ember-metal/error\n*/\nexport function MirageError(message, stack) {\n  let tmp = Error(message);\n\n  if (stack) {\n    tmp.stack = stack;\n  }\n\n  for (let idx = 0; idx < errorProps.length; idx++) {\n    let prop = errorProps[idx];\n\n    if ([\"description\", \"message\", \"stack\"].indexOf(prop) > -1) {\n      this[prop] = `Mirage: ${tmp[prop]}`;\n    } else {\n      this[prop] = tmp[prop];\n    }\n  }\n}\n\nMirageError.prototype = Object.create(Error.prototype);\n","import { dasherize } from \"../../utils/inflector\";\n\n/**\n  Associations represent relationships between your Models.\n\n  The `hasMany` and `belongsTo` helpers are how you actually define relationships:\n  \n  ```js\n  import { createServer, Model, hasMany, belongsTo }\n\n  createServer({\n    models: {\n      user: Model.extend({\n        comments: hasMany()\n      }),\n      comments: Model.extend({\n        user: belongsTo()\n      })\n    }\n  })\n  ```\n\n  View [the Relationships](https://miragejs.com/docs/main-concepts/relationships/) guide to learn more about setting up relationships.\n\n  Each usage of the helper registers an Association (either a `HasMany` association or `BelongsTo` association) with your server's `Schema`. You can access these associations using either the `schema.associationsFor()` method, or the `associations` property on individual model instances.\n\n  You can then introspect the associations to do things like dynamically build up your JSON response in your serializers.\n\n  @class Association\n  @constructor\n  @public\n*/\nexport default class Association {\n  constructor(modelName, opts) {\n    /**\n      The modelName of the associated model.\n\n      For example, given this configuration\n      \n      ```js\n      createServer({\n        models: {\n          user: Model,\n          comment: Model.extend({\n            user: belongsTo()\n          })\n        }\n      })\n      ```\n\n      the association's `modelName` would be `user`.\n\n      Note that an association's `modelName` and the `name` can be different. This is because Mirage supports multiple relationships of the same type:\n\n      ```js\n      createServer({\n        models: {\n          user: Model,\n          comment: Model.extend({\n            author: belongsTo('user'),\n            reviewer: belongsTo('user')\n          })\n        }\n      })\n      ```\n\n      For both these relationships, the `modelName` is `user`, but the first association has a `name` of `author` while the second has a `name` of `reviewer`.\n\n      @property\n      @type {String}\n      @public\n    */\n    this.modelName = undefined; // hack to add ESDOC info. Any better way?\n\n    if (typeof modelName === \"object\") {\n      // Received opts only\n      this.modelName = undefined;\n      this.opts = modelName;\n    } else {\n      // The modelName of the association. (Might not be passed in - set later\n      // by schema).\n      this.modelName = modelName ? dasherize(modelName) : \"\";\n      this.opts = opts || {};\n    }\n\n    /**\n      The name of the association, which comes from the property name that was used to define it.\n\n      For example, given this server definition\n      \n      ```js\n      createServer({\n        models: {\n          user: Model,\n          comment: Model.extend({\n            author: belongsTo('user')\n          })\n        }\n      })\n      ```\n\n      the association's `name` would be `author`.\n      \n      The name is used by Mirage to define foreign keys on the model (`comment.authorId` in this case), among other things.\n\n      @property\n      @type {String}\n      @public\n    */\n    this.name = \"\";\n\n    // The modelName that owns this association\n    this.ownerModelName = \"\";\n  }\n\n  /**\n     A setter for schema, since we don't have a reference at constuction time.\n\n     @method setSchema\n     @public\n     @hide\n  */\n  setSchema(schema) {\n    this.schema = schema;\n  }\n\n  /**\n     Returns a Boolean that's true if the association is self-referential, i.e. if a model has an association with itself.\n\n     For example, given\n\n     ```js\n     createServer({\n       models: {\n         user: Model.extend({\n           friends: hasMany('user')\n         })\n       }\n     })\n     ```\n\n     then\n\n     ```js\n     server.schema.associationsFor('user').friends.isReflexive // true\n     ```\n\n     @method isReflexive\n     @return {Boolean}\n     @public\n  */\n  isReflexive() {\n    let isExplicitReflexive = !!(\n      this.modelName === this.ownerModelName && this.opts.inverse\n    );\n    let isImplicitReflexive = !!(\n      this.opts.inverse === undefined && this.ownerModelName === this.modelName\n    );\n\n    return isExplicitReflexive || isImplicitReflexive;\n  }\n\n  /**\n     Returns a Boolean that's true if the association is polymorphic:\n\n     For example, given\n\n     ```js\n     createServer({\n       models: {\n         comment: Model.extend({\n           commentable: belongsTo({ polymorphic: true })\n         })\n       }\n     })\n     ```\n\n     then\n\n     ```js\n     server.schema.associationsFor('comment').commentable.isPolymorphic // true\n     ```\n\n     Check out [the guides on polymorphic associations](https://miragejs.com/docs/main-concepts/relationships/#polymorphic) to learn more.\n\n     @accessor isPolymorphic\n     @type {Boolean}\n     @public\n  */\n  get isPolymorphic() {\n    return this.opts.polymorphic;\n  }\n\n  /**\n    Returns either the string `\"hasMany\"` or `\"belongsTo\"`, based on the association type.\n  \n    @accessor\n    @type {String}\n    @public\n   */\n  get type() {\n    throw new Error(\n      \"Subclasses of Association must implement a getter for type\"\n    );\n  }\n\n  /**\n    Returns the name used for the association's foreign key.\n\n    ```js\n    let server = createServer({\n      models: {\n        user: Model,\n        post: Model.extend({\n          fineAuthor: belongsTo(\"user\"),\n          comments: hasMany()\n        }),\n        comment: Model\n      }\n    });\n\n    let associations = server.associationsFor('post')\n\n    associations.fineAuthor.foreignKey // fineAuthorId\n    associations.comments.foreignKey // commentIds\n    ```\n  \n    @accessor\n    @type {String}\n    @public\n   */\n  get foreignKey() {\n    return this.getForeignKey();\n  }\n\n  /**\n    @hide\n  */\n  get identifier() {\n    throw new Error(\n      \"Subclasses of Association must implement a getter for identifier\"\n    );\n  }\n}\n","import Association from \"./association\";\nimport { capitalize, camelize } from \"../../utils/inflector\";\nimport assert from \"../../assert\";\n\nconst identifierCache = {};\n\n/**\n * The belongsTo association adds a fk to the owner of the association\n *\n * @class BelongsTo\n * @extends Association\n * @constructor\n * @public\n * @hide\n */\nexport default class BelongsTo extends Association {\n  get identifier() {\n    if (typeof identifierCache[this.name] !== \"string\") {\n      const identifier = `${camelize(this.name)}Id`;\n\n      identifierCache[this.name] = identifier;\n    }\n\n    return identifierCache[this.name];\n  }\n\n  get type() {\n    return \"belongsTo\";\n  }\n\n  /**\n   * @method getForeignKeyArray\n   * @return {Array} Array of camelized name of the model owning the association\n   * and foreign key for the association\n   * @public\n   */\n  getForeignKeyArray() {\n    return [camelize(this.ownerModelName), this.getForeignKey()];\n  }\n\n  /**\n   * @method getForeignKey\n   * @return {String} Foreign key for the association\n   * @public\n   */\n  getForeignKey() {\n    // we reuse identifierCache because it's the same logic as get identifier\n    if (typeof identifierCache[this.name] !== \"string\") {\n      const foreignKey = `${camelize(this.name)}Id`;\n\n      identifierCache[this.name] = foreignKey;\n    }\n\n    return identifierCache[this.name];\n  }\n\n  /**\n   * Registers belongs-to association defined by given key on given model,\n   * defines getters / setters for associated parent and associated parent's id,\n   * adds methods for creating unsaved parent record and creating a saved one\n   *\n   * @method addMethodsToModelClass\n   * @param {Function} ModelClass\n   * @param {String} key the named key for the association\n   * @public\n   */\n  addMethodsToModelClass(ModelClass, key) {\n    let modelPrototype = ModelClass.prototype;\n    let association = this;\n    let foreignKey = this.getForeignKey();\n    let associationHash = { [key]: this };\n\n    modelPrototype.belongsToAssociations = Object.assign(\n      modelPrototype.belongsToAssociations,\n      associationHash\n    );\n\n    // update belongsToAssociationFks\n    Object.keys(modelPrototype.belongsToAssociations).forEach((key) => {\n      const value = modelPrototype.belongsToAssociations[key];\n      modelPrototype.belongsToAssociationFks[value.getForeignKey()] = value;\n    });\n\n    // Add to target's dependent associations array\n    this.schema.addDependentAssociation(this, this.modelName);\n\n    // TODO: look how this is used. Are these necessary, seems like they could be gotten from the above?\n    // Or we could use a single data structure to store this information?\n    modelPrototype.associationKeys.add(key);\n    modelPrototype.associationIdKeys.add(foreignKey);\n\n    Object.defineProperty(modelPrototype, foreignKey, {\n      /*\n        object.parentId\n          - returns the associated parent's id\n      */\n      get() {\n        this._tempAssociations = this._tempAssociations || {};\n        let tempParent = this._tempAssociations[key];\n        let id;\n\n        if (tempParent === null) {\n          id = null;\n        } else {\n          if (association.isPolymorphic) {\n            if (tempParent) {\n              id = { id: tempParent.id, type: tempParent.modelName };\n            } else {\n              id = this.attrs[foreignKey];\n            }\n          } else {\n            if (tempParent) {\n              id = tempParent.id;\n            } else {\n              id = this.attrs[foreignKey];\n            }\n          }\n        }\n\n        return id;\n      },\n\n      /*\n        object.parentId = (parentId)\n          - sets the associated parent via id\n      */\n      set(id) {\n        let tempParent;\n\n        if (id === null) {\n          tempParent = null;\n        } else if (id !== undefined) {\n          if (association.isPolymorphic) {\n            assert(\n              typeof id === \"object\",\n              `You're setting an ID on the polymorphic association '${association.name}' but you didn't pass in an object. Polymorphic IDs need to be in the form { type, id }.`\n            );\n            tempParent = association.schema[\n              association.schema.toCollectionName(id.type)\n            ].find(id.id);\n          } else {\n            tempParent =\n              association.schema[\n                association.schema.toCollectionName(association.modelName)\n              ].find(id);\n            assert(\n              tempParent,\n              `Couldn't find ${association.modelName} with id = ${id}`\n            );\n          }\n        }\n\n        this[key] = tempParent;\n      },\n    });\n\n    Object.defineProperty(modelPrototype, key, {\n      /*\n        object.parent\n          - returns the associated parent\n      */\n      get() {\n        this._tempAssociations = this._tempAssociations || {};\n\n        let tempParent = this._tempAssociations[key];\n        let foreignKeyId = this[foreignKey];\n        let model = null;\n\n        if (tempParent) {\n          model = tempParent;\n        } else if (foreignKeyId !== null) {\n          if (association.isPolymorphic) {\n            model = association.schema[\n              association.schema.toCollectionName(foreignKeyId.type)\n            ].find(foreignKeyId.id);\n          } else {\n            model =\n              association.schema[\n                association.schema.toCollectionName(association.modelName)\n              ].find(foreignKeyId);\n          }\n        }\n\n        return model;\n      },\n\n      /*\n        object.parent = (parentModel)\n          - sets the associated parent via model\n\n        I want to jot some notes about hasInverseFor. There used to be an\n        association.inverse() check, but adding polymorphic associations\n        complicated this. `comment.commentable`, you can't easily check for an\n        inverse since `comments: hasMany()` could be on any model.\n\n        Instead of making it very complex and looking for an inverse on the\n        association in isoaltion, it was much simpler to ask the model being\n        passed in if it had an inverse for the setting model and with its\n        association.\n      */\n      set(model) {\n        this._tempAssociations = this._tempAssociations || {};\n        this._tempAssociations[key] = model;\n\n        if (model && model.hasInverseFor(association)) {\n          let inverse = model.inverseFor(association);\n\n          model.associate(this, inverse);\n        }\n      },\n    });\n\n    /*\n      object.newParent\n        - creates a new unsaved associated parent\n\n      TODO: document polymorphic\n    */\n    modelPrototype[`new${capitalize(key)}`] = function (...args) {\n      let modelName, attrs;\n\n      if (association.isPolymorphic) {\n        modelName = args[0];\n        attrs = args[1];\n      } else {\n        modelName = association.modelName;\n        attrs = args[0];\n      }\n\n      let parent =\n        association.schema[association.schema.toCollectionName(modelName)].new(\n          attrs\n        );\n\n      this[key] = parent;\n\n      return parent;\n    };\n\n    /*\n      object.createParent\n        - creates a new saved associated parent, and immediately persists both models\n\n      TODO: document polymorphic\n    */\n    modelPrototype[`create${capitalize(key)}`] = function (...args) {\n      let modelName, attrs;\n      if (association.isPolymorphic) {\n        modelName = args[0];\n        attrs = args[1];\n      } else {\n        modelName = association.modelName;\n        attrs = args[0];\n      }\n\n      let parent =\n        association.schema[\n          association.schema.toCollectionName(modelName)\n        ].create(attrs);\n\n      this[key] = parent;\n      this.save();\n\n      return parent.reload();\n    };\n  }\n\n  /**\n   *\n   *\n   * @public\n   */\n  disassociateAllDependentsFromTarget(model) {\n    let owner = this.ownerModelName;\n    let fk;\n\n    if (this.isPolymorphic) {\n      fk = { type: model.modelName, id: model.id };\n    } else {\n      fk = model.id;\n    }\n\n    let dependents = this.schema[this.schema.toCollectionName(owner)].where(\n      (potentialOwner) => {\n        let id = potentialOwner[this.getForeignKey()];\n\n        if (!id) {\n          return false;\n        }\n\n        if (typeof id === \"object\") {\n          return id.type === fk.type && id.id === fk.id;\n        } else {\n          return id === fk;\n        }\n      }\n    );\n\n    dependents.models.forEach((dependent) => {\n      dependent.disassociate(model, this);\n      dependent.save();\n    });\n  }\n}\n","import isEqual from \"lodash/isEqual\";\nimport map from \"lodash/map\";\n\nfunction duplicate(data) {\n  if (Array.isArray(data)) {\n    return data.map(duplicate);\n  } else {\n    return Object.assign({}, data);\n  }\n}\n\n/**\n  Mirage's `Db` has many `DbCollections`, which are equivalent to tables from traditional databases. They store specific types of data, for example `users` and `posts`.\n\n  `DbCollections` have names, like `users`, which you use to access the collection from the `Db` object.\n\n  Suppose you had a `user` model defined, and the following data had been inserted into your database (either through factories or fixtures):\n\n  ```js\n  export default [\n    { id: 1, name: 'Zelda' },\n    { id: 2, name: 'Link' }\n  ];\n  ```\n\n  Then `db.contacts` would return this array.\n\n  @class DbCollection\n  @constructor\n  @public\n */\nclass DbCollection {\n  constructor(name, initialData, IdentityManager) {\n    this.name = name;\n    this._records = [];\n    this.identityManager = new IdentityManager();\n\n    if (initialData) {\n      this.insert(initialData);\n    }\n  }\n\n  /**\n   * Returns a copy of the data, to prevent inadvertent data manipulation.\n   * @method all\n   * @public\n   * @hide\n   */\n  all() {\n    return duplicate(this._records);\n  }\n\n  /**\n    Inserts `data` into the collection. `data` can be a single object\n    or an array of objects. Returns the inserted record.\n\n    ```js\n    // Insert a single record\n    let link = db.users.insert({ name: 'Link', age: 173 });\n\n    link;  // { id: 1, name: 'Link', age: 173 }\n\n    // Insert an array\n    let users = db.users.insert([\n      { name: 'Zelda', age: 142 },\n      { name: 'Epona', age: 58 },\n    ]);\n\n    users;  // [ { id: 2, name: 'Zelda', age: 142 }, { id: 3, name: 'Epona', age: 58 } ]\n    ```\n\n    @method insert\n    @param data\n    @public\n   */\n  insert(data) {\n    if (!Array.isArray(data)) {\n      return this._insertRecord(data);\n    } else {\n      return map(data, (attrs) => this._insertRecord(attrs));\n    }\n  }\n\n  /**\n    Returns a single record from the `collection` if `ids` is a single\n    id, or an array of records if `ids` is an array of ids. Note\n    each id can be an int or a string, but integer ids as strings\n    (e.g. the string “1”) will be treated as integers.\n\n    ```js\n    // Given users = [{id: 1, name: 'Link'}, {id: 2, name: 'Zelda'}]\n\n    db.users.find(1);      // {id: 1, name: 'Link'}\n    db.users.find([1, 2]); // [{id: 1, name: 'Link'}, {id: 2, name: 'Zelda'}]\n    ```\n\n    @method find\n    @param ids\n    @public\n   */\n  find(ids) {\n    if (Array.isArray(ids)) {\n      let records = this._findRecords(ids).filter(Boolean).map(duplicate); // Return a copy\n\n      return records;\n    } else {\n      let record = this._findRecord(ids);\n      if (!record) {\n        return null;\n      }\n\n      // Return a copy\n      return duplicate(record);\n    }\n  }\n\n  /**\n    Returns the first model from `collection` that matches the\n    key-value pairs in the `query` object. Note that a string\n    comparison is used. `query` is a POJO.\n\n    ```js\n    // Given users = [ { id: 1, name: 'Link' }, { id: 2, name: 'Zelda' } ]\n    db.users.findBy({ name: 'Link' }); // { id: 1, name: 'Link' }\n    ```\n\n    @method find\n    @param query\n    @public\n   */\n  findBy(query) {\n    let record = this._findRecordBy(query);\n    if (!record) {\n      return null;\n    }\n\n    // Return a copy\n    return duplicate(record);\n  }\n\n  /**\n    Returns an array of models from `collection` that match the\n    key-value pairs in the `query` object. Note that a string\n    comparison is used. `query` is a POJO.\n\n    ```js\n    // Given users = [ { id: 1, name: 'Link' }, { id: 2, name: 'Zelda' } ]\n\n    db.users.where({ name: 'Zelda' }); // [ { id: 2, name: 'Zelda' } ]\n    ```\n\n    @method where\n    @param query\n    @public\n   */\n  where(query) {\n    return this._findRecordsWhere(query).map(duplicate);\n  }\n\n  /**\n    Finds the first record matching the provided _query_ in\n    `collection`, or creates a new record using a merge of the\n    `query` and optional `attributesForCreate`.\n\n    Often times you may have a pattern like the following in your API stub:\n\n    ```js\n    // Given users = [\n    //   { id: 1, name: 'Link' },\n    //   { id: 2, name: 'Zelda' }\n    // ]\n\n    // Create Link if he doesn't yet exist\n    let records = db.users.where({ name: 'Link' });\n    let record;\n\n    if (records.length > 0) {\n      record = records[0];\n    } else {\n      record = db.users.insert({ name: 'Link' });\n    }\n    ```\n\n    You can now replace this with the following:\n\n    ```js\n    let record = db.users.firstOrCreate({ name: 'Link' });\n    ```\n\n    An extended example using *attributesForCreate*:\n\n    ```js\n    let record = db.users.firstOrCreate({ name: 'Link' }, { evil: false });\n    ```\n\n    @method firstOrCreate\n    @param query\n    @param attributesForCreate\n    @public\n   */\n  firstOrCreate(query, attributesForCreate = {}) {\n    let queryResult = this.where(query);\n    let [record] = queryResult;\n\n    if (record) {\n      return record;\n    } else {\n      let mergedAttributes = Object.assign(attributesForCreate, query);\n      let createdRecord = this.insert(mergedAttributes);\n\n      return createdRecord;\n    }\n  }\n\n  /**\n    Updates one or more records in the collection.\n\n    If *attrs* is the only arg present, updates all records in the collection according to the key-value pairs in *attrs*.\n\n    If *target* is present, restricts updates to those that match *target*. If *target* is a number or string, finds a single record whose id is *target* to update. If *target* is a POJO, queries *collection* for records that match the key-value pairs in *target*, and updates their *attrs*.\n\n    Returns the updated record or records.\n\n    ```js\n    // Given users = [\n    //   {id: 1, name: 'Link'},\n    //   {id: 2, name: 'Zelda'}\n    // ]\n\n    db.users.update({name: 'Ganon'}); // db.users = [{id: 1, name: 'Ganon'}, {id: 2, name: 'Ganon'}]\n    db.users.update(1, {name: 'Young Link'}); // db.users = [{id: 1, name: 'Young Link'}, {id: 2, name: 'Zelda'}]\n    db.users.update({name: 'Link'}, {name: 'Epona'}); // db.users = [{id: 1, name: 'Epona'}, {id: 2, name: 'Zelda'}]\n    ```\n\n    @method update\n    @param target\n    @param attrs\n    @public\n   */\n  update(target, attrs) {\n    let records;\n\n    if (typeof attrs === \"undefined\") {\n      attrs = target;\n      let changedRecords = [];\n\n      this._records.forEach((record) => {\n        let oldRecord = Object.assign({}, record);\n\n        this._updateRecord(record, attrs);\n\n        if (!isEqual(oldRecord, record)) {\n          changedRecords.push(record);\n        }\n      });\n\n      return changedRecords;\n    } else if (typeof target === \"number\" || typeof target === \"string\") {\n      let id = target;\n      let record = this._findRecord(id);\n\n      this._updateRecord(record, attrs);\n\n      return record;\n    } else if (Array.isArray(target)) {\n      let ids = target;\n      records = this._findRecords(ids);\n\n      records.forEach((record) => {\n        this._updateRecord(record, attrs);\n      });\n\n      return records;\n    } else if (typeof target === \"object\") {\n      let query = target;\n      records = this._findRecordsWhere(query);\n\n      records.forEach((record) => {\n        this._updateRecord(record, attrs);\n      });\n\n      return records;\n    }\n  }\n\n  /**\n    Removes one or more records in *collection*.\n\n    If *target* is undefined, removes all records. If *target* is a number or string, removes a single record using *target* as id. If *target* is a POJO, queries *collection* for records that match the key-value pairs in *target*, and removes them from the collection.\n\n    ```js\n    // Given users = [\n    //   {id: 1, name: 'Link'},\n    //   {id: 2, name: 'Zelda'}\n    // ]\n\n    db.users.remove(); // db.users = []\n    db.users.remove(1); // db.users = [{id: 2, name: 'Zelda'}]\n    db.users.remove({name: 'Zelda'}); // db.users = [{id: 1, name: 'Link'}]\n    ```\n\n    @method remove\n    @param target\n    @public\n   */\n  remove(target) {\n    let records;\n\n    if (typeof target === \"undefined\") {\n      this._records = [];\n      this.identityManager.reset();\n    } else if (typeof target === \"number\" || typeof target === \"string\") {\n      let record = this._findRecord(target);\n      let index = this._records.indexOf(record);\n      this._records.splice(index, 1);\n    } else if (Array.isArray(target)) {\n      records = this._findRecords(target);\n      records.forEach((record) => {\n        let index = this._records.indexOf(record);\n        this._records.splice(index, 1);\n      });\n    } else if (typeof target === \"object\") {\n      records = this._findRecordsWhere(target);\n      records.forEach((record) => {\n        let index = this._records.indexOf(record);\n        this._records.splice(index, 1);\n      });\n    }\n  }\n\n  /*\n    Private methods.\n\n    These return the actual db objects, whereas the public\n    API query methods return copies.\n  */\n\n  /**\n    @method _findRecord\n    @param id\n    @private\n    @hide\n   */\n  _findRecord(id) {\n    id = id.toString();\n\n    return this._records.find((obj) => obj.id === id);\n  }\n\n  /**\n    @method _findRecordBy\n    @param query\n    @private\n    @hide\n   */\n  _findRecordBy(query) {\n    return this._findRecordsWhere(query)[0];\n  }\n\n  /**\n    @method _findRecords\n    @param ids\n    @private\n    @hide\n   */\n  _findRecords(ids) {\n    return ids.map(this._findRecord, this);\n  }\n\n  /**\n    @method _findRecordsWhere\n    @param query\n    @private\n    @hide\n   */\n  _findRecordsWhere(query) {\n    let records = this._records;\n\n    function defaultQueryFunction(record) {\n      let keys = Object.keys(query);\n\n      return keys.every(function (key) {\n        return String(record[key]) === String(query[key]);\n      });\n    }\n\n    let queryFunction =\n      typeof query === \"object\" ? defaultQueryFunction : query;\n\n    return records.filter(queryFunction);\n  }\n\n  /**\n    @method _insertRecord\n    @param data\n    @private\n    @hide\n   */\n  _insertRecord(data) {\n    let attrs = duplicate(data);\n\n    if (attrs && (attrs.id === undefined || attrs.id === null)) {\n      attrs.id = this.identityManager.fetch(attrs);\n    } else {\n      attrs.id = attrs.id.toString();\n\n      this.identityManager.set(attrs.id);\n    }\n\n    this._records.push(attrs);\n\n    return duplicate(attrs);\n  }\n\n  /**\n    @method _updateRecord\n    @param record\n    @param attrs\n    @private\n    @hide\n   */\n  _updateRecord(record, attrs) {\n    let targetId =\n      attrs && Object.prototype.hasOwnProperty.call(attrs, \"id\")\n        ? attrs.id.toString()\n        : null;\n    let currentId = record.id;\n\n    if (targetId && currentId !== targetId) {\n      throw new Error(\"Updating the ID of a record is not permitted\");\n    }\n\n    for (let attr in attrs) {\n      if (attr === \"id\") {\n        continue;\n      }\n\n      record[attr] = attrs[attr];\n    }\n  }\n}\n\nexport default DbCollection;\n","import DbCollection from \"./db-collection\";\nimport IdentityManager from \"./identity-manager\";\nimport cloneDeep from \"lodash/cloneDeep\";\n\n/**\n  Your Mirage server has a database which you can interact with in your route handlers. You’ll typically use models to interact with your database data, but you can always reach into the db directly in the event you want more control.\n\n  Access the db from your route handlers via `schema.db`.\n\n  You can access individual DbCollections by using `schema.db.name`:\n\n  ```js\n  schema.db.users  // would return, e.g., [ { id: 1, name: 'Yehuda' }, { id: 2, name: 'Tom '} ]\n  ```\n\n  @class Db\n  @constructor\n  @public\n */\nclass Db {\n  constructor(initialData, identityManagers) {\n    this._collections = [];\n\n    this.registerIdentityManagers(identityManagers);\n\n    if (initialData) {\n      this.loadData(initialData);\n    }\n  }\n\n  /**\n    Loads an object of data into Mirage's database.\n\n    The keys of the object correspond to the DbCollections, and the values are arrays of records.\n\n    ```js\n    server.db.loadData({\n      users: [\n        { name: 'Yehuda' },\n        { name: 'Tom' }\n      ]\n    });\n    ```\n\n    As with `db.collection.insert`, IDs will automatically be created for records that don't have them.\n\n    @method loadData\n    @param {Object} data - Data to load\n    @public\n   */\n  loadData(data) {\n    for (let key in data) {\n      this.createCollection(key, cloneDeep(data[key]));\n    }\n  }\n\n  /**\n   Logs out the contents of the Db.\n\n   ```js\n   server.db.dump() // { users: [ name: 'Yehuda', ...\n   ```\n\n   @method dump\n   @public\n   */\n  dump() {\n    return this._collections.reduce((data, collection) => {\n      data[collection.name] = collection.all();\n\n      return data;\n    }, {});\n  }\n\n  /**\n    Add an empty collection named _name_ to your database. Typically you won’t need to do this yourself, since collections are automatically created for any models you have defined.\n\n    @method createCollection\n    @param name\n    @param initialData (optional)\n    @public\n   */\n  createCollection(name, initialData) {\n    if (!this[name]) {\n      let IdentityManager = this.identityManagerFor(name);\n      let newCollection = new DbCollection(name, initialData, IdentityManager);\n\n      // Public API has a convenient array interface. It comes at the cost of\n      // returning a copy of all records to avoid accidental mutations.\n      Object.defineProperty(this, name, {\n        get() {\n          let recordsCopy = newCollection.all();\n\n          [\n            \"insert\",\n            \"find\",\n            \"findBy\",\n            \"where\",\n            \"update\",\n            \"remove\",\n            \"firstOrCreate\",\n          ].forEach(function (method) {\n            recordsCopy[method] = function () {\n              return newCollection[method](...arguments);\n            };\n          });\n\n          return recordsCopy;\n        },\n      });\n\n      // Private API does not have the array interface. This means internally, only\n      // db-collection methods can be used. This is so records aren't copied redundantly\n      // internally, which leads to accidental O(n^2) operations (e.g., createList).\n      Object.defineProperty(this, `_${name}`, {\n        get() {\n          let recordsCopy = [];\n\n          [\n            \"insert\",\n            \"find\",\n            \"findBy\",\n            \"where\",\n            \"update\",\n            \"remove\",\n            \"firstOrCreate\",\n          ].forEach(function (method) {\n            recordsCopy[method] = function () {\n              return newCollection[method](...arguments);\n            };\n          });\n\n          return recordsCopy;\n        },\n      });\n\n      this._collections.push(newCollection);\n    } else if (initialData) {\n      this[name].insert(initialData);\n    }\n\n    return this;\n  }\n\n  /**\n    @method createCollections\n    @param ...collections\n    @public\n    @hide\n   */\n  createCollections(...collections) {\n    collections.forEach((c) => this.createCollection(c));\n  }\n\n  /**\n    Removes all data from Mirage's database.\n\n    @method emptyData\n    @public\n   */\n  emptyData() {\n    this._collections.forEach((c) => c.remove());\n  }\n\n  /**\n    @method identityManagerFor\n    @param name\n    @public\n    @hide\n   */\n  identityManagerFor(name) {\n    return (\n      this._identityManagers[this._container.inflector.singularize(name)] ||\n      this._identityManagers.application ||\n      IdentityManager\n    );\n  }\n\n  /**\n    @method registerIdentityManagers\n    @public\n    @hide\n   */\n  registerIdentityManagers(identityManagers) {\n    this._identityManagers = identityManagers || {};\n  }\n}\n\nexport default Db;\n","import assert from \"../assert\";\nimport invokeMap from \"lodash/invokeMap\";\n\n/**\n  Collections represent arrays of models. They are returned by a hasMany association, or by one of the ModelClass query methods:\n\n  ```js\n  let posts = user.blogPosts;\n  let posts = schema.blogPosts.all();\n  let posts = schema.blogPosts.find([1, 2, 4]);\n  let posts = schema.blogPosts.where({ published: true });\n  ```\n\n  Note that there is also a `PolymorphicCollection` class that is identical to `Collection`, except it can contain a heterogeneous array of models. Thus, it has no `modelName` property. This lets serializers and other parts of the system interact with it differently.\n\n  @class Collection\n  @constructor\n  @public\n*/\nexport default class Collection {\n  constructor(modelName, models = []) {\n    assert(\n      modelName && typeof modelName === \"string\",\n      \"You must pass a `modelName` into a Collection\"\n    );\n\n    /**\n      The dasherized model name this Collection represents.\n\n      ```js\n      let posts = user.blogPosts;\n\n      posts.modelName; // \"blog-post\"\n      ```\n\n      The model name is separate from the actual models, since Collections can be empty.\n\n      @property modelName\n      @type {String}\n      @public\n    */\n    this.modelName = modelName;\n\n    /**\n      The underlying plain JavaScript array of Models in this Collection.\n\n      ```js\n      posts.models // [ post:1, post:2, ... ]\n      ```\n\n      While Collections have many array-ish methods like `filter` and `sort`, it\n      can be useful to work with the plain array if you want to work with methods\n      like `map`, or use the `[]` accessor.\n\n      For example, in testing you might want to assert against a model from the\n      collection:\n\n      ```js\n      let newPost = user.posts.models[0].title;\n\n      assert.equal(newPost, \"My first post\");\n      ```\n\n      @property models\n      @type {Array}\n      @public\n    */\n    this.models = models;\n  }\n\n  /**\n    The number of models in the collection.\n\n    ```js\n    user.posts.length; // 2\n    ```\n\n    @property length\n    @type {Integer}\n    @public\n  */\n  get length() {\n    return this.models.length;\n  }\n\n  /**\n     Updates each model in the collection, and immediately persists all changes to the db.\n\n     ```js\n     let posts = user.blogPosts;\n\n     posts.update('published', true); // the db was updated for all posts\n     ```\n\n     @method update\n     @param key\n     @param val\n     @return this\n     @public\n   */\n  update(...args) {\n    invokeMap(this.models, \"update\", ...args);\n\n    return this;\n  }\n\n  /**\n     Saves all models in the collection.\n\n     ```js\n     let posts = user.blogPosts;\n\n     posts.models[0].published = true;\n\n     posts.save(); // all posts saved to db\n     ```\n\n     @method save\n     @return this\n     @public\n   */\n  save() {\n    invokeMap(this.models, \"save\");\n\n    return this;\n  }\n\n  /**\n    Reloads each model in the collection.\n\n    ```js\n    let posts = author.blogPosts;\n\n    // ...\n\n    posts.reload(); // reloads data for each post from the db\n    ```\n\n    @method reload\n    @return this\n    @public\n  */\n  reload() {\n    invokeMap(this.models, \"reload\");\n\n    return this;\n  }\n\n  /**\n    Destroys the db record for all models in the collection.\n\n    ```js\n    let posts = user.blogPosts;\n\n    posts.destroy(); // all posts removed from db\n    ```\n\n    @method destroy\n    @return this\n    @public\n  */\n  destroy() {\n    invokeMap(this.models, \"destroy\");\n\n    return this;\n  }\n\n  /**\n    Adds a model to this collection.\n\n    ```js\n    posts.length; // 1\n\n    posts.add(newPost);\n\n    posts.length; // 2\n    ```\n\n    @method add\n    @param {Model} model\n    @return this\n    @public\n  */\n  add(model) {\n    this.models.push(model);\n\n    return this;\n  }\n\n  /**\n    Removes a model from this collection.\n\n    ```js\n    posts.length; // 5\n\n    let firstPost = posts.models[0];\n    posts.remove(firstPost);\n    posts.save();\n\n    posts.length; // 4\n    ```\n\n    @method remove\n    @param {Model} model\n    @return this\n    @public\n  */\n  remove(model) {\n    let match = this.models.find((m) => m.toString() === model.toString());\n    if (match) {\n      let i = this.models.indexOf(match);\n      this.models.splice(i, 1);\n    }\n\n    return this;\n  }\n\n  /**\n    Checks if the Collection includes the given model.\n\n    ```js\n    posts.includes(newPost);\n    ```\n\n    Works by checking if the given model name and id exists in the Collection,\n    making it a bit more flexible than strict object equality.\n\n    ```js\n    let post = server.create('post');\n    let programming = server.create('tag', { text: 'Programming' });\n\n    visit(`/posts/${post.id}`);\n    click('.tag-selector');\n    click('.tag:contains(Programming)');\n\n    post.reload();\n    assert.ok(post.tags.includes(programming));\n    ```\n\n    @method includes\n    @return {Boolean}\n    @public\n  */\n  includes(model) {\n    return this.models.some((m) => m.toString() === model.toString());\n  }\n\n  /**\n    Returns a new Collection with its models filtered according to the provided [callback function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter).\n\n    ```js\n    let publishedPosts = user.posts.filter(post => post.isPublished);\n    ```\n    @method filter\n    @param {Function} f\n    @return {Collection}\n    @public\n  */\n  filter(f) {\n    let filteredModels = this.models.filter(f);\n\n    return new Collection(this.modelName, filteredModels);\n  }\n\n  /**\n     Returns a new Collection with its models sorted according to the provided [compare function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n\n     ```js\n     let postsByTitleAsc = user.posts.sort((a, b) => a.title > b.title ? 1 : -1 );\n     ```\n\n     @method sort\n     @param {Function} f\n     @return {Collection}\n     @public\n   */\n  sort(f) {\n    let sortedModels = this.models.concat().sort(f);\n\n    return new Collection(this.modelName, sortedModels);\n  }\n\n  /**\n    Returns a new Collection with a subset of its models selected from `begin` to `end`.\n\n    ```js\n    let firstThreePosts = user.posts.slice(0, 3);\n    ```\n\n    @method slice\n    @param {Integer} begin\n    @param {Integer} end\n    @return {Collection}\n    @public\n  */\n  slice(...args) {\n    let slicedModels = this.models.slice(...args);\n\n    return new Collection(this.modelName, slicedModels);\n  }\n\n  /**\n    Modifies the Collection by merging the models from another collection.\n\n    ```js\n    user.posts.mergeCollection(newPosts);\n    user.posts.save();\n    ```\n\n    @method mergeCollection\n    @param {Collection} collection\n    @return this\n    @public\n   */\n  mergeCollection(collection) {\n    this.models = this.models.concat(collection.models);\n\n    return this;\n  }\n\n  /**\n     Simple string representation of the collection and id.\n\n     ```js\n     user.posts.toString(); // collection:post(post:1,post:4)\n     ```\n\n     @method toString\n     @return {String}\n     @public\n   */\n  toString() {\n    return `collection:${this.modelName}(${this.models\n      .map((m) => m.id)\n      .join(\",\")})`;\n  }\n}\n","import invokeMap from \"lodash/invokeMap\";\nimport isEqual from \"lodash/isEqual\";\n\n/**\n * An array of models, returned from one of the schema query\n * methods (all, find, where). Knows how to update and destroy its models.\n *\n * Identical to Collection except it can contain a heterogeneous array of\n * models. Thus, it has no `modelName` property. This lets serializers and\n * other parts of the system interact with it differently.\n *\n * @class PolymorphicCollection\n * @constructor\n * @public\n * @hide\n */\nexport default class PolymorphicCollection {\n  constructor(models = []) {\n    this.models = models;\n  }\n\n  /**\n   * Number of models in the collection.\n   *\n   * @property length\n   * @type Number\n   * @public\n   */\n  get length() {\n    return this.models.length;\n  }\n\n  /**\n   * Updates each model in the collection (persisting immediately to the db).\n   * @method update\n   * @param key\n   * @param val\n   * @return this\n   * @public\n   */\n  update(...args) {\n    invokeMap(this.models, \"update\", ...args);\n\n    return this;\n  }\n\n  /**\n   * Destroys the db record for all models in the collection.\n   * @method destroy\n   * @return this\n   * @public\n   */\n  destroy() {\n    invokeMap(this.models, \"destroy\");\n\n    return this;\n  }\n\n  /**\n   * Saves all models in the collection.\n   * @method save\n   * @return this\n   * @public\n   */\n  save() {\n    invokeMap(this.models, \"save\");\n\n    return this;\n  }\n\n  /**\n   * Reloads each model in the collection.\n   * @method reload\n   * @return this\n   * @public\n   */\n  reload() {\n    invokeMap(this.models, \"reload\");\n\n    return this;\n  }\n\n  /**\n   * Adds a model to this collection\n   *\n   * @method add\n   * @return this\n   * @public\n   */\n  add(model) {\n    this.models.push(model);\n\n    return this;\n  }\n\n  /**\n   * Removes a model to this collection\n   *\n   * @method remove\n   * @return this\n   * @public\n   */\n  remove(model) {\n    let match = this.models.find((m) => isEqual(m.attrs, model.attrs));\n    if (match) {\n      let i = this.models.indexOf(match);\n      this.models.splice(i, 1);\n    }\n\n    return this;\n  }\n\n  /**\n   * Checks if the collection includes the model\n   *\n   * @method includes\n   * @return boolean\n   * @public\n   */\n  includes(model) {\n    return this.models.some((m) => isEqual(m.attrs, model.attrs));\n  }\n\n  /**\n   * @method filter\n   * @param f\n   * @return {Collection}\n   * @public\n   */\n  filter(f) {\n    let filteredModels = this.models.filter(f);\n\n    return new PolymorphicCollection(filteredModels);\n  }\n\n  /**\n   * @method sort\n   * @param f\n   * @return {Collection}\n   * @public\n   */\n  sort(f) {\n    let sortedModels = this.models.concat().sort(f);\n\n    return new PolymorphicCollection(sortedModels);\n  }\n\n  /**\n   * @method slice\n   * @param {Integer} begin\n   * @param {Integer} end\n   * @return {Collection}\n   * @public\n   */\n  slice(...args) {\n    let slicedModels = this.models.slice(...args);\n\n    return new PolymorphicCollection(slicedModels);\n  }\n\n  /**\n   * @method mergeCollection\n   * @param collection\n   * @return this\n   * @public\n   */\n  mergeCollection(collection) {\n    this.models = this.models.concat(collection.models);\n\n    return this;\n  }\n\n  /**\n   * Simple string representation of the collection and id.\n   * @method toString\n   * @return {String}\n   * @public\n   */\n  toString() {\n    return `collection:${this.modelName}(${this.models\n      .map((m) => m.id)\n      .join(\",\")})`;\n  }\n}\n","import Association from \"./association\";\nimport Collection from \"../collection\";\nimport PolymorphicCollection from \"../polymorphic-collection\";\nimport compact from \"lodash/compact\";\nimport { capitalize, camelize } from \"../../utils/inflector\";\nimport assert from \"@lib/assert\";\n\nconst identifierCache = {};\n\n/**\n * @class HasMany\n * @extends Association\n * @constructor\n * @public\n * @hide\n */\nexport default class HasMany extends Association {\n  get identifier() {\n    if (typeof identifierCache[this.name] !== \"string\") {\n      const identifier = `${camelize(\n        this._container.inflector.singularize(this.name)\n      )}Ids`;\n\n      identifierCache[this.name] = identifier;\n    }\n\n    return identifierCache[this.name];\n  }\n\n  get type() {\n    return \"hasMany\";\n  }\n\n  /**\n   * @method getForeignKeyArray\n   * @return {Array} Array of camelized model name of associated objects\n   * and foreign key for the object owning the association\n   * @public\n   */\n  getForeignKeyArray() {\n    return [camelize(this.ownerModelName), this.getForeignKey()];\n  }\n\n  /**\n   * @method getForeignKey\n   * @return {String} Foreign key for the object owning the association\n   * @public\n   */\n  getForeignKey() {\n    // we reuse identifierCache because it's the same logic as get identifier\n    if (typeof identifierCache[this.name] !== \"string\") {\n      const foreignKey = `${this._container.inflector.singularize(\n        camelize(this.name)\n      )}Ids`;\n\n      identifierCache[this.name] = foreignKey;\n    }\n\n    return identifierCache[this.name];\n  }\n\n  /**\n   * Registers has-many association defined by given key on given model,\n   * defines getters / setters for associated records and associated records' ids,\n   * adds methods for creating unsaved child records and creating saved ones\n   *\n   * @method addMethodsToModelClass\n   * @param {Function} ModelClass\n   * @param {String} key\n   * @public\n   */\n  addMethodsToModelClass(ModelClass, key) {\n    let modelPrototype = ModelClass.prototype;\n    let association = this;\n    let foreignKey = this.getForeignKey();\n    let associationHash = { [key]: this };\n\n    modelPrototype.hasManyAssociations = Object.assign(\n      modelPrototype.hasManyAssociations,\n      associationHash\n    );\n\n    // update hasManyAssociationFks\n    Object.keys(modelPrototype.hasManyAssociations).forEach((key) => {\n      const value = modelPrototype.hasManyAssociations[key];\n      modelPrototype.hasManyAssociationFks[value.getForeignKey()] = value;\n    });\n\n    // Add to target's dependent associations array\n    this.schema.addDependentAssociation(this, this.modelName);\n\n    // TODO: look how this is used. Are these necessary, seems like they could be gotten from the above?\n    // Or we could use a single data structure to store this information?\n    modelPrototype.associationKeys.add(key);\n    modelPrototype.associationIdKeys.add(foreignKey);\n\n    Object.defineProperty(modelPrototype, foreignKey, {\n      /*\n        object.childrenIds\n          - returns an array of the associated children's ids\n      */\n      get() {\n        this._tempAssociations = this._tempAssociations || {};\n        let tempChildren = this._tempAssociations[key];\n        let ids = [];\n\n        if (tempChildren) {\n          if (association.isPolymorphic) {\n            ids = tempChildren.models.map((model) => ({\n              type: model.modelName,\n              id: model.id,\n            }));\n          } else {\n            ids = tempChildren.models.map((model) => model.id);\n          }\n        } else {\n          ids = this.attrs[foreignKey] || [];\n        }\n\n        return ids;\n      },\n\n      /*\n        object.childrenIds = ([childrenIds...])\n          - sets the associated children (via id)\n      */\n      set(ids) {\n        let tempChildren;\n\n        if (ids === null) {\n          tempChildren = [];\n        } else if (ids !== undefined) {\n          assert(\n            Array.isArray(ids),\n            `You must pass an array in when setting ${foreignKey} on ${this}`\n          );\n\n          if (association.isPolymorphic) {\n            assert(\n              ids.every((el) => {\n                return (\n                  typeof el === \"object\" &&\n                  typeof el.type !== undefined &&\n                  typeof el.id !== undefined\n                );\n              }),\n              `You must pass in an array of polymorphic identifiers (objects of shape { type, id }) when setting ${foreignKey} on ${this}`\n            );\n\n            let models = ids.map(({ type, id }) => {\n              return association.schema[\n                association.schema.toCollectionName(type)\n              ].find(id);\n            });\n            tempChildren = new PolymorphicCollection(models);\n          } else {\n            tempChildren =\n              association.schema[\n                association.schema.toCollectionName(association.modelName)\n              ].find(ids);\n          }\n        }\n\n        this[key] = tempChildren;\n      },\n    });\n\n    Object.defineProperty(modelPrototype, key, {\n      /*\n        object.children\n          - returns an array of associated children\n      */\n      get() {\n        this._tempAssociations = this._tempAssociations || {};\n        let collection = null;\n\n        if (this._tempAssociations[key]) {\n          collection = this._tempAssociations[key];\n        } else {\n          if (association.isPolymorphic) {\n            if (this[foreignKey]) {\n              let polymorphicIds = this[foreignKey];\n              let models = polymorphicIds.map(({ type, id }) => {\n                return association.schema[\n                  association.schema.toCollectionName(type)\n                ].find(id);\n              });\n\n              collection = new PolymorphicCollection(models);\n            } else {\n              collection = new PolymorphicCollection(association.modelName);\n            }\n          } else {\n            if (this[foreignKey]) {\n              collection = association.schema[\n                association.schema.toCollectionName(association.modelName)\n              ].find(this[foreignKey]);\n            } else {\n              collection = new Collection(association.modelName);\n            }\n          }\n\n          this._tempAssociations[key] = collection;\n        }\n\n        return collection;\n      },\n\n      /*\n        object.children = [model1, model2, ...]\n          - sets the associated children (via array of models or Collection)\n      */\n      set(models) {\n        if (\n          models instanceof Collection ||\n          models instanceof PolymorphicCollection\n        ) {\n          models = models.models;\n        }\n\n        models = models ? compact(models) : [];\n        this._tempAssociations = this._tempAssociations || {};\n\n        let collection;\n        if (association.isPolymorphic) {\n          collection = new PolymorphicCollection(models);\n        } else {\n          collection = new Collection(association.modelName, models);\n        }\n        this._tempAssociations[key] = collection;\n\n        models.forEach((model) => {\n          if (model.hasInverseFor(association)) {\n            let inverse = model.inverseFor(association);\n\n            model.associate(this, inverse);\n          }\n        });\n      },\n    });\n\n    /*\n      object.newChild\n        - creates a new unsaved associated child\n    */\n    modelPrototype[\n      `new${capitalize(\n        camelize(this._container.inflector.singularize(association.name))\n      )}`\n    ] = function (...args) {\n      let modelName, attrs;\n      if (association.isPolymorphic) {\n        modelName = args[0];\n        attrs = args[1];\n      } else {\n        modelName = association.modelName;\n        attrs = args[0];\n      }\n\n      let child =\n        association.schema[association.schema.toCollectionName(modelName)].new(\n          attrs\n        );\n      let children = this[key].models;\n\n      children.push(child);\n      this[key] = children;\n\n      return child;\n    };\n\n    /*\n      object.createChild\n        - creates a new saved associated child, and immediately persists both models\n\n      TODO: forgot why this[key].add(child) doesn't work, most likely\n      because these external APIs trigger saving cascades. Should probably\n      have an internal method like this[key]._add.\n    */\n    modelPrototype[\n      `create${capitalize(\n        camelize(this._container.inflector.singularize(association.name))\n      )}`\n    ] = function (...args) {\n      let modelName, attrs;\n      if (association.isPolymorphic) {\n        modelName = args[0];\n        attrs = args[1];\n      } else {\n        modelName = association.modelName;\n        attrs = args[0];\n      }\n\n      let child =\n        association.schema[\n          association.schema.toCollectionName(modelName)\n        ].create(attrs);\n      let children = this[key].models;\n\n      children.push(child);\n      this[key] = children;\n\n      this.save();\n\n      return child.reload();\n    };\n  }\n\n  /**\n   *\n   *\n   * @public\n   */\n  disassociateAllDependentsFromTarget(model) {\n    let owner = this.ownerModelName;\n    let fk;\n\n    if (this.isPolymorphic) {\n      fk = { type: model.modelName, id: model.id };\n    } else {\n      fk = model.id;\n    }\n\n    let dependents = this.schema[this.schema.toCollectionName(owner)].where(\n      (potentialOwner) => {\n        let currentIds = potentialOwner[this.getForeignKey()];\n\n        // Need this check because currentIds could be null\n        return (\n          currentIds &&\n          currentIds.find((id) => {\n            if (typeof id === \"object\") {\n              return id.type === fk.type && id.id === fk.id;\n            } else {\n              return id === fk;\n            }\n          })\n        );\n      }\n    );\n\n    dependents.models.forEach((dependent) => {\n      dependent.disassociate(model, this);\n      dependent.save();\n    });\n  }\n}\n","import assert from \"../assert\";\nimport { camelize, dasherize } from \"../utils/inflector\";\nimport HasMany from \"../orm/associations/has-many\";\n\nconst pathModelClassCache = {};\n\n/**\n  @hide\n*/\nexport default class BaseRouteHandler {\n  getModelClassFromPath(fullPath) {\n    if (!fullPath) {\n      return;\n    }\n\n    if (typeof pathModelClassCache[fullPath] !== \"string\") {\n      let path = fullPath.split(\"/\");\n      let lastPath;\n\n      for (let i = path.length - 1; i >= 0; i--) {\n        const segment = path[i];\n        if (segment.length && segment[0] !== \":\") {\n          lastPath = segment;\n          break;\n        }\n      }\n\n      pathModelClassCache[fullPath] = dasherize(\n        camelize(this._container.inflector.singularize(lastPath))\n      );\n    }\n\n    return pathModelClassCache[fullPath];\n  }\n\n  _getIdForRequest(request, jsonApiDoc) {\n    let id;\n    if (request && request.params && request.params.id) {\n      id = request.params.id;\n    } else if (jsonApiDoc && jsonApiDoc.data && jsonApiDoc.data.id) {\n      id = jsonApiDoc.data.id;\n    }\n    return id;\n  }\n\n  _getJsonApiDocForRequest(request, modelName) {\n    let body;\n    if (request && request.requestBody) {\n      body = JSON.parse(request.requestBody);\n    }\n    return this.serializerOrRegistry.normalize(body, modelName);\n  }\n\n  _getAttrsForRequest(request, modelName) {\n    let json = this._getJsonApiDocForRequest(request, modelName);\n    let id = this._getIdForRequest(request, json);\n    let attrs = {};\n\n    assert(\n      json.data &&\n        (json.data.attributes || json.data.type || json.data.relationships),\n      `You're using a shorthand or #normalizedRequestAttrs, but your serializer's normalize function did not return a valid JSON:API document. Consult the docs for the normalize hook on the Serializer class.`\n    );\n\n    if (json.data.attributes) {\n      attrs = Object.keys(json.data.attributes).reduce((sum, key) => {\n        sum[camelize(key)] = json.data.attributes[key];\n        return sum;\n      }, {});\n    }\n\n    if (json.data.relationships) {\n      Object.keys(json.data.relationships).forEach((relationshipName) => {\n        let relationship = json.data.relationships[relationshipName];\n        let modelClass = this.schema.modelClassFor(modelName);\n        let association = modelClass.associationFor(camelize(relationshipName));\n        let valueForRelationship;\n\n        assert(\n          association,\n          `You're passing the relationship '${relationshipName}' to the '${modelName}' model via a ${request.method} to '${request.url}', but you did not define the '${relationshipName}' association on the '${modelName}' model.`\n        );\n\n        if (association.isPolymorphic) {\n          valueForRelationship = relationship.data;\n        } else if (association instanceof HasMany) {\n          valueForRelationship =\n            relationship.data && relationship.data.map((rel) => rel.id);\n        } else {\n          valueForRelationship = relationship.data && relationship.data.id;\n        }\n\n        attrs[association.identifier] = valueForRelationship;\n      }, {});\n    }\n\n    if (id) {\n      attrs.id = id;\n    }\n\n    return attrs;\n  }\n\n  _getAttrsForFormRequest({ requestBody }) {\n    let attrs;\n    let urlEncodedParts = [];\n\n    assert(\n      requestBody && typeof requestBody === \"string\",\n      `You're using the helper method #normalizedFormData, but the request body is empty or not a valid url encoded string.`\n    );\n\n    urlEncodedParts = requestBody.split(\"&\");\n\n    attrs = urlEncodedParts.reduce((a, urlEncodedPart) => {\n      let [key, value] = urlEncodedPart.split(\"=\");\n      a[key] = decodeURIComponent(value.replace(/\\+/g, \" \"));\n      return a;\n    }, {});\n\n    return attrs;\n  }\n}\n","import BaseRouteHandler from \"./base\";\nimport assert from \"../assert\";\nimport { dasherize } from \"../utils/inflector\";\n\n/**\n * @hide\n */\nexport default class FunctionRouteHandler extends BaseRouteHandler {\n  constructor(schema, serializerOrRegistry, userFunction, path, server) {\n    super(server);\n    this.schema = schema;\n    this.serializerOrRegistry = serializerOrRegistry;\n    this.userFunction = userFunction;\n    this.path = path;\n  }\n\n  handle(request) {\n    return this.userFunction(this.schema, request);\n  }\n\n  setRequest(request) {\n    this.request = request;\n  }\n\n  serialize(response, serializerType) {\n    let serializer;\n\n    if (serializerType) {\n      serializer = this.serializerOrRegistry.serializerFor(serializerType, {\n        explicit: true,\n      });\n    } else {\n      serializer = this.serializerOrRegistry;\n    }\n\n    return serializer.serialize(response, this.request);\n  }\n\n  normalizedRequestAttrs(modelName = null) {\n    let {\n      path,\n      request,\n      request: { requestHeaders },\n    } = this;\n    let attrs;\n\n    let lowerCaseHeaders = {};\n    for (let header in requestHeaders) {\n      lowerCaseHeaders[header.toLowerCase()] = requestHeaders[header];\n    }\n    if (/x-www-form-urlencoded/.test(lowerCaseHeaders[\"content-type\"])) {\n      attrs = this._getAttrsForFormRequest(request);\n    } else {\n      if (modelName) {\n        assert(\n          dasherize(modelName) === modelName,\n          `You called normalizedRequestAttrs('${modelName}'), but normalizedRequestAttrs was intended to be used with the dasherized version of the model type. Please change this to normalizedRequestAttrs('${dasherize(\n            modelName\n          )}').`\n        );\n      } else {\n        modelName = this.getModelClassFromPath(path);\n      }\n\n      assert(\n        this.schema.hasModelForModelName(modelName),\n        `You're using a shorthand or the #normalizedRequestAttrs helper but the detected model of '${modelName}' does not exist. You might need to pass in the correct modelName as the first argument to #normalizedRequestAttrs.`\n      );\n\n      attrs = this._getAttrsForRequest(request, modelName);\n    }\n\n    return attrs;\n  }\n}\n","/**\n * @hide\n */\nexport default class ObjectRouteHandler {\n  constructor(schema, serializerOrRegistry, object) {\n    this.schema = schema;\n    this.serializerOrRegistry = serializerOrRegistry;\n    this.object = object;\n  }\n\n  handle(/* request */) {\n    return this.object;\n  }\n}\n","import BaseRouteHandler from \"../base\";\n\n/**\n  @hide\n*/\nexport default class BaseShorthandRouteHandler extends BaseRouteHandler {\n  constructor(schema, serializerOrRegistry, shorthand, path, options = {}) {\n    super();\n    shorthand = shorthand || this.getModelClassFromPath(path);\n    this.schema = schema;\n    this.serializerOrRegistry = serializerOrRegistry;\n    this.shorthand = shorthand;\n    this.options = options;\n\n    let type = Array.isArray(shorthand) ? \"array\" : typeof shorthand;\n    if (type === \"string\") {\n      let modelClass = this.schema[this.schema.toCollectionName(shorthand)];\n      this.handle = (request) => {\n        return this.handleStringShorthand(request, modelClass);\n      };\n    } else if (type === \"array\") {\n      let modelClasses = shorthand.map(\n        (modelName) => this.schema[this.schema.toCollectionName(modelName)]\n      );\n      this.handle = (request) => {\n        return this.handleArrayShorthand(request, modelClasses);\n      };\n    }\n  }\n\n  // handleStringShorthand() {\n  //\n  // }\n  //\n  // handleArrayShorthand() {\n  //\n  // }\n}\n","import assert from \"../../assert\";\nimport BaseShorthandRouteHandler from \"./base\";\nimport Response from \"../../response\";\nimport { camelize } from \"../../utils/inflector\";\n\n/**\n * @hide\n */\nexport default class GetShorthandRouteHandler extends BaseShorthandRouteHandler {\n  /*\n    Retrieve a model/collection from the db.\n\n    Examples:\n      this.get('/contacts', 'contact');\n      this.get('/contacts/:id', 'contact');\n  */\n  handleStringShorthand(request, modelClass) {\n    let modelName = this.shorthand;\n    let camelizedModelName = camelize(modelName);\n\n    assert(\n      modelClass,\n      `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist.`\n    );\n\n    let id = this._getIdForRequest(request);\n    if (id) {\n      let model = modelClass.find(id);\n      if (!model) {\n        return new Response(404);\n      } else {\n        return model;\n      }\n    } else if (this.options.coalesce) {\n      let ids = this.serializerOrRegistry.getCoalescedIds(\n        request,\n        camelizedModelName\n      );\n      if (ids) {\n        return modelClass.find(ids);\n      }\n    }\n    return modelClass.all();\n  }\n\n  /*\n    Retrieve an array of collections from the db.\n\n    Ex: this.get('/home', ['contacts', 'pictures']);\n  */\n  handleArrayShorthand(request, modelClasses) {\n    let keys = this.shorthand;\n    let id = this._getIdForRequest(request);\n\n    /*\n    If the first key is singular and we have an id param in\n    the request, we're dealing with the version of the shorthand\n    that has a parent model and several has-many relationships.\n    We throw an error, because the serializer is the appropriate\n    place for this now.\n    */\n    assert(\n      !id || this._container.inflector.singularize(keys[0]) !== keys[0],\n      `It looks like you're using the \"Single record with\n      related records\" version of the array shorthand, in addition to opting\n      in to the model layer. This shorthand was made when there was no\n      serializer layer. Now that you're using models, please ensure your\n      relationships are defined, and create a serializer for the parent\n      model, adding the relationships there.`\n    );\n\n    return modelClasses.map((modelClass) => modelClass.all());\n  }\n}\n","import assert from \"../../assert\";\nimport BaseShorthandRouteHandler from \"./base\";\nimport { camelize } from \"../../utils/inflector\";\n\n/**\n * @hide\n */\nexport default class PostShorthandRouteHandler extends BaseShorthandRouteHandler {\n  /*\n    Push a new model of type *camelizedModelName* to the db.\n\n    For example, this will push a 'user':\n      this.post('/contacts', 'user');\n  */\n\n  handleStringShorthand(request, modelClass) {\n    let modelName = this.shorthand;\n    let camelizedModelName = camelize(modelName);\n    assert(\n      modelClass,\n      `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist.`\n    );\n\n    let attrs = this._getAttrsForRequest(\n      request,\n      modelClass.camelizedModelName\n    );\n    return modelClass.create(attrs);\n  }\n}\n","import assert from \"../../assert\";\nimport BaseShorthandRouteHandler from \"./base\";\nimport { camelize } from \"../../utils/inflector\";\nimport Response from \"../../response\";\n\n/**\n * @hide\n */\nexport default class PutShorthandRouteHandler extends BaseShorthandRouteHandler {\n  /*\n    Update an object from the db, specifying the type.\n\n      this.put('/contacts/:id', 'user');\n  */\n  handleStringShorthand(request, modelClass) {\n    let modelName = this.shorthand;\n    let camelizedModelName = camelize(modelName);\n\n    assert(\n      modelClass,\n      `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist.`\n    );\n\n    let id = this._getIdForRequest(request);\n\n    let model = modelClass.find(id);\n    if (!model) {\n      return new Response(404);\n    }\n\n    let attrs = this._getAttrsForRequest(\n      request,\n      modelClass.camelizedModelName\n    );\n\n    return model.update(attrs);\n  }\n}\n","import assert from \"../../assert\";\nimport BaseShorthandRouteHandler from \"./base\";\nimport { camelize } from \"../../utils/inflector\";\nimport Response from \"../../response\";\n\n/**\n * @hide\n */\nexport default class DeleteShorthandRouteHandler extends BaseShorthandRouteHandler {\n  /*\n    Remove the model from the db of type *camelizedModelName*.\n\n    This would remove the user with id :id:\n      Ex: this.del('/contacts/:id', 'user');\n  */\n  handleStringShorthand(request, modelClass) {\n    let modelName = this.shorthand;\n    let camelizedModelName = camelize(modelName);\n    assert(\n      modelClass,\n      `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist.`\n    );\n\n    let id = this._getIdForRequest(request);\n    let model = modelClass.find(id);\n    if (!model) {\n      return new Response(404);\n    }\n\n    model.destroy();\n  }\n\n  /*\n    Remove the model and child related models from the db.\n\n    This would remove the contact with id `:id`, as well\n    as this contact's addresses and phone numbers.\n      Ex: this.del('/contacts/:id', ['contact', 'addresses', 'numbers');\n  */\n  handleArrayShorthand(request, modelClasses) {\n    let id = this._getIdForRequest(request);\n\n    let parent = modelClasses[0].find(id);\n    let childTypes = modelClasses\n      .slice(1)\n      .map((modelClass) =>\n        this._container.inflector.pluralize(modelClass.camelizedModelName)\n      );\n\n    // Delete related children\n    childTypes.forEach((type) => parent[type].destroy());\n    parent.destroy();\n  }\n}\n","import assert from \"../../assert\";\nimport BaseShorthandRouteHandler from \"./base\";\nimport Response from \"../../response\";\nimport { camelize } from \"../../utils/inflector\";\n\n/**\n * @hide\n */\nexport default class HeadShorthandRouteHandler extends BaseShorthandRouteHandler {\n  /*\n    Retrieve a model/collection from the db.\n\n    Examples:\n      this.head('/contacts', 'contact');\n      this.head('/contacts/:id', 'contact');\n  */\n  handleStringShorthand(request, modelClass) {\n    let modelName = this.shorthand;\n    let camelizedModelName = camelize(modelName);\n\n    assert(\n      modelClass,\n      `The route handler for ${request.url} is trying to access the ${camelizedModelName} model, but that model doesn't exist.`\n    );\n\n    let id = this._getIdForRequest(request);\n    if (id) {\n      let model = modelClass.find(id);\n      if (!model) {\n        return new Response(404);\n      } else {\n        return new Response(204);\n      }\n    } else if (\n      this.options.coalesce &&\n      request.queryParams &&\n      request.queryParams.ids\n    ) {\n      let model = modelClass.find(request.queryParams.ids);\n\n      if (!model) {\n        return new Response(404);\n      } else {\n        return new Response(204);\n      }\n    } else {\n      return new Response(204);\n    }\n  }\n}\n","import { MirageError } from \"./assert\";\nimport Response from \"./response\";\nimport FunctionHandler from \"./route-handlers/function\";\nimport ObjectHandler from \"./route-handlers/object\";\nimport GetShorthandHandler from \"./route-handlers/shorthands/get\";\nimport PostShorthandHandler from \"./route-handlers/shorthands/post\";\nimport PutShorthandHandler from \"./route-handlers/shorthands/put\";\nimport DeleteShorthandHandler from \"./route-handlers/shorthands/delete\";\nimport HeadShorthandHandler from \"./route-handlers/shorthands/head\";\n\nconst DEFAULT_CODES = { get: 200, put: 204, post: 201, delete: 204 };\n\nfunction createHandler({\n  verb,\n  schema,\n  serializerOrRegistry,\n  path,\n  rawHandler,\n  options,\n  middleware,\n}) {\n  let handler;\n  let args = [\n    schema,\n    serializerOrRegistry,\n    rawHandler,\n    path,\n    options,\n    middleware,\n  ];\n  let type = typeof rawHandler;\n\n  if (type === \"function\") {\n    handler = new FunctionHandler(...args);\n  } else if (type === \"object\" && rawHandler) {\n    handler = new ObjectHandler(...args);\n  } else if (verb === \"get\") {\n    handler = new GetShorthandHandler(...args);\n  } else if (verb === \"post\") {\n    handler = new PostShorthandHandler(...args);\n  } else if (verb === \"put\" || verb === \"patch\") {\n    handler = new PutShorthandHandler(...args);\n  } else if (verb === \"delete\") {\n    handler = new DeleteShorthandHandler(...args);\n  } else if (verb === \"head\") {\n    handler = new HeadShorthandHandler(...args);\n  }\n  return handler;\n}\n\n/**\n * @hide\n */\nexport default class RouteHandler {\n  constructor({\n    schema,\n    verb,\n    rawHandler,\n    customizedCode,\n    options,\n    path,\n    serializerOrRegistry,\n    middleware,\n  }) {\n    this.verb = verb;\n    this.customizedCode = customizedCode;\n    this.serializerOrRegistry = serializerOrRegistry;\n    this.middleware = middleware || [];\n    this.handler = createHandler({\n      verb,\n      schema,\n      path,\n      serializerOrRegistry,\n      rawHandler,\n      options,\n    });\n  }\n\n  handle(request) {\n    return this._getMirageResponseForRequest(request, this.middleware)\n      .then((mirageResponse) => this.serialize(mirageResponse, request))\n      .then((serializedMirageResponse) => {\n        return serializedMirageResponse.toRackResponse();\n      });\n  }\n\n  _getMirageResponseForRequest(request, middleware = []) {\n    let result;\n    try {\n      /*\n       We need to do this for the #serialize convenience method. Probably is\n       a better way.\n     */\n      if (this.handler instanceof FunctionHandler) {\n        this.handler.setRequest(request);\n      }\n\n      result = this.handleWithMiddleware(request, [\n        ...middleware,\n        (_, req) => this.handler.handle(req),\n      ]);\n    } catch (e) {\n      if (e instanceof MirageError) {\n        result = new Response(500, {}, e);\n      } else {\n        let message = e.message || e;\n\n        result = new Response(\n          500,\n          {},\n          {\n            message,\n            stack: `Mirage: Your ${request.method} handler for the url ${\n              request.url\n            } threw an error:\\n\\n${e.stack || e}`,\n          }\n        );\n      }\n    }\n\n    return this._toMirageResponse(result);\n  }\n\n  handleWithMiddleware(request, middleware) {\n    const [current, ...remaining] = middleware;\n    return current(this.schema, request, (req = request) => {\n      return this.handleWithMiddleware(req, remaining);\n    });\n  }\n\n  _toMirageResponse(result) {\n    let mirageResponse;\n\n    return new Promise((resolve, reject) => {\n      Promise.resolve(result)\n        .then((response) => {\n          if (response instanceof Response) {\n            mirageResponse = result;\n          } else {\n            let code = this._getCodeForResponse(response);\n            mirageResponse = new Response(code, {}, response);\n          }\n          resolve(mirageResponse);\n        })\n        .catch(reject);\n    });\n  }\n\n  _getCodeForResponse(response) {\n    let code;\n    if (this.customizedCode) {\n      code = this.customizedCode;\n    } else {\n      code = DEFAULT_CODES[this.verb];\n      // Returning any data for a 204 is invalid\n      if (code === 204 && response !== undefined && response !== \"\") {\n        code = 200;\n      }\n    }\n    return code;\n  }\n\n  serialize(mirageResponse, request) {\n    mirageResponse.data = this.serializerOrRegistry.serialize(\n      mirageResponse.data,\n      request\n    );\n\n    return mirageResponse;\n  }\n}\n","import has from \"lodash/has\";\n\n/**\n  @hide\n*/\nexport default function extend(protoProps, staticProps) {\n  class Child extends this {\n    constructor(...args) {\n      super(...args);\n      // The constructor function for the new subclass is optionally defined by you\n      // in your `extend` definition\n      if (protoProps && has(protoProps, \"constructor\")) {\n        protoProps.constructor.call(this, ...args);\n      }\n    }\n  }\n\n  // Add static properties to the constructor function, if supplied.\n\n  Object.assign(Child, this, staticProps);\n\n  // Add prototype properties (instance properties) to the subclass,\n  // if supplied.\n  if (protoProps) {\n    Object.assign(Child.prototype, protoProps);\n  }\n\n  return Child;\n}\n","import BelongsTo from \"./associations/belongs-to\";\nimport HasMany from \"./associations/has-many\";\nimport extend from \"../utils/extend\";\nimport assert from \"../assert\";\nimport Collection from \"./collection\";\nimport PolymorphicCollection from \"./polymorphic-collection\";\nimport values from \"lodash/values\";\nimport compact from \"lodash/compact\";\n\n/**\n  Models wrap your database, and allow you to define relationships.\n\n  **Class vs. instance methods**\n\n  The methods documented below apply to _instances_ of models, but you'll typically use the `Schema` to access the model _class_, which can be used to find or create instances.\n\n  You can find the Class methods documented under the `Schema` API docs.\n\n  **Accessing properties and relationships**\n\n  You can access properites (fields) and relationships directly off of models.\n\n  ```js\n  user.name;    // 'Sam'\n  user.team;    // Team model\n  user.teamId;  // Team id (foreign key)\n  ```\n\n  Mirage Models are schemaless in their attributes, but their relationship schema is known.\n\n  For example,\n\n  ```js\n  let user = schema.users.create();\n  user.attrs  // { }\n  user.name   // undefined\n\n  let user = schema.users.create({ name: 'Sam' });\n  user.attrs  // { name: 'Sam' }\n  user.name   // 'Sam'\n  ```\n\n  However, if a `user` has a `posts` relationships defined,\n\n  ```js\n  let user = schema.users.create();\n  user.posts  // returns an empty Posts Collection\n  ```\n\n  @class Model\n  @constructor\n  @public\n */\nclass Model {\n  // TODO: schema and modelName now set statically at registration, need to remove\n  /*\n    Notes:\n\n  - We need to pass in modelName, because models are created with\n    .extend and anonymous functions, so you cannot use\n    reflection to find the name of the constructor.\n  */\n  constructor(schema, modelName, attrs, fks) {\n    assert(schema, \"A model requires a schema\");\n    assert(modelName, \"A model requires a modelName\");\n\n    this._schema = schema;\n    this.modelName = modelName;\n    this.fks = fks || [];\n\n    /**\n      Returns the attributes of your model.\n\n      ```js\n      let post = schema.blogPosts.find(1);\n      post.attrs; // {id: 1, title: 'Lorem Ipsum', publishedAt: '2012-01-01 10:00:00'}\n      ```\n\n      Note that you can also access individual attributes directly off a model, e.g. `post.title`.\n\n      @property attrs\n      @public\n    */\n    this.attrs = {};\n\n    attrs = attrs || {};\n\n    // Ensure fks are there\n    this.fks.forEach((fk) => {\n      this.attrs[fk] = attrs[fk] !== undefined ? attrs[fk] : null;\n    });\n\n    Object.keys(attrs).forEach((name) => {\n      const value = attrs[name];\n\n      this._validateAttr(name, value);\n      this._setupAttr(name, value);\n      this._setupRelationship(name, value);\n    });\n\n    return this;\n  }\n\n  /**\n    Create or saves the model.\n\n    ```js\n    let post = blogPosts.new({ title: 'Lorem ipsum' });\n    post.id; // null\n\n    post.save();\n    post.id; // 1\n\n    post.title = 'Hipster ipsum'; // db has not been updated\n    post.save();                  // ...now the db is updated\n    ```\n\n    @method save\n    @return this\n    @public\n   */\n  save() {\n    let collection = this._schema.toInternalCollectionName(this.modelName);\n\n    if (this.isNew()) {\n      // Update the attrs with the db response\n      this.attrs = this._schema.db[collection].insert(this.attrs);\n\n      // Ensure the id getter/setter is set\n      this._definePlainAttribute(\"id\");\n    } else {\n      this._schema.isSaving[this.toString()] = true;\n      this._schema.db[collection].update(this.attrs.id, this.attrs);\n    }\n\n    this._saveAssociations();\n\n    this._schema.isSaving[this.toString()] = false;\n    return this;\n  }\n\n  /**\n    Updates the record in the db.\n\n    ```js\n    let author = authors.find(1);\n    let followers = users.find([1, 2]);\n    let post = blogPosts.find(1);\n    post.update('title', 'Hipster ipsum'); // the db was updated\n    post.update({\n      title: 'Lorem ipsum',\n      created_at: 'before it was cool'\n    });\n    post.update({ author });\n    post.update({ followers });\n    ```\n\n    @method update\n    @param {String} key\n    @param {any} val\n    @return this\n    @public\n   */\n  update(key, val) {\n    let attrs;\n    if (key == null) {\n      return this;\n    }\n\n    if (typeof key === \"object\") {\n      attrs = key;\n    } else {\n      (attrs = {})[key] = val;\n    }\n\n    Object.keys(attrs).forEach(function (attr) {\n      if (\n        !this.associationKeys.has(attr) &&\n        !this.associationIdKeys.has(attr)\n      ) {\n        this._definePlainAttribute(attr);\n      }\n      this[attr] = attrs[attr];\n    }, this);\n\n    this.save();\n\n    return this;\n  }\n\n  /**\n    Destroys the db record.\n\n    ```js\n    let post = blogPosts.find(1);\n    post.destroy(); // removed from the db\n    ```\n\n    @method destroy\n    @public\n   */\n  destroy() {\n    if (this.isSaved()) {\n      this._disassociateFromDependents();\n\n      let collection = this._schema.toInternalCollectionName(this.modelName);\n      this._schema.db[collection].remove(this.attrs.id);\n    }\n  }\n\n  /**\n    Boolean, true if the model has not been persisted yet to the db.\n\n    ```js\n    let post = blogPosts.new({title: 'Lorem ipsum'});\n    post.isNew(); // true\n    post.id;      // null\n\n    post.save();  // true\n    post.isNew(); // false\n    post.id;      // 1\n    ```\n\n    @method isNew\n    @return {Boolean}\n    @public\n   */\n  isNew() {\n    let hasDbRecord = false;\n    let hasId = this.attrs.id !== undefined && this.attrs.id !== null;\n\n    if (hasId) {\n      let collectionName = this._schema.toInternalCollectionName(\n        this.modelName\n      );\n      let record = this._schema.db[collectionName].find(this.attrs.id);\n\n      if (record) {\n        hasDbRecord = true;\n      }\n    }\n\n    return !hasDbRecord;\n  }\n\n  /**\n    Boolean, opposite of `isNew`\n\n    @method isSaved\n    @return {Boolean}\n    @public\n   */\n  isSaved() {\n    return !this.isNew();\n  }\n\n  /**\n    Reload a model's data from the database.\n\n    ```js\n    let post = blogPosts.find(1);\n    post.attrs;     // {id: 1, title: 'Lorem ipsum'}\n\n    post.title = 'Hipster ipsum';\n    post.title;     // 'Hipster ipsum';\n\n    post.reload();  // true\n    post.title;     // 'Lorem ipsum'\n    ```\n\n    @method reload\n    @return this\n    @public\n   */\n  reload() {\n    if (this.id) {\n      let collection = this._schema.toInternalCollectionName(this.modelName);\n      let attrs = this._schema.db[collection].find(this.id);\n\n      Object.keys(attrs)\n        .filter(function (attr) {\n          return attr !== \"id\";\n        })\n        .forEach(function (attr) {\n          this.attrs[attr] = attrs[attr];\n        }, this);\n    }\n\n    // Clear temp associations\n    this._tempAssociations = {};\n\n    return this;\n  }\n\n  toJSON() {\n    return { ...this.attrs };\n  }\n\n  /**\n    Returns a hash of this model's associations.\n\n    ```js\n    let server = createServer({\n      models: {\n        user: Model,\n        post: Model.extend({\n          user: belongsTo(),\n          comments: hasMany()\n        }),\n        comment: Model\n      },\n\n      seeds(server) {\n        let peter = server.create(\"user\", { name: \"Peter\" });\n        server.create(\"post\", { user: peter });\n      }\n    });\n\n    let post = server.schema.posts.find(1)\n    post.associations\n\n    // {\n    //   user: BelongsToAssociation,\n    //   comments: HasManyAssociation\n    // }\n    ```\n\n    Check out the docs on the Association class to see what fields are available for each association.\n\n    @method associations\n    @type {Object}\n    @public\n   */\n  get associations() {\n    return this._schema.associationsFor(this.modelName);\n  }\n\n  /**\n    Returns the association for the given key\n\n    @method associationFor\n    @param key\n    @public\n    @hide\n   */\n  associationFor(key) {\n    return this.associations[key];\n  }\n\n  /**\n    Returns this model's inverse association for the given\n    model-type-association pair, if it exists.\n\n    Example:\n\n         post: Model.extend({\n           comments: hasMany()\n         }),\n         comments: Model.extend({\n           post: belongsTo()\n         })\n\n     post.inversefor(commentsPostAssociation) would return the\n     `post.comments` association object.\n\n     Originally we had association.inverse() but that became impossible with\n     the addition of polymorphic models. Consider the following:\n\n         post: Model.extend({\n           comments: hasMany()\n         }),\n         picture: Model.extend({\n           comments: hasMany()\n         }),\n         comments: Model.extend({\n           commentable: belongsTo({ polymorphic: true })\n         })\n\n     `commentable.inverse()` is ambiguous - does it return\n     `post.comments` or `picture.comments`? Instead we need to ask each model\n     if it has an inverse for a given association. post.inverseFor(commentable)\n     is no longer ambiguous.\n\n    @method hasInverseFor\n    @param {String} modelName The model name of the class we're scanning\n    @param {ORM/Association} association\n    @return {ORM/Association}\n    @public\n    @hide\n   */\n  inverseFor(association) {\n    return (\n      this._explicitInverseFor(association) ||\n      this._implicitInverseFor(association)\n    );\n  }\n\n  /**\n    Finds the inverse for an association that explicity defines it's inverse\n\n    @private\n    @hide\n  */\n  _explicitInverseFor(association) {\n    this._checkForMultipleExplicitInverses(association);\n\n    let associations = this._schema.associationsFor(this.modelName);\n    let inverse = association.opts.inverse;\n    let candidate = inverse ? associations[inverse] : null;\n    let matchingPolymorphic = candidate && candidate.isPolymorphic;\n    let matchingInverse =\n      candidate && candidate.modelName === association.ownerModelName;\n    let candidateInverse = candidate && candidate.opts.inverse;\n\n    if (candidateInverse && candidate.opts.inverse !== association.name) {\n      assert(\n        false,\n        `You specified an inverse of ${inverse} for ${association.name}, but it does not match ${candidate.modelName} ${candidate.name}'s inverse`\n      );\n    }\n\n    return matchingPolymorphic || matchingInverse ? candidate : null;\n  }\n\n  /**\n    Ensures multiple explicit inverses don't exist on the current model\n    for the given association.\n\n    TODO: move this to compile-time check\n\n    @private\n    @hide\n  */\n  _checkForMultipleExplicitInverses(association) {\n    let associations = this._schema.associationsFor(this.modelName);\n    let matchingExplicitInverses = Object.keys(associations).filter((key) => {\n      let candidate = associations[key];\n      let modelMatches = association.ownerModelName === candidate.modelName;\n      let inverseKeyMatches = association.name === candidate.opts.inverse;\n\n      return modelMatches && inverseKeyMatches;\n    });\n    assert(\n      matchingExplicitInverses.length <= 1,\n      `The ${this.modelName} model has defined multiple explicit inverse associations for the ${association.ownerModelName}.${association.name} association.`\n    );\n  }\n\n  /**\n    Finds if there is an inverse for an association that does not\n    explicitly define one.\n\n    @private\n    @hide\n  */\n  _implicitInverseFor(association) {\n    let associations = this._schema.associationsFor(this.modelName);\n    let modelName = association.ownerModelName;\n\n    return values(associations)\n      .filter((candidate) => candidate.modelName === modelName)\n      .reduce((inverse, candidate) => {\n        let candidateInverse = candidate.opts.inverse;\n        let candidateIsImplicitInverse = candidateInverse === undefined;\n        let candidateIsExplicitInverse = candidateInverse === association.name;\n\n        let candidateMatches =\n          candidateIsImplicitInverse || candidateIsExplicitInverse;\n\n        if (candidateMatches) {\n          // Need to move this check to compile-time init\n          assert(\n            !inverse,\n            `The ${this.modelName} model has multiple possible inverse associations for the ${association.ownerModelName}.${association.name} association.`\n          );\n          inverse = candidate;\n        }\n\n        return inverse;\n      }, null);\n  }\n\n  /**\n    Returns whether this model has an inverse association for the given\n    model-type-association pair.\n\n    @method hasInverseFor\n    @param {String} modelName\n    @param {ORM/Association} association\n    @return {Boolean}\n    @public\n    @hide\n   */\n  hasInverseFor(association) {\n    return !!this.inverseFor(association);\n  }\n\n  /**\n    Used to check if models match each other. If models are saved, we check model type\n    and id, since they could have other non-persisted properties that are different.\n\n    @public\n    @hide\n  */\n  alreadyAssociatedWith(model, association) {\n    let associatedModelOrCollection = this[association.name];\n\n    if (associatedModelOrCollection && model) {\n      if (associatedModelOrCollection instanceof Model) {\n        if (associatedModelOrCollection.isSaved() && model.isSaved()) {\n          return associatedModelOrCollection.toString() === model.toString();\n        } else {\n          return associatedModelOrCollection === model;\n        }\n      } else {\n        return associatedModelOrCollection.includes(model);\n      }\n    }\n  }\n\n  associate(model, association) {\n    if (this.alreadyAssociatedWith(model, association)) {\n      return;\n    }\n\n    let { name } = association;\n\n    if (association instanceof HasMany) {\n      if (!this[name].includes(model)) {\n        this[name].add(model);\n      }\n    } else {\n      this[name] = model;\n    }\n  }\n\n  disassociate(model, association) {\n    let fk = association.getForeignKey();\n\n    if (association instanceof HasMany) {\n      let i;\n      if (association.isPolymorphic) {\n        let found = this[fk].find(\n          ({ type, id }) => type === model.modelName && id === model.id\n        );\n        i = found && this[fk].indexOf(found);\n      } else {\n        i = this[fk].map((key) => key.toString()).indexOf(model.id.toString());\n      }\n\n      if (i > -1) {\n        this.attrs[fk].splice(i, 1);\n      }\n    } else {\n      this.attrs[fk] = null;\n    }\n  }\n\n  /**\n    @hide\n  */\n  get isSaving() {\n    return this._schema.isSaving[this.toString()];\n  }\n\n  // Private\n  /**\n    model.attrs represents the persistable attributes, i.e. your db\n    table fields.\n    @method _setupAttr\n    @param attr\n    @param value\n    @private\n    @hide\n   */\n  _setupAttr(attr, value) {\n    const isAssociation =\n      this.associationKeys.has(attr) || this.associationIdKeys.has(attr);\n\n    if (!isAssociation) {\n      this.attrs[attr] = value;\n      // define plain getter/setters for non-association keys\n      this._definePlainAttribute(attr);\n    }\n  }\n\n  /**\n    Define getter/setter for a plain attribute\n    @method _definePlainAttribute\n    @param attr\n    @private\n    @hide\n   */\n  _definePlainAttribute(attr) {\n    // Ensure the property hasn't already been defined\n    let existingProperty = Object.getOwnPropertyDescriptor(this, attr);\n    if (existingProperty && existingProperty.get) {\n      return;\n    }\n\n    // Ensure the attribute is on the attrs hash\n    if (!Object.prototype.hasOwnProperty.call(this.attrs, attr)) {\n      this.attrs[attr] = null;\n    }\n\n    // Define the getter/setter\n    Object.defineProperty(this, attr, {\n      get() {\n        return this.attrs[attr];\n      },\n      set(val) {\n        this.attrs[attr] = val;\n      },\n    });\n  }\n\n  /**\n    Foreign keys get set on attrs directly (to avoid potential recursion), but\n    model references use the setter.\n   *\n    We validate foreign keys during instantiation.\n   *\n    @method _setupRelationship\n    @param attr\n    @param value\n    @private\n    @hide\n   */\n  _setupRelationship(attr, value) {\n    const isFk = this.associationIdKeys.has(attr) || this.fks.includes(attr);\n    const isAssociation = this.associationKeys.has(attr);\n\n    if (isFk) {\n      if (value !== undefined && value !== null) {\n        this._validateForeignKeyExistsInDatabase(attr, value);\n      }\n      this.attrs[attr] = value;\n    }\n    if (isAssociation) {\n      this[attr] = value;\n    }\n  }\n\n  /**\n    @method _validateAttr\n    @private\n    @hide\n   */\n  _validateAttr(key, value) {\n    // Verify attr passed in for associations is actually an association\n    {\n      if (this.associationKeys.has(key)) {\n        let association = this.associationFor(key);\n        let isNull = value === null;\n\n        if (association instanceof HasMany) {\n          let isCollection =\n            value instanceof Collection ||\n            value instanceof PolymorphicCollection;\n          let isArrayOfModels =\n            Array.isArray(value) &&\n            value.every((item) => item instanceof Model);\n\n          assert(\n            isCollection || isArrayOfModels || isNull,\n            `You're trying to create a ${this.modelName} model and you passed in \"${value}\" under the ${key} key, but that key is a HasMany relationship. You must pass in a Collection, PolymorphicCollection, array of Models, or null.`\n          );\n        } else if (association instanceof BelongsTo) {\n          assert(\n            value instanceof Model || isNull,\n            `You're trying to create a ${this.modelName} model and you passed in \"${value}\" under the ${key} key, but that key is a BelongsTo relationship. You must pass in a Model or null.`\n          );\n        }\n      }\n    }\n\n    // Verify attrs passed in for association foreign keys are actually fks\n    {\n      if (this.associationIdKeys.has(key)) {\n        if (key.endsWith(\"Ids\")) {\n          let isArray = Array.isArray(value);\n          let isNull = value === null;\n          assert(\n            isArray || isNull,\n            `You're trying to create a ${this.modelName} model and you passed in \"${value}\" under the ${key} key, but that key is a foreign key for a HasMany relationship. You must pass in an array of ids or null.`\n          );\n        }\n      }\n    }\n\n    // Verify no undefined associations are passed in\n    {\n      let isModelOrCollection =\n        value instanceof Model ||\n        value instanceof Collection ||\n        value instanceof PolymorphicCollection;\n      let isArrayOfModels =\n        Array.isArray(value) &&\n        value.length &&\n        value.every((item) => item instanceof Model);\n\n      if (isModelOrCollection || isArrayOfModels) {\n        let modelOrCollection = value;\n\n        assert(\n          this.associationKeys.has(key),\n          `You're trying to create a ${\n            this.modelName\n          } model and you passed in a ${modelOrCollection.toString()} under the ${key} key, but you haven't defined that key as an association on your model.`\n        );\n      }\n    }\n  }\n\n  /**\n    Originally we validated this via association.setId method, but it triggered\n    recursion. That method is designed for updating an existing model's ID so\n    this method is needed during instantiation.\n   *\n    @method _validateForeignKeyExistsInDatabase\n    @private\n    @hide\n   */\n  _validateForeignKeyExistsInDatabase(foreignKeyName, foreignKeys) {\n    if (Array.isArray(foreignKeys)) {\n      let association = this.hasManyAssociationFks[foreignKeyName];\n\n      let found;\n      if (association.isPolymorphic) {\n        found = foreignKeys.map(({ type, id }) => {\n          return this._schema.db[\n            this._schema.toInternalCollectionName(type)\n          ].find(id);\n        });\n        found = compact(found);\n      } else {\n        found =\n          this._schema.db[\n            this._schema.toInternalCollectionName(association.modelName)\n          ].find(foreignKeys);\n      }\n\n      let foreignKeyLabel = association.isPolymorphic\n        ? foreignKeys.map((fk) => `${fk.type}:${fk.id}`).join(\",\")\n        : foreignKeys;\n      assert(\n        found.length === foreignKeys.length,\n        `You're instantiating a ${this.modelName} that has a ${foreignKeyName} of ${foreignKeyLabel}, but some of those records don't exist in the database.`\n      );\n    } else {\n      let association = this.belongsToAssociationFks[foreignKeyName];\n\n      let found;\n      if (association.isPolymorphic) {\n        found = this._schema.db[\n          this._schema.toInternalCollectionName(foreignKeys.type)\n        ].find(foreignKeys.id);\n      } else {\n        found =\n          this._schema.db[\n            this._schema.toInternalCollectionName(association.modelName)\n          ].find(foreignKeys);\n      }\n\n      let foreignKeyLabel = association.isPolymorphic\n        ? `${foreignKeys.type}:${foreignKeys.id}`\n        : foreignKeys;\n      assert(\n        found,\n        `You're instantiating a ${this.modelName} that has a ${foreignKeyName} of ${foreignKeyLabel}, but that record doesn't exist in the database.`\n      );\n    }\n  }\n\n  /**\n    Update associated children when saving a collection\n   *\n    @method _saveAssociations\n    @private\n    @hide\n   */\n  _saveAssociations() {\n    this._saveBelongsToAssociations();\n    this._saveHasManyAssociations();\n  }\n\n  _saveBelongsToAssociations() {\n    values(this.belongsToAssociations).forEach((association) => {\n      this._disassociateFromOldInverses(association);\n      this._saveNewAssociates(association);\n      this._associateWithNewInverses(association);\n    });\n  }\n\n  _saveHasManyAssociations() {\n    values(this.hasManyAssociations).forEach((association) => {\n      this._disassociateFromOldInverses(association);\n      this._saveNewAssociates(association);\n      this._associateWithNewInverses(association);\n    });\n  }\n\n  _disassociateFromOldInverses(association) {\n    if (association instanceof HasMany) {\n      this._disassociateFromHasManyInverses(association);\n    } else if (association instanceof BelongsTo) {\n      this._disassociateFromBelongsToInverse(association);\n    }\n  }\n\n  // Disassociate currently persisted models that are no longer associated\n  _disassociateFromHasManyInverses(association) {\n    let fk = association.getForeignKey();\n    let tempAssociation =\n      this._tempAssociations && this._tempAssociations[association.name];\n    let associateIds = this.attrs[fk];\n\n    if (tempAssociation && associateIds) {\n      let models;\n      if (association.isPolymorphic) {\n        models = associateIds.map(({ type, id }) => {\n          return this._schema[this._schema.toCollectionName(type)].find(id);\n        });\n      } else {\n        // TODO: prob should initialize hasMany fks with []\n        models = this._schema[\n          this._schema.toCollectionName(association.modelName)\n        ].find(associateIds || []).models;\n      }\n\n      models\n        .filter(\n          (associate) =>\n            // filter out models that are already being saved\n            !associate.isSaving &&\n            // filter out models that will still be associated\n            !tempAssociation.includes(associate) &&\n            associate.hasInverseFor(association)\n        )\n        .forEach((associate) => {\n          let inverse = associate.inverseFor(association);\n\n          associate.disassociate(this, inverse);\n          associate.save();\n        });\n    }\n  }\n\n  /*\n    Disassociate currently persisted models that are no longer associated.\n\n    Example:\n\n      post: Model.extend({\n        comments: hasMany()\n      }),\n\n      comment: Model.extend({\n        post: belongsTo()\n      })\n\n    Assume `this` is comment:1. When saving, if comment:1 is no longer\n    associated with post:1, we need to remove comment:1 from post:1.comments.\n    In this example `association` would be `comment.post`.\n  */\n  _disassociateFromBelongsToInverse(association) {\n    let fk = association.getForeignKey();\n    let tempAssociation =\n      this._tempAssociations && this._tempAssociations[association.name];\n    let associateId = this.attrs[fk];\n\n    if (tempAssociation !== undefined && associateId) {\n      let associate;\n      if (association.isPolymorphic) {\n        associate = this._schema[\n          this._schema.toCollectionName(associateId.type)\n        ].find(associateId.id);\n      } else {\n        associate =\n          this._schema[\n            this._schema.toCollectionName(association.modelName)\n          ].find(associateId);\n      }\n\n      if (associate.hasInverseFor(association)) {\n        let inverse = associate.inverseFor(association);\n\n        associate.disassociate(this, inverse);\n        associate._updateInDb(associate.attrs);\n      }\n    }\n  }\n\n  // Find all other models that depend on me and update their foreign keys\n  _disassociateFromDependents() {\n    this._schema\n      .dependentAssociationsFor(this.modelName)\n      .forEach((association) => {\n        association.disassociateAllDependentsFromTarget(this);\n      });\n  }\n\n  _saveNewAssociates(association) {\n    let fk = association.getForeignKey();\n    let tempAssociate =\n      this._tempAssociations && this._tempAssociations[association.name];\n\n    if (tempAssociate !== undefined) {\n      this.__isSavingNewChildren = true;\n      delete this._tempAssociations[association.name];\n\n      if (tempAssociate instanceof Collection) {\n        tempAssociate.models\n          .filter((model) => !model.isSaving)\n          .forEach((child) => {\n            child.save();\n          });\n\n        this._updateInDb({\n          [fk]: tempAssociate.models.map((child) => child.id),\n        });\n      } else if (tempAssociate instanceof PolymorphicCollection) {\n        tempAssociate.models\n          .filter((model) => !model.isSaving)\n          .forEach((child) => {\n            child.save();\n          });\n\n        this._updateInDb({\n          [fk]: tempAssociate.models.map((child) => {\n            return { type: child.modelName, id: child.id };\n          }),\n        });\n      } else {\n        // Clearing the association\n        if (tempAssociate === null) {\n          this._updateInDb({ [fk]: null });\n\n          // Self-referential\n        } else if (this.equals(tempAssociate)) {\n          this._updateInDb({ [fk]: this.id });\n\n          // Non-self-referential\n        } else if (!tempAssociate.isSaving) {\n          // Save the tempAssociate and update the local reference\n          tempAssociate.save();\n          this._syncTempAssociations(tempAssociate);\n\n          let fkValue;\n          if (association.isPolymorphic) {\n            fkValue = { id: tempAssociate.id, type: tempAssociate.modelName };\n          } else {\n            fkValue = tempAssociate.id;\n          }\n\n          this._updateInDb({ [fk]: fkValue });\n        }\n      }\n\n      this.__isSavingNewChildren = false;\n    }\n  }\n\n  /*\n    Step 3 in saving associations.\n\n    Example:\n\n      // initial state\n      post.author = steinbeck;\n\n      // new state\n      post.author = twain;\n\n       1. Disassociate from old inverse (remove post from steinbeck.posts)\n       2. Save new associates (if twain.isNew, save twain)\n    -> 3. Associate with new inverse (add post to twain.posts)\n  */\n  _associateWithNewInverses(association) {\n    if (!this.__isSavingNewChildren) {\n      let modelOrCollection = this[association.name];\n\n      if (modelOrCollection instanceof Model) {\n        this._associateModelWithInverse(modelOrCollection, association);\n      } else if (\n        modelOrCollection instanceof Collection ||\n        modelOrCollection instanceof PolymorphicCollection\n      ) {\n        modelOrCollection.models.forEach((model) => {\n          this._associateModelWithInverse(model, association);\n        });\n      }\n\n      delete this._tempAssociations[association.name];\n    }\n  }\n\n  _associateModelWithInverse(model, association) {\n    if (model.hasInverseFor(association)) {\n      let inverse = model.inverseFor(association);\n      let inverseFk = inverse.getForeignKey();\n\n      let ownerId = this.id;\n      if (inverse instanceof BelongsTo) {\n        let newId;\n        if (inverse.isPolymorphic) {\n          newId = { type: this.modelName, id: ownerId };\n        } else {\n          newId = ownerId;\n        }\n        this._schema.db[\n          this._schema.toInternalCollectionName(model.modelName)\n        ].update(model.id, { [inverseFk]: newId });\n      } else {\n        let inverseCollection =\n          this._schema.db[\n            this._schema.toInternalCollectionName(model.modelName)\n          ];\n        let currentIdsForInverse =\n          inverseCollection.find(model.id)[inverse.getForeignKey()] || [];\n        let newIdsForInverse = Object.assign([], currentIdsForInverse);\n        let newId, alreadyAssociatedWith;\n\n        if (inverse.isPolymorphic) {\n          newId = { type: this.modelName, id: ownerId };\n          alreadyAssociatedWith = newIdsForInverse.some(\n            (key) => key.type == this.modelName && key.id == ownerId\n          );\n        } else {\n          newId = ownerId;\n          alreadyAssociatedWith = newIdsForInverse.includes(ownerId);\n        }\n\n        if (!alreadyAssociatedWith) {\n          newIdsForInverse.push(newId);\n        }\n\n        inverseCollection.update(model.id, { [inverseFk]: newIdsForInverse });\n      }\n    }\n  }\n\n  // Used to update data directly, since #save and #update can retrigger saves,\n  // which can cause cycles with associations.\n  _updateInDb(attrs) {\n    this.attrs = this._schema.db[\n      this._schema.toInternalCollectionName(this.modelName)\n    ].update(this.attrs.id, attrs);\n  }\n\n  /*\n  Super gnarly: after we save this tempAssociate, we we need to through\n  all other tempAssociates for a reference to this same model, and\n  update it. Otherwise those other references are stale, which could\n  cause a bug when they are subsequently saved.\n\n  This only works for belongsTo right now, should add hasMany logic to it.\n\n  See issue #1613: https://github.com/samselikoff/ember-cli-mirage/pull/1613\n  */\n  _syncTempAssociations(tempAssociate) {\n    Object.keys(this._tempAssociations).forEach((key) => {\n      if (\n        this._tempAssociations[key] &&\n        this._tempAssociations[key].toString() === tempAssociate.toString()\n      ) {\n        this._tempAssociations[key] = tempAssociate;\n      }\n    });\n  }\n\n  /**\n    Simple string representation of the model and id.\n\n    ```js\n    let post = blogPosts.find(1);\n    post.toString(); // \"model:blogPost:1\"\n    ```\n\n    @method toString\n    @return {String}\n    @public\n  */\n  toString() {\n    let idLabel = this.id ? `(${this.id})` : \"\";\n\n    return `model:${this.modelName}${idLabel}`;\n  }\n\n  /**\n    Checks the equality of this model and the passed-in model\n   *\n    @method equals\n    @return boolean\n    @public\n    @hide\n   */\n  equals(model) {\n    return this.toString() === model.toString();\n  }\n}\n\nModel.extend = extend;\nModel.findBelongsToAssociation = function (associationType) {\n  return this.prototype.belongsToAssociations[associationType];\n};\n\nexport default Model;\n","import Model from \"./orm/model\";\nimport Collection from \"./orm/collection\";\nimport PolymorphicCollection from \"./orm/polymorphic-collection\";\nimport extend from \"./utils/extend\";\nimport { camelize } from \"./utils/inflector\";\nimport assert from \"./assert\";\nimport isFunction from \"lodash/isFunction\";\nimport isEmpty from \"lodash/isEmpty\";\nimport get from \"lodash/get\";\nimport flatten from \"lodash/flatten\";\nimport compact from \"lodash/compact\";\nimport uniqBy from \"lodash/uniqBy\";\n\n/**\n  Serializers are responsible for formatting your route handler's response.\n\n  The application serializer will apply to every response. To make specific customizations, define per-model serializers.\n\n  ```js\n  import { createServer, RestSerializer } from 'miragejs';\n\n  createServer({\n    serializers: {\n      application: RestSerializer,\n      user: RestSerializer.extend({\n        // user-specific customizations\n      })\n    }\n  })\n  ```\n\n  Any Model or Collection returned from a route handler will pass through the serializer layer. Highest priority will be given to a model-specific serializer, then the application serializer, then the default serializer.\n\n  Mirage ships with three named serializers:\n\n  - **JSONAPISerializer**, to simulate JSON:API compliant API servers:\n\n    ```js\n    import { createServer, JSONAPISerializer } from 'miragejs';\n\n    createServer({\n      serializers: {\n        application: JSONAPISerializer\n      }\n    })\n    ```\n\n  - **ActiveModelSerializer**, to mock Rails APIs that use AMS-style responses:\n\n    ```js\n    import { createServer, ActiveModelSerializer } from 'miragejs';\n\n    createServer({\n      serializers: {\n        application: ActiveModelSerializer\n      }\n    })\n    ```\n\n  - **RestSerializer**, a good starting point for many generic REST APIs:\n\n    ```js\n    import { createServer, RestSerializer } from 'miragejs';\n\n    createServer({\n      serializers: {\n        application: RestSerializer\n      }\n    })\n    ```\n\n  Additionally, Mirage has a basic Serializer class which you can customize using the hooks documented below:\n\n  ```js\n  import { createServer, Serializer } from 'miragejs';\n\n  createServer({\n    serializers: {\n      application: Serializer\n    }\n  })\n  ```\n\n  When writing model-specific serializers, remember to extend from your application serializer so shared logic is used by your model-specific classes:\n\n  ```js\n  import { createServer, Serializer } from 'miragejs';\n\n  const ApplicationSerializer = Serializer.extend()\n\n  createServer({\n    serializers: {\n      application: ApplicationSerializer,\n      blogPost: ApplicationSerializer.extend({\n        include: ['comments']\n      })\n    }\n  })\n  ```\n\n  @class Serializer\n  @constructor\n  @public\n*/\nclass Serializer {\n  constructor(registry, type, request = {}) {\n    this.registry = registry;\n    this.type = type;\n    this.request = request;\n\n    /**\n      Use this property on a model serializer to whitelist attributes that will be used in your JSON payload.\n\n      For example, if you had a `blog-post` model in your database that looked like\n\n      ```\n      {\n        id: 1,\n        title: 'Lorem ipsum',\n        createdAt: '2014-01-01 10:00:00',\n        updatedAt: '2014-01-03 11:42:12'\n      }\n      ```\n\n      and you just wanted `id` and `title`, you could write\n\n      ```js\n      Serializer.extend({\n        attrs: ['id', 'title']\n      });\n      ```\n\n      and the payload would look like\n\n      ```\n      {\n        id: 1,\n        title: 'Lorem ipsum'\n      }\n      ```\n\n      @property attrs\n      @public\n    */\n    this.attrs = this.attrs || undefined; // this is just here so I can add the doc comment. Better way?\n\n    /**\n      Use this property on a model serializer to specify related models you'd like to include in your JSON payload. (These can be considered default server-side includes.)\n\n      For example, if you had an `author` with many `blog-post`s and you wanted to sideload these, specify so in the `include` key:\n\n      ```js\n      createServer({\n        models: {\n          author: Model.extend({\n            blogPosts: hasMany()\n          })\n        },\n        serializers: {\n          author: Serializer.extend({\n            include: ['blogPosts']\n          });\n        }\n      })\n      ```\n\n      Now a response to a request for an author would look like this:\n\n      ```\n      GET /authors/1\n\n      {\n        author: {\n          id: 1,\n          name: 'Link',\n          blogPostIds: [1, 2]\n        },\n        blogPosts: [\n          {id: 1, authorId: 1, title: 'Lorem'},\n          {id: 2, authorId: 1, title: 'Ipsum'}\n        ]\n      }\n      ```\n\n      You can also define `include` as a function so it can be determined dynamically.\n      \n      For example, you could conditionally include a relationship based on an `include` query parameter:\n\n      ```js\n      // Include blog posts for a GET to /authors/1?include=blogPosts\n      \n      Serializer.extend({\n        include: function(request) {\n          if (request.queryParams.include === \"blogPosts\") {\n            return ['blogPosts'];\n          } else {\n            return [];\n          }\n        }\n      });\n      ```\n\n      **Query param includes for JSONAPISerializer**\n\n      The JSONAPISerializer supports the use of `include` query parameter to return compound documents out of the box.\n\n      For example, if your app makes the following request\n\n      ```\n      GET /api/authors?include=blogPosts\n      ```\n\n      the `JSONAPISerializer` will inspect the query params of the request, see that the blogPosts relationship is present, and then proceed as if this relationship was specified directly in the include: [] array on the serializer itself.\n\n      Note that, in accordance with the spec, Mirage gives precedence to an ?include query param over a default include: [] array that you might have specified directly on the serializer. Default includes will still be in effect, however, if a request does not have an ?include query param.\n\n      Also note that default includes specified with the `include: []` array can only take a single model; they cannot take dot-separated paths to nested relationships.\n\n      If you'd like to set a default dot-separated (nested) include path for a resource, you have to do it at the route level by setting a default value for `request.queryParams`:\n\n      ```js\n      this.get('/users', function(schema, request) => {\n        request.queryParams = request.queryParams || {};\n        if (!request.queryParams.include) {\n          request.queryParams.include = 'blog-posts.comments';\n        }\n\n        // rest of route handler logic\n      });\n      ```\n\n      @property include\n      @public\n    */\n    this.include = this.include || []; // this is just here so I can add the doc comment. Better way?\n\n    /**\n      Set whether your JSON response should have a root key in it.\n\n      *Doesn't apply to JSONAPISerializer.*\n\n      Defaults to true, so a request for an author looks like:\n\n      ```\n      GET /authors/1\n\n      {\n        author: {\n          id: 1,\n          name: 'Link'\n        }\n      }\n      ```\n\n      Setting `root` to false disables this:\n\n      ```js\n      Serializer.extend({\n        root: false\n      });\n      ```\n\n      Now the response looks like:\n\n      ```\n      GET /authors/1\n\n      {\n        id: 1,\n        name: 'Link'\n      }\n      ```\n\n      @property root\n      @public\n    */\n    this.root = this.root || undefined; // this is just here so I can add the doc comment. Better way?\n\n    /**\n      Set whether related models should be embedded or sideloaded.\n\n      *Doesn't apply to JSONAPISerializer.*\n\n      By default this false, so relationships are sideloaded:\n\n      ```\n      GET /authors/1\n\n      {\n        author: {\n          id: 1,\n          name: 'Link',\n          blogPostIds: [1, 2]\n        },\n        blogPosts: [\n          { id: 1, authorId: 1, title: 'Lorem' },\n          { id: 2, authorId: 1, title: 'Ipsum' }\n        ]\n      }\n      ```\n\n      Setting `embed` to true will embed all related records:\n\n      ```js\n      Serializer.extend({\n        embed: true\n      });\n      ```\n\n      Now the response looks like:\n\n      ```\n      GET /authors/1\n\n      {\n        author: {\n          id: 1,\n          name: 'Link',\n          blogPosts: [\n            { id: 1, authorId: 1, title: 'Lorem' },\n            { id: 2, authorId: 1, title: 'Ipsum' }\n          ]\n        }\n      }\n      ```\n\n      You can also define `embed` as a function so it can be determined dynamically.\n    */\n    this.embed = this.embed || undefined; // this is just here so I can add the doc comment. Better way?\n    this._embedFn = isFunction(this.embed) ? this.embed : () => !!this.embed;\n\n    /**\n      Use this to define how your serializer handles serializing relationship keys. It can take one of three values:\n\n      - `included`, which is the default, will serialize the ids of a relationship if that relationship is included (sideloaded) along with the model or collection in the response\n      - `always` will always serialize the ids of all relationships for the model or collection in the response\n      - `never` will never serialize the ids of relationships for the model or collection in the response\n\n      @property serializeIds\n      @public\n    */\n    this.serializeIds = this.serializeIds || undefined; // this is just here so I can add the doc comment. Better way?\n\n    /**\n      Primary Key name of the model\n\n      Defaults to 'id', so a request for an author looks like:\n\n      ```\n      GET /authors/1\n\n      {\n        author: {\n          id: 1,\n          name: 'Link'\n        }\n      }\n      ```\n\n      Setting `primaryKey` to 'authorId changes this:\n\n      ```js\n      Serializer.extend({\n        primaryKey: 'authorId'\n      });\n      ```\n\n      Now the response looks like:\n\n      ```\n      GET /authors/1\n\n      {\n        author: {\n          authorId: 1,\n          name: 'Link'\n        }\n      }\n      ```\n\n      @property primaryKey\n      @public\n    */\n    this.primaryKey = this.primaryKey || undefined; // this is just here so I can add the doc comment. Better way?\n  }\n\n  /**\n    Override this method to implement your own custom serialize function. *response* is whatever was returned from your route handler, and *request* is the Pretender request object.\n\n    Returns a plain JavaScript object or array, which Mirage uses as the response data to your app's XHR request.\n\n    You can also override this method, call super, and manipulate the data before Mirage responds with it. This is a great place to add metadata, or for one-off operations that don't fit neatly into any of Mirage's other abstractions:\n\n    ```js\n    serialize(object, request) {\n      // This is how to call super, as Mirage borrows [Backbone's implementation of extend](http://backbonejs.org/#Model-extend)\n      let json = Serializer.prototype.serialize.apply(this, arguments);\n\n      // Add metadata, sort parts of the response, etc.\n\n      return json;\n    }\n    ```\n\n    @param primaryResource\n    @param request\n    @return { Object } the json response\n   */\n  serialize(primaryResource /* , request */) {\n    this.primaryResource = primaryResource;\n\n    return this.buildPayload(primaryResource);\n  }\n\n  /**\n    This method is used by the POST and PUT shorthands. These shorthands expect a valid JSON:API document as part of the request, so that they know how to create or update the appropriate resouce. The *normalize* method allows you to transform your request body into a JSON:API document, which lets you take advantage of the shorthands when you otherwise may not be able to.\n\n    Note that this method is a noop if you're using JSON:API already, since request payloads sent along with POST and PUT requests will already be in the correct format.\n\n    Take a look at the included `ActiveModelSerializer`'s normalize method for an example.\n\n    @method normalize\n    @param json\n    @public\n   */\n  normalize(json) {\n    return json;\n  }\n\n  buildPayload(primaryResource, toInclude, didSerialize, json) {\n    if (!primaryResource && isEmpty(toInclude)) {\n      return json;\n    } else if (primaryResource) {\n      let [resourceHash, newIncludes] =\n        this.getHashForPrimaryResource(primaryResource);\n      let newDidSerialize = this.isCollection(primaryResource)\n        ? primaryResource.models\n        : [primaryResource];\n\n      return this.buildPayload(\n        undefined,\n        newIncludes,\n        newDidSerialize,\n        resourceHash\n      );\n    } else {\n      let nextIncludedResource = toInclude.shift();\n      let [resourceHash, newIncludes] =\n        this.getHashForIncludedResource(nextIncludedResource);\n\n      let newToInclude = newIncludes\n        .filter((resource) => {\n          return !didSerialize\n            .map((m) => m.toString())\n            .includes(resource.toString());\n        })\n        .concat(toInclude);\n      let newDidSerialize = (\n        this.isCollection(nextIncludedResource)\n          ? nextIncludedResource.models\n          : [nextIncludedResource]\n      ).concat(didSerialize);\n      let newJson = this.mergePayloads(json, resourceHash);\n\n      return this.buildPayload(\n        undefined,\n        newToInclude,\n        newDidSerialize,\n        newJson\n      );\n    }\n  }\n\n  getHashForPrimaryResource(resource) {\n    let [hash, addToIncludes] = this.getHashForResource(resource);\n    let hashWithRoot;\n\n    if (this.root) {\n      assert(\n        !(resource instanceof PolymorphicCollection),\n        `The base Serializer class cannot serialize a top-level PolymorphicCollection when root is true, since PolymorphicCollections have no type.`\n      );\n\n      let serializer = this.serializerFor(resource.modelName);\n      let rootKey = serializer.keyForResource(resource);\n      hashWithRoot = { [rootKey]: hash };\n    } else {\n      hashWithRoot = hash;\n    }\n\n    return [hashWithRoot, addToIncludes];\n  }\n\n  getHashForIncludedResource(resource) {\n    let hashWithRoot, addToIncludes;\n\n    if (resource instanceof PolymorphicCollection) {\n      hashWithRoot = {};\n      addToIncludes = resource.models;\n    } else {\n      let serializer = this.serializerFor(resource.modelName);\n      let [hash, newModels] = serializer.getHashForResource(resource);\n\n      // Included resources always have a root, and are always pushed to an array.\n      let rootKey = serializer.keyForRelationship(resource.modelName);\n      hashWithRoot = Array.isArray(hash)\n        ? { [rootKey]: hash }\n        : { [rootKey]: [hash] };\n      addToIncludes = newModels;\n    }\n\n    return [hashWithRoot, addToIncludes];\n  }\n\n  getHashForResource(\n    resource,\n    removeForeignKeys = false,\n    didSerialize = {},\n    lookupSerializer = false\n  ) {\n    let serializer = this;\n    let hash;\n\n    // PolymorphicCollection lacks a modelName, but is dealt with in the map\n    // by looking up the serializer on a per-model basis\n    if (lookupSerializer && resource.modelName) {\n      serializer = this.serializerFor(resource.modelName);\n    }\n\n    if (this.isModel(resource)) {\n      hash = serializer._hashForModel(\n        resource,\n        removeForeignKeys,\n        didSerialize\n      );\n    } else {\n      hash = resource.models.map((m) => {\n        let modelSerializer = serializer;\n\n        if (!modelSerializer) {\n          // Can't get here if lookupSerializer is false, so look it up\n          modelSerializer = this.serializerFor(m.modelName);\n        }\n\n        return modelSerializer._hashForModel(\n          m,\n          removeForeignKeys,\n          didSerialize\n        );\n      });\n    }\n\n    let addToIncludes = uniqBy(\n      compact(\n        flatten(\n          serializer.getKeysForIncluded().map((key) => {\n            if (this.isCollection(resource)) {\n              return resource.models.map((m) => m[key]);\n            } else {\n              return resource[key];\n            }\n          })\n        )\n      ),\n      (m) => m.toString()\n    );\n\n    return [hash, addToIncludes];\n  }\n\n  /*\n    Merges new resource hash into json. If json already has root key,\n    pushes value of resourceHash onto that key.\n\n    For example,\n\n        json = {\n          post: { id: 1, title: 'Lorem Ipsum', comment_ids: [1, 3] },\n          comments: [\n            { id: 1, text: 'foo' }\n          ]\n        };\n\n        resourceHash = {\n          comments: [\n            { id: 2, text: 'bar' }\n          ]\n        };\n\n    would yield\n\n        {\n          post: { id: 1, title: 'Lorem Ipsum', comment_ids: [1, 3] },\n          comments: [\n            { id: 1, text: 'foo' },\n            { id: 2, text: 'bar' }\n          ]\n        };\n\n  */\n  mergePayloads(json, resourceHash) {\n    let newJson;\n    let [resourceHashKey] = Object.keys(resourceHash);\n\n    if (json[resourceHashKey]) {\n      newJson = json;\n      newJson[resourceHashKey] = json[resourceHashKey].concat(\n        resourceHash[resourceHashKey]\n      );\n    } else {\n      newJson = Object.assign(json, resourceHash);\n    }\n\n    return newJson;\n  }\n\n  keyForResource(resource) {\n    let { modelName } = resource;\n    return this.isModel(resource)\n      ? this.keyForModel(modelName)\n      : this.keyForCollection(modelName);\n  }\n\n  /**\n    Used to define a custom key when serializing a primary model of modelName *modelName*. For example, the default Serializer will return something like the following:\n\n    ```\n    GET /blogPosts/1\n\n    {\n      blogPost: {\n        id: 1,\n        title: 'Lorem ipsum'\n      }\n    }\n    ```\n\n    If your API uses hyphenated keys, you could overwrite `keyForModel`:\n\n    ```js\n    // serializers/application.js\n    export default Serializer.extend({\n      keyForModel(modelName) {\n        return hyphenate(modelName);\n      }\n    });\n    ```\n\n    Now the response will look like\n\n    ```\n    {\n      'blog-post': {\n        id: 1,\n        title: 'Lorem ipsum'\n      }\n    }\n    ```\n\n    @method keyForModel\n    @param modelName\n    @public\n   */\n  keyForModel(modelName) {\n    return camelize(modelName);\n  }\n\n  /**\n    Used to customize the key when serializing a primary collection. By default this pluralizes the return value of `keyForModel`.\n\n    For example, by default the following request may look like:\n\n    ```\n    GET /blogPosts\n\n    {\n      blogPosts: [\n        {\n          id: 1,\n          title: 'Lorem ipsum'\n        },\n        ...\n      ]\n    }\n    ```\n\n    If your API hyphenates keys, you could overwrite `keyForCollection`:\n\n    ```js\n    // serializers/application.js\n    export default Serializer.extend({\n      keyForCollection(modelName) {\n        return this._container.inflector.pluralize(dasherize(modelName));\n      }\n    });\n    ```\n\n    Now the response would look like:\n\n    ```\n    {\n      'blog-posts': [\n        {\n          id: 1,\n          title: 'Lorem ipsum'\n        },\n        ...\n      ]\n    }\n    ```\n\n    @method keyForCollection\n    @param modelName\n    @public\n   */\n  keyForCollection(modelName) {\n    return this._container.inflector.pluralize(this.keyForModel(modelName));\n  }\n\n  _hashForModel(model, removeForeignKeys, didSerialize = {}) {\n    let attrs = this._attrsForModel(model);\n\n    if (removeForeignKeys) {\n      model.fks.forEach((fk) => {\n        delete attrs[fk];\n      });\n    }\n\n    if (this.embed) {\n      let newDidSerialize = Object.assign({}, didSerialize);\n      newDidSerialize[model.modelName] = newDidSerialize[model.modelName] || {};\n      newDidSerialize[model.modelName][model.id] = true;\n\n      this.getKeysForEmbedded().forEach((key) => {\n        let associatedResource = model[key];\n        if (\n          associatedResource &&\n          !get(\n            newDidSerialize,\n            `${associatedResource.modelName}.${associatedResource.id}`\n          )\n        ) {\n          let [associatedResourceHash] = this.getHashForResource(\n            associatedResource,\n            true,\n            newDidSerialize,\n            true\n          );\n          let formattedKey = this.keyForEmbeddedRelationship(key);\n          attrs[formattedKey] = associatedResourceHash;\n\n          if (this.isModel(associatedResource)) {\n            let fk = `${camelize(key)}Id`;\n            delete attrs[fk];\n          }\n        }\n      });\n    }\n\n    return this._maybeAddAssociationIds(model, attrs);\n  }\n\n  /**\n    @method _attrsForModel\n    @param model\n    @private\n    @hide\n   */\n  _attrsForModel(model) {\n    let attrs = {};\n\n    if (this.attrs) {\n      attrs = this.attrs.reduce((memo, attr) => {\n        memo[attr] = model[attr];\n        return memo;\n      }, {});\n    } else {\n      attrs = Object.assign(attrs, model.attrs);\n    }\n\n    // Remove fks\n    model.fks.forEach((key) => delete attrs[key]);\n\n    return this._formatAttributeKeys(attrs);\n  }\n\n  /**\n    @method _maybeAddAssociationIds\n    @param model\n    @param attrs\n    @private\n    @hide\n   */\n  _maybeAddAssociationIds(model, attrs) {\n    let newHash = Object.assign({}, attrs);\n\n    if (this.serializeIds === \"always\") {\n      [...model.associationKeys]\n        .filter((key) => !this._embedFn(key))\n        .forEach((key) => {\n          let resource = model[key];\n          let association = model.associationFor(key);\n\n          if (this.isCollection(resource)) {\n            let formattedKey = this.keyForRelationshipIds(key);\n            newHash[formattedKey] =\n              model[`${this._container.inflector.singularize(key)}Ids`];\n          } else if (this.isModel(resource) && association.isPolymorphic) {\n            let formattedTypeKey = this.keyForPolymorphicForeignKeyType(key);\n            let formattedIdKey = this.keyForPolymorphicForeignKeyId(key);\n\n            newHash[formattedTypeKey] = model[`${key}Id`].type;\n            newHash[formattedIdKey] = model[`${key}Id`].id;\n          } else if (resource) {\n            let formattedKey = this.keyForForeignKey(key);\n            newHash[formattedKey] = model[`${key}Id`];\n          }\n        });\n    } else if (this.serializeIds === \"included\") {\n      this.getKeysForIncluded().forEach((key) => {\n        let resource = model[key];\n        let association = model.associationFor(key);\n\n        if (this.isCollection(resource)) {\n          let formattedKey = this.keyForRelationshipIds(key);\n\n          newHash[formattedKey] =\n            model[`${this._container.inflector.singularize(key)}Ids`];\n        } else if (this.isModel(resource) && association.isPolymorphic) {\n          let formattedTypeKey = this.keyForPolymorphicForeignKeyType(key);\n          let formattedIdKey = this.keyForPolymorphicForeignKeyId(key);\n\n          newHash[formattedTypeKey] = model[`${key}Id`].type;\n          newHash[formattedIdKey] = model[`${key}Id`].id;\n        } else if (this.isModel(resource)) {\n          let formattedKey = this.keyForForeignKey(key);\n\n          newHash[formattedKey] = model[`${key}Id`];\n        }\n      });\n    }\n\n    return newHash;\n  }\n\n  /**\n    Used to customize how a model's attribute is formatted in your JSON payload.\n\n    By default, model attributes are camelCase:\n\n    ```\n    GET /authors/1\n\n    {\n      author: {\n        firstName: 'Link',\n        lastName: 'The WoodElf'\n      }\n    }\n    ```\n\n    If your API expects snake case, you could write the following:\n\n    ```js\n    // serializers/application.js\n    export default Serializer.extend({\n      keyForAttribute(attr) {\n        return underscore(attr);\n      }\n    });\n    ```\n\n    Now the response would look like:\n\n    ```\n    {\n      author: {\n        first_name: 'Link',\n        last_name: 'The WoodElf'\n      }\n    }\n    ```\n\n    @method keyForAttribute\n    @param attr\n    @public\n   */\n  keyForAttribute(attr) {\n    if (attr === \"id\") {\n      return this.keyForId();\n    }\n\n    return attr;\n  }\n\n  /**\n    Use this hook to format the key for collections related to this model. *modelName* is the named parameter for the relationship.\n\n    For example, if you're serializing an `author` that\n    sideloads many `blogPosts`, the default response will look like:\n\n    ```\n    {\n      author: {...},\n      blogPosts: [...]\n    }\n    ```\n\n    Overwrite `keyForRelationship` to format this key:\n\n    ```js\n    // serializers/application.js\n    export default Serializer.extend({\n      keyForRelationship(modelName) {\n        return underscore(modelName);\n      }\n    });\n    ```\n\n    Now the response will look like this:\n\n    ```\n    {\n      author: {...},\n      blog_posts: [...]\n    }\n    ```\n\n    @method keyForRelationship\n    @param modelName\n    @public\n   */\n  keyForRelationship(modelName) {\n    return camelize(this._container.inflector.pluralize(modelName));\n  }\n\n  /**\n    Like `keyForRelationship`, but for embedded relationships.\n\n    @method keyForEmbeddedRelationship\n    @param attributeName\n    @public\n   */\n  keyForEmbeddedRelationship(attributeName) {\n    return camelize(attributeName);\n  }\n\n  /**\n    Use this hook to format the key for the IDS of a `hasMany` relationship\n    in this model's JSON representation.\n\n    For example, if you're serializing an `author` that\n    sideloads many `blogPosts`, by default your `author` JSON would include a `blogPostIds` key:\n\n    ```\n    {\n      author: {\n        id: 1,\n        blogPostIds: [1, 2, 3]\n      },\n      blogPosts: [...]\n    }\n    ```\n\n    Overwrite `keyForRelationshipIds` to format this key:\n\n    ```js\n    // serializers/application.js\n    export default Serializer.extend({\n      keyForRelationshipIds(relationship) {\n        return underscore(relationship) + '_ids';\n      }\n    });\n    ```\n\n    Now the response will look like:\n\n    ```\n    {\n      author: {\n        id: 1,\n        blog_post_ids: [1, 2, 3]\n      },\n      blogPosts: [...]\n    }\n    ```\n\n    @method keyForRelationshipIds\n    @param modelName\n    @public\n   */\n  keyForRelationshipIds(relationshipName) {\n    return `${this._container.inflector.singularize(\n      camelize(relationshipName)\n    )}Ids`;\n  }\n\n  /**\n    Like `keyForRelationshipIds`, but for `belongsTo` relationships.\n\n    For example, if you're serializing a `blogPost` that sideloads one `author`,\n    your `blogPost` JSON would include a `authorId` key:\n\n    ```\n    {\n      blogPost: {\n        id: 1,\n        authorId: 1\n      },\n      author: ...\n    }\n    ```\n\n    Overwrite `keyForForeignKey` to format this key:\n\n    ```js\n    // serializers/application.js\n    export default Serializer.extend({\n      keyForForeignKey(relationshipName) {\n        return underscore(relationshipName) + '_id';\n      }\n    });\n    ```\n\n    Now the response will look like:\n\n    ```js\n    {\n      blogPost: {\n        id: 1,\n        author_id: 1\n      },\n      author: ...\n    }\n    ```\n\n    @method keyForForeignKey\n    @param relationshipName\n    @public\n   */\n  keyForForeignKey(relationshipName) {\n    return `${camelize(relationshipName)}Id`;\n  }\n\n  /**\n    Polymorphic relationships are represented with type-id pairs.\n\n    Given the following model\n\n    ```js\n    Model.extend({\n      commentable: belongsTo({ polymorphic: true })\n    });\n    ```\n\n    the default Serializer would produce\n\n    ```js\n    {\n      comment: {\n        id: 1,\n        commentableType: 'post',\n        commentableId: '1'\n      }\n    }\n    ```\n\n    This hook controls how the `id` field (`commentableId` in the above example)\n    is serialized. By default it camelizes the relationship and adds `Id` as a suffix.\n\n    @method keyForPolymorphicForeignKeyId\n    @param {String} relationshipName\n    @return {String}\n    @public\n  */\n  keyForPolymorphicForeignKeyId(relationshipName) {\n    return `${camelize(relationshipName)}Id`;\n  }\n\n  /**\n    Polymorphic relationships are represented with type-id pairs.\n\n    Given the following model\n\n    ```js\n    Model.extend({\n      commentable: belongsTo({ polymorphic: true })\n    });\n    ```\n\n    the default Serializer would produce\n\n    ```js\n    {\n      comment: {\n        id: 1,\n        commentableType: 'post',\n        commentableId: '1'\n      }\n    }\n    ```\n\n    This hook controls how the `type` field (`commentableType` in the above example)\n    is serialized. By default it camelizes the relationship and adds `Type` as a suffix.\n\n    @method keyForPolymorphicForeignKeyType\n    @param {String} relationshipName\n    @return {String}\n    @public\n  */\n  keyForPolymorphicForeignKeyType(relationshipName) {\n    return `${camelize(relationshipName)}Type`;\n  }\n\n  /**\n    @method isModel\n    @param object\n    @return {Boolean}\n    @public\n    @hide\n   */\n  isModel(object) {\n    return object instanceof Model;\n  }\n\n  /**\n    @method isCollection\n    @param object\n    @return {Boolean}\n    @public\n    @hide\n   */\n  isCollection(object) {\n    return (\n      object instanceof Collection || object instanceof PolymorphicCollection\n    );\n  }\n\n  /**\n    @method isModelOrCollection\n    @param object\n    @return {Boolean}\n    @public\n    @hide\n   */\n  isModelOrCollection(object) {\n    return this.isModel(object) || this.isCollection(object);\n  }\n\n  /**\n    @method serializerFor\n    @param type\n    @public\n    @hide\n   */\n  serializerFor(type) {\n    return this.registry.serializerFor(type);\n  }\n\n  getAssociationKeys() {\n    return isFunction(this.include)\n      ? this.include(this.request, this.primaryResource)\n      : this.include;\n  }\n\n  getKeysForEmbedded() {\n    return this.getAssociationKeys().filter((k) => this._embedFn(k));\n  }\n\n  getKeysForIncluded() {\n    return this.getAssociationKeys().filter((k) => !this._embedFn(k));\n  }\n\n  /**\n    A reference to the schema instance.\n\n    Useful to reference registered schema information, for example in a Serializer's include hook to include all a resource's associations:\n\n    ```js\n    Serializer.extend({\n      include(request, resource) {\n        return Object.keys(this.schema.associationsFor(resource.modelName));\n      }\n    })\n    ```\n\n    @property\n    @type {Object}\n    @public\n  */\n  get schema() {\n    return this.registry.schema;\n  }\n\n  /**\n    Used to customize how a model's primary key is formatted in your JSON payload.\n\n    By default, this is 'id'\n\n    ```\n    GET /authors/1\n\n    {\n      author: {\n        id: '1',\n        firstName: 'Link',\n        lastName: 'The WoodElf'\n      }\n    }\n    ```\n\n    If your API expects a different primary key, you could write the following:\n\n    ```js\n    // serializers/application.js\n    export default Serializer.extend({\n      keyForId() {\n        return 'authorId';\n      }\n    });\n    ```\n\n    Now the response would look like:\n\n    ```\n    {\n      author: {\n        authorId: '1',\n        firstName: 'Link',\n        lastName: 'The WoodElf'\n      }\n    }\n    ```\n\n    See the property `primaryKey` for a shorthand way of doing this on a model serializer\n\n    @method keyForId\n    @public\n   */\n  keyForId() {\n    return this.primaryKey;\n  }\n\n  /**\n    Used to customize how a model's primary key value is formatted in your JSON payload.\n\n    By default, the primary key is a string\n\n    ```\n    GET /authors/1\n\n    {\n      author: {\n        id: '1',\n        firstName: 'Link',\n        lastName: 'The WoodElf'\n      }\n    }\n    ```\n\n    If your API expects a integers, you could write the following:\n\n    ```js\n    // serializers/application.js\n    export default Serializer.extend({\n      valueForId(value) {\n        return parseInt(value);\n      }\n    });\n    ```\n\n    Now the response would look like:\n\n    ```\n    {\n      author: {\n        authorId: 1,\n        firstName: 'Link',\n        lastName: 'The WoodElf'\n      }\n    }\n    ```\n\n    @method valueForId\n    @param value\n    @public\n   */\n  valueForId(value) {\n    return value;\n  }\n\n  /**\n    @method _formatAttributeKeys\n    @param attrs\n    @private\n    @hide\n   */\n  _formatAttributeKeys(attrs) {\n    let formattedAttrs = {};\n\n    for (let key in attrs) {\n      let formattedValue = attrs[key];\n      if (key === \"id\") {\n        formattedValue = this.valueForId(formattedValue);\n      }\n\n      let formattedKey = this.keyForAttribute(key);\n      formattedAttrs[formattedKey] = formattedValue;\n    }\n\n    return formattedAttrs;\n  }\n\n  getCoalescedIds(/* request */) {}\n}\n\n// Defaults\nSerializer.prototype.include = [];\nSerializer.prototype.root = true;\nSerializer.prototype.embed = false;\nSerializer.prototype.primaryKey = \"id\";\nSerializer.prototype.serializeIds = \"included\"; // can be 'included', 'always', or 'never'\n\nSerializer.extend = extend;\n\nexport default Serializer;\n","import Serializer from \"../serializer\";\nimport { dasherize, camelize } from \"../utils/inflector\";\nimport assert from \"../assert\";\nimport get from \"lodash/get\";\nimport flatten from \"lodash/flatten\";\nimport compact from \"lodash/compact\";\nimport uniqBy from \"lodash/uniqBy\";\nimport isEmpty from \"lodash/isEmpty\";\n/**\n  The JSONAPISerializer. Subclass of Serializer.\n\n  @class JSONAPISerializer\n  @constructor\n  @public\n */\nclass JSONAPISerializer extends Serializer {\n  constructor() {\n    super(...arguments);\n\n    /**\n      By default, JSON:API's linkage data is only added for relationships that are being included in the current request.\n\n      That means given an `author` model with a `posts` relationship, a GET request to /authors/1 would return a JSON:API document with an empty `relationships` hash:\n\n      ```js\n      {\n        data: {\n          type: 'authors',\n          id: '1',\n          attributes: { ... }\n        }\n      }\n      ```\n\n      but a request to GET /authors/1?include=posts would have linkage data added (in addition to the included resources):\n\n      ```js\n      {\n        data: {\n          type: 'authors',\n          id: '1',\n          attributes: { ... },\n          relationships: {\n            data: [\n              { type: 'posts', id: '1' },\n              { type: 'posts', id: '2' },\n              { type: 'posts', id: '3' }\n            ]\n          }\n        },\n        included: [ ... ]\n      }\n      ```\n\n      To add the linkage data for all relationships, you could set `alwaysIncludeLinkageData` to `true`:\n\n      ```js\n      JSONAPISerializer.extend({\n        alwaysIncludeLinkageData: true\n      });\n      ```\n\n      Then, a GET to /authors/1 would respond with\n\n      ```js\n      {\n        data: {\n          type: 'authors',\n          id: '1',\n          attributes: { ... },\n          relationships: {\n            posts: {\n              data: [\n                { type: 'posts', id: '1' },\n                { type: 'posts', id: '2' },\n                { type: 'posts', id: '3' }\n              ]\n            }\n          }\n        }\n      }\n      ```\n\n      even though the related `posts` are not included in the same document.\n\n      You can also use the `links` method (on the Serializer base class) to add relationship links (which will always be added regardless of the relationship is being included document), or you could use `shouldIncludeLinkageData` for more granular control.\n\n      For more background on the behavior of this API, see [this blog post](http://www.ember-cli-mirage.com/blog/changing-mirages-default-linkage-data-behavior-1475).\n\n      @property alwaysIncludeLinkageData\n      @type {Boolean}\n      @public\n    */\n    this.alwaysIncludeLinkageData = this.alwaysIncludeLinkageData || undefined; // this is just here so I can add the doc comment. Better way?\n  }\n\n  // Don't think this is used?\n  keyForModel(modelName) {\n    return dasherize(modelName);\n  }\n\n  // Don't think this is used?\n  keyForCollection(modelName) {\n    return dasherize(modelName);\n  }\n\n  /**\n    Used to customize the key for an attribute. By default, compound attribute names are dasherized.\n\n    For example, the JSON:API document for a `post` model with a `commentCount` attribute would be:\n\n    ```js\n    {\n      data: {\n        id: 1,\n        type: 'posts',\n        attributes: {\n          'comment-count': 28\n        }\n      }\n    }\n    ```\n\n    @method keyForAttribute\n    @param {String} attr\n    @return {String}\n    @public\n  */\n  keyForAttribute(attr) {\n    return dasherize(attr);\n  }\n\n  /**\n    Used to customize the key for a relationships. By default, compound relationship names are dasherized.\n\n    For example, the JSON:API document for an `author` model with a `blogPosts` relationship would be:\n\n    ```js\n    {\n      data: {\n        id: 1,\n        type: 'author',\n        attributes: {\n          ...\n        },\n        relationships: {\n          'blog-posts': {\n            ...\n          }\n        }\n      }\n    }\n    ```\n\n    @method keyForRelationship\n    @param {String} key\n    @return {String}\n    @public\n  */\n  keyForRelationship(key) {\n    return dasherize(key);\n  }\n\n  /**\n    Use this hook to add top-level `links` data to JSON:API resource objects. The argument is the model being serialized.\n\n    ```js\n    // serializers/author.js\n    import { JSONAPISerializer } from 'miragejs';\n\n    export default JSONAPISerializer.extend({\n\n      links(author) {\n        return {\n          'posts': {\n            related: `/api/authors/${author.id}/posts`\n          }\n        };\n      }\n\n    });\n    ```\n\n    @method links\n    @param model\n  */\n  links() {}\n\n  getHashForPrimaryResource(resource) {\n    this._createRequestedIncludesGraph(resource);\n\n    let resourceHash = this.getHashForResource(resource);\n    let hashWithRoot = { data: resourceHash };\n    let addToIncludes = this.getAddToIncludesForResource(resource);\n\n    return [hashWithRoot, addToIncludes];\n  }\n\n  getHashForIncludedResource(resource) {\n    let serializer = this.serializerFor(resource.modelName);\n    let hash = serializer.getHashForResource(resource);\n    let hashWithRoot = { included: this.isModel(resource) ? [hash] : hash };\n    let addToIncludes = [];\n\n    if (!this.hasQueryParamIncludes()) {\n      addToIncludes = this.getAddToIncludesForResource(resource);\n    }\n\n    return [hashWithRoot, addToIncludes];\n  }\n\n  getHashForResource(resource) {\n    let hash;\n\n    if (this.isModel(resource)) {\n      hash = this.getResourceObjectForModel(resource);\n    } else {\n      hash = resource.models.map((m) => this.getResourceObjectForModel(m));\n    }\n\n    return hash;\n  }\n\n  /*\n    Returns a flat unique list of resources that need to be added to includes\n  */\n  getAddToIncludesForResource(resource) {\n    let relationshipPaths;\n\n    if (this.hasQueryParamIncludes()) {\n      relationshipPaths = this.getQueryParamIncludes();\n    } else {\n      let serializer = this.serializerFor(resource.modelName);\n      relationshipPaths = serializer.getKeysForIncluded();\n    }\n\n    return this.getAddToIncludesForResourceAndPaths(\n      resource,\n      relationshipPaths\n    );\n  }\n\n  getAddToIncludesForResourceAndPaths(resource, relationshipPaths) {\n    let includes = [];\n\n    relationshipPaths.forEach((path) => {\n      let relationshipNames = path.split(\".\");\n\n      let newIncludes = this.getIncludesForResourceAndPath(\n        resource,\n        ...relationshipNames\n      );\n      includes.push(newIncludes);\n    });\n\n    return uniqBy(compact(flatten(includes)), (m) => m.toString());\n  }\n\n  getIncludesForResourceAndPath(resource, ...names) {\n    let nameForCurrentResource = camelize(names.shift());\n    let includes = [];\n    let modelsToAdd = [];\n\n    if (this.isModel(resource)) {\n      let relationship = resource[nameForCurrentResource];\n\n      if (this.isModel(relationship)) {\n        modelsToAdd = [relationship];\n      } else if (this.isCollection(relationship)) {\n        modelsToAdd = relationship.models;\n      }\n    } else {\n      resource.models.forEach((model) => {\n        let relationship = model[nameForCurrentResource];\n\n        if (this.isModel(relationship)) {\n          modelsToAdd.push(relationship);\n        } else if (this.isCollection(relationship)) {\n          modelsToAdd = modelsToAdd.concat(relationship.models);\n        }\n      });\n    }\n\n    includes = includes.concat(modelsToAdd);\n\n    if (names.length) {\n      modelsToAdd.forEach((model) => {\n        includes = includes.concat(\n          this.getIncludesForResourceAndPath(model, ...names)\n        );\n      });\n    }\n\n    return includes;\n  }\n\n  getResourceObjectForModel(model) {\n    let attrs = this._attrsForModel(model, true);\n    delete attrs.id;\n\n    let hash = {\n      type: this.typeKeyForModel(model),\n      id: model.id,\n      attributes: attrs,\n    };\n\n    return this._maybeAddRelationshipsToResourceObjectForModel(hash, model);\n  }\n\n  _maybeAddRelationshipsToResourceObjectForModel(hash, model) {\n    const relationships = {};\n\n    model.associationKeys.forEach((key) => {\n      let relationship = model[key];\n      let relationshipKey = this.keyForRelationship(key);\n      let relationshipHash = {};\n\n      if (this.hasLinksForRelationship(model, key)) {\n        let serializer = this.serializerFor(model.modelName);\n        let links = serializer.links(model);\n        relationshipHash.links = links[key];\n      }\n\n      if (\n        this.alwaysIncludeLinkageData ||\n        this.shouldIncludeLinkageData(key, model) ||\n        this._relationshipIsIncludedForModel(key, model)\n      ) {\n        let data = null;\n        if (this.isModel(relationship)) {\n          data = {\n            type: this.typeKeyForModel(relationship),\n            id: relationship.id,\n          };\n        } else if (this.isCollection(relationship)) {\n          data = relationship.models.map((model) => {\n            return {\n              type: this.typeKeyForModel(model),\n              id: model.id,\n            };\n          });\n        }\n        relationshipHash.data = data;\n      }\n\n      if (!isEmpty(relationshipHash)) {\n        relationships[relationshipKey] = relationshipHash;\n      }\n    });\n\n    if (!isEmpty(relationships)) {\n      hash.relationships = relationships;\n    }\n\n    return hash;\n  }\n\n  hasLinksForRelationship(model, relationshipKey) {\n    let serializer = this.serializerFor(model.modelName);\n    let links = serializer.links && serializer.links(model);\n\n    return links && links[relationshipKey] != null;\n  }\n\n  /*\n    This code (and a lot of this serializer) need to be re-worked according to\n    the graph logic...\n  */\n  _relationshipIsIncludedForModel(relationshipKey, model) {\n    if (this.hasQueryParamIncludes()) {\n      let graph = this.request._includesGraph;\n      let graphKey = this._graphKeyForModel(model);\n\n      // Find the resource in the graph\n      let graphResource;\n\n      // Check primary data\n      if (graph.data[graphKey]) {\n        graphResource = graph.data[graphKey];\n\n        // Check includes\n      } else if (\n        graph.included[this._container.inflector.pluralize(model.modelName)]\n      ) {\n        graphResource =\n          graph.included[this._container.inflector.pluralize(model.modelName)][\n            graphKey\n          ];\n      }\n\n      // If the model's in the graph, check if relationshipKey should be included\n      return (\n        graphResource &&\n        graphResource.relationships &&\n        Object.prototype.hasOwnProperty.call(\n          graphResource.relationships,\n          dasherize(relationshipKey)\n        )\n      );\n    } else {\n      let relationshipPaths = this.getKeysForIncluded();\n\n      return relationshipPaths.includes(relationshipKey);\n    }\n  }\n\n  /*\n    This is needed for _relationshipIsIncludedForModel - see the note there for\n    more background.\n\n    If/when we can refactor this serializer, the logic in this method would\n    probably be the basis for the new overall json/graph creation.\n  */\n  _createRequestedIncludesGraph(primaryResource, secondaryResource = null) {\n    let graph = {\n      data: {},\n    };\n\n    if (this.isModel(primaryResource)) {\n      let primaryResourceKey = this._graphKeyForModel(primaryResource);\n      graph.data[primaryResourceKey] = {};\n\n      this._addPrimaryModelToRequestedIncludesGraph(graph, primaryResource);\n    } else if (this.isCollection(primaryResource)) {\n      primaryResource.models.forEach((model) => {\n        let primaryResourceKey = this._graphKeyForModel(model);\n        graph.data[primaryResourceKey] = {};\n\n        this._addPrimaryModelToRequestedIncludesGraph(graph, model);\n      });\n    }\n\n    // Hack :/ Need to think of a better palce to put this if\n    // refactoring json:api serializer.\n    this.request._includesGraph = graph;\n  }\n\n  _addPrimaryModelToRequestedIncludesGraph(graph, model) {\n    if (this.hasQueryParamIncludes()) {\n      let graphKey = this._graphKeyForModel(model);\n\n      this.getQueryParamIncludes()\n        .filter((item) => !!item.trim())\n        .forEach((includesPath) => {\n          // includesPath is post.comments, for example\n          graph.data[graphKey].relationships =\n            graph.data[graphKey].relationships || {};\n\n          let relationshipKeys = includesPath.split(\".\").map(dasherize);\n          let relationshipKey = relationshipKeys[0];\n          let graphRelationshipKey = relationshipKey;\n          let normalizedRelationshipKey = camelize(relationshipKey);\n          let hasAssociation = model.associationKeys.has(\n            normalizedRelationshipKey\n          );\n\n          assert(\n            hasAssociation,\n            `You tried to include \"${relationshipKey}\" with ${model} but no association named \"${normalizedRelationshipKey}\" is defined on the model.`\n          );\n\n          let relationship = model[normalizedRelationshipKey];\n          let relationshipData;\n\n          if (this.isModel(relationship)) {\n            relationshipData = this._graphKeyForModel(relationship);\n          } else if (this.isCollection(relationship)) {\n            relationshipData = relationship.models.map(this._graphKeyForModel);\n          } else {\n            relationshipData = null;\n          }\n\n          graph.data[graphKey].relationships[graphRelationshipKey] =\n            relationshipData;\n\n          if (relationship) {\n            this._addResourceToRequestedIncludesGraph(\n              graph,\n              relationship,\n              relationshipKeys.slice(1)\n            );\n          }\n        });\n    }\n  }\n\n  _addResourceToRequestedIncludesGraph(graph, resource, relationshipNames) {\n    graph.included = graph.included || {};\n\n    let models = this.isCollection(resource) ? resource.models : [resource];\n\n    models.forEach((model) => {\n      let collectionName = this._container.inflector.pluralize(model.modelName);\n      graph.included[collectionName] = graph.included[collectionName] || {};\n\n      this._addModelToRequestedIncludesGraph(graph, model, relationshipNames);\n    });\n  }\n\n  _addModelToRequestedIncludesGraph(graph, model, relationshipNames) {\n    let collectionName = this._container.inflector.pluralize(model.modelName);\n    let resourceKey = this._graphKeyForModel(model);\n    graph.included[collectionName][resourceKey] =\n      graph.included[collectionName][resourceKey] || {};\n\n    if (relationshipNames.length) {\n      this._addResourceRelationshipsToRequestedIncludesGraph(\n        graph,\n        collectionName,\n        resourceKey,\n        model,\n        relationshipNames\n      );\n    }\n  }\n\n  /*\n    Lot of the same logic here from _addPrimaryModelToRequestedIncludesGraph, could refactor & share\n  */\n  _addResourceRelationshipsToRequestedIncludesGraph(\n    graph,\n    collectionName,\n    resourceKey,\n    model,\n    relationshipNames\n  ) {\n    graph.included[collectionName][resourceKey].relationships =\n      graph.included[collectionName][resourceKey].relationships || {};\n\n    let relationshipName = relationshipNames[0];\n    let relationship = model[camelize(relationshipName)];\n    let relationshipData;\n\n    if (this.isModel(relationship)) {\n      relationshipData = this._graphKeyForModel(relationship);\n    } else if (this.isCollection(relationship)) {\n      relationshipData = relationship.models.map(this._graphKeyForModel);\n    }\n    graph.included[collectionName][resourceKey].relationships[\n      relationshipName\n    ] = relationshipData;\n\n    if (relationship) {\n      this._addResourceToRequestedIncludesGraph(\n        graph,\n        relationship,\n        relationshipNames.slice(1)\n      );\n    }\n  }\n\n  _graphKeyForModel(model) {\n    return `${model.modelName}:${model.id}`;\n  }\n\n  getQueryParamIncludes() {\n    let includes = get(this, \"request.queryParams.include\");\n\n    if (includes && !Array.isArray(includes)) {\n      includes = includes.split(\",\");\n    }\n\n    return includes;\n  }\n\n  hasQueryParamIncludes() {\n    return !!this.getQueryParamIncludes();\n  }\n\n  /**\n    Used to customize the `type` field of the document. By default, pluralizes and dasherizes the model's `modelName`.\n\n    For example, the JSON:API document for a `blogPost` model would be:\n\n    ```js\n    {\n      data: {\n        id: 1,\n        type: 'blog-posts'\n      }\n    }\n    ```\n\n    @method typeKeyForModel\n    @param {Model} model\n    @return {String}\n    @public\n  */\n  typeKeyForModel(model) {\n    return dasherize(this._container.inflector.pluralize(model.modelName));\n  }\n\n  getCoalescedIds(request) {\n    let ids = request.queryParams && request.queryParams[\"filter[id]\"];\n    if (typeof ids === \"string\") {\n      return ids.split(\",\");\n    }\n    return ids;\n  }\n\n  /**\n    Allows for per-relationship inclusion of linkage data. Use this when `alwaysIncludeLinkageData` is not granular enough.\n\n    ```js\n    export default JSONAPISerializer.extend({\n      shouldIncludeLinkageData(relationshipKey, model) {\n        if (relationshipKey === 'author' || relationshipKey === 'ghostWriter') {\n          return true;\n        }\n        return false;\n      }\n    });\n    ```\n\n    @method shouldIncludeLinkageData\n    @param {String} relationshipKey\n    @param {Model} model\n    @return {Boolean}\n    @public\n  */\n  shouldIncludeLinkageData(relationshipKey, model) {\n    return false;\n  }\n}\n\nJSONAPISerializer.prototype.alwaysIncludeLinkageData = false;\n\nexport default JSONAPISerializer;\n","import Model from \"./orm/model\";\nimport Collection from \"./orm/collection\";\nimport PolymorphicCollection from \"./orm/polymorphic-collection\";\nimport Serializer from \"./serializer\";\nimport JsonApiSerializer from \"./serializers/json-api-serializer\";\nimport { camelize } from \"./utils/inflector\";\nimport assert from \"./assert\";\n\n/**\n * @hide\n */\nexport default class SerializerRegistry {\n  constructor(schema, serializerMap = {}, server) {\n    this.schema = schema;\n    this._serializerMap = serializerMap;\n  }\n\n  normalize(payload, modelName) {\n    return this.serializerFor(modelName).normalize(payload);\n  }\n\n  serialize(response, request) {\n    this.request = request;\n\n    if (this._isModelOrCollection(response)) {\n      let serializer = this.serializerFor(response.modelName);\n\n      return serializer.serialize(response, request);\n    } else if (Array.isArray(response) && response.some(this._isCollection)) {\n      return response.reduce((json, collection) => {\n        let serializer = this.serializerFor(collection.modelName);\n\n        if (serializer.embed) {\n          json[this._container.inflector.pluralize(collection.modelName)] =\n            serializer.serialize(collection, request);\n        } else {\n          json = Object.assign(json, serializer.serialize(collection, request));\n        }\n\n        return json;\n      }, {});\n    } else {\n      return response;\n    }\n  }\n\n  serializerFor(type, { explicit = false } = {}) {\n    let SerializerForResponse =\n      type && this._serializerMap && this._serializerMap[camelize(type)];\n\n    if (explicit) {\n      assert(\n        !!SerializerForResponse,\n        `You passed in ${type} as an explicit serializer type but that serializer doesn't exist.`\n      );\n    } else {\n      SerializerForResponse =\n        SerializerForResponse || this._serializerMap.application || Serializer;\n\n      assert(\n        !SerializerForResponse ||\n          SerializerForResponse.prototype.embed ||\n          SerializerForResponse.prototype.root ||\n          new SerializerForResponse() instanceof JsonApiSerializer,\n        \"You cannot have a serializer that sideloads (embed: false) and disables the root (root: false).\"\n      );\n    }\n\n    return new SerializerForResponse(this, type, this.request);\n  }\n\n  _isModel(object) {\n    return object instanceof Model;\n  }\n\n  _isCollection(object) {\n    return (\n      object instanceof Collection || object instanceof PolymorphicCollection\n    );\n  }\n\n  _isModelOrCollection(object) {\n    return this._isModel(object) || this._isCollection(object);\n  }\n\n  registerSerializers(newSerializerMaps) {\n    let currentSerializerMap = this._serializerMap || {};\n    this._serializerMap = Object.assign(\n      currentSerializerMap,\n      newSerializerMaps\n    );\n  }\n\n  getCoalescedIds(request, modelName) {\n    return this.serializerFor(modelName).getCoalescedIds(request);\n  }\n}\n","import { camelize, dasherize } from \"../utils/inflector\";\nimport Association from \"./associations/association\";\nimport Collection from \"./collection\";\nimport assert from \"../assert\";\nimport forIn from \"lodash/forIn\";\n\nconst collectionNameCache = {};\nconst internalCollectionNameCache = {};\nconst modelNameCache = {};\n\n/**\n  The primary use of the `Schema` class is to use it to find Models and Collections via the `Model` class methods.\n\n  The `Schema` is most often accessed via the first parameter to a route handler:\n\n  ```js\n  this.get('posts', schema => {\n    return schema.posts.where({ isAdmin: false });\n  });\n  ```\n\n  It is also available from the `.schema` property of a `server` instance:\n\n  ```js\n  server.schema.users.create({ name: 'Yehuda' });\n  ```\n\n  To work with the Model or Collection returned from one of the methods below, refer to the instance methods in the API docs for the `Model` and `Collection` classes.\n\n  @class Schema\n  @constructor\n  @public\n */\nexport default class Schema {\n  constructor(db, modelsMap = {}) {\n    assert(db, \"A schema requires a db\");\n\n    /**\n      Returns Mirage's database. See the `Db` docs for the db's API.\n\n      @property db\n      @type {Object}\n      @public\n    */\n    this.db = db;\n    this._registry = {};\n    this._dependentAssociations = { polymorphic: [] };\n    this.registerModels(modelsMap);\n    this.isSaving = {}; // a hash of models that are being saved, used to avoid cycles\n  }\n\n  /**\n    @method registerModels\n    @param hash\n    @public\n    @hide\n   */\n  registerModels(hash = {}) {\n    forIn(hash, (model, key) => {\n      this.registerModel(key, hash[key]);\n    });\n  }\n\n  /**\n    @method registerModel\n    @param type\n    @param ModelClass\n    @public\n    @hide\n   */\n  registerModel(type, ModelClass) {\n    let camelizedModelName = camelize(type);\n    let modelName = dasherize(camelizedModelName);\n\n    // Avoid mutating original class, because we may want to reuse it across many tests\n    ModelClass = ModelClass.extend();\n\n    // Store model & fks in registry\n    // TODO: don't think this is needed anymore\n    this._registry[camelizedModelName] = this._registry[camelizedModelName] || {\n      class: null,\n      foreignKeys: [],\n    }; // we may have created this key before, if another model added fks to it\n    this._registry[camelizedModelName].class = ModelClass;\n\n    // TODO: set here, remove from model#constructor\n    ModelClass.prototype._schema = this;\n    ModelClass.prototype.modelName = modelName;\n    // Set up associations\n    ModelClass.prototype.hasManyAssociations = {}; // a registry of the model's hasMany associations. Key is key from model definition, value is association instance itself\n    ModelClass.prototype.hasManyAssociationFks = {}; // a lookup table to get the hasMany association by foreignKey\n    ModelClass.prototype.belongsToAssociations = {}; // a registry of the model's belongsTo associations. Key is key from model definition, value is association instance itself\n    ModelClass.prototype.belongsToAssociationFks = {}; // a lookup table to get the belongsTo association by foreignKey\n    ModelClass.prototype.associationKeys = new Set(); // ex: address.user, user.addresses\n    ModelClass.prototype.associationIdKeys = new Set(); // ex: address.user_id, user.address_ids\n    ModelClass.prototype.dependentAssociations = []; // a registry of associations that depend on this model, needed for deletion cleanup.\n\n    let fksAddedFromThisModel = {};\n    for (let associationProperty in ModelClass.prototype) {\n      if (ModelClass.prototype[associationProperty] instanceof Association) {\n        let association = ModelClass.prototype[associationProperty];\n        association.name = associationProperty;\n        association.modelName =\n          association.modelName || this.toModelName(associationProperty);\n        association.ownerModelName = modelName;\n        association.setSchema(this);\n\n        // Update the registry with this association's foreign keys. This is\n        // essentially our \"db migration\", since we must know about the fks.\n        let [fkHolder, fk] = association.getForeignKeyArray();\n\n        fksAddedFromThisModel[fkHolder] = fksAddedFromThisModel[fkHolder] || [];\n        assert(\n          !fksAddedFromThisModel[fkHolder].includes(fk),\n          `Your '${type}' model definition has multiple possible inverse relationships of type '${fkHolder}'. Please use explicit inverses.`\n        );\n        fksAddedFromThisModel[fkHolder].push(fk);\n\n        this._addForeignKeyToRegistry(fkHolder, fk);\n\n        // Augment the Model's class with any methods added by this association\n        association.addMethodsToModelClass(ModelClass, associationProperty);\n      }\n    }\n\n    // Create a db collection for this model, if doesn't exist\n    let collection = this.toCollectionName(modelName);\n    if (!this.db[collection]) {\n      this.db.createCollection(collection);\n    }\n\n    // Create the entity methods\n    this[collection] = {\n      camelizedModelName,\n      new: (attrs) => this.new(camelizedModelName, attrs),\n      create: (attrs) => this.create(camelizedModelName, attrs),\n      all: (attrs) => this.all(camelizedModelName, attrs),\n      find: (attrs) => this.find(camelizedModelName, attrs),\n      findBy: (attrs) => this.findBy(camelizedModelName, attrs),\n      findOrCreateBy: (attrs) => this.findOrCreateBy(camelizedModelName, attrs),\n      where: (attrs) => this.where(camelizedModelName, attrs),\n      none: (attrs) => this.none(camelizedModelName, attrs),\n      first: (attrs) => this.first(camelizedModelName, attrs),\n    };\n\n    return this;\n  }\n\n  /**\n    @method modelFor\n    @param type\n    @public\n    @hide\n   */\n  modelFor(type) {\n    return this._registry[type];\n  }\n\n  /**\n    Create a new unsaved model instance with attributes *attrs*.\n\n    ```js\n    let post = blogPosts.new({ title: 'Lorem ipsum' });\n    post.title;   // Lorem ipsum\n    post.id;      // null\n    post.isNew(); // true\n    ```\n\n    @method new\n    @param type\n    @param attrs\n    @public\n   */\n  new(type, attrs) {\n    return this._instantiateModel(dasherize(type), attrs);\n  }\n\n  /**\n    Create a new model instance with attributes *attrs*, and insert it into the database.\n\n    ```js\n    let post = blogPosts.create({title: 'Lorem ipsum'});\n    post.title;   // Lorem ipsum\n    post.id;      // 1\n    post.isNew(); // false\n    ```\n\n    @method create\n    @param type\n    @param attrs\n    @public\n   */\n  create(type, attrs) {\n    return this.new(type, attrs).save();\n  }\n\n  /**\n    Return all models in the database.\n\n    ```js\n    let posts = blogPosts.all();\n    // [post:1, post:2, ...]\n    ```\n\n    @method all\n    @param type\n    @public\n   */\n  all(type) {\n    let collection = this.collectionForType(type);\n\n    return this._hydrate(collection, dasherize(type));\n  }\n\n  /**\n    Return an empty collection of type `type`.\n\n    @method none\n    @param type\n    @public\n   */\n  none(type) {\n    return this._hydrate([], dasherize(type));\n  }\n\n  /**\n    Return one or many models in the database by id.\n\n    ```js\n    let post = blogPosts.find(1);\n    let posts = blogPosts.find([1, 3, 4]);\n    ```\n\n    @method find\n    @param type\n    @param ids\n    @public\n   */\n  find(type, ids) {\n    let collection = this.collectionForType(type);\n    let records = collection.find(ids);\n\n    if (Array.isArray(ids)) {\n      assert(\n        records.length === ids.length,\n        `Couldn't find all ${this._container.inflector.pluralize(\n          type\n        )} with ids: (${ids.join(\",\")}) (found ${\n          records.length\n        } results, but was looking for ${ids.length})`\n      );\n    }\n\n    return this._hydrate(records, dasherize(type));\n  }\n\n  /**\n    Returns the first model in the database that matches the key-value pairs in `attrs`. Note that a string comparison is used.\n\n    ```js\n    let post = blogPosts.findBy({ published: true });\n    let post = blogPosts.findBy({ authorId: 1, published: false });\n    let post = blogPosts.findBy({ author: janeSmith, featured: true });\n    ```\n\n    This will return `null` if the schema doesn't have any matching record.\n\n    A predicate function can also be used to find a match.\n\n    ```js\n    let longPost = blogPosts.findBy((post) => post.body.length > 1000);\n    ```\n\n    @method findBy\n    @param type\n    @param attributesOrPredicate\n    @public\n   */\n  findBy(type, query) {\n    let collection = this.collectionForType(type);\n    let record = collection.findBy(query);\n\n    return this._hydrate(record, dasherize(type));\n  }\n\n  /**\n    Returns the first model in the database that matches the key-value pairs in `attrs`, or creates a record with the attributes if one is not found.\n\n    ```js\n    // Find the first published blog post, or create a new one.\n    let post = blogPosts.findOrCreateBy({ published: true });\n    ```\n\n    @method findOrCreateBy\n    @param type\n    @param attributeName\n    @public\n   */\n  findOrCreateBy(type, attrs) {\n    let collection = this.collectionForType(type);\n    let record = collection.findBy(attrs);\n    let model;\n\n    if (!record) {\n      model = this.create(type, attrs);\n    } else {\n      model = this._hydrate(record, dasherize(type));\n    }\n\n    return model;\n  }\n\n  /**\n    Return an ORM/Collection, which represents an array of models from the database matching `query`.\n\n    If `query` is an object, its key-value pairs will be compared against records using string comparison.\n\n    `query` can also be a compare function.\n\n    ```js\n    let posts = blogPosts.where({ published: true });\n    let posts = blogPosts.where(post => post.published === true);\n    ```\n\n    @method where\n    @param type\n    @param query\n    @public\n   */\n  where(type, query) {\n    let collection = this.collectionForType(type);\n    let records = collection.where(query);\n\n    return this._hydrate(records, dasherize(type));\n  }\n\n  /**\n    Returns the first model in the database.\n\n    ```js\n    let post = blogPosts.first();\n    ```\n\n    N.B. This will return `null` if the schema doesn't contain any records.\n\n    @method first\n    @param type\n    @public\n   */\n  first(type) {\n    let collection = this.collectionForType(type);\n    let record = collection[0];\n\n    return this._hydrate(record, dasherize(type));\n  }\n\n  /**\n    @method modelClassFor\n    @param modelName\n    @public\n    @hide\n   */\n  modelClassFor(modelName) {\n    let model = this._registry[camelize(modelName)];\n\n    assert(model, `Model not registered: ${modelName}`);\n\n    return model.class.prototype;\n  }\n\n  /*\n    This method updates the dependentAssociations registry, which is used to\n    keep track of which models depend on a given association. It's used when\n    deleting models - their dependents need to be looked up and foreign keys\n    updated.\n\n    For example,\n\n        schema = {\n          post: Model.extend(),\n          comment: Model.extend({\n            post: belongsTo()\n          })\n        };\n\n        comment1.post = post1;\n        ...\n        post1.destroy()\n\n    Deleting this post should clear out comment1's foreign key.\n\n    Polymorphic associations can have _any_ other model as a dependent, so we\n    handle them separately.\n  */\n  addDependentAssociation(association, modelName) {\n    if (association.isPolymorphic) {\n      this._dependentAssociations.polymorphic.push(association);\n    } else {\n      this._dependentAssociations[modelName] =\n        this._dependentAssociations[modelName] || [];\n      this._dependentAssociations[modelName].push(association);\n    }\n  }\n\n  dependentAssociationsFor(modelName) {\n    let directDependents = this._dependentAssociations[modelName] || [];\n    let polymorphicAssociations = this._dependentAssociations.polymorphic || [];\n\n    return directDependents.concat(polymorphicAssociations);\n  }\n\n  /**\n    Returns an object containing the associations registered for the model of the given _modelName_.\n\n    For example, given this configuration\n    \n    ```js\n    import { createServer, Model, hasMany, belongsTo } from 'miragejs'\n\n    let server = createServer({\n      models: {\n        user: Model,\n        article: Model.extend({\n          fineAuthor: belongsTo(\"user\"),\n          comments: hasMany()\n        }),\n        comment: Model\n      }\n    })\n    ```\n\n    each of the following would return empty objects\n\n    ```js\n    server.schema.associationsFor('user')\n    // {}\n    server.schema.associationsFor('comment')\n    // {}\n    ```\n\n    but the associations for the `article` would return\n\n    ```js\n    server.schema.associationsFor('article')\n\n    // {\n    //   fineAuthor: BelongsToAssociation,\n    //   comments: HasManyAssociation\n    // }\n    ```\n\n    Check out the docs on the Association class to see what fields are available for each association.\n\n    @method associationsFor\n    @param {String} modelName\n    @return {Object}\n    @public\n  */\n  associationsFor(modelName) {\n    let modelClass = this.modelClassFor(modelName);\n\n    return Object.assign(\n      {},\n      modelClass.belongsToAssociations,\n      modelClass.hasManyAssociations\n    );\n  }\n\n  hasModelForModelName(modelName) {\n    return this.modelFor(camelize(modelName));\n  }\n\n  /*\n    Private methods\n  */\n\n  /**\n    @method collectionForType\n    @param type\n    @private\n    @hide\n   */\n  collectionForType(type) {\n    let collection = this.toCollectionName(type);\n    assert(\n      this.db[collection],\n      `You're trying to find model(s) of type ${type} but this collection doesn't exist in the database.`\n    );\n\n    return this.db[collection];\n  }\n\n  toCollectionName(type) {\n    if (typeof collectionNameCache[type] !== \"string\") {\n      let modelName = dasherize(type);\n\n      const collectionName = camelize(\n        this._container.inflector.pluralize(modelName)\n      );\n\n      collectionNameCache[type] = collectionName;\n    }\n\n    return collectionNameCache[type];\n  }\n\n  // This is to get at the underlying Db collection. Poorly named... need to\n  // refactor to DbTable or something.\n  toInternalCollectionName(type) {\n    if (typeof internalCollectionNameCache[type] !== \"string\") {\n      const internalCollectionName = `_${this.toCollectionName(type)}`;\n\n      internalCollectionNameCache[type] = internalCollectionName;\n    }\n\n    return internalCollectionNameCache[type];\n  }\n\n  toModelName(type) {\n    if (typeof modelNameCache[type] !== \"string\") {\n      let dasherized = dasherize(type);\n\n      const modelName = this._container.inflector.singularize(dasherized);\n\n      modelNameCache[type] = modelName;\n    }\n\n    return modelNameCache[type];\n  }\n\n  /**\n    @method _addForeignKeyToRegistry\n    @param type\n    @param fk\n    @private\n    @hide\n   */\n  _addForeignKeyToRegistry(type, fk) {\n    this._registry[type] = this._registry[type] || {\n      class: null,\n      foreignKeys: [],\n    };\n\n    let fks = this._registry[type].foreignKeys;\n    if (!fks.includes(fk)) {\n      fks.push(fk);\n    }\n  }\n\n  /**\n    @method _instantiateModel\n    @param modelName\n    @param attrs\n    @private\n    @hide\n   */\n  _instantiateModel(modelName, attrs) {\n    let ModelClass = this._modelFor(modelName);\n    let fks = this._foreignKeysFor(modelName);\n\n    return new ModelClass(this, modelName, attrs, fks);\n  }\n\n  /**\n    @method _modelFor\n    @param modelName\n    @private\n    @hide\n   */\n  _modelFor(modelName) {\n    return this._registry[camelize(modelName)].class;\n  }\n\n  /**\n    @method _foreignKeysFor\n    @param modelName\n    @private\n    @hide\n   */\n  _foreignKeysFor(modelName) {\n    return this._registry[camelize(modelName)].foreignKeys;\n  }\n\n  /**\n    Takes a record and returns a model, or an array of records\n    and returns a collection.\n   *\n    @method _hydrate\n    @param records\n    @param modelName\n    @private\n    @hide\n   */\n  _hydrate(records, modelName) {\n    if (Array.isArray(records)) {\n      let models = records.map(function (record) {\n        return this._instantiateModel(modelName, record);\n      }, this);\n      return new Collection(modelName, models);\n    } else if (records) {\n      return this._instantiateModel(modelName, records);\n    } else {\n      return null;\n    }\n  }\n}\n","import { singularize, pluralize } from \"inflected\";\nimport Db from \"./db\";\nimport Association from \"./orm/associations/association\";\nimport RouteHandler from \"./route-handler\";\nimport BaseRouteHandler from \"./route-handlers/base\";\nimport Serializer from \"./serializer\";\nimport SerializerRegistry from \"./serializer-registry\";\nimport Schema from \"./orm/schema\";\n\nconst classes = {\n  Db,\n  Association,\n  RouteHandler,\n  BaseRouteHandler,\n  Serializer,\n  SerializerRegistry,\n  Schema,\n};\n\nlet defaultInflector = { singularize, pluralize };\n\n/**\n  Lightweight DI container for customizable objects that are needed by\n  deeply nested classes.\n\n  @class Container\n  @hide\n */\nclass Container {\n  constructor() {\n    this.inflector = defaultInflector;\n  }\n\n  register(key, value) {\n    this[key] = value;\n  }\n\n  create(className, ...args) {\n    let Class = classes[className];\n    Class.prototype._container = this;\n\n    return new Class(...args);\n  }\n}\n\n/**\n  These are side effects. We give each class a default container so it can be\n  easily unit tested.\n\n  We should remove these once we have test coverage and can refactor to a proper\n  DI system.\n*/\nlet defaultContainer = new Container();\n\nDb.prototype._container = defaultContainer;\nAssociation.prototype._container = defaultContainer;\nBaseRouteHandler.prototype._container = defaultContainer;\nRouteHandler.prototype._container = defaultContainer;\nSerializer.prototype._container = defaultContainer;\nSerializerRegistry.prototype._container = defaultContainer;\nSchema.prototype._container = defaultContainer;\n\nexport default Container;\n","import \"@miragejs/pretender-node-polyfill/before\";\nimport Pretender from \"pretender\";\nimport \"@miragejs/pretender-node-polyfill/after\";\nimport assert from \"../assert\";\nimport assign from \"lodash/assign\";\n\n/**\n  Mirage Interceptor Class\n\n    urlPrefix;\n\n    namespace;\n\n    // Creates the interceptor instance\n    constructor(mirageServer, mirageConfig)\n\n    // Allow you to change some of the config options after the server is created\n    config(mirageConfig)\n\n    // These are the equivalent of the functions that were on the Mirage Server.\n    // Those Mirage Server functions are redirected to the Interceptors functions for\n    // backward compatibility\n    get\n    post\n    put\n    delete\n    del\n    patch\n    head\n    options\n\n    // Start the interceptor. (Optional) this happens after the mirage server has been completed configured\n    // and all the models, routes, etc have been defined.\n    start\n    // Shutdown the interceptor instance\n    shutdown\n\n */\n\n/**\n @hide\n */\nconst defaultPassthroughs = [\n  \"http://localhost:0/chromecheckurl\", // mobile chrome\n  \"http://localhost:30820/socket.io\", // electron\n  (request) => {\n    return /.+\\.hot-update.json$/.test(request.url);\n  },\n];\n\nconst defaultRouteOptions = {\n  coalesce: false,\n  timing: undefined,\n};\n\n/**\n * Determine if the object contains a valid option.\n *\n * @method isOption\n * @param {Object} option An object with one option value pair.\n * @return {Boolean} True if option is a valid option, false otherwise.\n * @private\n */\nfunction isOption(option) {\n  if (!option || typeof option !== \"object\") {\n    return false;\n  }\n\n  let allOptions = Object.keys(defaultRouteOptions);\n  let optionKeys = Object.keys(option);\n  for (let i = 0; i < optionKeys.length; i++) {\n    let key = optionKeys[i];\n    if (allOptions.indexOf(key) > -1) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n @hide\n */\nexport { defaultPassthroughs };\n\n/**\n * Extract arguments for a route.\n *\n * @method extractRouteArguments\n * @param {Array} args Of the form [options], [object, code], [function, code]\n * [shorthand, options], [shorthand, code, options]\n * @return {Array} [handler (i.e. the function, object or shorthand), code,\n * options].\n */\nfunction extractRouteArguments(args) {\n  let [lastArg] = args.splice(-1);\n  if (isOption(lastArg)) {\n    lastArg = assign({}, defaultRouteOptions, lastArg);\n  } else {\n    args.push(lastArg);\n    lastArg = defaultRouteOptions;\n  }\n  let t = 2 - args.length;\n  while (t-- > 0) {\n    args.push(undefined);\n  }\n  args.push(lastArg);\n  return args;\n}\n\nexport default class PretenderConfig {\n  urlPrefix;\n\n  namespace;\n\n  timing;\n\n  passthroughChecks;\n\n  pretender;\n\n  mirageServer;\n\n  trackRequests;\n\n  create(mirageServer, config) {\n    this.mirageServer = mirageServer;\n    this.pretender = this._create(mirageServer, config);\n\n    /**\n     Mirage uses [pretender.js](https://github.com/trek/pretender) as its xhttp interceptor. In your Mirage config, `this.pretender` refers to the actual Pretender instance, so any config options that work there will work here as well.\n\n     ```js\n     createServer({\n        routes() {\n          this.pretender.handledRequest = (verb, path, request) => {\n            console.log(`Your server responded to ${path}`);\n          }\n        }\n      })\n     ```\n\n     Refer to [Pretender's docs](https://github.com/pretenderjs/pretender) if you want to change any options on your Pretender instance.\n\n     @property pretender\n     @return {Object} The Pretender instance\n     @public\n     */\n    mirageServer.pretender = this.pretender;\n\n    this.passthroughChecks = this.passthroughChecks || [];\n\n    this.config(config);\n\n    [\n      [\"get\"],\n      [\"post\"],\n      [\"put\"],\n      [\"delete\", \"del\"],\n      [\"patch\"],\n      [\"head\"],\n      [\"options\"],\n    ].forEach(([verb, alias]) => {\n      this[verb] = (path, ...args) => {\n        let [rawHandler, customizedCode, options] = extractRouteArguments(args);\n        let handler = mirageServer.registerRouteHandler(\n          verb,\n          path,\n          rawHandler,\n          customizedCode,\n          options\n        );\n        let fullPath = this._getFullPath(path);\n        let timing =\n          options.timing !== undefined ? options.timing : () => this.timing;\n        return this.pretender?.[verb](fullPath, handler, timing);\n      };\n\n      mirageServer[verb] = this[verb];\n      if (alias) {\n        this[alias] = this[verb];\n        mirageServer[alias] = this[verb];\n      }\n    });\n  }\n\n  config(config) {\n    let useDefaultPassthroughs =\n      typeof config.useDefaultPassthroughs !== \"undefined\"\n        ? config.useDefaultPassthroughs\n        : true;\n    if (useDefaultPassthroughs) {\n      this._configureDefaultPassthroughs();\n    }\n\n    let didOverridePretenderConfig =\n      config.trackRequests !== undefined &&\n      config.trackRequests !== this.trackRequests;\n    assert(\n      !didOverridePretenderConfig,\n      \"You cannot modify Pretender's request tracking once the server is created\"\n    );\n\n    /**\n     Set the number of milliseconds for the the Server's response time.\n\n     By default there's a 400ms delay during development, and 0 delay in testing (so your tests run fast).\n\n     ```js\n     createServer({\n        routes() {\n          this.timing = 400; // default\n        }\n      })\n     ```\n\n     To set the timing for individual routes, see the `timing` option for route handlers.\n\n     @property timing\n     @type Number\n     @public\n     */\n    this.timing = config.timing ?? this.timing ?? 400;\n\n    /**\n     Sets a string to prefix all route handler URLs with.\n\n     Useful if your app makes API requests to a different port.\n\n     ```js\n     createServer({\n        routes() {\n          this.urlPrefix = 'http://localhost:8080'\n        }\n      })\n     ```\n     */\n    this.urlPrefix = this.urlPrefix || config.urlPrefix || \"\";\n\n    /**\n     Set the base namespace used for all routes defined with `get`, `post`, `put` or `del`.\n\n     For example,\n\n     ```js\n     createServer({\n        routes() {\n          this.namespace = '/api';\n\n          // this route will handle the URL '/api/contacts'\n          this.get('/contacts', 'contacts');\n        }\n      })\n     ```\n\n     Note that only routes defined after `this.namespace` are affected. This is useful if you have a few one-off routes that you don't want under your namespace:\n\n     ```js\n     createServer({\n        routes() {\n\n          // this route handles /auth\n          this.get('/auth', function() { ...});\n\n          this.namespace = '/api';\n          // this route will handle the URL '/api/contacts'\n          this.get('/contacts', 'contacts');\n        };\n      })\n     ```\n\n     If your app is loaded from the filesystem vs. a server (e.g. via Cordova or Electron vs. `localhost` or `https://yourhost.com/`), you will need to explicitly define a namespace. Likely values are `/` (if requests are made with relative paths) or `https://yourhost.com/api/...` (if requests are made to a defined server).\n\n     For a sample implementation leveraging a configured API host & namespace, check out [this issue comment](https://github.com/miragejs/ember-cli-mirage/issues/497#issuecomment-183458721).\n\n     @property namespace\n     @type String\n     @public\n     */\n    this.namespace = this.namespace || config.namespace || \"\";\n  }\n\n  /**\n   *\n   * @private\n   * @hide\n   */\n  _configureDefaultPassthroughs() {\n    defaultPassthroughs.forEach((passthroughUrl) => {\n      this.passthrough(passthroughUrl);\n    });\n  }\n\n  /**\n   * Creates a new Pretender instance.\n   *\n   * @method _create\n   * @param {Server} server\n   * @return {Object} A new Pretender instance.\n   * @public\n   */\n  _create(mirageServer, config) {\n    if (typeof window !== \"undefined\") {\n      this.trackRequests = config.trackRequests || false;\n      return new Pretender(\n        function () {\n          this.passthroughRequest = function (verb, path, request) {\n            if (mirageServer.shouldLog()) {\n              console.log(\n                `Mirage: Passthrough request for ${verb.toUpperCase()} ${\n                  request.url\n                }`\n              );\n            }\n          };\n\n          this.handledRequest = function (verb, path, request) {\n            if (mirageServer.shouldLog()) {\n              console.groupCollapsed(\n                `Mirage: [${request.status}] ${verb.toUpperCase()} ${\n                  request.url\n                }`\n              );\n              let { requestBody, responseText } = request;\n              let loggedRequest, loggedResponse;\n\n              try {\n                loggedRequest = JSON.parse(requestBody);\n              } catch (e) {\n                loggedRequest = requestBody;\n              }\n\n              try {\n                loggedResponse = JSON.parse(responseText);\n              } catch (e) {\n                loggedResponse = responseText;\n              }\n\n              console.groupCollapsed(\"Response\");\n              console.log(loggedResponse);\n              console.groupEnd();\n\n              console.groupCollapsed(\"Request (data)\");\n              console.log(loggedRequest);\n              console.groupEnd();\n\n              console.groupCollapsed(\"Request (raw)\");\n              console.log(request);\n              console.groupEnd();\n\n              console.groupEnd();\n            }\n          };\n\n          let originalCheckPassthrough = this.checkPassthrough;\n          this.checkPassthrough = function (request) {\n            let shouldPassthrough = mirageServer.passthroughChecks.some(\n              (passthroughCheck) => passthroughCheck(request)\n            );\n\n            if (shouldPassthrough) {\n              let url = request.url.includes(\"?\")\n                ? request.url.substr(0, request.url.indexOf(\"?\"))\n                : request.url;\n\n              this[request.method.toLowerCase()](url, this.passthrough);\n            }\n\n            return originalCheckPassthrough.apply(this, arguments);\n          };\n\n          this.unhandledRequest = function (verb, path) {\n            path = decodeURI(path);\n            let namespaceError = \"\";\n            if (this.namespace === \"\") {\n              namespaceError =\n                \"There is no existing namespace defined. Please define one\";\n            } else {\n              namespaceError = `The existing namespace is ${this.namespace}`;\n            }\n            assert(\n              `Your app tried to ${verb} '${path}', but there was no route defined to handle this request. Define a route for this endpoint in your routes() config. Did you forget to define a namespace? ${namespaceError}`\n            );\n          };\n        },\n        { trackRequests: this.trackRequests }\n      );\n    }\n  }\n\n  /**\n   By default, if your app makes a request that is not defined in your server config, Mirage will throw an error. You can use `passthrough` to whitelist requests, and allow them to pass through your Mirage server to the actual network layer.\n\n   Note: Put all passthrough config at the bottom of your routes, to give your route handlers precedence.\n\n   To ignore paths on your current host (as well as configured `namespace`), use a leading `/`:\n\n   ```js\n   this.passthrough('/addresses');\n   ```\n\n   You can also pass a list of paths, or call `passthrough` multiple times:\n\n   ```js\n   this.passthrough('/addresses', '/contacts');\n   this.passthrough('/something');\n   this.passthrough('/else');\n   ```\n\n   These lines will allow all HTTP verbs to pass through. If you want only certain verbs to pass through, pass an array as the last argument with the specified verbs:\n\n   ```js\n   this.passthrough('/addresses', ['post']);\n   this.passthrough('/contacts', '/photos', ['get']);\n   ```\n\n   You can pass a function to `passthrough` to do a runtime check on whether or not the request should be handled by Mirage. If the function returns `true` Mirage will not handle the request and let it pass through.\n\n   ```js\n   this.passthrough(request => {\n      return request.queryParams.skipMirage;\n    });\n   ```\n\n   If you want all requests on the current domain to pass through, simply invoke the method with no arguments:\n\n   ```js\n   this.passthrough();\n   ```\n\n   Note again that the current namespace (i.e. any `namespace` property defined above this call) will be applied.\n\n   You can also allow other-origin hosts to passthrough. If you use a fully-qualified domain name, the `namespace` property will be ignored. Use two * wildcards to match all requests under a path:\n\n   ```js\n   this.passthrough('http://api.foo.bar/**');\n   this.passthrough('http://api.twitter.com/v1/cards/**');\n   ```\n\n   In versions of Pretender prior to 0.12, `passthrough` only worked with jQuery >= 2.x. As long as you're on Pretender@0.12 or higher, you should be all set.\n\n   @method passthrough\n   @param {String} [...paths] Any number of paths to whitelist\n   @param {Array} options Unused\n   @public\n   */\n  passthrough(...paths) {\n    // this only works in browser-like environments for now. in node users will have to configure\n    // their own interceptor if they are using one.\n    if (typeof window !== \"undefined\") {\n      let verbs = [\"get\", \"post\", \"put\", \"delete\", \"patch\", \"options\", \"head\"];\n      let lastArg = paths[paths.length - 1];\n\n      if (paths.length === 0) {\n        paths = [\"/**\", \"/\"];\n      } else if (paths.length > 1 && Array.isArray(lastArg)) {\n        verbs = paths.pop();\n      }\n\n      paths.forEach((path) => {\n        if (typeof path === \"function\") {\n          this.passthroughChecks.push(path);\n        } else {\n          verbs.forEach((verb) => {\n            let fullPath = this._getFullPath(path);\n            this.pretender[verb](fullPath, this.pretender.passthrough);\n          });\n        }\n      });\n    }\n  }\n\n  /**\n   * Builds a full path for Pretender to monitor based on the `path` and\n   * configured options (`urlPrefix` and `namespace`).\n   *\n   * @private\n   * @hide\n   */\n  _getFullPath(path) {\n    path = path[0] === \"/\" ? path.slice(1) : path;\n    let fullPath = \"\";\n    let urlPrefix = this.urlPrefix ? this.urlPrefix.trim() : \"\";\n    let namespace = \"\";\n\n    // if there is a urlPrefix and a namespace\n    if (this.urlPrefix && this.namespace) {\n      if (\n        this.namespace[0] === \"/\" &&\n        this.namespace[this.namespace.length - 1] === \"/\"\n      ) {\n        namespace = this.namespace\n          .substring(0, this.namespace.length - 1)\n          .substring(1);\n      }\n\n      if (\n        this.namespace[0] === \"/\" &&\n        this.namespace[this.namespace.length - 1] !== \"/\"\n      ) {\n        namespace = this.namespace.substring(1);\n      }\n\n      if (\n        this.namespace[0] !== \"/\" &&\n        this.namespace[this.namespace.length - 1] === \"/\"\n      ) {\n        namespace = this.namespace.substring(0, this.namespace.length - 1);\n      }\n\n      if (\n        this.namespace[0] !== \"/\" &&\n        this.namespace[this.namespace.length - 1] !== \"/\"\n      ) {\n        namespace = this.namespace;\n      }\n    }\n\n    // if there is a namespace and no urlPrefix\n    if (this.namespace && !this.urlPrefix) {\n      if (\n        this.namespace[0] === \"/\" &&\n        this.namespace[this.namespace.length - 1] === \"/\"\n      ) {\n        namespace = this.namespace.substring(0, this.namespace.length - 1);\n      }\n\n      if (\n        this.namespace[0] === \"/\" &&\n        this.namespace[this.namespace.length - 1] !== \"/\"\n      ) {\n        namespace = this.namespace;\n      }\n\n      if (\n        this.namespace[0] !== \"/\" &&\n        this.namespace[this.namespace.length - 1] === \"/\"\n      ) {\n        let namespaceSub = this.namespace.substring(\n          0,\n          this.namespace.length - 1\n        );\n        namespace = `/${namespaceSub}`;\n      }\n\n      if (\n        this.namespace[0] !== \"/\" &&\n        this.namespace[this.namespace.length - 1] !== \"/\"\n      ) {\n        namespace = `/${this.namespace}`;\n      }\n    }\n\n    // if no namespace\n    if (!this.namespace) {\n      namespace = \"\";\n    }\n\n    // check to see if path is a FQDN. if so, ignore any urlPrefix/namespace that was set\n    if (/^https?:\\/\\//.test(path)) {\n      fullPath += path;\n    } else {\n      // otherwise, if there is a urlPrefix, use that as the beginning of the path\n      if (urlPrefix.length) {\n        fullPath +=\n          urlPrefix[urlPrefix.length - 1] === \"/\" ? urlPrefix : `${urlPrefix}/`;\n      }\n\n      // add the namespace to the path\n      fullPath += namespace;\n\n      // add a trailing slash to the path if it doesn't already contain one\n      if (fullPath[fullPath.length - 1] !== \"/\") {\n        fullPath += \"/\";\n      }\n\n      // finally add the configured path\n      fullPath += path;\n\n      // if we're making a same-origin request, ensure a / is prepended and\n      // dedup any double slashes\n      if (!/^https?:\\/\\//.test(fullPath)) {\n        fullPath = `/${fullPath}`;\n        fullPath = fullPath.replace(/\\/+/g, \"/\");\n      }\n    }\n\n    return fullPath;\n  }\n\n  start() {\n    // unneeded for pretender implementation\n  }\n\n  shutdown() {\n    this.pretender.shutdown();\n  }\n}\n","/* eslint no-console: 0 */\n\nimport { camelize } from \"./utils/inflector\";\nimport isAssociation from \"./utils/is-association\";\nimport assert from \"./assert\";\nimport BelongsTo from \"./orm/associations/belongs-to\";\nimport Container from \"./container\";\nimport { singularize, pluralize } from \"inflected\";\nimport pick from \"lodash/pick\";\nimport assign from \"lodash/assign\";\nimport find from \"lodash/find\";\nimport isPlainObject from \"lodash/isPlainObject\";\nimport isInteger from \"lodash/isInteger\";\n\nimport PretenderConfig from \"./mock-server/pretender-config\";\n\nconst isPluralForModelCache = {};\n\nconst defaultInflector = { singularize, pluralize };\n\n/**\n * Creates a Server\n * @param {Object} options Server's configuration object\n * @param {String} options.urlPrefix The base URL for the routes. Example: `http://miragejs.com`.\n * @param {String} options.namespace The default namespace for the `Server`. Example: `/api/v1`.\n * @param {Number} options.timing Default latency for the routes to respond to a request.\n * @param {String} options.environment Defines the environment of the `Server`.\n * @param {Boolean} options.trackRequests Pretender `trackRequests`.\n * @param {Boolean} options.useDefaultPassthroughs True to use mirage provided passthroughs\n * @param {Boolean} options.logging Set to true or false to explicitly specify logging behavior.\n * @param {Function} options.seeds Called on the seed phase. Should be used to seed the database.\n * @param {Function} options.scenarios Alias for seeds.\n * @param {Function} options.routes Should be used to define server routes.\n * @param {Function} options.baseConfig Alias for routes.\n * @param {Object} options.inflector Default inflector (used for pluralization and singularization).\n * @param {Object} options.identityManagers Database identity managers.\n * @param {Object} options.models Server models\n * @param {Object} options.serializers Server serializers\n * @param {Object} options.factories Server factories\n * @param {Object} options.pretender Pretender instance\n */\nexport function createServer(options) {\n  return new Server(options);\n}\n\n/**\n  The Mirage server.\n\n  Note that `this` within your `routes` function refers to the server instance, which is the same instance that `server` refers to in your tests.\n\n  @class Server\n  @public\n*/\nexport default class Server {\n  /**\n   * Creates a Server\n   * @param {Object} options Server's configuration object\n   * @param {String} options.urlPrefix The base URL for the routes. Example: `http://miragejs.com`.\n   * @param {String} options.namespace The default namespace for the `Server`. Example: `/api/v1`.\n   * @param {Number} options.timing Default latency for the routes to respond to a request.\n   * @param {String} options.environment Defines the environment of the `Server`.\n   * @param {Boolean} options.trackRequests Pretender `trackRequests`.\n   * @param {Boolean} options.useDefaultPassthroughs True to use mirage provided passthroughs\n   * @param {Boolean} options.logging Set to true or false to explicitly specify logging behavior.\n   * @param {Function} options.seeds Called on the seed phase. Should be used to seed the database.\n   * @param {Function} options.scenarios Alias for seeds.\n   * @param {Function} options.routes Should be used to define server routes.\n   * @param {Function} options.baseConfig Alias for routes.\n   * @param {Object} options.inflector Default inflector (used for pluralization and singularization).\n   * @param {Object} options.identityManagers Database identity managers.\n   * @param {Object} options.models Server models\n   * @param {Object} options.serializers Server serializers\n   * @param {Object} options.factories Server factories\n   * @param {Object} options.pretender Pretender instance\n   */\n  constructor(options = {}) {\n    this._container = new Container();\n    this.config(options);\n\n    /**\n      Returns the Mirage Db instance.\n\n      @property db\n      @return Db\n    */\n    this.db = this.db || undefined;\n\n    /**\n      Returns the Mirage Schema (ORM) instance.\n\n      @property schema\n      @return Schema\n    */\n    this.schema = this.schema || undefined;\n\n    this.middleware = [];\n  }\n\n  // todo deprecate following\n  get namespace() {\n    return this.interceptor.namespace;\n  }\n  set namespace(value) {\n    this.interceptor.namespace = value;\n  }\n\n  // todo deprecate following\n  get urlPrefix() {\n    return this.interceptor.urlPrefix;\n  }\n  set urlPrefix(value) {\n    this.interceptor.urlPrefix = value;\n  }\n\n  // todo deprecate following\n  get timing() {\n    return this.interceptor.timing;\n  }\n  set timing(value) {\n    this.interceptor.timing = value;\n  }\n\n  // todo deprecate following\n  get passthroughChecks() {\n    return this.interceptor.passthroughChecks;\n  }\n  set passthroughChecks(value) {\n    this.interceptor.passthroughChecks = value;\n  }\n\n  config(config = {}) {\n    if (!config.interceptor) {\n      config.interceptor = new PretenderConfig();\n    }\n\n    if (this.interceptor) {\n      this.interceptor.config(config);\n    } else {\n      this.interceptor = config.interceptor;\n      this.interceptor.create(this, config);\n    }\n\n    let didOverrideConfig =\n      config.environment &&\n      this.environment &&\n      this.environment !== config.environment;\n    assert(\n      !didOverrideConfig,\n      \"You cannot modify Mirage's environment once the server is created\"\n    );\n    this.environment = config.environment || this.environment || \"development\";\n\n    if (config.routes) {\n      assert(\n        !config.baseConfig,\n        \"The routes option is an alias for the baseConfig option. You can't pass both options into your server definition.\"\n      );\n      config.baseConfig = config.routes;\n    }\n\n    if (config.seeds) {\n      assert(\n        !config.scenarios,\n        \"The seeds option is an alias for the scenarios.default option. You can't pass both options into your server definition.\"\n      );\n      config.scenarios = { default: config.seeds };\n    }\n\n    this._config = config;\n\n    /**\n      Mirage needs know the singular and plural versions of certain words for some of its APIs to work.\n\n      For example, whenever you define a model\n\n      ```js\n      createServer({\n        models: {\n          post: Model\n        }\n      })\n      ```\n\n      Mirage will pluralize the word \"post\" and use it to create a `db.posts` database collection.\n\n      To accomplish this, Mirage uses an object called an Inflector. An Inflector is an object with two methods, `singularize` and `pluralize`, that Mirage will call whenever it needs to inflect a word.\n\n      Mirage has a default inflector, so if you write\n\n      ```js\n      createServer()\n      ```\n\n      you'll be using the node [inflected](https://github.com/martinandert/inflected#readme) package. This can be customized if you have irregular words or need to change the defaults. You can wead more in [the guide on customizing inflections](/docs/advanced/customizing-inflections).\n\n      You typically should be able to make your customizations using the provided inflector. It's good to match any custom inflections your backend uses, as this will keep your Mirage code more consistent and simpler.\n\n      You can also override the inflector completely and provide your own `pluralize` and `singularize` methods:\n\n      ```js\n      createServer({\n        inflector: {\n          pluralize(word) {\n            // your logic\n          },\n          singularize(word) {\n            // your logic\n          }\n        }\n      })\n      ```\n    */\n    this.inflector = config.inflector || defaultInflector;\n    this._container.register(\"inflector\", this.inflector);\n\n    /**\n      Set to `true` or `false` to explicitly specify logging behavior.\n\n      By default, server responses are logged in non-testing environments. Logging is disabled by default in testing, so as not to clutter CI test runner output.\n\n      For example, to enable logging in tests, write the following:\n\n      ```js\n      test('I can view all users', function() {\n        server.logging = true;\n        server.create('user');\n\n        visit('/users');\n        // ...\n      });\n      ```\n\n      You can also write a custom log message using the [Pretender server's `handledRequest` hook](https://github.com/pretenderjs/pretender#handled-requests). (You can access the pretender server from your Mirage server via `server.pretender`.)\n\n      To override,\n\n      ```js\n      createServer({\n        routes() {\n          this.pretender.handledRequest = function(verb, path, request) {\n            let { responseText } = request;\n            // log request and response data\n          }\n        }\n      })\n      ```\n\n      @property logging\n      @return {Boolean}\n      @public\n    */\n    this.logging = config.logging !== undefined ? this.logging : undefined;\n\n    this.testConfig = this.testConfig || undefined;\n\n    this.trackRequests = config.trackRequests;\n\n    if (this.db) {\n      this.db.registerIdentityManagers(config.identityManagers);\n    } else {\n      this.db = this._container.create(\n        \"Db\",\n        undefined,\n        config.identityManagers\n      );\n    }\n\n    if (this.schema) {\n      this.schema.registerModels(config.models);\n      this.serializerOrRegistry.registerSerializers(config.serializers || {});\n    } else {\n      this.schema = this._container.create(\"Schema\", this.db, config.models);\n      this.serializerOrRegistry = this._container.create(\n        \"SerializerRegistry\",\n        this.schema,\n        config.serializers\n      );\n    }\n\n    let hasFactories = this._hasModulesOfType(config, \"factories\");\n    let hasDefaultScenario =\n      config.scenarios &&\n      Object.prototype.hasOwnProperty.call(config.scenarios, \"default\");\n\n    if (config.baseConfig) {\n      this.loadConfig(config.baseConfig);\n    }\n\n    if (this.isTest()) {\n      this.loadConfig(config.testConfig);\n\n      if (typeof window !== \"undefined\") {\n        window.server = this; // TODO: Better way to inject server into test env\n      }\n    }\n\n    if (this.isTest() && hasFactories) {\n      this.loadFactories(config.factories);\n    } else if (!this.isTest() && hasDefaultScenario) {\n      this.loadFactories(config.factories);\n      config.scenarios.default(this);\n    } else {\n      this.loadFixtures();\n    }\n\n    this.interceptor.start?.();\n  }\n\n  /**\n   * Determines if the current environment is the testing environment.\n   *\n   * @method isTest\n   * @return {Boolean} True if the environment is 'test', false otherwise.\n   * @public\n   * @hide\n   */\n  isTest() {\n    return this.environment === \"test\";\n  }\n\n  /**\n    Determines if the server should log.\n\n    @method shouldLog\n    @return The value of this.logging if defined, or false if in the testing environment,\n    true otherwise.\n    @public\n    @hide\n  */\n  shouldLog() {\n    return typeof this.logging !== \"undefined\" ? this.logging : !this.isTest();\n  }\n\n  /**\n   * Load the configuration given, setting timing to 0 if in the test\n   * environment.\n   *\n   * @method loadConfig\n   * @param {Object} config The configuration to load.\n   * @public\n   * @hide\n   */\n  loadConfig(config) {\n    config?.call(this);\n    this.timing = this.isTest() ? 0 : this.timing || 0;\n  }\n\n  // TODO deprecate this in favor of direct call\n  passthrough(...paths) {\n    this.interceptor.passthrough?.(...paths);\n  }\n\n  /**\n    By default, `fixtures` will be loaded during testing if you don't have factories defined, and during development if you don't have `seeds` defined. You can use `loadFixtures()` to also load fixture files in either of these environments, in addition to using factories to seed your database.\n\n    `server.loadFixtures()` loads all the files, and `server.loadFixtures(file1, file2...)` loads selective fixture files.\n\n    For example, in a test you may want to start out with all your fixture data loaded:\n\n    ```js\n    test('I can view the photos', function() {\n      server.loadFixtures();\n      server.createList('photo', 10);\n\n      visit('/');\n\n      andThen(() => {\n        equal( find('img').length, 10 );\n      });\n    });\n    ```\n\n    or in development, you may want to load a few reference fixture files, and use factories to define the rest of your data:\n\n    ```js\n    createServer({\n      ...,\n      seeds(server) {\n        server.loadFixtures('countries', 'states');\n\n        let author = server.create('author');\n        server.createList('post', 10, {author_id: author.id});\n      }\n    })\n    ```\n\n    @method loadFixtures\n    @param {String} [...args] The name of the fixture to load.\n    @public\n  */\n  loadFixtures(...args) {\n    let { fixtures } = this._config;\n\n    if (args.length) {\n      let camelizedArgs = args.map(camelize);\n\n      let missingKeys = camelizedArgs.filter((key) => !fixtures[key]);\n      if (missingKeys.length) {\n        throw new Error(`Fixtures not found: ${missingKeys.join(\", \")}`);\n      }\n\n      fixtures = pick(fixtures, ...camelizedArgs);\n    }\n\n    this.db.loadData(fixtures);\n  }\n\n  /*\n    Factory methods\n  */\n\n  /**\n   * Load factories into Mirage's database.\n   *\n   * @method loadFactories\n   * @param {Object} factoryMap\n   * @public\n   * @hide\n   */\n  loadFactories(factoryMap = {}) {\n    // Store a reference to the factories\n    let currentFactoryMap = this._factoryMap || {};\n    this._factoryMap = assign(currentFactoryMap, factoryMap);\n\n    // Create a collection for each factory\n    Object.keys(factoryMap).forEach((type) => {\n      let collectionName = this.schema.toCollectionName(type);\n      this.db.createCollection(collectionName);\n    });\n  }\n\n  /**\n   * Get the factory for a given type.\n   *\n   * @method factoryFor\n   * @param {String} type\n   * @private\n   * @hide\n   */\n  factoryFor(type) {\n    let camelizedType = camelize(type);\n\n    if (this._factoryMap && this._factoryMap[camelizedType]) {\n      return this._factoryMap[camelizedType];\n    }\n  }\n\n  build(type, ...traitsAndOverrides) {\n    let traits = traitsAndOverrides.filter(\n      (arg) => arg && typeof arg === \"string\"\n    );\n    let overrides = find(traitsAndOverrides, (arg) => isPlainObject(arg));\n    let camelizedType = camelize(type);\n\n    // Store sequence for factory type as instance variable\n    this.factorySequences = this.factorySequences || {};\n    this.factorySequences[camelizedType] =\n      this.factorySequences[camelizedType] + 1 || 0;\n\n    let OriginalFactory = this.factoryFor(type);\n    if (OriginalFactory) {\n      OriginalFactory = OriginalFactory.extend({});\n      let attrs = OriginalFactory.attrs || {};\n      this._validateTraits(traits, OriginalFactory, type);\n      let mergedExtensions = this._mergeExtensions(attrs, traits, overrides);\n      this._mapAssociationsFromAttributes(type, attrs, overrides);\n      this._mapAssociationsFromAttributes(type, mergedExtensions);\n\n      let Factory = OriginalFactory.extend(mergedExtensions);\n      let factory = new Factory();\n\n      let sequence = this.factorySequences[camelizedType];\n      return factory.build(sequence);\n    } else {\n      return overrides;\n    }\n  }\n\n  buildList(type, amount, ...traitsAndOverrides) {\n    assert(\n      isInteger(amount),\n      `second argument has to be an integer, you passed: ${typeof amount}`\n    );\n\n    let list = [];\n\n    const buildArgs = [type, ...traitsAndOverrides];\n    for (let i = 0; i < amount; i++) {\n      list.push(this.build.apply(this, buildArgs));\n    }\n\n    return list;\n  }\n\n  /**\n    Generates a single model of type *type*, inserts it into the database (giving it an id), and returns the data that was\n    added.\n\n    ```js\n    test(\"I can view a contact's details\", function() {\n      let contact = server.create('contact');\n\n      visit('/contacts/' + contact.id);\n\n      andThen(() => {\n        equal( find('h1').text(), 'The contact is Link');\n      });\n    });\n    ```\n\n    You can override the attributes from the factory definition with a\n    hash passed in as the second parameter. For example, if we had this factory\n\n    ```js\n    export default Factory.extend({\n      name: 'Link'\n    });\n    ```\n\n    we could override the name like this:\n\n    ```js\n    test(\"I can view the contacts\", function() {\n      server.create('contact', {name: 'Zelda'});\n\n      visit('/');\n\n      andThen(() => {\n        equal( find('p').text(), 'Zelda' );\n      });\n    });\n    ```\n\n    @method create\n    @param type the singularized type of the model\n    @param traitsAndOverrides\n    @public\n  */\n  create(type, ...options) {\n    assert(\n      this._modelOrFactoryExistsForType(type),\n      `You called server.create('${type}') but no model or factory was found. Make sure you're passing in the singularized version of the model or factory name.`\n    );\n\n    // When there is a Model defined, we should return an instance\n    // of it instead of returning the bare attributes.\n    let traits = options.filter((arg) => arg && typeof arg === \"string\");\n    let overrides = find(options, (arg) => isPlainObject(arg));\n    let collectionFromCreateList = find(\n      options,\n      (arg) => arg && Array.isArray(arg)\n    );\n\n    let attrs = this.build(type, ...traits, overrides);\n    let modelOrRecord;\n\n    if (this.schema && this.schema[this.schema.toCollectionName(type)]) {\n      let modelClass = this.schema[this.schema.toCollectionName(type)];\n\n      modelOrRecord = modelClass.create(attrs);\n    } else {\n      let collection, collectionName;\n\n      if (collectionFromCreateList) {\n        collection = collectionFromCreateList;\n      } else {\n        collectionName = this.schema\n          ? this.schema.toInternalCollectionName(type)\n          : `_${this.inflector.pluralize(type)}`;\n        collection = this.db[collectionName];\n      }\n\n      assert(\n        collection,\n        `You called server.create('${type}') but no model or factory was found.`\n      );\n      modelOrRecord = collection.insert(attrs);\n    }\n\n    let OriginalFactory = this.factoryFor(type);\n    if (OriginalFactory) {\n      OriginalFactory.extractAfterCreateCallbacks({ traits }).forEach(\n        (afterCreate) => {\n          afterCreate(modelOrRecord, this);\n        }\n      );\n    }\n\n    return modelOrRecord;\n  }\n\n  /**\n    Creates *amount* models of type *type*, optionally overriding the attributes from the factory with *attrs*.\n\n    Returns the array of records that were added to the database.\n\n    Here's an example from a test:\n\n    ```js\n    test(\"I can view the contacts\", function() {\n      server.createList('contact', 5);\n      let youngContacts = server.createList('contact', 5, {age: 15});\n\n      visit('/');\n\n      andThen(function() {\n        equal(currentRouteName(), 'index');\n        equal( find('p').length, 10 );\n      });\n    });\n    ```\n\n    And one from setting up your development database:\n\n    ```js\n    createServer({\n      seeds(server) {\n        let contact = server.create('contact')\n\n        server.createList('address', 5, { contact })\n      }\n    })\n    ```\n\n    @method createList\n    @param type\n    @param amount\n    @param traitsAndOverrides\n    @public\n  */\n  createList(type, amount, ...traitsAndOverrides) {\n    assert(\n      this._modelOrFactoryExistsForType(type),\n      `You called server.createList('${type}') but no model or factory was found. Make sure you're passing in the singularized version of the model or factory name.`\n    );\n    assert(\n      isInteger(amount),\n      `second argument has to be an integer, you passed: ${typeof amount}`\n    );\n\n    let list = [];\n    let collectionName = this.schema\n      ? this.schema.toInternalCollectionName(type)\n      : `_${this.inflector.pluralize(type)}`;\n    let collection = this.db[collectionName];\n\n    const createArguments = [type, ...traitsAndOverrides, collection];\n\n    for (let i = 0; i < amount; i++) {\n      list.push(this.create.apply(this, createArguments));\n    }\n\n    return list;\n  }\n\n  /**\n    Shutdown the server and stop intercepting network requests.\n\n    @method shutdown\n    @public\n  */\n  shutdown() {\n    if (typeof window !== \"undefined\") {\n      this.interceptor.shutdown();\n    }\n\n    if (typeof window !== \"undefined\" && this.environment === \"test\") {\n      window.server = undefined;\n    }\n  }\n\n  resource(resourceName, { only, except, path } = {}) {\n    resourceName = this.inflector.pluralize(resourceName);\n    path = path || `/${resourceName}`;\n    only = only || [];\n    except = except || [];\n\n    if (only.length > 0 && except.length > 0) {\n      throw \"cannot use both :only and :except options\";\n    }\n\n    let actionsMethodsAndsPathsMappings = {\n      index: { methods: [\"get\"], path: `${path}` },\n      show: { methods: [\"get\"], path: `${path}/:id` },\n      create: { methods: [\"post\"], path: `${path}` },\n      update: { methods: [\"put\", \"patch\"], path: `${path}/:id` },\n      delete: { methods: [\"del\"], path: `${path}/:id` },\n    };\n\n    let allActions = Object.keys(actionsMethodsAndsPathsMappings);\n    let actions =\n      (only.length > 0 && only) ||\n      (except.length > 0 &&\n        allActions.filter((action) => except.indexOf(action) === -1)) ||\n      allActions;\n\n    actions.forEach((action) => {\n      let methodsWithPath = actionsMethodsAndsPathsMappings[action];\n\n      methodsWithPath.methods.forEach((method) => {\n        return path === resourceName\n          ? this[method](methodsWithPath.path)\n          : this[method](methodsWithPath.path, resourceName);\n      });\n    });\n  }\n\n  _serialize(body) {\n    if (typeof body === \"string\") {\n      return body;\n    } else {\n      return JSON.stringify(body);\n    }\n  }\n\n  registerRouteHandler(\n    verb,\n    path,\n    rawHandler,\n    customizedCode,\n    options,\n    middleware = this.middleware\n  ) {\n    let routeHandler = this._container.create(\"RouteHandler\", {\n      schema: this.schema,\n      verb,\n      rawHandler,\n      customizedCode,\n      options,\n      path,\n      serializerOrRegistry: this.serializerOrRegistry,\n      middleware,\n    });\n\n    return (request) => {\n      return routeHandler.handle(request).then((mirageResponse) => {\n        let [code, headers, response] = mirageResponse;\n\n        return [code, headers, this._serialize(response)];\n      });\n    };\n  }\n\n  /**\n   *\n   * @private\n   * @hide\n   */\n  _hasModulesOfType(modules, type) {\n    let modulesOfType = modules[type];\n    return modulesOfType ? Object.keys(modulesOfType).length > 0 : false;\n  }\n\n  /**\n   *\n   * @private\n   * @hide\n   */\n  _typeIsPluralForModel(typeOrCollectionName) {\n    if (typeof isPluralForModelCache[typeOrCollectionName] !== \"boolean\") {\n      let modelOrFactoryExists =\n        this._modelOrFactoryExistsForTypeOrCollectionName(typeOrCollectionName);\n      let isPlural =\n        typeOrCollectionName === this.inflector.pluralize(typeOrCollectionName);\n      let isUncountable =\n        this.inflector.singularize(typeOrCollectionName) ===\n        this.inflector.pluralize(typeOrCollectionName);\n\n      const isPluralForModel =\n        isPlural && !isUncountable && modelOrFactoryExists;\n\n      isPluralForModelCache[typeOrCollectionName] = isPluralForModel;\n    }\n\n    return isPluralForModelCache[typeOrCollectionName];\n  }\n\n  /**\n   *\n   * @private\n   * @hide\n   */\n  _modelOrFactoryExistsForType(type) {\n    let modelExists = this.schema && this.schema.modelFor(camelize(type));\n    let dbCollectionExists =\n      this.db[this.schema.toInternalCollectionName(type)];\n\n    return (\n      (modelExists || dbCollectionExists) && !this._typeIsPluralForModel(type)\n    );\n  }\n\n  /**\n   *\n   * @private\n   * @hide\n   */\n  _modelOrFactoryExistsForTypeOrCollectionName(typeOrCollectionName) {\n    let modelExists =\n      this.schema && this.schema.modelFor(camelize(typeOrCollectionName));\n    let dbCollectionExists =\n      this.db[this.schema.toInternalCollectionName(typeOrCollectionName)];\n\n    return modelExists || dbCollectionExists;\n  }\n\n  /**\n   *\n   * @private\n   * @hide\n   */\n  _validateTraits(traits, factory, type) {\n    traits.forEach((traitName) => {\n      if (!factory.isTrait(traitName)) {\n        throw new Error(\n          `'${traitName}' trait is not registered in '${type}' factory`\n        );\n      }\n    });\n  }\n\n  /**\n   *\n   * @private\n   * @hide\n   */\n  _mergeExtensions(attrs, traits, overrides) {\n    let allExtensions = traits.map((traitName) => {\n      return attrs[traitName].extension;\n    });\n    allExtensions.push(overrides || {});\n    return allExtensions.reduce((accum, extension) => {\n      return assign(accum, extension);\n    }, {});\n  }\n\n  /**\n   *\n   * @private\n   * @hide\n   */\n  _mapAssociationsFromAttributes(modelName, attributes, overrides = {}) {\n    Object.keys(attributes || {})\n      .filter((attr) => {\n        return isAssociation(attributes[attr]);\n      })\n      .forEach((attr) => {\n        let modelClass = this.schema.modelClassFor(modelName);\n        let association = modelClass.associationFor(attr);\n\n        assert(\n          association && association instanceof BelongsTo,\n          `You're using the \\`association\\` factory helper on the '${attr}' attribute of your ${modelName} factory, but that attribute is not a \\`belongsTo\\` association.`\n        );\n\n        let isSelfReferentialBelongsTo =\n          association &&\n          association instanceof BelongsTo &&\n          association.modelName === modelName;\n\n        assert(\n          !isSelfReferentialBelongsTo,\n          `You're using the association() helper on your ${modelName} factory for ${attr}, which is a belongsTo self-referential relationship. You can't do this as it will lead to infinite recursion. You can move the helper inside of a trait and use it selectively.`\n        );\n\n        let isPolymorphic =\n          association && association.opts && association.opts.polymorphic;\n\n        assert(\n          !isPolymorphic,\n          `You're using the association() helper on your ${modelName} factory for ${attr}, which is a polymorphic relationship. This is not currently supported.`\n        );\n\n        let factoryAssociation = attributes[attr];\n        let foreignKey = `${camelize(attr)}Id`;\n        if (!overrides[attr]) {\n          attributes[foreignKey] = this.create(\n            association.modelName,\n            ...factoryAssociation.traitsAndOverrides\n          ).id;\n        }\n        delete attributes[attr];\n      });\n  }\n}\n","import Serializer from \"../serializer\";\nimport { underscore, dasherize, camelize } from \"../utils/inflector\";\n\nexport default Serializer.extend({\n  serializeIds: \"always\",\n  normalizeIds: true,\n\n  keyForModel(type) {\n    return underscore(type);\n  },\n\n  keyForAttribute(attr) {\n    attr = Serializer.prototype.keyForAttribute.apply(this, arguments);\n    return underscore(attr);\n  },\n\n  keyForRelationship(type) {\n    return this._container.inflector.pluralize(underscore(type));\n  },\n\n  keyForEmbeddedRelationship(attributeName) {\n    return underscore(attributeName);\n  },\n\n  keyForRelationshipIds(type) {\n    return `${underscore(this._container.inflector.singularize(type))}_ids`;\n  },\n\n  keyForForeignKey(relationshipName) {\n    return `${underscore(relationshipName)}_id`;\n  },\n\n  keyForPolymorphicForeignKeyId(relationshipName) {\n    return `${underscore(relationshipName)}_id`;\n  },\n\n  keyForPolymorphicForeignKeyType(relationshipName) {\n    return `${underscore(relationshipName)}_type`;\n  },\n\n  normalize(payload) {\n    let type = Object.keys(payload)[0];\n    let attrs = payload[type];\n    let modelName = camelize(type);\n    let modelClass = this.schema.modelClassFor(modelName);\n    let { belongsToAssociations, hasManyAssociations } = modelClass;\n    let belongsToKeys = Object.keys(belongsToAssociations);\n    let hasManyKeys = Object.keys(hasManyAssociations);\n\n    if (this.primaryKey !== \"id\") {\n      attrs.id = attrs[this.primaryKey];\n      delete attrs[this.primaryKey];\n    }\n\n    let jsonApiPayload = {\n      data: {\n        type: this._container.inflector.pluralize(type),\n        attributes: {},\n      },\n    };\n    if (attrs.id) {\n      jsonApiPayload.data.id = attrs.id;\n    }\n\n    let relationships = {};\n\n    Object.keys(attrs).forEach((key) => {\n      if (key !== \"id\") {\n        if (this.normalizeIds) {\n          if (belongsToKeys.includes(key)) {\n            let association = belongsToAssociations[key];\n            let associationModel = association.modelName;\n            relationships[dasherize(key)] = {\n              data: {\n                type: associationModel,\n                id: attrs[key],\n              },\n            };\n          } else if (hasManyKeys.includes(key)) {\n            let association = hasManyAssociations[key];\n            let associationModel = association.modelName;\n            let data = attrs[key].map((id) => {\n              return {\n                type: associationModel,\n                id,\n              };\n            });\n            relationships[dasherize(key)] = { data };\n          } else {\n            jsonApiPayload.data.attributes[dasherize(key)] = attrs[key];\n          }\n        } else {\n          jsonApiPayload.data.attributes[dasherize(key)] = attrs[key];\n        }\n      }\n    });\n    if (Object.keys(relationships).length) {\n      jsonApiPayload.data.relationships = relationships;\n    }\n\n    return jsonApiPayload;\n  },\n\n  getCoalescedIds(request) {\n    return request.queryParams && request.queryParams.ids;\n  },\n});\n","import ActiveModelSerializer from \"./active-model-serializer\";\nimport { camelize } from \"../utils/inflector\";\n\nexport default ActiveModelSerializer.extend({\n  serializeIds: \"always\",\n\n  keyForModel(type) {\n    return camelize(type);\n  },\n\n  keyForAttribute(attr) {\n    attr = ActiveModelSerializer.prototype.keyForAttribute.apply(\n      this,\n      arguments\n    );\n    return camelize(attr);\n  },\n\n  keyForRelationship(type) {\n    return camelize(this._container.inflector.pluralize(type));\n  },\n\n  keyForEmbeddedRelationship(attributeName) {\n    return camelize(attributeName);\n  },\n\n  keyForRelationshipIds(type) {\n    return camelize(this._container.inflector.pluralize(type));\n  },\n\n  keyForForeignKey(relationshipName) {\n    return camelize(this._container.inflector.singularize(relationshipName));\n  },\n\n  getCoalescedIds(request) {\n    return request.queryParams && request.queryParams.ids;\n  },\n});\n","/**\n  UUID generator\n\n  @hide\n*/\nexport default function () {\n  return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n    let r = (Math.random() * 16) | 0;\n    let v = c === \"x\" ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n}\n","import Factory from \"./factory\";\nimport IdentityManager from \"./identity-manager\";\nimport association from \"./association\";\nimport trait from \"./trait\";\nimport Response from \"./response\";\nimport Server, { createServer } from \"./server\";\nimport Model from \"./orm/model\";\nimport Collection from \"./orm/collection\";\nimport Serializer from \"./serializer\";\nimport ActiveModelSerializer from \"./serializers/active-model-serializer\";\nimport JSONAPISerializer from \"./serializers/json-api-serializer\";\nimport RestSerializer from \"./serializers/rest-serializer\";\nimport HasMany from \"./orm/associations/has-many\";\nimport BelongsTo from \"./orm/associations/belongs-to\";\n\n/*\n  These are solely for ember-cli-mirage, a \"privileged consumer\", and should be\n  removed once those import paths are dropped.\n*/\nimport _assert from \"./assert\";\nimport _DbCollection from \"./db-collection\";\nimport _Db from \"./db\";\nimport _RouteHandler from \"./route-handler\";\nimport _SerializerRegistry from \"./serializer-registry\";\nimport _ormAssociationsAssociation from \"./orm/associations/association\";\nimport _ormAssociationsBelongsTo from \"./orm/associations/belongs-to\";\nimport _ormAssociationsHasMany from \"./orm/associations/has-many\";\nimport _ormPolymorphicCollection from \"./orm/polymorphic-collection\";\nimport _ormSchema from \"./orm/schema\";\nimport _routeHandlersShorthandsBase from \"./route-handlers/shorthands/base\";\nimport _routeHandlersShorthandsDelete from \"./route-handlers/shorthands/delete\";\nimport _routeHandlersShorthandsGet from \"./route-handlers/shorthands/get\";\nimport _routeHandlersShorthandsHead from \"./route-handlers/shorthands/head\";\nimport _routeHandlersShorthandsPost from \"./route-handlers/shorthands/post\";\nimport _routeHandlersShorthandsPut from \"./route-handlers/shorthands/put\";\nimport _routeHandlersBase from \"./route-handlers/base\";\nimport _routeHandlersFunction from \"./route-handlers/function\";\nimport _routeHandlersObject from \"./route-handlers/object\";\nimport _utilsExtend from \"./utils/extend\";\nimport {\n  camelize as _utilsInflectorCamelize,\n  dasherize as _utilsInflectorDasherize,\n  underscore as _utilsInflectorUnderscore,\n  capitalize as _utilsInflectorCapitalize,\n} from \"./utils/inflector\";\nimport _utilsIsAssociation from \"./utils/is-association\";\nimport _utilsReferenceSort from \"./utils/reference-sort\";\nimport _utilsUuid from \"./utils/uuid\";\n\nimport PretenderInterceptor from \"./mock-server/pretender-config\";\n\n/**\n  @hide\n*/\nfunction hasMany(...args) {\n  return new HasMany(...args);\n}\n\n/**\n  @hide\n*/\nfunction belongsTo(...args) {\n  return new BelongsTo(...args);\n}\n\nexport {\n  association,\n  trait,\n  Model,\n  Collection,\n  Serializer,\n  ActiveModelSerializer,\n  JSONAPISerializer,\n  RestSerializer,\n  hasMany,\n  belongsTo,\n  createServer,\n  Server,\n  Factory,\n  IdentityManager,\n  Response,\n  _assert,\n  _DbCollection,\n  _Db,\n  _RouteHandler,\n  _SerializerRegistry,\n  _ormAssociationsAssociation,\n  _ormAssociationsBelongsTo,\n  _ormAssociationsHasMany,\n  _ormPolymorphicCollection,\n  _ormSchema,\n  _routeHandlersShorthandsBase,\n  _routeHandlersShorthandsDelete,\n  _routeHandlersShorthandsGet,\n  _routeHandlersShorthandsHead,\n  _routeHandlersShorthandsPost,\n  _routeHandlersShorthandsPut,\n  _routeHandlersBase,\n  _routeHandlersFunction,\n  _routeHandlersObject,\n  _utilsExtend,\n  _utilsInflectorCamelize,\n  _utilsInflectorDasherize,\n  _utilsInflectorUnderscore,\n  _utilsInflectorCapitalize,\n  _utilsIsAssociation,\n  _utilsReferenceSort,\n  _utilsUuid,\n  PretenderInterceptor,\n};\n\nexport default {\n  Factory,\n  Response,\n  hasMany,\n  belongsTo,\n};\n","import RouteRecognizer from 'route-recognizer';\nimport FakeXMLHttpRequest from 'fake-xml-http-request';\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n/**\n * Check if we're required to add a port number.\n *\n * @see https://url.spec.whatwg.org/#default-port\n * @param {Number|String} port Port number we need to check\n * @param {String} protocol Protocol we need to check against.\n * @returns {Boolean} Is it a default port for the given protocol\n * @api private\n */\nvar requiresPort = function required(port, protocol) {\n  protocol = protocol.split(':')[0];\n  port = +port;\n\n  if (!port) return false;\n\n  switch (protocol) {\n    case 'http':\n    case 'ws':\n    return port !== 80;\n\n    case 'https':\n    case 'wss':\n    return port !== 443;\n\n    case 'ftp':\n    return port !== 21;\n\n    case 'gopher':\n    return port !== 70;\n\n    case 'file':\n    return false;\n  }\n\n  return port !== 0;\n};\n\nvar has = Object.prototype.hasOwnProperty\n  , undef;\n\n/**\n * Decode a URI encoded string.\n *\n * @param {String} input The URI encoded string.\n * @returns {String|Null} The decoded string.\n * @api private\n */\nfunction decode(input) {\n  try {\n    return decodeURIComponent(input.replace(/\\+/g, ' '));\n  } catch (e) {\n    return null;\n  }\n}\n\n/**\n * Simple query string parser.\n *\n * @param {String} query The query string that needs to be parsed.\n * @returns {Object}\n * @api public\n */\nfunction querystring(query) {\n  var parser = /([^=?&]+)=?([^&]*)/g\n    , result = {}\n    , part;\n\n  while (part = parser.exec(query)) {\n    var key = decode(part[1])\n      , value = decode(part[2]);\n\n    //\n    // Prevent overriding of existing properties. This ensures that build-in\n    // methods like `toString` or __proto__ are not overriden by malicious\n    // querystrings.\n    //\n    // In the case if failed decoding, we want to omit the key/value pairs\n    // from the result.\n    //\n    if (key === null || value === null || key in result) continue;\n    result[key] = value;\n  }\n\n  return result;\n}\n\n/**\n * Transform a query string to an object.\n *\n * @param {Object} obj Object that should be transformed.\n * @param {String} prefix Optional prefix.\n * @returns {String}\n * @api public\n */\nfunction querystringify(obj, prefix) {\n  prefix = prefix || '';\n\n  var pairs = []\n    , value\n    , key;\n\n  //\n  // Optionally prefix with a '?' if needed\n  //\n  if ('string' !== typeof prefix) prefix = '?';\n\n  for (key in obj) {\n    if (has.call(obj, key)) {\n      value = obj[key];\n\n      //\n      // Edge cases where we actually want to encode the value to an empty\n      // string instead of the stringified value.\n      //\n      if (!value && (value === null || value === undef || isNaN(value))) {\n        value = '';\n      }\n\n      key = encodeURIComponent(key);\n      value = encodeURIComponent(value);\n\n      //\n      // If we failed to encode the strings, we should bail out as we don't\n      // want to add invalid strings to the query.\n      //\n      if (key === null || value === null) continue;\n      pairs.push(key +'='+ value);\n    }\n  }\n\n  return pairs.length ? prefix + pairs.join('&') : '';\n}\n\n//\n// Expose the module.\n//\nvar stringify = querystringify;\nvar parse = querystring;\n\nvar querystringify_1 = {\n\tstringify: stringify,\n\tparse: parse\n};\n\nvar slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\\/\\//\n  , protocolre = /^([a-z][a-z0-9.+-]*:)?(\\/\\/)?([\\\\/]+)?([\\S\\s]*)/i\n  , windowsDriveLetter = /^[a-zA-Z]:/\n  , whitespace = '[\\\\x09\\\\x0A\\\\x0B\\\\x0C\\\\x0D\\\\x20\\\\xA0\\\\u1680\\\\u180E\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200A\\\\u202F\\\\u205F\\\\u3000\\\\u2028\\\\u2029\\\\uFEFF]'\n  , left = new RegExp('^'+ whitespace +'+');\n\n/**\n * Trim a given string.\n *\n * @param {String} str String to trim.\n * @public\n */\nfunction trimLeft(str) {\n  return (str ? str : '').toString().replace(left, '');\n}\n\n/**\n * These are the parse rules for the URL parser, it informs the parser\n * about:\n *\n * 0. The char it Needs to parse, if it's a string it should be done using\n *    indexOf, RegExp using exec and NaN means set as current value.\n * 1. The property we should set when parsing this value.\n * 2. Indication if it's backwards or forward parsing, when set as number it's\n *    the value of extra chars that should be split off.\n * 3. Inherit from location if non existing in the parser.\n * 4. `toLowerCase` the resulting value.\n */\nvar rules = [\n  ['#', 'hash'],                        // Extract from the back.\n  ['?', 'query'],                       // Extract from the back.\n  function sanitize(address, url) {     // Sanitize what is left of the address\n    return isSpecial(url.protocol) ? address.replace(/\\\\/g, '/') : address;\n  },\n  ['/', 'pathname'],                    // Extract from the back.\n  ['@', 'auth', 1],                     // Extract from the front.\n  [NaN, 'host', undefined, 1, 1],       // Set left over value.\n  [/:(\\d+)$/, 'port', undefined, 1],    // RegExp the back.\n  [NaN, 'hostname', undefined, 1, 1]    // Set left over.\n];\n\n/**\n * These properties should not be copied or inherited from. This is only needed\n * for all non blob URL's as a blob URL does not include a hash, only the\n * origin.\n *\n * @type {Object}\n * @private\n */\nvar ignore = { hash: 1, query: 1 };\n\n/**\n * The location object differs when your code is loaded through a normal page,\n * Worker or through a worker using a blob. And with the blobble begins the\n * trouble as the location object will contain the URL of the blob, not the\n * location of the page where our code is loaded in. The actual origin is\n * encoded in the `pathname` so we can thankfully generate a good \"default\"\n * location from it so we can generate proper relative URL's again.\n *\n * @param {Object|String} loc Optional default location object.\n * @returns {Object} lolcation object.\n * @public\n */\nfunction lolcation(loc) {\n  var globalVar;\n\n  if (typeof window !== 'undefined') globalVar = window;\n  else if (typeof commonjsGlobal !== 'undefined') globalVar = commonjsGlobal;\n  else if (typeof self !== 'undefined') globalVar = self;\n  else globalVar = {};\n\n  var location = globalVar.location || {};\n  loc = loc || location;\n\n  var finaldestination = {}\n    , type = typeof loc\n    , key;\n\n  if ('blob:' === loc.protocol) {\n    finaldestination = new Url(unescape(loc.pathname), {});\n  } else if ('string' === type) {\n    finaldestination = new Url(loc, {});\n    for (key in ignore) delete finaldestination[key];\n  } else if ('object' === type) {\n    for (key in loc) {\n      if (key in ignore) continue;\n      finaldestination[key] = loc[key];\n    }\n\n    if (finaldestination.slashes === undefined) {\n      finaldestination.slashes = slashes.test(loc.href);\n    }\n  }\n\n  return finaldestination;\n}\n\n/**\n * Check whether a protocol scheme is special.\n *\n * @param {String} The protocol scheme of the URL\n * @return {Boolean} `true` if the protocol scheme is special, else `false`\n * @private\n */\nfunction isSpecial(scheme) {\n  return (\n    scheme === 'file:' ||\n    scheme === 'ftp:' ||\n    scheme === 'http:' ||\n    scheme === 'https:' ||\n    scheme === 'ws:' ||\n    scheme === 'wss:'\n  );\n}\n\n/**\n * @typedef ProtocolExtract\n * @type Object\n * @property {String} protocol Protocol matched in the URL, in lowercase.\n * @property {Boolean} slashes `true` if protocol is followed by \"//\", else `false`.\n * @property {String} rest Rest of the URL that is not part of the protocol.\n */\n\n/**\n * Extract protocol information from a URL with/without double slash (\"//\").\n *\n * @param {String} address URL we want to extract from.\n * @param {Object} location\n * @return {ProtocolExtract} Extracted information.\n * @private\n */\nfunction extractProtocol(address, location) {\n  address = trimLeft(address);\n  location = location || {};\n\n  var match = protocolre.exec(address);\n  var protocol = match[1] ? match[1].toLowerCase() : '';\n  var forwardSlashes = !!match[2];\n  var otherSlashes = !!match[3];\n  var slashesCount = 0;\n  var rest;\n\n  if (forwardSlashes) {\n    if (otherSlashes) {\n      rest = match[2] + match[3] + match[4];\n      slashesCount = match[2].length + match[3].length;\n    } else {\n      rest = match[2] + match[4];\n      slashesCount = match[2].length;\n    }\n  } else {\n    if (otherSlashes) {\n      rest = match[3] + match[4];\n      slashesCount = match[3].length;\n    } else {\n      rest = match[4];\n    }\n  }\n\n  if (protocol === 'file:') {\n    if (slashesCount >= 2) {\n      rest = rest.slice(2);\n    }\n  } else if (isSpecial(protocol)) {\n    rest = match[4];\n  } else if (protocol) {\n    if (forwardSlashes) {\n      rest = rest.slice(2);\n    }\n  } else if (slashesCount >= 2 && isSpecial(location.protocol)) {\n    rest = match[4];\n  }\n\n  return {\n    protocol: protocol,\n    slashes: forwardSlashes || isSpecial(protocol),\n    slashesCount: slashesCount,\n    rest: rest\n  };\n}\n\n/**\n * Resolve a relative URL pathname against a base URL pathname.\n *\n * @param {String} relative Pathname of the relative URL.\n * @param {String} base Pathname of the base URL.\n * @return {String} Resolved pathname.\n * @private\n */\nfunction resolve(relative, base) {\n  if (relative === '') return base;\n\n  var path = (base || '/').split('/').slice(0, -1).concat(relative.split('/'))\n    , i = path.length\n    , last = path[i - 1]\n    , unshift = false\n    , up = 0;\n\n  while (i--) {\n    if (path[i] === '.') {\n      path.splice(i, 1);\n    } else if (path[i] === '..') {\n      path.splice(i, 1);\n      up++;\n    } else if (up) {\n      if (i === 0) unshift = true;\n      path.splice(i, 1);\n      up--;\n    }\n  }\n\n  if (unshift) path.unshift('');\n  if (last === '.' || last === '..') path.push('');\n\n  return path.join('/');\n}\n\n/**\n * The actual URL instance. Instead of returning an object we've opted-in to\n * create an actual constructor as it's much more memory efficient and\n * faster and it pleases my OCD.\n *\n * It is worth noting that we should not use `URL` as class name to prevent\n * clashes with the global URL instance that got introduced in browsers.\n *\n * @constructor\n * @param {String} address URL we want to parse.\n * @param {Object|String} [location] Location defaults for relative paths.\n * @param {Boolean|Function} [parser] Parser for the query string.\n * @private\n */\nfunction Url(address, location, parser) {\n  address = trimLeft(address);\n\n  if (!(this instanceof Url)) {\n    return new Url(address, location, parser);\n  }\n\n  var relative, extracted, parse, instruction, index, key\n    , instructions = rules.slice()\n    , type = typeof location\n    , url = this\n    , i = 0;\n\n  //\n  // The following if statements allows this module two have compatibility with\n  // 2 different API:\n  //\n  // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments\n  //    where the boolean indicates that the query string should also be parsed.\n  //\n  // 2. The `URL` interface of the browser which accepts a URL, object as\n  //    arguments. The supplied object will be used as default values / fall-back\n  //    for relative paths.\n  //\n  if ('object' !== type && 'string' !== type) {\n    parser = location;\n    location = null;\n  }\n\n  if (parser && 'function' !== typeof parser) parser = querystringify_1.parse;\n\n  location = lolcation(location);\n\n  //\n  // Extract protocol information before running the instructions.\n  //\n  extracted = extractProtocol(address || '', location);\n  relative = !extracted.protocol && !extracted.slashes;\n  url.slashes = extracted.slashes || relative && location.slashes;\n  url.protocol = extracted.protocol || location.protocol || '';\n  address = extracted.rest;\n\n  //\n  // When the authority component is absent the URL starts with a path\n  // component.\n  //\n  if (\n    extracted.protocol === 'file:' && (\n      extracted.slashesCount !== 2 || windowsDriveLetter.test(address)) ||\n    (!extracted.slashes &&\n      (extracted.protocol ||\n        extracted.slashesCount < 2 ||\n        !isSpecial(url.protocol)))\n  ) {\n    instructions[3] = [/(.*)/, 'pathname'];\n  }\n\n  for (; i < instructions.length; i++) {\n    instruction = instructions[i];\n\n    if (typeof instruction === 'function') {\n      address = instruction(address, url);\n      continue;\n    }\n\n    parse = instruction[0];\n    key = instruction[1];\n\n    if (parse !== parse) {\n      url[key] = address;\n    } else if ('string' === typeof parse) {\n      if (~(index = address.indexOf(parse))) {\n        if ('number' === typeof instruction[2]) {\n          url[key] = address.slice(0, index);\n          address = address.slice(index + instruction[2]);\n        } else {\n          url[key] = address.slice(index);\n          address = address.slice(0, index);\n        }\n      }\n    } else if ((index = parse.exec(address))) {\n      url[key] = index[1];\n      address = address.slice(0, index.index);\n    }\n\n    url[key] = url[key] || (\n      relative && instruction[3] ? location[key] || '' : ''\n    );\n\n    //\n    // Hostname, host and protocol should be lowercased so they can be used to\n    // create a proper `origin`.\n    //\n    if (instruction[4]) url[key] = url[key].toLowerCase();\n  }\n\n  //\n  // Also parse the supplied query string in to an object. If we're supplied\n  // with a custom parser as function use that instead of the default build-in\n  // parser.\n  //\n  if (parser) url.query = parser(url.query);\n\n  //\n  // If the URL is relative, resolve the pathname against the base URL.\n  //\n  if (\n      relative\n    && location.slashes\n    && url.pathname.charAt(0) !== '/'\n    && (url.pathname !== '' || location.pathname !== '')\n  ) {\n    url.pathname = resolve(url.pathname, location.pathname);\n  }\n\n  //\n  // Default to a / for pathname if none exists. This normalizes the URL\n  // to always have a /\n  //\n  if (url.pathname.charAt(0) !== '/' && isSpecial(url.protocol)) {\n    url.pathname = '/' + url.pathname;\n  }\n\n  //\n  // We should not add port numbers if they are already the default port number\n  // for a given protocol. As the host also contains the port number we're going\n  // override it with the hostname which contains no port number.\n  //\n  if (!requiresPort(url.port, url.protocol)) {\n    url.host = url.hostname;\n    url.port = '';\n  }\n\n  //\n  // Parse down the `auth` for the username and password.\n  //\n  url.username = url.password = '';\n  if (url.auth) {\n    instruction = url.auth.split(':');\n    url.username = instruction[0] || '';\n    url.password = instruction[1] || '';\n  }\n\n  url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host\n    ? url.protocol +'//'+ url.host\n    : 'null';\n\n  //\n  // The href is just the compiled result.\n  //\n  url.href = url.toString();\n}\n\n/**\n * This is convenience method for changing properties in the URL instance to\n * insure that they all propagate correctly.\n *\n * @param {String} part          Property we need to adjust.\n * @param {Mixed} value          The newly assigned value.\n * @param {Boolean|Function} fn  When setting the query, it will be the function\n *                               used to parse the query.\n *                               When setting the protocol, double slash will be\n *                               removed from the final url if it is true.\n * @returns {URL} URL instance for chaining.\n * @public\n */\nfunction set(part, value, fn) {\n  var url = this;\n\n  switch (part) {\n    case 'query':\n      if ('string' === typeof value && value.length) {\n        value = (fn || querystringify_1.parse)(value);\n      }\n\n      url[part] = value;\n      break;\n\n    case 'port':\n      url[part] = value;\n\n      if (!requiresPort(value, url.protocol)) {\n        url.host = url.hostname;\n        url[part] = '';\n      } else if (value) {\n        url.host = url.hostname +':'+ value;\n      }\n\n      break;\n\n    case 'hostname':\n      url[part] = value;\n\n      if (url.port) value += ':'+ url.port;\n      url.host = value;\n      break;\n\n    case 'host':\n      url[part] = value;\n\n      if (/:\\d+$/.test(value)) {\n        value = value.split(':');\n        url.port = value.pop();\n        url.hostname = value.join(':');\n      } else {\n        url.hostname = value;\n        url.port = '';\n      }\n\n      break;\n\n    case 'protocol':\n      url.protocol = value.toLowerCase();\n      url.slashes = !fn;\n      break;\n\n    case 'pathname':\n    case 'hash':\n      if (value) {\n        var char = part === 'pathname' ? '/' : '#';\n        url[part] = value.charAt(0) !== char ? char + value : value;\n      } else {\n        url[part] = value;\n      }\n      break;\n\n    default:\n      url[part] = value;\n  }\n\n  for (var i = 0; i < rules.length; i++) {\n    var ins = rules[i];\n\n    if (ins[4]) url[ins[1]] = url[ins[1]].toLowerCase();\n  }\n\n  url.origin = url.protocol !== 'file:' && isSpecial(url.protocol) && url.host\n    ? url.protocol +'//'+ url.host\n    : 'null';\n\n  url.href = url.toString();\n\n  return url;\n}\n\n/**\n * Transform the properties back in to a valid and full URL string.\n *\n * @param {Function} stringify Optional query stringify function.\n * @returns {String} Compiled version of the URL.\n * @public\n */\nfunction toString(stringify) {\n  if (!stringify || 'function' !== typeof stringify) stringify = querystringify_1.stringify;\n\n  var query\n    , url = this\n    , protocol = url.protocol;\n\n  if (protocol && protocol.charAt(protocol.length - 1) !== ':') protocol += ':';\n\n  var result = protocol + (url.slashes || isSpecial(url.protocol) ? '//' : '');\n\n  if (url.username) {\n    result += url.username;\n    if (url.password) result += ':'+ url.password;\n    result += '@';\n  }\n\n  result += url.host + url.pathname;\n\n  query = 'object' === typeof url.query ? stringify(url.query) : url.query;\n  if (query) result += '?' !== query.charAt(0) ? '?'+ query : query;\n\n  if (url.hash) result += url.hash;\n\n  return result;\n}\n\nUrl.prototype = { set: set, toString: toString };\n\n//\n// Expose the URL parser and some additional properties that might be useful for\n// others or testing.\n//\nUrl.extractProtocol = extractProtocol;\nUrl.location = lolcation;\nUrl.trimLeft = trimLeft;\nUrl.qs = querystringify_1;\n\nvar urlParse = Url;\n\n/**\n * parseURL - decompose a URL into its parts\n * @param  {String} url a URL\n * @return {Object} parts of the URL, including the following\n *\n * 'https://www.yahoo.com:1234/mypage?test=yes#abc'\n *\n * {\n *   host: 'www.yahoo.com:1234',\n *   protocol: 'https:',\n *   search: '?test=yes',\n *   hash: '#abc',\n *   href: 'https://www.yahoo.com:1234/mypage?test=yes#abc',\n *   pathname: '/mypage',\n *   fullpath: '/mypage?test=yes'\n * }\n */\nfunction parseURL(url) {\n    var parsedUrl = new urlParse(url);\n    if (!parsedUrl.host) {\n        // eslint-disable-next-line no-self-assign\n        parsedUrl.href = parsedUrl.href; // IE: load the host and protocol\n    }\n    var pathname = parsedUrl.pathname;\n    if (pathname.charAt(0) !== '/') {\n        pathname = '/' + pathname; // IE: prepend leading slash\n    }\n    var host = parsedUrl.host;\n    if (parsedUrl.port === '80' || parsedUrl.port === '443') {\n        host = parsedUrl.hostname; // IE: remove default port\n    }\n    return {\n        host: host,\n        protocol: parsedUrl.protocol,\n        search: parsedUrl.query,\n        hash: parsedUrl.hash,\n        href: parsedUrl.href,\n        pathname: pathname,\n        fullpath: pathname + (parsedUrl.query || '') + (parsedUrl.hash || '')\n    };\n}\n\n/**\n * Registry\n *\n * A registry is a map of HTTP verbs to route recognizers.\n */\nvar Registry = /** @class */ (function () {\n    function Registry( /* host */) {\n        // Herein we keep track of RouteRecognizer instances\n        // keyed by HTTP method. Feel free to add more as needed.\n        this.verbs = {\n            GET: new RouteRecognizer(),\n            PUT: new RouteRecognizer(),\n            POST: new RouteRecognizer(),\n            DELETE: new RouteRecognizer(),\n            PATCH: new RouteRecognizer(),\n            HEAD: new RouteRecognizer(),\n            OPTIONS: new RouteRecognizer()\n        };\n    }\n    return Registry;\n}());\n\n/**\n * Hosts\n *\n * a map of hosts to Registries, ultimately allowing\n * a per-host-and-port, per HTTP verb lookup of RouteRecognizers\n */\nvar Hosts = /** @class */ (function () {\n    function Hosts() {\n        this.registries = {};\n    }\n    /**\n     * Hosts#forURL - retrieve a map of HTTP verbs to RouteRecognizers\n     *                for a given URL\n     *\n     * @param  {String} url a URL\n     * @return {Registry}   a map of HTTP verbs to RouteRecognizers\n     *                      corresponding to the provided URL's\n     *                      hostname and port\n     */\n    Hosts.prototype.forURL = function (url) {\n        var host = parseURL(url).host;\n        var registry = this.registries[host];\n        if (registry === undefined) {\n            registry = (this.registries[host] = new Registry( /*host*/));\n        }\n        return registry.verbs;\n    };\n    return Hosts;\n}());\n\nvar global$1 =\n  (typeof globalThis !== 'undefined' && globalThis) ||\n  (typeof self !== 'undefined' && self) ||\n  (typeof global$1 !== 'undefined' && global$1);\n\nvar support = {\n  searchParams: 'URLSearchParams' in global$1,\n  iterable: 'Symbol' in global$1 && 'iterator' in Symbol,\n  blob:\n    'FileReader' in global$1 &&\n    'Blob' in global$1 &&\n    (function() {\n      try {\n        new Blob();\n        return true\n      } catch (e) {\n        return false\n      }\n    })(),\n  formData: 'FormData' in global$1,\n  arrayBuffer: 'ArrayBuffer' in global$1\n};\n\nfunction isDataView(obj) {\n  return obj && DataView.prototype.isPrototypeOf(obj)\n}\n\nif (support.arrayBuffer) {\n  var viewClasses = [\n    '[object Int8Array]',\n    '[object Uint8Array]',\n    '[object Uint8ClampedArray]',\n    '[object Int16Array]',\n    '[object Uint16Array]',\n    '[object Int32Array]',\n    '[object Uint32Array]',\n    '[object Float32Array]',\n    '[object Float64Array]'\n  ];\n\n  var isArrayBufferView =\n    ArrayBuffer.isView ||\n    function(obj) {\n      return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n    };\n}\n\nfunction normalizeName(name) {\n  if (typeof name !== 'string') {\n    name = String(name);\n  }\n  if (/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {\n    throw new TypeError('Invalid character in header field name: \"' + name + '\"')\n  }\n  return name.toLowerCase()\n}\n\nfunction normalizeValue(value) {\n  if (typeof value !== 'string') {\n    value = String(value);\n  }\n  return value\n}\n\n// Build a destructive iterator for the value list\nfunction iteratorFor(items) {\n  var iterator = {\n    next: function() {\n      var value = items.shift();\n      return {done: value === undefined, value: value}\n    }\n  };\n\n  if (support.iterable) {\n    iterator[Symbol.iterator] = function() {\n      return iterator\n    };\n  }\n\n  return iterator\n}\n\nfunction Headers(headers) {\n  this.map = {};\n\n  if (headers instanceof Headers) {\n    headers.forEach(function(value, name) {\n      this.append(name, value);\n    }, this);\n  } else if (Array.isArray(headers)) {\n    headers.forEach(function(header) {\n      this.append(header[0], header[1]);\n    }, this);\n  } else if (headers) {\n    Object.getOwnPropertyNames(headers).forEach(function(name) {\n      this.append(name, headers[name]);\n    }, this);\n  }\n}\n\nHeaders.prototype.append = function(name, value) {\n  name = normalizeName(name);\n  value = normalizeValue(value);\n  var oldValue = this.map[name];\n  this.map[name] = oldValue ? oldValue + ', ' + value : value;\n};\n\nHeaders.prototype['delete'] = function(name) {\n  delete this.map[normalizeName(name)];\n};\n\nHeaders.prototype.get = function(name) {\n  name = normalizeName(name);\n  return this.has(name) ? this.map[name] : null\n};\n\nHeaders.prototype.has = function(name) {\n  return this.map.hasOwnProperty(normalizeName(name))\n};\n\nHeaders.prototype.set = function(name, value) {\n  this.map[normalizeName(name)] = normalizeValue(value);\n};\n\nHeaders.prototype.forEach = function(callback, thisArg) {\n  for (var name in this.map) {\n    if (this.map.hasOwnProperty(name)) {\n      callback.call(thisArg, this.map[name], name, this);\n    }\n  }\n};\n\nHeaders.prototype.keys = function() {\n  var items = [];\n  this.forEach(function(value, name) {\n    items.push(name);\n  });\n  return iteratorFor(items)\n};\n\nHeaders.prototype.values = function() {\n  var items = [];\n  this.forEach(function(value) {\n    items.push(value);\n  });\n  return iteratorFor(items)\n};\n\nHeaders.prototype.entries = function() {\n  var items = [];\n  this.forEach(function(value, name) {\n    items.push([name, value]);\n  });\n  return iteratorFor(items)\n};\n\nif (support.iterable) {\n  Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n}\n\nfunction consumed(body) {\n  if (body.bodyUsed) {\n    return Promise.reject(new TypeError('Already read'))\n  }\n  body.bodyUsed = true;\n}\n\nfunction fileReaderReady(reader) {\n  return new Promise(function(resolve, reject) {\n    reader.onload = function() {\n      resolve(reader.result);\n    };\n    reader.onerror = function() {\n      reject(reader.error);\n    };\n  })\n}\n\nfunction readBlobAsArrayBuffer(blob) {\n  var reader = new FileReader();\n  var promise = fileReaderReady(reader);\n  reader.readAsArrayBuffer(blob);\n  return promise\n}\n\nfunction readBlobAsText(blob) {\n  var reader = new FileReader();\n  var promise = fileReaderReady(reader);\n  reader.readAsText(blob);\n  return promise\n}\n\nfunction readArrayBufferAsText(buf) {\n  var view = new Uint8Array(buf);\n  var chars = new Array(view.length);\n\n  for (var i = 0; i < view.length; i++) {\n    chars[i] = String.fromCharCode(view[i]);\n  }\n  return chars.join('')\n}\n\nfunction bufferClone(buf) {\n  if (buf.slice) {\n    return buf.slice(0)\n  } else {\n    var view = new Uint8Array(buf.byteLength);\n    view.set(new Uint8Array(buf));\n    return view.buffer\n  }\n}\n\nfunction Body() {\n  this.bodyUsed = false;\n\n  this._initBody = function(body) {\n    /*\n      fetch-mock wraps the Response object in an ES6 Proxy to\n      provide useful test harness features such as flush. However, on\n      ES5 browsers without fetch or Proxy support pollyfills must be used;\n      the proxy-pollyfill is unable to proxy an attribute unless it exists\n      on the object before the Proxy is created. This change ensures\n      Response.bodyUsed exists on the instance, while maintaining the\n      semantic of setting Request.bodyUsed in the constructor before\n      _initBody is called.\n    */\n    this.bodyUsed = this.bodyUsed;\n    this._bodyInit = body;\n    if (!body) {\n      this._bodyText = '';\n    } else if (typeof body === 'string') {\n      this._bodyText = body;\n    } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n      this._bodyBlob = body;\n    } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n      this._bodyFormData = body;\n    } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n      this._bodyText = body.toString();\n    } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n      this._bodyArrayBuffer = bufferClone(body.buffer);\n      // IE 10-11 can't handle a DataView body.\n      this._bodyInit = new Blob([this._bodyArrayBuffer]);\n    } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n      this._bodyArrayBuffer = bufferClone(body);\n    } else {\n      this._bodyText = body = Object.prototype.toString.call(body);\n    }\n\n    if (!this.headers.get('content-type')) {\n      if (typeof body === 'string') {\n        this.headers.set('content-type', 'text/plain;charset=UTF-8');\n      } else if (this._bodyBlob && this._bodyBlob.type) {\n        this.headers.set('content-type', this._bodyBlob.type);\n      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n        this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n      }\n    }\n  };\n\n  if (support.blob) {\n    this.blob = function() {\n      var rejected = consumed(this);\n      if (rejected) {\n        return rejected\n      }\n\n      if (this._bodyBlob) {\n        return Promise.resolve(this._bodyBlob)\n      } else if (this._bodyArrayBuffer) {\n        return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n      } else if (this._bodyFormData) {\n        throw new Error('could not read FormData body as blob')\n      } else {\n        return Promise.resolve(new Blob([this._bodyText]))\n      }\n    };\n\n    this.arrayBuffer = function() {\n      if (this._bodyArrayBuffer) {\n        var isConsumed = consumed(this);\n        if (isConsumed) {\n          return isConsumed\n        }\n        if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n          return Promise.resolve(\n            this._bodyArrayBuffer.buffer.slice(\n              this._bodyArrayBuffer.byteOffset,\n              this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n            )\n          )\n        } else {\n          return Promise.resolve(this._bodyArrayBuffer)\n        }\n      } else {\n        return this.blob().then(readBlobAsArrayBuffer)\n      }\n    };\n  }\n\n  this.text = function() {\n    var rejected = consumed(this);\n    if (rejected) {\n      return rejected\n    }\n\n    if (this._bodyBlob) {\n      return readBlobAsText(this._bodyBlob)\n    } else if (this._bodyArrayBuffer) {\n      return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n    } else if (this._bodyFormData) {\n      throw new Error('could not read FormData body as text')\n    } else {\n      return Promise.resolve(this._bodyText)\n    }\n  };\n\n  if (support.formData) {\n    this.formData = function() {\n      return this.text().then(decode$1)\n    };\n  }\n\n  this.json = function() {\n    return this.text().then(JSON.parse)\n  };\n\n  return this\n}\n\n// HTTP methods whose capitalization should be normalized\nvar methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];\n\nfunction normalizeMethod(method) {\n  var upcased = method.toUpperCase();\n  return methods.indexOf(upcased) > -1 ? upcased : method\n}\n\nfunction Request(input, options) {\n  if (!(this instanceof Request)) {\n    throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n  }\n\n  options = options || {};\n  var body = options.body;\n\n  if (input instanceof Request) {\n    if (input.bodyUsed) {\n      throw new TypeError('Already read')\n    }\n    this.url = input.url;\n    this.credentials = input.credentials;\n    if (!options.headers) {\n      this.headers = new Headers(input.headers);\n    }\n    this.method = input.method;\n    this.mode = input.mode;\n    this.signal = input.signal;\n    if (!body && input._bodyInit != null) {\n      body = input._bodyInit;\n      input.bodyUsed = true;\n    }\n  } else {\n    this.url = String(input);\n  }\n\n  this.credentials = options.credentials || this.credentials || 'same-origin';\n  if (options.headers || !this.headers) {\n    this.headers = new Headers(options.headers);\n  }\n  this.method = normalizeMethod(options.method || this.method || 'GET');\n  this.mode = options.mode || this.mode || null;\n  this.signal = options.signal || this.signal;\n  this.referrer = null;\n\n  if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n    throw new TypeError('Body not allowed for GET or HEAD requests')\n  }\n  this._initBody(body);\n\n  if (this.method === 'GET' || this.method === 'HEAD') {\n    if (options.cache === 'no-store' || options.cache === 'no-cache') {\n      // Search for a '_' parameter in the query string\n      var reParamSearch = /([?&])_=[^&]*/;\n      if (reParamSearch.test(this.url)) {\n        // If it already exists then set the value with the current time\n        this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime());\n      } else {\n        // Otherwise add a new '_' parameter to the end with the current time\n        var reQueryString = /\\?/;\n        this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime();\n      }\n    }\n  }\n}\n\nRequest.prototype.clone = function() {\n  return new Request(this, {body: this._bodyInit})\n};\n\nfunction decode$1(body) {\n  var form = new FormData();\n  body\n    .trim()\n    .split('&')\n    .forEach(function(bytes) {\n      if (bytes) {\n        var split = bytes.split('=');\n        var name = split.shift().replace(/\\+/g, ' ');\n        var value = split.join('=').replace(/\\+/g, ' ');\n        form.append(decodeURIComponent(name), decodeURIComponent(value));\n      }\n    });\n  return form\n}\n\nfunction parseHeaders(rawHeaders) {\n  var headers = new Headers();\n  // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n  // https://tools.ietf.org/html/rfc7230#section-3.2\n  var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n  // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n  // https://github.com/github/fetch/issues/748\n  // https://github.com/zloirock/core-js/issues/751\n  preProcessedHeaders\n    .split('\\r')\n    .map(function(header) {\n      return header.indexOf('\\n') === 0 ? header.substr(1, header.length) : header\n    })\n    .forEach(function(line) {\n      var parts = line.split(':');\n      var key = parts.shift().trim();\n      if (key) {\n        var value = parts.join(':').trim();\n        headers.append(key, value);\n      }\n    });\n  return headers\n}\n\nBody.call(Request.prototype);\n\nfunction Response(bodyInit, options) {\n  if (!(this instanceof Response)) {\n    throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n  }\n  if (!options) {\n    options = {};\n  }\n\n  this.type = 'default';\n  this.status = options.status === undefined ? 200 : options.status;\n  this.ok = this.status >= 200 && this.status < 300;\n  this.statusText = options.statusText === undefined ? '' : '' + options.statusText;\n  this.headers = new Headers(options.headers);\n  this.url = options.url || '';\n  this._initBody(bodyInit);\n}\n\nBody.call(Response.prototype);\n\nResponse.prototype.clone = function() {\n  return new Response(this._bodyInit, {\n    status: this.status,\n    statusText: this.statusText,\n    headers: new Headers(this.headers),\n    url: this.url\n  })\n};\n\nResponse.error = function() {\n  var response = new Response(null, {status: 0, statusText: ''});\n  response.type = 'error';\n  return response\n};\n\nvar redirectStatuses = [301, 302, 303, 307, 308];\n\nResponse.redirect = function(url, status) {\n  if (redirectStatuses.indexOf(status) === -1) {\n    throw new RangeError('Invalid status code')\n  }\n\n  return new Response(null, {status: status, headers: {location: url}})\n};\n\nvar DOMException = global$1.DOMException;\ntry {\n  new DOMException();\n} catch (err) {\n  DOMException = function(message, name) {\n    this.message = message;\n    this.name = name;\n    var error = Error(message);\n    this.stack = error.stack;\n  };\n  DOMException.prototype = Object.create(Error.prototype);\n  DOMException.prototype.constructor = DOMException;\n}\n\nfunction fetch(input, init) {\n  return new Promise(function(resolve, reject) {\n    var request = new Request(input, init);\n\n    if (request.signal && request.signal.aborted) {\n      return reject(new DOMException('Aborted', 'AbortError'))\n    }\n\n    var xhr = new XMLHttpRequest();\n\n    function abortXhr() {\n      xhr.abort();\n    }\n\n    xhr.onload = function() {\n      var options = {\n        status: xhr.status,\n        statusText: xhr.statusText,\n        headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n      };\n      options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n      var body = 'response' in xhr ? xhr.response : xhr.responseText;\n      setTimeout(function() {\n        resolve(new Response(body, options));\n      }, 0);\n    };\n\n    xhr.onerror = function() {\n      setTimeout(function() {\n        reject(new TypeError('Network request failed'));\n      }, 0);\n    };\n\n    xhr.ontimeout = function() {\n      setTimeout(function() {\n        reject(new TypeError('Network request failed'));\n      }, 0);\n    };\n\n    xhr.onabort = function() {\n      setTimeout(function() {\n        reject(new DOMException('Aborted', 'AbortError'));\n      }, 0);\n    };\n\n    function fixUrl(url) {\n      try {\n        return url === '' && global$1.location.href ? global$1.location.href : url\n      } catch (e) {\n        return url\n      }\n    }\n\n    xhr.open(request.method, fixUrl(request.url), true);\n\n    if (request.credentials === 'include') {\n      xhr.withCredentials = true;\n    } else if (request.credentials === 'omit') {\n      xhr.withCredentials = false;\n    }\n\n    if ('responseType' in xhr) {\n      if (support.blob) {\n        xhr.responseType = 'blob';\n      } else if (\n        support.arrayBuffer &&\n        request.headers.get('Content-Type') &&\n        request.headers.get('Content-Type').indexOf('application/octet-stream') !== -1\n      ) {\n        xhr.responseType = 'arraybuffer';\n      }\n    }\n\n    if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers)) {\n      Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n        xhr.setRequestHeader(name, normalizeValue(init.headers[name]));\n      });\n    } else {\n      request.headers.forEach(function(value, name) {\n        xhr.setRequestHeader(name, value);\n      });\n    }\n\n    if (request.signal) {\n      request.signal.addEventListener('abort', abortXhr);\n\n      xhr.onreadystatechange = function() {\n        // DONE (success or failure)\n        if (xhr.readyState === 4) {\n          request.signal.removeEventListener('abort', abortXhr);\n        }\n      };\n    }\n\n    xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n  })\n}\n\nfetch.polyfill = true;\n\nif (!global$1.fetch) {\n  global$1.fetch = fetch;\n  global$1.Headers = Headers;\n  global$1.Request = Request;\n  global$1.Response = Response;\n}\n\nvar FakeFetch = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tHeaders: Headers,\n\tRequest: Request,\n\tResponse: Response,\n\tget DOMException () { return DOMException; },\n\tfetch: fetch\n});\n\nfunction createPassthrough(fakeXHR, nativeXMLHttpRequest) {\n    // event types to handle on the xhr\n    var evts = ['error', 'timeout', 'abort', 'readystatechange'];\n    // event types to handle on the xhr.upload\n    var uploadEvents = [];\n    // properties to copy from the native xhr to fake xhr\n    var lifecycleProps = [\n        'readyState',\n        'responseText',\n        'response',\n        'responseXML',\n        'responseURL',\n        'status',\n        'statusText',\n    ];\n    var xhr = (fakeXHR._passthroughRequest = new nativeXMLHttpRequest());\n    xhr.open(fakeXHR.method, fakeXHR.url, fakeXHR.async, fakeXHR.username, fakeXHR.password);\n    if (fakeXHR.responseType === 'arraybuffer') {\n        lifecycleProps = ['readyState', 'response', 'status', 'statusText'];\n        xhr.responseType = fakeXHR.responseType;\n    }\n    // use onload if the browser supports it\n    if ('onload' in xhr) {\n        evts.push('load');\n    }\n    // add progress event for async calls\n    // avoid using progress events for sync calls, they will hang https://bugs.webkit.org/show_bug.cgi?id=40996.\n    if (fakeXHR.async && fakeXHR.responseType !== 'arraybuffer') {\n        evts.push('progress');\n        uploadEvents.push('progress');\n    }\n    // update `propertyNames` properties from `fromXHR` to `toXHR`\n    function copyLifecycleProperties(propertyNames, fromXHR, toXHR) {\n        for (var i = 0; i < propertyNames.length; i++) {\n            var prop = propertyNames[i];\n            if (prop in fromXHR) {\n                toXHR[prop] = fromXHR[prop];\n            }\n        }\n    }\n    // fire fake event on `eventable`\n    function dispatchEvent(eventable, eventType, event) {\n        eventable.dispatchEvent(event);\n        if (eventable['on' + eventType]) {\n            eventable['on' + eventType](event);\n        }\n    }\n    // set the on- handler on the native xhr for the given eventType\n    function createHandler(eventType) {\n        xhr['on' + eventType] = function (event) {\n            copyLifecycleProperties(lifecycleProps, xhr, fakeXHR);\n            dispatchEvent(fakeXHR, eventType, event);\n        };\n    }\n    // set the on- handler on the native xhr's `upload` property for\n    // the given eventType\n    function createUploadHandler(eventType) {\n        if (xhr.upload && fakeXHR.upload && fakeXHR.upload['on' + eventType]) {\n            xhr.upload['on' + eventType] = function (event) {\n                dispatchEvent(fakeXHR.upload, eventType, event);\n            };\n        }\n    }\n    var i;\n    for (i = 0; i < evts.length; i++) {\n        createHandler(evts[i]);\n    }\n    for (i = 0; i < uploadEvents.length; i++) {\n        createUploadHandler(uploadEvents[i]);\n    }\n    if (fakeXHR.async) {\n        xhr.timeout = fakeXHR.timeout;\n        xhr.withCredentials = fakeXHR.withCredentials;\n    }\n    // XMLHttpRequest.timeout default initializes to 0, and is not allowed to be used for\n    // synchronous XMLHttpRequests requests in a document environment. However, when a XHR\n    // polyfill does not sets the timeout value, it will throw in React Native environment.\n    // TODO:\n    // synchronous XHR is deprecated, make async the default as XMLHttpRequest.open(),\n    // and throw error if sync XHR has timeout not 0\n    if (!xhr.timeout && xhr.timeout !== 0) {\n        xhr.timeout = 0; // default XMLHttpRequest timeout\n    }\n    for (var h in fakeXHR.requestHeaders) {\n        xhr.setRequestHeader(h, fakeXHR.requestHeaders[h]);\n    }\n    return xhr;\n}\n\nfunction interceptor(ctx) {\n    function FakeRequest() {\n        // super()\n        FakeXMLHttpRequest.call(this);\n    }\n    FakeRequest.prototype = Object.create(FakeXMLHttpRequest.prototype);\n    FakeRequest.prototype.constructor = FakeRequest;\n    // extend\n    FakeRequest.prototype.send = function send() {\n        this.sendArguments = arguments;\n        if (!ctx.pretender.running) {\n            throw new Error('You shut down a Pretender instance while there was a pending request. ' +\n                'That request just tried to complete. Check to see if you accidentally shut down ' +\n                'a pretender earlier than you intended to');\n        }\n        FakeXMLHttpRequest.prototype.send.apply(this, arguments);\n        if (ctx.pretender.checkPassthrough(this)) {\n            this.passthrough();\n        }\n        else {\n            ctx.pretender.handleRequest(this);\n        }\n    };\n    FakeRequest.prototype.passthrough = function passthrough() {\n        if (!this.sendArguments) {\n            throw new Error('You attempted to passthrough a FakeRequest that was never sent. ' +\n                'Call `.send()` on the original request first');\n        }\n        var xhr = createPassthrough(this, ctx.pretender._nativeXMLHttpRequest);\n        xhr.send.apply(xhr, this.sendArguments);\n        return xhr;\n    };\n    FakeRequest.prototype._passthroughCheck = function (method, args) {\n        if (this._passthroughRequest) {\n            return this._passthroughRequest[method].apply(this._passthroughRequest, args);\n        }\n        return FakeXMLHttpRequest.prototype[method].apply(this, args);\n    };\n    FakeRequest.prototype.abort = function abort() {\n        return this._passthroughCheck('abort', arguments);\n    };\n    FakeRequest.prototype.getResponseHeader = function getResponseHeader() {\n        return this._passthroughCheck('getResponseHeader', arguments);\n    };\n    FakeRequest.prototype.getAllResponseHeaders = function getAllResponseHeaders() {\n        return this._passthroughCheck('getAllResponseHeaders', arguments);\n    };\n    if (ctx.pretender._nativeXMLHttpRequest.prototype._passthroughCheck) {\n        // eslint-disable-next-line no-console\n        console.warn('You created a second Pretender instance while there was already one running. ' +\n            'Running two Pretender servers at once will lead to unexpected results and will ' +\n            'be removed entirely in a future major version.' +\n            'Please call .shutdown() on your instances when you no longer need them to respond.');\n    }\n    return FakeRequest;\n}\n\nvar NoopArray = /** @class */ (function () {\n    function NoopArray() {\n        this.length = 0;\n    }\n    NoopArray.prototype.push = function () {\n        var _items = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            _items[_i] = arguments[_i];\n        }\n        return 0;\n    };\n    return NoopArray;\n}());\nfunction scheduleProgressEvent(request, startTime, totalTime) {\n    var totalSize = 0;\n    var body = request.requestBody;\n    if (body) {\n        if (body instanceof FormData) {\n            body.forEach(function (value) {\n                if (value instanceof File) {\n                    totalSize += value.size;\n                }\n                else {\n                    totalSize += value.length;\n                }\n            });\n        }\n        else {\n            // Support Blob, BufferSource, USVString, ArrayBufferView\n            totalSize = body.byteLength || body.size || body.length || 0;\n        }\n    }\n    setTimeout(function () {\n        if (!request.aborted && !request.status) {\n            var elapsedTime = new Date().getTime() - startTime.getTime();\n            var progressTransmitted = totalTime <= 0 ? 0 : (elapsedTime / totalTime) * totalSize;\n            // ProgressEvent expects loaded, total\n            // https://xhr.spec.whatwg.org/#interface-progressevent\n            request.upload._progress(true, progressTransmitted, totalSize);\n            request._progress(true, progressTransmitted, totalSize);\n            scheduleProgressEvent(request, startTime, totalTime);\n        }\n        else if (request.status) {\n            // we're done, send a final progress event with loaded === total\n            request.upload._progress(true, totalSize, totalSize);\n            request._progress(true, totalSize, totalSize);\n        }\n    }, 50);\n}\nfunction isArray(array) {\n    return Object.prototype.toString.call(array) === '[object Array]';\n}\nvar PASSTHROUGH = {};\nfunction verbify(verb) {\n    return function (path, handler, async) {\n        return this.register(verb, path, handler, async);\n    };\n}\nvar Pretender = /** @class */ (function () {\n    function Pretender() {\n        var _this = this;\n        this.hosts = new Hosts();\n        this.handlers = [];\n        this.get = verbify('GET');\n        this.post = verbify('POST');\n        this.put = verbify('PUT');\n        this.delete = verbify('DELETE');\n        this.patch = verbify('PATCH');\n        this.head = verbify('HEAD');\n        this.options = verbify('OPTIONS');\n        this.passthrough = PASSTHROUGH;\n        var lastArg = arguments[arguments.length - 1];\n        var options = typeof lastArg === 'object' ? lastArg : null;\n        var shouldNotTrack = options && options.trackRequests === false;\n        this.handledRequests = shouldNotTrack ? new NoopArray() : [];\n        this.passthroughRequests = shouldNotTrack ? new NoopArray() : [];\n        this.unhandledRequests = shouldNotTrack ? new NoopArray() : [];\n        this.requestReferences = [];\n        this.forcePassthrough = options && options.forcePassthrough === true;\n        this.disableUnhandled = options && options.disableUnhandled === true;\n        // reference the native XMLHttpRequest object so\n        // it can be restored later\n        this._nativeXMLHttpRequest = self.XMLHttpRequest;\n        this.running = false;\n        var ctx = { pretender: this };\n        this.ctx = ctx;\n        // capture xhr requests, channeling them into\n        // the route map.\n        self.XMLHttpRequest = interceptor(ctx);\n        // polyfill fetch when xhr is ready\n        this._fetchProps = FakeFetch\n            ? ['fetch', 'Headers', 'Request', 'Response']\n            : [];\n        this._fetchProps.forEach(function (name) {\n            _this['_native' + name] = self[name];\n            self[name] = FakeFetch[name];\n        }, this);\n        // 'start' the server\n        this.running = true;\n        // trigger the route map DSL.\n        var argLength = options ? arguments.length - 1 : arguments.length;\n        for (var i = 0; i < argLength; i++) {\n            this.map(arguments[i]);\n        }\n    }\n    Pretender.prototype.map = function (maps) {\n        maps.call(this);\n    };\n    Pretender.prototype.register = function (verb, url, handler, async) {\n        if (!handler) {\n            throw new Error('The function you tried passing to Pretender to handle ' +\n                verb +\n                ' ' +\n                url +\n                ' is undefined or missing.');\n        }\n        var handlerInstance = handler;\n        handlerInstance.numberOfCalls = 0;\n        handlerInstance.async = async;\n        this.handlers.push(handlerInstance);\n        var registry = this.hosts.forURL(url)[verb];\n        registry.add([\n            {\n                path: parseURL(url).fullpath,\n                handler: handlerInstance,\n            },\n        ]);\n        return handlerInstance;\n    };\n    Pretender.prototype.checkPassthrough = function (request) {\n        var verb = request.method.toUpperCase();\n        var path = parseURL(request.url).fullpath;\n        var recognized = this.hosts.forURL(request.url)[verb].recognize(path);\n        var match = recognized && recognized[0];\n        if ((match && match.handler === PASSTHROUGH) || this.forcePassthrough) {\n            this.passthroughRequests.push(request);\n            this.passthroughRequest(verb, path, request);\n            return true;\n        }\n        return false;\n    };\n    Pretender.prototype.handleRequest = function (request) {\n        var verb = request.method.toUpperCase();\n        var path = request.url;\n        var handler = this._handlerFor(verb, path, request);\n        if (handler) {\n            handler.handler.numberOfCalls++;\n            var async_1 = handler.handler.async;\n            this.handledRequests.push(request);\n            var pretender_1 = this;\n            var _handleRequest_1 = function (statusHeadersAndBody) {\n                if (!isArray(statusHeadersAndBody)) {\n                    var note = 'Remember to `return [status, headers, body];` in your route handler.';\n                    throw new Error('Nothing returned by handler for ' + path + '. ' + note);\n                }\n                var status = statusHeadersAndBody[0];\n                var headers = pretender_1.prepareHeaders(statusHeadersAndBody[1]);\n                var body = pretender_1.prepareBody(statusHeadersAndBody[2], headers);\n                pretender_1.handleResponse(request, async_1, function () {\n                    request.respond(status, headers, body);\n                    pretender_1.handledRequest(verb, path, request);\n                });\n            };\n            try {\n                var result = handler.handler(request);\n                if (result && typeof result.then === 'function') {\n                    // `result` is a promise, resolve it\n                    result.then(function (resolvedResult) {\n                        _handleRequest_1(resolvedResult);\n                    });\n                }\n                else {\n                    _handleRequest_1(result);\n                }\n            }\n            catch (error) {\n                this.erroredRequest(verb, path, request, error);\n                this.resolve(request);\n            }\n        }\n        else {\n            if (!this.disableUnhandled) {\n                this.unhandledRequests.push(request);\n                this.unhandledRequest(verb, path, request);\n            }\n        }\n    };\n    Pretender.prototype.handleResponse = function (request, strategy, callback) {\n        var delay = typeof strategy === 'function' ? strategy() : strategy;\n        delay = typeof delay === 'boolean' || typeof delay === 'number' ? delay : 0;\n        if (delay === false) {\n            callback();\n        }\n        else {\n            var pretender_2 = this;\n            pretender_2.requestReferences.push({\n                request: request,\n                callback: callback,\n            });\n            if (delay !== true) {\n                scheduleProgressEvent(request, new Date(), delay);\n                setTimeout(function () {\n                    pretender_2.resolve(request);\n                }, delay);\n            }\n        }\n    };\n    Pretender.prototype.resolve = function (request) {\n        for (var i = 0, len = this.requestReferences.length; i < len; i++) {\n            var res = this.requestReferences[i];\n            if (res.request === request) {\n                res.callback();\n                this.requestReferences.splice(i, 1);\n                break;\n            }\n        }\n    };\n    Pretender.prototype.requiresManualResolution = function (verb, path) {\n        var handler = this._handlerFor(verb.toUpperCase(), path, {});\n        if (!handler) {\n            return false;\n        }\n        var async = handler.handler.async;\n        return typeof async === 'function' ? async() === true : async === true;\n    };\n    Pretender.prototype.prepareBody = function (body, _headers) {\n        return body;\n    };\n    Pretender.prototype.prepareHeaders = function (headers) {\n        return headers;\n    };\n    Pretender.prototype.handledRequest = function (_verb, _path, _request) {\n        /* no-op */\n    };\n    Pretender.prototype.passthroughRequest = function (_verb, _path, _request) {\n        /* no-op */\n    };\n    Pretender.prototype.unhandledRequest = function (verb, path, _request) {\n        throw new Error('Pretender intercepted ' +\n            verb +\n            ' ' +\n            path +\n            ' but no handler was defined for this type of request');\n    };\n    Pretender.prototype.erroredRequest = function (verb, path, _request, error) {\n        error.message =\n            'Pretender intercepted ' +\n                verb +\n                ' ' +\n                path +\n                ' but encountered an error: ' +\n                error.message;\n        throw error;\n    };\n    Pretender.prototype.shutdown = function () {\n        var _this = this;\n        self.XMLHttpRequest = this._nativeXMLHttpRequest;\n        this._fetchProps.forEach(function (name) {\n            self[name] = _this['_native' + name];\n        }, this);\n        this.ctx.pretender = undefined;\n        // 'stop' the server\n        this.running = false;\n    };\n    Pretender.prototype._handlerFor = function (verb, url, request) {\n        var registry = this.hosts.forURL(url)[verb];\n        var matches = registry.recognize(parseURL(url).fullpath);\n        var match = matches ? matches[0] : null;\n        if (match) {\n            request.params = match.params;\n            request.queryParams = matches.queryParams;\n        }\n        return match;\n    };\n    Pretender.parseURL = parseURL;\n    Pretender.Hosts = Hosts;\n    Pretender.Registry = Registry;\n    return Pretender;\n}());\n\nPretender.parseURL = parseURL;\nPretender.Hosts = Hosts;\nPretender.Registry = Registry;\n\nexport default Pretender;\n","const createObject = Object.create;\nexport function createMap<T>() {\n  const map: { [key: string]: T | undefined } = createObject(null);\n  map[\"__\"] = undefined;\n  delete map[\"__\"];\n  return map;\n}\n","import { createMap } from \"./util\";\n\nexport interface Delegate {\n  contextEntered?(context: string, route: MatchDSL): void;\n  willAddRoute?(context: string | undefined, route: string): string;\n}\n\nexport type Opaque = {} | void | null | undefined;\n\nexport interface Route {\n  path: string;\n  handler: Opaque;\n  queryParams?: string[];\n}\n\nexport interface RouteRecognizer {\n  delegate: Delegate | undefined;\n  add(routes: Route[]): void;\n}\n\nexport interface MatchCallback {\n  (match: MatchDSL): void;\n}\n\nexport interface MatchDSL {\n  (path: string): ToDSL;\n  (path: string, callback: MatchCallback): void;\n}\n\nexport interface ToDSL {\n  to(name: string, callback?: MatchCallback): void;\n}\n\nclass Target implements ToDSL {\n  path: string;\n  matcher: Matcher;\n  delegate: Delegate | undefined;\n\n  constructor(path: string, matcher: Matcher, delegate: Delegate | undefined) {\n    this.path = path;\n    this.matcher = matcher;\n    this.delegate = delegate;\n  }\n\n  to(target: string, callback: MatchCallback) {\n    let delegate = this.delegate;\n\n    if (delegate && delegate.willAddRoute) {\n      target = delegate.willAddRoute(this.matcher.target, target);\n    }\n\n    this.matcher.add(this.path, target);\n\n    if (callback) {\n      if (callback.length === 0) { throw new Error(\"You must have an argument in the function passed to `to`\"); }\n      this.matcher.addChild(this.path, target, callback, this.delegate);\n    }\n  }\n}\n\nexport class Matcher {\n  routes: {\n    [path: string]: string | undefined;\n  };\n  children: {\n    [path: string]: Matcher | undefined;\n  };\n  target: string | undefined;\n\n  constructor(target?: string) {\n    this.routes = createMap<string>();\n    this.children = createMap<Matcher>();\n    this.target = target;\n  }\n\n  add(path: string, target: string) {\n    this.routes[path] = target;\n  }\n\n  addChild(path: string, target: string, callback: MatchCallback, delegate: Delegate | undefined) {\n    let matcher = new Matcher(target);\n    this.children[path] = matcher;\n\n    let match = generateMatch(path, matcher, delegate);\n\n    if (delegate && delegate.contextEntered) {\n      delegate.contextEntered(target, match);\n    }\n\n    callback(match);\n  }\n}\n\nfunction generateMatch(startingPath: string, matcher: Matcher, delegate: Delegate | undefined): MatchDSL {\n  function match(path: string): ToDSL;\n  function match(path: string, callback: MatchCallback): void;\n  function match(path: string, callback?: MatchCallback): ToDSL | void {\n    let fullPath = startingPath + path;\n    if (callback) {\n      callback(generateMatch(fullPath, matcher, delegate));\n    } else {\n      return new Target(fullPath, matcher, delegate);\n    }\n  };\n  return match;\n}\n\nfunction addRoute(routeArray: Route[], path: string, handler: any) {\n  let len = 0;\n  for (let i = 0; i < routeArray.length; i++) {\n    len += routeArray[i].path.length;\n  }\n\n  path = path.substr(len);\n  let route = { path: path, handler: handler };\n  routeArray.push(route);\n}\n\nfunction eachRoute<T>(baseRoute: Route[], matcher: Matcher, callback: (this: T, routes: Route[]) => void, binding: T) {\n  let routes = matcher.routes;\n  let paths = Object.keys(routes);\n  for (let i = 0; i < paths.length; i++) {\n    let path = paths[i];\n    let routeArray = baseRoute.slice();\n    addRoute(routeArray, path, routes[path]);\n    let nested = matcher.children[path];\n    if (nested) {\n      eachRoute(routeArray, nested, callback, binding);\n    } else {\n      callback.call(binding, routeArray);\n    }\n  }\n}\n\nexport default function <T extends RouteRecognizer>(this: T, callback: MatchCallback, addRouteCallback?: (routeRecognizer: T, routes: Route[]) => void) {\n  let matcher = new Matcher();\n\n  callback(generateMatch(\"\", matcher, this.delegate));\n\n  eachRoute([], matcher, function(routes: Route[]) {\n    if (addRouteCallback) { addRouteCallback(this, routes); }\n    else { this.add(routes); }\n  }, this);\n}\n","// Normalizes percent-encoded values in `path` to upper-case and decodes percent-encoded\n// values that are not reserved (i.e., unicode characters, emoji, etc). The reserved\n// chars are \"/\" and \"%\".\n// Safe to call multiple times on the same path.\nexport function normalizePath(path: string): string {\n  return path.split(\"/\")\n             .map(normalizeSegment)\n             .join(\"/\");\n}\n\n// We want to ensure the characters \"%\" and \"/\" remain in percent-encoded\n// form when normalizing paths, so replace them with their encoded form after\n// decoding the rest of the path\nconst SEGMENT_RESERVED_CHARS = /%|\\//g;\nexport function normalizeSegment(segment: string) {\n  if (segment.length < 3 || segment.indexOf(\"%\") === -1) return segment;\n  return decodeURIComponent(segment).replace(SEGMENT_RESERVED_CHARS, encodeURIComponent);\n}\n\n// We do not want to encode these characters when generating dynamic path segments\n// See https://tools.ietf.org/html/rfc3986#section-3.3\n// sub-delims: \"!\", \"$\", \"&\", \"'\", \"(\", \")\", \"*\", \"+\", \",\", \";\", \"=\"\n// others allowed by RFC 3986: \":\", \"@\"\n//\n// First encode the entire path segment, then decode any of the encoded special chars.\n//\n// The chars \"!\", \"'\", \"(\", \")\", \"*\" do not get changed by `encodeURIComponent`,\n// so the possible encoded chars are:\n// ['%24', '%26', '%2B', '%2C', '%3B', '%3D', '%3A', '%40'].\nconst PATH_SEGMENT_ENCODINGS = /%(?:2(?:4|6|B|C)|3(?:B|D|A)|40)/g;\n\nexport function encodePathSegment(str: string) {\n  return encodeURIComponent(str).replace(PATH_SEGMENT_ENCODINGS, decodeURIComponent);\n}\n","import { createMap } from \"./route-recognizer/util\";\nimport map, { Delegate, Route, Opaque, MatchCallback } from \"./route-recognizer/dsl\";\nimport { normalizePath, normalizeSegment, encodePathSegment } from \"./route-recognizer/normalizer\";\nexport { Delegate, MatchCallback } from './route-recognizer/dsl';\n\nconst enum CHARS {\n  ANY = -1,\n  STAR = 42,\n  SLASH = 47,\n  COLON = 58\n}\n\nconst escapeRegex = /(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\)/g;\n\nconst isArray = Array.isArray;\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction getParam(params: Params | null | undefined, key: string): string {\n  if (typeof params !== \"object\" || params === null) {\n    throw new Error(\"You must pass an object as the second argument to `generate`.\");\n  }\n\n  if (!hasOwnProperty.call(params, key)) {\n    throw new Error(\"You must provide param `\" + key + \"` to `generate`.\");\n  }\n\n  let value = params[key];\n  let str = typeof value === \"string\" ? value : \"\" + value;\n  if (str.length === 0) {\n    throw new Error(\"You must provide a param `\" + key + \"`.\");\n  }\n  return str;\n}\n\nconst enum SegmentType {\n  Static  = 0,\n  Dynamic = 1,\n  Star    = 2,\n  Epsilon = 4\n}\n\nconst enum SegmentFlags {\n  Static  = 2 << SegmentType.Static,\n  Dynamic = 2 << SegmentType.Dynamic,\n  Star    = 2 << SegmentType.Star,\n  Epsilon = 2 << SegmentType.Epsilon,\n  Named = Dynamic | Star,\n  Decoded = Dynamic,\n  Counted = Static | Dynamic | Star\n}\n\nconst eachChar: ((segment: Segment, currentState: State) => State)[] = [];\neachChar[SegmentType.Static] = function (segment: Segment, currentState: State) {\n  let state = currentState;\n  let value = segment.value;\n  for (let i = 0; i < value.length; i++) {\n    let ch = value.charCodeAt(i);\n    state = state.put(ch, false, false);\n  }\n  return state;\n};\neachChar[SegmentType.Dynamic] = function (_: Segment, currentState: State) {\n  return currentState.put(CHARS.SLASH, true, true);\n};\neachChar[SegmentType.Star] = function (_: Segment, currentState: State) {\n  return currentState.put(CHARS.ANY, false, true);\n};\neachChar[SegmentType.Epsilon] = function (_: Segment, currentState: State) {\n  return currentState;\n};\n\nconst regex: ((segment: Segment) => string)[] = [];\nregex[SegmentType.Static] = function (segment: Segment) {\n  return segment.value.replace(escapeRegex, \"\\\\$1\");\n};\nregex[SegmentType.Dynamic] = function () {\n  return \"([^/]+)\";\n};\nregex[SegmentType.Star] = function () {\n  return \"(.+)\";\n};\nregex[SegmentType.Epsilon] = function () {\n  return \"\";\n};\n\nconst generate: ((segment: Segment, params?: Params | null) => string)[] = [];\ngenerate[SegmentType.Static] = function (segment: Segment) {\n  return segment.value;\n};\ngenerate[SegmentType.Dynamic] = function (segment: Segment, params?: Params) {\n  let value = getParam(params, segment.value);\n  if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS) {\n    return encodePathSegment(value);\n  } else {\n    return value;\n  }\n};\ngenerate[SegmentType.Star] = function (segment: Segment, params?: Params) {\n  return getParam(params, segment.value);\n};\ngenerate[SegmentType.Epsilon] = function () {\n  return \"\";\n};\n\n// A Segment represents a segment in the original route description.\n// Each Segment type provides an `eachChar` and `regex` method.\n//\n// The `eachChar` method invokes the callback with one or more character\n// specifications. A character specification consumes one or more input\n// characters.\n//\n// The `regex` method returns a regex fragment for the segment. If the\n// segment is a dynamic of star segment, the regex fragment also includes\n// a capture.\n//\n// A character specification contains:\n//\n// * `validChars`: a String with a list of all valid characters, or\n// * `invalidChars`: a String with a list of all invalid characters\n// * `repeat`: true if the character specification can repeat\ninterface Segment {\n  type: SegmentType;\n  value: string;\n}\n\nexport interface Params {\n  [key: string]: Opaque;\n  [key: number]: Opaque;\n  queryParams?: QueryParams | null;\n}\n\ninterface PopulatedParsedHandlers {\n  names: string[];\n  shouldDecodes: any[];\n}\n\nconst EmptyObject = Object.freeze({});\ntype EmptyObject = Readonly<{}>\n\nconst EmptyArray = Object.freeze([]) as ReadonlyArray<any>;\ntype EmptyArray = ReadonlyArray<any>;\n\ninterface EmptyParsedHandlers {\n  names: EmptyArray;\n  shouldDecodes: EmptyArray;\n}\n\ntype ParsedHandler = PopulatedParsedHandlers | EmptyParsedHandlers;\n\n// The `names` will be populated with the paramter name for each dynamic/star\n// segment. `shouldDecodes` will be populated with a boolean for each dyanamic/star\n// segment, indicating whether it should be decoded during recognition.\nfunction parse(segments: Segment[], route: string, types: [number, number, number]) {\n  // normalize route as not starting with a \"/\". Recognition will\n  // also normalize.\n  if (route.length > 0 && route.charCodeAt(0) === CHARS.SLASH) { route = route.substr(1); }\n\n  let parts = route.split(\"/\");\n  let names: void | string[] = undefined;\n  let shouldDecodes: void | any[] = undefined;\n\n  for (let i = 0; i < parts.length; i++) {\n    let part = parts[i];\n    let flags: SegmentFlags = 0;\n    let type: SegmentType = 0;\n\n    if (part === \"\") {\n      type = SegmentType.Epsilon;\n    } else if (part.charCodeAt(0) === CHARS.COLON) {\n      type = SegmentType.Dynamic;\n    } else if (part.charCodeAt(0) === CHARS.STAR) {\n      type = SegmentType.Star;\n    }  else {\n      type = SegmentType.Static;\n    }\n\n    flags = 2 << type;\n\n    if (flags & SegmentFlags.Named) {\n      part = part.slice(1);\n      names = names || [];\n      names.push(part);\n\n      shouldDecodes = shouldDecodes || [];\n      shouldDecodes.push((flags & SegmentFlags.Decoded) !== 0);\n    }\n\n    if (flags & SegmentFlags.Counted) {\n      types[type]++;\n    }\n\n    segments.push({\n      type,\n      value: normalizeSegment(part)\n    });\n  }\n\n  return {\n    names: names || EmptyArray,\n    shouldDecodes: shouldDecodes || EmptyArray,\n  } as ParsedHandler;\n}\n\nfunction isEqualCharSpec(spec: CharSpec, char: number, negate: boolean) {\n  return spec.char === char && spec.negate === negate;\n}\n\ninterface EmptyHandler {\n  handler: Opaque;\n  names: EmptyArray;\n  shouldDecodes: EmptyArray;\n}\n\ninterface PopulatedHandler {\n  handler: Opaque;\n  names: string [];\n  shouldDecodes: boolean[];\n}\n\ntype Handler = EmptyHandler | PopulatedHandler;\n\n// A State has a character specification and (`charSpec`) and a list of possible\n// subsequent states (`nextStates`).\n//\n// If a State is an accepting state, it will also have several additional\n// properties:\n//\n// * `regex`: A regular expression that is used to extract parameters from paths\n//   that reached this accepting state.\n// * `handlers`: Information on how to convert the list of captures into calls\n//   to registered handlers with the specified parameters\n// * `types`: How many static, dynamic or star segments in this route. Used to\n//   decide which route to use if multiple registered routes match a path.\n//\n// Currently, State is implemented naively by looping over `nextStates` and\n// comparing a character specification against a character. A more efficient\n// implementation would use a hash of keys pointing at one or more next states.\nclass State implements CharSpec {\n  states: State[];\n  id: number;\n  negate: boolean;\n  char: number;\n  nextStates: number[] | number | null;\n  pattern: string;\n  _regex: RegExp | undefined;\n  handlers: Handler[] | undefined;\n  types: [number, number, number] | undefined;\n\n  constructor(states: State[], id: number, char: number, negate: boolean, repeat: boolean) {\n    this.states = states;\n    this.id = id;\n    this.char = char;\n    this.negate = negate;\n    this.nextStates = repeat ? id : null;\n    this.pattern = \"\";\n    this._regex = undefined;\n    this.handlers = undefined;\n    this.types = undefined;\n  }\n\n  regex(): RegExp {\n    if (!this._regex) {\n      this._regex = new RegExp(this.pattern);\n    }\n    return this._regex;\n  }\n\n  get(char: number, negate: boolean): State | void {\n    let nextStates = this.nextStates;\n    if (nextStates === null) return;\n    if (isArray(nextStates)) {\n      for (let i = 0; i < nextStates.length; i++) {\n        let child = this.states[nextStates[i]];\n        if (isEqualCharSpec(child, char, negate)) {\n          return child;\n        }\n      }\n    } else {\n      let child = this.states[nextStates];\n      if (isEqualCharSpec(child, char, negate)) {\n        return child;\n      }\n    }\n  }\n\n  put(char: number, negate: boolean, repeat: boolean) {\n    let state: State | void;\n\n    // If the character specification already exists in a child of the current\n    // state, just return that state.\n    if (state = this.get(char, negate)) { return state; }\n\n    // Make a new state for the character spec\n    let states = this.states;\n    state = new State(states, states.length, char, negate, repeat);\n    states[states.length] = state;\n\n    // Insert the new state as a child of the current state\n    if (this.nextStates == null) {\n      this.nextStates = state.id;\n    } else if (isArray(this.nextStates)) {\n      this.nextStates.push(state.id);\n    } else {\n      this.nextStates = [this.nextStates, state.id];\n    }\n\n    // Return the new state\n    return state;\n  }\n\n  // Find a list of child states matching the next character\n  match(ch: number): State[] {\n    let nextStates = this.nextStates;\n    if (!nextStates) return [];\n\n    let returned: State[] = [];\n    if (isArray(nextStates)) {\n      for (let i = 0; i < nextStates.length; i++) {\n        let child = this.states[nextStates[i]];\n\n        if (isMatch(child, ch)) {\n          returned.push(child);\n        }\n      }\n    } else {\n      let child = this.states[nextStates];\n      if (isMatch(child, ch)) {\n        returned.push(child);\n      }\n    }\n    return returned;\n  }\n}\n\nfunction isMatch(spec: CharSpec, char: number) {\n  return spec.negate ? spec.char !== char && spec.char !== CHARS.ANY : spec.char === char || spec.char === CHARS.ANY;\n}\n\n// This is a somewhat naive strategy, but should work in a lot of cases\n// A better strategy would properly resolve /posts/:id/new and /posts/edit/:id.\n//\n// This strategy generally prefers more static and less dynamic matching.\n// Specifically, it\n//\n//  * prefers fewer stars to more, then\n//  * prefers using stars for less of the match to more, then\n//  * prefers fewer dynamic segments to more, then\n//  * prefers more static segments to more\nfunction sortSolutions(states: State[]) {\n  return states.sort(function(a, b) {\n    let [ astatics, adynamics, astars ] = a.types || [0, 0, 0];\n    let [ bstatics, bdynamics, bstars ] = b.types || [0, 0, 0];\n    if (astars !== bstars) { return astars - bstars; }\n\n    if (astars) {\n      if (astatics !== bstatics) { return bstatics - astatics; }\n      if (adynamics !== bdynamics) { return bdynamics - adynamics; }\n    }\n\n    if (adynamics !== bdynamics) { return adynamics - bdynamics; }\n    if (astatics !== bstatics) { return bstatics - astatics; }\n\n    return 0;\n  });\n}\n\nfunction recognizeChar(states: State[], ch: number) {\n  let nextStates: State[] = [];\n\n  for (let i = 0, l = states.length; i < l; i++) {\n    let state = states[i];\n\n    nextStates = nextStates.concat(state.match(ch));\n  }\n\n  return nextStates;\n}\n\n\nexport interface QueryParams {\n  [param: string]: any[] | any | null | undefined;\n}\n\nexport interface Result {\n  handler: Opaque;\n  params: Params;\n  isDynamic: boolean;\n}\n\nexport interface Results extends ArrayLike<Result | undefined> {\n  queryParams: QueryParams;\n  slice(start?: number, end?: number): Result[];\n  splice(start: number, deleteCount: number, ...items: Result[]): Result[];\n  push(...results: Result[]): number;\n}\n\nclass RecognizeResults implements Results {\n  queryParams: QueryParams;\n  length = 0;\n  [index: number]: Result | undefined;\n  splice: (start: number, deleteCount: number, ...items: Result[]) => Result[];\n  slice: (start?: number, end?: number) => Result[];\n  push: (...results: Result[]) => number;\n\n  constructor(queryParams?: QueryParams) {\n    this.queryParams = queryParams || {};\n  }\n};\n\nRecognizeResults.prototype.splice = Array.prototype.splice;\nRecognizeResults.prototype.slice =  Array.prototype.slice;\nRecognizeResults.prototype.push = Array.prototype.push;\n\nfunction findHandler(state: State, originalPath: string, queryParams: QueryParams): Results {\n  let handlers = state.handlers;\n  let regex: RegExp = state.regex();\n  if (!regex || !handlers) throw new Error(\"state not initialized\");\n  let captures: RegExpMatchArray | null = originalPath.match(regex);\n  let currentCapture = 1;\n  let result = new RecognizeResults(queryParams);\n\n  result.length = handlers.length;\n\n  for (let i = 0; i < handlers.length; i++) {\n    let handler = handlers[i];\n    let names = handler.names;\n    let shouldDecodes = handler.shouldDecodes;\n    let params: EmptyObject | Params = EmptyObject;\n\n    let isDynamic = false;\n\n    if (names !== EmptyArray && shouldDecodes !== EmptyArray) {\n      for (let j = 0; j < names.length; j++) {\n        isDynamic = true;\n        let name = names[j];\n        let capture = captures && captures[currentCapture++];\n\n        if (params === EmptyObject) {\n          params = {};\n        }\n\n        if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS && shouldDecodes[j]) {\n          (<Params>params)[name] = capture && decodeURIComponent(capture);\n        } else {\n          (<Params>params)[name] = capture;\n        }\n      }\n    }\n\n    result[i] = {\n      handler: handler.handler,\n      params,\n      isDynamic\n    };\n  }\n\n  return result;\n}\n\nfunction decodeQueryParamPart(part: string): string {\n  // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1\n  part = part.replace(/\\+/gm, \"%20\");\n  let result;\n  try {\n    result = decodeURIComponent(part);\n  } catch (error) {result = \"\"; }\n  return result;\n}\n\ninterface NamedRoute {\n  segments: Segment[];\n  handlers: Handler[];\n}\n\nclass RouteRecognizer {\n  private states: State[];\n  private rootState: State;\n  private names: {\n    [name: string]: NamedRoute | undefined;\n  } = createMap<NamedRoute>();\n  map: (context: MatchCallback, addCallback?: (router: this, routes: Route[]) => void) => void;\n  delegate: Delegate | undefined;\n\n  constructor() {\n    let states: State[] = [];\n    let state = new State(states, 0, CHARS.ANY, true, false);\n    states[0] = state;\n    this.states = states;\n    this.rootState = state;\n  }\n\n  static VERSION = \"0.3.4\";\n  // Set to false to opt-out of encoding and decoding path segments.\n  // See https://github.com/tildeio/route-recognizer/pull/55\n  static ENCODE_AND_DECODE_PATH_SEGMENTS = true;\n  static Normalizer = {\n    normalizeSegment, normalizePath, encodePathSegment\n  };\n\n  add(routes: Route[], options?: { as: string }) {\n    let currentState = this.rootState;\n    let pattern = \"^\";\n    let types: [number, number, number] = [0, 0, 0];\n    let handlers: Handler[] = new Array(routes.length);\n    let allSegments: Segment[] = [];\n\n    let isEmpty = true;\n    let j = 0;\n    for (let i = 0; i < routes.length; i++) {\n      let route = routes[i];\n      let { names, shouldDecodes } = parse(allSegments, route.path, types);\n\n      // preserve j so it points to the start of newly added segments\n      for (; j < allSegments.length; j++) {\n        let segment = allSegments[j];\n\n        if (segment.type === SegmentType.Epsilon) { continue; }\n\n        isEmpty = false;\n\n        // Add a \"/\" for the new segment\n        currentState = currentState.put(CHARS.SLASH, false, false);\n        pattern += \"/\";\n\n        // Add a representation of the segment to the NFA and regex\n        currentState = eachChar[segment.type](segment, currentState);\n        pattern += regex[segment.type](segment);\n      }\n      handlers[i] = {\n        handler: route.handler,\n        names,\n        shouldDecodes\n      };\n    }\n\n    if (isEmpty) {\n        currentState = currentState.put(CHARS.SLASH, false, false);\n      pattern += \"/\";\n    }\n\n    currentState.handlers = handlers;\n    currentState.pattern = pattern + \"$\";\n    currentState.types = types;\n\n    let name: string | undefined;\n    if (typeof options === \"object\" && options !== null && options.as) {\n      name = options.as;\n    }\n\n    if (name) {\n      // if (this.names[name]) {\n      //   throw new Error(\"You may not add a duplicate route named `\" + name + \"`.\");\n      // }\n\n      this.names[name] = {\n        segments: allSegments,\n        handlers\n      };\n    }\n  }\n\n  handlersFor(name: string) {\n    let route = this.names[name];\n\n    if (!route) { throw new Error(\"There is no route named \" + name); }\n\n    let result = new Array(route.handlers.length);\n\n    for (let i = 0; i < route.handlers.length; i++) {\n      let handler = route.handlers[i];\n      result[i] = handler;\n    }\n\n    return result;\n  }\n\n  hasRoute(name: string) {\n    return !!this.names[name];\n  }\n\n  generate(name: string, params?: Params | null) {\n    let route = this.names[name];\n    let output = \"\";\n    if (!route) { throw new Error(\"There is no route named \" + name); }\n\n    let segments: Segment[] = route.segments;\n\n    for (let i = 0; i < segments.length; i++) {\n      let segment: Segment = segments[i];\n\n      if (segment.type === SegmentType.Epsilon) {\n        continue;\n      }\n\n      output += \"/\";\n      output += generate[segment.type](segment, params);\n    }\n\n    if (output.charAt(0) !== \"/\") { output = \"/\" + output; }\n\n    if (params && params.queryParams) {\n      output += this.generateQueryString(params.queryParams);\n    }\n\n    return output;\n  }\n\n  generateQueryString(params: QueryParams) {\n    let pairs: string[] = [];\n    let keys: string[] = Object.keys(params);\n    keys.sort();\n    for (let i = 0; i < keys.length; i++) {\n      let key = keys[i];\n      let value = params[key];\n      if (value == null) {\n        continue;\n      }\n      let pair = encodeURIComponent(key);\n      if (isArray(value)) {\n        for (let j = 0; j < value.length; j++) {\n          let arrayPair = key + \"[]\" + \"=\" + encodeURIComponent(value[j]);\n          pairs.push(arrayPair);\n        }\n      } else {\n        pair += \"=\" + encodeURIComponent(value);\n        pairs.push(pair);\n      }\n    }\n\n    if (pairs.length === 0) { return \"\"; }\n\n    return \"?\" + pairs.join(\"&\");\n  }\n\n  parseQueryString(queryString: string): QueryParams {\n    let pairs = queryString.split(\"&\");\n    let queryParams: QueryParams = {};\n    for (let i = 0; i < pairs.length; i++) {\n      let pair      = pairs[i].split(\"=\"),\n          key       = decodeQueryParamPart(pair[0]),\n          keyLength = key.length,\n          isArray = false,\n          value;\n      if (pair.length === 1) {\n        value = \"true\";\n      } else {\n        // Handle arrays\n        if (keyLength > 2 && key.slice(keyLength - 2) === \"[]\") {\n          isArray = true;\n          key = key.slice(0, keyLength - 2);\n          if (!queryParams[key]) {\n            queryParams[key] = [];\n          }\n        }\n        value = pair[1] ? decodeQueryParamPart(pair[1]) : \"\";\n      }\n      if (isArray) {\n        (<string[]>queryParams[key]).push(value);\n      } else {\n        queryParams[key] = value;\n      }\n    }\n    return queryParams;\n  }\n\n  recognize(path: string): Results | undefined {\n    let results: Results | undefined;\n    let states: State[] = [ this.rootState ];\n    let queryParams = {};\n    let isSlashDropped = false;\n    let hashStart = path.indexOf(\"#\");\n    if (hashStart !== -1) {\n      path = path.substr(0, hashStart);\n    }\n\n    let queryStart = path.indexOf(\"?\");\n    if (queryStart !== -1) {\n      let queryString = path.substr(queryStart + 1, path.length);\n      path = path.substr(0, queryStart);\n      queryParams = this.parseQueryString(queryString);\n    }\n\n    if (path.charAt(0) !== \"/\") { path = \"/\" + path; }\n    let originalPath = path;\n\n    if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS) {\n      path = normalizePath(path);\n    } else {\n      path = decodeURI(path);\n      originalPath = decodeURI(originalPath);\n    }\n\n    let pathLen = path.length;\n    if (pathLen > 1 && path.charAt(pathLen - 1) === \"/\") {\n      path = path.substr(0, pathLen - 1);\n      originalPath = originalPath.substr(0, originalPath.length - 1);\n      isSlashDropped = true;\n    }\n\n    for (let i = 0; i < path.length; i++) {\n      states = recognizeChar(states, path.charCodeAt(i));\n      if (!states.length) { break; }\n    }\n\n    let solutions: State[] = [];\n    for (let i = 0; i < states.length; i++) {\n      if (states[i].handlers) { solutions.push(states[i]); }\n    }\n\n    states = sortSolutions(solutions);\n\n    let state = solutions[0];\n\n    if (state && state.handlers) {\n      // if a trailing slash was dropped and a star segment is the last segment\n      // specified, put the trailing slash back\n      if (isSlashDropped && state.pattern && state.pattern.slice(-5) === \"(.+)$\") {\n        originalPath = originalPath + \"/\";\n      }\n      results = findHandler(state, originalPath, queryParams);\n    }\n\n    return results;\n  }\n}\n\nRouteRecognizer.prototype.map = map;\n\nexport default RouteRecognizer;\n\ninterface CharSpec {\n  negate: boolean;\n  char: number;\n}\n","import RSVP from 'rsvp';\nimport UploadFileReader from '../system/upload-file-reader.ts';\nimport { assert } from '@ember/debug';\n\ninterface AdditionalMetadata {\n  hasAdditionalMetadata?: boolean;\n  duration?: number;\n  animated?: boolean;\n  width?: number;\n  height?: number;\n}\n\ninterface ImageResult {\n  hasAdditionalMetadata: boolean;\n  img?: HTMLImageElement;\n}\n\ninterface VideoResult {\n  hasAdditionalMetadata: boolean;\n  video?: HTMLVideoElement;\n}\n\ninterface AudioResult {\n  hasAdditionalMetadata: boolean;\n  audio?: HTMLAudioElement;\n}\n\ninterface FileMetadata extends AdditionalMetadata {\n  name: string;\n  size: number;\n  type: string;\n  extension?: string;\n  url: string;\n}\n\nexport function extractFormData(formData: FormData) {\n  let data = {};\n  let file: { key: string; value: File } | null = null;\n\n  for (const [key, value] of formData.entries()) {\n    if (value instanceof File) {\n      file = { key, value };\n      continue;\n    }\n    data = { ...data, [key]: value };\n  }\n\n  assert('Failed find a file in request body', file?.key && file?.value);\n\n  return { file, data };\n}\n\nconst pipelines = {\n  async gif(file: File): Promise<AdditionalMetadata> {\n    const buffer = (await new UploadFileReader().readAsArrayBuffer(\n      file,\n    )) as ArrayBuffer;\n    const data = new Uint8Array(buffer);\n    let duration = 0;\n    for (let i = 0; i < data.length; i++) {\n      const byte4 = data[i + 4];\n      const byte5 = data[i + 5];\n\n      // Find a Graphic Control Extension hex(21F904__ ____ __00)\n      if (\n        data[i] === 0x21 &&\n        data[i + 1] === 0xf9 &&\n        data[i + 2] === 0x04 &&\n        byte4 !== undefined &&\n        byte5 !== undefined &&\n        data[i + 7] === 0x00\n      ) {\n        // Swap 5th and 6th bytes to get the delay per frame\n        const delay = (byte5 << 8) | (byte4 & 0xff);\n\n        // Should be aware browsers have a minimum frame delay\n        // e.g. 6ms for IE, 2ms modern browsers (50fps)\n        duration += delay < 2 ? 10 : delay;\n      }\n    }\n\n    return {\n      hasAdditionalMetadata: true,\n      duration: duration / 1000,\n      animated: duration > 0,\n    };\n  },\n\n  image(_file: File, metadata: FileMetadata): RSVP.Promise<AdditionalMetadata> {\n    return new RSVP.Promise(function (resolve: (result: ImageResult) => void) {\n      const img = new Image();\n      img.onload = () => resolve({ hasAdditionalMetadata: true, img });\n      img.onerror = () => resolve({ hasAdditionalMetadata: false });\n      img.src = metadata.url;\n    }).then(function ({ hasAdditionalMetadata, img }) {\n      return {\n        hasAdditionalMetadata,\n        width: img?.naturalWidth,\n        height: img?.naturalHeight,\n      };\n    });\n  },\n\n  video(_file: File, metadata: FileMetadata): RSVP.Promise<AdditionalMetadata> {\n    const videoEl = document.createElement('video');\n    return new RSVP.Promise(function (resolve: (result: VideoResult) => void) {\n      videoEl.addEventListener('loadeddata', () =>\n        resolve({ hasAdditionalMetadata: true, video: videoEl }),\n      );\n      videoEl.onerror = () => resolve({ hasAdditionalMetadata: false });\n      videoEl.src = metadata.url;\n      document.body.appendChild(videoEl);\n      videoEl.load();\n    })\n      .then(function ({ hasAdditionalMetadata, video }) {\n        return {\n          hasAdditionalMetadata,\n          duration: video?.duration,\n          width: video?.videoWidth,\n          height: video?.videoHeight,\n        };\n      })\n      .finally(function () {\n        document.body.removeChild(videoEl);\n      });\n  },\n\n  audio(_file: File, metadata: FileMetadata): RSVP.Promise<AdditionalMetadata> {\n    const audioEl = document.createElement('audio');\n    return new RSVP.Promise(function (resolve: (result: AudioResult) => void) {\n      audioEl.addEventListener('loadeddata', () =>\n        resolve({ hasAdditionalMetadata: true, audio: audioEl }),\n      );\n      audioEl.onerror = () => resolve({ hasAdditionalMetadata: false });\n      audioEl.src = metadata.url;\n      document.body.appendChild(audioEl);\n      audioEl.load();\n    })\n      .then(function ({ hasAdditionalMetadata, audio }) {\n        return {\n          hasAdditionalMetadata,\n          duration: audio?.duration,\n        };\n      })\n      .finally(function () {\n        document.body.removeChild(audioEl);\n      });\n  },\n};\n\nexport async function extractFileMetadata(file: File) {\n  const url = (await new UploadFileReader().readAsDataURL(file)) as string;\n\n  const metadata: FileMetadata = {\n    name: file.name,\n    size: file.size,\n    type: file.type,\n    extension: (file.name.match(/\\.(.*)$/) ?? [])[1],\n    url,\n  };\n\n  const metadataPipelines = [];\n\n  if (metadata.type === 'image/gif') {\n    metadataPipelines.push(pipelines.gif(file));\n  }\n  if (metadata.type.match(/^image\\//)) {\n    metadataPipelines.push(pipelines.image(file, metadata));\n  }\n  if (metadata.type.match(/^video\\//)) {\n    metadataPipelines.push(pipelines.video(file, metadata));\n  }\n  if (metadata.type.match(/^audio\\//)) {\n    metadataPipelines.push(pipelines.audio(file, metadata));\n  }\n\n  const additionalMetadata = await RSVP.all(metadataPipelines);\n\n  additionalMetadata.forEach(function (data) {\n    Object.assign(metadata, data);\n  });\n\n  // Collapse state of `hasAdditionalMetadata` from multiple pipelines\n  // Should be `true` if at least one pipeline succeeded\n  metadata.hasAdditionalMetadata = additionalMetadata.some(\n    (data) => data.hasAdditionalMetadata,\n  );\n\n  return metadata;\n}\n","import RSVP from 'rsvp';\nimport { extractFormData, extractFileMetadata } from './utils.ts';\nimport {\n  macroCondition,\n  dependencySatisfies,\n  importSync,\n} from '@embroider/macros';\n\nconst NETWORK = {\n  wired: 50000, // 500 Mb/s\n  wifi: 15000, // 15 Mb/s\n  dsl: 1000, // 1 Mb/s\n  '4g': 3000, // 4 Mb/s\n  '3g': 250, // 250 kb/s\n  '2g': 50, // 50 kb/s\n  gprs: 20, // 20 kb/s\n  offline: 0,\n};\n\ninterface FakeRequest {\n  requestBody: FormData | object; // Replaced with an object by this handler\n  upload: {\n    onloadstart: (event: ProgressEvent<EventTarget>) => void;\n    onprogress: (event: ProgressEvent<EventTarget>) => void;\n    onloadend: (event: ProgressEvent<EventTarget>) => void;\n  };\n}\n\nexport function uploadHandler(\n  fn: (this: void, db: unknown, request: FakeRequest) => void,\n  options = { network: null, timeout: null },\n) {\n  if (\n    macroCondition(\n      dependencySatisfies('miragejs', '*') &&\n        dependencySatisfies('ember-cli-mirage', '*'),\n    )\n  ) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const { Response } = importSync('miragejs') as { Response: any };\n    return function (db: unknown, request: FakeRequest) {\n      let speed = Infinity;\n\n      if (options.network && NETWORK[options.network]) {\n        speed = NETWORK[options.network] * 1024;\n      }\n\n      const { file, data } = extractFormData(request.requestBody as FormData);\n      let loaded = 0;\n      const total = file.value.size;\n\n      return new RSVP.Promise((resolve) => {\n        const start = new Date().getTime();\n\n        request.upload.onloadstart(\n          new ProgressEvent('loadstart', {\n            lengthComputable: true,\n            total,\n            loaded: Math.min(loaded, total),\n          }),\n        );\n\n        const upload = async () => {\n          const timedOut =\n            options.timeout && new Date().getTime() - start > options.timeout;\n          if (timedOut || loaded >= total) {\n            request.upload.onloadend(\n              new ProgressEvent('loadend', {\n                lengthComputable: true,\n                // For the loadend event the `total` value may be sourced from the `Content-Length` response header of the upload endpoint.\n                // In which case it may represent the size of the response rather than the number of uploaded bytes.\n                // So we set it to an arbitrary value to make sure this doesn't influence file upload and queue progress stats.\n                // See: https://developer.mozilla.org/en-US/docs/Web/API/ProgressEvent/total\n                total: 300,\n                loaded: Math.min(loaded, total),\n              }),\n            );\n\n            const metadata = await extractFileMetadata(file.value);\n            request.requestBody = { [file.key]: metadata, ...data };\n\n            if (timedOut) {\n              resolve(new Response(408));\n              return;\n            }\n\n            // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n            // @ts-ignore\n            resolve(fn.call(this, db, request));\n          } else {\n            request.upload.onprogress(\n              new ProgressEvent('progress', {\n                lengthComputable: true,\n                total,\n                loaded,\n              }),\n            );\n\n            loaded += speed / 20;\n            setTimeout(upload, 50);\n          }\n        };\n        upload();\n      });\n    };\n  } else {\n    throw new Error(\n      'You must add ember-cli-mirage and miragejs to your app to use this helper.',\n    );\n  }\n}\n","import { bind } from '@ember/runloop';\nimport RSVP from 'rsvp';\nimport type { HTTPRequestOptions } from '../interfaces.ts';\n\nfunction parseHeaders(headerString: string) {\n  return headerString\n    .split(/\\n|\\r/)\n    .filter((str) => str !== '')\n    .reduce((headers: Headers, headerString: string) => {\n      const parts = headerString.split(/^([0-9A-Za-z_-]*:)/);\n      if (parts.length > 0 && parts[1] && parts[2]) {\n        headers.append(parts[1].slice(0, -1), parts[2].trim());\n      }\n      return headers;\n    }, new Headers());\n}\n\nfunction parseResponse(request: XMLHttpRequest): Response {\n  const body = request.response === '' ? null : request.response;\n  if (request.status >= 200 && request.status < 600) {\n    return new Response(body, {\n      status: request.status,\n      statusText: request.statusText,\n      headers: parseHeaders(request.getAllResponseHeaders()),\n    });\n  } else {\n    return Response.error();\n  }\n}\n\nexport default class HTTPRequest {\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  onloadstart: (event?: ProgressEvent<EventTarget>) => void | undefined;\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  onprogress: (event?: ProgressEvent<EventTarget>) => void | undefined;\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  onloadend: (event?: ProgressEvent<EventTarget>) => void | undefined;\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  ontimeout: (event?: ProgressEvent<EventTarget>) => void | undefined;\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  onabort: (event?: ProgressEvent<EventTarget>) => void | undefined;\n\n  request;\n  resolve;\n  reject;\n  promise: RSVP.Promise<Response>;\n\n  constructor(options: HTTPRequestOptions = {}) {\n    const { resolve, reject, promise } = RSVP.defer(\n      `ember-file-upload: ${options.label}`,\n    );\n    this.resolve = resolve;\n    this.reject = reject;\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    this.promise = promise;\n    this.request = new XMLHttpRequest();\n\n    this.request.withCredentials = options.withCredentials ?? false;\n\n    let aborted: RSVP.Deferred<string>;\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    promise.cancel = () => {\n      if (aborted == null) {\n        aborted = RSVP.defer(`ember-file-upload: Abort ${options.label}`);\n        this.request.abort();\n      }\n      return aborted.promise;\n    };\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    promise.then = function (...args) {\n      const newPromise = RSVP.Promise.prototype.then.apply(this, args);\n      // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n      // @ts-ignore\n      newPromise.cancel = promise.cancel;\n      newPromise.then = promise.then;\n      return newPromise;\n    };\n    this.request.onabort = bind(this, function () {\n      this.onabort?.();\n      aborted.resolve();\n    });\n\n    this.request.onloadstart = bind(this, function (evt) {\n      this.onloadstart?.(evt);\n    });\n    this.request.onprogress = bind(this, function (evt) {\n      this.onprogress?.(evt);\n    });\n    this.request.onloadend = bind(this, function (evt) {\n      this.onloadend?.(evt);\n    });\n\n    if (this.request.upload) {\n      this.request.upload.onloadstart = this.request.onloadstart;\n      this.request.upload.onprogress = this.request.onprogress;\n      this.request.upload.onloadend = this.request.onloadend;\n    }\n\n    this.request.onload = bind(this, function () {\n      const response = parseResponse(this.request);\n      if (Math.floor(response.status / 200) === 1) {\n        resolve(response);\n      } else {\n        reject(response);\n      }\n    });\n\n    this.request.onerror = bind(this, function () {\n      reject(parseResponse(this.request));\n    });\n\n    Object.defineProperty(this, 'timeout', {\n      get() {\n        return this.request.timeout;\n      },\n      set(timeout) {\n        this.request.timeout = timeout;\n      },\n      enumerable: true,\n      configurable: false,\n    });\n\n    this.request.ontimeout = bind(this, function () {\n      this.ontimeout?.();\n      reject(parseResponse(this.request));\n    });\n  }\n\n  send(body: Parameters<XMLHttpRequest['send']>[0]) {\n    this.request.send(body);\n    return this.promise;\n  }\n\n  open(\n    method: string,\n    url: string | URL,\n    _async: boolean,\n    usename?: string,\n    password?: string,\n  ) {\n    this.request.open(method, url, true, usename, password);\n  }\n\n  setRequestHeader(name: string, value: string) {\n    this.request.setRequestHeader(name, value);\n  }\n}\n","import type { UploadFile } from './upload-file.ts';\nimport type { Queue } from './queue.ts';\nimport type FileQueueService from './services/file-queue.ts';\nimport type DataTransferWrapper from './system/data-transfer-wrapper.ts';\n\nexport interface FileQueueSignature {\n  Args: {\n    Positional: never[];\n    Named: {\n      name?: string;\n      onFileAdded?: (file: UploadFile) => void;\n      onFileRemoved?: (file: UploadFile) => void;\n      onUploadStarted?: (file: UploadFile) => void;\n      onUploadSucceeded?: (file: UploadFile, response: Response) => void;\n      onUploadFailed?: (file: UploadFile, response: Response) => void;\n    };\n  };\n  Return: Queue;\n}\n\nexport interface SelectFileSignature {\n  Element: HTMLInputElement;\n  Args: {\n    Positional: [];\n    Named: {\n      filter?: (file: File, files: File[], index: number) => boolean;\n      onFilesSelected?: (files: UploadFile[]) => void;\n    };\n  };\n}\n\ndeclare module '@ember/service' {\n  interface Registry {\n    'file-queue': FileQueueService;\n  }\n}\n\nexport interface QueueListener {\n  onFileAdded?(file: UploadFile): void;\n  onFileRemoved?(file: UploadFile): void;\n  onUploadStarted?(file: UploadFile): void;\n  onUploadSucceeded?(file: UploadFile, response: Response): void;\n  onUploadFailed?(file: UploadFile, response: Response): void;\n}\n\nexport type QueueName = string | symbol;\n\n/**\n * Possible file states.\n *\n * @remarks\n *\n * Here is the statechart describing the flow of state:\n *\n * ```\n *       .------.     .---------.     .--------.\n *   o--| queued |-->| uploading |-->| uploaded |\n *       `------`     `---------`     `--------`\n *          ^              |    .-------.\n *          |              |`->| aborted |\n *          |              |    `-------`\n *          |  .------.    |    .---------.\n *          `-| failed |<-` `->| timed_out |-.\n *          |  `------`         `---------`  |\n *          `-------------------------------`\n * ```\n */\nexport enum FileState {\n  Queued = 'queued',\n  Uploading = 'uploading',\n  TimedOut = 'timed_out',\n  Aborted = 'aborted',\n  Uploaded = 'uploaded',\n  Failed = 'failed',\n}\n\nexport enum FileSource {\n  /**\n   * the file is created using the native file picker\n   */\n  Browse = 'browse',\n\n  /**\n   * the file was created using drag and drop from their desktop\n   */\n  DragAndDrop = 'drag-and-drop',\n\n  /**\n   * the file was created by dragging the file from another webpage\n   */\n  Web = 'web',\n\n  /**\n   * the file is created from a data URL using the `fromDataURL`\n   * method for files. This usually means that the file was created\n   * manually by the developer on behalf of the user\n   */\n  DataUrl = 'data-url',\n\n  /**\n   * the file is created from a blob using the `fromBlob`\n   * method for files. This usually means that the file was created\n   * manually by the developer\n   */\n  Blob = 'blob',\n}\n\nexport interface FileDropzoneSignature {\n  Element: HTMLElement;\n  Args: {\n    queue?: Queue;\n\n    /**\n     * Whether users can upload content from websites by dragging images from\n     * another webpage and dropping it into your app. The default is `false`\n     * to prevent cross-site scripting issues.\n     *\n     * @defaulValue false\n     * */\n    allowUploadsFromWebsites?: boolean;\n\n    /**\n     * This is the type of cursor that should\n     * be shown when a drag event happens.\n     *\n     * Corresponds to `DataTransfer.dropEffect`.\n     * (https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/dropEffect)\n     *\n     * @defaultValue 'copy'\n     */\n    cursor?: 'link' | 'none' | 'copy' | 'move';\n\n    /**\n     * Whether to add multiple files to the queue at once.\n     *\n     * If set to false only one file will be added when dropping mulitple files.\n     *\n     * @defaultValue true\n     */\n    multiple?: boolean;\n\n    // actions\n    filter?: (file: File, files: File[], index: number) => boolean;\n\n    /**\n     * Called when files have entered the dropzone.\n     */\n    onDragEnter?: (files: File[], dataTransfer: DataTransferWrapper) => void;\n\n    /**\n     * Called when files have left the dropzone.\n     */\n    onDragLeave?: (files: File[], dataTransfer: DataTransferWrapper) => void;\n\n    /**\n     * Called when file have been dropped on the dropzone.\n     */\n    onDrop?: (files: UploadFile[], dataTransfer: DataTransferWrapper) => void;\n  };\n  Blocks: {\n    default: [dropzone: { supported: boolean; active: boolean }, queue: Queue];\n  };\n}\n\nexport interface FileUploadDragEvent extends DragEvent {\n  dataTransfer: DataTransfer;\n  source?: 'os' | 'web';\n  itemDetails?: DataTransferItem[] | { kind: string; type: string }[];\n}\n\nexport interface UploadOptions {\n  url?: string;\n  method?: string;\n  accepts?: string[];\n  headers?: Record<string, string>;\n  fileKey?: string;\n  contentType?: string;\n  data?: Record<string, string | File>;\n  withCredentials?: boolean;\n  timeout?: number;\n}\n\nexport interface HTTPRequestOptions {\n  label?: string;\n  withCredentials?: boolean;\n  timeout?: number;\n}\n\nexport interface HTTPRequestResponse {\n  status: number;\n  body: string | Document | HTMLElement[] | null | undefined;\n  headers: Record<string, string>;\n}\n\nexport interface DragListenerModifierSignature {\n  Args: {\n    Named: DragListenerHandlers;\n  };\n}\n\ntype DragListenerHandler = (event: FileUploadDragEvent) => void;\n\nexport interface DragListenerHandlers {\n  dragenter?: DragListenerHandler;\n  dragleave?: DragListenerHandler;\n  dragover?: DragListenerHandler;\n  drop?: DragListenerHandler;\n}\n\nexport interface DragEventListener {\n  element: Element;\n  handlers: DragListenerHandlers;\n}\n\nexport interface QueuedDragEvent {\n  eventName: 'dragenter' | 'dragleave' | 'dragover' | 'drop';\n  listener: DragEventListener;\n  event: FileUploadDragEvent;\n}\n\nexport interface SyntheticDragEvent {\n  source: FileUploadDragEvent['source'];\n  dataTransfer: DataTransfer | null;\n  itemDetails: Array<{\n    kind: string;\n    type: string;\n  }>;\n}\n","import { assert } from '@ember/debug';\nimport HTTPRequest from './http-request.ts';\nimport RSVP from 'rsvp';\nimport { waitForPromise } from '@ember/test-waiters';\nimport type { UploadFile } from '../upload-file.ts';\nimport { FileState, type UploadOptions } from '../interfaces.ts';\n\nfunction clone(object: object | undefined) {\n  return object ? { ...object } : {};\n}\n\nfunction normalizeOptions(\n  file: UploadFile,\n  url: string | object | undefined,\n  options?: UploadOptions,\n) {\n  if (typeof url === 'object') {\n    options = url;\n    url = undefined;\n  }\n\n  options = clone(options);\n\n  options.url = options.url || url;\n  options.method = options.method || 'POST';\n  options.accepts = options.accepts || ['application/json', 'text/javascript'];\n  if (!Object.prototype.hasOwnProperty.call(options, 'contentType')) {\n    options.contentType = file.type;\n  }\n  options.headers = clone(options.headers);\n  options.data = clone(options.data);\n  options.fileKey = options.fileKey || 'file';\n\n  if (options.headers['Accept'] == null) {\n    if (!Array.isArray(options.accepts)) {\n      options.accepts = [options.accepts];\n    }\n    options.headers['Accept'] = options.accepts.join(',');\n  }\n\n  // Set Content-Type in the data payload\n  // instead of the headers, since the header\n  // for Content-Type will always be multipart/form-data\n  if (options.contentType) {\n    options.data['Content-Type'] = options.contentType;\n  }\n\n  options.data[options.fileKey] = file.file;\n\n  options.withCredentials = options.withCredentials || false;\n\n  return options;\n}\n\nfunction updateRate(file: UploadFile) {\n  const updatedTime = new Date().getTime();\n\n  // If there's a previous recording, we can calculate a rate from that\n  if (file.timestampWhenProgressLastUpdated) {\n    const timeElapsedSinceLastUpdate =\n      updatedTime - file.timestampWhenProgressLastUpdated;\n\n    const bytesTransferredSinceLastUpdate =\n      file.loaded - file.bytesWhenProgressLastUpdated;\n\n    // Divide by elapsed time to get bytes per millisecond\n    const rate = bytesTransferredSinceLastUpdate / timeElapsedSinceLastUpdate;\n\n    file.rates = [...file.rates, rate];\n  }\n\n  // Finally set current state to be picked up by next invocation\n  file.bytesWhenProgressLastUpdated = file.loaded;\n  file.timestampWhenProgressLastUpdated = updatedTime;\n}\n\nexport function onloadstart(\n  file: UploadFile,\n  event?: ProgressEvent<EventTarget>,\n) {\n  if (!event) return;\n  if (!event.lengthComputable || event.total === 0) return;\n\n  file.loaded = event.loaded;\n  // It occurs that the event.total is not always correct.\n  // For this reason we should hold the max file size.\n  // The correct should be returned while progress\n  file.size = Math.max(file.size, event.total);\n  file.progress = (file.loaded / file.size) * 100;\n\n  updateRate(file);\n}\n\nexport function onprogress(\n  file: UploadFile,\n  event?: ProgressEvent<EventTarget>,\n) {\n  if (!event) return;\n  // We need to check also for isUploadComplete, because the browsers brings sometimes the onprogress after onloadend event\n  if (!event.lengthComputable || event.total === 0 || file.isUploadComplete)\n    return;\n\n  file.size = event.total;\n\n  // When the progress is completed there is possible that we get the `Content-Length` response header of the upload endpoint as loaded / total.\n  // There is possible that `Content-Length` is lower or higher than the already loaded bytes.\n  // if there is lower, we want to keep the higher loaded value, otherwise the progress percentage will be decreased\n  // When the event.loaded is higher than the start file.size, we use the file.size, otherwise it can occur that progress for the file is higher than 100%\n  let loaded = event.loaded;\n  if (loaded > file.size) {\n    loaded = file.size;\n  }\n  file.loaded = Math.max(loaded, file.loaded);\n  file.progress = (file.loaded / file.size) * 100;\n\n  updateRate(file);\n}\n\nexport function onloadend(\n  file: UploadFile,\n  event?: ProgressEvent<EventTarget>,\n) {\n  if (!event) return;\n  if (!event.lengthComputable || event.total === 0) return;\n\n  file.loaded = file.size;\n  file.progress = (file.loaded / file.size) * 100;\n  file.isUploadComplete = true;\n}\n\nexport function upload(\n  file: UploadFile,\n  url: string | object,\n  opts: UploadOptions | undefined,\n  uploadFn: (request: HTTPRequest, options: UploadOptions) => Promise<Response>,\n) {\n  if (['queued', 'failed', 'timed_out', 'aborted'].indexOf(file.state) === -1) {\n    assert(\n      `The file ${file.id} is in the state \"${file.state}\" and cannot be requeued.`,\n    );\n  }\n\n  const options = normalizeOptions(file, url, opts);\n\n  const request = new HTTPRequest({\n    withCredentials: options.withCredentials,\n    label: `${options.method} ${file.name} to ${options.url}`,\n  });\n\n  request.open(options.method ?? 'POST', options.url ?? '', true, '', '');\n\n  // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n  // @ts-ignore\n  Object.keys(options.headers).forEach(function (key) {\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    request.setRequestHeader(key, options.headers[key]);\n  });\n\n  if (options.timeout) {\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    request.timeout = options.timeout;\n  }\n\n  request.onloadstart = (event) => onloadstart(file, event);\n  request.onprogress = (event) => onprogress(file, event);\n  request.onloadend = (event) => onloadend(file, event);\n\n  request.ontimeout = () => {\n    file.state = FileState.TimedOut;\n    file.queue?.flush();\n  };\n  request.onabort = () => {\n    file.state = FileState.Aborted;\n    file.queue?.flush();\n  };\n  file.state = FileState.Uploading;\n\n  return waitForPromise(\n    uploadFn(request, options)\n      .then(function (response) {\n        file.state = FileState.Uploaded;\n        file.queue?.uploadSucceeded(file, response);\n        return response;\n      })\n      .catch(function (response) {\n        file.state = FileState.Failed;\n        file.queue?.uploadFailed(file, response);\n        return RSVP.reject(response);\n      })\n      .finally(() => file.queue?.flush()),\n  );\n}\n","import RSVP from 'rsvp';\n\n/**\n  Provides a promise-aware interface for reading files.\n\n  ```js\n  import { UploadFile, UploadFileReader } from 'ember-file-upload';\n\n  let reader = new UploadFileReader();\n  let file = File.fromDataURL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAAXNSR0IArs4c6QAAACNJREFUCB1jYICC6dOn/4exwTRMAEYzwBnoOmASMBpuDLIAAIVVFiE0cg0oAAAAAElFTkSuQmCC');\n\n  reader.readAsDataURL(file.blob).then((url) => {\n    return url;\n  }, function (err) {\n    console.error(err);\n  });\n  ```\n\n  Promises can be aborted, which will cancel the file upload:\n\n  ```js\n  let promise = reader.readAsDataURL(file.blob);\n  promise.then((url) => {\n    return url;\n  }, (err) => {\n    console.error(err);\n  });\n\n  promise.abort().then(() => {\n    console.error('cancelled reading file');\n  });\n  ```\n\n  @class UploadFileReader\n  @constructor\n  @param [options] An object with a label to use to mark the promise.\n */\nexport default class UploadFileReader {\n  label;\n  reader;\n\n  constructor(options: { label: string } = { label: '' }) {\n    this.label = options.label;\n    this.reader = new FileReader();\n  }\n\n  /**\n    Reads the file and returns a promise that will\n    return the blob as ArrayBuffer.\n\n    @method readAsArrayBuffer\n    @return {Promise} A promise that will return the file as an ArrayBuffer\n   */\n  readAsArrayBuffer(blob: Blob) {\n    this.reader.readAsArrayBuffer(blob);\n    return this.cancellablePromise;\n  }\n\n  /**\n    Reads the file and returns a promise that will\n    return the blob as data URL.\n\n    This is useful for reading images to display\n    as a preview in the browser.\n\n    @method readAsDataURL\n    @return {Promise} A promise that will return the file as a data URL\n   */\n  readAsDataURL(blob: Blob) {\n    this.reader.readAsDataURL(blob);\n    return this.cancellablePromise;\n  }\n\n  /**\n    Reads the file and returns a promise that will\n    return the blob as binary string.\n\n    This is useful for reading images or files that\n    are not plain text.\n\n    @method readAsBinaryString\n    @return {Promise} A promise that will return the file as a binary string\n   */\n  readAsBinaryString(blob: Blob) {\n    this.reader.readAsBinaryString(blob);\n    return this.cancellablePromise;\n  }\n\n  /**\n    Reads the file and returns a promise that will\n    return the blob as text.\n\n    This is useful for reading plain text files.\n\n    @method readAsText\n    @return {Promise} A promise that will return the file as text\n   */\n  readAsText(blob: Blob) {\n    this.reader.readAsText(blob);\n    return this.cancellablePromise;\n  }\n\n  get cancellablePromise() {\n    const { promise, resolve, reject } = RSVP.defer(\n      `ember-file-upload: ${this.label}`,\n    );\n\n    const cancellable = promise.then(\n      () => {\n        return this.reader.result;\n      },\n      () => {\n        return RSVP.reject(this.reader.error);\n      },\n      `ember-file-upload: Unpack ${this.label}`,\n    );\n\n    let abort: RSVP.Deferred<string> | undefined;\n\n    // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n    // @ts-ignore\n    cancellable.cancel = () => {\n      if (abort == null) {\n        abort = RSVP.defer(`ember-file-upload: Abort ${this.label}`);\n        this.reader.abort();\n      }\n      return abort.promise;\n    };\n\n    this.reader.onload = resolve;\n    this.reader.onerror = reject;\n    this.reader.onabort = () => {\n      abort?.resolve();\n    };\n\n    return cancellable;\n  }\n}\n","// Calculate from the last x rate recordings\nconst CALCULATE_FROM_LAST = 30;\n\n// Weigh recent rates more highly\nconst THRESHOLDS = [\n  { threshold: 10, proportion: 3 },\n  { threshold: 20, proportion: 2 },\n  { threshold: 30, proportion: 1 },\n];\nconst DEFAULT_PROPORTION = 1;\n\nexport function estimatedRate(allRates: number[]): number {\n  if (!allRates.length) return 0;\n\n  const rates = allRates.slice(CALCULATE_FROM_LAST * -1).reverse();\n  const weights = generateWeights(rates.length);\n\n  // Multiply each rate by its respective weight for a weighted average\n  return rates.reduce((acc, rate, index) => {\n    const weight = weights[index] as number;\n    return acc + rate * weight;\n  }, 0);\n}\n\nexport function generateWeights(totalRates: number): number[] {\n  // Generate an array the same length as totalRates filled with proportioanl weights\n  const proportions = Array.from({ length: totalRates }).map((_, index) => {\n    return proportionForPosition(index + 1);\n  });\n\n  const proportionTotal = proportions.reduce((acc, value) => acc + value, 0);\n  // Convert proportional weights to real weights by division\n  const realWeights = proportions.map(\n    (proportion) => proportion / proportionTotal,\n  );\n\n  return realWeights;\n}\n\nexport function proportionForPosition(position: number) {\n  for (const { threshold, proportion } of THRESHOLDS) {\n    if (position <= threshold) return proportion;\n  }\n  return DEFAULT_PROPORTION;\n}\n","const candidateSelectors = [\n  'input',\n  'select',\n  'textarea',\n  'a[href]',\n  'button',\n  '[tabindex]:not(slot)',\n  'audio[controls]',\n  'video[controls]',\n  '[contenteditable]:not([contenteditable=\"false\"])',\n  'details>summary:first-of-type',\n  'details',\n];\nconst candidateSelector = /* #__PURE__ */ candidateSelectors.join(',');\n\nconst NoElement = typeof Element === 'undefined';\n\nconst matches = NoElement\n  ? function () {}\n  : Element.prototype.matches ||\n    Element.prototype.msMatchesSelector ||\n    Element.prototype.webkitMatchesSelector;\n\nconst getRootNode =\n  !NoElement && Element.prototype.getRootNode\n    ? (element) => element.getRootNode()\n    : (element) => element.ownerDocument;\n\n/**\n * @param {Element} el container to check in\n * @param {boolean} includeContainer add container to check\n * @param {(node: Element) => boolean} filter filter candidates\n * @returns {Element[]}\n */\nconst getCandidates = function (el, includeContainer, filter) {\n  let candidates = Array.prototype.slice.apply(\n    el.querySelectorAll(candidateSelector)\n  );\n  if (includeContainer && matches.call(el, candidateSelector)) {\n    candidates.unshift(el);\n  }\n  candidates = candidates.filter(filter);\n  return candidates;\n};\n\n/**\n * @callback GetShadowRoot\n * @param {Element} element to check for shadow root\n * @returns {ShadowRoot|boolean} ShadowRoot if available or boolean indicating if a shadowRoot is attached but not available.\n */\n\n/**\n * @callback ShadowRootFilter\n * @param {Element} shadowHostNode the element which contains shadow content\n * @returns {boolean} true if a shadow root could potentially contain valid candidates.\n */\n\n/**\n * @typedef {Object} CandidatesScope\n * @property {Element} scope contains inner candidates\n * @property {Element[]} candidates\n */\n\n/**\n * @typedef {Object} IterativeOptions\n * @property {GetShadowRoot|boolean} getShadowRoot true if shadow support is enabled; falsy if not;\n *  if a function, implies shadow support is enabled and either returns the shadow root of an element\n *  or a boolean stating if it has an undisclosed shadow root\n * @property {(node: Element) => boolean} filter filter candidates\n * @property {boolean} flatten if true then result will flatten any CandidatesScope into the returned list\n * @property {ShadowRootFilter} shadowRootFilter filter shadow roots;\n */\n\n/**\n * @param {Element[]} elements list of element containers to match candidates from\n * @param {boolean} includeContainer add container list to check\n * @param {IterativeOptions} options\n * @returns {Array.<Element|CandidatesScope>}\n */\nconst getCandidatesIteratively = function (\n  elements,\n  includeContainer,\n  options\n) {\n  const candidates = [];\n  const elementsToCheck = Array.from(elements);\n  while (elementsToCheck.length) {\n    const element = elementsToCheck.shift();\n    if (element.tagName === 'SLOT') {\n      // add shadow dom slot scope (slot itself cannot be focusable)\n      const assigned = element.assignedElements();\n      const content = assigned.length ? assigned : element.children;\n      const nestedCandidates = getCandidatesIteratively(content, true, options);\n      if (options.flatten) {\n        candidates.push(...nestedCandidates);\n      } else {\n        candidates.push({\n          scope: element,\n          candidates: nestedCandidates,\n        });\n      }\n    } else {\n      // check candidate element\n      const validCandidate = matches.call(element, candidateSelector);\n      if (\n        validCandidate &&\n        options.filter(element) &&\n        (includeContainer || !elements.includes(element))\n      ) {\n        candidates.push(element);\n      }\n\n      // iterate over shadow content if possible\n      const shadowRoot =\n        element.shadowRoot ||\n        // check for an undisclosed shadow\n        (typeof options.getShadowRoot === 'function' &&\n          options.getShadowRoot(element));\n\n      const validShadowRoot =\n        !options.shadowRootFilter || options.shadowRootFilter(element);\n\n      if (shadowRoot && validShadowRoot) {\n        // add shadow dom scope IIF a shadow root node was given; otherwise, an undisclosed\n        //  shadow exists, so look at light dom children as fallback BUT create a scope for any\n        //  child candidates found because they're likely slotted elements (elements that are\n        //  children of the web component element (which has the shadow), in the light dom, but\n        //  slotted somewhere _inside_ the undisclosed shadow) -- the scope is created below,\n        //  _after_ we return from this recursive call\n        const nestedCandidates = getCandidatesIteratively(\n          shadowRoot === true ? element.children : shadowRoot.children,\n          true,\n          options\n        );\n\n        if (options.flatten) {\n          candidates.push(...nestedCandidates);\n        } else {\n          candidates.push({\n            scope: element,\n            candidates: nestedCandidates,\n          });\n        }\n      } else {\n        // there's not shadow so just dig into the element's (light dom) children\n        //  __without__ giving the element special scope treatment\n        elementsToCheck.unshift(...element.children);\n      }\n    }\n  }\n  return candidates;\n};\n\nconst getTabindex = function (node, isScope) {\n  if (node.tabIndex < 0) {\n    // in Chrome, <details/>, <audio controls/> and <video controls/> elements get a default\n    // `tabIndex` of -1 when the 'tabindex' attribute isn't specified in the DOM,\n    // yet they are still part of the regular tab order; in FF, they get a default\n    // `tabIndex` of 0; since Chrome still puts those elements in the regular tab\n    // order, consider their tab index to be 0.\n    // Also browsers do not return `tabIndex` correctly for contentEditable nodes;\n    // so if they don't have a tabindex attribute specifically set, assume it's 0.\n    //\n    // isScope is positive for custom element with shadow root or slot that by default\n    // have tabIndex -1, but need to be sorted by document order in order for their\n    // content to be inserted in the correct position\n    if (\n      (isScope ||\n        /^(AUDIO|VIDEO|DETAILS)$/.test(node.tagName) ||\n        node.isContentEditable) &&\n      isNaN(parseInt(node.getAttribute('tabindex'), 10))\n    ) {\n      return 0;\n    }\n  }\n\n  return node.tabIndex;\n};\n\nconst sortOrderedTabbables = function (a, b) {\n  return a.tabIndex === b.tabIndex\n    ? a.documentOrder - b.documentOrder\n    : a.tabIndex - b.tabIndex;\n};\n\nconst isInput = function (node) {\n  return node.tagName === 'INPUT';\n};\n\nconst isHiddenInput = function (node) {\n  return isInput(node) && node.type === 'hidden';\n};\n\nconst isDetailsWithSummary = function (node) {\n  const r =\n    node.tagName === 'DETAILS' &&\n    Array.prototype.slice\n      .apply(node.children)\n      .some((child) => child.tagName === 'SUMMARY');\n  return r;\n};\n\nconst getCheckedRadio = function (nodes, form) {\n  for (let i = 0; i < nodes.length; i++) {\n    if (nodes[i].checked && nodes[i].form === form) {\n      return nodes[i];\n    }\n  }\n};\n\nconst isTabbableRadio = function (node) {\n  if (!node.name) {\n    return true;\n  }\n  const radioScope = node.form || getRootNode(node);\n  const queryRadios = function (name) {\n    return radioScope.querySelectorAll(\n      'input[type=\"radio\"][name=\"' + name + '\"]'\n    );\n  };\n\n  let radioSet;\n  if (\n    typeof window !== 'undefined' &&\n    typeof window.CSS !== 'undefined' &&\n    typeof window.CSS.escape === 'function'\n  ) {\n    radioSet = queryRadios(window.CSS.escape(node.name));\n  } else {\n    try {\n      radioSet = queryRadios(node.name);\n    } catch (err) {\n      // eslint-disable-next-line no-console\n      console.error(\n        'Looks like you have a radio button with a name attribute containing invalid CSS selector characters and need the CSS.escape polyfill: %s',\n        err.message\n      );\n      return false;\n    }\n  }\n\n  const checked = getCheckedRadio(radioSet, node.form);\n  return !checked || checked === node;\n};\n\nconst isRadio = function (node) {\n  return isInput(node) && node.type === 'radio';\n};\n\nconst isNonTabbableRadio = function (node) {\n  return isRadio(node) && !isTabbableRadio(node);\n};\n\nconst isZeroArea = function (node) {\n  const { width, height } = node.getBoundingClientRect();\n  return width === 0 && height === 0;\n};\nconst isHidden = function (node, { displayCheck, getShadowRoot }) {\n  // NOTE: visibility will be `undefined` if node is detached from the document\n  //  (see notes about this further down), which means we will consider it visible\n  //  (this is legacy behavior from a very long way back)\n  // NOTE: we check this regardless of `displayCheck=\"none\"` because this is a\n  //  _visibility_ check, not a _display_ check\n  if (getComputedStyle(node).visibility === 'hidden') {\n    return true;\n  }\n\n  const isDirectSummary = matches.call(node, 'details>summary:first-of-type');\n  const nodeUnderDetails = isDirectSummary ? node.parentElement : node;\n  if (matches.call(nodeUnderDetails, 'details:not([open]) *')) {\n    return true;\n  }\n\n  // The root node is the shadow root if the node is in a shadow DOM; some document otherwise\n  //  (but NOT _the_ document; see second 'If' comment below for more).\n  // If rootNode is shadow root, it'll have a host, which is the element to which the shadow\n  //  is attached, and the one we need to check if it's in the document or not (because the\n  //  shadow, and all nodes it contains, is never considered in the document since shadows\n  //  behave like self-contained DOMs; but if the shadow's HOST, which is part of the document,\n  //  is hidden, or is not in the document itself but is detached, it will affect the shadow's\n  //  visibility, including all the nodes it contains). The host could be any normal node,\n  //  or a custom element (i.e. web component). Either way, that's the one that is considered\n  //  part of the document, not the shadow root, nor any of its children (i.e. the node being\n  //  tested).\n  // If rootNode is not a shadow root, it won't have a host, and so rootNode should be the\n  //  document (per the docs) and while it's a Document-type object, that document does not\n  //  appear to be the same as the node's `ownerDocument` for some reason, so it's safer\n  //  to ignore the rootNode at this point, and use `node.ownerDocument`. Otherwise,\n  //  using `rootNode.contains(node)` will _always_ be true we'll get false-positives when\n  //  node is actually detached.\n  const nodeRootHost = getRootNode(node).host;\n  const nodeIsAttached =\n    nodeRootHost?.ownerDocument.contains(nodeRootHost) ||\n    node.ownerDocument.contains(node);\n\n  if (!displayCheck || displayCheck === 'full') {\n    if (typeof getShadowRoot === 'function') {\n      // figure out if we should consider the node to be in an undisclosed shadow and use the\n      //  'non-zero-area' fallback\n      const originalNode = node;\n      while (node) {\n        const parentElement = node.parentElement;\n        const rootNode = getRootNode(node);\n        if (\n          parentElement &&\n          !parentElement.shadowRoot &&\n          getShadowRoot(parentElement) === true // check if there's an undisclosed shadow\n        ) {\n          // node has an undisclosed shadow which means we can only treat it as a black box, so we\n          //  fall back to a non-zero-area test\n          return isZeroArea(node);\n        } else if (node.assignedSlot) {\n          // iterate up slot\n          node = node.assignedSlot;\n        } else if (!parentElement && rootNode !== node.ownerDocument) {\n          // cross shadow boundary\n          node = rootNode.host;\n        } else {\n          // iterate up normal dom\n          node = parentElement;\n        }\n      }\n\n      node = originalNode;\n    }\n    // else, `getShadowRoot` might be true, but all that does is enable shadow DOM support\n    //  (i.e. it does not also presume that all nodes might have undisclosed shadows); or\n    //  it might be a falsy value, which means shadow DOM support is disabled\n\n    // Since we didn't find it sitting in an undisclosed shadow (or shadows are disabled)\n    //  now we can just test to see if it would normally be visible or not, provided it's\n    //  attached to the main document.\n    // NOTE: We must consider case where node is inside a shadow DOM and given directly to\n    //  `isTabbable()` or `isFocusable()` -- regardless of `getShadowRoot` option setting.\n\n    if (nodeIsAttached) {\n      // this works wherever the node is: if there's at least one client rect, it's\n      //  somehow displayed; it also covers the CSS 'display: contents' case where the\n      //  node itself is hidden in place of its contents; and there's no need to search\n      //  up the hierarchy either\n      return !node.getClientRects().length;\n    }\n\n    // Else, the node isn't attached to the document, which means the `getClientRects()`\n    //  API will __always__ return zero rects (this can happen, for example, if React\n    //  is used to render nodes onto a detached tree, as confirmed in this thread:\n    //  https://github.com/facebook/react/issues/9117#issuecomment-284228870)\n    //\n    // It also means that even window.getComputedStyle(node).display will return `undefined`\n    //  because styles are only computed for nodes that are in the document.\n    //\n    // NOTE: THIS HAS BEEN THE CASE FOR YEARS. It is not new, nor is it caused by tabbable\n    //  somehow. Though it was never stated officially, anyone who has ever used tabbable\n    //  APIs on nodes in detached containers has actually implicitly used tabbable in what\n    //  was later (as of v5.2.0 on Apr 9, 2021) called `displayCheck=\"none\"` mode -- essentially\n    //  considering __everything__ to be visible because of the innability to determine styles.\n  } else if (displayCheck === 'non-zero-area') {\n    // NOTE: Even though this tests that the node's client rect is non-zero to determine\n    //  whether it's displayed, and that a detached node will __always__ have a zero-area\n    //  client rect, we don't special-case for whether the node is attached or not. In\n    //  this mode, we do want to consider nodes that have a zero area to be hidden at all\n    //  times, and that includes attached or not.\n    return isZeroArea(node);\n  }\n\n  // visible, as far as we can tell, or per current `displayCheck` mode\n  return false;\n};\n\n// form fields (nested) inside a disabled fieldset are not focusable/tabbable\n//  unless they are in the _first_ <legend> element of the top-most disabled\n//  fieldset\nconst isDisabledFromFieldset = function (node) {\n  if (/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(node.tagName)) {\n    let parentNode = node.parentElement;\n    // check if `node` is contained in a disabled <fieldset>\n    while (parentNode) {\n      if (parentNode.tagName === 'FIELDSET' && parentNode.disabled) {\n        // look for the first <legend> among the children of the disabled <fieldset>\n        for (let i = 0; i < parentNode.children.length; i++) {\n          const child = parentNode.children.item(i);\n          // when the first <legend> (in document order) is found\n          if (child.tagName === 'LEGEND') {\n            // if its parent <fieldset> is not nested in another disabled <fieldset>,\n            // return whether `node` is a descendant of its first <legend>\n            return matches.call(parentNode, 'fieldset[disabled] *')\n              ? true\n              : !child.contains(node);\n          }\n        }\n        // the disabled <fieldset> containing `node` has no <legend>\n        return true;\n      }\n      parentNode = parentNode.parentElement;\n    }\n  }\n\n  // else, node's tabbable/focusable state should not be affected by a fieldset's\n  //  enabled/disabled state\n  return false;\n};\n\nconst isNodeMatchingSelectorFocusable = function (options, node) {\n  if (\n    node.disabled ||\n    isHiddenInput(node) ||\n    isHidden(node, options) ||\n    // For a details element with a summary, the summary element gets the focus\n    isDetailsWithSummary(node) ||\n    isDisabledFromFieldset(node)\n  ) {\n    return false;\n  }\n  return true;\n};\n\nconst isNodeMatchingSelectorTabbable = function (options, node) {\n  if (\n    isNonTabbableRadio(node) ||\n    getTabindex(node) < 0 ||\n    !isNodeMatchingSelectorFocusable(options, node)\n  ) {\n    return false;\n  }\n  return true;\n};\n\nconst isValidShadowRootTabbable = function (shadowHostNode) {\n  const tabIndex = parseInt(shadowHostNode.getAttribute('tabindex'), 10);\n  if (isNaN(tabIndex) || tabIndex >= 0) {\n    return true;\n  }\n  // If a custom element has an explicit negative tabindex,\n  // browsers will not allow tab targeting said element's children.\n  return false;\n};\n\n/**\n * @param {Array.<Element|CandidatesScope>} candidates\n * @returns Element[]\n */\nconst sortByOrder = function (candidates) {\n  const regularTabbables = [];\n  const orderedTabbables = [];\n  candidates.forEach(function (item, i) {\n    const isScope = !!item.scope;\n    const element = isScope ? item.scope : item;\n    const candidateTabindex = getTabindex(element, isScope);\n    const elements = isScope ? sortByOrder(item.candidates) : element;\n    if (candidateTabindex === 0) {\n      isScope\n        ? regularTabbables.push(...elements)\n        : regularTabbables.push(element);\n    } else {\n      orderedTabbables.push({\n        documentOrder: i,\n        tabIndex: candidateTabindex,\n        item: item,\n        isScope: isScope,\n        content: elements,\n      });\n    }\n  });\n\n  return orderedTabbables\n    .sort(sortOrderedTabbables)\n    .reduce((acc, sortable) => {\n      sortable.isScope\n        ? acc.push(...sortable.content)\n        : acc.push(sortable.content);\n      return acc;\n    }, [])\n    .concat(regularTabbables);\n};\n\nconst tabbable = function (el, options) {\n  options = options || {};\n\n  let candidates;\n  if (options.getShadowRoot) {\n    candidates = getCandidatesIteratively([el], options.includeContainer, {\n      filter: isNodeMatchingSelectorTabbable.bind(null, options),\n      flatten: false,\n      getShadowRoot: options.getShadowRoot,\n      shadowRootFilter: isValidShadowRootTabbable,\n    });\n  } else {\n    candidates = getCandidates(\n      el,\n      options.includeContainer,\n      isNodeMatchingSelectorTabbable.bind(null, options)\n    );\n  }\n  return sortByOrder(candidates);\n};\n\nconst focusable = function (el, options) {\n  options = options || {};\n\n  let candidates;\n  if (options.getShadowRoot) {\n    candidates = getCandidatesIteratively([el], options.includeContainer, {\n      filter: isNodeMatchingSelectorFocusable.bind(null, options),\n      flatten: true,\n      getShadowRoot: options.getShadowRoot,\n    });\n  } else {\n    candidates = getCandidates(\n      el,\n      options.includeContainer,\n      isNodeMatchingSelectorFocusable.bind(null, options)\n    );\n  }\n\n  return candidates;\n};\n\nconst isTabbable = function (node, options) {\n  options = options || {};\n  if (!node) {\n    throw new Error('No node provided');\n  }\n  if (matches.call(node, candidateSelector) === false) {\n    return false;\n  }\n  return isNodeMatchingSelectorTabbable(options, node);\n};\n\nconst focusableCandidateSelector = /* #__PURE__ */ candidateSelectors\n  .concat('iframe')\n  .join(',');\n\nconst isFocusable = function (node, options) {\n  options = options || {};\n  if (!node) {\n    throw new Error('No node provided');\n  }\n  if (matches.call(node, focusableCandidateSelector) === false) {\n    return false;\n  }\n  return isNodeMatchingSelectorFocusable(options, node);\n};\n\nexport { tabbable, focusable, isTabbable, isFocusable };\n","import { tabbable, focusable, isFocusable, isTabbable } from 'tabbable';\n\nconst activeFocusTraps = (function () {\n  const trapQueue = [];\n  return {\n    activateTrap(trap) {\n      if (trapQueue.length > 0) {\n        const activeTrap = trapQueue[trapQueue.length - 1];\n        if (activeTrap !== trap) {\n          activeTrap.pause();\n        }\n      }\n\n      const trapIndex = trapQueue.indexOf(trap);\n      if (trapIndex === -1) {\n        trapQueue.push(trap);\n      } else {\n        // move this existing trap to the front of the queue\n        trapQueue.splice(trapIndex, 1);\n        trapQueue.push(trap);\n      }\n    },\n\n    deactivateTrap(trap) {\n      const trapIndex = trapQueue.indexOf(trap);\n      if (trapIndex !== -1) {\n        trapQueue.splice(trapIndex, 1);\n      }\n\n      if (trapQueue.length > 0) {\n        trapQueue[trapQueue.length - 1].unpause();\n      }\n    },\n  };\n})();\n\nconst isSelectableInput = function (node) {\n  return (\n    node.tagName &&\n    node.tagName.toLowerCase() === 'input' &&\n    typeof node.select === 'function'\n  );\n};\n\nconst isEscapeEvent = function (e) {\n  return e.key === 'Escape' || e.key === 'Esc' || e.keyCode === 27;\n};\n\nconst isTabEvent = function (e) {\n  return e.key === 'Tab' || e.keyCode === 9;\n};\n\nconst delay = function (fn) {\n  return setTimeout(fn, 0);\n};\n\n// Array.find/findIndex() are not supported on IE; this replicates enough\n//  of Array.findIndex() for our needs\nconst findIndex = function (arr, fn) {\n  let idx = -1;\n\n  arr.every(function (value, i) {\n    if (fn(value)) {\n      idx = i;\n      return false; // break\n    }\n\n    return true; // next\n  });\n\n  return idx;\n};\n\n/**\n * Get an option's value when it could be a plain value, or a handler that provides\n *  the value.\n * @param {*} value Option's value to check.\n * @param {...*} [params] Any parameters to pass to the handler, if `value` is a function.\n * @returns {*} The `value`, or the handler's returned value.\n */\nconst valueOrHandler = function (value, ...params) {\n  return typeof value === 'function' ? value(...params) : value;\n};\n\nconst getActualTarget = function (event) {\n  // NOTE: If the trap is _inside_ a shadow DOM, event.target will always be the\n  //  shadow host. However, event.target.composedPath() will be an array of\n  //  nodes \"clicked\" from inner-most (the actual element inside the shadow) to\n  //  outer-most (the host HTML document). If we have access to composedPath(),\n  //  then use its first element; otherwise, fall back to event.target (and\n  //  this only works for an _open_ shadow DOM; otherwise,\n  //  composedPath()[0] === event.target always).\n  return event.target.shadowRoot && typeof event.composedPath === 'function'\n    ? event.composedPath()[0]\n    : event.target;\n};\n\nconst createFocusTrap = function (elements, userOptions) {\n  // SSR: a live trap shouldn't be created in this type of environment so this\n  //  should be safe code to execute if the `document` option isn't specified\n  const doc = userOptions?.document || document;\n\n  const config = {\n    returnFocusOnDeactivate: true,\n    escapeDeactivates: true,\n    delayInitialFocus: true,\n    ...userOptions,\n  };\n\n  const state = {\n    // containers given to createFocusTrap()\n    // @type {Array<HTMLElement>}\n    containers: [],\n\n    // list of objects identifying tabbable nodes in `containers` in the trap\n    // NOTE: it's possible that a group has no tabbable nodes if nodes get removed while the trap\n    //  is active, but the trap should never get to a state where there isn't at least one group\n    //  with at least one tabbable node in it (that would lead to an error condition that would\n    //  result in an error being thrown)\n    // @type {Array<{\n    //   container: HTMLElement,\n    //   tabbableNodes: Array<HTMLElement>, // empty if none\n    //   focusableNodes: Array<HTMLElement>, // empty if none\n    //   firstTabbableNode: HTMLElement|null,\n    //   lastTabbableNode: HTMLElement|null,\n    //   nextTabbableNode: (node: HTMLElement, forward: boolean) => HTMLElement|undefined\n    // }>}\n    containerGroups: [], // same order/length as `containers` list\n\n    // references to objects in `containerGroups`, but only those that actually have\n    //  tabbable nodes in them\n    // NOTE: same order as `containers` and `containerGroups`, but __not necessarily__\n    //  the same length\n    tabbableGroups: [],\n\n    nodeFocusedBeforeActivation: null,\n    mostRecentlyFocusedNode: null,\n    active: false,\n    paused: false,\n\n    // timer ID for when delayInitialFocus is true and initial focus in this trap\n    //  has been delayed during activation\n    delayInitialFocusTimer: undefined,\n  };\n\n  let trap; // eslint-disable-line prefer-const -- some private functions reference it, and its methods reference private functions, so we must declare here and define later\n\n  /**\n   * Gets a configuration option value.\n   * @param {Object|undefined} configOverrideOptions If true, and option is defined in this set,\n   *  value will be taken from this object. Otherwise, value will be taken from base configuration.\n   * @param {string} optionName Name of the option whose value is sought.\n   * @param {string|undefined} [configOptionName] Name of option to use __instead of__ `optionName`\n   *  IIF `configOverrideOptions` is not defined. Otherwise, `optionName` is used.\n   */\n  const getOption = (configOverrideOptions, optionName, configOptionName) => {\n    return configOverrideOptions &&\n      configOverrideOptions[optionName] !== undefined\n      ? configOverrideOptions[optionName]\n      : config[configOptionName || optionName];\n  };\n\n  /**\n   * Finds the index of the container that contains the element.\n   * @param {HTMLElement} element\n   * @returns {number} Index of the container in either `state.containers` or\n   *  `state.containerGroups` (the order/length of these lists are the same); -1\n   *  if the element isn't found.\n   */\n  const findContainerIndex = function (element) {\n    // NOTE: search `containerGroups` because it's possible a group contains no tabbable\n    //  nodes, but still contains focusable nodes (e.g. if they all have `tabindex=-1`)\n    //  and we still need to find the element in there\n    return state.containerGroups.findIndex(\n      ({ container, tabbableNodes }) =>\n        container.contains(element) ||\n        // fall back to explicit tabbable search which will take into consideration any\n        //  web components if the `tabbableOptions.getShadowRoot` option was used for\n        //  the trap, enabling shadow DOM support in tabbable (`Node.contains()` doesn't\n        //  look inside web components even if open)\n        tabbableNodes.find((node) => node === element)\n    );\n  };\n\n  /**\n   * Gets the node for the given option, which is expected to be an option that\n   *  can be either a DOM node, a string that is a selector to get a node, `false`\n   *  (if a node is explicitly NOT given), or a function that returns any of these\n   *  values.\n   * @param {string} optionName\n   * @returns {undefined | false | HTMLElement | SVGElement} Returns\n   *  `undefined` if the option is not specified; `false` if the option\n   *  resolved to `false` (node explicitly not given); otherwise, the resolved\n   *  DOM node.\n   * @throws {Error} If the option is set, not `false`, and is not, or does not\n   *  resolve to a node.\n   */\n  const getNodeForOption = function (optionName, ...params) {\n    let optionValue = config[optionName];\n\n    if (typeof optionValue === 'function') {\n      optionValue = optionValue(...params);\n    }\n\n    if (optionValue === true) {\n      optionValue = undefined; // use default value\n    }\n\n    if (!optionValue) {\n      if (optionValue === undefined || optionValue === false) {\n        return optionValue;\n      }\n      // else, empty string (invalid), null (invalid), 0 (invalid)\n\n      throw new Error(\n        `\\`${optionName}\\` was specified but was not a node, or did not return a node`\n      );\n    }\n\n    let node = optionValue; // could be HTMLElement, SVGElement, or non-empty string at this point\n\n    if (typeof optionValue === 'string') {\n      node = doc.querySelector(optionValue); // resolve to node, or null if fails\n      if (!node) {\n        throw new Error(\n          `\\`${optionName}\\` as selector refers to no known node`\n        );\n      }\n    }\n\n    return node;\n  };\n\n  const getInitialFocusNode = function () {\n    let node = getNodeForOption('initialFocus');\n\n    // false explicitly indicates we want no initialFocus at all\n    if (node === false) {\n      return false;\n    }\n\n    if (node === undefined) {\n      // option not specified: use fallback options\n      if (findContainerIndex(doc.activeElement) >= 0) {\n        node = doc.activeElement;\n      } else {\n        const firstTabbableGroup = state.tabbableGroups[0];\n        const firstTabbableNode =\n          firstTabbableGroup && firstTabbableGroup.firstTabbableNode;\n\n        // NOTE: `fallbackFocus` option function cannot return `false` (not supported)\n        node = firstTabbableNode || getNodeForOption('fallbackFocus');\n      }\n    }\n\n    if (!node) {\n      throw new Error(\n        'Your focus-trap needs to have at least one focusable element'\n      );\n    }\n\n    return node;\n  };\n\n  const updateTabbableNodes = function () {\n    state.containerGroups = state.containers.map((container) => {\n      const tabbableNodes = tabbable(container, config.tabbableOptions);\n\n      // NOTE: if we have tabbable nodes, we must have focusable nodes; focusable nodes\n      //  are a superset of tabbable nodes\n      const focusableNodes = focusable(container, config.tabbableOptions);\n\n      return {\n        container,\n        tabbableNodes,\n        focusableNodes,\n        firstTabbableNode: tabbableNodes.length > 0 ? tabbableNodes[0] : null,\n        lastTabbableNode:\n          tabbableNodes.length > 0\n            ? tabbableNodes[tabbableNodes.length - 1]\n            : null,\n\n        /**\n         * Finds the __tabbable__ node that follows the given node in the specified direction,\n         *  in this container, if any.\n         * @param {HTMLElement} node\n         * @param {boolean} [forward] True if going in forward tab order; false if going\n         *  in reverse.\n         * @returns {HTMLElement|undefined} The next tabbable node, if any.\n         */\n        nextTabbableNode(node, forward = true) {\n          // NOTE: If tabindex is positive (in order to manipulate the tab order separate\n          //  from the DOM order), this __will not work__ because the list of focusableNodes,\n          //  while it contains tabbable nodes, does not sort its nodes in any order other\n          //  than DOM order, because it can't: Where would you place focusable (but not\n          //  tabbable) nodes in that order? They have no order, because they aren't tabbale...\n          // Support for positive tabindex is already broken and hard to manage (possibly\n          //  not supportable, TBD), so this isn't going to make things worse than they\n          //  already are, and at least makes things better for the majority of cases where\n          //  tabindex is either 0/unset or negative.\n          // FYI, positive tabindex issue: https://github.com/focus-trap/focus-trap/issues/375\n          const nodeIdx = focusableNodes.findIndex((n) => n === node);\n          if (nodeIdx < 0) {\n            return undefined;\n          }\n\n          if (forward) {\n            return focusableNodes\n              .slice(nodeIdx + 1)\n              .find((n) => isTabbable(n, config.tabbableOptions));\n          }\n\n          return focusableNodes\n            .slice(0, nodeIdx)\n            .reverse()\n            .find((n) => isTabbable(n, config.tabbableOptions));\n        },\n      };\n    });\n\n    state.tabbableGroups = state.containerGroups.filter(\n      (group) => group.tabbableNodes.length > 0\n    );\n\n    // throw if no groups have tabbable nodes and we don't have a fallback focus node either\n    if (\n      state.tabbableGroups.length <= 0 &&\n      !getNodeForOption('fallbackFocus') // returning false not supported for this option\n    ) {\n      throw new Error(\n        'Your focus-trap must have at least one container with at least one tabbable node in it at all times'\n      );\n    }\n  };\n\n  const tryFocus = function (node) {\n    if (node === false) {\n      return;\n    }\n\n    if (node === doc.activeElement) {\n      return;\n    }\n\n    if (!node || !node.focus) {\n      tryFocus(getInitialFocusNode());\n      return;\n    }\n\n    node.focus({ preventScroll: !!config.preventScroll });\n    state.mostRecentlyFocusedNode = node;\n\n    if (isSelectableInput(node)) {\n      node.select();\n    }\n  };\n\n  const getReturnFocusNode = function (previousActiveElement) {\n    const node = getNodeForOption('setReturnFocus', previousActiveElement);\n    return node ? node : node === false ? false : previousActiveElement;\n  };\n\n  // This needs to be done on mousedown and touchstart instead of click\n  // so that it precedes the focus event.\n  const checkPointerDown = function (e) {\n    const target = getActualTarget(e);\n\n    if (findContainerIndex(target) >= 0) {\n      // allow the click since it ocurred inside the trap\n      return;\n    }\n\n    if (valueOrHandler(config.clickOutsideDeactivates, e)) {\n      // immediately deactivate the trap\n      trap.deactivate({\n        // if, on deactivation, we should return focus to the node originally-focused\n        //  when the trap was activated (or the configured `setReturnFocus` node),\n        //  then assume it's also OK to return focus to the outside node that was\n        //  just clicked, causing deactivation, as long as that node is focusable;\n        //  if it isn't focusable, then return focus to the original node focused\n        //  on activation (or the configured `setReturnFocus` node)\n        // NOTE: by setting `returnFocus: false`, deactivate() will do nothing,\n        //  which will result in the outside click setting focus to the node\n        //  that was clicked, whether it's focusable or not; by setting\n        //  `returnFocus: true`, we'll attempt to re-focus the node originally-focused\n        //  on activation (or the configured `setReturnFocus` node)\n        returnFocus:\n          config.returnFocusOnDeactivate &&\n          !isFocusable(target, config.tabbableOptions),\n      });\n      return;\n    }\n\n    // This is needed for mobile devices.\n    // (If we'll only let `click` events through,\n    // then on mobile they will be blocked anyways if `touchstart` is blocked.)\n    if (valueOrHandler(config.allowOutsideClick, e)) {\n      // allow the click outside the trap to take place\n      return;\n    }\n\n    // otherwise, prevent the click\n    e.preventDefault();\n  };\n\n  // In case focus escapes the trap for some strange reason, pull it back in.\n  const checkFocusIn = function (e) {\n    const target = getActualTarget(e);\n    const targetContained = findContainerIndex(target) >= 0;\n\n    // In Firefox when you Tab out of an iframe the Document is briefly focused.\n    if (targetContained || target instanceof Document) {\n      if (targetContained) {\n        state.mostRecentlyFocusedNode = target;\n      }\n    } else {\n      // escaped! pull it back in to where it just left\n      e.stopImmediatePropagation();\n      tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());\n    }\n  };\n\n  // Hijack Tab events on the first and last focusable nodes of the trap,\n  // in order to prevent focus from escaping. If it escapes for even a\n  // moment it can end up scrolling the page and causing confusion so we\n  // kind of need to capture the action at the keydown phase.\n  const checkTab = function (e) {\n    const target = getActualTarget(e);\n    updateTabbableNodes();\n\n    let destinationNode = null;\n\n    if (state.tabbableGroups.length > 0) {\n      // make sure the target is actually contained in a group\n      // NOTE: the target may also be the container itself if it's focusable\n      //  with tabIndex='-1' and was given initial focus\n      const containerIndex = findContainerIndex(target);\n      const containerGroup =\n        containerIndex >= 0 ? state.containerGroups[containerIndex] : undefined;\n\n      if (containerIndex < 0) {\n        // target not found in any group: quite possible focus has escaped the trap,\n        //  so bring it back in to...\n        if (e.shiftKey) {\n          // ...the last node in the last group\n          destinationNode =\n            state.tabbableGroups[state.tabbableGroups.length - 1]\n              .lastTabbableNode;\n        } else {\n          // ...the first node in the first group\n          destinationNode = state.tabbableGroups[0].firstTabbableNode;\n        }\n      } else if (e.shiftKey) {\n        // REVERSE\n\n        // is the target the first tabbable node in a group?\n        let startOfGroupIndex = findIndex(\n          state.tabbableGroups,\n          ({ firstTabbableNode }) => target === firstTabbableNode\n        );\n\n        if (\n          startOfGroupIndex < 0 &&\n          (containerGroup.container === target ||\n            (isFocusable(target, config.tabbableOptions) &&\n              !isTabbable(target, config.tabbableOptions) &&\n              !containerGroup.nextTabbableNode(target, false)))\n        ) {\n          // an exception case where the target is either the container itself, or\n          //  a non-tabbable node that was given focus (i.e. tabindex is negative\n          //  and user clicked on it or node was programmatically given focus)\n          //  and is not followed by any other tabbable node, in which\n          //  case, we should handle shift+tab as if focus were on the container's\n          //  first tabbable node, and go to the last tabbable node of the LAST group\n          startOfGroupIndex = containerIndex;\n        }\n\n        if (startOfGroupIndex >= 0) {\n          // YES: then shift+tab should go to the last tabbable node in the\n          //  previous group (and wrap around to the last tabbable node of\n          //  the LAST group if it's the first tabbable node of the FIRST group)\n          const destinationGroupIndex =\n            startOfGroupIndex === 0\n              ? state.tabbableGroups.length - 1\n              : startOfGroupIndex - 1;\n\n          const destinationGroup = state.tabbableGroups[destinationGroupIndex];\n          destinationNode = destinationGroup.lastTabbableNode;\n        }\n      } else {\n        // FORWARD\n\n        // is the target the last tabbable node in a group?\n        let lastOfGroupIndex = findIndex(\n          state.tabbableGroups,\n          ({ lastTabbableNode }) => target === lastTabbableNode\n        );\n\n        if (\n          lastOfGroupIndex < 0 &&\n          (containerGroup.container === target ||\n            (isFocusable(target, config.tabbableOptions) &&\n              !isTabbable(target, config.tabbableOptions) &&\n              !containerGroup.nextTabbableNode(target)))\n        ) {\n          // an exception case where the target is the container itself, or\n          //  a non-tabbable node that was given focus (i.e. tabindex is negative\n          //  and user clicked on it or node was programmatically given focus)\n          //  and is not followed by any other tabbable node, in which\n          //  case, we should handle tab as if focus were on the container's\n          //  last tabbable node, and go to the first tabbable node of the FIRST group\n          lastOfGroupIndex = containerIndex;\n        }\n\n        if (lastOfGroupIndex >= 0) {\n          // YES: then tab should go to the first tabbable node in the next\n          //  group (and wrap around to the first tabbable node of the FIRST\n          //  group if it's the last tabbable node of the LAST group)\n          const destinationGroupIndex =\n            lastOfGroupIndex === state.tabbableGroups.length - 1\n              ? 0\n              : lastOfGroupIndex + 1;\n\n          const destinationGroup = state.tabbableGroups[destinationGroupIndex];\n          destinationNode = destinationGroup.firstTabbableNode;\n        }\n      }\n    } else {\n      // NOTE: the fallbackFocus option does not support returning false to opt-out\n      destinationNode = getNodeForOption('fallbackFocus');\n    }\n\n    if (destinationNode) {\n      e.preventDefault();\n      tryFocus(destinationNode);\n    }\n    // else, let the browser take care of [shift+]tab and move the focus\n  };\n\n  const checkKey = function (e) {\n    if (\n      isEscapeEvent(e) &&\n      valueOrHandler(config.escapeDeactivates, e) !== false\n    ) {\n      e.preventDefault();\n      trap.deactivate();\n      return;\n    }\n\n    if (isTabEvent(e)) {\n      checkTab(e);\n      return;\n    }\n  };\n\n  const checkClick = function (e) {\n    const target = getActualTarget(e);\n\n    if (findContainerIndex(target) >= 0) {\n      return;\n    }\n\n    if (valueOrHandler(config.clickOutsideDeactivates, e)) {\n      return;\n    }\n\n    if (valueOrHandler(config.allowOutsideClick, e)) {\n      return;\n    }\n\n    e.preventDefault();\n    e.stopImmediatePropagation();\n  };\n\n  //\n  // EVENT LISTENERS\n  //\n\n  const addListeners = function () {\n    if (!state.active) {\n      return;\n    }\n\n    // There can be only one listening focus trap at a time\n    activeFocusTraps.activateTrap(trap);\n\n    // Delay ensures that the focused element doesn't capture the event\n    // that caused the focus trap activation.\n    state.delayInitialFocusTimer = config.delayInitialFocus\n      ? delay(function () {\n          tryFocus(getInitialFocusNode());\n        })\n      : tryFocus(getInitialFocusNode());\n\n    doc.addEventListener('focusin', checkFocusIn, true);\n    doc.addEventListener('mousedown', checkPointerDown, {\n      capture: true,\n      passive: false,\n    });\n    doc.addEventListener('touchstart', checkPointerDown, {\n      capture: true,\n      passive: false,\n    });\n    doc.addEventListener('click', checkClick, {\n      capture: true,\n      passive: false,\n    });\n    doc.addEventListener('keydown', checkKey, {\n      capture: true,\n      passive: false,\n    });\n\n    return trap;\n  };\n\n  const removeListeners = function () {\n    if (!state.active) {\n      return;\n    }\n\n    doc.removeEventListener('focusin', checkFocusIn, true);\n    doc.removeEventListener('mousedown', checkPointerDown, true);\n    doc.removeEventListener('touchstart', checkPointerDown, true);\n    doc.removeEventListener('click', checkClick, true);\n    doc.removeEventListener('keydown', checkKey, true);\n\n    return trap;\n  };\n\n  //\n  // TRAP DEFINITION\n  //\n\n  trap = {\n    get active() {\n      return state.active;\n    },\n\n    get paused() {\n      return state.paused;\n    },\n\n    activate(activateOptions) {\n      if (state.active) {\n        return this;\n      }\n\n      const onActivate = getOption(activateOptions, 'onActivate');\n      const onPostActivate = getOption(activateOptions, 'onPostActivate');\n      const checkCanFocusTrap = getOption(activateOptions, 'checkCanFocusTrap');\n\n      if (!checkCanFocusTrap) {\n        updateTabbableNodes();\n      }\n\n      state.active = true;\n      state.paused = false;\n      state.nodeFocusedBeforeActivation = doc.activeElement;\n\n      if (onActivate) {\n        onActivate();\n      }\n\n      const finishActivation = () => {\n        if (checkCanFocusTrap) {\n          updateTabbableNodes();\n        }\n        addListeners();\n        if (onPostActivate) {\n          onPostActivate();\n        }\n      };\n\n      if (checkCanFocusTrap) {\n        checkCanFocusTrap(state.containers.concat()).then(\n          finishActivation,\n          finishActivation\n        );\n        return this;\n      }\n\n      finishActivation();\n      return this;\n    },\n\n    deactivate(deactivateOptions) {\n      if (!state.active) {\n        return this;\n      }\n\n      const options = {\n        onDeactivate: config.onDeactivate,\n        onPostDeactivate: config.onPostDeactivate,\n        checkCanReturnFocus: config.checkCanReturnFocus,\n        ...deactivateOptions,\n      };\n\n      clearTimeout(state.delayInitialFocusTimer); // noop if undefined\n      state.delayInitialFocusTimer = undefined;\n\n      removeListeners();\n      state.active = false;\n      state.paused = false;\n\n      activeFocusTraps.deactivateTrap(trap);\n\n      const onDeactivate = getOption(options, 'onDeactivate');\n      const onPostDeactivate = getOption(options, 'onPostDeactivate');\n      const checkCanReturnFocus = getOption(options, 'checkCanReturnFocus');\n      const returnFocus = getOption(\n        options,\n        'returnFocus',\n        'returnFocusOnDeactivate'\n      );\n\n      if (onDeactivate) {\n        onDeactivate();\n      }\n\n      const finishDeactivation = () => {\n        delay(() => {\n          if (returnFocus) {\n            tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));\n          }\n          if (onPostDeactivate) {\n            onPostDeactivate();\n          }\n        });\n      };\n\n      if (returnFocus && checkCanReturnFocus) {\n        checkCanReturnFocus(\n          getReturnFocusNode(state.nodeFocusedBeforeActivation)\n        ).then(finishDeactivation, finishDeactivation);\n        return this;\n      }\n\n      finishDeactivation();\n      return this;\n    },\n\n    pause() {\n      if (state.paused || !state.active) {\n        return this;\n      }\n\n      state.paused = true;\n      removeListeners();\n\n      return this;\n    },\n\n    unpause() {\n      if (!state.paused || !state.active) {\n        return this;\n      }\n\n      state.paused = false;\n      updateTabbableNodes();\n      addListeners();\n\n      return this;\n    },\n\n    updateContainerElements(containerElements) {\n      const elementsAsArray = [].concat(containerElements).filter(Boolean);\n\n      state.containers = elementsAsArray.map((element) =>\n        typeof element === 'string' ? doc.querySelector(element) : element\n      );\n\n      if (state.active) {\n        updateTabbableNodes();\n      }\n\n      return this;\n    },\n  };\n\n  // initialize container elements\n  trap.updateContainerElements(elements);\n\n  return trap;\n};\n\nexport { createFocusTrap };\n","import { capabilities, setModifierManager } from '@ember/modifier';\nimport { createFocusTrap } from 'focus-trap';\n\nlet cap;\ntry {\n  cap = capabilities('3.22');\n} catch {\n  cap = capabilities('3.13');\n}\nvar focusTrap = setModifierManager(() => {\n  return {\n    capabilities: cap,\n    createModifier() {\n      return {\n        focusTrapOptions: undefined,\n        isActive: true,\n        isPaused: false,\n        shouldSelfFocus: false,\n        focusTrap: undefined\n      };\n    },\n    installModifier(state, element, {\n      named: {\n        isActive,\n        isPaused,\n        shouldSelfFocus,\n        focusTrapOptions,\n        additionalElements,\n        _createFocusTrap\n      }\n    }) {\n      // treat the original focusTrapOptions as immutable, so do a shallow copy here\n      state.focusTrapOptions = {\n        ...focusTrapOptions\n      } || {};\n      if (typeof isActive !== 'undefined') {\n        state.isActive = isActive;\n      }\n      if (typeof isPaused !== 'undefined') {\n        state.isPaused = isPaused;\n      }\n      if (state.focusTrapOptions && typeof state.focusTrapOptions.initialFocus === 'undefined' && shouldSelfFocus) {\n        state.focusTrapOptions.initialFocus = element;\n      }\n\n      // Private to allow mocking FocusTrap in tests\n      let createFocusTrap$1 = createFocusTrap;\n      if (_createFocusTrap) {\n        createFocusTrap$1 = _createFocusTrap;\n      }\n      if (state.focusTrapOptions.returnFocusOnDeactivate !== false) {\n        state.focusTrapOptions.returnFocusOnDeactivate = true;\n      }\n      state.focusTrap = createFocusTrap$1(typeof additionalElements !== 'undefined' ? [element, ...additionalElements] : element, state.focusTrapOptions);\n      if (state.isActive) {\n        state.focusTrap.activate();\n      }\n      if (state.isPaused) {\n        state.focusTrap.pause();\n      }\n    },\n    updateModifier(state, {\n      named: params\n    }) {\n      const focusTrapOptions = params.focusTrapOptions || {};\n      if (state.isActive && !params.isActive) {\n        const {\n          returnFocusOnDeactivate\n        } = focusTrapOptions;\n        const returnFocus = typeof returnFocusOnDeactivate === 'undefined' ? true : false;\n        state.focusTrap.deactivate({\n          returnFocus\n        });\n      } else if (!state.isActive && params.isActive) {\n        state.focusTrap.activate();\n      }\n      if (state.isPaused && !params.isPaused) {\n        state.focusTrap.unpause();\n      } else if (!state.isPaused && params.isPaused) {\n        state.focusTrap.pause();\n      }\n\n      // Update state\n      state.focusTrapOptions = focusTrapOptions;\n      if (typeof params.isActive !== 'undefined') {\n        state.isActive = params.isActive;\n      }\n      if (typeof params.isPaused !== 'undefined') {\n        state.isPaused = params.isPaused;\n      }\n    },\n    destroyModifier({\n      focusTrap\n    }) {\n      focusTrap.deactivate();\n    }\n  };\n}, class FocusTrapModifier {});\n\nexport { focusTrap as default };\n","function _toPrimitive(t, r) {\n  if (\"object\" != typeof t || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || \"default\");\n    if (\"object\" != typeof i) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n  var i = _toPrimitive(t, \"string\");\n  return \"symbol\" == typeof i ? i : String(i);\n}\nfunction _defineProperty(obj, key, value) {\n  key = _toPropertyKey(key);\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}\nfunction _initializerDefineProperty(target, property, descriptor, context) {\n  if (!descriptor) return;\n  Object.defineProperty(target, property, {\n    enumerable: descriptor.enumerable,\n    configurable: descriptor.configurable,\n    writable: descriptor.writable,\n    value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n  });\n}\nfunction _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n  var desc = {};\n  Object.keys(descriptor).forEach(function (key) {\n    desc[key] = descriptor[key];\n  });\n  desc.enumerable = !!desc.enumerable;\n  desc.configurable = !!desc.configurable;\n  if ('value' in desc || desc.initializer) {\n    desc.writable = true;\n  }\n  desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n    return decorator(target, property, desc) || desc;\n  }, desc);\n  if (context && desc.initializer !== void 0) {\n    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n    desc.initializer = undefined;\n  }\n  if (desc.initializer === void 0) {\n    Object.defineProperty(target, property, desc);\n    desc = null;\n  }\n  return desc;\n}\n\nexport { _defineProperty as _, _applyDecoratedDescriptor as a, _initializerDefineProperty as b };\n","var validModifiers = ['alt', 'ctrl', 'meta', 'shift', 'cmd'];\n\nexport { validModifiers as default };\n","import { helper } from '@ember/component/helper';\nimport { assert } from '@ember/debug';\nimport isKey from '../utils/is-key.js';\nimport listenerName from '../utils/listener-name.js';\nimport '../utils/keyboard-listener.js';\nimport '../_rollupPluginBabelHelpers-2fc49ad3.js';\nimport '../utils/platform.js';\nimport '../fixtures/key-maps.js';\nimport '../fixtures/modifiers-array.js';\nimport '../utils/get-mouse-name.js';\nimport '@ember/utils';\nimport '../utils/get-cmd-key.js';\n\nvar ifKey = helper(function ifKey([keyCombo, callback] /*, named*/) {\n  return function (event) {\n    assert('ember-keyboard: You must pass a function as the second argument to the `if-key` helper', typeof callback === 'function');\n    assert('ember-keyboard: The `if-key` helper expects to be invoked with a KeyboardEvent', event instanceof KeyboardEvent);\n    if (isKey(listenerName(event.type, keyCombo), event)) {\n      callback(event);\n    }\n  };\n});\n\nexport { ifKey as default };\n","import { a as _applyDecoratedDescriptor, b as _initializerDefineProperty, _ as _defineProperty } from '../_rollupPluginBabelHelpers-2fc49ad3.js';\nimport Helper from '@ember/component/helper';\nimport { assert } from '@ember/debug';\nimport * as emberService from '@ember/service';\nimport listenerName from '../utils/listener-name.js';\nimport '../utils/get-cmd-key.js';\n\nvar _class2, _descriptor;\nconst service = emberService.service ?? emberService.inject;\nlet _class = (_class2 = class _class2 extends Helper {\n  constructor(...args) {\n    super(...args);\n    _initializerDefineProperty(this, \"keyboard\", _descriptor, this);\n    _defineProperty(this, \"keyCombo\", void 0);\n    _defineProperty(this, \"callback\", void 0);\n    _defineProperty(this, \"keyboardActivated\", true);\n    _defineProperty(this, \"keyboardPriority\", 0);\n    _defineProperty(this, \"eventName\", 'keydown');\n    _defineProperty(this, \"keyboardHandlers\", void 0);\n  }\n  compute([keyCombo, callback], {\n    event = 'keydown',\n    activated = true,\n    priority = 0\n  }) {\n    assert('ember-keyboard: You must pass a function as the second argument to the `on-key` helper', typeof callback === 'function');\n    this.keyCombo = keyCombo;\n    this.callback = callback;\n    this.eventName = event;\n    this.keyboardActivated = activated;\n    this.keyboardPriority = priority;\n    this.keyboardHandlers = {};\n    this.keyboardHandlers[listenerName(event, keyCombo)] = callback;\n    this.keyboard.register(this);\n  }\n  willDestroy() {\n    this.keyboard.unregister(this);\n    super.willDestroy(...arguments);\n  }\n}, (_descriptor = _applyDecoratedDescriptor(_class2.prototype, \"keyboard\", [service], {\n  configurable: true,\n  enumerable: true,\n  writable: true,\n  initializer: null\n})), _class2);\n\nexport { _class as default };\n","import { isNone } from '@ember/utils';\n\nfunction getMouseName(buttonCode) {\n  if (isNone(buttonCode)) return;\n  switch (buttonCode) {\n    case 'left':\n      return 0;\n    case 'middle':\n      return 1;\n    case 'right':\n      return 2;\n  }\n}\n\nexport { getMouseName as default };\n","import { _ as _defineProperty, a as _applyDecoratedDescriptor, b as _initializerDefineProperty } from '../_rollupPluginBabelHelpers-2fc49ad3.js';\nimport * as emberService from '@ember/service';\nimport { registerDestructor } from '@ember/destroyable';\n\nconst service = emberService.service ?? emberService.inject;\nfunction findPropertyDescriptor(obj, name) {\n  let descriptor;\n  do {\n    (descriptor = Object.getOwnPropertyDescriptor(obj, name)) || (obj = Object.getPrototypeOf(obj));\n  } while (!descriptor && obj);\n  return descriptor;\n}\nfunction populateKeyboardHandlers(responder) {\n  responder.keyboardHandlers = responder.keyboardHandlers || {};\n  if (!responder.keyboardHandlerNames) {\n    responder.keyboardHandlerNames = {};\n    for (let propertyName in responder) {\n      const descriptor = findPropertyDescriptor(responder, propertyName);\n      // If it has a getter it's not going to be a function. We also don't want to force getters to\n      // evaluate as they may be expensive. This has been observed specifically with classic classes\n      // and computed properties.\n      if (!descriptor?.get) {\n        let propertyValue = responder[propertyName];\n        if (typeof propertyValue === 'function' && propertyValue._emberKeyboardOnKeyDecoratorData) {\n          for (let listenerName of propertyValue._emberKeyboardOnKeyDecoratorData.listenerNames || []) {\n            responder.keyboardHandlerNames[listenerName] = propertyName;\n          }\n        }\n      }\n    }\n  }\n  for (let [listenerName, methodName] of Object.entries(responder.keyboardHandlerNames || {})) {\n    responder.keyboardHandlers[listenerName] = responder[methodName].bind(responder);\n  }\n}\nfunction keyResponder(opts = {}) {\n  const createClass = function (DecoratedClass) {\n    var _class, _descriptor, _ClassAsKeyResponder;\n    if (opts.priority === undefined) {\n      opts.priority = 0;\n    }\n    if (opts.activated === undefined) {\n      opts.activated = true;\n    }\n    return _class = (_ClassAsKeyResponder = class ClassAsKeyResponder extends DecoratedClass {\n      get keyboardPriority() {\n        if (super.keyboardPriority === undefined) {\n          return opts.priority;\n        }\n        return super.keyboardPriority;\n      }\n      set keyboardPriority(val) {\n        super.keyboardPriority = val;\n      }\n      get keyboardActivated() {\n        if (super.keyboardActivated === undefined) {\n          return opts.activated;\n        }\n        return super.keyboardActivated;\n      }\n      set keyboardActivated(val) {\n        super.keyboardActivated = val;\n      }\n      constructor() {\n        super(...arguments);\n        _initializerDefineProperty(this, \"keyboard\", _descriptor, this);\n        populateKeyboardHandlers(this);\n        this.keyboard.register(this);\n        registerDestructor(this, () => {\n          this.keyboard.unregister(this);\n        });\n      }\n    }, _defineProperty(_ClassAsKeyResponder, \"name\", `${DecoratedClass.name}WithKeyResponder`), _ClassAsKeyResponder), (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"keyboard\", [service], {\n      configurable: true,\n      enumerable: true,\n      writable: true,\n      initializer: null\n    })), _class;\n  };\n  if (typeof opts === 'function') {\n    return createClass(opts);\n  } else {\n    return function (DecoratedClass) {\n      return createClass(DecoratedClass);\n    };\n  }\n}\n\nexport { keyResponder as default };\n","import listenerName from '../utils/listener-name.js';\nimport '../utils/get-cmd-key.js';\n\nconst DEFAULT_EVENT_NAME = 'keydown';\nfunction onKey(keyCombo, opts = {}) {\n  if (typeof arguments[1] === 'function') {\n    return onKeyClassic(keyCombo, {\n      event: DEFAULT_EVENT_NAME\n    }, arguments[1]);\n  }\n  if (!opts.event) {\n    opts.event = DEFAULT_EVENT_NAME;\n  }\n  if (typeof arguments[2] === 'function') {\n    return onKeyClassic(keyCombo, opts, arguments[2]);\n  } else {\n    return onKeyDecorator(keyCombo, opts);\n  }\n}\nfunction onKeyDecorator(keyCombo, opts) {\n  // ES6 class\n  return function (target, property, descriptor) {\n    if (!Object.prototype.hasOwnProperty.call(target, 'keyboardHandlerNames')) {\n      let parentKeyboardHandlerNames = target.parentKeyboardHandlerNames;\n      // we need to assign because of the way mixins copy actions down when inheriting\n      target.keyboardHandlerNames = parentKeyboardHandlerNames ? Object.assign({}, parentKeyboardHandlerNames) : {};\n    }\n    target.keyboardHandlerNames[listenerName(opts.event, keyCombo)] = property;\n    return descriptor;\n  };\n}\nfunction onKeyClassic(keyCombo, opts, handler) {\n  if (!handler._emberKeyboardOnKeyDecoratorData) {\n    handler._emberKeyboardOnKeyDecoratorData = {\n      listenerNames: []\n    };\n  }\n  handler._emberKeyboardOnKeyDecoratorData.listenerNames.push(listenerName(opts.event, keyCombo));\n  return handler;\n}\n\nexport { onKey as default };\n","import listenerName from '../utils/listener-name.js';\nimport validMouseButtons from '../fixtures/mouse-buttons-array.js';\nimport validModifiers from '../fixtures/modifiers-array.js';\nimport '../utils/get-cmd-key.js';\n\nconst validKeys = validMouseButtons.concat(validModifiers);\nconst validateKeys = function validateKeys(keys) {\n  keys.forEach(key => {\n    if (validKeys.indexOf(key) === -1) {\n      /* eslint no-console: [\"error\", { allow: [\"error\"] }] */\n      console.error(`\\`${key}\\` is not a valid key name`);\n    }\n  });\n};\nconst formattedListener = function formattedListener(type, keysString) {\n  const keys = keysString !== undefined ? keysString.split('+') : [];\n  validateKeys(keys);\n  return listenerName(type, keys);\n};\nfunction click(keys) {\n  return formattedListener('click', keys);\n}\nfunction mouseDown(keys) {\n  return formattedListener('mousedown', keys);\n}\nfunction mouseUp(keys) {\n  return formattedListener('mouseup', keys);\n}\n\nexport { click, mouseDown, mouseUp };\n","var validMouseButtons = ['left', 'middle', 'right'];\n\nexport { validMouseButtons as default };\n","import listenerName from '../utils/listener-name.js';\nimport validModifiers from '../fixtures/modifiers-array.js';\nimport '../utils/get-cmd-key.js';\n\nfunction validateKeys(keysString) {\n  const keys = keysString !== undefined ? keysString.split('+') : [];\n  keys.forEach(key => {\n    if (validModifiers.indexOf(key) === -1) {\n      /* eslint no-console: [\"error\", { allow: [\"error\"] }] */\n      console.error(`\\`${key}\\` is not a valid key name`);\n    }\n  });\n}\nconst formattedListener = function formattedListener(type, keysString) {\n  validateKeys(keysString);\n  return listenerName(type, keysString);\n};\nfunction touchEnd(keys) {\n  return formattedListener('touchEnd', keys);\n}\nfunction touchStart(keys) {\n  return formattedListener('touchstart', keys);\n}\n\nexport { touchEnd, touchStart };\n","import KeyboardListener from './keyboard-listener.js';\nimport '../_rollupPluginBabelHelpers-2fc49ad3.js';\nimport './platform.js';\nimport '@ember/debug';\n\nconst triggerKeyEvent = function triggerKeyEvent(eventType, keyCombo, element) {\n  let keyboardListener = KeyboardListener.parse(`${eventType}:${keyCombo}`);\n  const event = keyboardListener.createMatchingKeyboardEvent();\n  element.dispatchEvent(event);\n};\nconst triggerKeyDown = function triggerKeyDown(keyCombo, element = document) {\n  triggerKeyEvent('keydown', keyCombo, element);\n};\nconst triggerKeyPress = function triggerKeyPress(keyCombo, element = document) {\n  triggerKeyEvent('keypress', keyCombo, element);\n};\nconst triggerKeyUp = function triggerKeyUp(keyCombo, element = document) {\n  triggerKeyEvent('keyup', keyCombo, element);\n};\n\nexport { triggerKeyDown, triggerKeyPress, triggerKeyUp };\n","export { default as getMouseCode } from './utils/get-mouse-code.js';\nexport { default as keyResponder } from './decorators/key-responder.js';\nexport { default as onKey } from './decorators/on-key.js';\nexport { keyDown, keyPress, keyUp } from './listeners/key-events.js';\nexport { click, mouseDown, mouseUp } from './listeners/mouse-events.js';\nexport { touchEnd, touchStart } from './listeners/touch-events.js';\nexport { triggerKeyDown, triggerKeyPress, triggerKeyUp } from './utils/trigger-event.js';\nimport '@ember/utils';\nimport './_rollupPluginBabelHelpers-2fc49ad3.js';\nimport '@ember/service';\nimport '@ember/destroyable';\nimport './utils/listener-name.js';\nimport './utils/get-cmd-key.js';\nimport './fixtures/mouse-buttons-array.js';\nimport './fixtures/modifiers-array.js';\nimport './utils/keyboard-listener.js';\nimport './utils/platform.js';\nimport '@ember/debug';\n\nfunction getCode() {\n  throw new Error('ember-keyboard: `getCode` has been removed. There is no longer a need for this function as you can directly specify `key` and/or `code` values');\n}\nfunction getKeyCode() {\n  throw new Error('ember-keyboard: `getKeyCode` has been removed. There is no longer a need for this function as you can directly specify `key` and/or `code` values');\n}\n\nexport { getCode, getKeyCode };\n","import listenerName from '../utils/listener-name.js';\nimport '../utils/get-cmd-key.js';\n\nfunction keyDown(keyCombo) {\n  return listenerName('keydown', keyCombo);\n}\nfunction keyPress(keyCombo) {\n  return listenerName('keypress', keyCombo);\n}\nfunction keyUp(keyCombo) {\n  return listenerName('keyup', keyCombo);\n}\n\nexport { keyDown, keyPress, keyUp };\n","import { a as _applyDecoratedDescriptor, b as _initializerDefineProperty, _ as _defineProperty } from '../_rollupPluginBabelHelpers-2fc49ad3.js';\nimport Modifier from 'ember-modifier';\nimport * as emberService from '@ember/service';\nimport { action } from '@ember/object';\nimport { registerDestructor } from '@ember/destroyable';\nimport { macroCondition, dependencySatisfies } from '@embroider/macros';\nimport listenerName from '../utils/listener-name.js';\nimport isKey from '../utils/is-key.js';\nimport '../utils/get-cmd-key.js';\nimport '../utils/keyboard-listener.js';\nimport '../utils/platform.js';\nimport '@ember/debug';\nimport '../fixtures/key-maps.js';\nimport '../fixtures/modifiers-array.js';\nimport '../utils/get-mouse-name.js';\nimport '@ember/utils';\n\nconst service = emberService.service ?? emberService.inject;\nconst ONLY_WHEN_FOCUSED_TAG_NAMES = ['input', 'select', 'textarea'];\nlet modifier;\nif (macroCondition(dependencySatisfies('ember-modifier', '>=3.2.0 || 4.x'))) {\n  var _class, _descriptor;\n  /**\n   * This is an element modifier to trigger some behavior when\n   * specified key combo is pressed. When used with a form element\n   * (input, textarea, or select), the action fires only when element\n   * has focus. When used with another element type, it will trigger the\n   * passed action, OR if no action is passed, it will trigger a `click`\n   * on the element. This allows for easy declaration of keyboard shortcuts\n   * for anything clickable: In the following example, we trigger a\n   * click on the button when the B key is pressed:\n   *\n   * <button\n   *    type=\"button\"\n   *    {{on-key 'b'}}>\n   *   Click me, or press \"B\"\n   * </button>\n   */\n  modifier = (_class = class OnKeyModifier extends Modifier {\n    constructor(owner, args) {\n      super(owner, args);\n      _initializerDefineProperty(this, \"keyboard\", _descriptor, this);\n      _defineProperty(this, \"element\", void 0);\n      _defineProperty(this, \"keyboardPriority\", 0);\n      _defineProperty(this, \"activatedParamValue\", true);\n      _defineProperty(this, \"eventName\", 'keydown');\n      _defineProperty(this, \"onlyWhenFocused\", true);\n      _defineProperty(this, \"listenerName\", void 0);\n      _defineProperty(this, \"removeEventListeners\", () => {\n        if (this.onlyWhenFocused) {\n          this.element.removeEventListener('click', this.onFocus, true);\n          this.element.removeEventListener('focus', this.onFocus, true);\n          this.element.removeEventListener('focusout', this.onFocusOut, true);\n        }\n      });\n      this.keyboard.register(this);\n      registerDestructor(this, () => {\n        this.removeEventListeners();\n        this.keyboard.unregister(this);\n      });\n    }\n    modify(element, positional, named) {\n      this.element = element;\n      this.removeEventListeners();\n      this.setupProperties(positional, named);\n      if (this.onlyWhenFocused) {\n        this.addEventListeners();\n      }\n    }\n    setupProperties(positional, named) {\n      let [keyCombo, callback] = positional;\n      let {\n        activated,\n        event,\n        priority,\n        onlyWhenFocused\n      } = named;\n      this.keyCombo = keyCombo;\n      this.callback = callback;\n      this.eventName = event || 'keydown';\n      this.activatedParamValue = 'activated' in named ? !!activated : undefined;\n      this.keyboardPriority = priority ? parseInt(priority, 10) : 0;\n      this.listenerName = listenerName(this.eventName, this.keyCombo);\n      if (onlyWhenFocused !== undefined) {\n        this.onlyWhenFocused = onlyWhenFocused;\n      } else {\n        this.onlyWhenFocused = ONLY_WHEN_FOCUSED_TAG_NAMES.includes(this.element.tagName.toLowerCase());\n      }\n    }\n    addEventListeners() {\n      this.element.addEventListener('click', this.onFocus, true);\n      this.element.addEventListener('focus', this.onFocus, true);\n      this.element.addEventListener('focusout', this.onFocusOut, true);\n    }\n    onFocus() {\n      this.isFocused = true;\n    }\n    onFocusOut() {\n      this.isFocused = false;\n    }\n    get keyboardActivated() {\n      if (this.activatedParamValue === false) {\n        return false;\n      }\n      if (this.onlyWhenFocused) {\n        return this.isFocused;\n      }\n      return true;\n    }\n    get keyboardFirstResponder() {\n      if (this.onlyWhenFocused) {\n        return this.isFocused;\n      }\n      return false;\n    }\n    canHandleKeyboardEvent(event) {\n      return isKey(this.listenerName, event);\n    }\n    handleKeyboardEvent(event, ekEvent) {\n      if (isKey(this.listenerName, event)) {\n        if (this.callback) {\n          this.callback(event, ekEvent);\n        } else {\n          this.element.click();\n        }\n      }\n    }\n  }, (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"keyboard\", [service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class.prototype, \"onFocus\", [action], Object.getOwnPropertyDescriptor(_class.prototype, \"onFocus\"), _class.prototype), _applyDecoratedDescriptor(_class.prototype, \"onFocusOut\", [action], Object.getOwnPropertyDescriptor(_class.prototype, \"onFocusOut\"), _class.prototype)), _class);\n} else {\n  var _class2, _descriptor2;\n  modifier = (_class2 = class OnKeyModifier extends Modifier {\n    constructor(...args) {\n      super(...args);\n      _initializerDefineProperty(this, \"keyboard\", _descriptor2, this);\n      _defineProperty(this, \"keyboardPriority\", 0);\n      _defineProperty(this, \"activatedParamValue\", true);\n      _defineProperty(this, \"eventName\", 'keydown');\n      _defineProperty(this, \"onlyWhenFocused\", true);\n      _defineProperty(this, \"listenerName\", void 0);\n    }\n    didReceiveArguments() {\n      let [keyCombo, callback] = this.args.positional;\n      let {\n        activated,\n        event,\n        priority\n      } = this.args.named;\n      this.keyCombo = keyCombo;\n      this.callback = callback;\n      this.eventName = event || 'keydown';\n      this.activatedParamValue = Object.keys(this.args.named).includes('activated') ? !!activated : undefined;\n      this.keyboardPriority = priority ? parseInt(priority, 10) : 0;\n      this.listenerName = listenerName(this.eventName, this.keyCombo);\n      if (this.args.named.onlyWhenFocused !== undefined) {\n        this.onlyWhenFocused = this.args.named.onlyWhenFocused;\n      } else {\n        this.onlyWhenFocused = ONLY_WHEN_FOCUSED_TAG_NAMES.includes(this.element.tagName.toLowerCase());\n      }\n    }\n    didInstall() {\n      this.keyboard.register(this);\n      if (this.onlyWhenFocused) {\n        this.element.addEventListener('click', this.onFocus, true);\n        this.element.addEventListener('focus', this.onFocus, true);\n        this.element.addEventListener('focusout', this.onFocusOut, true);\n      }\n    }\n    willRemove() {\n      if (this.onlyWhenFocused) {\n        this.element.removeEventListener('click', this.onFocus, true);\n        this.element.removeEventListener('focus', this.onFocus, true);\n        this.element.removeEventListener('focusout', this.onFocusOut, true);\n      }\n      this.keyboard.unregister(this);\n    }\n    onFocus() {\n      this.isFocused = true;\n    }\n    onFocusOut() {\n      this.isFocused = false;\n    }\n    get keyboardActivated() {\n      if (this.activatedParamValue === false) {\n        return false;\n      }\n      if (this.onlyWhenFocused) {\n        return this.isFocused;\n      }\n      return true;\n    }\n    get keyboardFirstResponder() {\n      if (this.onlyWhenFocused) {\n        return this.isFocused;\n      }\n      return false;\n    }\n    canHandleKeyboardEvent(event) {\n      return isKey(this.listenerName, event);\n    }\n    handleKeyboardEvent(event, ekEvent) {\n      if (isKey(this.listenerName, event)) {\n        if (this.callback) {\n          this.callback(event, ekEvent);\n        } else {\n          this.element.click();\n        }\n      }\n    }\n  }, (_descriptor2 = _applyDecoratedDescriptor(_class2.prototype, \"keyboard\", [service], {\n    configurable: true,\n    enumerable: true,\n    writable: true,\n    initializer: null\n  }), _applyDecoratedDescriptor(_class2.prototype, \"onFocus\", [action], Object.getOwnPropertyDescriptor(_class2.prototype, \"onFocus\"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, \"onFocusOut\", [action], Object.getOwnPropertyDescriptor(_class2.prototype, \"onFocusOut\"), _class2.prototype)), _class2);\n}\nvar modifier$1 = modifier;\n\nexport { modifier$1 as default };\n","import { a as _applyDecoratedDescriptor, _ as _defineProperty } from '../_rollupPluginBabelHelpers-2fc49ad3.js';\nimport emberService__default from '@ember/service';\nimport { getOwner } from '@ember/application';\nimport { action } from '@ember/object';\nimport { run } from '@ember/runloop';\nimport { keyDown, keyPress, keyUp } from '../listeners/key-events.js';\nimport { handleKeyEventWithPropagation } from '../utils/handle-key-event.js';\nimport { reverseCompareProp } from '../utils/sort.js';\nimport '../utils/listener-name.js';\nimport '../utils/get-cmd-key.js';\nimport '../utils/is-key.js';\nimport '../utils/keyboard-listener.js';\nimport '../utils/platform.js';\nimport '@ember/debug';\nimport '../fixtures/key-maps.js';\nimport '../fixtures/modifiers-array.js';\nimport '../utils/get-mouse-name.js';\nimport '@ember/utils';\n\nvar _class;\nlet KeyboardService = (_class = class KeyboardService extends emberService__default {\n  get activeResponders() {\n    let {\n      registeredResponders\n    } = this;\n    return Array.from(registeredResponders).filter(r => r.keyboardActivated);\n  }\n  get sortedResponders() {\n    return this.activeResponders.sort((a, b) => {\n      return reverseCompareProp(a, b, 'keyboardPriority');\n    });\n  }\n  get firstResponders() {\n    return this.sortedResponders.filter(r => r.keyboardFirstResponder);\n  }\n  get normalResponders() {\n    return this.sortedResponders.filter(r => !r.keyboardFirstResponder);\n  }\n  constructor(...args) {\n    super(...args);\n    _defineProperty(this, \"registeredResponders\", new Set());\n    if (typeof FastBoot !== 'undefined') {\n      return;\n    }\n    const config = getOwner(this).resolveRegistration('config:environment') || {};\n    let emberKeyboardConfig = config.emberKeyboard || {};\n    if (emberKeyboardConfig.disableOnInputFields) {\n      this._disableOnInput = true;\n    }\n    this._listeners = emberKeyboardConfig.listeners || ['keyUp', 'keyDown', 'keyPress'];\n    this._listeners = this._listeners.map(listener => listener.toLowerCase());\n    this._listeners.forEach(type => {\n      document.addEventListener(type, this._respond);\n    });\n  }\n  willDestroy(...args) {\n    super.willDestroy(...args);\n    if (typeof FastBoot !== 'undefined') {\n      return;\n    }\n    this._listeners.forEach(type => {\n      document.removeEventListener(type, this._respond);\n    });\n  }\n  _respond(event) {\n    if (this._disableOnInput && event.target) {\n      const target = event.composedPath()[0] ?? event.target;\n      const tag = target.tagName;\n      const isContentEditable = target.getAttribute && target.getAttribute('contenteditable') != null;\n      if (isContentEditable || tag === 'TEXTAREA' || tag === 'INPUT') {\n        return;\n      }\n    }\n    run(() => {\n      let {\n        firstResponders,\n        normalResponders\n      } = this;\n      handleKeyEventWithPropagation(event, {\n        firstResponders,\n        normalResponders\n      });\n    });\n  }\n  register(responder) {\n    this.registeredResponders.add(responder);\n  }\n  unregister(responder) {\n    this.registeredResponders.delete(responder);\n  }\n  keyDown(...args) {\n    return keyDown(...args);\n  }\n  keyPress(...args) {\n    return keyPress(...args);\n  }\n  keyUp(...args) {\n    return keyUp(...args);\n  }\n}, (_applyDecoratedDescriptor(_class.prototype, \"_respond\", [action], Object.getOwnPropertyDescriptor(_class.prototype, \"_respond\"), _class.prototype)), _class);\n\nexport { KeyboardService as default };\n","import isKey from './is-key.js';\nimport './keyboard-listener.js';\nimport '../_rollupPluginBabelHelpers-2fc49ad3.js';\nimport './platform.js';\nimport '@ember/debug';\nimport '../fixtures/key-maps.js';\nimport '../fixtures/modifiers-array.js';\nimport './get-mouse-name.js';\nimport '@ember/utils';\n\nfunction handleKeyEventWithPropagation(event, {\n  firstResponders,\n  normalResponders\n}) {\n  let isImmediatePropagationStopped = false;\n  let isPropagationStopped = false;\n  const ekEvent = {\n    stopImmediatePropagation() {\n      isImmediatePropagationStopped = true;\n    },\n    stopPropagation() {\n      isPropagationStopped = true;\n    }\n  };\n  for (const responder of firstResponders) {\n    triggerResponderListener(responder, event, ekEvent);\n    if (isImmediatePropagationStopped) {\n      break;\n    }\n  }\n  if (isPropagationStopped) {\n    return;\n  }\n  isImmediatePropagationStopped = false;\n  let previousPriorityLevel = Number.POSITIVE_INFINITY;\n  for (const responder of normalResponders) {\n    const currentPriorityLevel = Number(responder.keyboardPriority);\n    if (isImmediatePropagationStopped && currentPriorityLevel === previousPriorityLevel) {\n      continue;\n    }\n    if (currentPriorityLevel < previousPriorityLevel) {\n      if (isPropagationStopped) {\n        return;\n      }\n      isImmediatePropagationStopped = false;\n      previousPriorityLevel = currentPriorityLevel;\n    }\n    triggerResponderListener(responder, event, ekEvent);\n  }\n  /* eslint-enable no-unused-vars */\n}\nfunction triggerResponderListener(responder, event, ekEvent = null) {\n  if (responder.handleKeyboardEvent) {\n    if (responder.canHandleKeyboardEvent && !responder.canHandleKeyboardEvent(event)) {\n      return;\n    }\n    responder.handleKeyboardEvent(event, ekEvent);\n    return;\n  }\n  if (responder.keyboardHandlers) {\n    Object.keys(responder.keyboardHandlers).forEach(responderListenerName => {\n      if (isKey(responderListenerName, event)) {\n        if (ekEvent) {\n          responder.keyboardHandlers[responderListenerName](event, ekEvent);\n        } else {\n          responder.keyboardHandlers[responderListenerName](event);\n        }\n      }\n    });\n    return;\n  }\n  throw new Error('A responder registered with the ember-keyboard service must implement either `keyboardHandlers` (property returning a dictionary of listenerNames to handler functions), or `handleKeyboardEvent(event)`)');\n}\n\nexport { handleKeyEventWithPropagation };\n","import { get } from '@ember/object';\n\nfunction compare(a, b) {\n  let diff = a - b;\n  return (diff > 0) - (diff < 0);\n}\nfunction compareProp(a, b, propName, convertValue) {\n  return compare(convertValue ? convertValue(get(a, propName)) : get(a, propName), convertValue ? convertValue(get(b, propName)) : get(b, propName));\n}\nfunction reverseCompareProp(a, b, propName, convertValue = null) {\n  return compareProp(b, a, propName, convertValue);\n}\n\nexport { compare, compareProp, reverseCompareProp };\n","import { isNone } from '@ember/utils';\n\nfunction getMouseName(buttonCode) {\n  if (isNone(buttonCode)) return;\n  switch (buttonCode) {\n    case 0:\n      return 'left';\n    case 1:\n      return 'middle';\n    case 2:\n      return 'right';\n  }\n}\n\nexport { getMouseName as default };\n","const SHIFT_KEY_MAP = {\n  A: 'a',\n  B: 'b',\n  C: 'c',\n  D: 'd',\n  E: 'e',\n  F: 'f',\n  G: 'g',\n  H: 'h',\n  I: 'i',\n  J: 'j',\n  K: 'k',\n  L: 'l',\n  M: 'm',\n  N: 'n',\n  O: 'o',\n  P: 'p',\n  Q: 'q',\n  R: 'r',\n  S: 's',\n  T: 't',\n  U: 'u',\n  V: 'v',\n  W: 'w',\n  X: 'x',\n  Y: 'y',\n  Z: 'z',\n  '!': '1',\n  '@': '2',\n  '#': '3',\n  $: '4',\n  '%': '5',\n  '^': '6',\n  '&': '7',\n  '*': '8',\n  '(': '9',\n  ')': '0',\n  _: '-',\n  '+': '=',\n  '<': ',',\n  '>': '.',\n  '?': '/',\n  ':': ';',\n  '\"': \"'\",\n  '~': '`',\n  '{': '[',\n  '}': ']',\n  '|': '\\\\'\n};\nconst MAC_ALT_KEY_MAP = {\n  å: 'a',\n  b: 'b',\n  ç: 'c',\n  '∂': 'd',\n  // 'Dead': 'e',\n  ƒ: 'f',\n  '©': 'g',\n  '˙': 'h',\n  // 'Dead': 'i',\n  '∆': 'j',\n  '˚': 'k',\n  '¬': 'l',\n  µ: 'm',\n  // 'Dead': 'n',\n  ø: 'o',\n  π: 'p',\n  œ: 'q',\n  '®': 'r',\n  ß: 's',\n  '†': 't',\n  // 'Dead': 'u',\n  '√': 'v',\n  '∑': 'w',\n  '≈': 'x',\n  '¥': 'y',\n  Ω: 'z',\n  '¡': '1',\n  '™': '2',\n  '£': '3',\n  '¢': '4',\n  '∞': '5',\n  '§': '6',\n  '¶': '7',\n  '•': '8',\n  ª: '9',\n  º: '0',\n  '–': '-',\n  '≠': '=',\n  '≤': ',',\n  '≥': '.',\n  '÷': '/',\n  '…': ';',\n  æ: \"'\",\n  // 'Dead': '`',\n  '“': '[',\n  '‘': ']',\n  '«': '\\\\'\n};\nconst MAC_SHIFT_ALT_KEY_MAP = {\n  Å: 'a',\n  ı: 'b',\n  // 'Dead': 'c',\n  Î: 'd',\n  // 'Dead': 'e',\n  Ï: 'f',\n  '˝': 'g',\n  Ó: 'h',\n  ˆ: 'i',\n  Ô: 'j',\n  '': 'k',\n  Ò: 'l',\n  Â: 'm',\n  '˜': 'n',\n  Ø: 'o',\n  // 'Dead': 'p',\n  Œ: 'q',\n  '‰': 'r',\n  Í: 's',\n  ˇ: 't',\n  '¨': 'u',\n  '◊': 'v',\n  '„': 'w',\n  '˛': 'x',\n  Á: 'y',\n  '¸': 'z',\n  '⁄': '1',\n  '€': '2',\n  '‹': '3',\n  '›': '4',\n  ﬁ: '5',\n  ﬂ: '6',\n  '‡': '7',\n  '°': '8',\n  '·': '9',\n  '‚': '0',\n  '—': '-',\n  '±': '=',\n  '¯': ',',\n  '˘': '.',\n  '¿': '/',\n  Ú: ';',\n  Æ: \"'\",\n  '`': '`',\n  '”': '[',\n  '’': ']',\n  '»': '\\\\'\n};\n\nexport { MAC_ALT_KEY_MAP, MAC_SHIFT_ALT_KEY_MAP, SHIFT_KEY_MAP };\n","import KeyboardListener from './keyboard-listener.js';\nimport getPlatform from './platform.js';\nimport { SHIFT_KEY_MAP, MAC_ALT_KEY_MAP, MAC_SHIFT_ALT_KEY_MAP } from '../fixtures/key-maps.js';\nimport validModifiers from '../fixtures/modifiers-array.js';\nimport getMouseName from './get-mouse-name.js';\nimport '../_rollupPluginBabelHelpers-2fc49ad3.js';\nimport '@ember/debug';\nimport '@ember/utils';\n\nconst ALL_SYMBOL = '_all';\nfunction isKey(listenerOrListenerName, event, platform = getPlatform()) {\n  let listener;\n  if (listenerOrListenerName instanceof KeyboardListener) {\n    listener = listenerOrListenerName;\n  } else if (typeof listenerOrListenerName === 'string') {\n    listener = KeyboardListener.parse(listenerOrListenerName, platform);\n  } else {\n    throw new Error('Expected a `string` or `KeyCombo` as `keyComboOrKeyComboString` argument to `isKey`');\n  }\n  if (listener.type !== event.type) {\n    return false;\n  }\n  if (isAll(listener)) {\n    return true;\n  }\n  if (modifiersMatch(listener, event) && (keyOrCodeMatches(listener, event) || mouseButtonMatches(listener, event))) {\n    return true;\n  }\n  return specialCaseMatches(listener, event, platform);\n}\nfunction isAll(listener) {\n  return listener.keyOrCode === ALL_SYMBOL && listener.altKey === false && listener.ctrlKey === false && listener.metaKey === false && listener.shiftKey === false;\n}\nfunction modifiersMatch(listener, keyboardEvent) {\n  return listener.type === keyboardEvent.type && listener.altKey === keyboardEvent.altKey && listener.ctrlKey === keyboardEvent.ctrlKey && listener.metaKey === keyboardEvent.metaKey && listener.shiftKey === keyboardEvent.shiftKey;\n}\nfunction keyOrCodeMatches(listener, keyboardEvent) {\n  if (!(keyboardEvent instanceof KeyboardEvent)) {\n    return false;\n  }\n  if (listener.keyOrCode === ALL_SYMBOL) {\n    return true;\n  }\n  return listener.keyOrCode === keyboardEvent.code || listener.keyOrCode === keyboardEvent.key;\n}\nfunction mouseButtonMatches(listener, mouseEvent) {\n  if (!(mouseEvent instanceof MouseEvent)) {\n    return false;\n  }\n  if (listener.keyOrCode === ALL_SYMBOL) {\n    return true;\n  }\n  return listener.keyOrCode === getMouseName(mouseEvent.button);\n}\nfunction specialCaseMatches(keyboardListener, keyboardEvent, platform) {\n  if (onlyModifiers([], keyboardListener) && onlyModifiers(['shift'], keyboardEvent)) {\n    return keyboardEvent.key === keyboardListener.keyOrCode;\n  }\n  if (onlyModifiers(['shift'], keyboardListener) && onlyModifiers(['shift'], keyboardEvent)) {\n    return rootKeyForShiftKey(keyboardEvent.key) === keyboardListener.keyOrCode;\n  }\n  if (platform === 'Macintosh' && onlyModifiers(['alt'], keyboardListener) && onlyModifiers(['alt'], keyboardEvent)) {\n    return rootKeyForMacAltKey(keyboardEvent.key) === keyboardListener.keyOrCode;\n  }\n  if (platform === 'Macintosh' && onlyModifiers(['shift', 'alt'], keyboardListener) && onlyModifiers(['shift', 'alt'], keyboardEvent)) {\n    return rootKeyForMacShiftAltKey(keyboardEvent.key) === keyboardListener.keyOrCode;\n  }\n  return false;\n}\nconst ALL_MODIFIERS_EXCEPT_CMD = validModifiers.filter(m => m != 'cmd');\nfunction onlyModifiers(names, obj) {\n  for (let modifier of ALL_MODIFIERS_EXCEPT_CMD) {\n    if (names.includes(modifier) && !obj[`${modifier}Key`]) {\n      return false;\n    }\n    if (!names.includes(modifier) && obj[`${modifier}Key`]) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction rootKeyForShiftKey(key) {\n  return SHIFT_KEY_MAP[key] || key;\n}\nfunction rootKeyForMacAltKey(key) {\n  return MAC_ALT_KEY_MAP[key] || key;\n}\nfunction rootKeyForMacShiftAltKey(key) {\n  return MAC_SHIFT_ALT_KEY_MAP[key] || key;\n}\n\nexport { isKey as default };\n","import { _ as _defineProperty } from '../_rollupPluginBabelHelpers-2fc49ad3.js';\nimport getPlatform from './platform.js';\nimport '@ember/debug';\n\nconst ALT_REGEX = /^alt$/i;\nconst SHIFT_REGEX = /^shift$/i;\nconst CTRL_REGEX = /^ctrl$/i;\nconst META_REGEX = /^meta$/i;\nconst CMD_REGEX = /^cmd$/i;\nclass KeyboardListener {\n  constructor(platform = getPlatform()) {\n    _defineProperty(this, \"type\", void 0);\n    // keydown, keyup, keypress\n    _defineProperty(this, \"altKey\", false);\n    _defineProperty(this, \"ctrlKey\", false);\n    _defineProperty(this, \"shiftKey\", false);\n    _defineProperty(this, \"metaKey\", false);\n    _defineProperty(this, \"keyOrCode\", void 0);\n    _defineProperty(this, \"platform\", void 0);\n    this.platform = platform;\n  }\n  static parse(s, platform = getPlatform()) {\n    let keyboardListener = new KeyboardListener(platform);\n    let [eventType, ...keyCombo] = s.split(':');\n    keyCombo = keyCombo.join(':'); // allow keyCombo contain semicolon\n    keyboardListener.type = eventType;\n    let maybePlus = false;\n    keyCombo.split('+').reduce((result, part) => {\n      if (part === '') {\n        if (maybePlus) {\n          result.push('+');\n        }\n        maybePlus = !maybePlus;\n      } else {\n        result.push(part);\n      }\n      return result;\n    }, []).forEach(part => {\n      if (ALT_REGEX.test(part)) {\n        keyboardListener.altKey = true;\n      } else if (CTRL_REGEX.test(part)) {\n        keyboardListener.ctrlKey = true;\n      } else if (META_REGEX.test(part)) {\n        keyboardListener.metaKey = true;\n      } else if (SHIFT_REGEX.test(part)) {\n        keyboardListener.shiftKey = true;\n      } else if (CMD_REGEX.test(part)) {\n        if (platform.indexOf('Mac') > -1) {\n          keyboardListener.metaKey = true;\n        } else {\n          keyboardListener.ctrlKey = true;\n        }\n      } else {\n        keyboardListener.keyOrCode = part;\n      }\n    });\n    return keyboardListener;\n  }\n  createMatchingKeyboardEvent(opts = {}) {\n    return new KeyboardEvent(this.type, Object.assign({\n      // one of these next two will be incorrect. For test usage, if usually\n      // doesn't matter, but you can pass in correct values via opts if needed.\n      key: this.keyOrCode,\n      code: this.keyOrCode,\n      altKey: this.altKey,\n      ctrlKey: this.ctrlKey,\n      metaKey: this.metaKey,\n      shiftKey: this.shiftKey\n    }, opts));\n  }\n}\n\nexport { KeyboardListener as default };\n","import getCmdKey from './get-cmd-key.js';\n\nfunction sortedKeys(keyArray) {\n  return keyArray.sort().join('+');\n}\nfunction listenerName(type, keyArrayOrString = []) {\n  let keyArray = keyArrayOrString;\n  if (typeof keyArrayOrString === 'string') {\n    keyArray = keyArrayOrString.split('+');\n  }\n  if (keyArray.indexOf('cmd') > -1) {\n    keyArray[keyArray.indexOf('cmd')] = getCmdKey();\n  }\n  let keys = sortedKeys(keyArray || []);\n  if (keys === '') {\n    keys = '_all';\n  }\n  return `${type}:${keys}`;\n}\n\nexport { listenerName as default };\n","function getCmdKey (platform) {\n  if (typeof FastBoot === 'undefined') {\n    if (platform === undefined) {\n      platform = navigator.platform;\n    }\n    if (platform.indexOf('Mac') > -1) {\n      return 'meta';\n    } else {\n      return 'ctrl';\n    }\n  }\n}\n\nexport { getCmdKey as default };\n","import { runInDebug } from '@ember/debug';\n\nlet platform;\nfunction getPlatform(userAgent = navigator.userAgent) {\n  // allow mocking of userAgent in tests, memoize for speed in production\n  runInDebug(() => {\n    platform = null;\n  });\n  if (!platform) {\n    let osName = 'Unknown OS';\n    if (userAgent.indexOf('Win') != -1) osName = 'Windows';\n    if (userAgent.indexOf('Mac') != -1) osName = 'Macintosh';\n    if (userAgent.indexOf('Linux') != -1) osName = 'Linux';\n    if (userAgent.indexOf('Android') != -1) osName = 'Android';\n    if (userAgent.indexOf('like Mac') != -1) osName = 'iOS';\n    platform = osName;\n  }\n  return platform;\n}\n\nexport { getPlatform as default };\n","/**\n * @function getTask\n * @param obj\n * @param taskOrName\n * @param taskName\n */\nfunction getTask(obj, taskOrName, taskName) {\n  let type = typeof taskOrName;\n  let task;\n\n  if (type === 'function') {\n    task = taskOrName;\n  } else if (type === 'string') {\n    task = obj[taskOrName];\n\n    if (typeof task !== 'function') {\n      throw new TypeError(`The method name '${taskOrName}' passed to ${taskName} does not resolve to a valid function.`);\n    }\n  } else {\n    throw new TypeError(`You must pass a task function or method name to '${taskName}'.`);\n  }\n\n  return task;\n}\n\nexport { getTask as default };\n","import { cancel } from '@ember/runloop';\nimport { registerDestructor } from '@ember/destroyable';\n\nconst NULL_TIMER_ID = -1;\n/**\n * A map of instances/timers that allows us to\n * store cancelIds for scheduled timers per instance.\n *\n * @private\n */\n\nlet registeredTimers = new WeakMap();\n/**\n * Test use only. Allows for swapping out the WeakMap to a Map, giving\n * us the ability to detect whether the timers set is empty.\n *\n * @private\n * @param {*} mapForTesting A map used to ensure correctness when testing.\n */\n\nfunction _setRegisteredTimers(mapForTesting) {\n  registeredTimers = mapForTesting;\n}\nfunction getTimersDisposable(destroyable, timers) {\n  return function () {\n    timers.forEach(cancelId => {\n      cancelTask(destroyable, cancelId);\n    });\n    timers.clear();\n  };\n}\nfunction getTimers(destroyable) {\n  let timers = registeredTimers.get(destroyable);\n\n  if (!timers) {\n    timers = new Set();\n    registeredTimers.set(destroyable, timers);\n    registerDestructor(destroyable, getTimersDisposable(destroyable, timers));\n  }\n\n  return timers;\n}\n/**\n * Cancel a previously scheduled task.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { runTask, cancelTask } from 'ember-lifeline';\n *\n * export default CancelableComponent extends Component {\n *   start() {\n *     this._cancelId = runTask(this, () => {\n *       console.log('This runs after 5 seconds if this component is still displayed');\n *     }, 5000)\n *   },\n *\n *   disable() {\n *     cancelTask(this, this._cancelId);\n *   },\n * }\n * ```\n *\n * @function cancelTask\n * @param { Destroyable } destroyable the entangled object that was provided with the original *Task call\n * @param { Number } cancelId the id returned from the *Task call\n * @public\n */\n\nfunction cancelTask(destroyable, cancelId) {\n  let timers = getTimers(destroyable);\n  timers.delete(cancelId);\n  cancel(cancelId);\n}\n\nexport { NULL_TIMER_ID, _setRegisteredTimers, cancelTask, getTimers, getTimersDisposable };\n","import { later } from '@ember/runloop';\nimport { isDestroying } from '@ember/destroyable';\nimport getTask from './utils/get-task.js';\nimport { NULL_TIMER_ID, getTimers } from './cancel-task.js';\n\n/**\n * Registers and runs the provided task function for the provided object at the specified\n * timeout (defaulting to 0). The timer is properly canceled if the object is destroyed\n * before it is invoked.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { runTask } from 'ember-lifeline';\n *\n * export default RunComponent extends Component {\n *   start() {\n *     runTask(this, () => {\n *       console.log('This runs after 5 seconds if this component is still displayed');\n *     }, 5000)\n *   },\n * });\n * ```\n *\n * @function runTask\n * @param { Destroyable } destroyable the instance to register the task for\n * @param { Function | String } taskOrName a function representing the task, or string\n *                                         specifying a property representing the task,\n *                                         which is run at the provided time specified\n *                                         by timeout\n * @param { Number } [timeout=0] the time in the future to run the task\n * @public\n */\n\nfunction runTask(destroyable, taskOrName, timeout = 0) {\n  if (isDestroying(destroyable)) {\n    return NULL_TIMER_ID;\n  }\n\n  let task = getTask(destroyable, taskOrName, 'runTask');\n  let timers = getTimers(destroyable);\n  let cancelId = later(() => {\n    timers.delete(cancelId);\n    task.call(destroyable);\n  }, timeout);\n  timers.add(cancelId);\n  return cancelId;\n}\n\nexport { runTask };\n","import { assert } from '@ember/debug';\nimport { schedule } from '@ember/runloop';\nimport { isDestroying } from '@ember/destroyable';\nimport { NULL_TIMER_ID, getTimers } from './cancel-task.js';\nimport getTask from './utils/get-task.js';\n\n/**\n * Adds the provided function to the named queue for the provided object. The timer is\n * properly canceled if the object is destroyed before it is invoked.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { scheduleTask } from 'ember-lifeline';\n *\n * export default ScheduledComponent extends Component {\n *   start() {\n *     scheduleTask(this, 'actions', () => {\n *       console.log('This runs at the end of the run loop (via the actions queue) if this component is still displayed');\n *     })\n *   },\n * });\n * ```\n *\n * @function scheduleTask\n * @param { Destroyable } destroyable the instance to register the task for\n * @param { String } queueName the queue to schedule the task into\n * @param { Function | String } taskOrName a function representing the task, or string\n *                                         specifying a property representing the task,\n *                                         which is run at the provided time specified\n *                                         by timeout\n * @param { ...* } args arguments to pass to the task\n * @public\n */\n\nfunction scheduleTask(destroyable, queueName, taskOrName, ...args) {\n  assert(`Called \\`scheduleTask\\` without a string as the first argument on ${destroyable}.`, typeof queueName === 'string');\n  assert(`Called \\`scheduleTask\\` while trying to schedule to the \\`afterRender\\` queue on ${destroyable}.`, queueName !== 'afterRender');\n\n  if (isDestroying(destroyable)) {\n    return NULL_TIMER_ID;\n  }\n\n  let task = getTask(destroyable, taskOrName, 'scheduleTask');\n  let timers = getTimers(destroyable);\n  let cancelId;\n\n  let taskWrapper = (...taskArgs) => {\n    timers.delete(cancelId);\n    task.call(destroyable, ...taskArgs);\n  };\n\n  cancelId = schedule(queueName, destroyable, taskWrapper, ...args);\n  timers.add(cancelId);\n  return cancelId;\n}\n\nexport { scheduleTask };\n","import { assert } from '@ember/debug';\nimport { throttle } from '@ember/runloop';\nimport { isDestroying } from '@ember/destroyable';\nimport { NULL_TIMER_ID, getTimers } from './cancel-task.js';\n\n/**\n * Runs the function with the provided name immediately, and only once in the time window\n * specified by the spacing argument.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { throttleTask } from 'ember-lifeline';\n *\n * export default LoggerComponent extends Component {\n *   logMe() {\n *     console.log('This will run once immediately, then only once every 300ms.');\n *   },\n *\n *   click() {\n *     throttleTask(this, 'logMe', 300);\n *   },\n * });\n * ```\n *\n * @function throttleTask\n * @param { Destroyable } destroyable the instance to register the task for\n * @param { String } taskName the name of the task to throttle\n * @param { ...* } [throttleArgs] arguments to pass to the throttled method\n * @param { Number } spacing the time in the future to run the task\n * @param { Boolean } [immediate] Trigger the function on the leading instead of the trailing edge of the wait interval. Defaults to true.\n * @public\n */\n\nfunction throttleTask(destroyable, taskName, ...throttleArgs) {\n  assert(`Called \\`throttleTask\\` without a string as the first argument on ${destroyable}.`, typeof taskName === 'string');\n  assert(`Called \\`throttleTask('${taskName}')\\` where '${taskName}' is not a function.`, typeof destroyable[taskName] === 'function');\n\n  if (isDestroying(destroyable)) {\n    return NULL_TIMER_ID;\n  }\n\n  const lastArgument = throttleArgs[throttleArgs.length - 1];\n  const spacing = typeof lastArgument === 'boolean' ? throttleArgs[throttleArgs.length - 2] : lastArgument;\n  assert(`Called \\`throttleTask\\` with incorrect \\`spacing\\` argument. Expected Number and received \\`${spacing}\\``, typeof spacing === 'number');\n  let timers = getTimers(destroyable);\n  let cancelId = throttle(destroyable, // @ts-ignore Ignores type mismatch issues with passing rest arguments to throttle.\n  taskName, ...throttleArgs);\n  timers.add(cancelId);\n  return cancelId;\n}\n\nexport { throttleTask };\n","import Ember from 'ember';\nimport getTask from './utils/get-task.js';\nimport { registerDestructor } from '@ember/destroyable';\n\nfunction indexable(input) {\n  return input;\n}\n/**\n * A map of instances/poller functions that allows us to\n * store poller tokens per instance.\n *\n * @private\n *\n */\n\n\nlet registeredPollers = new WeakMap();\n/**\n * Test use only. Allows for swapping out the WeakMap to a Map, giving\n * us the ability to detect whether the pollers set is empty.\n *\n * @private\n * @param {*} mapForTesting A map used to ensure correctness when testing.\n */\n\nfunction _setRegisteredPollers(mapForTesting) {\n  registeredPollers = mapForTesting;\n}\nlet token = 0;\n\nlet _shouldPollOverride;\n\nfunction shouldPoll() {\n  if (_shouldPollOverride) {\n    return _shouldPollOverride();\n  }\n\n  return !Ember.testing;\n}\n/**\n * Allows for overriding of the polling behavior to explicitly control\n * whether polling should occur or not.\n *\n * @param { Function } callback\n * @public\n */\n\n\nfunction setShouldPoll(callback) {\n  _shouldPollOverride = callback;\n}\nfunction getQueuedPollTasks() {\n  let symbol = Symbol.for('LIFELINE_QUEUED_POLL_TASKS');\n  let globalObj = getGlobal();\n  let queuedPollTasks = globalObj[symbol];\n\n  if (!queuedPollTasks) {\n    queuedPollTasks = globalObj[symbol] = new Map();\n  }\n\n  return queuedPollTasks;\n}\n/**\n * Sets up a function that can perform polling logic in a testing safe way.\n * The task is invoked synchronously with an argument (generally called `next`).\n * In normal development/production when `next` is invoked, it will trigger the\n * task again (recursively). However, when in test mode the recursive polling\n * functionality is disabled, and usage of the `pollTaskFor` helper is required.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { pollTask, runTask } from 'ember-lifeline';\n *\n * export default PollingComponent extends Component {\n *   api: injectService(),\n *\n *   init() {\n *     this._super(...arguments);\n *\n *     let token = pollTask(this, (next) => {\n *       this.get('api').request('get', 'some/path')\n *         .then(() => {\n *           runTask(this, next, 1800);\n *         })\n *     });\n *\n *     this._pollToken = token;\n *   },\n * });\n * ```\n *\n * Test Example:\n *\n * ```js\n * import { settled } from '@ember/test-helpers';\n * import { pollTaskFor } from 'ember-lifeline';\n *\n *\n * test('foo-bar watches things', async function(assert) {\n *   await render(hbs`{{foo-bar}}`);\n *\n *   assert.strictEqual(serverRequests, 1, 'called initially');\n *\n *   pollTaskFor(this._pollToken);\n *\n *   await settled();\n *\n *   assert.strictEqual(serverRequests, 2, 'called again');\n *\n *   await settled();\n * });\n * ```\n *\n * @method pollTask\n * @param { Destroyable } destroyable the entangled object that was provided with the original *Task call\n * @param { TaskOrName } taskOrName a function representing the task, or string\n *                                  specifying a property representing the task,\n *                                  which is run at the provided time specified\n *                                  by timeout\n * @param { Token } token the Token for the pollTask, either a string or number\n * @public\n */\n\nfunction pollTask(destroyable, taskOrName, token = getNextToken()) {\n  let next;\n  let task = getTask(destroyable, taskOrName, 'pollTask');\n\n  let tick = () => task.call(destroyable, next);\n\n  let pollers = registeredPollers.get(destroyable);\n\n  if (!pollers) {\n    pollers = new Set();\n    registeredPollers.set(destroyable, pollers);\n    registerDestructor(destroyable, getPollersDisposable(destroyable, pollers));\n  }\n\n  pollers.add(token);\n\n  if (shouldPoll()) {\n    next = tick;\n  } else {\n    next = () => {\n      getQueuedPollTasks().set(token, tick);\n    };\n  }\n\n  task.call(destroyable, next);\n  return token;\n}\n/**\n * Clears a previously setup polling task.\n *\n * NOTE: This does not cancel any nested `runTask` calls. You're required to cancel any\n * cancelable behaviors, including any calls to `runTask` using `cancelTask`.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { inject as service } from '@ember/service';\n * import { pollTask, runTask } from 'ember-lifeline';\n *\n * export default AutoRefreshComponent extends Component {\n *   @service api;\n *\n *   enableAutoRefresh() {\n *     this._pollToken = pollTask(this, (next) => {\n *       this.get('api').request('get', 'some/path')\n *         .then(() => {\n *           runTask(this, next, 1800);\n *         })\n *     });\n *   },\n *\n *   disableAutoRefresh() {\n *     cancelPoll(this, this._pollToken);\n *   },\n * }\n * ```\n *\n * @method cancelPoll\n * @param { Destroyable } destroyable the entangled object that was provided with the original *Task call\n * @param { Token } token the Token for the pollTask to be cleared, either a string or number\n * @public\n */\n\nfunction cancelPoll(destroyable, token) {\n  let pollToken;\n  let pollers = registeredPollers.get(destroyable);\n  pollToken = token;\n\n  if (pollers !== undefined) {\n    pollers.delete(pollToken);\n  }\n\n  getQueuedPollTasks().delete(pollToken);\n}\n\nfunction getGlobal() {\n  // eslint-disable-next-line n/no-unsupported-features/es-builtins\n  if (typeof globalThis !== 'undefined') return indexable(globalThis);\n  if (typeof self !== 'undefined') return indexable(self);\n  if (typeof window !== 'undefined') return indexable(window);\n  if (typeof global !== 'undefined') return indexable(global);\n  throw new Error('unable to locate global object');\n}\n\nfunction getPollersDisposable(destroyable, pollers) {\n  return function () {\n    pollers.forEach(token => {\n      cancelPoll(destroyable, token);\n    });\n  };\n}\n\nfunction getNextToken() {\n  return token++;\n}\n\nexport { _setRegisteredPollers, cancelPoll, getQueuedPollTasks, pollTask, setShouldPoll };\n","import { assert } from '@ember/debug';\nimport { cancel, debounce } from '@ember/runloop';\nimport { registerDestructor } from '@ember/destroyable';\n\n/**\n * A map of instances/debounce functions that allows us to\n * store pending debounces per instance.\n *\n * @private\n */\n\nconst registeredDebounces = new WeakMap();\n/**\n * Runs the function with the provided name after the timeout has expired on the last\n * invocation. The timer is properly canceled if the object is destroyed before it is\n * invoked.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { debounceTask } from 'ember-lifeline';\n *\n * export default LoggerComponent extends Component {\n *   logMe() {\n *     console.log('This will only run once every 300ms.');\n *   },\n *\n *   click() {\n *     debounceTask(this, 'logMe', 300);\n *   },\n * }\n * ```\n *\n * @function debounceTask\n * @param { Destroyable } destroyable the instance to register the task for\n * @param { String } name the name of the task to debounce\n * @param { ...* } debounceArgs arguments to pass to the debounced method\n * @param { Number } spacing the amount of time to wait before calling the method (in milliseconds)\n * @param { Boolean } [immediate] Trigger the function on the leading instead of the trailing edge of the wait interval. Defaults to false.\n * @public\n */\n\nfunction debounceTask(destroyable, name, ...debounceArgs) {\n  assert(`Called \\`debounceTask\\` without a string as the first argument on ${destroyable}.`, typeof name === 'string');\n  assert(`Called \\`destroyable.debounceTask('${name}', ...)\\` where 'destroyable.${name}' is not a function.`, typeof destroyable[name] === 'function');\n\n  if (destroyable.isDestroying) {\n    return;\n  }\n\n  const lastArgument = debounceArgs[debounceArgs.length - 1];\n  const spacing = typeof lastArgument === 'boolean' ? debounceArgs[debounceArgs.length - 2] : lastArgument;\n  assert(`Called \\`debounceTask\\` with incorrect \\`spacing\\` argument. Expected Number and received \\`${spacing}\\``, typeof spacing === 'number');\n  let pendingDebounces = registeredDebounces.get(destroyable);\n\n  if (!pendingDebounces) {\n    pendingDebounces = new Map();\n    registeredDebounces.set(destroyable, pendingDebounces);\n    registerDestructor(destroyable, getDebouncesDisposable(pendingDebounces));\n  }\n\n  let debouncedTask;\n\n  if (!pendingDebounces.has(name)) {\n    debouncedTask = (...args) => {\n      pendingDebounces.delete(name);\n      destroyable[name](...args);\n    };\n  } else {\n    debouncedTask = pendingDebounces.get(name).debouncedTask;\n  } // cancelId is new, even if the debounced function was already present\n\n\n  let cancelId = debounce(destroyable, debouncedTask, ...debounceArgs);\n  pendingDebounces.set(name, {\n    debouncedTask,\n    cancelId\n  });\n}\n/**\n * Cancel a previously debounced task.\n *\n * Example:\n *\n * ```js\n * import Component from '@glimmer/component';\n * import { debounceTask, cancelDebounce } from 'ember-lifeline';\n *\n * export default LoggerComponent extends Component {\n *   logMe() {\n *     console.log('This will only run once every 300ms.');\n *   },\n *\n *   click() {\n *     debounceTask(this, 'logMe', 300);\n *   },\n *\n *   disable() {\n *      cancelDebounce(this, 'logMe');\n *   },\n * }\n * ```\n *\n * @function cancelDebounce\n * @param { Destroyable } destroyable the instance to register the task for\n * @param { String } methodName the name of the debounced method to cancel\n * @public\n */\n\nfunction cancelDebounce(destroyable, methodName) {\n  if (!registeredDebounces.has(destroyable)) {\n    return;\n  }\n\n  const pendingDebounces = registeredDebounces.get(destroyable);\n\n  if (!pendingDebounces.has(methodName)) {\n    return;\n  }\n\n  const {\n    cancelId\n  } = pendingDebounces.get(methodName);\n  pendingDebounces.delete(methodName);\n  cancel(cancelId);\n}\n\nfunction getDebouncesDisposable(debounces) {\n  return function () {\n    if (debounces.size === 0) {\n      return;\n    }\n\n    debounces.forEach(p => cancel(p.cancelId));\n  };\n}\n\nexport { cancelDebounce, debounceTask };\n","import Ember from 'ember';\n\n/**\n * @function getTimeoutOrTestFallback\n * @param {number} timeout The timeout value that gets scaled down in case of the test environment.\n * @param {TestTimeoutOptions} [options]\n * @param {number} [options.timeout] The timeout value that needs to be set in the test environment if passed\n * @param {number} [options.scaling] The amount by which the timeout needs to be scaled down\n * @return {number} The adjusted timeout value depending on the environment and scaling factor.\n */\n\nfunction getTimeoutOrTestFallback(timeout, {\n  timeout: testTimeout,\n  scaling = 100\n} = {\n  scaling: 100\n} // Reducing timer value by 100x in test environment by default\n) {\n  if (Ember.testing) {\n    return testTimeout !== undefined ? testTimeout : timeout / scaling;\n  }\n\n  return timeout;\n}\n\nexport { getTimeoutOrTestFallback };\n","import { capabilities } from '@ember/modifier';\nimport { destroy } from '@ember/destroyable';\nimport type Owner from '@ember/owner';\n\nimport type ClassBasedModifier from './modifier';\nimport type { ArgsFor, ElementFor } from '../signature';\n\n/**\n * The state bucket used throughout the life-cycle of the modifier. Basically a\n * state *machine*, where the framework calls us with the version we hand back\n * to it at each phase. The two states are the two `extends` versions of this\n * below.\n *\n * @internal\n */\ninterface State<S> {\n  instance: ClassBasedModifier<S>;\n}\n\n/**\n * The `State` after calling `createModifier`, and therefore the state available\n * at the start of `InstallModifier`.\n * @internal\n */\ninterface CreatedState<S> extends State<S> {\n  element: null;\n}\n\n/**\n * The `State` after calling `installModifier`, and therefore the state\n * available in all `updateModifier` calls and in `destroyModifier`.\n * @internal\n */\ninterface InstalledState<S> extends State<S> {\n  element: ElementFor<S>;\n}\n\n// Wraps the unsafe (b/c it mutates, rather than creating new state) code that\n// TS does not yet understand.\nfunction installElement<S>(\n  state: CreatedState<S>,\n  element: ElementFor<S>,\n): InstalledState<S> {\n  // SAFETY: this cast represents how we are actually handling the state machine\n  // transition: from this point forward in the lifecycle of the modifier, it\n  // always behaves as `InstalledState<S>`. It is safe because, and *only*\n  // because, we immediately initialize `element`. (We cannot create a new state\n  // from the old one because the modifier manager API expects mutation of a\n  // single state bucket rather than updating it at hook calls.)\n  const installedState = state as State<S> as InstalledState<S>;\n  installedState.element = element;\n  return installedState;\n}\n\nexport default class ClassBasedModifierManager<S> {\n  capabilities = capabilities('3.22');\n\n  constructor(private owner: Owner) {}\n\n  createModifier(\n    modifierClass: typeof ClassBasedModifier,\n    args: ArgsFor<S>,\n  ): CreatedState<S> {\n    const instance = new modifierClass(this.owner, args);\n    return { instance, element: null };\n  }\n\n  installModifier(\n    createdState: CreatedState<S>,\n    element: ElementFor<S>,\n    args: ArgsFor<S>,\n  ): void {\n    const state = installElement(createdState, element);\n    state.instance.modify(element, args.positional, args.named);\n  }\n\n  updateModifier(state: InstalledState<S>, args: ArgsFor<S>): void {\n    state.instance.modify(state.element, args.positional, args.named);\n  }\n\n  destroyModifier({ instance }: InstalledState<S>): void {\n    destroy(instance);\n  }\n}\n","import { setOwner } from '@ember/application';\nimport { setModifierManager } from '@ember/modifier';\nimport type Owner from '@ember/owner';\nimport Manager from './modifier-manager.ts';\nimport type {\n  ElementFor,\n  ArgsFor,\n  DefaultSignature,\n  PositionalArgs,\n  NamedArgs,\n} from '../signature';\nimport type Opaque from '../opaque';\n\n// Preserve the signature on a class-based modifier, so it can be plucked off\n// later (by e.g. Glint), using interface merging with an opaque item to\n// preserve it in the type system. The fact that it's an empty interface is\n// actually the point: it *only* hooks the type parameter into the opaque\n// (nominal) type. Note that this is distinct from the function-based modifier\n// type intentionally, because it is actually the static class side of a\n// class-based modifier which corresponds to the result of calling `modifier()`\n// with a callback defining a function-based modifier.\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport default interface ClassBasedModifier<S = DefaultSignature>\n  extends Opaque<S> {}\n\n/**\n * A base class for modifiers which need more capabilities than function-based\n * modifiers. Useful if, for example:\n *\n * 1. You need to inject services and access them\n * 2. You need fine-grained control of updates, either for performance or\n *    convenience reasons, and don't want to teardown the state of your modifier\n *    every time only to set it up again.\n * 3. You need to store some local state within your modifier.\n *\n * The lifecycle hooks of class modifiers are tracked. When they run, they any\n * values they access will be added to the modifier, and the modifier will\n * update if any of those values change.\n */\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport default class ClassBasedModifier<S = DefaultSignature> {\n  // `args` is passed here for the sake of subclasses to have access to args in\n  // their constructors while having constructors which are properly asssignable\n  // for the superclass.\n  /**\n   *\n   * @param owner An instance of an Owner (for service injection etc.).\n   * @param args The positional and named arguments passed to the modifier.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  constructor(owner: Owner, args: ArgsFor<S>) {\n    setOwner(this, owner);\n  }\n\n  /**\n   * Called when the modifier is installed and any time any tracked state used\n   * in the modifier changes.\n   *\n   * If you need to do first-time-only setup, create a class field representing\n   * the initialization state and check it when running the hook. That is also\n   * where and when you should use `registerDestructor` for any teardown you\n   * need to do. For example:\n   *\n   * ```js\n   * function disconnect(instance) {\n   *  instance.observer?.disconnect();\n   * }\n   *\n   * class IntersectionObserver extends Modifier {\n   *   observer;\n   *\n   *   constructor(owner, args) {\n   *     super(owner, args);\n   *     registerDestructor(this, disconnect);\n   *   }\n   *\n   *   modify(element, callback, options) {\n   *     disconnect(this);\n   *\n   *     this.observer = new IntersectionObserver(callback, options);\n   *     this.observer.observe(element);\n   *   }\n   * }\n   * ```\n   *\n   * @param element The element to which the modifier is applied.\n   * @param positional The positional arguments to the modifier.\n   * @param named The named arguments to the modifier.\n   */\n  modify(\n    /* eslint-disable @typescript-eslint/no-unused-vars */\n    element: ElementFor<S>,\n    positional: PositionalArgs<S>,\n    named: NamedArgs<S>,\n    /* eslint-enable @typescript-eslint/no-unused-vars */\n  ): void {\n    /* no op, for subclassing */\n  }\n}\n\nsetModifierManager((owner) => new Manager(owner), ClassBasedModifier);\n","import { setModifierManager } from '@ember/modifier';\nimport type {\n  ElementFor,\n  EmptyObject,\n  NamedArgs,\n  PositionalArgs,\n} from '../signature';\nimport type Modifier from '../class-based/modifier';\nimport FunctionBasedModifierManager from './modifier-manager.ts';\n\n// Provide a singleton manager.\nconst MANAGER = new FunctionBasedModifierManager();\n\n// This type exists to provide a non-user-constructible, non-subclassable\n// type representing the conceptual \"instance type\" of a function modifier.\n// The abstract field of type `never` prevents subclassing in userspace of\n// the value returned from `modifier()`. By extending `Modifier<S>`, any\n// augmentations of the `Modifier` type performed by tools like Glint will\n// also apply to function-based modifiers as well.\nexport declare abstract class FunctionBasedModifierInstance<\n  S,\n> extends Modifier<S> {\n  protected abstract __concrete__: never;\n}\n\n// This provides a type whose only purpose here is to represent the runtime\n// type of a function-based modifier: a virtually opaque item. The fact that it's\n// a bare constructor type allows `modifier()` to preserve type parameters from\n// a generic function it's passed, and by making it abstract and impossible to\n// subclass (see above) we prevent users from attempting to instantiate the return\n// value from a `modifier()` call.\nexport type FunctionBasedModifier<S> =\n  abstract new () => FunctionBasedModifierInstance<S>;\n\n/**\n * The (optional) return type for a modifier which needs to perform some kind of\n * cleanup or teardown -- for example, removing an event listener from an\n * element besides the one passed into the modifier.\n */\nexport type Teardown = () => unknown;\n\n/**\n * An API for writing simple modifiers.\n *\n * This function runs the first time when the element the modifier was applied\n * to is inserted into the DOM, and it *autotracks* while running. Any values\n * that it accesses will be tracked, including any of its arguments that it\n * accesses, and if any of them changes, the function will run again.\n *\n * **Note:** this will *not* automatically rerun because an argument changes. It\n * will only rerun if it is *using* that argument (the same as with auto-tracked\n * state in general).\n *\n * The modifier can also optionally return a *destructor*. The destructor\n * function will be run just before the next update, and when the element is\n * being removed entirely. It should generally clean up the changes that the\n * modifier made in the first place.\n *\n * @param fn The function which defines the modifier.\n */\n// This overload allows users to write types directly on the callback passed to\n// the `modifier` function and infer the resulting type correctly.\nexport default function modifier<\n  E extends Element,\n  P extends unknown[],\n  N = EmptyObject,\n>(\n  fn: (element: E, positional: P, named: N) => void | Teardown,\n): FunctionBasedModifier<{\n  Args: {\n    Positional: P;\n    Named: N;\n  };\n  Element: E;\n}>;\n\n/**\n * An API for writing simple modifiers.\n *\n * This function runs the first time when the element the modifier was applied\n * to is inserted into the DOM, and it *autotracks* while running. Any values\n * that it accesses will be tracked, including any of its arguments that it\n * accesses, and if any of them changes, the function will run again.\n *\n * **Note:** this will *not* automatically rerun because an argument changes. It\n * will only rerun if it is *using* that argument (the same as with auto-tracked\n * state in general).\n *\n * The modifier can also optionally return a *destructor*. The destructor\n * function will be run just before the next update, and when the element is\n * being removed entirely. It should generally clean up the changes that the\n * modifier made in the first place.\n *\n * @param fn The function which defines the modifier.\n */\n// This overload allows users to provide a `Signature` type explicitly at the\n// modifier definition site, e.g. `modifier<Sig>((el, pos, named) => {...})`.\n// **Note:** this overload must appear second, since TS' inference engine will\n// not correctly infer the type of `S` here from the types on the supplied\n// callback.\nexport default function modifier<S>(\n  fn: (\n    element: ElementFor<S>,\n    positional: PositionalArgs<S>,\n    named: NamedArgs<S>,\n  ) => void | Teardown,\n): FunctionBasedModifier<{\n  Element: ElementFor<S>;\n  Args: {\n    Named: NamedArgs<S>;\n    Positional: PositionalArgs<S>;\n  };\n}>;\n\n// This is the runtime signature; it performs no inference whatsover and just\n// uses the simplest version of the invocation possible since, for the case of\n// setting it on the modifier manager, we don't *need* any of that info, and\n// the two previous overloads capture all invocations from a type perspective.\nexport default function modifier(\n  fn: (\n    element: Element,\n    positional: unknown[],\n    named: object,\n  ) => void | Teardown,\n  options?: {\n    name: string;\n  },\n): FunctionBasedModifier<{\n  Element: Element;\n  Args: {\n    Named: object;\n    Positional: unknown[];\n  };\n}> {\n  fn.toString = () => options?.name || fn.name;\n  // SAFETY: the cast here is a *lie*, but it is a useful one. The actual return\n  // type of `setModifierManager` today is `void`; we pretend it actually\n  // returns an opaque `Modifier` type so that we can provide a result from this\n  // type which is useful to TS-aware tooling (e.g. Glint).\n  return setModifierManager(\n    () => MANAGER,\n    fn,\n  ) as unknown as FunctionBasedModifier<{\n    Element: Element;\n    Args: {\n      Named: object;\n      Positional: unknown[];\n    };\n  }>;\n}\n\n/**\n * @internal\n */\nexport type FunctionBasedModifierDefinition<S> = (\n  element: ElementFor<S>,\n  positional: PositionalArgs<S>,\n  named: NamedArgs<S>,\n) => void | Teardown;\n","import { capabilities } from '@ember/modifier';\nimport type { FunctionBasedModifierDefinition, Teardown } from './modifier';\nimport type { ArgsFor, ElementFor } from '../signature';\n\ninterface State<S> {\n  instance: FunctionBasedModifierDefinition<S>;\n}\n\ninterface CreatedState<S> extends State<S> {\n  element: null;\n}\n\ninterface InstalledState<S> extends State<S> {\n  element: ElementFor<S>;\n  teardown?: Teardown;\n}\n\n// Wraps the unsafe (b/c it mutates, rather than creating new state) code that\n// TS does not yet understand.\nfunction installElement<S>(\n  state: CreatedState<S>,\n  element: ElementFor<S>,\n): InstalledState<S> {\n  // SAFETY: this cast represents how we are actually handling the state machine\n  // transition: from this point forward in the lifecycle of the modifier, it\n  // always behaves as `InstalledState<S>`. It is safe because, and *only*\n  // because, we immediately initialize `element`. (We cannot create a new state\n  // from the old one because the modifier manager API expects mutation of a\n  // single state bucket rather than updating it at hook calls.)\n  const installedState = state as State<S> as InstalledState<S>;\n  installedState.element = element;\n  return installedState;\n}\n\nexport default class FunctionBasedModifierManager<S> {\n  capabilities = capabilities('3.22');\n\n  createModifier(\n    instance: FunctionBasedModifierDefinition<S>,\n  ): CreatedState<S> {\n    return { element: null, instance };\n  }\n\n  installModifier(\n    createdState: CreatedState<S>,\n    element: ElementFor<S>,\n    args: ArgsFor<S>,\n  ): void {\n    const state = installElement(createdState, element);\n\n    const { positional, named } = args;\n    const teardown = createdState.instance(element, positional, named);\n    if (typeof teardown === 'function') {\n      state.teardown = teardown;\n    }\n  }\n\n  updateModifier(state: InstalledState<S>, args: ArgsFor<S>): void {\n    if (typeof state.teardown === 'function') {\n      state.teardown();\n    }\n\n    const teardown = state.instance(state.element, args.positional, args.named);\n    if (typeof teardown === 'function') {\n      state.teardown = teardown;\n    }\n  }\n\n  destroyModifier(state: InstalledState<S>): void {\n    if (typeof state.teardown === 'function') {\n      state.teardown();\n    }\n  }\n\n  getDebugName(state: InstalledState<S>): string {\n    return state.instance.toString();\n  }\n\n  getDebugInstance(state: InstalledState<S>): InstalledState<S> {\n    return state;\n  }\n}\n","import { inject as service } from '@ember/service';\nimport Helper from '@ember/component/helper';\nimport { guidFor } from '@ember/object/internals';\n\nimport type Owner from '@ember/owner';\nimport type PageTitleService from '../services/page-title.ts';\nimport type { PageTitleToken } from '../private-types.ts';\n\nexport type PageTitleHelperOptions = Pick<\n  PageTitleToken,\n  'prepend' | 'front' | 'replace' | 'separator'\n>;\n\ninterface Signature {\n  Args: {\n    Positional: string[];\n    Named: PageTitleHelperOptions;\n  };\n  Return: void;\n}\n\n/**\n * `{{pageTitle}}` helper used to set the title of the current route context.\n *\n * ```gjs\n * import { pageTitle } from 'ember-page-title';\n *\n * <template>\n *   {{pageTitle \"the text to set the tab's title to\"}}\n *   {{pageTitle \\@model.post.title}}\n * </template>\n * ```\n */\nexport default class PageTitle extends Helper<Signature> {\n  @service('page-title') declare tokens: PageTitleService;\n\n  tokenId = guidFor(this);\n\n  constructor(owner: Owner) {\n    super(owner);\n    this.tokens.push({ id: this.tokenId });\n  }\n\n  compute(params: string[], userOptions: PageTitleHelperOptions) {\n    const options = {\n      ...userOptions,\n      id: this.tokenId,\n      title: params.join(''),\n    };\n\n    this.tokens.push(options);\n    this.tokens.scheduleTitleUpdate();\n    // We must return an empty value here because otherwise\n    // invoking the pageTitle helper will render something\n    // in the component it's used in, and we don't want that.\n    //\n    // pageTitle is a side-effecting helper.\n    // We *synchronize* the document.title with our internal state.\n    return '';\n  }\n\n  willDestroy() {\n    super.willDestroy();\n    this.tokens.remove(this.tokenId);\n    this.tokens.scheduleTitleUpdate();\n  }\n}\n","import { scheduleOnce } from '@ember/runloop';\nimport Service, { inject as service } from '@ember/service';\nimport { isEmpty } from '@ember/utils';\nimport { assert } from '@ember/debug';\nimport type ApplicationInstance from '@ember/application/instance';\nimport type RouterService from '@ember/routing/router-service';\nimport type Owner from '@ember/owner';\n\nimport type {\n  FastBootDocument,\n  PageTitleToken,\n  PageTitleConfig,\n} from '../private-types.ts';\n\nconst isFastBoot = typeof FastBoot !== 'undefined';\n\nconst RouterEvent = {\n  ROUTE_DID_CHANGE: 'routeDidChange',\n} as const;\n\nfunction hasResolveRegistration(owner: Owner): owner is ApplicationInstance {\n  return `resolveRegistration` in owner;\n}\n\nfunction hasPageTitleConfig(\n  fromEnv: unknown,\n): fromEnv is { pageTitle: PageTitleConfig } {\n  if (typeof fromEnv !== 'object') return false;\n  if (fromEnv === null) return false;\n\n  // all properties on the pageTitle config are optional,\n  // so we can't check for more\n  return 'pageTitle' in fromEnv;\n}\n\nconst configKeys = ['separator', 'prepend', 'replace'] as const;\n\n/**\n  @class page-title\n  @extends Ember.Service\n */\nexport default class PageTitleService extends Service {\n  @service('router') declare router: RouterService;\n\n  // in fastboot context \"document\" is instance of\n  // ember-fastboot/simple-dom document\n  @service('-document') private declare document: FastBootDocument;\n\n  tokens: PageTitleToken[] = [];\n\n  _defaultConfig: PageTitleConfig = {\n    // The default separator to use between tokens.\n    separator: ' | ',\n\n    // The default prepend value to use.\n    prepend: true,\n\n    // The default replace value to use.\n    replace: null,\n  };\n\n  constructor(owner: Owner) {\n    super(owner);\n    this._validateExistingTitleElement();\n\n    if (hasResolveRegistration(owner)) {\n      const config = owner.resolveRegistration('config:environment');\n\n      if (hasPageTitleConfig(config)) {\n        configKeys.forEach((key) => {\n          if (!isEmpty(config.pageTitle[key])) {\n            const configValue = config.pageTitle[key];\n\n            // SAFETY: how is one supposed to iterate over keys for an object and have it\n            //         known to the compiler that both objects, having the same shape,\n            //         will have the same type per-value?\n            //         as-is, the `configValue` is a union of all value-types from the object.\n            (this._defaultConfig[key] as PageTitleConfig[typeof key]) =\n              configValue;\n          }\n        });\n      }\n    }\n    this.router.on(RouterEvent.ROUTE_DID_CHANGE, this.scheduleTitleUpdate);\n  }\n\n  applyTokenDefaults(token: PageTitleToken) {\n    const defaultSeparator = this._defaultConfig.separator;\n    const defaultPrepend = this._defaultConfig.prepend;\n    const defaultReplace = this._defaultConfig.replace;\n\n    token.previous ??= null;\n    token.next ??= null;\n\n    if (token.separator == null) {\n      token.separator = defaultSeparator;\n    }\n\n    if (token.prepend == null && defaultPrepend != null) {\n      token.prepend = defaultPrepend;\n    }\n\n    if (token.replace == null && defaultReplace != null) {\n      token.replace = defaultReplace;\n    }\n  }\n\n  inheritFromPrevious(token: PageTitleToken) {\n    const previous = token.previous;\n    if (previous) {\n      if (token.separator == null) {\n        token.separator = previous.separator;\n      }\n\n      if (token.prepend == null) {\n        token.prepend = previous.prepend;\n      }\n    }\n  }\n\n  push(token: PageTitleToken) {\n    const tokenForId = this._findTokenById(token.id);\n    if (tokenForId) {\n      const index = this.tokens.indexOf(tokenForId);\n      const tokens = [...this.tokens];\n      const previous = tokenForId.previous;\n      token.previous = previous;\n      token.next = tokenForId.next;\n      this.inheritFromPrevious(token);\n      this.applyTokenDefaults(token);\n\n      tokens.splice(index, 1, token);\n      this.tokens = tokens;\n      return;\n    }\n\n    const previous = this.tokens.slice(-1)[0];\n    if (previous) {\n      token.previous = previous ?? null;\n      previous.next = token;\n      this.inheritFromPrevious(token);\n    }\n\n    this.applyTokenDefaults(token);\n    this.tokens = [...this.tokens, token];\n  }\n\n  remove(id: PageTitleToken['id']) {\n    const token = this._findTokenById(id);\n\n    if (!token) return;\n\n    const { next, previous } = token;\n    if (next) {\n      next.previous = previous;\n    }\n\n    if (previous) {\n      previous.next = next;\n    }\n\n    token.previous = token.next = null;\n\n    const tokens = [...this.tokens];\n    tokens.splice(tokens.indexOf(token), 1);\n    this.tokens = tokens;\n  }\n\n  get visibleTokens(): PageTitleToken[] {\n    const tokens = this.tokens;\n    let i = tokens ? tokens.length : 0;\n    const visible = [];\n    while (i--) {\n      const token = tokens[i];\n\n      if (!token) continue;\n\n      if (token.replace) {\n        visible.unshift(token);\n        break;\n      } else {\n        visible.unshift(token);\n      }\n    }\n    return visible;\n  }\n\n  get sortedTokens(): PageTitleToken[] {\n    const visible = this.visibleTokens;\n    if (!visible) return [];\n\n    let appending = true;\n    let group: PageTitleToken[] = [];\n    const groups = [group];\n    const frontGroups: PageTitleToken[] = [];\n\n    visible.forEach((token) => {\n      if (token.front) {\n        frontGroups.unshift(token);\n      } else if (token.prepend) {\n        if (appending) {\n          appending = false;\n          group = [];\n          groups.push(group);\n        }\n        const lastToken = group[0];\n        if (lastToken) {\n          token = { ...token };\n          token.separator = lastToken.separator;\n        }\n        group.unshift(token);\n      } else {\n        if (!appending) {\n          appending = true;\n          group = [];\n          groups.push(group);\n        }\n        group.push(token);\n      }\n    });\n\n    return frontGroups.concat(groups.reduce((E, group) => E.concat(group), []));\n  }\n\n  scheduleTitleUpdate = () => {\n    // eslint-disable-next-line ember/no-runloop\n    scheduleOnce('afterRender', this, this._updateTitle);\n  };\n\n  toString(): string {\n    const tokens = this.sortedTokens;\n    const title = [];\n\n    for (let i = 0, len = tokens.length; i < len; i++) {\n      const token = tokens[i];\n      if (!token) continue;\n\n      if (token.title) {\n        title.push(token.title);\n        if (i + 1 < len) {\n          title.push(token.separator);\n        }\n      }\n    }\n\n    return title.join('');\n  }\n\n  willDestroy() {\n    super.willDestroy();\n    this.router.off(RouterEvent.ROUTE_DID_CHANGE, this.scheduleTitleUpdate);\n  }\n\n  private _updateTitle() {\n    const toBeTitle = this.toString();\n\n    if (isFastBoot) {\n      this.updateFastbootTitle(toBeTitle);\n    } else {\n      /**\n       * When rendering app with \"?fastboot=false\" (http://ember-fastboot.com/docs/user-guide#disabling-fastboot)\n       * We will not have <title> element present in DOM.\n       *\n       * But this is fine as by HTML spec,\n       * one is created upon assigning \"document.title\" value;\n       *\n       * https://html.spec.whatwg.org/multipage/dom.html#dom-tree-accessors\n       */\n      this.document.title = toBeTitle;\n    }\n\n    this.titleDidUpdate(toBeTitle);\n  }\n\n  /**\n   * Validate if there's more than one title element present.\n   *\n   * Example: ember-cli-head can cause conflicting updates.\n   * @private\n   */\n  private _validateExistingTitleElement() {\n    if (isFastBoot) {\n      return;\n    }\n    assert(\n      '[ember-page-title]: Multiple title elements found. Check for other addons like ember-cli-head updating <title> as well.',\n      document.head.querySelectorAll('title').length <= 1,\n    );\n  }\n\n  /**\n   * Find token by id\n   *\n   * @param {String} id\n   * @private\n   */\n  private _findTokenById(id: PageTitleToken['id']) {\n    return this.tokens.find((token) => token.id === id);\n  }\n\n  updateFastbootTitle(toBeTitle: string) {\n    if (!isFastBoot) {\n      return;\n    }\n    const headElement = this.document.head;\n    const headChildNodes = headElement.childNodes;\n\n    // Remove existing title elements from previous render cycle\n    for (let i = 0; i < headChildNodes.length; i++) {\n      const node = headChildNodes[i];\n      if (!node) continue;\n\n      if (node.nodeName.toLowerCase() === 'title') {\n        headElement.removeChild(node);\n      }\n    }\n\n    // Add title element with latest value\n    const titleEl = this.document.createElement('title');\n    const titleContents = this.document.createTextNode(toBeTitle);\n    titleEl.appendChild(titleContents);\n    headElement.appendChild(titleEl);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  titleDidUpdate(_title: string) {\n    // default is empty, meant to be overriden by user if desired\n  }\n}\n","function _initializerDefineProperty(target, property, descriptor, context) {\n  if (!descriptor) return;\n  Object.defineProperty(target, property, {\n    enumerable: descriptor.enumerable,\n    configurable: descriptor.configurable,\n    writable: descriptor.writable,\n    value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n  });\n}\n\nfunction _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n  var desc = {};\n  Object.keys(descriptor).forEach(function (key) {\n    desc[key] = descriptor[key];\n  });\n  desc.enumerable = !!desc.enumerable;\n  desc.configurable = !!desc.configurable;\n\n  if ('value' in desc || desc.initializer) {\n    desc.writable = true;\n  }\n\n  desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n    return decorator(target, property, desc) || desc;\n  }, desc);\n\n  if (context && desc.initializer !== void 0) {\n    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n    desc.initializer = undefined;\n  }\n\n  if (desc.initializer === void 0) {\n    Object.defineProperty(target, property, desc);\n    desc = null;\n  }\n\n  return desc;\n}\n\nexport { _applyDecoratedDescriptor as _, _initializerDefineProperty as a };\n","import { _ as _applyDecoratedDescriptor, a as _initializerDefineProperty } from '../_rollupPluginBabelHelpers-7db585ca.js';\nimport { inject } from '@ember/service';\nimport Helper from '@ember/component/helper';\nimport handleQueryParams from '../utils/handle-query-params.js';\nimport trackActiveRoute from '../utils/track-active-route.js';\n\nvar _class, _descriptor;\nlet IsActiveHelper = (_class = class IsActiveHelper extends Helper {\n  constructor(...args) {\n    super(...args);\n\n    _initializerDefineProperty(this, \"router\", _descriptor, this);\n  }\n\n  compute(_params) {\n    trackActiveRoute(this.router);\n    let params = handleQueryParams(_params);\n    return this.router.isActive(...params);\n  }\n\n}, (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"router\", [inject], {\n  configurable: true,\n  enumerable: true,\n  writable: true,\n  initializer: null\n})), _class);\n\nexport { IsActiveHelper as default };\n","import { _ as _applyDecoratedDescriptor, a as _initializerDefineProperty } from '../_rollupPluginBabelHelpers-7db585ca.js';\nimport { inject } from '@ember/service';\nimport Helper from '@ember/component/helper';\nimport handleQueryParams from '../utils/handle-query-params.js';\n\nvar _class, _descriptor;\nlet ReplaceWithHelper = (_class = class ReplaceWithHelper extends Helper {\n  constructor(...args) {\n    super(...args);\n\n    _initializerDefineProperty(this, \"router\", _descriptor, this);\n  }\n\n  compute(_params) {\n    return maybeEvent => {\n      if (maybeEvent !== undefined && typeof maybeEvent.preventDefault === 'function') {\n        maybeEvent.preventDefault();\n      }\n\n      let params = handleQueryParams(_params);\n      return this.router.replaceWith(...params);\n    };\n  }\n\n}, (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"router\", [inject], {\n  configurable: true,\n  enumerable: true,\n  writable: true,\n  initializer: null\n})), _class);\n\nexport { ReplaceWithHelper as default };\n","import { _ as _applyDecoratedDescriptor, a as _initializerDefineProperty } from '../_rollupPluginBabelHelpers-7db585ca.js';\nimport Helper from '@ember/component/helper';\nimport { inject } from '@ember/service';\n\nvar _class, _descriptor;\nlet RootURLHelper = (_class = class RootURLHelper extends Helper {\n  constructor(...args) {\n    super(...args);\n\n    _initializerDefineProperty(this, \"router\", _descriptor, this);\n  }\n\n  compute() {\n    return this.router.rootURL;\n  }\n\n}, (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"router\", [inject], {\n  configurable: true,\n  enumerable: true,\n  writable: true,\n  initializer: null\n})), _class);\n\nexport { RootURLHelper as default };\n","import { _ as _applyDecoratedDescriptor, a as _initializerDefineProperty } from '../_rollupPluginBabelHelpers-7db585ca.js';\nimport { inject } from '@ember/service';\nimport Helper from '@ember/component/helper';\nimport RouteParams from '../utils/route-params.js';\nimport '../utils/handle-query-params.js';\nimport '../utils/track-active-route.js';\n\nvar _class, _descriptor;\nlet RouteParamsHelper = (_class = class RouteParamsHelper extends Helper {\n  constructor(...args) {\n    super(...args);\n\n    _initializerDefineProperty(this, \"router\", _descriptor, this);\n  }\n\n  compute(params) {\n    return new RouteParams(this.router, params);\n  }\n\n}, (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"router\", [inject], {\n  configurable: true,\n  enumerable: true,\n  writable: true,\n  initializer: null\n})), _class);\n\nexport { RouteParamsHelper as default };\n","import handleQueryParams from './handle-query-params.js';\nimport trackActiveRoute from './track-active-route.js';\n\nclass RouteParams {\n  constructor(router, params) {\n    this._router = router;\n    this._inputParams = params;\n    this._transitionTo = undefined;\n    this._replaceWith = undefined;\n    this._processedParams = undefined;\n  }\n\n  get isActive() {\n    trackActiveRoute(this._router);\n    return this._router.isActive(...this._params);\n  }\n\n  get url() {\n    return this._router.urlFor(...this._params);\n  }\n\n  get transitionTo() {\n    if (this._transitionTo === undefined) {\n      this._transitionTo = maybeEvent => {\n        if (maybeEvent !== undefined && typeof maybeEvent.preventDefault === 'function') {\n          maybeEvent.preventDefault();\n        }\n\n        return this._router.transitionTo(...this._params);\n      };\n    }\n\n    return this._transitionTo;\n  }\n\n  get replaceWith() {\n    if (this._replaceWith === undefined) {\n      this._replaceWith = () => {\n        return this._router.replaceWith(...this._params);\n      };\n    }\n\n    return this._replaceWith;\n  }\n\n  get _params() {\n    if (!this._processedParams) {\n      this._processedParams = handleQueryParams(this._inputParams);\n    }\n\n    return this._processedParams;\n  }\n\n}\n\nexport { RouteParams as default };\n","import { _ as _applyDecoratedDescriptor, a as _initializerDefineProperty } from '../_rollupPluginBabelHelpers-7db585ca.js';\nimport { inject } from '@ember/service';\nimport Helper from '@ember/component/helper';\nimport handleQueryParams from '../utils/handle-query-params.js';\n\nvar _class, _descriptor;\nlet TransitionToHelper = (_class = class TransitionToHelper extends Helper {\n  constructor(...args) {\n    super(...args);\n\n    _initializerDefineProperty(this, \"router\", _descriptor, this);\n  }\n\n  compute(_params) {\n    return maybeEvent => {\n      if (maybeEvent !== undefined && typeof maybeEvent.preventDefault === 'function') {\n        maybeEvent.preventDefault();\n      }\n\n      let params = handleQueryParams(_params);\n      return this.router.transitionTo(...params);\n    };\n  }\n\n}, (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"router\", [inject], {\n  configurable: true,\n  enumerable: true,\n  writable: true,\n  initializer: null\n})), _class);\n\nexport { TransitionToHelper as default };\n","import { _ as _applyDecoratedDescriptor, a as _initializerDefineProperty } from '../_rollupPluginBabelHelpers-7db585ca.js';\nimport { inject } from '@ember/service';\nimport Helper from '@ember/component/helper';\nimport handleQueryParams from '../utils/handle-query-params.js';\n\nvar _class, _descriptor;\nlet UrlForHelper = (_class = class UrlForHelper extends Helper {\n  constructor(...args) {\n    super(...args);\n\n    _initializerDefineProperty(this, \"router\", _descriptor, this);\n  }\n\n  compute(_params) {\n    let params = handleQueryParams(_params);\n    return this.router.urlFor(...params);\n  }\n\n}, (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"router\", [inject], {\n  configurable: true,\n  enumerable: true,\n  writable: true,\n  initializer: null\n})), _class);\n\nexport { UrlForHelper as default };\n","function handleQueryParams (params) {\n  let possibleQueryParams = params[params.length - 1];\n\n  if (possibleQueryParams && possibleQueryParams.isQueryParams) {\n    // ensure to handle potentially frozen arrays\n    params = params.slice();\n    params[params.length - 1] = {\n      queryParams: possibleQueryParams.values\n    };\n  }\n\n  return params;\n}\n\nexport { handleQueryParams as default };\n","function trackActiveRoute(router) {\n  // ensure we recompute anytime `router.currentURL` changes\n  router.currentURL; // ensure we recompute whenever the `router.currentRouteName` changes\n  // this is slightly overlapping with router.currentURL but there are\n  // cases where route.currentURL doesn't change but the\n  // router.currentRouteName has (e.g. loading and error states)\n\n  router.currentRouteName;\n}\n\nexport { trackActiveRoute as default };\n","import { set as emberSet } from '@ember/object';\nimport { assert } from '@ember/debug';\n\nexport default function set<T extends object, K extends keyof T & string>(\n  target: T,\n  path: K,\n  maybeValue?: T[K],\n) {\n  assert(\n    'you must pass a path to {{set}}. You can pass a path statically, as in `{{set this \"foo\"}}`, or with the path dynamically, as in `{{set this this.greetingPath \"Hello\"}}`',\n    (typeof path === 'string' && path.length > 0) ||\n      typeof path === 'symbol' ||\n      typeof path === 'number',\n  );\n  return arguments.length === 3\n    ? () => emberSet(target, path, maybeValue as T[K])\n    : (value?: unknown) => emberSet(target, path, value as T[K]);\n}\n","import Modifier from 'ember-modifier';\nimport { dasherize } from '@ember/string';\nimport { assert } from '@ember/debug';\nimport { typeOf } from '@ember/utils';\nimport type * as CSS from 'csstype';\n\n// Cannot be typed as `Partial<CSSStyleDeclaration>` because `CSSStyleDeclaration`\n// interface does _not_ included dashed CSS property names. It only includes the\n// camelCase version of a CSS property.\n// https://github.com/microsoft/TypeScript-DOM-lib-generator/issues/1672\ntype CSSStyles =\n  | Partial<CSS.Properties>\n  | Partial<CSS.PropertiesHyphen>\n  | { readonly [key: `--${string}`]: string };\n\nfunction isObject(o: unknown): boolean {\n  return typeof o === 'object' && Boolean(o);\n}\n\n/**\n * Returns a two-dimensional array, like:\n *\n * ```js\n * [\n *   ['font-size', '16px'],\n *   ['text-align', 'center'],\n *   ['color', 'red']\n * ]\n * ```\n *\n * This data structure is slightly faster to process than an object / dictionary.\n */\nfunction compileStyles(\n  positional: CSSStyles[],\n  named: CSSStyles,\n): [string, string][] {\n  return [...positional.filter(isObject), named]\n    .map((obj) =>\n      Object.entries(obj).map(\n        ([k, v]) => [dasherize(k), v] as [string, string],\n      ),\n    )\n    .flat();\n}\n\nexport interface StyleModifierSignature {\n  Element: Element & ElementCSSInlineStyle;\n  Args: {\n    Positional: CSSStyles[];\n    Named: CSSStyles;\n  };\n}\n\nexport default class StyleModifier extends Modifier<StyleModifierSignature> {\n  existingStyles: Set<string> = new Set();\n\n  setStyles(\n    element: StyleModifierSignature['Element'],\n    newStyles: [string, string][],\n  ) {\n    const { existingStyles } = this;\n    const rulesToRemove: Set<string> = new Set(existingStyles);\n\n    // clear cache of existing styles\n    existingStyles.clear();\n\n    newStyles.forEach(([property, value]) => {\n      assert(\n        `Your given value for property '${property}' is ${value} (${typeOf(\n          value,\n        )}). ` +\n          'Accepted types are string and undefined. Please change accordingly.',\n        typeof value === 'undefined' || typeOf(value) === 'string',\n      );\n\n      // priority must be specified as separate argument\n      // value must not contain \"!important\"\n      let priority = '';\n      if (value && value.includes('!important')) {\n        priority = 'important';\n        value = value.replace('!important', '');\n      }\n\n      // update CSSOM\n      element.style.setProperty(property, value, priority);\n\n      // should not remove rules that have been updated in this cycle\n      rulesToRemove.delete(property);\n\n      // cache styles that have been set for potential clean-up when argument changes\n      existingStyles.add(property);\n    });\n\n    // remove rules that were present in last cycle but aren't present in this one\n    rulesToRemove.forEach((rule) => element.style.removeProperty(rule));\n  }\n\n  modify(\n    element: StyleModifierSignature['Element'],\n    positional: [CSSStyles] | [],\n    named: CSSStyles,\n  ) {\n    this.setStyles(element, compileStyles(positional, named));\n  }\n}\n","import Helper from '@ember/component/helper';\nimport truthConvert, {\n  MaybeTruthy,\n  TruthConvert,\n} from '../utils/truth-convert.ts';\n\ntype FirstFalsy<T> = T extends [infer Item]\n  ? Item\n  : T extends [infer Head, ...infer Tail]\n  ? TruthConvert<Head> extends false\n    ? Head\n    : TruthConvert<Head> extends true\n    ? FirstFalsy<Tail>\n    : Head | FirstFalsy<Tail>\n  : undefined;\n\ninterface AndSignature<T extends MaybeTruthy[]> {\n  Args: {\n    Positional: T;\n  };\n  Return: FirstFalsy<T>;\n}\n\n// We use class-based helper to ensure arguments are lazy-evaluated\n// and helper short-circuits like native JavaScript `&&` (logical AND).\nexport default class AndHelper<const T extends MaybeTruthy[]> extends Helper<\n  AndSignature<T>\n> {\n  public compute(params: T): FirstFalsy<T>;\n  public compute(params: T) {\n    for (let i = 0, len = params.length; i < len; i++) {\n      if (truthConvert(params[i]) === false) {\n        return params[i];\n      }\n    }\n    return params[params.length - 1];\n  }\n}\n","export default function eq(left: unknown, right: unknown): boolean {\n  return left === right;\n}\n","export default function gt(\n  left: unknown,\n  right: unknown,\n  options?: { forceNumber?: boolean }\n) {\n  if (options?.forceNumber) {\n    if (typeof left !== 'number') {\n      left = Number(left);\n    }\n    if (typeof right !== 'number') {\n      right = Number(right);\n    }\n  }\n  return (left as number) > (right as number);\n}\n","export default function gte(\n  left: unknown,\n  right: unknown,\n  options?: { forceNumber?: boolean }\n) {\n  if (options?.forceNumber) {\n    if (typeof left !== 'number') {\n      left = Number(left);\n    }\n    if (typeof right !== 'number') {\n      right = Number(right);\n    }\n  }\n  return (left as number) >= (right as number);\n}\n","import { isArray as isEmberArray } from '@ember/array';\n\nexport default function isArray(...params: unknown[]) {\n  return params.every(isEmberArray);\n}\n","export default function lt(\n  left: unknown,\n  right: unknown,\n  options?: { forceNumber?: boolean }\n) {\n  if (options?.forceNumber) {\n    if (typeof left !== 'number') {\n      left = Number(left);\n    }\n    if (typeof right !== 'number') {\n      right = Number(right);\n    }\n  }\n  return (left as number) < (right as number);\n}\n","export default function lte(\n  left: unknown,\n  right: unknown,\n  options?: { forceNumber?: boolean }\n) {\n  if (options?.forceNumber) {\n    if (typeof left !== 'number') {\n      left = Number(left);\n    }\n    if (typeof right !== 'number') {\n      right = Number(right);\n    }\n  }\n  return (left as number) <= (right as number);\n}\n","export default function notEq(left: unknown, right: unknown) {\n  return left !== right;\n}\n","import truthConvert, { MaybeTruthy } from '../utils/truth-convert.ts';\n\nexport default function not(...params: MaybeTruthy[]) {\n  return params.every((param) => !truthConvert(param));\n}\n","import truthConvert, {\n  Falsy,\n  MaybeTruthy,\n  TruthConvert,\n} from '../utils/truth-convert.ts';\nimport Helper from '@ember/component/helper';\n\ntype FirstTruthy<T> = T extends [infer Item]\n  ? Item\n  : T extends [infer Head, ...infer Tail]\n  ? TruthConvert<Head> extends true\n    ? Head\n    : TruthConvert<Head> extends false\n    ? FirstTruthy<Tail>\n    : Exclude<Head, Falsy> | FirstTruthy<Tail>\n  : undefined;\n\ninterface OrSignature<T extends MaybeTruthy[]> {\n  Args: {\n    Positional: T;\n  };\n  Return: FirstTruthy<T>;\n}\n\n// We use class-based helper to ensure arguments are lazy-evaluated\n// and helper short-circuits like native JavaScript `||` (logical OR).\nexport default class OrHelper<T extends MaybeTruthy[]> extends Helper<\n  OrSignature<T>\n> {\n  public compute(params: T): FirstTruthy<T>;\n  public compute(params: T) {\n    for (let i = 0, len = params.length; i < len; i++) {\n      if (truthConvert(params[i]) === true) {\n        return params[i];\n      }\n    }\n    return params[params.length - 1];\n  }\n}\n","import truthConvert from '../utils/truth-convert.ts';\n\nexport default function xor(left: unknown, right: unknown) {\n  return truthConvert(left) !== truthConvert(right);\n}\n","import { isArray } from '@ember/array';\n\nexport type Falsy =\n  | { isTruthy: false }\n  | undefined\n  | null\n  | false\n  | 0\n  | -0\n  | 0n\n  | ''\n  | never[];\n\n// We check here in the order of the following function to maintain parity\n// Note that this will not handle EmberArray correctly.\n// We don't use Falsy since we want to be able to more definitively determine\n// truthy results.\nexport type TruthConvert<T> = T extends { isTruthy: true }\n  ? true\n  : T extends { isTruthy: false }\n  ? false\n  : T extends { isTruthy: boolean }\n  ? boolean\n  : T extends undefined | null\n  ? false\n  : T extends boolean\n  ? T\n  : T extends number\n  ? T extends 0 | -0\n    ? false\n    : number extends T\n    ? boolean\n    : true\n  : T extends bigint\n  ? T extends 0n\n    ? false\n    : bigint extends T\n    ? boolean\n    : true\n  : T extends string\n  ? T extends ''\n    ? false\n    : string extends T\n    ? boolean\n    : true\n  : T extends never[]\n  ? false\n  : T extends ArrayLike<unknown>\n  ? boolean\n  : T extends object\n  ? true\n  : boolean;\n\nexport type MaybeTruthy =\n  | { isTruthy: boolean }\n  | undefined\n  | null\n  | boolean\n  | number\n  | bigint\n  | string\n  | unknown[]\n  | object;\n\n// We also have to do individual overloads for each specific type so that we\n// don't lose specificity.\nexport default function truthConvert<T extends true | { isTruthy: true }>(\n  result: T\n): true;\nexport default function truthConvert<T extends { isTruthy: false }>(\n  result: T\n): false;\nexport default function truthConvert<T extends undefined | null | false>(\n  result: T\n): false;\nexport default function truthConvert<T extends number>(\n  result: T\n): T extends 0 | -0 ? false : true;\nexport default function truthConvert<T extends bigint>(\n  result: T\n): T extends 0n ? false : true;\nexport default function truthConvert<T extends string>(\n  result: T\n): T extends '' ? false : true;\nexport default function truthConvert<T>(result: T): TruthConvert<T>;\nexport default function truthConvert(result: unknown): boolean {\n  if (\n    typeof result === 'object' &&\n    result &&\n    'isTruthy' in result &&\n    typeof result.isTruthy === 'boolean'\n  ) {\n    return result.isTruthy;\n  }\n\n  if (isArray(result)) {\n    return result.length !== 0;\n  } else {\n    return !!result;\n  }\n}\n","'use strict';\n\nvar isArray = Array.isArray;\nvar keyList = Object.keys;\nvar hasProp = Object.prototype.hasOwnProperty;\n\nmodule.exports = function equal(a, b) {\n  if (a === b) return true;\n\n  if (a && b && typeof a == 'object' && typeof b == 'object') {\n    var arrA = isArray(a)\n      , arrB = isArray(b)\n      , i\n      , length\n      , key;\n\n    if (arrA && arrB) {\n      length = a.length;\n      if (length != b.length) return false;\n      for (i = length; i-- !== 0;)\n        if (!equal(a[i], b[i])) return false;\n      return true;\n    }\n\n    if (arrA != arrB) return false;\n\n    var dateA = a instanceof Date\n      , dateB = b instanceof Date;\n    if (dateA != dateB) return false;\n    if (dateA && dateB) return a.getTime() == b.getTime();\n\n    var regexpA = a instanceof RegExp\n      , regexpB = b instanceof RegExp;\n    if (regexpA != regexpB) return false;\n    if (regexpA && regexpB) return a.toString() == b.toString();\n\n    var keys = keyList(a);\n    length = keys.length;\n\n    if (length !== keyList(b).length)\n      return false;\n\n    for (i = length; i-- !== 0;)\n      if (!hasProp.call(b, keys[i])) return false;\n\n    for (i = length; i-- !== 0;) {\n      key = keys[i];\n      if (!equal(a[key], b[key])) return false;\n    }\n\n    return true;\n  }\n\n  return a!==a && b!==b;\n};\n","// fix by importing IOptions\nexport interface IOptions {\n  [key: string]: any;\n}\n\nexport default class Registry {\n  public registry: WeakMap<HTMLElement | Window, IOptions>;\n\n  constructor() {\n    this.registry = new WeakMap();\n  }\n\n  public elementExists(elem: HTMLElement | Window): boolean | null {\n    return this.registry.has(elem);\n  }\n\n  public getElement(elem: HTMLElement | Window): any {\n    return this.registry.get(elem);\n  }\n\n  /**\n   * administrator for lookup in the future\n   *\n   * @method add\n   * @param {HTMLElement | Window} element - the item to add to root element registry\n   * @param {IOption} options\n   * @param {IOption.root} [root] - contains optional root e.g. window, container div, etc\n   * @param {IOption.watcher} [observer] - optional\n   * @public\n   */\n  public addElement(element: HTMLElement | Window, options?: IOptions): void {\n    if (!element) {\n      return;\n    }\n\n    this.registry.set(element, options || {});\n  }\n\n  /**\n   * @method remove\n   * @param {HTMLElement|Window} target\n   * @public\n   */\n  public removeElement(target: HTMLElement | Window): void {\n    this.registry.delete(target);\n  }\n\n  /**\n   * reset weak map\n   *\n   * @method destroy\n   * @public\n   */\n  public destroyRegistry(): void {\n    this.registry = new WeakMap();\n  }\n}\n","import Registry from './registry';\n\nconst noop = () => {};\n\nexport enum CallbackType {\n  enter = 'enter',\n  exit = 'exit'\n}\n\nexport default abstract class Notifications {\n  private registry: Registry;\n\n  constructor() {\n    this.registry = new Registry();\n  }\n\n  /**\n   * Adds an EventListener as a callback for an event key.\n   * @param type 'enter' or 'exit'\n   * @param key The key of the event\n   * @param callback The callback function to invoke when the event occurs\n   */\n  public addCallback(\n    type: CallbackType,\n    element: HTMLElement | Window,\n    callback: (data?: any) => void\n  ): void {\n    let entry;\n    if (type === CallbackType.enter) {\n      entry = { [CallbackType.enter]: callback };\n    } else {\n      entry = { [CallbackType.exit]: callback };\n    }\n\n    this.registry.addElement(\n      element,\n      Object.assign({}, this.registry.getElement(element), entry)\n    );\n  }\n\n  public removeElementNotification(element: HTMLElement | Window) {\n    this.registry.removeElement(element);\n  }\n\n  public elementNotificationExists(element: HTMLElement | Window): boolean {\n    return Boolean(this.registry.elementExists(element));\n  }\n\n  /**\n   * @hidden\n   * Executes registered callbacks for key.\n   * @param type\n   * @param element\n   * @param data\n   */\n  public dispatchCallback(\n    type: CallbackType,\n    element: HTMLElement | Window,\n    data?: any\n  ): void {\n    if (type === CallbackType.enter) {\n      const { enter = noop } = this.registry.getElement(element);\n      enter(data);\n    } else {\n      // no element in WeakMap possible because element may be removed from DOM by the time we get here\n      const found = this.registry.getElement(element);\n      if (found && found.exit) {\n        found.exit(data);\n      }\n    }\n  }\n}\n","import Notifications, { CallbackType } from './notification';\nimport Registry from './registry';\n\nexport interface IOptions {\n  root?: HTMLElement;\n  rootMargin?: string;\n  threshold?: number | number[];\n  [key: string]: any;\n}\n\ntype StateForRoot = {\n  elements: HTMLElement[];\n  options: IOptions;\n  intersectionObserver: any;\n};\n\ntype PotentialRootEntry = {\n  [stringifiedOptions: string]: StateForRoot;\n};\n\nexport default class IntersectionObserverAdmin extends Notifications {\n  private elementRegistry: Registry;\n\n  constructor() {\n    super();\n    this.elementRegistry = new Registry();\n  }\n\n  /**\n   * Adds element to observe via IntersectionObserver and stores element + relevant callbacks and observer options in static\n   * administrator for lookup in the future\n   *\n   * @method observe\n   * @param {HTMLElement | Window} element\n   * @param {Object} options\n   * @public\n   */\n  public observe(element: HTMLElement, options: IOptions = {}): void {\n    if (!element) {\n      return;\n    }\n\n    this.elementRegistry.addElement(element, { ...options });\n\n    this.setupObserver(element, { ...options });\n  }\n\n  /**\n   * Unobserve target element and remove element from static admin\n   *\n   * @method unobserve\n   * @param {HTMLElement|Window} target\n   * @param {Object} options\n   * @public\n   */\n  public unobserve(target: HTMLElement, options: IOptions): void {\n    const matchingRootEntry:\n      | StateForRoot\n      | undefined = this.findMatchingRootEntry(options);\n\n    if (matchingRootEntry) {\n      this.clearRootEntry(target, matchingRootEntry);\n    } else {\n      this.removeElement(target);\n      this.clearDefaultRoot(target);\n    }\n  }\n\n  /**\n   * register event to handle when intersection observer detects enter\n   *\n   * @method addEnterCallback\n   * @public\n   */\n  public addEnterCallback(\n    element: HTMLElement | Window,\n    callback: (data?: any) => void\n  ) {\n    this.addCallback(CallbackType.enter, element, callback);\n  }\n\n  /**\n   * register event to handle when intersection observer detects exit\n   *\n   * @method addExitCallback\n   * @public\n   */\n  public addExitCallback(\n    element: HTMLElement | Window,\n    callback: (data?: any) => void\n  ) {\n    this.addCallback(CallbackType.exit, element, callback);\n  }\n\n  /**\n   * retrieve registered callback and call with data\n   *\n   * @method dispatchEnterCallback\n   * @public\n   */\n  public dispatchEnterCallback(element: HTMLElement | Window, entry: any) {\n    this.dispatchCallback(CallbackType.enter, element, entry);\n  }\n\n  /**\n   * retrieve registered callback and call with data on exit\n   *\n   * @method dispatchExitCallback\n   * @public\n   */\n  public dispatchExitCallback(element: HTMLElement | Window, entry: any) {\n    this.dispatchCallback(CallbackType.exit, element, entry);\n  }\n\n  /**\n   * cleanup data structures and unobserve elements\n   *\n   * @method destroy\n   * @public\n   */\n  public destroy(): void {\n    this.elementRegistry.destroyRegistry();\n  }\n\n  /**\n   * cleanup removes provided elements from both registries\n   *\n   * @method removeElement\n   * @public\n   *\n   */\n  public removeElement(element: HTMLElement | Window): void {\n    this.removeElementNotification(element);\n    this.elementRegistry.removeElement(element);\n  }\n\n  /**\n   * checks whether element exists in either registry\n   *\n   * @method elementExists\n   * @public\n   *\n   */\n  public elementExists(element: HTMLElement | Window): boolean {\n    return Boolean(\n      this.elementNotificationExists(element) ||\n        this.elementRegistry.elementExists(element)\n    );\n  }\n\n  /**\n   * use function composition to curry options\n   *\n   * @method setupOnIntersection\n   * @param {Object} options\n   */\n  protected setupOnIntersection(options: IOptions): Function {\n    return (ioEntries: any) => {\n      return this.onIntersection(options, ioEntries);\n    };\n  }\n\n  protected setupObserver(element: HTMLElement, options: IOptions): void {\n    const { root = window } = options;\n\n    // First - find shared root element (window or target HTMLElement)\n    // this root is responsible for coordinating it's set of elements\n    const potentialRootMatch:\n      | PotentialRootEntry\n      | null\n      | undefined = this.findRootFromRegistry(root);\n\n    // Second - if there is a matching root, see if an existing entry with the same options\n    // regardless of sort order. This is a bit of work\n    let matchingEntryForRoot;\n    if (potentialRootMatch) {\n      matchingEntryForRoot = this.determineMatchingElements(\n        options,\n        potentialRootMatch\n      );\n    }\n\n    // next add found entry to elements and call observer if applicable\n    if (matchingEntryForRoot) {\n      const { elements, intersectionObserver } = matchingEntryForRoot;\n      elements.push(element);\n      if (intersectionObserver) {\n        intersectionObserver.observe(element);\n      }\n    } else {\n      // otherwise start observing this element if applicable\n      // watcher is an instance that has an observe method\n      const intersectionObserver = this.newObserver(element, options);\n\n      const observerEntry: StateForRoot = {\n        elements: [element],\n        intersectionObserver,\n        options\n      };\n\n      // and add entry to WeakMap under a root element\n      // with watcher so we can use it later on\n      const stringifiedOptions: string = this.stringifyOptions(options);\n      if (potentialRootMatch) {\n        // if share same root and need to add new entry to root match\n        // not functional but :shrug\n        potentialRootMatch[stringifiedOptions] = observerEntry;\n      } else if (!this.elementRegistry.elementExists(root)) {\n        // no root exists, so add to WeakMap\n        this.elementRegistry.addElement(root, {\n          [stringifiedOptions]: observerEntry\n        });\n      }\n    }\n  }\n\n  private newObserver(\n    element: HTMLElement,\n    options: IOptions\n  ): IntersectionObserver {\n    // No matching entry for root in static admin, thus create new IntersectionObserver instance\n    const { root, rootMargin, threshold } = options;\n\n    const newIO = new IntersectionObserver(\n      this.setupOnIntersection(options).bind(this),\n      { root, rootMargin, threshold }\n    );\n    newIO.observe(element);\n\n    return newIO;\n  }\n\n  /**\n   * IntersectionObserver callback when element is intersecting viewport\n   * either when `isIntersecting` changes or `intersectionRadio` crosses on of the\n   * configured `threshold`s.\n   * Exit callback occurs eagerly (when element is initially out of scope)\n   * See https://stackoverflow.com/questions/53214116/intersectionobserver-callback-firing-immediately-on-page-load/53385264#53385264\n   *\n   * @method onIntersection\n   * @param {Object} options\n   * @param {Array} ioEntries\n   * @private\n   */\n  private onIntersection(options: IOptions, ioEntries: Array<any>): void {\n    ioEntries.forEach(entry => {\n      const { isIntersecting, intersectionRatio } = entry;\n      let threshold = options.threshold || 0;\n      if (Array.isArray(threshold)) {\n        threshold = threshold[threshold.length - 1];\n      }\n\n      // then find entry's callback in static administration\n      const matchingRootEntry:\n        | StateForRoot\n        | undefined = this.findMatchingRootEntry(options);\n\n      // first determine if entry intersecting\n      if (isIntersecting || intersectionRatio > threshold) {\n        if (matchingRootEntry) {\n          matchingRootEntry.elements.some((element: HTMLElement) => {\n            if (element && element === entry.target) {\n              this.dispatchEnterCallback(element, entry);\n              return true;\n            }\n            return false;\n          });\n        }\n      } else {\n        if (matchingRootEntry) {\n          matchingRootEntry.elements.some((element: HTMLElement) => {\n            if (element && element === entry.target) {\n              this.dispatchExitCallback(element, entry);\n              return true;\n            }\n            return false;\n          });\n        }\n      }\n    });\n  }\n\n  /**\n   * { root: { stringifiedOptions: { observer, elements: []...] } }\n   * @method findRootFromRegistry\n   * @param {HTMLElement|Window} root\n   * @private\n   * @return {Object} of elements that share same root\n   */\n  private findRootFromRegistry(\n    root: HTMLElement | Window\n  ): PotentialRootEntry | null | undefined {\n    if (this.elementRegistry) {\n      return this.elementRegistry.getElement(root);\n    }\n  }\n\n  /**\n   * We don't care about options key order because we already added\n   * to the static administrator\n   *\n   * @method findMatchingRootEntry\n   * @param {Object} options\n   * @return {Object} entry with elements and other options\n   */\n  private findMatchingRootEntry(options: IOptions): StateForRoot | undefined {\n    const { root = window } = options;\n    const matchingRoot:\n      | PotentialRootEntry\n      | null\n      | undefined = this.findRootFromRegistry(root);\n\n    if (matchingRoot) {\n      const stringifiedOptions: string = this.stringifyOptions(options);\n      return matchingRoot[stringifiedOptions];\n    }\n  }\n\n  /**\n   * Determine if existing elements for a given root based on passed in options\n   * regardless of sort order of keys\n   *\n   * @method determineMatchingElements\n   * @param {Object} options\n   * @param {Object} potentialRootMatch e.g. { stringifiedOptions: { elements: [], ... }, stringifiedOptions: { elements: [], ... }}\n   * @private\n   * @return {Object} containing array of elements and other meta\n   */\n  private determineMatchingElements(\n    options: IOptions,\n    potentialRootMatch: PotentialRootEntry\n  ): StateForRoot | undefined {\n    const matchingStringifiedOptions = Object.keys(potentialRootMatch).filter(\n      key => {\n        const { options: comparableOptions } = potentialRootMatch[key];\n        return this.areOptionsSame(options, comparableOptions);\n      }\n    )[0];\n\n    return potentialRootMatch[matchingStringifiedOptions];\n  }\n\n  /**\n   * recursive method to test primitive string, number, null, etc and complex\n   * object equality.\n   *\n   * @method areOptionsSame\n   * @param {any} a\n   * @param {any} b\n   * @private\n   * @return {boolean}\n   */\n  private areOptionsSame(a: IOptions | any, b: IOptions | any): boolean {\n    if (a === b) {\n      return true;\n    }\n\n    // simple comparison\n    const type1 = Object.prototype.toString.call(a);\n    const type2 = Object.prototype.toString.call(b);\n    if (type1 !== type2) {\n      return false;\n    } else if (type1 !== '[object Object]' && type2 !== '[object Object]') {\n      return a === b;\n    }\n\n    if (a && b && typeof a === 'object' && typeof b === 'object') {\n      // complex comparison for only type of [object Object]\n      for (const key in a) {\n        if (Object.prototype.hasOwnProperty.call(a, key)) {\n          // recursion to check nested\n          if (this.areOptionsSame(a[key], b[key]) === false) {\n            return false;\n          }\n        }\n      }\n    }\n\n    // if nothing failed\n    return true;\n  }\n\n  /**\n   * Stringify options for use as a key.\n   * Excludes options.root so that the resulting key is stable\n   *\n   * @param {Object} options\n   * @private\n   * @return {String}\n   */\n  private stringifyOptions(options: IOptions): string {\n    const { root } = options;\n\n    const replacer = (key: string, value: string): string => {\n      if (key === 'root' && root) {\n        const classList = Array.prototype.slice.call(root.classList);\n\n        const classToken = classList.reduce((acc, item) => {\n          return (acc += item);\n        }, '');\n\n        const id: string = root.id;\n\n        return `${id}-${classToken}`;\n      }\n\n      return value;\n    };\n\n    return JSON.stringify(options, replacer);\n  }\n\n  private clearRootEntry(target: HTMLElement, rootState: StateForRoot) {\n    const { intersectionObserver } = rootState;\n    intersectionObserver.unobserve(target);\n\n    if (rootState.elements) {\n      rootState.elements = rootState.elements.filter(\n        (el: any) => el !== target\n      );\n    }\n    this.removeElement(target);\n    this.clearDefaultRoot(target);\n  }\n\n  private clearDefaultRoot(target: HTMLElement) {\n    const windowRoot = this.elementRegistry.getElement(window);\n    if (windowRoot && windowRoot.elements) {\n      windowRoot.elements = windowRoot.elements.filter(\n        (el: any) => el !== target\n      );\n    }\n  }\n}\n","/*! js-cookie v3.0.5 | MIT */\n;\n(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n  typeof define === 'function' && define.amd ? define(factory) :\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () {\n    var current = global.Cookies;\n    var exports = global.Cookies = factory();\n    exports.noConflict = function () { global.Cookies = current; return exports; };\n  })());\n})(this, (function () { 'use strict';\n\n  /* eslint-disable no-var */\n  function assign (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n      for (var key in source) {\n        target[key] = source[key];\n      }\n    }\n    return target\n  }\n  /* eslint-enable no-var */\n\n  /* eslint-disable no-var */\n  var defaultConverter = {\n    read: function (value) {\n      if (value[0] === '\"') {\n        value = value.slice(1, -1);\n      }\n      return value.replace(/(%[\\dA-F]{2})+/gi, decodeURIComponent)\n    },\n    write: function (value) {\n      return encodeURIComponent(value).replace(\n        /%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g,\n        decodeURIComponent\n      )\n    }\n  };\n  /* eslint-enable no-var */\n\n  /* eslint-disable no-var */\n\n  function init (converter, defaultAttributes) {\n    function set (name, value, attributes) {\n      if (typeof document === 'undefined') {\n        return\n      }\n\n      attributes = assign({}, defaultAttributes, attributes);\n\n      if (typeof attributes.expires === 'number') {\n        attributes.expires = new Date(Date.now() + attributes.expires * 864e5);\n      }\n      if (attributes.expires) {\n        attributes.expires = attributes.expires.toUTCString();\n      }\n\n      name = encodeURIComponent(name)\n        .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)\n        .replace(/[()]/g, escape);\n\n      var stringifiedAttributes = '';\n      for (var attributeName in attributes) {\n        if (!attributes[attributeName]) {\n          continue\n        }\n\n        stringifiedAttributes += '; ' + attributeName;\n\n        if (attributes[attributeName] === true) {\n          continue\n        }\n\n        // Considers RFC 6265 section 5.2:\n        // ...\n        // 3.  If the remaining unparsed-attributes contains a %x3B (\";\")\n        //     character:\n        // Consume the characters of the unparsed-attributes up to,\n        // not including, the first %x3B (\";\") character.\n        // ...\n        stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n      }\n\n      return (document.cookie =\n        name + '=' + converter.write(value, name) + stringifiedAttributes)\n    }\n\n    function get (name) {\n      if (typeof document === 'undefined' || (arguments.length && !name)) {\n        return\n      }\n\n      // To prevent the for loop in the first place assign an empty array\n      // in case there are no cookies at all.\n      var cookies = document.cookie ? document.cookie.split('; ') : [];\n      var jar = {};\n      for (var i = 0; i < cookies.length; i++) {\n        var parts = cookies[i].split('=');\n        var value = parts.slice(1).join('=');\n\n        try {\n          var found = decodeURIComponent(parts[0]);\n          jar[found] = converter.read(value, found);\n\n          if (name === found) {\n            break\n          }\n        } catch (e) {}\n      }\n\n      return name ? jar[name] : jar\n    }\n\n    return Object.create(\n      {\n        set,\n        get,\n        remove: function (name, attributes) {\n          set(\n            name,\n            '',\n            assign({}, attributes, {\n              expires: -1\n            })\n          );\n        },\n        withAttributes: function (attributes) {\n          return init(this.converter, assign({}, this.attributes, attributes))\n        },\n        withConverter: function (converter) {\n          return init(assign({}, this.converter, converter), this.attributes)\n        }\n      },\n      {\n        attributes: { value: Object.freeze(defaultAttributes) },\n        converter: { value: Object.freeze(converter) }\n      }\n    )\n  }\n\n  var api = init(defaultConverter, { path: '/' });\n  /* eslint-enable no-var */\n\n  return api;\n\n}));\n","/**\n * [js-sha256]{@link https://github.com/emn178/js-sha256}\n *\n * @version 0.9.0\n * @author Chen, Yi-Cyuan [emn178@gmail.com]\n * @copyright Chen, Yi-Cyuan 2014-2017\n * @license MIT\n */\n/*jslint bitwise: true */\n(function () {\n  'use strict';\n\n  var ERROR = 'input is invalid type';\n  var WINDOW = typeof window === 'object';\n  var root = WINDOW ? window : {};\n  if (root.JS_SHA256_NO_WINDOW) {\n    WINDOW = false;\n  }\n  var WEB_WORKER = !WINDOW && typeof self === 'object';\n  var NODE_JS = !root.JS_SHA256_NO_NODE_JS && typeof process === 'object' && process.versions && process.versions.node;\n  if (NODE_JS) {\n    root = global;\n  } else if (WEB_WORKER) {\n    root = self;\n  }\n  var COMMON_JS = !root.JS_SHA256_NO_COMMON_JS && typeof module === 'object' && module.exports;\n  var AMD = typeof define === 'function' && define.amd;\n  var ARRAY_BUFFER = !root.JS_SHA256_NO_ARRAY_BUFFER && typeof ArrayBuffer !== 'undefined';\n  var HEX_CHARS = '0123456789abcdef'.split('');\n  var EXTRA = [-2147483648, 8388608, 32768, 128];\n  var SHIFT = [24, 16, 8, 0];\n  var K = [\n    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n  ];\n  var OUTPUT_TYPES = ['hex', 'array', 'digest', 'arrayBuffer'];\n\n  var blocks = [];\n\n  if (root.JS_SHA256_NO_NODE_JS || !Array.isArray) {\n    Array.isArray = function (obj) {\n      return Object.prototype.toString.call(obj) === '[object Array]';\n    };\n  }\n\n  if (ARRAY_BUFFER && (root.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW || !ArrayBuffer.isView)) {\n    ArrayBuffer.isView = function (obj) {\n      return typeof obj === 'object' && obj.buffer && obj.buffer.constructor === ArrayBuffer;\n    };\n  }\n\n  var createOutputMethod = function (outputType, is224) {\n    return function (message) {\n      return new Sha256(is224, true).update(message)[outputType]();\n    };\n  };\n\n  var createMethod = function (is224) {\n    var method = createOutputMethod('hex', is224);\n    if (NODE_JS) {\n      method = nodeWrap(method, is224);\n    }\n    method.create = function () {\n      return new Sha256(is224);\n    };\n    method.update = function (message) {\n      return method.create().update(message);\n    };\n    for (var i = 0; i < OUTPUT_TYPES.length; ++i) {\n      var type = OUTPUT_TYPES[i];\n      method[type] = createOutputMethod(type, is224);\n    }\n    return method;\n  };\n\n  var nodeWrap = function (method, is224) {\n    var crypto = eval(\"require('crypto')\");\n    var Buffer = eval(\"require('buffer').Buffer\");\n    var algorithm = is224 ? 'sha224' : 'sha256';\n    var nodeMethod = function (message) {\n      if (typeof message === 'string') {\n        return crypto.createHash(algorithm).update(message, 'utf8').digest('hex');\n      } else {\n        if (message === null || message === undefined) {\n          throw new Error(ERROR);\n        } else if (message.constructor === ArrayBuffer) {\n          message = new Uint8Array(message);\n        }\n      }\n      if (Array.isArray(message) || ArrayBuffer.isView(message) ||\n        message.constructor === Buffer) {\n        return crypto.createHash(algorithm).update(new Buffer(message)).digest('hex');\n      } else {\n        return method(message);\n      }\n    };\n    return nodeMethod;\n  };\n\n  var createHmacOutputMethod = function (outputType, is224) {\n    return function (key, message) {\n      return new HmacSha256(key, is224, true).update(message)[outputType]();\n    };\n  };\n\n  var createHmacMethod = function (is224) {\n    var method = createHmacOutputMethod('hex', is224);\n    method.create = function (key) {\n      return new HmacSha256(key, is224);\n    };\n    method.update = function (key, message) {\n      return method.create(key).update(message);\n    };\n    for (var i = 0; i < OUTPUT_TYPES.length; ++i) {\n      var type = OUTPUT_TYPES[i];\n      method[type] = createHmacOutputMethod(type, is224);\n    }\n    return method;\n  };\n\n  function Sha256(is224, sharedMemory) {\n    if (sharedMemory) {\n      blocks[0] = blocks[16] = blocks[1] = blocks[2] = blocks[3] =\n        blocks[4] = blocks[5] = blocks[6] = blocks[7] =\n        blocks[8] = blocks[9] = blocks[10] = blocks[11] =\n        blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;\n      this.blocks = blocks;\n    } else {\n      this.blocks = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];\n    }\n\n    if (is224) {\n      this.h0 = 0xc1059ed8;\n      this.h1 = 0x367cd507;\n      this.h2 = 0x3070dd17;\n      this.h3 = 0xf70e5939;\n      this.h4 = 0xffc00b31;\n      this.h5 = 0x68581511;\n      this.h6 = 0x64f98fa7;\n      this.h7 = 0xbefa4fa4;\n    } else { // 256\n      this.h0 = 0x6a09e667;\n      this.h1 = 0xbb67ae85;\n      this.h2 = 0x3c6ef372;\n      this.h3 = 0xa54ff53a;\n      this.h4 = 0x510e527f;\n      this.h5 = 0x9b05688c;\n      this.h6 = 0x1f83d9ab;\n      this.h7 = 0x5be0cd19;\n    }\n\n    this.block = this.start = this.bytes = this.hBytes = 0;\n    this.finalized = this.hashed = false;\n    this.first = true;\n    this.is224 = is224;\n  }\n\n  Sha256.prototype.update = function (message) {\n    if (this.finalized) {\n      return;\n    }\n    var notString, type = typeof message;\n    if (type !== 'string') {\n      if (type === 'object') {\n        if (message === null) {\n          throw new Error(ERROR);\n        } else if (ARRAY_BUFFER && message.constructor === ArrayBuffer) {\n          message = new Uint8Array(message);\n        } else if (!Array.isArray(message)) {\n          if (!ARRAY_BUFFER || !ArrayBuffer.isView(message)) {\n            throw new Error(ERROR);\n          }\n        }\n      } else {\n        throw new Error(ERROR);\n      }\n      notString = true;\n    }\n    var code, index = 0, i, length = message.length, blocks = this.blocks;\n\n    while (index < length) {\n      if (this.hashed) {\n        this.hashed = false;\n        blocks[0] = this.block;\n        blocks[16] = blocks[1] = blocks[2] = blocks[3] =\n          blocks[4] = blocks[5] = blocks[6] = blocks[7] =\n          blocks[8] = blocks[9] = blocks[10] = blocks[11] =\n          blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;\n      }\n\n      if (notString) {\n        for (i = this.start; index < length && i < 64; ++index) {\n          blocks[i >> 2] |= message[index] << SHIFT[i++ & 3];\n        }\n      } else {\n        for (i = this.start; index < length && i < 64; ++index) {\n          code = message.charCodeAt(index);\n          if (code < 0x80) {\n            blocks[i >> 2] |= code << SHIFT[i++ & 3];\n          } else if (code < 0x800) {\n            blocks[i >> 2] |= (0xc0 | (code >> 6)) << SHIFT[i++ & 3];\n            blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n          } else if (code < 0xd800 || code >= 0xe000) {\n            blocks[i >> 2] |= (0xe0 | (code >> 12)) << SHIFT[i++ & 3];\n            blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];\n            blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n          } else {\n            code = 0x10000 + (((code & 0x3ff) << 10) | (message.charCodeAt(++index) & 0x3ff));\n            blocks[i >> 2] |= (0xf0 | (code >> 18)) << SHIFT[i++ & 3];\n            blocks[i >> 2] |= (0x80 | ((code >> 12) & 0x3f)) << SHIFT[i++ & 3];\n            blocks[i >> 2] |= (0x80 | ((code >> 6) & 0x3f)) << SHIFT[i++ & 3];\n            blocks[i >> 2] |= (0x80 | (code & 0x3f)) << SHIFT[i++ & 3];\n          }\n        }\n      }\n\n      this.lastByteIndex = i;\n      this.bytes += i - this.start;\n      if (i >= 64) {\n        this.block = blocks[16];\n        this.start = i - 64;\n        this.hash();\n        this.hashed = true;\n      } else {\n        this.start = i;\n      }\n    }\n    if (this.bytes > 4294967295) {\n      this.hBytes += this.bytes / 4294967296 << 0;\n      this.bytes = this.bytes % 4294967296;\n    }\n    return this;\n  };\n\n  Sha256.prototype.finalize = function () {\n    if (this.finalized) {\n      return;\n    }\n    this.finalized = true;\n    var blocks = this.blocks, i = this.lastByteIndex;\n    blocks[16] = this.block;\n    blocks[i >> 2] |= EXTRA[i & 3];\n    this.block = blocks[16];\n    if (i >= 56) {\n      if (!this.hashed) {\n        this.hash();\n      }\n      blocks[0] = this.block;\n      blocks[16] = blocks[1] = blocks[2] = blocks[3] =\n        blocks[4] = blocks[5] = blocks[6] = blocks[7] =\n        blocks[8] = blocks[9] = blocks[10] = blocks[11] =\n        blocks[12] = blocks[13] = blocks[14] = blocks[15] = 0;\n    }\n    blocks[14] = this.hBytes << 3 | this.bytes >>> 29;\n    blocks[15] = this.bytes << 3;\n    this.hash();\n  };\n\n  Sha256.prototype.hash = function () {\n    var a = this.h0, b = this.h1, c = this.h2, d = this.h3, e = this.h4, f = this.h5, g = this.h6,\n      h = this.h7, blocks = this.blocks, j, s0, s1, maj, t1, t2, ch, ab, da, cd, bc;\n\n    for (j = 16; j < 64; ++j) {\n      // rightrotate\n      t1 = blocks[j - 15];\n      s0 = ((t1 >>> 7) | (t1 << 25)) ^ ((t1 >>> 18) | (t1 << 14)) ^ (t1 >>> 3);\n      t1 = blocks[j - 2];\n      s1 = ((t1 >>> 17) | (t1 << 15)) ^ ((t1 >>> 19) | (t1 << 13)) ^ (t1 >>> 10);\n      blocks[j] = blocks[j - 16] + s0 + blocks[j - 7] + s1 << 0;\n    }\n\n    bc = b & c;\n    for (j = 0; j < 64; j += 4) {\n      if (this.first) {\n        if (this.is224) {\n          ab = 300032;\n          t1 = blocks[0] - 1413257819;\n          h = t1 - 150054599 << 0;\n          d = t1 + 24177077 << 0;\n        } else {\n          ab = 704751109;\n          t1 = blocks[0] - 210244248;\n          h = t1 - 1521486534 << 0;\n          d = t1 + 143694565 << 0;\n        }\n        this.first = false;\n      } else {\n        s0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^ ((a >>> 22) | (a << 10));\n        s1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^ ((e >>> 25) | (e << 7));\n        ab = a & b;\n        maj = ab ^ (a & c) ^ bc;\n        ch = (e & f) ^ (~e & g);\n        t1 = h + s1 + ch + K[j] + blocks[j];\n        t2 = s0 + maj;\n        h = d + t1 << 0;\n        d = t1 + t2 << 0;\n      }\n      s0 = ((d >>> 2) | (d << 30)) ^ ((d >>> 13) | (d << 19)) ^ ((d >>> 22) | (d << 10));\n      s1 = ((h >>> 6) | (h << 26)) ^ ((h >>> 11) | (h << 21)) ^ ((h >>> 25) | (h << 7));\n      da = d & a;\n      maj = da ^ (d & b) ^ ab;\n      ch = (h & e) ^ (~h & f);\n      t1 = g + s1 + ch + K[j + 1] + blocks[j + 1];\n      t2 = s0 + maj;\n      g = c + t1 << 0;\n      c = t1 + t2 << 0;\n      s0 = ((c >>> 2) | (c << 30)) ^ ((c >>> 13) | (c << 19)) ^ ((c >>> 22) | (c << 10));\n      s1 = ((g >>> 6) | (g << 26)) ^ ((g >>> 11) | (g << 21)) ^ ((g >>> 25) | (g << 7));\n      cd = c & d;\n      maj = cd ^ (c & a) ^ da;\n      ch = (g & h) ^ (~g & e);\n      t1 = f + s1 + ch + K[j + 2] + blocks[j + 2];\n      t2 = s0 + maj;\n      f = b + t1 << 0;\n      b = t1 + t2 << 0;\n      s0 = ((b >>> 2) | (b << 30)) ^ ((b >>> 13) | (b << 19)) ^ ((b >>> 22) | (b << 10));\n      s1 = ((f >>> 6) | (f << 26)) ^ ((f >>> 11) | (f << 21)) ^ ((f >>> 25) | (f << 7));\n      bc = b & c;\n      maj = bc ^ (b & d) ^ cd;\n      ch = (f & g) ^ (~f & h);\n      t1 = e + s1 + ch + K[j + 3] + blocks[j + 3];\n      t2 = s0 + maj;\n      e = a + t1 << 0;\n      a = t1 + t2 << 0;\n    }\n\n    this.h0 = this.h0 + a << 0;\n    this.h1 = this.h1 + b << 0;\n    this.h2 = this.h2 + c << 0;\n    this.h3 = this.h3 + d << 0;\n    this.h4 = this.h4 + e << 0;\n    this.h5 = this.h5 + f << 0;\n    this.h6 = this.h6 + g << 0;\n    this.h7 = this.h7 + h << 0;\n  };\n\n  Sha256.prototype.hex = function () {\n    this.finalize();\n\n    var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,\n      h6 = this.h6, h7 = this.h7;\n\n    var hex = HEX_CHARS[(h0 >> 28) & 0x0F] + HEX_CHARS[(h0 >> 24) & 0x0F] +\n      HEX_CHARS[(h0 >> 20) & 0x0F] + HEX_CHARS[(h0 >> 16) & 0x0F] +\n      HEX_CHARS[(h0 >> 12) & 0x0F] + HEX_CHARS[(h0 >> 8) & 0x0F] +\n      HEX_CHARS[(h0 >> 4) & 0x0F] + HEX_CHARS[h0 & 0x0F] +\n      HEX_CHARS[(h1 >> 28) & 0x0F] + HEX_CHARS[(h1 >> 24) & 0x0F] +\n      HEX_CHARS[(h1 >> 20) & 0x0F] + HEX_CHARS[(h1 >> 16) & 0x0F] +\n      HEX_CHARS[(h1 >> 12) & 0x0F] + HEX_CHARS[(h1 >> 8) & 0x0F] +\n      HEX_CHARS[(h1 >> 4) & 0x0F] + HEX_CHARS[h1 & 0x0F] +\n      HEX_CHARS[(h2 >> 28) & 0x0F] + HEX_CHARS[(h2 >> 24) & 0x0F] +\n      HEX_CHARS[(h2 >> 20) & 0x0F] + HEX_CHARS[(h2 >> 16) & 0x0F] +\n      HEX_CHARS[(h2 >> 12) & 0x0F] + HEX_CHARS[(h2 >> 8) & 0x0F] +\n      HEX_CHARS[(h2 >> 4) & 0x0F] + HEX_CHARS[h2 & 0x0F] +\n      HEX_CHARS[(h3 >> 28) & 0x0F] + HEX_CHARS[(h3 >> 24) & 0x0F] +\n      HEX_CHARS[(h3 >> 20) & 0x0F] + HEX_CHARS[(h3 >> 16) & 0x0F] +\n      HEX_CHARS[(h3 >> 12) & 0x0F] + HEX_CHARS[(h3 >> 8) & 0x0F] +\n      HEX_CHARS[(h3 >> 4) & 0x0F] + HEX_CHARS[h3 & 0x0F] +\n      HEX_CHARS[(h4 >> 28) & 0x0F] + HEX_CHARS[(h4 >> 24) & 0x0F] +\n      HEX_CHARS[(h4 >> 20) & 0x0F] + HEX_CHARS[(h4 >> 16) & 0x0F] +\n      HEX_CHARS[(h4 >> 12) & 0x0F] + HEX_CHARS[(h4 >> 8) & 0x0F] +\n      HEX_CHARS[(h4 >> 4) & 0x0F] + HEX_CHARS[h4 & 0x0F] +\n      HEX_CHARS[(h5 >> 28) & 0x0F] + HEX_CHARS[(h5 >> 24) & 0x0F] +\n      HEX_CHARS[(h5 >> 20) & 0x0F] + HEX_CHARS[(h5 >> 16) & 0x0F] +\n      HEX_CHARS[(h5 >> 12) & 0x0F] + HEX_CHARS[(h5 >> 8) & 0x0F] +\n      HEX_CHARS[(h5 >> 4) & 0x0F] + HEX_CHARS[h5 & 0x0F] +\n      HEX_CHARS[(h6 >> 28) & 0x0F] + HEX_CHARS[(h6 >> 24) & 0x0F] +\n      HEX_CHARS[(h6 >> 20) & 0x0F] + HEX_CHARS[(h6 >> 16) & 0x0F] +\n      HEX_CHARS[(h6 >> 12) & 0x0F] + HEX_CHARS[(h6 >> 8) & 0x0F] +\n      HEX_CHARS[(h6 >> 4) & 0x0F] + HEX_CHARS[h6 & 0x0F];\n    if (!this.is224) {\n      hex += HEX_CHARS[(h7 >> 28) & 0x0F] + HEX_CHARS[(h7 >> 24) & 0x0F] +\n        HEX_CHARS[(h7 >> 20) & 0x0F] + HEX_CHARS[(h7 >> 16) & 0x0F] +\n        HEX_CHARS[(h7 >> 12) & 0x0F] + HEX_CHARS[(h7 >> 8) & 0x0F] +\n        HEX_CHARS[(h7 >> 4) & 0x0F] + HEX_CHARS[h7 & 0x0F];\n    }\n    return hex;\n  };\n\n  Sha256.prototype.toString = Sha256.prototype.hex;\n\n  Sha256.prototype.digest = function () {\n    this.finalize();\n\n    var h0 = this.h0, h1 = this.h1, h2 = this.h2, h3 = this.h3, h4 = this.h4, h5 = this.h5,\n      h6 = this.h6, h7 = this.h7;\n\n    var arr = [\n      (h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, h0 & 0xFF,\n      (h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, h1 & 0xFF,\n      (h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, h2 & 0xFF,\n      (h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, h3 & 0xFF,\n      (h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, h4 & 0xFF,\n      (h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, h5 & 0xFF,\n      (h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, h6 & 0xFF\n    ];\n    if (!this.is224) {\n      arr.push((h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, h7 & 0xFF);\n    }\n    return arr;\n  };\n\n  Sha256.prototype.array = Sha256.prototype.digest;\n\n  Sha256.prototype.arrayBuffer = function () {\n    this.finalize();\n\n    var buffer = new ArrayBuffer(this.is224 ? 28 : 32);\n    var dataView = new DataView(buffer);\n    dataView.setUint32(0, this.h0);\n    dataView.setUint32(4, this.h1);\n    dataView.setUint32(8, this.h2);\n    dataView.setUint32(12, this.h3);\n    dataView.setUint32(16, this.h4);\n    dataView.setUint32(20, this.h5);\n    dataView.setUint32(24, this.h6);\n    if (!this.is224) {\n      dataView.setUint32(28, this.h7);\n    }\n    return buffer;\n  };\n\n  function HmacSha256(key, is224, sharedMemory) {\n    var i, type = typeof key;\n    if (type === 'string') {\n      var bytes = [], length = key.length, index = 0, code;\n      for (i = 0; i < length; ++i) {\n        code = key.charCodeAt(i);\n        if (code < 0x80) {\n          bytes[index++] = code;\n        } else if (code < 0x800) {\n          bytes[index++] = (0xc0 | (code >> 6));\n          bytes[index++] = (0x80 | (code & 0x3f));\n        } else if (code < 0xd800 || code >= 0xe000) {\n          bytes[index++] = (0xe0 | (code >> 12));\n          bytes[index++] = (0x80 | ((code >> 6) & 0x3f));\n          bytes[index++] = (0x80 | (code & 0x3f));\n        } else {\n          code = 0x10000 + (((code & 0x3ff) << 10) | (key.charCodeAt(++i) & 0x3ff));\n          bytes[index++] = (0xf0 | (code >> 18));\n          bytes[index++] = (0x80 | ((code >> 12) & 0x3f));\n          bytes[index++] = (0x80 | ((code >> 6) & 0x3f));\n          bytes[index++] = (0x80 | (code & 0x3f));\n        }\n      }\n      key = bytes;\n    } else {\n      if (type === 'object') {\n        if (key === null) {\n          throw new Error(ERROR);\n        } else if (ARRAY_BUFFER && key.constructor === ArrayBuffer) {\n          key = new Uint8Array(key);\n        } else if (!Array.isArray(key)) {\n          if (!ARRAY_BUFFER || !ArrayBuffer.isView(key)) {\n            throw new Error(ERROR);\n          }\n        }\n      } else {\n        throw new Error(ERROR);\n      }\n    }\n\n    if (key.length > 64) {\n      key = (new Sha256(is224, true)).update(key).array();\n    }\n\n    var oKeyPad = [], iKeyPad = [];\n    for (i = 0; i < 64; ++i) {\n      var b = key[i] || 0;\n      oKeyPad[i] = 0x5c ^ b;\n      iKeyPad[i] = 0x36 ^ b;\n    }\n\n    Sha256.call(this, is224, sharedMemory);\n\n    this.update(iKeyPad);\n    this.oKeyPad = oKeyPad;\n    this.inner = true;\n    this.sharedMemory = sharedMemory;\n  }\n  HmacSha256.prototype = new Sha256();\n\n  HmacSha256.prototype.finalize = function () {\n    Sha256.prototype.finalize.call(this);\n    if (this.inner) {\n      this.inner = false;\n      var innerHash = this.array();\n      Sha256.call(this, this.is224, this.sharedMemory);\n      this.update(this.oKeyPad);\n      this.update(innerHash);\n      Sha256.prototype.finalize.call(this);\n    }\n  };\n\n  var exports = createMethod();\n  exports.sha256 = exports;\n  exports.sha224 = createMethod(true);\n  exports.sha256.hmac = createHmacMethod();\n  exports.sha224.hmac = createHmacMethod(true);\n\n  if (COMMON_JS) {\n    module.exports = exports;\n  } else {\n    root.sha256 = exports.sha256;\n    root.sha224 = exports.sha224;\n    if (AMD) {\n      define(function () {\n        return exports;\n      });\n    }\n  }\n})();\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var hashClear = require('./_hashClear'),\n    hashDelete = require('./_hashDelete'),\n    hashGet = require('./_hashGet'),\n    hashHas = require('./_hashHas'),\n    hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var listCacheClear = require('./_listCacheClear'),\n    listCacheDelete = require('./_listCacheDelete'),\n    listCacheGet = require('./_listCacheGet'),\n    listCacheHas = require('./_listCacheHas'),\n    listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var mapCacheClear = require('./_mapCacheClear'),\n    mapCacheDelete = require('./_mapCacheDelete'),\n    mapCacheGet = require('./_mapCacheGet'),\n    mapCacheHas = require('./_mapCacheHas'),\n    mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var MapCache = require('./_MapCache'),\n    setCacheAdd = require('./_setCacheAdd'),\n    setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","var ListCache = require('./_ListCache'),\n    stackClear = require('./_stackClear'),\n    stackDelete = require('./_stackDelete'),\n    stackGet = require('./_stackGet'),\n    stackHas = require('./_stackHas'),\n    stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n  switch (args.length) {\n    case 0: return func.call(thisArg);\n    case 1: return func.call(thisArg, args[0]);\n    case 2: return func.call(thisArg, args[0], args[1]);\n    case 3: return func.call(thisArg, args[0], args[1], args[2]);\n  }\n  return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\nmodule.exports = arrayEach;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayFilter;\n","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n  var length = array == null ? 0 : array.length;\n  return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (comparator(value, array[index])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","var baseTimes = require('./_baseTimes'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isIndex = require('./_isIndex'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arraySome;\n","/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n  return string.split('');\n}\n\nmodule.exports = asciiToArray;\n","var baseAssignValue = require('./_baseAssignValue'),\n    eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n  var objValue = object[key];\n  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n      (value === undefined && !(key in object))) {\n    baseAssignValue(object, key, value);\n  }\n}\n\nmodule.exports = assignValue;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var copyObject = require('./_copyObject'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n  return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","var copyObject = require('./_copyObject'),\n    keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n  return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n  if (key == '__proto__' && defineProperty) {\n    defineProperty(object, key, {\n      'configurable': true,\n      'enumerable': true,\n      'value': value,\n      'writable': true\n    });\n  } else {\n    object[key] = value;\n  }\n}\n\nmodule.exports = baseAssignValue;\n","var Stack = require('./_Stack'),\n    arrayEach = require('./_arrayEach'),\n    assignValue = require('./_assignValue'),\n    baseAssign = require('./_baseAssign'),\n    baseAssignIn = require('./_baseAssignIn'),\n    cloneBuffer = require('./_cloneBuffer'),\n    copyArray = require('./_copyArray'),\n    copySymbols = require('./_copySymbols'),\n    copySymbolsIn = require('./_copySymbolsIn'),\n    getAllKeys = require('./_getAllKeys'),\n    getAllKeysIn = require('./_getAllKeysIn'),\n    getTag = require('./_getTag'),\n    initCloneArray = require('./_initCloneArray'),\n    initCloneByTag = require('./_initCloneByTag'),\n    initCloneObject = require('./_initCloneObject'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isMap = require('./isMap'),\n    isObject = require('./isObject'),\n    isSet = require('./isSet'),\n    keys = require('./keys'),\n    keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_FLAT_FLAG = 2,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Deep clone\n *  2 - Flatten inherited properties\n *  4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n  var result,\n      isDeep = bitmask & CLONE_DEEP_FLAG,\n      isFlat = bitmask & CLONE_FLAT_FLAG,\n      isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n  if (customizer) {\n    result = object ? customizer(value, key, object, stack) : customizer(value);\n  }\n  if (result !== undefined) {\n    return result;\n  }\n  if (!isObject(value)) {\n    return value;\n  }\n  var isArr = isArray(value);\n  if (isArr) {\n    result = initCloneArray(value);\n    if (!isDeep) {\n      return copyArray(value, result);\n    }\n  } else {\n    var tag = getTag(value),\n        isFunc = tag == funcTag || tag == genTag;\n\n    if (isBuffer(value)) {\n      return cloneBuffer(value, isDeep);\n    }\n    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n      result = (isFlat || isFunc) ? {} : initCloneObject(value);\n      if (!isDeep) {\n        return isFlat\n          ? copySymbolsIn(value, baseAssignIn(result, value))\n          : copySymbols(value, baseAssign(result, value));\n      }\n    } else {\n      if (!cloneableTags[tag]) {\n        return object ? value : {};\n      }\n      result = initCloneByTag(value, tag, isDeep);\n    }\n  }\n  // Check for circular references and return its corresponding clone.\n  stack || (stack = new Stack);\n  var stacked = stack.get(value);\n  if (stacked) {\n    return stacked;\n  }\n  stack.set(value, result);\n\n  if (isSet(value)) {\n    value.forEach(function(subValue) {\n      result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n    });\n  } else if (isMap(value)) {\n    value.forEach(function(subValue, key) {\n      result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n    });\n  }\n\n  var keysFunc = isFull\n    ? (isFlat ? getAllKeysIn : getAllKeys)\n    : (isFlat ? keysIn : keys);\n\n  var props = isArr ? undefined : keysFunc(value);\n  arrayEach(props || value, function(subValue, key) {\n    if (props) {\n      key = subValue;\n      subValue = value[key];\n    }\n    // Recursively populate clone (susceptible to call stack limits).\n    assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n  });\n  return result;\n}\n\nmodule.exports = baseClone;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n  function object() {}\n  return function(proto) {\n    if (!isObject(proto)) {\n      return {};\n    }\n    if (objectCreate) {\n      return objectCreate(proto);\n    }\n    object.prototype = proto;\n    var result = new object;\n    object.prototype = undefined;\n    return result;\n  };\n}());\n\nmodule.exports = baseCreate;\n","var baseForOwn = require('./_baseForOwn'),\n    createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n  var length = array.length,\n      index = fromIndex + (fromRight ? 1 : -1);\n\n  while ((fromRight ? index-- : ++index < length)) {\n    if (predicate(array[index], index, array)) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = baseFindIndex;\n","var arrayPush = require('./_arrayPush'),\n    isFlattenable = require('./_isFlattenable');\n\n/**\n * The base implementation of `_.flatten` with support for restricting flattening.\n *\n * @private\n * @param {Array} array The array to flatten.\n * @param {number} depth The maximum recursion depth.\n * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n * @param {Array} [result=[]] The initial result value.\n * @returns {Array} Returns the new flattened array.\n */\nfunction baseFlatten(array, depth, predicate, isStrict, result) {\n  var index = -1,\n      length = array.length;\n\n  predicate || (predicate = isFlattenable);\n  result || (result = []);\n\n  while (++index < length) {\n    var value = array[index];\n    if (depth > 0 && predicate(value)) {\n      if (depth > 1) {\n        // Recursively flatten arrays (susceptible to call stack limits).\n        baseFlatten(value, depth - 1, predicate, isStrict, result);\n      } else {\n        arrayPush(result, value);\n      }\n    } else if (!isStrict) {\n      result[result.length] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseFlatten;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","var baseFor = require('./_baseFor'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n  return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var castPath = require('./_castPath'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n  path = castPath(path, object);\n\n  var index = 0,\n      length = path.length;\n\n  while (object != null && index < length) {\n    object = object[toKey(path[index++])];\n  }\n  return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var arrayPush = require('./_arrayPush'),\n    isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n  return object != null && hasOwnProperty.call(object, key);\n}\n\nmodule.exports = baseHas;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n  return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var baseFindIndex = require('./_baseFindIndex'),\n    baseIsNaN = require('./_baseIsNaN'),\n    strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n  return value === value\n    ? strictIndexOf(array, value, fromIndex)\n    : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","var apply = require('./_apply'),\n    castPath = require('./_castPath'),\n    last = require('./last'),\n    parent = require('./_parent'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.invoke` without support for individual\n * method arguments.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the method to invoke.\n * @param {Array} args The arguments to invoke the method with.\n * @returns {*} Returns the result of the invoked method.\n */\nfunction baseInvoke(object, path, args) {\n  path = castPath(path, object);\n  object = parent(object, path);\n  var func = object == null ? object : object[toKey(last(path))];\n  return func == null ? undefined : apply(func, object, args);\n}\n\nmodule.exports = baseInvoke;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Unordered comparison\n *  2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var Stack = require('./_Stack'),\n    equalArrays = require('./_equalArrays'),\n    equalByTag = require('./_equalByTag'),\n    equalObjects = require('./_equalObjects'),\n    getTag = require('./_getTag'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = objIsArr ? arrayTag : getTag(object),\n      othTag = othIsArr ? arrayTag : getTag(other);\n\n  objTag = objTag == argsTag ? objectTag : objTag;\n  othTag = othTag == argsTag ? objectTag : othTag;\n\n  var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && isBuffer(object)) {\n    if (!isBuffer(other)) {\n      return false;\n    }\n    objIsArr = true;\n    objIsObj = false;\n  }\n  if (isSameTag && !objIsObj) {\n    stack || (stack = new Stack);\n    return (objIsArr || isTypedArray(object))\n      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n  }\n  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other;\n\n      stack || (stack = new Stack);\n      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  stack || (stack = new Stack);\n  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","var getTag = require('./_getTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n  return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","var Stack = require('./_Stack'),\n    baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n  var index = matchData.length,\n      length = index,\n      noCustomizer = !customizer;\n\n  if (object == null) {\n    return !length;\n  }\n  object = Object(object);\n  while (index--) {\n    var data = matchData[index];\n    if ((noCustomizer && data[2])\n          ? data[1] !== object[data[0]]\n          : !(data[0] in object)\n        ) {\n      return false;\n    }\n  }\n  while (++index < length) {\n    data = matchData[index];\n    var key = data[0],\n        objValue = object[key],\n        srcValue = data[1];\n\n    if (noCustomizer && data[2]) {\n      if (objValue === undefined && !(key in object)) {\n        return false;\n      }\n    } else {\n      var stack = new Stack;\n      if (customizer) {\n        var result = customizer(objValue, srcValue, key, object, source, stack);\n      }\n      if (!(result === undefined\n            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n            : result\n          )) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nmodule.exports = baseIsMatch;\n","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n  return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n","var isFunction = require('./isFunction'),\n    isMasked = require('./_isMasked'),\n    isObject = require('./isObject'),\n    toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var getTag = require('./_getTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n  return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","var baseGetTag = require('./_baseGetTag'),\n    isLength = require('./isLength'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","var baseMatches = require('./_baseMatches'),\n    baseMatchesProperty = require('./_baseMatchesProperty'),\n    identity = require('./identity'),\n    isArray = require('./isArray'),\n    property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n  // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n  // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n  if (typeof value == 'function') {\n    return value;\n  }\n  if (value == null) {\n    return identity;\n  }\n  if (typeof value == 'object') {\n    return isArray(value)\n      ? baseMatchesProperty(value[0], value[1])\n      : baseMatches(value);\n  }\n  return property(value);\n}\n\nmodule.exports = baseIteratee;\n","var isPrototype = require('./_isPrototype'),\n    nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeys;\n","var isObject = require('./isObject'),\n    isPrototype = require('./_isPrototype'),\n    nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n  if (!isObject(object)) {\n    return nativeKeysIn(object);\n  }\n  var isProto = isPrototype(object),\n      result = [];\n\n  for (var key in object) {\n    if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeysIn;\n","var baseEach = require('./_baseEach'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n  var index = -1,\n      result = isArrayLike(collection) ? Array(collection.length) : [];\n\n  baseEach(collection, function(value, key, collection) {\n    result[++index] = iteratee(value, key, collection);\n  });\n  return result;\n}\n\nmodule.exports = baseMap;\n","var baseIsMatch = require('./_baseIsMatch'),\n    getMatchData = require('./_getMatchData'),\n    matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n  var matchData = getMatchData(source);\n  if (matchData.length == 1 && matchData[0][2]) {\n    return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n  }\n  return function(object) {\n    return object === source || baseIsMatch(object, source, matchData);\n  };\n}\n\nmodule.exports = baseMatches;\n","var baseIsEqual = require('./_baseIsEqual'),\n    get = require('./get'),\n    hasIn = require('./hasIn'),\n    isKey = require('./_isKey'),\n    isStrictComparable = require('./_isStrictComparable'),\n    matchesStrictComparable = require('./_matchesStrictComparable'),\n    toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n  if (isKey(path) && isStrictComparable(srcValue)) {\n    return matchesStrictComparable(toKey(path), srcValue);\n  }\n  return function(object) {\n    var objValue = get(object, path);\n    return (objValue === undefined && objValue === srcValue)\n      ? hasIn(object, path)\n      : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n  };\n}\n\nmodule.exports = baseMatchesProperty;\n","var basePickBy = require('./_basePickBy'),\n    hasIn = require('./hasIn');\n\n/**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\nfunction basePick(object, paths) {\n  return basePickBy(object, paths, function(value, path) {\n    return hasIn(object, path);\n  });\n}\n\nmodule.exports = basePick;\n","var baseGet = require('./_baseGet'),\n    baseSet = require('./_baseSet'),\n    castPath = require('./_castPath');\n\n/**\n * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n  var index = -1,\n      length = paths.length,\n      result = {};\n\n  while (++index < length) {\n    var path = paths[index],\n        value = baseGet(object, path);\n\n    if (predicate(value, path)) {\n      baseSet(result, castPath(path, object), value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = basePickBy;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n  return function(object) {\n    return baseGet(object, path);\n  };\n}\n\nmodule.exports = basePropertyDeep;\n","var identity = require('./identity'),\n    overRest = require('./_overRest'),\n    setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n  return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","var assignValue = require('./_assignValue'),\n    castPath = require('./_castPath'),\n    isIndex = require('./_isIndex'),\n    isObject = require('./isObject'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n  if (!isObject(object)) {\n    return object;\n  }\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      lastIndex = length - 1,\n      nested = object;\n\n  while (nested != null && ++index < length) {\n    var key = toKey(path[index]),\n        newValue = value;\n\n    if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n      return object;\n    }\n\n    if (index != lastIndex) {\n      var objValue = nested[key];\n      newValue = customizer ? customizer(objValue, key, nested) : undefined;\n      if (newValue === undefined) {\n        newValue = isObject(objValue)\n          ? objValue\n          : (isIndex(path[index + 1]) ? [] : {});\n      }\n    }\n    assignValue(nested, key, newValue);\n    nested = nested[key];\n  }\n  return object;\n}\n\nmodule.exports = baseSet;\n","var constant = require('./constant'),\n    defineProperty = require('./_defineProperty'),\n    identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n  return defineProperty(func, 'toString', {\n    'configurable': true,\n    'enumerable': false,\n    'value': constant(string),\n    'writable': true\n  });\n};\n\nmodule.exports = baseSetToString;\n","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n  var index = -1,\n      length = array.length;\n\n  if (start < 0) {\n    start = -start > length ? 0 : (length + start);\n  }\n  end = end > length ? length : end;\n  if (end < 0) {\n    end += length;\n  }\n  length = start > end ? 0 : ((end - start) >>> 0);\n  start >>>= 0;\n\n  var result = Array(length);\n  while (++index < length) {\n    result[index] = array[index + start];\n  }\n  return result;\n}\n\nmodule.exports = baseSlice;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nmodule.exports = baseTimes;\n","var Symbol = require('./_Symbol'),\n    arrayMap = require('./_arrayMap'),\n    isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isArray(value)) {\n    // Recursively convert values (susceptible to call stack limits).\n    return arrayMap(value, baseToString) + '';\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n  return string\n    ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n    : string;\n}\n\nmodule.exports = baseTrim;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n","var SetCache = require('./_SetCache'),\n    arrayIncludes = require('./_arrayIncludes'),\n    arrayIncludesWith = require('./_arrayIncludesWith'),\n    cacheHas = require('./_cacheHas'),\n    createSet = require('./_createSet'),\n    setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n  var index = -1,\n      includes = arrayIncludes,\n      length = array.length,\n      isCommon = true,\n      result = [],\n      seen = result;\n\n  if (comparator) {\n    isCommon = false;\n    includes = arrayIncludesWith;\n  }\n  else if (length >= LARGE_ARRAY_SIZE) {\n    var set = iteratee ? null : createSet(array);\n    if (set) {\n      return setToArray(set);\n    }\n    isCommon = false;\n    includes = cacheHas;\n    seen = new SetCache;\n  }\n  else {\n    seen = iteratee ? [] : result;\n  }\n  outer:\n  while (++index < length) {\n    var value = array[index],\n        computed = iteratee ? iteratee(value) : value;\n\n    value = (comparator || value !== 0) ? value : 0;\n    if (isCommon && computed === computed) {\n      var seenIndex = seen.length;\n      while (seenIndex--) {\n        if (seen[seenIndex] === computed) {\n          continue outer;\n        }\n      }\n      if (iteratee) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n    else if (!includes(seen, computed, comparator)) {\n      if (seen !== result) {\n        seen.push(computed);\n      }\n      result.push(value);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseUniq;\n","var arrayMap = require('./_arrayMap');\n\n/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\nfunction baseValues(object, props) {\n  return arrayMap(props, function(key) {\n    return object[key];\n  });\n}\n\nmodule.exports = baseValues;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var identity = require('./identity');\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n  return typeof value == 'function' ? value : identity;\n}\n\nmodule.exports = castFunction;\n","var isArray = require('./isArray'),\n    isKey = require('./_isKey'),\n    stringToPath = require('./_stringToPath'),\n    toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n  if (isArray(value)) {\n    return value;\n  }\n  return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var baseSlice = require('./_baseSlice');\n\n/**\n * Casts `array` to a slice if it's needed.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {number} start The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the cast slice.\n */\nfunction castSlice(array, start, end) {\n  var length = array.length;\n  end = end === undefined ? length : end;\n  return (!start && end >= length) ? array : baseSlice(array, start, end);\n}\n\nmodule.exports = castSlice;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n  new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n  return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n    allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of  `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n  if (isDeep) {\n    return buffer.slice();\n  }\n  var length = buffer.length,\n      result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n  buffer.copy(result);\n  return result;\n}\n\nmodule.exports = cloneBuffer;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n  result.lastIndex = regexp.lastIndex;\n  return result;\n}\n\nmodule.exports = cloneRegExp;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n  return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\nmodule.exports = copyArray;\n","var assignValue = require('./_assignValue'),\n    baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n  var isNew = !object;\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n\n    var newValue = customizer\n      ? customizer(object[key], source[key], key, object, source)\n      : undefined;\n\n    if (newValue === undefined) {\n      newValue = source[key];\n    }\n    if (isNew) {\n      baseAssignValue(object, key, newValue);\n    } else {\n      assignValue(object, key, newValue);\n    }\n  }\n  return object;\n}\n\nmodule.exports = copyObject;\n","var copyObject = require('./_copyObject'),\n    getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n  return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","var copyObject = require('./_copyObject'),\n    getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n  return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","var baseRest = require('./_baseRest'),\n    isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n  return baseRest(function(object, sources) {\n    var index = -1,\n        length = sources.length,\n        customizer = length > 1 ? sources[length - 1] : undefined,\n        guard = length > 2 ? sources[2] : undefined;\n\n    customizer = (assigner.length > 3 && typeof customizer == 'function')\n      ? (length--, customizer)\n      : undefined;\n\n    if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n      customizer = length < 3 ? undefined : customizer;\n      length = 1;\n    }\n    object = Object(object);\n    while (++index < length) {\n      var source = sources[index];\n      if (source) {\n        assigner(object, source, index, customizer);\n      }\n    }\n    return object;\n  });\n}\n\nmodule.exports = createAssigner;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n  return function(collection, iteratee) {\n    if (collection == null) {\n      return collection;\n    }\n    if (!isArrayLike(collection)) {\n      return eachFunc(collection, iteratee);\n    }\n    var length = collection.length,\n        index = fromRight ? length : -1,\n        iterable = Object(collection);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (iteratee(iterable[index], index, iterable) === false) {\n        break;\n      }\n    }\n    return collection;\n  };\n}\n\nmodule.exports = createBaseEach;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var index = -1,\n        iterable = Object(object),\n        props = keysFunc(object),\n        length = props.length;\n\n    while (length--) {\n      var key = props[fromRight ? length : ++index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nmodule.exports = createBaseFor;\n","var castSlice = require('./_castSlice'),\n    hasUnicode = require('./_hasUnicode'),\n    stringToArray = require('./_stringToArray'),\n    toString = require('./toString');\n\n/**\n * Creates a function like `_.lowerFirst`.\n *\n * @private\n * @param {string} methodName The name of the `String` case method to use.\n * @returns {Function} Returns the new case function.\n */\nfunction createCaseFirst(methodName) {\n  return function(string) {\n    string = toString(string);\n\n    var strSymbols = hasUnicode(string)\n      ? stringToArray(string)\n      : undefined;\n\n    var chr = strSymbols\n      ? strSymbols[0]\n      : string.charAt(0);\n\n    var trailing = strSymbols\n      ? castSlice(strSymbols, 1).join('')\n      : string.slice(1);\n\n    return chr[methodName]() + trailing;\n  };\n}\n\nmodule.exports = createCaseFirst;\n","var baseIteratee = require('./_baseIteratee'),\n    isArrayLike = require('./isArrayLike'),\n    keys = require('./keys');\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n  return function(collection, predicate, fromIndex) {\n    var iterable = Object(collection);\n    if (!isArrayLike(collection)) {\n      var iteratee = baseIteratee(predicate, 3);\n      collection = keys(collection);\n      predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n    }\n    var index = findIndexFunc(collection, predicate, fromIndex);\n    return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n  };\n}\n\nmodule.exports = createFind;\n","var Set = require('./_Set'),\n    noop = require('./noop'),\n    setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n  return new Set(values);\n};\n\nmodule.exports = createSet;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var SetCache = require('./_SetCache'),\n    arraySome = require('./_arraySome'),\n    cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n    return false;\n  }\n  // Check that cyclic values are equal.\n  var arrStacked = stack.get(array);\n  var othStacked = stack.get(other);\n  if (arrStacked && othStacked) {\n    return arrStacked == other && othStacked == array;\n  }\n  var index = -1,\n      result = true,\n      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n  stack.set(array, other);\n  stack.set(other, array);\n\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, arrValue, index, other, array, stack)\n        : customizer(arrValue, othValue, index, array, other, stack);\n    }\n    if (compared !== undefined) {\n      if (compared) {\n        continue;\n      }\n      result = false;\n      break;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (seen) {\n      if (!arraySome(other, function(othValue, othIndex) {\n            if (!cacheHas(seen, othIndex) &&\n                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n              return seen.push(othIndex);\n            }\n          })) {\n        result = false;\n        break;\n      }\n    } else if (!(\n          arrValue === othValue ||\n            equalFunc(arrValue, othValue, bitmask, customizer, stack)\n        )) {\n      result = false;\n      break;\n    }\n  }\n  stack['delete'](array);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalArrays;\n","var Symbol = require('./_Symbol'),\n    Uint8Array = require('./_Uint8Array'),\n    eq = require('./eq'),\n    equalArrays = require('./_equalArrays'),\n    mapToArray = require('./_mapToArray'),\n    setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n  switch (tag) {\n    case dataViewTag:\n      if ((object.byteLength != other.byteLength) ||\n          (object.byteOffset != other.byteOffset)) {\n        return false;\n      }\n      object = object.buffer;\n      other = other.buffer;\n\n    case arrayBufferTag:\n      if ((object.byteLength != other.byteLength) ||\n          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n        return false;\n      }\n      return true;\n\n    case boolTag:\n    case dateTag:\n    case numberTag:\n      // Coerce booleans to `1` or `0` and dates to milliseconds.\n      // Invalid dates are coerced to `NaN`.\n      return eq(+object, +other);\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings, primitives and objects,\n      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n      // for more details.\n      return object == (other + '');\n\n    case mapTag:\n      var convert = mapToArray;\n\n    case setTag:\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n      convert || (convert = setToArray);\n\n      if (object.size != other.size && !isPartial) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked) {\n        return stacked == other;\n      }\n      bitmask |= COMPARE_UNORDERED_FLAG;\n\n      // Recursively compare objects (susceptible to call stack limits).\n      stack.set(object, other);\n      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n      stack['delete'](object);\n      return result;\n\n    case symbolTag:\n      if (symbolValueOf) {\n        return symbolValueOf.call(object) == symbolValueOf.call(other);\n      }\n  }\n  return false;\n}\n\nmodule.exports = equalByTag;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      objProps = getAllKeys(object),\n      objLength = objProps.length,\n      othProps = getAllKeys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isPartial) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  // Check that cyclic values are equal.\n  var objStacked = stack.get(object);\n  var othStacked = stack.get(other);\n  if (objStacked && othStacked) {\n    return objStacked == other && othStacked == object;\n  }\n  var result = true;\n  stack.set(object, other);\n  stack.set(other, object);\n\n  var skipCtor = isPartial;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, objValue, key, other, object, stack)\n        : customizer(objValue, othValue, key, object, other, stack);\n    }\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(compared === undefined\n          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n          : compared\n        )) {\n      result = false;\n      break;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (result && !skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      result = false;\n    }\n  }\n  stack['delete'](object);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalObjects;\n","var flatten = require('./flatten'),\n    overRest = require('./_overRest'),\n    setToString = require('./_setToString');\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n  return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n    getSymbols = require('./_getSymbols'),\n    keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n    getSymbolsIn = require('./_getSymbolsIn'),\n    keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n  return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n","var isStrictComparable = require('./_isStrictComparable'),\n    keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n  var result = keys(object),\n      length = result.length;\n\n  while (length--) {\n    var key = result[length],\n        value = object[key];\n\n    result[length] = [key, value, isStrictComparable(value)];\n  }\n  return result;\n}\n\nmodule.exports = getMatchData;\n","var baseIsNative = require('./_baseIsNative'),\n    getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n","var arrayFilter = require('./_arrayFilter'),\n    stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n  if (object == null) {\n    return [];\n  }\n  object = Object(object);\n  return arrayFilter(nativeGetSymbols(object), function(symbol) {\n    return propertyIsEnumerable.call(object, symbol);\n  });\n};\n\nmodule.exports = getSymbols;\n","var arrayPush = require('./_arrayPush'),\n    getPrototype = require('./_getPrototype'),\n    getSymbols = require('./_getSymbols'),\n    stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n  var result = [];\n  while (object) {\n    arrayPush(result, getSymbols(object));\n    object = getPrototype(object);\n  }\n  return result;\n};\n\nmodule.exports = getSymbolsIn;\n","var DataView = require('./_DataView'),\n    Map = require('./_Map'),\n    Promise = require('./_Promise'),\n    Set = require('./_Set'),\n    WeakMap = require('./_WeakMap'),\n    baseGetTag = require('./_baseGetTag'),\n    toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = baseGetTag(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : '';\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nmodule.exports = getTag;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var castPath = require('./_castPath'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isIndex = require('./_isIndex'),\n    isLength = require('./isLength'),\n    toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      result = false;\n\n  while (++index < length) {\n    var key = toKey(path[index]);\n    if (!(result = object != null && hasFunc(object, key))) {\n      break;\n    }\n    object = object[key];\n  }\n  if (result || ++index != length) {\n    return result;\n  }\n  length = object == null ? 0 : object.length;\n  return !!length && isLength(length) && isIndex(key, length) &&\n    (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n    rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n    rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n  return reHasUnicode.test(string);\n}\n\nmodule.exports = hasUnicode;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n  var length = array.length,\n      result = new array.constructor(length);\n\n  // Add properties assigned by `RegExp#exec`.\n  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n    result.index = array.index;\n    result.input = array.input;\n  }\n  return result;\n}\n\nmodule.exports = initCloneArray;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n    cloneDataView = require('./_cloneDataView'),\n    cloneRegExp = require('./_cloneRegExp'),\n    cloneSymbol = require('./_cloneSymbol'),\n    cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n  var Ctor = object.constructor;\n  switch (tag) {\n    case arrayBufferTag:\n      return cloneArrayBuffer(object);\n\n    case boolTag:\n    case dateTag:\n      return new Ctor(+object);\n\n    case dataViewTag:\n      return cloneDataView(object, isDeep);\n\n    case float32Tag: case float64Tag:\n    case int8Tag: case int16Tag: case int32Tag:\n    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n      return cloneTypedArray(object, isDeep);\n\n    case mapTag:\n      return new Ctor;\n\n    case numberTag:\n    case stringTag:\n      return new Ctor(object);\n\n    case regexpTag:\n      return cloneRegExp(object);\n\n    case setTag:\n      return new Ctor;\n\n    case symbolTag:\n      return cloneSymbol(object);\n  }\n}\n\nmodule.exports = initCloneByTag;\n","var baseCreate = require('./_baseCreate'),\n    getPrototype = require('./_getPrototype'),\n    isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n  return (typeof object.constructor == 'function' && !isPrototype(object))\n    ? baseCreate(getPrototype(object))\n    : {};\n}\n\nmodule.exports = initCloneObject;\n","var Symbol = require('./_Symbol'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray');\n\n/** Built-in value references. */\nvar spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;\n\n/**\n * Checks if `value` is a flattenable `arguments` object or array.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n */\nfunction isFlattenable(value) {\n  return isArray(value) || isArguments(value) ||\n    !!(spreadableSymbol && value && value[spreadableSymbol]);\n}\n\nmodule.exports = isFlattenable;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var eq = require('./eq'),\n    isArrayLike = require('./isArrayLike'),\n    isIndex = require('./_isIndex'),\n    isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n *  else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n  if (!isObject(object)) {\n    return false;\n  }\n  var type = typeof index;\n  if (type == 'number'\n        ? (isArrayLike(object) && isIndex(index, object.length))\n        : (type == 'string' && index in object)\n      ) {\n    return eq(object[index], value);\n  }\n  return false;\n}\n\nmodule.exports = isIterateeCall;\n","var isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n  if (isArray(value)) {\n    return false;\n  }\n  var type = typeof value;\n  if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n      value == null || isSymbol(value)) {\n    return true;\n  }\n  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n    (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n *  equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n  return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n","var Hash = require('./_Hash'),\n    ListCache = require('./_ListCache'),\n    Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n  return function(object) {\n    if (object == null) {\n      return false;\n    }\n    return object[key] === srcValue &&\n      (srcValue !== undefined || (key in Object(object)));\n  };\n}\n\nmodule.exports = matchesStrictComparable;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n  var result = memoize(func, function(key) {\n    if (cache.size === MAX_MEMOIZE_SIZE) {\n      cache.clear();\n    }\n    return key;\n  });\n\n  var cache = result.cache;\n  return result;\n}\n\nmodule.exports = memoizeCapped;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n  var result = [];\n  if (object != null) {\n    for (var key in Object(object)) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = nativeKeysIn;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n  return function() {\n    var args = arguments,\n        index = -1,\n        length = nativeMax(args.length - start, 0),\n        array = Array(length);\n\n    while (++index < length) {\n      array[index] = args[start + index];\n    }\n    index = -1;\n    var otherArgs = Array(start + 1);\n    while (++index < start) {\n      otherArgs[index] = args[index];\n    }\n    otherArgs[start] = transform(array);\n    return apply(func, this, otherArgs);\n  };\n}\n\nmodule.exports = overRest;\n","var baseGet = require('./_baseGet'),\n    baseSlice = require('./_baseSlice');\n\n/**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\nfunction parent(object, path) {\n  return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n}\n\nmodule.exports = parent;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n","var baseSetToString = require('./_baseSetToString'),\n    shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n    HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n  var count = 0,\n      lastCalled = 0;\n\n  return function() {\n    var stamp = nativeNow(),\n        remaining = HOT_SPAN - (stamp - lastCalled);\n\n    lastCalled = stamp;\n    if (remaining > 0) {\n      if (++count >= HOT_COUNT) {\n        return arguments[0];\n      }\n    } else {\n      count = 0;\n    }\n    return func.apply(undefined, arguments);\n  };\n}\n\nmodule.exports = shortOut;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n    Map = require('./_Map'),\n    MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\nmodule.exports = stackSet;\n","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n  var index = fromIndex - 1,\n      length = array.length;\n\n  while (++index < length) {\n    if (array[index] === value) {\n      return index;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = strictIndexOf;\n","var asciiToArray = require('./_asciiToArray'),\n    hasUnicode = require('./_hasUnicode'),\n    unicodeToArray = require('./_unicodeToArray');\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n  return hasUnicode(string)\n    ? unicodeToArray(string)\n    : asciiToArray(string);\n}\n\nmodule.exports = stringToArray;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n  var result = [];\n  if (string.charCodeAt(0) === 46 /* . */) {\n    result.push('');\n  }\n  string.replace(rePropName, function(match, number, quote, subString) {\n    result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n  });\n  return result;\n});\n\nmodule.exports = stringToPath;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n  var index = string.length;\n\n  while (index-- && reWhitespace.test(string.charAt(index))) {}\n  return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n    rsComboMarksRange = '\\\\u0300-\\\\u036f',\n    reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n    rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n    rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n    rsCombo = '[' + rsComboRange + ']',\n    rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n    rsNonAstral = '[^' + rsAstralRange + ']',\n    rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n    rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n    rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n    rsOptVar = '[' + rsVarRange + ']?',\n    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n    rsSeq = rsOptVar + reOptMod + rsOptJoin,\n    rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n  return string.match(reUnicode) || [];\n}\n\nmodule.exports = unicodeToArray;\n","var assignValue = require('./_assignValue'),\n    copyObject = require('./_copyObject'),\n    createAssigner = require('./_createAssigner'),\n    isArrayLike = require('./isArrayLike'),\n    isPrototype = require('./_isPrototype'),\n    keys = require('./keys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * function Bar() {\n *   this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\nvar assign = createAssigner(function(object, source) {\n  if (isPrototype(source) || isArrayLike(source)) {\n    copyObject(source, keys(source), object);\n    return;\n  }\n  for (var key in source) {\n    if (hasOwnProperty.call(source, key)) {\n      assignValue(object, key, source[key]);\n    }\n  }\n});\n\nmodule.exports = assign;\n","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n    CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n  return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n","/**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\nfunction compact(array) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (value) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = compact;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nmodule.exports = constant;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var createFind = require('./_createFind'),\n    findIndex = require('./findIndex');\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n *   { 'user': 'barney',  'age': 36, 'active': true },\n *   { 'user': 'fred',    'age': 40, 'active': false },\n *   { 'user': 'pebbles', 'age': 1,  'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nmodule.exports = find;\n","var baseFindIndex = require('./_baseFindIndex'),\n    baseIteratee = require('./_baseIteratee'),\n    toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n *   { 'user': 'barney',  'active': false },\n *   { 'user': 'fred',    'active': false },\n *   { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n  var length = array == null ? 0 : array.length;\n  if (!length) {\n    return -1;\n  }\n  var index = fromIndex == null ? 0 : toInteger(fromIndex);\n  if (index < 0) {\n    index = nativeMax(length + index, 0);\n  }\n  return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nmodule.exports = findIndex;\n","var baseFlatten = require('./_baseFlatten');\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? baseFlatten(array, 1) : [];\n}\n\nmodule.exports = flatten;\n","var baseFor = require('./_baseFor'),\n    castFunction = require('./_castFunction'),\n    keysIn = require('./keysIn');\n\n/**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n *   console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */\nfunction forIn(object, iteratee) {\n  return object == null\n    ? object\n    : baseFor(object, castFunction(iteratee), keysIn);\n}\n\nmodule.exports = forIn;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n  var result = object == null ? undefined : baseGet(object, path);\n  return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var baseHas = require('./_baseHas'),\n    hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n  return object != null && hasPath(object, path, baseHas);\n}\n\nmodule.exports = has;\n","var baseHasIn = require('./_baseHasIn'),\n    hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n  return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n","var apply = require('./_apply'),\n    baseEach = require('./_baseEach'),\n    baseInvoke = require('./_baseInvoke'),\n    baseRest = require('./_baseRest'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Invokes the method at `path` of each element in `collection`, returning\n * an array of the results of each invoked method. Any additional arguments\n * are provided to each invoked method. If `path` is a function, it's invoked\n * for, and `this` bound to, each element in `collection`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Array|Function|string} path The path of the method to invoke or\n *  the function invoked per iteration.\n * @param {...*} [args] The arguments to invoke each method with.\n * @returns {Array} Returns the array of results.\n * @example\n *\n * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n * // => [[1, 5, 7], [1, 2, 3]]\n *\n * _.invokeMap([123, 456], String.prototype.split, '');\n * // => [['1', '2', '3'], ['4', '5', '6']]\n */\nvar invokeMap = baseRest(function(collection, path, args) {\n  var index = -1,\n      isFunc = typeof path == 'function',\n      result = isArrayLike(collection) ? Array(collection.length) : [];\n\n  baseEach(collection, function(value) {\n    result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n  });\n  return result;\n});\n\nmodule.exports = invokeMap;\n","var baseIsArguments = require('./_baseIsArguments'),\n    isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var isFunction = require('./isFunction'),\n    isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var root = require('./_root'),\n    stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","var baseKeys = require('./_baseKeys'),\n    getTag = require('./_getTag'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isArrayLike = require('./isArrayLike'),\n    isBuffer = require('./isBuffer'),\n    isPrototype = require('./_isPrototype'),\n    isTypedArray = require('./isTypedArray');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n  if (value == null) {\n    return true;\n  }\n  if (isArrayLike(value) &&\n      (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n        isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n    return !value.length;\n  }\n  var tag = getTag(value);\n  if (tag == mapTag || tag == setTag) {\n    return !value.size;\n  }\n  if (isPrototype(value)) {\n    return !baseKeys(value).length;\n  }\n  for (var key in value) {\n    if (hasOwnProperty.call(value, key)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nmodule.exports = isEmpty;\n","var baseIsEqual = require('./_baseIsEqual');\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n  return baseIsEqual(value, other);\n}\n\nmodule.exports = isEqual;\n","var baseGetTag = require('./_baseGetTag'),\n    isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","var toInteger = require('./toInteger');\n\n/**\n * Checks if `value` is an integer.\n *\n * **Note:** This method is based on\n * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n * @example\n *\n * _.isInteger(3);\n * // => true\n *\n * _.isInteger(Number.MIN_VALUE);\n * // => false\n *\n * _.isInteger(Infinity);\n * // => false\n *\n * _.isInteger('3');\n * // => false\n */\nfunction isInteger(value) {\n  return typeof value == 'number' && value == toInteger(value);\n}\n\nmodule.exports = isInteger;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var baseIsMap = require('./_baseIsMap'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var baseGetTag = require('./_baseGetTag'),\n    getPrototype = require('./_getPrototype'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n  if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n    return false;\n  }\n  var proto = getPrototype(value);\n  if (proto === null) {\n    return true;\n  }\n  var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n  return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n    funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n","var baseIsSet = require('./_baseIsSet'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n    baseKeys = require('./_baseKeys'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n    baseKeysIn = require('./_baseKeysIn'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n  var length = array == null ? 0 : array.length;\n  return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n","var createCaseFirst = require('./_createCaseFirst');\n\n/**\n * Converts the first character of `string` to lower case.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category String\n * @param {string} [string=''] The string to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.lowerFirst('Fred');\n * // => 'fred'\n *\n * _.lowerFirst('FRED');\n * // => 'fRED'\n */\nvar lowerFirst = createCaseFirst('toLowerCase');\n\nmodule.exports = lowerFirst;\n","var arrayMap = require('./_arrayMap'),\n    baseIteratee = require('./_baseIteratee'),\n    baseMap = require('./_baseMap'),\n    isArray = require('./isArray');\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n *   return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n *   { 'user': 'barney' },\n *   { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n  var func = isArray(collection) ? arrayMap : baseMap;\n  return func(collection, baseIteratee(iteratee, 3));\n}\n\nmodule.exports = map;\n","var baseAssignValue = require('./_baseAssignValue'),\n    baseForOwn = require('./_baseForOwn'),\n    baseIteratee = require('./_baseIteratee');\n\n/**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n *   'fred':    { 'user': 'fred',    'age': 40 },\n *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\nfunction mapValues(object, iteratee) {\n  var result = {};\n  iteratee = baseIteratee(iteratee, 3);\n\n  baseForOwn(object, function(value, key, object) {\n    baseAssignValue(result, key, iteratee(value, key, object));\n  });\n  return result;\n}\n\nmodule.exports = mapValues;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n  // No operation performed.\n}\n\nmodule.exports = noop;\n","var basePick = require('./_basePick'),\n    flatRest = require('./_flatRest');\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\nvar pick = flatRest(function(object, paths) {\n  return object == null ? {} : basePick(object, paths);\n});\n\nmodule.exports = pick;\n","var baseProperty = require('./_baseProperty'),\n    basePropertyDeep = require('./_basePropertyDeep'),\n    isKey = require('./_isKey'),\n    toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n *   { 'a': { 'b': 2 } },\n *   { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n  return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\nmodule.exports = stubArray;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nmodule.exports = stubFalse;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n    MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n  if (!value) {\n    return value === 0 ? value : 0;\n  }\n  value = toNumber(value);\n  if (value === INFINITY || value === -INFINITY) {\n    var sign = (value < 0 ? -1 : 1);\n    return sign * MAX_INTEGER;\n  }\n  return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var toFinite = require('./toFinite');\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n  var result = toFinite(value),\n      remainder = result % 1;\n\n  return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n","var baseTrim = require('./_baseTrim'),\n    isObject = require('./isObject'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return NAN;\n  }\n  if (isObject(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = baseTrim(value);\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var baseUniq = require('./_baseUniq');\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n  return (array && array.length) ? baseUniq(array) : [];\n}\n\nmodule.exports = uniq;\n","var baseIteratee = require('./_baseIteratee'),\n    baseUniq = require('./_baseUniq');\n\n/**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\nfunction uniqBy(array, iteratee) {\n  return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];\n}\n\nmodule.exports = uniqBy;\n","var baseValues = require('./_baseValues'),\n    keys = require('./keys');\n\n/**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\nfunction values(object) {\n  return object == null ? [] : baseValues(object, keys(object));\n}\n\nmodule.exports = values;\n","/**\n * Checks if `value` is classified as a `Function` object.\n * @param {*} value The param to check if it is a function\n */\nexport function isFunction(value) {\n  return typeof value === 'function';\n}\n\n/**\n * Checks if `value` is classified as a `Number` object.\n * @param {*} value The param to check if it is a number\n */\nexport function isNumber(value) {\n  return typeof value === 'number';\n}\n\n/**\n * Checks if `value` is classified as an `Object`.\n * @param {*} value The param to check if it is an object\n */\nexport function isObject(value) {\n  return typeof value === 'object';\n}\n\n/**\n * Checks if `value` is classified as a `String` object.\n * @param {*} value The param to check if it is a string\n */\nexport function isString(value) {\n  return typeof value === 'string';\n}\n\n/**\n * Checks if `value` is undefined.\n * @param {*} value The param to check if it is undefined\n */\nexport function isUndefined(value) {\n  return value === undefined;\n}\n","import { isUndefined } from './type-check';\n\nexport function addClass(el, name) {\n  name.split(' ').forEach((cls) => {\n    if (cls.trim()) {\n      el.classList.add(cls);\n    }\n  });\n}\n\n/**\n * Get class string based on previously determined classes\n * @param  {String} [key=''] - default value for the classes object\n * @param  {Object} classes\n * @param  {String} classPrefix\n */\nexport function getClass(key = '', classes, classPrefix) {\n  if (!isUndefined(classes) && !isUndefined(classes[key])) {\n    if (classes[key] === false) {\n      return '';\n    }\n    return classes[key];\n  } else if (classPrefix) {\n    return `${classPrefix}-${key}`;\n  } else {\n    return key;\n  }\n}\n\nexport function removeClass(el, name) {\n  name.split(' ').forEach((cls) => {\n    if (cls.trim()) {\n      el.classList.remove(cls);\n    }\n  });\n}\n\nexport function updateClasses(el, add, all) {\n  // Of the set of 'all' classes, we need the 'add' classes, and only the\n  // 'add' classes to be set.\n  all.forEach((cls) => {\n    if (add.indexOf(cls) === -1 && el.classList.contains(cls)) {\n      removeClass(el, cls);\n    }\n  });\n\n  add.forEach((cls) => {\n    if (!el.classList.contains(cls)) {\n      addClass(el, cls);\n    }\n  });\n}\n","const deferred = [];\n\nexport function defer(fn) {\n  deferred.push(fn);\n}\n\nexport function flush() {\n  let fn;\n  // eslint-disable-next-line\n  while (fn = deferred.pop()) {\n    fn();\n  }\n}\n","let _scrollBarSize = null;\n\nexport function extend(out = {}) {\n  const args = [];\n\n  Array.prototype.push.apply(args, arguments);\n\n  args.slice(1).forEach((obj) => {\n    if (obj) {\n      for (let key in obj) {\n        if ({}.hasOwnProperty.call(obj, key)) {\n          out[key] = obj[key];\n        }\n      }\n    }\n  });\n\n  return out;\n}\n\nexport function getScrollBarSize() {\n  if (_scrollBarSize) {\n    return _scrollBarSize;\n  }\n  const inner = document.createElement('div');\n  inner.style.width = '100%';\n  inner.style.height = '200px';\n\n  const outer = document.createElement('div');\n  extend(outer.style, {\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    pointerEvents: 'none',\n    visibility: 'hidden',\n    width: '200px',\n    height: '150px',\n    overflow: 'hidden'\n  });\n\n  outer.appendChild(inner);\n\n  document.body.appendChild(outer);\n\n  const widthContained = inner.offsetWidth;\n  outer.style.overflow = 'scroll';\n  let widthScroll = inner.offsetWidth;\n\n  if (widthContained === widthScroll) {\n    widthScroll = outer.clientWidth;\n  }\n\n  document.body.removeChild(outer);\n\n  const width = widthContained - widthScroll;\n\n  _scrollBarSize = { width, height: width };\n  return _scrollBarSize;\n}\n\nexport const uniqueId = (() => {\n  let id = 0;\n  return () => ++id;\n})();\n","import { defer } from './deferred';\nimport { extend, uniqueId } from './general';\nimport { isUndefined } from './type-check';\n\nconst zeroPosCache = {};\nlet zeroElement = null;\n\nexport function getBounds(body, el) {\n  let doc;\n  if (el === document) {\n    doc = document;\n    el = document.documentElement;\n  } else {\n    doc = el.ownerDocument;\n  }\n\n  const docEl = doc.documentElement;\n\n  const box = _getActualBoundingClientRect(el);\n\n  const origin = _getOrigin(body);\n\n  box.top -= origin.top;\n  box.left -= origin.left;\n\n  if (isUndefined(box.width)) {\n    box.width = document.body.scrollWidth - box.left - box.right;\n  }\n  if (isUndefined(box.height)) {\n    box.height = document.body.scrollHeight - box.top - box.bottom;\n  }\n\n  box.top = box.top - docEl.clientTop;\n  box.left = box.left - docEl.clientLeft;\n  box.right = doc.body.clientWidth - box.width - box.left;\n  box.bottom = doc.body.clientHeight - box.height - box.top;\n\n  return box;\n}\n\n/**\n * Gets bounds for when target modifiier is 'scroll-handle'\n * @param target\n * @return {{left: number, width: number, height: number}}\n */\nexport function getScrollHandleBounds(body, target) {\n  let bounds;\n  // We have to do the check for the scrollTop and if target === document.body here and set to variables\n  // because we may reset target below.\n  const targetScrollTop = target.scrollTop;\n  const targetIsBody = target === document.body;\n\n  if (targetIsBody) {\n    target = document.documentElement;\n\n    bounds = {\n      left: pageXOffset,\n      top: pageYOffset,\n      height: innerHeight,\n      width: innerWidth\n    };\n  } else {\n    bounds = getBounds(body, target);\n  }\n\n  const style = getComputedStyle(target);\n\n  const hasBottomScroll = (\n    target.scrollWidth > target.clientWidth ||\n    [style.overflow, style.overflowX].indexOf('scroll') >= 0 ||\n    !targetIsBody\n  );\n\n  let scrollBottom = 0;\n  if (hasBottomScroll) {\n    scrollBottom = 15;\n  }\n\n  const height = bounds.height - parseFloat(style.borderTopWidth) - parseFloat(style.borderBottomWidth) - scrollBottom;\n\n  const out = {\n    width: 15,\n    height: height * 0.975 * (height / target.scrollHeight),\n    left: bounds.left + bounds.width - parseFloat(style.borderLeftWidth) - 15\n  };\n\n  let fitAdj = 0;\n  if (height < 408 && targetIsBody) {\n    fitAdj = -0.00011 * Math.pow(height, 2) - 0.00727 * height + 22.58;\n  }\n\n  if (!targetIsBody) {\n    out.height = Math.max(out.height, 24);\n  }\n\n  const scrollPercentage = targetScrollTop / (target.scrollHeight - height);\n  out.top = scrollPercentage * (height - out.height - fitAdj) + bounds.top + parseFloat(style.borderTopWidth);\n\n  if (targetIsBody) {\n    out.height = Math.max(out.height, 24);\n  }\n\n  return out;\n}\n\n/**\n * Gets bounds for when target modifiier is 'visible\n * @param target\n * @return {{top: *, left: *, width: *, height: *}}\n */\nexport function getVisibleBounds(body, target) {\n  if (target === document.body) {\n    return { top: pageYOffset, left: pageXOffset, height: innerHeight, width: innerWidth };\n  } else {\n    const bounds = getBounds(body, target);\n\n    const out = {\n      height: bounds.height,\n      width: bounds.width,\n      top: bounds.top,\n      left: bounds.left\n    };\n\n    out.height = Math.min(out.height, bounds.height - (pageYOffset - bounds.top));\n    out.height = Math.min(out.height, bounds.height - ((bounds.top + bounds.height) - (pageYOffset + innerHeight)));\n    out.height = Math.min(innerHeight, out.height);\n    out.height -= 2;\n\n    out.width = Math.min(out.width, bounds.width - (pageXOffset - bounds.left));\n    out.width = Math.min(out.width, bounds.width - ((bounds.left + bounds.width) - (pageXOffset + innerWidth)));\n    out.width = Math.min(innerWidth, out.width);\n    out.width -= 2;\n\n    if (out.top < pageYOffset) {\n      out.top = pageYOffset;\n    }\n    if (out.left < pageXOffset) {\n      out.left = pageXOffset;\n    }\n\n    return out;\n  }\n}\n\nexport function removeUtilElements(body) {\n  if (zeroElement) {\n    body.removeChild(zeroElement);\n  }\n  zeroElement = null;\n}\n\n/**\n * Same as native getBoundingClientRect, except it takes into account parent <frame> offsets\n * if the element lies within a nested document (<frame> or <iframe>-like).\n * @param node\n */\nfunction _getActualBoundingClientRect(node) {\n  let boundingRect = node.getBoundingClientRect();\n\n  // The original object returned by getBoundingClientRect is immutable, so we clone it\n  // We can't use extend because the properties are not considered part of the object by hasOwnProperty in IE9\n  let rect = {};\n  for (let k in boundingRect) {\n    rect[k] = boundingRect[k];\n  }\n\n  try {\n    if (node.ownerDocument !== document) {\n      let { frameElement } = node.ownerDocument.defaultView;\n      if (frameElement) {\n        let frameRect = _getActualBoundingClientRect(frameElement);\n        rect.top += frameRect.top;\n        rect.bottom += frameRect.top;\n        rect.left += frameRect.left;\n        rect.right += frameRect.left;\n      }\n    }\n  } catch (err) {\n    // Ignore \"Access is denied\" in IE11/Edge\n  }\n\n  return rect;\n}\n\nfunction _getOrigin(body) {\n  // getBoundingClientRect is unfortunately too accurate.  It introduces a pixel or two of\n  // jitter as the user scrolls that messes with our ability to detect if two positions\n  // are equivilant or not.  We place an element at the top left of the page that will\n  // get the same jitter, so we can cancel the two out.\n  let node = zeroElement;\n  if (!node || !body.contains(node)) {\n    node = document.createElement('div');\n    node.setAttribute('data-tether-id', uniqueId());\n    extend(node.style, {\n      top: 0,\n      left: 0,\n      position: 'absolute'\n    });\n\n    body.appendChild(node);\n\n    zeroElement = node;\n  }\n\n  const id = node.getAttribute('data-tether-id');\n  if (isUndefined(zeroPosCache[id])) {\n    zeroPosCache[id] = _getActualBoundingClientRect(node);\n\n    // Clear the cache when this position call is done\n    defer(() => {\n      delete zeroPosCache[id];\n    });\n  }\n\n  return zeroPosCache[id];\n}\n","import { getClass, updateClasses } from './utils/classes';\nimport { defer } from './utils/deferred';\nimport { getBounds } from './utils/bounds';\n\nexport default {\n  position({ top, left }) {\n    const { height, width } = this.cache('element-bounds', () => {\n      return getBounds(this.element);\n    });\n\n    const targetPos = this.getTargetBounds();\n\n    const bottom = top + height;\n    const right = left + width;\n\n    const abutted = [];\n    if (top <= targetPos.bottom && bottom >= targetPos.top) {\n      ['left', 'right'].forEach((side) => {\n        const targetPosSide = targetPos[side];\n        if (targetPosSide === left || targetPosSide === right) {\n          abutted.push(side);\n        }\n      });\n    }\n\n    if (left <= targetPos.right && right >= targetPos.left) {\n      ['top', 'bottom'].forEach((side) => {\n        const targetPosSide = targetPos[side];\n        if (targetPosSide === top || targetPosSide === bottom) {\n          abutted.push(side);\n        }\n      });\n    }\n\n    const sides = ['left', 'top', 'right', 'bottom'];\n    const { classes, classPrefix } = this.options;\n    this.all.push(getClass('abutted', classes, classPrefix));\n    sides.forEach((side) => {\n      this.all.push(`${getClass('abutted', classes, classPrefix)}-${side}`);\n    });\n\n    if (abutted.length) {\n      this.add.push(getClass('abutted', classes, classPrefix));\n    }\n\n    abutted.forEach((side) => {\n      this.add.push(`${getClass('abutted', classes, classPrefix)}-${side}`);\n    });\n\n    defer(() => {\n      if (!(this.options.addTargetClasses === false)) {\n        updateClasses(this.target, this.add, this.all);\n      }\n      updateClasses(this.element, this.add, this.all);\n    });\n\n    return true;\n  }\n};\n","import { getClass, updateClasses } from './utils/classes';\nimport { defer } from './utils/deferred';\nimport { extend } from './utils/general';\nimport { getBounds } from './utils/bounds';\nimport { isString, isUndefined } from './utils/type-check';\n\nconst BOUNDS_FORMAT = ['left', 'top', 'right', 'bottom'];\n\n/**\n * Returns an array of bounds of the format [left, top, right, bottom]\n * @param tether\n * @param to\n * @return {*[]|HTMLElement|ActiveX.IXMLDOMElement}\n */\nfunction getBoundingRect(body, tether, to) {\n  // arg to is required\n  if (!to) {\n    return null;\n  }\n  if (to === 'scrollParent') {\n    to = tether.scrollParents[0];\n  } else if (to === 'window') {\n    to = [pageXOffset, pageYOffset, innerWidth + pageXOffset, innerHeight + pageYOffset];\n  }\n\n  if (to === document) {\n    to = to.documentElement;\n  }\n\n  if (!isUndefined(to.nodeType)) {\n    const node = to;\n    const size = getBounds(body, to);\n    const pos = size;\n    const style = getComputedStyle(to);\n\n    to = [pos.left, pos.top, size.width + pos.left, size.height + pos.top];\n\n    // Account any parent Frames scroll offset\n    if (node.ownerDocument !== document) {\n      let win = node.ownerDocument.defaultView;\n      to[0] += win.pageXOffset;\n      to[1] += win.pageYOffset;\n      to[2] += win.pageXOffset;\n      to[3] += win.pageYOffset;\n    }\n\n    BOUNDS_FORMAT.forEach((side, i) => {\n      side = side[0].toUpperCase() + side.substr(1);\n      if (side === 'Top' || side === 'Left') {\n        to[i] += parseFloat(style[`border${side}Width`]);\n      } else {\n        to[i] -= parseFloat(style[`border${side}Width`]);\n      }\n    });\n  }\n\n  return to;\n}\n\n/**\n * Add out of bounds classes to the list of classes we add to tether\n * @param {string[]} oob An array of directions that are out of bounds\n * @param {string[]} addClasses The array of classes to add to Tether\n * @param {string[]} classes The array of class types for Tether\n * @param {string} classPrefix The prefix to add to the front of the class\n * @param {string} outOfBoundsClass The class to apply when out of bounds\n * @private\n */\nfunction _addOutOfBoundsClass(oob, addClasses, classes, classPrefix, outOfBoundsClass) {\n  if (oob.length) {\n    let oobClass;\n    if (!isUndefined(outOfBoundsClass)) {\n      oobClass = outOfBoundsClass;\n    } else {\n      oobClass = getClass('out-of-bounds', classes, classPrefix);\n    }\n\n    addClasses.push(oobClass);\n    oob.forEach((side) => {\n      addClasses.push(`${oobClass}-${side}`);\n    });\n  }\n}\n\n/**\n * Calculates if out of bounds or pinned in the X direction.\n *\n * @param {number} left\n * @param {number[]} bounds Array of bounds of the format [left, top, right, bottom]\n * @param {number} width\n * @param pin\n * @param pinned\n * @param {string[]} oob\n * @return {number}\n * @private\n */\nfunction _calculateOOBAndPinnedLeft(left, bounds, width, pin, pinned, oob) {\n  if (left < bounds[0]) {\n    if (pin.indexOf('left') >= 0) {\n      left = bounds[0];\n      pinned.push('left');\n    } else {\n      oob.push('left');\n    }\n  }\n\n  if (left + width > bounds[2]) {\n    if (pin.indexOf('right') >= 0) {\n      left = bounds[2] - width;\n      pinned.push('right');\n    } else {\n      oob.push('right');\n    }\n  }\n\n  return left;\n}\n\n/**\n * Calculates if out of bounds or pinned in the Y direction.\n *\n * @param {number} top\n * @param {number[]} bounds Array of bounds of the format [left, top, right, bottom]\n * @param {number} height\n * @param pin\n * @param {string[]} pinned\n * @param {string[]} oob\n * @return {number}\n * @private\n */\nfunction _calculateOOBAndPinnedTop(top, bounds, height, pin, pinned, oob) {\n  if (top < bounds[1]) {\n    if (pin.indexOf('top') >= 0) {\n      top = bounds[1];\n      pinned.push('top');\n    } else {\n      oob.push('top');\n    }\n  }\n\n  if (top + height > bounds[3]) {\n    if (pin.indexOf('bottom') >= 0) {\n      top = bounds[3] - height;\n      pinned.push('bottom');\n    } else {\n      oob.push('bottom');\n    }\n  }\n\n  return top;\n}\n\n/**\n * Flip X \"together\"\n * @param {object} tAttachment The target attachment\n * @param {object} eAttachment The element attachment\n * @param {number[]} bounds Array of bounds of the format [left, top, right, bottom]\n * @param {number} width\n * @param targetWidth\n * @param {number} left\n * @private\n */\nfunction _flipXTogether(tAttachment, eAttachment, bounds, width, targetWidth, left) {\n  if (left < bounds[0] && tAttachment.left === 'left') {\n    if (eAttachment.left === 'right') {\n      left += targetWidth;\n      tAttachment.left = 'right';\n\n      left += width;\n      eAttachment.left = 'left';\n\n    } else if (eAttachment.left === 'left') {\n      left += targetWidth;\n      tAttachment.left = 'right';\n\n      left -= width;\n      eAttachment.left = 'right';\n    }\n\n  } else if (left + width > bounds[2] && tAttachment.left === 'right') {\n    if (eAttachment.left === 'left') {\n      left -= targetWidth;\n      tAttachment.left = 'left';\n\n      left -= width;\n      eAttachment.left = 'right';\n\n    } else if (eAttachment.left === 'right') {\n      left -= targetWidth;\n      tAttachment.left = 'left';\n\n      left += width;\n      eAttachment.left = 'left';\n    }\n\n  } else if (tAttachment.left === 'center') {\n    if (left + width > bounds[2] && eAttachment.left === 'left') {\n      left -= width;\n      eAttachment.left = 'right';\n\n    } else if (left < bounds[0] && eAttachment.left === 'right') {\n      left += width;\n      eAttachment.left = 'left';\n    }\n  }\n\n  return left;\n}\n\n/**\n * Flip Y \"together\"\n * @param {object} tAttachment The target attachment\n * @param {object} eAttachment The element attachment\n * @param {number[]} bounds Array of bounds of the format [left, top, right, bottom]\n * @param {number} height\n * @param targetHeight\n * @param {number} top\n * @private\n */\nfunction _flipYTogether(tAttachment, eAttachment, bounds, height, targetHeight, top) {\n  if (tAttachment.top === 'top') {\n    if (eAttachment.top === 'bottom' && top < bounds[1]) {\n      top += targetHeight;\n      tAttachment.top = 'bottom';\n\n      top += height;\n      eAttachment.top = 'top';\n\n    } else if (eAttachment.top === 'top' && top + height > bounds[3] && top - (height - targetHeight) >= bounds[1]) {\n      top -= height - targetHeight;\n      tAttachment.top = 'bottom';\n\n      eAttachment.top = 'bottom';\n    }\n  }\n\n  if (tAttachment.top === 'bottom') {\n    if (eAttachment.top === 'top' && top + height > bounds[3]) {\n      top -= targetHeight;\n      tAttachment.top = 'top';\n\n      top -= height;\n      eAttachment.top = 'bottom';\n\n    } else if (eAttachment.top === 'bottom' && top < bounds[1] && top + (height * 2 - targetHeight) <= bounds[3]) {\n      top += height - targetHeight;\n      tAttachment.top = 'top';\n\n      eAttachment.top = 'top';\n\n    }\n  }\n\n  if (tAttachment.top === 'middle') {\n    if (top + height > bounds[3] && eAttachment.top === 'top') {\n      top -= height;\n      eAttachment.top = 'bottom';\n\n    } else if (top < bounds[1] && eAttachment.top === 'bottom') {\n      top += height;\n      eAttachment.top = 'top';\n    }\n  }\n\n  return top;\n}\n\n/**\n * Get all the initial classes\n * @param classes\n * @param {string} classPrefix\n * @param constraints\n * @return {[*, *]}\n * @private\n */\nfunction _getAllClasses(classes, classPrefix, constraints) {\n  const allClasses = [getClass('pinned', classes, classPrefix), getClass('out-of-bounds', classes, classPrefix)];\n\n  constraints.forEach((constraint) => {\n    const { outOfBoundsClass, pinnedClass } = constraint;\n    if (outOfBoundsClass) {\n      allClasses.push(outOfBoundsClass);\n    }\n    if (pinnedClass) {\n      allClasses.push(pinnedClass);\n    }\n  });\n\n  allClasses.forEach((cls) => {\n    ['left', 'top', 'right', 'bottom'].forEach((side) => {\n      allClasses.push(`${cls}-${side}`);\n    });\n  });\n\n  return allClasses;\n}\n\nexport default {\n  position({ top, left, targetAttachment }) {\n    if (!this.options.constraints) {\n      return true;\n    }\n\n    let { height, width } = this.cache('element-bounds', () => {\n      return getBounds(this.bodyElement, this.element);\n    });\n\n    if (width === 0 && height === 0 && !isUndefined(this.lastSize)) {\n      // Handle the item getting hidden as a result of our positioning without glitching\n      // the classes in and out\n      ({ width, height } = this.lastSize);\n    }\n\n    const targetSize = this.cache('target-bounds', () => {\n      return this.getTargetBounds();\n    });\n\n    const { height: targetHeight, width: targetWidth } = targetSize;\n    const { classes, classPrefix } = this.options;\n\n    const allClasses = _getAllClasses(classes, classPrefix, this.options.constraints);\n    const addClasses = [];\n\n    const tAttachment = extend({}, targetAttachment);\n    const eAttachment = extend({}, this.attachment);\n\n    this.options.constraints.forEach((constraint) => {\n      let { to, attachment, pin } = constraint;\n\n      if (isUndefined(attachment)) {\n        attachment = '';\n      }\n\n      let changeAttachX, changeAttachY;\n      if (attachment.indexOf(' ') >= 0) {\n        [changeAttachY, changeAttachX] = attachment.split(' ');\n      } else {\n        changeAttachX = changeAttachY = attachment;\n      }\n\n      const bounds = getBoundingRect(this.bodyElement, this, to);\n\n      if (changeAttachY === 'target' || changeAttachY === 'both') {\n        if (top < bounds[1] && tAttachment.top === 'top') {\n          top += targetHeight;\n          tAttachment.top = 'bottom';\n        }\n\n        if (top + height > bounds[3] && tAttachment.top === 'bottom') {\n          top -= targetHeight;\n          tAttachment.top = 'top';\n        }\n      }\n\n      if (changeAttachY === 'together') {\n        top = _flipYTogether(tAttachment, eAttachment, bounds, height, targetHeight, top);\n      }\n\n      if (changeAttachX === 'target' || changeAttachX === 'both') {\n        if (left < bounds[0] && tAttachment.left === 'left') {\n          left += targetWidth;\n          tAttachment.left = 'right';\n        }\n\n        if (left + width > bounds[2] && tAttachment.left === 'right') {\n          left -= targetWidth;\n          tAttachment.left = 'left';\n        }\n      }\n\n      if (changeAttachX === 'together') {\n        left = _flipXTogether(tAttachment, eAttachment, bounds, width, targetWidth, left);\n      }\n\n      if (changeAttachY === 'element' || changeAttachY === 'both') {\n        if (top < bounds[1] && eAttachment.top === 'bottom') {\n          top += height;\n          eAttachment.top = 'top';\n        }\n\n        if (top + height > bounds[3] && eAttachment.top === 'top') {\n          top -= height;\n          eAttachment.top = 'bottom';\n        }\n      }\n\n      if (changeAttachX === 'element' || changeAttachX === 'both') {\n        if (left < bounds[0]) {\n          if (eAttachment.left === 'right') {\n            left += width;\n            eAttachment.left = 'left';\n          } else if (eAttachment.left === 'center') {\n            left += (width / 2);\n            eAttachment.left = 'left';\n          }\n        }\n\n        if (left + width > bounds[2]) {\n          if (eAttachment.left === 'left') {\n            left -= width;\n            eAttachment.left = 'right';\n          } else if (eAttachment.left === 'center') {\n            left -= (width / 2);\n            eAttachment.left = 'right';\n          }\n        }\n      }\n\n      if (isString(pin)) {\n        pin = pin.split(',').map((p) => p.trim());\n      } else if (pin === true) {\n        pin = ['top', 'left', 'right', 'bottom'];\n      }\n\n      pin = pin || [];\n\n      const pinned = [];\n      const oob = [];\n\n      left = _calculateOOBAndPinnedLeft(left, bounds, width, pin, pinned, oob);\n      top = _calculateOOBAndPinnedTop(top, bounds, height, pin, pinned, oob);\n\n      if (pinned.length) {\n        let pinnedClass;\n        if (!isUndefined(this.options.pinnedClass)) {\n          pinnedClass = this.options.pinnedClass;\n        } else {\n          pinnedClass = getClass('pinned', classes, classPrefix);\n        }\n\n        addClasses.push(pinnedClass);\n        pinned.forEach((side) => {\n          addClasses.push(`${pinnedClass}-${side}`);\n        });\n      }\n\n      _addOutOfBoundsClass(oob, addClasses, classes, classPrefix, this.options.outOfBoundsClass);\n\n      if (pinned.indexOf('left') >= 0 || pinned.indexOf('right') >= 0) {\n        eAttachment.left = tAttachment.left = false;\n      }\n      if (pinned.indexOf('top') >= 0 || pinned.indexOf('bottom') >= 0) {\n        eAttachment.top = tAttachment.top = false;\n      }\n\n      if (tAttachment.top !== targetAttachment.top ||\n        tAttachment.left !== targetAttachment.left ||\n        eAttachment.top !== this.attachment.top ||\n        eAttachment.left !== this.attachment.left) {\n        this.updateAttachClasses(eAttachment, tAttachment);\n        this.trigger('update', {\n          attachment: eAttachment,\n          targetAttachment: tAttachment\n        });\n      }\n    });\n\n    defer(() => {\n      if (!(this.options.addTargetClasses === false)) {\n        updateClasses(this.target, addClasses, allClasses);\n      }\n      updateClasses(this.element, addClasses, allClasses);\n    });\n\n    return { top, left };\n  }\n};\n","import { isFunction, isString } from './utils/type-check';\n\nexport default {\n  position({ top, left }) {\n    if (!this.options.shift) {\n      return;\n    }\n\n    let { shift } = this.options;\n    if (isFunction(shift)) {\n      shift = shift.call(this, { top, left });\n    }\n\n    let shiftTop, shiftLeft;\n    if (isString(shift)) {\n      shift = shift.split(' ');\n      shift[1] = shift[1] || shift[0];\n\n      ([shiftTop, shiftLeft] = shift);\n\n      shiftTop = parseFloat(shiftTop, 10);\n      shiftLeft = parseFloat(shiftLeft, 10);\n    } else {\n      ([shiftTop, shiftLeft] = [shift.top, shift.left]);\n    }\n\n    top += shiftTop;\n    left += shiftLeft;\n\n    return { top, left };\n  }\n};\n","import { isUndefined } from './utils/type-check';\n\nexport class Evented {\n  on(event, handler, ctx, once = false) {\n    if (isUndefined(this.bindings)) {\n      this.bindings = {};\n    }\n    if (isUndefined(this.bindings[event])) {\n      this.bindings[event] = [];\n    }\n    this.bindings[event].push({ handler, ctx, once });\n\n    return this;\n  }\n\n  once(event, handler, ctx) {\n    return this.on(event, handler, ctx, true);\n  }\n\n  off(event, handler) {\n    if (isUndefined(this.bindings) ||\n      isUndefined(this.bindings[event])) {\n      return this;\n    }\n\n    if (isUndefined(handler)) {\n      delete this.bindings[event];\n    } else {\n      this.bindings[event].forEach((binding, index) => {\n        if (binding.handler === handler) {\n          this.bindings[event].splice(index, 1);\n        }\n      });\n    }\n\n    return this;\n  }\n\n  trigger(event, ...args) {\n    if (!isUndefined(this.bindings) && this.bindings[event]) {\n      this.bindings[event].forEach((binding, index) => {\n        const { ctx, handler, once } = binding;\n\n        const context = ctx || this;\n\n        handler.apply(context, args);\n\n        if (once) {\n          this.bindings[event].splice(index, 1);\n        }\n      });\n    }\n\n    return this;\n  }\n}\n","import { isString, isUndefined } from './type-check';\n\nconst MIRROR_LR = {\n  center: 'center',\n  left: 'right',\n  right: 'left'\n};\n\nconst MIRROR_TB = {\n  middle: 'middle',\n  top: 'bottom',\n  bottom: 'top'\n};\n\nconst OFFSET_MAP = {\n  top: 0,\n  left: 0,\n  middle: '50%',\n  center: '50%',\n  bottom: '100%',\n  right: '100%'\n};\n\nexport function addOffset(...offsets) {\n  const out = { top: 0, left: 0 };\n\n  offsets.forEach(({ top, left }) => {\n    if (isString(top)) {\n      top = parseFloat(top);\n    }\n    if (isString(left)) {\n      left = parseFloat(left);\n    }\n\n    out.top += top;\n    out.left += left;\n  });\n\n  return out;\n}\n\nexport function attachmentToOffset(attachment) {\n  let { left, top } = attachment;\n\n  if (!isUndefined(OFFSET_MAP[attachment.left])) {\n    left = OFFSET_MAP[attachment.left];\n  }\n\n  if (!isUndefined(OFFSET_MAP[attachment.top])) {\n    top = OFFSET_MAP[attachment.top];\n  }\n\n  return { left, top };\n}\n\nexport function autoToFixedAttachment(attachment, relativeToAttachment) {\n  let { left, top } = attachment;\n\n  if (left === 'auto') {\n    left = MIRROR_LR[relativeToAttachment.left];\n  }\n\n  if (top === 'auto') {\n    top = MIRROR_TB[relativeToAttachment.top];\n  }\n\n  return { left, top };\n}\n\nexport function offsetToPx(offset, size) {\n  if (isString(offset.left) && offset.left.indexOf('%') !== -1) {\n    offset.left = parseFloat(offset.left) / 100 * size.width;\n  }\n  if (isString(offset.top) && offset.top.indexOf('%') !== -1) {\n    offset.top = parseFloat(offset.top) / 100 * size.height;\n  }\n\n  return offset;\n}\n\nexport function parseTopLeft(value) {\n  const [top, left] = value.split(' ');\n  return { top, left };\n}\n","import { isUndefined } from './type-check';\n\nexport function getScrollParents(el) {\n  // In firefox if the el is inside an iframe with display: none; window.getComputedStyle() will return null;\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n  const computedStyle = getComputedStyle(el) || {};\n  const { position } = computedStyle;\n  let parents = [];\n\n  if (position === 'fixed') {\n    return [el];\n  }\n\n  let parent = el;\n  while ((parent = parent.parentNode) && parent && parent.nodeType === 1) {\n    let style;\n    try {\n      style = getComputedStyle(parent);\n    } catch (err) {\n      // Intentionally blank\n    }\n\n    if (isUndefined(style) || style === null) {\n      parents.push(parent);\n      return parents;\n    }\n\n    const { overflow, overflowX, overflowY } = style;\n    if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) {\n      if (position !== 'absolute' || ['relative', 'absolute', 'fixed'].indexOf(style.position) >= 0) {\n        parents.push(parent);\n      }\n    }\n  }\n\n  parents.push(el.ownerDocument.body);\n\n  // If the node is within a frame, account for the parent window scroll\n  if (el.ownerDocument !== document) {\n    parents.push(el.ownerDocument.defaultView);\n  }\n\n  return parents;\n}\n\nexport function getOffsetParent(el) {\n  return el.offsetParent || document.documentElement;\n}\n","import '../css/tether.scss';\nimport '../css/tether-theme-arrows.scss';\nimport '../css/tether-theme-arrows-dark.scss';\nimport '../css/tether-theme-basic.scss';\nimport Abutment from './abutment';\nimport Constraint from './constraint';\nimport Shift from './shift';\nimport { Evented } from './evented';\nimport {\n  addClass,\n  getClass,\n  removeClass,\n  updateClasses\n} from './utils/classes';\nimport { defer, flush } from './utils/deferred';\nimport { extend, getScrollBarSize } from './utils/general';\nimport {\n  addOffset,\n  attachmentToOffset,\n  autoToFixedAttachment,\n  offsetToPx,\n  parseTopLeft\n} from './utils/offset';\nimport {\n  getBounds,\n  getScrollHandleBounds,\n  getVisibleBounds,\n  removeUtilElements\n} from './utils/bounds';\nimport { getOffsetParent, getScrollParents } from './utils/parents';\nimport { isNumber, isObject, isString, isUndefined } from './utils/type-check';\n\nconst TetherBase = { modules: [Constraint, Abutment, Shift] };\n\nfunction isFullscreenElement(e) {\n  let d = e.ownerDocument;\n  let fe =\n    d.fullscreenElement ||\n    d.webkitFullscreenElement ||\n    d.mozFullScreenElement ||\n    d.msFullscreenElement;\n  return fe === e;\n}\n\nfunction within(a, b, diff = 1) {\n  return a + diff >= b && b >= a - diff;\n}\n\nconst transformKey = (() => {\n  if (isUndefined(document)) {\n    return '';\n  }\n  const el = document.createElement('div');\n\n  const transforms = [\n    'transform',\n    'WebkitTransform',\n    'OTransform',\n    'MozTransform',\n    'msTransform'\n  ];\n  for (let i = 0; i < transforms.length; ++i) {\n    const key = transforms[i];\n    if (el.style[key] !== undefined) {\n      return key;\n    }\n  }\n})();\n\nconst tethers = [];\n\nconst position = () => {\n  tethers.forEach((tether) => {\n    tether.position(false);\n  });\n  flush();\n};\n\nfunction now() {\n  return performance.now();\n}\n\n(() => {\n  let lastCall = null;\n  let lastDuration = null;\n  let pendingTimeout = null;\n\n  const tick = () => {\n    if (!isUndefined(lastDuration) && lastDuration > 16) {\n      // We voluntarily throttle ourselves if we can't manage 60fps\n      lastDuration = Math.min(lastDuration - 16, 250);\n\n      // Just in case this is the last event, remember to position just once more\n      pendingTimeout = setTimeout(tick, 250);\n      return;\n    }\n\n    if (!isUndefined(lastCall) && now() - lastCall < 10) {\n      // Some browsers call events a little too frequently, refuse to run more than is reasonable\n      return;\n    }\n\n    if (pendingTimeout != null) {\n      clearTimeout(pendingTimeout);\n      pendingTimeout = null;\n    }\n\n    lastCall = now();\n    position();\n    lastDuration = now() - lastCall;\n  };\n\n  if (!isUndefined(window) && !isUndefined(window.addEventListener)) {\n    ['resize', 'scroll', 'touchmove'].forEach((event) => {\n      window.addEventListener(event, tick);\n    });\n  }\n})();\n\nclass TetherClass extends Evented {\n  constructor(options) {\n    super();\n    this.position = this.position.bind(this);\n\n    tethers.push(this);\n\n    this.history = [];\n\n    this.setOptions(options, false);\n\n    TetherBase.modules.forEach((module) => {\n      if (!isUndefined(module.initialize)) {\n        module.initialize.call(this);\n      }\n    });\n\n    this.position();\n  }\n\n  setOptions(options, pos = true) {\n    const defaults = {\n      offset: '0 0',\n      targetOffset: '0 0',\n      targetAttachment: 'auto auto',\n      classPrefix: 'tether',\n      bodyElement: document.body\n    };\n\n    this.options = extend(defaults, options);\n\n    let { element, target, targetModifier, bodyElement } = this.options;\n    this.element = element;\n    this.target = target;\n    this.targetModifier = targetModifier;\n\n    if (typeof bodyElement === 'string') {\n      bodyElement = document.querySelector(bodyElement);\n    }\n    this.bodyElement = bodyElement;\n\n    if (this.target === 'viewport') {\n      this.target = document.body;\n      this.targetModifier = 'visible';\n    } else if (this.target === 'scroll-handle') {\n      this.target = document.body;\n      this.targetModifier = 'scroll-handle';\n    }\n\n    ['element', 'target'].forEach((key) => {\n      if (isUndefined(this[key])) {\n        throw new Error(\n          'Tether Error: Both element and target must be defined'\n        );\n      }\n\n      if (!isUndefined(this[key].jquery)) {\n        this[key] = this[key][0];\n      } else if (isString(this[key])) {\n        this[key] = document.querySelector(this[key]);\n      }\n    });\n\n    this._addClasses();\n\n    if (!this.options.attachment) {\n      throw new Error('Tether Error: You must provide an attachment');\n    }\n\n    this.targetAttachment = parseTopLeft(this.options.targetAttachment);\n    this.attachment = parseTopLeft(this.options.attachment);\n    this.offset = parseTopLeft(this.options.offset);\n    this.targetOffset = parseTopLeft(this.options.targetOffset);\n\n    if (!isUndefined(this.scrollParents)) {\n      this.disable();\n    }\n\n    if (this.targetModifier === 'scroll-handle') {\n      this.scrollParents = [this.target];\n    } else {\n      this.scrollParents = getScrollParents(this.target);\n    }\n\n    if (!(this.options.enabled === false)) {\n      this.enable(pos);\n    }\n  }\n\n  getTargetBounds() {\n    if (!isUndefined(this.targetModifier)) {\n      if (this.targetModifier === 'visible') {\n        return getVisibleBounds(this.bodyElement, this.target);\n      } else if (this.targetModifier === 'scroll-handle') {\n        return getScrollHandleBounds(this.bodyElement, this.target);\n      }\n    } else {\n      return getBounds(this.bodyElement, this.target);\n    }\n  }\n\n  clearCache() {\n    this._cache = {};\n  }\n\n  cache(k, getter) {\n    // More than one module will often need the same DOM info, so\n    // we keep a cache which is cleared on each position call\n    if (isUndefined(this._cache)) {\n      this._cache = {};\n    }\n\n    if (isUndefined(this._cache[k])) {\n      this._cache[k] = getter.call(this);\n    }\n\n    return this._cache[k];\n  }\n\n  enable(pos = true) {\n    const { classes, classPrefix } = this.options;\n    if (!(this.options.addTargetClasses === false)) {\n      addClass(this.target, getClass('enabled', classes, classPrefix));\n    }\n    addClass(this.element, getClass('enabled', classes, classPrefix));\n    this.enabled = true;\n\n    this.scrollParents.forEach((parent) => {\n      if (parent !== this.target.ownerDocument) {\n        parent.addEventListener('scroll', this.position);\n      }\n    });\n\n    if (pos) {\n      this.position();\n    }\n  }\n\n  disable() {\n    const { classes, classPrefix } = this.options;\n    removeClass(this.target, getClass('enabled', classes, classPrefix));\n    removeClass(this.element, getClass('enabled', classes, classPrefix));\n    this.enabled = false;\n\n    if (!isUndefined(this.scrollParents)) {\n      this.scrollParents.forEach((parent) => {\n        if (parent && parent.removeEventListener) {\n          parent.removeEventListener('scroll', this.position);\n        }\n      });\n    }\n  }\n\n  destroy() {\n    this.disable();\n\n    this._removeClasses();\n\n    tethers.forEach((tether, i) => {\n      if (tether === this) {\n        tethers.splice(i, 1);\n      }\n    });\n\n    // Remove any elements we were using for convenience from the DOM\n    if (tethers.length === 0) {\n      removeUtilElements(this.bodyElement);\n    }\n  }\n\n  updateAttachClasses(elementAttach, targetAttach) {\n    elementAttach = elementAttach || this.attachment;\n    targetAttach = targetAttach || this.targetAttachment;\n    const sides = ['left', 'top', 'bottom', 'right', 'middle', 'center'];\n    const { classes, classPrefix } = this.options;\n\n    if (!isUndefined(this._addAttachClasses) && this._addAttachClasses.length) {\n      // updateAttachClasses can be called more than once in a position call, so\n      // we need to clean up after ourselves such that when the last defer gets\n      // ran it doesn't add any extra classes from previous calls.\n      this._addAttachClasses.splice(0, this._addAttachClasses.length);\n    }\n\n    if (isUndefined(this._addAttachClasses)) {\n      this._addAttachClasses = [];\n    }\n    this.add = this._addAttachClasses;\n\n    if (elementAttach.top) {\n      this.add.push(\n        `${getClass('element-attached', classes, classPrefix)}-${\n          elementAttach.top\n        }`\n      );\n    }\n    if (elementAttach.left) {\n      this.add.push(\n        `${getClass('element-attached', classes, classPrefix)}-${\n          elementAttach.left\n        }`\n      );\n    }\n    if (targetAttach.top) {\n      this.add.push(\n        `${getClass('target-attached', classes, classPrefix)}-${\n          targetAttach.top\n        }`\n      );\n    }\n    if (targetAttach.left) {\n      this.add.push(\n        `${getClass('target-attached', classes, classPrefix)}-${\n          targetAttach.left\n        }`\n      );\n    }\n\n    this.all = [];\n    sides.forEach((side) => {\n      this.all.push(\n        `${getClass('element-attached', classes, classPrefix)}-${side}`\n      );\n      this.all.push(\n        `${getClass('target-attached', classes, classPrefix)}-${side}`\n      );\n    });\n\n    defer(() => {\n      if (isUndefined(this._addAttachClasses)) {\n        return;\n      }\n\n      updateClasses(this.element, this._addAttachClasses, this.all);\n      if (!(this.options.addTargetClasses === false)) {\n        updateClasses(this.target, this._addAttachClasses, this.all);\n      }\n\n      delete this._addAttachClasses;\n    });\n  }\n\n  position(flushChanges = true) {\n    // flushChanges commits the changes immediately, leave true unless you are positioning multiple\n    // tethers (in which case call Tether.Utils.flush yourself when you're done)\n\n    if (!this.enabled) {\n      return;\n    }\n\n    this.clearCache();\n\n    // Turn 'auto' attachments into the appropriate corner or edge\n    const targetAttachment = autoToFixedAttachment(\n      this.targetAttachment,\n      this.attachment\n    );\n\n    this.updateAttachClasses(this.attachment, targetAttachment);\n\n    const elementPos = this.cache('element-bounds', () => {\n      return getBounds(this.bodyElement, this.element);\n    });\n\n    let { width, height } = elementPos;\n\n    if (width === 0 && height === 0 && !isUndefined(this.lastSize)) {\n      // We cache the height and width to make it possible to position elements that are\n      // getting hidden.\n      ({ width, height } = this.lastSize);\n    } else {\n      this.lastSize = { width, height };\n    }\n\n    const targetPos = this.cache('target-bounds', () => {\n      return this.getTargetBounds();\n    });\n    const targetSize = targetPos;\n\n    // Get an actual px offset from the attachment\n    let offset = offsetToPx(attachmentToOffset(this.attachment), {\n      width,\n      height\n    });\n    let targetOffset = offsetToPx(\n      attachmentToOffset(targetAttachment),\n      targetSize\n    );\n\n    const manualOffset = offsetToPx(this.offset, { width, height });\n    const manualTargetOffset = offsetToPx(this.targetOffset, targetSize);\n\n    // Add the manually provided offset\n    offset = addOffset(offset, manualOffset);\n    targetOffset = addOffset(targetOffset, manualTargetOffset);\n\n    // It's now our goal to make (element position + offset) == (target position + target offset)\n    let left = targetPos.left + targetOffset.left - offset.left;\n    let top = targetPos.top + targetOffset.top - offset.top;\n\n    for (let i = 0; i < TetherBase.modules.length; ++i) {\n      const module = TetherBase.modules[i];\n      const ret = module.position.call(this, {\n        left,\n        top,\n        targetAttachment,\n        targetPos,\n        elementPos,\n        offset,\n        targetOffset,\n        manualOffset,\n        manualTargetOffset,\n        scrollbarSize,\n        attachment: this.attachment\n      });\n\n      if (ret === false) {\n        return false;\n      } else if (isUndefined(ret) || !isObject(ret)) {\n        continue;\n      } else {\n        ({ top, left } = ret);\n      }\n    }\n\n    // We describe the position three different ways to give the optimizer\n    // a chance to decide the best possible way to position the element\n    // with the fewest repaints.\n    const next = {\n      // It's position relative to the page (absolute positioning when\n      // the element is a child of the body)\n      page: {\n        top,\n        left\n      },\n\n      // It's position relative to the viewport (fixed positioning)\n      viewport: {\n        top: top - pageYOffset,\n        bottom: pageYOffset - top - height + innerHeight,\n        left: left - pageXOffset,\n        right: pageXOffset - left - width + innerWidth\n      }\n    };\n\n    let doc = this.target.ownerDocument;\n    let win = doc.defaultView;\n\n    let scrollbarSize;\n    if (win.innerHeight > doc.documentElement.clientHeight) {\n      scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);\n      next.viewport.bottom -= scrollbarSize.height;\n    }\n\n    if (win.innerWidth > doc.documentElement.clientWidth) {\n      scrollbarSize = this.cache('scrollbar-size', getScrollBarSize);\n      next.viewport.right -= scrollbarSize.width;\n    }\n\n    if (\n      ['', 'static'].indexOf(doc.body.style.position) === -1 ||\n      ['', 'static'].indexOf(doc.body.parentElement.style.position) === -1\n    ) {\n      // Absolute positioning in the body will be relative to the page, not the 'initial containing block'\n      next.page.bottom = doc.body.scrollHeight - top - height;\n      next.page.right = doc.body.scrollWidth - left - width;\n    }\n\n    if (\n      !isUndefined(this.options.optimizations) &&\n      this.options.optimizations.moveElement !== false &&\n      isUndefined(this.targetModifier)\n    ) {\n      const offsetParent = this.cache('target-offsetparent', () =>\n        getOffsetParent(this.target)\n      );\n      const offsetPosition = this.cache('target-offsetparent-bounds', () =>\n        getBounds(this.bodyElement, offsetParent)\n      );\n      const offsetParentStyle = getComputedStyle(offsetParent);\n      const offsetParentSize = offsetPosition;\n\n      const offsetBorder = {};\n      ['Top', 'Left', 'Bottom', 'Right'].forEach((side) => {\n        offsetBorder[side.toLowerCase()] = parseFloat(\n          offsetParentStyle[`border${side}Width`]\n        );\n      });\n\n      offsetPosition.right =\n        doc.body.scrollWidth -\n        offsetPosition.left -\n        offsetParentSize.width +\n        offsetBorder.right;\n      offsetPosition.bottom =\n        doc.body.scrollHeight -\n        offsetPosition.top -\n        offsetParentSize.height +\n        offsetBorder.bottom;\n\n      if (\n        next.page.top >= offsetPosition.top + offsetBorder.top &&\n        next.page.bottom >= offsetPosition.bottom\n      ) {\n        if (\n          next.page.left >= offsetPosition.left + offsetBorder.left &&\n          next.page.right >= offsetPosition.right\n        ) {\n          // We're within the visible part of the target's scroll parent\n          const { scrollLeft, scrollTop } = offsetParent;\n\n          // It's position relative to the target's offset parent (absolute positioning when\n          // the element is moved to be a child of the target's offset parent).\n          next.offset = {\n            top:\n              next.page.top - offsetPosition.top + scrollTop - offsetBorder.top,\n            left:\n              next.page.left -\n              offsetPosition.left +\n              scrollLeft -\n              offsetBorder.left\n          };\n        }\n      }\n    }\n\n    // We could also travel up the DOM and try each containing context, rather than only\n    // looking at the body, but we're gonna get diminishing returns.\n\n    this.move(next);\n\n    this.history.unshift(next);\n\n    if (this.history.length > 3) {\n      this.history.pop();\n    }\n\n    if (flushChanges) {\n      flush();\n    }\n\n    return true;\n  }\n\n  // THE ISSUE\n  move(pos) {\n    if (isUndefined(this.element.parentNode)) {\n      return;\n    }\n\n    const same = {};\n\n    for (let type in pos) {\n      same[type] = {};\n\n      for (let key in pos[type]) {\n        let found = false;\n\n        for (let i = 0; i < this.history.length; ++i) {\n          const point = this.history[i];\n          if (\n            !isUndefined(point[type]) &&\n            !within(point[type][key], pos[type][key])\n          ) {\n            found = true;\n            break;\n          }\n        }\n\n        if (!found) {\n          same[type][key] = true;\n        }\n      }\n    }\n\n    let css = { top: '', left: '', right: '', bottom: '' };\n\n    const transcribe = (_same, _pos) => {\n      const hasOptimizations = !isUndefined(this.options.optimizations);\n      const gpu = hasOptimizations ? this.options.optimizations.gpu : null;\n      if (gpu !== false) {\n        let yPos, xPos;\n        if (_same.top) {\n          css.top = 0;\n          yPos = _pos.top;\n        } else {\n          css.bottom = 0;\n          yPos = -_pos.bottom;\n        }\n\n        if (_same.left) {\n          css.left = 0;\n          xPos = _pos.left;\n        } else {\n          css.right = 0;\n          xPos = -_pos.right;\n        }\n\n        if (isNumber(window.devicePixelRatio) && devicePixelRatio % 1 === 0) {\n          xPos = Math.round(xPos * devicePixelRatio) / devicePixelRatio;\n          yPos = Math.round(yPos * devicePixelRatio) / devicePixelRatio;\n        }\n\n        css[transformKey] = `translateX(${xPos}px) translateY(${yPos}px)`;\n\n        if (transformKey !== 'msTransform') {\n          // The Z transform will keep this in the GPU (faster, and prevents artifacts),\n          // but IE9 doesn't support 3d transforms and will choke.\n          css[transformKey] += ' translateZ(0)';\n        }\n      } else {\n        if (_same.top) {\n          css.top = `${_pos.top}px`;\n        } else {\n          css.bottom = `${_pos.bottom}px`;\n        }\n\n        if (_same.left) {\n          css.left = `${_pos.left}px`;\n        } else {\n          css.right = `${_pos.right}px`;\n        }\n      }\n    };\n\n    const hasOptimizations = !isUndefined(this.options.optimizations);\n    let allowPositionFixed = true;\n\n    if (\n      hasOptimizations &&\n      this.options.optimizations.allowPositionFixed === false\n    ) {\n      allowPositionFixed = false;\n    }\n\n    let moved = false;\n    if (\n      (same.page.top || same.page.bottom) &&\n      (same.page.left || same.page.right)\n    ) {\n      css.position = 'absolute';\n      transcribe(same.page, pos.page);\n    } else if (\n      allowPositionFixed &&\n      (same.viewport.top || same.viewport.bottom) &&\n      (same.viewport.left || same.viewport.right)\n    ) {\n      css.position = 'fixed';\n      transcribe(same.viewport, pos.viewport);\n    } else if (\n      !isUndefined(same.offset) &&\n      same.offset.top &&\n      same.offset.left\n    ) {\n      css.position = 'absolute';\n      const offsetParent = this.cache('target-offsetparent', () =>\n        getOffsetParent(this.target)\n      );\n\n      if (getOffsetParent(this.element) !== offsetParent) {\n        defer(() => {\n          this.element.parentNode.removeChild(this.element);\n          offsetParent.appendChild(this.element);\n        });\n      }\n\n      transcribe(same.offset, pos.offset);\n      moved = true;\n    } else {\n      css.position = 'absolute';\n      transcribe({ top: true, left: true }, pos.page);\n    }\n\n    if (!moved) {\n      if (this.options.bodyElement) {\n        if (this.element.parentNode !== this.options.bodyElement) {\n          this.options.bodyElement.appendChild(this.element);\n        }\n      } else {\n        let offsetParentIsBody = true;\n\n        let currentNode = this.element.parentNode;\n        while (\n          currentNode &&\n          currentNode.nodeType === 1 &&\n          currentNode.tagName !== 'BODY' &&\n          !isFullscreenElement(currentNode)\n        ) {\n          if (getComputedStyle(currentNode).position !== 'static') {\n            offsetParentIsBody = false;\n            break;\n          }\n\n          currentNode = currentNode.parentNode;\n        }\n\n        if (!offsetParentIsBody) {\n          this.element.parentNode.removeChild(this.element);\n          this.element.ownerDocument.body.appendChild(this.element);\n        }\n      }\n    }\n\n    // Any css change will trigger a repaint, so let's avoid one if nothing changed\n    const writeCSS = {};\n    let write = false;\n    for (let key in css) {\n      let val = css[key];\n      let elVal = this.element.style[key];\n\n      if (elVal !== val) {\n        write = true;\n        writeCSS[key] = val;\n      }\n    }\n\n    if (write) {\n      defer(() => {\n        extend(this.element.style, writeCSS);\n        this.trigger('repositioned');\n      });\n    }\n  }\n\n  _addClasses() {\n    const { classes, classPrefix } = this.options;\n    addClass(this.element, getClass('element', classes, classPrefix));\n    if (!(this.options.addTargetClasses === false)) {\n      addClass(this.target, getClass('target', classes, classPrefix));\n    }\n  }\n\n  _removeClasses() {\n    const { classes, classPrefix } = this.options;\n    removeClass(this.element, getClass('element', classes, classPrefix));\n    if (!(this.options.addTargetClasses === false)) {\n      removeClass(this.target, getClass('target', classes, classPrefix));\n    }\n\n    this.all.forEach((className) => {\n      this.element.classList.remove(className);\n      this.target.classList.remove(className);\n    });\n  }\n}\n\nTetherClass.modules = [];\n\nTetherBase.position = position;\n\nlet Tether = extend(TetherClass, TetherBase);\n\nTether.modules.push({\n  initialize() {\n    const { classes, classPrefix } = this.options;\n    this.markers = {};\n\n    ['target', 'element'].forEach((type) => {\n      const el = document.createElement('div');\n      el.className = getClass(`${type}-marker`, classes, classPrefix);\n\n      const dot = document.createElement('div');\n      dot.className = getClass('marker-dot', classes, classPrefix);\n      el.appendChild(dot);\n\n      this[type].appendChild(el);\n\n      this.markers[type] = { dot, el };\n    });\n  },\n\n  position({ manualOffset, manualTargetOffset }) {\n    const offsets = {\n      element: manualOffset,\n      target: manualTargetOffset\n    };\n\n    for (let type in offsets) {\n      const offset = offsets[type];\n      for (let side in offset) {\n        let val = offset[side];\n        if (\n          !isString(val) ||\n          (val.indexOf('%') === -1 && val.indexOf('px') === -1)\n        ) {\n          val += 'px';\n        }\n\n        if (this.markers[type] && this.markers[type].dot?.style[side] !== val) {\n          this.markers[type].dot.style[side] = val;\n        }\n      }\n    }\n\n    return true;\n  }\n});\n\nexport default Tether;\n","import {\n  type TrackedStorage,\n  createStorage,\n  getValue,\n  setValue,\n} from 'ember-tracked-storage-polyfill';\n\nexport class TrackedMap<K = unknown, V = unknown> implements Map<K, V> {\n  private collection = createStorage(null, () => false);\n\n  private storages: Map<K, TrackedStorage<null>> = new Map();\n\n  private vals: Map<K, V>;\n\n  private readStorageFor(key: K): void {\n    const { storages } = this;\n    let storage = storages.get(key);\n\n    if (storage === undefined) {\n      storage = createStorage(null, () => false);\n      storages.set(key, storage);\n    }\n\n    getValue(storage);\n  }\n\n  private dirtyStorageFor(key: K): void {\n    const storage = this.storages.get(key);\n\n    if (storage) {\n      setValue(storage, null);\n    }\n  }\n\n  constructor();\n  constructor(entries: readonly (readonly [K, V])[] | null);\n  constructor(iterable: Iterable<readonly [K, V]>);\n  constructor(\n    existing?:\n      | readonly (readonly [K, V])[]\n      | Iterable<readonly [K, V]>\n      | null\n      | undefined,\n  ) {\n    // TypeScript doesn't correctly resolve the overloads for calling the `Map`\n    // constructor for the no-value constructor. This resolves that.\n    this.vals = existing ? new Map(existing) : new Map();\n  }\n\n  // **** KEY GETTERS ****\n  get(key: K): V | undefined {\n    // entangle the storage for the key\n    this.readStorageFor(key);\n\n    return this.vals.get(key);\n  }\n\n  has(key: K): boolean {\n    this.readStorageFor(key);\n\n    return this.vals.has(key);\n  }\n\n  // **** ALL GETTERS ****\n  entries() {\n    getValue(this.collection);\n\n    return this.vals.entries();\n  }\n\n  keys() {\n    getValue(this.collection);\n\n    return this.vals.keys();\n  }\n\n  values() {\n    getValue(this.collection);\n\n    return this.vals.values();\n  }\n\n  forEach(fn: (value: V, key: K, map: Map<K, V>) => void): void {\n    getValue(this.collection);\n\n    this.vals.forEach(fn);\n  }\n\n  get size(): number {\n    getValue(this.collection);\n\n    return this.vals.size;\n  }\n\n  [Symbol.iterator]() {\n    getValue(this.collection);\n\n    return this.vals[Symbol.iterator]();\n  }\n\n  get [Symbol.toStringTag](): string {\n    return this.vals[Symbol.toStringTag];\n  }\n\n  // **** KEY SETTERS ****\n  set(key: K, value: V): this {\n    this.dirtyStorageFor(key);\n    setValue(this.collection, null);\n\n    this.vals.set(key, value);\n\n    return this;\n  }\n\n  delete(key: K): boolean {\n    this.dirtyStorageFor(key);\n    setValue(this.collection, null);\n\n    this.storages.delete(key);\n    return this.vals.delete(key);\n  }\n\n  // **** ALL SETTERS ****\n  clear(): void {\n    this.storages.forEach((s) => setValue(s, null));\n    this.storages.clear();\n\n    setValue(this.collection, null);\n    this.vals.clear();\n  }\n}\n\n// So instanceof works\nObject.setPrototypeOf(TrackedMap.prototype, Map.prototype);\n\nexport class TrackedWeakMap<K extends object = object, V = unknown>\n  implements WeakMap<K, V>\n{\n  private storages: WeakMap<K, TrackedStorage<null>> = new WeakMap();\n\n  private vals: WeakMap<K, V>;\n\n  private readStorageFor(key: K): void {\n    const { storages } = this;\n    let storage = storages.get(key);\n\n    if (storage === undefined) {\n      storage = createStorage(null, () => false);\n      storages.set(key, storage);\n    }\n\n    getValue(storage);\n  }\n\n  private dirtyStorageFor(key: K): void {\n    const storage = this.storages.get(key);\n\n    if (storage) {\n      setValue(storage, null);\n    }\n  }\n\n  constructor();\n  constructor(iterable: Iterable<readonly [K, V]>);\n  constructor(entries: readonly [K, V][] | null);\n  constructor(\n    existing?: readonly [K, V][] | Iterable<readonly [K, V]> | null | undefined,\n  ) {\n    // TypeScript doesn't correctly resolve the overloads for calling the `Map`\n    // constructor for the no-value constructor. This resolves that.\n    this.vals = existing ? new WeakMap(existing) : new WeakMap();\n  }\n\n  get(key: K): V | undefined {\n    this.readStorageFor(key);\n\n    return this.vals.get(key);\n  }\n\n  has(key: K): boolean {\n    this.readStorageFor(key);\n\n    return this.vals.has(key);\n  }\n\n  set(key: K, value: V): this {\n    this.dirtyStorageFor(key);\n\n    this.vals.set(key, value);\n\n    return this;\n  }\n\n  delete(key: K): boolean {\n    this.dirtyStorageFor(key);\n\n    this.storages.delete(key);\n    return this.vals.delete(key);\n  }\n\n  get [Symbol.toStringTag](): string {\n    return this.vals[Symbol.toStringTag];\n  }\n}\n\n// So instanceof works\nObject.setPrototypeOf(TrackedWeakMap.prototype, WeakMap.prototype);\n","import {\n  type TrackedStorage,\n  createStorage,\n  getValue,\n  setValue,\n} from 'ember-tracked-storage-polyfill';\n\nexport class TrackedSet<T = unknown> implements Set<T> {\n  private collection = createStorage(null, () => false);\n\n  private storages: Map<T, TrackedStorage<null>> = new Map();\n\n  private vals: Set<T>;\n\n  private storageFor(key: T): TrackedStorage<null> {\n    const storages = this.storages;\n    let storage = storages.get(key);\n\n    if (storage === undefined) {\n      storage = createStorage(null, () => false);\n      storages.set(key, storage);\n    }\n\n    return storage;\n  }\n\n  private dirtyStorageFor(key: T): void {\n    const storage = this.storages.get(key);\n\n    if (storage) {\n      setValue(storage, null);\n    }\n  }\n\n  constructor();\n  constructor(values: readonly T[] | null);\n  constructor(iterable: Iterable<T>);\n  constructor(existing?: readonly T[] | Iterable<T> | null | undefined) {\n    this.vals = new Set(existing);\n  }\n\n  // **** KEY GETTERS ****\n  has(value: T): boolean {\n    getValue(this.storageFor(value));\n\n    return this.vals.has(value);\n  }\n\n  // **** ALL GETTERS ****\n  entries() {\n    getValue(this.collection);\n\n    return this.vals.entries();\n  }\n\n  keys() {\n    getValue(this.collection);\n\n    return this.vals.keys();\n  }\n\n  values() {\n    getValue(this.collection);\n\n    return this.vals.values();\n  }\n\n  union<U>(other: ReadonlySetLike<U>): Set<T | U> {\n    getValue(this.collection);\n\n    return this.vals.union(other);\n  }\n\n  intersection<U>(other: ReadonlySetLike<U>): Set<T & U> {\n    getValue(this.collection);\n\n    return this.vals.intersection(other);\n  }\n\n  difference<U>(other: ReadonlySetLike<U>): Set<T> {\n    getValue(this.collection);\n\n    return this.vals.difference(other);\n  }\n\n  symmetricDifference<U>(other: ReadonlySetLike<U>): Set<T | U> {\n    getValue(this.collection);\n\n    return this.vals.symmetricDifference(other);\n  }\n\n  isSubsetOf(other: ReadonlySetLike<unknown>): boolean {\n    getValue(this.collection);\n\n    return this.vals.isSubsetOf(other);\n  }\n\n  isSupersetOf(other: ReadonlySetLike<unknown>): boolean {\n    getValue(this.collection);\n\n    return this.vals.isSupersetOf(other);\n  }\n\n  isDisjointFrom(other: ReadonlySetLike<unknown>): boolean {\n    getValue(this.collection);\n\n    return this.vals.isDisjointFrom(other);\n  }\n\n  forEach(fn: (value1: T, value2: T, set: Set<T>) => void): void {\n    getValue(this.collection);\n\n    this.vals.forEach(fn);\n  }\n\n  get size(): number {\n    getValue(this.collection);\n\n    return this.vals.size;\n  }\n\n  [Symbol.iterator]() {\n    getValue(this.collection);\n\n    return this.vals[Symbol.iterator]();\n  }\n\n  get [Symbol.toStringTag](): string {\n    return this.vals[Symbol.toStringTag];\n  }\n\n  // **** KEY SETTERS ****\n  add(value: T): this {\n    this.dirtyStorageFor(value);\n    setValue(this.collection, null);\n\n    this.vals.add(value);\n\n    return this;\n  }\n\n  delete(value: T): boolean {\n    this.dirtyStorageFor(value);\n    setValue(this.collection, null);\n\n    this.storages.delete(value);\n    return this.vals.delete(value);\n  }\n\n  // **** ALL SETTERS ****\n  clear(): void {\n    this.storages.forEach((s) => setValue(s, null));\n    setValue(this.collection, null);\n\n    this.storages.clear();\n    this.vals.clear();\n  }\n}\n\n// So instanceof works\nObject.setPrototypeOf(TrackedSet.prototype, Set.prototype);\n\nexport class TrackedWeakSet<T extends object = object> implements WeakSet<T> {\n  private storages: WeakMap<T, TrackedStorage<null>> = new WeakMap();\n\n  private vals: WeakSet<T>;\n\n  private storageFor(key: T): TrackedStorage<null> {\n    const storages = this.storages;\n    let storage = storages.get(key);\n\n    if (storage === undefined) {\n      storage = createStorage(null, () => false);\n      storages.set(key, storage);\n    }\n\n    return storage;\n  }\n\n  private dirtyStorageFor(key: T): void {\n    const storage = this.storages.get(key);\n\n    if (storage) {\n      setValue(storage, null);\n    }\n  }\n\n  constructor(values?: readonly T[] | null) {\n    this.vals = new WeakSet(values);\n  }\n\n  has(value: T): boolean {\n    getValue(this.storageFor(value));\n\n    return this.vals.has(value);\n  }\n\n  add(value: T): this {\n    // Add to vals first to get better error message\n    this.vals.add(value);\n\n    this.dirtyStorageFor(value);\n\n    return this;\n  }\n\n  delete(value: T): boolean {\n    this.dirtyStorageFor(value);\n\n    this.storages.delete(value);\n    return this.vals.delete(value);\n  }\n\n  get [Symbol.toStringTag](): string {\n    return this.vals[Symbol.toStringTag];\n  }\n}\n\n// So instanceof works\nObject.setPrototypeOf(TrackedWeakSet.prototype, WeakSet.prototype);\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// Unfortunately, TypeScript's ability to do inference *or* type-checking in a\n// `Proxy`'s body is very limited, so we have to use a number of casts `as any`\n// to make the internal accesses work. The type safety of these is guaranteed at\n// the *call site* instead of within the body: you cannot do `Array.blah` in TS,\n// and it will blow up in JS in exactly the same way, so it is safe to assume\n// that properties within the getter have the correct type in TS.\n\nimport {\n  type TrackedStorage,\n  createStorage,\n  getValue,\n  setValue,\n} from 'ember-tracked-storage-polyfill';\n\nconst ARRAY_GETTER_METHODS = new Set<string | symbol | number>([\n  Symbol.iterator,\n  'concat',\n  'entries',\n  'every',\n  'filter',\n  'find',\n  'findIndex',\n  'flat',\n  'flatMap',\n  'forEach',\n  'includes',\n  'indexOf',\n  'join',\n  'keys',\n  'lastIndexOf',\n  'map',\n  'reduce',\n  'reduceRight',\n  'slice',\n  'some',\n  'values',\n]);\n\n// For these methods, `Array` itself immediately gets the `.length` to return\n// after invoking them.\nconst ARRAY_WRITE_THEN_READ_METHODS = new Set<string | symbol>([\n  'fill',\n  'push',\n  'unshift',\n]);\n\nfunction convertToInt(prop: number | string | symbol): number | null {\n  if (typeof prop === 'symbol') return null;\n\n  const num = Number(prop);\n\n  if (isNaN(num)) return null;\n\n  return num % 1 === 0 ? num : null;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nclass TrackedArray<T = unknown> {\n  /**\n   * Creates an array from an iterable object.\n   * @param iterable An iterable object to convert to an array.\n   */\n  static from<T>(iterable: Iterable<T> | ArrayLike<T>): TrackedArray<T>;\n\n  /**\n   * Creates an array from an iterable object.\n   * @param iterable An iterable object to convert to an array.\n   * @param mapfn A mapping function to call on every element of the array.\n   * @param thisArg Value of 'this' used to invoke the mapfn.\n   */\n  static from<T, U>(\n    iterable: Iterable<T> | ArrayLike<T>,\n    mapfn: (v: T, k: number) => U,\n    thisArg?: unknown,\n  ): TrackedArray<U>;\n\n  static from<T, U>(\n    iterable: Iterable<T> | ArrayLike<T>,\n    mapfn?: (v: T, k: number) => U,\n    thisArg?: unknown,\n  ): TrackedArray<T> | TrackedArray<U> {\n    return mapfn\n      ? new TrackedArray(Array.from(iterable, mapfn, thisArg))\n      : new TrackedArray(Array.from(iterable));\n  }\n\n  static of<T>(...arr: T[]): TrackedArray<T> {\n    return new TrackedArray(arr);\n  }\n\n  constructor(arr: T[] = []) {\n    const clone = arr.slice();\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const self = this;\n\n    const boundFns = new Map<string | symbol, (...args: any[]) => any>();\n\n    /**\n      Flag to track whether we have *just* intercepted a call to `.push()` or\n      `.unshift()`, since in those cases (and only those cases!) the `Array`\n      itself checks `.length` to return from the function call.\n     */\n    let nativelyAccessingLengthFromPushOrUnshift = false;\n\n    return new Proxy(clone, {\n      get(target, prop /*, _receiver */) {\n        const index = convertToInt(prop);\n\n        if (index !== null) {\n          self.#readStorageFor(index);\n          getValue(self.#collection);\n\n          return target[index];\n        }\n\n        if (prop === 'length') {\n          // If we are reading `.length`, it may be a normal user-triggered\n          // read, or it may be a read triggered by Array itself. In the latter\n          // case, it is because we have just done `.push()` or `.unshift()`; in\n          // that case it is safe not to mark this as a *read* operation, since\n          // calling `.push()` or `.unshift()` cannot otherwise be part of a\n          // \"read\" operation safely, and if done during an *existing* read\n          // (e.g. if the user has already checked `.length` *prior* to this),\n          // that will still trigger the mutation-after-consumption assertion.\n          if (nativelyAccessingLengthFromPushOrUnshift) {\n            nativelyAccessingLengthFromPushOrUnshift = false;\n          } else {\n            getValue(self.#collection);\n          }\n\n          return target[prop];\n        }\n\n        // Here, track that we are doing a `.push()` or `.unshift()` by setting\n        // the flag to `true` so that when the `.length` is read by `Array` (see\n        // immediately above), it knows not to dirty the collection.\n        if (ARRAY_WRITE_THEN_READ_METHODS.has(prop)) {\n          nativelyAccessingLengthFromPushOrUnshift = true;\n        }\n\n        if (ARRAY_GETTER_METHODS.has(prop)) {\n          let fn = boundFns.get(prop);\n\n          if (fn === undefined) {\n            fn = (...args) => {\n              getValue(self.#collection);\n              return (target as any)[prop](...args);\n            };\n\n            boundFns.set(prop, fn);\n          }\n\n          return fn;\n        }\n\n        return (target as any)[prop];\n      },\n\n      set(target, prop, value /*, _receiver */) {\n        (target as any)[prop] = value;\n\n        const index = convertToInt(prop);\n\n        if (index !== null) {\n          self.#dirtyStorageFor(index);\n          self.#dirtyCollection();\n        } else if (prop === 'length') {\n          self.#dirtyCollection();\n        }\n\n        return true;\n      },\n\n      getPrototypeOf() {\n        return TrackedArray.prototype;\n      },\n    }) as TrackedArray<T>;\n  }\n\n  #collection = createStorage(null, () => false);\n\n  #storages = new Map<number, TrackedStorage<null>>();\n\n  #readStorageFor(index: number) {\n    let storage = this.#storages.get(index);\n\n    if (storage === undefined) {\n      storage = createStorage(null, () => false);\n      this.#storages.set(index, storage);\n    }\n\n    getValue(storage);\n  }\n\n  #dirtyStorageFor(index: number): void {\n    const storage = this.#storages.get(index);\n\n    if (storage) {\n      setValue(storage, null);\n    }\n  }\n\n  #dirtyCollection() {\n    setValue(this.#collection, null);\n    this.#storages.clear();\n  }\n}\n\n// This rule is correct in the general case, but it doesn't understand\n// declaration merging, which is how we're using the interface here. This says\n// `TrackedArray` acts just like `Array<T>`, but also has the properties\n// declared via the `class` declaration above -- but without the cost of a\n// subclass, which is much slower that the proxied array behavior. That is: a\n// `TrackedArray` *is* an `Array`, just with a proxy in front of accessors and\n// setters, rather than a subclass of an `Array` which would be de-optimized by\n// the browsers.\n//\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\ninterface TrackedArray<T = unknown> extends Array<T> {}\n\nexport default TrackedArray;\n\n// Ensure instanceof works correctly\nObject.setPrototypeOf(TrackedArray.prototype, Array.prototype);\n","import {\n  createStorage,\n  getValue,\n  setValue,\n} from 'ember-tracked-storage-polyfill';\n\nclass TrackedObjectImplementation<T extends object> {\n  static fromEntries<T = unknown>(\n    entries: Iterable<readonly [PropertyKey, T]>,\n  ) {\n    return new TrackedObject(Object.fromEntries(entries));\n  }\n\n  constructor(...args: Record<PropertyKey, never> extends T ? [] | [T] : [T]);\n  constructor(obj = {}) {\n    const proto = Object.getPrototypeOf(obj);\n    const descs = Object.getOwnPropertyDescriptors(obj);\n\n    const clone = Object.create(proto);\n\n    for (const prop in descs) {\n      Object.defineProperty(clone, prop, descs[prop]!);\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const self = this;\n\n    return new Proxy(clone, {\n      get(target, prop) {\n        self.#readStorageFor(prop);\n\n        return target[prop];\n      },\n\n      has(target, prop) {\n        self.#readStorageFor(prop);\n\n        return prop in target;\n      },\n\n      ownKeys(target: T) {\n        getValue(self.#collection);\n\n        return Reflect.ownKeys(target);\n      },\n\n      set(target, prop, value) {\n        target[prop] = value;\n\n        self.#dirtyStorageFor(prop);\n        self.#dirtyCollection();\n\n        return true;\n      },\n\n      deleteProperty(target, prop) {\n        if (prop in target) {\n          delete target[prop];\n          self.#dirtyStorageFor(prop);\n          self.#storages.delete(prop);\n          self.#dirtyCollection();\n        }\n\n        return true;\n      },\n\n      getPrototypeOf() {\n        return TrackedObjectImplementation.prototype;\n      },\n    });\n  }\n\n  #storages = new Map();\n\n  #collection = createStorage(null, () => false);\n\n  #readStorageFor(key: PropertyKey) {\n    let storage = this.#storages.get(key);\n\n    if (storage === undefined) {\n      storage = createStorage(null, () => false);\n      this.#storages.set(key, storage);\n    }\n\n    getValue(storage);\n  }\n\n  #dirtyStorageFor(key: PropertyKey) {\n    const storage = this.#storages.get(key);\n\n    if (storage) {\n      setValue(storage, null);\n    }\n  }\n\n  #dirtyCollection() {\n    setValue(this.#collection, null);\n  }\n}\n\nexport interface TrackedObject {\n  fromEntries<T = unknown>(\n    entries: Iterable<readonly [PropertyKey, T]>,\n  ): {\n    [k: string]: T;\n  };\n\n  new <T extends Record<PropertyKey, unknown>>(\n    ...args: Record<PropertyKey, never> extends T ? [] | [T] : [T]\n  ): T;\n}\n\nexport const TrackedObject: TrackedObject =\n  TrackedObjectImplementation as unknown as TrackedObject;\n\nexport default TrackedObject;\n","import { tracked as glimmerTracked } from '@glimmer/tracking';\nimport { assert } from '@ember/debug';\n\nimport { TrackedMap, TrackedWeakMap } from './map.ts';\nimport { TrackedSet, TrackedWeakSet } from './set.ts';\nimport TrackedArray from './array.ts';\nimport TrackedObject from './object.ts';\n\nexport default function tracked<T>(obj: T[] | typeof Array): TrackedArray<T>;\n\nexport default function tracked<T>(obj: Set<T> | typeof Set): TrackedSet<T>;\n\nexport default function tracked<T, U>(\n  obj: Map<T, U> | typeof Map,\n): TrackedMap<T, U>;\n\nexport default function tracked<T extends object>(\n  obj: WeakSet<T> | typeof WeakSet,\n): TrackedWeakSet<T>;\n\nexport default function tracked<T extends object, U>(\n  obj: WeakMap<T, U> | typeof WeakMap,\n): TrackedWeakMap<T, U>;\n\nexport default function tracked<T extends object>(obj: T | typeof Object): T;\n\nexport default function tracked(\n  obj: object,\n  key: string | symbol,\n  desc?: PropertyDescriptor,\n): void;\n\nexport default function tracked(\n  obj: object,\n  key?: string | symbol,\n  desc?: PropertyDescriptor,\n): unknown {\n  if (key !== undefined && desc !== undefined) {\n    return glimmerTracked(obj, key, desc);\n  }\n\n  if (Array.isArray(obj)) {\n    return new TrackedArray(obj);\n  }\n\n  switch (obj) {\n    case Object:\n      return new TrackedObject();\n    case Array:\n      return new TrackedArray();\n    case Map:\n      return new TrackedMap();\n    case WeakMap:\n      return new TrackedWeakMap();\n    case Set:\n      return new TrackedSet();\n    case WeakSet:\n      return new TrackedWeakSet();\n  }\n\n  if (obj instanceof Map) {\n    return new TrackedMap(obj);\n  } else if (obj instanceof WeakMap) {\n    return new TrackedWeakMap();\n  } else if (obj instanceof Set) {\n    return new TrackedSet(obj);\n  } else if (obj instanceof WeakSet) {\n    return new TrackedWeakSet();\n  } else {\n    assert(\n      `You must either use tracked as a field decorator, or to wrap built-in class instances:\n\n      class Example {\n        @tracked field = 123;\n\n        map = tracked(Map);\n        map = tracked(new Map());\n      }`,\n      typeof obj === 'object' && obj !== null,\n    );\n\n    return new TrackedObject(obj as Record<PropertyKey, unknown>);\n  }\n}\n","import { assert } from '@ember/debug';\nimport { get } from '@ember/object';\nimport { tracked } from '@glimmer/tracking';\nimport { createCache, getValue } from '@glimmer/tracking/primitives/cache';\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction _initializerDefineProperty(target, property, descriptor, context) {\n  if (!descriptor) return;\n  Object.defineProperty(target, property, {\n    enumerable: descriptor.enumerable,\n    configurable: descriptor.configurable,\n    writable: descriptor.writable,\n    value: descriptor.initializer ? descriptor.initializer.call(context) : void 0\n  });\n}\n\nfunction _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {\n  var desc = {};\n  Object.keys(descriptor).forEach(function (key) {\n    desc[key] = descriptor[key];\n  });\n  desc.enumerable = !!desc.enumerable;\n  desc.configurable = !!desc.configurable;\n\n  if ('value' in desc || desc.initializer) {\n    desc.writable = true;\n  }\n\n  desc = decorators.slice().reverse().reduce(function (desc, decorator) {\n    return decorator(target, property, desc) || desc;\n  }, desc);\n\n  if (context && desc.initializer !== void 0) {\n    desc.value = desc.initializer ? desc.initializer.call(context) : void 0;\n    desc.initializer = undefined;\n  }\n\n  if (desc.initializer === void 0) {\n    Object.defineProperty(target, property, desc);\n    desc = null;\n  }\n\n  return desc;\n}\n\nvar _class, _descriptor;\nlet Meta = (_class = class Meta {\n  constructor() {\n    _defineProperty(this, \"prevRemote\", void 0);\n\n    _defineProperty(this, \"peek\", void 0);\n\n    _initializerDefineProperty(this, \"value\", _descriptor, this);\n  }\n\n}, (_descriptor = _applyDecoratedDescriptor(_class.prototype, \"value\", [tracked], {\n  configurable: true,\n  enumerable: true,\n  writable: true,\n  initializer: null\n})), _class);\n\nfunction getOrCreateMeta(instance, metas, initializer) {\n  let meta = metas.get(instance);\n\n  if (meta === undefined) {\n    meta = new Meta();\n    metas.set(instance, meta);\n    meta.value = meta.peek = typeof initializer === 'function' ? initializer.call(instance) : initializer;\n  }\n\n  return meta;\n}\n\nfunction localCopy(memo, initializer) {\n  assert(`@localCopy() must be given a memo path as its first argument, received \\`${String(memo)}\\``, typeof memo === 'string');\n  let metas = new WeakMap();\n  return () => {\n    let memoFn = obj => get(obj, memo);\n\n    return {\n      get() {\n        let meta = getOrCreateMeta(this, metas, initializer);\n        let {\n          prevRemote\n        } = meta;\n        let incomingValue = memoFn(this);\n\n        if (prevRemote !== incomingValue) {\n          // If the incoming value is not the same as the previous incoming value,\n          // update the local value to match the new incoming value, and update\n          // the previous incoming value.\n          meta.value = meta.prevRemote = incomingValue;\n        }\n\n        return meta.value;\n      },\n\n      set(value) {\n        if (!metas.has(this)) {\n          let meta = getOrCreateMeta(this, metas, initializer);\n          meta.prevRemote = memoFn(this);\n          meta.value = value;\n          return;\n        }\n\n        getOrCreateMeta(this, metas, initializer).value = value;\n      }\n\n    };\n  };\n}\nfunction trackedReset(memoOrConfig) {\n  assert(`@trackedReset() must be given a memo path, a memo function, or config object with a memo path or function as its first argument, received \\`${String(memoOrConfig)}\\``, typeof memoOrConfig === 'string' || typeof memoOrConfig === 'function' || typeof memoOrConfig === 'object' && memoOrConfig !== null && memoOrConfig.memo !== undefined);\n  let metas = new WeakMap();\n  return (_prototype, key, desc) => {\n    let memo, update;\n\n    let initializer = desc.initializer ?? (() => undefined);\n\n    if (typeof memoOrConfig === 'object') {\n      memo = memoOrConfig.memo;\n      update = memoOrConfig.update ?? initializer;\n    } else {\n      memo = memoOrConfig;\n      update = initializer;\n    }\n\n    let memoFn = typeof memo === 'function' ? (obj, last) => memo.call(obj, obj, key, last) : obj => get(obj, memo);\n    return {\n      get() {\n        let meta = getOrCreateMeta(this, metas, initializer);\n        let {\n          prevRemote\n        } = meta;\n        let incomingValue = memoFn(this, prevRemote);\n\n        if (incomingValue !== prevRemote) {\n          meta.prevRemote = incomingValue;\n          meta.value = meta.peek = update.call(this, this, key, meta.peek);\n        }\n\n        return meta.value;\n      },\n\n      set(value) {\n        getOrCreateMeta(this, metas, initializer).value = value;\n      }\n\n    };\n  };\n}\nfunction cached(target, key, value) {\n  assert('@cached can only be used on getters', value && value.get);\n  let {\n    get,\n    set\n  } = value;\n  let caches = new WeakMap();\n  return {\n    get() {\n      let cache = caches.get(this);\n\n      if (cache === undefined) {\n        cache = createCache(get.bind(this));\n        caches.set(this, cache);\n      }\n\n      return getValue(cache);\n    },\n\n    set\n  };\n}\nfunction dedupeTracked() {\n  let comparator;\n\n  const descriptor = function (target, key, desc) {\n    let {\n      initializer\n    } = desc;\n    let {\n      get,\n      set\n    } = tracked(target, key, desc);\n    let values = new WeakMap();\n    return {\n      get() {\n        if (!values.has(this)) {\n          let value = initializer?.call(this);\n          values.set(this, value);\n          set.call(this, value);\n        }\n\n        return get.call(this);\n      },\n\n      set(value) {\n        if (!values.has(this) || !comparator(value, values.get(this))) {\n          values.set(this, value);\n          set.call(this, value);\n        }\n      }\n\n    };\n  };\n\n  if (arguments.length === 3) {\n    comparator = (a, b) => a === b;\n\n    return descriptor(...arguments);\n  }\n\n  if (arguments.length === 1 && typeof arguments[0] === 'function') {\n    comparator = arguments[0];\n    return descriptor;\n  }\n\n  assert(`@dedupeTracked() can either be invoked without arguments or with one comparator function, received \\`${String(arguments)}\\``, false);\n}\n\nexport { cached, dedupeTracked, localCopy, trackedReset };\n","import {\n  PRIMITIVE, ARRAY, OBJECT,\n  DATE, REGEXP, MAP, SET,\n  ERROR, BIGINT\n} from './types.js';\n\nconst env = typeof self === 'object' ? self : globalThis;\n\nconst deserializer = ($, _) => {\n  const as = (out, index) => {\n    $.set(index, out);\n    return out;\n  };\n\n  const unpair = index => {\n    if ($.has(index))\n      return $.get(index);\n\n    const [type, value] = _[index];\n    switch (type) {\n      case PRIMITIVE:\n        return as(value, index);\n      case ARRAY: {\n        const arr = as([], index);\n        for (const index of value)\n          arr.push(unpair(index));\n        return arr;\n      }\n      case OBJECT: {\n        const object = as({}, index);\n        for (const [key, index] of value)\n          object[unpair(key)] = unpair(index);\n        return object;\n      }\n      case DATE:\n        return as(new Date(value), index);\n      case REGEXP: {\n        const {source, flags} = value;\n        return as(new RegExp(source, flags), index);\n      }\n      case MAP: {\n        const map = as(new Map, index);\n        for (const [key, index] of value)\n          map.set(unpair(key), unpair(index));\n        return map;\n      }\n      case SET: {\n        const set = as(new Set, index);\n        for (const index of value)\n          set.add(unpair(index));\n        return set;\n      }\n      case ERROR: {\n        const {name, message} = value;\n        return as(new env[name](message), index);\n      }\n      case BIGINT:\n        return as(BigInt(value), index);\n      case 'BigInt':\n        return as(Object(BigInt(value)), index);\n    }\n    return as(new env[type](value), index);\n  };\n\n  return unpair;\n};\n\n/**\n * @typedef {Array<string,any>} Record a type representation\n */\n\n/**\n * Returns a deserialized value from a serialized array of Records.\n * @param {Record[]} serialized a previously serialized value.\n * @returns {any}\n */\nexport const deserialize = serialized => deserializer(new Map, serialized)(0);\n","import {\n  PRIMITIVE, ARRAY, OBJECT,\n  DATE, REGEXP, MAP, SET,\n  ERROR, BIGINT\n} from './types.js';\n\nconst EMPTY = '';\n\nconst {toString} = {};\nconst {keys} = Object;\n\nconst typeOf = value => {\n  const type = typeof value;\n  if (type !== 'object' || !value)\n    return [PRIMITIVE, type];\n\n  const asString = toString.call(value).slice(8, -1);\n  switch (asString) {\n    case 'Array':\n      return [ARRAY, EMPTY];\n    case 'Object':\n      return [OBJECT, EMPTY];\n    case 'Date':\n      return [DATE, EMPTY];\n    case 'RegExp':\n      return [REGEXP, EMPTY];\n    case 'Map':\n      return [MAP, EMPTY];\n    case 'Set':\n      return [SET, EMPTY];\n  }\n\n  if (asString.includes('Array'))\n    return [ARRAY, asString];\n\n  if (asString.includes('Error'))\n    return [ERROR, asString];\n\n  return [OBJECT, asString];\n};\n\nconst shouldSkip = ([TYPE, type]) => (\n  TYPE === PRIMITIVE &&\n  (type === 'function' || type === 'symbol')\n);\n\nconst serializer = (strict, json, $, _) => {\n\n  const as = (out, value) => {\n    const index = _.push(out) - 1;\n    $.set(value, index);\n    return index;\n  };\n\n  const pair = value => {\n    if ($.has(value))\n      return $.get(value);\n\n    let [TYPE, type] = typeOf(value);\n    switch (TYPE) {\n      case PRIMITIVE: {\n        let entry = value;\n        switch (type) {\n          case 'bigint':\n            TYPE = BIGINT;\n            entry = value.toString();\n            break;\n          case 'function':\n          case 'symbol':\n            if (strict)\n              throw new TypeError('unable to serialize ' + type);\n            entry = null;\n            break;\n        }\n        return as([TYPE, entry], value);\n      }\n      case ARRAY: {\n        if (type)\n          return as([type, [...value]], value);\n  \n        const arr = [];\n        const index = as([TYPE, arr], value);\n        for (const entry of value)\n          arr.push(pair(entry));\n        return index;\n      }\n      case OBJECT: {\n        if (type) {\n          switch (type) {\n            case 'BigInt':\n              return as([type, value.toString()], value);\n            case 'Boolean':\n            case 'Number':\n            case 'String':\n              return as([type, value.valueOf()], value);\n          }\n        }\n\n        if (json && ('toJSON' in value))\n          return pair(value.toJSON());\n\n        const entries = [];\n        const index = as([TYPE, entries], value);\n        for (const key of keys(value)) {\n          if (strict || !shouldSkip(typeOf(value[key])))\n            entries.push([pair(key), pair(value[key])]);\n        }\n        return index;\n      }\n      case DATE:\n        return as([TYPE, value.toISOString()], value);\n      case REGEXP: {\n        const {source, flags} = value;\n        return as([TYPE, {source, flags}], value);\n      }\n      case MAP: {\n        const entries = [];\n        const index = as([TYPE, entries], value);\n        for (const [key, entry] of value) {\n          if (strict || !(shouldSkip(typeOf(key)) || shouldSkip(typeOf(entry))))\n            entries.push([pair(key), pair(entry)]);\n        }\n        return index;\n      }\n      case SET: {\n        const entries = [];\n        const index = as([TYPE, entries], value);\n        for (const entry of value) {\n          if (strict || !shouldSkip(typeOf(entry)))\n            entries.push(pair(entry));\n        }\n        return index;\n      }\n    }\n\n    const {message} = value;\n    return as([TYPE, {name: type, message}], value);\n  };\n\n  return pair;\n};\n\n/**\n * @typedef {Array<string,any>} Record a type representation\n */\n\n/**\n * Returns an array of serialized Records.\n * @param {any} value a serializable value.\n * @param {{lossy?: boolean}?} options an object with a `lossy` property that,\n *  if `true`, will not throw errors on incompatible types, and behave more\n *  like JSON stringify would behave. Symbol and Function will be discarded.\n * @returns {Record[]}\n */\n export const serialize = (value, {json, lossy} = {}) => {\n  const _ = [];\n  return serializer(!(json || lossy), !!json, new Map, _)(value), _;\n};\n","import {deserialize} from './deserialize.js';\nimport {serialize} from './serialize.js';\n\n/**\n * @typedef {Array<string,any>} Record a type representation\n */\n\n/**\n * Returns an array of serialized Records.\n * @param {any} any a serializable value.\n * @param {{transfer: any[]}?} options an object with a transfoer property.\n *  This is currently not supported, all values are always cloned.\n * @returns {Record[]}\n */\nexport default typeof structuredClone === \"function\" ?\n  structuredClone :\n  (any, options) => deserialize(serialize(any, options));\n\nexport {deserialize, serialize};\n","export default function isObject<T>(val: T): boolean {\n  return (\n    val !== null &&\n    typeof val === 'object' &&\n    !(val instanceof Date || val instanceof RegExp) &&\n    !Array.isArray(val)\n  );\n}\n","/* import { IChange } from '../types'; */\nimport isObject from '../utils/is-object';\n\nexport const VALUE = Symbol('__value__');\n\nexport default class Change {\n  [VALUE]: unknown;\n\n  constructor(value: unknown) {\n    this[VALUE] = value;\n  }\n}\n\n// TODO: not sure why this function type guard isn't working\nexport const isChange = (maybeChange: unknown): maybeChange is Change =>\n  isObject(maybeChange) && VALUE in (maybeChange as any);\n\nexport function getChangeValue(maybeChange: Change | unknown): any {\n  if (isChange(maybeChange)) {\n    return maybeChange[VALUE];\n  }\n}\n","import type { IErr, ValidationErr } from '../types';\n\nexport default class Err implements IErr<any> {\n  value: any;\n  validation: ValidationErr | ValidationErr[];\n\n  constructor(value: any, validation: ValidationErr | ValidationErr[]) {\n    this.value = value;\n    this.validation = validation;\n  }\n}\n","import { getChangeValue, isChange } from '../-private/change';\nimport isObject from './is-object';\nimport Err from '../-private/err';\nimport type { PublicErrors } from '../types';\n\n/**\n * traverse through target and return leaf nodes with `value` property and key as 'person.name'\n * Only detects key paths with Changes\n *\n * @method getKeyValues\n * @return {Array} [{ 'person.name': value }]\n */\nexport function getKeyValues<T extends Record<string, any>>(\n  obj: T,\n  keysUpToValue: Array<string> = []\n): Record<string, any>[] {\n  const map = [];\n\n  for (let key in obj) {\n    if (obj[key] && isObject(obj[key])) {\n      if (isChange(obj[key])) {\n        map.push({ key: [...keysUpToValue, key].join('.'), value: getChangeValue(obj[key]) });\n      } else {\n        map.push(...getKeyValues(obj[key], [...keysUpToValue, key]));\n      }\n    }\n  }\n\n  return map;\n}\n\n/**\n * traverse through target and return leaf nodes with `value` property and key as 'person.name'\n *\n * @method getKeyErrorValues\n * @return {Array} [{ key: 'person.name', validation: '', value: '' }]\n */\nexport function getKeyErrorValues<T extends Record<string, any>>(\n  obj: T,\n  keysUpToValue: Array<string> = []\n): PublicErrors {\n  let map = [];\n\n  for (let key in obj) {\n    if (obj[key] && isObject(obj[key])) {\n      if (\n        Object.prototype.hasOwnProperty.call(obj[key], 'value') &&\n        (obj[key] as any) instanceof Err\n      ) {\n        map.push({\n          key: [...keysUpToValue, key].join('.'),\n          validation: obj[key].validation,\n          value: obj[key].value\n        });\n      } else if (key !== 'value') {\n        map.push(...getKeyErrorValues(obj[key], [...keysUpToValue, key]));\n      }\n    }\n  }\n\n  return map;\n}\n","import isObject from './is-object';\n\nfunction isPromiseLike(obj: any): boolean {\n  return (\n    !!obj &&\n    !!obj.then &&\n    !!obj.catch &&\n    !!obj.finally &&\n    typeof obj.then === 'function' &&\n    typeof obj.catch === 'function' &&\n    typeof obj.finally === 'function'\n  );\n}\n\nexport default function isPromise(obj: any): boolean {\n  return isObject(obj) && isPromiseLike(obj);\n}\n","import isPromise from './is-promise';\nimport type { ValidatorMapFunc, ValidationResult, ValidatorClass } from '../types';\n\n/**\n * Rejects `true` values from an array of validations. Returns `true` when there\n * are no errors, or the error object if there are errors.\n *\n * @private\n * @param  {Array} validations\n * @return {Promise<boolean|Any>}\n */\nasync function handleValidationsAsync(\n  validations: Array<ValidationResult | Promise<ValidationResult>>\n): Promise<any> {\n  try {\n    const result = await Promise.all(validations);\n\n    const maybeFailed = result.filter((val) => typeof val !== 'boolean' && val);\n    return maybeFailed.length === 0 || maybeFailed;\n  } catch (e) {\n    return e;\n  }\n}\n\n/**\n * Rejects `true` values from an array of validations. Returns `true` when there\n * are no errors, or the error object if there are errors.\n *\n * @private\n * @param  {Array} validations\n * @return {boolean|Any}\n */\nfunction handleValidationsSync(validations: Array<ValidationResult>): boolean | any {\n  const maybeFailed = validations.filter((val) => typeof val !== 'boolean' && val);\n  return maybeFailed.length === 0 || maybeFailed;\n}\n/**\n * Handles an array of validators and returns Promise.all if any value is a\n * Promise.\n *\n * @public\n * @param  {Array} validators Array of validator functions\n * @param  {String} options.key\n * @param  {Any} options.newValue\n * @param  {Any} options.oldValue\n * @param  {Object} options.changes\n * @param  {Object} options.content\n * @return {Promise|boolean|Any}\n */\nexport default function handleMultipleValidations(\n  validators: Array<ValidatorMapFunc | ValidatorClass>,\n  { key, newValue, oldValue, changes, content }: { [s: string]: any }\n): boolean | any {\n  let validations: Array<ValidationResult | Promise<ValidationResult>> = Array.from(\n    validators.map(\n      (\n        validator: ValidatorMapFunc | ValidatorClass\n      ): ValidationResult | Promise<ValidationResult> => {\n        const isValidatorClass = (maybeClass: unknown): maybeClass is ValidatorClass =>\n          !!(maybeClass as Record<string, any>).validate;\n        if (validator && isValidatorClass(validator)) {\n          validator = validator.validate.bind(validator);\n        }\n\n        return validator(key, newValue, oldValue, changes, content);\n      }\n    )\n  );\n\n  if (validations.some(isPromise)) {\n    return Promise.all(validations).then(handleValidationsAsync);\n  }\n\n  return handleValidationsSync(validations as Array<ValidationResult>);\n}\n","import { isChange, getChangeValue } from '../-private/change';\n\n/**\n * Handles both single key or nested string keys ('person.name')\n *\n * @method getDeep\n */\nexport default function getDeep<T extends Record<string, any>>(\n  root: T,\n  path: string | string[]\n): any {\n  let obj: T = root;\n\n  if (path.indexOf('.') === -1) {\n    return obj[path as string];\n  }\n  const parts: string[] = typeof path === 'string' ? path.split('.') : path;\n\n  for (let i = 0; i < parts.length; i++) {\n    if (obj === undefined || obj === null) {\n      return undefined;\n    }\n\n    // next iteration has next level\n    obj = obj[parts[i]];\n  }\n\n  return obj;\n}\n\n/**\n * Returns subObject while skipping `Change` instances\n *\n * @method getSubObject\n */\nexport function getSubObject<T extends Record<string, any>>(root: T, path: string | string[]): any {\n  let obj: T = root;\n\n  if (path.indexOf('.') === -1) {\n    return obj[path as string];\n  }\n\n  const parts: string[] = typeof path === 'string' ? path.split('.') : path;\n\n  for (let i = 0; i < parts.length; i++) {\n    if (obj === undefined || obj === null) {\n      return undefined;\n    }\n\n    if (isChange(obj[parts[i]])) {\n      obj = getChangeValue(obj[parts[i]]);\n    } else {\n      obj = obj[parts[i]];\n    }\n  }\n\n  return obj;\n}\n","import handleMultipleValidations from './handle-multiple-validations';\nimport isPromise from './is-promise';\nimport isObject from './is-object';\nimport type {\n  ValidatorAction,\n  ValidatorMapFunc,\n  ValidatorClass,\n  ValidationResult,\n  ValidatorMap\n} from '../types';\nimport get from './get-deep';\n\n/**\n * returns a closure to lookup and validate k/v pairs set on a changeset\n *\n * @method lookupValidator\n * @param validationMap\n */\nexport default function lookupValidator(validationMap: ValidatorMap): ValidatorAction {\n  return ({ key, newValue, oldValue, changes, content }) => {\n    const validations = validationMap || {};\n    let validator:\n      | ValidatorMapFunc\n      | ValidatorMapFunc[]\n      | ValidatorClass\n      | ValidatorClass[]\n      | Array<ValidatorMapFunc | ValidatorClass> = get(validations, key);\n    const isValidatorClass = (maybeClass: unknown): maybeClass is ValidatorClass =>\n      !!(maybeClass as Record<string, any>).validate;\n    if (validator && isValidatorClass(validator)) {\n      validator = validator.validate.bind(validator);\n    }\n\n    if (!validator || isObject(validator)) {\n      return true;\n    }\n\n    let validation: ValidationResult | Promise<ValidationResult>;\n    if (Array.isArray(validator)) {\n      validation = handleMultipleValidations(validator, {\n        key,\n        newValue,\n        oldValue,\n        changes,\n        content\n      });\n    } else {\n      validation = (validator as ValidatorMapFunc)(key, newValue, oldValue, changes, content);\n    }\n\n    return isPromise(validation)\n      ? (validation as Promise<ValidationResult>).then((result) => {\n          return result;\n        })\n      : validation;\n  };\n}\n","// this statefull class holds and notifies\n\nexport default class Notifier<T extends any[]> {\n  listeners: ((...args: T) => void)[];\n\n  constructor() {\n    this.listeners = [];\n  }\n\n  addListener(callback: (...args: T) => void) {\n    this.listeners.push(callback);\n    return () => this.removeListener(callback);\n  }\n\n  removeListener(callback: (...args: T) => void) {\n    for (let i = 0; i < this.listeners.length; i++) {\n      if (this.listeners[i] === callback) {\n        this.listeners.splice(i, 1);\n        return;\n      }\n    }\n  }\n\n  trigger(...args: T) {\n    this.listeners.forEach((callback) => callback(...args));\n  }\n}\n","import Notifier from './notifier';\n\nexport function notifierForEvent(object: any, eventName: string) {\n  if (object._eventedNotifiers === undefined) {\n    object._eventedNotifiers = {};\n  }\n\n  let notifier = object._eventedNotifiers[eventName];\n\n  if (!notifier) {\n    notifier = object._eventedNotifiers[eventName] = new Notifier();\n  }\n\n  return notifier;\n}\n","import { getChangeValue, isChange } from '../-private/change';\n\nexport function hasKey(\n  record: Record<string, any>,\n  path: string,\n  safeGet: (obj: Record<string, any>, key: string) => any\n): boolean {\n  const keys = path.split('.');\n\n  let obj = record;\n  for (const key of keys) {\n    if (!obj || !Object.prototype.hasOwnProperty.call(obj, key)) {\n      return false;\n    }\n\n    obj = safeGet(obj, key);\n    if (isChange(obj)) {\n      obj = getChangeValue(obj);\n    }\n  }\n\n  return true;\n}\n\nexport function pathInChanges(\n  record: Record<string, any>,\n  path: string,\n  safeGet: (obj: Record<string, any>, key: string) => any\n): boolean {\n  if (isChange(record)) {\n    return false;\n  }\n\n  const keys = path.split('.');\n\n  let obj = record;\n  for (const key of keys) {\n    if (!obj) {\n      return false;\n    }\n\n    if (keys[keys.length - 1] !== key && isChange(safeGet(obj, key))) {\n      return true;\n    }\n\n    obj = safeGet(obj, key);\n  }\n\n  return false;\n}\n","import { getChangeValue, isChange } from '../-private/change';\nimport isObject from './is-object';\n\n/**\n * traverse through target and unset `value` from leaf key so can access normally\n * {\n *  name: Change {\n *    value: 'Charles'\n *  }\n * }\n *\n * to\n *\n * {\n *  name: 'Charles'\n * }\n *\n * Shallow copy here is fine because we are swapping out the leaf nested object\n * rather than mutating a property in something with reference\n *\n * @method normalizeObject\n * @param {Object} target\n * @return {Object}\n */\nexport default function normalizeObject<T extends { [key: string]: any }>(\n  target: T,\n  isObj: (...args: unknown[]) => unknown = isObject\n): T {\n  if (!target || !isObj(target)) {\n    return target;\n  }\n\n  if (isChange(target)) {\n    return getChangeValue(target);\n  }\n\n  let obj = { ...target };\n\n  for (let key in obj) {\n    const next: any = obj[key];\n    if (next && isObj(next)) {\n      if (isChange(next)) {\n        obj[key] = getChangeValue(next);\n      } else {\n        try {\n          JSON.stringify(next);\n        } catch (e) {\n          break;\n        }\n        obj[key] = normalizeObject(next);\n      }\n    }\n  }\n\n  return obj;\n}\n","import isObject from './is-object';\nimport { isChange } from '../-private/change';\n\nexport function hasChanges(changes: Record<string, any>): boolean {\n  for (let key in changes) {\n    if (isChange(changes[key])) {\n      return true;\n    }\n\n    if (isObject(changes[key])) {\n      const isTruthy = hasChanges(changes[key]);\n      if (isTruthy) {\n        return isTruthy;\n      }\n    }\n  }\n\n  return false;\n}\n","let getOwnPropertyDescriptors: (obj: { [x: string]: any }) => { [x: string]: PropertyDescriptor };\n\nif (Object.getOwnPropertyDescriptors !== undefined) {\n  getOwnPropertyDescriptors = Object.getOwnPropertyDescriptors;\n} else {\n  getOwnPropertyDescriptors = function (obj: object) {\n    let desc: Record<string, any> = {};\n\n    Object.keys(obj).forEach((key) => {\n      desc[key] = Object.getOwnPropertyDescriptor(obj, key);\n    });\n\n    return desc;\n  };\n}\n\n// keep getters and setters\nexport default function pureAssign(...objects: object[]): object {\n  return objects.reduce((acc, obj) => {\n    return Object.defineProperties(acc, getOwnPropertyDescriptors(obj));\n  }, {});\n}\n","import isObject from './is-object';\n\nfunction flatten(\n  validatorMap: Record<string, any>,\n  obj: Record<string, any>,\n  keys: string[],\n  keysUpToFunction: Array<string> = []\n): object {\n  for (let key of keys) {\n    const value: any = validatorMap[key];\n    if (typeof value.validate === 'function') {\n      // class with .validate function\n      obj[key] = value;\n    } else if (isObject(value)) {\n      flatten(value, obj, Object.keys(value), [...keysUpToFunction, key]);\n    } else if (typeof value === 'function') {\n      const dotSeparatedKeys = [...keysUpToFunction, key].join('.');\n      obj[dotSeparatedKeys] = value;\n    } else if (Array.isArray(value)) {\n      const isAllFuncs: boolean = value.every(\n        (item) => typeof item === 'function' || typeof item.validate === 'function'\n      );\n      if (isAllFuncs) {\n        const dotSeparatedKeys = [...keysUpToFunction, key].join('.');\n        obj[dotSeparatedKeys] = value;\n      }\n    }\n  }\n\n  return obj;\n}\n\n/**\n * With nested validations, we flatten to a dot separated 'user.email': validationFunc\n * Once doing so, validation will happen with a single level key or dot separated key\n *\n * @method flattenValidations\n * @return {object}\n */\nexport function flattenValidations(validatorMap: Record<string, any>): object {\n  if (!validatorMap) {\n    return {};\n  }\n\n  let obj: Record<string, any> = {};\n  return flatten(validatorMap, obj, Object.keys(validatorMap));\n}\n","export const CHANGESET = '__CHANGESET__';\n\nexport default function isChangeset(changeset: any): boolean {\n  return changeset && changeset['__changeset__'] === CHANGESET;\n}\n","export default function keyInObject(obj: any, key: string): boolean {\n  let [baseKey, ...keys] = key.split('.');\n\n  if (!baseKey || !(baseKey in obj)) {\n    return false;\n  }\n\n  if (!keys.length) {\n    return baseKey in obj;\n  }\n\n  let value = obj[baseKey];\n  if (value !== null && typeof value === 'object') {\n    return keyInObject(obj[baseKey], keys.join('.'));\n  }\n\n  return false;\n}\n","export function isArrayObject(obj: Record<string, any>) {\n  if (!obj) return false;\n\n  let maybeIndicies = Object.keys(obj);\n\n  return maybeIndicies.every((key) => Number.isInteger(parseInt(key, 10)));\n}\n\nexport function arrayToObject(array: any[]): Record<string, any> {\n  return array.reduce((obj, item, index) => {\n    obj[index] = item;\n    return obj;\n  }, {} as Record<string, any>);\n}\n\nexport function objectToArray(obj: Record<string, any>): any[] {\n  let result: any[] = [];\n\n  for (let [index, value] of Object.entries(obj)) {\n    result[parseInt(index, 10)] = value;\n  }\n\n  return result;\n}\n","import Change, { getChangeValue, isChange } from '../-private/change';\nimport isObject from './is-object';\nimport { isArrayObject } from './array-object';\n\ninterface Options {\n  safeSet?: any;\n  safeGet?: any;\n}\n\nfunction split(path: string): string[] {\n  const keys = path.split('.');\n\n  return keys;\n}\n\nfunction findSiblings(target: any, keys: string[]) {\n  const [leafKey] = keys.slice(-1);\n  const remaining = Object.keys(target)\n    .filter((k) => k !== leafKey)\n    .reduce((acc, key) => {\n      acc[key] = target[key];\n      return acc;\n    }, Object.create(null));\n\n  return { ...remaining };\n}\n\nfunction isValidKey(key: unknown) {\n  return key !== '__proto__' && key !== 'constructor' && key !== 'prototype';\n}\n\n/**\n * TODO: consider\n * https://github.com/emberjs/ember.js/blob/822452c4432620fc67a777aba3b150098fd6812d/packages/%40ember/-internals/metal/lib/property_set.ts\n *\n * Handles both single path or nested string paths ('person.name')\n *\n * @method setDeep\n */\nexport default function setDeep(\n  target: any,\n  path: string,\n  value: unknown,\n  options: Options = { safeSet: undefined, safeGet: undefined }\n): any {\n  const keys = split(path).filter(isValidKey);\n  // We will mutate target and through complex reference, we will mutate the orig\n  let orig = target;\n\n  options.safeSet =\n    options.safeSet ||\n    function (obj: any, key: string, value: unknown): any {\n      return (obj[key] = value);\n    };\n  options.safeGet =\n    options.safeGet ||\n    function (obj: any, key: string): any {\n      return obj ? obj[key] : obj;\n    };\n\n  if (keys.length === 1) {\n    options.safeSet(target, path, value);\n    return target;\n  }\n\n  for (let i = 0; i < keys.length; i++) {\n    let prop = keys[i];\n\n    if (Array.isArray(target) && parseInt(prop, 10) < 0) {\n      throw new Error(\n        'Negative indices are not allowed as arrays do not serialize values at negative indices'\n      );\n    }\n\n    const isObj = isObject(options.safeGet(target, prop));\n    const isArray = Array.isArray(options.safeGet(target, prop));\n    const isComplex = isObj || isArray;\n\n    if (!isComplex) {\n      options.safeSet(target, prop, {});\n    } else if (isComplex && isChange(options.safeGet(target, prop))) {\n      let changeValue = getChangeValue(options.safeGet(target, prop));\n\n      if (isObject(changeValue)) {\n        // if an object, we don't want to lose sibling keys\n        const siblings = findSiblings(changeValue, keys);\n\n        const resolvedValue = isChange(value) ? getChangeValue(value) : value;\n\n        const isArrayLike = Array.isArray(target) || isArrayObject(target);\n        const nestedKeys = isArrayLike\n          ? keys.slice(i + 1, keys.length).join('.') // remove first key segment as well as the index\n          : keys.slice(1, keys.length).join('.'); // remove first key segment\n\n        let newValue;\n\n        // if the resolved value was deleted (via setting to null or undefined),\n        // there is no need to setDeep. We can short-circuit that and set\n        // newValue directly because of the shallow value\n        if (isArrayLike && undefined === resolvedValue) {\n          newValue = resolvedValue;\n        } else if (i === keys.length - 1) {\n          // If last key, this is the final value\n          newValue = resolvedValue;\n        } else {\n          newValue = setDeep(siblings, nestedKeys, resolvedValue, options);\n        }\n\n        options.safeSet(target, prop, new Change(newValue));\n\n        // since we are done with the `path`, we can terminate the for loop and return control\n        break;\n      } else {\n        // we don't want to merge new changes with a Change instance higher up in the obj tree\n        // thus we nullify the current Change instance to\n        options.safeSet(target, prop, {});\n      }\n    }\n\n    // last iteration, set and return control\n    if (i === keys.length - 1) {\n      options.safeSet(target, prop, value);\n\n      break;\n    }\n\n    // assign next level of object for next loop\n    target = options.safeGet(target, prop);\n  }\n\n  return orig;\n}\n","import setDeep from './set-deep';\n\nconst { keys } = Object;\n\n/**\n * Given an array of objects, merge their keys into a new object and\n * return the new object.\n */\nexport default function mergeNested<T>(...objects: Array<{ [key: string]: T }>): {\n  [key: string]: T;\n} {\n  let finalObj = {};\n\n  objects.forEach((obj) => keys(obj).forEach((key) => setDeep(finalObj, key, obj[key])));\n\n  return finalObj;\n}\n","export function buildOldValues(\n  content: any,\n  changes: Record<string, any>[],\n  getDeep: (obj: any, key: string) => any\n): object {\n  const obj = Object.create(null);\n\n  for (let change of changes) {\n    obj[change.key] = getDeep(content, change.key);\n  }\n\n  return obj;\n}\n","import { getChangeValue, isChange } from '../-private/change';\nimport normalizeObject from './normalize-object';\nimport { isArrayObject, objectToArray, arrayToObject } from './array-object';\n\ninterface Options {\n  safeGet: any;\n  safeSet: any;\n  propertyIsUnsafe?: any;\n  getKeys?: (record: Record<string, unknown>) => string[];\n}\n\nfunction isNonNullObject(value: any): boolean {\n  return !!value && typeof value === 'object';\n}\n\nfunction isSpecial(value: any): boolean {\n  let stringValue = Object.prototype.toString.call(value);\n\n  return stringValue === '[object RegExp]' || stringValue === '[object Date]';\n}\n\nfunction isMergeableObject(value: any): boolean {\n  return isNonNullObject(value) && !isSpecial(value);\n}\n\nfunction getEnumerableOwnPropertySymbols(target: any): any {\n  return Object.getOwnPropertySymbols\n    ? Object.getOwnPropertySymbols(target).filter((symbol) => {\n        return target.propertyIsEnumerable(symbol);\n      })\n    : [];\n}\n\nfunction getKeys(target: any) {\n  return Object.keys(target).concat(getEnumerableOwnPropertySymbols(target));\n}\n\nfunction propertyIsOnObject(object: any, property: any) {\n  try {\n    return property in object;\n  } catch (_) {\n    return false;\n  }\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nexport function propertyIsUnsafe(target: any, key: string): boolean {\n  return (\n    propertyIsOnObject(target, key) && // Properties are safe to merge if they don't exist in the target yet,\n    // unsafe if they exist up the prototype chain and also unsafe if they're nonenumerable.\n    !(Object.hasOwnProperty.call(target, key) && Object.propertyIsEnumerable.call(target, key))\n  );\n}\n\n/**\n * DFS - traverse depth first until find object with `value`.  Then go back up tree and try on next key\n * Need to exhaust all possible avenues.\n *\n * @method buildPathToValue\n */\nfunction buildPathToValue(\n  source: any,\n  options: Options,\n  kv: Record<string, any>,\n  possibleKeys: string[]\n): Record<string, any> {\n  Object.keys(source).forEach((key: string): void => {\n    let possible = source[key];\n    if (possible && isChange(possible)) {\n      kv[[...possibleKeys, key].join('.')] = getChangeValue(possible);\n      return;\n    }\n\n    if (possible && typeof possible === 'object') {\n      buildPathToValue(possible, options, kv, [...possibleKeys, key]);\n    }\n  });\n\n  return kv;\n}\n\n/**\n * `source` will always have a leaf key `value` with the property we want to set\n *\n * @method mergeTargetAndSource\n */\nfunction mergeTargetAndSource(target: any, source: any, options: Required<Options>): any {\n  options.getKeys(source).forEach((key) => {\n    // proto poisoning.  So can set by nested key path 'person.name'\n    if (options.propertyIsUnsafe(target, key)) {\n      // if safeSet, we will find keys leading up to value and set\n      if (options.safeSet) {\n        const kv: Record<string, any> = buildPathToValue(source, options, {}, []);\n        // each key will be a path nested to the value `person.name.other`\n        if (Object.keys(kv).length > 0) {\n          // we found some keys!\n          for (key in kv) {\n            const val = kv[key];\n            options.safeSet(target, key, val);\n          }\n        }\n      }\n\n      return;\n    }\n\n    // else safe key on object\n    if (\n      propertyIsOnObject(target, key) &&\n      isMergeableObject(source[key]) &&\n      !isChange(source[key])\n    ) {\n      options.safeSet(\n        target,\n        key,\n        mergeDeep(options.safeGet(target, key), options.safeGet(source, key), options)\n      );\n    } else {\n      let next = source[key];\n      if (next && isChange(next)) {\n        return options.safeSet(target, key, getChangeValue(next));\n      }\n\n      return options.safeSet(target, key, normalizeObject(next));\n    }\n  });\n\n  return target;\n}\n\n/**\n * goal is to mutate target with source's properties, ensuring we dont encounter\n * pitfalls of { ..., ... } spread syntax overwriting keys on objects that we merged\n *\n * This is also adjusted for Ember peculiarities.  Specifically `options.setPath` will allows us\n * to handle properties on Proxy objects (that aren't the target's own property)\n *\n * @method mergeDeep\n */\nexport default function mergeDeep(\n  target: any,\n  source: any,\n  options: Options = {\n    safeGet: undefined,\n    safeSet: undefined,\n    propertyIsUnsafe: undefined,\n    getKeys: undefined\n  }\n): object | [any] {\n  options.getKeys = options.getKeys || getKeys;\n  options.propertyIsUnsafe = options.propertyIsUnsafe || propertyIsUnsafe;\n\n  options.safeGet =\n    options.safeGet ||\n    function (obj: Record<string, any>, key: string): Record<string, any> {\n      return obj[key];\n    };\n  options.safeSet =\n    options.safeSet ||\n    function (obj: any, key: string, value: unknown): any {\n      return (obj[key] = value);\n    };\n  let sourceIsArray = Array.isArray(source);\n  let targetIsArray = Array.isArray(target);\n  let sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n  if (!sourceAndTargetTypesMatch) {\n    let sourceIsArrayLike = isArrayObject(source);\n\n    if (targetIsArray && sourceIsArrayLike) {\n      return objectToArray(\n        mergeTargetAndSource(arrayToObject(target), source, options as Required<Options>)\n      );\n    }\n\n    return source;\n  } else if (sourceIsArray) {\n    return source;\n  } else if (target === null || target === undefined) {\n    /**\n     * If the target was set to null or undefined, we always want to return the source.\n     * There is nothing to merge.\n     *\n     * Without this explicit check, typeof null === typeof {any object-like thing}\n     * which means that mergeTargetAndSource will be called, and you can't merge with null\n     */\n    return source;\n  } else {\n    return mergeTargetAndSource(target, source, options as Required<Options>);\n  }\n}\n","import type { ProxyHandler, Content } from '../types';\nimport isObjectFn from './is-object';\nimport setDeep from './set-deep';\nimport Change, { getChangeValue, isChange } from '../-private/change';\nimport normalizeObject from './normalize-object';\nimport { objectToArray, arrayToObject } from './array-object';\nimport mergeDeep from './merge-deep';\n\nconst objectProxyHandler = {\n  /**\n   * Priority of access - changes, content, then check node\n   * @property get\n   */\n  get(node: ProxyHandler, key: string): any {\n    if (typeof key === 'symbol') {\n      return;\n    }\n\n    let childValue = node.safeGet(node.changes, key);\n\n    if (isChange(childValue)) {\n      return getChangeValue(childValue);\n    }\n\n    if (isObjectFn(childValue)) {\n      let childNode: ProxyHandler | undefined = node.children[key];\n\n      if (childNode === undefined && node.content) {\n        let childContent = node.safeGet(node.content, key);\n        // cache it\n        childNode = node.children[key] = new ObjectTreeNode(childValue, childContent, node.safeGet);\n      }\n\n      // return proxy if object so we can trap further access to changes or content\n      if (childNode) {\n        return childNode.proxy;\n      }\n    }\n\n    if (typeof childValue !== 'undefined') {\n      // primitive\n      return childValue;\n    } else if (node.content) {\n      const nodeContent = node.content;\n      if (node.safeGet(nodeContent, key) !== undefined) {\n        return node.safeGet(nodeContent, key);\n      }\n    }\n\n    if (typeof node[key] === 'function' || node.hasOwnProperty(key)) {\n      return node[key];\n    }\n  },\n\n  ownKeys(node: ProxyHandler): any {\n    return Reflect.ownKeys(node.changes);\n  },\n\n  getOwnPropertyDescriptor(node: ProxyHandler, prop: string): any {\n    return Reflect.getOwnPropertyDescriptor(node.changes, prop);\n  },\n\n  has(node: ProxyHandler, prop: string): any {\n    return Reflect.has(node.changes, prop);\n  },\n\n  set(node: ProxyHandler, key: string, value: unknown): any {\n    // dont want to set private properties on changes (usually found on outside actors)\n    if (key.startsWith('_')) {\n      return Reflect.set(node, key, value);\n    }\n    return Reflect.set(node.changes, key, new Change(value));\n  }\n};\n\nfunction defaultSafeGet(obj: Record<string, any>, key: string) {\n  return obj[key];\n}\n\nclass ObjectTreeNode implements ProxyHandler {\n  changes: Record<string, any>;\n  content: Content;\n  proxy: any;\n  children: Record<string, any>;\n\n  constructor(\n    changes: Record<string, any> = {},\n    content: Content = {},\n    public safeGet: (obj: any, key: string) => any = defaultSafeGet,\n    public isObject: (...args: unknown[]) => unknown = isObjectFn\n  ) {\n    this.changes = changes;\n    this.content = content;\n    this.proxy = new Proxy(this, objectProxyHandler);\n    this.children = Object.create(null);\n  }\n\n  get(key: string) {\n    return this.safeGet(this.changes, key);\n  }\n\n  set(key: string, value: unknown) {\n    return setDeep(this.changes, key, value);\n  }\n\n  unwrap(): Record<string, any> {\n    let changes = this.changes;\n\n    if (isObjectFn(changes)) {\n      changes = normalizeObject(changes, this.isObject);\n\n      const content = this.content;\n      if (isObjectFn(content)) {\n        changes = normalizeObject(changes, this.isObject);\n        return { ...content, ...changes };\n      } else if (Array.isArray(content)) {\n        changes = normalizeObject(changes, this.isObject);\n\n        return objectToArray(mergeDeep(arrayToObject(content), changes));\n      }\n    }\n\n    return changes;\n  }\n}\n\nexport { ObjectTreeNode };\n","/**\n * Merges all sources together, excluding keys in excludedKeys.\n *\n * @param  {string[]} excludedKeys\n * @param  {...object} sources\n * @return {object}\n */\nexport default function objectWithout(excludedKeys: string[], ...sources: any[]): any {\n  return sources.reduce((acc: Record<string, any>, source: any): object => {\n    Object.keys(source)\n      .filter((key) => excludedKeys.indexOf(key) === -1 || !source.hasOwnProperty(key))\n      .forEach((key) => (acc[key] = source[key]));\n    return acc;\n  }, {});\n}\n","export default function take(\n  originalObj: { [key: string]: any } = {},\n  keysToTake: string[] = []\n): { [key: string]: any } {\n  let newObj: { [key: string]: any } = {};\n\n  for (let key in originalObj) {\n    if (keysToTake.indexOf(key) !== -1) {\n      newObj[key] = originalObj[key];\n    }\n  }\n\n  return newObj;\n}\n","import Change, { getChangeValue, isChange } from './-private/change';\nimport { getKeyValues, getKeyErrorValues } from './utils/get-key-values';\nimport { notifierForEvent } from './-private/evented';\nimport Err from './-private/err';\nimport { hasKey, pathInChanges } from './utils/has-key';\nimport normalizeObject from './utils/normalize-object';\nimport { hasChanges } from './utils/has-changes';\nimport pureAssign from './utils/assign';\nimport { CHANGESET } from './utils/is-changeset';\nimport isObject from './utils/is-object';\nimport keyInObject from './utils/key-in-object';\nimport { buildOldValues } from './utils/build-old-values';\nimport { ObjectTreeNode } from './utils/object-tree-node';\nimport mergeDeep from './utils/merge-deep';\nimport setDeep from './utils/set-deep';\nimport getDeep, { getSubObject } from './utils/get-deep';\nimport { objectToArray, arrayToObject } from './utils/array-object';\nimport structuredClone from '@ungap/structured-clone';\n\nimport type {\n  Changes,\n  Config,\n  Content,\n  Errors,\n  IErr,\n  INotifier,\n  InternalMap,\n  NewProperty,\n  Snapshot,\n  ValidationErr\n} from './types';\n\nconst { keys } = Object;\nconst CONTENT = '_content';\nconst PREVIOUS_CONTENT = '_previousContent';\nconst CHANGES = '_changes';\n// const ORIGINAL = '_original';\nconst ERRORS = '_errors';\nconst ERRORS_CACHE = '_errorsCache';\nconst OPTIONS = '_options';\nconst AFTER_ROLLBACK_EVENT = 'afterRollback';\n\nconst DEBUG = process.env.NODE_ENV !== 'production';\n\nfunction assert(msg: string, property: unknown): void {\n  if (DEBUG) {\n    if (!property) {\n      throw new Error(msg);\n    }\n  }\n}\n\nfunction maybeUnwrapProxy(content: Content): any {\n  return content;\n}\n\nexport function newFormat(\n  obj: Record<string, any>[],\n  original: any,\n  getDeep: (obj: any, key: string) => any\n): Record<string, any> {\n  let newFormat: Record<string, any> = {};\n  for (let item of obj) {\n    const { key, value } = item;\n    newFormat[key] = {\n      current: value,\n      original: getDeep(original, key)\n    };\n  }\n\n  return newFormat;\n}\n\n// This is intended to provide an alternative changeset structure compatible with `yup`\n// This slims down the set of features, including removed APIs and `validate` returns just the `validate(obj)` method call and requires users to manually add errors.\nexport class ValidatedChangeset {\n  constructor(obj: object, options: Config = {}) {\n    this[CONTENT] = obj;\n    this[PREVIOUS_CONTENT] = undefined;\n    this[CHANGES] = {};\n    this[OPTIONS] = options;\n\n    this[ERRORS] = {};\n    this[ERRORS_CACHE] = {};\n  }\n\n  /**\n   * Any property that is not one of the getter/setter/methods on the\n   * BufferedProxy instance. The value type is `unknown` in order to avoid\n   * having to predefine key/value pairs of the correct types in the target\n   * object. Setting the index signature to `[key: string]: T[K]` would allow us\n   * to typecheck the value that is set on the proxy. However, no\n   * getters/setters/methods can be added to the class. This is the tradeoff\n   * we make for this particular design pattern (class based BufferedProxy).\n   */\n  [key: string]: unknown;\n  [CONTENT]: object;\n  [PREVIOUS_CONTENT]: object | undefined;\n  // [ORIGINAL]: Changes;\n  [CHANGES]: Changes;\n  [ERRORS]: Errors<any>;\n  [ERRORS_CACHE]: Errors<any>;\n  [OPTIONS]: Config;\n\n  __changeset__ = CHANGESET;\n\n  _eventedNotifiers = {};\n\n  on(eventName: string, callback: (...args: unknown[]) => unknown): INotifier {\n    const notifier = notifierForEvent(this, eventName);\n    return notifier.addListener(callback);\n  }\n\n  off(eventName: string, callback: (...args: unknown[]) => unknown): INotifier {\n    const notifier = notifierForEvent(this, eventName);\n    return notifier.removeListener(callback);\n  }\n\n  trigger(eventName: string, ...args: any[]): void {\n    const notifier = notifierForEvent(this, eventName);\n    if (notifier) {\n      notifier.trigger(...args);\n    }\n  }\n\n  /**\n   * @property isObject\n   * @override\n   */\n  isObject = isObject;\n\n  /**\n   * @property maybeUnwrapProxy\n   * @override\n   */\n  maybeUnwrapProxy = maybeUnwrapProxy;\n\n  /**\n   * @property setDeep\n   * @override\n   */\n  setDeep = setDeep;\n\n  /**\n   * @property getDeep\n   * @override\n   */\n  getDeep = getDeep;\n\n  /**\n   * @property mergeDeep\n   * @override\n   */\n  mergeDeep = mergeDeep;\n\n  /**\n   * @property safeGet\n   * @override\n   */\n  safeGet(obj: any, key: string) {\n    return obj[key];\n  }\n\n  /**\n   * @property safeSet\n   * @override\n   */\n  safeSet(obj: any, key: string, value: unknown) {\n    return (obj[key] = value);\n  }\n\n  /**\n   * @property changes\n   * @type {Array}\n   */\n  get changes() {\n    let obj = this[CHANGES];\n    let original = this[CONTENT];\n\n    // foo: {\n    //  original: 0,\n    //  current: 1,\n    // }\n    return newFormat(getKeyValues(obj), original, this.getDeep);\n  }\n\n  /**\n   * @property errors\n   * @type {Array}\n   */\n  get errors() {\n    let obj = this[ERRORS];\n\n    return getKeyErrorValues(obj);\n  }\n\n  get change() {\n    let obj: Changes = this[CHANGES];\n    if (hasChanges(this[CHANGES])) {\n      return normalizeObject(obj);\n    }\n\n    return {};\n  }\n\n  get error() {\n    return this[ERRORS];\n  }\n\n  get data() {\n    return this[CONTENT];\n  }\n\n  /**\n   * @property isValid\n   * @type {Array}\n   */\n  get isValid() {\n    return getKeyErrorValues(this[ERRORS]).length === 0;\n  }\n  /**\n   * @property isPristine\n   * @type {Boolean}\n   */\n  get isPristine() {\n    let validationKeys = Object.keys(this[CHANGES]);\n    const userChangesetKeys: string[] | undefined = this[OPTIONS].changesetKeys;\n    if (Array.isArray(userChangesetKeys) && userChangesetKeys.length) {\n      validationKeys = validationKeys.filter((k) => userChangesetKeys.includes(k));\n    }\n\n    if (validationKeys.length === 0) {\n      return true;\n    }\n\n    return !hasChanges(this[CHANGES]);\n  }\n  /**\n   * @property isInvalid\n   * @type {Boolean}\n   */\n  get isInvalid() {\n    return !this.isValid;\n  }\n  /**\n   * @property isDirty\n   * @type {Boolean}\n   */\n  get isDirty() {\n    return !this.isPristine;\n  }\n\n  /**\n   * Stores change on the changeset.\n   * This approximately works just like the Ember API\n   *\n   * @method setUnknownProperty\n   */\n  setUnknownProperty<T>(key: string, value: T): void {\n    let config: Config = this[OPTIONS];\n    let changesetKeys = config.changesetKeys;\n    if (Array.isArray(changesetKeys) && changesetKeys.length > 0) {\n      const hasKey = changesetKeys.find((chKey) => key.match(chKey));\n      if (!hasKey) {\n        return;\n      }\n    }\n\n    let content: Content = this[CONTENT];\n    let oldValue = this.safeGet(content, key);\n\n    this._setProperty({ key, value, oldValue });\n  }\n\n  /**\n   * String representation for the changeset.\n   */\n  get [Symbol.toStringTag](): string {\n    let normalisedContent: object = pureAssign(this[CONTENT], {});\n    return `changeset:${normalisedContent.toString()}`;\n  }\n\n  /**\n   * String representation for the changeset.\n   */\n  toString(): string {\n    let normalisedContent: object = pureAssign(this[CONTENT], {});\n    return `changeset:${normalisedContent.toString()}`;\n  }\n\n  /**\n   * Executes the changeset if in a valid state.\n   *\n   * @method execute\n   */\n  execute(): this {\n    let oldContent;\n    if (this.isValid && this.isDirty) {\n      let content: Content = this[CONTENT];\n      let changes: Changes = this[CHANGES];\n\n      // keep old values in case of error and we want to rollback\n      oldContent = buildOldValues(content, getKeyValues(changes), this.getDeep);\n\n      // we want mutation on original object\n      // @tracked\n      this[CONTENT] = this.mergeDeep(content, changes, {\n        safeGet: this.safeGet,\n        safeSet: this.safeSet\n      });\n    }\n\n    // trigger any registered callbacks by same keyword as method name\n    this.trigger('execute');\n\n    this[CHANGES] = {};\n    this[PREVIOUS_CONTENT] = oldContent;\n\n    return this;\n  }\n\n  unexecute(): this {\n    if (this[PREVIOUS_CONTENT]) {\n      this[CONTENT] = this.mergeDeep(this[CONTENT], this[PREVIOUS_CONTENT], {\n        safeGet: this.safeGet,\n        safeSet: this.safeSet\n      });\n    }\n\n    return this;\n  }\n\n  /**\n   * Returns the changeset to its pristine state, and discards changes and\n   * errors.\n   *\n   * @method rollback\n   */\n  rollback(): this {\n    // Get keys before reset.\n    let keys = this._rollbackKeys();\n\n    // Reset.\n    this[CHANGES] = {};\n    this[ERRORS] = {};\n    this[ERRORS_CACHE] = {};\n    this._notifyVirtualProperties(keys);\n\n    this.trigger(AFTER_ROLLBACK_EVENT);\n    return this;\n  }\n\n  /**\n   * Discards any errors, keeping only valid changes.\n   *\n   * @public\n   * @chainable\n   * @method rollbackInvalid\n   * @param {String} key optional key to rollback invalid values\n   * @return {Changeset}\n   */\n  rollbackInvalid(key: string | void): this {\n    let errorKeys = keys(this[ERRORS]);\n\n    if (key) {\n      this._notifyVirtualProperties([key]);\n      // @tracked\n      this[ERRORS] = this._deleteKey(ERRORS, key) as Errors<any>;\n      this[ERRORS_CACHE] = this[ERRORS];\n      if (errorKeys.indexOf(key) > -1) {\n        this[CHANGES] = this._deleteKey(CHANGES, key) as Changes;\n      }\n    } else {\n      this._notifyVirtualProperties();\n      this[ERRORS] = {};\n      this[ERRORS_CACHE] = this[ERRORS];\n\n      // if on CHANGES hash, rollback those as well\n      errorKeys.forEach((errKey) => {\n        this[CHANGES] = this._deleteKey(CHANGES, errKey) as Changes;\n      });\n    }\n\n    return this;\n  }\n\n  /**\n   * @method validate\n   */\n  async validate(cb: (changes: Record<string, any>) => unknown): Promise<any> {\n    const changes = this[CHANGES];\n    const content = this[CONTENT];\n\n    // return an object that does not poison original model and provides user with full set of data + changes to validate\n    return cb(this.mergeDeep(structuredClone(content), changes));\n  }\n\n  /**\n   * Manually add an error to the changeset. If there is an existing\n   * error or change for `key`, it will be overwritten.\n   *\n   * @method addError\n   */\n  addError<T>(key: string, error: IErr<T> | ValidationErr) {\n    // Construct new `Err` instance.\n    let newError;\n\n    const isIErr = <T>(error: unknown): error is IErr<T> =>\n      this.isObject(error) && !Array.isArray(error);\n    if (isIErr(error)) {\n      assert('Error must have value.', error.hasOwnProperty('value') || error.value !== undefined);\n      assert('Error must have validation.', error.hasOwnProperty('validation'));\n      newError = new Err(error.value, error.validation);\n    } else {\n      let value = this[key];\n      newError = new Err(value, error as ValidationErr);\n    }\n\n    // Add `key` to errors map.\n    let errors: Errors<any> = this[ERRORS];\n    // @tracked\n    this[ERRORS] = this.setDeep(errors, key, newError, { safeSet: this.safeSet });\n    this[ERRORS_CACHE] = this[ERRORS];\n\n    // Return passed-in `error`.\n    return newError;\n  }\n\n  /**\n   * @method removeError\n   */\n  removeError(key: string) {\n    // Remove `key` to errors map.\n    let errors: Errors<any> = this[ERRORS];\n    // @tracked\n    this[ERRORS] = this.setDeep(errors, key, null, { safeSet: this.safeSet });\n    this[ERRORS] = this._deleteKey(ERRORS, key) as Errors<any>;\n    this[ERRORS_CACHE] = this[ERRORS];\n  }\n\n  /**\n   * @method removeError\n   */\n  removeErrors() {\n    // @tracked\n    this[ERRORS] = {};\n    this[ERRORS_CACHE] = this[ERRORS];\n  }\n\n  /**\n   * Manually push multiple errors to the changeset as an array.\n   * key maybe in form 'name.short' so need to go deep\n   *\n   * @method pushErrors\n   */\n  pushErrors(key: string, ...newErrors: string[] | ValidationErr[]): IErr<any> {\n    let errors: Errors<any> = this[ERRORS];\n    let existingError: IErr<any> | Err = this.getDeep(errors, key) || new Err(null, []);\n    let validation: ValidationErr | ValidationErr[] = existingError.validation;\n    let value: any = this[key];\n\n    if (!Array.isArray(validation) && Boolean(validation)) {\n      existingError.validation = [validation];\n    }\n\n    let v = existingError.validation;\n    validation = [...v, ...newErrors];\n    let newError = new Err(value, validation);\n    // @tracked\n    this[ERRORS] = this.setDeep(errors, key as string, newError, { safeSet: this.safeSet });\n    this[ERRORS_CACHE] = this[ERRORS];\n\n    return { value, validation };\n  }\n\n  /**\n   * Creates a snapshot of the changeset's errors and changes.\n   *\n   * @method snapshot\n   */\n  snapshot(): Snapshot {\n    let changes: Changes = this[CHANGES];\n    let errors: Errors<any> = this[ERRORS];\n\n    return {\n      changes: this.getChangesForSnapshot(changes),\n\n      errors: keys(errors).reduce((newObj: Errors<any>, key: keyof Errors<any>) => {\n        let e = errors[key];\n        newObj[key] = { value: e.value, validation: e.validation };\n        return newObj;\n      }, {})\n    };\n  }\n\n  private getChangesForSnapshot(changes: Changes) {\n    return keys(changes).reduce((newObj: Changes, key: keyof Changes) => {\n      newObj[key] = isChange(changes[key])\n        ? getChangeValue(changes[key])\n        : this.getChangesForSnapshot(changes[key]);\n      return newObj;\n    }, {});\n  }\n\n  /**\n   * Restores a snapshot of changes and errors. This overrides existing\n   * changes and errors.\n   *\n   * @method restore\n   */\n  restore({ changes, errors }: Snapshot): this {\n    let newChanges: Changes = this.getChangesFromSnapshot(changes);\n\n    let newErrors: Errors<any> = keys(errors).reduce((newObj: Errors<any>, key: keyof Changes) => {\n      let e: IErr<any> = errors[key];\n      newObj[key] = new Err(e.value, e.validation);\n      return newObj;\n    }, {});\n\n    // @tracked\n    this[CHANGES] = newChanges;\n    // @tracked\n    this[ERRORS] = newErrors;\n    this[ERRORS_CACHE] = this[ERRORS];\n\n    this._notifyVirtualProperties();\n    return this;\n  }\n\n  private getChangesFromSnapshot(changes: Changes) {\n    return keys(changes).reduce((newObj, key) => {\n      newObj[key] = this.getChangeForProp(changes[key]);\n      return newObj;\n    }, {} as Changes);\n  }\n\n  private getChangeForProp(value: any) {\n    if (!isObject(value)) {\n      return new Change(value);\n    }\n\n    return keys(value).reduce((newObj, key) => {\n      newObj[key] = this.getChangeForProp(value[key]);\n      return newObj;\n    }, {} as Changes);\n  }\n\n  /**\n   * Sets property on the changeset.\n   */\n  _setProperty<T>({ key, value, oldValue }: NewProperty<T>): void {\n    let changes: Changes = this[CHANGES];\n\n    // Happy path: update change map.\n    if (!isEqual(value, oldValue) || oldValue === undefined) {\n      // @tracked\n      let result: Changes = this.setDeep(changes, key, new Change(value), {\n        safeSet: this.safeSet\n      });\n\n      this[CHANGES] = result;\n    } else if (keyInObject(changes, key)) {\n      // @tracked\n      // remove key if setting back to original\n      this[CHANGES] = this._deleteKey(CHANGES, key) as Changes;\n    }\n  }\n\n  /**\n   * Notifies virtual properties set on the changeset of a change.\n   * You can specify which keys are notified by passing in an array.\n   *\n   * @private\n   * @param {Array} keys\n   * @return {Void}\n   */\n  _notifyVirtualProperties(keys?: string[]): string[] | undefined {\n    if (!keys) {\n      keys = this._rollbackKeys();\n    }\n\n    return keys;\n  }\n\n  /**\n   * Gets the changes and error keys.\n   */\n  _rollbackKeys(): string[] {\n    let changes: Changes = this[CHANGES];\n    let errors: Errors<any> = this[ERRORS];\n    return [...new Set([...keys(changes), ...keys(errors)])];\n  }\n\n  /**\n   * Deletes a key off an object and notifies observers.\n   */\n  _deleteKey(objName: string, key = ''): InternalMap {\n    let obj = this[objName] as InternalMap;\n    let keys = key.split('.');\n\n    if (keys.length === 1 && obj.hasOwnProperty(key)) {\n      delete obj[key];\n    } else if (obj[keys[0]]) {\n      let [base, ...remaining] = keys;\n      let previousNode: { [key: string]: any } = obj;\n      let currentNode: any = obj[base];\n      let currentKey: string | undefined = base;\n\n      // find leaf and delete from map\n      while (this.isObject(currentNode) && currentKey) {\n        let curr: { [key: string]: unknown } = currentNode;\n        if (isChange(curr) || typeof curr.value !== 'undefined' || curr.validation) {\n          delete previousNode[currentKey];\n        }\n\n        currentKey = remaining.shift();\n        previousNode = currentNode;\n        if (currentKey) {\n          currentNode = currentNode[currentKey];\n        }\n      }\n    }\n\n    return obj;\n  }\n\n  get(key: string): any {\n    // 'person'\n    // 'person.username'\n    let [baseKey, ...remaining] = key.split('.');\n    let changes: Changes = this[CHANGES];\n    let content: Content = this[CONTENT];\n    if (Object.prototype.hasOwnProperty.call(changes, baseKey)) {\n      const changesValue = this.getDeep(changes, key);\n      const isObject = this.isObject(changesValue);\n\n      if (!isObject && changesValue !== undefined) {\n        // if safeGet returns a primitive, then go ahead return\n        return changesValue;\n      }\n    }\n    // At this point, we may have a changes object, a dot separated key, or a need to access the `key`\n    // on `this` or `content`\n    if (Object.prototype.hasOwnProperty.call(changes, baseKey) && hasChanges(changes)) {\n      let baseChanges = changes[baseKey];\n\n      // 'user.name'\n      const normalizedBaseChanges = normalizeObject(baseChanges);\n      if (this.isObject(normalizedBaseChanges)) {\n        const result = this.maybeUnwrapProxy(\n          this.getDeep(normalizedBaseChanges, remaining.join('.'))\n        );\n\n        // need to do this inside of Change object\n        // basically anything inside of a Change object that is undefined means it was removed\n        if (\n          typeof result === 'undefined' &&\n          pathInChanges(changes, key, this.safeGet) &&\n          !hasKey(changes, key, this.safeGet) &&\n          this.getDeep(content, key)\n        ) {\n          return;\n        }\n\n        if (this.isObject(result)) {\n          if (isChange(result)) {\n            return getChangeValue(result);\n          }\n\n          const baseContent = this.safeGet(content, baseKey) || {};\n          const subContent = this.getDeep(baseContent, remaining.join('.'));\n          const subChanges = getSubObject(changes, key);\n          // give back an object that can further retrieve changes and/or content\n          const tree = new ObjectTreeNode(subChanges, subContent, this.getDeep, this.isObject);\n          return tree.proxy;\n        } else if (typeof result !== 'undefined') {\n          return result;\n        }\n      }\n\n      // this comes after the isObject check to ensure we don't lose remaining keys\n      if (isChange(baseChanges) && remaining.length === 0) {\n        return getChangeValue(baseChanges);\n      }\n    }\n\n    // return getters/setters/methods on BufferedProxy instance\n    if (baseKey in this || key in this) {\n      return this.getDeep(this, key);\n    }\n\n    const subContent = this.maybeUnwrapProxy(this.getDeep(content, key));\n    if (this.isObject(subContent)) {\n      let subChanges = this.getDeep(changes, key);\n      if (!subChanges) {\n        // if no changes, we need to add the path to the existing changes (mutate)\n        // so further access to nested keys works\n        subChanges = this.getDeep(this.setDeep(changes, key, {}), key);\n      }\n\n      // may still access a value on the changes or content objects\n      const tree = new ObjectTreeNode(subChanges, subContent, this.getDeep, this.isObject);\n      return tree.proxy;\n    } else if (Array.isArray(subContent)) {\n      let subChanges = this.getDeep(changes, key);\n      if (!subChanges) {\n        // return array of contents. Dont need to worry about further access sibling keys in array case\n        return subContent;\n      }\n\n      if (isObject(subChanges)) {\n        if (isObject(subContent)) {\n          subChanges = normalizeObject(subChanges, this.isObject);\n          return { ...subContent, ...subChanges };\n        } else if (Array.isArray(subContent)) {\n          subChanges = normalizeObject(subChanges, this.isObject);\n\n          return objectToArray(mergeDeep(arrayToObject(subContent), subChanges));\n        }\n      }\n\n      return subChanges;\n    }\n\n    return subContent;\n  }\n\n  set<T>(key: string, value: T): void {\n    if (this.hasOwnProperty(key) || keyInObject(this, key)) {\n      this[key] = value;\n    } else {\n      this.setUnknownProperty(key, value);\n    }\n  }\n}\n\n/**\n * Creates new changesets.\n */\nexport function changeset(obj: object, options?: Config): ValidatedChangeset {\n  return new ValidatedChangeset(obj, options);\n}\n\ntype T20 = InstanceType<typeof ValidatedChangeset>;\n\nexport function Changeset(obj: object, options?: Config): ValidatedChangeset {\n  const c: ValidatedChangeset = changeset(obj, options);\n\n  return new Proxy(c, {\n    get(targetBuffer, key /*, receiver*/) {\n      const res = targetBuffer.get(key.toString());\n      return res;\n    },\n\n    set(targetBuffer, key, value /*, receiver*/) {\n      targetBuffer.set(key.toString(), value);\n      return true;\n    }\n  }) as T20;\n}\n\n// determine if two values are equal\nfunction isEqual(v1: unknown, v2: unknown) {\n  if (v1 instanceof Date && v2 instanceof Date) {\n    return v1.getTime() === v2.getTime();\n  }\n\n  return v1 === v2;\n}\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"OktaAuth\"] = factory();\n\telse\n\t\troot[\"OktaAuth\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 27);\n","function _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nmodule.exports = _classCallCheck;","module.exports = require(\"regenerator-runtime\");\n","function _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return self;\n}\n\nmodule.exports = _assertThisInitialized;","function _getPrototypeOf(o) {\n  module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}\n\nmodule.exports = _getPrototypeOf;","function _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nmodule.exports = _createClass;","var setPrototypeOf = require(\"./setPrototypeOf\");\n\nfunction _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) setPrototypeOf(subClass, superClass);\n}\n\nmodule.exports = _inherits;","var _typeof = require(\"@babel/runtime/helpers/typeof\");\n\nvar assertThisInitialized = require(\"./assertThisInitialized\");\n\nfunction _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  }\n\n  return assertThisInitialized(self);\n}\n\nmodule.exports = _possibleConstructorReturn;","function _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    module.exports = _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    module.exports = _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nmodule.exports = _typeof;","function _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nmodule.exports = _defineProperty;","function _setPrototypeOf(o, p) {\n  module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n\n  return _setPrototypeOf(o, p);\n}\n\nmodule.exports = _setPrototypeOf;","var getPrototypeOf = require(\"./getPrototypeOf\");\n\nvar setPrototypeOf = require(\"./setPrototypeOf\");\n\nvar isNativeFunction = require(\"./isNativeFunction\");\n\nvar construct = require(\"./construct\");\n\nfunction _wrapNativeSuper(Class) {\n  var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n  module.exports = _wrapNativeSuper = function _wrapNativeSuper(Class) {\n    if (Class === null || !isNativeFunction(Class)) return Class;\n\n    if (typeof Class !== \"function\") {\n      throw new TypeError(\"Super expression must either be null or a function\");\n    }\n\n    if (typeof _cache !== \"undefined\") {\n      if (_cache.has(Class)) return _cache.get(Class);\n\n      _cache.set(Class, Wrapper);\n    }\n\n    function Wrapper() {\n      return construct(Class, arguments, getPrototypeOf(this).constructor);\n    }\n\n    Wrapper.prototype = Object.create(Class.prototype, {\n      constructor: {\n        value: Wrapper,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n    return setPrototypeOf(Wrapper, Class);\n  };\n\n  return _wrapNativeSuper(Class);\n}\n\nmodule.exports = _wrapNativeSuper;","/*!\n * Copyright (c) 2018-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\nimport crossFetch from 'cross-fetch';\nfunction readData(response) {\n    if (response.headers.get('Content-Type') &&\n        response.headers.get('Content-Type').toLowerCase().indexOf('application/json') >= 0) {\n        return response.json()\n            // JSON parse can fail if response is not a valid object\n            .catch(e => {\n            return {\n                error: e,\n                errorSummary: 'Could not parse server response'\n            };\n        });\n    }\n    else {\n        return response.text();\n    }\n}\nfunction formatResult(status, data) {\n    const isObject = typeof data === 'object';\n    const result = {\n        responseText: isObject ? JSON.stringify(data) : data,\n        status: status\n    };\n    if (isObject) {\n        result.responseType = 'json';\n        result.responseJSON = data;\n    }\n    return result;\n}\n/* eslint-disable complexity */\nfunction fetchRequest(method, url, args) {\n    var body = args.data;\n    var headers = args.headers || {};\n    var contentType = (headers['Content-Type'] || headers['content-type'] || '');\n    // JSON encode body (if appropriate)\n    if (contentType === 'application/json' && body && typeof body !== 'string') {\n        body = JSON.stringify(body);\n    }\n    var fetch = global.fetch || crossFetch;\n    var fetchPromise = fetch(url, {\n        method: method,\n        headers: args.headers,\n        body: body,\n        credentials: args.withCredentials ? 'include' : 'omit'\n    });\n    if (!fetchPromise.finally) {\n        fetchPromise = Promise.resolve(fetchPromise);\n    }\n    return fetchPromise.then(function (response) {\n        var error = !response.ok;\n        var status = response.status;\n        return readData(response)\n            .then(data => {\n            return formatResult(status, data);\n        })\n            .then(result => {\n            if (error) {\n                // Throwing result object since error handling is done in http.js\n                throw result;\n            }\n            return result;\n        });\n    });\n}\nexport default fetchRequest;\n","var __self__ = (function (root) {\nfunction F() {\nthis.fetch = false;\nthis.DOMException = root.DOMException\n}\nF.prototype = root;\nreturn new F();\n})(typeof self !== 'undefined' ? self : this);\n(function(self) {\n\nvar irrelevant = (function (exports) {\n\n  var support = {\n    searchParams: 'URLSearchParams' in self,\n    iterable: 'Symbol' in self && 'iterator' in Symbol,\n    blob:\n      'FileReader' in self &&\n      'Blob' in self &&\n      (function() {\n        try {\n          new Blob();\n          return true\n        } catch (e) {\n          return false\n        }\n      })(),\n    formData: 'FormData' in self,\n    arrayBuffer: 'ArrayBuffer' in self\n  };\n\n  function isDataView(obj) {\n    return obj && DataView.prototype.isPrototypeOf(obj)\n  }\n\n  if (support.arrayBuffer) {\n    var viewClasses = [\n      '[object Int8Array]',\n      '[object Uint8Array]',\n      '[object Uint8ClampedArray]',\n      '[object Int16Array]',\n      '[object Uint16Array]',\n      '[object Int32Array]',\n      '[object Uint32Array]',\n      '[object Float32Array]',\n      '[object Float64Array]'\n    ];\n\n    var isArrayBufferView =\n      ArrayBuffer.isView ||\n      function(obj) {\n        return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n      };\n  }\n\n  function normalizeName(name) {\n    if (typeof name !== 'string') {\n      name = String(name);\n    }\n    if (/[^a-z0-9\\-#$%&'*+.^_`|~]/i.test(name)) {\n      throw new TypeError('Invalid character in header field name')\n    }\n    return name.toLowerCase()\n  }\n\n  function normalizeValue(value) {\n    if (typeof value !== 'string') {\n      value = String(value);\n    }\n    return value\n  }\n\n  // Build a destructive iterator for the value list\n  function iteratorFor(items) {\n    var iterator = {\n      next: function() {\n        var value = items.shift();\n        return {done: value === undefined, value: value}\n      }\n    };\n\n    if (support.iterable) {\n      iterator[Symbol.iterator] = function() {\n        return iterator\n      };\n    }\n\n    return iterator\n  }\n\n  function Headers(headers) {\n    this.map = {};\n\n    if (headers instanceof Headers) {\n      headers.forEach(function(value, name) {\n        this.append(name, value);\n      }, this);\n    } else if (Array.isArray(headers)) {\n      headers.forEach(function(header) {\n        this.append(header[0], header[1]);\n      }, this);\n    } else if (headers) {\n      Object.getOwnPropertyNames(headers).forEach(function(name) {\n        this.append(name, headers[name]);\n      }, this);\n    }\n  }\n\n  Headers.prototype.append = function(name, value) {\n    name = normalizeName(name);\n    value = normalizeValue(value);\n    var oldValue = this.map[name];\n    this.map[name] = oldValue ? oldValue + ', ' + value : value;\n  };\n\n  Headers.prototype['delete'] = function(name) {\n    delete this.map[normalizeName(name)];\n  };\n\n  Headers.prototype.get = function(name) {\n    name = normalizeName(name);\n    return this.has(name) ? this.map[name] : null\n  };\n\n  Headers.prototype.has = function(name) {\n    return this.map.hasOwnProperty(normalizeName(name))\n  };\n\n  Headers.prototype.set = function(name, value) {\n    this.map[normalizeName(name)] = normalizeValue(value);\n  };\n\n  Headers.prototype.forEach = function(callback, thisArg) {\n    for (var name in this.map) {\n      if (this.map.hasOwnProperty(name)) {\n        callback.call(thisArg, this.map[name], name, this);\n      }\n    }\n  };\n\n  Headers.prototype.keys = function() {\n    var items = [];\n    this.forEach(function(value, name) {\n      items.push(name);\n    });\n    return iteratorFor(items)\n  };\n\n  Headers.prototype.values = function() {\n    var items = [];\n    this.forEach(function(value) {\n      items.push(value);\n    });\n    return iteratorFor(items)\n  };\n\n  Headers.prototype.entries = function() {\n    var items = [];\n    this.forEach(function(value, name) {\n      items.push([name, value]);\n    });\n    return iteratorFor(items)\n  };\n\n  if (support.iterable) {\n    Headers.prototype[Symbol.iterator] = Headers.prototype.entries;\n  }\n\n  function consumed(body) {\n    if (body.bodyUsed) {\n      return Promise.reject(new TypeError('Already read'))\n    }\n    body.bodyUsed = true;\n  }\n\n  function fileReaderReady(reader) {\n    return new Promise(function(resolve, reject) {\n      reader.onload = function() {\n        resolve(reader.result);\n      };\n      reader.onerror = function() {\n        reject(reader.error);\n      };\n    })\n  }\n\n  function readBlobAsArrayBuffer(blob) {\n    var reader = new FileReader();\n    var promise = fileReaderReady(reader);\n    reader.readAsArrayBuffer(blob);\n    return promise\n  }\n\n  function readBlobAsText(blob) {\n    var reader = new FileReader();\n    var promise = fileReaderReady(reader);\n    reader.readAsText(blob);\n    return promise\n  }\n\n  function readArrayBufferAsText(buf) {\n    var view = new Uint8Array(buf);\n    var chars = new Array(view.length);\n\n    for (var i = 0; i < view.length; i++) {\n      chars[i] = String.fromCharCode(view[i]);\n    }\n    return chars.join('')\n  }\n\n  function bufferClone(buf) {\n    if (buf.slice) {\n      return buf.slice(0)\n    } else {\n      var view = new Uint8Array(buf.byteLength);\n      view.set(new Uint8Array(buf));\n      return view.buffer\n    }\n  }\n\n  function Body() {\n    this.bodyUsed = false;\n\n    this._initBody = function(body) {\n      this._bodyInit = body;\n      if (!body) {\n        this._bodyText = '';\n      } else if (typeof body === 'string') {\n        this._bodyText = body;\n      } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n        this._bodyBlob = body;\n      } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n        this._bodyFormData = body;\n      } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n        this._bodyText = body.toString();\n      } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n        this._bodyArrayBuffer = bufferClone(body.buffer);\n        // IE 10-11 can't handle a DataView body.\n        this._bodyInit = new Blob([this._bodyArrayBuffer]);\n      } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n        this._bodyArrayBuffer = bufferClone(body);\n      } else {\n        this._bodyText = body = Object.prototype.toString.call(body);\n      }\n\n      if (!this.headers.get('content-type')) {\n        if (typeof body === 'string') {\n          this.headers.set('content-type', 'text/plain;charset=UTF-8');\n        } else if (this._bodyBlob && this._bodyBlob.type) {\n          this.headers.set('content-type', this._bodyBlob.type);\n        } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n          this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n        }\n      }\n    };\n\n    if (support.blob) {\n      this.blob = function() {\n        var rejected = consumed(this);\n        if (rejected) {\n          return rejected\n        }\n\n        if (this._bodyBlob) {\n          return Promise.resolve(this._bodyBlob)\n        } else if (this._bodyArrayBuffer) {\n          return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n        } else if (this._bodyFormData) {\n          throw new Error('could not read FormData body as blob')\n        } else {\n          return Promise.resolve(new Blob([this._bodyText]))\n        }\n      };\n\n      this.arrayBuffer = function() {\n        if (this._bodyArrayBuffer) {\n          return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n        } else {\n          return this.blob().then(readBlobAsArrayBuffer)\n        }\n      };\n    }\n\n    this.text = function() {\n      var rejected = consumed(this);\n      if (rejected) {\n        return rejected\n      }\n\n      if (this._bodyBlob) {\n        return readBlobAsText(this._bodyBlob)\n      } else if (this._bodyArrayBuffer) {\n        return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n      } else if (this._bodyFormData) {\n        throw new Error('could not read FormData body as text')\n      } else {\n        return Promise.resolve(this._bodyText)\n      }\n    };\n\n    if (support.formData) {\n      this.formData = function() {\n        return this.text().then(decode)\n      };\n    }\n\n    this.json = function() {\n      return this.text().then(JSON.parse)\n    };\n\n    return this\n  }\n\n  // HTTP methods whose capitalization should be normalized\n  var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];\n\n  function normalizeMethod(method) {\n    var upcased = method.toUpperCase();\n    return methods.indexOf(upcased) > -1 ? upcased : method\n  }\n\n  function Request(input, options) {\n    options = options || {};\n    var body = options.body;\n\n    if (input instanceof Request) {\n      if (input.bodyUsed) {\n        throw new TypeError('Already read')\n      }\n      this.url = input.url;\n      this.credentials = input.credentials;\n      if (!options.headers) {\n        this.headers = new Headers(input.headers);\n      }\n      this.method = input.method;\n      this.mode = input.mode;\n      this.signal = input.signal;\n      if (!body && input._bodyInit != null) {\n        body = input._bodyInit;\n        input.bodyUsed = true;\n      }\n    } else {\n      this.url = String(input);\n    }\n\n    this.credentials = options.credentials || this.credentials || 'same-origin';\n    if (options.headers || !this.headers) {\n      this.headers = new Headers(options.headers);\n    }\n    this.method = normalizeMethod(options.method || this.method || 'GET');\n    this.mode = options.mode || this.mode || null;\n    this.signal = options.signal || this.signal;\n    this.referrer = null;\n\n    if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n      throw new TypeError('Body not allowed for GET or HEAD requests')\n    }\n    this._initBody(body);\n  }\n\n  Request.prototype.clone = function() {\n    return new Request(this, {body: this._bodyInit})\n  };\n\n  function decode(body) {\n    var form = new FormData();\n    body\n      .trim()\n      .split('&')\n      .forEach(function(bytes) {\n        if (bytes) {\n          var split = bytes.split('=');\n          var name = split.shift().replace(/\\+/g, ' ');\n          var value = split.join('=').replace(/\\+/g, ' ');\n          form.append(decodeURIComponent(name), decodeURIComponent(value));\n        }\n      });\n    return form\n  }\n\n  function parseHeaders(rawHeaders) {\n    var headers = new Headers();\n    // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n    // https://tools.ietf.org/html/rfc7230#section-3.2\n    var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ');\n    preProcessedHeaders.split(/\\r?\\n/).forEach(function(line) {\n      var parts = line.split(':');\n      var key = parts.shift().trim();\n      if (key) {\n        var value = parts.join(':').trim();\n        headers.append(key, value);\n      }\n    });\n    return headers\n  }\n\n  Body.call(Request.prototype);\n\n  function Response(bodyInit, options) {\n    if (!options) {\n      options = {};\n    }\n\n    this.type = 'default';\n    this.status = options.status === undefined ? 200 : options.status;\n    this.ok = this.status >= 200 && this.status < 300;\n    this.statusText = 'statusText' in options ? options.statusText : 'OK';\n    this.headers = new Headers(options.headers);\n    this.url = options.url || '';\n    this._initBody(bodyInit);\n  }\n\n  Body.call(Response.prototype);\n\n  Response.prototype.clone = function() {\n    return new Response(this._bodyInit, {\n      status: this.status,\n      statusText: this.statusText,\n      headers: new Headers(this.headers),\n      url: this.url\n    })\n  };\n\n  Response.error = function() {\n    var response = new Response(null, {status: 0, statusText: ''});\n    response.type = 'error';\n    return response\n  };\n\n  var redirectStatuses = [301, 302, 303, 307, 308];\n\n  Response.redirect = function(url, status) {\n    if (redirectStatuses.indexOf(status) === -1) {\n      throw new RangeError('Invalid status code')\n    }\n\n    return new Response(null, {status: status, headers: {location: url}})\n  };\n\n  exports.DOMException = self.DOMException;\n  try {\n    new exports.DOMException();\n  } catch (err) {\n    exports.DOMException = function(message, name) {\n      this.message = message;\n      this.name = name;\n      var error = Error(message);\n      this.stack = error.stack;\n    };\n    exports.DOMException.prototype = Object.create(Error.prototype);\n    exports.DOMException.prototype.constructor = exports.DOMException;\n  }\n\n  function fetch(input, init) {\n    return new Promise(function(resolve, reject) {\n      var request = new Request(input, init);\n\n      if (request.signal && request.signal.aborted) {\n        return reject(new exports.DOMException('Aborted', 'AbortError'))\n      }\n\n      var xhr = new XMLHttpRequest();\n\n      function abortXhr() {\n        xhr.abort();\n      }\n\n      xhr.onload = function() {\n        var options = {\n          status: xhr.status,\n          statusText: xhr.statusText,\n          headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n        };\n        options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');\n        var body = 'response' in xhr ? xhr.response : xhr.responseText;\n        resolve(new Response(body, options));\n      };\n\n      xhr.onerror = function() {\n        reject(new TypeError('Network request failed'));\n      };\n\n      xhr.ontimeout = function() {\n        reject(new TypeError('Network request failed'));\n      };\n\n      xhr.onabort = function() {\n        reject(new exports.DOMException('Aborted', 'AbortError'));\n      };\n\n      xhr.open(request.method, request.url, true);\n\n      if (request.credentials === 'include') {\n        xhr.withCredentials = true;\n      } else if (request.credentials === 'omit') {\n        xhr.withCredentials = false;\n      }\n\n      if ('responseType' in xhr && support.blob) {\n        xhr.responseType = 'blob';\n      }\n\n      request.headers.forEach(function(value, name) {\n        xhr.setRequestHeader(name, value);\n      });\n\n      if (request.signal) {\n        request.signal.addEventListener('abort', abortXhr);\n\n        xhr.onreadystatechange = function() {\n          // DONE (success or failure)\n          if (xhr.readyState === 4) {\n            request.signal.removeEventListener('abort', abortXhr);\n          }\n        };\n      }\n\n      xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);\n    })\n  }\n\n  fetch.polyfill = true;\n\n  if (!self.fetch) {\n    self.fetch = fetch;\n    self.Headers = Headers;\n    self.Request = Request;\n    self.Response = Response;\n  }\n\n  exports.Headers = Headers;\n  exports.Request = Request;\n  exports.Response = Response;\n  exports.fetch = fetch;\n\n  return exports;\n\n}({}));\n})(__self__);\ndelete __self__.fetch.polyfill\nexports = __self__.fetch // To enable: import fetch from 'cross-fetch'\nexports.default = __self__.fetch // For TypeScript consumers without esModuleInterop.\nexports.fetch = __self__.fetch // To enable: import {fetch} from 'cross-fetch'\nexports.Headers = __self__.Headers\nexports.Request = __self__.Request\nexports.Response = __self__.Response\nmodule.exports = exports\n","var arrayWithHoles = require(\"./arrayWithHoles\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit\");\n\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray\");\n\nvar nonIterableRest = require(\"./nonIterableRest\");\n\nfunction _slicedToArray(arr, i) {\n  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  exports.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  IteratorPrototype[iteratorSymbol] = function () {\n    return this;\n  };\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunctionPrototype[toStringTagSymbol] =\n    GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  exports.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  exports.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      if (!(toStringTagSymbol in genFun)) {\n        genFun[toStringTagSymbol] = \"GeneratorFunction\";\n      }\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  exports.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator, PromiseImpl) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return PromiseImpl.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return PromiseImpl.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration.\n          result.value = unwrapped;\n          resolve(result);\n        }, function(error) {\n          // If a rejected Promise was yielded, throw the rejection back\n          // into the async generator function so it can be handled there.\n          return invoke(\"throw\", error, resolve, reject);\n        });\n      }\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new PromiseImpl(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n    return this;\n  };\n  exports.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n    if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList),\n      PromiseImpl\n    );\n\n    return exports.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        // Note: [\"return\"] must be used for ES3 parsing compatibility.\n        if (delegate.iterator[\"return\"]) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[toStringTagSymbol] = \"Generator\";\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  exports.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  exports.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n\n  // Regardless of whether this script is executing as a CommonJS module\n  // or not, return the runtime object so that we can declare the variable\n  // regeneratorRuntime in the outer scope, which allows this module to be\n  // injected easily by `bin/regenerator --include-runtime script.js`.\n  return exports;\n\n}(\n  // If this script is executing as a CommonJS module, use module.exports\n  // as the regeneratorRuntime namespace. Otherwise create a new empty\n  // object. Either way, the resulting object will be used to initialize\n  // the regeneratorRuntime variable at the top of this file.\n  typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n  regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n  // This module should not be running in strict mode, so the above\n  // assignment should always work unless something is misconfigured. Just\n  // in case runtime.js accidentally runs in strict mode, we can escape\n  // strict mode using a global Function call. This could conceivably fail\n  // if a Content Security Policy forbids using Function, but in that case\n  // the proper solution is to fix the accidental strict mode problem. If\n  // you've misconfigured your bundler to force strict mode and applied a\n  // CSP to forbid Function, and you're not willing to fix either of those\n  // problems, please detail your unique predicament in a GitHub issue.\n  Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","function _isNativeFunction(fn) {\n  return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}\n\nmodule.exports = _isNativeFunction;","var setPrototypeOf = require(\"./setPrototypeOf\");\n\nvar isNativeReflectConstruct = require(\"./isNativeReflectConstruct\");\n\nfunction _construct(Parent, args, Class) {\n  if (isNativeReflectConstruct()) {\n    module.exports = _construct = Reflect.construct;\n  } else {\n    module.exports = _construct = function _construct(Parent, args, Class) {\n      var a = [null];\n      a.push.apply(a, args);\n      var Constructor = Function.bind.apply(Parent, a);\n      var instance = new Constructor();\n      if (Class) setPrototypeOf(instance, Class.prototype);\n      return instance;\n    };\n  }\n\n  return _construct.apply(null, arguments);\n}\n\nmodule.exports = _construct;","function _isNativeReflectConstruct() {\n  if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n  if (Reflect.construct.sham) return false;\n  if (typeof Proxy === \"function\") return true;\n\n  try {\n    Date.prototype.toString.call(Reflect.construct(Date, [], function () {}));\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\nmodule.exports = _isNativeReflectConstruct;","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","/*!\n * JavaScript Cookie v2.2.1\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader;\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine(factory);\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (typeof exports === 'object') {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction decode (s) {\n\t\treturn s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api() {}\n\n\t\tfunction set (key, value, attributes) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattributes = extend({\n\t\t\t\tpath: '/'\n\t\t\t}, api.defaults, attributes);\n\n\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\tattributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);\n\t\t\t}\n\n\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\ttry {\n\t\t\t\tvar result = JSON.stringify(value);\n\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\tvalue = result;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\n\t\t\tvalue = converter.write ?\n\t\t\t\tconverter.write(value, key) :\n\t\t\t\tencodeURIComponent(String(value))\n\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n\t\t\tkey = encodeURIComponent(String(key))\n\t\t\t\t.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)\n\t\t\t\t.replace(/[\\(\\)]/g, escape);\n\n\t\t\tvar stringifiedAttributes = '';\n\t\t\tfor (var attributeName in attributes) {\n\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Considers RFC 6265 section 5.2:\n\t\t\t\t// ...\n\t\t\t\t// 3.  If the remaining unparsed-attributes contains a %x3B (\";\")\n\t\t\t\t//     character:\n\t\t\t\t// Consume the characters of the unparsed-attributes up to,\n\t\t\t\t// not including, the first %x3B (\";\") character.\n\t\t\t\t// ...\n\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n\t\t\t}\n\n\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t}\n\n\t\tfunction get (key, json) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jar = {};\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all.\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = decode(parts[0]);\n\t\t\t\t\tcookie = (converter.read || converter)(cookie, name) ||\n\t\t\t\t\t\tdecode(cookie);\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tjar[name] = cookie;\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn key ? jar[key] : jar;\n\t\t}\n\n\t\tapi.set = set;\n\t\tapi.get = function (key) {\n\t\t\treturn get(key, false /* read as raw */);\n\t\t};\n\t\tapi.getJSON = function (key) {\n\t\t\treturn get(key, true /* read as json */);\n\t\t};\n\t\tapi.remove = function (key, attributes) {\n\t\t\tset(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.defaults = {};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n","function _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;","function _iterableToArrayLimit(arr, i) {\n  if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;","var arrayLikeToArray = require(\"./arrayLikeToArray\");\n\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\n\nmodule.exports = _unsupportedIterableToArray;","function _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) {\n    arr2[i] = arr[i];\n  }\n\n  return arr2;\n}\n\nmodule.exports = _arrayLikeToArray;","function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nmodule.exports = _nonIterableRest;","'use strict';\n\nclass CancelError extends Error {\n\tconstructor(reason) {\n\t\tsuper(reason || 'Promise was canceled');\n\t\tthis.name = 'CancelError';\n\t}\n\n\tget isCanceled() {\n\t\treturn true;\n\t}\n}\n\nclass PCancelable {\n\tstatic fn(userFn) {\n\t\treturn (...arguments_) => {\n\t\t\treturn new PCancelable((resolve, reject, onCancel) => {\n\t\t\t\targuments_.push(onCancel);\n\t\t\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\t\t\tuserFn(...arguments_).then(resolve, reject);\n\t\t\t});\n\t\t};\n\t}\n\n\tconstructor(executor) {\n\t\tthis._cancelHandlers = [];\n\t\tthis._isPending = true;\n\t\tthis._isCanceled = false;\n\t\tthis._rejectOnCancel = true;\n\n\t\tthis._promise = new Promise((resolve, reject) => {\n\t\t\tthis._reject = reject;\n\n\t\t\tconst onResolve = value => {\n\t\t\t\tthis._isPending = false;\n\t\t\t\tresolve(value);\n\t\t\t};\n\n\t\t\tconst onReject = error => {\n\t\t\t\tthis._isPending = false;\n\t\t\t\treject(error);\n\t\t\t};\n\n\t\t\tconst onCancel = handler => {\n\t\t\t\tif (!this._isPending) {\n\t\t\t\t\tthrow new Error('The `onCancel` handler was attached after the promise settled.');\n\t\t\t\t}\n\n\t\t\t\tthis._cancelHandlers.push(handler);\n\t\t\t};\n\n\t\t\tObject.defineProperties(onCancel, {\n\t\t\t\tshouldReject: {\n\t\t\t\t\tget: () => this._rejectOnCancel,\n\t\t\t\t\tset: boolean => {\n\t\t\t\t\t\tthis._rejectOnCancel = boolean;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn executor(onResolve, onReject, onCancel);\n\t\t});\n\t}\n\n\tthen(onFulfilled, onRejected) {\n\t\t// eslint-disable-next-line promise/prefer-await-to-then\n\t\treturn this._promise.then(onFulfilled, onRejected);\n\t}\n\n\tcatch(onRejected) {\n\t\treturn this._promise.catch(onRejected);\n\t}\n\n\tfinally(onFinally) {\n\t\treturn this._promise.finally(onFinally);\n\t}\n\n\tcancel(reason) {\n\t\tif (!this._isPending || this._isCanceled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._cancelHandlers.length > 0) {\n\t\t\ttry {\n\t\t\t\tfor (const handler of this._cancelHandlers) {\n\t\t\t\t\thandler();\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tthis._reject(error);\n\t\t\t}\n\t\t}\n\n\t\tthis._isCanceled = true;\n\t\tif (this._rejectOnCancel) {\n\t\t\tthis._reject(new CancelError(reason));\n\t\t}\n\t}\n\n\tget isCanceled() {\n\t\treturn this._isCanceled;\n\t}\n}\n\nObject.setPrototypeOf(PCancelable.prototype, Promise.prototype);\n\nmodule.exports = PCancelable;\nmodule.exports.CancelError = CancelError;\n","function E () {\n  // Keep this empty so it's easier to inherit from\n  // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n  on: function (name, callback, ctx) {\n    var e = this.e || (this.e = {});\n\n    (e[name] || (e[name] = [])).push({\n      fn: callback,\n      ctx: ctx\n    });\n\n    return this;\n  },\n\n  once: function (name, callback, ctx) {\n    var self = this;\n    function listener () {\n      self.off(name, listener);\n      callback.apply(ctx, arguments);\n    };\n\n    listener._ = callback\n    return this.on(name, listener, ctx);\n  },\n\n  emit: function (name) {\n    var data = [].slice.call(arguments, 1);\n    var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n    var i = 0;\n    var len = evtArr.length;\n\n    for (i; i < len; i++) {\n      evtArr[i].fn.apply(evtArr[i].ctx, data);\n    }\n\n    return this;\n  },\n\n  off: function (name, callback) {\n    var e = this.e || (this.e = {});\n    var evts = e[name];\n    var liveEvents = [];\n\n    if (evts && callback) {\n      for (var i = 0, len = evts.length; i < len; i++) {\n        if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n          liveEvents.push(evts[i]);\n      }\n    }\n\n    // Remove event from queue to prevent memory leak\n    // Suggested by https://github.com/lazd\n    // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n    (liveEvents.length)\n      ? e[name] = liveEvents\n      : delete e[name];\n\n    return this;\n  }\n};\n\nmodule.exports = E;\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\nexport default class CustomError extends Error {\n    constructor(message) {\n        // https://stackoverflow.com/questions/41102060/typescript-extending-error-class\n        super(message); // 'Error' breaks prototype chain here\n        Object.setPrototypeOf(this, new.target.prototype); // restore prototype chain\n    }\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\nimport CustomError from './CustomError';\nexport default class AuthSdkError extends CustomError {\n    constructor(msg, xhr) {\n        super(msg);\n        this.name = 'AuthSdkError';\n        this.errorCode = 'INTERNAL';\n        this.errorSummary = msg;\n        this.errorLink = 'INTERNAL';\n        this.errorId = 'INTERNAL';\n        this.errorCauses = [];\n        if (xhr) {\n            this.xhr = xhr;\n        }\n    }\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n/* global window, document, btoa, atob */\n// converts a string to base64 (url/filename safe variant)\nexport function stringToBase64Url(str) {\n    var b64 = btoa(str);\n    return base64ToBase64Url(b64);\n}\n// converts a standard base64-encoded string to a \"url/filename safe\" variant\nexport function base64ToBase64Url(b64) {\n    return b64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n// converts a \"url/filename safe\" base64 string to a \"standard\" base64 string\nexport function base64UrlToBase64(b64u) {\n    return b64u.replace(/-/g, '+').replace(/_/g, '/');\n}\nexport function base64UrlToString(b64u) {\n    var b64 = base64UrlToBase64(b64u);\n    switch (b64.length % 4) {\n        case 0:\n            break;\n        case 2:\n            b64 += '==';\n            break;\n        case 3:\n            b64 += '=';\n            break;\n        default:\n            throw 'Not a valid Base64Url';\n    }\n    var utf8 = atob(b64);\n    try {\n        return decodeURIComponent(escape(utf8));\n    }\n    catch (e) {\n        return utf8;\n    }\n}\nexport function stringToBuffer(str) {\n    var buffer = new Uint8Array(str.length);\n    for (var i = 0; i < str.length; i++) {\n        buffer[i] = str.charCodeAt(i);\n    }\n    return buffer;\n}\nexport function base64UrlDecode(str) {\n    return atob(base64UrlToBase64(str));\n}\nexport function bind(fn, ctx) {\n    var additionalArgs = Array.prototype.slice.call(arguments, 2);\n    return function () {\n        var args = Array.prototype.slice.call(arguments);\n        args = additionalArgs.concat(args);\n        return fn.apply(ctx, args);\n    };\n}\nexport function isAbsoluteUrl(url) {\n    return /^(?:[a-z]+:)?\\/\\//i.test(url);\n}\nexport function toAbsoluteUrl(url = '', baseUrl) {\n    if (isAbsoluteUrl(url)) {\n        return url;\n    }\n    baseUrl = removeTrailingSlash(baseUrl);\n    return url[0] === '/' ? `${baseUrl}${url}` : `${baseUrl}/${url}`;\n}\nexport function toRelativeUrl(url = '', baseUrl) {\n    if (isAbsoluteUrl(url)) {\n        url = url.substring(baseUrl.length);\n    }\n    return url[0] === '/' ? url : `/${url}`;\n}\nexport function isString(obj) {\n    return Object.prototype.toString.call(obj) === '[object String]';\n}\nexport function isObject(obj) {\n    return Object.prototype.toString.call(obj) === '[object Object]';\n}\nexport function isNumber(obj) {\n    return Object.prototype.toString.call(obj) === '[object Number]';\n}\nexport function isoToUTCString(str) {\n    var parts = str.match(/\\d+/g), isoTime = Date.UTC(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]), isoDate = new Date(isoTime);\n    return isoDate.toUTCString();\n}\nexport function toQueryString(obj) {\n    var str = [];\n    if (obj !== null) {\n        for (var key in obj) {\n            if (Object.prototype.hasOwnProperty.call(obj, key) &&\n                obj[key] !== undefined &&\n                obj[key] !== null) {\n                str.push(key + '=' + encodeURIComponent(obj[key]));\n            }\n        }\n    }\n    if (str.length) {\n        return '?' + str.join('&');\n    }\n    else {\n        return '';\n    }\n}\nexport function genRandomString(length) {\n    var randomCharset = 'abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n    var random = '';\n    for (var c = 0, cl = randomCharset.length; c < length; ++c) {\n        random += randomCharset[Math.floor(Math.random() * cl)];\n    }\n    return random;\n}\n// TODO: replace all references with `Object.assign` then remove this function\nexport function extend() {\n    // First object will be modified!\n    var obj1 = arguments[0];\n    // Properties from other objects will be copied over\n    var objArray = [].slice.call(arguments, 1);\n    objArray.forEach(function (obj) {\n        for (var prop in obj) {\n            // copy over all properties with defined values\n            if (Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] !== undefined) {\n                obj1[prop] = obj[prop];\n            }\n        }\n    });\n    return obj1; // return the modified object\n}\nexport function removeNils(obj) {\n    var cleaned = {};\n    for (var prop in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, prop)) {\n            var value = obj[prop];\n            if (value !== null && value !== undefined) {\n                cleaned[prop] = value;\n            }\n        }\n    }\n    return cleaned;\n}\nexport function clone(obj) {\n    if (obj) {\n        var str = JSON.stringify(obj);\n        if (str) {\n            return JSON.parse(str);\n        }\n    }\n    return obj;\n}\n// Analogous to _.omit\nexport function omit(obj, ...props) {\n    // var props = Array.prototype.slice.call(arguments, 1);\n    var newobj = {};\n    for (var p in obj) {\n        if (Object.prototype.hasOwnProperty.call(obj, p) && props.indexOf(p) == -1) {\n            newobj[p] = obj[p];\n        }\n    }\n    return clone(newobj);\n}\nexport function find(collection, searchParams) {\n    var c = collection.length;\n    while (c--) {\n        var item = collection[c];\n        var found = true;\n        for (var prop in searchParams) {\n            if (!Object.prototype.hasOwnProperty.call(searchParams, prop)) {\n                continue;\n            }\n            if (item[prop] !== searchParams[prop]) {\n                found = false;\n                break;\n            }\n        }\n        if (found) {\n            return item;\n        }\n    }\n}\nexport function getLink(obj, linkName, altName) {\n    if (!obj || !obj._links) {\n        return;\n    }\n    var link = clone(obj._links[linkName]);\n    // If a link has a name and we have an altName, return if they match\n    if (link && link.name && altName) {\n        if (link.name === altName) {\n            return link;\n        }\n    }\n    else {\n        return link;\n    }\n}\nexport function getNativeConsole() {\n    if (typeof window !== 'undefined') {\n        return window.console;\n    }\n    else if (typeof console !== 'undefined') {\n        return console;\n    }\n    else {\n        return undefined;\n    }\n}\nexport function getConsole() {\n    var nativeConsole = getNativeConsole();\n    if (nativeConsole && nativeConsole.log) {\n        return nativeConsole;\n    }\n    return {\n        log: function () { },\n        warn: function () { },\n        group: function () { },\n        groupEnd: function () { }\n    };\n}\nexport function warn(text) {\n    /* eslint-disable no-console */\n    getConsole().warn('[okta-auth-sdk] WARN: ' + text);\n    /* eslint-enable */\n}\nexport function deprecate(text) {\n    /* eslint-disable no-console */\n    getConsole().warn('[okta-auth-sdk] DEPRECATION: ' + text);\n    /* eslint-enable */\n}\nexport function deprecateWrap(text, fn) {\n    return function () {\n        deprecate(text);\n        return fn.apply(null, arguments);\n    };\n}\nexport function removeTrailingSlash(path) {\n    if (!path) {\n        return;\n    }\n    // Remove any whitespace before or after string\n    var trimmed = path.replace(/^\\s+|\\s+$/gm, '');\n    // Remove trailing slash(es)\n    trimmed = trimmed.replace(/\\/+$/, '');\n    return trimmed;\n}\nexport function isIE11OrLess() {\n    return !!document.documentMode && document.documentMode <= 11;\n}\nexport function isFunction(fn) {\n    return !!fn && {}.toString.call(fn) === '[object Function]';\n}\nexport function delay(ms) {\n    return new Promise(function (resolve) {\n        setTimeout(resolve, ms);\n    });\n}\nexport function isPromise(obj) {\n    return obj && obj.finally && (typeof obj.finally === 'function');\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\nimport CustomError from './CustomError';\nexport default class AuthApiError extends CustomError {\n    constructor(err, xhr) {\n        const message = err.errorSummary;\n        super(message);\n        this.name = 'AuthApiError';\n        this.errorSummary = err.errorSummary;\n        this.errorCode = err.errorCode;\n        this.errorLink = err.errorLink;\n        this.errorId = err.errorId;\n        this.errorCauses = err.errorCauses;\n        if (xhr) {\n            this.xhr = xhr;\n        }\n    }\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\nexport const STATE_TOKEN_KEY_NAME = 'oktaStateToken';\nexport const DEFAULT_POLLING_DELAY = 500;\nexport const DEFAULT_MAX_CLOCK_SKEW = 300;\nexport const DEFAULT_CACHE_DURATION = 86400;\nexport const REDIRECT_OAUTH_PARAMS_NAME = 'okta-oauth-redirect-params';\nexport const REDIRECT_STATE_COOKIE_NAME = 'okta-oauth-state';\nexport const REDIRECT_NONCE_COOKIE_NAME = 'okta-oauth-nonce';\nexport const TOKEN_STORAGE_NAME = 'okta-token-storage';\nexport const CACHE_STORAGE_NAME = 'okta-cache-storage';\nexport const PKCE_STORAGE_NAME = 'okta-pkce-storage';\nexport const TRANSACTION_STORAGE_NAME = 'okta-transaction-storage';\nexport const ACCESS_TOKEN_STORAGE_KEY = 'accessToken';\nexport const ID_TOKEN_STORAGE_KEY = 'idToken';\nexport const REFRESH_TOKEN_STORAGE_KEY = 'refreshToken';\nexport const REFERRER_PATH_STORAGE_KEY = 'referrerPath';\n// Code verifier: Random URL-safe string with a minimum length of 43 characters.\n// Code challenge: Base64 URL-encoded SHA-256 hash of the code verifier.\nexport const MIN_VERIFIER_LENGTH = 43;\nexport const MAX_VERIFIER_LENGTH = 128;\nexport const DEFAULT_CODE_CHALLENGE_METHOD = 'S256';\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\n/* eslint-disable complexity */\nimport { isString, clone, isAbsoluteUrl, removeNils } from './util';\nimport AuthApiError from './errors/AuthApiError';\nimport { STATE_TOKEN_KEY_NAME, DEFAULT_CACHE_DURATION } from './constants';\nfunction httpRequest(sdk, options) {\n    options = options || {};\n    var url = options.url, method = options.method, args = options.args, saveAuthnState = options.saveAuthnState, accessToken = options.accessToken, withCredentials = options.withCredentials !== false, // default value is true\n    storageUtil = sdk.options.storageUtil, storage = storageUtil.storage, httpCache = sdk.storageManager.getHttpCache(sdk.options.cookies);\n    if (options.cacheResponse) {\n        var cacheContents = httpCache.getStorage();\n        var cachedResponse = cacheContents[url];\n        if (cachedResponse && Date.now() / 1000 < cachedResponse.expiresAt) {\n            return Promise.resolve(cachedResponse.response);\n        }\n    }\n    var headers = {\n        'Accept': 'application/json',\n        'Content-Type': 'application/json',\n        'X-Okta-User-Agent-Extended': sdk.userAgent\n    };\n    Object.assign(headers, sdk.options.headers, options.headers);\n    headers = removeNils(headers);\n    if (accessToken && isString(accessToken)) {\n        headers['Authorization'] = 'Bearer ' + accessToken;\n    }\n    var ajaxOptions = {\n        headers: headers,\n        data: args || undefined,\n        withCredentials: withCredentials\n    };\n    var err, res;\n    return sdk.options.httpRequestClient(method, url, ajaxOptions)\n        .then(function (resp) {\n        res = resp.responseText;\n        if (res && isString(res)) {\n            res = JSON.parse(res);\n        }\n        if (saveAuthnState) {\n            if (!res.stateToken) {\n                storage.delete(STATE_TOKEN_KEY_NAME);\n            }\n        }\n        if (res && res.stateToken && res.expiresAt) {\n            storage.set(STATE_TOKEN_KEY_NAME, res.stateToken, res.expiresAt, sdk.options.cookies);\n        }\n        if (res && options.cacheResponse) {\n            httpCache.updateStorage(url, {\n                expiresAt: Math.floor(Date.now() / 1000) + DEFAULT_CACHE_DURATION,\n                response: res\n            });\n        }\n        return res;\n    })\n        .catch(function (resp) {\n        var serverErr = resp.responseText || {};\n        if (isString(serverErr)) {\n            try {\n                serverErr = JSON.parse(serverErr);\n            }\n            catch (e) {\n                serverErr = {\n                    errorSummary: 'Unknown error'\n                };\n            }\n        }\n        if (resp.status >= 500) {\n            serverErr.errorSummary = 'Unknown error';\n        }\n        if (sdk.options.transformErrorXHR) {\n            resp = sdk.options.transformErrorXHR(clone(resp));\n        }\n        err = new AuthApiError(serverErr, resp);\n        if (err.errorCode === 'E0000011') {\n            storage.delete(STATE_TOKEN_KEY_NAME);\n        }\n        throw err;\n    });\n}\nfunction get(sdk, url, options) {\n    url = isAbsoluteUrl(url) ? url : sdk.getIssuerOrigin() + url;\n    var getOptions = {\n        url: url,\n        method: 'GET'\n    };\n    Object.assign(getOptions, options);\n    return httpRequest(sdk, getOptions);\n}\nfunction post(sdk, url, args, options) {\n    url = isAbsoluteUrl(url) ? url : sdk.getIssuerOrigin() + url;\n    var postOptions = {\n        url: url,\n        method: 'POST',\n        args: args,\n        saveAuthnState: true\n    };\n    Object.assign(postOptions, options);\n    return httpRequest(sdk, postOptions);\n}\nexport default {\n    get: get,\n    post: post,\n    httpRequest: httpRequest\n};\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nexport function addStateToken(res, options) {\n    var builtArgs = {};\n    Object.assign(builtArgs, options);\n    // Add the stateToken if one isn't passed and we have one\n    if (!builtArgs.stateToken && res.stateToken) {\n        builtArgs.stateToken = res.stateToken;\n    }\n    return builtArgs;\n}\nexport function getStateToken(res) {\n    return addStateToken(res);\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\nimport CustomError from './CustomError';\nexport default class AuthPollStopError extends CustomError {\n    constructor() {\n        const message = 'The poll was stopped by the sdk';\n        super(message);\n    }\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport http from '../http';\nimport { isNumber, isObject, getLink, toQueryString, delay as delayFn } from '../util';\nimport { DEFAULT_POLLING_DELAY } from '../constants';\nimport AuthSdkError from '../errors/AuthSdkError';\nimport AuthPollStopError from '../errors/AuthPollStopError';\nimport { AuthTransaction } from './AuthTransaction';\nimport { getStateToken } from './util';\nexport function getPollFn(sdk, res, ref) {\n    return function (options) {\n        var delay;\n        var rememberDevice;\n        var autoPush;\n        var transactionCallBack;\n        if (isNumber(options)) {\n            delay = options;\n        }\n        else if (isObject(options)) {\n            options = options;\n            delay = options.delay;\n            rememberDevice = options.rememberDevice;\n            autoPush = options.autoPush;\n            transactionCallBack = options.transactionCallBack;\n        }\n        if (!delay && delay !== 0) {\n            delay = DEFAULT_POLLING_DELAY;\n        }\n        // Get the poll function\n        var pollLink = getLink(res, 'next', 'poll');\n        // eslint-disable-next-line complexity\n        function pollFn() {\n            var opts = {};\n            if (typeof autoPush === 'function') {\n                try {\n                    opts.autoPush = !!autoPush();\n                }\n                catch (e) {\n                    return Promise.reject(new AuthSdkError('AutoPush resulted in an error.'));\n                }\n            }\n            else if (autoPush !== undefined && autoPush !== null) {\n                opts.autoPush = !!autoPush;\n            }\n            if (typeof rememberDevice === 'function') {\n                try {\n                    opts.rememberDevice = !!rememberDevice();\n                }\n                catch (e) {\n                    return Promise.reject(new AuthSdkError('RememberDevice resulted in an error.'));\n                }\n            }\n            else if (rememberDevice !== undefined && rememberDevice !== null) {\n                opts.rememberDevice = !!rememberDevice;\n            }\n            var href = pollLink.href + toQueryString(opts);\n            return http.post(sdk, href, getStateToken(res), {\n                saveAuthnState: false\n            });\n        }\n        ref.isPolling = true;\n        var retryCount = 0;\n        var recursivePoll = function () {\n            // If the poll was manually stopped during the delay\n            if (!ref.isPolling) {\n                return Promise.reject(new AuthPollStopError());\n            }\n            return pollFn()\n                .then(function (pollRes) {\n                // Reset our retry counter on success\n                retryCount = 0;\n                // If we're still waiting\n                if (pollRes.factorResult && pollRes.factorResult === 'WAITING') {\n                    // If the poll was manually stopped while the pollFn was called\n                    if (!ref.isPolling) {\n                        throw new AuthPollStopError();\n                    }\n                    if (typeof transactionCallBack === 'function') {\n                        transactionCallBack(pollRes);\n                    }\n                    // Continue poll\n                    return delayFn(delay).then(recursivePoll);\n                }\n                else {\n                    // Any non-waiting result, even if polling was stopped\n                    // during a request, will return\n                    ref.isPolling = false;\n                    return new AuthTransaction(sdk, pollRes);\n                }\n            })\n                .catch(function (err) {\n                // Exponential backoff, up to 16 seconds\n                if (err.xhr &&\n                    (err.xhr.status === 0 || err.xhr.status === 429) &&\n                    retryCount <= 4) {\n                    var delayLength = Math.pow(2, retryCount) * 1000;\n                    retryCount++;\n                    return delayFn(delayLength)\n                        .then(recursivePoll);\n                }\n                throw err;\n            });\n        };\n        return recursivePoll()\n            .catch(function (err) {\n            ref.isPolling = false;\n            throw err;\n        });\n    };\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport http from '../http';\nimport { find, omit, toQueryString, clone, isObject } from '../util';\nimport AuthSdkError from '../errors/AuthSdkError';\nimport { addStateToken } from './util';\nimport { getPollFn } from './poll';\nimport { postToTransaction } from './api';\nexport class AuthTransaction {\n    constructor(sdk, res = null) {\n        if (res) {\n            this.data = res;\n            Object.assign(this, flattenEmbedded(sdk, res, res, {}));\n            delete this.stateToken;\n            // RECOVERY_CHALLENGE has some responses without _links.\n            // Without _links, we emulate cancel to make it intuitive\n            // to return to the starting state. We may remove this\n            // when OKTA-75434 is resolved\n            if (res.status === 'RECOVERY_CHALLENGE' && !res._links) {\n                this.cancel = function () {\n                    return Promise.resolve(new AuthTransaction(sdk));\n                };\n            }\n        }\n    }\n}\nfunction link2fn(sdk, res, obj, link, ref) {\n    if (Array.isArray(link)) {\n        return function (name, opts) {\n            if (!name) {\n                throw new AuthSdkError('Must provide a link name');\n            }\n            var lk = find(link, { name: name });\n            if (!lk) {\n                throw new AuthSdkError('No link found for that name');\n            }\n            return link2fn(sdk, res, obj, lk, ref)(opts);\n        };\n    }\n    else if (link.hints &&\n        link.hints.allow &&\n        link.hints.allow.length === 1) {\n        var method = link.hints.allow[0];\n        switch (method) {\n            case 'GET':\n                return function () {\n                    return http.get(sdk, link.href);\n                };\n            case 'POST':\n                // eslint-disable-next-line max-statements,complexity\n                return function (opts) {\n                    if (ref && ref.isPolling) {\n                        ref.isPolling = false;\n                    }\n                    var data = addStateToken(res, opts);\n                    if (res.status === 'MFA_ENROLL' || res.status === 'FACTOR_ENROLL') {\n                        // Add factorType and provider\n                        Object.assign(data, {\n                            factorType: obj.factorType,\n                            provider: obj.provider\n                        });\n                    }\n                    var params = {};\n                    var autoPush = data.autoPush;\n                    if (autoPush !== undefined) {\n                        if (typeof autoPush === 'function') {\n                            try {\n                                params.autoPush = !!autoPush();\n                            }\n                            catch (e) {\n                                return Promise.reject(new AuthSdkError('AutoPush resulted in an error.'));\n                            }\n                        }\n                        else if (autoPush !== null) {\n                            params.autoPush = !!autoPush;\n                        }\n                        data = omit(data, 'autoPush');\n                    }\n                    var rememberDevice = data.rememberDevice;\n                    if (rememberDevice !== undefined) {\n                        if (typeof rememberDevice === 'function') {\n                            try {\n                                params.rememberDevice = !!rememberDevice();\n                            }\n                            catch (e) {\n                                return Promise.reject(new AuthSdkError('RememberDevice resulted in an error.'));\n                            }\n                        }\n                        else if (rememberDevice !== null) {\n                            params.rememberDevice = !!rememberDevice;\n                        }\n                        data = omit(data, 'rememberDevice');\n                    }\n                    else if (data.profile &&\n                        data.profile.updatePhone !== undefined) {\n                        if (data.profile.updatePhone) {\n                            params.updatePhone = true;\n                        }\n                        data.profile = omit(data.profile, 'updatePhone');\n                    }\n                    var href = link.href + toQueryString(params);\n                    return postToTransaction(sdk, href, data);\n                };\n        }\n    }\n}\nfunction links2fns(sdk, res, obj, ref) {\n    var fns = {};\n    for (var linkName in obj._links) {\n        if (!Object.prototype.hasOwnProperty.call(obj._links, linkName)) {\n            continue;\n        }\n        var link = obj._links[linkName];\n        if (linkName === 'next') {\n            linkName = link.name;\n        }\n        if (link.type) {\n            fns[linkName] = link;\n            continue;\n        }\n        switch (linkName) {\n            // poll is only found at the transaction\n            // level, so we don't need to pass the link\n            case 'poll':\n                fns.poll = getPollFn(sdk, res, ref);\n                break;\n            default:\n                var fn = link2fn(sdk, res, obj, link, ref);\n                if (fn) {\n                    fns[linkName] = fn;\n                }\n        }\n    }\n    return fns;\n}\n// eslint-disable-next-line complexity\nfunction flattenEmbedded(sdk, res, obj, ref) {\n    obj = obj || res;\n    obj = clone(obj);\n    if (Array.isArray(obj)) {\n        var objArr = [];\n        for (var o = 0, ol = obj.length; o < ol; o++) {\n            objArr.push(flattenEmbedded(sdk, res, obj[o], ref));\n        }\n        return objArr;\n    }\n    var embedded = obj._embedded || {};\n    for (var key in embedded) {\n        if (!Object.prototype.hasOwnProperty.call(embedded, key)) {\n            continue;\n        }\n        // Flatten any nested _embedded objects\n        if (isObject(embedded[key]) || Array.isArray(embedded[key])) {\n            embedded[key] = flattenEmbedded(sdk, res, embedded[key], ref);\n        }\n    }\n    // Convert any links on the embedded object\n    var fns = links2fns(sdk, res, obj, ref);\n    Object.assign(embedded, fns);\n    obj = omit(obj, '_embedded', '_links');\n    Object.assign(obj, embedded);\n    return obj;\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\n/* eslint-disable complexity, max-statements */\nimport http from '../http';\nimport AuthSdkError from '../errors/AuthSdkError';\nimport { STATE_TOKEN_KEY_NAME } from '../constants';\nimport { addStateToken } from './util';\nimport { AuthTransaction } from './AuthTransaction';\nfunction transactionStatus(sdk, args) {\n    args = addStateToken(sdk, args);\n    return http.post(sdk, sdk.getIssuerOrigin() + '/api/v1/authn', args);\n}\nfunction resumeTransaction(sdk, args) {\n    if (!args || !args.stateToken) {\n        var stateToken = sdk.tx.exists._get(STATE_TOKEN_KEY_NAME);\n        if (stateToken) {\n            args = {\n                stateToken: stateToken\n            };\n        }\n        else {\n            return Promise.reject(new AuthSdkError('No transaction to resume'));\n        }\n    }\n    return sdk.tx.status(args)\n        .then(function (res) {\n        return new AuthTransaction(sdk, res);\n    });\n}\nfunction introspect(sdk, args) {\n    if (!args || !args.stateToken) {\n        var stateToken = sdk.tx.exists._get(STATE_TOKEN_KEY_NAME);\n        if (stateToken) {\n            args = {\n                stateToken: stateToken\n            };\n        }\n        else {\n            return Promise.reject(new AuthSdkError('No transaction to evaluate'));\n        }\n    }\n    return transactionStep(sdk, args)\n        .then(function (res) {\n        return new AuthTransaction(sdk, res);\n    });\n}\nfunction transactionStep(sdk, args) {\n    args = addStateToken(sdk, args);\n    // v1 pipeline introspect API\n    return http.post(sdk, sdk.getIssuerOrigin() + '/api/v1/authn/introspect', args);\n}\nfunction transactionExists(sdk) {\n    // We have a cookie state token\n    return !!sdk.tx.exists._get(STATE_TOKEN_KEY_NAME);\n}\nfunction postToTransaction(sdk, url, args, options) {\n    return http.post(sdk, url, args, options)\n        .then(function (res) {\n        return new AuthTransaction(sdk, res);\n    });\n}\nexport { transactionStatus, resumeTransaction, transactionExists, postToTransaction, introspect, };\n","export class TransactionState {\n}\n","/*!\n * Copyright (c) 2019-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\n/* global crypto */\n/* eslint-disable complexity, max-statements */\nimport { stringToBase64Url } from '../../util';\nimport { MIN_VERIFIER_LENGTH, MAX_VERIFIER_LENGTH, DEFAULT_CODE_CHALLENGE_METHOD } from '../../constants';\nfunction dec2hex(dec) {\n    return ('0' + dec.toString(16)).substr(-2);\n}\nfunction getRandomString(length) {\n    var a = new Uint8Array(Math.ceil(length / 2));\n    crypto.getRandomValues(a);\n    var str = Array.from(a, dec2hex).join('');\n    return str.slice(0, length);\n}\nfunction generateVerifier(prefix) {\n    var verifier = prefix || '';\n    if (verifier.length < MIN_VERIFIER_LENGTH) {\n        verifier = verifier + getRandomString(MIN_VERIFIER_LENGTH - verifier.length);\n    }\n    return encodeURIComponent(verifier).slice(0, MAX_VERIFIER_LENGTH);\n}\nfunction computeChallenge(str) {\n    var buffer = new TextEncoder().encode(str);\n    return crypto.subtle.digest('SHA-256', buffer).then(function (arrayBuffer) {\n        var hash = String.fromCharCode.apply(null, new Uint8Array(arrayBuffer));\n        var b64u = stringToBase64Url(hash); // url-safe base64 variant\n        return b64u;\n    });\n}\nexport default {\n    DEFAULT_CODE_CHALLENGE_METHOD,\n    generateVerifier,\n    computeChallenge\n};\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport AuthSdkError from './errors/AuthSdkError';\n// formerly known as \"storageBuilder\". Represents an object saved under a key/name.\nexport default class SavedObject {\n    constructor(storage, storageName) {\n        if (!storage) {\n            throw new AuthSdkError('\"storage\" is required');\n        }\n        if (typeof storageName !== 'string' || !storageName.length) {\n            throw new AuthSdkError('\"storageName\" is required');\n        }\n        this.storageName = storageName;\n        this.storageProvider = storage;\n    }\n    //\n    // SimpleStorage interface\n    //\n    getItem(key) {\n        return this.getStorage()[key];\n    }\n    setItem(key, value) {\n        return this.updateStorage(key, value);\n    }\n    removeItem(key) {\n        return this.clearStorage(key);\n    }\n    //\n    // StorageProvider interface\n    //\n    getStorage() {\n        var storageString = this.storageProvider.getItem(this.storageName);\n        storageString = storageString || '{}';\n        try {\n            return JSON.parse(storageString);\n        }\n        catch (e) {\n            throw new AuthSdkError('Unable to parse storage string: ' + this.storageName);\n        }\n    }\n    setStorage(obj) {\n        try {\n            var storageString = obj ? JSON.stringify(obj) : '{}';\n            this.storageProvider.setItem(this.storageName, storageString);\n        }\n        catch (e) {\n            throw new AuthSdkError('Unable to set storage: ' + this.storageName);\n        }\n    }\n    clearStorage(key) {\n        if (!key) {\n            // clear all\n            if (this.storageProvider.removeItem) {\n                this.storageProvider.removeItem(this.storageName);\n            }\n            else {\n                this.setStorage();\n            }\n            return;\n        }\n        var obj = this.getStorage();\n        delete obj[key];\n        this.setStorage(obj);\n    }\n    updateStorage(key, value) {\n        var obj = this.getStorage();\n        obj[key] = value;\n        this.setStorage(obj);\n    }\n}\n","import { PKCE_STORAGE_NAME, TOKEN_STORAGE_NAME, TRANSACTION_STORAGE_NAME, CACHE_STORAGE_NAME, REDIRECT_OAUTH_PARAMS_NAME } from './constants';\nimport SavedObject from './SavedObject';\nexport default class StorageManager {\n    constructor(storageManagerOptions, cookieOptions, storageUtil) {\n        this.storageManagerOptions = storageManagerOptions;\n        this.cookieOptions = cookieOptions;\n        this.storageUtil = storageUtil;\n    }\n    // combines defaults in order\n    getOptionsForSection(sectionName, overrideOptions) {\n        return Object.assign({}, this.storageManagerOptions[sectionName], overrideOptions);\n    }\n    // generic method to get any available storage provider\n    getStorage(options) {\n        options = Object.assign({}, this.cookieOptions, options); // set defaults\n        if (options.storageProvider) {\n            return options.storageProvider;\n        }\n        let { storageType, storageTypes } = options;\n        // Maintain compatibility. Automatically fallback. May change in next major version. OKTA-362589\n        if (storageType && storageTypes) {\n            const idx = storageTypes.indexOf(storageType);\n            if (idx >= 0) {\n                storageTypes = storageTypes.slice(idx);\n                storageType = null;\n            }\n        }\n        if (!storageType) {\n            storageType = this.storageUtil.findStorageType(storageTypes);\n        }\n        return this.storageUtil.getStorageByType(storageType, options);\n    }\n    // stateToken, interactionHandle\n    getTransactionStorage(options) {\n        options = this.getOptionsForSection('transaction', options);\n        const storage = this.getStorage(options);\n        const storageKey = options.storageKey || TRANSACTION_STORAGE_NAME;\n        return new SavedObject(storage, storageKey);\n    }\n    // access_token, id_token, refresh_token\n    getTokenStorage(options) {\n        options = this.getOptionsForSection('token', options);\n        const storage = this.getStorage(options);\n        const storageKey = options.storageKey || TOKEN_STORAGE_NAME;\n        return new SavedObject(storage, storageKey);\n    }\n    // caches well-known response, among others\n    getHttpCache(options) {\n        options = this.getOptionsForSection('cache', options);\n        const storage = this.getStorage(options);\n        const storageKey = options.storageKey || CACHE_STORAGE_NAME;\n        return new SavedObject(storage, storageKey);\n    }\n    // Will be removed in an upcoming major version. OKTA-362589\n    getLegacyPKCEStorage(options) {\n        options = this.getOptionsForSection('legacy-pkce', options);\n        const storage = this.getStorage(options);\n        const storageKey = options.storageKey || PKCE_STORAGE_NAME;\n        return new SavedObject(storage, storageKey);\n    }\n    getLegacyOAuthParamsStorage(options) {\n        options = this.getOptionsForSection('legacy-oauth-params', options);\n        const storage = this.getStorage(options);\n        const storageKey = options.storageKey || REDIRECT_OAUTH_PARAMS_NAME;\n        return new SavedObject(storage, storageKey);\n    }\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\nimport CustomError from './CustomError';\nexport default class OAuthError extends CustomError {\n    constructor(errorCode, summary) {\n        super(summary);\n        this.name = 'OAuthError';\n        this.errorCode = errorCode;\n        this.errorSummary = summary;\n    }\n}\n","function isObjectWithProperties(obj) {\n    if (!obj || typeof obj !== 'object' || Object.values(obj).length === 0) {\n        return false;\n    }\n    return true;\n}\nexport function isOAuthTransactionMeta(obj) {\n    if (!isObjectWithProperties(obj)) {\n        return false;\n    }\n    return !!obj.redirectUri || !!obj.responseType;\n}\nexport function isPKCETransactionMeta(obj) {\n    if (!isOAuthTransactionMeta(obj)) {\n        return false;\n    }\n    return !!obj.codeVerifier;\n}\nexport function isIdxTransactionMeta(obj) {\n    if (!isPKCETransactionMeta(obj)) {\n        return false;\n    }\n    return !!obj.interactionHandle;\n}\nexport function isCustomAuthTransactionMeta(obj) {\n    if (!isObjectWithProperties(obj)) {\n        return false;\n    }\n    const isAllStringValues = Object.values(obj).find((value) => (typeof value !== 'string')) === undefined;\n    return isAllStringValues;\n}\nexport function isTransactionMeta(obj) {\n    if (isOAuthTransactionMeta(obj) || isCustomAuthTransactionMeta(obj)) {\n        return true;\n    }\n    return false;\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\nexport function isToken(obj) {\n    if (obj &&\n        (obj.accessToken || obj.idToken || obj.refreshToken) &&\n        Array.isArray(obj.scopes)) {\n        return true;\n    }\n    return false;\n}\nexport function isAccessToken(obj) {\n    return obj && obj.accessToken;\n}\nexport function isIDToken(obj) {\n    return obj && obj.idToken;\n}\nexport function isRefreshToken(obj) {\n    return obj && obj.refreshToken;\n}\n","import { AuthSdkError } from './errors';\nimport { REDIRECT_NONCE_COOKIE_NAME, REDIRECT_OAUTH_PARAMS_NAME, REDIRECT_STATE_COOKIE_NAME } from './constants';\nimport { isTransactionMeta, isOAuthTransactionMeta } from './types';\nimport { warn } from './util';\nexport default class TransactionManager {\n    constructor(options) {\n        this.storageManager = options.storageManager;\n        this.legacyWidgetSupport = options.legacyWidgetSupport === false ? false : true;\n        this.saveNonceCookie = options.saveNonceCookie === false ? false : true;\n        this.saveStateCookie = options.saveStateCookie === false ? false : true;\n        this.saveParamsCookie = options.saveParamsCookie === false ? false : true;\n        this.options = options;\n    }\n    clear(options = {}) {\n        let storage = this.storageManager.getTransactionStorage();\n        storage.clearStorage();\n        if (!this.legacyWidgetSupport) {\n            return;\n        }\n        // This is for compatibility with older versions of the signin widget. OKTA-304806\n        if (options.oauth) {\n            this.clearLegacyOAuthParams();\n        }\n        if (options.pkce) {\n            this.clearLegacyPKCE();\n        }\n    }\n    // eslint-disable-next-line complexity\n    save(meta, options = {}) {\n        // There must be only one transaction executing at a time.\n        // Before saving, check to see if a transaction is already stored.\n        // An existing transaction indicates a concurrency/race/overlap condition\n        let storage = this.storageManager.getTransactionStorage();\n        const obj = storage.getStorage();\n        if (isTransactionMeta(obj)) {\n            // eslint-disable-next-line max-len\n            warn('a saved auth transaction exists in storage. This may indicate another auth flow is already in progress.');\n        }\n        storage.setStorage(meta);\n        if (!options.oauth) {\n            return;\n        }\n        if (this.saveNonceCookie || this.saveStateCookie || this.saveParamsCookie) {\n            const cookieStorage = this.storageManager.getStorage({ storageType: 'cookie' });\n            if (this.saveParamsCookie) {\n                const { responseType, state, nonce, scopes, clientId, urls, ignoreSignature } = meta;\n                const oauthParams = {\n                    responseType,\n                    state,\n                    nonce,\n                    scopes,\n                    clientId,\n                    urls,\n                    ignoreSignature\n                };\n                cookieStorage.setItem(REDIRECT_OAUTH_PARAMS_NAME, JSON.stringify(oauthParams), null);\n            }\n            if (this.saveNonceCookie && meta.nonce) {\n                // Set nonce cookie for servers to validate nonce in id_token\n                cookieStorage.setItem(REDIRECT_NONCE_COOKIE_NAME, meta.nonce, null);\n            }\n            if (this.saveStateCookie && meta.state) {\n                // Set state cookie for servers to validate state\n                cookieStorage.setItem(REDIRECT_STATE_COOKIE_NAME, meta.state, null);\n            }\n        }\n    }\n    exists(options = {}) {\n        try {\n            const meta = this.load(options);\n            return !!meta;\n        }\n        catch (_a) {\n            return false;\n        }\n    }\n    // load transaction meta from storage\n    load(options = {}) {\n        let storage = this.storageManager.getTransactionStorage();\n        let meta = storage.getStorage();\n        if (isTransactionMeta(meta)) {\n            // if we have meta in the new location, there is no need to go further\n            return meta;\n        }\n        if (!this.legacyWidgetSupport) {\n            return null;\n        }\n        // This is for compatibility with older versions of the signin widget. OKTA-304806\n        if (options.oauth) {\n            try {\n                const oauthParams = this.loadLegacyOAuthParams();\n                Object.assign(meta, oauthParams);\n            }\n            finally {\n                this.clearLegacyOAuthParams();\n            }\n        }\n        if (options.pkce) {\n            try {\n                const pkceMeta = this.loadLegacyPKCE();\n                Object.assign(meta, pkceMeta);\n            }\n            finally {\n                this.clearLegacyPKCE();\n            }\n        }\n        if (isTransactionMeta(meta)) {\n            return meta;\n        }\n        return null;\n    }\n    // This is for compatibility with older versions of the signin widget. OKTA-304806\n    clearLegacyPKCE() {\n        // clear storages\n        let storage;\n        if (this.storageManager.storageUtil.testStorageType('localStorage')) {\n            storage = this.storageManager.getLegacyPKCEStorage({ storageType: 'localStorage' });\n            storage.clearStorage();\n        }\n        if (this.storageManager.storageUtil.testStorageType('sessionStorage')) {\n            storage = this.storageManager.getLegacyPKCEStorage({ storageType: 'sessionStorage' });\n            storage.clearStorage();\n        }\n    }\n    loadLegacyPKCE() {\n        let storage;\n        let obj;\n        // Try reading from localStorage first.\n        if (this.storageManager.storageUtil.testStorageType('localStorage')) {\n            storage = this.storageManager.getLegacyPKCEStorage({ storageType: 'localStorage' });\n            obj = storage.getStorage();\n            if (obj && obj.codeVerifier) {\n                return obj;\n            }\n        }\n        // If meta is not valid, read from sessionStorage. This is expected for more recent versions of the widget.\n        if (this.storageManager.storageUtil.testStorageType('sessionStorage')) {\n            storage = this.storageManager.getLegacyPKCEStorage({ storageType: 'sessionStorage' });\n            obj = storage.getStorage();\n            if (obj && obj.codeVerifier) {\n                return obj;\n            }\n        }\n        // If meta is not valid, throw an exception to avoid misleading server-side error\n        // The most likely cause of this error is trying to handle a callback twice\n        // eslint-disable-next-line max-len\n        throw new AuthSdkError('Could not load PKCE codeVerifier from storage. This may indicate the auth flow has already completed or multiple auth flows are executing concurrently.', null);\n    }\n    clearLegacyOAuthParams() {\n        // clear storages\n        let storage;\n        if (this.storageManager.storageUtil.testStorageType('sessionStorage')) {\n            storage = this.storageManager.getLegacyOAuthParamsStorage({ storageType: 'sessionStorage' });\n            storage.clearStorage();\n        }\n        if (this.storageManager.storageUtil.testStorageType('cookie')) {\n            storage = this.storageManager.getLegacyOAuthParamsStorage({ storageType: 'cookie' });\n            storage.clearStorage();\n        }\n    }\n    loadLegacyOAuthParams() {\n        let storage;\n        let oauthParams;\n        // load first from session storage\n        if (this.storageManager.storageUtil.testStorageType('sessionStorage')) {\n            storage = this.storageManager.getLegacyOAuthParamsStorage({ storageType: 'sessionStorage' });\n            oauthParams = storage.getStorage();\n        }\n        if (isOAuthTransactionMeta(oauthParams)) {\n            return oauthParams;\n        }\n        // try to load from cookie\n        if (this.storageManager.storageUtil.testStorageType('cookie')) {\n            storage = this.storageManager.getLegacyOAuthParamsStorage({ storageType: 'cookie' });\n            oauthParams = storage.getStorage();\n        }\n        if (isOAuthTransactionMeta(oauthParams)) {\n            return oauthParams;\n        }\n        throw new AuthSdkError('Unable to retrieve OAuth redirect params from storage');\n        // Something is there but we don't recognize it\n        // throw new AuthSdkError('Unable to parse the ' + REDIRECT_OAUTH_PARAMS_NAME + ' value from storage');\n    }\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\nimport { assertValidConfig } from './builderUtil';\nimport { removeTrailingSlash } from './util';\nimport { transactionStatus, resumeTransaction, transactionExists, introspect, postToTransaction } from './tx';\nimport PKCE from './oidc/util/pkce';\nimport StorageManager from './StorageManager';\nimport TransactionManager from './TransactionManager';\nexport default class OktaAuthBase {\n    constructor(args) {\n        assertValidConfig(args);\n        this.options = {\n            // OIDC configuration\n            issuer: removeTrailingSlash(args.issuer),\n            tokenUrl: removeTrailingSlash(args.tokenUrl),\n            authorizeUrl: removeTrailingSlash(args.authorizeUrl),\n            userinfoUrl: removeTrailingSlash(args.userinfoUrl),\n            revokeUrl: removeTrailingSlash(args.revokeUrl),\n            logoutUrl: removeTrailingSlash(args.logoutUrl),\n            clientId: args.clientId,\n            redirectUri: args.redirectUri,\n            state: args.state,\n            scopes: args.scopes,\n            postLogoutRedirectUri: args.postLogoutRedirectUri,\n            responseMode: args.responseMode,\n            responseType: args.responseType,\n            pkce: args.pkce,\n            // Internal options\n            httpRequestClient: args.httpRequestClient,\n            transformErrorXHR: args.transformErrorXHR,\n            transformAuthState: args.transformAuthState,\n            restoreOriginalUri: args.restoreOriginalUri,\n            storageUtil: args.storageUtil,\n            headers: args.headers,\n            devMode: args.devMode || false,\n            storageManager: Object.assign({\n                token: {},\n                transaction: {}\n            }, args.storageManager),\n            cookies: args.cookies,\n            // Give the developer the ability to disable token signature validation.\n            ignoreSignature: !!args.ignoreSignature\n        };\n        const { storageManager, cookies, storageUtil } = this.options;\n        this.storageManager = new StorageManager(storageManager, cookies, storageUtil);\n        this.transactionManager = new TransactionManager(Object.assign({\n            storageManager: this.storageManager\n        }, args.transactionManager));\n        this.tx = {\n            status: transactionStatus.bind(null, this),\n            resume: resumeTransaction.bind(null, this),\n            exists: Object.assign(transactionExists.bind(null, this), {\n                _get: (name) => {\n                    const storage = storageUtil.storage;\n                    return storage.get(name);\n                }\n            }),\n            introspect: introspect.bind(null, this)\n        };\n        this.pkce = {\n            DEFAULT_CODE_CHALLENGE_METHOD: PKCE.DEFAULT_CODE_CHALLENGE_METHOD,\n            generateVerifier: PKCE.generateVerifier,\n            computeChallenge: PKCE.computeChallenge\n        };\n    }\n    // { username, password, (relayState), (context) }\n    signIn(opts) {\n        return postToTransaction(this, '/api/v1/authn', opts);\n    }\n    getIssuerOrigin() {\n        // Infer the URL from the issuer URL, omitting the /oauth2/{authServerId}\n        return this.options.issuer.split('/oauth2/')[0];\n    }\n    // { username, (relayState) }\n    forgotPassword(opts) {\n        return postToTransaction(this, '/api/v1/authn/recovery/password', opts);\n    }\n    // { username, (relayState) }\n    unlockAccount(opts) {\n        return postToTransaction(this, '/api/v1/authn/recovery/unlock', opts);\n    }\n    // { recoveryToken }\n    verifyRecoveryToken(opts) {\n        return postToTransaction(this, '/api/v1/authn/recovery/token', opts);\n    }\n}\n","/*!\n * Copyright (c) 2018-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\nimport AuthSdkError from './errors/AuthSdkError';\n// TODO: use @okta/configuration-validation (move module to this monorepo?)\n// eslint-disable-next-line complexity\nfunction assertValidConfig(args) {\n    args = args || {};\n    var issuer = args.issuer;\n    if (!issuer) {\n        throw new AuthSdkError('No issuer passed to constructor. ' +\n            'Required usage: new OktaAuth({issuer: \"https://{yourOktaDomain}.com/oauth2/{authServerId}\"})');\n    }\n    var isUrlRegex = new RegExp('^http?s?://.+');\n    if (!isUrlRegex.test(args.issuer)) {\n        throw new AuthSdkError('Issuer must be a valid URL. ' +\n            'Required usage: new OktaAuth({issuer: \"https://{yourOktaDomain}.com/oauth2/{authServerId}\"})');\n    }\n    if (issuer.indexOf('-admin.') !== -1) {\n        throw new AuthSdkError('Issuer URL passed to constructor contains \"-admin\" in subdomain. ' +\n            'Required usage: new OktaAuth({issuer: \"https://{yourOktaDomain}.com})');\n    }\n    var userAgent = args.userAgent;\n    var userAgentTemplateWithNoPlaceholder = userAgent && userAgent.template && userAgent.template.indexOf('$OKTA_AUTH_JS') === -1;\n    if (userAgentTemplateWithNoPlaceholder) {\n        throw new AuthSdkError('UserAgentTemplate must include \"$OKTA_AUTH_JS\" placeholder. ' +\n            'Required usage: new OktaAuth({userAgentTemplate: \"xxx $OKTA_AUTH_JS xxx\"})');\n    }\n}\nfunction getUserAgent(args, sdkValue) {\n    var userAgent = args.userAgent || {};\n    if (userAgent.value) {\n        return userAgent.value;\n    }\n    if (userAgent.template) {\n        return userAgent.template.replace('$OKTA_AUTH_JS', sdkValue);\n    }\n    return sdkValue;\n}\nexport { assertValidConfig, getUserAgent };\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\nconst isWindowsPhone = /windows phone|iemobile|wpdesktop/i;\nexport function getUserAgent() {\n    return navigator.userAgent;\n}\nexport function isFingerprintSupported() {\n    const agent = getUserAgent();\n    return agent && !isWindowsPhone.test(agent);\n}\nexport function isPopupPostMessageSupported() {\n    var isIE8or9 = document.documentMode && document.documentMode < 10;\n    if (window.postMessage && !isIE8or9) {\n        return true;\n    }\n    return false;\n}\nexport function isTokenVerifySupported() {\n    return typeof crypto !== 'undefined' && crypto.subtle && typeof Uint8Array !== 'undefined';\n}\nexport function hasTextEncoder() {\n    return typeof TextEncoder !== 'undefined';\n}\nexport function isPKCESupported() {\n    return isTokenVerifySupported() && hasTextEncoder();\n}\nexport function isHTTPS() {\n    return window.location.protocol === 'https:';\n}\nexport function isLocalhost() {\n    return window.location.hostname === 'localhost';\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport AuthSdkError from '../errors/AuthSdkError';\nimport { warn } from '../util';\nconst Cookies = require('js-cookie');\n// Building this as an object allows us to mock the functions in our tests\nvar storageUtil = {\n    // These are shimmed in `OktaAuthBase.ts`\n    getHttpCache() {\n        return null;\n    },\n    getPKCEStorage() {\n        return null;\n    },\n    // IE11 bug that Microsoft doesn't plan to fix\n    // https://connect.microsoft.com/IE/Feedback/Details/1496040\n    browserHasLocalStorage: function () {\n        try {\n            var storage = storageUtil.getLocalStorage();\n            return storageUtil.testStorage(storage);\n        }\n        catch (e) {\n            return false;\n        }\n    },\n    browserHasSessionStorage: function () {\n        try {\n            var storage = storageUtil.getSessionStorage();\n            return storageUtil.testStorage(storage);\n        }\n        catch (e) {\n            return false;\n        }\n    },\n    testStorageType: function (storageType) {\n        var supported = false;\n        switch (storageType) {\n            case 'sessionStorage':\n                supported = storageUtil.browserHasSessionStorage();\n                break;\n            case 'localStorage':\n                supported = storageUtil.browserHasLocalStorage();\n                break;\n            case 'cookie':\n            case 'memory':\n                supported = true;\n                break;\n            default:\n                supported = false;\n                break;\n        }\n        return supported;\n    },\n    getStorageByType: function (storageType, options) {\n        let storageProvider = null;\n        switch (storageType) {\n            case 'sessionStorage':\n                storageProvider = storageUtil.getSessionStorage();\n                break;\n            case 'localStorage':\n                storageProvider = storageUtil.getLocalStorage();\n                break;\n            case 'cookie':\n                storageProvider = storageUtil.getCookieStorage(options);\n                break;\n            case 'memory':\n                storageProvider = storageUtil.getInMemoryStorage();\n                break;\n            default:\n                throw new AuthSdkError(`Unrecognized storage option: ${storageType}`);\n                break;\n        }\n        return storageProvider;\n    },\n    findStorageType: function (types) {\n        let curType;\n        let nextType;\n        types = types.slice(); // copy array\n        curType = types.shift();\n        nextType = types.length ? types[0] : null;\n        if (!nextType) {\n            return curType;\n        }\n        if (storageUtil.testStorageType(curType)) {\n            return curType;\n        }\n        // preferred type was unsupported.\n        warn(`This browser doesn't support ${curType}. Switching to ${nextType}.`);\n        // fallback to the next type. this is a recursive call\n        return storageUtil.findStorageType(types);\n    },\n    getLocalStorage: function () {\n        return localStorage;\n    },\n    getSessionStorage: function () {\n        return sessionStorage;\n    },\n    // Provides webStorage-like interface for cookies\n    getCookieStorage: function (options) {\n        const secure = options.secure;\n        const sameSite = options.sameSite;\n        if (typeof secure === 'undefined' || typeof sameSite === 'undefined') {\n            throw new AuthSdkError('getCookieStorage: \"secure\" and \"sameSite\" options must be provided');\n        }\n        const storage = {\n            getItem: storageUtil.storage.get,\n            setItem: function (key, value, expiresAt) {\n                // By defauilt, cookie shouldn't expire\n                expiresAt = typeof expiresAt === 'undefined' ? '2200-01-01T00:00:00.000Z' : expiresAt;\n                storageUtil.storage.set(key, value, expiresAt, {\n                    secure: secure,\n                    sameSite: sameSite\n                });\n            },\n            removeItem: function (key) {\n                storageUtil.storage.delete(key);\n            }\n        };\n        if (!options.useMultipleCookies) {\n            return storage;\n        }\n        // options.useMultipleCookies - because cookies have size limits.\n        // Can only be used when storing an object value. Object properties will be saved to separate cookies.\n        //  Each property of the object must also be an object.\n        return {\n            getItem: function (key) {\n                var data = storage.getItem(); // read all cookies\n                var value = {};\n                Object.keys(data).forEach(k => {\n                    if (k.indexOf(key) === 0) { // filter out unrelated cookies\n                        value[k.replace(`${key}_`, '')] = JSON.parse(data[k]); // populate with cookie dataa\n                    }\n                });\n                return JSON.stringify(value);\n            },\n            setItem: function (key, value) {\n                var existingValues = JSON.parse(this.getItem(key));\n                value = JSON.parse(value);\n                // Set key-value pairs from input to cookies\n                Object.keys(value).forEach(k => {\n                    var storageKey = key + '_' + k;\n                    var valueToStore = JSON.stringify(value[k]);\n                    storage.setItem(storageKey, valueToStore);\n                    delete existingValues[k];\n                });\n                // Delete unmatched keys from existing cookies\n                Object.keys(existingValues).forEach(k => {\n                    storage.removeItem(key + '_' + k);\n                });\n            },\n            removeItem: function (key) {\n                var existingValues = JSON.parse(this.getItem(key));\n                Object.keys(existingValues).forEach(k => {\n                    storage.removeItem(key + '_' + k);\n                });\n            }\n        };\n    },\n    // Provides an in-memory solution\n    getInMemoryStorage: function () {\n        var store = {};\n        return {\n            getItem: function (key) {\n                return store[key];\n            },\n            setItem: function (key, value) {\n                store[key] = value;\n            }\n        };\n    },\n    testStorage: function (storage) {\n        var key = 'okta-test-storage';\n        try {\n            storage.setItem(key, key);\n            storage.removeItem(key);\n            return true;\n        }\n        catch (e) {\n            return false;\n        }\n    },\n    storage: {\n        set: function (name, value, expiresAt, options) {\n            const secure = options.secure;\n            const sameSite = options.sameSite;\n            if (typeof secure === 'undefined' || typeof sameSite === 'undefined') {\n                throw new AuthSdkError('storage.set: \"secure\" and \"sameSite\" options must be provided');\n            }\n            var cookieOptions = {\n                path: options.path || '/',\n                secure,\n                sameSite\n            };\n            // eslint-disable-next-line no-extra-boolean-cast\n            if (!!(Date.parse(expiresAt))) {\n                // Expires value can be converted to a Date object.\n                //\n                // If the 'expiresAt' value is not provided, or the value cannot be\n                // parsed as a Date object, the cookie will set as a session cookie.\n                cookieOptions.expires = new Date(expiresAt);\n            }\n            Cookies.set(name, value, cookieOptions);\n            return storageUtil.storage.get(name);\n        },\n        get: function (name) {\n            return Cookies.get(name);\n        },\n        delete: function (name) {\n            return Cookies.remove(name, { path: '/' });\n        }\n    }\n};\nexport default storageUtil;\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\n/* global window */\nimport { omit, getLink, toQueryString } from './util';\nimport http from './http';\nfunction sessionExists(sdk) {\n    return sdk.session.get()\n        .then(function (res) {\n        if (res.status === 'ACTIVE') {\n            return true;\n        }\n        return false;\n    })\n        .catch(function () {\n        return false;\n    });\n}\nfunction getSession(sdk) {\n    return http.get(sdk, '/api/v1/sessions/me')\n        .then(function (session) {\n        var res = omit(session, '_links');\n        res.refresh = function () {\n            return http.post(sdk, getLink(session, 'refresh').href);\n        };\n        res.user = function () {\n            return http.get(sdk, getLink(session, 'user').href);\n        };\n        return res;\n    })\n        .catch(function () {\n        // Return INACTIVE status on failure\n        return { status: 'INACTIVE' };\n    });\n}\nfunction closeSession(sdk) {\n    return http.httpRequest(sdk, {\n        url: sdk.getIssuerOrigin() + '/api/v1/sessions/me',\n        method: 'DELETE'\n    });\n}\nfunction refreshSession(sdk) {\n    return http.post(sdk, '/api/v1/sessions/me/lifecycle/refresh');\n}\nfunction setCookieAndRedirect(sdk, sessionToken, redirectUrl) {\n    redirectUrl = redirectUrl || window.location.href;\n    window.location.assign(sdk.getIssuerOrigin() + '/login/sessionCookieRedirect' +\n        toQueryString({\n            checkAccountSetupComplete: true,\n            token: sessionToken,\n            redirectUrl: redirectUrl\n        }));\n}\nexport { sessionExists, getSession, closeSession, refreshSession, setCookieAndRedirect };\n","import { isString, removeNils, toQueryString } from '../../util';\nimport { AuthSdkError } from '../../errors';\nexport function convertTokenParamsToOAuthParams(tokenParams) {\n    // Quick validation\n    if (!tokenParams.clientId) {\n        throw new AuthSdkError('A clientId must be specified in the OktaAuth constructor to get a token');\n    }\n    if (isString(tokenParams.responseType) && tokenParams.responseType.indexOf(' ') !== -1) {\n        throw new AuthSdkError('Multiple OAuth responseTypes must be defined as an array');\n    }\n    // Convert our params to their actual OAuth equivalents\n    var oauthParams = {\n        'client_id': tokenParams.clientId,\n        'code_challenge': tokenParams.codeChallenge,\n        'code_challenge_method': tokenParams.codeChallengeMethod,\n        'display': tokenParams.display,\n        'idp': tokenParams.idp,\n        'idp_scope': tokenParams.idpScope,\n        'login_hint': tokenParams.loginHint,\n        'max_age': tokenParams.maxAge,\n        'nonce': tokenParams.nonce,\n        'prompt': tokenParams.prompt,\n        'redirect_uri': tokenParams.redirectUri,\n        'response_mode': tokenParams.responseMode,\n        'response_type': tokenParams.responseType,\n        'sessionToken': tokenParams.sessionToken,\n        'state': tokenParams.state,\n    };\n    oauthParams = removeNils(oauthParams);\n    ['idp_scope', 'response_type'].forEach(function (mayBeArray) {\n        if (Array.isArray(oauthParams[mayBeArray])) {\n            oauthParams[mayBeArray] = oauthParams[mayBeArray].join(' ');\n        }\n    });\n    if (tokenParams.responseType.indexOf('id_token') !== -1 &&\n        tokenParams.scopes.indexOf('openid') === -1) {\n        throw new AuthSdkError('openid scope must be specified in the scopes argument when requesting an id_token');\n    }\n    else {\n        oauthParams.scope = tokenParams.scopes.join(' ');\n    }\n    return oauthParams;\n}\nexport function buildAuthorizeParams(tokenParams) {\n    var oauthQueryParams = convertTokenParamsToOAuthParams(tokenParams);\n    return toQueryString(oauthQueryParams);\n}\n","import { AuthSdkError } from '../../errors';\nimport { removeNils, toQueryString } from '../../util';\nimport http from '../../http';\nfunction validateOptions(options) {\n    // Quick validation\n    if (!options.clientId) {\n        throw new AuthSdkError('A clientId must be specified in the OktaAuth constructor to get a token');\n    }\n    if (!options.redirectUri) {\n        throw new AuthSdkError('The redirectUri passed to /authorize must also be passed to /token');\n    }\n    if (!options.authorizationCode && !options.interactionCode) {\n        throw new AuthSdkError('An authorization code (returned from /authorize) must be passed to /token');\n    }\n    if (!options.codeVerifier) {\n        throw new AuthSdkError('The \"codeVerifier\" (generated and saved by your app) must be passed to /token');\n    }\n}\nfunction getPostData(options) {\n    // Convert Token params to OAuth params, sent to the /token endpoint\n    var params = removeNils({\n        'client_id': options.clientId,\n        'redirect_uri': options.redirectUri,\n        'grant_type': options.interactionCode ? 'interaction_code' : 'authorization_code',\n        'code_verifier': options.codeVerifier\n    });\n    if (options.interactionCode) {\n        params['interaction_code'] = options.interactionCode;\n    }\n    else if (options.authorizationCode) {\n        params.code = options.authorizationCode;\n    }\n    // Encode as URL string\n    return toQueryString(params).slice(1);\n}\n// exchange authorization code for an access token\nexport function postToTokenEndpoint(sdk, options, urls) {\n    validateOptions(options);\n    var data = getPostData(options);\n    return http.httpRequest(sdk, {\n        url: urls.tokenUrl,\n        method: 'POST',\n        args: data,\n        withCredentials: false,\n        headers: {\n            'Content-Type': 'application/x-www-form-urlencoded'\n        }\n    });\n}\nexport function postRefreshToken(sdk, options, refreshToken) {\n    return http.httpRequest(sdk, {\n        url: refreshToken.tokenUrl,\n        method: 'POST',\n        withCredentials: false,\n        headers: {\n            'Content-Type': 'application/x-www-form-urlencoded',\n        },\n        args: Object.entries({\n            client_id: options.clientId,\n            grant_type: 'refresh_token',\n            scope: refreshToken.scopes.join(' '),\n            refresh_token: refreshToken.refreshToken, // eslint-disable-line camelcase\n        }).map(function ([name, value]) {\n            return name + '=' + encodeURIComponent(value);\n        }).join('&'),\n    });\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport http from '../../http';\nimport { find } from '../../util';\nimport AuthSdkError from '../../errors/AuthSdkError';\nexport function getWellKnown(sdk, issuer) {\n    var authServerUri = (issuer || sdk.options.issuer);\n    return http.get(sdk, authServerUri + '/.well-known/openid-configuration', {\n        cacheResponse: true\n    });\n}\nexport function getKey(sdk, issuer, kid) {\n    var httpCache = sdk.storageManager.getHttpCache(sdk.options.cookies);\n    return getWellKnown(sdk, issuer)\n        .then(function (wellKnown) {\n        var jwksUri = wellKnown['jwks_uri'];\n        // Check our kid against the cached version (if it exists and isn't expired)\n        var cacheContents = httpCache.getStorage();\n        var cachedResponse = cacheContents[jwksUri];\n        if (cachedResponse && Date.now() / 1000 < cachedResponse.expiresAt) {\n            var cachedKey = find(cachedResponse.response.keys, {\n                kid: kid\n            });\n            if (cachedKey) {\n                return cachedKey;\n            }\n        }\n        // Remove cache for the key\n        httpCache.clearStorage(jwksUri);\n        // Pull the latest keys if the key wasn't in the cache\n        return http.get(sdk, jwksUri, {\n            cacheResponse: true\n        })\n            .then(function (res) {\n            var key = find(res.keys, {\n                kid: kid\n            });\n            if (key) {\n                return key;\n            }\n            throw new AuthSdkError('The key id, ' + kid + ', was not found in the server\\'s keys');\n        });\n    });\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\n/* global window, document */\n/* eslint-disable complexity, max-statements */\nimport { AuthSdkError } from '../../errors';\nimport { isIE11OrLess } from '../../util';\nexport function addListener(eventTarget, name, fn) {\n    if (eventTarget.addEventListener) {\n        eventTarget.addEventListener(name, fn);\n    }\n    else {\n        eventTarget.attachEvent('on' + name, fn);\n    }\n}\nexport function removeListener(eventTarget, name, fn) {\n    if (eventTarget.removeEventListener) {\n        eventTarget.removeEventListener(name, fn);\n    }\n    else {\n        eventTarget.detachEvent('on' + name, fn);\n    }\n}\nexport function loadFrame(src) {\n    var iframe = document.createElement('iframe');\n    iframe.style.display = 'none';\n    iframe.src = src;\n    return document.body.appendChild(iframe);\n}\nexport function loadPopup(src, options) {\n    var title = options.popupTitle || 'External Identity Provider User Authentication';\n    var appearance = 'toolbar=no, scrollbars=yes, resizable=yes, ' +\n        'top=100, left=500, width=600, height=600';\n    if (isIE11OrLess()) {\n        // IE<=11 doesn't fully support postMessage at time of writting.\n        // the following simple solution happened to solve the issue\n        // without adding another proxy layer which makes flow more complecated.\n        var winEl = window.open('/', title, appearance);\n        winEl.location.href = src;\n        return winEl;\n    }\n    else {\n        return window.open(src, title, appearance);\n    }\n}\nexport function addPostMessageListener(sdk, timeout, state) {\n    var responseHandler;\n    var timeoutId;\n    var msgReceivedOrTimeout = new Promise(function (resolve, reject) {\n        responseHandler = function responseHandler(e) {\n            if (!e.data || e.data.state !== state) {\n                // A message not meant for us\n                return;\n            }\n            // Configuration mismatch between saved token and current app instance\n            // This may happen if apps with different issuers are running on the same host url\n            // If they share the same storage key, they may read and write tokens in the same location.\n            // Common when developing against http://localhost\n            if (e.origin !== sdk.getIssuerOrigin()) {\n                return reject(new AuthSdkError('The request does not match client configuration'));\n            }\n            resolve(e.data);\n        };\n        addListener(window, 'message', responseHandler);\n        timeoutId = setTimeout(function () {\n            reject(new AuthSdkError('OAuth flow timed out'));\n        }, timeout || 120000);\n    });\n    return msgReceivedOrTimeout\n        .finally(function () {\n        clearTimeout(timeoutId);\n        removeListener(window, 'message', responseHandler);\n    });\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\n/* eslint-disable complexity, max-statements */\nimport { genRandomString, removeTrailingSlash } from '../../util';\nimport AuthSdkError from '../../errors/AuthSdkError';\nexport function generateState() {\n    return genRandomString(64);\n}\nexport function generateNonce() {\n    return genRandomString(64);\n}\nexport function getOAuthUrls(sdk, options) {\n    if (arguments.length > 2) {\n        throw new AuthSdkError('As of version 3.0, \"getOAuthUrls\" takes only a single set of options');\n    }\n    options = options || {};\n    // Get user-supplied arguments\n    var authorizeUrl = removeTrailingSlash(options.authorizeUrl) || sdk.options.authorizeUrl;\n    var issuer = removeTrailingSlash(options.issuer) || sdk.options.issuer;\n    var userinfoUrl = removeTrailingSlash(options.userinfoUrl) || sdk.options.userinfoUrl;\n    var tokenUrl = removeTrailingSlash(options.tokenUrl) || sdk.options.tokenUrl;\n    var logoutUrl = removeTrailingSlash(options.logoutUrl) || sdk.options.logoutUrl;\n    var revokeUrl = removeTrailingSlash(options.revokeUrl) || sdk.options.revokeUrl;\n    var baseUrl = issuer.indexOf('/oauth2') > 0 ? issuer : issuer + '/oauth2';\n    authorizeUrl = authorizeUrl || baseUrl + '/v1/authorize';\n    userinfoUrl = userinfoUrl || baseUrl + '/v1/userinfo';\n    tokenUrl = tokenUrl || baseUrl + '/v1/token';\n    revokeUrl = revokeUrl || baseUrl + '/v1/revoke';\n    logoutUrl = logoutUrl || baseUrl + '/v1/logout';\n    return {\n        issuer: issuer,\n        authorizeUrl: authorizeUrl,\n        userinfoUrl: userinfoUrl,\n        tokenUrl: tokenUrl,\n        revokeUrl: revokeUrl,\n        logoutUrl: logoutUrl\n    };\n}\n","/* global window */\n/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport { generateNonce, generateState } from './oauth';\nexport function getDefaultTokenParams(sdk) {\n    const { pkce, clientId, redirectUri, responseType, responseMode, scopes, state, ignoreSignature } = sdk.options;\n    return {\n        pkce,\n        clientId,\n        redirectUri: redirectUri || window.location.href,\n        responseType: responseType || ['token', 'id_token'],\n        responseMode,\n        state: state || generateState(),\n        nonce: generateNonce(),\n        scopes: scopes || ['openid', 'email'],\n        ignoreSignature\n    };\n}\n","export function isInteractionRequiredError(error) {\n    if (error.name !== 'OAuthError') {\n        return false;\n    }\n    const oauthError = error;\n    return (oauthError.errorCode === 'interaction_required');\n}\nexport function isAuthorizationCodeError(sdk, error) {\n    if (error.name !== 'AuthApiError') {\n        return false;\n    }\n    const authApiError = error;\n    // xhr property doesn't seem to match XMLHttpRequest type\n    const errorResponse = authApiError.xhr;\n    const responseJSON = errorResponse === null || errorResponse === void 0 ? void 0 : errorResponse.responseJSON;\n    return sdk.options.pkce && ((responseJSON === null || responseJSON === void 0 ? void 0 : responseJSON.error) === 'invalid_grant');\n}\n","export function hasTokensInHash(hash) {\n    return /((id|access)_token=)/i.test(hash);\n}\n// authorization_code\nexport function hasAuthorizationCode(hashOrSearch) {\n    return /(code=)/i.test(hashOrSearch);\n}\n// interaction_code\nexport function hasInteractionCode(hashOrSearch) {\n    return /(interaction_code=)/i.test(hashOrSearch);\n}\nexport function hasErrorInUrl(hashOrSearch) {\n    return /(error=)/i.test(hashOrSearch) || /(error_description)/i.test(hashOrSearch);\n}\nexport function isRedirectUri(uri, sdk) {\n    var authParams = sdk.options;\n    return uri && uri.indexOf(authParams.redirectUri) === 0;\n}\nexport function isCodeFlow(options) {\n    return options.pkce || options.responseType === 'code' || options.responseMode === 'query';\n}\nexport function getHashOrSearch(options) {\n    var codeFlow = isCodeFlow(options);\n    var useQuery = codeFlow && options.responseMode !== 'fragment';\n    return useQuery ? window.location.search : window.location.hash;\n}\n/**\n * Check if tokens or a code have been passed back into the url, which happens in\n * the OIDC (including social auth IDP) redirect flow.\n */\nexport function isLoginRedirect(sdk) {\n    // First check, is this a redirect URI?\n    if (!isRedirectUri(window.location.href, sdk)) {\n        return false;\n    }\n    // The location contains either a code, token, or an error + error_description\n    var codeFlow = isCodeFlow(sdk.options);\n    var hashOrSearch = getHashOrSearch(sdk.options);\n    if (hasErrorInUrl(hashOrSearch)) {\n        return true;\n    }\n    if (codeFlow) {\n        var hasCode = hasAuthorizationCode(hashOrSearch) || hasInteractionCode(hashOrSearch);\n        return hasCode;\n    }\n    // implicit flow, will always be hash fragment\n    return hasTokensInHash(window.location.hash);\n}\n/**\n * Check if error=interaction_required has been passed back in the url, which happens in\n * the social auth IDP redirect flow.\n */\nexport function isInteractionRequired(sdk) {\n    // First check, is this a redirect URI?\n    if (!isLoginRedirect(sdk)) {\n        return false;\n    }\n    var hashOrSearch = getHashOrSearch(sdk.options);\n    return /(error=interaction_required)/i.test(hashOrSearch);\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport { getWellKnown } from '../endpoints/well-known';\nimport { AuthSdkError } from '../../errors';\nimport { clone } from '../../util';\nimport { getDefaultTokenParams } from './defaultTokenParams';\nimport { DEFAULT_CODE_CHALLENGE_METHOD } from '../../constants';\nimport pkce from './pkce';\n// Prepares params for a call to /authorize or /token\nexport function prepareTokenParams(sdk, tokenParams) {\n    // build params using defaults + options\n    const defaults = getDefaultTokenParams(sdk);\n    tokenParams = Object.assign({}, defaults, clone(tokenParams));\n    if (tokenParams.pkce === false) {\n        // Implicit flow or authorization_code without PKCE\n        return Promise.resolve(tokenParams);\n    }\n    // PKCE flow\n    if (!sdk.features.isPKCESupported()) {\n        var errorMessage = 'PKCE requires a modern browser with encryption support running in a secure context.';\n        if (!sdk.features.isHTTPS()) {\n            // eslint-disable-next-line max-len\n            errorMessage += '\\nThe current page is not being served with HTTPS protocol. PKCE requires secure HTTPS protocol.';\n        }\n        if (!sdk.features.hasTextEncoder()) {\n            // eslint-disable-next-line max-len\n            errorMessage += '\\n\"TextEncoder\" is not defined. To use PKCE, you may need to include a polyfill/shim for this browser.';\n        }\n        return Promise.reject(new AuthSdkError(errorMessage));\n    }\n    // set default code challenge method, if none provided\n    if (!tokenParams.codeChallengeMethod) {\n        tokenParams.codeChallengeMethod = DEFAULT_CODE_CHALLENGE_METHOD;\n    }\n    // responseType is forced\n    tokenParams.responseType = 'code';\n    return getWellKnown(sdk, null)\n        .then(function (res) {\n        var methods = res['code_challenge_methods_supported'] || [];\n        if (methods.indexOf(tokenParams.codeChallengeMethod) === -1) {\n            throw new AuthSdkError('Invalid code_challenge_method');\n        }\n    })\n        .then(function () {\n        if (!tokenParams.codeVerifier) {\n            tokenParams.codeVerifier = pkce.generateVerifier();\n        }\n        return pkce.computeChallenge(tokenParams.codeVerifier);\n    })\n        .then(function (codeChallenge) {\n        // Clone/copy the params. Set codeChallenge\n        var clonedParams = clone(tokenParams) || {};\n        Object.assign(clonedParams, tokenParams, {\n            codeChallenge: codeChallenge,\n        });\n        return clonedParams;\n    });\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\n/* eslint-disable complexity, max-statements */\nexport function urlParamsToObject(hashOrSearch) {\n    // Predefine regexs for parsing hash\n    var plus2space = /\\+/g;\n    var paramSplit = /([^&=]+)=?([^&]*)/g;\n    var fragment = hashOrSearch;\n    // Some hash based routers will automatically add a / character after the hash\n    if (fragment.charAt(0) === '#' && fragment.charAt(1) === '/') {\n        fragment = fragment.substring(2);\n    }\n    // Remove the leading # or ?\n    if (fragment.charAt(0) === '#' || fragment.charAt(0) === '?') {\n        fragment = fragment.substring(1);\n    }\n    var obj = {};\n    // Loop until we have no more params\n    var param;\n    while (true) { // eslint-disable-line no-constant-condition\n        param = paramSplit.exec(fragment);\n        if (!param) {\n            break;\n        }\n        var key = param[1];\n        var value = param[2];\n        // id_token should remain base64url encoded\n        if (key === 'id_token' || key === 'access_token' || key === 'code') {\n            obj[key] = value;\n        }\n        else {\n            obj[key] = decodeURIComponent(value.replace(plus2space, ' '));\n        }\n    }\n    return obj;\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\n/* eslint-disable complexity, max-statements */\nimport AuthSdkError from '../../errors/AuthSdkError';\nexport function validateClaims(sdk, claims, validationParams) {\n    var aud = validationParams.clientId;\n    var iss = validationParams.issuer;\n    var nonce = validationParams.nonce;\n    if (!claims || !iss || !aud) {\n        throw new AuthSdkError('The jwt, iss, and aud arguments are all required');\n    }\n    if (nonce && claims.nonce !== nonce) {\n        throw new AuthSdkError('OAuth flow response nonce doesn\\'t match request nonce');\n    }\n    var now = Math.floor(Date.now() / 1000);\n    if (claims.iss !== iss) {\n        throw new AuthSdkError('The issuer [' + claims.iss + '] ' +\n            'does not match [' + iss + ']');\n    }\n    if (claims.aud !== aud) {\n        throw new AuthSdkError('The audience [' + claims.aud + '] ' +\n            'does not match [' + aud + ']');\n    }\n    if (claims.iat > claims.exp) {\n        throw new AuthSdkError('The JWT expired before it was issued');\n    }\n    if ((now - sdk.options.maxClockSkew) > claims.exp) {\n        throw new AuthSdkError('The JWT expired and is no longer valid');\n    }\n    if (claims.iat > (now + sdk.options.maxClockSkew)) {\n        throw new AuthSdkError('The JWT was issued in the future');\n    }\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport { AuthSdkError } from '../errors';\nimport { base64UrlToString } from '../util';\nexport function decodeToken(token) {\n    var jwt = token.split('.');\n    var decodedToken;\n    try {\n        decodedToken = {\n            header: JSON.parse(base64UrlToString(jwt[0])),\n            payload: JSON.parse(base64UrlToString(jwt[1])),\n            signature: jwt[2]\n        };\n    }\n    catch (e) {\n        throw new AuthSdkError('Malformed token');\n    }\n    return decodedToken;\n}\n","/* global btoa */\n/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport http from '../http';\nimport { toQueryString } from '../util';\nimport { getOAuthUrls, } from './util/oauth';\nimport AuthSdkError from '../errors/AuthSdkError';\n// refresh tokens have precedence to be revoked if no token is specified\nexport function revokeToken(sdk, token) {\n    return Promise.resolve()\n        .then(function () {\n        var accessToken;\n        var refreshToken;\n        if (token) {\n            accessToken = token.accessToken;\n            refreshToken = token.refreshToken;\n        }\n        if (!accessToken && !refreshToken) {\n            throw new AuthSdkError('A valid access or refresh token object is required');\n        }\n        var clientId = sdk.options.clientId;\n        if (!clientId) {\n            throw new AuthSdkError('A clientId must be specified in the OktaAuth constructor to revoke a token');\n        }\n        var revokeUrl = getOAuthUrls(sdk).revokeUrl;\n        var args = toQueryString({\n            // eslint-disable-next-line camelcase\n            token_type_hint: refreshToken ? 'refresh_token' : 'access_token',\n            token: refreshToken || accessToken,\n        }).slice(1);\n        var creds = btoa(clientId);\n        return http.post(sdk, revokeUrl, args, {\n            headers: {\n                'Content-Type': 'application/x-www-form-urlencoded',\n                'Authorization': 'Basic ' + creds\n            }\n        });\n    });\n}\n","/* eslint-disable max-len */\n/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport { getOAuthUrls } from '../oidc';\nimport { getDefaultTokenParams } from './util';\nimport { clone } from '../util';\nimport { postToTokenEndpoint } from './endpoints/token';\nimport { handleOAuthResponse } from './handleOAuthResponse';\n// codeVerifier is required. May pass either an authorizationCode or interactionCode\nexport function exchangeCodeForTokens(sdk, tokenParams, urls) {\n    urls = urls || getOAuthUrls(sdk, tokenParams);\n    // build params using defaults + options\n    tokenParams = Object.assign({}, getDefaultTokenParams(sdk), clone(tokenParams));\n    const { authorizationCode, interactionCode, codeVerifier, clientId, redirectUri, scopes, ignoreSignature, } = tokenParams;\n    var getTokenOptions = {\n        clientId,\n        redirectUri,\n        authorizationCode,\n        interactionCode,\n        codeVerifier,\n    };\n    return postToTokenEndpoint(sdk, getTokenOptions, urls)\n        .then((response) => {\n        // `handleOAuthResponse` hanadles responses from both `/authorize` and `/token` endpoints\n        // Here we modify the response from `/token` so that it more closely matches a response from `/authorize`\n        // `responseType` is used to validate that the expected tokens were returned\n        const responseType = ['token']; // an accessToken will always be returned\n        if (scopes.indexOf('openid') !== -1) {\n            responseType.push('id_token'); // an idToken will be returned if \"openid\" is in the scopes\n        }\n        const handleResponseOptions = {\n            clientId,\n            redirectUri,\n            scopes,\n            responseType,\n            ignoreSignature,\n        };\n        return handleOAuthResponse(sdk, handleResponseOptions, response, urls)\n            .then((response) => {\n            // For compatibility, \"code\" is returned in the TokenResponse. OKTA-326091\n            response.code = authorizationCode;\n            return response;\n        });\n    });\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n/* global crypto */\nimport { stringToBase64Url, clone, stringToBuffer, base64UrlDecode } from './util';\nfunction getOidcHash(str) {\n    var buffer = new TextEncoder().encode(str);\n    return crypto.subtle.digest('SHA-256', buffer).then(function (arrayBuffer) {\n        var intBuffer = new Uint8Array(arrayBuffer);\n        var firstHalf = intBuffer.slice(0, 16);\n        var hash = String.fromCharCode.apply(null, firstHalf);\n        var b64u = stringToBase64Url(hash); // url-safe base64 variant\n        return b64u;\n    });\n}\nfunction verifyToken(idToken, key) {\n    key = clone(key);\n    var format = 'jwk';\n    var algo = {\n        name: 'RSASSA-PKCS1-v1_5',\n        hash: { name: 'SHA-256' }\n    };\n    var extractable = true;\n    var usages = ['verify'];\n    // https://connect.microsoft.com/IE/feedback/details/2242108/webcryptoapi-importing-jwk-with-use-field-fails\n    // This is a metadata tag that specifies the intent of how the key should be used.\n    // It's not necessary to properly verify the jwt's signature.\n    delete key.use;\n    // @ts-ignore\n    return crypto.subtle.importKey(format, key, algo, extractable, usages)\n        .then(function (cryptoKey) {\n        var jwt = idToken.split('.');\n        var payload = stringToBuffer(jwt[0] + '.' + jwt[1]);\n        var b64Signature = base64UrlDecode(jwt[2]);\n        var signature = stringToBuffer(b64Signature);\n        return crypto.subtle.verify(algo, cryptoKey, signature, payload);\n    });\n}\nexport { getOidcHash, verifyToken };\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\n/* eslint-disable max-len */\n/* eslint-disable complexity */\n/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport { getWellKnown, getKey } from './endpoints/well-known';\nimport { validateClaims } from './util';\nimport { AuthSdkError } from '../errors';\nimport { decodeToken } from './decodeToken';\nimport * as sdkCrypto from '../crypto';\n// Verify the id token\nexport function verifyToken(sdk, token, validationParams) {\n    return __awaiter(this, void 0, void 0, function* () {\n        if (!token || !token.idToken) {\n            throw new AuthSdkError('Only idTokens may be verified');\n        }\n        // Decode the Jwt object (may throw)\n        var jwt = decodeToken(token.idToken);\n        var openIdConfig = yield getWellKnown(sdk); // using sdk.options.issuer\n        var validationOptions = {\n            issuer: openIdConfig.issuer,\n            clientId: sdk.options.clientId,\n            ignoreSignature: sdk.options.ignoreSignature\n        };\n        Object.assign(validationOptions, validationParams);\n        // Standard claim validation (may throw)\n        validateClaims(sdk, jwt.payload, validationOptions);\n        // If the browser doesn't support native crypto or we choose not\n        // to verify the signature, bail early\n        if (validationOptions.ignoreSignature == true || !sdk.features.isTokenVerifySupported()) {\n            return token;\n        }\n        const key = yield getKey(sdk, token.issuer, jwt.header.kid);\n        const valid = yield sdkCrypto.verifyToken(token.idToken, key);\n        if (!valid) {\n            throw new AuthSdkError('The token signature is not valid');\n        }\n        if (validationParams && validationParams.accessToken && token.claims.at_hash) {\n            const hash = yield sdkCrypto.getOidcHash(validationParams.accessToken);\n            if (hash !== token.claims.at_hash) {\n                throw new AuthSdkError('Token hash verification failed');\n            }\n        }\n        return token;\n    });\n}\n","/* eslint-disable complexity, max-statements */\n/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport { clone } from '../util';\nimport { getOAuthUrls, } from './util/oauth';\nimport { AuthSdkError, OAuthError } from '../errors';\nimport { exchangeCodeForTokens } from './exchangeCodeForTokens';\nimport { verifyToken } from './verifyToken';\nimport { getDefaultTokenParams } from '.';\nfunction validateResponse(res, oauthParams) {\n    if (res['error'] || res['error_description']) {\n        throw new OAuthError(res['error'], res['error_description']);\n    }\n    if (res.state !== oauthParams.state) {\n        throw new AuthSdkError('OAuth flow response state doesn\\'t match request state');\n    }\n}\n// eslint-disable-next-line max-len\nexport function handleOAuthResponse(sdk, tokenParams, res, urls) {\n    var pkce = sdk.options.pkce !== false;\n    // The result contains an authorization_code and PKCE is enabled \n    // `exchangeCodeForTokens` will call /token then call `handleOauthResponse` recursively with the result\n    if (pkce && (res.code || res.interaction_code)) {\n        return exchangeCodeForTokens(sdk, Object.assign({}, tokenParams, {\n            authorizationCode: res.code,\n            interactionCode: res.interaction_code\n        }), urls);\n    }\n    tokenParams = tokenParams || getDefaultTokenParams(sdk);\n    urls = urls || getOAuthUrls(sdk, tokenParams);\n    var responseType = tokenParams.responseType;\n    if (!Array.isArray(responseType)) {\n        responseType = [responseType];\n    }\n    var scopes;\n    if (res.scope) {\n        scopes = res.scope.split(' ');\n    }\n    else {\n        scopes = clone(tokenParams.scopes);\n    }\n    var clientId = tokenParams.clientId || sdk.options.clientId;\n    // Handling the result from implicit flow or PKCE token exchange\n    return Promise.resolve()\n        .then(function () {\n        validateResponse(res, tokenParams);\n    }).then(function () {\n        var tokenDict = {};\n        var expiresIn = res.expires_in;\n        var tokenType = res.token_type;\n        var accessToken = res.access_token;\n        var idToken = res.id_token;\n        var refreshToken = res.refresh_token;\n        if (accessToken) {\n            var accessJwt = sdk.token.decode(accessToken);\n            tokenDict.accessToken = {\n                value: accessToken,\n                accessToken: accessToken,\n                claims: accessJwt.payload,\n                expiresAt: Number(expiresIn) + Math.floor(Date.now() / 1000),\n                tokenType: tokenType,\n                scopes: scopes,\n                authorizeUrl: urls.authorizeUrl,\n                userinfoUrl: urls.userinfoUrl\n            };\n        }\n        if (refreshToken) {\n            tokenDict.refreshToken = {\n                value: refreshToken,\n                refreshToken: refreshToken,\n                expiresAt: Number(expiresIn) + Math.floor(Date.now() / 1000),\n                scopes: scopes,\n                tokenUrl: urls.tokenUrl,\n                authorizeUrl: urls.authorizeUrl,\n                issuer: urls.issuer,\n            };\n        }\n        if (idToken) {\n            var idJwt = sdk.token.decode(idToken);\n            var idTokenObj = {\n                value: idToken,\n                idToken: idToken,\n                claims: idJwt.payload,\n                expiresAt: idJwt.payload.exp,\n                scopes: scopes,\n                authorizeUrl: urls.authorizeUrl,\n                issuer: urls.issuer,\n                clientId: clientId\n            };\n            var validationParams = {\n                clientId: clientId,\n                issuer: urls.issuer,\n                nonce: tokenParams.nonce,\n                accessToken: accessToken\n            };\n            if (tokenParams.ignoreSignature !== undefined) {\n                validationParams.ignoreSignature = tokenParams.ignoreSignature;\n            }\n            return verifyToken(sdk, idTokenObj, validationParams)\n                .then(function () {\n                tokenDict.idToken = idTokenObj;\n                return tokenDict;\n            });\n        }\n        return tokenDict;\n    })\n        .then(function (tokenDict) {\n        // Validate received tokens against requested response types \n        if (responseType.indexOf('token') !== -1 && !tokenDict.accessToken) {\n            // eslint-disable-next-line max-len\n            throw new AuthSdkError('Unable to parse OAuth flow response: response type \"token\" was requested but \"access_token\" was not returned.');\n        }\n        if (responseType.indexOf('id_token') !== -1 && !tokenDict.idToken) {\n            // eslint-disable-next-line max-len\n            throw new AuthSdkError('Unable to parse OAuth flow response: response type \"id_token\" was requested but \"id_token\" was not returned.');\n        }\n        return {\n            tokens: tokenDict,\n            state: res.state,\n            code: res.code\n        };\n    });\n}\n","/* global document */\n/* eslint-disable complexity, max-statements */\n/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport { getOAuthUrls, loadFrame, loadPopup, } from './util';\nimport AuthSdkError from '../errors/AuthSdkError';\nimport { prepareTokenParams } from './util/prepareTokenParams';\nimport { buildAuthorizeParams } from './endpoints/authorize';\nimport { addPostMessageListener } from './util';\nimport { handleOAuthResponse } from './handleOAuthResponse';\n/*\n * Retrieve an idToken from an Okta or a third party idp\n *\n * Two main flows:\n *\n *  1) Exchange a sessionToken for a token\n *\n *    Required:\n *      clientId: passed via the OktaAuth constructor or into getToken\n *      sessionToken: 'yourtoken'\n *\n *    Optional:\n *      redirectUri: defaults to window.location.href\n *      scopes: defaults to ['openid', 'email']\n *\n *    Forced:\n *      prompt: 'none'\n *      responseMode: 'okta_post_message'\n *      display: undefined\n *\n *  2) Get a token from an idp\n *\n *    Required:\n *      clientId: passed via the OktaAuth constructor or into getToken\n *\n *    Optional:\n *      redirectUri: defaults to window.location.href\n *      scopes: defaults to ['openid', 'email']\n *      idp: defaults to Okta as an idp\n *      prompt: no default. Pass 'none' to throw an error if user is not signed in\n *\n *    Forced:\n *      display: 'popup'\n *\n *  Only common optional params shown. Any OAuth parameters not explicitly forced are available to override\n *\n * @param {Object} oauthOptions\n * @param {String} [oauthOptions.clientId] ID of this client\n * @param {String} [oauthOptions.redirectUri] URI that the iframe or popup will go to once authenticated\n * @param {String[]} [oauthOptions.scopes] OAuth 2.0 scopes to request (openid must be specified)\n * @param {String} [oauthOptions.idp] ID of an external IdP to use for user authentication\n * @param {String} [oauthOptions.sessionToken] Bootstrap Session Token returned by the Okta Authentication API\n * @param {String} [oauthOptions.prompt] Determines whether the Okta login will be displayed on failure.\n *                                       Use 'none' to prevent this behavior\n *\n * @param {Object} options\n * @param {Integer} [options.timeout] Time in ms before the flow is automatically terminated. Defaults to 120000\n * @param {String} [options.popupTitle] Title dispayed in the popup.\n *                                      Defaults to 'External Identity Provider User Authentication'\n */\nexport function getToken(sdk, options) {\n    if (arguments.length > 2) {\n        return Promise.reject(new AuthSdkError('As of version 3.0, \"getToken\" takes only a single set of options'));\n    }\n    options = options || {};\n    return prepareTokenParams(sdk, options)\n        .then(function (tokenParams) {\n        // Start overriding any options that don't make sense\n        var sessionTokenOverrides = {\n            prompt: 'none',\n            responseMode: 'okta_post_message',\n            display: null\n        };\n        var idpOverrides = {\n            display: 'popup'\n        };\n        if (options.sessionToken) {\n            Object.assign(tokenParams, sessionTokenOverrides);\n        }\n        else if (options.idp) {\n            Object.assign(tokenParams, idpOverrides);\n        }\n        // Use the query params to build the authorize url\n        var requestUrl, endpoint, urls;\n        // Get authorizeUrl and issuer\n        urls = getOAuthUrls(sdk, tokenParams);\n        endpoint = options.codeVerifier ? urls.tokenUrl : urls.authorizeUrl;\n        requestUrl = endpoint + buildAuthorizeParams(tokenParams);\n        // Determine the flow type\n        var flowType;\n        if (tokenParams.sessionToken || tokenParams.display === null) {\n            flowType = 'IFRAME';\n        }\n        else if (tokenParams.display === 'popup') {\n            flowType = 'POPUP';\n        }\n        else {\n            flowType = 'IMPLICIT';\n        }\n        // Execute the flow type\n        switch (flowType) {\n            case 'IFRAME':\n                var iframePromise = addPostMessageListener(sdk, options.timeout, tokenParams.state);\n                var iframeEl = loadFrame(requestUrl);\n                return iframePromise\n                    .then(function (res) {\n                    return handleOAuthResponse(sdk, tokenParams, res, urls);\n                })\n                    .finally(function () {\n                    if (document.body.contains(iframeEl)) {\n                        iframeEl.parentElement.removeChild(iframeEl);\n                    }\n                });\n            case 'POPUP':\n                var oauthPromise; // resolves with OAuth response\n                // Add listener on postMessage before window creation, so\n                // postMessage isn't triggered before we're listening\n                if (tokenParams.responseMode === 'okta_post_message') {\n                    if (!sdk.features.isPopupPostMessageSupported()) {\n                        throw new AuthSdkError('This browser doesn\\'t have full postMessage support');\n                    }\n                    oauthPromise = addPostMessageListener(sdk, options.timeout, tokenParams.state);\n                }\n                // Create the window\n                var windowOptions = {\n                    popupTitle: options.popupTitle\n                };\n                var windowEl = loadPopup(requestUrl, windowOptions);\n                // The popup may be closed without receiving an OAuth response. Setup a poller to monitor the window.\n                var popupPromise = new Promise(function (resolve, reject) {\n                    var closePoller = setInterval(function () {\n                        if (!windowEl || windowEl.closed) {\n                            clearInterval(closePoller);\n                            reject(new AuthSdkError('Unable to parse OAuth flow response'));\n                        }\n                    }, 100);\n                    // Proxy the OAuth promise results\n                    oauthPromise\n                        .then(function (res) {\n                        clearInterval(closePoller);\n                        resolve(res);\n                    })\n                        .catch(function (err) {\n                        clearInterval(closePoller);\n                        reject(err);\n                    });\n                });\n                return popupPromise\n                    .then(function (res) {\n                    return handleOAuthResponse(sdk, tokenParams, res, urls);\n                })\n                    .finally(function () {\n                    if (windowEl && !windowEl.closed) {\n                        windowEl.close();\n                    }\n                });\n            default:\n                throw new AuthSdkError('The full page redirect flow is not supported');\n        }\n    });\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport { AuthSdkError } from '../errors';\nimport { clone } from '../util';\nimport { getToken } from './getToken';\nexport function getWithoutPrompt(sdk, options) {\n    if (arguments.length > 2) {\n        return Promise.reject(new AuthSdkError('As of version 3.0, \"getWithoutPrompt\" takes only a single set of options'));\n    }\n    options = clone(options) || {};\n    Object.assign(options, {\n        prompt: 'none',\n        responseMode: 'okta_post_message',\n        display: null\n    });\n    return getToken(sdk, options);\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport { AuthSdkError } from '../errors';\nimport { isToken, isAccessToken, isIDToken } from '../types';\nimport { getWithoutPrompt } from './getWithoutPrompt';\nexport function renewToken(sdk, token) {\n    // Note: This is not used when a refresh token is present\n    if (!isToken(token)) {\n        return Promise.reject(new AuthSdkError('Renew must be passed a token with ' +\n            'an array of scopes and an accessToken or idToken'));\n    }\n    var responseType;\n    if (sdk.options.pkce) {\n        responseType = 'code';\n    }\n    else if (isAccessToken(token)) {\n        responseType = 'token';\n    }\n    else {\n        responseType = 'id_token';\n    }\n    const { scopes, authorizeUrl, userinfoUrl, issuer } = token;\n    return getWithoutPrompt(sdk, {\n        responseType,\n        scopes,\n        authorizeUrl,\n        userinfoUrl,\n        issuer\n    })\n        .then(function (res) {\n        // Multiple tokens may have come back. Return only the token which was requested.\n        var tokens = res.tokens;\n        return isIDToken(token) ? tokens.idToken : tokens.accessToken;\n    });\n}\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\n/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport { AuthSdkError } from '../errors';\nimport { getOAuthUrls } from './util/oauth';\nimport { handleOAuthResponse } from './handleOAuthResponse';\nimport { postRefreshToken } from './endpoints/token';\nexport function renewTokensWithRefresh(sdk, tokenParams, refreshTokenObject) {\n    return __awaiter(this, void 0, void 0, function* () {\n        const { clientId } = sdk.options;\n        if (!clientId) {\n            throw new AuthSdkError('A clientId must be specified in the OktaAuth constructor to renew tokens');\n        }\n        const renewTokenParams = Object.assign({}, tokenParams, {\n            clientId,\n        });\n        const tokenResponse = yield postRefreshToken(sdk, renewTokenParams, refreshTokenObject);\n        const urls = getOAuthUrls(sdk, tokenParams);\n        const { tokens } = yield handleOAuthResponse(sdk, renewTokenParams, tokenResponse, urls);\n        return tokens;\n    });\n}\n","import { getWithoutPrompt } from './getWithoutPrompt';\nimport { renewTokensWithRefresh } from './renewTokensWithRefresh';\nimport { getDefaultTokenParams } from './util';\nexport function renewTokens(sdk, options) {\n    // If we have a refresh token, renew using that, otherwise getWithoutPrompt\n    // Calling via async as auth-js doesn't yet (as of 4.2) ensure that updateAuthState() was ever called\n    return sdk.tokenManager.getTokens()\n        .then(tokens => tokens.refreshToken)\n        .then(refreshTokenObject => {\n        if (refreshTokenObject) {\n            return renewTokensWithRefresh(sdk, options, refreshTokenObject);\n        }\n        options = Object.assign({\n            scopes: sdk.options.scopes,\n            authorizeUrl: sdk.options.authorizeUrl,\n            userinfoUrl: sdk.options.userinfoUrl,\n            issuer: sdk.options.issuer\n        }, options);\n        if (sdk.options.pkce) {\n            options.responseType = 'code';\n        }\n        else {\n            const { responseType } = getDefaultTokenParams(sdk);\n            options.responseType = responseType;\n        }\n        return getWithoutPrompt(sdk, options)\n            .then(res => res.tokens);\n    });\n}\n","var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\n/* eslint-disable complexity */\n/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport { isFunction } from '../util';\nimport { AuthSdkError, OAuthError } from '../errors';\nimport http from '../http';\nimport { isAccessToken, isIDToken } from '../types';\nexport function getUserInfo(sdk, accessTokenObject, idTokenObject) {\n    return __awaiter(this, void 0, void 0, function* () {\n        // If token objects were not passed, attempt to read from the TokenManager\n        if (!accessTokenObject) {\n            accessTokenObject = (yield sdk.tokenManager.getTokens()).accessToken;\n        }\n        if (!idTokenObject) {\n            idTokenObject = (yield sdk.tokenManager.getTokens()).idToken;\n        }\n        if (!accessTokenObject || !isAccessToken(accessTokenObject)) {\n            return Promise.reject(new AuthSdkError('getUserInfo requires an access token object'));\n        }\n        if (!idTokenObject || !isIDToken(idTokenObject)) {\n            return Promise.reject(new AuthSdkError('getUserInfo requires an ID token object'));\n        }\n        return http.httpRequest(sdk, {\n            url: accessTokenObject.userinfoUrl,\n            method: 'GET',\n            accessToken: accessTokenObject.accessToken\n        })\n            .then(userInfo => {\n            // Only return the userinfo response if subjects match to mitigate token substitution attacks\n            if (userInfo.sub === idTokenObject.claims.sub) {\n                return userInfo;\n            }\n            return Promise.reject(new AuthSdkError('getUserInfo request was rejected due to token mismatch'));\n        })\n            .catch(function (err) {\n            if (err.xhr && (err.xhr.status === 401 || err.xhr.status === 403)) {\n                var authenticateHeader;\n                if (err.xhr.headers && isFunction(err.xhr.headers.get) && err.xhr.headers.get('WWW-Authenticate')) {\n                    authenticateHeader = err.xhr.headers.get('WWW-Authenticate');\n                }\n                else if (isFunction(err.xhr.getResponseHeader)) {\n                    authenticateHeader = err.xhr.getResponseHeader('WWW-Authenticate');\n                }\n                if (authenticateHeader) {\n                    var errorMatches = authenticateHeader.match(/error=\"(.*?)\"/) || [];\n                    var errorDescriptionMatches = authenticateHeader.match(/error_description=\"(.*?)\"/) || [];\n                    var error = errorMatches[1];\n                    var errorDescription = errorDescriptionMatches[1];\n                    if (error && errorDescription) {\n                        err = new OAuthError(error, errorDescription);\n                    }\n                }\n            }\n            throw err;\n        });\n    });\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport { AuthSdkError } from '../errors';\nimport { clone } from '../util';\nimport { getToken } from './getToken';\nexport function getWithPopup(sdk, options) {\n    if (arguments.length > 2) {\n        return Promise.reject(new AuthSdkError('As of version 3.0, \"getWithPopup\" takes only a single set of options'));\n    }\n    options = clone(options) || {};\n    Object.assign(options, {\n        display: 'popup',\n        responseMode: 'okta_post_message'\n    });\n    return getToken(sdk, options);\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport { AuthSdkError } from '../errors';\nimport { clone } from '../util';\nimport { getOAuthUrls, prepareTokenParams } from './util';\nimport { buildAuthorizeParams } from './endpoints/authorize';\nexport function getWithRedirect(sdk, options) {\n    if (arguments.length > 2) {\n        return Promise.reject(new AuthSdkError('As of version 3.0, \"getWithRedirect\" takes only a single set of options'));\n    }\n    options = clone(options) || {};\n    return prepareTokenParams(sdk, options)\n        .then(function (tokenParams) {\n        var urls = getOAuthUrls(sdk, options);\n        var requestUrl = urls.authorizeUrl + buildAuthorizeParams(tokenParams);\n        // Gather the values we want to save in the transaction\n        const { responseType, state, nonce, scopes, clientId, ignoreSignature, redirectUri, codeVerifier, codeChallenge, codeChallengeMethod, } = tokenParams;\n        const oauthMeta = {\n            responseType,\n            state,\n            nonce,\n            scopes,\n            clientId,\n            urls,\n            ignoreSignature,\n            redirectUri,\n            codeVerifier,\n            codeChallenge,\n            codeChallengeMethod,\n        };\n        sdk.transactionManager.save(oauthMeta, { oauth: true });\n        sdk.token.getWithRedirect._setLocation(requestUrl);\n    });\n}\n","/* eslint-disable complexity */\n/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\nimport { AuthSdkError } from '../errors';\nimport { isInteractionRequiredError, urlParamsToObject } from './util';\nimport { isString } from '../util';\nimport { handleOAuthResponse } from './handleOAuthResponse';\nfunction removeHash(sdk) {\n    var nativeHistory = sdk.token.parseFromUrl._getHistory();\n    var nativeDoc = sdk.token.parseFromUrl._getDocument();\n    var nativeLoc = sdk.token.parseFromUrl._getLocation();\n    if (nativeHistory && nativeHistory.replaceState) {\n        nativeHistory.replaceState(null, nativeDoc.title, nativeLoc.pathname + nativeLoc.search);\n    }\n    else {\n        nativeLoc.hash = '';\n    }\n}\nfunction removeSearch(sdk) {\n    var nativeHistory = sdk.token.parseFromUrl._getHistory();\n    var nativeDoc = sdk.token.parseFromUrl._getDocument();\n    var nativeLoc = sdk.token.parseFromUrl._getLocation();\n    if (nativeHistory && nativeHistory.replaceState) {\n        nativeHistory.replaceState(null, nativeDoc.title, nativeLoc.pathname + nativeLoc.hash);\n    }\n    else {\n        nativeLoc.search = '';\n    }\n}\nexport function parseFromUrl(sdk, options) {\n    options = options || {};\n    if (isString(options)) {\n        options = { url: options };\n    }\n    else {\n        options = options;\n    }\n    // https://openid.net/specs/openid-connect-core-1_0.html#Authentication\n    var defaultResponseMode = sdk.options.pkce ? 'query' : 'fragment';\n    var url = options.url;\n    var responseMode = options.responseMode || sdk.options.responseMode || defaultResponseMode;\n    var nativeLoc = sdk.token.parseFromUrl._getLocation();\n    var paramStr;\n    if (responseMode === 'query') {\n        paramStr = url ? url.substring(url.indexOf('?')) : nativeLoc.search;\n    }\n    else {\n        paramStr = url ? url.substring(url.indexOf('#')) : nativeLoc.hash;\n    }\n    if (!paramStr) {\n        return Promise.reject(new AuthSdkError('Unable to parse a token from the url'));\n    }\n    const oauthParams = sdk.transactionManager.load({\n        oauth: true,\n        pkce: sdk.options.pkce\n    });\n    const urls = oauthParams.urls;\n    delete oauthParams.urls;\n    return Promise.resolve(urlParamsToObject(paramStr))\n        .then(function (res) {\n        if (!url) {\n            // Clean hash or search from the url\n            responseMode === 'query' ? removeSearch(sdk) : removeHash(sdk);\n        }\n        return handleOAuthResponse(sdk, oauthParams, res, urls)\n            .catch(err => {\n            if (!isInteractionRequiredError(err)) {\n                sdk.transactionManager.clear();\n            }\n            throw err;\n        })\n            .then(res => {\n            sdk.transactionManager.clear();\n            return res;\n        });\n    });\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\nexport default class SdkClock {\n    constructor(localOffset) {\n        // Calculated local clock offset from server time (in milliseconds). Can be positive or negative.\n        this.localOffset = parseInt(localOffset || 0);\n    }\n    // factory method. Create an instance of a clock from current context.\n    static create( /* sdk, options */) {\n        // TODO: calculate localOffset\n        var localOffset = 0;\n        return new SdkClock(localOffset);\n    }\n    // Return the current time (in seconds)\n    now() {\n        var now = (Date.now() + this.localOffset) / 1000;\n        return now;\n    }\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n *\n */\n/* global window */\n/* eslint complexity:[0,8] max-statements:[0,21] */\nimport { removeNils, warn, isObject, clone, isIE11OrLess } from './util';\nimport AuthSdkError from './errors/AuthSdkError';\nimport { TOKEN_STORAGE_NAME } from './constants';\nimport SdkClock from './clock';\nimport { isIDToken, isAccessToken, isRefreshToken } from './types';\nimport { ID_TOKEN_STORAGE_KEY, ACCESS_TOKEN_STORAGE_KEY, REFRESH_TOKEN_STORAGE_KEY } from './constants';\nconst DEFAULT_OPTIONS = {\n    autoRenew: true,\n    autoRemove: true,\n    storage: 'localStorage',\n    expireEarlySeconds: 30,\n    storageKey: TOKEN_STORAGE_NAME,\n    _storageEventDelay: 0\n};\nexport const EVENT_EXPIRED = 'expired';\nexport const EVENT_RENEWED = 'renewed';\nexport const EVENT_ADDED = 'added';\nexport const EVENT_REMOVED = 'removed';\nexport const EVENT_ERROR = 'error';\nfunction getExpireTime(tokenMgmtRef, token) {\n    var expireTime = token.expiresAt - tokenMgmtRef.options.expireEarlySeconds;\n    return expireTime;\n}\nfunction hasExpired(tokenMgmtRef, token) {\n    var expireTime = getExpireTime(tokenMgmtRef, token);\n    return expireTime <= tokenMgmtRef.clock.now();\n}\nfunction emitExpired(tokenMgmtRef, key, token) {\n    tokenMgmtRef.emitter.emit(EVENT_EXPIRED, key, token);\n}\nfunction emitRenewed(tokenMgmtRef, key, freshToken, oldToken) {\n    tokenMgmtRef.emitter.emit(EVENT_RENEWED, key, freshToken, oldToken);\n}\nfunction emitAdded(tokenMgmtRef, key, token) {\n    tokenMgmtRef.emitter.emit(EVENT_ADDED, key, token);\n}\nfunction emitRemoved(tokenMgmtRef, key, token) {\n    tokenMgmtRef.emitter.emit(EVENT_REMOVED, key, token);\n}\nfunction emitError(tokenMgmtRef, error) {\n    tokenMgmtRef.emitter.emit(EVENT_ERROR, error);\n}\nfunction emitEventsForCrossTabsStorageUpdate(tokenMgmtRef, newValue, oldValue) {\n    const oldTokens = getTokensFromStorageValue(oldValue);\n    const newTokens = getTokensFromStorageValue(newValue);\n    Object.keys(newTokens).forEach(key => {\n        const oldToken = oldTokens[key];\n        const newToken = newTokens[key];\n        if (JSON.stringify(oldToken) !== JSON.stringify(newToken)) {\n            emitAdded(tokenMgmtRef, key, newToken);\n        }\n    });\n    Object.keys(oldTokens).forEach(key => {\n        const oldToken = oldTokens[key];\n        const newToken = newTokens[key];\n        if (!newToken) {\n            emitRemoved(tokenMgmtRef, key, oldToken);\n        }\n    });\n}\nfunction clearExpireEventTimeout(tokenMgmtRef, key) {\n    clearTimeout(tokenMgmtRef.expireTimeouts[key]);\n    delete tokenMgmtRef.expireTimeouts[key];\n    // Remove the renew promise (if it exists)\n    delete tokenMgmtRef.renewPromise[key];\n}\nfunction clearExpireEventTimeoutAll(tokenMgmtRef) {\n    var expireTimeouts = tokenMgmtRef.expireTimeouts;\n    for (var key in expireTimeouts) {\n        if (!Object.prototype.hasOwnProperty.call(expireTimeouts, key)) {\n            continue;\n        }\n        clearExpireEventTimeout(tokenMgmtRef, key);\n    }\n}\nfunction setExpireEventTimeout(sdk, tokenMgmtRef, key, token) {\n    var expireTime = getExpireTime(tokenMgmtRef, token);\n    var expireEventWait = Math.max(expireTime - tokenMgmtRef.clock.now(), 0) * 1000;\n    // Clear any existing timeout\n    clearExpireEventTimeout(tokenMgmtRef, key);\n    var expireEventTimeout = setTimeout(function () {\n        emitExpired(tokenMgmtRef, key, token);\n    }, expireEventWait);\n    // Add a new timeout\n    tokenMgmtRef.expireTimeouts[key] = expireEventTimeout;\n}\nfunction setExpireEventTimeoutAll(sdk, tokenMgmtRef, storage) {\n    try {\n        var tokenStorage = storage.getStorage();\n    }\n    catch (e) {\n        // Any errors thrown on instantiation will not be caught,\n        // because there are no listeners yet\n        emitError(tokenMgmtRef, e);\n        return;\n    }\n    for (var key in tokenStorage) {\n        if (!Object.prototype.hasOwnProperty.call(tokenStorage, key)) {\n            continue;\n        }\n        var token = tokenStorage[key];\n        setExpireEventTimeout(sdk, tokenMgmtRef, key, token);\n    }\n}\n// reset timeouts to setup autoRenew for tokens from other document context (tabs)\nfunction resetExpireEventTimeoutAll(sdk, tokenMgmtRef, storage) {\n    clearExpireEventTimeoutAll(tokenMgmtRef);\n    setExpireEventTimeoutAll(sdk, tokenMgmtRef, storage);\n}\nfunction validateToken(token) {\n    if (!isObject(token) ||\n        !token.scopes ||\n        (!token.expiresAt && token.expiresAt !== 0) ||\n        (!isIDToken(token) && !isAccessToken(token) && !isRefreshToken(token))) {\n        throw new AuthSdkError('Token must be an Object with scopes, expiresAt, and one of: an idToken, accessToken, or refreshToken property');\n    }\n}\nfunction _add(sdk, tokenMgmtRef, storage, key, token) {\n    var tokenStorage = storage.getStorage();\n    validateToken(token);\n    tokenStorage[key] = token;\n    storage.setStorage(tokenStorage);\n    emitAdded(tokenMgmtRef, key, token);\n    setExpireEventTimeout(sdk, tokenMgmtRef, key, token);\n}\nfunction add(sdk, tokenMgmtRef, storage, key, token) {\n    if (sdk.features.isLocalhost()) {\n        warn('Use setTokens() instead if you want to add a set of tokens at same time.\\n' +\n            'It prevents current tab from emitting unnecessary StorageEvent,\\n' +\n            'which may cause false-positive authState change cross tabs.');\n    }\n    _add(sdk, tokenMgmtRef, storage, key, token);\n}\nfunction get(storage, key) {\n    var tokenStorage = storage.getStorage();\n    return tokenStorage[key];\n}\nfunction getKeyByType(storage, type) {\n    const tokenStorage = storage.getStorage();\n    const key = Object.keys(tokenStorage).filter(key => {\n        const token = tokenStorage[key];\n        return (isAccessToken(token) && type === 'accessToken')\n            || (isIDToken(token) && type === 'idToken')\n            || (isRefreshToken(token) && type === 'refreshToken');\n    })[0];\n    return key;\n}\nfunction getAsync(storage, key) {\n    return new Promise(function (resolve) {\n        var token = get(storage, key);\n        return resolve(token);\n    });\n}\nfunction getTokens(storage) {\n    const tokens = {};\n    const tokenStorage = storage.getStorage();\n    Object.keys(tokenStorage).forEach(key => {\n        const token = tokenStorage[key];\n        if (isAccessToken(token)) {\n            tokens.accessToken = token;\n        }\n        else if (isIDToken(token)) {\n            tokens.idToken = token;\n        }\n        else if (isRefreshToken(token)) {\n            tokens.refreshToken = token;\n        }\n    });\n    return tokens;\n}\nfunction getTokensAsync(storage) {\n    return new Promise((resolve) => {\n        const tokens = getTokens(storage);\n        return resolve(tokens);\n    });\n}\n/* eslint-disable max-params */\nfunction setTokens(sdk, tokenMgmtRef, storage, { accessToken, idToken, refreshToken }, accessTokenCb, idTokenCb, refreshTokenCb) {\n    const handleAdded = (key, token, tokenCb) => {\n        emitAdded(tokenMgmtRef, key, token);\n        setExpireEventTimeout(sdk, tokenMgmtRef, key, token);\n        if (tokenCb) {\n            tokenCb(key, token);\n        }\n    };\n    const handleRemoved = (key, token, tokenCb) => {\n        clearExpireEventTimeout(tokenMgmtRef, key);\n        emitRemoved(tokenMgmtRef, key, token);\n        if (tokenCb) {\n            tokenCb(key, token);\n        }\n    };\n    if (idToken) {\n        validateToken(idToken);\n    }\n    if (accessToken) {\n        validateToken(accessToken);\n    }\n    const idTokenKey = getKeyByType(storage, 'idToken') || ID_TOKEN_STORAGE_KEY;\n    const accessTokenKey = getKeyByType(storage, 'accessToken') || ACCESS_TOKEN_STORAGE_KEY;\n    const refreshTokenKey = getKeyByType(storage, 'refreshToken') || REFRESH_TOKEN_STORAGE_KEY;\n    // add token to storage\n    const tokenStorage = Object.assign(Object.assign(Object.assign({}, (idToken && { [idTokenKey]: idToken })), (accessToken && { [accessTokenKey]: accessToken })), (refreshToken && { [refreshTokenKey]: refreshToken }));\n    storage.setStorage(tokenStorage);\n    // emit event and start expiration timer\n    const existingTokens = getTokens(storage);\n    if (idToken) {\n        handleAdded(idTokenKey, idToken, idTokenCb);\n    }\n    else if (existingTokens.idToken) {\n        handleRemoved(idTokenKey, existingTokens.idToken, idTokenCb);\n    }\n    if (accessToken) {\n        handleAdded(accessTokenKey, accessToken, accessTokenCb);\n    }\n    else if (existingTokens.accessToken) {\n        handleRemoved(accessTokenKey, existingTokens.accessToken, accessTokenCb);\n    }\n    if (refreshToken) {\n        handleAdded(refreshTokenKey, refreshToken, refreshTokenCb);\n    }\n    else if (existingTokens.refreshToken) {\n        handleRemoved(refreshTokenKey, existingTokens.refreshToken, refreshTokenCb);\n    }\n}\n/* eslint-enable max-params */\nfunction remove(tokenMgmtRef, storage, key) {\n    // Clear any listener for this token\n    clearExpireEventTimeout(tokenMgmtRef, key);\n    var tokenStorage = storage.getStorage();\n    var removedToken = tokenStorage[key];\n    delete tokenStorage[key];\n    storage.setStorage(tokenStorage);\n    emitRemoved(tokenMgmtRef, key, removedToken);\n}\nfunction _renewToken(sdk, token) {\n    return this.getTokens()\n        .then(tokens => tokens.refreshToken)\n        .then(refreshTokenObject => {\n        if (refreshTokenObject) {\n            return sdk.token.renewTokensWithRefresh({\n                scopes: token.scopes,\n            }, refreshTokenObject)\n                .then(function (freshTokens) {\n                // Multiple tokens may have come back. Return only the token which was requested.\n                return isIDToken(token) ? freshTokens.idToken : freshTokens.accessToken;\n            });\n        }\n        else {\n            return sdk.token.renew(token);\n        }\n    });\n}\nfunction renew(sdk, tokenMgmtRef, storage, key) {\n    // Multiple callers may receive the same promise. They will all resolve or reject from the same request.\n    var existingPromise = tokenMgmtRef.renewPromise[key];\n    if (existingPromise) {\n        return existingPromise;\n    }\n    try {\n        var token = get(storage, key);\n        if (!token) {\n            throw new AuthSdkError('The tokenManager has no token for the key: ' + key);\n        }\n    }\n    catch (e) {\n        return Promise.reject(e);\n    }\n    // Remove existing autoRenew timeout\n    clearExpireEventTimeout(tokenMgmtRef, key);\n    // A refresh token means a replace instead of renewal\n    // Store the renew promise state, to avoid renewing again\n    tokenMgmtRef.renewPromise[key] = _renewToken.call(this, sdk, token)\n        .then(function (freshToken) {\n        // store and emit events for freshToken\n        const oldTokenStorage = storage.getStorage();\n        remove(tokenMgmtRef, storage, key);\n        _add(sdk, tokenMgmtRef, storage, key, freshToken);\n        emitRenewed(tokenMgmtRef, key, freshToken, oldTokenStorage[key]);\n        return freshToken;\n    })\n        .catch(function (err) {\n        if (err.name === 'OAuthError' || err.name === 'AuthSdkError') {\n            // remove expired token in storage\n            const tokenStorage = storage.getStorage();\n            const currentToken = tokenStorage[key];\n            if (currentToken && hasExpired(tokenMgmtRef, currentToken)) {\n                delete tokenStorage[key];\n                clearExpireEventTimeout(tokenMgmtRef, key);\n                storage.setStorage(tokenStorage);\n                emitRemoved(tokenMgmtRef, key, currentToken);\n            }\n            else {\n                // token have been removed from other tabs\n                // still trigger removed event for downstream listeners\n                emitRemoved(tokenMgmtRef, key);\n            }\n            err.tokenKey = key;\n            emitError(tokenMgmtRef, err);\n        }\n        throw err;\n    })\n        .finally(function () {\n        // Remove existing promise key\n        delete tokenMgmtRef.renewPromise[key];\n    });\n    return tokenMgmtRef.renewPromise[key];\n}\nfunction clear(tokenMgmtRef, storage) {\n    clearExpireEventTimeoutAll(tokenMgmtRef);\n    storage.clearStorage();\n}\nfunction shouldThrottleRenew(renewTimeQueue) {\n    let res = false;\n    renewTimeQueue.push(Date.now());\n    if (renewTimeQueue.length >= 10) {\n        // get and remove first item from queue\n        const firstTime = renewTimeQueue.shift();\n        const lastTime = renewTimeQueue[renewTimeQueue.length - 1];\n        res = lastTime - firstTime < 30 * 1000;\n    }\n    return res;\n}\nfunction getTokensFromStorageValue(value) {\n    let tokens;\n    try {\n        tokens = JSON.parse(value) || {};\n    }\n    catch (e) {\n        tokens = {};\n    }\n    return tokens;\n}\nexport class TokenManager {\n    constructor(sdk, options) {\n        options = Object.assign({}, DEFAULT_OPTIONS, removeNils(options));\n        const emitter = sdk.emitter;\n        if (!emitter) {\n            throw new AuthSdkError('Emitter should be initialized before TokenManager');\n        }\n        if (isIE11OrLess()) {\n            options._storageEventDelay = options._storageEventDelay || 1000;\n        }\n        const storageOptions = removeNils({\n            storageKey: options.storageKey,\n            secure: options.secure\n        });\n        if (typeof options.storage === 'object') {\n            // A custom storage provider must implement getItem(key) and setItem(key, val)\n            storageOptions.storageProvider = options.storage;\n        }\n        else if (options.storage) {\n            storageOptions.storageType = options.storage;\n        }\n        const storage = sdk.storageManager.getTokenStorage(storageOptions);\n        var clock = SdkClock.create( /* sdk, options */);\n        var tokenMgmtRef = {\n            clock: clock,\n            options: options,\n            emitter: emitter,\n            expireTimeouts: {},\n            renewPromise: {}\n        };\n        this.add = add.bind(this, sdk, tokenMgmtRef, storage);\n        this.get = getAsync.bind(this, storage);\n        this.remove = remove.bind(this, tokenMgmtRef, storage);\n        this.clear = clear.bind(this, tokenMgmtRef, storage);\n        this.renew = renew.bind(this, sdk, tokenMgmtRef, storage);\n        this.on = tokenMgmtRef.emitter.on.bind(tokenMgmtRef.emitter);\n        this.off = tokenMgmtRef.emitter.off.bind(tokenMgmtRef.emitter);\n        this.hasExpired = hasExpired.bind(this, tokenMgmtRef);\n        this.getTokens = getTokensAsync.bind(this, storage);\n        this.setTokens = setTokens.bind(this, sdk, tokenMgmtRef, storage);\n        this._getStorageKeyByType = getKeyByType.bind(this, storage);\n        this._clearExpireEventTimeoutAll = clearExpireEventTimeoutAll.bind(this, tokenMgmtRef);\n        this._getOptions = () => clone(options);\n        this._resetExpireEventTimeoutAll = resetExpireEventTimeoutAll.bind(this, sdk, tokenMgmtRef, storage);\n        this._emitEventsForCrossTabsStorageUpdate = emitEventsForCrossTabsStorageUpdate.bind(this, tokenMgmtRef);\n        const renewTimeQueue = [];\n        const onTokenExpiredHandler = (key) => {\n            if (options.autoRenew) {\n                if (shouldThrottleRenew(renewTimeQueue)) {\n                    const error = new AuthSdkError('Too many token renew requests');\n                    emitError(tokenMgmtRef, error);\n                }\n                else {\n                    this.renew(key).catch(() => { }); // Renew errors will emit an \"error\" event \n                }\n            }\n            else if (options.autoRemove) {\n                this.remove(key);\n            }\n        };\n        this.on(EVENT_EXPIRED, onTokenExpiredHandler);\n        setExpireEventTimeoutAll(sdk, tokenMgmtRef, storage);\n        // Sync authState cross multiple tabs when localStorage is used as the storageProvider\n        // A StorageEvent is sent to a window when a storage area it has access to is changed \n        // within the context of another document.\n        // https://developer.mozilla.org/en-US/docs/Web/API/StorageEvent\n        window.addEventListener('storage', ({ key, newValue, oldValue }) => {\n            const handleCrossTabsStorageChange = () => {\n                this._resetExpireEventTimeoutAll();\n                this._emitEventsForCrossTabsStorageUpdate(newValue, oldValue);\n            };\n            // Skip if:\n            // not from localStorage.clear (event.key is null)\n            // event.key is not the storageKey\n            // oldValue === newValue\n            if (key && (key !== options.storageKey || newValue === oldValue)) {\n                return;\n            }\n            // LocalStorage cross tabs update is not synced in IE, set a 1s timer by default to read latest value\n            // https://stackoverflow.com/questions/24077117/localstorage-in-win8-1-ie11-does-not-synchronize\n            setTimeout(() => handleCrossTabsStorageChange(), options._storageEventDelay);\n        });\n    }\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n// Implements a queue for synchronous or asynchronous methods\n// Methods will be wrapped in a promise and execute sequentially\n// This can be used to prevent concurrent calls to a single method or a set of methods\nimport { isPromise } from './util';\nclass PromiseQueue {\n    constructor() {\n        this.queue = [];\n        this.running = false;\n    }\n    // Returns a promise\n    // If the method is synchronous, it will resolve when the method completes\n    // If the method returns a promise, it will resolve (or reject) with the value from the method's promise\n    push(method, thisObject, ...args) {\n        return new Promise((resolve, reject) => {\n            this.queue.push({\n                method,\n                thisObject,\n                args,\n                resolve,\n                reject\n            });\n            this.run();\n        });\n    }\n    run() {\n        if (this.running) {\n            return;\n        }\n        if (this.queue.length === 0) {\n            return;\n        }\n        this.running = true;\n        var queueItem = this.queue.shift();\n        var res = queueItem.method.apply(queueItem.thisObject, queueItem.args);\n        if (isPromise(res)) {\n            res.then(queueItem.resolve, queueItem.reject).finally(() => {\n                this.running = false;\n                this.run();\n            });\n        }\n        else {\n            queueItem.resolve(res);\n            this.running = false;\n            this.run();\n        }\n    }\n}\nexport default PromiseQueue;\n","import { AuthSdkError } from '../errors';\nimport { isFingerprintSupported } from './features';\nimport { addListener, removeListener } from '../oidc';\nexport default function fingerprint(sdk, options) {\n    options = options || {};\n    if (!isFingerprintSupported()) {\n        return Promise.reject(new AuthSdkError('Fingerprinting is not supported on this device'));\n    }\n    var timeout;\n    var iframe;\n    var listener;\n    var promise = new Promise(function (resolve, reject) {\n        iframe = document.createElement('iframe');\n        iframe.style.display = 'none';\n        // eslint-disable-next-line complexity\n        listener = function listener(e) {\n            if (!e || !e.data || e.origin !== sdk.getIssuerOrigin()) {\n                return;\n            }\n            try {\n                var msg = JSON.parse(e.data);\n            }\n            catch (err) {\n                // iframe messages should all be parsable\n                // skip not parsable messages come from other sources in same origin (browser extensions)\n                // TODO: add namespace flag in okta-core to distinguish messages that come from other sources\n                return;\n            }\n            if (!msg) {\n                return;\n            }\n            if (msg.type === 'FingerprintAvailable') {\n                return resolve(msg.fingerprint);\n            }\n            if (msg.type === 'FingerprintServiceReady') {\n                e.source.postMessage(JSON.stringify({\n                    type: 'GetFingerprint'\n                }), e.origin);\n            }\n        };\n        addListener(window, 'message', listener);\n        iframe.src = sdk.getIssuerOrigin() + '/auth/services/devicefingerprint';\n        document.body.appendChild(iframe);\n        timeout = setTimeout(function () {\n            reject(new AuthSdkError('Fingerprinting timed out'));\n        }, options.timeout || 15000);\n    });\n    return promise.finally(function () {\n        clearTimeout(timeout);\n        removeListener(window, 'message', listener);\n        if (document.body.contains(iframe)) {\n            iframe.parentElement.removeChild(iframe);\n        }\n    });\n}\n","import { AuthSdkError } from './errors';\nimport { getConsole, warn } from './util';\nimport { EVENT_ADDED, EVENT_REMOVED } from './TokenManager';\nconst PCancelable = require('p-cancelable');\nexport const DEFAULT_AUTH_STATE = {\n    isPending: true,\n    isAuthenticated: false,\n    idToken: null,\n    accessToken: null,\n    refreshToken: null,\n};\nconst DEFAULT_PENDING = {\n    updateAuthStatePromise: null,\n    canceledTimes: 0\n};\nconst EVENT_AUTH_STATE_CHANGE = 'authStateChange';\nconst MAX_PROMISE_CANCEL_TIMES = 10;\n// only compare first level of authState\nconst isSameAuthState = (prevState, state) => {\n    return prevState.isPending === state.isPending\n        && prevState.isAuthenticated === state.isAuthenticated\n        && JSON.stringify(prevState.idToken) === JSON.stringify(state.idToken)\n        && JSON.stringify(prevState.accessToken) === JSON.stringify(state.accessToken)\n        && prevState.error === state.error;\n};\nexport class AuthStateManager {\n    constructor(sdk) {\n        if (!sdk.emitter) {\n            throw new AuthSdkError('Emitter should be initialized before AuthStateManager');\n        }\n        this._sdk = sdk;\n        this._pending = Object.assign({}, DEFAULT_PENDING);\n        this._authState = Object.assign({}, DEFAULT_AUTH_STATE);\n        this._logOptions = {};\n        // Listen on tokenManager events to start updateState process\n        // \"added\" event is emitted in both add and renew process\n        // Only listen on \"added\" event to update auth state\n        sdk.tokenManager.on(EVENT_ADDED, (key, token) => {\n            this._setLogOptions({ event: EVENT_ADDED, key, token });\n            this.updateAuthState();\n        });\n        sdk.tokenManager.on(EVENT_REMOVED, (key, token) => {\n            this._setLogOptions({ event: EVENT_REMOVED, key, token });\n            this.updateAuthState();\n        });\n    }\n    _setLogOptions(options) {\n        this._logOptions = options;\n    }\n    getAuthState() {\n        return this._authState;\n    }\n    updateAuthState() {\n        if (!this._sdk.emitter.e\n            || !this._sdk.emitter.e[EVENT_AUTH_STATE_CHANGE]\n            || !this._sdk.emitter.e[EVENT_AUTH_STATE_CHANGE].length) {\n            warn('updateAuthState is an asynchronous method with no return, ' +\n                'please subscribe to the latest authState update with ' +\n                'authStateManager.subscribe(handler) method before calling updateAuthState.');\n        }\n        const { transformAuthState, devMode } = this._sdk.options;\n        const { autoRenew, autoRemove } = this._sdk.tokenManager._getOptions();\n        const log = (status) => {\n            const { event, key, token } = this._logOptions;\n            getConsole().group(`OKTA-AUTH-JS:updateAuthState: Event:${event} Status:${status}`);\n            getConsole().log(key, token);\n            getConsole().log('Current authState', this._authState);\n            getConsole().groupEnd();\n            // clear log options after logging\n            this._logOptions = {};\n        };\n        const emitAuthStateChange = (authState) => {\n            if (isSameAuthState(this._authState, authState)) {\n                devMode && log('unchanged');\n                return;\n            }\n            this._authState = authState;\n            // emit new authState object\n            this._sdk.emitter.emit(EVENT_AUTH_STATE_CHANGE, Object.assign({}, authState));\n            devMode && log('emitted');\n        };\n        const shouldEvaluateIsPending = () => (autoRenew || autoRemove);\n        if (this._pending.updateAuthStatePromise) {\n            if (this._pending.canceledTimes >= MAX_PROMISE_CANCEL_TIMES) {\n                // stop canceling then starting a new promise\n                // let existing promise finish to prevent running into loops\n                devMode && log('terminated');\n                return;\n            }\n            else {\n                this._pending.updateAuthStatePromise.cancel();\n            }\n        }\n        /* eslint-disable complexity */\n        const cancelablePromise = new PCancelable((resolve, _, onCancel) => {\n            onCancel.shouldReject = false;\n            onCancel(() => {\n                this._pending.updateAuthStatePromise = null;\n                this._pending.canceledTimes = this._pending.canceledTimes + 1;\n                devMode && log('canceled');\n            });\n            const emitAndResolve = (authState) => {\n                if (cancelablePromise.isCanceled) {\n                    resolve();\n                    return;\n                }\n                // emit event and clear pending states\n                emitAuthStateChange(authState);\n                this._pending = Object.assign({}, DEFAULT_PENDING);\n                resolve();\n            };\n            this._sdk.tokenManager.getTokens()\n                .then(({ accessToken, idToken, refreshToken }) => {\n                if (cancelablePromise.isCanceled) {\n                    resolve();\n                    return;\n                }\n                // evaluate isPending if any token is expired\n                // then wait for next renewed event to evaluate a new state with valid tokens\n                // isPending state should only apply to token driven evaluation\n                let isPending = false;\n                if (accessToken && this._sdk.tokenManager.hasExpired(accessToken)) {\n                    isPending = shouldEvaluateIsPending();\n                    // if autoRenew is pending, continue to use the expired token while renew is in process\n                    if (!isPending) {\n                        accessToken = null;\n                    }\n                }\n                if (idToken && this._sdk.tokenManager.hasExpired(idToken)) {\n                    isPending = shouldEvaluateIsPending();\n                    // if autoRenew is pending, continue to use the expired token while renew is in process\n                    if (!isPending) {\n                        idToken = null;\n                    }\n                }\n                const authState = {\n                    accessToken,\n                    idToken,\n                    refreshToken,\n                    isPending,\n                    isAuthenticated: !!(accessToken && idToken)\n                };\n                const promise = transformAuthState\n                    ? transformAuthState(this._sdk, authState)\n                    : Promise.resolve(authState);\n                promise\n                    .then(authState => emitAndResolve(authState))\n                    .catch(error => emitAndResolve({\n                    accessToken,\n                    idToken,\n                    refreshToken,\n                    isAuthenticated: false,\n                    isPending: false,\n                    error\n                }));\n            });\n        });\n        /* eslint-enable complexity */\n        this._pending.updateAuthStatePromise = cancelablePromise;\n    }\n    subscribe(handler) {\n        this._sdk.emitter.on(EVENT_AUTH_STATE_CHANGE, handler);\n    }\n    unsubscribe(handler) {\n        this._sdk.emitter.off(EVENT_AUTH_STATE_CHANGE, handler);\n    }\n}\n","/*!\n * Copyright (c) 2015-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n/* eslint-disable complexity */\n/* eslint-disable max-statements */\n/* SDK_VERSION is defined in webpack config */\n/* global SDK_VERSION */\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nvar __rest = (this && this.__rest) || function (s, e) {\n    var t = {};\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n        t[p] = s[p];\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                t[p[i]] = s[p[i]];\n        }\n    return t;\n};\nimport OktaAuthBase from '../OktaAuthBase';\nimport * as features from './features';\nimport fetchRequest from '../fetch/fetchRequest';\nimport browserStorage from './browserStorage';\nimport { toQueryString, toAbsoluteUrl, clone, warn, deprecate } from '../util';\nimport { getUserAgent } from '../builderUtil';\nimport { DEFAULT_MAX_CLOCK_SKEW, REFERRER_PATH_STORAGE_KEY } from '../constants';\nimport * as constants from '../constants';\nimport { closeSession, sessionExists, getSession, refreshSession, setCookieAndRedirect } from '../session';\nimport { getOAuthUrls, getWithoutPrompt, getWithPopup, getWithRedirect, isLoginRedirect, parseFromUrl, decodeToken, revokeToken, renewToken, renewTokens, renewTokensWithRefresh, getUserInfo, verifyToken, prepareTokenParams, exchangeCodeForTokens, isInteractionRequiredError, isInteractionRequired, } from '../oidc';\nimport { TokenManager } from '../TokenManager';\nimport http from '../http';\nimport PromiseQueue from '../PromiseQueue';\nimport fingerprint from './fingerprint';\nimport { postToTransaction } from '../tx';\nimport { AuthStateManager } from '../AuthStateManager';\nconst Emitter = require('tiny-emitter');\nfunction getCookieSettings(args = {}, isHTTPS) {\n    // Secure cookies will be automatically used on a HTTPS connection\n    // Non-secure cookies will be automatically used on a HTTP connection\n    // secure option can override the automatic behavior\n    var cookieSettings = args.cookies || {};\n    if (typeof cookieSettings.secure === 'undefined') {\n        cookieSettings.secure = isHTTPS;\n    }\n    if (typeof cookieSettings.sameSite === 'undefined') {\n        cookieSettings.sameSite = cookieSettings.secure ? 'none' : 'lax';\n    }\n    // If secure=true, but the connection is not HTTPS, set secure=false.\n    if (cookieSettings.secure && !isHTTPS) {\n        // eslint-disable-next-line no-console\n        warn('The current page is not being served with the HTTPS protocol.\\n' +\n            'For security reasons, we strongly recommend using HTTPS.\\n' +\n            'If you cannot use HTTPS, set \"cookies.secure\" option to false.');\n        cookieSettings.secure = false;\n    }\n    // Chrome >= 80 will block cookies with SameSite=None unless they are also Secure\n    // If sameSite=none, but the connection is not HTTPS, set sameSite=lax.\n    if (cookieSettings.sameSite === 'none' && !cookieSettings.secure) {\n        cookieSettings.sameSite = 'lax';\n    }\n    return cookieSettings;\n}\nclass OktaAuthBrowser extends OktaAuthBase {\n    constructor(args = {}) {\n        super(Object.assign({\n            httpRequestClient: fetchRequest,\n            storageUtil: args.storageUtil || browserStorage,\n            cookies: getCookieSettings(args, OktaAuthBrowser.features.isHTTPS()),\n            storageManager: Object.assign({\n                token: {\n                    storageTypes: [\n                        'localStorage',\n                        'sessionStorage',\n                        'cookie'\n                    ],\n                    useMultipleCookies: true\n                },\n                cache: {\n                    storageTypes: [\n                        'localStorage',\n                        'sessionStorage',\n                        'cookie'\n                    ]\n                },\n                transaction: {\n                    storageTypes: [\n                        'sessionStorage',\n                        'localStorage',\n                        'cookie'\n                    ]\n                }\n            }, args.storageManager)\n        }, args));\n        // Add shims for compatibility, these will be removed in next major version. OKTA-362589\n        Object.assign(this.options.storageUtil, {\n            getPKCEStorage: this.storageManager.getLegacyPKCEStorage.bind(this.storageManager),\n            getHttpCache: this.storageManager.getHttpCache.bind(this.storageManager),\n        });\n        this._pending = { handleLogin: false };\n        this.options = Object.assign(this.options, {\n            pkce: args.pkce === false ? false : true,\n            redirectUri: toAbsoluteUrl(args.redirectUri, window.location.origin), // allow relative URIs\n        });\n        this.userAgent = getUserAgent(args, `okta-auth-js/${SDK_VERSION}`);\n        // Digital clocks will drift over time, so the server\n        // can misalign with the time reported by the browser.\n        // The maxClockSkew allows relaxing the time-based\n        // validation of tokens (in seconds, not milliseconds).\n        // It currently defaults to 300, because 5 min is the\n        // default maximum tolerance allowed by Kerberos.\n        // (https://technet.microsoft.com/en-us/library/cc976357.aspx)\n        if (!args.maxClockSkew && args.maxClockSkew !== 0) {\n            this.options.maxClockSkew = DEFAULT_MAX_CLOCK_SKEW;\n        }\n        else {\n            this.options.maxClockSkew = args.maxClockSkew;\n        }\n        this.session = {\n            close: closeSession.bind(null, this),\n            exists: sessionExists.bind(null, this),\n            get: getSession.bind(null, this),\n            refresh: refreshSession.bind(null, this),\n            setCookieAndRedirect: setCookieAndRedirect.bind(null, this)\n        };\n        this._tokenQueue = new PromiseQueue();\n        this.token = {\n            prepareTokenParams: prepareTokenParams.bind(null, this),\n            exchangeCodeForTokens: exchangeCodeForTokens.bind(null, this),\n            getWithoutPrompt: getWithoutPrompt.bind(null, this),\n            getWithPopup: getWithPopup.bind(null, this),\n            getWithRedirect: getWithRedirect.bind(null, this),\n            parseFromUrl: parseFromUrl.bind(null, this),\n            decode: decodeToken,\n            revoke: revokeToken.bind(null, this),\n            renew: renewToken.bind(null, this),\n            renewTokensWithRefresh: renewTokensWithRefresh.bind(null, this),\n            renewTokens: renewTokens.bind(null, this),\n            getUserInfo: getUserInfo.bind(null, this),\n            verify: verifyToken.bind(null, this),\n            isLoginRedirect: isLoginRedirect.bind(null, this)\n        };\n        // Wrap all async token API methods using MethodQueue to avoid issues with concurrency\n        const syncMethods = ['decode', 'isLoginRedirect'];\n        Object.keys(this.token).forEach(key => {\n            if (syncMethods.indexOf(key) >= 0) { // sync methods should not be wrapped\n                return;\n            }\n            var method = this.token[key];\n            this.token[key] = PromiseQueue.prototype.push.bind(this._tokenQueue, method, null);\n        });\n        Object.assign(this.token.getWithRedirect, {\n            // This is exposed so we can set window.location in our tests\n            _setLocation: function (url) {\n                window.location = url;\n            }\n        });\n        Object.assign(this.token.parseFromUrl, {\n            // This is exposed so we can mock getting window.history in our tests\n            _getHistory: function () {\n                return window.history;\n            },\n            // This is exposed so we can mock getting window.location in our tests\n            _getLocation: function () {\n                return window.location;\n            },\n            // This is exposed so we can mock getting window.document in our tests\n            _getDocument: function () {\n                return window.document;\n            }\n        });\n        // Fingerprint API\n        this.fingerprint = fingerprint.bind(null, this);\n        this.emitter = new Emitter();\n        this.tokenManager = new TokenManager(this, args.tokenManager);\n        this.authStateManager = new AuthStateManager(this);\n    }\n    // ES6 module users can use named exports to access all symbols\n    // CommonJS module users (CDN) need all exports on this object\n    // Utility methods for interaction code flow\n    isInteractionRequired() {\n        return isInteractionRequired(this);\n    }\n    isInteractionRequiredError(error) {\n        return isInteractionRequiredError(error);\n    }\n    /**\n     * Alias method of signInWithCredentials\n     *\n     * @todo This method is deprecated. Remove it in 5.0\n     */\n    signIn(opts) {\n        if (this.features.isLocalhost()) {\n            deprecate('This method has been deprecated, please use signInWithCredentials() instead.');\n        }\n        return this.signInWithCredentials(opts);\n    }\n    signInWithCredentials(opts) {\n        opts = clone(opts || {});\n        const _postToTransaction = (options) => {\n            delete opts.sendFingerprint;\n            return postToTransaction(this, '/api/v1/authn', opts, options);\n        };\n        if (!opts.sendFingerprint) {\n            return _postToTransaction();\n        }\n        return this.fingerprint()\n            .then(function (fingerprint) {\n            return _postToTransaction({\n                headers: {\n                    'X-Device-Fingerprint': fingerprint\n                }\n            });\n        });\n    }\n    signInWithRedirect(opts = {}) {\n        return __awaiter(this, void 0, void 0, function* () {\n            const { originalUri } = opts, additionalParams = __rest(opts, [\"originalUri\"]);\n            if (this._pending.handleLogin) {\n                // Don't trigger second round\n                return;\n            }\n            this._pending.handleLogin = true;\n            try {\n                // Trigger default signIn redirect flow\n                if (originalUri) {\n                    this.setOriginalUri(originalUri);\n                }\n                const params = Object.assign({\n                    // TODO: remove this line when default scopes are changed OKTA-343294\n                    scopes: this.options.scopes || ['openid', 'email', 'profile']\n                }, additionalParams);\n                yield this.token.getWithRedirect(params);\n            }\n            finally {\n                this._pending.handleLogin = false;\n            }\n        });\n    }\n    // Ends the current Okta SSO session without redirecting to Okta.\n    closeSession() {\n        // Clear all local tokens\n        this.tokenManager.clear();\n        return this.session.close() // DELETE /api/v1/sessions/me\n            .catch(function (e) {\n            if (e.name === 'AuthApiError' && e.errorCode === 'E0000007') {\n                // Session does not exist or has already been closed\n                return null;\n            }\n            throw e;\n        });\n    }\n    // Revokes the access token for the application session\n    revokeAccessToken(accessToken) {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!accessToken) {\n                accessToken = (yield this.tokenManager.getTokens()).accessToken;\n                const accessTokenKey = this.tokenManager._getStorageKeyByType('accessToken');\n                this.tokenManager.remove(accessTokenKey);\n            }\n            // Access token may have been removed. In this case, we will silently succeed.\n            if (!accessToken) {\n                return Promise.resolve(null);\n            }\n            return this.token.revoke(accessToken);\n        });\n    }\n    // Revokes the refresh token for the application session\n    revokeRefreshToken(refreshToken) {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!refreshToken) {\n                refreshToken = (yield this.tokenManager.getTokens()).refreshToken;\n                const refreshTokenKey = this.tokenManager._getStorageKeyByType('refreshToken');\n                this.tokenManager.remove(refreshTokenKey);\n            }\n            // Refresh token may have been removed. In this case, we will silently succeed.\n            if (!refreshToken) {\n                return Promise.resolve(null);\n            }\n            return this.token.revoke(refreshToken);\n        });\n    }\n    // Revokes refreshToken or accessToken, clears all local tokens, then redirects to Okta to end the SSO session.\n    signOut(options) {\n        return __awaiter(this, void 0, void 0, function* () {\n            options = Object.assign({}, options);\n            // postLogoutRedirectUri must be whitelisted in Okta Admin UI\n            var defaultUri = window.location.origin;\n            var currentUri = window.location.href;\n            var postLogoutRedirectUri = options.postLogoutRedirectUri\n                || this.options.postLogoutRedirectUri\n                || defaultUri;\n            var accessToken = options.accessToken;\n            var refreshToken = options.refreshToken;\n            var revokeAccessToken = options.revokeAccessToken !== false;\n            var revokeRefreshToken = options.revokeRefreshToken !== false;\n            var idToken = options.idToken;\n            var logoutUrl = getOAuthUrls(this).logoutUrl;\n            if (typeof idToken === 'undefined') {\n                idToken = (yield this.tokenManager.getTokens()).idToken;\n            }\n            if (revokeRefreshToken && typeof refreshToken === 'undefined') {\n                refreshToken = (yield this.tokenManager.getTokens()).refreshToken;\n            }\n            if (revokeAccessToken && typeof accessToken === 'undefined') {\n                accessToken = (yield this.tokenManager.getTokens()).accessToken;\n            }\n            // Clear all local tokens\n            this.tokenManager.clear();\n            if (revokeRefreshToken && refreshToken) {\n                yield this.revokeRefreshToken(refreshToken);\n            }\n            if (revokeAccessToken && accessToken) {\n                yield this.revokeAccessToken(accessToken);\n            }\n            // No idToken? This can happen if the storage was cleared.\n            // Fallback to XHR signOut, then simulate a redirect to the post logout uri\n            if (!idToken) {\n                return this.closeSession() // can throw if the user cannot be signed out\n                    .then(function () {\n                    if (postLogoutRedirectUri === currentUri) {\n                        window.location.reload(); // force a hard reload if URI is not changing\n                    }\n                    else {\n                        window.location.assign(postLogoutRedirectUri);\n                    }\n                });\n            }\n            // logout redirect using the idToken.\n            var state = options.state;\n            var idTokenHint = idToken.idToken; // a string\n            var logoutUri = logoutUrl + '?id_token_hint=' + encodeURIComponent(idTokenHint) +\n                '&post_logout_redirect_uri=' + encodeURIComponent(postLogoutRedirectUri);\n            // State allows option parameters to be passed to logout redirect uri\n            if (state) {\n                logoutUri += '&state=' + encodeURIComponent(state);\n            }\n            window.location.assign(logoutUri);\n        });\n    }\n    webfinger(opts) {\n        var url = '/.well-known/webfinger' + toQueryString(opts);\n        var options = {\n            headers: {\n                'Accept': 'application/jrd+json'\n            }\n        };\n        return http.get(this, url, options);\n    }\n    //\n    // Common Methods from downstream SDKs\n    //\n    isAuthenticated(timeout) {\n        return __awaiter(this, void 0, void 0, function* () {\n            const authState = this.authStateManager.getAuthState();\n            if (!authState.isPending) {\n                return Promise.resolve(authState.isAuthenticated);\n            }\n            let clear, handler, timeoutId;\n            return new Promise(resolve => {\n                clear = () => {\n                    this.authStateManager.unsubscribe(handler);\n                    clearTimeout(timeoutId);\n                };\n                handler = ({ isAuthenticated, isPending }) => {\n                    if (!isPending) {\n                        resolve(isAuthenticated);\n                        clear();\n                    }\n                };\n                timeoutId = setTimeout(() => {\n                    resolve(false);\n                    clear();\n                }, timeout || 60 * 1000);\n                this.authStateManager.subscribe(handler);\n                this.authStateManager.updateAuthState();\n            });\n        });\n    }\n    getUser() {\n        return __awaiter(this, void 0, void 0, function* () {\n            const { idToken, accessToken } = this.authStateManager.getAuthState();\n            return this.token.getUserInfo(accessToken, idToken);\n        });\n    }\n    getIdToken() {\n        const { idToken } = this.authStateManager.getAuthState();\n        return idToken ? idToken.idToken : undefined;\n    }\n    getAccessToken() {\n        const { accessToken } = this.authStateManager.getAuthState();\n        return accessToken ? accessToken.accessToken : undefined;\n    }\n    getRefreshToken() {\n        const { refreshToken } = this.authStateManager.getAuthState();\n        return refreshToken ? refreshToken.refreshToken : undefined;\n    }\n    /**\n     * Store parsed tokens from redirect url\n     */\n    storeTokensFromRedirect() {\n        return __awaiter(this, void 0, void 0, function* () {\n            const { tokens } = yield this.token.parseFromUrl();\n            this.tokenManager.setTokens(tokens);\n        });\n    }\n    setOriginalUri(originalUri) {\n        // Use current location if originalUri was not passed\n        originalUri = originalUri || window.location.href;\n        // Store originalUri\n        const storage = browserStorage.getSessionStorage();\n        storage.setItem(REFERRER_PATH_STORAGE_KEY, originalUri);\n    }\n    getOriginalUri() {\n        const storage = browserStorage.getSessionStorage();\n        const originalUri = storage.getItem(REFERRER_PATH_STORAGE_KEY) || window.location.origin;\n        return originalUri;\n    }\n    removeOriginalUri() {\n        const storage = browserStorage.getSessionStorage();\n        storage.removeItem(REFERRER_PATH_STORAGE_KEY);\n    }\n    isLoginRedirect() {\n        return isLoginRedirect(this);\n    }\n    handleLoginRedirect(tokens) {\n        return __awaiter(this, void 0, void 0, function* () {\n            const handleRedirect = ({ isPending }) => __awaiter(this, void 0, void 0, function* () {\n                if (isPending) {\n                    return;\n                }\n                // Unsubscribe listener\n                this.authStateManager.unsubscribe(handleRedirect);\n                // Get and clear originalUri from storage\n                const originalUri = this.getOriginalUri();\n                this.removeOriginalUri();\n                // Redirect to originalUri\n                const { restoreOriginalUri } = this.options;\n                if (restoreOriginalUri) {\n                    yield restoreOriginalUri(this, originalUri);\n                }\n                else {\n                    window.location.replace(originalUri);\n                }\n            });\n            // Handle redirect after authState is updated \n            this.authStateManager.subscribe(handleRedirect);\n            // Store tokens and update AuthState by the emitted events\n            if (tokens) {\n                this.tokenManager.setTokens(tokens);\n            }\n            else if (this.isLoginRedirect()) {\n                try {\n                    yield this.storeTokensFromRedirect();\n                }\n                catch (e) {\n                    this.authStateManager.unsubscribe(handleRedirect);\n                    throw e;\n                }\n            }\n            else {\n                this.authStateManager.unsubscribe(handleRedirect);\n            }\n        });\n    }\n    isPKCE() {\n        return !!this.options.pkce;\n    }\n    hasResponseType(responseType) {\n        let hasResponseType = false;\n        if (Array.isArray(this.options.responseType) && this.options.responseType.length) {\n            hasResponseType = this.options.responseType.indexOf(responseType) >= 0;\n        }\n        else {\n            hasResponseType = this.options.responseType === responseType;\n        }\n        return hasResponseType;\n    }\n    isAuthorizationCodeFlow() {\n        return this.hasResponseType('code');\n    }\n}\n// Hoist feature detection functions to static type\nOktaAuthBrowser.features = OktaAuthBrowser.prototype.features = features;\n// Also hoist values and utility functions for CommonJS users\nObject.assign(OktaAuthBrowser, {\n    constants,\n    isInteractionRequiredError\n});\nexport default OktaAuthBrowser;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.jwtDecode = exports.InvalidTokenError = void 0;\nclass InvalidTokenError extends Error {\n}\nexports.InvalidTokenError = InvalidTokenError;\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\nfunction b64DecodeUnicode(str) {\n    return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {\n        let code = p.charCodeAt(0).toString(16).toUpperCase();\n        if (code.length < 2) {\n            code = \"0\" + code;\n        }\n        return \"%\" + code;\n    }));\n}\nfunction base64UrlDecode(str) {\n    let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n    switch (output.length % 4) {\n        case 0:\n            break;\n        case 2:\n            output += \"==\";\n            break;\n        case 3:\n            output += \"=\";\n            break;\n        default:\n            throw new Error(\"base64 string is not of the correct length\");\n    }\n    try {\n        return b64DecodeUnicode(output);\n    }\n    catch (err) {\n        return atob(output);\n    }\n}\nfunction jwtDecode(token, options) {\n    if (typeof token !== \"string\") {\n        throw new InvalidTokenError(\"Invalid token specified: must be a string\");\n    }\n    options || (options = {});\n    const pos = options.header === true ? 0 : 1;\n    const part = token.split(\".\")[pos];\n    if (typeof part !== \"string\") {\n        throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);\n    }\n    let decoded;\n    try {\n        decoded = base64UrlDecode(part);\n    }\n    catch (e) {\n        throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);\n    }\n    try {\n        return JSON.parse(decoded);\n    }\n    catch (e) {\n        throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);\n    }\n}\nexports.jwtDecode = jwtDecode;\n","/*!\n * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com\n * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)\n * Copyright 2024 Fonticons, Inc.\n */\nfunction _defineProperty(e, r, t) {\n  return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n    value: t,\n    enumerable: !0,\n    configurable: !0,\n    writable: !0\n  }) : e[r] = t, e;\n}\nfunction _inherits(t, e) {\n  if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\");\n  t.prototype = Object.create(e && e.prototype, {\n    constructor: {\n      value: t,\n      writable: !0,\n      configurable: !0\n    }\n  }), Object.defineProperty(t, \"prototype\", {\n    writable: !1\n  }), e && _setPrototypeOf(t, e);\n}\nfunction ownKeys(e, r) {\n  var t = Object.keys(e);\n  if (Object.getOwnPropertySymbols) {\n    var o = Object.getOwnPropertySymbols(e);\n    r && (o = o.filter(function (r) {\n      return Object.getOwnPropertyDescriptor(e, r).enumerable;\n    })), t.push.apply(t, o);\n  }\n  return t;\n}\nfunction _objectSpread2(e) {\n  for (var r = 1; r < arguments.length; r++) {\n    var t = null != arguments[r] ? arguments[r] : {};\n    r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n      _defineProperty(e, r, t[r]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n      Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n    });\n  }\n  return e;\n}\nfunction _setPrototypeOf(t, e) {\n  return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n    return t.__proto__ = e, t;\n  }, _setPrototypeOf(t, e);\n}\nfunction _toPrimitive(t, r) {\n  if (\"object\" != typeof t || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r || \"default\");\n    if (\"object\" != typeof i) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n  var i = _toPrimitive(t, \"string\");\n  return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _wrapRegExp() {\n  _wrapRegExp = function (e, r) {\n    return new BabelRegExp(e, void 0, r);\n  };\n  var e = RegExp.prototype,\n    r = new WeakMap();\n  function BabelRegExp(e, t, p) {\n    var o = RegExp(e, t);\n    return r.set(o, p || r.get(e)), _setPrototypeOf(o, BabelRegExp.prototype);\n  }\n  function buildGroups(e, t) {\n    var p = r.get(t);\n    return Object.keys(p).reduce(function (r, t) {\n      var o = p[t];\n      if (\"number\" == typeof o) r[t] = e[o];else {\n        for (var i = 0; void 0 === e[o[i]] && i + 1 < o.length;) i++;\n        r[t] = e[o[i]];\n      }\n      return r;\n    }, Object.create(null));\n  }\n  return _inherits(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (r) {\n    var t = e.exec.call(this, r);\n    if (t) {\n      t.groups = buildGroups(t, this);\n      var p = t.indices;\n      p && (p.groups = buildGroups(p, this));\n    }\n    return t;\n  }, BabelRegExp.prototype[Symbol.replace] = function (t, p) {\n    if (\"string\" == typeof p) {\n      var o = r.get(this);\n      return e[Symbol.replace].call(this, t, p.replace(/\\$<([^>]+)>/g, function (e, r) {\n        var t = o[r];\n        return \"$\" + (Array.isArray(t) ? t.join(\"$\") : t);\n      }));\n    }\n    if (\"function\" == typeof p) {\n      var i = this;\n      return e[Symbol.replace].call(this, t, function () {\n        var e = arguments;\n        return \"object\" != typeof e[e.length - 1] && (e = [].slice.call(e)).push(buildGroups(e, i)), p.apply(this, e);\n      });\n    }\n    return e[Symbol.replace].call(this, t, p);\n  }, _wrapRegExp.apply(this, arguments);\n}\n\nconst noop = () => {};\nlet _WINDOW = {};\nlet _DOCUMENT = {};\nlet _MUTATION_OBSERVER = null;\nlet _PERFORMANCE = {\n  mark: noop,\n  measure: noop\n};\ntry {\n  if (typeof window !== 'undefined') _WINDOW = window;\n  if (typeof document !== 'undefined') _DOCUMENT = document;\n  if (typeof MutationObserver !== 'undefined') _MUTATION_OBSERVER = MutationObserver;\n  if (typeof performance !== 'undefined') _PERFORMANCE = performance;\n} catch (e) {}\nconst {\n  userAgent = ''\n} = _WINDOW.navigator || {};\nconst WINDOW = _WINDOW;\nconst DOCUMENT = _DOCUMENT;\nconst MUTATION_OBSERVER = _MUTATION_OBSERVER;\nconst PERFORMANCE = _PERFORMANCE;\nconst IS_BROWSER = !!WINDOW.document;\nconst IS_DOM = !!DOCUMENT.documentElement && !!DOCUMENT.head && typeof DOCUMENT.addEventListener === 'function' && typeof DOCUMENT.createElement === 'function';\nconst IS_IE = ~userAgent.indexOf('MSIE') || ~userAgent.indexOf('Trident/');\n\nvar p = /fa(s|r|l|t|d|dr|dl|dt|b|k|kd|ss|sr|sl|st|sds|sdr|sdl|sdt)?[\\-\\ ]/,\n  g = /Font ?Awesome ?([56 ]*)(Solid|Regular|Light|Thin|Duotone|Brands|Free|Pro|Sharp Duotone|Sharp|Kit)?.*/i;\nvar S = {\n    classic: {\n      fa: \"solid\",\n      fas: \"solid\",\n      \"fa-solid\": \"solid\",\n      far: \"regular\",\n      \"fa-regular\": \"regular\",\n      fal: \"light\",\n      \"fa-light\": \"light\",\n      fat: \"thin\",\n      \"fa-thin\": \"thin\",\n      fab: \"brands\",\n      \"fa-brands\": \"brands\"\n    },\n    duotone: {\n      fa: \"solid\",\n      fad: \"solid\",\n      \"fa-solid\": \"solid\",\n      \"fa-duotone\": \"solid\",\n      fadr: \"regular\",\n      \"fa-regular\": \"regular\",\n      fadl: \"light\",\n      \"fa-light\": \"light\",\n      fadt: \"thin\",\n      \"fa-thin\": \"thin\"\n    },\n    sharp: {\n      fa: \"solid\",\n      fass: \"solid\",\n      \"fa-solid\": \"solid\",\n      fasr: \"regular\",\n      \"fa-regular\": \"regular\",\n      fasl: \"light\",\n      \"fa-light\": \"light\",\n      fast: \"thin\",\n      \"fa-thin\": \"thin\"\n    },\n    \"sharp-duotone\": {\n      fa: \"solid\",\n      fasds: \"solid\",\n      \"fa-solid\": \"solid\",\n      fasdr: \"regular\",\n      \"fa-regular\": \"regular\",\n      fasdl: \"light\",\n      \"fa-light\": \"light\",\n      fasdt: \"thin\",\n      \"fa-thin\": \"thin\"\n    }\n  },\n  A = {\n    GROUP: \"duotone-group\",\n    SWAP_OPACITY: \"swap-opacity\",\n    PRIMARY: \"primary\",\n    SECONDARY: \"secondary\"\n  },\n  P = [\"fa-classic\", \"fa-duotone\", \"fa-sharp\", \"fa-sharp-duotone\"];\nvar s = \"classic\",\n  t = \"duotone\",\n  r = \"sharp\",\n  o = \"sharp-duotone\",\n  L = [s, t, r, o];\nvar G = {\n    classic: {\n      900: \"fas\",\n      400: \"far\",\n      normal: \"far\",\n      300: \"fal\",\n      100: \"fat\"\n    },\n    duotone: {\n      900: \"fad\",\n      400: \"fadr\",\n      300: \"fadl\",\n      100: \"fadt\"\n    },\n    sharp: {\n      900: \"fass\",\n      400: \"fasr\",\n      300: \"fasl\",\n      100: \"fast\"\n    },\n    \"sharp-duotone\": {\n      900: \"fasds\",\n      400: \"fasdr\",\n      300: \"fasdl\",\n      100: \"fasdt\"\n    }\n  };\nvar lt = {\n    \"Font Awesome 6 Free\": {\n      900: \"fas\",\n      400: \"far\"\n    },\n    \"Font Awesome 6 Pro\": {\n      900: \"fas\",\n      400: \"far\",\n      normal: \"far\",\n      300: \"fal\",\n      100: \"fat\"\n    },\n    \"Font Awesome 6 Brands\": {\n      400: \"fab\",\n      normal: \"fab\"\n    },\n    \"Font Awesome 6 Duotone\": {\n      900: \"fad\",\n      400: \"fadr\",\n      normal: \"fadr\",\n      300: \"fadl\",\n      100: \"fadt\"\n    },\n    \"Font Awesome 6 Sharp\": {\n      900: \"fass\",\n      400: \"fasr\",\n      normal: \"fasr\",\n      300: \"fasl\",\n      100: \"fast\"\n    },\n    \"Font Awesome 6 Sharp Duotone\": {\n      900: \"fasds\",\n      400: \"fasdr\",\n      normal: \"fasdr\",\n      300: \"fasdl\",\n      100: \"fasdt\"\n    }\n  };\nvar pt = new Map([[\"classic\", {\n    defaultShortPrefixId: \"fas\",\n    defaultStyleId: \"solid\",\n    styleIds: [\"solid\", \"regular\", \"light\", \"thin\", \"brands\"],\n    futureStyleIds: [],\n    defaultFontWeight: 900\n  }], [\"sharp\", {\n    defaultShortPrefixId: \"fass\",\n    defaultStyleId: \"solid\",\n    styleIds: [\"solid\", \"regular\", \"light\", \"thin\"],\n    futureStyleIds: [],\n    defaultFontWeight: 900\n  }], [\"duotone\", {\n    defaultShortPrefixId: \"fad\",\n    defaultStyleId: \"solid\",\n    styleIds: [\"solid\", \"regular\", \"light\", \"thin\"],\n    futureStyleIds: [],\n    defaultFontWeight: 900\n  }], [\"sharp-duotone\", {\n    defaultShortPrefixId: \"fasds\",\n    defaultStyleId: \"solid\",\n    styleIds: [\"solid\", \"regular\", \"light\", \"thin\"],\n    futureStyleIds: [],\n    defaultFontWeight: 900\n  }]]),\n  xt = {\n    classic: {\n      solid: \"fas\",\n      regular: \"far\",\n      light: \"fal\",\n      thin: \"fat\",\n      brands: \"fab\"\n    },\n    duotone: {\n      solid: \"fad\",\n      regular: \"fadr\",\n      light: \"fadl\",\n      thin: \"fadt\"\n    },\n    sharp: {\n      solid: \"fass\",\n      regular: \"fasr\",\n      light: \"fasl\",\n      thin: \"fast\"\n    },\n    \"sharp-duotone\": {\n      solid: \"fasds\",\n      regular: \"fasdr\",\n      light: \"fasdl\",\n      thin: \"fasdt\"\n    }\n  };\nvar Ft = [\"fak\", \"fa-kit\", \"fakd\", \"fa-kit-duotone\"],\n  St = {\n    kit: {\n      fak: \"kit\",\n      \"fa-kit\": \"kit\"\n    },\n    \"kit-duotone\": {\n      fakd: \"kit-duotone\",\n      \"fa-kit-duotone\": \"kit-duotone\"\n    }\n  },\n  At = [\"kit\"];\nvar Ct = {\n  kit: {\n    \"fa-kit\": \"fak\"\n  },\n  \"kit-duotone\": {\n    \"fa-kit-duotone\": \"fakd\"\n  }\n};\nvar Lt = [\"fak\", \"fakd\"],\n  Wt = {\n    kit: {\n      fak: \"fa-kit\"\n    },\n    \"kit-duotone\": {\n      fakd: \"fa-kit-duotone\"\n    }\n  };\nvar Et = {\n    kit: {\n      kit: \"fak\"\n    },\n    \"kit-duotone\": {\n      \"kit-duotone\": \"fakd\"\n    }\n  };\n\nvar t$1 = {\n    GROUP: \"duotone-group\",\n    SWAP_OPACITY: \"swap-opacity\",\n    PRIMARY: \"primary\",\n    SECONDARY: \"secondary\"\n  },\n  r$1 = [\"fa-classic\", \"fa-duotone\", \"fa-sharp\", \"fa-sharp-duotone\"];\nvar bt$1 = [\"fak\", \"fa-kit\", \"fakd\", \"fa-kit-duotone\"];\nvar Yt = {\n    \"Font Awesome Kit\": {\n      400: \"fak\",\n      normal: \"fak\"\n    },\n    \"Font Awesome Kit Duotone\": {\n      400: \"fakd\",\n      normal: \"fakd\"\n    }\n  };\nvar ua = {\n    classic: {\n      \"fa-brands\": \"fab\",\n      \"fa-duotone\": \"fad\",\n      \"fa-light\": \"fal\",\n      \"fa-regular\": \"far\",\n      \"fa-solid\": \"fas\",\n      \"fa-thin\": \"fat\"\n    },\n    duotone: {\n      \"fa-regular\": \"fadr\",\n      \"fa-light\": \"fadl\",\n      \"fa-thin\": \"fadt\"\n    },\n    sharp: {\n      \"fa-solid\": \"fass\",\n      \"fa-regular\": \"fasr\",\n      \"fa-light\": \"fasl\",\n      \"fa-thin\": \"fast\"\n    },\n    \"sharp-duotone\": {\n      \"fa-solid\": \"fasds\",\n      \"fa-regular\": \"fasdr\",\n      \"fa-light\": \"fasdl\",\n      \"fa-thin\": \"fasdt\"\n    }\n  },\n  I$1 = {\n    classic: [\"fas\", \"far\", \"fal\", \"fat\", \"fad\"],\n    duotone: [\"fadr\", \"fadl\", \"fadt\"],\n    sharp: [\"fass\", \"fasr\", \"fasl\", \"fast\"],\n    \"sharp-duotone\": [\"fasds\", \"fasdr\", \"fasdl\", \"fasdt\"]\n  },\n  ga = {\n    classic: {\n      fab: \"fa-brands\",\n      fad: \"fa-duotone\",\n      fal: \"fa-light\",\n      far: \"fa-regular\",\n      fas: \"fa-solid\",\n      fat: \"fa-thin\"\n    },\n    duotone: {\n      fadr: \"fa-regular\",\n      fadl: \"fa-light\",\n      fadt: \"fa-thin\"\n    },\n    sharp: {\n      fass: \"fa-solid\",\n      fasr: \"fa-regular\",\n      fasl: \"fa-light\",\n      fast: \"fa-thin\"\n    },\n    \"sharp-duotone\": {\n      fasds: \"fa-solid\",\n      fasdr: \"fa-regular\",\n      fasdl: \"fa-light\",\n      fasdt: \"fa-thin\"\n    }\n  },\n  x = [\"fa-solid\", \"fa-regular\", \"fa-light\", \"fa-thin\", \"fa-duotone\", \"fa-brands\"],\n  Ia = [\"fa\", \"fas\", \"far\", \"fal\", \"fat\", \"fad\", \"fadr\", \"fadl\", \"fadt\", \"fab\", \"fass\", \"fasr\", \"fasl\", \"fast\", \"fasds\", \"fasdr\", \"fasdl\", \"fasdt\", ...r$1, ...x],\n  m$1 = [\"solid\", \"regular\", \"light\", \"thin\", \"duotone\", \"brands\"],\n  c$1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],\n  F$1 = c$1.concat([11, 12, 13, 14, 15, 16, 17, 18, 19, 20]),\n  ma = [...Object.keys(I$1), ...m$1, \"2xs\", \"xs\", \"sm\", \"lg\", \"xl\", \"2xl\", \"beat\", \"border\", \"fade\", \"beat-fade\", \"bounce\", \"flip-both\", \"flip-horizontal\", \"flip-vertical\", \"flip\", \"fw\", \"inverse\", \"layers-counter\", \"layers-text\", \"layers\", \"li\", \"pull-left\", \"pull-right\", \"pulse\", \"rotate-180\", \"rotate-270\", \"rotate-90\", \"rotate-by\", \"shake\", \"spin-pulse\", \"spin-reverse\", \"spin\", \"stack-1x\", \"stack-2x\", \"stack\", \"ul\", t$1.GROUP, t$1.SWAP_OPACITY, t$1.PRIMARY, t$1.SECONDARY].concat(c$1.map(a => \"\".concat(a, \"x\"))).concat(F$1.map(a => \"w-\".concat(a)));\nvar wa = {\n    \"Font Awesome 5 Free\": {\n      900: \"fas\",\n      400: \"far\"\n    },\n    \"Font Awesome 5 Pro\": {\n      900: \"fas\",\n      400: \"far\",\n      normal: \"far\",\n      300: \"fal\"\n    },\n    \"Font Awesome 5 Brands\": {\n      400: \"fab\",\n      normal: \"fab\"\n    },\n    \"Font Awesome 5 Duotone\": {\n      900: \"fad\"\n    }\n  };\n\nconst NAMESPACE_IDENTIFIER = '___FONT_AWESOME___';\nconst UNITS_IN_GRID = 16;\nconst DEFAULT_CSS_PREFIX = 'fa';\nconst DEFAULT_REPLACEMENT_CLASS = 'svg-inline--fa';\nconst DATA_FA_I2SVG = 'data-fa-i2svg';\nconst DATA_FA_PSEUDO_ELEMENT = 'data-fa-pseudo-element';\nconst DATA_FA_PSEUDO_ELEMENT_PENDING = 'data-fa-pseudo-element-pending';\nconst DATA_PREFIX = 'data-prefix';\nconst DATA_ICON = 'data-icon';\nconst HTML_CLASS_I2SVG_BASE_CLASS = 'fontawesome-i2svg';\nconst MUTATION_APPROACH_ASYNC = 'async';\nconst TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS = ['HTML', 'HEAD', 'STYLE', 'SCRIPT'];\nconst PRODUCTION = (() => {\n  try {\n    return process.env.NODE_ENV === 'production';\n  } catch (e$$1) {\n    return false;\n  }\n})();\nfunction familyProxy(obj) {\n  // Defaults to the classic family if family is not available\n  return new Proxy(obj, {\n    get(target, prop) {\n      return prop in target ? target[prop] : target[s];\n    }\n  });\n}\nconst _PREFIX_TO_STYLE = _objectSpread2({}, S);\n\n// We changed FACSSClassesToStyleId in the icons repo to be canonical and as such, \"classic\" family does not have any\n// duotone styles.  But we do still need duotone in _PREFIX_TO_STYLE below, so we are manually adding\n// {'fa-duotone': 'duotone'}\n_PREFIX_TO_STYLE[s] = _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, {\n  'fa-duotone': 'duotone'\n}), S[s]), St['kit']), St['kit-duotone']);\nconst PREFIX_TO_STYLE = familyProxy(_PREFIX_TO_STYLE);\nconst _STYLE_TO_PREFIX = _objectSpread2({}, xt);\n\n// We changed FAStyleIdToShortPrefixId in the icons repo to be canonical and as such, \"classic\" family does not have any\n// duotone styles.  But we do still need duotone in _STYLE_TO_PREFIX below, so we are manually adding {duotone: 'fad'}\n_STYLE_TO_PREFIX[s] = _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, {\n  duotone: 'fad'\n}), _STYLE_TO_PREFIX[s]), Et['kit']), Et['kit-duotone']);\nconst STYLE_TO_PREFIX = familyProxy(_STYLE_TO_PREFIX);\nconst _PREFIX_TO_LONG_STYLE = _objectSpread2({}, ga);\n_PREFIX_TO_LONG_STYLE[s] = _objectSpread2(_objectSpread2({}, _PREFIX_TO_LONG_STYLE[s]), Wt['kit']);\nconst PREFIX_TO_LONG_STYLE = familyProxy(_PREFIX_TO_LONG_STYLE);\nconst _LONG_STYLE_TO_PREFIX = _objectSpread2({}, ua);\n_LONG_STYLE_TO_PREFIX[s] = _objectSpread2(_objectSpread2({}, _LONG_STYLE_TO_PREFIX[s]), Ct['kit']);\nconst LONG_STYLE_TO_PREFIX = familyProxy(_LONG_STYLE_TO_PREFIX);\nconst ICON_SELECTION_SYNTAX_PATTERN = p; // eslint-disable-line no-useless-escape\n\nconst LAYERS_TEXT_CLASSNAME = 'fa-layers-text';\nconst FONT_FAMILY_PATTERN = g;\nconst _FONT_WEIGHT_TO_PREFIX = _objectSpread2({}, G);\nconst FONT_WEIGHT_TO_PREFIX = familyProxy(_FONT_WEIGHT_TO_PREFIX);\nconst ATTRIBUTES_WATCHED_FOR_MUTATION = ['class', 'data-prefix', 'data-icon', 'data-fa-transform', 'data-fa-mask'];\nconst DUOTONE_CLASSES = A;\nconst RESERVED_CLASSES = [...At, ...ma];\n\nconst initial = WINDOW.FontAwesomeConfig || {};\nfunction getAttrConfig(attr) {\n  var element = DOCUMENT.querySelector('script[' + attr + ']');\n  if (element) {\n    return element.getAttribute(attr);\n  }\n}\nfunction coerce(val) {\n  // Getting an empty string will occur if the attribute is set on the HTML tag but without a value\n  // We'll assume that this is an indication that it should be toggled to true\n  if (val === '') return true;\n  if (val === 'false') return false;\n  if (val === 'true') return true;\n  return val;\n}\nif (DOCUMENT && typeof DOCUMENT.querySelector === 'function') {\n  const attrs = [['data-family-prefix', 'familyPrefix'], ['data-css-prefix', 'cssPrefix'], ['data-family-default', 'familyDefault'], ['data-style-default', 'styleDefault'], ['data-replacement-class', 'replacementClass'], ['data-auto-replace-svg', 'autoReplaceSvg'], ['data-auto-add-css', 'autoAddCss'], ['data-auto-a11y', 'autoA11y'], ['data-search-pseudo-elements', 'searchPseudoElements'], ['data-observe-mutations', 'observeMutations'], ['data-mutate-approach', 'mutateApproach'], ['data-keep-original-source', 'keepOriginalSource'], ['data-measure-performance', 'measurePerformance'], ['data-show-missing-icons', 'showMissingIcons']];\n  attrs.forEach(_ref => {\n    let [attr, key] = _ref;\n    const val = coerce(getAttrConfig(attr));\n    if (val !== undefined && val !== null) {\n      initial[key] = val;\n    }\n  });\n}\nconst _default = {\n  styleDefault: 'solid',\n  familyDefault: s,\n  cssPrefix: DEFAULT_CSS_PREFIX,\n  replacementClass: DEFAULT_REPLACEMENT_CLASS,\n  autoReplaceSvg: true,\n  autoAddCss: true,\n  autoA11y: true,\n  searchPseudoElements: false,\n  observeMutations: true,\n  mutateApproach: 'async',\n  keepOriginalSource: true,\n  measurePerformance: false,\n  showMissingIcons: true\n};\n\n// familyPrefix is deprecated but we must still support it if present\nif (initial.familyPrefix) {\n  initial.cssPrefix = initial.familyPrefix;\n}\nconst _config = _objectSpread2(_objectSpread2({}, _default), initial);\nif (!_config.autoReplaceSvg) _config.observeMutations = false;\nconst config = {};\nObject.keys(_default).forEach(key => {\n  Object.defineProperty(config, key, {\n    enumerable: true,\n    set: function (val) {\n      _config[key] = val;\n      _onChangeCb.forEach(cb => cb(config));\n    },\n    get: function () {\n      return _config[key];\n    }\n  });\n});\n\n// familyPrefix is deprecated as of 6.2.0 and should be removed in 7.0.0\nObject.defineProperty(config, 'familyPrefix', {\n  enumerable: true,\n  set: function (val) {\n    _config.cssPrefix = val;\n    _onChangeCb.forEach(cb => cb(config));\n  },\n  get: function () {\n    return _config.cssPrefix;\n  }\n});\nWINDOW.FontAwesomeConfig = config;\nconst _onChangeCb = [];\nfunction onChange(cb) {\n  _onChangeCb.push(cb);\n  return () => {\n    _onChangeCb.splice(_onChangeCb.indexOf(cb), 1);\n  };\n}\n\nconst d$2 = UNITS_IN_GRID;\nconst meaninglessTransform = {\n  size: 16,\n  x: 0,\n  y: 0,\n  rotate: 0,\n  flipX: false,\n  flipY: false\n};\nfunction insertCss(css) {\n  if (!css || !IS_DOM) {\n    return;\n  }\n  const style = DOCUMENT.createElement('style');\n  style.setAttribute('type', 'text/css');\n  style.innerHTML = css;\n  const headChildren = DOCUMENT.head.childNodes;\n  let beforeChild = null;\n  for (let i = headChildren.length - 1; i > -1; i--) {\n    const child = headChildren[i];\n    const tagName = (child.tagName || '').toUpperCase();\n    if (['STYLE', 'LINK'].indexOf(tagName) > -1) {\n      beforeChild = child;\n    }\n  }\n  DOCUMENT.head.insertBefore(style, beforeChild);\n  return css;\n}\nconst idPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\nfunction nextUniqueId() {\n  let size = 12;\n  let id = '';\n  while (size-- > 0) {\n    id += idPool[Math.random() * 62 | 0];\n  }\n  return id;\n}\nfunction toArray(obj) {\n  const array = [];\n  for (let i = (obj || []).length >>> 0; i--;) {\n    array[i] = obj[i];\n  }\n  return array;\n}\nfunction classArray(node) {\n  if (node.classList) {\n    return toArray(node.classList);\n  } else {\n    return (node.getAttribute('class') || '').split(' ').filter(i => i);\n  }\n}\nfunction htmlEscape(str) {\n  return \"\".concat(str).replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/'/g, '&#39;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\nfunction joinAttributes(attributes) {\n  return Object.keys(attributes || {}).reduce((acc, attributeName) => {\n    return acc + \"\".concat(attributeName, \"=\\\"\").concat(htmlEscape(attributes[attributeName]), \"\\\" \");\n  }, '').trim();\n}\nfunction joinStyles(styles) {\n  return Object.keys(styles || {}).reduce((acc, styleName) => {\n    return acc + \"\".concat(styleName, \": \").concat(styles[styleName].trim(), \";\");\n  }, '');\n}\nfunction transformIsMeaningful(transform) {\n  return transform.size !== meaninglessTransform.size || transform.x !== meaninglessTransform.x || transform.y !== meaninglessTransform.y || transform.rotate !== meaninglessTransform.rotate || transform.flipX || transform.flipY;\n}\nfunction transformForSvg(_ref) {\n  let {\n    transform,\n    containerWidth,\n    iconWidth\n  } = _ref;\n  const outer = {\n    transform: \"translate(\".concat(containerWidth / 2, \" 256)\")\n  };\n  const innerTranslate = \"translate(\".concat(transform.x * 32, \", \").concat(transform.y * 32, \") \");\n  const innerScale = \"scale(\".concat(transform.size / 16 * (transform.flipX ? -1 : 1), \", \").concat(transform.size / 16 * (transform.flipY ? -1 : 1), \") \");\n  const innerRotate = \"rotate(\".concat(transform.rotate, \" 0 0)\");\n  const inner = {\n    transform: \"\".concat(innerTranslate, \" \").concat(innerScale, \" \").concat(innerRotate)\n  };\n  const path = {\n    transform: \"translate(\".concat(iconWidth / 2 * -1, \" -256)\")\n  };\n  return {\n    outer,\n    inner,\n    path\n  };\n}\nfunction transformForCss(_ref2) {\n  let {\n    transform,\n    width = UNITS_IN_GRID,\n    height = UNITS_IN_GRID,\n    startCentered = false\n  } = _ref2;\n  let val = '';\n  if (startCentered && IS_IE) {\n    val += \"translate(\".concat(transform.x / d$2 - width / 2, \"em, \").concat(transform.y / d$2 - height / 2, \"em) \");\n  } else if (startCentered) {\n    val += \"translate(calc(-50% + \".concat(transform.x / d$2, \"em), calc(-50% + \").concat(transform.y / d$2, \"em)) \");\n  } else {\n    val += \"translate(\".concat(transform.x / d$2, \"em, \").concat(transform.y / d$2, \"em) \");\n  }\n  val += \"scale(\".concat(transform.size / d$2 * (transform.flipX ? -1 : 1), \", \").concat(transform.size / d$2 * (transform.flipY ? -1 : 1), \") \");\n  val += \"rotate(\".concat(transform.rotate, \"deg) \");\n  return val;\n}\n\nvar baseStyles = \":root, :host {\\n  --fa-font-solid: normal 900 1em/1 \\\"Font Awesome 6 Free\\\";\\n  --fa-font-regular: normal 400 1em/1 \\\"Font Awesome 6 Free\\\";\\n  --fa-font-light: normal 300 1em/1 \\\"Font Awesome 6 Pro\\\";\\n  --fa-font-thin: normal 100 1em/1 \\\"Font Awesome 6 Pro\\\";\\n  --fa-font-duotone: normal 900 1em/1 \\\"Font Awesome 6 Duotone\\\";\\n  --fa-font-duotone-regular: normal 400 1em/1 \\\"Font Awesome 6 Duotone\\\";\\n  --fa-font-duotone-light: normal 300 1em/1 \\\"Font Awesome 6 Duotone\\\";\\n  --fa-font-duotone-thin: normal 100 1em/1 \\\"Font Awesome 6 Duotone\\\";\\n  --fa-font-brands: normal 400 1em/1 \\\"Font Awesome 6 Brands\\\";\\n  --fa-font-sharp-solid: normal 900 1em/1 \\\"Font Awesome 6 Sharp\\\";\\n  --fa-font-sharp-regular: normal 400 1em/1 \\\"Font Awesome 6 Sharp\\\";\\n  --fa-font-sharp-light: normal 300 1em/1 \\\"Font Awesome 6 Sharp\\\";\\n  --fa-font-sharp-thin: normal 100 1em/1 \\\"Font Awesome 6 Sharp\\\";\\n  --fa-font-sharp-duotone-solid: normal 900 1em/1 \\\"Font Awesome 6 Sharp Duotone\\\";\\n  --fa-font-sharp-duotone-regular: normal 400 1em/1 \\\"Font Awesome 6 Sharp Duotone\\\";\\n  --fa-font-sharp-duotone-light: normal 300 1em/1 \\\"Font Awesome 6 Sharp Duotone\\\";\\n  --fa-font-sharp-duotone-thin: normal 100 1em/1 \\\"Font Awesome 6 Sharp Duotone\\\";\\n}\\n\\nsvg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {\\n  overflow: visible;\\n  box-sizing: content-box;\\n}\\n\\n.svg-inline--fa {\\n  display: var(--fa-display, inline-block);\\n  height: 1em;\\n  overflow: visible;\\n  vertical-align: -0.125em;\\n}\\n.svg-inline--fa.fa-2xs {\\n  vertical-align: 0.1em;\\n}\\n.svg-inline--fa.fa-xs {\\n  vertical-align: 0em;\\n}\\n.svg-inline--fa.fa-sm {\\n  vertical-align: -0.0714285705em;\\n}\\n.svg-inline--fa.fa-lg {\\n  vertical-align: -0.2em;\\n}\\n.svg-inline--fa.fa-xl {\\n  vertical-align: -0.25em;\\n}\\n.svg-inline--fa.fa-2xl {\\n  vertical-align: -0.3125em;\\n}\\n.svg-inline--fa.fa-pull-left {\\n  margin-right: var(--fa-pull-margin, 0.3em);\\n  width: auto;\\n}\\n.svg-inline--fa.fa-pull-right {\\n  margin-left: var(--fa-pull-margin, 0.3em);\\n  width: auto;\\n}\\n.svg-inline--fa.fa-li {\\n  width: var(--fa-li-width, 2em);\\n  top: 0.25em;\\n}\\n.svg-inline--fa.fa-fw {\\n  width: var(--fa-fw-width, 1.25em);\\n}\\n\\n.fa-layers svg.svg-inline--fa {\\n  bottom: 0;\\n  left: 0;\\n  margin: auto;\\n  position: absolute;\\n  right: 0;\\n  top: 0;\\n}\\n\\n.fa-layers-counter, .fa-layers-text {\\n  display: inline-block;\\n  position: absolute;\\n  text-align: center;\\n}\\n\\n.fa-layers {\\n  display: inline-block;\\n  height: 1em;\\n  position: relative;\\n  text-align: center;\\n  vertical-align: -0.125em;\\n  width: 1em;\\n}\\n.fa-layers svg.svg-inline--fa {\\n  transform-origin: center center;\\n}\\n\\n.fa-layers-text {\\n  left: 50%;\\n  top: 50%;\\n  transform: translate(-50%, -50%);\\n  transform-origin: center center;\\n}\\n\\n.fa-layers-counter {\\n  background-color: var(--fa-counter-background-color, #ff253a);\\n  border-radius: var(--fa-counter-border-radius, 1em);\\n  box-sizing: border-box;\\n  color: var(--fa-inverse, #fff);\\n  line-height: var(--fa-counter-line-height, 1);\\n  max-width: var(--fa-counter-max-width, 5em);\\n  min-width: var(--fa-counter-min-width, 1.5em);\\n  overflow: hidden;\\n  padding: var(--fa-counter-padding, 0.25em 0.5em);\\n  right: var(--fa-right, 0);\\n  text-overflow: ellipsis;\\n  top: var(--fa-top, 0);\\n  transform: scale(var(--fa-counter-scale, 0.25));\\n  transform-origin: top right;\\n}\\n\\n.fa-layers-bottom-right {\\n  bottom: var(--fa-bottom, 0);\\n  right: var(--fa-right, 0);\\n  top: auto;\\n  transform: scale(var(--fa-layers-scale, 0.25));\\n  transform-origin: bottom right;\\n}\\n\\n.fa-layers-bottom-left {\\n  bottom: var(--fa-bottom, 0);\\n  left: var(--fa-left, 0);\\n  right: auto;\\n  top: auto;\\n  transform: scale(var(--fa-layers-scale, 0.25));\\n  transform-origin: bottom left;\\n}\\n\\n.fa-layers-top-right {\\n  top: var(--fa-top, 0);\\n  right: var(--fa-right, 0);\\n  transform: scale(var(--fa-layers-scale, 0.25));\\n  transform-origin: top right;\\n}\\n\\n.fa-layers-top-left {\\n  left: var(--fa-left, 0);\\n  right: auto;\\n  top: var(--fa-top, 0);\\n  transform: scale(var(--fa-layers-scale, 0.25));\\n  transform-origin: top left;\\n}\\n\\n.fa-1x {\\n  font-size: 1em;\\n}\\n\\n.fa-2x {\\n  font-size: 2em;\\n}\\n\\n.fa-3x {\\n  font-size: 3em;\\n}\\n\\n.fa-4x {\\n  font-size: 4em;\\n}\\n\\n.fa-5x {\\n  font-size: 5em;\\n}\\n\\n.fa-6x {\\n  font-size: 6em;\\n}\\n\\n.fa-7x {\\n  font-size: 7em;\\n}\\n\\n.fa-8x {\\n  font-size: 8em;\\n}\\n\\n.fa-9x {\\n  font-size: 9em;\\n}\\n\\n.fa-10x {\\n  font-size: 10em;\\n}\\n\\n.fa-2xs {\\n  font-size: 0.625em;\\n  line-height: 0.1em;\\n  vertical-align: 0.225em;\\n}\\n\\n.fa-xs {\\n  font-size: 0.75em;\\n  line-height: 0.0833333337em;\\n  vertical-align: 0.125em;\\n}\\n\\n.fa-sm {\\n  font-size: 0.875em;\\n  line-height: 0.0714285718em;\\n  vertical-align: 0.0535714295em;\\n}\\n\\n.fa-lg {\\n  font-size: 1.25em;\\n  line-height: 0.05em;\\n  vertical-align: -0.075em;\\n}\\n\\n.fa-xl {\\n  font-size: 1.5em;\\n  line-height: 0.0416666682em;\\n  vertical-align: -0.125em;\\n}\\n\\n.fa-2xl {\\n  font-size: 2em;\\n  line-height: 0.03125em;\\n  vertical-align: -0.1875em;\\n}\\n\\n.fa-fw {\\n  text-align: center;\\n  width: 1.25em;\\n}\\n\\n.fa-ul {\\n  list-style-type: none;\\n  margin-left: var(--fa-li-margin, 2.5em);\\n  padding-left: 0;\\n}\\n.fa-ul > li {\\n  position: relative;\\n}\\n\\n.fa-li {\\n  left: calc(-1 * var(--fa-li-width, 2em));\\n  position: absolute;\\n  text-align: center;\\n  width: var(--fa-li-width, 2em);\\n  line-height: inherit;\\n}\\n\\n.fa-border {\\n  border-color: var(--fa-border-color, #eee);\\n  border-radius: var(--fa-border-radius, 0.1em);\\n  border-style: var(--fa-border-style, solid);\\n  border-width: var(--fa-border-width, 0.08em);\\n  padding: var(--fa-border-padding, 0.2em 0.25em 0.15em);\\n}\\n\\n.fa-pull-left {\\n  float: left;\\n  margin-right: var(--fa-pull-margin, 0.3em);\\n}\\n\\n.fa-pull-right {\\n  float: right;\\n  margin-left: var(--fa-pull-margin, 0.3em);\\n}\\n\\n.fa-beat {\\n  animation-name: fa-beat;\\n  animation-delay: var(--fa-animation-delay, 0s);\\n  animation-direction: var(--fa-animation-direction, normal);\\n  animation-duration: var(--fa-animation-duration, 1s);\\n  animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n}\\n\\n.fa-bounce {\\n  animation-name: fa-bounce;\\n  animation-delay: var(--fa-animation-delay, 0s);\\n  animation-direction: var(--fa-animation-direction, normal);\\n  animation-duration: var(--fa-animation-duration, 1s);\\n  animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));\\n}\\n\\n.fa-fade {\\n  animation-name: fa-fade;\\n  animation-delay: var(--fa-animation-delay, 0s);\\n  animation-direction: var(--fa-animation-direction, normal);\\n  animation-duration: var(--fa-animation-duration, 1s);\\n  animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n}\\n\\n.fa-beat-fade {\\n  animation-name: fa-beat-fade;\\n  animation-delay: var(--fa-animation-delay, 0s);\\n  animation-direction: var(--fa-animation-direction, normal);\\n  animation-duration: var(--fa-animation-duration, 1s);\\n  animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));\\n}\\n\\n.fa-flip {\\n  animation-name: fa-flip;\\n  animation-delay: var(--fa-animation-delay, 0s);\\n  animation-direction: var(--fa-animation-direction, normal);\\n  animation-duration: var(--fa-animation-duration, 1s);\\n  animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  animation-timing-function: var(--fa-animation-timing, ease-in-out);\\n}\\n\\n.fa-shake {\\n  animation-name: fa-shake;\\n  animation-delay: var(--fa-animation-delay, 0s);\\n  animation-direction: var(--fa-animation-direction, normal);\\n  animation-duration: var(--fa-animation-duration, 1s);\\n  animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  animation-timing-function: var(--fa-animation-timing, linear);\\n}\\n\\n.fa-spin {\\n  animation-name: fa-spin;\\n  animation-delay: var(--fa-animation-delay, 0s);\\n  animation-direction: var(--fa-animation-direction, normal);\\n  animation-duration: var(--fa-animation-duration, 2s);\\n  animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  animation-timing-function: var(--fa-animation-timing, linear);\\n}\\n\\n.fa-spin-reverse {\\n  --fa-animation-direction: reverse;\\n}\\n\\n.fa-pulse,\\n.fa-spin-pulse {\\n  animation-name: fa-spin;\\n  animation-direction: var(--fa-animation-direction, normal);\\n  animation-duration: var(--fa-animation-duration, 1s);\\n  animation-iteration-count: var(--fa-animation-iteration-count, infinite);\\n  animation-timing-function: var(--fa-animation-timing, steps(8));\\n}\\n\\n@media (prefers-reduced-motion: reduce) {\\n  .fa-beat,\\n.fa-bounce,\\n.fa-fade,\\n.fa-beat-fade,\\n.fa-flip,\\n.fa-pulse,\\n.fa-shake,\\n.fa-spin,\\n.fa-spin-pulse {\\n    animation-delay: -1ms;\\n    animation-duration: 1ms;\\n    animation-iteration-count: 1;\\n    transition-delay: 0s;\\n    transition-duration: 0s;\\n  }\\n}\\n@keyframes fa-beat {\\n  0%, 90% {\\n    transform: scale(1);\\n  }\\n  45% {\\n    transform: scale(var(--fa-beat-scale, 1.25));\\n  }\\n}\\n@keyframes fa-bounce {\\n  0% {\\n    transform: scale(1, 1) translateY(0);\\n  }\\n  10% {\\n    transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);\\n  }\\n  30% {\\n    transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));\\n  }\\n  50% {\\n    transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);\\n  }\\n  57% {\\n    transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));\\n  }\\n  64% {\\n    transform: scale(1, 1) translateY(0);\\n  }\\n  100% {\\n    transform: scale(1, 1) translateY(0);\\n  }\\n}\\n@keyframes fa-fade {\\n  50% {\\n    opacity: var(--fa-fade-opacity, 0.4);\\n  }\\n}\\n@keyframes fa-beat-fade {\\n  0%, 100% {\\n    opacity: var(--fa-beat-fade-opacity, 0.4);\\n    transform: scale(1);\\n  }\\n  50% {\\n    opacity: 1;\\n    transform: scale(var(--fa-beat-fade-scale, 1.125));\\n  }\\n}\\n@keyframes fa-flip {\\n  50% {\\n    transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));\\n  }\\n}\\n@keyframes fa-shake {\\n  0% {\\n    transform: rotate(-15deg);\\n  }\\n  4% {\\n    transform: rotate(15deg);\\n  }\\n  8%, 24% {\\n    transform: rotate(-18deg);\\n  }\\n  12%, 28% {\\n    transform: rotate(18deg);\\n  }\\n  16% {\\n    transform: rotate(-22deg);\\n  }\\n  20% {\\n    transform: rotate(22deg);\\n  }\\n  32% {\\n    transform: rotate(-12deg);\\n  }\\n  36% {\\n    transform: rotate(12deg);\\n  }\\n  40%, 100% {\\n    transform: rotate(0deg);\\n  }\\n}\\n@keyframes fa-spin {\\n  0% {\\n    transform: rotate(0deg);\\n  }\\n  100% {\\n    transform: rotate(360deg);\\n  }\\n}\\n.fa-rotate-90 {\\n  transform: rotate(90deg);\\n}\\n\\n.fa-rotate-180 {\\n  transform: rotate(180deg);\\n}\\n\\n.fa-rotate-270 {\\n  transform: rotate(270deg);\\n}\\n\\n.fa-flip-horizontal {\\n  transform: scale(-1, 1);\\n}\\n\\n.fa-flip-vertical {\\n  transform: scale(1, -1);\\n}\\n\\n.fa-flip-both,\\n.fa-flip-horizontal.fa-flip-vertical {\\n  transform: scale(-1, -1);\\n}\\n\\n.fa-rotate-by {\\n  transform: rotate(var(--fa-rotate-angle, 0));\\n}\\n\\n.fa-stack {\\n  display: inline-block;\\n  vertical-align: middle;\\n  height: 2em;\\n  position: relative;\\n  width: 2.5em;\\n}\\n\\n.fa-stack-1x,\\n.fa-stack-2x {\\n  bottom: 0;\\n  left: 0;\\n  margin: auto;\\n  position: absolute;\\n  right: 0;\\n  top: 0;\\n  z-index: var(--fa-stack-z-index, auto);\\n}\\n\\n.svg-inline--fa.fa-stack-1x {\\n  height: 1em;\\n  width: 1.25em;\\n}\\n.svg-inline--fa.fa-stack-2x {\\n  height: 2em;\\n  width: 2.5em;\\n}\\n\\n.fa-inverse {\\n  color: var(--fa-inverse, #fff);\\n}\\n\\n.sr-only,\\n.fa-sr-only {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  margin: -1px;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  white-space: nowrap;\\n  border-width: 0;\\n}\\n\\n.sr-only-focusable:not(:focus),\\n.fa-sr-only-focusable:not(:focus) {\\n  position: absolute;\\n  width: 1px;\\n  height: 1px;\\n  padding: 0;\\n  margin: -1px;\\n  overflow: hidden;\\n  clip: rect(0, 0, 0, 0);\\n  white-space: nowrap;\\n  border-width: 0;\\n}\\n\\n.svg-inline--fa .fa-primary {\\n  fill: var(--fa-primary-color, currentColor);\\n  opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa .fa-secondary {\\n  fill: var(--fa-secondary-color, currentColor);\\n  opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-primary {\\n  opacity: var(--fa-secondary-opacity, 0.4);\\n}\\n\\n.svg-inline--fa.fa-swap-opacity .fa-secondary {\\n  opacity: var(--fa-primary-opacity, 1);\\n}\\n\\n.svg-inline--fa mask .fa-primary,\\n.svg-inline--fa mask .fa-secondary {\\n  fill: black;\\n}\";\n\nfunction css() {\n  const dcp = DEFAULT_CSS_PREFIX;\n  const drc = DEFAULT_REPLACEMENT_CLASS;\n  const fp = config.cssPrefix;\n  const rc = config.replacementClass;\n  let s = baseStyles;\n  if (fp !== dcp || rc !== drc) {\n    const dPatt = new RegExp(\"\\\\.\".concat(dcp, \"\\\\-\"), 'g');\n    const customPropPatt = new RegExp(\"\\\\--\".concat(dcp, \"\\\\-\"), 'g');\n    const rPatt = new RegExp(\"\\\\.\".concat(drc), 'g');\n    s = s.replace(dPatt, \".\".concat(fp, \"-\")).replace(customPropPatt, \"--\".concat(fp, \"-\")).replace(rPatt, \".\".concat(rc));\n  }\n  return s;\n}\nlet _cssInserted = false;\nfunction ensureCss() {\n  if (config.autoAddCss && !_cssInserted) {\n    insertCss(css());\n    _cssInserted = true;\n  }\n}\nvar InjectCSS = {\n  mixout() {\n    return {\n      dom: {\n        css,\n        insertCss: ensureCss\n      }\n    };\n  },\n  hooks() {\n    return {\n      beforeDOMElementCreation() {\n        ensureCss();\n      },\n      beforeI2svg() {\n        ensureCss();\n      }\n    };\n  }\n};\n\nconst w = WINDOW || {};\nif (!w[NAMESPACE_IDENTIFIER]) w[NAMESPACE_IDENTIFIER] = {};\nif (!w[NAMESPACE_IDENTIFIER].styles) w[NAMESPACE_IDENTIFIER].styles = {};\nif (!w[NAMESPACE_IDENTIFIER].hooks) w[NAMESPACE_IDENTIFIER].hooks = {};\nif (!w[NAMESPACE_IDENTIFIER].shims) w[NAMESPACE_IDENTIFIER].shims = [];\nvar namespace = w[NAMESPACE_IDENTIFIER];\n\nconst functions = [];\nconst listener = function () {\n  DOCUMENT.removeEventListener('DOMContentLoaded', listener);\n  loaded = 1;\n  functions.map(fn => fn());\n};\nlet loaded = false;\nif (IS_DOM) {\n  loaded = (DOCUMENT.documentElement.doScroll ? /^loaded|^c/ : /^loaded|^i|^c/).test(DOCUMENT.readyState);\n  if (!loaded) DOCUMENT.addEventListener('DOMContentLoaded', listener);\n}\nfunction domready (fn) {\n  if (!IS_DOM) return;\n  loaded ? setTimeout(fn, 0) : functions.push(fn);\n}\n\nfunction toHtml(abstractNodes) {\n  const {\n    tag,\n    attributes = {},\n    children = []\n  } = abstractNodes;\n  if (typeof abstractNodes === 'string') {\n    return htmlEscape(abstractNodes);\n  } else {\n    return \"<\".concat(tag, \" \").concat(joinAttributes(attributes), \">\").concat(children.map(toHtml).join(''), \"</\").concat(tag, \">\");\n  }\n}\n\nfunction iconFromMapping(mapping, prefix, iconName) {\n  if (mapping && mapping[prefix] && mapping[prefix][iconName]) {\n    return {\n      prefix,\n      iconName,\n      icon: mapping[prefix][iconName]\n    };\n  }\n}\n\n/**\n * Internal helper to bind a function known to have 4 arguments\n * to a given context.\n */\nvar bindInternal4 = function bindInternal4(func, thisContext) {\n  return function (a, b, c, d) {\n    return func.call(thisContext, a, b, c, d);\n  };\n};\n\n/**\n * # Reduce\n *\n * A fast object `.reduce()` implementation.\n *\n * @param  {Object}   subject      The object to reduce over.\n * @param  {Function} fn           The reducer function.\n * @param  {mixed}    initialValue The initial value for the reducer, defaults to subject[0].\n * @param  {Object}   thisContext  The context for the reducer.\n * @return {mixed}                 The final result.\n */\nvar reduce = function fastReduceObject(subject, fn, initialValue, thisContext) {\n  var keys = Object.keys(subject),\n    length = keys.length,\n    iterator = thisContext !== undefined ? bindInternal4(fn, thisContext) : fn,\n    i,\n    key,\n    result;\n  if (initialValue === undefined) {\n    i = 1;\n    result = subject[keys[0]];\n  } else {\n    i = 0;\n    result = initialValue;\n  }\n  for (; i < length; i++) {\n    key = keys[i];\n    result = iterator(result, subject[key], key, subject);\n  }\n  return result;\n};\n\n/**\n * ucs2decode() and codePointAt() are both works of Mathias Bynens and licensed under MIT\n *\n * Copyright Mathias Bynens <https://mathiasbynens.be/>\n\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n\n * The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\nfunction ucs2decode(string) {\n  const output = [];\n  let counter = 0;\n  const length = string.length;\n  while (counter < length) {\n    const value = string.charCodeAt(counter++);\n    if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n      const extra = string.charCodeAt(counter++);\n      if ((extra & 0xFC00) == 0xDC00) {\n        // eslint-disable-line eqeqeq\n        output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n      } else {\n        output.push(value);\n        counter--;\n      }\n    } else {\n      output.push(value);\n    }\n  }\n  return output;\n}\nfunction toHex(unicode) {\n  const decoded = ucs2decode(unicode);\n  return decoded.length === 1 ? decoded[0].toString(16) : null;\n}\nfunction codePointAt(string, index) {\n  const size = string.length;\n  let first = string.charCodeAt(index);\n  let second;\n  if (first >= 0xD800 && first <= 0xDBFF && size > index + 1) {\n    second = string.charCodeAt(index + 1);\n    if (second >= 0xDC00 && second <= 0xDFFF) {\n      return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n    }\n  }\n  return first;\n}\n\nfunction normalizeIcons(icons) {\n  return Object.keys(icons).reduce((acc, iconName) => {\n    const icon = icons[iconName];\n    const expanded = !!icon.icon;\n    if (expanded) {\n      acc[icon.iconName] = icon.icon;\n    } else {\n      acc[iconName] = icon;\n    }\n    return acc;\n  }, {});\n}\nfunction defineIcons(prefix, icons) {\n  let params = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n  const {\n    skipHooks = false\n  } = params;\n  const normalized = normalizeIcons(icons);\n  if (typeof namespace.hooks.addPack === 'function' && !skipHooks) {\n    namespace.hooks.addPack(prefix, normalizeIcons(icons));\n  } else {\n    namespace.styles[prefix] = _objectSpread2(_objectSpread2({}, namespace.styles[prefix] || {}), normalized);\n  }\n\n  /**\n   * Font Awesome 4 used the prefix of `fa` for all icons. With the introduction\n   * of new styles we needed to differentiate between them. Prefix `fa` is now an alias\n   * for `fas` so we'll ease the upgrade process for our users by automatically defining\n   * this as well.\n   */\n  if (prefix === 'fas') {\n    defineIcons('fa', icons);\n  }\n}\n\nconst duotonePathRe = [/*#__PURE__*/_wrapRegExp(/path d=\"([^\"]+)\".*path d=\"([^\"]+)\"/, {\n  d1: 1,\n  d2: 2\n}), /*#__PURE__*/_wrapRegExp(/path class=\"([^\"]+)\".*d=\"([^\"]+)\".*path class=\"([^\"]+)\".*d=\"([^\"]+)\"/, {\n  cls1: 1,\n  d1: 2,\n  cls2: 3,\n  d2: 4\n}), /*#__PURE__*/_wrapRegExp(/path class=\"([^\"]+)\".*d=\"([^\"]+)\"/, {\n  cls1: 1,\n  d1: 2\n})];\n\nconst {\n  styles,\n  shims\n} = namespace;\nconst FAMILY_NAMES = Object.keys(PREFIX_TO_LONG_STYLE);\nconst PREFIXES_FOR_FAMILY = FAMILY_NAMES.reduce((acc, familyId) => {\n  acc[familyId] = Object.keys(PREFIX_TO_LONG_STYLE[familyId]);\n  return acc;\n}, {});\nlet _defaultUsablePrefix = null;\nlet _byUnicode = {};\nlet _byLigature = {};\nlet _byOldName = {};\nlet _byOldUnicode = {};\nlet _byAlias = {};\nfunction isReserved(name) {\n  return ~RESERVED_CLASSES.indexOf(name);\n}\nfunction getIconName(cssPrefix, cls) {\n  const parts = cls.split('-');\n  const prefix = parts[0];\n  const iconName = parts.slice(1).join('-');\n  if (prefix === cssPrefix && iconName !== '' && !isReserved(iconName)) {\n    return iconName;\n  } else {\n    return null;\n  }\n}\nconst build = () => {\n  const lookup = reducer => {\n    return reduce(styles, (o$$1, style, prefix) => {\n      o$$1[prefix] = reduce(style, reducer, {});\n      return o$$1;\n    }, {});\n  };\n  _byUnicode = lookup((acc, icon, iconName) => {\n    if (icon[3]) {\n      acc[icon[3]] = iconName;\n    }\n    if (icon[2]) {\n      const aliases = icon[2].filter(a$$1 => {\n        return typeof a$$1 === 'number';\n      });\n      aliases.forEach(alias => {\n        acc[alias.toString(16)] = iconName;\n      });\n    }\n    return acc;\n  });\n  _byLigature = lookup((acc, icon, iconName) => {\n    acc[iconName] = iconName;\n    if (icon[2]) {\n      const aliases = icon[2].filter(a$$1 => {\n        return typeof a$$1 === 'string';\n      });\n      aliases.forEach(alias => {\n        acc[alias] = iconName;\n      });\n    }\n    return acc;\n  });\n  _byAlias = lookup((acc, icon, iconName) => {\n    const aliases = icon[2];\n    acc[iconName] = iconName;\n    aliases.forEach(alias => {\n      acc[alias] = iconName;\n    });\n    return acc;\n  });\n\n  // If we have a Kit, we can't determine if regular is available since we\n  // could be auto-fetching it. We'll have to assume that it is available.\n  const hasRegular = 'far' in styles || config.autoFetchSvg;\n  const shimLookups = reduce(shims, (acc, shim) => {\n    const maybeNameMaybeUnicode = shim[0];\n    let prefix = shim[1];\n    const iconName = shim[2];\n    if (prefix === 'far' && !hasRegular) {\n      prefix = 'fas';\n    }\n    if (typeof maybeNameMaybeUnicode === 'string') {\n      acc.names[maybeNameMaybeUnicode] = {\n        prefix,\n        iconName\n      };\n    }\n    if (typeof maybeNameMaybeUnicode === 'number') {\n      acc.unicodes[maybeNameMaybeUnicode.toString(16)] = {\n        prefix,\n        iconName\n      };\n    }\n    return acc;\n  }, {\n    names: {},\n    unicodes: {}\n  });\n  _byOldName = shimLookups.names;\n  _byOldUnicode = shimLookups.unicodes;\n  _defaultUsablePrefix = getCanonicalPrefix(config.styleDefault, {\n    family: config.familyDefault\n  });\n};\nonChange(c$$1 => {\n  _defaultUsablePrefix = getCanonicalPrefix(c$$1.styleDefault, {\n    family: config.familyDefault\n  });\n});\nbuild();\nfunction byUnicode(prefix, unicode) {\n  return (_byUnicode[prefix] || {})[unicode];\n}\nfunction byLigature(prefix, ligature) {\n  return (_byLigature[prefix] || {})[ligature];\n}\nfunction byAlias(prefix, alias) {\n  return (_byAlias[prefix] || {})[alias];\n}\nfunction byOldName(name) {\n  return _byOldName[name] || {\n    prefix: null,\n    iconName: null\n  };\n}\nfunction byOldUnicode(unicode) {\n  const oldUnicode = _byOldUnicode[unicode];\n  const newUnicode = byUnicode('fas', unicode);\n  return oldUnicode || (newUnicode ? {\n    prefix: 'fas',\n    iconName: newUnicode\n  } : null) || {\n    prefix: null,\n    iconName: null\n  };\n}\nfunction getDefaultUsablePrefix() {\n  return _defaultUsablePrefix;\n}\nconst emptyCanonicalIcon = () => {\n  return {\n    prefix: null,\n    iconName: null,\n    rest: []\n  };\n};\nfunction getFamilyId(values) {\n  let family = s;\n  const famProps = FAMILY_NAMES.reduce((acc, familyId) => {\n    acc[familyId] = \"\".concat(config.cssPrefix, \"-\").concat(familyId);\n    return acc;\n  }, {});\n  L.forEach(familyId => {\n    if (values.includes(famProps[familyId]) || values.some(v$$1 => PREFIXES_FOR_FAMILY[familyId].includes(v$$1))) {\n      family = familyId;\n    }\n  });\n  return family;\n}\nfunction getCanonicalPrefix(styleOrPrefix) {\n  let params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  const {\n    family = s\n  } = params;\n  const style = PREFIX_TO_STYLE[family][styleOrPrefix];\n\n  // handles the exception of passing in only a family of 'duotone' with no style\n  if (family === t && !styleOrPrefix) {\n    return 'fad';\n  }\n  const prefix = STYLE_TO_PREFIX[family][styleOrPrefix] || STYLE_TO_PREFIX[family][style];\n  const defined = styleOrPrefix in namespace.styles ? styleOrPrefix : null;\n  const result = prefix || defined || null;\n  return result;\n}\nfunction moveNonFaClassesToRest(classNames) {\n  let rest = [];\n  let iconName = null;\n  classNames.forEach(cls => {\n    const result = getIconName(config.cssPrefix, cls);\n    if (result) {\n      iconName = result;\n    } else if (cls) {\n      rest.push(cls);\n    }\n  });\n  return {\n    iconName,\n    rest\n  };\n}\nfunction sortedUniqueValues(arr) {\n  return arr.sort().filter((value, index, arr) => {\n    return arr.indexOf(value) === index;\n  });\n}\nfunction getCanonicalIcon(values) {\n  let params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  const {\n    skipLookups = false\n  } = params;\n  let givenPrefix = null;\n  const faCombinedClasses = Ia.concat(bt$1);\n  const faStyleOrFamilyClasses = sortedUniqueValues(values.filter(cls => faCombinedClasses.includes(cls)));\n  const nonStyleOrFamilyClasses = sortedUniqueValues(values.filter(cls => !Ia.includes(cls)));\n  const faStyles = faStyleOrFamilyClasses.filter(cls => {\n    givenPrefix = cls;\n    return !P.includes(cls);\n  });\n  const [styleFromValues = null] = faStyles;\n  const family = getFamilyId(faStyleOrFamilyClasses);\n  const canonical = _objectSpread2(_objectSpread2({}, moveNonFaClassesToRest(nonStyleOrFamilyClasses)), {}, {\n    prefix: getCanonicalPrefix(styleFromValues, {\n      family\n    })\n  });\n  return _objectSpread2(_objectSpread2(_objectSpread2({}, canonical), getDefaultCanonicalPrefix({\n    values,\n    family,\n    styles,\n    config,\n    canonical,\n    givenPrefix\n  })), applyShimAndAlias(skipLookups, givenPrefix, canonical));\n}\nfunction applyShimAndAlias(skipLookups, givenPrefix, canonical) {\n  let {\n    prefix,\n    iconName\n  } = canonical;\n  if (skipLookups || !prefix || !iconName) {\n    return {\n      prefix,\n      iconName\n    };\n  }\n  const shim = givenPrefix === 'fa' ? byOldName(iconName) : {};\n  const aliasIconName = byAlias(prefix, iconName);\n  iconName = shim.iconName || aliasIconName || iconName;\n  prefix = shim.prefix || prefix;\n  if (prefix === 'far' && !styles['far'] && styles['fas'] && !config.autoFetchSvg) {\n    // Allow a fallback from the regular style to solid if regular is not available\n    // but only if we aren't auto-fetching SVGs\n    prefix = 'fas';\n  }\n  return {\n    prefix,\n    iconName\n  };\n}\nconst newCanonicalFamilies = L.filter(familyId => {\n  return familyId !== s || familyId !== t;\n});\nconst newCanonicalStyles = Object.keys(ga).filter(key => key !== s).map(key => Object.keys(ga[key])).flat();\nfunction getDefaultCanonicalPrefix(prefixOptions) {\n  const {\n    values,\n    family,\n    canonical,\n    givenPrefix = '',\n    styles = {},\n    config: config$$1 = {}\n  } = prefixOptions;\n  const isDuotoneFamily = family === t;\n  const valuesHasDuotone = values.includes('fa-duotone') || values.includes('fad');\n  const defaultFamilyIsDuotone = config$$1.familyDefault === 'duotone';\n  const canonicalPrefixIsDuotone = canonical.prefix === 'fad' || canonical.prefix === 'fa-duotone';\n  if (!isDuotoneFamily && (valuesHasDuotone || defaultFamilyIsDuotone || canonicalPrefixIsDuotone)) {\n    canonical.prefix = 'fad';\n  }\n  if (values.includes('fa-brands') || values.includes('fab')) {\n    canonical.prefix = 'fab';\n  }\n  if (!canonical.prefix && newCanonicalFamilies.includes(family)) {\n    const validPrefix = Object.keys(styles).find(key => newCanonicalStyles.includes(key));\n    if (validPrefix || config$$1.autoFetchSvg) {\n      const defaultPrefix = pt.get(family).defaultShortPrefixId;\n      canonical.prefix = defaultPrefix;\n      canonical.iconName = byAlias(canonical.prefix, canonical.iconName) || canonical.iconName;\n    }\n  }\n  if (canonical.prefix === 'fa' || givenPrefix === 'fa') {\n    // The fa prefix is not canonical. So if it has made it through until this point\n    // we will shift it to the correct prefix.\n    canonical.prefix = getDefaultUsablePrefix() || 'fas';\n  }\n  return canonical;\n}\n\nclass Library {\n  constructor() {\n    this.definitions = {};\n  }\n  add() {\n    for (var _len = arguments.length, definitions = new Array(_len), _key = 0; _key < _len; _key++) {\n      definitions[_key] = arguments[_key];\n    }\n    const additions = definitions.reduce(this._pullDefinitions, {});\n    Object.keys(additions).forEach(key => {\n      this.definitions[key] = _objectSpread2(_objectSpread2({}, this.definitions[key] || {}), additions[key]);\n      defineIcons(key, additions[key]);\n\n      // TODO can we stop doing this? We can't get the icons by 'fa-solid' any longer so this probably needs to change\n      const longPrefix = PREFIX_TO_LONG_STYLE[s][key];\n      if (longPrefix) defineIcons(longPrefix, additions[key]);\n      build();\n    });\n  }\n  reset() {\n    this.definitions = {};\n  }\n  _pullDefinitions(additions, definition) {\n    const normalized = definition.prefix && definition.iconName && definition.icon ? {\n      0: definition\n    } : definition;\n    Object.keys(normalized).map(key => {\n      const {\n        prefix,\n        iconName,\n        icon\n      } = normalized[key];\n      const aliases = icon[2];\n      if (!additions[prefix]) additions[prefix] = {};\n      if (aliases.length > 0) {\n        aliases.forEach(alias => {\n          if (typeof alias === 'string') {\n            additions[prefix][alias] = icon;\n          }\n        });\n      }\n      additions[prefix][iconName] = icon;\n    });\n    return additions;\n  }\n}\n\nlet _plugins = [];\nlet _hooks = {};\nconst providers = {};\nconst defaultProviderKeys = Object.keys(providers);\nfunction registerPlugins(nextPlugins, _ref) {\n  let {\n    mixoutsTo: obj\n  } = _ref;\n  _plugins = nextPlugins;\n  _hooks = {};\n  Object.keys(providers).forEach(k => {\n    if (defaultProviderKeys.indexOf(k) === -1) {\n      delete providers[k];\n    }\n  });\n  _plugins.forEach(plugin => {\n    const mixout = plugin.mixout ? plugin.mixout() : {};\n    Object.keys(mixout).forEach(tk => {\n      if (typeof mixout[tk] === 'function') {\n        obj[tk] = mixout[tk];\n      }\n      if (typeof mixout[tk] === 'object') {\n        Object.keys(mixout[tk]).forEach(sk => {\n          if (!obj[tk]) {\n            obj[tk] = {};\n          }\n          obj[tk][sk] = mixout[tk][sk];\n        });\n      }\n    });\n    if (plugin.hooks) {\n      const hooks = plugin.hooks();\n      Object.keys(hooks).forEach(hook => {\n        if (!_hooks[hook]) {\n          _hooks[hook] = [];\n        }\n        _hooks[hook].push(hooks[hook]);\n      });\n    }\n    if (plugin.provides) {\n      plugin.provides(providers);\n    }\n  });\n  return obj;\n}\nfunction chainHooks(hook, accumulator) {\n  for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n    args[_key - 2] = arguments[_key];\n  }\n  const hookFns = _hooks[hook] || [];\n  hookFns.forEach(hookFn => {\n    accumulator = hookFn.apply(null, [accumulator, ...args]); // eslint-disable-line no-useless-call\n  });\n  return accumulator;\n}\nfunction callHooks(hook) {\n  for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n    args[_key2 - 1] = arguments[_key2];\n  }\n  const hookFns = _hooks[hook] || [];\n  hookFns.forEach(hookFn => {\n    hookFn.apply(null, args);\n  });\n  return undefined;\n}\nfunction callProvided() {\n  const hook = arguments[0];\n  const args = Array.prototype.slice.call(arguments, 1);\n  return providers[hook] ? providers[hook].apply(null, args) : undefined;\n}\n\nfunction findIconDefinition(iconLookup) {\n  if (iconLookup.prefix === 'fa') {\n    iconLookup.prefix = 'fas';\n  }\n  let {\n    iconName\n  } = iconLookup;\n  const prefix = iconLookup.prefix || getDefaultUsablePrefix();\n  if (!iconName) return;\n  iconName = byAlias(prefix, iconName) || iconName;\n  return iconFromMapping(library.definitions, prefix, iconName) || iconFromMapping(namespace.styles, prefix, iconName);\n}\nconst library = new Library();\nconst noAuto = () => {\n  config.autoReplaceSvg = false;\n  config.observeMutations = false;\n  callHooks('noAuto');\n};\nconst dom = {\n  i2svg: function () {\n    let params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    if (IS_DOM) {\n      callHooks('beforeI2svg', params);\n      callProvided('pseudoElements2svg', params);\n      return callProvided('i2svg', params);\n    } else {\n      return Promise.reject(new Error('Operation requires a DOM of some kind.'));\n    }\n  },\n  watch: function () {\n    let params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    const {\n      autoReplaceSvgRoot\n    } = params;\n    if (config.autoReplaceSvg === false) {\n      config.autoReplaceSvg = true;\n    }\n    config.observeMutations = true;\n    domready(() => {\n      autoReplace({\n        autoReplaceSvgRoot\n      });\n      callHooks('watch', params);\n    });\n  }\n};\nconst parse = {\n  icon: icon => {\n    if (icon === null) {\n      return null;\n    }\n    if (typeof icon === 'object' && icon.prefix && icon.iconName) {\n      return {\n        prefix: icon.prefix,\n        iconName: byAlias(icon.prefix, icon.iconName) || icon.iconName\n      };\n    }\n    if (Array.isArray(icon) && icon.length === 2) {\n      const iconName = icon[1].indexOf('fa-') === 0 ? icon[1].slice(3) : icon[1];\n      const prefix = getCanonicalPrefix(icon[0]);\n      return {\n        prefix,\n        iconName: byAlias(prefix, iconName) || iconName\n      };\n    }\n    if (typeof icon === 'string' && (icon.indexOf(\"\".concat(config.cssPrefix, \"-\")) > -1 || icon.match(ICON_SELECTION_SYNTAX_PATTERN))) {\n      const canonicalIcon = getCanonicalIcon(icon.split(' '), {\n        skipLookups: true\n      });\n      return {\n        prefix: canonicalIcon.prefix || getDefaultUsablePrefix(),\n        iconName: byAlias(canonicalIcon.prefix, canonicalIcon.iconName) || canonicalIcon.iconName\n      };\n    }\n    if (typeof icon === 'string') {\n      const prefix = getDefaultUsablePrefix();\n      return {\n        prefix,\n        iconName: byAlias(prefix, icon) || icon\n      };\n    }\n  }\n};\nconst api = {\n  noAuto,\n  config,\n  dom,\n  parse,\n  library,\n  findIconDefinition,\n  toHtml\n};\nconst autoReplace = function () {\n  let params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n  const {\n    autoReplaceSvgRoot = DOCUMENT\n  } = params;\n  if ((Object.keys(namespace.styles).length > 0 || config.autoFetchSvg) && IS_DOM && config.autoReplaceSvg) api.dom.i2svg({\n    node: autoReplaceSvgRoot\n  });\n};\n\nfunction domVariants(val, abstractCreator) {\n  Object.defineProperty(val, 'abstract', {\n    get: abstractCreator\n  });\n  Object.defineProperty(val, 'html', {\n    get: function () {\n      return val.abstract.map(a => toHtml(a));\n    }\n  });\n  Object.defineProperty(val, 'node', {\n    get: function () {\n      if (!IS_DOM) return;\n      const container = DOCUMENT.createElement('div');\n      container.innerHTML = val.html;\n      return container.children;\n    }\n  });\n  return val;\n}\n\nfunction asIcon (_ref) {\n  let {\n    children,\n    main,\n    mask,\n    attributes,\n    styles,\n    transform\n  } = _ref;\n  if (transformIsMeaningful(transform) && main.found && !mask.found) {\n    const {\n      width,\n      height\n    } = main;\n    const offset = {\n      x: width / height / 2,\n      y: 0.5\n    };\n    attributes['style'] = joinStyles(_objectSpread2(_objectSpread2({}, styles), {}, {\n      'transform-origin': \"\".concat(offset.x + transform.x / 16, \"em \").concat(offset.y + transform.y / 16, \"em\")\n    }));\n  }\n  return [{\n    tag: 'svg',\n    attributes,\n    children\n  }];\n}\n\nfunction asSymbol (_ref) {\n  let {\n    prefix,\n    iconName,\n    children,\n    attributes,\n    symbol\n  } = _ref;\n  const id = symbol === true ? \"\".concat(prefix, \"-\").concat(config.cssPrefix, \"-\").concat(iconName) : symbol;\n  return [{\n    tag: 'svg',\n    attributes: {\n      style: 'display: none;'\n    },\n    children: [{\n      tag: 'symbol',\n      attributes: _objectSpread2(_objectSpread2({}, attributes), {}, {\n        id\n      }),\n      children\n    }]\n  }];\n}\n\nfunction makeInlineSvgAbstract(params) {\n  const {\n    icons: {\n      main,\n      mask\n    },\n    prefix,\n    iconName,\n    transform,\n    symbol,\n    title,\n    maskId,\n    titleId,\n    extra,\n    watchable = false\n  } = params;\n  const {\n    width,\n    height\n  } = mask.found ? mask : main;\n  const isUploadedIcon = Lt.includes(prefix);\n  const attrClass = [config.replacementClass, iconName ? \"\".concat(config.cssPrefix, \"-\").concat(iconName) : ''].filter(c$$1 => extra.classes.indexOf(c$$1) === -1).filter(c$$1 => c$$1 !== '' || !!c$$1).concat(extra.classes).join(' ');\n  let content = {\n    children: [],\n    attributes: _objectSpread2(_objectSpread2({}, extra.attributes), {}, {\n      'data-prefix': prefix,\n      'data-icon': iconName,\n      'class': attrClass,\n      'role': extra.attributes.role || 'img',\n      'xmlns': 'http://www.w3.org/2000/svg',\n      'viewBox': \"0 0 \".concat(width, \" \").concat(height)\n    })\n  };\n  const uploadedIconWidthStyle = isUploadedIcon && !~extra.classes.indexOf('fa-fw') ? {\n    width: \"\".concat(width / height * 16 * 0.0625, \"em\")\n  } : {};\n  if (watchable) {\n    content.attributes[DATA_FA_I2SVG] = '';\n  }\n  if (title) {\n    content.children.push({\n      tag: 'title',\n      attributes: {\n        id: content.attributes['aria-labelledby'] || \"title-\".concat(titleId || nextUniqueId())\n      },\n      children: [title]\n    });\n    delete content.attributes.title;\n  }\n  const args = _objectSpread2(_objectSpread2({}, content), {}, {\n    prefix,\n    iconName,\n    main,\n    mask,\n    maskId,\n    transform,\n    symbol,\n    styles: _objectSpread2(_objectSpread2({}, uploadedIconWidthStyle), extra.styles)\n  });\n  const {\n    children,\n    attributes\n  } = mask.found && main.found ? callProvided('generateAbstractMask', args) || {\n    children: [],\n    attributes: {}\n  } : callProvided('generateAbstractIcon', args) || {\n    children: [],\n    attributes: {}\n  };\n  args.children = children;\n  args.attributes = attributes;\n  if (symbol) {\n    return asSymbol(args);\n  } else {\n    return asIcon(args);\n  }\n}\nfunction makeLayersTextAbstract(params) {\n  const {\n    content,\n    width,\n    height,\n    transform,\n    title,\n    extra,\n    watchable = false\n  } = params;\n  const attributes = _objectSpread2(_objectSpread2(_objectSpread2({}, extra.attributes), title ? {\n    'title': title\n  } : {}), {}, {\n    'class': extra.classes.join(' ')\n  });\n  if (watchable) {\n    attributes[DATA_FA_I2SVG] = '';\n  }\n  const styles = _objectSpread2({}, extra.styles);\n  if (transformIsMeaningful(transform)) {\n    styles['transform'] = transformForCss({\n      transform,\n      startCentered: true,\n      width,\n      height\n    });\n    styles['-webkit-transform'] = styles['transform'];\n  }\n  const styleString = joinStyles(styles);\n  if (styleString.length > 0) {\n    attributes['style'] = styleString;\n  }\n  const val = [];\n  val.push({\n    tag: 'span',\n    attributes,\n    children: [content]\n  });\n  if (title) {\n    val.push({\n      tag: 'span',\n      attributes: {\n        class: 'sr-only'\n      },\n      children: [title]\n    });\n  }\n  return val;\n}\nfunction makeLayersCounterAbstract(params) {\n  const {\n    content,\n    title,\n    extra\n  } = params;\n  const attributes = _objectSpread2(_objectSpread2(_objectSpread2({}, extra.attributes), title ? {\n    'title': title\n  } : {}), {}, {\n    'class': extra.classes.join(' ')\n  });\n  const styleString = joinStyles(extra.styles);\n  if (styleString.length > 0) {\n    attributes['style'] = styleString;\n  }\n  const val = [];\n  val.push({\n    tag: 'span',\n    attributes,\n    children: [content]\n  });\n  if (title) {\n    val.push({\n      tag: 'span',\n      attributes: {\n        class: 'sr-only'\n      },\n      children: [title]\n    });\n  }\n  return val;\n}\n\nconst {\n  styles: styles$1\n} = namespace;\nfunction asFoundIcon(icon) {\n  const width = icon[0];\n  const height = icon[1];\n  const [vectorData] = icon.slice(4);\n  let element = null;\n  if (Array.isArray(vectorData)) {\n    element = {\n      tag: 'g',\n      attributes: {\n        class: \"\".concat(config.cssPrefix, \"-\").concat(DUOTONE_CLASSES.GROUP)\n      },\n      children: [{\n        tag: 'path',\n        attributes: {\n          class: \"\".concat(config.cssPrefix, \"-\").concat(DUOTONE_CLASSES.SECONDARY),\n          fill: 'currentColor',\n          d: vectorData[0]\n        }\n      }, {\n        tag: 'path',\n        attributes: {\n          class: \"\".concat(config.cssPrefix, \"-\").concat(DUOTONE_CLASSES.PRIMARY),\n          fill: 'currentColor',\n          d: vectorData[1]\n        }\n      }]\n    };\n  } else {\n    element = {\n      tag: 'path',\n      attributes: {\n        fill: 'currentColor',\n        d: vectorData\n      }\n    };\n  }\n  return {\n    found: true,\n    width,\n    height,\n    icon: element\n  };\n}\nconst missingIconResolutionMixin = {\n  found: false,\n  width: 512,\n  height: 512\n};\nfunction maybeNotifyMissing(iconName, prefix) {\n  if (!PRODUCTION && !config.showMissingIcons && iconName) {\n    console.error(\"Icon with name \\\"\".concat(iconName, \"\\\" and prefix \\\"\").concat(prefix, \"\\\" is missing.\"));\n  }\n}\nfunction findIcon(iconName, prefix) {\n  let givenPrefix = prefix;\n  if (prefix === 'fa' && config.styleDefault !== null) {\n    prefix = getDefaultUsablePrefix();\n  }\n  return new Promise((resolve, reject) => {\n    if (givenPrefix === 'fa') {\n      const shim = byOldName(iconName) || {};\n      iconName = shim.iconName || iconName;\n      prefix = shim.prefix || prefix;\n    }\n    if (iconName && prefix && styles$1[prefix] && styles$1[prefix][iconName]) {\n      const icon = styles$1[prefix][iconName];\n      return resolve(asFoundIcon(icon));\n    }\n    maybeNotifyMissing(iconName, prefix);\n    resolve(_objectSpread2(_objectSpread2({}, missingIconResolutionMixin), {}, {\n      icon: config.showMissingIcons && iconName ? callProvided('missingIconAbstract') || {} : {}\n    }));\n  });\n}\n\nconst noop$1 = () => {};\nconst p$2 = config.measurePerformance && PERFORMANCE && PERFORMANCE.mark && PERFORMANCE.measure ? PERFORMANCE : {\n  mark: noop$1,\n  measure: noop$1\n};\nconst preamble = \"FA \\\"6.7.2\\\"\";\nconst begin = name => {\n  p$2.mark(\"\".concat(preamble, \" \").concat(name, \" begins\"));\n  return () => end(name);\n};\nconst end = name => {\n  p$2.mark(\"\".concat(preamble, \" \").concat(name, \" ends\"));\n  p$2.measure(\"\".concat(preamble, \" \").concat(name), \"\".concat(preamble, \" \").concat(name, \" begins\"), \"\".concat(preamble, \" \").concat(name, \" ends\"));\n};\nvar perf = {\n  begin,\n  end\n};\n\nconst noop$2 = () => {};\nfunction isWatched(node) {\n  const i2svg = node.getAttribute ? node.getAttribute(DATA_FA_I2SVG) : null;\n  return typeof i2svg === 'string';\n}\nfunction hasPrefixAndIcon(node) {\n  const prefix = node.getAttribute ? node.getAttribute(DATA_PREFIX) : null;\n  const icon = node.getAttribute ? node.getAttribute(DATA_ICON) : null;\n  return prefix && icon;\n}\nfunction hasBeenReplaced(node) {\n  return node && node.classList && node.classList.contains && node.classList.contains(config.replacementClass);\n}\nfunction getMutator() {\n  if (config.autoReplaceSvg === true) {\n    return mutators.replace;\n  }\n  const mutator = mutators[config.autoReplaceSvg];\n  return mutator || mutators.replace;\n}\nfunction createElementNS(tag) {\n  return DOCUMENT.createElementNS('http://www.w3.org/2000/svg', tag);\n}\nfunction createElement(tag) {\n  return DOCUMENT.createElement(tag);\n}\nfunction convertSVG(abstractObj) {\n  let params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  const {\n    ceFn = abstractObj.tag === 'svg' ? createElementNS : createElement\n  } = params;\n  if (typeof abstractObj === 'string') {\n    return DOCUMENT.createTextNode(abstractObj);\n  }\n  const tag = ceFn(abstractObj.tag);\n  Object.keys(abstractObj.attributes || []).forEach(function (key) {\n    tag.setAttribute(key, abstractObj.attributes[key]);\n  });\n  const children = abstractObj.children || [];\n  children.forEach(function (child) {\n    tag.appendChild(convertSVG(child, {\n      ceFn\n    }));\n  });\n  return tag;\n}\nfunction nodeAsComment(node) {\n  let comment = \" \".concat(node.outerHTML, \" \");\n  /* BEGIN.ATTRIBUTION */\n  comment = \"\".concat(comment, \"Font Awesome fontawesome.com \");\n  /* END.ATTRIBUTION */\n  return comment;\n}\nconst mutators = {\n  replace: function (mutation) {\n    const node = mutation[0];\n    if (node.parentNode) {\n      mutation[1].forEach(abstract => {\n        node.parentNode.insertBefore(convertSVG(abstract), node);\n      });\n      if (node.getAttribute(DATA_FA_I2SVG) === null && config.keepOriginalSource) {\n        let comment = DOCUMENT.createComment(nodeAsComment(node));\n        node.parentNode.replaceChild(comment, node);\n      } else {\n        node.remove();\n      }\n    }\n  },\n  nest: function (mutation) {\n    const node = mutation[0];\n    const abstract = mutation[1];\n\n    // If we already have a replaced node we do not want to continue nesting within it.\n    // Short-circuit to the standard replacement\n    if (~classArray(node).indexOf(config.replacementClass)) {\n      return mutators.replace(mutation);\n    }\n    const forSvg = new RegExp(\"\".concat(config.cssPrefix, \"-.*\"));\n    delete abstract[0].attributes.id;\n    if (abstract[0].attributes.class) {\n      const splitClasses = abstract[0].attributes.class.split(' ').reduce((acc, cls) => {\n        if (cls === config.replacementClass || cls.match(forSvg)) {\n          acc.toSvg.push(cls);\n        } else {\n          acc.toNode.push(cls);\n        }\n        return acc;\n      }, {\n        toNode: [],\n        toSvg: []\n      });\n      abstract[0].attributes.class = splitClasses.toSvg.join(' ');\n      if (splitClasses.toNode.length === 0) {\n        node.removeAttribute('class');\n      } else {\n        node.setAttribute('class', splitClasses.toNode.join(' '));\n      }\n    }\n    const newInnerHTML = abstract.map(a => toHtml(a)).join('\\n');\n    node.setAttribute(DATA_FA_I2SVG, '');\n    node.innerHTML = newInnerHTML;\n  }\n};\nfunction performOperationSync(op) {\n  op();\n}\nfunction perform(mutations, callback) {\n  const callbackFunction = typeof callback === 'function' ? callback : noop$2;\n  if (mutations.length === 0) {\n    callbackFunction();\n  } else {\n    let frame = performOperationSync;\n    if (config.mutateApproach === MUTATION_APPROACH_ASYNC) {\n      frame = WINDOW.requestAnimationFrame || performOperationSync;\n    }\n    frame(() => {\n      const mutator = getMutator();\n      const mark = perf.begin('mutate');\n      mutations.map(mutator);\n      mark();\n      callbackFunction();\n    });\n  }\n}\nlet disabled = false;\nfunction disableObservation() {\n  disabled = true;\n}\nfunction enableObservation() {\n  disabled = false;\n}\nlet mo = null;\nfunction observe(options) {\n  if (!MUTATION_OBSERVER) {\n    return;\n  }\n  if (!config.observeMutations) {\n    return;\n  }\n  const {\n    treeCallback = noop$2,\n    nodeCallback = noop$2,\n    pseudoElementsCallback = noop$2,\n    observeMutationsRoot = DOCUMENT\n  } = options;\n  mo = new MUTATION_OBSERVER(objects => {\n    if (disabled) return;\n    const defaultPrefix = getDefaultUsablePrefix();\n    toArray(objects).forEach(mutationRecord => {\n      if (mutationRecord.type === 'childList' && mutationRecord.addedNodes.length > 0 && !isWatched(mutationRecord.addedNodes[0])) {\n        if (config.searchPseudoElements) {\n          pseudoElementsCallback(mutationRecord.target);\n        }\n        treeCallback(mutationRecord.target);\n      }\n      if (mutationRecord.type === 'attributes' && mutationRecord.target.parentNode && config.searchPseudoElements) {\n        pseudoElementsCallback(mutationRecord.target.parentNode);\n      }\n      if (mutationRecord.type === 'attributes' && isWatched(mutationRecord.target) && ~ATTRIBUTES_WATCHED_FOR_MUTATION.indexOf(mutationRecord.attributeName)) {\n        if (mutationRecord.attributeName === 'class' && hasPrefixAndIcon(mutationRecord.target)) {\n          const {\n            prefix,\n            iconName\n          } = getCanonicalIcon(classArray(mutationRecord.target));\n          mutationRecord.target.setAttribute(DATA_PREFIX, prefix || defaultPrefix);\n          if (iconName) mutationRecord.target.setAttribute(DATA_ICON, iconName);\n        } else if (hasBeenReplaced(mutationRecord.target)) {\n          nodeCallback(mutationRecord.target);\n        }\n      }\n    });\n  });\n  if (!IS_DOM) return;\n  mo.observe(observeMutationsRoot, {\n    childList: true,\n    attributes: true,\n    characterData: true,\n    subtree: true\n  });\n}\nfunction disconnect() {\n  if (!mo) return;\n  mo.disconnect();\n}\n\nfunction styleParser (node) {\n  const style = node.getAttribute('style');\n  let val = [];\n  if (style) {\n    val = style.split(';').reduce((acc, style) => {\n      const styles = style.split(':');\n      const prop = styles[0];\n      const value = styles.slice(1);\n      if (prop && value.length > 0) {\n        acc[prop] = value.join(':').trim();\n      }\n      return acc;\n    }, {});\n  }\n  return val;\n}\n\nfunction classParser (node) {\n  const existingPrefix = node.getAttribute('data-prefix');\n  const existingIconName = node.getAttribute('data-icon');\n  const innerText = node.innerText !== undefined ? node.innerText.trim() : '';\n  let val = getCanonicalIcon(classArray(node));\n  if (!val.prefix) {\n    val.prefix = getDefaultUsablePrefix();\n  }\n  if (existingPrefix && existingIconName) {\n    val.prefix = existingPrefix;\n    val.iconName = existingIconName;\n  }\n  if (val.iconName && val.prefix) {\n    return val;\n  }\n  if (val.prefix && innerText.length > 0) {\n    val.iconName = byLigature(val.prefix, node.innerText) || byUnicode(val.prefix, toHex(node.innerText));\n  }\n  if (!val.iconName && config.autoFetchSvg && node.firstChild && node.firstChild.nodeType === Node.TEXT_NODE) {\n    val.iconName = node.firstChild.data;\n  }\n  return val;\n}\n\nfunction attributesParser (node) {\n  const extraAttributes = toArray(node.attributes).reduce((acc, attr) => {\n    if (acc.name !== 'class' && acc.name !== 'style') {\n      acc[attr.name] = attr.value;\n    }\n    return acc;\n  }, {});\n  const title = node.getAttribute('title');\n  const titleId = node.getAttribute('data-fa-title-id');\n  if (config.autoA11y) {\n    if (title) {\n      extraAttributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(titleId || nextUniqueId());\n    } else {\n      extraAttributes['aria-hidden'] = 'true';\n      extraAttributes['focusable'] = 'false';\n    }\n  }\n  return extraAttributes;\n}\n\nfunction blankMeta() {\n  return {\n    iconName: null,\n    title: null,\n    titleId: null,\n    prefix: null,\n    transform: meaninglessTransform,\n    symbol: false,\n    mask: {\n      iconName: null,\n      prefix: null,\n      rest: []\n    },\n    maskId: null,\n    extra: {\n      classes: [],\n      styles: {},\n      attributes: {}\n    }\n  };\n}\nfunction parseMeta(node) {\n  let parser = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n    styleParser: true\n  };\n  const {\n    iconName,\n    prefix,\n    rest: extraClasses\n  } = classParser(node);\n  const extraAttributes = attributesParser(node);\n  const pluginMeta = chainHooks('parseNodeAttributes', {}, node);\n  let extraStyles = parser.styleParser ? styleParser(node) : [];\n  return _objectSpread2({\n    iconName,\n    title: node.getAttribute('title'),\n    titleId: node.getAttribute('data-fa-title-id'),\n    prefix,\n    transform: meaninglessTransform,\n    mask: {\n      iconName: null,\n      prefix: null,\n      rest: []\n    },\n    maskId: null,\n    symbol: false,\n    extra: {\n      classes: extraClasses,\n      styles: extraStyles,\n      attributes: extraAttributes\n    }\n  }, pluginMeta);\n}\n\nconst {\n  styles: styles$2\n} = namespace;\nfunction generateMutation(node) {\n  const nodeMeta = config.autoReplaceSvg === 'nest' ? parseMeta(node, {\n    styleParser: false\n  }) : parseMeta(node);\n  if (~nodeMeta.extra.classes.indexOf(LAYERS_TEXT_CLASSNAME)) {\n    return callProvided('generateLayersText', node, nodeMeta);\n  } else {\n    return callProvided('generateSvgReplacementMutation', node, nodeMeta);\n  }\n}\nfunction getKnownPrefixes() {\n  return [...Ft, ...Ia];\n}\nfunction onTree(root) {\n  let callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n  if (!IS_DOM) return Promise.resolve();\n  const htmlClassList = DOCUMENT.documentElement.classList;\n  const hclAdd = suffix => htmlClassList.add(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n  const hclRemove = suffix => htmlClassList.remove(\"\".concat(HTML_CLASS_I2SVG_BASE_CLASS, \"-\").concat(suffix));\n  const prefixes = config.autoFetchSvg ? getKnownPrefixes() : P.concat(Object.keys(styles$2));\n  if (!prefixes.includes('fa')) {\n    prefixes.push('fa');\n  }\n  const prefixesDomQuery = [\".\".concat(LAYERS_TEXT_CLASSNAME, \":not([\").concat(DATA_FA_I2SVG, \"])\")].concat(prefixes.map(p$$1 => \".\".concat(p$$1, \":not([\").concat(DATA_FA_I2SVG, \"])\"))).join(', ');\n  if (prefixesDomQuery.length === 0) {\n    return Promise.resolve();\n  }\n  let candidates = [];\n  try {\n    candidates = toArray(root.querySelectorAll(prefixesDomQuery));\n  } catch (e$$1) {\n    // noop\n  }\n  if (candidates.length > 0) {\n    hclAdd('pending');\n    hclRemove('complete');\n  } else {\n    return Promise.resolve();\n  }\n  const mark = perf.begin('onTree');\n  const mutations = candidates.reduce((acc, node) => {\n    try {\n      const mutation = generateMutation(node);\n      if (mutation) {\n        acc.push(mutation);\n      }\n    } catch (e$$1) {\n      if (!PRODUCTION) {\n        if (e$$1.name === 'MissingIcon') {\n          console.error(e$$1);\n        }\n      }\n    }\n    return acc;\n  }, []);\n  return new Promise((resolve, reject) => {\n    Promise.all(mutations).then(resolvedMutations => {\n      perform(resolvedMutations, () => {\n        hclAdd('active');\n        hclAdd('complete');\n        hclRemove('pending');\n        if (typeof callback === 'function') callback();\n        mark();\n        resolve();\n      });\n    }).catch(e$$1 => {\n      mark();\n      reject(e$$1);\n    });\n  });\n}\nfunction onNode(node) {\n  let callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n  generateMutation(node).then(mutation => {\n    if (mutation) {\n      perform([mutation], callback);\n    }\n  });\n}\nfunction resolveIcons(next) {\n  return function (maybeIconDefinition) {\n    let params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    const iconDefinition = (maybeIconDefinition || {}).icon ? maybeIconDefinition : findIconDefinition(maybeIconDefinition || {});\n    let {\n      mask\n    } = params;\n    if (mask) {\n      mask = (mask || {}).icon ? mask : findIconDefinition(mask || {});\n    }\n    return next(iconDefinition, _objectSpread2(_objectSpread2({}, params), {}, {\n      mask\n    }));\n  };\n}\nconst render = function (iconDefinition) {\n  let params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n  const {\n    transform = meaninglessTransform,\n    symbol = false,\n    mask = null,\n    maskId = null,\n    title = null,\n    titleId = null,\n    classes = [],\n    attributes = {},\n    styles = {}\n  } = params;\n  if (!iconDefinition) return;\n  const {\n    prefix,\n    iconName,\n    icon\n  } = iconDefinition;\n  return domVariants(_objectSpread2({\n    type: 'icon'\n  }, iconDefinition), () => {\n    callHooks('beforeDOMElementCreation', {\n      iconDefinition,\n      params\n    });\n    if (config.autoA11y) {\n      if (title) {\n        attributes['aria-labelledby'] = \"\".concat(config.replacementClass, \"-title-\").concat(titleId || nextUniqueId());\n      } else {\n        attributes['aria-hidden'] = 'true';\n        attributes['focusable'] = 'false';\n      }\n    }\n    return makeInlineSvgAbstract({\n      icons: {\n        main: asFoundIcon(icon),\n        mask: mask ? asFoundIcon(mask.icon) : {\n          found: false,\n          width: null,\n          height: null,\n          icon: {}\n        }\n      },\n      prefix,\n      iconName,\n      transform: _objectSpread2(_objectSpread2({}, meaninglessTransform), transform),\n      symbol,\n      title,\n      maskId,\n      titleId,\n      extra: {\n        attributes,\n        styles,\n        classes\n      }\n    });\n  });\n};\nvar ReplaceElements = {\n  mixout() {\n    return {\n      icon: resolveIcons(render)\n    };\n  },\n  hooks() {\n    return {\n      mutationObserverCallbacks(accumulator) {\n        accumulator.treeCallback = onTree;\n        accumulator.nodeCallback = onNode;\n        return accumulator;\n      }\n    };\n  },\n  provides(providers$$1) {\n    providers$$1.i2svg = function (params) {\n      const {\n        node = DOCUMENT,\n        callback = () => {}\n      } = params;\n      return onTree(node, callback);\n    };\n    providers$$1.generateSvgReplacementMutation = function (node, nodeMeta) {\n      const {\n        iconName,\n        title,\n        titleId,\n        prefix,\n        transform,\n        symbol,\n        mask,\n        maskId,\n        extra\n      } = nodeMeta;\n      return new Promise((resolve, reject) => {\n        Promise.all([findIcon(iconName, prefix), mask.iconName ? findIcon(mask.iconName, mask.prefix) : Promise.resolve({\n          found: false,\n          width: 512,\n          height: 512,\n          icon: {}\n        })]).then(_ref => {\n          let [main, mask] = _ref;\n          resolve([node, makeInlineSvgAbstract({\n            icons: {\n              main,\n              mask\n            },\n            prefix,\n            iconName,\n            transform,\n            symbol,\n            maskId,\n            title,\n            titleId,\n            extra,\n            watchable: true\n          })]);\n        }).catch(reject);\n      });\n    };\n    providers$$1.generateAbstractIcon = function (_ref2) {\n      let {\n        children,\n        attributes,\n        main,\n        transform,\n        styles\n      } = _ref2;\n      const styleString = joinStyles(styles);\n      if (styleString.length > 0) {\n        attributes['style'] = styleString;\n      }\n      let nextChild;\n      if (transformIsMeaningful(transform)) {\n        nextChild = callProvided('generateAbstractTransformGrouping', {\n          main,\n          transform,\n          containerWidth: main.width,\n          iconWidth: main.width\n        });\n      }\n      children.push(nextChild || main.icon);\n      return {\n        children,\n        attributes\n      };\n    };\n  }\n};\n\nvar Layers = {\n  mixout() {\n    return {\n      layer(assembler) {\n        let params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        const {\n          classes = []\n        } = params;\n        return domVariants({\n          type: 'layer'\n        }, () => {\n          callHooks('beforeDOMElementCreation', {\n            assembler,\n            params\n          });\n          let children = [];\n          assembler(args => {\n            Array.isArray(args) ? args.map(a => {\n              children = children.concat(a.abstract);\n            }) : children = children.concat(args.abstract);\n          });\n          return [{\n            tag: 'span',\n            attributes: {\n              class: [\"\".concat(config.cssPrefix, \"-layers\"), ...classes].join(' ')\n            },\n            children\n          }];\n        });\n      }\n    };\n  }\n};\n\nvar LayersCounter = {\n  mixout() {\n    return {\n      counter(content) {\n        let params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        const {\n          title = null,\n          classes = [],\n          attributes = {},\n          styles = {}\n        } = params;\n        return domVariants({\n          type: 'counter',\n          content\n        }, () => {\n          callHooks('beforeDOMElementCreation', {\n            content,\n            params\n          });\n          return makeLayersCounterAbstract({\n            content: content.toString(),\n            title,\n            extra: {\n              attributes,\n              styles,\n              classes: [\"\".concat(config.cssPrefix, \"-layers-counter\"), ...classes]\n            }\n          });\n        });\n      }\n    };\n  }\n};\n\nvar LayersText = {\n  mixout() {\n    return {\n      text(content) {\n        let params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n        const {\n          transform = meaninglessTransform,\n          title = null,\n          classes = [],\n          attributes = {},\n          styles = {}\n        } = params;\n        return domVariants({\n          type: 'text',\n          content\n        }, () => {\n          callHooks('beforeDOMElementCreation', {\n            content,\n            params\n          });\n          return makeLayersTextAbstract({\n            content,\n            transform: _objectSpread2(_objectSpread2({}, meaninglessTransform), transform),\n            title,\n            extra: {\n              attributes,\n              styles,\n              classes: [\"\".concat(config.cssPrefix, \"-layers-text\"), ...classes]\n            }\n          });\n        });\n      }\n    };\n  },\n  provides(providers$$1) {\n    providers$$1.generateLayersText = function (node, nodeMeta) {\n      const {\n        title,\n        transform,\n        extra\n      } = nodeMeta;\n      let width = null;\n      let height = null;\n      if (IS_IE) {\n        const computedFontSize = parseInt(getComputedStyle(node).fontSize, 10);\n        const boundingClientRect = node.getBoundingClientRect();\n        width = boundingClientRect.width / computedFontSize;\n        height = boundingClientRect.height / computedFontSize;\n      }\n      if (config.autoA11y && !title) {\n        extra.attributes['aria-hidden'] = 'true';\n      }\n      return Promise.resolve([node, makeLayersTextAbstract({\n        content: node.innerHTML,\n        width,\n        height,\n        transform,\n        title,\n        extra,\n        watchable: true\n      })]);\n    };\n  }\n};\n\nconst CLEAN_CONTENT_PATTERN = new RegExp('\\u{22}', 'ug');\nconst SECONDARY_UNICODE_RANGE = [1105920, 1112319];\nconst _FONT_FAMILY_WEIGHT_TO_PREFIX = _objectSpread2(_objectSpread2(_objectSpread2(_objectSpread2({}, {\n  FontAwesome: {\n    normal: 'fas',\n    400: 'fas'\n  }\n}), lt), wa), Yt);\nconst FONT_FAMILY_WEIGHT_TO_PREFIX = Object.keys(_FONT_FAMILY_WEIGHT_TO_PREFIX).reduce((acc, key) => {\n  acc[key.toLowerCase()] = _FONT_FAMILY_WEIGHT_TO_PREFIX[key];\n  return acc;\n}, {});\nconst FONT_FAMILY_WEIGHT_FALLBACK = Object.keys(FONT_FAMILY_WEIGHT_TO_PREFIX).reduce((acc, fontFamily) => {\n  const weights = FONT_FAMILY_WEIGHT_TO_PREFIX[fontFamily];\n  acc[fontFamily] = weights[900] || [...Object.entries(weights)][0][1];\n  return acc;\n}, {});\nfunction hexValueFromContent(content) {\n  const cleaned = content.replace(CLEAN_CONTENT_PATTERN, '');\n  const codePoint = codePointAt(cleaned, 0);\n  const isPrependTen = codePoint >= SECONDARY_UNICODE_RANGE[0] && codePoint <= SECONDARY_UNICODE_RANGE[1];\n  const isDoubled = cleaned.length === 2 ? cleaned[0] === cleaned[1] : false;\n  return {\n    value: isDoubled ? toHex(cleaned[0]) : toHex(cleaned),\n    isSecondary: isPrependTen || isDoubled\n  };\n}\nfunction getPrefix(fontFamily, fontWeight) {\n  const fontFamilySanitized = fontFamily.replace(/^['\"]|['\"]$/g, '').toLowerCase();\n  const fontWeightInteger = parseInt(fontWeight);\n  const fontWeightSanitized = isNaN(fontWeightInteger) ? 'normal' : fontWeightInteger;\n  return (FONT_FAMILY_WEIGHT_TO_PREFIX[fontFamilySanitized] || {})[fontWeightSanitized] || FONT_FAMILY_WEIGHT_FALLBACK[fontFamilySanitized];\n}\nfunction replaceForPosition(node, position) {\n  const pendingAttribute = \"\".concat(DATA_FA_PSEUDO_ELEMENT_PENDING).concat(position.replace(':', '-'));\n  return new Promise((resolve, reject) => {\n    if (node.getAttribute(pendingAttribute) !== null) {\n      // This node is already being processed\n      return resolve();\n    }\n    const children = toArray(node.children);\n    const alreadyProcessedPseudoElement = children.filter(c$$1 => c$$1.getAttribute(DATA_FA_PSEUDO_ELEMENT) === position)[0];\n    const styles = WINDOW.getComputedStyle(node, position);\n    const fontFamily = styles.getPropertyValue('font-family');\n    const fontFamilyMatch = fontFamily.match(FONT_FAMILY_PATTERN);\n    const fontWeight = styles.getPropertyValue('font-weight');\n    const content = styles.getPropertyValue('content');\n    if (alreadyProcessedPseudoElement && !fontFamilyMatch) {\n      // If we've already processed it but the current computed style does not result in a font-family,\n      // that probably means that a class name that was previously present to make the icon has been\n      // removed. So we now should delete the icon.\n      node.removeChild(alreadyProcessedPseudoElement);\n      return resolve();\n    } else if (fontFamilyMatch && content !== 'none' && content !== '') {\n      const content = styles.getPropertyValue('content');\n      let prefix = getPrefix(fontFamily, fontWeight);\n      const {\n        value: hexValue,\n        isSecondary\n      } = hexValueFromContent(content);\n      const isV4 = fontFamilyMatch[0].startsWith('FontAwesome');\n      let iconName = byUnicode(prefix, hexValue);\n      let iconIdentifier = iconName;\n      if (isV4) {\n        const iconName4 = byOldUnicode(hexValue);\n        if (iconName4.iconName && iconName4.prefix) {\n          iconName = iconName4.iconName;\n          prefix = iconName4.prefix;\n        }\n      }\n\n      // Only convert the pseudo element in this ::before/::after position into an icon if we haven't\n      // already done so with the same prefix and iconName\n      if (iconName && !isSecondary && (!alreadyProcessedPseudoElement || alreadyProcessedPseudoElement.getAttribute(DATA_PREFIX) !== prefix || alreadyProcessedPseudoElement.getAttribute(DATA_ICON) !== iconIdentifier)) {\n        node.setAttribute(pendingAttribute, iconIdentifier);\n        if (alreadyProcessedPseudoElement) {\n          // Delete the old one, since we're replacing it with a new one\n          node.removeChild(alreadyProcessedPseudoElement);\n        }\n        const meta = blankMeta();\n        const {\n          extra\n        } = meta;\n        extra.attributes[DATA_FA_PSEUDO_ELEMENT] = position;\n        findIcon(iconName, prefix).then(main => {\n          const abstract = makeInlineSvgAbstract(_objectSpread2(_objectSpread2({}, meta), {}, {\n            icons: {\n              main,\n              mask: emptyCanonicalIcon()\n            },\n            prefix,\n            iconName: iconIdentifier,\n            extra,\n            watchable: true\n          }));\n          const element = DOCUMENT.createElementNS('http://www.w3.org/2000/svg', 'svg');\n          if (position === '::before') {\n            node.insertBefore(element, node.firstChild);\n          } else {\n            node.appendChild(element);\n          }\n          element.outerHTML = abstract.map(a$$1 => toHtml(a$$1)).join('\\n');\n          node.removeAttribute(pendingAttribute);\n          resolve();\n        }).catch(reject);\n      } else {\n        resolve();\n      }\n    } else {\n      resolve();\n    }\n  });\n}\nfunction replace(node) {\n  return Promise.all([replaceForPosition(node, '::before'), replaceForPosition(node, '::after')]);\n}\nfunction processable(node) {\n  return node.parentNode !== document.head && !~TAGNAMES_TO_SKIP_FOR_PSEUDOELEMENTS.indexOf(node.tagName.toUpperCase()) && !node.getAttribute(DATA_FA_PSEUDO_ELEMENT) && (!node.parentNode || node.parentNode.tagName !== 'svg');\n}\nfunction searchPseudoElements(root) {\n  if (!IS_DOM) return;\n  return new Promise((resolve, reject) => {\n    const operations = toArray(root.querySelectorAll('*')).filter(processable).map(replace);\n    const end = perf.begin('searchPseudoElements');\n    disableObservation();\n    Promise.all(operations).then(() => {\n      end();\n      enableObservation();\n      resolve();\n    }).catch(() => {\n      end();\n      enableObservation();\n      reject();\n    });\n  });\n}\nvar PseudoElements = {\n  hooks() {\n    return {\n      mutationObserverCallbacks(accumulator) {\n        accumulator.pseudoElementsCallback = searchPseudoElements;\n        return accumulator;\n      }\n    };\n  },\n  provides(providers) {\n    providers.pseudoElements2svg = function (params) {\n      const {\n        node = DOCUMENT\n      } = params;\n      if (config.searchPseudoElements) {\n        searchPseudoElements(node);\n      }\n    };\n  }\n};\n\nlet _unwatched = false;\nvar MutationObserver$1 = {\n  mixout() {\n    return {\n      dom: {\n        unwatch() {\n          disableObservation();\n          _unwatched = true;\n        }\n      }\n    };\n  },\n  hooks() {\n    return {\n      bootstrap() {\n        observe(chainHooks('mutationObserverCallbacks', {}));\n      },\n      noAuto() {\n        disconnect();\n      },\n      watch(params) {\n        const {\n          observeMutationsRoot\n        } = params;\n        if (_unwatched) {\n          enableObservation();\n        } else {\n          observe(chainHooks('mutationObserverCallbacks', {\n            observeMutationsRoot\n          }));\n        }\n      }\n    };\n  }\n};\n\nconst parseTransformString = transformString => {\n  let transform = {\n    size: 16,\n    x: 0,\n    y: 0,\n    flipX: false,\n    flipY: false,\n    rotate: 0\n  };\n  return transformString.toLowerCase().split(' ').reduce((acc, n) => {\n    const parts = n.toLowerCase().split('-');\n    const first = parts[0];\n    let rest = parts.slice(1).join('-');\n    if (first && rest === 'h') {\n      acc.flipX = true;\n      return acc;\n    }\n    if (first && rest === 'v') {\n      acc.flipY = true;\n      return acc;\n    }\n    rest = parseFloat(rest);\n    if (isNaN(rest)) {\n      return acc;\n    }\n    switch (first) {\n      case 'grow':\n        acc.size = acc.size + rest;\n        break;\n      case 'shrink':\n        acc.size = acc.size - rest;\n        break;\n      case 'left':\n        acc.x = acc.x - rest;\n        break;\n      case 'right':\n        acc.x = acc.x + rest;\n        break;\n      case 'up':\n        acc.y = acc.y - rest;\n        break;\n      case 'down':\n        acc.y = acc.y + rest;\n        break;\n      case 'rotate':\n        acc.rotate = acc.rotate + rest;\n        break;\n    }\n    return acc;\n  }, transform);\n};\nvar PowerTransforms = {\n  mixout() {\n    return {\n      parse: {\n        transform: transformString => {\n          return parseTransformString(transformString);\n        }\n      }\n    };\n  },\n  hooks() {\n    return {\n      parseNodeAttributes(accumulator, node) {\n        const transformString = node.getAttribute('data-fa-transform');\n        if (transformString) {\n          accumulator.transform = parseTransformString(transformString);\n        }\n        return accumulator;\n      }\n    };\n  },\n  provides(providers) {\n    providers.generateAbstractTransformGrouping = function (_ref) {\n      let {\n        main,\n        transform,\n        containerWidth,\n        iconWidth\n      } = _ref;\n      const outer = {\n        transform: \"translate(\".concat(containerWidth / 2, \" 256)\")\n      };\n      const innerTranslate = \"translate(\".concat(transform.x * 32, \", \").concat(transform.y * 32, \") \");\n      const innerScale = \"scale(\".concat(transform.size / 16 * (transform.flipX ? -1 : 1), \", \").concat(transform.size / 16 * (transform.flipY ? -1 : 1), \") \");\n      const innerRotate = \"rotate(\".concat(transform.rotate, \" 0 0)\");\n      const inner = {\n        transform: \"\".concat(innerTranslate, \" \").concat(innerScale, \" \").concat(innerRotate)\n      };\n      const path = {\n        transform: \"translate(\".concat(iconWidth / 2 * -1, \" -256)\")\n      };\n      const operations = {\n        outer,\n        inner,\n        path\n      };\n      return {\n        tag: 'g',\n        attributes: _objectSpread2({}, operations.outer),\n        children: [{\n          tag: 'g',\n          attributes: _objectSpread2({}, operations.inner),\n          children: [{\n            tag: main.icon.tag,\n            children: main.icon.children,\n            attributes: _objectSpread2(_objectSpread2({}, main.icon.attributes), operations.path)\n          }]\n        }]\n      };\n    };\n  }\n};\n\nconst ALL_SPACE = {\n  x: 0,\n  y: 0,\n  width: '100%',\n  height: '100%'\n};\nfunction fillBlack(abstract) {\n  let force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n  if (abstract.attributes && (abstract.attributes.fill || force)) {\n    abstract.attributes.fill = 'black';\n  }\n  return abstract;\n}\nfunction deGroup(abstract) {\n  if (abstract.tag === 'g') {\n    return abstract.children;\n  } else {\n    return [abstract];\n  }\n}\nvar Masks = {\n  hooks() {\n    return {\n      parseNodeAttributes(accumulator, node) {\n        const maskData = node.getAttribute('data-fa-mask');\n        const mask = !maskData ? emptyCanonicalIcon() : getCanonicalIcon(maskData.split(' ').map(i => i.trim()));\n        if (!mask.prefix) {\n          mask.prefix = getDefaultUsablePrefix();\n        }\n        accumulator.mask = mask;\n        accumulator.maskId = node.getAttribute('data-fa-mask-id');\n        return accumulator;\n      }\n    };\n  },\n  provides(providers) {\n    providers.generateAbstractMask = function (_ref) {\n      let {\n        children,\n        attributes,\n        main,\n        mask,\n        maskId: explicitMaskId,\n        transform\n      } = _ref;\n      const {\n        width: mainWidth,\n        icon: mainPath\n      } = main;\n      const {\n        width: maskWidth,\n        icon: maskPath\n      } = mask;\n      const trans = transformForSvg({\n        transform,\n        containerWidth: maskWidth,\n        iconWidth: mainWidth\n      });\n      const maskRect = {\n        tag: 'rect',\n        attributes: _objectSpread2(_objectSpread2({}, ALL_SPACE), {}, {\n          fill: 'white'\n        })\n      };\n      const maskInnerGroupChildrenMixin = mainPath.children ? {\n        children: mainPath.children.map(fillBlack)\n      } : {};\n      const maskInnerGroup = {\n        tag: 'g',\n        attributes: _objectSpread2({}, trans.inner),\n        children: [fillBlack(_objectSpread2({\n          tag: mainPath.tag,\n          attributes: _objectSpread2(_objectSpread2({}, mainPath.attributes), trans.path)\n        }, maskInnerGroupChildrenMixin))]\n      };\n      const maskOuterGroup = {\n        tag: 'g',\n        attributes: _objectSpread2({}, trans.outer),\n        children: [maskInnerGroup]\n      };\n      const maskId = \"mask-\".concat(explicitMaskId || nextUniqueId());\n      const clipId = \"clip-\".concat(explicitMaskId || nextUniqueId());\n      const maskTag = {\n        tag: 'mask',\n        attributes: _objectSpread2(_objectSpread2({}, ALL_SPACE), {}, {\n          id: maskId,\n          maskUnits: 'userSpaceOnUse',\n          maskContentUnits: 'userSpaceOnUse'\n        }),\n        children: [maskRect, maskOuterGroup]\n      };\n      const defs = {\n        tag: 'defs',\n        children: [{\n          tag: 'clipPath',\n          attributes: {\n            id: clipId\n          },\n          children: deGroup(maskPath)\n        }, maskTag]\n      };\n      children.push(defs, {\n        tag: 'rect',\n        attributes: _objectSpread2({\n          fill: 'currentColor',\n          'clip-path': \"url(#\".concat(clipId, \")\"),\n          mask: \"url(#\".concat(maskId, \")\")\n        }, ALL_SPACE)\n      });\n      return {\n        children,\n        attributes\n      };\n    };\n  }\n};\n\nvar MissingIconIndicator = {\n  provides(providers) {\n    let reduceMotion = false;\n    if (WINDOW.matchMedia) {\n      reduceMotion = WINDOW.matchMedia('(prefers-reduced-motion: reduce)').matches;\n    }\n    providers.missingIconAbstract = function () {\n      const gChildren = [];\n      const FILL = {\n        fill: 'currentColor'\n      };\n      const ANIMATION_BASE = {\n        attributeType: 'XML',\n        repeatCount: 'indefinite',\n        dur: '2s'\n      };\n\n      // Ring\n      gChildren.push({\n        tag: 'path',\n        attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n          d: 'M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z'\n        })\n      });\n      const OPACITY_ANIMATE = _objectSpread2(_objectSpread2({}, ANIMATION_BASE), {}, {\n        attributeName: 'opacity'\n      });\n      const dot = {\n        tag: 'circle',\n        attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n          cx: '256',\n          cy: '364',\n          r: '28'\n        }),\n        children: []\n      };\n      if (!reduceMotion) {\n        dot.children.push({\n          tag: 'animate',\n          attributes: _objectSpread2(_objectSpread2({}, ANIMATION_BASE), {}, {\n            attributeName: 'r',\n            values: '28;14;28;28;14;28;'\n          })\n        }, {\n          tag: 'animate',\n          attributes: _objectSpread2(_objectSpread2({}, OPACITY_ANIMATE), {}, {\n            values: '1;0;1;1;0;1;'\n          })\n        });\n      }\n      gChildren.push(dot);\n      gChildren.push({\n        tag: 'path',\n        attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n          opacity: '1',\n          d: 'M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z'\n        }),\n        children: reduceMotion ? [] : [{\n          tag: 'animate',\n          attributes: _objectSpread2(_objectSpread2({}, OPACITY_ANIMATE), {}, {\n            values: '1;0;0;0;0;1;'\n          })\n        }]\n      });\n      if (!reduceMotion) {\n        // Exclamation\n        gChildren.push({\n          tag: 'path',\n          attributes: _objectSpread2(_objectSpread2({}, FILL), {}, {\n            opacity: '0',\n            d: 'M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z'\n          }),\n          children: [{\n            tag: 'animate',\n            attributes: _objectSpread2(_objectSpread2({}, OPACITY_ANIMATE), {}, {\n              values: '0;0;1;1;0;0;'\n            })\n          }]\n        });\n      }\n      return {\n        tag: 'g',\n        attributes: {\n          'class': 'missing'\n        },\n        children: gChildren\n      };\n    };\n  }\n};\n\nvar SvgSymbols = {\n  hooks() {\n    return {\n      parseNodeAttributes(accumulator, node) {\n        const symbolData = node.getAttribute('data-fa-symbol');\n        const symbol = symbolData === null ? false : symbolData === '' ? true : symbolData;\n        accumulator['symbol'] = symbol;\n        return accumulator;\n      }\n    };\n  }\n};\n\nvar plugins = [InjectCSS, ReplaceElements, Layers, LayersCounter, LayersText, PseudoElements, MutationObserver$1, PowerTransforms, Masks, MissingIconIndicator, SvgSymbols];\n\nregisterPlugins(plugins, {\n  mixoutsTo: api\n});\nconst noAuto$1 = api.noAuto;\nconst config$1 = api.config;\nconst library$1 = api.library;\nconst dom$1 = api.dom;\nconst parse$1 = api.parse;\nconst findIconDefinition$1 = api.findIconDefinition;\nconst toHtml$1 = api.toHtml;\nconst icon = api.icon;\nconst layer = api.layer;\nconst text = api.text;\nconst counter = api.counter;\n\nexport { noAuto$1 as noAuto, config$1 as config, library$1 as library, dom$1 as dom, parse$1 as parse, findIconDefinition$1 as findIconDefinition, toHtml$1 as toHtml, icon, layer, text, counter, api };\n","function resolveInitializer(modules, moduleName) {\n    let module = modules.load(moduleName);\n    if (!module) {\n        throw new Error(moduleName + ' must export an initializer.');\n    }\n    let initializer = module.default;\n    if (!initializer) {\n        throw new Error(moduleName + ' must have a default export');\n    }\n    if (!initializer.name) {\n        initializer.name = moduleName.slice(moduleName.lastIndexOf('/') + 1);\n    }\n    return initializer;\n}\nfunction registerInitializers(app, modules, moduleNames) {\n    for (let moduleName of moduleNames) {\n        app.initializer(resolveInitializer(modules, moduleName));\n    }\n}\nfunction registerInstanceInitializers(app, modules, moduleNames) {\n    for (let moduleName of moduleNames) {\n        app.instanceInitializer(resolveInitializer(modules, moduleName));\n    }\n}\n/**\n * Configure your application as it boots\n */\nexport default function loadInitializers(app, prefix, explicitModules) {\n    var initializerPrefix = prefix + '/initializers/';\n    var instanceInitializerPrefix = prefix + '/instance-initializers/';\n    var initializers = [];\n    var instanceInitializers = [];\n    let modules;\n    if (explicitModules) {\n        modules = {\n            names() {\n                return Object.keys(explicitModules);\n            },\n            load(name) {\n                return explicitModules[name];\n            }\n        };\n    }\n    else {\n        modules = {\n            names() {\n                let requirejs = globalThis.requirejs;\n                if (!requirejs || !requirejs._eak_seen) {\n                    throw new Error(\"No global AMD loader found. To use loadInitializers without a global AMD loader you must provide explicit modules\");\n                }\n                return Object.keys(requirejs._eak_seen);\n            },\n            load(name) {\n                return globalThis.require(name, null, null, true);\n            }\n        };\n    }\n    for (let moduleName of modules.names()) {\n        if (moduleName.startsWith(initializerPrefix) && !moduleName.endsWith('-test')) {\n            initializers.push(moduleName);\n        }\n        else if (moduleName.startsWith(instanceInitializerPrefix) && !moduleName.endsWith('-test')) {\n            instanceInitializers.push(moduleName);\n        }\n    }\n    registerInitializers(app, modules, initializers);\n    registerInstanceInitializers(app, modules, instanceInitializers);\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n","import base64 from 'base64-js';\nimport sha256 from 'js-sha256';\n\n/*\n * Copyright 2016 Red Hat, Inc. and/or its affiliates\n * and other contributors as indicated by the @author tags.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nif (typeof Promise === 'undefined') {\n    throw Error('Keycloak requires an environment that supports Promises. Make sure that you include the appropriate polyfill.');\n}\n\nfunction Keycloak (config) {\n    if (!(this instanceof Keycloak)) {\n        throw new Error(\"The 'Keycloak' constructor must be invoked with 'new'.\")\n    }\n\n    var kc = this;\n    var adapter;\n    var refreshQueue = [];\n    var callbackStorage;\n\n    var loginIframe = {\n        enable: true,\n        callbackList: [],\n        interval: 5\n    };\n\n    var scripts = document.getElementsByTagName('script');\n    for (var i = 0; i < scripts.length; i++) {\n        if ((scripts[i].src.indexOf('keycloak.js') !== -1 || scripts[i].src.indexOf('keycloak.min.js') !== -1) && scripts[i].src.indexOf('version=') !== -1) {\n            kc.iframeVersion = scripts[i].src.substring(scripts[i].src.indexOf('version=') + 8).split('&')[0];\n        }\n    }\n\n    var useNonce = true;\n    var logInfo = createLogger(console.info);\n    var logWarn = createLogger(console.warn);\n\n    kc.init = function (initOptions) {\n        if (kc.didInitialize) {\n            throw new Error(\"A 'Keycloak' instance can only be initialized once.\");\n        }\n\n        kc.didInitialize = true;\n\n        kc.authenticated = false;\n\n        callbackStorage = createCallbackStorage();\n        var adapters = ['default', 'cordova', 'cordova-native'];\n\n        if (initOptions && adapters.indexOf(initOptions.adapter) > -1) {\n            adapter = loadAdapter(initOptions.adapter);\n        } else if (initOptions && typeof initOptions.adapter === \"object\") {\n            adapter = initOptions.adapter;\n        } else {\n            if (window.Cordova || window.cordova) {\n                adapter = loadAdapter('cordova');\n            } else {\n                adapter = loadAdapter();\n            }\n        }\n\n        if (initOptions) {\n            if (typeof initOptions.useNonce !== 'undefined') {\n                useNonce = initOptions.useNonce;\n            }\n\n            if (typeof initOptions.checkLoginIframe !== 'undefined') {\n                loginIframe.enable = initOptions.checkLoginIframe;\n            }\n\n            if (initOptions.checkLoginIframeInterval) {\n                loginIframe.interval = initOptions.checkLoginIframeInterval;\n            }\n\n            if (initOptions.onLoad === 'login-required') {\n                kc.loginRequired = true;\n            }\n\n            if (initOptions.responseMode) {\n                if (initOptions.responseMode === 'query' || initOptions.responseMode === 'fragment') {\n                    kc.responseMode = initOptions.responseMode;\n                } else {\n                    throw 'Invalid value for responseMode';\n                }\n            }\n\n            if (initOptions.flow) {\n                switch (initOptions.flow) {\n                    case 'standard':\n                        kc.responseType = 'code';\n                        break;\n                    case 'implicit':\n                        kc.responseType = 'id_token token';\n                        break;\n                    case 'hybrid':\n                        kc.responseType = 'code id_token token';\n                        break;\n                    default:\n                        throw 'Invalid value for flow';\n                }\n                kc.flow = initOptions.flow;\n            }\n\n            if (initOptions.timeSkew != null) {\n                kc.timeSkew = initOptions.timeSkew;\n            }\n\n            if(initOptions.redirectUri) {\n                kc.redirectUri = initOptions.redirectUri;\n            }\n\n            if (initOptions.silentCheckSsoRedirectUri) {\n                kc.silentCheckSsoRedirectUri = initOptions.silentCheckSsoRedirectUri;\n            }\n\n            if (typeof initOptions.silentCheckSsoFallback === 'boolean') {\n                kc.silentCheckSsoFallback = initOptions.silentCheckSsoFallback;\n            } else {\n                kc.silentCheckSsoFallback = true;\n            }\n\n            if (initOptions.pkceMethod) {\n                if (initOptions.pkceMethod !== \"S256\") {\n                    throw 'Invalid value for pkceMethod';\n                }\n                kc.pkceMethod = initOptions.pkceMethod;\n            }\n\n            if (typeof initOptions.enableLogging === 'boolean') {\n                kc.enableLogging = initOptions.enableLogging;\n            } else {\n                kc.enableLogging = false;\n            }\n\n            if (typeof initOptions.scope === 'string') {\n                kc.scope = initOptions.scope;\n            }\n\n            if (typeof initOptions.messageReceiveTimeout === 'number' && initOptions.messageReceiveTimeout > 0) {\n                kc.messageReceiveTimeout = initOptions.messageReceiveTimeout;\n            } else {\n                kc.messageReceiveTimeout = 10000;\n            }\n        }\n\n        if (!kc.responseMode) {\n            kc.responseMode = 'fragment';\n        }\n        if (!kc.responseType) {\n            kc.responseType = 'code';\n            kc.flow = 'standard';\n        }\n\n        var promise = createPromise();\n\n        var initPromise = createPromise();\n        initPromise.promise.then(function() {\n            kc.onReady && kc.onReady(kc.authenticated);\n            promise.setSuccess(kc.authenticated);\n        }).catch(function(error) {\n            promise.setError(error);\n        });\n\n        var configPromise = loadConfig();\n\n        function onLoad() {\n            var doLogin = function(prompt) {\n                if (!prompt) {\n                    options.prompt = 'none';\n                }\n\n                if (initOptions && initOptions.locale) {\n                    options.locale = initOptions.locale;\n                }\n                kc.login(options).then(function () {\n                    initPromise.setSuccess();\n                }).catch(function (error) {\n                    initPromise.setError(error);\n                });\n            };\n\n            var checkSsoSilently = function() {\n                var ifrm = document.createElement(\"iframe\");\n                var src = kc.createLoginUrl({prompt: 'none', redirectUri: kc.silentCheckSsoRedirectUri});\n                ifrm.setAttribute(\"src\", src);\n                ifrm.setAttribute(\"sandbox\", \"allow-scripts allow-same-origin\");\n                ifrm.setAttribute(\"title\", \"keycloak-silent-check-sso\");\n                ifrm.style.display = \"none\";\n                document.body.appendChild(ifrm);\n\n                var messageCallback = function(event) {\n                    if (event.origin !== window.location.origin || ifrm.contentWindow !== event.source) {\n                        return;\n                    }\n\n                    var oauth = parseCallback(event.data);\n                    processCallback(oauth, initPromise);\n\n                    document.body.removeChild(ifrm);\n                    window.removeEventListener(\"message\", messageCallback);\n                };\n\n                window.addEventListener(\"message\", messageCallback);\n            };\n\n            var options = {};\n            switch (initOptions.onLoad) {\n                case 'check-sso':\n                    if (loginIframe.enable) {\n                        setupCheckLoginIframe().then(function() {\n                            checkLoginIframe().then(function (unchanged) {\n                                if (!unchanged) {\n                                    kc.silentCheckSsoRedirectUri ? checkSsoSilently() : doLogin(false);\n                                } else {\n                                    initPromise.setSuccess();\n                                }\n                            }).catch(function (error) {\n                                initPromise.setError(error);\n                            });\n                        });\n                    } else {\n                        kc.silentCheckSsoRedirectUri ? checkSsoSilently() : doLogin(false);\n                    }\n                    break;\n                case 'login-required':\n                    doLogin(true);\n                    break;\n                default:\n                    throw 'Invalid value for onLoad';\n            }\n        }\n\n        function processInit() {\n            var callback = parseCallback(window.location.href);\n\n            if (callback) {\n                window.history.replaceState(window.history.state, null, callback.newUrl);\n            }\n\n            if (callback && callback.valid) {\n                return setupCheckLoginIframe().then(function() {\n                    processCallback(callback, initPromise);\n                }).catch(function (error) {\n                    initPromise.setError(error);\n                });\n            } else if (initOptions) {\n                if (initOptions.token && initOptions.refreshToken) {\n                    setToken(initOptions.token, initOptions.refreshToken, initOptions.idToken);\n\n                    if (loginIframe.enable) {\n                        setupCheckLoginIframe().then(function() {\n                            checkLoginIframe().then(function (unchanged) {\n                                if (unchanged) {\n                                    kc.onAuthSuccess && kc.onAuthSuccess();\n                                    initPromise.setSuccess();\n                                    scheduleCheckIframe();\n                                } else {\n                                    initPromise.setSuccess();\n                                }\n                            }).catch(function (error) {\n                                initPromise.setError(error);\n                            });\n                        });\n                    } else {\n                        kc.updateToken(-1).then(function() {\n                            kc.onAuthSuccess && kc.onAuthSuccess();\n                            initPromise.setSuccess();\n                        }).catch(function(error) {\n                            kc.onAuthError && kc.onAuthError();\n                            if (initOptions.onLoad) {\n                                onLoad();\n                            } else {\n                                initPromise.setError(error);\n                            }\n                        });\n                    }\n                } else if (initOptions.onLoad) {\n                    onLoad();\n                } else {\n                    initPromise.setSuccess();\n                }\n            } else {\n                initPromise.setSuccess();\n            }\n        }\n\n        function domReady() {\n            var promise = createPromise();\n\n            var checkReadyState = function () {\n                if (document.readyState === 'interactive' || document.readyState === 'complete') {\n                    document.removeEventListener('readystatechange', checkReadyState);\n                    promise.setSuccess();\n                }\n            };\n            document.addEventListener('readystatechange', checkReadyState);\n\n            checkReadyState(); // just in case the event was already fired and we missed it (in case the init is done later than at the load time, i.e. it's done from code)\n\n            return promise.promise;\n        }\n\n        configPromise.then(function () {\n            domReady()\n                .then(check3pCookiesSupported)\n                .then(processInit)\n                .catch(function (error) {\n                    promise.setError(error);\n                });\n        });\n        configPromise.catch(function (error) {\n            promise.setError(error);\n        });\n\n        return promise.promise;\n    };\n\n    kc.login = function (options) {\n        return adapter.login(options);\n    };\n\n    function generateRandomData(len) {\n        // use web crypto APIs if possible\n        var array = null;\n        var crypto = window.crypto || window.msCrypto;\n        if (crypto && crypto.getRandomValues && window.Uint8Array) {\n            array = new Uint8Array(len);\n            crypto.getRandomValues(array);\n            return array;\n        }\n\n        // fallback to Math random\n        array = new Array(len);\n        for (var j = 0; j < array.length; j++) {\n            array[j] = Math.floor(256 * Math.random());\n        }\n        return array;\n    }\n\n    function generateCodeVerifier(len) {\n        return generateRandomString(len, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789');\n    }\n\n    function generateRandomString(len, alphabet){\n        var randomData = generateRandomData(len);\n        var chars = new Array(len);\n        for (var i = 0; i < len; i++) {\n            chars[i] = alphabet.charCodeAt(randomData[i] % alphabet.length);\n        }\n        return String.fromCharCode.apply(null, chars);\n    }\n\n    function generatePkceChallenge(pkceMethod, codeVerifier) {\n        switch (pkceMethod) {\n            // The use of the \"plain\" method is considered insecure and therefore not supported.\n            case \"S256\":\n                // hash codeVerifier, then encode as url-safe base64 without padding\n                var hashBytes = new Uint8Array(sha256.arrayBuffer(codeVerifier));\n                var encodedHash = base64.fromByteArray(hashBytes)\n                    .replace(/\\+/g, '-')\n                    .replace(/\\//g, '_')\n                    .replace(/\\=/g, '');\n                return encodedHash;\n            default:\n                throw 'Invalid value for pkceMethod';\n        }\n    }\n\n    function buildClaimsParameter(requestedAcr){\n        var claims = {\n            id_token: {\n                acr: requestedAcr\n            }\n        };\n        return JSON.stringify(claims);\n    }\n\n    kc.createLoginUrl = function(options) {\n        var state = createUUID();\n        var nonce = createUUID();\n\n        var redirectUri = adapter.redirectUri(options);\n\n        var callbackState = {\n            state: state,\n            nonce: nonce,\n            redirectUri: encodeURIComponent(redirectUri)\n        };\n\n        if (options && options.prompt) {\n            callbackState.prompt = options.prompt;\n        }\n\n        var baseUrl;\n        if (options && options.action == 'register') {\n            baseUrl = kc.endpoints.register();\n        } else {\n            baseUrl = kc.endpoints.authorize();\n        }\n\n        var scope = options && options.scope || kc.scope;\n        if (!scope) {\n            // if scope is not set, default to \"openid\"\n            scope = \"openid\";\n        } else if (scope.indexOf(\"openid\") === -1) {\n            // if openid scope is missing, prefix the given scopes with it\n            scope = \"openid \" + scope;\n        }\n\n        var url = baseUrl\n            + '?client_id=' + encodeURIComponent(kc.clientId)\n            + '&redirect_uri=' + encodeURIComponent(redirectUri)\n            + '&state=' + encodeURIComponent(state)\n            + '&response_mode=' + encodeURIComponent(kc.responseMode)\n            + '&response_type=' + encodeURIComponent(kc.responseType)\n            + '&scope=' + encodeURIComponent(scope);\n        if (useNonce) {\n            url = url + '&nonce=' + encodeURIComponent(nonce);\n        }\n\n        if (options && options.prompt) {\n            url += '&prompt=' + encodeURIComponent(options.prompt);\n        }\n\n        if (options && options.maxAge) {\n            url += '&max_age=' + encodeURIComponent(options.maxAge);\n        }\n\n        if (options && options.loginHint) {\n            url += '&login_hint=' + encodeURIComponent(options.loginHint);\n        }\n\n        if (options && options.idpHint) {\n            url += '&kc_idp_hint=' + encodeURIComponent(options.idpHint);\n        }\n\n        if (options && options.action && options.action != 'register') {\n            url += '&kc_action=' + encodeURIComponent(options.action);\n        }\n\n        if (options && options.locale) {\n            url += '&ui_locales=' + encodeURIComponent(options.locale);\n        }\n\n        if (options && options.acr) {\n            var claimsParameter = buildClaimsParameter(options.acr);\n            url += '&claims=' + encodeURIComponent(claimsParameter);\n        }\n\n        if (kc.pkceMethod) {\n            var codeVerifier = generateCodeVerifier(96);\n            callbackState.pkceCodeVerifier = codeVerifier;\n            var pkceChallenge = generatePkceChallenge(kc.pkceMethod, codeVerifier);\n            url += '&code_challenge=' + pkceChallenge;\n            url += '&code_challenge_method=' + kc.pkceMethod;\n        }\n\n        callbackStorage.add(callbackState);\n\n        return url;\n    };\n\n    kc.logout = function(options) {\n        return adapter.logout(options);\n    };\n\n    kc.createLogoutUrl = function(options) {\n        var url = kc.endpoints.logout()\n            + '?client_id=' + encodeURIComponent(kc.clientId)\n            + '&post_logout_redirect_uri=' + encodeURIComponent(adapter.redirectUri(options, false));\n\n        if (kc.idToken) {\n            url += '&id_token_hint=' + encodeURIComponent(kc.idToken);\n        }\n\n        return url;\n    };\n\n    kc.register = function (options) {\n        return adapter.register(options);\n    };\n\n    kc.createRegisterUrl = function(options) {\n        if (!options) {\n            options = {};\n        }\n        options.action = 'register';\n        return kc.createLoginUrl(options);\n    };\n\n    kc.createAccountUrl = function(options) {\n        var realm = getRealmUrl();\n        var url = undefined;\n        if (typeof realm !== 'undefined') {\n            url = realm\n            + '/account'\n            + '?referrer=' + encodeURIComponent(kc.clientId)\n            + '&referrer_uri=' + encodeURIComponent(adapter.redirectUri(options));\n        }\n        return url;\n    };\n\n    kc.accountManagement = function() {\n        return adapter.accountManagement();\n    };\n\n    kc.hasRealmRole = function (role) {\n        var access = kc.realmAccess;\n        return !!access && access.roles.indexOf(role) >= 0;\n    };\n\n    kc.hasResourceRole = function(role, resource) {\n        if (!kc.resourceAccess) {\n            return false;\n        }\n\n        var access = kc.resourceAccess[resource || kc.clientId];\n        return !!access && access.roles.indexOf(role) >= 0;\n    };\n\n    kc.loadUserProfile = function() {\n        var url = getRealmUrl() + '/account';\n        var req = new XMLHttpRequest();\n        req.open('GET', url, true);\n        req.setRequestHeader('Accept', 'application/json');\n        req.setRequestHeader('Authorization', 'bearer ' + kc.token);\n\n        var promise = createPromise();\n\n        req.onreadystatechange = function () {\n            if (req.readyState == 4) {\n                if (req.status == 200) {\n                    kc.profile = JSON.parse(req.responseText);\n                    promise.setSuccess(kc.profile);\n                } else {\n                    promise.setError();\n                }\n            }\n        };\n\n        req.send();\n\n        return promise.promise;\n    };\n\n    kc.loadUserInfo = function() {\n        var url = kc.endpoints.userinfo();\n        var req = new XMLHttpRequest();\n        req.open('GET', url, true);\n        req.setRequestHeader('Accept', 'application/json');\n        req.setRequestHeader('Authorization', 'bearer ' + kc.token);\n\n        var promise = createPromise();\n\n        req.onreadystatechange = function () {\n            if (req.readyState == 4) {\n                if (req.status == 200) {\n                    kc.userInfo = JSON.parse(req.responseText);\n                    promise.setSuccess(kc.userInfo);\n                } else {\n                    promise.setError();\n                }\n            }\n        };\n\n        req.send();\n\n        return promise.promise;\n    };\n\n    kc.isTokenExpired = function(minValidity) {\n        if (!kc.tokenParsed || (!kc.refreshToken && kc.flow != 'implicit' )) {\n            throw 'Not authenticated';\n        }\n\n        if (kc.timeSkew == null) {\n            logInfo('[KEYCLOAK] Unable to determine if token is expired as timeskew is not set');\n            return true;\n        }\n\n        var expiresIn = kc.tokenParsed['exp'] - Math.ceil(new Date().getTime() / 1000) + kc.timeSkew;\n        if (minValidity) {\n            if (isNaN(minValidity)) {\n                throw 'Invalid minValidity';\n            }\n            expiresIn -= minValidity;\n        }\n        return expiresIn < 0;\n    };\n\n    kc.updateToken = function(minValidity) {\n        var promise = createPromise();\n\n        if (!kc.refreshToken) {\n            promise.setError();\n            return promise.promise;\n        }\n\n        minValidity = minValidity || 5;\n\n        var exec = function() {\n            var refreshToken = false;\n            if (minValidity == -1) {\n                refreshToken = true;\n                logInfo('[KEYCLOAK] Refreshing token: forced refresh');\n            } else if (!kc.tokenParsed || kc.isTokenExpired(minValidity)) {\n                refreshToken = true;\n                logInfo('[KEYCLOAK] Refreshing token: token expired');\n            }\n\n            if (!refreshToken) {\n                promise.setSuccess(false);\n            } else {\n                var params = 'grant_type=refresh_token&' + 'refresh_token=' + kc.refreshToken;\n                var url = kc.endpoints.token();\n\n                refreshQueue.push(promise);\n\n                if (refreshQueue.length == 1) {\n                    var req = new XMLHttpRequest();\n                    req.open('POST', url, true);\n                    req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n                    req.withCredentials = true;\n\n                    params += '&client_id=' + encodeURIComponent(kc.clientId);\n\n                    var timeLocal = new Date().getTime();\n\n                    req.onreadystatechange = function () {\n                        if (req.readyState == 4) {\n                            if (req.status == 200) {\n                                logInfo('[KEYCLOAK] Token refreshed');\n\n                                timeLocal = (timeLocal + new Date().getTime()) / 2;\n\n                                var tokenResponse = JSON.parse(req.responseText);\n\n                                setToken(tokenResponse['access_token'], tokenResponse['refresh_token'], tokenResponse['id_token'], timeLocal);\n\n                                kc.onAuthRefreshSuccess && kc.onAuthRefreshSuccess();\n                                for (var p = refreshQueue.pop(); p != null; p = refreshQueue.pop()) {\n                                    p.setSuccess(true);\n                                }\n                            } else {\n                                logWarn('[KEYCLOAK] Failed to refresh token');\n\n                                if (req.status == 400) {\n                                    kc.clearToken();\n                                }\n\n                                kc.onAuthRefreshError && kc.onAuthRefreshError();\n                                for (var p = refreshQueue.pop(); p != null; p = refreshQueue.pop()) {\n                                    p.setError(true);\n                                }\n                            }\n                        }\n                    };\n\n                    req.send(params);\n                }\n            }\n        };\n\n        if (loginIframe.enable) {\n            var iframePromise = checkLoginIframe();\n            iframePromise.then(function() {\n                exec();\n            }).catch(function(error) {\n                promise.setError(error);\n            });\n        } else {\n            exec();\n        }\n\n        return promise.promise;\n    };\n\n    kc.clearToken = function() {\n        if (kc.token) {\n            setToken(null, null, null);\n            kc.onAuthLogout && kc.onAuthLogout();\n            if (kc.loginRequired) {\n                kc.login();\n            }\n        }\n    };\n\n    function getRealmUrl() {\n        if (typeof kc.authServerUrl !== 'undefined') {\n            if (kc.authServerUrl.charAt(kc.authServerUrl.length - 1) == '/') {\n                return kc.authServerUrl + 'realms/' + encodeURIComponent(kc.realm);\n            } else {\n                return kc.authServerUrl + '/realms/' + encodeURIComponent(kc.realm);\n            }\n        } else {\n            return undefined;\n        }\n    }\n\n    function getOrigin() {\n        if (!window.location.origin) {\n            return window.location.protocol + \"//\" + window.location.hostname + (window.location.port ? ':' + window.location.port: '');\n        } else {\n            return window.location.origin;\n        }\n    }\n\n    function processCallback(oauth, promise) {\n        var code = oauth.code;\n        var error = oauth.error;\n        var prompt = oauth.prompt;\n\n        var timeLocal = new Date().getTime();\n\n        if (oauth['kc_action_status']) {\n            kc.onActionUpdate && kc.onActionUpdate(oauth['kc_action_status']);\n        }\n\n        if (error) {\n            if (prompt != 'none') {\n                var errorData = { error: error, error_description: oauth.error_description };\n                kc.onAuthError && kc.onAuthError(errorData);\n                promise && promise.setError(errorData);\n            } else {\n                promise && promise.setSuccess();\n            }\n            return;\n        } else if ((kc.flow != 'standard') && (oauth.access_token || oauth.id_token)) {\n            authSuccess(oauth.access_token, null, oauth.id_token, true);\n        }\n\n        if ((kc.flow != 'implicit') && code) {\n            var params = 'code=' + code + '&grant_type=authorization_code';\n            var url = kc.endpoints.token();\n\n            var req = new XMLHttpRequest();\n            req.open('POST', url, true);\n            req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');\n\n            params += '&client_id=' + encodeURIComponent(kc.clientId);\n            params += '&redirect_uri=' + oauth.redirectUri;\n\n            if (oauth.pkceCodeVerifier) {\n                params += '&code_verifier=' + oauth.pkceCodeVerifier;\n            }\n\n            req.withCredentials = true;\n\n            req.onreadystatechange = function() {\n                if (req.readyState == 4) {\n                    if (req.status == 200) {\n\n                        var tokenResponse = JSON.parse(req.responseText);\n                        authSuccess(tokenResponse['access_token'], tokenResponse['refresh_token'], tokenResponse['id_token'], kc.flow === 'standard');\n                        scheduleCheckIframe();\n                    } else {\n                        kc.onAuthError && kc.onAuthError();\n                        promise && promise.setError();\n                    }\n                }\n            };\n\n            req.send(params);\n        }\n\n        function authSuccess(accessToken, refreshToken, idToken, fulfillPromise) {\n            timeLocal = (timeLocal + new Date().getTime()) / 2;\n\n            setToken(accessToken, refreshToken, idToken, timeLocal);\n\n            if (useNonce && ((kc.tokenParsed && kc.tokenParsed.nonce != oauth.storedNonce) ||\n                (kc.refreshTokenParsed && kc.refreshTokenParsed.nonce != oauth.storedNonce) ||\n                (kc.idTokenParsed && kc.idTokenParsed.nonce != oauth.storedNonce))) {\n\n                logInfo('[KEYCLOAK] Invalid nonce, clearing token');\n                kc.clearToken();\n                promise && promise.setError();\n            } else {\n                if (fulfillPromise) {\n                    kc.onAuthSuccess && kc.onAuthSuccess();\n                    promise && promise.setSuccess();\n                }\n            }\n        }\n\n    }\n\n    function loadConfig(url) {\n        var promise = createPromise();\n        var configUrl;\n\n        if (!config) {\n            configUrl = 'keycloak.json';\n        } else if (typeof config === 'string') {\n            configUrl = config;\n        }\n\n        function setupOidcEndoints(oidcConfiguration) {\n            if (! oidcConfiguration) {\n                kc.endpoints = {\n                    authorize: function() {\n                        return getRealmUrl() + '/protocol/openid-connect/auth';\n                    },\n                    token: function() {\n                        return getRealmUrl() + '/protocol/openid-connect/token';\n                    },\n                    logout: function() {\n                        return getRealmUrl() + '/protocol/openid-connect/logout';\n                    },\n                    checkSessionIframe: function() {\n                        var src = getRealmUrl() + '/protocol/openid-connect/login-status-iframe.html';\n                        if (kc.iframeVersion) {\n                            src = src + '?version=' + kc.iframeVersion;\n                        }\n                        return src;\n                    },\n                    thirdPartyCookiesIframe: function() {\n                        var src = getRealmUrl() + '/protocol/openid-connect/3p-cookies/step1.html';\n                        if (kc.iframeVersion) {\n                            src = src + '?version=' + kc.iframeVersion;\n                        }\n                        return src;\n                    },\n                    register: function() {\n                        return getRealmUrl() + '/protocol/openid-connect/registrations';\n                    },\n                    userinfo: function() {\n                        return getRealmUrl() + '/protocol/openid-connect/userinfo';\n                    }\n                };\n            } else {\n                kc.endpoints = {\n                    authorize: function() {\n                        return oidcConfiguration.authorization_endpoint;\n                    },\n                    token: function() {\n                        return oidcConfiguration.token_endpoint;\n                    },\n                    logout: function() {\n                        if (!oidcConfiguration.end_session_endpoint) {\n                            throw \"Not supported by the OIDC server\";\n                        }\n                        return oidcConfiguration.end_session_endpoint;\n                    },\n                    checkSessionIframe: function() {\n                        if (!oidcConfiguration.check_session_iframe) {\n                            throw \"Not supported by the OIDC server\";\n                        }\n                        return oidcConfiguration.check_session_iframe;\n                    },\n                    register: function() {\n                        throw 'Redirection to \"Register user\" page not supported in standard OIDC mode';\n                    },\n                    userinfo: function() {\n                        if (!oidcConfiguration.userinfo_endpoint) {\n                            throw \"Not supported by the OIDC server\";\n                        }\n                        return oidcConfiguration.userinfo_endpoint;\n                    }\n                };\n            }\n        }\n\n        if (configUrl) {\n            var req = new XMLHttpRequest();\n            req.open('GET', configUrl, true);\n            req.setRequestHeader('Accept', 'application/json');\n\n            req.onreadystatechange = function () {\n                if (req.readyState == 4) {\n                    if (req.status == 200 || fileLoaded(req)) {\n                        var config = JSON.parse(req.responseText);\n\n                        kc.authServerUrl = config['auth-server-url'];\n                        kc.realm = config['realm'];\n                        kc.clientId = config['resource'];\n                        setupOidcEndoints(null);\n                        promise.setSuccess();\n                    } else {\n                        promise.setError();\n                    }\n                }\n            };\n\n            req.send();\n        } else {\n            if (!config.clientId) {\n                throw 'clientId missing';\n            }\n\n            kc.clientId = config.clientId;\n\n            var oidcProvider = config['oidcProvider'];\n            if (!oidcProvider) {\n                if (!config['url']) {\n                    var scripts = document.getElementsByTagName('script');\n                    for (var i = 0; i < scripts.length; i++) {\n                        if (scripts[i].src.match(/.*keycloak\\.js/)) {\n                            config.url = scripts[i].src.substr(0, scripts[i].src.indexOf('/js/keycloak.js'));\n                            break;\n                        }\n                    }\n                }\n                if (!config.realm) {\n                    throw 'realm missing';\n                }\n\n                kc.authServerUrl = config.url;\n                kc.realm = config.realm;\n                setupOidcEndoints(null);\n                promise.setSuccess();\n            } else {\n                if (typeof oidcProvider === 'string') {\n                    var oidcProviderConfigUrl;\n                    if (oidcProvider.charAt(oidcProvider.length - 1) == '/') {\n                        oidcProviderConfigUrl = oidcProvider + '.well-known/openid-configuration';\n                    } else {\n                        oidcProviderConfigUrl = oidcProvider + '/.well-known/openid-configuration';\n                    }\n                    var req = new XMLHttpRequest();\n                    req.open('GET', oidcProviderConfigUrl, true);\n                    req.setRequestHeader('Accept', 'application/json');\n\n                    req.onreadystatechange = function () {\n                        if (req.readyState == 4) {\n                            if (req.status == 200 || fileLoaded(req)) {\n                                var oidcProviderConfig = JSON.parse(req.responseText);\n                                setupOidcEndoints(oidcProviderConfig);\n                                promise.setSuccess();\n                            } else {\n                                promise.setError();\n                            }\n                        }\n                    };\n\n                    req.send();\n                } else {\n                    setupOidcEndoints(oidcProvider);\n                    promise.setSuccess();\n                }\n            }\n        }\n\n        return promise.promise;\n    }\n\n    function fileLoaded(xhr) {\n        return xhr.status == 0 && xhr.responseText && xhr.responseURL.startsWith('file:');\n    }\n\n    function setToken(token, refreshToken, idToken, timeLocal) {\n        if (kc.tokenTimeoutHandle) {\n            clearTimeout(kc.tokenTimeoutHandle);\n            kc.tokenTimeoutHandle = null;\n        }\n\n        if (refreshToken) {\n            kc.refreshToken = refreshToken;\n            kc.refreshTokenParsed = decodeToken(refreshToken);\n        } else {\n            delete kc.refreshToken;\n            delete kc.refreshTokenParsed;\n        }\n\n        if (idToken) {\n            kc.idToken = idToken;\n            kc.idTokenParsed = decodeToken(idToken);\n        } else {\n            delete kc.idToken;\n            delete kc.idTokenParsed;\n        }\n\n        if (token) {\n            kc.token = token;\n            kc.tokenParsed = decodeToken(token);\n            kc.sessionId = kc.tokenParsed.session_state;\n            kc.authenticated = true;\n            kc.subject = kc.tokenParsed.sub;\n            kc.realmAccess = kc.tokenParsed.realm_access;\n            kc.resourceAccess = kc.tokenParsed.resource_access;\n\n            if (timeLocal) {\n                kc.timeSkew = Math.floor(timeLocal / 1000) - kc.tokenParsed.iat;\n            }\n\n            if (kc.timeSkew != null) {\n                logInfo('[KEYCLOAK] Estimated time difference between browser and server is ' + kc.timeSkew + ' seconds');\n\n                if (kc.onTokenExpired) {\n                    var expiresIn = (kc.tokenParsed['exp'] - (new Date().getTime() / 1000) + kc.timeSkew) * 1000;\n                    logInfo('[KEYCLOAK] Token expires in ' + Math.round(expiresIn / 1000) + ' s');\n                    if (expiresIn <= 0) {\n                        kc.onTokenExpired();\n                    } else {\n                        kc.tokenTimeoutHandle = setTimeout(kc.onTokenExpired, expiresIn);\n                    }\n                }\n            }\n        } else {\n            delete kc.token;\n            delete kc.tokenParsed;\n            delete kc.subject;\n            delete kc.realmAccess;\n            delete kc.resourceAccess;\n\n            kc.authenticated = false;\n        }\n    }\n\n    function decodeToken(str) {\n        str = str.split('.')[1];\n\n        str = str.replace(/-/g, '+');\n        str = str.replace(/_/g, '/');\n        switch (str.length % 4) {\n            case 0:\n                break;\n            case 2:\n                str += '==';\n                break;\n            case 3:\n                str += '=';\n                break;\n            default:\n                throw 'Invalid token';\n        }\n\n        str = decodeURIComponent(escape(atob(str)));\n\n        str = JSON.parse(str);\n        return str;\n    }\n\n    function createUUID() {\n        var hexDigits = '0123456789abcdef';\n        var s = generateRandomString(36, hexDigits).split(\"\");\n        s[14] = '4';\n        s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1);\n        s[8] = s[13] = s[18] = s[23] = '-';\n        var uuid = s.join('');\n        return uuid;\n    }\n\n    function parseCallback(url) {\n        var oauth = parseCallbackUrl(url);\n        if (!oauth) {\n            return;\n        }\n\n        var oauthState = callbackStorage.get(oauth.state);\n\n        if (oauthState) {\n            oauth.valid = true;\n            oauth.redirectUri = oauthState.redirectUri;\n            oauth.storedNonce = oauthState.nonce;\n            oauth.prompt = oauthState.prompt;\n            oauth.pkceCodeVerifier = oauthState.pkceCodeVerifier;\n        }\n\n        return oauth;\n    }\n\n    function parseCallbackUrl(url) {\n        var supportedParams;\n        switch (kc.flow) {\n            case 'standard':\n                supportedParams = ['code', 'state', 'session_state', 'kc_action_status', 'iss'];\n                break;\n            case 'implicit':\n                supportedParams = ['access_token', 'token_type', 'id_token', 'state', 'session_state', 'expires_in', 'kc_action_status', 'iss'];\n                break;\n            case 'hybrid':\n                supportedParams = ['access_token', 'token_type', 'id_token', 'code', 'state', 'session_state', 'expires_in', 'kc_action_status', 'iss'];\n                break;\n        }\n\n        supportedParams.push('error');\n        supportedParams.push('error_description');\n        supportedParams.push('error_uri');\n\n        var queryIndex = url.indexOf('?');\n        var fragmentIndex = url.indexOf('#');\n\n        var newUrl;\n        var parsed;\n\n        if (kc.responseMode === 'query' && queryIndex !== -1) {\n            newUrl = url.substring(0, queryIndex);\n            parsed = parseCallbackParams(url.substring(queryIndex + 1, fragmentIndex !== -1 ? fragmentIndex : url.length), supportedParams);\n            if (parsed.paramsString !== '') {\n                newUrl += '?' + parsed.paramsString;\n            }\n            if (fragmentIndex !== -1) {\n                newUrl += url.substring(fragmentIndex);\n            }\n        } else if (kc.responseMode === 'fragment' && fragmentIndex !== -1) {\n            newUrl = url.substring(0, fragmentIndex);\n            parsed = parseCallbackParams(url.substring(fragmentIndex + 1), supportedParams);\n            if (parsed.paramsString !== '') {\n                newUrl += '#' + parsed.paramsString;\n            }\n        }\n\n        if (parsed && parsed.oauthParams) {\n            if (kc.flow === 'standard' || kc.flow === 'hybrid') {\n                if ((parsed.oauthParams.code || parsed.oauthParams.error) && parsed.oauthParams.state) {\n                    parsed.oauthParams.newUrl = newUrl;\n                    return parsed.oauthParams;\n                }\n            } else if (kc.flow === 'implicit') {\n                if ((parsed.oauthParams.access_token || parsed.oauthParams.error) && parsed.oauthParams.state) {\n                    parsed.oauthParams.newUrl = newUrl;\n                    return parsed.oauthParams;\n                }\n            }\n        }\n    }\n\n    function parseCallbackParams(paramsString, supportedParams) {\n        var p = paramsString.split('&');\n        var result = {\n            paramsString: '',\n            oauthParams: {}\n        };\n        for (var i = 0; i < p.length; i++) {\n            var split = p[i].indexOf(\"=\");\n            var key = p[i].slice(0, split);\n            if (supportedParams.indexOf(key) !== -1) {\n                result.oauthParams[key] = p[i].slice(split + 1);\n            } else {\n                if (result.paramsString !== '') {\n                    result.paramsString += '&';\n                }\n                result.paramsString += p[i];\n            }\n        }\n        return result;\n    }\n\n    function createPromise() {\n        // Need to create a native Promise which also preserves the\n        // interface of the custom promise type previously used by the API\n        var p = {\n            setSuccess: function(result) {\n                p.resolve(result);\n            },\n\n            setError: function(result) {\n                p.reject(result);\n            }\n        };\n        p.promise = new Promise(function(resolve, reject) {\n            p.resolve = resolve;\n            p.reject = reject;\n        });\n\n        return p;\n    }\n\n    // Function to extend existing native Promise with timeout\n    function applyTimeoutToPromise(promise, timeout, errorMessage) {\n        var timeoutHandle = null;\n        var timeoutPromise = new Promise(function (resolve, reject) {\n            timeoutHandle = setTimeout(function () {\n                reject({ \"error\": errorMessage || \"Promise is not settled within timeout of \" + timeout + \"ms\" });\n            }, timeout);\n        });\n\n        return Promise.race([promise, timeoutPromise]).finally(function () {\n            clearTimeout(timeoutHandle);\n        });\n    }\n\n    function setupCheckLoginIframe() {\n        var promise = createPromise();\n\n        if (!loginIframe.enable) {\n            promise.setSuccess();\n            return promise.promise;\n        }\n\n        if (loginIframe.iframe) {\n            promise.setSuccess();\n            return promise.promise;\n        }\n\n        var iframe = document.createElement('iframe');\n        loginIframe.iframe = iframe;\n\n        iframe.onload = function() {\n            var authUrl = kc.endpoints.authorize();\n            if (authUrl.charAt(0) === '/') {\n                loginIframe.iframeOrigin = getOrigin();\n            } else {\n                loginIframe.iframeOrigin = authUrl.substring(0, authUrl.indexOf('/', 8));\n            }\n            promise.setSuccess();\n        };\n\n        var src = kc.endpoints.checkSessionIframe();\n        iframe.setAttribute('src', src );\n        iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin');\n        iframe.setAttribute('title', 'keycloak-session-iframe' );\n        iframe.style.display = 'none';\n        document.body.appendChild(iframe);\n\n        var messageCallback = function(event) {\n            if ((event.origin !== loginIframe.iframeOrigin) || (loginIframe.iframe.contentWindow !== event.source)) {\n                return;\n            }\n\n            if (!(event.data == 'unchanged' || event.data == 'changed' || event.data == 'error')) {\n                return;\n            }\n\n\n            if (event.data != 'unchanged') {\n                kc.clearToken();\n            }\n\n            var callbacks = loginIframe.callbackList.splice(0, loginIframe.callbackList.length);\n\n            for (var i = callbacks.length - 1; i >= 0; --i) {\n                var promise = callbacks[i];\n                if (event.data == 'error') {\n                    promise.setError();\n                } else {\n                    promise.setSuccess(event.data == 'unchanged');\n                }\n            }\n        };\n\n        window.addEventListener('message', messageCallback, false);\n\n        return promise.promise;\n    }\n\n    function scheduleCheckIframe() {\n        if (loginIframe.enable) {\n            if (kc.token) {\n                setTimeout(function() {\n                    checkLoginIframe().then(function(unchanged) {\n                        if (unchanged) {\n                            scheduleCheckIframe();\n                        }\n                    });\n                }, loginIframe.interval * 1000);\n            }\n        }\n    }\n\n    function checkLoginIframe() {\n        var promise = createPromise();\n\n        if (loginIframe.iframe && loginIframe.iframeOrigin ) {\n            var msg = kc.clientId + ' ' + (kc.sessionId ? kc.sessionId : '');\n            loginIframe.callbackList.push(promise);\n            var origin = loginIframe.iframeOrigin;\n            if (loginIframe.callbackList.length == 1) {\n                loginIframe.iframe.contentWindow.postMessage(msg, origin);\n            }\n        } else {\n            promise.setSuccess();\n        }\n\n        return promise.promise;\n    }\n\n    function check3pCookiesSupported() {\n        var promise = createPromise();\n\n        if (loginIframe.enable || kc.silentCheckSsoRedirectUri) {\n            var iframe = document.createElement('iframe');\n            iframe.setAttribute('src', kc.endpoints.thirdPartyCookiesIframe());\n            iframe.setAttribute('sandbox', 'allow-scripts allow-same-origin');\n            iframe.setAttribute('title', 'keycloak-3p-check-iframe' );\n            iframe.style.display = 'none';\n            document.body.appendChild(iframe);\n\n            var messageCallback = function(event) {\n                if (iframe.contentWindow !== event.source) {\n                    return;\n                }\n\n                if (event.data !== \"supported\" && event.data !== \"unsupported\") {\n                    return;\n                } else if (event.data === \"unsupported\") {\n                    logWarn(\n                        \"[KEYCLOAK] Your browser is blocking access to 3rd-party cookies, this means:\\n\\n\" +\n                        \" - It is not possible to retrieve tokens without redirecting to the Keycloak server (a.k.a. no support for silent authentication).\\n\" +\n                        \" - It is not possible to automatically detect changes to the session status (such as the user logging out in another tab).\\n\\n\" +\n                        \"For more information see: https://www.keycloak.org/docs/latest/securing_apps/#_modern_browsers\"\n                    );\n\n                    loginIframe.enable = false;\n                    if (kc.silentCheckSsoFallback) {\n                        kc.silentCheckSsoRedirectUri = false;\n                    }\n                }\n\n                document.body.removeChild(iframe);\n                window.removeEventListener(\"message\", messageCallback);\n                promise.setSuccess();\n            };\n\n            window.addEventListener('message', messageCallback, false);\n        } else {\n            promise.setSuccess();\n        }\n\n        return applyTimeoutToPromise(promise.promise, kc.messageReceiveTimeout, \"Timeout when waiting for 3rd party check iframe message.\");\n    }\n\n    function loadAdapter(type) {\n        if (!type || type == 'default') {\n            return {\n                login: function(options) {\n                    window.location.assign(kc.createLoginUrl(options));\n                    return createPromise().promise;\n                },\n\n                logout: function(options) {\n                    window.location.replace(kc.createLogoutUrl(options));\n                    return createPromise().promise;\n                },\n\n                register: function(options) {\n                    window.location.assign(kc.createRegisterUrl(options));\n                    return createPromise().promise;\n                },\n\n                accountManagement : function() {\n                    var accountUrl = kc.createAccountUrl();\n                    if (typeof accountUrl !== 'undefined') {\n                        window.location.href = accountUrl;\n                    } else {\n                        throw \"Not supported by the OIDC server\";\n                    }\n                    return createPromise().promise;\n                },\n\n                redirectUri: function(options, encodeHash) {\n\n                    if (options && options.redirectUri) {\n                        return options.redirectUri;\n                    } else if (kc.redirectUri) {\n                        return kc.redirectUri;\n                    } else {\n                        return location.href;\n                    }\n                }\n            };\n        }\n\n        if (type == 'cordova') {\n            loginIframe.enable = false;\n            var cordovaOpenWindowWrapper = function(loginUrl, target, options) {\n                if (window.cordova && window.cordova.InAppBrowser) {\n                    // Use inappbrowser for IOS and Android if available\n                    return window.cordova.InAppBrowser.open(loginUrl, target, options);\n                } else {\n                    return window.open(loginUrl, target, options);\n                }\n            };\n\n            var shallowCloneCordovaOptions = function (userOptions) {\n                if (userOptions && userOptions.cordovaOptions) {\n                    return Object.keys(userOptions.cordovaOptions).reduce(function (options, optionName) {\n                        options[optionName] = userOptions.cordovaOptions[optionName];\n                        return options;\n                    }, {});\n                } else {\n                    return {};\n                }\n            };\n\n            var formatCordovaOptions = function (cordovaOptions) {\n                return Object.keys(cordovaOptions).reduce(function (options, optionName) {\n                    options.push(optionName+\"=\"+cordovaOptions[optionName]);\n                    return options;\n                }, []).join(\",\");\n            };\n\n            var createCordovaOptions = function (userOptions) {\n                var cordovaOptions = shallowCloneCordovaOptions(userOptions);\n                cordovaOptions.location = 'no';\n                if (userOptions && userOptions.prompt == 'none') {\n                    cordovaOptions.hidden = 'yes';\n                }\n                return formatCordovaOptions(cordovaOptions);\n            };\n\n            var cordovaRedirectUri = kc.redirectUri || 'http://localhost';\n            \n            return {\n                login: function(options) {\n                    var promise = createPromise();\n\n                    var cordovaOptions = createCordovaOptions(options);\n                    var loginUrl = kc.createLoginUrl(options);\n                    var ref = cordovaOpenWindowWrapper(loginUrl, '_blank', cordovaOptions);\n                    var completed = false;\n\n                    var closed = false;\n                    var closeBrowser = function() {\n                        closed = true;\n                        ref.close();\n                    };\n\n                    ref.addEventListener('loadstart', function(event) {\n                        if (event.url.indexOf(cordovaRedirectUri) == 0) {\n                            var callback = parseCallback(event.url);\n                            processCallback(callback, promise);\n                            closeBrowser();\n                            completed = true;\n                        }\n                    });\n\n                    ref.addEventListener('loaderror', function(event) {\n                        if (!completed) {\n                            if (event.url.indexOf(cordovaRedirectUri) == 0) {\n                                var callback = parseCallback(event.url);\n                                processCallback(callback, promise);\n                                closeBrowser();\n                                completed = true;\n                            } else {\n                                promise.setError();\n                                closeBrowser();\n                            }\n                        }\n                    });\n\n                    ref.addEventListener('exit', function(event) {\n                        if (!closed) {\n                            promise.setError({\n                                reason: \"closed_by_user\"\n                            });\n                        }\n                    });\n\n                    return promise.promise;\n                },\n\n                logout: function(options) {\n                    var promise = createPromise();\n\n                    var logoutUrl = kc.createLogoutUrl(options);\n                    var ref = cordovaOpenWindowWrapper(logoutUrl, '_blank', 'location=no,hidden=yes,clearcache=yes');\n\n                    var error;\n\n                    ref.addEventListener('loadstart', function(event) {\n                        if (event.url.indexOf(cordovaRedirectUri) == 0) {\n                            ref.close();\n                        }\n                    });\n\n                    ref.addEventListener('loaderror', function(event) {\n                        if (event.url.indexOf(cordovaRedirectUri) == 0) {\n                            ref.close();\n                        } else {\n                            error = true;\n                            ref.close();\n                        }\n                    });\n\n                    ref.addEventListener('exit', function(event) {\n                        if (error) {\n                            promise.setError();\n                        } else {\n                            kc.clearToken();\n                            promise.setSuccess();\n                        }\n                    });\n\n                    return promise.promise;\n                },\n\n                register : function(options) {\n                    var promise = createPromise();\n                    var registerUrl = kc.createRegisterUrl();\n                    var cordovaOptions = createCordovaOptions(options);\n                    var ref = cordovaOpenWindowWrapper(registerUrl, '_blank', cordovaOptions);\n                    ref.addEventListener('loadstart', function(event) {\n                        if (event.url.indexOf(cordovaRedirectUri) == 0) {\n                            ref.close();\n                            var oauth = parseCallback(event.url);\n                            processCallback(oauth, promise);\n                        }\n                    });\n                    return promise.promise;\n                },\n\n                accountManagement : function() {\n                    var accountUrl = kc.createAccountUrl();\n                    if (typeof accountUrl !== 'undefined') {\n                        var ref = cordovaOpenWindowWrapper(accountUrl, '_blank', 'location=no');\n                        ref.addEventListener('loadstart', function(event) {\n                            if (event.url.indexOf(cordovaRedirectUri) == 0) {\n                                ref.close();\n                            }\n                        });\n                    } else {\n                        throw \"Not supported by the OIDC server\";\n                    }\n                },\n\n                redirectUri: function(options) {\n                    return cordovaRedirectUri;\n                }\n            }\n        }\n\n        if (type == 'cordova-native') {\n            loginIframe.enable = false;\n\n            return {\n                login: function(options) {\n                    var promise = createPromise();\n                    var loginUrl = kc.createLoginUrl(options);\n\n                    universalLinks.subscribe('keycloak', function(event) {\n                        universalLinks.unsubscribe('keycloak');\n                        window.cordova.plugins.browsertab.close();\n                        var oauth = parseCallback(event.url);\n                        processCallback(oauth, promise);\n                    });\n\n                    window.cordova.plugins.browsertab.openUrl(loginUrl);\n                    return promise.promise;\n                },\n\n                logout: function(options) {\n                    var promise = createPromise();\n                    var logoutUrl = kc.createLogoutUrl(options);\n\n                    universalLinks.subscribe('keycloak', function(event) {\n                        universalLinks.unsubscribe('keycloak');\n                        window.cordova.plugins.browsertab.close();\n                        kc.clearToken();\n                        promise.setSuccess();\n                    });\n\n                    window.cordova.plugins.browsertab.openUrl(logoutUrl);\n                    return promise.promise;\n                },\n\n                register : function(options) {\n                    var promise = createPromise();\n                    var registerUrl = kc.createRegisterUrl(options);\n                    universalLinks.subscribe('keycloak' , function(event) {\n                        universalLinks.unsubscribe('keycloak');\n                        window.cordova.plugins.browsertab.close();\n                        var oauth = parseCallback(event.url);\n                        processCallback(oauth, promise);\n                    });\n                    window.cordova.plugins.browsertab.openUrl(registerUrl);\n                    return promise.promise;\n\n                },\n\n                accountManagement : function() {\n                    var accountUrl = kc.createAccountUrl();\n                    if (typeof accountUrl !== 'undefined') {\n                        window.cordova.plugins.browsertab.openUrl(accountUrl);\n                    } else {\n                        throw \"Not supported by the OIDC server\";\n                    }\n                },\n\n                redirectUri: function(options) {\n                    if (options && options.redirectUri) {\n                        return options.redirectUri;\n                    } else if (kc.redirectUri) {\n                        return kc.redirectUri;\n                    } else {\n                        return \"http://localhost\";\n                    }\n                }\n            }\n        }\n\n        throw 'invalid adapter type: ' + type;\n    }\n\n    var LocalStorage = function() {\n        if (!(this instanceof LocalStorage)) {\n            return new LocalStorage();\n        }\n\n        localStorage.setItem('kc-test', 'test');\n        localStorage.removeItem('kc-test');\n\n        var cs = this;\n\n        function clearExpired() {\n            var time = new Date().getTime();\n            for (var i = 0; i < localStorage.length; i++)  {\n                var key = localStorage.key(i);\n                if (key && key.indexOf('kc-callback-') == 0) {\n                    var value = localStorage.getItem(key);\n                    if (value) {\n                        try {\n                            var expires = JSON.parse(value).expires;\n                            if (!expires || expires < time) {\n                                localStorage.removeItem(key);\n                            }\n                        } catch (err) {\n                            localStorage.removeItem(key);\n                        }\n                    }\n                }\n            }\n        }\n\n        cs.get = function(state) {\n            if (!state) {\n                return;\n            }\n\n            var key = 'kc-callback-' + state;\n            var value = localStorage.getItem(key);\n            if (value) {\n                localStorage.removeItem(key);\n                value = JSON.parse(value);\n            }\n\n            clearExpired();\n            return value;\n        };\n\n        cs.add = function(state) {\n            clearExpired();\n\n            var key = 'kc-callback-' + state.state;\n            state.expires = new Date().getTime() + (60 * 60 * 1000);\n            localStorage.setItem(key, JSON.stringify(state));\n        };\n    };\n\n    var CookieStorage = function() {\n        if (!(this instanceof CookieStorage)) {\n            return new CookieStorage();\n        }\n\n        var cs = this;\n\n        cs.get = function(state) {\n            if (!state) {\n                return;\n            }\n\n            var value = getCookie('kc-callback-' + state);\n            setCookie('kc-callback-' + state, '', cookieExpiration(-100));\n            if (value) {\n                return JSON.parse(value);\n            }\n        };\n\n        cs.add = function(state) {\n            setCookie('kc-callback-' + state.state, JSON.stringify(state), cookieExpiration(60));\n        };\n\n        cs.removeItem = function(key) {\n            setCookie(key, '', cookieExpiration(-100));\n        };\n\n        var cookieExpiration = function (minutes) {\n            var exp = new Date();\n            exp.setTime(exp.getTime() + (minutes*60*1000));\n            return exp;\n        };\n\n        var getCookie = function (key) {\n            var name = key + '=';\n            var ca = document.cookie.split(';');\n            for (var i = 0; i < ca.length; i++) {\n                var c = ca[i];\n                while (c.charAt(0) == ' ') {\n                    c = c.substring(1);\n                }\n                if (c.indexOf(name) == 0) {\n                    return c.substring(name.length, c.length);\n                }\n            }\n            return '';\n        };\n\n        var setCookie = function (key, value, expirationDate) {\n            var cookie = key + '=' + value + '; '\n                + 'expires=' + expirationDate.toUTCString() + '; ';\n            document.cookie = cookie;\n        };\n    };\n\n    function createCallbackStorage() {\n        try {\n            return new LocalStorage();\n        } catch (err) {\n        }\n\n        return new CookieStorage();\n    }\n\n    function createLogger(fn) {\n        return function() {\n            if (kc.enableLogging) {\n                fn.apply(console, Array.prototype.slice.call(arguments));\n            }\n        };\n    }\n}\n\nexport { Keycloak as default };\n"],"mappings":"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CA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KACA,KAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,KACA,KAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KACA,IACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,KAEJC,GAAM,CACF,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,KACA,KACA,KAEJC,GAAM,CACF,IACA,KAEJC,GAAM,CACF,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,KACA,KACA,IACA,KAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,KAEJC,GAAM,CACF,IACA,IACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,IACA,KACA,MAEJC,GAAM,CACF,IACA,KACA,IACA,MAEJC,GAAM,CACF,IACA,KA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GACM,MAANA,GACM,MAANA,GACM,MAANA,GACM,MAANA,GACM,MAANA,GACM,MAANA,GACM,MAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACM,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACf,OAANA,GACM,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACM,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACf,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACM,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACM,OAANA,GACM,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,KACf,OAANA,GACM,OAANA,GACCA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACpBA,GAAK,MAAUA,GAAK,MACf,OAANA,GACCA,GAAK,MAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACf,QAANA,GACCA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACCA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACf,QAANA,GACCA,GAAK,OAAUA,GAAK,OACpBA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,OACf,QAANA,GACM,QAANA,GACM,QAANA,GACM,QAANA,GACCA,GAAK,OAAUA,GAAK,KAC7B,CGvvCA,SAAS+/D,GAAcC,GACnBA,EAAIltF,SAAQ,SAAUsuE,GAElB,UADOA,EAAGt4B,SACN+4B,EAAgBT,IAAOW,EAAgBX,GACvC,IAAK,IAAImY,KAAKnY,EAAGr3C,eACNq3C,EAAGr3C,QAAQwvD,GAAGzwC,SACrBi3C,GAAc3e,EAAGr3C,QAAQwvD,GAAGpmF;KAG3BquE,EAAgBJ,IAAOiB,EAAiBjB,EAAG1gB,SAG1CghB,EAAcN,IAAOQ,EAAcR,KACzCkB,EAAmBlB,EAAG1gB,cAHf0gB,EAAG1gB,MAAM5X,SAMXq5B,EAAaf,IAClB2e,GAAc3e,EAAGqa,SAEz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,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IAAK,IAAK,IAAK,KAAM,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACnE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAO,IAAK,KAAM,IAAK,KAC1D,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KACjE,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAClE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACjE,IA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","ignoreList":[]}